initial import

This commit is contained in:
2020-12-23 10:11:11 +01:00
commit be83b43a59
5600 changed files with 577973 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
module('Calendar Weeks', {
setup: function(){
this.input = $('<input type="text">')
.appendTo('#qunit-fixture')
.val('2013-01-14')
.datepicker({
format: 'yyyy-mm-dd',
calendarWeeks: true
})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('adds cw header column', function(){
var target = this.picker.find('.datepicker-days thead tr:nth-child(3) th:first-child');
ok(target.hasClass('cw'), 'First column heading is from cw column');
});
test('adds calendar week cells to each day row', function(){
var target = this.picker.find('.datepicker-days tbody tr');
expect(target.length);
target.each(function(i){
var t = $(this).children().first();
ok(t.hasClass('cw'), "First column is cw column");
});
});
test('displays correct calendar week', function(){
var target = this.picker.find('.datepicker-days tbody tr');
expect(target.length);
target.each(function(i){
var t = $(this).children().first();
equal(t.text(), i+1, "Displays correct calendar weeks");
});
});
test('it prepends column to switcher thead row', function(){
var target = this.picker.find('.datepicker-days thead tr:nth-child(2)');
equal(target.children().length, 3, 'first row has 3 columns');
ok(!target.children().first().hasClass('cw'), 'cw column is not prepended');
});

View File

@@ -0,0 +1,274 @@
module('Component', {
setup: function(){
this.fieldset = $('<fieldset>' +
'<div class="input-append date" id="datepicker">'+
'<input size="16" type="text" value="12-02-2012" readonly>'+
'<span class="add-on"><i class="icon-th"></i></span>'+
'</div>' +
'<fieldset>')
.appendTo('#qunit-fixture');
this.component = this.fieldset.find('.input-append')
.datepicker({format: "dd-mm-yyyy"});
this.input = this.component.find('input');
this.addon = this.component.find('.add-on');
this.dp = this.component.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Component gets date/viewDate from input value', function(){
datesEqual(this.dp.getUTCDate(), UTCDate(2012, 1, 12));
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 12));
});
test('Activation by component', function(){
ok(!this.picker.is(':visible'));
this.addon.click();
ok(this.picker.is(':visible'));
});
test('Dont activation (by disabled) by component', function(){
ok(!this.picker.is(':visible'));
this.input.prop('disabled', true);
this.addon.click();
ok(!this.picker.is(':visible'));
this.input.prop('disabled', false);
this.fieldset.prop('disabled', true);
this.addon.click();
ok(!this.picker.is(':visible'));
});
test('simple keyboard nav test', function(){
var target;
// Keyboard nav only works with non-readonly inputs
this.input.removeAttr('readonly');
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2012', 'Title is "February 2012"');
datesEqual(this.dp.getUTCDate(), UTCDate(2012, 1, 12));
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 12));
// Focus/open
this.addon.click();
// Navigation: -1 day, left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37
});
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 11));
datesEqual(this.dp.getUTCDate(), UTCDate(2012, 1, 12));
datesEqual(this.dp.focusDate, UTCDate(2012, 1, 11));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2012', 'Title is "February 2012"');
// Navigation: +1 month, shift + right arrow key
this.input.trigger({
type: 'keydown',
keyCode: 39,
shiftKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 11));
datesEqual(this.dp.getUTCDate(), UTCDate(2012, 1, 12));
datesEqual(this.dp.focusDate, UTCDate(2012, 2, 11));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 year, ctrl + left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37,
ctrlKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 11));
datesEqual(this.dp.getUTCDate(), UTCDate(2012, 1, 12));
datesEqual(this.dp.focusDate, UTCDate(2011, 2, 11));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
});
test('setValue', function(){
this.dp.dates.replace(UTCDate(2012, 2, 13));
this.dp.setValue();
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 13));
equal(this.input.val(), '13-03-2012');
});
test('update', function(){
this.input.val('13-03-2012');
this.dp.update();
equal(this.dp.dates.length, 1);
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 13));
});
test('Navigating to/from decade view', function(){
var target;
this.addon.click();
this.input.val('31-03-2012');
this.dp.update();
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 31));
target = this.picker.find('.datepicker-months thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-years').is(':visible'), 'Year picker is visible');
equal(this.dp.viewMode, 2);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 31));
// Change years to test internal state changes
target = this.picker.find('.datepicker-years tbody span:contains(2011)');
target.click();
equal(this.dp.viewMode, 1);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 1));
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 31));
target = this.picker.find('.datepicker-months tbody span:contains(Apr)');
target.click();
equal(this.dp.viewMode, 0);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 3, 1));
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 31));
});
test('Selecting date resets viewDate and date', function(){
var target;
this.addon.click();
this.input.val('31-03-2012');
this.dp.update();
// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '26'); // Should be Feb 26
// Updated internally on click
target.click();
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 26));
datesEqual(this.dp.dates[0], UTCDate(2012, 1, 26));
// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '29'); // Should be Jan 29
});
test('"destroy" removes associated HTML', function(){
var datepickerDivSelector = '.datepicker';
$('#datepicker').datepicker('show');
//there should be one datepicker initiated so that means one hidden .datepicker div
equal($(datepickerDivSelector).length, 1);
this.component.datepicker('destroy');
equal($(datepickerDivSelector).length, 0);//hidden HTML should be gone
});
test('"remove" is an alias for "destroy"', function(){
var called, originalDestroy = this.dp.destroy;
this.dp.destroy = function () {
called = true;
return originalDestroy.apply(this, arguments);
};
this.dp.remove();
ok(called);
});
test('Does not block events', function(){
var clicks = 0;
function handler(){
clicks++;
}
$('#qunit-fixture').on('click', '.add-on', handler);
this.addon.click();
equal(clicks, 1);
$('#qunit-fixture').off('click', '.add-on', handler);
});
test('date and viewDate must be between startDate and endDate when setStartDate called', function() {
this.dp.setDate(new Date(2013, 1, 1));
datesEqual(this.dp.dates[0], UTCDate(2013, 1, 1));
datesEqual(this.dp.viewDate, UTCDate(2013, 1, 1));
this.dp.setStartDate(new Date(2013, 5, 6));
datesEqual(this.dp.viewDate, UTCDate(2013, 5, 6));
equal(this.dp.dates.length, 0);
});
test('date and viewDate must be between startDate and endDate when setEndDate called', function() {
this.dp.setDate(new Date(2013, 11, 1));
datesEqual(this.dp.dates[0], UTCDate(2013, 11, 1));
datesEqual(this.dp.viewDate, UTCDate(2013, 11, 1));
this.dp.setEndDate(new Date(2013, 5, 6));
datesEqual(this.dp.viewDate, UTCDate(2013, 5, 6));
equal(this.dp.dates.length, 0);
});
test('picker should render fine when `$.fn.show` and `$.fn.hide` are overridden', patch_show_hide(function () {
var viewModes = $.fn.datepicker.DPGlobal.viewModes,
minViewMode = this.dp.o.minViewMode,
maxViewMode = this.dp.o.maxViewMode,
childDivs = this.picker.children('div');
this.dp.setViewMode(minViewMode);
// Overwritten `$.fn.hide` method adds the `foo` class to its matched elements
var curDivShowing = childDivs.filter('.datepicker-' + viewModes[minViewMode].clsName);
ok(!curDivShowing.hasClass('foo'), 'Shown div does not have overridden `$.fn.hide` side-effects');
// Check that other classes do have `foo` class
var divNotShown;
for (var curViewMode = minViewMode + 1; curViewMode <= maxViewMode; curViewMode++) {
divNotShown = childDivs.filter('.datepicker-' + viewModes[curViewMode].clsName);
ok(divNotShown.hasClass('foo'), 'Other divs do have overridden `$.fn.hide` side-effects');
}
}));
test('Focused ceil for decade/century/millenium views', function(){
var input = $('<input />')
.appendTo('#qunit-fixture')
.datepicker({
startView: 2,
defaultViewDate: {
year: 2115
}
}),
dp = input.data('datepicker'),
picker = dp.picker,
target;
input.focus();
target = picker.find('.datepicker-years tbody .focused');
ok(target.text() === '2115', 'Year cell is focused');
picker.find('.datepicker-years thead th.datepicker-switch').click();
target = picker.find('.datepicker-decades tbody .focused');
ok(target.text() === '2110', 'Decade cell is focused');
picker.find('.datepicker-decades thead th.datepicker-switch').click();
target = picker.find('.datepicker-centuries tbody .focused');
ok(target.text() === '2100', 'Century cell is focused');
});

View File

@@ -0,0 +1,114 @@
module('DATA-API');
test('DATA-API: data-provide="datepicker" on input; focus', function(){
var input = $('<input data-provide="datepicker" />')
.appendTo('#qunit-fixture');
input.focus();
ok(input.data('datepicker'), 'datepicker is initialized by "focus" event');
});
test('DATA-API: data-provide="datepicker" on input; click', function(){
var input = $('<input data-provide="datepicker" />')
.appendTo('#qunit-fixture');
input.click();
ok(input.data('datepicker'), 'datepicker is initialized by "focus" event');
});
test('DATA-API: data-provide="datepicker" on component', function(){
var html, comp;
html = '<div class="input-append date" data-provide="datepicker">'+
'<input><span class="add-on"><i class="icon-th"></i></span>'+
'</div>';
comp = $(html).appendTo('#qunit-fixture');
comp.find('input').focus();
ok(comp.data('datepicker'), 'append component initialized by "focus" event on input');
comp.remove();
comp = $(html).appendTo('#qunit-fixture');
comp.find('input').click();
ok(comp.data('datepicker'), 'append component initialized by "click" event on input');
comp.remove();
comp = $(html).appendTo('#qunit-fixture');
comp.find('.add-on').focus();
ok(comp.data('datepicker'), 'append component initialized by "focus" event on add-on');
comp.remove();
comp = $(html).appendTo('#qunit-fixture');
comp.find('.add-on').click();
ok(comp.data('datepicker'), 'append component initialized by "click" event on add-on');
comp.remove();
html = '<div class="input-prepend date" data-provide="datepicker">'+
'<span class="add-on"><i class="icon-th"></i></span><input>'+
'</div>';
comp = $(html).prependTo('#qunit-fixture');
comp.find('input').focus();
ok(comp.data('datepicker'), 'prepend component initialized by "focus" event on input');
comp.remove();
comp = $(html).prependTo('#qunit-fixture');
comp.find('input').click();
ok(comp.data('datepicker'), 'prepend component initialized by "click" event on input');
comp.remove();
comp = $(html).prependTo('#qunit-fixture');
comp.find('.add-on').focus();
ok(comp.data('datepicker'), 'prepend component initialized by "focus" event on add-on');
comp.remove();
comp = $(html).prependTo('#qunit-fixture');
comp.find('.add-on').click();
ok(comp.data('datepicker'), 'prepend component initialized by "click" event on add-on');
comp.remove();
});
test('DATA-API: data-provide="datepicker" on button', function(){
var html, comp;
html = '<button data-provide="datepicker">';
comp = $(html).appendTo('#qunit-fixture');
comp.focus();
ok(comp.data('datepicker'), 'button initialized by "focus" event on input');
comp.remove();
comp = $(html).appendTo('#qunit-fixture');
comp.click();
ok(comp.data('datepicker'), 'button initialized by "click" event on input');
comp.remove();
});
test('DATA-API: data-provide="datepicker" on rangepicker', function(){
var html, comp;
html = '<div class="input-daterange" data-provide="datepicker">'+
'<input class="datepicker">'+
'<span class="add-on">to</span>'+
'<input class="datepicker">'+
'</div>';
comp = $(html).appendTo('#qunit-fixture');
comp.find('input:first').focus();
ok(comp.data('datepicker'), 'range initialized by "focus" event on first input');
comp.remove();
comp = $(html).appendTo('#qunit-fixture');
comp.find('input:first').click();
ok(comp.data('datepicker'), 'range initialized by "click" event on first input');
comp.remove();
comp = $(html).appendTo('#qunit-fixture');
comp.find('input:last').focus();
ok(comp.data('datepicker'), 'range initialized by "focus" event on last input');
comp.remove();
comp = $(html).appendTo('#qunit-fixture');
comp.find('input:last').click();
ok(comp.data('datepicker'), 'range initialized by "click" event on last input');
comp.remove();
});

View File

@@ -0,0 +1,507 @@
module('Events on initialization', {
setup: function(){
this.input = $('<input type="text" value="31-03-2011">')
.appendTo('#qunit-fixture')
}
});
test('When initializing the datepicker, it should trigger no change or changeDate events', function(){
var triggered_change = 0,
triggered_changeDate = 0;
this.input.on({
change: function(){
triggered_change++;
},
changeDate: function(){
triggered_changeDate++;
}
});
this.input.datepicker({format: 'dd-mm-yyyy'});
equal(triggered_change, 0);
equal(triggered_changeDate, 0);
});
module('Events', {
setup: function(){
this.input = $('<input type="text" value="31-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Selecting a year from decade view triggers changeYear', function(){
var target,
triggered = 0;
this.input.on('changeYear', function(){
triggered++;
});
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates[0], UTCDate(2011, 2, 31));
target = this.picker.find('.datepicker-months thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-years').is(':visible'), 'Year picker is visible');
equal(this.dp.viewMode, 2);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates[0], UTCDate(2011, 2, 31));
// Change years to test internal state changes
target = this.picker.find('.datepicker-years tbody span:contains(2010)');
target.click();
equal(this.dp.viewMode, 1);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2010, 2, 1));
datesEqual(this.dp.dates[0], UTCDate(2011, 2, 31));
equal(triggered, 1);
});
test('Navigating forward/backward from month view triggers changeYear', function(){
var target,
triggered = 0;
this.input.on('changeYear', function(){
triggered++;
});
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
target = this.picker.find('.datepicker-months thead th.prev');
ok(target.is(':visible'), 'Prev switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(triggered, 1);
target = this.picker.find('.datepicker-months thead th.next');
ok(target.is(':visible'), 'Next switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(triggered, 2);
});
test('Selecting a month from year view triggers changeMonth', function(){
var target,
triggered = 0;
this.input.on('changeMonth', function(){
triggered++;
});
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates[0], UTCDate(2011, 2, 31));
target = this.picker.find('.datepicker-months tbody span:contains(Apr)');
target.click();
equal(this.dp.viewMode, 0);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 3, 1));
datesEqual(this.dp.dates[0], UTCDate(2011, 2, 31));
equal(triggered, 1);
});
test('Navigating forward/backward from month view triggers changeMonth', function(){
var target,
triggered = 0;
this.input.on('changeMonth', function(){
triggered++;
});
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.prev');
ok(target.is(':visible'), 'Prev switcher is visible');
target.click();
ok(this.picker.find('.datepicker-days').is(':visible'), 'Day picker is visible');
equal(triggered, 1);
target = this.picker.find('.datepicker-days thead th.next');
ok(target.is(':visible'), 'Next switcher is visible');
target.click();
ok(this.picker.find('.datepicker-days').is(':visible'), 'Day picker is visible');
equal(triggered, 2);
});
test('format() returns a formatted date string', function(){
var target,
error, out;
this.input.on('changeDate', function(e){
try{
out = e.format();
}
catch(e){
error = e;
}
});
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:nth(15)');
target.click();
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 14));
datesEqual(this.dp.dates[0], UTCDate(2011, 2, 14));
equal(error, undefined);
equal(out, '14-03-2011');
});
test('format(altformat) returns a formatted date string', function(){
var target,
error, out;
this.input.on('changeDate', function(e){
try{
out = e.format('m/d/yy');
}
catch(e){
error = e;
}
});
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:nth(15)');
target.click();
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 14));
datesEqual(this.dp.dates[0], UTCDate(2011, 2, 14));
equal(error, undefined);
equal(out, '3/14/11');
});
test('format(ix) returns a formatted date string of the ix\'th date selected', function(){
var target,
error, out;
this.dp._process_options({multidate: true});
this.input.on('changeDate', function(e){
try{
out = e.format(2);
}
catch(e){
error = e;
}
});
target = this.picker.find('.datepicker-days tbody td:nth(7)');
equal(target.text(), '6'); // Mar 6
target.click();
target = this.picker.find('.datepicker-days tbody td:nth(15)');
equal(target.text(), '14'); // Mar 16
target.click();
equal(this.dp.dates.length, 3);
equal(error, undefined);
equal(out, '14-03-2011');
});
test('format(ix, altformat) returns a formatted date string', function(){
var target,
error, out;
this.dp._process_options({multidate: true});
this.input.on('changeDate', function(e){
try{
out = e.format(2, 'm/d/yy');
}
catch(e){
error = e;
}
});
target = this.picker.find('.datepicker-days tbody td:nth(7)');
equal(target.text(), '6'); // Mar 6
target.click();
target = this.picker.find('.datepicker-days tbody td:nth(15)');
equal(target.text(), '14'); // Mar 16
target.click();
equal(this.dp.dates.length, 3);
equal(error, undefined);
equal(out, '3/14/11');
});
test('Clear button: triggers change and changeDate events', function(){
this.input = $('<input type="text" value="31-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({
format: "dd-mm-yyyy",
clearBtn: true
})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
var target,
triggered_change = 0,
triggered_changeDate = 0;
this.input.on({
changeDate: function(){
triggered_changeDate++;
},
change: function(){
triggered_change++;
}
});
this.input.focus();
ok(this.picker.find('.datepicker-days').is(':visible'), 'Days view visible');
ok(this.picker.find('.datepicker-days tfoot .clear').is(':visible'), 'Clear button visible');
target = this.picker.find('.datepicker-days tfoot .clear');
target.click();
equal(triggered_change, 1);
equal(triggered_changeDate, 1);
});
test('setDate: triggers change and changeDate events', function(){
this.input = $('<input type="text" value="31-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({
format: "dd-mm-yyyy"
})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
var target,
triggered_change = 0,
triggered_changeDate = 0;
this.input.on({
changeDate: function(){
triggered_changeDate++;
},
change: function(){
triggered_change++;
}
});
this.input.focus();
ok(this.picker.find('.datepicker-days').is(':visible'), 'Days view visible');
this.dp.setDate(new Date(2011, 2, 5));
equal(triggered_change, 1);
equal(triggered_changeDate, 1);
});
test('paste must update the date', function() {
var dateToPaste = '22-07-2015';
var evt = {
type: 'paste',
originalEvent: {
clipboardData: {
types: ['text/plain'],
getData: function() { return dateToPaste; }
},
preventDefault: function() { evt.originalEvent.isDefaultPrevented = true; },
isDefaultPrevented: false
}
};
this.input.trigger(evt);
datesEqual(this.dp.dates[0], UTCDate(2015, 6, 22));
ok(evt.originalEvent.isDefaultPrevented, 'prevented original event');
});
test('clicking outside datepicker triggers \'hide\' event', function(){
var $otherelement = $('<div />');
$('body').append($otherelement);
var isHideTriggered;
this.input.on('hide', function() { isHideTriggered = true; });
$otherelement.trigger('mousedown');
ok(isHideTriggered, '\'hide\' event is not triggered');
$otherelement.remove();
});
test('Selecting date from previous month triggers changeMonth', function() {
var target,
triggered = 0;
this.input.on('changeMonth', function(){
triggered++;
});
// find first day of previous month
target = this.picker.find('.datepicker-days tbody td:first');
target.click();
// ensure event has been triggered
equal(triggered, 1);
});
test('Selecting date from previous month in january triggers changeMonth/changeYear', function() {
var target,
triggeredM = 0,
triggeredY = 0;
this.input.val('01-01-2011');
this.dp.update();
this.input.on('changeMonth', function(){
triggeredM++;
});
this.input.on('changeYear', function(){
triggeredY++;
});
// find first day of previous month
target = this.picker.find('.datepicker-days tbody td:first');
target.click();
// ensure event has been triggered
equal(triggeredM, 1);
equal(triggeredY, 1);
});
test('Selecting date from next month triggers changeMonth', function() {
var target,
triggered = 0;
this.input.on('changeMonth', function(){
triggered++;
});
// find first day of previous month
target = this.picker.find('.datepicker-days tbody td:last');
target.click();
// ensure event has been triggered
equal(triggered, 1);
});
test('Selecting date from next month in december triggers changeMonth/changeYear', function() {
var target,
triggeredM = 0,
triggeredY = 0;
this.input.val('01-12-2011');
this.dp.update();
this.input.on('changeMonth', function(){
triggeredM++;
});
this.input.on('changeYear', function(){
triggeredY++;
});
// find first day of previous month
target = this.picker.find('.datepicker-days tbody td:last');
target.click();
// ensure event has been triggered
equal(triggeredM, 1);
equal(triggeredY, 1);
});
test('Changing view mode triggers changeViewMode', function () {
var viewMode = -1,
triggered = 0;
this.input.val('22-07-2016');
this.dp.update();
this.input.on('changeViewMode', function (e) {
viewMode = e.viewMode;
triggered++;
});
// change from days to months
this.picker.find('.datepicker-days .datepicker-switch').click();
equal(triggered, 1);
equal(viewMode, 1);
// change from months to years
this.picker.find('.datepicker-months .datepicker-switch').click();
equal(triggered, 2);
equal(viewMode, 2);
// change from years to decade
this.picker.find('.datepicker-years .datepicker-switch').click();
equal(triggered, 3);
equal(viewMode, 3);
// change from decades to centuries
this.picker.find('.datepicker-decades .datepicker-switch').click();
equal(triggered, 4);
equal(viewMode, 4);
});
test('Clicking inside content of date with custom beforeShowDay content works', function(){
this.input = $('<input type="text" value="31-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({
format: "dd-mm-yyyy",
beforeShowDay: function (date) { return { content: '<div><div>' + date.getDate() + '</div></div>' }; }
})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
var target,
triggered = 0;
this.input.on('changeDate', function(){
triggered++;
});
// find deepest date
target = this.picker.find('.datepicker-days tbody td:first div div');
target.click();
// ensure event has been triggered
equal(triggered, 1);
});

View File

@@ -0,0 +1,314 @@
module('Formats', {
setup: function(){
this.input = $('<input type="text">').appendTo('#qunit-fixture');
this.date = UTCDate(2012, 2, 15, 0, 0, 0, 0); // March 15, 2012
},
teardown: function(){
this.input.data('datepicker').picker.remove();
}
});
test('d: Day of month, no leading zero.', function(){
this.input
.val('2012-03-05')
.datepicker({format: 'yyyy-mm-d'})
.datepicker('setValue');
equal(this.input.val().split('-')[2], '5');
});
test('dd: Day of month, leading zero.', function(){
this.input
.val('2012-03-5')
.datepicker({format: 'yyyy-mm-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[2], '05');
});
test('D: Day of week, short.', function(){
this.input
.val('2012-03-05')
.datepicker({format: 'yyyy-mm-dd-D'})
.datepicker('setValue');
equal(this.input.val().split('-')[3], 'Mon');
});
test('DD: Day of week, long.', function(){
this.input
.val('2012-03-05')
.datepicker({format: 'yyyy-mm-dd-DD'})
.datepicker('setValue');
equal(this.input.val().split('-')[3], 'Monday');
});
test('m: Month, no leading zero.', function(){
this.input
.val('2012-03-05')
.datepicker({format: 'yyyy-m-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[1], '3');
});
test('mm: Month, leading zero.', function(){
this.input
.val('2012-3-5')
.datepicker({format: 'yyyy-mm-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[1], '03');
});
test('M: Month shortname.', function(){
this.input
.val('2012-Mar-05')
.datepicker({format: 'yyyy-M-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[1], 'Mar');
});
test('M: Month shortname case insensitive.', function(){
this.input
.val('2012-MAR-05')
.datepicker({format: 'yyyy-M-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[1], 'Mar');
});
test('MM: Month full name.', function(){
this.input
.val('2012-March-5')
.datepicker({format: 'yyyy-MM-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[1], 'March');
});
test('M: Month fullname case insensitive.', function(){
this.input
.val('2012-MARCH-05')
.datepicker({format: 'yyyy-MM-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[1], 'March');
});
test('yy: Year, two-digit.', function(){
this.input
.val('2012-03-05')
.datepicker({format: 'yy-mm-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[0], '12');
});
test('yyyy: Year, four-digit.', function(){
this.input
.val('2012-03-5')
.datepicker({format: 'yyyy-mm-dd'})
.datepicker('setValue');
equal(this.input.val().split('-')[0], '2012');
});
test('dd-mm-yyyy: Regression: Prevent potential month overflow in small-to-large formats (Mar 31, 2012 -> Mar 01, 2012)', function(){
this.input
.val('31-03-2012')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '31-03-2012');
});
test('dd-mm-yyyy: Leap day', function(){
this.input
.val('29-02-2012')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '29-02-2012');
});
test('yyyy-mm-dd: Alternative format', function(){
this.input
.val('2012-02-12')
.datepicker({format: 'yyyy-mm-dd'})
.datepicker('setValue');
equal(this.input.val(), '2012-02-12');
});
test('yyyy-MM-dd: Regression: Infinite loop when numbers used for month', function(){
this.input
.val('2012-02-12')
.datepicker({format: 'yyyy-MM-dd'})
.datepicker('setValue');
equal(this.input.val(), '2012-February-12');
});
test('+1d: Tomorrow', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('+1d')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '16-03-2012');
}));
test('tomorrow (alias for +1d): Tomorrow', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('tomorrow')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '16-03-2012');
}));
test('-1d: Yesterday', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('-1d')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '14-03-2012');
}));
test('yesterday (alias for -1d): Yesterday', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('yesterday')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '14-03-2012');
}));
test('+1w: Next week', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('+1w')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '22-03-2012');
}));
test('-1w: Last week', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('-1w')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '08-03-2012');
}));
test('+1m: Next month', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('+1m')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '15-04-2012');
}));
test('-1m: Last month', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('-1m')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '15-02-2012');
}));
test('+1y: Next year', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('+1y')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '15-03-2013');
}));
test('-1y: Last year', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('-1y')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '15-03-2011');
}));
test('-1y +2m: Multiformat', patch_date(function(Date){
Date.now = UTCDate(2012, 2, 15);
this.input
.val('-1y +2m')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '15-05-2011');
}));
test('Regression: End-of-month bug', patch_date(function(Date){
Date.now = UTCDate(2012, 4, 31);
this.input
.val('29-02-2012')
.datepicker({format: 'dd-mm-yyyy'})
.datepicker('setValue');
equal(this.input.val(), '29-02-2012');
}));
test('Invalid formats are force-parsed into a valid date on tab', patch_date(function(Date){
Date.now = UTCDate(2012, 4, 31);
this.input
.val('44-44-4444')
.datepicker({format: 'yyyy-MM-dd'})
.focus();
this.input.trigger({
type: 'keydown',
keyCode: 9
});
equal(this.input.val(), '56-September-30');
}));
test('Trailing separators', patch_date(function(Date){
Date.now = UTCDate(2012, 4, 31);
this.input
.val('29.02.2012.')
.datepicker({format: 'dd.mm.yyyy.'})
.datepicker('setValue');
equal(this.input.val(), '29.02.2012.');
}));
test('Assume nearby year - last century', patch_date(function(Date){
Date.now = UTCDate(2012, 4, 31);
this.input
.val('02/14/91')
.datepicker({format: 'mm/dd/yyyy', assumeNearbyYear: true})
.datepicker('setValue');
equal(this.input.val(), '02/14/1991');
}));
test('Assume nearby year - this century (- 1 year)', patch_date(function(Date){
Date.now = UTCDate(2012, 4, 31);
this.input
.val('02/14/01')
.datepicker({format: 'mm/dd/yyyy', assumeNearbyYear: true})
.datepicker('setValue');
equal(this.input.val(), '02/14/2001');
}));
test('Assume nearby year - this century (+ 7 years)', patch_date(function(Date){
Date.now = UTCDate(2012, 4, 31);
this.input
.val('02/14/19')
.datepicker({format: 'mm/dd/yyyy', assumeNearbyYear: true})
.datepicker('setValue');
equal(this.input.val(), '02/14/2019');
}));
test('Assume nearby year - this century (+ 13 years)', patch_date(function(Date){
Date.now = UTCDate(2012, 4, 31);
this.input
.val('02/14/23')
.datepicker({format: 'mm/dd/yyyy', assumeNearbyYear: true})
.datepicker('setValue');
equal(this.input.val(), '02/14/1923');
}));
test('Assume nearby year - this century (+ 13 years, threshold = 30)', patch_date(function(Date){
Date.now = UTCDate(2012, 4, 31);
this.input
.val('02/14/23')
.datepicker({format: 'mm/dd/yyyy', assumeNearbyYear: 30})
.datepicker('setValue');
equal(this.input.val(), '02/14/2023');
}));

View File

@@ -0,0 +1,28 @@
module('Inline', {
setup: function(){
this.component = $('<div data-date="12-02-2012"></div>')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"});
this.dp = this.component.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Picker gets date/viewDate from data-date attr', function(){
datesEqual(this.dp.dates[0], UTCDate(2012, 1, 12));
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 12));
});
test('Visible after init', function(){
ok(this.picker.is(':visible'));
});
test('update', function(){
this.dp.update('13-03-2012');
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 13));
});

View File

@@ -0,0 +1,228 @@
module('Keyboard Navigation 2011', {
setup: function(){
/*
Tests start with picker on March 31, 2011. Fun facts:
* March 1, 2011 was on a Tuesday
* March 31, 2011 was on a Thursday
*/
this.input = $('<input type="text" value="31-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Regression: by week (up/down arrows); up from Mar 6, 2011 should go to Feb 27, 2011', function(){
var target;
this.input.val('06-03-2011').datepicker('update');
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 6));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 6));
equal(this.dp.focusDate, null);
// Navigation: -1 week, up arrow key
this.input.trigger({
type: 'keydown',
keyCode: 38
});
datesEqual(this.dp.viewDate, UTCDate(2011, 1, 27));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 6));
datesEqual(this.dp.focusDate, UTCDate(2011, 1, 27));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2011', 'Title is "February 2011"');
});
test('Regression: by day (left/right arrows); left from Mar 1, 2011 should go to Feb 28, 2011', function(){
var target;
this.input.val('01-03-2011').datepicker('update');
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 1));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 1));
equal(this.dp.focusDate, null);
// Navigation: -1 day left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37
});
datesEqual(this.dp.viewDate, UTCDate(2011, 1, 28));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 1));
datesEqual(this.dp.focusDate, UTCDate(2011, 1, 28));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2011', 'Title is "February 2011"');
});
test('Regression: by month (shift + left/right arrows); left from Mar 15, 2011 should go to Feb 15, 2011', function(){
var target;
this.input.val('15-03-2011').datepicker('update');
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
equal(this.dp.focusDate, null);
// Navigation: -1 month, shift + left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37,
shiftKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2011, 1, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
datesEqual(this.dp.focusDate, UTCDate(2011, 1, 15));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2011', 'Title is "February 2011"');
});
test('Regression: by month with view mode = 1 (left/right arrow); left from March 15, 2011 should go to February 15, 2011', function () {
this.picker.remove();
this.input = $('<input type="text" value="15-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({
format: "dd-mm-yyyy",
minViewMode: 1,
startView: 1
})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
this.input.val('15-03-2011').datepicker('update');
equal(this.dp.viewMode, 1);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
equal(this.dp.focusDate, null);
this.input.trigger({
type: 'keydown',
keyCode: 37
});
datesEqual(this.dp.viewDate, UTCDate(2011, 1, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
datesEqual(this.dp.focusDate, UTCDate(2011, 1, 15));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2011', 'Title is "February 2011"');
});
test('Regression: by month with view mode = 1 (up/down arrow); down from March 15, 2011 should go to July 15, 2010', function () {
this.picker.remove();
this.input = $('<input type="text" value="15-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({
format: "dd-mm-yyyy",
minViewMode: 1,
startView: 1
})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
this.input.val('15-03-2011').datepicker('update');
equal(this.dp.viewMode, 1);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
equal(this.dp.focusDate, null);
this.input.trigger({
type: 'keydown',
keyCode: 40
});
datesEqual(this.dp.viewDate, UTCDate(2011, 6, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
datesEqual(this.dp.focusDate, UTCDate(2011, 6, 15));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'July 2011', 'Title is "July 2011"');
});
test('Regression: by year with view mode = 2 (left/right arrow); left from March 15, 2011 should go to March 15, 2010', function () {
this.picker.remove();
this.input = $('<input type="text" value="15-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({
format: "dd-mm-yyyy",
minViewMode: 2,
startView: 2
})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
this.input.val('15-03-2011').datepicker('update');
equal(this.dp.viewMode, 2);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
equal(this.dp.focusDate, null);
this.input.trigger({
type: 'keydown',
keyCode: 37
});
datesEqual(this.dp.viewDate, UTCDate(2010, 2, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
datesEqual(this.dp.focusDate, UTCDate(2010, 2, 15));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2010', 'Title is "March 2010"');
});
test('Regression: by year with view mode = 2 (up/down arrow); dows from March 15, 2011 should go to March 15, 2015', function () {
this.picker.remove();
this.input = $('<input type="text" value="15-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({
format: "dd-mm-yyyy",
minViewMode: 2,
startView: 2
})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
this.input.val('15-03-2011').datepicker('update');
equal(this.dp.viewMode, 2);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
equal(this.dp.focusDate, null);
this.input.trigger({
type: 'keydown',
keyCode: 40
});
datesEqual(this.dp.viewDate, UTCDate(2015, 2, 15));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 2, 15));
datesEqual(this.dp.focusDate, UTCDate(2015, 2, 15));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2015', 'Title is "March 2015"');
});

View File

@@ -0,0 +1,483 @@
module('Keyboard Navigation 2012', {
setup: function(){
/*
Tests start with picker on March 31, 2012. Fun facts:
* February 1, 2012 was on a Wednesday
* February 29, 2012 was on a Wednesday
* March 1, 2012 was on a Thursday
* March 31, 2012 was on a Saturday
*/
this.input = $('<input type="text" value="31-03-2012">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('by day (right/left arrows)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 day, left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37
});
// view and focus updated on keyboard navigation, not selected
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 30));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 2, 30));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: +1 day, right arrow key
for (var i=0; i<2; i++)
this.input.trigger({
type: 'keydown',
keyCode: 39
});
datesEqual(this.dp.viewDate, UTCDate(2012, 3, 1));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 3, 1));
// Month changed: April 1 (this is not a joke!)
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'April 2012', 'Title is "April 2012"');
});
test('by week (up/down arrows)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 week, up arrow key
this.input.trigger({
type: 'keydown',
keyCode: 38
});
// view and focus updated on keyboard navigation, not selected
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 24));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 2, 24));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: +1 week, down arrow key
for (var i=0; i<2; i++)
this.input.trigger({
type: 'keydown',
keyCode: 40
});
datesEqual(this.dp.viewDate, UTCDate(2012, 3, 7));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 3, 7));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'April 2012', 'Title is "April 2012"');
});
test('by month, v1 (shift + left/right arrows)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 month, shift + left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37,
shiftKey: true
});
// view and focus updated on keyboard navigation w/ graceful date ends, not selected
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 1, 29));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2012', 'Title is "February 2012"');
// Navigation: +1 month, shift + right arrow key
for (var i=0; i<2; i++)
this.input.trigger({
type: 'keydown',
keyCode: 39,
shiftKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2012, 3, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 3, 29));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'April 2012', 'Title is "April 2012"');
});
test('by month, v2 (shift + up/down arrows)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 month, shift + up arrow key
this.input.trigger({
type: 'keydown',
keyCode: 38,
shiftKey: true
});
// view and focus updated on keyboard navigation w/ graceful date ends, not selected
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 1, 29));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2012', 'Title is "February 2012"');
// Navigation: +1 month, shift + down arrow key
for (var i=0; i<2; i++)
this.input.trigger({
type: 'keydown',
keyCode: 40,
shiftKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2012, 3, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 3, 29));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'April 2012', 'Title is "April 2012"');
});
test('by year, v1 (ctrl + left/right arrows)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 year, ctrl + left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37,
ctrlKey: true
});
// view and focus updated on keyboard navigation, not selected
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2011, 2, 31));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
// Navigation: +1 year, ctrl + right arrow key
for (var i=0; i<2; i++)
this.input.trigger({
type: 'keydown',
keyCode: 39,
ctrlKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2013, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2013, 2, 31));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2013', 'Title is "March 2013"');
});
test('by year, v2 (ctrl + up/down arrows)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 year, ctrl + up arrow key
this.input.trigger({
type: 'keydown',
keyCode: 38,
ctrlKey: true
});
// view and focus updated on keyboard navigation, not selected
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2011, 2, 31));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
// Navigation: +1 year, ctrl + down arrow key
for (var i=0; i<2; i++)
this.input.trigger({
type: 'keydown',
keyCode: 40,
ctrlKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2013, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2013, 2, 31));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2013', 'Title is "March 2013"');
});
test('by year, v3 (ctrl + shift + left/right arrows)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 year, ctrl + left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37,
ctrlKey: true,
shiftKey: true
});
// view and focus updated on keyboard navigation, not selected
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2011, 2, 31));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
// Navigation: +1 year, ctrl + right arrow key
for (var i=0; i<2; i++)
this.input.trigger({
type: 'keydown',
keyCode: 39,
ctrlKey: true,
shiftKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2013, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2013, 2, 31));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2013', 'Title is "March 2013"');
});
test('by year, v4 (ctrl + shift + up/down arrows)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 year, ctrl + up arrow key
this.input.trigger({
type: 'keydown',
keyCode: 38,
ctrlKey: true,
shiftKey: true
});
// view and focus updated on keyboard navigation, not selected
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2011, 2, 31));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2011', 'Title is "March 2011"');
// Navigation: +1 year, ctrl + down arrow key
for (var i=0; i<2; i++)
this.input.trigger({
type: 'keydown',
keyCode: 40,
ctrlKey: true,
shiftKey: true
});
datesEqual(this.dp.viewDate, UTCDate(2013, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2013, 2, 31));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2013', 'Title is "March 2013"');
});
test('by year, from leap day', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
this.input.val('29-02-2012').datepicker('update');
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 1, 29));
equal(this.dp.focusDate, null);
equal(target.text(), 'February 2012', 'Title is "February 2012"');
// Navigation: -1 year
this.input.trigger({
type: 'keydown',
keyCode: 37,
ctrlKey: true
});
// view and focus updated on keyboard navigation w/ graceful month ends, not selected
datesEqual(this.dp.viewDate, UTCDate(2011, 1, 28));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 1, 29));
datesEqual(this.dp.focusDate, UTCDate(2011, 1, 28));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2011', 'Title is "February 2011"');
// Navigation: +1 year, back to leap year
this.input.trigger({
type: 'keydown',
keyCode: 39,
ctrlKey: true
});
// view and focus updated on keyboard navigation w/ graceful month ends, not selected
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 28));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 1, 29));
datesEqual(this.dp.focusDate, UTCDate(2012, 1, 28));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2012', 'Title is "February 2012"');
// Navigation: +1 year
this.input.trigger({
type: 'keydown',
keyCode: 39,
ctrlKey: true
});
// view and focus updated on keyboard navigation w/ graceful month ends, not selected
datesEqual(this.dp.viewDate, UTCDate(2013, 1, 28));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 1, 29));
datesEqual(this.dp.focusDate, UTCDate(2013, 1, 28));
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'February 2013', 'Title is "February 2013"');
});
test('Selection (enter)', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 day, left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37
});
// view and focus updated on keyboard navigation, not selected
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 30));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 2, 30));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Selection: Enter
this.input.trigger({
type: 'keydown',
keyCode: 13
});
// view and selection updated, focus cleared
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 30));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 30));
equal(this.dp.focusDate, null);
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
ok(this.picker.is(':visible'), 'Picker is not hidden');
});
test('Selection + hide (enter)', function(){
var target;
this.dp._process_options({autoclose: true});
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Navigation: -1 day, left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37
});
// view and focus updated on keyboard navigation, not selected
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 30));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
datesEqual(this.dp.focusDate, UTCDate(2012, 2, 30));
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
// Selection: Enter
this.input.trigger({
type: 'keydown',
keyCode: 13
});
// view and selection updatedfocus cleared
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 30));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 30));
equal(this.dp.focusDate, null);
// Month not changed
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
ok(this.picker.is(':not(:visible)'), 'Picker is hidden');
});
test('Toggle hide/show (escape); navigation while hidden is suppressed', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
equal(target.text(), 'March 2012', 'Title is "March 2012"');
ok(this.picker.is(':visible'), 'Picker is visible');
// Hide
this.input.trigger({
type: 'keydown',
keyCode: 27
});
ok(this.picker.is(':not(:visible)'), 'Picker is hidden');
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// left arrow key, *doesn't* navigate
this.input.trigger({
type: 'keydown',
keyCode: 37
});
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Show - with escape key
this.input.trigger({
type: 'keydown',
keyCode: 27
});
ok(this.picker.is(':visible'), 'Picker is visible');
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Hide
this.input.trigger({
type: 'keydown',
keyCode: 27
});
// Show - with down key
this.input.trigger({
type: 'keydown',
keyCode: 40
});
ok(this.picker.is(':visible'), 'Picker is visible');
});

View File

@@ -0,0 +1,62 @@
module('Keyboard Navigation (All)', {
setup: function(){
this.input = $('<input type="text">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('TAB hides picker', function(){
var target;
ok(this.picker.is(':visible'), 'Picker is visible');
this.input.trigger({
type: 'keydown',
keyCode: 9
});
ok(this.picker.is(':not(:visible)'), 'Picker is hidden');
});
test('by day (right/left arrows) with daysOfWeekDisabled', function(){
var target;
this.input.val('04-03-2013');
this.dp.setDaysOfWeekDisabled('0,6');
this.dp.update();
this.input.focus();
// Navigation: -1 day left arrow key
this.input.trigger({
type: 'keydown',
keyCode: 37
});
datesEqual(this.dp.viewDate, UTCDate(2013, 2, 1));
});
test('by day (right/left arrows) with datesDisabled', function(){
var target;
this.input.val('04-03-2013');
this.dp.setDatesDisabled(['05-03-2013']);
this.dp.update();
this.input.focus();
// Navigation: +1 day right arrow key
this.input.trigger({
type: 'keydown',
keyCode: 39
});
datesEqual(this.dp.viewDate, UTCDate(2013, 2, 6));
});

View File

@@ -0,0 +1,188 @@
module('Methods', {
setup: function(){
this.input = $('<input type="text" value="31-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"});
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.dp.remove();
}
});
test('remove', function(){
var returnedObject = this.dp.remove();
// ...
strictEqual(returnedObject, this.dp, "is chainable");
});
test('show', function(){
var returnedObject = this.dp.show();
// ...
strictEqual(returnedObject, this.dp, "is chainable");
});
test('hide', function(){
var returnedObject = this.dp.hide();
// ...
strictEqual(returnedObject, this.dp, "is chainable");
});
test('update - String', function(){
var returnedObject = this.dp.update('13-03-2012');
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 13));
var date = this.dp.picker.find('.datepicker-days td:contains(13)');
ok(date.hasClass('active'), 'Date is selected');
strictEqual(returnedObject, this.dp, "is chainable");
});
test('update - Date', function(){
var returnedObject = this.dp.update(new Date(2012, 2, 13));
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 13));
var date = this.dp.picker.find('.datepicker-days td:contains(13)');
ok(date.hasClass('active'), 'Date is selected');
strictEqual(returnedObject, this.dp, "is chainable");
});
test('update - Date with time', function(){
var returnedObject = this.dp.update(new Date(2012, 2, 13, 23, 59, 59, 999));
datesEqual(this.dp.dates[0], UTCDate(2012, 2, 13, 23, 59, 59, 999));
var date = this.dp.picker.find('.datepicker-days td:contains(13)');
ok(date.hasClass('active'), 'Date is selected');
strictEqual(returnedObject, this.dp, "is chainable");
});
test('update - null', function(){
var returnedObject = this.dp.update(null);
equal(this.dp.dates[0], undefined);
var selected = this.dp.picker.find('.datepicker-days td.active');
equal(selected.length, 0, 'No date is selected');
strictEqual(returnedObject, this.dp, "is chainable");
});
test('setDate', function(){
var date_in = new Date(2013, 1, 1),
expected_date = new Date(Date.UTC(2013, 1, 1)),
returnedObject;
notEqual(this.dp.dates[0], date_in);
returnedObject = this.dp.setDate(date_in);
strictEqual(returnedObject, this.dp, "is chainable");
datesEqual(this.dp.dates[0], expected_date);
});
test('setUTCDate', function(){
var date_in = new Date(Date.UTC(2012, 3, 5)),
expected_date = date_in,
returnedObject;
notEqual(this.dp.dates[0], date_in);
returnedObject = this.dp.setUTCDate(date_in);
strictEqual(returnedObject, this.dp, "is chainable");
datesEqual(this.dp.dates[0], expected_date);
});
test('setStartDate', function(){
var date_in = new Date(2012, 3, 5),
expected_date = new Date(Date.UTC(2012, 3, 5)),
returnedObject = this.dp.setStartDate(date_in);
// ...
datesEqual(this.dp.o.startDate, expected_date);
strictEqual(returnedObject, this.dp, "is chainable");
});
test('setEndDate', function(){
var date_in = new Date(2012, 3, 5),
expected_date = new Date(Date.UTC(2012, 3, 5)),
returnedObject = this.dp.setEndDate(date_in);
// ...
datesEqual(this.dp.o.endDate, expected_date);
strictEqual(returnedObject, this.dp, "is chainable");
});
test('getStartDate', function(){
var date_in = new Date(2012, 3, 5),
expected_date = new Date(Date.UTC(2012, 3, 5)),
returnedObject = this.dp.setStartDate(date_in);
// ...
datesEqual(returnedObject.getStartDate(), expected_date);
strictEqual(returnedObject, this.dp, "is chainable");
});
test('getEndDate', function(){
var date_in = new Date(2012, 3, 5),
expected_date = new Date(Date.UTC(2012, 3, 5)),
returnedObject = this.dp.setEndDate(date_in);
// ...
datesEqual(returnedObject.getEndDate(), expected_date);
strictEqual(returnedObject, this.dp, "is chainable");
});
test('setDaysOfWeekDisabled - String', function(){
var days_in = "0,6",
expected_days = [0,6],
returnedObject = this.dp.setDaysOfWeekDisabled(days_in);
// ...
deepEqual(this.dp.o.daysOfWeekDisabled, expected_days);
strictEqual(returnedObject, this.dp, "is chainable");
});
test('setDaysOfWeekDisabled - Array', function(){
var days_in = [0,6],
expected_days = days_in,
returnedObject = this.dp.setDaysOfWeekDisabled(days_in);
// ...
deepEqual(this.dp.o.daysOfWeekDisabled, expected_days);
strictEqual(returnedObject, this.dp, "is chainable");
});
test('setDatesDisabled', function(){
var monthShown = this.picker.find('.datepicker-days thead th.datepicker-switch');
var returnedObject = this.dp.setDatesDisabled(['01-03-2011']);
ok(this.picker.find('.datepicker-days tbody td.day:not(.old):first').hasClass('disabled'), 'day is disabled');
this.dp.setDatesDisabled(['01-01-2011']);
equal(monthShown.text(), 'March 2011', 'should not change viewDate');
strictEqual(returnedObject, this.dp, "is chainable");
});
test('setValue', function(){
var returnedObject = this.dp.setValue();
// ...
strictEqual(returnedObject, this.dp, "is chainable");
});
test('place', function(){
var returnedObject = this.dp.place();
// ...
strictEqual(returnedObject, this.dp, "is chainable");
});
test('moveMonth - can handle invalid date', function(){
// any input which results in an invalid date, f.e. an incorrectly formatted.
var invalidDate = new Date("invalid"),
returnedObject = this.dp.moveMonth(invalidDate, 1);
// ...
equal(this.input.val(), "31-03-2011", "date is reset");
});
test('parseDate - outputs correct value', function(){
var parsedDate = $.fn.datepicker.DPGlobal.parseDate('11/13/2015', $.fn.datepicker.DPGlobal.parseFormat('mm/dd/yyyy'), 'en');
equal(parsedDate.getUTCDate(), "13", "date is correct");
equal(parsedDate.getUTCMonth(), "10", "month is correct");
equal(parsedDate.getUTCFullYear(), "2015", "fullyear is correct");
});
test('parseDate - outputs correct value for yyyy\u5E74mm\u6708dd\u65E5 format', function(){
var parsedDate = $.fn.datepicker.DPGlobal.parseDate('2015\u5E7411\u670813', $.fn.datepicker.DPGlobal.parseFormat('yyyy\u5E74mm\u6708dd\u65E5'), 'ja');
equal(parsedDate.getUTCDate(), "13", "date is correct");
equal(parsedDate.getUTCMonth(), "10", "month is correct");
equal(parsedDate.getUTCFullYear(), "2015", "fullyear is correct");
});
test('parseDate - outputs correct value for dates containing unicodes', function(){
var parsedDate = $.fn.datepicker.DPGlobal.parseDate('\u5341\u4E00\u6708 13 2015', $.fn.datepicker.DPGlobal.parseFormat('MM dd yyyy'), 'zh-CN');
equal(parsedDate.getUTCDate(), "13", "date is correct");
equal(parsedDate.getUTCMonth(), "10", "month is correct");
equal(parsedDate.getUTCFullYear(), "2015", "fullyear is correct");
});

View File

@@ -0,0 +1,26 @@
module('Methods (jQuery)', {
setup: function(){
this.$inputs = $('<input><input>')
.datepicker()
.appendTo('#qunit-fixture');
},
teardown: function(){
this.$inputs.each(function(){
$.data(this, 'datepicker').picker.remove();
});
}
});
test('Methods', function(){
[
'show',
'hide',
'setValue',
'place'
].forEach($.proxy(function(index, value){
var returnedObject = this.$inputs.datepicker(value);
strictEqual(returnedObject, this.$inputs, "is jQuery element");
strictEqual(returnedObject.length, 2, "correct length of jQuery elements");
}, this));
});

View File

@@ -0,0 +1,66 @@
module('Mouse Navigation 2011', {
setup: function(){
/*
Tests start with picker on March 31, 2011.
*/
this.input = $('<input type="text" value="31-03-2011">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Selecting date from previous month while in January changes month and year displayed', function(){
var target;
this.input.val('01-01-2011');
this.dp.update();
datesEqual(this.dp.viewDate, UTCDate(2011, 0, 1));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 0, 1));
// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '26'); // Should be Dec 26
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'January 2011');
// Updated internally on click
target.click();
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'December 2010');
datesEqual(this.dp.viewDate, UTCDate(2010, 11, 26));
datesEqual(this.dp.dates.get(-1), UTCDate(2010, 11, 26));
// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '28'); // Should be Nov 28
});
test('Selecting date from next month while in December changes month and year displayed', function(){
var target;
this.input.val('01-12-2010');
this.dp.update();
datesEqual(this.dp.viewDate, UTCDate(2010, 11, 1));
datesEqual(this.dp.dates.get(-1), UTCDate(2010, 11, 1));
// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:last');
equal(target.text(), '8'); // Should be Jan 8
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'December 2010');
// Updated internally on click
target.click();
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'January 2011');
datesEqual(this.dp.viewDate, UTCDate(2011, 0, 8));
datesEqual(this.dp.dates.get(-1), UTCDate(2011, 0, 8));
// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '26'); // Should be Dec 26
});

View File

@@ -0,0 +1,266 @@
module('Mouse Navigation 2012', {
setup: function(){
/*
Tests start with picker on March 31, 2012. Fun facts:
* February 1, 2012 was on a Wednesday
* February 29, 2012 was on a Wednesday
* March 1, 2012 was on a Thursday
* March 31, 2012 was on a Saturday
*/
this.input = $('<input type="text" value="31-03-2012">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Selecting date resets viewDate and date', function(){
var target;
// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:nth(7)');
equal(target.text(), '4'); // Should be Mar 4
// Updated internally on click
target.click();
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 4));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 4));
// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '26'); // Should be Feb 29
});
test('Navigating next/prev by month', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.prev');
ok(target.is(':visible'), 'Month:prev nav is visible');
// Updated internally on click
target.click();
// Should handle month-length changes gracefully
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '29'); // Should be Jan 29
target = this.picker.find('.datepicker-days thead th.next');
ok(target.is(':visible'), 'Month:next nav is visible');
// Updated internally on click
target.click().click();
// Graceful moonth-end handling carries over
datesEqual(this.dp.viewDate, UTCDate(2012, 3, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '25'); // Should be Mar 25
// (includes "old" days at start of month, even if that's all the first week-row consists of)
});
test('Navigating to/from year view', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Change months to test internal state
target = this.picker.find('.datepicker-months tbody span:contains(Apr)');
target.click();
equal(this.dp.viewMode, 0);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2012, 3, 1)); // Apr 30
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
});
test('Navigating to/from decade view', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
target = this.picker.find('.datepicker-months thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-years').is(':visible'), 'Year picker is visible');
equal(this.dp.viewMode, 2);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Change years to test internal state changes
target = this.picker.find('.datepicker-years tbody span:contains(2011)');
target.click();
equal(this.dp.viewMode, 1);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 1));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
target = this.picker.find('.datepicker-months tbody span:contains(Apr)');
target.click();
equal(this.dp.viewMode, 0);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 3, 1));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
});
test('Navigating prev/next in year view', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
equal(this.picker.find('.datepicker-months thead th.datepicker-switch').text(), '2012');
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Go to next year (2013)
target = this.picker.find('.datepicker-months thead th.next');
target.click();
equal(this.picker.find('.datepicker-months thead th.datepicker-switch').text(), '2013');
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2013, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Go to prev year (x2 == 2011)
target = this.picker.find('.datepicker-months thead th.prev');
target.click().click();
equal(this.picker.find('.datepicker-months thead th.datepicker-switch').text(), '2011');
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
});
test('Navigating prev/next in decade view', function(){
var target;
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
target = this.picker.find('.datepicker-months thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');
target.click();
ok(this.picker.find('.datepicker-years').is(':visible'), 'Year picker is visible');
equal(this.dp.viewMode, 2);
equal(this.picker.find('.datepicker-years thead th.datepicker-switch').text(), '2010-2019');
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Go to next decade (2020-29)
target = this.picker.find('.datepicker-years thead th.next');
target.click();
equal(this.picker.find('.datepicker-years thead th.datepicker-switch').text(), '2020-2029');
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2022, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
// Go to prev year (x2 == 2000-09)
target = this.picker.find('.datepicker-years thead th.prev');
target.click().click();
equal(this.picker.find('.datepicker-years thead th.datepicker-switch').text(), '2000-2009');
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2002, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));
});
test('Selecting date from previous month resets viewDate and date, changing month displayed', function(){
var target;
// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '26'); // Should be Feb 26
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'March 2012');
// Updated internally on click
target.click();
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'February 2012');
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 26));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 1, 26));
// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '29'); // Should be Jan 29
});
test('Selecting date from next month resets viewDate and date, changing month displayed', function(){
var target;
this.input.val('01-04-2012');
this.dp.update();
// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:last');
equal(target.text(), '5'); // Should be May 5
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'April 2012');
// Updated internally on click
target.click();
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'May 2012');
datesEqual(this.dp.viewDate, UTCDate(2012, 4, 5));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 4, 5));
// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '29'); // Should be Apr 29
});
test('Selecting today from next month', patch_date(function(Date){
var target;
this.dp.o.todayHighlight = true;
Date.now = new Date(2012, 2, 3); // Mar 3
this.input.val('01-02-2012'); // Feb 1
this.dp.update();
// Click the today button
target = this.picker.find('.datepicker-days tbody td.today');
equal(target.text(), '3'); // Should be Mar 3
target.click();
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 3));
}));

View File

@@ -0,0 +1,33 @@
module('Mouse Navigation (All)', {
setup: function(){
this.input = $('<input type="text">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Clicking datepicker does not hide datepicker', function(){
ok(this.picker.is(':visible'), 'Picker is visible');
this.picker.trigger('mousedown');
ok(this.picker.is(':visible'), 'Picker is still visible');
});
test('Clicking outside datepicker hides datepicker', function(){
var $otherelement = $('<div />');
$('body').append($otherelement);
ok(this.picker.is(':visible'), 'Picker is visible');
this.input.trigger('click');
ok(this.picker.is(':visible'), 'Picker is still visible');
$otherelement.trigger('mousedown');
ok(this.picker.is(':not(:visible)'), 'Picker is hidden');
$otherelement.remove();
});

View File

@@ -0,0 +1,20 @@
module('NoConflict', {
setup: function(){
var datepicker = $.fn.datepicker.noConflict();
$.fn.bootstrapDP = datepicker;
},
teardown: function(){
$.fn.datepicker = $.fn.bootstrapDP;
delete $.fn.bootstrapDP;
}
});
test('Datepicker starts after calling noConflict() (no undefined defaults or locale_opts)', function(){
$('<div class="input-append date" id="datepicker">'+
'<input size="16" type="text" value="12-02-2012" readonly>'+
'<span class="add-on"><i class="icon-th"></i></span>'+
'</div>')
.appendTo('#qunit-fixture')
.bootstrapDP();
expect(0);
});

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,24 @@
module('Component', {
setup: function(){
this.component = $('<div class="input-append date" id="datepicker">'+
'<input type="text">'+
'</div>')
.appendTo('#qunit-fixture')
.datepicker();
this.dp = this.component.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Check title with timezone', function(){
var target;
this.dp.viewDate = UTCDate(2015, 7, 1);
this.dp.fill();
target = this.picker.find('.datepicker-days .datepicker-switch');
equal(target.text(), 'August 2015', 'Title is "August 2015"');
});

View File

@@ -0,0 +1,27 @@
module('Touch Navigation (All)', {
setup: function(){
this.input = $('<input type="text">')
.appendTo('#qunit-fixture')
.datepicker({format: "dd-mm-yyyy"})
.focus(); // Activate for visibility checks
this.dp = this.input.data('datepicker');
this.picker = this.dp.picker;
},
teardown: function(){
this.picker.remove();
}
});
test('Tapping outside datepicker hides datepicker', function(){
var $otherelement = $('<div />');
$('body').append($otherelement);
ok(this.picker.is(':visible'), 'Picker is visible');
this.input.trigger('click');
ok(this.picker.is(':visible'), 'Picker is still visible');
$otherelement.trigger('touchstart');
ok(this.picker.is(':not(:visible)'), 'Picker is hidden');
$otherelement.remove();
});