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