use strict; use warnings; use Test::More; use lib 't/lib'; use DateTime; use Scalar::Util qw(blessed); use HTML::FormHandler::I18N; $ENV{LANGUAGE_HANDLE} = 'en_en'; { package My::Form; use HTML::FormHandler::Moose; extends 'HTML::FormHandler'; use Moose::Util::TypeConstraints; subtype 'MyStr' => as 'Str' => where { /^a/ }; subtype 'MyInt' => as 'Int'; coerce 'MyInt' => from 'MyStr' => via { return $1 if /(\d+)/ }; type 'MyDateTime' => message { 'This is not a correct date' } => where { blessed $_[0] && $_[0]->isa( 'DateTime' ) }; coerce 'MyDateTime' => from 'HashRef' => via { DateTime->new( $_ ) }; has_field 'coderef_transform'=> ( apply => [{ transform => \&my_transform }] ); has_field 'sprintf_filter' => ( apply => [ { transform => sub{ sprintf '<%.1g>', $_[0] } } ] ); has_field 'regex_trim' => ( trim => { transform => sub { my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string; }} ); has_field 'date_time_error' => ( apply => [ { transform => sub{ DateTime->new( $_[0] ) }, message => 'Not a valid DateTime' } ], ); has_field 'date_time' => ( type => 'Compound', apply => [ { transform => sub{ DateTime->new( $_[0] ) } } ], ); has_field 'date_time.year' => ( type => 'Text', ); has_field 'date_time.month' => ( type => 'Text', ); has_field 'date_time.day' => ( type => 'Text', ); has_field 'coerce_error' => ( apply => [ 'MyInt' ] ); has_field 'coerce_pass' => ( apply => [ 'MyInt' ] ); has_field 'date_coercion_pass' => ( type => 'Compound', apply => [ 'MyDateTime' ], ); has_field 'date_coercion_pass.year' => ( type => 'Text', ); has_field 'date_coercion_pass.month' => ( type => 'Text', ); has_field 'date_coercion_pass.day' => ( type => 'Text', ); has_field 'date_coercion_error' => ( type => 'Compound', apply => [ 'MyDateTime' ], ); has_field 'date_coercion_error.year' => ( type => 'Text', ); has_field 'date_coercion_error.month' => ( type => 'Text', ); has_field 'date_coercion_error.day' => ( type => 'Text', ); has_field 'date_time_fif' => ( type => 'Compound', apply => [ { transform => sub{ DateTime->new( $_[0] ) } } ], inflation => sub { { year => 1000, month => 1, day => 1 } }, fif_from_value => 1, ); has_field 'date_time_fif.year' => ( fif_from_value => 1 ); has_field 'date_time_fif.month'; has_field 'date_time_fif.day' => ( fif_from_value => 1 ); sub my_transform { $_[0] =~ s/testing/IT WORKED/g; return $_[0]; } } my $form = My::Form->new(); ok( $form, 'get form' ); my $params = { sprintf_filter => '100', regex_trim => " xxxy \n", coderef_transform => 'testing', date_time_error => 'aaa', 'date_time.year' => 2009, 'date_time.month' => 4, 'date_time.day' => 16, coerce_error => 'b10', coerce_pass => 'a10', 'date_coercion_pass.year' => 2009, 'date_coercion_pass.month' => 4, 'date_coercion_pass.day' => 16, 'date_coercion_error.year' => 2009, 'date_coercion_error.month' => 20, 'date_coercion_error.day' => 16, 'date_time_fif.year' => 2009, 'date_time_fif.month' => 4, 'date_time_fif.day' => 16, }; $form->process($params); like( $form->field('sprintf_filter')->value, qr/<1e\+0+2>/, 'sprintf filter' ); is( $form->field('regex_trim')->value, 'xxxy', 'regex trim' ); is( $form->field('coderef_transform')->value, 'IT WORKED', 'coderef transform' ); ok( $form->field('date_time_error')->has_errors, 'DateTime error catched' ); is( $form->field('date_time_error')->errors->[0], 'Not a valid DateTime', 'error message'); is( ref $form->field('date_time')->value, 'DateTime', 'DateTime object created' ); ok( $form->field('coerce_error')->has_errors, 'no suitable coercion - error' ); is( $form->field('coerce_pass')->value, 10, 'coercion filter' ); is( ref $form->field('date_coercion_pass')->value, 'DateTime', 'values coerced to DateTime object' ); ok( $form->field('date_coercion_error')->has_errors, 'DateTime coercion error' ); my $message = $form->field('date_coercion_error')->errors->[0]; is( $message, 'This is not a correct date', 'Error message for coercion' ); is( $form->field( 'date_time_fif.year' )->fif, 2009, 'fif for year' ); $params->{'date_time_fif.year'} = 2009; $params->{'date_time_fif.day'} = 16; is_deeply( $form->fif, $params, 'fif is correct' ); is( $form->value->{date_time_fif}->year, 2009, 'right value' ); done_testing;