use strict;
use warnings;
use Test::More;
{
# This form takes an array from the init_object and flattens it
# into a string for displaying in a form;
# When the string is submitted from the form, it's then
# inflated into an array for validation and for returning
# in the 'value' hashref.#
{
package Test::Deflate1;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
has_field 'bullets' => ( type => 'Text',
inflate_method => \&string_to_array,
validate_method => \&check_bullets,
deflate_method => \&array_to_string,
);
sub array_to_string {
my ( $self, $value ) = @_;
my $string = '';
my $sep = '';
for ( @$value ) {
$string .= $sep . $_->{text};
$sep = ';';
}
return $string;
}
sub check_bullets {
my $self = shift;
my $value = $self->value;
unless( ref $value eq 'HASH' && scalar @$value == 3 ) {
$self->add_error('bullets not valid');
}
}
sub string_to_array {
my ( $self, $value ) = @_;
return [ map { { text => $_ } } split(/\s*;\s*/, $value) ];
}
}
my $init_object = { bullets => [{ text => 'one'}, { text => 'two' }, { text => 'three'}] };
my $fif = { bullets => 'one;two;three' };
my $form = Test::Deflate1->new;
ok( $form, 'form built');
$form->process( init_object => $init_object, params => {} );
is_deeply( $form->fif, $fif, 'right fif' );
is_deeply( $form->value, $init_object, 'right value' );
$form->process( params => $fif );
is_deeply( $form->fif, $fif, 'right fif' );
is_deeply( $form->value, $init_object, 'right value' );
}
done_testing;