1use Test::More; 2use FindBin; 3use lib "$FindBin::Bin/../lib"; 4use Data::Dumper; 5use Form::Sensible; 6 7use Form::Sensible::Form; 8 9my $lib_dir = $FindBin::Bin; 10my @dirs = split '/', $lib_dir; 11pop @dirs; 12$lib_dir = join('/', @dirs); 13 14 15 16my $form = Form::Sensible->create_form( { 17 name => 'test', 18 fields => [ 19 { 20 field_class => 'Text', 21 name => 'string', 22 validation => { 23 regex => '^[0-9a-z]*$', 24 required => 1, 25 } 26 }, 27 { 28 field_class => 'Number', 29 name => 'numeric_integer', 30 integer_only => 1, 31 }, 32 { 33 field_class => 'Number', 34 name => 'numeric_step', 35 integer_only => 1, 36 lower_bound => 10, 37 upper_bound => 100, 38 step => 5, 39 }, 40 { 41 field_class => 'Number', 42 name => 'numeric_nostep', 43 integer_only => 0, 44 lower_bound => 10, 45 upper_bound => 200, 46 validation => { 47 code => sub { 48 ## number can not be 172. 49 ## we don't like 172. 50 my $value = shift; 51 my $field = shift; 52 if ($value == 172) { 53 return "We don't like 172."; 54 } else { 55 return undef; 56 } 57 } 58 } 59 }, 60 61 ], 62 } ); 63 64## first, success 65$form->set_values({ 66 string => 'a2z0to9', 67 numeric_integer => -10, 68 numeric_step => 25, 69 numeric_nostep => 122.7 70 }); 71 72my $validation_result = $form->validate(); 73 74ok( $validation_result->is_valid(), "valid forms values are considered valid"); 75 76## fail on code ref 77$form->set_values({ 78 string => 'a2z0to9', 79 numeric_integer => 1, 80 numeric_step => 25, 81 numeric_nostep => 172 82 }); 83 84$validation_result = $form->validate(); 85 86like( $validation_result->error_fields->{numeric_nostep}[0], qr/We don't/, "Number field value is invalid: coderef"); 87 88## fail on string regex 89$form->set_values({ 90 string => 'ZZZ0to9', 91 numeric_integer => 1, 92 numeric_step => 25, 93 numeric_nostep => 122.7 94 }); 95 96$validation_result = $form->validate(); 97 98like( $validation_result->error_fields->{string}[0], qr/invalid/, "String field value is invalid: regex"); 99 100$form->clear_state(); 101 102ok( !defined($form->validator_result), 'clear_state() clears out validation results'); 103 104## fail on string regex 105$form->set_values({ 106 numeric_integer => 1, 107 numeric_step => 25, 108 numeric_nostep => 122.7 109 }); 110 111$validation_result = $form->validate(); 112 113like( $validation_result->error_fields->{string}[0], qr/not provided/, "values don't bleed across clear_state()"); 114 115done_testing(); 116