1 /*jslint browser: true*/
2 /*global $, jQuery, test, equal, ok, asyncTest, Globalize, start, stop, deepEqual, range*/
3 $(document).ready( function () {
5 module( "Date Time Picker" );
30 $( "#page-1" ).page();
32 datetime = $( "#datetime" )[0];
33 date = $( "#date" )[0];
34 time = $( "#time" )[0];
35 custom = $( "#custom" )[0];
37 make2digit = function (arr) {
39 for ( i = 0; i < arr.length; i++ ) {
40 arr[i] = arr[i].toString();
41 ret = arr[i].toString(10);
43 arr[i] = "0" + arr[i];
49 isLeapYear = function ( year ) {
50 return year % 4 ? 0 : ( year % 100 ? 1 : ( year % 400 ? 0 : 1 ) );
53 getDay = function () {
54 var date = new Date( "May 2 18:30:00 2012" ),
55 daysInMonth = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ],
56 day = daysInMonth[ date.getMonth() ];
58 day += isLeapYear( date.getFullYear() );
63 getCurDate = function () {
64 var date = new Date( "May 2 18:30:00 2012" );
65 return date.getDate();
68 //Dymanically creating datetimepicker
69 objDatetime = $(datetime).data( "datetimepicker" );
70 objDate = $(date).data( "datetimepicker" );
71 objTime = $(time).data( "datetimepicker" );
72 objCustom = $(custom).data( "datetimepicker" );
73 markup = '<ul data-role="listview" id="datetimeList2">' +
74 '<li class="ui-li-2line-sub-main">' +
75 '<span class="ui-li-text-main">' +
76 '<input type="datetime" id="datetime2" />' +
78 '<span class="ui-li-text-sub">DateTimePicker</span>' +
80 '<li class="ui-li-2line-sub-main">' +
81 '<span class="ui-li-text-main">' +
82 '<input type="date" id="date2"/>' +
84 '<span class="ui-li-text-sub">DatePicker</span>' +
86 '<li class="ui-li-2line-sub-main">' +
87 '<span class="ui-li-text-main">' +
88 '<input type="time" id="time2"/>' +
90 '<span class="ui-li-text-sub">TimePicker</span>' +
92 '<li class="ui-li-2line-sub-main">' +
93 '<span class="ui-li-text-main">' +
94 '<input type="datetime" id="custom2" data-format="MMM dd yyyy hh:mm tt" value="2012-06-30T00:00:00+00:00" />' +
96 '<span class="ui-li-text-sub">DateTimePicker</span>' +
100 // trigger pagecreate
101 $( "#page-1" ).page();
102 $('#page-1').find( ":jqmData(role=content)" ).append(markup);
103 $('#page-1').find( ":jqmData(role=content)" ).trigger('create');
105 datetime2 = $( "#datetime2" )[0];
106 date2 = $( "#date2" )[0];
107 time2 = $( "#time2" )[0];
108 custom2 = $( "#custom2" )[0];
110 objDatetime2 = $(datetime2).data( "datetimepicker" );
111 objDate2 = $(date2).data( "datetimepicker" );
112 objTime2 = $(time2).data( "datetimepicker" );
113 objCustom2 = $(custom2).data( "datetimepicker" );
114 /* End of dynamic creation*/
116 asyncTest( "Auto-initialization", function () {
117 ok( objDatetime, "should Date/Time instace created" );
118 ok( objDate, "should Date instance created" );
119 ok( objTime, "should Time instance created" );
120 ok( objCustom, "should Custom format instance created" );
124 asyncTest( "Options", function () {
125 equal( objDatetime.options.type, "datetime", "should 'datetime' type created." );
126 equal( objDate.options.type, "date", "should 'date' type created." );
127 equal( objTime.options.type, "time", "should 'time' type created." );
128 equal( objCustom.options.type, "datetime", "should custom format created as 'datetime' type." );
129 equal( objCustom.options.format, "MMM dd yyyy hh:mm tt", "should accept custom format string." );
130 equal( objCustom.options.date.toString(), new Date( "Jun 30 00:00:00 UTC+0000 2012" ).toString(), "should accept preset date." );
134 asyncTest( "Private Methods", function () {
135 var months, updateFieldTest ;
142 for ( year = 1; year < 2100; year++ ) {
143 expect = new Date( year, 1, 29 ).getDate() == 29;
144 actual = objDatetime._isLeapYear( year );
145 if ( expect != actual ) {
146 throw year + " is wrong";
149 } catch ( exception ) {
150 console.log( exception );
154 }()), "should be able to check leap year" );
156 updateFieldTest = function ( format, value, obj, expect ) {
157 var target = $('<div data-pat=' + format + '></div>');
158 obj._updateField( target, value );
160 return target.text();
165 updateFieldTest( "h", 0, objTime2 ),
166 updateFieldTest( "hh", 1, objTime2 ),
167 updateFieldTest( "H", 13 , objTime2),
168 updateFieldTest( "HH", 9, objTime2 ),
169 updateFieldTest( "m", 9, objTime2 ),
170 updateFieldTest( "mm", 9 , objTime2),
171 updateFieldTest( "s", 1, objTime2 ),
172 updateFieldTest( "ss", 10 , objTime2),
173 updateFieldTest( "MMM", 3 , objTime2),
174 updateFieldTest( "MMMM", 3, objTime2 ),
175 updateFieldTest( "yy", 95, objTime2 ),
176 updateFieldTest( "yyyy", 95, objTime2 )
179 "12", "01", "13", "09", "9", "09", "1" , "10", Globalize.culture().calendar.months.namesAbbr[2], Globalize.culture().calendar.months.names[2], "95", "0095"
181 "should update field to given value with format"
186 updateFieldTest( "h", 0, objDate2),
187 updateFieldTest( "hh", 1, objDate2 ),
188 updateFieldTest( "H", 13 , objDate2),
189 updateFieldTest( "HH", 9, objDate2 ),
190 updateFieldTest( "m", 9, objDate2 ),
191 updateFieldTest( "mm", 9, objDate2 ),
192 updateFieldTest( "s", 1, objDate2 ),
193 updateFieldTest( "ss", 10 , objDate2),
194 updateFieldTest( "MMM", 3 , objDate2),
195 updateFieldTest( "MMMM", 3 , objDate2),
196 updateFieldTest( "yy", 9, objDate2 ),
197 updateFieldTest( "yyyy", 9, objDate2 )
200 "12", "01", "13", "09", "9", "09", "1" , "10", Globalize.culture().calendar.months.namesAbbr[2], Globalize.culture().calendar.months.names[2], "09", "0009"
202 "should update field to given value with format"
206 var beforeNoon = objTime.options.date.getHours() < 12;
207 objTime._switchAmPm();
208 return beforeNoon != objTime.options.date.getHours() < 12;
209 }()), "should change AM/PM by AMPM button" );
211 deepEqual( [ "MMMM", " ", "dd", " ", "yyyy", " ", "hh", ":", "mm", " ", "dummy space" ],
212 objTime._parsePattern( "MMMM dd yyyy hh:mm 'dummy space'" ), "should parse DTF string as array" );
214 objDatetime.options.date = new Date( "May 2 18:30:00 2012" );
216 months = Globalize.culture().calendar.months.namesAbbr.slice();
217 if ( months.length > 12 ) {
225 values : make2digit( range( 1, getDay() )),
226 data : range( 1, getDay() ),
227 current : getCurDate() - 1,
231 values : make2digit (range( 0, 59 )),
237 values : range( 1900, 2100 ),
238 data : range( 1900, 2100 ),
243 values : [ "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" ],
244 data : [ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 12 ],
249 values : range( 0, 23 ),
250 data : range( 0, 23 ),
256 data : range( 1, 12 ),
263 objDatetime._populateDataSelector( "day", "dd", objDatetime ),
264 objDatetime._populateDataSelector( "sec", "ss", objDatetime ),
265 objDatetime._populateDataSelector( "year", "YYYY", objDatetime ),
266 objDatetime._populateDataSelector( "hour", "hh", objDatetime ),
267 objDatetime._populateDataSelector( "hour", "H", objDatetime ),
268 objDatetime._populateDataSelector( "month", "MMM", objDatetime ),
271 "should populate data selector by given field and pattern"
275 objDate.value( "Jan 1 09:00:00 2012" );
276 equal(objDate.value( ) , "2012-01-01" , "Set and get value for date" );
279 objTime.value( "Jan 1 09:00:00 2012" );
280 equal(objTime.value( ) , "09:00:00" , "Set and get value for time" );
284 asyncTest( "Public Methods", function () {
285 objDatetime.value.call( objDatetime, "Jan 1 09:00:00 2012" );
286 equal( "2012-01-01T09:00:00", objDatetime.value(), "should set and get value by API" );
287 var format = "yyyy MM dd hh mm";
288 objDatetime._setFormat( format );
289 equal( objDatetime.option( "format" ), format, "should set type and format" );
293 asyncTest( "Events", function () {
294 var str = "May 2 18:00:00 2012";
296 $(datetime).bind( "date-changed", function (e, date) {
297 equal( objDatetime.value(), "2012-05-02T18:00:00", "Should invoke event when date changed" );
301 objDatetime.value( str );
305 asyncTest( "Auto-initialization Dynamic", function () {
306 ok( objDatetime2, "should Date/Time instace created" );
307 ok( objDate2, "should Date instance created" );
308 ok( objTime2, "should Time instance created" );
309 ok( objCustom2, "should Custom format instance created" );
313 asyncTest( "Options Dynamic", function () {
314 equal( objDatetime2.options.type, "datetime", "should 'datetime' type created." );
315 equal( objDate2.options.type, "date", "should 'date' type created." );
316 equal( objTime2.options.type, "time", "should 'time' type created." );
317 equal( objCustom2.options.type, "datetime", "should custom format created as 'datetime' type." );
318 equal( objCustom2.options.format, "MMM dd yyyy hh:mm tt", "should accept custom format string." );
319 equal( objCustom2.options.date.toString(), new Date( "Jun 30 00:00:00 UTC+0000 2012" ).toString(), "should accept preset date." );
324 asyncTest( "Private Methods Dynamic", function () {
325 var months, updateFieldTest ;
332 for ( year = 1; year < 2100; year++ ) {
333 expect = new Date( year, 1, 29 ).getDate() == 29;
334 actual = objDatetime2._isLeapYear( year );
335 if ( expect != actual ) {
336 throw year + " is wrong";
339 } catch ( exception ) {
340 console.log( exception );
344 }()), "should be able to check leap year" );
346 updateFieldTest = function ( format, value, obj, expect ) {
347 var target = $('<div data-pat=' + format + '></div>');
348 obj._updateField( target, value );
350 return target.text();
355 updateFieldTest( "h", 0, objTime2 ),
356 updateFieldTest( "hh", 1, objTime2 ),
357 updateFieldTest( "H", 13 , objTime2),
358 updateFieldTest( "HH", 9, objTime2 ),
359 updateFieldTest( "m", 9, objTime2 ),
360 updateFieldTest( "mm", 9 , objTime2),
361 updateFieldTest( "s", 1, objTime2 ),
362 updateFieldTest( "ss", 10 , objTime2),
363 updateFieldTest( "MMM", 3 , objTime2),
364 updateFieldTest( "MMMM", 3, objTime2 ),
365 updateFieldTest( "yy", 95, objTime2 ),
366 updateFieldTest( "yyyy", 95, objTime2 )
369 "12", "01", "13", "09", "9", "09", "1" , "10", Globalize.culture().calendar.months.namesAbbr[2], Globalize.culture().calendar.months.names[2], "95", "0095"
371 "should update field to given value with format"
376 updateFieldTest( "h", 0, objDate2),
377 updateFieldTest( "hh", 1, objDate2 ),
378 updateFieldTest( "H", 13 , objDate2),
379 updateFieldTest( "HH", 9, objDate2 ),
380 updateFieldTest( "m", 9, objDate2 ),
381 updateFieldTest( "mm", 9, objDate2 ),
382 updateFieldTest( "s", 1, objDate2 ),
383 updateFieldTest( "ss", 10 , objDate2),
384 updateFieldTest( "MMM", 3 , objDate2),
385 updateFieldTest( "MMMM", 3 , objDate2),
386 updateFieldTest( "yy", 9, objDate2 ),
387 updateFieldTest( "yyyy", 9, objDate2 )
390 "12", "01", "13", "09", "9", "09", "1" , "10", Globalize.culture().calendar.months.namesAbbr[2], Globalize.culture().calendar.months.names[2], "09", "0009"
392 "should update field to given value with format"
396 var beforeNoon = objTime2.options.date.getHours() < 12;
397 objTime2._switchAmPm();
398 return beforeNoon != objTime2.options.date.getHours() < 12;
399 }()), "should change AM/PM by AMPM button" );
402 [ "MMMM", " ", "dd", " ", "yyyy", " ", "hh", ":", "mm", " ", "dummy space" ],
403 objTime2._parsePattern( "MMMM dd yyyy hh:mm 'dummy space'" ),
404 "should parse DTF string as array"
407 objDatetime2.options.date = new Date( "May 2 18:30:00 2012" );
409 months = Globalize.culture().calendar.months.namesAbbr.slice();
410 if ( months.length > 12 ) {
417 values : make2digit( range( 1, getDay() )),
418 data : range( 1, getDay() ),
419 current : getCurDate() - 1,
423 values : make2digit (range( 0, 59 )),
429 values : range( 1900, 2100 ),
430 data : range( 1900, 2100 ),
435 values : [ "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" ],
436 data : [ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 12 ],
441 values : range( 0, 23 ),
442 data : range( 0, 23 ),
448 data : range( 1, 12 ),
455 objDatetime2._populateDataSelector( "day", "dd", objDatetime2 ),
456 objDatetime2._populateDataSelector( "sec", "ss", objDatetime2 ),
457 objDatetime2._populateDataSelector( "year", "YYYY", objDatetime2 ),
458 objDatetime2._populateDataSelector( "hour", "hh", objDatetime2 ),
459 objDatetime2._populateDataSelector( "hour", "H", objDatetime2 ),
460 objDatetime2._populateDataSelector( "month", "MMM", objDatetime2 ),
463 "should populate data selector by given field and pattern"
467 objDate2.value( "Jan 1 09:00:00 2012" );
468 equal(objDate2.value( ) , "2012-01-01" , "Set and get value for date" );
471 objTime2.value( "Jan 1 09:00:00 2012" );
472 equal(objTime2.value( ) , "09:00:00" , "Set and get value for time" );
477 asyncTest( "Public Methods Dynamic", function () {
478 objDatetime2.value.call( objDatetime2, "Jan 1 09:00:00 2012" );
479 equal( "2012-01-01T09:00:00", objDatetime2.value(), "should set and get value by API" );
480 var format = "yyyy MM dd hh mm";
481 objDatetime2._setFormat( format );
482 equal( objDatetime2.option( "format" ), format, "should set type and format" );
486 asyncTest( "Events Dynamic", function () {
487 var str = "May 2 18:00:00 2012";
488 $(datetime2).bind( "date-changed", function (e, date) {
489 equal( objDatetime2.value(), "2012-05-02T18:00:00", "Should invoke event when date changed" );
493 objDatetime2.value( str );