The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use FindBin;
use lib "$FindBin::Bin/../lib";
use Data::Dumper;
use Form::Sensible;

use Form::Sensible::Form;

my $lib_dir = $FindBin::Bin;
my @dirs = split '/', $lib_dir;
pop @dirs;
$lib_dir = join('/', @dirs);



my $form = Form::Sensible->create_form( {
                                            name => 'test',
                                            fields => [
                                                         { 
                                                            field_class => 'Text',
                                                            name => 'string',
                                                            validation => {  
                                                                            regex => '^[0-9a-z]*$',
                                                                            required => 1,
                                                                          }
                                                         },
                                                         {
                                                             field_class => 'Number',
                                                             name => 'numeric_integer',
                                                             integer_only => 1,
                                                         },
                                                         { 
                                                            field_class => 'Number',
                                                            name => 'numeric_step',
                                                            integer_only => 1,
                                                            lower_bound => 10,
                                                            upper_bound => 100,
                                                            step => 5,
                                                         },
                                                         { 
                                                            field_class => 'Number',
                                                            name => 'numeric_nostep',
                                                            integer_only => 0,
                                                            lower_bound => 10,
                                                            upper_bound => 200,
                                                            validation => { 
                                                                            code => sub { 
                                                                                            ## number can not be 172.
                                                                                            ## we don't like 172.
                                                                                            my $value = shift;
                                                                                            my $field = shift;
                                                                                            if ($value == 172) {
                                                                                                return "We don't like 172.";
                                                                                            } else {
                                                                                                return undef;
                                                                                            }
                                                                                        }
                                                                         }
                                                         },

                                                      ],
                                        } );
                                    
## first, success     
$form->set_values({ 
                    string => 'a2z0to9',
                    numeric_integer => -10,
                    numeric_step => 25,
                    numeric_nostep => 122.7
                  });
                  
my $validation_result = $form->validate();

ok( $validation_result->is_valid(), "valid forms values are considered valid");

## fail on code ref
$form->set_values({ 
                    string => 'a2z0to9',
                    numeric_integer => 1,
                    numeric_step => 25,
                    numeric_nostep => 172
                  });

$validation_result = $form->validate();

like( $validation_result->error_fields->{numeric_nostep}[0], qr/We don't/,  "Number field value is invalid: coderef");

## fail on string regex
$form->set_values({ 
                    string => 'ZZZ0to9',
                    numeric_integer => 1,
                    numeric_step => 25,
                    numeric_nostep => 122.7
                  });

$validation_result = $form->validate();

like( $validation_result->error_fields->{string}[0], qr/invalid/,  "String field value is invalid: regex");

$form->clear_state();

ok( !defined($form->validator_result), 'clear_state() clears out validation results');

## fail on string regex
$form->set_values({ 
                    numeric_integer => 1,
                    numeric_step => 25,
                    numeric_nostep => 122.7
                  });

$validation_result = $form->validate();

like( $validation_result->error_fields->{string}[0], qr/not provided/,  "values don't bleed across clear_state()");

done_testing();