1use strict;
2use warnings;
3
4use Test::More tests => 11;
5
6use HTML::FormFu;
7use DateTime;
8
9my $dt = DateTime->new( day => 6, month => 8, year => 2007 );
10
11my $form = HTML::FormFu->new(
12    { tt_args => { INCLUDE_PATH => 'share/templates/tt/xhtml' } } );
13
14$form->auto_fieldset( { nested_name => 'date' } );
15
16$form->element('Date')->name('foo')->strftime("%m/%d/%Y")
17    ->day( { prefix => '-- Day --', } )->month(
18    {   prefix      => '-- Month --',
19        short_names => 1,
20    }
21)->year(
22    {   prefix => '-- Year --',
23        list   => [ 2007 .. 2017 ],
24    } )->default($dt)->auto_inflate(1)->constraint('Required');
25
26$form->element('Date')->name('bar')->default('14-08-2007')
27    ->year( { list => [ 2007 .. 2017 ] } );
28
29$form->process;
30
31is( "$form", <<HTML );
32<form action="" method="post">
33<fieldset>
34<div>
35<span class="elements">
36<select name="date.foo_day">
37<option value="">-- Day --</option>
38<option value="1">1</option>
39<option value="2">2</option>
40<option value="3">3</option>
41<option value="4">4</option>
42<option value="5">5</option>
43<option value="6" selected="selected">6</option>
44<option value="7">7</option>
45<option value="8">8</option>
46<option value="9">9</option>
47<option value="10">10</option>
48<option value="11">11</option>
49<option value="12">12</option>
50<option value="13">13</option>
51<option value="14">14</option>
52<option value="15">15</option>
53<option value="16">16</option>
54<option value="17">17</option>
55<option value="18">18</option>
56<option value="19">19</option>
57<option value="20">20</option>
58<option value="21">21</option>
59<option value="22">22</option>
60<option value="23">23</option>
61<option value="24">24</option>
62<option value="25">25</option>
63<option value="26">26</option>
64<option value="27">27</option>
65<option value="28">28</option>
66<option value="29">29</option>
67<option value="30">30</option>
68<option value="31">31</option>
69</select>
70<select name="date.foo_month">
71<option value="">-- Month --</option>
72<option value="1">Jan</option>
73<option value="2">Feb</option>
74<option value="3">Mar</option>
75<option value="4">Apr</option>
76<option value="5">May</option>
77<option value="6">Jun</option>
78<option value="7">Jul</option>
79<option value="8" selected="selected">Aug</option>
80<option value="9">Sep</option>
81<option value="10">Oct</option>
82<option value="11">Nov</option>
83<option value="12">Dec</option>
84</select>
85<select name="date.foo_year">
86<option value="">-- Year --</option>
87<option value="2007" selected="selected">2007</option>
88<option value="2008">2008</option>
89<option value="2009">2009</option>
90<option value="2010">2010</option>
91<option value="2011">2011</option>
92<option value="2012">2012</option>
93<option value="2013">2013</option>
94<option value="2014">2014</option>
95<option value="2015">2015</option>
96<option value="2016">2016</option>
97<option value="2017">2017</option>
98</select>
99</span>
100</div>
101<div>
102<span class="elements">
103<select name="date.bar_day">
104<option value="1">1</option>
105<option value="2">2</option>
106<option value="3">3</option>
107<option value="4">4</option>
108<option value="5">5</option>
109<option value="6">6</option>
110<option value="7">7</option>
111<option value="8">8</option>
112<option value="9">9</option>
113<option value="10">10</option>
114<option value="11">11</option>
115<option value="12">12</option>
116<option value="13">13</option>
117<option value="14" selected="selected">14</option>
118<option value="15">15</option>
119<option value="16">16</option>
120<option value="17">17</option>
121<option value="18">18</option>
122<option value="19">19</option>
123<option value="20">20</option>
124<option value="21">21</option>
125<option value="22">22</option>
126<option value="23">23</option>
127<option value="24">24</option>
128<option value="25">25</option>
129<option value="26">26</option>
130<option value="27">27</option>
131<option value="28">28</option>
132<option value="29">29</option>
133<option value="30">30</option>
134<option value="31">31</option>
135</select>
136<select name="date.bar_month">
137<option value="1">January</option>
138<option value="2">February</option>
139<option value="3">March</option>
140<option value="4">April</option>
141<option value="5">May</option>
142<option value="6">June</option>
143<option value="7">July</option>
144<option value="8" selected="selected">August</option>
145<option value="9">September</option>
146<option value="10">October</option>
147<option value="11">November</option>
148<option value="12">December</option>
149</select>
150<select name="date.bar_year">
151<option value="2007" selected="selected">2007</option>
152<option value="2008">2008</option>
153<option value="2009">2009</option>
154<option value="2010">2010</option>
155<option value="2011">2011</option>
156<option value="2012">2012</option>
157<option value="2013">2013</option>
158<option value="2014">2014</option>
159<option value="2015">2015</option>
160<option value="2016">2016</option>
161<option value="2017">2017</option>
162</select>
163</span>
164</div>
165</fieldset>
166</form>
167HTML
168
169$form->process(
170    {   'date.foo_day',   30,   'date.foo_month', 6,
171        'date.foo_year',  2007, 'date.bar_day',   1,
172        'date.bar_month', 7,    'date.bar_year',  2007,
173    } );
174
175ok( $form->submitted_and_valid );
176
177my $foo = $form->param('date.foo');
178my $bar = $form->param('date.bar');
179
180isa_ok( $foo, 'DateTime' );
181ok( !ref $bar );
182
183is( $foo, "06/30/2007" );
184is( $bar, "01-07-2007" );
185
186my $foo_field = $form->get_field('foo');
187my $bar_field = $form->get_field('bar');
188
189is( "$form", <<HTML );
190<form action="" method="post">
191<fieldset>
192<div>
193<span class="elements">
194<select name="date.foo_day">
195<option value="">-- Day --</option>
196<option value="1">1</option>
197<option value="2">2</option>
198<option value="3">3</option>
199<option value="4">4</option>
200<option value="5">5</option>
201<option value="6">6</option>
202<option value="7">7</option>
203<option value="8">8</option>
204<option value="9">9</option>
205<option value="10">10</option>
206<option value="11">11</option>
207<option value="12">12</option>
208<option value="13">13</option>
209<option value="14">14</option>
210<option value="15">15</option>
211<option value="16">16</option>
212<option value="17">17</option>
213<option value="18">18</option>
214<option value="19">19</option>
215<option value="20">20</option>
216<option value="21">21</option>
217<option value="22">22</option>
218<option value="23">23</option>
219<option value="24">24</option>
220<option value="25">25</option>
221<option value="26">26</option>
222<option value="27">27</option>
223<option value="28">28</option>
224<option value="29">29</option>
225<option value="30" selected="selected">30</option>
226<option value="31">31</option>
227</select>
228<select name="date.foo_month">
229<option value="">-- Month --</option>
230<option value="1">Jan</option>
231<option value="2">Feb</option>
232<option value="3">Mar</option>
233<option value="4">Apr</option>
234<option value="5">May</option>
235<option value="6" selected="selected">Jun</option>
236<option value="7">Jul</option>
237<option value="8">Aug</option>
238<option value="9">Sep</option>
239<option value="10">Oct</option>
240<option value="11">Nov</option>
241<option value="12">Dec</option>
242</select>
243<select name="date.foo_year">
244<option value="">-- Year --</option>
245<option value="2007" selected="selected">2007</option>
246<option value="2008">2008</option>
247<option value="2009">2009</option>
248<option value="2010">2010</option>
249<option value="2011">2011</option>
250<option value="2012">2012</option>
251<option value="2013">2013</option>
252<option value="2014">2014</option>
253<option value="2015">2015</option>
254<option value="2016">2016</option>
255<option value="2017">2017</option>
256</select>
257</span>
258</div>
259<div>
260<span class="elements">
261<select name="date.bar_day">
262<option value="1" selected="selected">1</option>
263<option value="2">2</option>
264<option value="3">3</option>
265<option value="4">4</option>
266<option value="5">5</option>
267<option value="6">6</option>
268<option value="7">7</option>
269<option value="8">8</option>
270<option value="9">9</option>
271<option value="10">10</option>
272<option value="11">11</option>
273<option value="12">12</option>
274<option value="13">13</option>
275<option value="14">14</option>
276<option value="15">15</option>
277<option value="16">16</option>
278<option value="17">17</option>
279<option value="18">18</option>
280<option value="19">19</option>
281<option value="20">20</option>
282<option value="21">21</option>
283<option value="22">22</option>
284<option value="23">23</option>
285<option value="24">24</option>
286<option value="25">25</option>
287<option value="26">26</option>
288<option value="27">27</option>
289<option value="28">28</option>
290<option value="29">29</option>
291<option value="30">30</option>
292<option value="31">31</option>
293</select>
294<select name="date.bar_month">
295<option value="1">January</option>
296<option value="2">February</option>
297<option value="3">March</option>
298<option value="4">April</option>
299<option value="5">May</option>
300<option value="6">June</option>
301<option value="7" selected="selected">July</option>
302<option value="8">August</option>
303<option value="9">September</option>
304<option value="10">October</option>
305<option value="11">November</option>
306<option value="12">December</option>
307</select>
308<select name="date.bar_year">
309<option value="2007" selected="selected">2007</option>
310<option value="2008">2008</option>
311<option value="2009">2009</option>
312<option value="2010">2010</option>
313<option value="2011">2011</option>
314<option value="2012">2012</option>
315<option value="2013">2013</option>
316<option value="2014">2014</option>
317<option value="2015">2015</option>
318<option value="2016">2016</option>
319<option value="2017">2017</option>
320</select>
321</span>
322</div>
323</fieldset>
324</form>
325HTML
326
327# incorrect date
328
329$form->process(
330    { 'date.foo_day', 29, 'date.foo_month', 2, 'date.foo_year', 2007, } );
331
332ok( $form->submitted );
333ok( $form->has_errors );
334ok( !defined $form->param('date.foo') );
335
336is( "$form", <<HTML_ERRORS );
337<form action="" method="post">
338<fieldset>
339<div>
340<span>Invalid date</span>
341<span class="elements">
342<select name="date.foo_day">
343<option value="">-- Day --</option>
344<option value="1">1</option>
345<option value="2">2</option>
346<option value="3">3</option>
347<option value="4">4</option>
348<option value="5">5</option>
349<option value="6">6</option>
350<option value="7">7</option>
351<option value="8">8</option>
352<option value="9">9</option>
353<option value="10">10</option>
354<option value="11">11</option>
355<option value="12">12</option>
356<option value="13">13</option>
357<option value="14">14</option>
358<option value="15">15</option>
359<option value="16">16</option>
360<option value="17">17</option>
361<option value="18">18</option>
362<option value="19">19</option>
363<option value="20">20</option>
364<option value="21">21</option>
365<option value="22">22</option>
366<option value="23">23</option>
367<option value="24">24</option>
368<option value="25">25</option>
369<option value="26">26</option>
370<option value="27">27</option>
371<option value="28">28</option>
372<option value="29" selected="selected">29</option>
373<option value="30">30</option>
374<option value="31">31</option>
375</select>
376<select name="date.foo_month">
377<option value="">-- Month --</option>
378<option value="1">Jan</option>
379<option value="2" selected="selected">Feb</option>
380<option value="3">Mar</option>
381<option value="4">Apr</option>
382<option value="5">May</option>
383<option value="6">Jun</option>
384<option value="7">Jul</option>
385<option value="8">Aug</option>
386<option value="9">Sep</option>
387<option value="10">Oct</option>
388<option value="11">Nov</option>
389<option value="12">Dec</option>
390</select>
391<select name="date.foo_year">
392<option value="">-- Year --</option>
393<option value="2007" selected="selected">2007</option>
394<option value="2008">2008</option>
395<option value="2009">2009</option>
396<option value="2010">2010</option>
397<option value="2011">2011</option>
398<option value="2012">2012</option>
399<option value="2013">2013</option>
400<option value="2014">2014</option>
401<option value="2015">2015</option>
402<option value="2016">2016</option>
403<option value="2017">2017</option>
404</select>
405</span>
406</div>
407<div>
408<span class="elements">
409<select name="date.bar_day">
410<option value="1">1</option>
411<option value="2">2</option>
412<option value="3">3</option>
413<option value="4">4</option>
414<option value="5">5</option>
415<option value="6">6</option>
416<option value="7">7</option>
417<option value="8">8</option>
418<option value="9">9</option>
419<option value="10">10</option>
420<option value="11">11</option>
421<option value="12">12</option>
422<option value="13">13</option>
423<option value="14">14</option>
424<option value="15">15</option>
425<option value="16">16</option>
426<option value="17">17</option>
427<option value="18">18</option>
428<option value="19">19</option>
429<option value="20">20</option>
430<option value="21">21</option>
431<option value="22">22</option>
432<option value="23">23</option>
433<option value="24">24</option>
434<option value="25">25</option>
435<option value="26">26</option>
436<option value="27">27</option>
437<option value="28">28</option>
438<option value="29">29</option>
439<option value="30">30</option>
440<option value="31">31</option>
441</select>
442<select name="date.bar_month">
443<option value="1">January</option>
444<option value="2">February</option>
445<option value="3">March</option>
446<option value="4">April</option>
447<option value="5">May</option>
448<option value="6">June</option>
449<option value="7">July</option>
450<option value="8">August</option>
451<option value="9">September</option>
452<option value="10">October</option>
453<option value="11">November</option>
454<option value="12">December</option>
455</select>
456<select name="date.bar_year">
457<option value="2007">2007</option>
458<option value="2008">2008</option>
459<option value="2009">2009</option>
460<option value="2010">2010</option>
461<option value="2011">2011</option>
462<option value="2012">2012</option>
463<option value="2013">2013</option>
464<option value="2014">2014</option>
465<option value="2015">2015</option>
466<option value="2016">2016</option>
467<option value="2017">2017</option>
468</select>
469</span>
470</div>
471</fieldset>
472</form>
473HTML_ERRORS
474
475