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
15my $form = Form::Sensible::Form->new(name=>'test');
16
17my $username_field = Form::Sensible::Field::Text->new(  name=>'username', validation => { regex => qr/^[0-9a-z]*$/  });
18$form->add_field($username_field);
19
20my $password_field = Form::Sensible::Field::Text->new(  name=>'password',
21                                                        render_hints => { field_type => 'password' } );
22$form->add_field($password_field);
23
24my $submit_button = Form::Sensible::Field::Trigger->new( name => 'submit' );
25$form->add_field($submit_button);
26
27my $renderer = Form::Sensible->get_renderer('HTML', { fs_template_dir => $lib_dir . '/share/templates' });
28
29#print Dumper($renderer->include_paths);
30my $output = $renderer->render($form)->complete;
31
32############ same thing - only the 'flat' way.
33
34$form = Form::Sensible->create_form( {
35                                            name => 'test',
36                                            fields => [
37                                                         {
38                                                            field_class => 'Text',
39                                                            name => 'username',
40                                                            validation => {  regex => '^[0-9a-z]*$'  }
41                                                         },
42                                                         {
43                                                             field_class => 'Text',
44                                                             name => 'password',
45                                                             render_hints => {  field_type => 'password' }
46                                                         },
47                                                         {
48                                                             field_class => 'Trigger',
49                                                             name => 'submit'
50                                                         }
51                                                      ],
52                                        } );
53
54my $renderer2 = Form::Sensible->get_renderer('HTML', { fs_template_dir => $lib_dir . '/share/templates' });
55
56my $output_2 = $renderer2->render($form)->complete;
57
58ok( $output eq $output_2, "flat creation and programmatic creation produce the same results");
59
60my $renderer3 = Form::Sensible->get_renderer('HTML', { fs_template_dir => $lib_dir . '/share/templates', base_theme => 'table' });
61
62my $output_3 = $renderer3->render($form)->complete;
63
64ok( $output_3 =~ /<table/, "Theme selection works");
65# print $output_3;
66
67#print $output_2;
68
69## Checking that fields that don't accept multiple behave properly
70$form->set_values({ username => ['test','foo'], password => 'test' });
71
72## here we should check these fields
73is_deeply ({ username => 'test', password => 'test' } , { username => $form->field('username')->value, password => $form->field('password')->value }, 'Additional values on single-value fields are ignored');
74
75## here we should add some field values
76$form->set_values({ username => 'test', password => 'test' });
77
78## here we should check these fields
79is_deeply ({ username => 'test', password => 'test' } , { username => $form->field('username')->value, password => $form->field('password')->value }, 'Setting Values behaves properly');
80
81## here we should make sure proper validation passes
82my $validation_result = $form->validate();
83is($validation_result->is_valid, 1, "Validates okay");
84
85## here we should make sure improper validation is handled properly, aka fail for
86## non-passing data
87$form->set_values({ username => '*&#*&@)(*&)', password => 'test' });
88is_deeply ({ username => '*&#*&@)(*&)', password => 'test' } , { username => $form->field('username')->value, password => $form->field('password')->value });
89
90$validation_result = $form->validate();
91isnt($validation_result->is_valid, 1, "Validation fails");
92
93## here we should render the form, and make sure stuff lines up properly
94
95done_testing();
96