Simon Egersand
2017-01-10 e9db5fa71dd4acf786d5148acc3b09e583397a11
commit | author | age
0d9dc7 1 // Create the dom before requiring react
M 2 var DOM = require( './testdom');
3 DOM();
4
516b36 5 // Needs to be global to work in Travis CI
92a2c6 6 React = require('react');
2d8253 7 ReactDOM = require('react-dom');
15436d 8
92a2c6 9 var Datetime = require('../DateTime'),
0d9dc7 10     assert = require('assert'),
92a2c6 11     moment = require('moment'),
M 12     TestUtils = require('react-addons-test-utils')
0d9dc7 13 ;
M 14
516b36 15 var createDatetime = function( props ){
2d8253 16     document.body.innerHTML = '<div id="root"></div>';
0d9dc7 17
2d8253 18     ReactDOM.render(
516b36 19         React.createElement( Datetime, props ),
2d8253 20         document.getElementById('root')
0d9dc7 21     );
M 22
2d8253 23     return document.getElementById('root').children[0];
0d9dc7 24 };
M 25
59314a 26 var trigger = function( name, element ){
M 27     var ev = document.createEvent("MouseEvents");
28    ev.initEvent(name, true, true);
29    element.dispatchEvent( ev );
30 };
31
92a2c6 32 var ev = TestUtils.Simulate;
59314a 33 var dt = {
M 34     dt: function(){
2d8253 35         return document.getElementById('root').children[0];
59314a 36     },
M 37     view: function(){
38         return this.dt().children[1].children[0];
39     },
40     input: function(){
41         return this.dt().children[0];
42     },
43     switcher: function(){
2d8253 44         return document.querySelector('.rdtSwitch');
59314a 45     },
M 46     timeSwitcher: function(){
2d8253 47         return document.querySelector('.rdtTimeToggle');
59314a 48     },
M 49     year: function( n ){
2d8253 50         var years = document.querySelectorAll('.rdtYear');
59314a 51         return years[ n || 0 ];
M 52     },
53     month: function( n ){
2d8253 54         var months = document.querySelectorAll('.rdtMonth');
59314a 55         return months[ n || 0 ];
M 56     },
57     day: function( n ){
2d8253 58         return document.querySelector('.rdtDay[data-value="' + n + '"]');
59314a 59     },
M 60     next: function(){
a8a17a 61         return document.querySelector('.rdtNext span');
59314a 62     },
M 63     prev: function(){
a8a17a 64         return document.querySelector('.rdtPrev span');
59314a 65     },
M 66     timeUp: function( n ){
67         return document.querySelectorAll('.rdtCounter')[ n ].children[0];
68     },
69     timeDown: function( n ){
70         return document.querySelectorAll('.rdtCounter')[ n ].children[2];
71     },
72     hour: function(){
73         return document.querySelectorAll('.rdtCount')[0];
74     },
75     minute: function(){
76         return document.querySelectorAll('.rdtCount')[1];
77     },
78     second: function(){
79         return document.querySelectorAll('.rdtCount')[2];
80     },
81     milli: function(){
82         return document.querySelector('.rdtMilli input');
83     }
84 };
85
86 var date = new Date( 2000, 0, 15, 2, 2, 2, 2 ),
0d9dc7 87     mDate = moment( date ),
049c33 88     strDate = mDate.format('L') + ' ' + mDate.format('LT'),
TS 89     mDateUTC = moment.utc(date),
bdad6c 90     strDateUTC = mDateUTC.format('L') + ' ' + mDateUTC.format('LT'),
SE 91     currentYear = new Date().getFullYear()
0d9dc7 92 ;
M 93
94 describe( 'Datetime', function(){
95     it( 'Create Datetime', function(){
516b36 96         var component = createDatetime({});
0d9dc7 97         assert( component );
M 98         assert.equal( component.children.length, 2 );
99         assert.equal( component.children[0].tagName , 'INPUT' );
100         assert.equal( component.children[1].tagName , 'DIV' );
101     });
102
103     it( 'input=false', function(){
516b36 104         var component = createDatetime({ input: false });
0d9dc7 105         assert( component );
M 106         assert.equal( component.children.length, 1 );
107         assert.equal( component.children[0].tagName , 'DIV' );
108     });
109
92a2c6 110
0d9dc7 111     it( 'Date value', function(){
516b36 112         var component = createDatetime({ value: date }),
0d9dc7 113             input = component.children[0]
M 114         ;
115         assert.equal( input.value, strDate );
116     });
117
118     it( 'Moment value', function(){
516b36 119         var component = createDatetime({ value: mDate }),
0d9dc7 120             input = component.children[0]
M 121         ;
122         assert.equal( input.value, strDate );
123     });
124
125     it( 'String value', function(){
516b36 126         var component = createDatetime({ value: strDate }),
0d9dc7 127             input = component.children[0]
M 128         ;
129         assert.equal( input.value, strDate );
130     });
131
98310d 132     it( 'UTC Value from local moment', function(){
049c33 133         var component = createDatetime({
TS 134             value: mDate,
135             utc: true
136         });
137         var input = component.children[0];
138         assert.equal( input.value, strDateUTC );
139     });
140
98310d 141     it( 'UTC Value from UTC moment', function(){
049c33 142         var component = createDatetime({
TS 143             value: mDateUTC,
144             utc: true
145         });
146         var input = component.children[0];
147         assert.equal( input.value, strDateUTC );
148     });
149
98310d 150     it( 'UTC Value from utc string', function(){
049c33 151         var component = createDatetime({
TS 152             value: strDateUTC,
153             utc: true
154         });
155         var input = component.children[0];
156         assert.equal( input.value, strDateUTC );
157     });
158
0d9dc7 159     it( 'Date defaultValue', function(){
516b36 160         var component = createDatetime({ defaultValue: date }),
0d9dc7 161             input = component.children[0]
M 162         ;
163         assert.equal( input.value, strDate );
164     });
165
166     it( 'Moment defaultValue', function(){
516b36 167         var component = createDatetime({ defaultValue: mDate }),
0d9dc7 168             input = component.children[0]
M 169         ;
170         assert.equal( input.value, strDate );
171     });
172
173     it( 'String defaultValue', function(){
516b36 174         var component = createDatetime({ defaultValue: strDate }),
0d9dc7 175             input = component.children[0]
M 176         ;
177         assert.equal( input.value, strDate );
178     });
179
180     it( 'dateFormat', function(){
516b36 181         var component = createDatetime({ value: date, dateFormat: 'M&D' }),
0d9dc7 182             input = component.children[0]
M 183         ;
184         assert.equal( input.value, mDate.format('M&D LT') );
185     });
186
187     it( 'dateFormat=false', function(){
516b36 188         var component = createDatetime({ value: date, dateFormat: false }),
0d9dc7 189             input = component.children[0],
59314a 190             view = dt.view()
0d9dc7 191         ;
M 192         assert.equal( input.value, mDate.format('LT') );
193         // The view must be the timepicker
194         assert.equal( view.className, 'rdtTime' );
195         // There must not be a date toggle
196         assert.equal( view.querySelectorAll('thead').length, 0);
197     });
98310d 198
0d9dc7 199     it( 'timeFormat', function(){
M 200         var format = 'HH:mm:ss:SSS',
516b36 201             component = createDatetime({ value: date, timeFormat: format }),
0d9dc7 202             input = component.children[0]
M 203         ;
204         assert.equal( input.value, mDate.format('L ' + format) );
205     });
206
207     it( 'timeFormat=false', function(){
516b36 208         var component = createDatetime({ value: date, timeFormat: false }),
0d9dc7 209             input = component.children[0],
59314a 210             view = dt.view()
0d9dc7 211         ;
M 212         assert.equal( input.value, mDate.format('L') );
213         // The view must be the daypicker
214         assert.equal( view.className, 'rdtDays' );
215         // There must not be a time toggle
216         assert.equal( view.querySelectorAll('.timeToggle').length, 0);
217     });
218
cf1e72 219     it( 'timeFormat with lowercase am', function(){
SE 220         var format = 'HH:mm:ss:SSS a',
221             component = createDatetime({ value: date, timeFormat: format }),
222             input = component.children[0]
223             ;
224         assert.notEqual( input.value.indexOf('am'), -1 );
225     });
226
227     it( 'timeFormat with uppercase AM', function(){
228         var format = 'HH:mm:ss:SSS A',
229             component = createDatetime({ value: date, timeFormat: format }),
230             input = component.children[0]
231             ;
232         assert.notEqual( input.value.indexOf('AM'), -1 );
233     });
234
0d9dc7 235     it( 'viewMode=years', function(){
516b36 236         var component = createDatetime({ viewMode: 'years' }),
59314a 237             view = dt.view()
0d9dc7 238         ;
M 239
240         assert.equal( view.className, 'rdtYears' );
241     });
242
243     it( 'viewMode=months', function(){
516b36 244         var component = createDatetime({ viewMode: 'months' }),
59314a 245             view = dt.view()
0d9dc7 246         ;
M 247
248         assert.equal( view.className, 'rdtMonths' );
249     });
250
251     it( 'viewMode=time', function(){
516b36 252         var component = createDatetime({ viewMode: 'time' }),
59314a 253             view = dt.view()
0d9dc7 254         ;
M 255
256         assert.equal( view.className, 'rdtTime' );
257     });
258
386942 259     it( 'className of type string', function(){
516b36 260         var component = createDatetime({ className: 'custom' });
0d9dc7 261         assert.notEqual( component.className.indexOf('custom'), -1 );
M 262     });
263
386942 264     it( 'className of type string array', function(){
SE 265         var component = createDatetime({ className: ['custom1', 'custom2'] });
266         assert.notEqual( component.className.indexOf('custom1'), -1 );
267         assert.notEqual( component.className.indexOf('custom2'), -1 );
268     });
269
0d9dc7 270     it( 'inputProps', function(){
516b36 271         var component = createDatetime({ inputProps: { className: 'myInput', type: 'email' } }),
0d9dc7 272             input = component.children[0]
M 273         ;
274
275         assert.equal( input.className, 'myInput' );
276         assert.equal( input.type, 'email' );
277     });
278
279     it( 'renderDay', function(){
280         var props, currentDate, selectedDate,
516b36 281             component = createDatetime({ value: mDate, renderDay: function( p, current, selected ){
0d9dc7 282                 props = p;
M 283                 currentDate = current;
284                 selectedDate = selected;
285
286                 return React.DOM.td( props, 'day' );
287             }}),
59314a 288             view = dt.view()
0d9dc7 289         ;
M 290
291         // Last day should be 6th of february
292         assert.equal( currentDate.day(), 6 );
293         assert.equal( currentDate.month(), 1 );
294
295         // The date must be the same
296         assert.equal( selectedDate.isSame( mDate ), true );
297
298         // There should be a onClick function in the props
299         assert.equal( typeof props.onClick, 'function' );
300
301         // The cell text should be 'day'
2d8253 302         assert.equal( view.querySelector('.rdtDay').innerHTML, 'day' );
0d9dc7 303     });
M 304
305     it( 'renderMonth', function(){
306         var props, month, year, selectedDate,
516b36 307             component = createDatetime({ value: mDate, viewMode: 'months', renderMonth: function( p, m, y, selected ){
0d9dc7 308                 props = p;
M 309                 month = m;
310                 year = y;
311                 selectedDate = selected;
312
313                 return React.DOM.td( props, 'month' );
314             }}),
59314a 315             view = dt.view()
0d9dc7 316         ;
M 317
318         // The date must be the same
319         assert.equal( selectedDate.isSame( mDate ), true );
320
321         assert.equal( month, 11 );
322         assert.equal( year, 2000 );
323
324         // There should be a onClick function in the props
325         assert.equal( typeof props.onClick, 'function' );
326
327         // The cell text should be 'day'
2d8253 328         assert.equal( view.querySelector('.rdtMonth').innerHTML, 'month' );
0d9dc7 329     });
M 330
331     it( 'renderYear', function(){
332         var props, year, selectedDate,
516b36 333             component = createDatetime({ value: mDate, viewMode: 'years', renderYear: function( p, y, selected ){
0d9dc7 334                 props = p;
M 335                 year = y;
336                 selectedDate = selected;
337
338                 return React.DOM.td( props, 'year' );
339             }}),
59314a 340             view = dt.view()
0d9dc7 341         ;
M 342
343         // The date must be the same
344         assert.equal( selectedDate.isSame( mDate ), true );
345
346         assert.equal( year, 2010 );
347
348         // There should be a onClick function in the props
349         assert.equal( typeof props.onClick, 'function' );
350
351         // The cell text should be 'day'
2d8253 352         assert.equal( view.querySelector('.rdtYear').innerHTML, 'year' );
0d9dc7 353     });
59314a 354
M 355     it( 'Time pickers depends on the time format', function() {
356         createDatetime({ viewMode: 'time', timeFormat: "HH:mm:ss:SSS"});
357         assert.equal( document.querySelectorAll('.rdtCounter').length, 4 );
358
359         createDatetime({ viewMode: 'time', timeFormat: "HH:mm:ss"});
360         assert.equal( document.querySelectorAll('.rdtCounter').length, 3 );
361
362         createDatetime({ viewMode: 'time', timeFormat: "HH:mm"});
363         assert.equal( document.querySelectorAll('.rdtCounter').length, 2 );
364
365         createDatetime({ viewMode: 'time', timeFormat: "HH"});
366         assert.equal( document.querySelectorAll('.rdtCounter').length, 1 );
367     });
368
369     it( 'viewChange', function() {
370         createDatetime({viewMode: 'time' });
371
372         assert.equal( dt.view().className, 'rdtTime' );
373         ev.click( dt.switcher() );
374         assert.equal( dt.view().className, 'rdtDays' );
375         ev.click( dt.switcher() );
376         assert.equal( dt.view().className, 'rdtMonths' );
377         ev.click( dt.switcher() );
378         assert.equal( dt.view().className, 'rdtYears' );
379     });
380
381     it( 'switch to time', function(){
382         createDatetime({});
383         assert.equal( dt.view().className, 'rdtDays' );
384         ev.click( dt.timeSwitcher() );
385         assert.equal( dt.view().className, 'rdtTime' );
98310d 386     });
59314a 387
M 388     it( 'selectYear', function(){
389         createDatetime({ viewMode: 'years', defaultValue: date });
390         assert.equal( dt.view().className, 'rdtYears' );
391         assert.equal( dt.switcher().innerHTML, '2000-2009' );
392
393         // First year is 1999
394         ev.click( dt.year() );
395         assert.equal( dt.view().className, 'rdtMonths' );
396         assert.equal( dt.switcher().innerHTML, '1999' );
397     });
398
399     it( 'increase decade', function(){
400         createDatetime({ viewMode: 'years', defaultValue: date });
401
402         assert.equal( dt.switcher().innerHTML, '2000-2009' );
403         ev.click( dt.next() );
404         assert.equal( dt.switcher().innerHTML, '2010-2019' );
405         ev.click( dt.next() );
406         assert.equal( dt.switcher().innerHTML, '2020-2029' );
407     });
408
409     it( 'decrease decade', function(){
410         createDatetime({ viewMode: 'years', defaultValue: date });
411
412         assert.equal( dt.switcher().innerHTML, '2000-2009' );
413         ev.click( dt.prev() );
414         assert.equal( dt.switcher().innerHTML, '1990-1999' );
415         ev.click( dt.prev() );
416         assert.equal( dt.switcher().innerHTML, '1980-1989' );
417     });
418
419     it( 'selectMonth', function(){
420         createDatetime({ viewMode: 'months', defaultValue: date });
421         assert.equal( dt.view().className, 'rdtMonths' );
422         assert.equal( dt.switcher().innerHTML, '2000' );
423
424         ev.click( dt.month(1) );
425         assert.equal( dt.view().className, 'rdtDays' );
426         assert.equal( dt.switcher().getAttribute('data-value'), "1" );
427     });
428
429     it( 'increase year', function(){
430         createDatetime({ viewMode: 'months', defaultValue: date });
431
432         assert.equal( dt.switcher().getAttribute('data-value'), '2000' );
433         ev.click( dt.next() );
434         assert.equal( dt.switcher().getAttribute('data-value'), '2001' );
435         ev.click( dt.next() );
436         assert.equal( dt.switcher().getAttribute('data-value'), '2002' );
437     });
438
439     it( 'decrease year', function(){
440         createDatetime({ viewMode: 'months', defaultValue: date });
441
442         assert.equal( dt.switcher().getAttribute('data-value'), '2000' );
443         ev.click( dt.prev() );
444         assert.equal( dt.switcher().getAttribute('data-value'), '1999' );
445         ev.click( dt.prev() );
446         assert.equal( dt.switcher().getAttribute('data-value'), '1998' );
447     });
448
449     it( 'increase month', function(){
450         createDatetime({ defaultValue: date });
451
452         assert.equal( dt.switcher().getAttribute('data-value'), '0' );
453         ev.click( dt.next() );
454         assert.equal( dt.switcher().getAttribute('data-value'), '1' );
455         ev.click( dt.next() );
456         assert.equal( dt.switcher().getAttribute('data-value'), '2' );
457     });
458
459     it( 'decrease month', function(){
460         createDatetime({ defaultValue: date });
461
462         assert.equal( dt.switcher().getAttribute('data-value'), '0' );
463         ev.click( dt.prev() );
464         assert.equal( dt.switcher().getAttribute('data-value'), '11' );
465         ev.click( dt.prev() );
466         assert.equal( dt.switcher().getAttribute('data-value'), '10' );
467     });
468
469     it( 'open picker', function(){
470         createDatetime({});
471         assert.equal(dt.dt().className.indexOf('rdtOpen'), -1);
472         ev.focus( dt.input() );
473         assert.notEqual(dt.dt().className.indexOf('rdtOpen'), -1);
474     });
475
476     it( 'onSelect', function( done ){
477         createDatetime({ defaultValue: date, onChange: function( selected ){
478             assert.equal( selected.date(), 2 );
479             assert.equal( selected.month(), mDate.month() );
480             assert.equal( selected.year(), mDate.year() );
481             done();
482         }});
483
484         ev.click( dt.day( 2 ) );
485     });
486
487     it( 'multiple onSelect', function( done ){
488         var i = 0;
489         createDatetime({ defaultValue: date, onChange: function( selected ){
490             i++;
491             if( i > 2 ){
492                 assert.equal( selected.date(), 4 );
493                 assert.equal( selected.month(), mDate.month() );
494                 assert.equal( selected.year(), mDate.year() );
495                 done();
496             }
497         }});
498
499         ev.click( dt.day( 2 ) );
500         ev.click( dt.day( 3 ) );
501         ev.click( dt.day( 4 ) );
502     });
503
aca9e6 504     it( 'onFocus', function(){
R 505         var focus = false;
506         createDatetime({ value: date, onFocus: function( selected ){
507             focus = true;
508         }});
509
510         ev.focus( dt.input() );
511         assert.equal( focus, true );
512     });
513
59314a 514     it( 'onBlur', function(){
M 515         createDatetime({ value: date, onBlur: function( selected ){
516             assert.equal( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
517             assert.equal( selected.date(), mDate.date() );
518             assert.equal( selected.month(), mDate.month() );
519             assert.equal( selected.year(), mDate.year() );
520             done();
521         }});
522
523         assert.equal( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
524         ev.focus( dt.input() );
525         assert.notEqual( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
526         trigger( 'click', document.body );
527     });
528
9012e8 529     it( 'closeOnTab:true', function(){
M 530         createDatetime({ value: date });
531
532         assert.equal( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
533         ev.focus( dt.input() );
534         assert.notEqual( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
535         TestUtils.Simulate.keyDown(dt.input(), {key: "Tab", keyCode: 9, which: 9});
536         assert.equal( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
537         trigger( 'click', document.body );
538     });
539
540     it( 'closeOnTab:false', function(){
541         createDatetime({ value: date, closeOnTab: false });
542
543         assert.equal( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
544         ev.focus( dt.input() );
545         assert.notEqual( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
546         TestUtils.Simulate.keyDown(dt.input(), {key: "Tab", keyCode: 9, which: 9});
547         assert.notEqual( dt.dt().className.indexOf( 'rdtOpen' ), -1 );
548         trigger( 'click', document.body );
549     });
550
59314a 551     it( 'increase time', function( done ){
M 552         var i = 0;
553         createDatetime({ timeFormat: "HH:mm:ss:SSS", viewMode: 'time', defaultValue: date, onChange: function( selected ){
554             i++;
555             if( i > 2 ){
556                 assert.equal( selected.hour(), 3 );
557                 assert.equal( selected.minute(), 3 );
558                 assert.equal( selected.second(), 3 );
559                 done();
560             }
561         }});
562
563         trigger( 'mousedown', dt.timeUp( 0 ) );
564         trigger('mouseup', document.body );
565         assert.equal( dt.hour().innerHTML, 3 );
566         trigger( 'mousedown', dt.timeUp( 1 ) );
567         trigger( 'mouseup', dt.timeUp( 1 ) );
568         assert.equal( dt.minute().innerHTML, 3 );
569         trigger( 'mousedown', dt.timeUp( 2 ) );
570         trigger( 'mouseup', dt.timeUp( 2 ) );
571         assert.equal( dt.second().innerHTML, 3 );
572     });
573
574     it( 'decrease time', function( done ){
575         var i = 0;
576         createDatetime({ timeFormat: "HH:mm:ss:SSS", viewMode: 'time', defaultValue: date, onChange: function( selected ){
577             i++;
578             if( i > 2 ){
579                 assert.equal( selected.hour(), 1 );
580                 assert.equal( selected.minute(), 1 );
581                 assert.equal( selected.second(), 1 );
582                 done();
583             }
584         }});
585
586         trigger('mousedown', dt.timeDown( 0 ) );
587         trigger('mouseup', dt.timeDown( 0 ) );
588         assert.equal( dt.hour().innerHTML, 1 );
589         trigger('mousedown', dt.timeDown( 1 ) );
590         trigger('mouseup', dt.timeDown( 1 ) );
591         assert.equal( dt.minute().innerHTML, 1 );
592         trigger('mousedown', dt.timeDown( 2 ) );
593         trigger('mouseup', dt.timeDown( 2 ) );
594         assert.equal( dt.second().innerHTML, 1 );
595     });
596
597     it( 'long increase time', function( done ){
598         createDatetime({ timeFormat: "HH:mm:ss:SSS", viewMode: 'time', defaultValue: date});
599
600         trigger( 'mousedown', dt.timeUp( 0 ) );
601         setTimeout( function(){
602             trigger('mouseup', document.body );
603             assert.notEqual( dt.hour().innerHTML, 2 );
604             assert.notEqual( dt.hour().innerHTML, 3 );
605             done();
a79e6b 606         }, 920 );
59314a 607     });
M 608
609     it( 'long decrease time', function( done ){
610         createDatetime({ timeFormat: "HH:mm:ss:SSS", viewMode: 'time', defaultValue: date});
611
612         trigger( 'mousedown', dt.timeDown( 0 ) );
613         setTimeout( function(){
614             trigger('mouseup', document.body );
615             assert.notEqual( dt.hour().innerHTML, 1 );
616             assert.notEqual( dt.hour().innerHTML, 0 );
617             done();
a79e6b 618         }, 920 );
59314a 619     });
62fd2f 620
9bb4f7 621     it( 'increase time with timeConstraints', function( done ){
LG 622         var i = 0;
623         createDatetime({ timeFormat: "HH:mm:ss:SSS", viewMode: 'time', defaultValue: date, onChange: function( selected ){
624             i++;
625             if( i > 2 ){
626                 assert.equal( selected.minute(), 17 );
627                 assert.equal( selected.second(), 3 );
628                 done();
629             }
4ed404 630         }, timeConstraints: { hours: { max: 6, step: 8 }, minutes: { step: 15 }}});
9bb4f7 631
LG 632         trigger( 'mousedown', dt.timeUp( 0 ) );
633         trigger('mouseup', document.body );
ef2929 634         assert.equal( dt.hour().innerHTML, 3 );
9bb4f7 635         trigger( 'mousedown', dt.timeUp( 1 ) );
LG 636         trigger( 'mouseup', dt.timeUp( 1 ) );
637         assert.equal( dt.minute().innerHTML, 17 );
638         trigger( 'mousedown', dt.timeUp( 2 ) );
639         trigger( 'mouseup', dt.timeUp( 2 ) );
640         assert.equal( dt.second().innerHTML, 3 );
641     });
642
4ed404 643     it( 'decrease time with timeConstraints', function( done ){
LG 644         createDatetime({ timeFormat: "HH:mm:ss:SSS", viewMode: 'time', defaultValue: date, onChange: function( selected ){
645             assert.equal( selected.minute(), 47 );
646             done();
647         }, timeConstraints: { minutes: { step: 15 }}});
648
649         trigger( 'mousedown', dt.timeDown( 1 ) );
650         trigger( 'mouseup', dt.timeDown( 1 ) );
651         assert.equal( dt.minute().innerHTML, 47 );
652     });
653
62fd2f 654     it( 'invalid input value', function( done ){
M 655         createDatetime({ defaultValue: 'luis', onChange: function( updated ){
656             assert.equal( mDate.format('L LT'), updated.format('L LT') );
657             done();
658         }});
659
660         assert.equal( dt.input().value, 'luis' );
661         dt.input().value = strDate;
92a2c6 662         ev.change( dt.input() );
62fd2f 663     });
M 664
0eb496 665     it( 'invalid moment object as input value', function( done ){
SE 666         var value = moment(null);
667         createDatetime({ value: value, onChange: function( updated ){
668             assert.equal( mDate.format('L LT'), updated.format('L LT') );
669             done();
670         }});
671
672         assert.equal( dt.input().value, '' );
673         dt.input().value = strDate;
674         ev.change( dt.input() );
675     });
676
62fd2f 677     it( 'delete input value', function( done ){
M 678         createDatetime({ defaultValue: date, onChange: function( date ){
679             assert.equal( date, '' );
680             done();
681         }});
682         dt.input().value = '';
92a2c6 683         ev.change( dt.input() );
62fd2f 684     });
0eb226 685
NB 686     it( 'strictParsing=true', function( done ){
687         var invalidStrDate = strDate + 'x';
688         createDatetime({ defaultValue: '', strictParsing: true, onChange: function( updated ){
689             assert.equal( updated, invalidStrDate);
690             done();
691         }});
692
693         dt.input().value = invalidStrDate;
92a2c6 694         ev.change( dt.input() );
0eb226 695     });
NB 696
697     it( 'strictParsing=false', function( done ){
698         var invalidStrDate = strDate + 'x';
699         createDatetime({ defaultValue: '', strictParsing: false, onChange: function( updated ){
700             assert.equal( mDate.format('L LT'), updated.format('L LT') );
701             done();
702         }});
703
704         dt.input().value = invalidStrDate;
92a2c6 705         ev.change( dt.input() );
0eb226 706     });
c306f2 707
R 708     it( 'disable months', function(){
bdad6c 709         var dateBefore = currentYear + '-06-01';
SE 710         createDatetime({ viewMode: 'months', isValidDate: function(current ){
3e7db8 711                 return current.isBefore(moment(dateBefore, 'YYYY-MM-DD'));
c306f2 712         }});
R 713         assert.equal( dt.month(0).className, 'rdtMonth' );
714         assert.equal( dt.month(4).className, 'rdtMonth' );
715         assert.equal( dt.month(5).className, 'rdtMonth rdtDisabled' );
716         assert.equal( dt.month(11).className, 'rdtMonth rdtDisabled' );
717     });
718
719     it( 'disable years', function(){
bdad6c 720         createDatetime({ viewMode: 'years', isValidDate: function(current ){
c306f2 721                 return current.isBefore(moment('2016-01-01', 'YYYY-MM-DD'));
R 722         }});
e9db5f 723         assert.equal( dt.year(0).className, 'rdtYear' );
c306f2 724         assert.equal( dt.year(6).className, 'rdtYear' );
R 725         assert.equal( dt.year(7).className, 'rdtYear rdtDisabled' );
726     });
98310d 727
bdad6c 728     it( 'persistent valid months going monthView->yearView->monthView', function(){
SE 729         var dateBefore = currentYear + '-06-01';
730         createDatetime({ viewMode: 'months', isValidDate: function(current ){
731                 return current.isBefore(moment(dateBefore, 'YYYY-MM-DD'));
732         }});
733         assert.equal( dt.month(4).className, 'rdtMonth' );
734         assert.equal( dt.month(5).className, 'rdtMonth rdtDisabled' );
735         // Go to year view
736         ev.click( dt.switcher() );
e9db5f 737         assert.equal( dt.year(0).className, 'rdtYear' );
bdad6c 738         assert.equal( dt.year(9).className, 'rdtYear rdtDisabled' );
SE 739         // Go back initial month view, nothing should be changed
740         ev.click( dt.year(8) );
741         assert.equal( dt.month(4).className, 'rdtMonth' );
742         assert.equal( dt.month(5).className, 'rdtMonth rdtDisabled' );
743     });
744
98310d 745     it( 'locale', function(){
SE 746         createDatetime({ locale: 'nl' });
747         view = dt.view();
748         var weekDays = [];
749         var weekDaysHtmlQuery = view.querySelectorAll('.rdtDays .dow');
750         Array.prototype.forEach.call(weekDaysHtmlQuery, function(el) {
751             weekDays.push(el.innerHTML);
752         });
753         weekDays = weekDays.splice(0, 7);
754         var weekDayNames = ['Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za', 'Zo'];
755         weekDays.map(function(weekDayHtml, index) {
756             assert.equal( weekDayHtml, weekDayNames[index] );
757         });
758     });
759
760     it( 'locale in viewMode=months', function(){
761         createDatetime({ viewMode: 'months', locale: 'nl' });
762         view = dt.view();
763         var thirdMonth = view.querySelectorAll('.rdtMonth')[2].innerHTML;
764         var fifthMonth = view.querySelectorAll('.rdtMonth')[4].innerHTML;
765         assert.equal( thirdMonth, 'Mrt' );
766         assert.equal( fifthMonth, 'Mei' );
767     });
0d9dc7 768 });