From d1152a39e635a0a72fb6c13c82425bc9ff4e569f Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 22 May 2016 17:18:28 +0200 Subject: [PATCH 01/17] Calendar tests: Add select event unit tests --- tests/unit/calendar/events.js | 61 +++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/tests/unit/calendar/events.js b/tests/unit/calendar/events.js index e69de29bb2d..a8a0b38e0d1 100644 --- a/tests/unit/calendar/events.js +++ b/tests/unit/calendar/events.js @@ -0,0 +1,61 @@ +define( [ + "jquery", + "./helper", + "ui/widgets/calendar" +], function( $, testHelper ) { + +module( "calendar: events" ); + +asyncTest( "select", function() { + expect( 6 ); + + var message, eventType, + element = $( "#calendar" ).calendar( { + select: function( event ) { + ok( true, "select event fired " + message ); + equal( + event.type, + "calendarselect", + "select event " + message + ); + equal( + event.originalEvent.type, + eventType, + "select originalEvent " + message + ); + } + } ); + + function step1() { + setTimeout( function() { + eventType = "mousedown"; + message = "on calendar button " + eventType; + element.find( "table button:eq(1)" ).simulate( eventType ); + step2(); + }, 50 ); + } + + function step2() { + setTimeout( function() { + eventType = "keydown"; + message = "on calendar button " + eventType; + testHelper.focusGrid( element ) + .simulate( eventType, { keyCode: $.ui.keyCode.END } ) + .simulate( eventType, { keyCode: $.ui.keyCode.ENTER } ); + step3(); + }, 50 ); + } + + // This should not trigger another event + function step3() { + setTimeout( function() { + element.calendar( "disable" ); + element.find( "table button:eq(10)" ).simulate( "mousedown" ); + start(); + }, 50 ); + } + + step1(); +} ); + +} ); From 967e58179eba0d2bd19c952abb4219be7e43f1ea Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 22 May 2016 17:19:09 +0200 Subject: [PATCH 02/17] Calendar: Make sure keydown original event is available --- ui/widgets/calendar.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/ui/widgets/calendar.js b/ui/widgets/calendar.js index 4c9a0354568..805547f753d 100644 --- a/ui/widgets/calendar.js +++ b/ui/widgets/calendar.js @@ -108,16 +108,7 @@ return $.widget( "ui.calendar", { this.date.adjust( "M", this.options.numberOfMonths ); this._updateView(); }, - "mousedown .ui-calendar-calendar button": function( event ) { - this._setOption( "value", new Date( $( event.currentTarget ).data( "timestamp" ) ) ); - this._updateDayElement( "ui-state-active" ); - - // Allow datepicker to handle focus - if ( this._trigger( "select", event ) !== false ) { - this.activeDescendant.closest( this.grid ).focus(); - event.preventDefault(); - } - }, + "mousedown .ui-calendar-calendar button": "_select", "mouseenter .ui-calendar-header-buttons button": "_hover", "mouseleave .ui-calendar-header-buttons button": "_hover", "mouseenter .ui-calendar-calendar button": "_hover", @@ -133,12 +124,25 @@ return $.widget( "ui.calendar", { this._addClass( $( event.currentTarget ), null, "ui-state-hover" ); }, + _select: function( event ) { + this._setOption( "value", new Date( $( event.currentTarget ).data( "timestamp" ) ) ); + this._updateDayElement( "ui-state-active" ); + + // Allow datepicker to handle focus + if ( this._trigger( "select", event ) !== false ) { + this.activeDescendant.closest( this.grid ).focus(); + event.preventDefault(); + } + }, + _handleKeydown: function( event ) { var pageAltKey = ( event.altKey || event.ctrlKey && event.shiftKey ); switch ( event.keyCode ) { case $.ui.keyCode.ENTER: - this.activeDescendant.mousedown(); + this._select( + $.Event( event, { currentTarget: this.activeDescendant[ 0 ] } ) + ); return; case $.ui.keyCode.PAGE_UP: this.date.adjust( pageAltKey ? "Y" : "M", -1 ); From 85fe55335cb09db4caff378e9cc4a433e4e6cd27 Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 22 May 2016 21:12:10 +0200 Subject: [PATCH 03/17] Calendar tests: Add dateEqual assertion, clean up helper methods --- tests/lib/qunit-assert-dateequal.js | 22 ++++++++++++++++++ tests/lib/qunit.js | 1 + tests/unit/calendar/core.js | 36 ++++++++++++++--------------- tests/unit/calendar/helper.js | 15 ------------ tests/unit/calendar/methods.js | 21 ++++++++--------- tests/unit/calendar/options.js | 19 ++++++++------- tests/unit/datepicker/core.js | 18 +++++++-------- tests/unit/datepicker/helper.js | 15 ------------ tests/unit/datepicker/methods.js | 6 ++--- 9 files changed, 72 insertions(+), 81 deletions(-) create mode 100644 tests/lib/qunit-assert-dateequal.js diff --git a/tests/lib/qunit-assert-dateequal.js b/tests/lib/qunit-assert-dateequal.js new file mode 100644 index 00000000000..7a997003bf9 --- /dev/null +++ b/tests/lib/qunit-assert-dateequal.js @@ -0,0 +1,22 @@ +/* + * Assertion for comparing Date objects by day, month and year. + */ +define( [ + "qunit" +], function( QUnit ) { + +QUnit.assert.dateEqual = function( value, expected, message ) { + + if ( !value || !expected ) { + this.push( false, value, expected, + "dateEqual failed, missing date object, message was: " + message ); + return; + } + + var newValue = new Date( value.getFullYear(), value.getMonth(), value.getDate() ), + newExpected = new Date( expected.getFullYear(), expected.getMonth(), expected.getDate() ); + + this.push( ( newValue.toString() === newExpected.toString() ), value, expected, message ); +}; + +} ); diff --git a/tests/lib/qunit.js b/tests/lib/qunit.js index e2a6e85c7f4..fe5c1d746c5 100644 --- a/tests/lib/qunit.js +++ b/tests/lib/qunit.js @@ -4,6 +4,7 @@ define( [ "qunit-assert-classes", "qunit-assert-close", "lib/qunit-assert-domequal", + "lib/qunit-assert-dateequal", "phantom-bridge" ], function( QUnit, $ ) { diff --git a/tests/unit/calendar/core.js b/tests/unit/calendar/core.js index 65daf1bd458..7945d08910b 100644 --- a/tests/unit/calendar/core.js +++ b/tests/unit/calendar/core.js @@ -137,7 +137,7 @@ test( "Localization", function() { testLocalization( "After init: " ); } ); -asyncTest( "keyboard handling", function() { +asyncTest( "keyboard handling", function( assert ) { expect( 10 ); var element = $( "#calendar" ); @@ -150,7 +150,7 @@ asyncTest( "keyboard handling", function() { .simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2013, 12 - 1, 31 ), "Keystroke left to switch to previous day" @@ -167,7 +167,7 @@ asyncTest( "keyboard handling", function() { .simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ) .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2014, 1 - 1, 2 ), "Keystroke right to switch to next day" @@ -181,7 +181,7 @@ asyncTest( "keyboard handling", function() { testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2013, 12 - 1, 25 ), "Keystroke up to move to the previous week" @@ -197,7 +197,7 @@ asyncTest( "keyboard handling", function() { testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2014, 1 - 1, 8 ), "Keystroke down to move to the next week" @@ -213,7 +213,7 @@ asyncTest( "keyboard handling", function() { testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2013, 12 - 1, 1 ), "Keystroke Page Up moves date to previous month" @@ -230,7 +230,7 @@ asyncTest( "keyboard handling", function() { .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP, altKey: true } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2013, 1 - 1, 1 ), "Keystroke Page Up + ALT moves date to previous year" @@ -246,7 +246,7 @@ asyncTest( "keyboard handling", function() { testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2014, 2 - 1, 1 ), "Keystroke Page Down moves date to next month" @@ -263,7 +263,7 @@ asyncTest( "keyboard handling", function() { .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN, altKey: true } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2015, 1 - 1, 1 ), "Keystroke Page Down + ALT moves date to next year" @@ -280,7 +280,7 @@ asyncTest( "keyboard handling", function() { testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2014, 2 - 1, 28 ), "Keystroke Page Up and short months" @@ -296,7 +296,7 @@ asyncTest( "keyboard handling", function() { testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2016, 2 - 1, 29 ), "Keystroke Page Down and leap years" @@ -309,7 +309,7 @@ asyncTest( "keyboard handling", function() { step1(); } ); -asyncTest( "mouse", function() { +asyncTest( "mouse", function( assert ) { expect( 6 ); var element = $( "#calendar" ).calendar(), @@ -318,7 +318,7 @@ asyncTest( "mouse", function() { function step1() { $( "tbody button:contains(10)", element ).simulate( "mousedown" ); date.setDate( 10 ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), date, "Mouse click" @@ -326,7 +326,7 @@ asyncTest( "mouse", function() { element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); $( ".ui-calendar-calendar tbody button:contains(12)", element ).simulate( "mousedown" ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 2 - 1, 12 ), "Mouse click - preset" @@ -336,7 +336,7 @@ asyncTest( "mouse", function() { element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); $( ".ui-calendar-prev", element ).simulate( "click" ); $( ".ui-calendar-calendar tbody button:contains(16)", element ).simulate( "mousedown" ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 1 - 1, 16 ), "Mouse click - previous" @@ -345,7 +345,7 @@ asyncTest( "mouse", function() { element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); $( ".ui-calendar-next", element ).simulate( "click" ); $( ".ui-calendar-calendar tbody button:contains(18)", element ).simulate( "mousedown" ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 3 - 1, 18 ), "Mouse click - next" @@ -365,7 +365,7 @@ asyncTest( "mouse", function() { $( ".ui-calendar-prev", element ).simulate( "click" ); $( "tbody button:contains(16)", element ).simulate( "mousedown" ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 2 - 1, 16 ), "Mouse click - previous + min/max" @@ -383,7 +383,7 @@ asyncTest( "mouse", function() { $( ".ui-calendar-next", element ).simulate( "click" ); $( "tbody button:contains(18)", element ).simulate( "mousedown" ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 2 - 1, 18 ), "Mouse click - next + min/max" diff --git a/tests/unit/calendar/helper.js b/tests/unit/calendar/helper.js index a82e96705a3..b5feff5a67b 100644 --- a/tests/unit/calendar/helper.js +++ b/tests/unit/calendar/helper.js @@ -4,21 +4,6 @@ define( [ ], function( $, helper ) { return $.extend( helper, { - addMonths: function( date, offset ) { - var maxDay = 32 - new Date( date.getFullYear(), date.getMonth() + offset, 32 ).getDate(); - date.setDate( Math.min( date.getDate(), maxDay ) ); - date.setMonth( date.getMonth() + offset ); - return date; - }, - equalsDate: function( d1, d2, message ) { - if ( !d1 || !d2 ) { - ok( false, message + " - missing date" ); - return; - } - d1 = new Date( d1.getFullYear(), d1.getMonth(), d1.getDate() ); - d2 = new Date( d2.getFullYear(), d2.getMonth(), d2.getDate() ); - equal( d1.toString(), d2.toString(), message ); - }, focusGrid: function( element ) { element.find( ":tabbable" ).last().simulate( "focus" ); $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.TAB } ); diff --git a/tests/unit/calendar/methods.js b/tests/unit/calendar/methods.js index 84e26571076..d5a4ba4a293 100644 --- a/tests/unit/calendar/methods.js +++ b/tests/unit/calendar/methods.js @@ -1,8 +1,7 @@ define( [ "jquery", - "./helper", "ui/widgets/calendar" -], function( $, testHelper ) { +], function( $ ) { module( "calendar: methods" ); @@ -56,7 +55,7 @@ test( "value", function() { equal( element.calendar( "value" ), "1/1/14", "Setting invalid values should be ignored." ); } ); -test( "valueAsDate", function() { +test( "valueAsDate", function( assert ) { expect( 11 ); var minDate, maxDate, dateAndTimeToSet, dateAndTimeClone, @@ -69,7 +68,7 @@ test( "valueAsDate", function() { .hasClass( "ui-state-active" ), "First day marked as selected" ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); element.calendar( "destroy" ); @@ -77,7 +76,7 @@ test( "valueAsDate", function() { equal( element.calendar( "valueAsDate" ), null, "Set date - default" ); element.calendar( "valueAsDate", date1 ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), date1, "Set date - 2008-06-04" ); + assert.dateEqual( element.calendar( "valueAsDate" ), date1, "Set date - 2008-06-04" ); // With minimum/maximum element = $( "#calendar" ).calendar(); @@ -89,13 +88,13 @@ test( "valueAsDate", function() { element .calendar( "option", { min: minDate } ) .calendar( "valueAsDate", date2 ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), date2, "Set date min/max - value > min" ); element.calendar( "valueAsDate", date1 ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), date2, "Set date min/max - value < min" @@ -104,14 +103,14 @@ test( "valueAsDate", function() { element .calendar( "option", { max: maxDate, min: null } ) .calendar( "valueAsDate", date1 ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), date1, "Set date min/max - value < max" ); element.calendar( "valueAsDate", date2 ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), date1, "Set date min/max - value > max" @@ -120,14 +119,14 @@ test( "valueAsDate", function() { element .calendar( "option", { min: minDate } ) .calendar( "valueAsDate", date1 ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), date1, "Set date min/max - value < min" ); element.calendar( "valueAsDate", date2 ); - testHelper.equalsDate( + assert.dateEqual( element.calendar( "valueAsDate" ), date1, "Set date min/max - value > max" ); diff --git a/tests/unit/calendar/options.js b/tests/unit/calendar/options.js index c407f096a73..2e383855beb 100644 --- a/tests/unit/calendar/options.js +++ b/tests/unit/calendar/options.js @@ -1,8 +1,7 @@ define( [ "jquery", - "./helper", "ui/widgets/calendar" -], function( $, testHelper ) { +], function( $ ) { module( "calendar: options" ); @@ -188,7 +187,7 @@ test( "showWeek", function() { equal( container.find( "thead th" ).length, 8, "supports changing option after init" ); } ); -test( "min / max", function() { +test( "min / max", function( assert ) { expect( 17 ); // With existing date @@ -202,38 +201,38 @@ test( "min / max", function() { element .calendar( "option", { min: minDate } ) .calendar( "value", "6/4/08" ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > min" ); + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > min" ); element .calendar( "option", { min: minDate } ) .calendar( "value", "1/4/08" ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); element .calendar( "option", { min: null } ) .calendar( "value", "6/4/08" ) .calendar( "option", { max: maxDate } ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < max" ); + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < max" ); element .calendar( "option", { max: maxDate } ) .calendar( "value", "1/4/09" ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - setDate > max" ); + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - setDate > max" ); element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "1/4/08" ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "6/4/08" ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > min, < max" ); + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > min, < max" ); element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "1/4/09" ); - testHelper.equalsDate( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > max" ); + assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > max" ); element .calendar( "option", { min: minDate, max: maxDate } ) diff --git a/tests/unit/datepicker/core.js b/tests/unit/datepicker/core.js index 3370320753f..f884e9680ed 100644 --- a/tests/unit/datepicker/core.js +++ b/tests/unit/datepicker/core.js @@ -41,7 +41,7 @@ asyncTest( "base structure", function() { }, 50 ); } ); -asyncTest( "Keyboard handling: input", function() { +asyncTest( "Keyboard handling: input", function( assert ) { expect( 10 ); var picker, instance, input = $( "#datepicker" ).datepicker(); @@ -84,7 +84,7 @@ asyncTest( "Keyboard handling: input", function() { .datepicker( "refresh" ) .datepicker( "open" ) .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - testHelper.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), + assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Keystroke enter - preset" ); input @@ -99,7 +99,7 @@ asyncTest( "Keyboard handling: input", function() { .val( "1/1/14" ) .datepicker( "open" ) .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); - testHelper.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), + assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Keystroke esc - preset" ); input @@ -107,13 +107,13 @@ asyncTest( "Keyboard handling: input", function() { .datepicker( "open" ) .simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP } ) .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); - testHelper.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), + assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Keystroke esc - abandoned" ); input .val( "1/2/14" ) .simulate( "keyup" ); - testHelper.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 2 ), + assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 2 ), "Picker updated as user types into input" ); input.datepicker( "destroy" ); @@ -128,7 +128,7 @@ test( "ARIA", function() { expect( 0 ); } ); -asyncTest( "mouse", function() { +asyncTest( "mouse", function( assert ) { expect( 4 ); var input = testHelper.init( $( "#datepicker" ).val( "" ) ), @@ -139,7 +139,7 @@ asyncTest( "mouse", function() { setTimeout( function() { input.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); $( ".ui-calendar-calendar tbody button:contains(12)", picker ).simulate( "mousedown", {} ); - testHelper.equalsDate( + assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2008, 4 - 1, 12 ), "Mouse click - preset" @@ -151,7 +151,7 @@ asyncTest( "mouse", function() { input.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); input.simulate( "click" ); - testHelper.equalsDate( + assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2008, 4 - 1, 4 ), "Mouse click - close + preset" @@ -160,7 +160,7 @@ asyncTest( "mouse", function() { input.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); picker.find( "a.ui-calendar-prev" ).simulate( "click" ); input.simulate( "click" ); - testHelper.equalsDate( + assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2008, 4 - 1, 4 ), "Mouse click - abandoned" diff --git a/tests/unit/datepicker/helper.js b/tests/unit/datepicker/helper.js index 81fdd9d0031..da75cf77047 100644 --- a/tests/unit/datepicker/helper.js +++ b/tests/unit/datepicker/helper.js @@ -5,21 +5,6 @@ define( [ ], function( $, helper ) { return $.extend( helper, { - addMonths: function( date, offset ) { - var maxDay = 32 - new Date( date.getFullYear(), date.getMonth() + offset, 32 ).getDate(); - date.setDate( Math.min( date.getDate(), maxDay ) ); - date.setMonth( date.getMonth() + offset ); - return date; - }, - equalsDate: function( d1, d2, message ) { - if ( !d1 || !d2 ) { - ok( false, message + " - missing date" ); - return; - } - d1 = new Date( d1.getFullYear(), d1.getMonth(), d1.getDate() ); - d2 = new Date( d2.getFullYear(), d2.getMonth(), d2.getDate() ); - equal( d1.toString(), d2.toString(), message ); - }, init: function( id, options ) { options = $.extend( { show: false, hide: false }, options || {} ); return $( id ).datepicker( options ); diff --git a/tests/unit/datepicker/methods.js b/tests/unit/datepicker/methods.js index 2cf83569819..a274de3f9da 100644 --- a/tests/unit/datepicker/methods.js +++ b/tests/unit/datepicker/methods.js @@ -86,7 +86,7 @@ test( "value", function() { strictEqual( input.datepicker( "value" ), null, "Invalid values should return null." ); } ); -test( "valueAsDate", function() { +test( "valueAsDate", function( assert ) { expect( 6 ); var input = testHelper.init( "#datepicker" ), @@ -99,7 +99,7 @@ test( "valueAsDate", function() { picker.find( "button[data-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), "First day marked as selected" ); - testHelper.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); + assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); input.val( "a/b/c" ); equal( input.datepicker( "valueAsDate" ), null, "Invalid dates return null" ); @@ -109,7 +109,7 @@ test( "valueAsDate", function() { strictEqual( input.datepicker( "valueAsDate" ), null, "Set date - default" ); input.datepicker( "valueAsDate", date1 ); - testHelper.equalsDate( input.datepicker( "valueAsDate" ), date1, "Set date - 2008-06-04" ); + assert.dateEqual( input.datepicker( "valueAsDate" ), date1, "Set date - 2008-06-04" ); } ); test( "isValid", function() { From 2963622420abbd5752b8fc15af1cadba4ae8f011 Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 22 May 2016 21:48:51 +0200 Subject: [PATCH 04/17] Datepicker tests: Use setup and teardown methods, remove helper file --- tests/unit/datepicker/core.js | 211 +++++++++++++------------- tests/unit/datepicker/datepicker.html | 1 - tests/unit/datepicker/events.js | 120 ++++++++------- tests/unit/datepicker/helper.js | 19 --- tests/unit/datepicker/methods.js | 126 +++++++-------- tests/unit/datepicker/options.js | 94 +++++++----- 6 files changed, 277 insertions(+), 294 deletions(-) delete mode 100644 tests/unit/datepicker/helper.js diff --git a/tests/unit/datepicker/core.js b/tests/unit/datepicker/core.js index f884e9680ed..46f2a1989ae 100644 --- a/tests/unit/datepicker/core.js +++ b/tests/unit/datepicker/core.js @@ -1,126 +1,122 @@ define( [ "jquery", - "./helper", "ui/widgets/datepicker" -], function( $, testHelper ) { - -module( "datepicker: core" ); +], function( $ ) { + +module( "datepicker: core", { + setup: function() { + this.element = $( "#datepicker" ).datepicker( { show: false, hide: false } ); + this.widget = this.element.datepicker( "widget" ); + }, + teardown: function() { + this.element.datepicker( "destroy" ).val( "" ); + } +} ); test( "input's value determines starting date", function() { expect( 3 ); - var input = $( "#datepicker" ).val( "1/1/14" ).datepicker(), - picker = input.datepicker( "widget" ); - - input.datepicker( "open" ); + this.element = $( "" ).appendTo( "#qunit-fixture" ); + this.element.val( "1/1/14" ).datepicker(); + this.widget = this.element.datepicker( "widget" ); - equal( picker.find( ".ui-calendar-month" ).html(), "January", "correct month displayed" ); - equal( picker.find( ".ui-calendar-year" ).html(), "2014", "correct year displayed" ); - equal( picker.find( ".ui-state-active" ).html(), "1", "correct day highlighted" ); + this.element.datepicker( "open" ); - input.val( "" ).datepicker( "destroy" ); + equal( this.widget.find( ".ui-calendar-month" ).html(), "January", "correct month displayed" ); + equal( this.widget.find( ".ui-calendar-year" ).html(), "2014", "correct year displayed" ); + equal( this.widget.find( ".ui-state-active" ).html(), "1", "correct day highlighted" ); } ); asyncTest( "base structure", function() { expect( 5 ); - var input = testHelper.initNewInput(), - widget = input.datepicker( "widget" ); + var that = this; - input.focus(); + this.element.focus(); setTimeout( function() { - ok( widget.is( ":visible" ), "Datepicker visible" ); - equal( widget.children().length, 3, "Child count" ); - ok( widget.is( ".ui-calendar" ), "Class ui-calendar" ); - ok( widget.is( ".ui-datepicker" ), "Class ui-datepicker" ); - ok( widget.is( ".ui-front" ), "Class ui-front" ); + ok( that.widget.is( ":visible" ), "Datepicker visible" ); + equal( that.widget.children().length, 3, "Child count" ); + ok( that.widget.is( ".ui-calendar" ), "Class ui-calendar" ); + ok( that.widget.is( ".ui-datepicker" ), "Class ui-datepicker" ); + ok( that.widget.is( ".ui-front" ), "Class ui-front" ); - input.datepicker( "close" ); + that.element.datepicker( "close" ); start(); }, 50 ); } ); -asyncTest( "Keyboard handling: input", function( assert ) { - expect( 10 ); - var picker, instance, - input = $( "#datepicker" ).datepicker(); +asyncTest( "Keyboard handling: focus", function() { + expect( 2 ); - function step1() { - testHelper.init( input ); - picker = input.datepicker( "widget" ); + var that = this; - ok( !picker.is( ":visible" ), "datepicker closed" ); + ok( !this.widget.is( ":visible" ), "datepicker closed" ); - input.val( "" ).focus(); - setTimeout( function() { - ok( picker.is( ":visible" ), "Datepicker opens when receiving focus" ); - input.datepicker( "destroy" ); - step2(); - }, 100 ); - } + this.element.focus(); + setTimeout( function() { + ok( that.widget.is( ":visible" ), "Datepicker opens when receiving focus" ); + start(); + }, 100 ); +} ); - function step2() { - testHelper.init( input ); - picker = input.datepicker( "widget" ); +asyncTest( "Keyboard handling: keystroke up", function() { + expect( 2 ); - ok( !picker.is( ":visible" ), "datepicker closed" ); + var that = this; - input.val( "" ).simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); - setTimeout( function() { - ok( picker.is( ":visible" ), "Keystroke up opens datepicker" ); - input.datepicker( "destroy" ); - step3(); - }, 100 ); - } + ok( !this.widget.is( ":visible" ), "datepicker closed" ); - function step3() { - testHelper.init( input ); - instance = input.datepicker( "instance" ); - - // Enter = Select preset date - input - .val( "1/1/14" ) - .datepicker( "refresh" ) - .datepicker( "open" ) - .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), - "Keystroke enter - preset" ); - - input - .val( "" ) - .datepicker( "open" ); - ok( instance.isOpen, "datepicker is open before escape" ); - - input.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); - ok( !instance.isOpen, "escape closes the datepicker" ); - - input - .val( "1/1/14" ) - .datepicker( "open" ) - .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); - assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), - "Keystroke esc - preset" ); - - input - .val( "1/1/14" ) - .datepicker( "open" ) - .simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP } ) - .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); - assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), - "Keystroke esc - abandoned" ); - - input - .val( "1/2/14" ) - .simulate( "keyup" ); - assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 2 ), - "Picker updated as user types into input" ); - - input.datepicker( "destroy" ); + this.element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); + setTimeout( function() { + ok( that.widget.is( ":visible" ), "Keystroke up opens datepicker" ); start(); - } + }, 100 ); +} ); - step1(); +test( "Keyboard handling: input", function( assert ) { + expect( 6 ); + + var that = this, + instance = that.element.datepicker( "instance" ); + + // Enter = Select preset date + that.element + .val( "1/1/14" ) + .datepicker( "refresh" ) + .datepicker( "open" ) + .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); + assert.dateEqual( that.element.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), + "Keystroke enter - preset" ); + + that.element + .val( "" ) + .datepicker( "open" ); + ok( instance.isOpen, "datepicker is open before escape" ); + + that.element.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); + ok( !instance.isOpen, "escape closes the datepicker" ); + + that.element + .val( "1/1/14" ) + .datepicker( "open" ) + .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); + assert.dateEqual( that.element.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), + "Keystroke esc - preset" ); + + that.element + .val( "1/1/14" ) + .datepicker( "open" ) + .simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP } ) + .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); + assert.dateEqual( that.element.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), + "Keystroke esc - abandoned" ); + + that.element + .val( "1/2/14" ) + .simulate( "keyup" ); + assert.dateEqual( that.element.datepicker( "valueAsDate" ), new Date( 2014, 0, 2 ), + "Picker updated as user types into input" ); } ); // TODO: implement @@ -131,37 +127,36 @@ test( "ARIA", function() { asyncTest( "mouse", function( assert ) { expect( 4 ); - var input = testHelper.init( $( "#datepicker" ).val( "" ) ), - picker = input.datepicker( "widget" ); + var that = this; - input.datepicker( "open" ); + this.element.datepicker( "open" ); setTimeout( function() { - input.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); - $( ".ui-calendar-calendar tbody button:contains(12)", picker ).simulate( "mousedown", {} ); + that.element.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); + $( ".ui-calendar-calendar tbody button:contains(12)", that.widget ).simulate( "mousedown", {} ); assert.dateEqual( - input.datepicker( "valueAsDate" ), + that.element.datepicker( "valueAsDate" ), new Date( 2008, 4 - 1, 12 ), "Mouse click - preset" ); - input.val( "" ).datepicker( "refresh" ); - input.simulate( "click" ); - strictEqual( input.datepicker( "valueAsDate" ), null, "Mouse click - close" ); + that.element.val( "" ).datepicker( "refresh" ); + that.element.simulate( "click" ); + strictEqual( that.element.datepicker( "valueAsDate" ), null, "Mouse click - close" ); - input.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); - input.simulate( "click" ); + that.element.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); + that.element.simulate( "click" ); assert.dateEqual( - input.datepicker( "valueAsDate" ), + that.element.datepicker( "valueAsDate" ), new Date( 2008, 4 - 1, 4 ), "Mouse click - close + preset" ); - input.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); - picker.find( "a.ui-calendar-prev" ).simulate( "click" ); - input.simulate( "click" ); + that.element.val( "4/4/08" ).datepicker( "refresh" ).datepicker( "open" ); + that.widget.find( "a.ui-calendar-prev" ).simulate( "click" ); + that.element.simulate( "click" ); assert.dateEqual( - input.datepicker( "valueAsDate" ), + that.element.datepicker( "valueAsDate" ), new Date( 2008, 4 - 1, 4 ), "Mouse click - abandoned" ); diff --git a/tests/unit/datepicker/datepicker.html b/tests/unit/datepicker/datepicker.html index 3b20272b13c..ae93487009f 100644 --- a/tests/unit/datepicker/datepicker.html +++ b/tests/unit/datepicker/datepicker.html @@ -14,7 +14,6 @@
-
diff --git a/tests/unit/datepicker/events.js b/tests/unit/datepicker/events.js index 902896f2a2a..eb327f7f7d0 100644 --- a/tests/unit/datepicker/events.js +++ b/tests/unit/datepicker/events.js @@ -1,25 +1,34 @@ define( [ "jquery", - "./helper", "ui/widgets/datepicker" -], function( $, testHelper ) { - -module( "datepicker: events" ); +], function( $ ) { + +module( "datepicker: events", { + setup: function() { + this.element = $( "#datepicker" ).datepicker( { show: false, hide: false } ); + this.widget = this.element.datepicker( "widget" ); + }, + teardown: function() { + this.element.datepicker( "destroy" ).val( "" ); + } +} ); test( "beforeOpen", function() { expect( 3 ); - var input = testHelper.init( "#datepicker", { - beforeOpen: function() { - ok( true, "beforeOpen event fired before open" ); - ok( input.datepicker( "widget" ).is( ":hidden" ), "calendar hidden on beforeOpen" ); - }, - open: function() { - ok( input.datepicker( "widget" ).is( ":visible" ), "calendar open on open" ); - } - } ); + var that = this; + + this.element.datepicker( { + beforeOpen: function() { + ok( true, "beforeOpen event fired before open" ); + ok( that.element.datepicker( "widget" ).is( ":hidden" ), "calendar hidden on beforeOpen" ); + }, + open: function() { + ok( that.element.datepicker( "widget" ).is( ":visible" ), "calendar open on open" ); + } + } ); - input + this.element .datepicker( "open" ) .datepicker( "close" ) .datepicker( "option", { @@ -36,98 +45,101 @@ test( "beforeOpen", function() { test( "close", function() { expect( 4 ); - var shouldFire, - input = testHelper.init( "#datepicker", { - close: function() { - ok( shouldFire, "close event fired" ); - } - } ); + var shouldFire; + + this.element.datepicker( { + close: function() { + ok( shouldFire, "close event fired" ); + } + } ); shouldFire = false; - input.datepicker( "open" ); + this.element.datepicker( "open" ); shouldFire = true; - input.datepicker( "close" ); + this.element.datepicker( "close" ); shouldFire = false; - input.datepicker( "open" ); + this.element.datepicker( "open" ); shouldFire = true; $( "body" ).trigger( "mousedown" ); shouldFire = false; - input.datepicker( "open" ); + this.element.datepicker( "open" ); shouldFire = true; - input.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); + this.element.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); shouldFire = false; - input.datepicker( "open" ); + this.element.datepicker( "open" ); shouldFire = true; - input.datepicker( "widget" ).find( "tbody tr:first button:first" ).simulate( "mousedown" ); + this.element.datepicker( "widget" ).find( "tbody tr:first button:first" ).simulate( "mousedown" ); } ); test( "open", function() { expect( 2 ); - var input = testHelper.init( "#datepicker", { - open: function() { - ok( true, "open event fired on open" ); - ok( widget.is( ":visible" ), "calendar open on open" ); - } - } ), - widget = input.datepicker( "widget" ); + var that = this; - input.datepicker( "open" ); + this.element.datepicker( { + open: function() { + ok( true, "open event fired on open" ); + ok( that.widget.is( ":visible" ), "calendar open on open" ); + } + } ); + + this.element.datepicker( "open" ); } ); asyncTest( "select", function() { expect( 4 ); - var input = testHelper.init( "#datepicker", { - select: function( event ) { - ok( true, "select event fired " + message ); - equal( - event.originalEvent.type, - "calendarselect", - "select originalEvent " + message - ); - } - } ), - widget = input.datepicker( "widget" ), - message = ""; + var message = "", + that = this; + + this.element.datepicker( { + select: function( event ) { + ok( true, "select event fired " + message ); + equal( + event.originalEvent.type, + "calendarselect", + "select originalEvent " + message + ); + } + } ); function step1() { message = "on calendar cell click"; - input + that.element .simulate( "focus" ) .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); setTimeout( function() { - widget.find( "tbody tr:first button:first" ).simulate( "mousedown" ); - input.datepicker( "close" ); + that.widget.find( "tbody tr:first button:first" ).simulate( "mousedown" ); + that.element.datepicker( "close" ); step2(); }, 100 ); } function step2() { message = "on calendar cell enter"; - input + that.element .simulate( "focus" ) .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); setTimeout( function() { $( document.activeElement ) .simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ) .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - input.datepicker( "close" ); + that.element.datepicker( "close" ); step3(); }, 100 ); } function step3() { message = "on calendar escape (not expected)"; - input + that.element .simulate( "focus" ) .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); - input.datepicker( "close" ); + that.element.datepicker( "close" ); start(); }, 100 ); } diff --git a/tests/unit/datepicker/helper.js b/tests/unit/datepicker/helper.js deleted file mode 100644 index da75cf77047..00000000000 --- a/tests/unit/datepicker/helper.js +++ /dev/null @@ -1,19 +0,0 @@ -define( [ - "jquery", - "lib/helper", - "ui/widgets/datepicker" -], function( $, helper ) { - -return $.extend( helper, { - init: function( id, options ) { - options = $.extend( { show: false, hide: false }, options || {} ); - return $( id ).datepicker( options ); - }, - initNewInput: function( options ) { - options = $.extend( { show: false, hide: false }, options || {} ); - return $( "" ).datepicker( options ) - .appendTo( "#qunit-fixture" ); - } -} ); - -} ); diff --git a/tests/unit/datepicker/methods.js b/tests/unit/datepicker/methods.js index a274de3f9da..3ce1468610c 100644 --- a/tests/unit/datepicker/methods.js +++ b/tests/unit/datepicker/methods.js @@ -1,15 +1,23 @@ define( [ "jquery", - "./helper", "ui/widgets/datepicker" -], function( $, testHelper ) { - -module( "datepicker: methods" ); +], function( $ ) { + +module( "datepicker: methods", { + setup: function() { + this.element = $( "#datepicker" ).datepicker( { show: false, hide: false } ); + this.widget = this.element.datepicker( "widget" ); + }, + teardown: function() { + this.element.datepicker( "destroy" ).val( "" ); + } +} ); test( "destroy", function( assert ) { expect( 3 ); - var input = $( "#datepicker" ); + var input = $( "" ).appendTo( "#qunit-fixture" ); + assert.domEqual( input, function() { input.datepicker(); ok( input.attr( "aria-owns" ), "aria-owns attribute added" ); @@ -21,108 +29,86 @@ test( "destroy", function( assert ) { test( "enable / disable", function() { expect( 10 ); - var input = testHelper.init( "#datepicker" ), - calendar = input.datepicker( "widget" ); - - input.datepicker( "disable" ); - ok( input.datepicker( "option", "disabled" ), "disabled option is set" ); - ok( calendar.hasClass( "ui-datepicker-disabled" ), "has disabled widget class name" ); - ok( input.hasClass( "ui-state-disabled" ), "has disabled state class name" ); - equal( input.attr( "aria-disabled" ), "true", "has ARIA disabled" ); - equal( input.attr( "disabled" ), "disabled", "input disabled" ); - - input.datepicker( "enable" ); - ok( !input.datepicker( "option", "disabled" ), "enabled after enable() call" ); - ok( !calendar.hasClass( "ui-datepicker-disabled" ), "no longer has disabled widget class name" ); - ok( !input.hasClass( "ui-state-disabled" ), "no longer has disabled state class name" ); - equal( input.attr( "aria-disabled" ), "false", "no longer has ARIA disabled" ); - equal( input.attr( "disabled" ), undefined, "input no longer disabled" ); + this.element.datepicker( "disable" ); + ok( this.element.datepicker( "option", "disabled" ), "disabled option is set" ); + ok( this.widget.hasClass( "ui-datepicker-disabled" ), "has disabled widget class name" ); + ok( this.element.hasClass( "ui-state-disabled" ), "has disabled state class name" ); + equal( this.element.attr( "aria-disabled" ), "true", "has ARIA disabled" ); + equal( this.element.attr( "disabled" ), "disabled", "input disabled" ); + + this.element.datepicker( "enable" ); + ok( !this.element.datepicker( "option", "disabled" ), "enabled after enable() call" ); + ok( !this.widget.hasClass( "ui-datepicker-disabled" ), "no longer has disabled widget class name" ); + ok( !this.element.hasClass( "ui-state-disabled" ), "no longer has disabled state class name" ); + equal( this.element.attr( "aria-disabled" ), "false", "no longer has ARIA disabled" ); + equal( this.element.attr( "disabled" ), undefined, "input no longer disabled" ); } ); test( "widget", function() { expect( 1 ); - var actual = $( "#datepicker" ).datepicker().datepicker( "widget" ); - deepEqual( $( "body > .ui-front" )[ 0 ], actual[ 0 ] ); - actual.remove(); + deepEqual( $( "body > .ui-front" )[ 0 ], this.widget[ 0 ] ); + this.widget.remove(); } ); test( "open / close", function() { expect( 7 ); - var input = testHelper.initNewInput( { show: false, hide: false } ), - calendar = input.datepicker( "widget" ); - - ok( calendar.is( ":hidden" ), "calendar hidden on init" ); + ok( this.widget.is( ":hidden" ), "calendar hidden on init" ); - input.datepicker( "open" ); - ok( calendar.is( ":visible" ), "open: calendar visible" ); - equal( calendar.attr( "aria-hidden" ), "false", "open: calendar aria-hidden" ); - equal( calendar.attr( "aria-expanded" ), "true", "close: calendar aria-expanded" ); + this.element.datepicker( "open" ); + ok( this.widget.is( ":visible" ), "open: calendar visible" ); + equal( this.widget.attr( "aria-hidden" ), "false", "open: calendar aria-hidden" ); + equal( this.widget.attr( "aria-expanded" ), "true", "close: calendar aria-expanded" ); - input.datepicker( "close" ); - ok( !calendar.is( ":visible" ), "close: calendar hidden" ); - equal( calendar.attr( "aria-hidden" ), "true", "close: calendar aria-hidden" ); - equal( calendar.attr( "aria-expanded" ), "false", "close: calendar aria-expanded" ); + this.element.datepicker( "close" ); + ok( !this.widget.is( ":visible" ), "close: calendar hidden" ); + equal( this.widget.attr( "aria-hidden" ), "true", "close: calendar aria-hidden" ); + equal( this.widget.attr( "aria-expanded" ), "false", "close: calendar aria-expanded" ); } ); test( "value", function() { expect( 4 ); - var input = $( "#datepicker" ).datepicker(), - picker = input.datepicker( "widget" ); + this.element.datepicker( "value", "1/1/14" ); + equal( this.element.val(), "1/1/14", "input's value set" ); - input.datepicker( "value", "1/1/14" ); - equal( input.val(), "1/1/14", "input's value set" ); - - input.datepicker( "open" ); + this.element.datepicker( "open" ); ok( - picker.find( "button[data-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), + this.widget.find( "button[data-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), "first day marked as selected" ); - equal( input.datepicker( "value" ), "1/1/14", "getter" ); + equal( this.element.datepicker( "value" ), "1/1/14", "getter" ); - input.val( "abc" ); - strictEqual( input.datepicker( "value" ), null, "Invalid values should return null." ); + this.element.val( "abc" ); + strictEqual( this.element.datepicker( "value" ), null, "Invalid values should return null." ); } ); test( "valueAsDate", function( assert ) { - expect( 6 ); + expect( 5 ); - var input = testHelper.init( "#datepicker" ), - picker = input.datepicker( "widget" ), - date1 = new Date( 2008, 6 - 1, 4 ); + strictEqual( this.element.datepicker( "valueAsDate" ), null, "Default" ); - input.datepicker( "valueAsDate", new Date( 2014, 0, 1 ) ); - equal( input.val(), "1/1/14", "Input's value set" ); + this.element.datepicker( "valueAsDate", new Date( 2014, 0, 1 ) ); + equal( this.element.val(), "1/1/14", "Input's value set" ); ok( - picker.find( "button[data-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), + this.widget.find( "button[data-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), "First day marked as selected" ); - assert.dateEqual( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); - - input.val( "a/b/c" ); - equal( input.datepicker( "valueAsDate" ), null, "Invalid dates return null" ); + assert.dateEqual( this.element.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); - input.val( "" ).datepicker( "destroy" ); - input = testHelper.init( "#datepicker" ); - - strictEqual( input.datepicker( "valueAsDate" ), null, "Set date - default" ); - input.datepicker( "valueAsDate", date1 ); - assert.dateEqual( input.datepicker( "valueAsDate" ), date1, "Set date - 2008-06-04" ); + this.element.val( "a/b/c" ); + equal( this.element.datepicker( "valueAsDate" ), null, "Invalid dates return null" ); } ); test( "isValid", function() { expect( 2 ); - var input = $( "#datepicker" ).datepicker(); - - input.val( "1/1/14" ); - ok( input.datepicker( "isValid" ) ); - input.val( "1/1/abc" ); - ok( !input.datepicker( "isValid" ) ); + this.element.val( "1/1/14" ); + ok( this.element.datepicker( "isValid" ) ); - input.datepicker( "destroy" ); + this.element.val( "1/1/abc" ); + ok( !this.element.datepicker( "isValid" ) ); } ); } ); diff --git a/tests/unit/datepicker/options.js b/tests/unit/datepicker/options.js index 6021f1b7e5c..f04b3fb4df0 100644 --- a/tests/unit/datepicker/options.js +++ b/tests/unit/datepicker/options.js @@ -1,47 +1,51 @@ define( [ "jquery", - "./helper", "ui/widgets/datepicker" -], function( $, testHelper ) { - -module( "datepicker: options" ); +], function( $ ) { + +module( "datepicker: options", { + setup: function() { + this.element = $( "#datepicker" ).datepicker( { show: false, hide: false } ); + this.widget = this.element.datepicker( "widget" ); + }, + teardown: function() { + this.element.datepicker( "destroy" ).val( "" ); + } +} ); test( "appendTo", function() { expect( 6 ); - var container, - detached = $( "
" ), - input = $( "#datepicker" ); - input.datepicker(); - container = input.datepicker( "widget" ).parent()[ 0 ]; + var container = this.widget.parent()[ 0 ], + detached = $( "
" ); + equal( container, document.body, "defaults to body" ); - input.datepicker( "destroy" ); + this.element.datepicker( "destroy" ); - input.datepicker( { appendTo: "#qunit-fixture" } ); - container = input.datepicker( "widget" ).parent()[ 0 ]; + this.element.datepicker( { appendTo: "#qunit-fixture" } ); + container = this.element.datepicker( "widget" ).parent()[ 0 ]; equal( container, $( "#qunit-fixture" )[ 0 ], "child of specified element" ); - input.datepicker( "destroy" ); + this.element.datepicker( "destroy" ); - input.datepicker( { appendTo: "#does-not-exist" } ); - container = input.datepicker( "widget" ).parent()[ 0 ]; + this.element.datepicker( { appendTo: "#does-not-exist" } ); + container = this.element.datepicker( "widget" ).parent()[ 0 ]; equal( container, document.body, "set to body if element does not exist" ); - input.datepicker( "destroy" ); + this.element.datepicker( "destroy" ); - input.datepicker() + this.element.datepicker() .datepicker( "option", "appendTo", "#qunit-fixture" ); - container = input.datepicker( "widget" ).parent()[ 0 ]; + container = this.element.datepicker( "widget" ).parent()[ 0 ]; equal( container, $( "#qunit-fixture" )[ 0 ], "modified after init" ); - input.datepicker( "destroy" ); + this.element.datepicker( "destroy" ); - input.datepicker( { appendTo: detached } ); - container = input.datepicker( "widget" ).parent()[ 0 ]; + this.element.datepicker( { appendTo: detached } ); + container = this.element.datepicker( "widget" ).parent()[ 0 ]; equal( container, detached[ 0 ], "detached jQuery object" ); - input.datepicker( "destroy" ); + this.element.datepicker( "destroy" ); - input.datepicker( { appendTo: detached[ 0 ] } ); - container = input.datepicker( "widget" ).parent()[ 0 ]; + this.element.datepicker( { appendTo: detached[ 0 ] } ); + container = this.element.datepicker( "widget" ).parent()[ 0 ]; equal( container, detached[ 0 ], "detached DOM element" ); - input.datepicker( "destroy" ); } ); test( "Pass-through options", function() { @@ -58,14 +62,14 @@ test( "Pass-through options", function() { numberOfMonths: 3, showWeek: true }, - input = $( "#datepicker" ).val( "1/1/14" ).datepicker(), - datepickerInstance = input.datepicker( "instance" ); + input = $( "" ).val( "1/1/14" ).appendTo( "#qunit-fixture" ).datepicker(), + instance = input.datepicker( "instance" ); $.each( options, function( key, value ) { input.datepicker( "option", key, value ); deepEqual( - datepickerInstance.calendar.calendar( "option", key ), + instance.calendar.calendar( "option", key ), value, "option " + key + ": correct value" ); @@ -82,6 +86,7 @@ test( "Pass-through options", function() { asyncTest( "position", function( assert ) { expect( 3 ); + var input = $( "" ).datepicker().appendTo( "body" ).css( { position: "absolute", top: 0, @@ -108,34 +113,39 @@ asyncTest( "position", function( assert ) { } ); } ); -test( "Stop datepicker from appearing with beforeOpen event handler", function() { - expect( 3 ); +test( "Stop datepicker from appearing with beforeOpen event handler - nothing", function() { + expect( 1 ); - var input = testHelper.init( "#datepicker", { + this.element.datepicker( { beforeOpen: function() {} } ); - input.datepicker( "open" ); - ok( input.datepicker( "widget" ).is( ":visible" ), "beforeOpen returns nothing" ); - input.datepicker( "close" ).datepicker( "destroy" ); + this.element.datepicker( "open" ); + ok( this.element.datepicker( "widget" ).is( ":visible" ), "beforeOpen returns nothing" ); +} ); + +test( "Stop datepicker from appearing with beforeOpen event handler - true", function() { + expect( 1 ); - input = testHelper.init( "#datepicker", { + this.element.datepicker( { beforeOpen: function() { return true; } } ); - input.datepicker( "open" ); - ok( input.datepicker( "widget" ).is( ":visible" ), "beforeOpen returns true" ); - input.datepicker( "close" ).datepicker( "destroy" ); + this.element.datepicker( "open" ); + ok( this.element.datepicker( "widget" ).is( ":visible" ), "beforeOpen returns true" ); +} ); + +test( "Stop datepicker from appearing with beforeOpen event handler - false", function() { + expect( 1 ); - input = testHelper.init( "#datepicker", { + this.element.datepicker( { beforeOpen: function() { return false; } } ); - input.datepicker( "open" ); - ok( !input.datepicker( "widget" ).is( ":visible" ), "beforeOpen returns false" ); - input.datepicker( "destroy" ); + this.element.datepicker( "open" ); + ok( !this.element.datepicker( "widget" ).is( ":visible" ), "beforeOpen returns false" ); } ); } ); From 18ad526cfdcd30006f9766f23407e17d9dd295ee Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 22 May 2016 21:58:20 +0200 Subject: [PATCH 05/17] Calendar tests: Use setup and teardown methods --- tests/unit/calendar/core.js | 191 +++++++++++++++--------------- tests/unit/calendar/events.js | 48 ++++---- tests/unit/calendar/methods.js | 103 ++++++++-------- tests/unit/calendar/options.js | 209 +++++++++++++++++---------------- 4 files changed, 281 insertions(+), 270 deletions(-) diff --git a/tests/unit/calendar/core.js b/tests/unit/calendar/core.js index 7945d08910b..5cc78c42375 100644 --- a/tests/unit/calendar/core.js +++ b/tests/unit/calendar/core.js @@ -4,27 +4,34 @@ define( [ "ui/widgets/calendar" ], function( $, testHelper ) { -module( "calendar: core" ); +module( "calendar: core", { + setup: function() { + this.element = $( "#calendar" ).calendar(); + this.widget = this.element.calendar( "widget" ); + }, + teardown: function() { + this.element.calendar( "destroy" ); + } +} ); test( "base structure", function() { expect( 28 ); - var buttons, header, title, table, thead, week, child, buttonpane, - element = $( "#calendar" ).calendar(), - dp = element.calendar( "widget" ); + var that = this, + buttons, header, title, table, thead, week, child, buttonpane; function step1() { - ok( !dp.is( ".ui-calendar-rtl" ), "Structure - not right-to-left" ); - ok( !dp.is( ".ui-calendar-multi" ), "Structure - not multi-month" ); - equal( dp.children().length, 3, "Structure - child count (header, calendar)" ); + ok( !that.widget.is( ".ui-calendar-rtl" ), "Structure - not right-to-left" ); + ok( !that.widget.is( ".ui-calendar-multi" ), "Structure - not multi-month" ); + equal( that.widget.children().length, 3, "Structure - child count (header, calendar)" ); - buttons = dp.children( ":first" ); + buttons = that.widget.children( ":first" ); ok( buttons.is( "div.ui-calendar-header-buttons" ), "Structure - header button division" ); equal( buttons.children().length, 2, "Structure - header buttons child count" ); ok( buttons.children( ":first" ).is( ".ui-calendar-prev" ) && buttons.children( ":first" ).html() !== "", "Structure - prev link" ); ok( buttons.children( ":last" ).is( ".ui-calendar-next" ) && buttons.children( ":last" ).html() !== "", "Structure - next link" ); - header = dp.children( ":eq(1)" ); + header = that.widget.children( ":eq(1)" ); ok( header.is( "div.ui-calendar-header" ), "Structure - header division" ); equal( header.children().length, 1, "Structure - header child count" ); @@ -34,7 +41,7 @@ test( "base structure", function() { ok( title.children( ":first" ).is( "span.ui-calendar-month" ) && title.children( ":first" ).text() !== "", "Structure - month text" ); ok( title.children( ":last" ).is( "span.ui-calendar-year" ) && title.children( ":last" ).text() !== "", "Structure - year text" ); - table = dp.children( ":eq(2)" ); + table = that.widget.children( ":eq(2)" ); ok( table.is( "table.ui-calendar-calendar" ), "Structure - month table" ); ok( table.children( ":first" ).is( "thead" ), "Structure - month table thead" ); @@ -52,35 +59,32 @@ test( "base structure", function() { } function step2() { - element.calendar( "option", "buttons", { + that.element.calendar( "option", "buttons", { "test": function() {}, "test button": function() {} } ); - equal( dp.children().length, 4, "Structure buttons - child count (header buttons, header, calendar, buttonpane)" ); + equal( that.widget.children().length, 4, "Structure buttons - child count (header buttons, header, calendar, buttonpane)" ); - buttonpane = dp.children( ".ui-calendar-buttonpane" ); + buttonpane = that.widget.children( ".ui-calendar-buttonpane" ); equal( buttonpane.children( "div.ui-calendar-buttonset" ).length, 1, "Structure buttons - buttonset" ); equal( buttonpane.find( "button.ui-button:first" ).text(), "test", "Structure buttons - buttonset" ); equal( buttonpane.find( "button.ui-button:eq(1)" ).text(), "test button", "Structure buttons - buttonset" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step3(); } function step3() { // Multi-month 2 - element = $( "#calendar" ).calendar( { numberOfMonths: 2 } ); - dp = element.calendar( "widget" ); + that.element.calendar( { numberOfMonths: 2 } ); - ok( dp.is( ".ui-calendar-multi" ), "Structure multi [2] - multi-month" ); - equal( dp.children().length, 4, "Structure multi [2] - child count" ); + ok( that.widget.is( ".ui-calendar-multi" ), "Structure multi [2] - multi-month" ); + equal( that.widget.children().length, 4, "Structure multi [2] - child count" ); - child = dp.children( ":eq(3)" ); + child = that.widget.children( ":eq(3)" ); ok( child.is( "div.ui-calendar-row-break" ), "Structure multi [2] - row break" ); - - element.calendar( "destroy" ); } step1(); @@ -89,7 +93,7 @@ test( "base structure", function() { test( "Localization", function() { expect( 10 ); - var element = $( "#calendar" ), + var that = this, date = new Date( 2014, 0, 1 ), optionsDe = { locale: "de", @@ -99,39 +103,39 @@ test( "Localization", function() { } }, initCalendar = function( options ) { - element + that.element .calendar( options ) .calendar( "valueAsDate", date ); }, testLocalization = function( message ) { equal( - element.find( ".ui-calendar-month" ).text(), + that.element.find( ".ui-calendar-month" ).text(), "Januar", message + "titlebar year" ); equal( - element.find( "thead th:first" ).text(), + that.element.find( "thead th:first" ).text(), "Mo.", message + "teader first day" ); equal( - element.find( "thead th:last" ).text(), + that.element.find( "thead th:last" ).text(), "So.", message + "header last day" ); equal( - element.find( ".ui-calendar-prev" ).text(), + that.element.find( ".ui-calendar-prev" ).text(), "Zurück", message + "header prev" ); equal( - element.find( ".ui-calendar-next" ).text(), + that.element.find( ".ui-calendar-next" ).text(), "Vor", message + "header next" ); }; initCalendar( optionsDe ); testLocalization( "Init: " ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); initCalendar( {} ); - element + that.element .calendar( "option", optionsDe ) .calendar( "refresh" ); testLocalization( "After init: " ); @@ -140,35 +144,35 @@ test( "Localization", function() { asyncTest( "keyboard handling", function( assert ) { expect( 10 ); - var element = $( "#calendar" ); + var that = this; function step1() { - element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); + that.element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); testHelper - .focusGrid( element ) + .focusGrid( that.element ) .simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2013, 12 - 1, 31 ), "Keystroke left to switch to previous day" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step2(); }, 50 ); } function step2() { - element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); + that.element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); - testHelper.focusGrid( element ) + testHelper.focusGrid( that.element ) .simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ) .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2014, 1 - 1, 2 ), "Keystroke right to switch to next day" ); @@ -176,132 +180,131 @@ asyncTest( "keyboard handling", function( assert ) { } function step3() { - element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); + that.element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); - testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); + testHelper.focusGrid( that.element ).simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2013, 12 - 1, 25 ), "Keystroke up to move to the previous week" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step4(); }, 50 ); } function step4() { - element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); + that.element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); - testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + testHelper.focusGrid( that.element ).simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2014, 1 - 1, 8 ), "Keystroke down to move to the next week" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step5(); }, 50 ); } function step5() { - element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); + that.element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); - testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); + testHelper.focusGrid( that.element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2013, 12 - 1, 1 ), "Keystroke Page Up moves date to previous month" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step6(); }, 50 ); } function step6() { - element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); + that.element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); - testHelper.focusGrid( element ) + testHelper.focusGrid( that.element ) .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP, altKey: true } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2013, 1 - 1, 1 ), "Keystroke Page Up + ALT moves date to previous year" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step7(); }, 50 ); } function step7() { - element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); + that.element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); - testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); + testHelper.focusGrid( that.element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2014, 2 - 1, 1 ), "Keystroke Page Down moves date to next month" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step8(); }, 50 ); } function step8() { - element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); + that.element.calendar( { value: new Date( 2014, 1 - 1, 1 ) } ); - testHelper.focusGrid( element ) + testHelper.focusGrid( that.element ) .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN, altKey: true } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2015, 1 - 1, 1 ), "Keystroke Page Down + ALT moves date to next year" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step9(); }, 50 ); } // Check for moving to short months function step9() { - element.calendar( { value: new Date( 2014, 3 - 1, 31 ) } ); + that.element.calendar( { value: new Date( 2014, 3 - 1, 31 ) } ); - testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); + testHelper.focusGrid( that.element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2014, 2 - 1, 28 ), "Keystroke Page Up and short months" ); - element.calendar( "destroy" ); + that.element.calendar( "destroy" ); step10(); }, 50 ); } function step10() { - element.calendar( { value: new Date( 2016, 1 - 1, 30 ) } ); + that.element.calendar( { value: new Date( 2016, 1 - 1, 30 ) } ); - testHelper.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); + testHelper.focusGrid( that.element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); setTimeout( function() { $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2016, 2 - 1, 29 ), "Keystroke Page Down and leap years" ); - element.calendar( "destroy" ); start(); }, 50 ); } @@ -312,41 +315,41 @@ asyncTest( "keyboard handling", function( assert ) { asyncTest( "mouse", function( assert ) { expect( 6 ); - var element = $( "#calendar" ).calendar(), + var that = this, date = new Date(); function step1() { - $( "tbody button:contains(10)", element ).simulate( "mousedown" ); + $( "tbody button:contains(10)", that.element ).simulate( "mousedown" ); date.setDate( 10 ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), date, "Mouse click" ); - element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); - $( ".ui-calendar-calendar tbody button:contains(12)", element ).simulate( "mousedown" ); + that.element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); + $( ".ui-calendar-calendar tbody button:contains(12)", that.element ).simulate( "mousedown" ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2008, 2 - 1, 12 ), "Mouse click - preset" ); // Previous/next - element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); - $( ".ui-calendar-prev", element ).simulate( "click" ); - $( ".ui-calendar-calendar tbody button:contains(16)", element ).simulate( "mousedown" ); + that.element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); + $( ".ui-calendar-prev", that.element ).simulate( "click" ); + $( ".ui-calendar-calendar tbody button:contains(16)", that.element ).simulate( "mousedown" ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2008, 1 - 1, 16 ), "Mouse click - previous" ); - element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); - $( ".ui-calendar-next", element ).simulate( "click" ); - $( ".ui-calendar-calendar tbody button:contains(18)", element ).simulate( "mousedown" ); + that.element.calendar( "option", "value", new Date( 2008, 2 - 1, 4 ) ); + $( ".ui-calendar-next", that.element ).simulate( "click" ); + $( ".ui-calendar-calendar tbody button:contains(18)", that.element ).simulate( "mousedown" ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2008, 3 - 1, 18 ), "Mouse click - next" ); @@ -356,17 +359,17 @@ asyncTest( "mouse", function( assert ) { // Previous/next with minimum/maximum function step2() { - element.calendar( "destroy" ); - element.calendar( { + that.element.calendar( "destroy" ); + that.element.calendar( { value: new Date( 2008, 3 - 1, 4 ), min: new Date( 2008, 2 - 1, 2 ), max: new Date( 2008, 2 - 1, 26 ) } ); - $( ".ui-calendar-prev", element ).simulate( "click" ); - $( "tbody button:contains(16)", element ).simulate( "mousedown" ); + $( ".ui-calendar-prev", that.element ).simulate( "click" ); + $( "tbody button:contains(16)", that.element ).simulate( "mousedown" ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2008, 2 - 1, 16 ), "Mouse click - previous + min/max" ); @@ -374,17 +377,17 @@ asyncTest( "mouse", function( assert ) { } function step3() { - element.calendar( "destroy" ); - element.calendar( { + that.element.calendar( "destroy" ); + that.element.calendar( { value: new Date( 2008, 1 - 1, 4 ), min: new Date( 2008, 2 - 1, 2 ), max: new Date( 2008, 2 - 1, 26 ) } ); - $( ".ui-calendar-next", element ).simulate( "click" ); - $( "tbody button:contains(18)", element ).simulate( "mousedown" ); + $( ".ui-calendar-next", that.element ).simulate( "click" ); + $( "tbody button:contains(18)", that.element ).simulate( "mousedown" ); assert.dateEqual( - element.calendar( "valueAsDate" ), + that.element.calendar( "valueAsDate" ), new Date( 2008, 2 - 1, 18 ), "Mouse click - next + min/max" ); diff --git a/tests/unit/calendar/events.js b/tests/unit/calendar/events.js index a8a0b38e0d1..37ad57a8548 100644 --- a/tests/unit/calendar/events.js +++ b/tests/unit/calendar/events.js @@ -4,33 +4,39 @@ define( [ "ui/widgets/calendar" ], function( $, testHelper ) { -module( "calendar: events" ); +module( "calendar: events", { + setup: function() { + this.element = $( "#calendar" ).calendar(); + } +} ); asyncTest( "select", function() { expect( 6 ); - var message, eventType, - element = $( "#calendar" ).calendar( { - select: function( event ) { - ok( true, "select event fired " + message ); - equal( - event.type, - "calendarselect", - "select event " + message - ); - equal( - event.originalEvent.type, - eventType, - "select originalEvent " + message - ); - } - } ); + var that = this, + message, eventType; + + this.element.calendar( { + select: function( event ) { + ok( true, "select event fired " + message ); + equal( + event.type, + "calendarselect", + "select event " + message + ); + equal( + event.originalEvent.type, + eventType, + "select originalEvent " + message + ); + } + } ); function step1() { setTimeout( function() { eventType = "mousedown"; message = "on calendar button " + eventType; - element.find( "table button:eq(1)" ).simulate( eventType ); + that.element.find( "table button:eq(1)" ).simulate( eventType ); step2(); }, 50 ); } @@ -39,7 +45,7 @@ asyncTest( "select", function() { setTimeout( function() { eventType = "keydown"; message = "on calendar button " + eventType; - testHelper.focusGrid( element ) + testHelper.focusGrid( that.element ) .simulate( eventType, { keyCode: $.ui.keyCode.END } ) .simulate( eventType, { keyCode: $.ui.keyCode.ENTER } ); step3(); @@ -49,8 +55,8 @@ asyncTest( "select", function() { // This should not trigger another event function step3() { setTimeout( function() { - element.calendar( "disable" ); - element.find( "table button:eq(10)" ).simulate( "mousedown" ); + that.element.calendar( "disable" ); + that.element.find( "table button:eq(10)" ).simulate( "mousedown" ); start(); }, 50 ); } diff --git a/tests/unit/calendar/methods.js b/tests/unit/calendar/methods.js index d5a4ba4a293..77c2c8ce504 100644 --- a/tests/unit/calendar/methods.js +++ b/tests/unit/calendar/methods.js @@ -3,137 +3,138 @@ define( [ "ui/widgets/calendar" ], function( $ ) { -module( "calendar: methods" ); +module( "calendar: methods", { + setup: function() { + this.element = $( "#calendar" ).calendar(); + this.widget = this.element.calendar( "widget" ); + }, + teardown: function() { + this.element.calendar( "destroy" ); + } +} ); test( "destroy", function( assert ) { expect( 1 ); - assert.domEqual( "#calendar", function() { - $( "#calendar" ).calendar().calendar( "destroy" ); + var div = $( "
" ).appendTo( "#qunit-fixture" ); + + assert.domEqual( div, function() { + div.calendar().calendar( "destroy" ); } ); } ); test( "enable / disable", function() { expect( 8 ); - var element = $( "#calendar" ).calendar(); - - element.calendar( "disable" ); - ok( element.calendar( "option", "disabled" ), "disabled option is set" ); - ok( element.hasClass( "ui-calendar-disabled" ), "has disabled widget class name" ); - ok( element.hasClass( "ui-state-disabled" ), "has disabled state class name" ); - equal( element.attr( "aria-disabled" ), "true", "has ARIA disabled" ); - - element.calendar( "enable" ); - ok( !element.calendar( "option", "disabled" ), "enabled after enable() call" ); - ok( !element.hasClass( "ui-calendar-disabled" ), "no longer has disabled widget class name" ); - ok( !element.hasClass( "ui-state-disabled" ), "no longer has disabled state class name" ); - equal( element.attr( "aria-disabled" ), "false", "no longer has ARIA disabled" ); + this.element.calendar( "disable" ); + ok( this.element.calendar( "option", "disabled" ), "disabled option is set" ); + ok( this.element.hasClass( "ui-calendar-disabled" ), "has disabled widget class name" ); + ok( this.element.hasClass( "ui-state-disabled" ), "has disabled state class name" ); + equal( this.element.attr( "aria-disabled" ), "true", "has ARIA disabled" ); + + this.element.calendar( "enable" ); + ok( !this.element.calendar( "option", "disabled" ), "enabled after enable() call" ); + ok( !this.element.hasClass( "ui-calendar-disabled" ), "no longer has disabled widget class name" ); + ok( !this.element.hasClass( "ui-state-disabled" ), "no longer has disabled state class name" ); + equal( this.element.attr( "aria-disabled" ), "false", "no longer has ARIA disabled" ); } ); test( "widget", function() { expect( 1 ); - var element = $( "#calendar" ).calendar(), - widget = element.calendar( "widget" ); - - strictEqual( widget[ 0 ], element[ 0 ] ); + strictEqual( this.widget[ 0 ], this.element[ 0 ] ); } ); test( "value", function() { expect( 3 ); - var element = $( "#calendar" ).calendar(); - element.calendar( "value", "1/1/14" ); - ok( element.find( "button[data-timestamp]:first" ) + this.element.calendar( "value", "1/1/14" ); + ok( this.element.find( "button[data-timestamp]:first" ) .hasClass( "ui-state-active" ), "first day marked as selected" ); - equal( element.calendar( "value" ), "1/1/14", "getter" ); + equal( this.element.calendar( "value" ), "1/1/14", "getter" ); - element.calendar( "value", "abc" ); - equal( element.calendar( "value" ), "1/1/14", "Setting invalid values should be ignored." ); + this.element.calendar( "value", "abc" ); + equal( this.element.calendar( "value" ), "1/1/14", "Setting invalid values should be ignored." ); } ); test( "valueAsDate", function( assert ) { expect( 11 ); var minDate, maxDate, dateAndTimeToSet, dateAndTimeClone, - element = $( "#calendar" ).calendar(), date1 = new Date( 2008, 6 - 1, 4 ), date2; - element.calendar( "valueAsDate", new Date( 2014, 0, 1 ) ); - ok( element.find( "button[data-timestamp]:first" ) + this.element.calendar( "valueAsDate", new Date( 2014, 0, 1 ) ); + ok( this.element.find( "button[data-timestamp]:first" ) .hasClass( "ui-state-active" ), "First day marked as selected" ); - assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); - - element.calendar( "destroy" ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); - element.calendar(); - equal( element.calendar( "valueAsDate" ), null, "Set date - default" ); + this.element.calendar( "destroy" ); + this.element.calendar(); + equal( this.element.calendar( "valueAsDate" ), null, "Set date - default" ); - element.calendar( "valueAsDate", date1 ); - assert.dateEqual( element.calendar( "valueAsDate" ), date1, "Set date - 2008-06-04" ); + this.element.calendar( "valueAsDate", date1 ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), date1, "Set date - 2008-06-04" ); - // With minimum/maximum - element = $( "#calendar" ).calendar(); + // With minimum / maximum date1 = new Date( 2008, 1 - 1, 4 ); date2 = new Date( 2008, 6 - 1, 4 ); minDate = new Date( 2008, 2 - 1, 29 ); maxDate = new Date( 2008, 3 - 1, 28 ); - element + this.element .calendar( "option", { min: minDate } ) .calendar( "valueAsDate", date2 ); assert.dateEqual( - element.calendar( "valueAsDate" ), + this.element.calendar( "valueAsDate" ), date2, "Set date min/max - value > min" ); - element.calendar( "valueAsDate", date1 ); + this.element.calendar( "valueAsDate", date1 ); assert.dateEqual( - element.calendar( "valueAsDate" ), + this.element.calendar( "valueAsDate" ), date2, "Set date min/max - value < min" ); - element + this.element .calendar( "option", { max: maxDate, min: null } ) .calendar( "valueAsDate", date1 ); assert.dateEqual( - element.calendar( "valueAsDate" ), + this.element.calendar( "valueAsDate" ), date1, "Set date min/max - value < max" ); - element.calendar( "valueAsDate", date2 ); + this.element.calendar( "valueAsDate", date2 ); assert.dateEqual( - element.calendar( "valueAsDate" ), + this.element.calendar( "valueAsDate" ), date1, "Set date min/max - value > max" ); - element + this.element .calendar( "option", { min: minDate } ) .calendar( "valueAsDate", date1 ); assert.dateEqual( - element.calendar( "valueAsDate" ), + this.element.calendar( "valueAsDate" ), date1, "Set date min/max - value < min" ); - element.calendar( "valueAsDate", date2 ); + this.element.calendar( "valueAsDate", date2 ); assert.dateEqual( - element.calendar( "valueAsDate" ), + this.element.calendar( "valueAsDate" ), date1, "Set date min/max - value > max" ); dateAndTimeToSet = new Date( 2008, 3 - 1, 28, 1, 11, 0 ); dateAndTimeClone = new Date( 2008, 3 - 1, 28, 1, 11, 0 ); - element.calendar( "valueAsDate", dateAndTimeToSet ); + this.element.calendar( "valueAsDate", dateAndTimeToSet ); equal( dateAndTimeToSet.getTime(), dateAndTimeClone.getTime(), diff --git a/tests/unit/calendar/options.js b/tests/unit/calendar/options.js index 2e383855beb..2815987946b 100644 --- a/tests/unit/calendar/options.js +++ b/tests/unit/calendar/options.js @@ -3,27 +3,36 @@ define( [ "ui/widgets/calendar" ], function( $ ) { -module( "calendar: options" ); +module( "calendar: options", { + setup: function() { + this.element = $( "#calendar" ).calendar(); + this.widget = this.element.calendar( "widget" ); + }, + teardown: function() { + this.element.calendar( "destroy" ); + } +} ); test( "buttons", function() { expect( 21 ); var button, i, newButtons, + that = this, buttons = { "Ok": function( event ) { ok( true, "button click fires callback" ); - equal( this, element[ 0 ], "context of callback" ); + equal( this, that.element[ 0 ], "context of callback" ); equal( event.target, button[ 0 ], "event target" ); }, "Cancel": function( event ) { ok( true, "button click fires callback" ); - equal( this, element[ 0 ], "context of callback" ); + equal( this, that.element[ 0 ], "context of callback" ); equal( event.target, button[ 1 ], "event target" ); } - }, - element = $( "#calendar" ).calendar( { buttons: buttons } ); + }; - button = element.calendar( "widget" ).find( ".ui-calendar-buttonpane button" ); + this.element.calendar( { buttons: buttons } ); + button = this.widget.find( ".ui-calendar-buttonpane button" ); equal( button.length, 2, "number of buttons" ); i = 0; @@ -34,7 +43,7 @@ test( "buttons", function() { ok( button.parent().hasClass( "ui-calendar-buttonset" ), "buttons in container" ); ok( - element.calendar( "widget" ).hasClass( "ui-calendar-buttons" ), + this.element.calendar( "widget" ).hasClass( "ui-calendar-buttons" ), "calendar wrapper adds class about having buttons" ); @@ -43,24 +52,24 @@ test( "buttons", function() { newButtons = { "Close": function( event ) { ok( true, "button click fires callback" ); - equal( this, element[ 0 ], "context of callback" ); + equal( this, that.element[ 0 ], "context of callback" ); equal( event.target, button[ 0 ], "event target" ); } }; deepEqual( - element.calendar( "option", "buttons" ), + this.element.calendar( "option", "buttons" ), buttons, ".calendar('option', 'buttons') getter" ); - element.calendar( "option", "buttons", newButtons ); + this.element.calendar( "option", "buttons", newButtons ); deepEqual( - element.calendar( "option", "buttons" ), + this.element.calendar( "option", "buttons" ), newButtons, ".calendar('option', 'buttons', ...) setter" ); - button = element.calendar( "widget" ).find( ".ui-calendar-buttonpane button" ); + button = this.element.calendar( "widget" ).find( ".ui-calendar-buttonpane button" ); equal( button.length, 1, "number of buttons after setter" ); button.trigger( "click" ); @@ -70,33 +79,33 @@ test( "buttons", function() { i += 1; } ); - element.calendar( "option", "buttons", null ); - button = element.calendar( "widget" ).find( ".ui-calendar-buttonpane button" ); + this.element.calendar( "option", "buttons", null ); + button = this.widget.find( ".ui-calendar-buttonpane button" ); equal( button.length, 0, "all buttons have been removed" ); - equal( element.find( ".ui-calendar-buttonset" ).length, 0, "buttonset has been removed" ); - equal( element.hasClass( "ui-calendar-buttons" ), false, "calendar element removes class about having buttons" ); - - element.remove(); + equal( this.element.find( ".ui-calendar-buttonset" ).length, 0, "buttonset has been removed" ); + equal( this.element.hasClass( "ui-calendar-buttons" ), false, "calendar element removes class about having buttons" ); } ); test( "buttons - advanced", function() { expect( 7 ); - var buttons, - element = $( "#calendar" ).calendar( { - buttons: [ { - text: "a button", - "class": "additional-class", - id: "my-button-id", - click: function() { - equal( this, element[ 0 ], "correct context" ); - }, - icon: "ui-icon-cancel", - showLabel: false - } ] - } ); + var that = this, + buttons; + + this.element.calendar( { + buttons: [ { + text: "a button", + "class": "additional-class", + id: "my-button-id", + click: function() { + equal( this, that.element[ 0 ], "correct context" ); + }, + icon: "ui-icon-cancel", + showLabel: false + } ] + } ); - buttons = element.calendar( "widget" ).find( ".ui-calendar-buttonpane button" ); + buttons = this.widget.find( ".ui-calendar-buttonpane button" ); equal( buttons.length, 1, "correct number of buttons" ); equal( buttons.attr( "id" ), "my-button-id", "correct id" ); equal ( $.trim( buttons.text() ), "a button", "correct label" ); @@ -104,149 +113,137 @@ test( "buttons - advanced", function() { equal( buttons.button( "option", "icon" ), "ui-icon-cancel" ); equal( buttons.button( "option", "showLabel" ), false ); buttons.click(); - - element.remove(); } ); test( "dateFormat", function() { expect( 2 ); - var element = $( "#calendar" ).calendar(); - element.calendar( "value", "1/1/14" ); + this.element.calendar( "value", "1/1/14" ); - element.calendar( "widget" ).find( "td[id]:first button" ).trigger( "mousedown" ); - equal( element.calendar( "value" ), "1/1/14", "default formatting" ); + this.widget.find( "td[id]:first button" ).trigger( "mousedown" ); + equal( this.element.calendar( "value" ), "1/1/14", "default formatting" ); - element.calendar( "option", "dateFormat", { date: "full" } ); - equal( element.calendar( "value" ), "Wednesday, January 1, 2014", "updated formatting" ); + this.element.calendar( "option", "dateFormat", { date: "full" } ); + equal( this.element.calendar( "value" ), "Wednesday, January 1, 2014", "updated formatting" ); } ); test( "eachDay", function() { expect( 5 ); + var timestamp, - input = $( "#calendar" ).calendar(), - picker = input.calendar( "widget" ), - firstCell = picker.find( "td[id]:first" ); + firstCell = this.widget.find( "td[id]:first" ); equal( firstCell.find( "button" ).length, 1, "days are selectable by default" ); timestamp = parseInt( firstCell.find( "button" ).attr( "data-timestamp" ), 10 ); equal( new Date( timestamp ).getDate(), 1, "first available day is the 1st by default" ); // Do not render the 1st of the month - input.calendar( "option", "eachDay", function( day ) { + this.element.calendar( "option", "eachDay", function( day ) { if ( day.date === 1 ) { day.render = false; } } ); - firstCell = picker.find( "td[id]:first" ); + firstCell = this.widget.find( "td[id]:first" ); timestamp = parseInt( firstCell.find( "button" ).attr( "data-timestamp" ), 10 ); equal( new Date( timestamp ).getDate(), 2, "first available day is the 2nd" ); // Display the 1st of the month but make it not selectable. - input.calendar( "option", "eachDay", function( day ) { + this.element.calendar( "option", "eachDay", function( day ) { if ( day.date === 1 ) { day.selectable = false; } } ); - firstCell = picker.find( "td[id]:first" ); + firstCell = this.widget.find( "td[id]:first" ); ok( firstCell.find( "button" ).prop( "disabled" ), "the 1st is not selectable" ); - input.calendar( "option", "eachDay", function( day ) { + this.element.calendar( "option", "eachDay", function( day ) { if ( day.date === 1 ) { day.extraClasses = "ui-custom"; } } ); - ok( picker.find( "td[id]:first button" ).hasClass( "ui-custom" ), "extraClasses applied" ); - - input.calendar( "destroy" ); + ok( this.widget.find( "td[id]:first button" ).hasClass( "ui-custom" ), "extraClasses applied" ); } ); test( "showWeek", function() { expect( 7 ); - var input = $( "#calendar" ).calendar(), - container = input.calendar( "widget" ); - equal( container.find( "thead th" ).length, 7, "just 7 days, no column cell" ); - equal( container.find( ".ui-calendar-week-col" ).length, 0, + equal( this.widget.find( "thead th" ).length, 7, "just 7 days, no column cell" ); + equal( this.widget.find( ".ui-calendar-week-col" ).length, 0, "no week column cells present" ); - input.calendar( "destroy" ); + this.element.calendar( "destroy" ); - input = $( "#calendar" ).calendar( { showWeek: true } ); - container = input.calendar( "widget" ); - equal( container.find( "thead th" ).length, 8, "7 days + a column cell" ); - ok( container.find( "thead th:first" ).is( ".ui-calendar-week-col" ), + this.element.calendar( { showWeek: true } ); + equal( this.widget.find( "thead th" ).length, 8, "7 days + a column cell" ); + ok( this.widget.find( "thead th:first" ).is( ".ui-calendar-week-col" ), "first cell should have ui-datepicker-week-col class name" ); - equal( container.find( ".ui-calendar-week-col" ).length, - container.find( "tr" ).length, "one week cell for each week" ); - input.calendar( "destroy" ); - - input = $( "#calendar" ).calendar(); - container = input.calendar( "widget" ); - equal( container.find( "thead th" ).length, 7, "no week column" ); - input.calendar( "option", "showWeek", true ); - equal( container.find( "thead th" ).length, 8, "supports changing option after init" ); + equal( this.widget.find( ".ui-calendar-week-col" ).length, + this.widget.find( "tr" ).length, "one week cell for each week" ); + this.element.calendar( "destroy" ); + + this.element.calendar(); + equal( this.widget.find( "thead th" ).length, 7, "no week column" ); + this.element.calendar( "option", "showWeek", true ); + equal( this.widget.find( "thead th" ).length, 8, "supports changing option after init" ); } ); test( "min / max", function( assert ) { expect( 17 ); // With existing date - var element = $( "#calendar" ).calendar(), - container = element.calendar( "widget" ), - prevButton = container.find( ".ui-calendar-prev" ), - nextButton = container.find( ".ui-calendar-next" ), + var prevButton = this.widget.find( ".ui-calendar-prev" ), + nextButton = this.widget.find( ".ui-calendar-next" ), minDate = new Date( 2008, 2 - 1, 29 ), maxDate = new Date( 2008, 12 - 1, 7 ); - element + this.element .calendar( "option", { min: minDate } ) .calendar( "value", "6/4/08" ); - assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > min" ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > min" ); - element + this.element .calendar( "option", { min: minDate } ) .calendar( "value", "1/4/08" ); - assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); - element + this.element .calendar( "option", { min: null } ) .calendar( "value", "6/4/08" ) .calendar( "option", { max: maxDate } ); - assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < max" ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < max" ); - element + this.element .calendar( "option", { max: maxDate } ) .calendar( "value", "1/4/09" ); - assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - setDate > max" ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - setDate > max" ); - element + this.element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "1/4/08" ); - assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); - element + this.element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "6/4/08" ); - assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > min, < max" ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > min, < max" ); - element + this.element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "1/4/09" ); - assert.dateEqual( element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > max" ); + assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > max" ); - element + this.element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "3/4/08" ); ok( !prevButton.hasClass( "ui-state-disabled" ), "Prev button enabled" ); prevButton.simulate( "click" ); ok( prevButton.hasClass( "ui-state-disabled" ), "Prev button disabled" ); - element.calendar( "value", "11/4/08" ); + this.element.calendar( "value", "11/4/08" ); ok( !nextButton.hasClass( "ui-state-disabled" ), "Next button enabled" ); nextButton.simulate( "click" ); ok( nextButton.hasClass( "ui-state-disabled" ), "Next button disabled" ); - element + this.element .calendar( "option", { max: null } ) .calendar( "value", "1/4/09" ) .calendar( "option", { min: minDate, max: maxDate } ); @@ -256,7 +253,7 @@ test( "min / max", function( assert ) { prevButton.simulate( "click" ); ok( !nextButton.hasClass( "ui-state-disabled" ), "Other year above max: Next button enabled after click" ); - element + this.element .calendar( "option", { min: null } ) .calendar( "value", "1/4/08" ) .calendar( "option", { min: minDate, max: maxDate } ); @@ -269,42 +266,46 @@ test( "min / max", function( assert ) { test( "numberOfMonths", function() { expect( 6 ); - var date = new Date( 2015, 8 - 1, 1 ), - input = $( "#calendar" ).calendar( { + + var date = new Date( 2015, 8 - 1, 1 ); + + // Number of month option does not work after init + this.element + .calendar( "destroy" ) + .calendar( { numberOfMonths: 3, value: date - } ), - container = input.calendar( "widget" ); + } ); - equal( container.find( ".ui-calendar-group" ).length, 3, "3 calendar grids" ); + equal( this.widget.find( ".ui-calendar-group" ).length, 3, "3 calendar grids" ); equal( - container.find( "tbody:first td[id]:first" ).attr( "id" ), + this.widget.find( "tbody:first td[id]:first" ).attr( "id" ), "calendar-2015-7-1", "Correct id set for first day of first grid" ); equal( - container.find( "tbody:last td[id]:last" ).attr( "id" ), + this.widget.find( "tbody:last td[id]:last" ).attr( "id" ), "calendar-2015-9-31", "Correct id set for last day of third grid" ); // Test for jumping in weekday rendering after click on last day of last grid - container.find( "tbody:last td[id]:last button" ).trigger( "mousedown" ); - equal( container.find( "thead:last th:last" ).text(), "Sa", + this.widget.find( "tbody:last td[id]:last button" ).trigger( "mousedown" ); + equal( this.widget.find( "thead:last th:last" ).text(), "Sa", "After mousedown last month: Last day is Saturday" ); // Test if using cursor to go to the next / prev month advances three month // Focus doesn't work here so we use an additional mouse down event - container.find( "tbody:first td[id]:first button" ).trigger( "mousedown" ); + this.widget.find( "tbody:first td[id]:first button" ).trigger( "mousedown" ); $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); - equal( container.find( ".ui-calendar-month:first" ).text(), "May", + equal( this.widget.find( ".ui-calendar-month:first" ).text(), "May", "After move to previous month: First month is May" ); - container.find( "tbody:last td[id]:last button" ).trigger( "mousedown" ); + this.widget.find( "tbody:last td[id]:last button" ).trigger( "mousedown" ); $( document.activeElement ).simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ); - equal( container.find( ".ui-calendar-month:last" ).text(), "October", + equal( this.widget.find( ".ui-calendar-month:last" ).text(), "October", "After move to next month: Last month is October" ); } ); From 877937e5c64667de6936c824115a76b6bb10c2e2 Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 22 May 2016 22:23:01 +0200 Subject: [PATCH 06/17] Calendar tests: Add basic value option tests --- tests/unit/calendar/options.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/unit/calendar/options.js b/tests/unit/calendar/options.js index 2815987946b..9fb49b362a4 100644 --- a/tests/unit/calendar/options.js +++ b/tests/unit/calendar/options.js @@ -310,6 +310,21 @@ test( "numberOfMonths", function() { ); } ); +test( "value", function( assert ) { + expect( 4 ); + + var date = new Date( 2016, 5 - 1, 23 ); + + assert.equal( this.element.calendar( "option", "value" ), null, "Initial value" ); + + this.element.calendar( "option", "value", date ); + assert.dateEqual( this.element.calendar( "option", "value" ), date, "Value set" ); + equal( this.widget.find( "table button.ui-state-active" ).data( "timestamp" ), 1463954400000, "Active button timestamp" ); + + this.element.calendar( "option", "value", "invalid" ); + assert.dateEqual( this.element.calendar( "option", "value" ), date, "Value after invalid parameter" ); +} ); + /* // TODO: Move this to $.date, Globalize or calendar widget test( "daylightSaving", function() { From ea986f2808684c0112d56776d76ea35e9cdb77da Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 29 May 2016 01:55:35 +0200 Subject: [PATCH 07/17] Datepicker: Add missing Globalize parse format for min / max attribute --- Gruntfile.js | 1 + external/localization.js | 47 ++++++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index fe5806bad82..42ea60ca189 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -450,6 +450,7 @@ grunt.registerTask( "compile-globalize", function() { globalize.dateParser( { date: "long" } ), globalize.dateFormatter( { date: "full" } ), globalize.dateParser( { date: "full" } ), + globalize.dateParser( { raw: "yyyy-MM-dd" } ), globalize.numberParser() ]); diff --git a/external/localization.js b/external/localization.js index 95bb3bafe15..1518941a956 100644 --- a/external/localization.js +++ b/external/localization.js @@ -45,23 +45,25 @@ Globalize.b2002841143 = numberParserFn(["∞",{".":",",",":".","%":"%","+":"+"," Globalize.a1749351181 = numberParserFn(["∞",{".":",",",":".","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); Globalize.b960923264 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); Globalize.b1965900303 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); -Globalize.b2076722823 = numberParserFn(["∞",{".":"decimal",",":"group","%":"percentSign","+":"plusSign","-":"minusSign","E":"exponential","‰":"perMille","٫":".","٬":",","٪":"%","‏+":"+","‏-":"-","اس":"E","؉":"‰"},"-","",{"0":"invalid","1":"invalid","2":"invalid","3":"invalid","4":"invalid","5":"invalid","6":"invalid","7":"invalid","8":"invalid","9":"invalid","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9"}]); Globalize.b1293124635 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); +Globalize.b2076722823 = numberParserFn(["∞",{".":"decimal",",":"group","%":"percentSign","+":"plusSign","-":"minusSign","E":"exponential","‰":"perMille","٫":".","٬":",","٪":"%","‏+":"+","‏-":"-","اس":"E","؉":"‰"},"-","",{"0":"invalid","1":"invalid","2":"invalid","3":"invalid","4":"invalid","5":"invalid","6":"invalid","7":"invalid","8":"invalid","9":"invalid","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9"}]); Globalize.a474049536 = numberParserFn(["∞",{".":",",",":".","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); Globalize.b1370229258 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); -Globalize.a946274711 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"D","mon":"L","tue":"M","wed":"X","thu":"J","fri":"V","sat":"S"}}}}); -Globalize.b1200480509 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); +Globalize.b729298712 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"DO","mon":"LU","tue":"MA","wed":"MI","thu":"JU","fri":"VI","sat":"SA"}}}}); Globalize.a52764931 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"Sunday","mon":"Monday","tue":"Tuesday","wed":"Wednesday","thu":"Thursday","fri":"Friday","sat":"Saturday"}}}}); +Globalize.b617029686 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":0,"minDays":1}); +Globalize.a1636669180 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"S","mon":"M","tue":"T","wed":"W","thu":"T","fri":"F","sat":"S"}}}}); Globalize.b617625506 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":0}); Globalize.b93641787 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"}),"2":Globalize("en").numberFormatter({"raw":"00"})}, {"pattern":"M/d/yy","timeSeparator":":"}); -Globalize.a1636669180 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"S","mon":"M","tue":"T","wed":"W","thu":"T","fri":"F","sat":"S"}}}}); -Globalize.a491609039 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"y年M月d日EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}}}); Globalize.b801906653 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"Su","mon":"Mo","tue":"Tu","wed":"We","thu":"Th","fri":"Fr","sat":"Sa"}}}}); -Globalize.a218160295 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"MMMM d, y","timeSeparator":":","months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); +Globalize.a491609039 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"y年M月d日EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}}}); Globalize.a1351587010 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"y年M月d日","timeSeparator":":"}); -Globalize.b641817676 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, MMMM d, y","timeSeparator":":","days":{"E":{"4":{"sun":"Sunday","mon":"Monday","tue":"Tuesday","wed":"Wednesday","thu":"Thursday","fri":"Friday","sat":"Saturday"}}},"months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); +Globalize.a218160295 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"MMMM d, y","timeSeparator":":","months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); Globalize.a864358539 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"الأحد","mon":"الاثنين","tue":"الثلاثاء","wed":"الأربعاء","thu":"الخميس","fri":"الجمعة","sat":"السبت"}}}}); +Globalize.b641817676 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, MMMM d, y","timeSeparator":":","days":{"E":{"4":{"sun":"Sunday","mon":"Monday","tue":"Tuesday","wed":"Wednesday","thu":"Thursday","fri":"Friday","sat":"Saturday"}}},"months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); Globalize.a682848010 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"y/M/d","timeSeparator":":"}); +Globalize.b285424135 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":0}); +Globalize.b388886901 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}}}); Globalize.b1382770181 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"So.","mon":"Mo.","tue":"Di.","wed":"Mi.","thu":"Do.","fri":"Fr.","sat":"Sa."}}}}); Globalize.b1430109660 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"S","mon":"M","tue":"D","wed":"M","thu":"D","fri":"F","sat":"S"}}}}); Globalize.a1754951899 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"Sonntag","mon":"Montag","tue":"Dienstag","wed":"Mittwoch","thu":"Donnerstag","fri":"Freitag","sat":"Samstag"}}}}); @@ -71,43 +73,46 @@ Globalize.b1252219604 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"r Globalize.b1870116986 = dateFormatterFn({"1":Globalize("de").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":1}); Globalize.b674505315 = dateFormatterFn({"2":Globalize("de").numberFormatter({"raw":"00"})}, {"pattern":"dd.MM.yy","timeSeparator":":"}); Globalize.a1026267252 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"ح","mon":"ن","tue":"ث","wed":"ر","thu":"خ","fri":"ج","sat":"س"}}}}); -Globalize.b285424135 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":0}); -Globalize.b388886901 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}}}); -Globalize.a1446348751 = dateFormatterFn({"1":Globalize("de").numberFormatter({"raw":"0"})}, {"pattern":"d. MMMM y","timeSeparator":":","months":{"M":{"4":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}}}); Globalize.b284828315 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":0,"minDays":1}); -Globalize.a586370780 = dateFormatterFn({"1":Globalize("de").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, d. MMMM y","timeSeparator":":","days":{"E":{"4":{"sun":"Sonntag","mon":"Montag","tue":"Dienstag","wed":"Mittwoch","thu":"Donnerstag","fri":"Freitag","sat":"Samstag"}}},"months":{"M":{"4":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}}}); Globalize.b194087032 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"一月","2":"二月","3":"三月","4":"四月","5":"五月","6":"六月","7":"七月","8":"八月","9":"九月","10":"十月","11":"十一月","12":"十二月"}}}}); +Globalize.a1446348751 = dateFormatterFn({"1":Globalize("de").numberFormatter({"raw":"0"})}, {"pattern":"d. MMMM y","timeSeparator":":","months":{"M":{"4":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}}}); +Globalize.a1059158408 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}}}); +Globalize.a586370780 = dateFormatterFn({"1":Globalize("de").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, d. MMMM y","timeSeparator":":","days":{"E":{"4":{"sun":"Sonntag","mon":"Montag","tue":"Dienstag","wed":"Mittwoch","thu":"Donnerstag","fri":"Freitag","sat":"Samstag"}}},"months":{"M":{"4":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}}}); +Globalize.b1524871401 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"日","mon":"一","tue":"二","wed":"三","thu":"四","fri":"五","sat":"六"}}}}); +Globalize.b25416856 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"周日","mon":"周一","tue":"周二","wed":"周三","thu":"周四","fri":"周五","sat":"周六"}}}}); Globalize.b392241633 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"d MMMM، y","timeSeparator":":","months":{"M":{"4":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}}}); -Globalize.b729298712 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"DO","mon":"LU","tue":"MA","wed":"MI","thu":"JU","fri":"VI","sat":"SA"}}}}); -Globalize.b617029686 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":0,"minDays":1}); +Globalize.b1200480509 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); +Globalize.a946274711 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"D","mon":"L","tue":"M","wed":"X","thu":"J","fri":"V","sat":"S"}}}}); Globalize.b1770621176 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"domingo","mon":"lunes","tue":"martes","wed":"miércoles","thu":"jueves","fri":"viernes","sat":"sábado"}}}}); Globalize.a1271100680 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}}}); Globalize.a1150144485 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":1,"minDays":4}); -Globalize.a1059158408 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}}}); +Globalize.b79536830 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":6,"minDays":1}); Globalize.a1149548665 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":1}); Globalize.b21033846 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"}),"2":Globalize("es").numberFormatter({"raw":"00"})}, {"pattern":"d/M/yy","timeSeparator":":"}); Globalize.b1836232371 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"d‏/M‏/y","timeSeparator":":"}); -Globalize.b1524871401 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"日","mon":"一","tue":"二","wed":"三","thu":"四","fri":"五","sat":"六"}}}}); +Globalize.b1332212145 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, d 'de' MMMM 'de' y","timeSeparator":":","days":{"E":{"4":{"sun":"domingo","mon":"lunes","tue":"martes","wed":"miércoles","thu":"jueves","fri":"viernes","sat":"sábado"}}},"months":{"M":{"4":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}}}); Globalize.b80132650 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":6}); Globalize.b472234174 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"d 'de' MMMM 'de' y","timeSeparator":":","months":{"M":{"4":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}}}); -Globalize.b25416856 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"周日","mon":"周一","tue":"周二","wed":"周三","thu":"周四","fri":"周五","sat":"周六"}}}}); -Globalize.b1332212145 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, d 'de' MMMM 'de' y","timeSeparator":":","days":{"E":{"4":{"sun":"domingo","mon":"lunes","tue":"martes","wed":"miércoles","thu":"jueves","fri":"viernes","sat":"sábado"}}},"months":{"M":{"4":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}}}); -Globalize.b79536830 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":6,"minDays":1}); Globalize.a1750470059 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"الأحد","mon":"الاثنين","tue":"الثلاثاء","wed":"الأربعاء","thu":"الخميس","fri":"الجمعة","sat":"السبت"}}}}); +Globalize.b1518991631 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d 'de' MMMM 'de' y","timeSeparator":":","gregorian/months/format/wide":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}); Globalize.a1915997694 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"EEEE, d 'de' MMMM 'de' y","timeSeparator":":","gregorian/days/format/wide":{"sun":"domingo","mon":"lunes","tue":"martes","wed":"miércoles","thu":"jueves","fri":"viernes","sat":"sábado"},"gregorian/months/format/wide":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}); -Globalize.a1889223355 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d/M/yy","timeSeparator":":"}); +Globalize.b82385031 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); Globalize.a74024830 = dateParserFn(Globalize("ar").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"d‏/M‏/y","timeSeparator":":"}); +Globalize.b262211828 = dateParserFn(Globalize("de").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); Globalize.b460386677 = dateParserFn(Globalize("de").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"EEEE, d. MMMM y","timeSeparator":":","gregorian/days/format/wide":{"sun":"Sonntag","mon":"Montag","tue":"Dienstag","wed":"Mittwoch","thu":"Donnerstag","fri":"Freitag","sat":"Samstag"},"gregorian/months/format/wide":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}); Globalize.a399591294 = dateParserFn(Globalize("de").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d. MMMM y","timeSeparator":":","gregorian/months/format/wide":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}); Globalize.b1438999090 = dateParserFn(Globalize("ar").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"d MMMM، y","timeSeparator":":","gregorian/months/format/wide":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}); Globalize.a1235751886 = dateParserFn(Globalize("de").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"dd.MM.yy","timeSeparator":":"}); -Globalize.b1518991631 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d 'de' MMMM 'de' y","timeSeparator":":","gregorian/months/format/wide":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}); -Globalize.b1701862085 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"y/M/d","timeSeparator":":"}); +Globalize.a1889223355 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d/M/yy","timeSeparator":":"}); +Globalize.b2011240140 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); Globalize.b1688575133 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"EEEE, MMMM d, y","timeSeparator":":","gregorian/days/format/wide":{"sun":"Sunday","mon":"Monday","tue":"Tuesday","wed":"Wednesday","thu":"Thursday","fri":"Friday","sat":"Saturday"},"gregorian/months/format/wide":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}); +Globalize.b1701862085 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"y/M/d","timeSeparator":":"}); Globalize.b828597162 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"MMMM d, y","timeSeparator":":","gregorian/months/format/wide":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}); +Globalize.b1059122500 = dateParserFn(Globalize("ar").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); Globalize.a304829553 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"y年M月d日","timeSeparator":":"}); Globalize.a1816615414 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"M/d/yy","timeSeparator":":"}); Globalize.b555148418 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"y年M月d日EEEE","timeSeparator":":","gregorian/days/format/wide":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}); +Globalize.a1997933049 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); Globalize.a1995990235 = dateParserFn(Globalize("ar").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"EEEE، d MMMM، y","timeSeparator":":","gregorian/days/format/wide":{"sun":"الأحد","mon":"الاثنين","tue":"الثلاثاء","wed":"الأربعاء","thu":"الخميس","fri":"الجمعة","sat":"السبت"},"gregorian/months/format/wide":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}); return Globalize; From 9428256ad3036408d129b6501b072192841d98eb Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 29 May 2016 02:09:13 +0200 Subject: [PATCH 08/17] Datepicker: Add min / max option tests --- tests/unit/datepicker/options.js | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/unit/datepicker/options.js b/tests/unit/datepicker/options.js index f04b3fb4df0..e5b142acc5a 100644 --- a/tests/unit/datepicker/options.js +++ b/tests/unit/datepicker/options.js @@ -48,6 +48,45 @@ test( "appendTo", function() { equal( container, detached[ 0 ], "detached DOM element" ); } ); +test( "min / max", function( assert ) { + expect( 10 ); + + var min, max; + + this.element.datepicker( "option", { min: "10/20/08", max: "10/25/08" } ); + assert.dateEqual( this.element.datepicker( "option", "min" ), new Date( 2008, 10 - 1, 20 ), "Set min option as string" ); + assert.dateEqual( this.element.datepicker( "option", "max" ), new Date( 2008, 10 - 1, 25 ), "Set max option as string" ); + + min = new Date( 2009, 10 - 1, 20 ); + max = new Date( 2009, 10 - 1, 25 ); + this.element.datepicker( "option", { min: min, max: max } ); + assert.dateEqual( this.element.datepicker( "option", "min" ), min, "Set min option as date object" ); + assert.dateEqual( this.element.datepicker( "option", "max" ), max, "Set max option as date object" ); + + this.element + .datepicker( "destroy" ) + .attr( "min", "2010-10-20" ) + .attr( "max", "2010-10-25" ) + .datepicker(); + assert.dateEqual( this.element.datepicker( "option", "min" ), new Date( 2010, 10 - 1, 20 ), "Set min option as attribute" ); + assert.dateEqual( this.element.datepicker( "option", "max" ), new Date( 2010, 10 - 1, 25 ), "Set max option as attribute" ); + + min = new Date( 2011, 10 - 1, 20 ); + max = new Date( 2011, 10 - 1, 25 ); + this.element + .datepicker( "destroy" ) + .datepicker( { min: min, max: max } ); + assert.dateEqual( this.element.datepicker( "option", "min" ), new Date( 2011, 10 - 1, 20 ), "Set min option as date object on init" ); + assert.dateEqual( this.element.datepicker( "option", "max" ), new Date( 2011, 10 - 1, 25 ), "Set max option as date object on init" ); + + this.element + .datepicker( "destroy" ) + .datepicker( { min: "10/20/12", max: "10/25/12" } ); + assert.dateEqual( this.element.datepicker( "option", "min" ), new Date( 2012, 10 - 1, 20 ), "Set min option as string on init" ); + assert.dateEqual( this.element.datepicker( "option", "max" ), new Date( 2012, 10 - 1, 25 ), "Set max option as string on init" ); + +} ); + test( "Pass-through options", function() { expect( 11 ); From 6f9d266339b8c4950b18137af1feb393684e0c5a Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 29 May 2016 02:10:09 +0200 Subject: [PATCH 09/17] Datepicker: Fix min / max attribute and add proper option parsing --- ui/widgets/datepicker.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/ui/widgets/datepicker.js b/ui/widgets/datepicker.js index 95bc0aa3365..ed6449abe83 100644 --- a/ui/widgets/datepicker.js +++ b/ui/widgets/datepicker.js @@ -61,12 +61,13 @@ var widget = $.widget( "ui.datepicker", { _create: function() { this.suppressExpandOnFocus = false; + this._parse = new Globalize( this.options.locale ).dateParser( this.options.dateFormat ); if ( $.type( this.options.max ) === "string" ) { - this.options.max = Globalize.parseDate( this.options.max, { raw: "yyyy-MM-dd" } ); + this.options.max = this._parse( this.options.max ); } if ( $.type( this.options.min ) === "string" ) { - this.options.min = Globalize.parseDate( this.options.min, { raw: "yyyy-MM-dd" } ); + this.options.min = this._parse( this.options.min ); } this._createCalendar(); @@ -79,22 +80,22 @@ var widget = $.widget( "ui.datepicker", { _getCreateOptions: function() { var max = this.element.attr( "max" ), min = this.element.attr( "min" ), + parser = new Globalize( "en" ).dateParser( { raw: "yyyy-MM-dd" } ), options = {}; if ( max !== undefined ) { - options.max = Globalize.parseDate( max, { raw: "yyyy-MM-dd" } ); + options.max = parser( max ); } if ( min !== undefined ) { - options.min = Globalize.parseDate( min, { raw: "yyyy-MM-dd" } ); + options.min = parser( min ); } return options; }, _createCalendar: function() { - var that = this, - globalize = new Globalize( this.options.locale ); + var that = this; this.calendar = $( "
" ).appendTo( this._appendTo() ); this._addClass( this.calendar, "ui-datepicker", "ui-front" ); @@ -102,7 +103,7 @@ var widget = $.widget( "ui.datepicker", { // Initialize calendar widget this.calendarInstance = this.calendar .calendar( $.extend( {}, this.options, { - value: globalize.dateParser( this.options.dateFormat )( this.element.val() ), + value: this._parse( this.element.val() ), select: function( event ) { that.element.val( that.calendarInstance.value() ); that.close(); @@ -118,7 +119,6 @@ var widget = $.widget( "ui.datepicker", { this.calendarInstance.buttonClickContext = that.element[ 0 ]; this._setHiddenPicker(); - this.element.attr( { "aria-haspopup": true, "aria-owns": this.calendar.attr( "id" ) @@ -302,7 +302,7 @@ var widget = $.widget( "ui.datepicker", { value: function( value ) { if ( arguments.length ) { - this.valueAsDate( this.calendarInstance._parse( value ) ); + this.valueAsDate( this._parse( value ) ); } else { return this._getParsedValue() ? this.element.val() : null; } @@ -334,10 +334,16 @@ var widget = $.widget( "ui.datepicker", { }, _getParsedValue: function() { - return this.calendarInstance._parse( this.element.val() ); + return this._parse( this.element.val() ); }, _setOption: function( key, value ) { + if ( key === "max" || key === "min" ) { + if ( typeof value === "string" ) { + value = this._parse( value ); + } + } + this._super( key, value ); if ( $.inArray( key, this.calendarOptions ) !== -1 ) { From 9fc83a085c9bc1b8cf6f457f6d7842e2781fca4e Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 29 May 2016 10:57:35 +0200 Subject: [PATCH 10/17] Calendar: Add change event --- tests/unit/calendar/common.js | 1 + tests/unit/calendar/events.js | 36 +++++++++++++++++++++++++++++++++ tests/unit/datepicker/common.js | 1 + tests/unit/datepicker/events.js | 31 +++++++++++++++++++++++++++- ui/widgets/calendar.js | 7 +++++++ ui/widgets/datepicker.js | 7 +++++++ 6 files changed, 82 insertions(+), 1 deletion(-) diff --git a/tests/unit/calendar/common.js b/tests/unit/calendar/common.js index b6807ec84ef..ea637a9b8d0 100644 --- a/tests/unit/calendar/common.js +++ b/tests/unit/calendar/common.js @@ -35,6 +35,7 @@ common.testWidget( "calendar", { value: null, // callbacks + change: null, create: null, select: null } diff --git a/tests/unit/calendar/events.js b/tests/unit/calendar/events.js index 37ad57a8548..d69aa137f9c 100644 --- a/tests/unit/calendar/events.js +++ b/tests/unit/calendar/events.js @@ -10,6 +10,42 @@ module( "calendar: events", { } } ); +test( "change", function() { + expect( 6 ); + + var shouldFire, eventType; + + this.element.calendar( { + change: function( event ) { + ok( shouldFire, "change event fired" ); + equal( + event.type, + "calendarchange", + "change event" + ); + equal( + event.originalEvent.type, + eventType, + "change originalEvent on calendar button " + eventType + ); + } + } ); + + shouldFire = true; + eventType = "mousedown"; + this.element.find( "tbody button" ).last().simulate( eventType ); + + shouldFire = true; + eventType = "keydown"; + testHelper.focusGrid( this.element ) + .simulate( eventType, { keyCode: $.ui.keyCode.HOME } ) + .simulate( eventType, { keyCode: $.ui.keyCode.ENTER } ); + + shouldFire = false; + eventType = "mousedown"; + this.element.find( "tbody button" ).first().simulate( eventType ); +} ); + asyncTest( "select", function() { expect( 6 ); diff --git a/tests/unit/datepicker/common.js b/tests/unit/datepicker/common.js index 9074b78e6c5..527ddcbf341 100644 --- a/tests/unit/datepicker/common.js +++ b/tests/unit/datepicker/common.js @@ -42,6 +42,7 @@ common.testWidget( "datepicker", { // callbacks beforeOpen: null, + change: null, close: null, create: null, open: null, diff --git a/tests/unit/datepicker/events.js b/tests/unit/datepicker/events.js index eb327f7f7d0..394a94d68d3 100644 --- a/tests/unit/datepicker/events.js +++ b/tests/unit/datepicker/events.js @@ -42,6 +42,35 @@ test( "beforeOpen", function() { .datepicker( "open" ); } ); +test( "change", function() { + expect( 4 ); + + var shouldFire; + + this.element.datepicker( { + change: function( event ) { + ok( shouldFire, "change event fired" ); + equal( + event.type, + "datepickerchange", + "change event" + ); + } + } ); + + shouldFire = true; + this.element.datepicker( "open" ); + this.widget.find( "tbody button" ).eq( 1 ).simulate( "mousedown" ); + + shouldFire = false; + this.element.datepicker( "open" ); + this.widget.find( "tbody button" ).eq( 1 ).simulate( "mousedown" ); + + shouldFire = true; + this.element.datepicker( "open" ); + this.widget.find( "tbody button" ).eq( 2 ).simulate( "mousedown" ); +} ); + test( "close", function() { expect( 4 ); @@ -71,7 +100,7 @@ test( "close", function() { shouldFire = false; this.element.datepicker( "open" ); shouldFire = true; - this.element.datepicker( "widget" ).find( "tbody tr:first button:first" ).simulate( "mousedown" ); + this.widget.find( "tbody tr:first button:first" ).simulate( "mousedown" ); } ); test( "open", function() { diff --git a/ui/widgets/calendar.js b/ui/widgets/calendar.js index 805547f753d..71f7121664a 100644 --- a/ui/widgets/calendar.js +++ b/ui/widgets/calendar.js @@ -72,6 +72,7 @@ return $.widget( "ui.calendar", { value: null, // callbacks + change: null, select: null }, @@ -125,6 +126,8 @@ return $.widget( "ui.calendar", { }, _select: function( event ) { + var oldValue = this.options.value ? this.options.value.getTime() : ""; + this._setOption( "value", new Date( $( event.currentTarget ).data( "timestamp" ) ) ); this._updateDayElement( "ui-state-active" ); @@ -133,6 +136,10 @@ return $.widget( "ui.calendar", { this.activeDescendant.closest( this.grid ).focus(); event.preventDefault(); } + + if ( oldValue !== this.options.value.getTime() ) { + this._trigger( "change", event ); + } }, _handleKeydown: function( event ) { diff --git a/ui/widgets/datepicker.js b/ui/widgets/datepicker.js index ed6449abe83..e2e9037e834 100644 --- a/ui/widgets/datepicker.js +++ b/ui/widgets/datepicker.js @@ -51,6 +51,7 @@ var widget = $.widget( "ui.datepicker", { // callbacks beforeOpen: null, + change: null, close: null, open: null, select: null @@ -104,6 +105,9 @@ var widget = $.widget( "ui.datepicker", { this.calendarInstance = this.calendar .calendar( $.extend( {}, this.options, { value: this._parse( this.element.val() ), + change: function( event ) { + that._trigger( "change", event ); + }, select: function( event ) { that.element.val( that.calendarInstance.value() ); that.close(); @@ -172,6 +176,9 @@ var widget = $.widget( "ui.datepicker", { }, blur: function() { this.suppressExpandOnFocus = false; + }, + change: function( event ) { + this._trigger( "change", event ); } }, From 96b5a760c42644c4585be1d90ad5c94889833043 Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Wed, 12 Oct 2016 01:09:03 +0200 Subject: [PATCH 11/17] Calendar tests: Simplify timeout steps --- tests/unit/calendar/events.js | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/tests/unit/calendar/events.js b/tests/unit/calendar/events.js index d69aa137f9c..fef9d6bf5e5 100644 --- a/tests/unit/calendar/events.js +++ b/tests/unit/calendar/events.js @@ -69,32 +69,26 @@ asyncTest( "select", function() { } ); function step1() { - setTimeout( function() { - eventType = "mousedown"; - message = "on calendar button " + eventType; - that.element.find( "table button:eq(1)" ).simulate( eventType ); - step2(); - }, 50 ); + eventType = "mousedown"; + message = "on calendar button " + eventType; + that.element.find( "table button:eq(1)" ).simulate( eventType ); + setTimeout( step2, 50 ); } function step2() { - setTimeout( function() { - eventType = "keydown"; - message = "on calendar button " + eventType; - testHelper.focusGrid( that.element ) - .simulate( eventType, { keyCode: $.ui.keyCode.END } ) - .simulate( eventType, { keyCode: $.ui.keyCode.ENTER } ); - step3(); - }, 50 ); + eventType = "keydown"; + message = "on calendar button " + eventType; + testHelper.focusGrid( that.element ) + .simulate( eventType, { keyCode: $.ui.keyCode.END } ) + .simulate( eventType, { keyCode: $.ui.keyCode.ENTER } ); + setTimeout( step3, 50 ); } // This should not trigger another event function step3() { - setTimeout( function() { - that.element.calendar( "disable" ); - that.element.find( "table button:eq(10)" ).simulate( "mousedown" ); - start(); - }, 50 ); + that.element.calendar( "disable" ); + that.element.find( "table button:eq(10)" ).simulate( "mousedown" ); + setTimeout( start, 50 ); } step1(); From 890510c0a070fb8ceb55b97c71015ce246e178ab Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Wed, 12 Oct 2016 01:23:24 +0200 Subject: [PATCH 12/17] Calendar tests: Use assert.expect instead of global expect --- tests/unit/calendar/core.js | 12 ++++++------ tests/unit/calendar/events.js | 8 ++++---- tests/unit/calendar/methods.js | 16 ++++++++-------- tests/unit/calendar/options.js | 24 ++++++++++++------------ tests/unit/datepicker/core.js | 20 ++++++++++---------- tests/unit/datepicker/events.js | 20 ++++++++++---------- tests/unit/datepicker/methods.js | 24 ++++++++++++------------ tests/unit/datepicker/options.js | 24 ++++++++++++------------ 8 files changed, 74 insertions(+), 74 deletions(-) diff --git a/tests/unit/calendar/core.js b/tests/unit/calendar/core.js index 5cc78c42375..97f8a43b713 100644 --- a/tests/unit/calendar/core.js +++ b/tests/unit/calendar/core.js @@ -14,8 +14,8 @@ module( "calendar: core", { } } ); -test( "base structure", function() { - expect( 28 ); +test( "base structure", function( assert ) { + assert.expect( 28 ); var that = this, buttons, header, title, table, thead, week, child, buttonpane; @@ -90,8 +90,8 @@ test( "base structure", function() { step1(); } ); -test( "Localization", function() { - expect( 10 ); +test( "Localization", function( assert ) { + assert.expect( 10 ); var that = this, date = new Date( 2014, 0, 1 ), @@ -142,7 +142,7 @@ test( "Localization", function() { } ); asyncTest( "keyboard handling", function( assert ) { - expect( 10 ); + assert.expect( 10 ); var that = this; @@ -313,7 +313,7 @@ asyncTest( "keyboard handling", function( assert ) { } ); asyncTest( "mouse", function( assert ) { - expect( 6 ); + assert.expect( 6 ); var that = this, date = new Date(); diff --git a/tests/unit/calendar/events.js b/tests/unit/calendar/events.js index fef9d6bf5e5..87df2d8e041 100644 --- a/tests/unit/calendar/events.js +++ b/tests/unit/calendar/events.js @@ -10,8 +10,8 @@ module( "calendar: events", { } } ); -test( "change", function() { - expect( 6 ); +test( "change", function( assert ) { + assert.expect( 6 ); var shouldFire, eventType; @@ -46,8 +46,8 @@ test( "change", function() { this.element.find( "tbody button" ).first().simulate( eventType ); } ); -asyncTest( "select", function() { - expect( 6 ); +asyncTest( "select", function( assert ) { + assert.expect( 6 ); var that = this, message, eventType; diff --git a/tests/unit/calendar/methods.js b/tests/unit/calendar/methods.js index 77c2c8ce504..c66f146b9f2 100644 --- a/tests/unit/calendar/methods.js +++ b/tests/unit/calendar/methods.js @@ -14,7 +14,7 @@ module( "calendar: methods", { } ); test( "destroy", function( assert ) { - expect( 1 ); + assert.expect( 1 ); var div = $( "
" ).appendTo( "#qunit-fixture" ); @@ -23,8 +23,8 @@ test( "destroy", function( assert ) { } ); } ); -test( "enable / disable", function() { - expect( 8 ); +test( "enable / disable", function( assert ) { + assert.expect( 8 ); this.element.calendar( "disable" ); ok( this.element.calendar( "option", "disabled" ), "disabled option is set" ); @@ -39,14 +39,14 @@ test( "enable / disable", function() { equal( this.element.attr( "aria-disabled" ), "false", "no longer has ARIA disabled" ); } ); -test( "widget", function() { - expect( 1 ); +test( "widget", function( assert ) { + assert.expect( 1 ); strictEqual( this.widget[ 0 ], this.element[ 0 ] ); } ); -test( "value", function() { - expect( 3 ); +test( "value", function( assert ) { + assert.expect( 3 ); this.element.calendar( "value", "1/1/14" ); ok( this.element.find( "button[data-timestamp]:first" ) @@ -60,7 +60,7 @@ test( "value", function() { } ); test( "valueAsDate", function( assert ) { - expect( 11 ); + assert.expect( 11 ); var minDate, maxDate, dateAndTimeToSet, dateAndTimeClone, date1 = new Date( 2008, 6 - 1, 4 ), diff --git a/tests/unit/calendar/options.js b/tests/unit/calendar/options.js index 9fb49b362a4..3cce60ac702 100644 --- a/tests/unit/calendar/options.js +++ b/tests/unit/calendar/options.js @@ -13,8 +13,8 @@ module( "calendar: options", { } } ); -test( "buttons", function() { - expect( 21 ); +test( "buttons", function( assert ) { + assert.expect( 21 ); var button, i, newButtons, that = this, @@ -86,8 +86,8 @@ test( "buttons", function() { equal( this.element.hasClass( "ui-calendar-buttons" ), false, "calendar element removes class about having buttons" ); } ); -test( "buttons - advanced", function() { - expect( 7 ); +test( "buttons - advanced", function( assert ) { + assert.expect( 7 ); var that = this, buttons; @@ -115,8 +115,8 @@ test( "buttons - advanced", function() { buttons.click(); } ); -test( "dateFormat", function() { - expect( 2 ); +test( "dateFormat", function( assert ) { + assert.expect( 2 ); this.element.calendar( "value", "1/1/14" ); @@ -127,8 +127,8 @@ test( "dateFormat", function() { equal( this.element.calendar( "value" ), "Wednesday, January 1, 2014", "updated formatting" ); } ); -test( "eachDay", function() { - expect( 5 ); +test( "eachDay", function( assert ) { + assert.expect( 5 ); var timestamp, firstCell = this.widget.find( "td[id]:first" ); @@ -187,7 +187,7 @@ test( "showWeek", function() { } ); test( "min / max", function( assert ) { - expect( 17 ); + assert.expect( 17 ); // With existing date var prevButton = this.widget.find( ".ui-calendar-prev" ), @@ -264,8 +264,8 @@ test( "min / max", function( assert ) { ok( !prevButton.hasClass( "ui-state-disabled" ), "Other year below min: Prev button enabled after click" ); } ); -test( "numberOfMonths", function() { - expect( 6 ); +test( "numberOfMonths", function( assert ) { + assert.expect( 6 ); var date = new Date( 2015, 8 - 1, 1 ); @@ -311,7 +311,7 @@ test( "numberOfMonths", function() { } ); test( "value", function( assert ) { - expect( 4 ); + assert.expect( 4 ); var date = new Date( 2016, 5 - 1, 23 ); diff --git a/tests/unit/datepicker/core.js b/tests/unit/datepicker/core.js index 46f2a1989ae..88e327b8b28 100644 --- a/tests/unit/datepicker/core.js +++ b/tests/unit/datepicker/core.js @@ -13,8 +13,8 @@ module( "datepicker: core", { } } ); -test( "input's value determines starting date", function() { - expect( 3 ); +test( "input's value determines starting date", function( assert ) { + assert.expect( 3 ); this.element = $( "" ).appendTo( "#qunit-fixture" ); this.element.val( "1/1/14" ).datepicker(); @@ -27,8 +27,8 @@ test( "input's value determines starting date", function() { equal( this.widget.find( ".ui-state-active" ).html(), "1", "correct day highlighted" ); } ); -asyncTest( "base structure", function() { - expect( 5 ); +asyncTest( "base structure", function( assert ) { + assert.expect( 5 ); var that = this; @@ -46,8 +46,8 @@ asyncTest( "base structure", function() { }, 50 ); } ); -asyncTest( "Keyboard handling: focus", function() { - expect( 2 ); +asyncTest( "Keyboard handling: focus", function( assert ) { + assert.expect( 2 ); var that = this; @@ -60,8 +60,8 @@ asyncTest( "Keyboard handling: focus", function() { }, 100 ); } ); -asyncTest( "Keyboard handling: keystroke up", function() { - expect( 2 ); +asyncTest( "Keyboard handling: keystroke up", function( assert ) { + assert.expect( 2 ); var that = this; @@ -75,7 +75,7 @@ asyncTest( "Keyboard handling: keystroke up", function() { } ); test( "Keyboard handling: input", function( assert ) { - expect( 6 ); + assert.expect( 6 ); var that = this, instance = that.element.datepicker( "instance" ); @@ -125,7 +125,7 @@ test( "ARIA", function() { } ); asyncTest( "mouse", function( assert ) { - expect( 4 ); + assert.expect( 4 ); var that = this; diff --git a/tests/unit/datepicker/events.js b/tests/unit/datepicker/events.js index 394a94d68d3..cf10020843b 100644 --- a/tests/unit/datepicker/events.js +++ b/tests/unit/datepicker/events.js @@ -13,8 +13,8 @@ module( "datepicker: events", { } } ); -test( "beforeOpen", function() { - expect( 3 ); +test( "beforeOpen", function( assert ) { + assert.expect( 3 ); var that = this; @@ -42,8 +42,8 @@ test( "beforeOpen", function() { .datepicker( "open" ); } ); -test( "change", function() { - expect( 4 ); +test( "change", function( assert ) { + assert.expect( 4 ); var shouldFire; @@ -71,8 +71,8 @@ test( "change", function() { this.widget.find( "tbody button" ).eq( 2 ).simulate( "mousedown" ); } ); -test( "close", function() { - expect( 4 ); +test( "close", function( assert ) { + assert.expect( 4 ); var shouldFire; @@ -103,8 +103,8 @@ test( "close", function() { this.widget.find( "tbody tr:first button:first" ).simulate( "mousedown" ); } ); -test( "open", function() { - expect( 2 ); +test( "open", function( assert ) { + assert.expect( 2 ); var that = this; @@ -118,8 +118,8 @@ test( "open", function() { this.element.datepicker( "open" ); } ); -asyncTest( "select", function() { - expect( 4 ); +asyncTest( "select", function( assert ) { + assert.expect( 4 ); var message = "", that = this; diff --git a/tests/unit/datepicker/methods.js b/tests/unit/datepicker/methods.js index 3ce1468610c..2e9b94dadf7 100644 --- a/tests/unit/datepicker/methods.js +++ b/tests/unit/datepicker/methods.js @@ -14,7 +14,7 @@ module( "datepicker: methods", { } ); test( "destroy", function( assert ) { - expect( 3 ); + assert.expect( 3 ); var input = $( "" ).appendTo( "#qunit-fixture" ); @@ -26,8 +26,8 @@ test( "destroy", function( assert ) { } ); } ); -test( "enable / disable", function() { - expect( 10 ); +test( "enable / disable", function( assert ) { + assert.expect( 10 ); this.element.datepicker( "disable" ); ok( this.element.datepicker( "option", "disabled" ), "disabled option is set" ); @@ -44,15 +44,15 @@ test( "enable / disable", function() { equal( this.element.attr( "disabled" ), undefined, "input no longer disabled" ); } ); -test( "widget", function() { - expect( 1 ); +test( "widget", function( assert ) { + assert.expect( 1 ); deepEqual( $( "body > .ui-front" )[ 0 ], this.widget[ 0 ] ); this.widget.remove(); } ); -test( "open / close", function() { - expect( 7 ); +test( "open / close", function( assert ) { + assert.expect( 7 ); ok( this.widget.is( ":hidden" ), "calendar hidden on init" ); @@ -67,8 +67,8 @@ test( "open / close", function() { equal( this.widget.attr( "aria-expanded" ), "false", "close: calendar aria-expanded" ); } ); -test( "value", function() { - expect( 4 ); +test( "value", function( assert ) { + assert.expect( 4 ); this.element.datepicker( "value", "1/1/14" ); equal( this.element.val(), "1/1/14", "input's value set" ); @@ -85,7 +85,7 @@ test( "value", function() { } ); test( "valueAsDate", function( assert ) { - expect( 5 ); + assert.expect( 5 ); strictEqual( this.element.datepicker( "valueAsDate" ), null, "Default" ); @@ -101,8 +101,8 @@ test( "valueAsDate", function( assert ) { equal( this.element.datepicker( "valueAsDate" ), null, "Invalid dates return null" ); } ); -test( "isValid", function() { - expect( 2 ); +test( "isValid", function( assert ) { + assert.expect( 2 ); this.element.val( "1/1/14" ); ok( this.element.datepicker( "isValid" ) ); diff --git a/tests/unit/datepicker/options.js b/tests/unit/datepicker/options.js index e5b142acc5a..b6e0cb13eae 100644 --- a/tests/unit/datepicker/options.js +++ b/tests/unit/datepicker/options.js @@ -13,8 +13,8 @@ module( "datepicker: options", { } } ); -test( "appendTo", function() { - expect( 6 ); +test( "appendTo", function( assert ) { + assert.expect( 6 ); var container = this.widget.parent()[ 0 ], detached = $( "
" ); @@ -49,7 +49,7 @@ test( "appendTo", function() { } ); test( "min / max", function( assert ) { - expect( 10 ); + assert.expect( 10 ); var min, max; @@ -87,8 +87,8 @@ test( "min / max", function( assert ) { } ); -test( "Pass-through options", function() { - expect( 11 ); +test( "Pass-through options", function( assert ) { + assert.expect( 11 ); var options = { buttons: { "Test": $.noop }, @@ -124,7 +124,7 @@ test( "Pass-through options", function() { } ); asyncTest( "position", function( assert ) { - expect( 3 ); + assert.expect( 3 ); var input = $( "" ).datepicker().appendTo( "body" ).css( { position: "absolute", @@ -152,8 +152,8 @@ asyncTest( "position", function( assert ) { } ); } ); -test( "Stop datepicker from appearing with beforeOpen event handler - nothing", function() { - expect( 1 ); +test( "Stop datepicker from appearing with beforeOpen event handler - nothing", function( assert ) { + assert.expect( 1 ); this.element.datepicker( { beforeOpen: function() {} @@ -163,8 +163,8 @@ test( "Stop datepicker from appearing with beforeOpen event handler - nothing", ok( this.element.datepicker( "widget" ).is( ":visible" ), "beforeOpen returns nothing" ); } ); -test( "Stop datepicker from appearing with beforeOpen event handler - true", function() { - expect( 1 ); +test( "Stop datepicker from appearing with beforeOpen event handler - true", function( assert ) { + assert.expect( 1 ); this.element.datepicker( { beforeOpen: function() { @@ -175,8 +175,8 @@ test( "Stop datepicker from appearing with beforeOpen event handler - true", fun ok( this.element.datepicker( "widget" ).is( ":visible" ), "beforeOpen returns true" ); } ); -test( "Stop datepicker from appearing with beforeOpen event handler - false", function() { - expect( 1 ); +test( "Stop datepicker from appearing with beforeOpen event handler - false", function( assert ) { + assert.expect( 1 ); this.element.datepicker( { beforeOpen: function() { From f64a7a4812ca9af126617a4c362a72f03b2c66e5 Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Wed, 12 Oct 2016 01:31:22 +0200 Subject: [PATCH 13/17] Calendar: Use name space for timestamp data attribute --- tests/unit/calendar/methods.js | 4 ++-- tests/unit/calendar/options.js | 10 +++++++--- tests/unit/datepicker/methods.js | 4 ++-- ui/widgets/calendar.js | 4 ++-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/tests/unit/calendar/methods.js b/tests/unit/calendar/methods.js index c66f146b9f2..c27e80303fc 100644 --- a/tests/unit/calendar/methods.js +++ b/tests/unit/calendar/methods.js @@ -49,7 +49,7 @@ test( "value", function( assert ) { assert.expect( 3 ); this.element.calendar( "value", "1/1/14" ); - ok( this.element.find( "button[data-timestamp]:first" ) + ok( this.element.find( "button[data-ui-calendar-timestamp]:first" ) .hasClass( "ui-state-active" ), "first day marked as selected" ); @@ -67,7 +67,7 @@ test( "valueAsDate", function( assert ) { date2; this.element.calendar( "valueAsDate", new Date( 2014, 0, 1 ) ); - ok( this.element.find( "button[data-timestamp]:first" ) + ok( this.element.find( "button[data-ui-calendar-timestamp]:first" ) .hasClass( "ui-state-active" ), "First day marked as selected" ); diff --git a/tests/unit/calendar/options.js b/tests/unit/calendar/options.js index 3cce60ac702..bd87edb6c49 100644 --- a/tests/unit/calendar/options.js +++ b/tests/unit/calendar/options.js @@ -134,7 +134,7 @@ test( "eachDay", function( assert ) { firstCell = this.widget.find( "td[id]:first" ); equal( firstCell.find( "button" ).length, 1, "days are selectable by default" ); - timestamp = parseInt( firstCell.find( "button" ).attr( "data-timestamp" ), 10 ); + timestamp = parseInt( firstCell.find( "button" ).attr( "data-ui-calendar-timestamp" ), 10 ); equal( new Date( timestamp ).getDate(), 1, "first available day is the 1st by default" ); // Do not render the 1st of the month @@ -144,7 +144,7 @@ test( "eachDay", function( assert ) { } } ); firstCell = this.widget.find( "td[id]:first" ); - timestamp = parseInt( firstCell.find( "button" ).attr( "data-timestamp" ), 10 ); + timestamp = parseInt( firstCell.find( "button" ).attr( "data-ui-calendar-timestamp" ), 10 ); equal( new Date( timestamp ).getDate(), 2, "first available day is the 2nd" ); // Display the 1st of the month but make it not selectable. @@ -319,7 +319,11 @@ test( "value", function( assert ) { this.element.calendar( "option", "value", date ); assert.dateEqual( this.element.calendar( "option", "value" ), date, "Value set" ); - equal( this.widget.find( "table button.ui-state-active" ).data( "timestamp" ), 1463954400000, "Active button timestamp" ); + equal( + this.widget.find( "table button.ui-state-active" ).data( "ui-calendar-timestamp" ), + 1463954400000, + "Active button timestamp" + ); this.element.calendar( "option", "value", "invalid" ); assert.dateEqual( this.element.calendar( "option", "value" ), date, "Value after invalid parameter" ); diff --git a/tests/unit/datepicker/methods.js b/tests/unit/datepicker/methods.js index 2e9b94dadf7..161af1946f2 100644 --- a/tests/unit/datepicker/methods.js +++ b/tests/unit/datepicker/methods.js @@ -75,7 +75,7 @@ test( "value", function( assert ) { this.element.datepicker( "open" ); ok( - this.widget.find( "button[data-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), + this.widget.find( "button[data-ui-calendar-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), "first day marked as selected" ); equal( this.element.datepicker( "value" ), "1/1/14", "getter" ); @@ -92,7 +92,7 @@ test( "valueAsDate", function( assert ) { this.element.datepicker( "valueAsDate", new Date( 2014, 0, 1 ) ); equal( this.element.val(), "1/1/14", "Input's value set" ); ok( - this.widget.find( "button[data-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), + this.widget.find( "button[data-ui-calendar-timestamp]" ).eq( 0 ).hasClass( "ui-state-active" ), "First day marked as selected" ); assert.dateEqual( this.element.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" ); diff --git a/ui/widgets/calendar.js b/ui/widgets/calendar.js index 71f7121664a..ba45c1c847b 100644 --- a/ui/widgets/calendar.js +++ b/ui/widgets/calendar.js @@ -128,7 +128,7 @@ return $.widget( "ui.calendar", { _select: function( event ) { var oldValue = this.options.value ? this.options.value.getTime() : ""; - this._setOption( "value", new Date( $( event.currentTarget ).data( "timestamp" ) ) ); + this._setOption( "value", new Date( $( event.currentTarget ).data( "ui-calendar-timestamp" ) ) ); this._updateDayElement( "ui-state-active" ); // Allow datepicker to handle focus @@ -489,7 +489,7 @@ return $.widget( "ui.calendar", { attributes = " class='" + classes.join( " " ) + "'"; if ( selectable ) { - attributes += " tabindex='-1' data-timestamp='" + day.timestamp + "'"; + attributes += " tabindex='-1' data-ui-calendar-timestamp='" + day.timestamp + "'"; } else { attributes += " disabled='disabled'"; } From bd488f97a434ca54c0e57104ab85d2703444364b Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Wed, 12 Oct 2016 11:36:48 +0200 Subject: [PATCH 14/17] Calendar: Clear value if an invalid input was given --- tests/unit/calendar/methods.js | 18 +++++++++--------- tests/unit/calendar/options.js | 10 +++++----- ui/widgets/calendar.js | 7 ++++--- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/tests/unit/calendar/methods.js b/tests/unit/calendar/methods.js index c27e80303fc..964d6c18684 100644 --- a/tests/unit/calendar/methods.js +++ b/tests/unit/calendar/methods.js @@ -56,7 +56,7 @@ test( "value", function( assert ) { equal( this.element.calendar( "value" ), "1/1/14", "getter" ); this.element.calendar( "value", "abc" ); - equal( this.element.calendar( "value" ), "1/1/14", "Setting invalid values should be ignored." ); + equal( this.element.calendar( "value" ), null, "Setting invalid values." ); } ); test( "valueAsDate", function( assert ) { @@ -95,9 +95,9 @@ test( "valueAsDate", function( assert ) { ); this.element.calendar( "valueAsDate", date1 ); - assert.dateEqual( + equal( this.element.calendar( "valueAsDate" ), - date2, + null, "Set date min/max - value < min" ); @@ -111,25 +111,25 @@ test( "valueAsDate", function( assert ) { ); this.element.calendar( "valueAsDate", date2 ); - assert.dateEqual( + equal( this.element.calendar( "valueAsDate" ), - date1, + null, "Set date min/max - value > max" ); this.element .calendar( "option", { min: minDate } ) .calendar( "valueAsDate", date1 ); - assert.dateEqual( + equal( this.element.calendar( "valueAsDate" ), - date1, + null, "Set date min/max - value < min" ); this.element.calendar( "valueAsDate", date2 ); - assert.dateEqual( + equal( this.element.calendar( "valueAsDate" ), - date1, "Set date min/max - value > max" + null, "Set date min/max - value > max" ); dateAndTimeToSet = new Date( 2008, 3 - 1, 28, 1, 11, 0 ); diff --git a/tests/unit/calendar/options.js b/tests/unit/calendar/options.js index bd87edb6c49..c5bbdbf5ab7 100644 --- a/tests/unit/calendar/options.js +++ b/tests/unit/calendar/options.js @@ -203,7 +203,7 @@ test( "min / max", function( assert ) { this.element .calendar( "option", { min: minDate } ) .calendar( "value", "1/4/08" ); - assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); + equal( this.element.calendar( "valueAsDate" ), null, "Min/max - value < min" ); this.element .calendar( "option", { min: null } ) @@ -214,12 +214,12 @@ test( "min / max", function( assert ) { this.element .calendar( "option", { max: maxDate } ) .calendar( "value", "1/4/09" ); - assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - setDate > max" ); + equal( this.element.calendar( "valueAsDate" ), null, "Min/max - setDate > max" ); this.element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "1/4/08" ); - assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value < min" ); + equal( this.element.calendar( "valueAsDate" ), null, "Min/max - value < min" ); this.element .calendar( "option", { min: minDate, max: maxDate } ) @@ -229,7 +229,7 @@ test( "min / max", function( assert ) { this.element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "1/4/09" ); - assert.dateEqual( this.element.calendar( "valueAsDate" ), new Date( 2008, 6 - 1, 4 ), "Min/max - value > max" ); + equal( this.element.calendar( "valueAsDate" ), null, "Min/max - value > max" ); this.element .calendar( "option", { min: minDate, max: maxDate } ) @@ -326,7 +326,7 @@ test( "value", function( assert ) { ); this.element.calendar( "option", "value", "invalid" ); - assert.dateEqual( this.element.calendar( "option", "value" ), date, "Value after invalid parameter" ); + equal( this.element.calendar( "option", "value" ), null, "Value after invalid parameter" ); } ); /* diff --git a/ui/widgets/calendar.js b/ui/widgets/calendar.js index ba45c1c847b..006332d1bd7 100644 --- a/ui/widgets/calendar.js +++ b/ui/widgets/calendar.js @@ -646,7 +646,8 @@ return $.widget( "ui.calendar", { if ( arguments.length ) { this.valueAsDate( this._parse( value ) ); } else { - return this._format( this.option( "value" ) ); + return this.option( "value" ) === null ? + null : this._format( this.option( "value" ) ); } }, @@ -716,9 +717,9 @@ return $.widget( "ui.calendar", { if ( key === "value" ) { if ( this._isValid( value ) ) { this.date.setTime( value.getTime() ); - this._super( key, value ); + } else { + value = null; } - return; } if ( key === "max" || key === "min" ) { From f010087acae69dff67252236e4159c79124dd30b Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Mon, 24 Oct 2016 22:24:09 +0200 Subject: [PATCH 15/17] Calendar: Clear value if an invalid min / max option value was given --- tests/unit/calendar/options.js | 10 +++++++++- ui/widgets/calendar.js | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/unit/calendar/options.js b/tests/unit/calendar/options.js index c5bbdbf5ab7..ab352c4a038 100644 --- a/tests/unit/calendar/options.js +++ b/tests/unit/calendar/options.js @@ -187,7 +187,7 @@ test( "showWeek", function() { } ); test( "min / max", function( assert ) { - assert.expect( 17 ); + assert.expect( 19 ); // With existing date var prevButton = this.widget.find( ".ui-calendar-prev" ), @@ -231,6 +231,14 @@ test( "min / max", function( assert ) { .calendar( "value", "1/4/09" ); equal( this.element.calendar( "valueAsDate" ), null, "Min/max - value > max" ); + this.element.calendar( "option", { min: minDate } ); + this.element.calendar( "option", { min: "invalid" } ); + equal( this.element.calendar( "option", "min" ), null, "Min/max - invalid" ); + + this.element.calendar( "option", { min: maxDate } ); + this.element.calendar( "option", { max: null } ); + equal( this.element.calendar( "option", "max" ), null, "Min/max - null" ); + this.element .calendar( "option", { min: minDate, max: maxDate } ) .calendar( "value", "3/4/08" ); diff --git a/ui/widgets/calendar.js b/ui/widgets/calendar.js index 006332d1bd7..7e40313e724 100644 --- a/ui/widgets/calendar.js +++ b/ui/widgets/calendar.js @@ -723,7 +723,9 @@ return $.widget( "ui.calendar", { } if ( key === "max" || key === "min" ) { - if ( $.type( value ) === "date" || value === null ) { + if ( $.type( value ) !== "date" || value === null ) { + this._super( key, null ); + } else { this._super( key, value ); } return; From 2c43879a46d41060b68963778388ec582e00fa43 Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Tue, 25 Oct 2016 18:27:31 +0200 Subject: [PATCH 16/17] Datepicker: Use simple split instead of globalize for parsing attributes This reverts commit ea986f2808684c0112d56776d76ea35e9cdb77da. --- Gruntfile.js | 1 - external/localization.js | 47 ++++++++++++++++++---------------------- ui/widgets/datepicker.js | 6 ++++- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 42ea60ca189..fe5806bad82 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -450,7 +450,6 @@ grunt.registerTask( "compile-globalize", function() { globalize.dateParser( { date: "long" } ), globalize.dateFormatter( { date: "full" } ), globalize.dateParser( { date: "full" } ), - globalize.dateParser( { raw: "yyyy-MM-dd" } ), globalize.numberParser() ]); diff --git a/external/localization.js b/external/localization.js index 1518941a956..95bb3bafe15 100644 --- a/external/localization.js +++ b/external/localization.js @@ -45,25 +45,23 @@ Globalize.b2002841143 = numberParserFn(["∞",{".":",",",":".","%":"%","+":"+"," Globalize.a1749351181 = numberParserFn(["∞",{".":",",",":".","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); Globalize.b960923264 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); Globalize.b1965900303 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); -Globalize.b1293124635 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); Globalize.b2076722823 = numberParserFn(["∞",{".":"decimal",",":"group","%":"percentSign","+":"plusSign","-":"minusSign","E":"exponential","‰":"perMille","٫":".","٬":",","٪":"%","‏+":"+","‏-":"-","اس":"E","؉":"‰"},"-","",{"0":"invalid","1":"invalid","2":"invalid","3":"invalid","4":"invalid","5":"invalid","6":"invalid","7":"invalid","8":"invalid","9":"invalid","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9"}]); +Globalize.b1293124635 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); Globalize.a474049536 = numberParserFn(["∞",{".":",",",":".","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); Globalize.b1370229258 = numberParserFn(["∞",{".":".",",":",","%":"%","+":"+","-":"-","E":"E","‰":"‰"},"-","",]); -Globalize.b729298712 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"DO","mon":"LU","tue":"MA","wed":"MI","thu":"JU","fri":"VI","sat":"SA"}}}}); +Globalize.a946274711 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"D","mon":"L","tue":"M","wed":"X","thu":"J","fri":"V","sat":"S"}}}}); +Globalize.b1200480509 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); Globalize.a52764931 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"Sunday","mon":"Monday","tue":"Tuesday","wed":"Wednesday","thu":"Thursday","fri":"Friday","sat":"Saturday"}}}}); -Globalize.b617029686 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":0,"minDays":1}); -Globalize.a1636669180 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"S","mon":"M","tue":"T","wed":"W","thu":"T","fri":"F","sat":"S"}}}}); Globalize.b617625506 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":0}); Globalize.b93641787 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"}),"2":Globalize("en").numberFormatter({"raw":"00"})}, {"pattern":"M/d/yy","timeSeparator":":"}); -Globalize.b801906653 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"Su","mon":"Mo","tue":"Tu","wed":"We","thu":"Th","fri":"Fr","sat":"Sa"}}}}); +Globalize.a1636669180 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"S","mon":"M","tue":"T","wed":"W","thu":"T","fri":"F","sat":"S"}}}}); Globalize.a491609039 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"y年M月d日EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}}}); -Globalize.a1351587010 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"y年M月d日","timeSeparator":":"}); +Globalize.b801906653 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"Su","mon":"Mo","tue":"Tu","wed":"We","thu":"Th","fri":"Fr","sat":"Sa"}}}}); Globalize.a218160295 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"MMMM d, y","timeSeparator":":","months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); -Globalize.a864358539 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"الأحد","mon":"الاثنين","tue":"الثلاثاء","wed":"الأربعاء","thu":"الخميس","fri":"الجمعة","sat":"السبت"}}}}); +Globalize.a1351587010 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"y年M月d日","timeSeparator":":"}); Globalize.b641817676 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, MMMM d, y","timeSeparator":":","days":{"E":{"4":{"sun":"Sunday","mon":"Monday","tue":"Tuesday","wed":"Wednesday","thu":"Thursday","fri":"Friday","sat":"Saturday"}}},"months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); +Globalize.a864358539 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"الأحد","mon":"الاثنين","tue":"الثلاثاء","wed":"الأربعاء","thu":"الخميس","fri":"الجمعة","sat":"السبت"}}}}); Globalize.a682848010 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"y/M/d","timeSeparator":":"}); -Globalize.b285424135 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":0}); -Globalize.b388886901 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}}}); Globalize.b1382770181 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"So.","mon":"Mo.","tue":"Di.","wed":"Mi.","thu":"Do.","fri":"Fr.","sat":"Sa."}}}}); Globalize.b1430109660 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"S","mon":"M","tue":"D","wed":"M","thu":"D","fri":"F","sat":"S"}}}}); Globalize.a1754951899 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"Sonntag","mon":"Montag","tue":"Dienstag","wed":"Mittwoch","thu":"Donnerstag","fri":"Freitag","sat":"Samstag"}}}}); @@ -73,46 +71,43 @@ Globalize.b1252219604 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"r Globalize.b1870116986 = dateFormatterFn({"1":Globalize("de").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":1}); Globalize.b674505315 = dateFormatterFn({"2":Globalize("de").numberFormatter({"raw":"00"})}, {"pattern":"dd.MM.yy","timeSeparator":":"}); Globalize.a1026267252 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"ح","mon":"ن","tue":"ث","wed":"ر","thu":"خ","fri":"ج","sat":"س"}}}}); -Globalize.b284828315 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":0,"minDays":1}); -Globalize.b194087032 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"一月","2":"二月","3":"三月","4":"四月","5":"五月","6":"六月","7":"七月","8":"八月","9":"九月","10":"十月","11":"十一月","12":"十二月"}}}}); +Globalize.b285424135 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":0}); +Globalize.b388886901 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}}}); Globalize.a1446348751 = dateFormatterFn({"1":Globalize("de").numberFormatter({"raw":"0"})}, {"pattern":"d. MMMM y","timeSeparator":":","months":{"M":{"4":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}}}); -Globalize.a1059158408 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}}}); +Globalize.b284828315 = dateFormatterFn({"1":Globalize("zh").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":0,"minDays":1}); Globalize.a586370780 = dateFormatterFn({"1":Globalize("de").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, d. MMMM y","timeSeparator":":","days":{"E":{"4":{"sun":"Sonntag","mon":"Montag","tue":"Dienstag","wed":"Mittwoch","thu":"Donnerstag","fri":"Freitag","sat":"Samstag"}}},"months":{"M":{"4":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}}}); -Globalize.b1524871401 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"日","mon":"一","tue":"二","wed":"三","thu":"四","fri":"五","sat":"六"}}}}); -Globalize.b25416856 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"周日","mon":"周一","tue":"周二","wed":"周三","thu":"周四","fri":"周五","sat":"周六"}}}}); +Globalize.b194087032 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"一月","2":"二月","3":"三月","4":"四月","5":"五月","6":"六月","7":"七月","8":"八月","9":"九月","10":"十月","11":"十一月","12":"十二月"}}}}); Globalize.b392241633 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"d MMMM، y","timeSeparator":":","months":{"M":{"4":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}}}); -Globalize.b1200480509 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}}}); -Globalize.a946274711 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"D","mon":"L","tue":"M","wed":"X","thu":"J","fri":"V","sat":"S"}}}}); +Globalize.b729298712 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"DO","mon":"LU","tue":"MA","wed":"MI","thu":"JU","fri":"VI","sat":"SA"}}}}); +Globalize.b617029686 = dateFormatterFn({"1":Globalize("en").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":0,"minDays":1}); Globalize.b1770621176 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"domingo","mon":"lunes","tue":"martes","wed":"miércoles","thu":"jueves","fri":"viernes","sat":"sábado"}}}}); Globalize.a1271100680 = dateFormatterFn({}, {"pattern":"MMMM","timeSeparator":":","months":{"M":{"4":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}}}); Globalize.a1150144485 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":1,"minDays":4}); -Globalize.b79536830 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":6,"minDays":1}); +Globalize.a1059158408 = dateFormatterFn({}, {"pattern":"EEEE","timeSeparator":":","days":{"E":{"4":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}}}); Globalize.a1149548665 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":1}); Globalize.b21033846 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"}),"2":Globalize("es").numberFormatter({"raw":"00"})}, {"pattern":"d/M/yy","timeSeparator":":"}); Globalize.b1836232371 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"d‏/M‏/y","timeSeparator":":"}); -Globalize.b1332212145 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, d 'de' MMMM 'de' y","timeSeparator":":","days":{"E":{"4":{"sun":"domingo","mon":"lunes","tue":"martes","wed":"miércoles","thu":"jueves","fri":"viernes","sat":"sábado"}}},"months":{"M":{"4":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}}}); +Globalize.b1524871401 = dateFormatterFn({}, {"pattern":"EEEEE","timeSeparator":":","days":{"E":{"5":{"sun":"日","mon":"一","tue":"二","wed":"三","thu":"四","fri":"五","sat":"六"}}}}); Globalize.b80132650 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"c","timeSeparator":":","firstDay":6}); Globalize.b472234174 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"d 'de' MMMM 'de' y","timeSeparator":":","months":{"M":{"4":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}}}); +Globalize.b25416856 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"周日","mon":"周一","tue":"周二","wed":"周三","thu":"周四","fri":"周五","sat":"周六"}}}}); +Globalize.b1332212145 = dateFormatterFn({"1":Globalize("es").numberFormatter({"raw":"0"})}, {"pattern":"EEEE, d 'de' MMMM 'de' y","timeSeparator":":","days":{"E":{"4":{"sun":"domingo","mon":"lunes","tue":"martes","wed":"miércoles","thu":"jueves","fri":"viernes","sat":"sábado"}}},"months":{"M":{"4":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}}}); +Globalize.b79536830 = dateFormatterFn({"1":Globalize("ar").numberFormatter({"raw":"0"})}, {"pattern":"w","timeSeparator":":","firstDay":6,"minDays":1}); Globalize.a1750470059 = dateFormatterFn({}, {"pattern":"EEEEEE","timeSeparator":":","days":{"E":{"6":{"sun":"الأحد","mon":"الاثنين","tue":"الثلاثاء","wed":"الأربعاء","thu":"الخميس","fri":"الجمعة","sat":"السبت"}}}}); -Globalize.b1518991631 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d 'de' MMMM 'de' y","timeSeparator":":","gregorian/months/format/wide":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}); Globalize.a1915997694 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"EEEE, d 'de' MMMM 'de' y","timeSeparator":":","gregorian/days/format/wide":{"sun":"domingo","mon":"lunes","tue":"martes","wed":"miércoles","thu":"jueves","fri":"viernes","sat":"sábado"},"gregorian/months/format/wide":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}); -Globalize.b82385031 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); +Globalize.a1889223355 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d/M/yy","timeSeparator":":"}); Globalize.a74024830 = dateParserFn(Globalize("ar").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"d‏/M‏/y","timeSeparator":":"}); -Globalize.b262211828 = dateParserFn(Globalize("de").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); Globalize.b460386677 = dateParserFn(Globalize("de").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"EEEE, d. MMMM y","timeSeparator":":","gregorian/days/format/wide":{"sun":"Sonntag","mon":"Montag","tue":"Dienstag","wed":"Mittwoch","thu":"Donnerstag","fri":"Freitag","sat":"Samstag"},"gregorian/months/format/wide":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}); Globalize.a399591294 = dateParserFn(Globalize("de").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d. MMMM y","timeSeparator":":","gregorian/months/format/wide":{"1":"Januar","2":"Februar","3":"März","4":"April","5":"Mai","6":"Juni","7":"Juli","8":"August","9":"September","10":"Oktober","11":"November","12":"Dezember"}}); Globalize.b1438999090 = dateParserFn(Globalize("ar").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"d MMMM، y","timeSeparator":":","gregorian/months/format/wide":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}); Globalize.a1235751886 = dateParserFn(Globalize("de").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"dd.MM.yy","timeSeparator":":"}); -Globalize.a1889223355 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d/M/yy","timeSeparator":":"}); -Globalize.b2011240140 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); -Globalize.b1688575133 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"EEEE, MMMM d, y","timeSeparator":":","gregorian/days/format/wide":{"sun":"Sunday","mon":"Monday","tue":"Tuesday","wed":"Wednesday","thu":"Thursday","fri":"Friday","sat":"Saturday"},"gregorian/months/format/wide":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}); +Globalize.b1518991631 = dateParserFn(Globalize("es").numberParser({"raw":"0"}), {"preferredTimeData":"H"}, {"pattern":"d 'de' MMMM 'de' y","timeSeparator":":","gregorian/months/format/wide":{"1":"enero","2":"febrero","3":"marzo","4":"abril","5":"mayo","6":"junio","7":"julio","8":"agosto","9":"septiembre","10":"octubre","11":"noviembre","12":"diciembre"}}); Globalize.b1701862085 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"y/M/d","timeSeparator":":"}); +Globalize.b1688575133 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"EEEE, MMMM d, y","timeSeparator":":","gregorian/days/format/wide":{"sun":"Sunday","mon":"Monday","tue":"Tuesday","wed":"Wednesday","thu":"Thursday","fri":"Friday","sat":"Saturday"},"gregorian/months/format/wide":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}); Globalize.b828597162 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"MMMM d, y","timeSeparator":":","gregorian/months/format/wide":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"}}); -Globalize.b1059122500 = dateParserFn(Globalize("ar").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); Globalize.a304829553 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"y年M月d日","timeSeparator":":"}); Globalize.a1816615414 = dateParserFn(Globalize("en").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"M/d/yy","timeSeparator":":"}); Globalize.b555148418 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"y年M月d日EEEE","timeSeparator":":","gregorian/days/format/wide":{"sun":"星期日","mon":"星期一","tue":"星期二","wed":"星期三","thu":"星期四","fri":"星期五","sat":"星期六"}}); -Globalize.a1997933049 = dateParserFn(Globalize("zh").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"yyyy-MM-dd","timeSeparator":":"}); Globalize.a1995990235 = dateParserFn(Globalize("ar").numberParser({"raw":"0"}), {"preferredTimeData":"h"}, {"pattern":"EEEE، d MMMM، y","timeSeparator":":","gregorian/days/format/wide":{"sun":"الأحد","mon":"الاثنين","tue":"الثلاثاء","wed":"الأربعاء","thu":"الخميس","fri":"الجمعة","sat":"السبت"},"gregorian/months/format/wide":{"1":"يناير","2":"فبراير","3":"مارس","4":"أبريل","5":"مايو","6":"يونيو","7":"يوليو","8":"أغسطس","9":"سبتمبر","10":"أكتوبر","11":"نوفمبر","12":"ديسمبر"}}); return Globalize; diff --git a/ui/widgets/datepicker.js b/ui/widgets/datepicker.js index e2e9037e834..6e1f5be737e 100644 --- a/ui/widgets/datepicker.js +++ b/ui/widgets/datepicker.js @@ -81,7 +81,11 @@ var widget = $.widget( "ui.datepicker", { _getCreateOptions: function() { var max = this.element.attr( "max" ), min = this.element.attr( "min" ), - parser = new Globalize( "en" ).dateParser( { raw: "yyyy-MM-dd" } ), + parser = function( value ) { + var exploded = value.split( "-" ); + + return new Date( exploded[ 0 ], exploded[ 1 ] - 1, exploded[ 2 ] ); + }, options = {}; if ( max !== undefined ) { From 68028e7262a14463b71539f4e3bca689e49acf33 Mon Sep 17 00:00:00 2001 From: Felix Nagel Date: Sun, 30 Oct 2016 00:54:34 +0200 Subject: [PATCH 17/17] Calendar tests: use dateEqual assert instead of timestamp compare Fix travis unit test issue due to timezone difference. --- tests/unit/calendar/options.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/calendar/options.js b/tests/unit/calendar/options.js index ab352c4a038..0afbfaf69cf 100644 --- a/tests/unit/calendar/options.js +++ b/tests/unit/calendar/options.js @@ -327,9 +327,9 @@ test( "value", function( assert ) { this.element.calendar( "option", "value", date ); assert.dateEqual( this.element.calendar( "option", "value" ), date, "Value set" ); - equal( - this.widget.find( "table button.ui-state-active" ).data( "ui-calendar-timestamp" ), - 1463954400000, + assert.dateEqual( + new Date( this.widget.find( "table button.ui-state-active" ).data( "ui-calendar-timestamp" ) ), + new Date( 1463972400000 ), "Active button timestamp" );