// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
//
declare var Windows;
module CorsicaTests {
"use strict";
var glob;
var DatePicker = WinJS.UI.DatePicker;
function process(root) {
return WinJS.UI.processAll(root);
}
function isWinRTEnabled() {
if (window && window['Windows']) {
glob = Windows.Globalization;
return true;
}
return false;
}
var elementToBeRemoved;
function createPickerWithAppend(options?) {
var dateObject = null;
if (options && options.current) {
// NOTE: If the 'current' property is a string, then we want to
// set the property declaratively. If it is a date object, we
// set it imperatively. This is because stringifying the date
// object and reparsing it yields different results on different
// browser implementations.
if (typeof options.current === "string") {
options.current = options.current + " 12:00pm";
} else {
dateObject = options.current;
dateObject.setHours(12);
delete options.current;
}
}
var dp = document.createElement('div');
elementToBeRemoved = dp;
document.body.appendChild(dp);
dp.setAttribute('data-win-control', 'WinJS.UI.DatePicker');
if (options) {
dp.setAttribute('data-win-options', JSON.stringify(options));
}
// NOTE: The datetime UI is created in a deferred UI manner so
// we need to have the timeout() to allow the browser to go through
// a few cycles before returning the object.
return process(dp).then(function () {
return WinJS.Promise.timeout().then(function () {
if (dateObject) {
dp.winControl.current = dateObject;
}
return dp;
});
});
}
// return the select element containing the day component
function dateElement(picker) {
return picker.querySelector('.win-datepicker .win-datepicker-date');
}
// return the select element containing the month component
function monthElement(picker) {
return picker.querySelector('.win-datepicker .win-datepicker-month');
}
// if YEAR component is hidden, this will return null
// return the select element containing the year component
function yearElement(picker) {
return picker.querySelector('.win-datepicker .win-datepicker-year');
}
function dateToString(date) {
var result = "";
if ('month' in date) result += "m=" + date.month.toString() + " ";
if ('day' in date) result += "d=" + date.day.toString() + " ";
if ('year' in date) result += "y=" + date.year.toString() + " ";
return result;
}
// date object can contain values for 'day', 'month', 'year'. If any of these values
// is not present, function will expect querySelector to return null for that cell.
function verifyDate(picker, date) {
// 'March' and '03' (day) by default.
// >>> more clear to use descrete strings to compare in each test case
LiveUnit.LoggingCore.logComment("picker.winControl.current=" + picker.winControl.current + "; expected=" + dateToString(date));
if ('day' in date) {
LiveUnit.Assert.areEqual(date.day.toString() >> 0, dateElement(picker).value >> 0);
} else {
LiveUnit.Assert.areEqual(null, dateElement(picker).value);
}
if ('month' in date) {
LiveUnit.Assert.areEqual(date.month.toString() >> 0, monthElement(picker).selectedIndex + 1);
}
if ('year' in date) {
LiveUnit.Assert.areEqual(date.year.toString(), yearElement(picker).value);
} else {
LiveUnit.Assert.areEqual(null, yearElement(picker).value);
}
}
function unhandledTestError(msg) {
try {
LiveUnit.Assert.fail("unhandled test exception: " + msg);
} catch (ex) {
// don't rethrow assertion failure exception
}
}
// returns the text from the selected option of the specified select control
function getText(selectElement) {
return selectElement.options[selectElement.selectedIndex].text;
}
var dateBackEnd, monthBackEnd, yearBackEnd;
var datePicker;
function checkValues(e) {
var d = new Date(datePicker.winControl.current);
LiveUnit.Assert.areEqual(dateBackEnd, d.getDate(), "The backend date object has a wrong day value");
LiveUnit.Assert.areEqual(monthBackEnd, d.getMonth(), "The backend date object has a wrong month value");
LiveUnit.Assert.areEqual(yearBackEnd, d.getFullYear(), "The backend date object has a wrong year value");
}
function addChangeEvent(picker) {
picker.addEventListener("change", checkValues);
return function () { picker.removeListener(picker, checkValues); };
}
function daysInMonth(y, m) {
if (isWinRTEnabled()) {
var c = new Windows.Globalization.Calendar();
c.month = m + 1;
c.year = y;
return c.numberOfDaysInThisMonth;
}
return new Date(y, m + 1, 0, 12, 0).getDate();
}
function lastDayInMonth(y, m) {
if (isWinRTEnabled()) {
var c = new Windows.Globalization.Calendar();
c.month = m + 1;
c.year = y;
return c.numberOfDaysInThisMonth + c.firstDayInThisMonth - 1;
}
return new Date(y, m + 1, 0, 12, 0).getDate();
}
//;
// I am thinking of removing the check boolean
// using the three functions help us mimic the user selection scenario
// rather than just creating one function with all the changes in it
//
function setMonth(picker, m, notFire = false) {
var selectMonthElement = monthElement(picker);
monthBackEnd = m - 1;
selectMonthElement.selectedIndex = monthBackEnd;
var numOfDays = lastDayInMonth(yearBackEnd, monthBackEnd);
if (dateBackEnd > numOfDays)
dateBackEnd = numOfDays;
if (!notFire) {
fireOnchange(selectMonthElement);
}
}
function setYear(picker, y, notFire = false) {
var selectYearElement = yearElement(picker);
yearBackEnd = y;
selectYearElement.value = yearBackEnd;
var numOfDays = daysInMonth(yearBackEnd, monthBackEnd);
if (dateBackEnd > numOfDays)
dateBackEnd = numOfDays;
if (!notFire) {
fireOnchange(selectYearElement);
}
}
function setDate(picker, d, notFire = false) {
var selectDayElement = dateElement(picker);
dateBackEnd = d;
selectDayElement.selectedIndex = dateBackEnd - 1;
if (!notFire)
fireOnchange(selectDayElement);
}
function setValues() {
var dateObj = new Date();
dateBackEnd = dateObj.getDate();
monthBackEnd = dateObj.getMonth();
yearBackEnd = dateObj.getFullYear();
}
function cleanupDatePicker() {
try {
WinJS.Utilities.disposeSubTree(elementToBeRemoved);
document.body.removeChild(elementToBeRemoved);
elementToBeRemoved = null;
if (!isWinRTEnabled()) {
DatePicker.getInformation = DatePicker._getInformationJS;
}
else {
DatePicker.getInformation = DatePicker._getInformationWinRT;
}
} catch (e) {
LiveUnit.Assert.fail("cleanupDatePicker() failed: " + e);
}
}
var changeHit,
datechangeHit,
monthchangeHit,
yearchangeHit;
var changeType = "change";
function logEventHits(e) {
LiveUnit.LoggingCore.logComment(e.type + ": changeHit=" + changeHit);
}
// note: change event only fires when changing value through UI
var changeHandler = function (e) {
changeHit++;
LiveUnit.Assert.areEqual(e.type, changeType);
logEventHits(e);
};
function attachEventListeners(picker) {
changeHit = datechangeHit = monthchangeHit = yearchangeHit = 0;
picker.addEventListener(changeType, changeHandler, false);
}
function removeEventListeners(picker) {
changeHit = 0;
picker.removeEventListener(changeType, changeHandler);
}
// fire a 'change' event on the provided target element
function fireOnchange(targetElement) {
var myEvent = document.createEvent('HTMLEvents');
myEvent.initEvent('change', true, false);
targetElement.dispatchEvent(myEvent);
}
var dateObjectUI, dataObjectBackEnd;
var supportedCalenders = ["GregorianCalendar", "HijriCalendar", "HebrewCalendar", "JapaneseCalendar", "KoreanCalendar", "ThaiCalendar", "TaiwanCalendar", "UmAlQuraCalendar", "JulianCalendar"];
function getActualUIOrder() {
var domElement:any = document.getElementsByClassName('win-datepicker')[0];
var datePos,
monthPos,
yearPos;
for (var i = 0; i < 3; i++) {
var elem = domElement.childNodes[i].className;
if (elem.indexOf('picker-date') !== -1) {
datePos = i;
}
else if (elem.indexOf('picker-month') !== -1) {
monthPos = i;
}
else {
yearPos = i;
}
}
return getOrder(datePos, monthPos, yearPos);
}
function getOrder(datePos, monthPos, yearPos) {
if (monthPos < yearPos && monthPos < datePos) {
if (yearPos < datePos)
return "MYD";
else
return "MDY";
}
else if (yearPos < monthPos && yearPos < datePos) {
if (monthPos < datePos)
return "YMD";
else
return "YDM";
}
else {
if (yearPos < monthPos)
return "DYM";
else
return "DMY";
}
}
function getExpectedOrder(calendar) {
var dtf = Windows.Globalization.DateTimeFormatting;
var s = "day month.full year";
var c = new dtf.DateTimeFormatter(s);
var formatter = new dtf.DateTimeFormatter(s, c.languages, c.geographicRegion, calendar, c.clock);
var pattern = formatter.patterns[0];
return getOrder(pattern.indexOf("day"), pattern.indexOf("month"), pattern.indexOf("year"));
}
function removeLeadingZeros(val) {
var i = 0;
while (val.charAt(i) === '0') i++;
var t = '';
while (i < val.length)
t += val.charAt(i++);
return t;
}
function checkGlobValues(e) {
var d = new Date(datePicker.winControl.current);
var month = monthElement(datePicker);
var year = yearElement(datePicker);
var day = dateElement(datePicker);
var temp = currentCalendar || '';
LiveUnit.Assert.areEqual(dataObjectBackEnd.dateBackEnd, d.getDate(), "The backend date object has a wrong day value " + temp + " seed is " + getSeed() + " and number of Random Ticks is " + getCount());
LiveUnit.Assert.areEqual(dataObjectBackEnd.monthBackEnd, d.getMonth(), "The backend date object has a wrong month value " + temp + " seed is " + getSeed() + " and number of Random Ticks is " + getCount());
LiveUnit.Assert.areEqual(dataObjectBackEnd.yearBackEnd, d.getFullYear(), "The backend date object has a wrong year value " + temp + " seed is " + getSeed() + " and number of Random Ticks is " + getCount());
//Check the UI
if (dateObjectUI.dateUI !== day.value && dateObjectUI.dateUI !== removeLeadingZeros(day.value))
LiveUnit.Assert.areEqual(dateObjectUI.dateUI, day.value, "The backend date object has a wrong day value " + temp + " seed is " + getSeed() + " and number of Random Ticks is " + getCount());
if (dateObjectUI.monthUI !== month.value && dateObjectUI.monthUI !== removeLeadingZeros(month.value))
LiveUnit.Assert.areEqual(dateObjectUI.monthUI, month.value, "The backend date object has a wrong month value " + temp + " seed is " + getSeed() + " and number of Random Ticks is " + getCount());
if (dateObjectUI.yearUI !== year.value && dateObjectUI.yearUI !== removeLeadingZeros(year.value))
LiveUnit.Assert.areEqual(dateObjectUI.yearUI, year.value, "The backend date object has a wrong year value " + temp + " seed is " + getSeed() + " and number of Random Ticks is " + getCount());
}
function addGlobChangeEvent(picker) {
picker.addEventListener("change", checkGlobValues);
return function () { picker.removeListener(picker, checkGlobValues); };
}
function setBackEnd(calendar) {
calendar.changeCalendarSystem("GregorianCalendar");
dataObjectBackEnd = {
yearBackEnd: calendar.year,
monthBackEnd: calendar.month - 1,
dateBackEnd: calendar.day
};
}
function setUI(myCalendar, calendarType) {
myCalendar.changeCalendarSystem(calendarType);
var dtf = Windows.Globalization.DateTimeFormatting;
var s = "shortdate";
var c = new dtf.DateTimeFormatter(s);
var formatter = new dtf.DateTimeFormatter(s, c.languages, c.geographicRegion, calendarType, c.clock);
var pattern = formatter.patterns[0];
var era = '';
if (pattern.indexOf("era") !== -1)
era = " " + myCalendar.eraAsString();
dateObjectUI = {
yearUI: myCalendar.yearAsString() + era,
monthUI: myCalendar.monthAsString(),
dateUI: myCalendar.dayAsString()
};
}
function getControls(picker) {
return { yearSelect: yearElement(picker), monthSelect: monthElement(picker), dateSelect: dateElement(picker) };
}
function checkMonthNames(selectControls, calendarName, year?) {
var monthSelect = selectControls.monthSelect;
if (isWinRTEnabled()) {
var c = new glob.Calendar();
var myCalendar = new glob.Calendar(c.languages, calendarName, c.getClock());
if (year) {
year = parseInt(year);
//c.addYears(year - c.year);
myCalendar = new glob.Calendar(c.languages, calendarName, c.getClock());
myCalendar.addMonths(monthSelect.selectedIndex + 1 - myCalendar.month);
myCalendar.month = monthSelect.selectedIndex + 1;
myCalendar.addYears(year - myCalendar.year);
myCalendar.day = selectControls.dateSelect.selectedIndex + 1;
//myCalendar.addYears(year - myCalendar.year);
}
var totalNumOfMonths = myCalendar.numberOfMonthsInThisYear;
for (var i = 0; i < totalNumOfMonths; i++) {
myCalendar.addMonths(-1 * myCalendar.month + (i + 1));
LiveUnit.Assert.areEqual(myCalendar.monthAsString(), monthSelect[i].value, "Incorrect month name");
}
}
}
function hijriLeapYear(year) {
var yearValue = parseInt(year);
var r = yearValue % 30;
return (r === 2 || r === 5 || r === 7 || r === 10 || r === 13 || r === 16 || r === 18 || r === 21 || r === 24 || r === 26 || r === 29);
}
function isHebrewLeapYear(year) {
var yearValue = parseInt(year);
var r = yearValue % 19;
return (r === 3 || r === 6 || r === 8 || r === 11 || r === 14 || r === 17 || r === 19);
}
function validateMonth(month, isLeap, numOfDays) {
var val = -1;
switch (month) {
case 1:
case 5:
val = 30;
break;
case 4:
val = 29;
break;
case 6:
if (!isLeap)
val = 29;
else
val = 30;
break;
case 7:
if (isLeap)
val = 29;
else
val = 30;
break;
case 8:
if (!isLeap)
val = 29;
else
val = 30;
break;
case 9:
if (!isLeap)
val = 30;
else
val = 29;
break;
case 10:
if (!isLeap)
val = 29;
else
val = 30;
break;
case 11:
if (!isLeap)
val = 30;
else
val = 29;
break;
case 12:
if (!isLeap)
val = 29;
else
val = 30;
break;
case 13:
val = 29;
}
if (val !== -1)
LiveUnit.Assert.areEqual(val, numOfDays, "incorrect number of days in month " + month);
else
if (numOfDays !== 29 && numOfDays !== 30)
LiveUnit.Assert.areEqual(numOfDays, "incorrect number of days in month " + month);
}
function getMaxDay(selectControl) {
var max = -1;
for (var i = 0; i < selectControl.length; i++) {
var t = parseInt(selectControl[i].value);
if (max < t)
max = t;
}
return max;
}
function isGregorianLeapYear(year) {
var val = parseInt(year);
return ((val % 4 === 0 && val % 100 !== 0) || val % 400 === 0);
}
function convertFromKoreanToGreogrianYear(year) {
return year - (4334 - 2001);
}
function numInYear(year) {
var actualYear = '';
for (var i = 0; i < year.length; i++) {
var c = year.charAt(i);
if (c >= '0' && c <= '9')
actualYear += c;
else if (actualYear !== '')
break;
}
return actualYear;
}
function convertFromThaiToGreogrianYear(year) {
return year - (2544 - 2001);
}
function isJulianLeapYear(year) {
return (year % 4 === 0);
}
function convertFromTaiwanToGreogrianYear(year) {
return year + (2001 - 90); //because 2001 represents 90
}
//These are stubs until replaced with the ABI
function getSeed() {
return 100;
}
function getCount() {
return 2;
}
var currentCalendar;
function verifyDatePickerContent(picker, date) {
if ('day' in date) {
LiveUnit.Assert.areEqual(date.day.toString(), dateElement(picker).value);
} else {
LiveUnit.Assert.areEqual(null, dateElement(picker).value);
}
if ('month' in date) {
LiveUnit.Assert.areEqual(date.month.toString(), monthElement(picker).value);
}
if ('year' in date) {
LiveUnit.Assert.areEqual(date.year.toString(), yearElement(picker).value);
} else {
LiveUnit.Assert.areEqual(null, yearElement(picker).value);
}
}
var numofCalls;
var getInformationJS = function (startDate, endDate) {
var minYear = startDate.getFullYear();
var maxYear = endDate.getFullYear();
var yearSource = {
getLength: function () { return Math.max(0, maxYear - minYear + 1); },
getValue: function (index) { return minYear + index; }
};
var months = ["firstMonth", "secondMonth", "thirdMonth", "fourthMonth", "fifthMonth", "sixthMonth"];
var monthSource = function (yearIndex) {
return {
getLength: function () { return months.length; },
getValue: function (index) { return months[index]; },
getMonthNumber: function (index) { return Math.min(index, months.length - 1); }
};
};
var dateSource = function (yearIndex, monthIndex) {
var year = yearSource.getValue(yearIndex);
var maxValue = 0;
switch (monthIndex) {
case 1:
case 2:
case 4:
case 5:
maxValue = 61;
break;
case 0:
if (year % 4 === 0) {
maxValue = 60;
}
else {
maxValue = 59;
}
break;
case 3:
maxValue = 62;
break;
}
return {
getLength: function () { return maxValue; },
getValue: function (index) { return "" + (index + 1); },
getDateNumber: function (index) { return Math.min(index + 1, maxValue); }
};
};
return {
order: ["date", "year", "month"],
getDate: function (index) {
var year = yearSource.getValue(index.year);
var month = monthSource(index.year).getMonthNumber(index.month) * 2;
var numOfDaysInPreviousMonth = (new Date(year, month + 1, 0)).getDate();
month += ((index.date > (new Date(year, month + 1, 0)).getDate()) ? 1 : 0);
var day = (index.date + 1 > numOfDaysInPreviousMonth) ? index.date + 1 - numOfDaysInPreviousMonth : index.date + 1;
day = Math.min(day, (new Date(year, month + 1, 0).getDate()));
return new Date(year, month, day);
},
getIndex: function (date) {
numofCalls++;
var yearIndex = 0;
var year = date.getFullYear();
if (year < minYear) {
yearIndex = 0;
}
else if (year > this.maxYear) {
yearIndex = yearSource.getLength() - 1;
}
else {
yearIndex = date.getFullYear() - minYear;
}
var monthIndex = Math.min(date.getMonth() / 2, monthSource(yearIndex).getLength()) | 0;
var dateIndex;
if (date.getMonth() % 2 === 0) {
dateIndex = Math.min(date.getDate(), dateSource(yearIndex, monthIndex).getLength()) - 1;
}
else {
var dateValue = date.getDate() + (new Date(year, date.getMonth(), 0, 12)).getDate();
dateIndex = Math.min(dateValue, dateSource(yearIndex, monthIndex).getLength()) - 1;
}
return {
year: yearIndex,
month: monthIndex,
date: dateIndex
};
},
years: yearSource,
months: monthSource,
dates: dateSource
};
};
var ControlOrder = function (x, y, w, h) {
this.startX = x;
this.startY = y;
this.width = w;
this.height = h; //to be used later if we decided to change the snap view shape of controls
};
function checkCorrectCSS(controlsPosition) {
for (var i = 0; i < controlsPosition.length - 1; i++) {
if (controlsPosition[i].startY === controlsPosition[i + 1].startY) { // to protect against snap view
LiveUnit.Assert.areEqual(controlsPosition[i].startX + controlsPosition[i].width + 20, controlsPosition[i + 1].startX, "");
}
}
}
function checkDayCount(controls) {
var year = parseInt(controls.yearSelect.value);
var month = controls.monthSelect.selectedIndex;
var maxValue;
switch (month) {
case 1:
case 2:
case 4:
case 5:
maxValue = 61;
break;
case 0:
if (year % 4 === 0) {
maxValue = 60;
}
else {
maxValue = 59;
}
break;
case 3:
maxValue = 62;
break;
}
return maxValue === controls.dateSelect.length;
}
export class DatePickerDecl {
xtestKnownDayWithIndependentStateofSamoa = function (complete) {
var cleanup;
createPickerWithAppend({
current: new Date(2012, 0, 1),
calendar: 'GregorianCalendar'
}).then(function (picker) {
datePicker = picker;
var selectControls = getControls(picker);
var year = numInYear(selectControls.yearSelect.value);
LiveUnit.Assert.areEqual("2012", year, "Error in known year in Independent State of Samoa");
LiveUnit.Assert.areEqual(0, selectControls.monthSelect.selectedIndex, "Error in known month in Independent State of Samoa");
LiveUnit.Assert.areEqual(0, selectControls.dateSelect.selectedIndex, "Error in known day in Independent State of Samoa");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
};
testParameterOfChangeEvent = function (complete) {
var cleanup;
createPickerWithAppend({ calendar: 'GregorianCalendar' }).then(function (picker) {
datePicker = picker;
cleanup = addChangeEvent(picker);
//testing 31st of December 2015
setValues();
setMonth(picker, 12);
setDate(picker, 31);
setYear(picker, 2015);
verifyDate(picker, { day: 31, month: 12, year: 2015 });
})
.then(null, unhandledTestError)
.then(cleanup) //placed after the error handler to make sure it gets removed even if the test case failed
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
};
testMaxAndMinYearInGregorian = function (complete) {
//BugID: 628192
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
maxYear: 2000,
minYear: 0
}).
then(function (picker) {
datePicker = picker;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual("1", selectControls.yearSelect[0].value, "Incorrect min date");
LiveUnit.Assert.areEqual("2000", selectControls.yearSelect[selectControls.yearSelect.length - 1].value, "Incorrect max date");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testSpecialDayWithIndependentStateofSamoa = function (complete) {
var cleanup;
if (isWinRTEnabled()) {
createPickerWithAppend({ calendar: 'GregorianCalendar' }).then(function (picker) {
datePicker = picker;
cleanup = addChangeEvent(picker);
//testing 31st of January 2012
setValues();
yearBackEnd = 2012;
setYear(picker, 2012);
monthBackEnd = 1;
setMonth(picker, 1);
var selectDayElement = dateElement(picker);
dateBackEnd = 31;
selectDayElement.selectedIndex = selectDayElement.length - 1;
fireOnchange(selectDayElement);
verifyDate(picker, { day: 31, month: 1, year: 2012 });
})
.then(null, unhandledTestError)
.then(cleanup) //placed after the error handler to make sure it gets removed even if the test case failed
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else {
complete();
}
};
testMaxAndMinYearInGregorian_temp = function (complete) {
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
maxYear: 50,
minYear: 0
}).then(function (picker) {
datePicker = picker;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual("1", selectControls.yearSelect[0].value, "Incorrect min date");
LiveUnit.Assert.areEqual("50", selectControls.yearSelect[selectControls.yearSelect.length - 1].value, "Incorrect max date");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testChangeEventParameterInNonLeapYear = function (complete) {
// bug #436665
var cleanup;
createPickerWithAppend({ calendar: 'GregorianCalendar' }).then(function (picker) {
datePicker = picker;
cleanup = addChangeEvent(picker);
setValues();
setMonth(picker, 12);
setDate(picker, 31);
setYear(picker, 2015);
verifyDate(picker, { day: 31, month: 12, year: 2015 });
//testing 28th of Feb 2015
setMonth(picker, 2);
verifyDate(picker, { day: 28, month: 2, year: 2015 });
})
.then(null, unhandledTestError)
.then(cleanup) //placed after the error handler to make sure it gets removed even if the test case failed
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
};
testLeapYearParameter = function (complete) {
// bug #436665
var cleanup;
createPickerWithAppend({ calendar: 'GregorianCalendar' }).then(function (picker) {
datePicker = picker;
cleanup = addChangeEvent(picker);
setValues();
setMonth(picker, 12);
setDate(picker, 31);
setYear(picker, 2015);
verifyDate(picker, { day: 31, month: 12, year: 2015 });
//testing 28th of Feb 2016
setYear(picker, 2016);
setMonth(picker, 2);
verifyDate(picker, { day: 29, month: 2, year: 2016 });
})
.then(null, unhandledTestError)
.then(cleanup)
.then(cleanupDatePicker) //placed after the error handler to make sure it gets removed even if the test case failed
.then(complete, unhandledTestError);
};
testMonthChange = function (complete) {
var cleanup;
createPickerWithAppend({ calendar: 'GregorianCalendar' }).then(function (picker) {
datePicker = picker;
cleanup = addChangeEvent(picker);
setValues();
setMonth(picker, 2);
setDate(picker, 28);
setYear(picker, 2015);
verifyDate(picker, { day: 28, month: 2, year: 2015 });
//testing 28th of Feb 2016
setMonth(picker, 3);
verifyDate(picker, { day: 28, month: 3, year: 2015 });
})
.then(null, unhandledTestError)
.then(cleanup)
.then(cleanupDatePicker) //placed after the error handler to make sure it gets removed even if the test case failed
.then(complete, unhandledTestError);
};
testSimpleDate = function (complete) {
createPickerWithAppend({ calendar: 'GregorianCalendar' }).then(function (picker) {
var today = new Date();
verifyDate(picker, {
day: today.getDate(),
month: today.getMonth() + 1,
year: today.getFullYear()
});
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testDefaults = function (complete) {
// validate datePicker defaults
createPickerWithAppend({ calendar: 'GregorianCalendar' }).then(function (picker) {
var c = picker.winControl;
LiveUnit.Assert.isFalse(c.disabled);
// verify all 3 elements are displayed, style display=""
LiveUnit.Assert.areEqual("", monthElement(picker).style.display);
LiveUnit.Assert.areEqual("", dateElement(picker).style.display);
LiveUnit.Assert.areEqual("", yearElement(picker).style.display);
var year = new Date().getFullYear();
var min = year - 100;
var max = year + 100;
LiveUnit.Assert.areEqual(min, c.minYear);
LiveUnit.Assert.areEqual(max, c.maxYear);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testDefaultFormats = function (complete) {
// validate datePicker default format
createPickerWithAppend({
current: new Date(1978, 3, 7),
calendar: 'GregorianCalendar'
}).then(function (picker) {
LiveUnit.Assert.areEqual("April", getText(monthElement(picker)));
if (isWinRTEnabled()) {
// .substring(1) strips the direction marker off the text
//
LiveUnit.Assert.areEqual("7", getText(dateElement(picker)).substring(1));
LiveUnit.Assert.areEqual("1978", getText(yearElement(picker)).substring(1));
}
else {
LiveUnit.Assert.areEqual("7", getText(dateElement(picker)));
LiveUnit.Assert.areEqual("1978", getText(yearElement(picker)));
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testSetCurrentFromDate = function (complete) {
createPickerWithAppend({ calendar: 'GregorianCalendar' }).then(function (picker) {
var date = new Date(2011, 1, 3, 10, 11, 12);
picker.winControl.current = date;
verifyDate(picker, { day: 3, month: 2, year: 2011 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testDisabled1 = function (complete) {
// create initial control in disabled state
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1972, 4, 1),
disabled: true
}).then(function (picker) {
verifyDate(picker, { day: 1, month: 5, year: 1972 });
LiveUnit.Assert.isTrue(picker.winControl.disabled);
picker.winControl.disabled = false;
LiveUnit.Assert.isFalse(picker.winControl.disabled);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testDisabled2 = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1968, 2, 3),
disabled: false
}).then(function (picker) {
verifyDate(picker, { day: 3, month: 3, year: 1968 });
LiveUnit.Assert.isFalse(picker.winControl.disabled);
picker.winControl.disabled = true;
LiveUnit.Assert.isTrue(picker.winControl.disabled);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testCustomDate = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2005, 1, 3)
}).then(function (picker) {
verifyDate(picker, { day: 3, month: 2, year: 2005 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testLeapYear = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2000, 1, 29)
}).then(function (picker) {
verifyDate(picker, { day: 29, month: 2, year: 2000 });
})
// handle any errors encountered in createPickerWithAppend() through the unhandledTestError
// function. Note the first parameter is null because we want to call the harness
// provided complete function if error or not. This is handled in the next .then()
// statement.
.then(null, unhandledTestError)
.then(cleanupDatePicker)
// call the harness provided complete function when done. Note complete is called
// when actually complete (no errors) or if there was an error in the previous
// then() statement's error handler.
.then(complete, complete);
};
testNonLeapYear = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2001, 1, 29)
}).then(function (picker) {
verifyDate(picker, { day: 1, month: 3, year: 2001 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
// adjust current year to minYear if current year < minYear
testMinYear = function (complete) {
//BugID: 450489 - closed by design
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1989, 3, 20),
minYear: 2000
}).then(function (picker) {
verifyDate(picker, { day: 20, month: 4, year: 2000 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testMaxYear = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2035, 11, 29),
maxYear: 2011
}).then(function (picker) {
verifyDate(picker, { day: 29, month: 12, year: 2011 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testMaxYear2 = function (complete) {
// use current date, apply max year < current date
var today = new Date();
createPickerWithAppend({
calendar: 'GregorianCalendar',
maxYear: 2011,
current: new Date(2121, 0, 2)
}).then(function (picker) {
verifyDate(picker, { day: 2, month: 1, year: 2011 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange1 = function (complete) {
// verify year > range snaps to maxYear
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2021, 11, 1),
maxYear: 2001,
minYear: 2000
}).then(function (picker) {
verifyDate(picker, { day: 1, month: 12, year: 2001 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange1_second = function (complete) {
// verify year < range snaps to min year
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1921, 11, 2),
maxYear: 2001,
minYear: 2000
}).then(function (picker) {
verifyDate(picker, { day: 2, month: 12, year: 2000 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange2 = function (complete) {
// verify if minyear > maxyear, maxyear == minyear
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1972, 11, 3),
maxYear: 1995,
minYear: 2000
}).then(function (picker) {
verifyDate(picker, { day: 3, month: 12, year: 2000 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange3 = function (complete) {
// verify if minyear > maxyear, minyear == maxyear, different attribute order
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1972, 11, 3),
minYear: 2000,
maxYear: 1995
}).then(function (picker) {
verifyDate(picker, { day: 3, month: 12, year: 1995 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange4 = function (complete) {
// verify when minyear == maxyear, year snaps to minyear
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1935, 11, 4),
maxYear: 1995,
minYear: 1995
}).then(function (picker) {
verifyDate(picker, { day: 4, month: 12, year: 1995 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange5 = function (complete) {
//BugID: 628192
// verify invalid input, minyear && maxyear are ignored
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1942, 11, 5),
maxYear: 1995,
minYear: 0 // UNDONE: -1995 (1996 BC fails in WinRT mode)
}).then(function (picker) {
verifyDate(picker, { day: 5, month: 12, year: 1942 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange5_temp = function (complete) {
// verify invalid input, minyear && maxyear are ignored
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1942, 11, 5),
maxYear: 1995,
minYear: 1910 // UNDONE: -1995 (1996 BC fails in WinRT mode)
}).then(function (picker) {
verifyDate(picker, { day: 5, month: 12, year: 1942 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange6 = function (complete) {
// verify min/max adjustment sequence of squirrely-ness
createPickerWithAppend({
calendar: 'GregorianCalendar',
minYear: 2010,
maxYear: 2020,
current: new Date(2011, 11, 5)
}).then(function (picker) {
verifyDate(picker, { day: 5, month: 12, year: 2011 });
var c = picker.winControl;
c.minYear = 2030; // min > previous max
LiveUnit.Assert.areEqual(2030, c.minYear);
LiveUnit.Assert.areEqual(2030, c.maxYear);
c.maxYear = 2130;
LiveUnit.Assert.areEqual(2030, c.minYear);
LiveUnit.Assert.areEqual(2130, c.maxYear);
c.current = new Date(2100, 6, 6);
verifyDate(picker, { day: 6, month: 7, year: 2100 });
c.maxYear = 1980; // max < previous min so min == max == 1980
LiveUnit.Assert.areEqual(1980, c.minYear);
LiveUnit.Assert.areEqual(1980, c.maxYear);
c.minYear = 2000; // min > max so max == min == 2000
LiveUnit.Assert.areEqual(2000, c.minYear);
LiveUnit.Assert.areEqual(2000, c.maxYear);
c.current = new Date(1990, 1, 3);
verifyDate(picker, { day: 3, month: 2, year: 2000 });
c.maxYear = 2100;
LiveUnit.Assert.areEqual(2100, c.maxYear);
LiveUnit.Assert.areEqual(2000, c.minYear);
c.current = new Date(2050, 2, 5);
verifyDate(picker, { day: 5, month: 3, year: 2050 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange7 = function (complete) {
// verify min year only, year snaps to minyear
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(1990, 1, 1),
minYear: 2000
}).then(function (picker) {
verifyDate(picker, { day: 1, month: 2, year: 2000 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testYearRange8 = function (complete) {
// verify max year only, year doesn't go beyond maxyear
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2100, 1, 1),
maxYear: 2000
}).then(function (picker) {
verifyDate(picker, { day: 1, month: 2, year: 2000 });
var c = picker.winControl;
// verify dates < max year still OK
c.current = new Date(1990, 1, 3);
verifyDate(picker, { day: 3, month: 2, year: 1990 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
xtestDayFormatting = function (complete) {
// bug: win8TFS:245862 - consume real WinJS.Glob formatting not yet implemented
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2012, 11, 1),
dayFormat: 'd'
}).then(function (picker) {
verifyDate(picker, { day: '1', month: 12, year: 2012 });
}).then(null, unhandledTestError)
.then(cleanupDatePicker);
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2012, 11, 1),
dayFormat: 'dd'
}).then(function (picker) {
verifyDate(picker, { day: '01', month: 12, year: 2012 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker);
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2012, 11, 1),
dayFormat: ''
}).then(function (picker) {
verifyDate(picker, { month: 12, year: 2012 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
xtestMonthFormatting = function (complete) {
// bug: win8TFS:245862 - consume real WinJS.Glob formatting not yet implemented
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2012, 2, 12),
monthFormat: 'M'
}).then(function (picker) {
verifyDate(picker, { day: 12, month: '3', year: 2012 });
}).then(null, unhandledTestError)
.then(cleanupDatePicker);
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2012, 2, 12),
monthFormat: 'MM'
}).then(function (picker) {
verifyDate(picker, { day: 12, month: '03', year: 2012 });
}).then(null, unhandledTestError)
.then(cleanupDatePicker);
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2012, 2, 12),
monthFormat: 'MMMM'
}).then(function (picker) {
verifyDate(picker, { day: 12, month: 'March', year: 2012 });
}).then(null, unhandledTestError)
.then(cleanupDatePicker);
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2012, 2, 12),
monthFormat: ''
}).then(function (picker) {
verifyDate(picker, { day: 12, year: 2012 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
xtestYearFormatting = function (complete) {
// bug: win8TFS:245862 - consume real WinJS.Glob formatting not yet implemented
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2023, 11, 1),
yearFormat: 'yy'
}).then(function (picker) {
verifyDate(picker, { day: 1, month: 12, year: '23' });
}).then(null, unhandledTestError)
.then(cleanupDatePicker);
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2056, 11, 4),
yearFormat: 'yyyy'
})
.then(function (picker) {
verifyDate(picker, { day: '04', month: 12, year: '2056' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker);
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2089, 11, 7),
yearFormat: ''
})
.then(function (picker) {
verifyDate(picker, { day: 7, month: 12 });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testFireMonthchangeEvent = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
attachEventListeners(picker);
fireOnchange(monthElement(picker));
LiveUnit.Assert.areEqual(1, changeHit);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testFireDatechangeEvent = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
attachEventListeners(picker);
fireOnchange(dateElement(picker));
LiveUnit.Assert.areEqual(1, changeHit);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testFireYearchangeEvent = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
attachEventListeners(picker);
fireOnchange(yearElement(picker));
LiveUnit.Assert.areEqual(1, changeHit);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testFireAllEventsAndRemove = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
attachEventListeners(picker);
verifyDate(picker, { day: '01', month: '04', year: '2011' });
fireOnchange(monthElement(picker));
verifyDate(picker, { day: '01', month: '04', year: '2011' });
fireOnchange(dateElement(picker));
verifyDate(picker, { day: '01', month: '04', year: '2011' });
fireOnchange(yearElement(picker));
verifyDate(picker, { day: '01', month: '04', year: '2011' });
LiveUnit.Assert.areEqual(3, changeHit);
// remove event listeners, verify events not fired
removeEventListeners(picker);
fireOnchange(monthElement(picker));
fireOnchange(dateElement(picker));
fireOnchange(yearElement(picker));
LiveUnit.Assert.areEqual(0, changeHit);
// make sure date hasn't changed
verifyDate(picker, { day: '01', month: '04', year: '2011' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testFireMultipleChangeEvents = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
attachEventListeners(picker);
for (var n = 1; n <= 15; n++) {
fireOnchange(monthElement(picker));
fireOnchange(dateElement(picker));
fireOnchange(yearElement(picker));
LiveUnit.Assert.areEqual(n * 3, changeHit);
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testSettingDateObject = function (complete) {
// BUG: win8TFS: 245862 - consume real WinJS.Glob
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
// note: javascript Date object has 0 based months (0 == January)
// so Feb 03, 2011 == Date(2011, 02, 03)
var date = new Date(2011, 1, 3);
picker.winControl.current = date;
verifyDate(picker, { day: '03', month: '02', year: '2011' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testdatechangeEvent = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
verifyDate(picker, { day: '01', month: '04', year: '2011' });
attachEventListeners(picker);
// change the day
picker.winControl.current = 'April 02, 2011';
verifyDate(picker, { day: '02', month: '04', year: '2011' });
LiveUnit.Assert.areEqual(0, changeHit);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testmonthchangeEvent = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
verifyDate(picker, { day: '01', month: '04', year: '2011' });
attachEventListeners(picker);
// change the month
picker.winControl.current = 'May 01, 2011';
verifyDate(picker, { day: '01', month: '05', year: '2011' });
LiveUnit.Assert.areEqual(0, changeHit);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testyearchangeEvent = function (complete) {
// BUG: 266243 datePicker needs to use Date.getDate() to compare dates instead of Date.getDay() - day of week
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
verifyDate(picker, { day: '01', month: '04', year: '2011' });
attachEventListeners(picker);
// change the year
picker.winControl.current = 'April 01, 2012';
verifyDate(picker, { day: '01', month: '04', year: '2012' });
LiveUnit.Assert.areEqual(0, changeHit);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testCurrentAttribute = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 0, 1)
}).then(function (picker) {
var current = picker.winControl.current;
verifyDate(picker, { day: '01', month: '01', year: '2011' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testThreeEventsAndRemove = function (complete) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 3, 1)
}).then(function (picker) {
attachEventListeners(picker);
verifyDate(picker, { day: '01', month: '04', year: '2011' });
// change all 3
picker.winControl.current = 'June 03, 2013';
verifyDate(picker, { day: '03', month: '06', year: '2013' });
LiveUnit.Assert.areEqual(0, changeHit);
// remove event listeners, verify events still not received
removeEventListeners(picker);
picker.winControl.current = new Date(2014, 6, 4);
verifyDate(picker, { day: '04', month: '07', year: '2014' });
LiveUnit.Assert.areEqual(0, changeHit);
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
};
testHijriCalender = function (complete) {
//BugID: 446784
if (isWinRTEnabled()) {
var calendarType = 'HijriCalendar';
var cleanup;
createPickerWithAppend({
calendar: calendarType,
current: new Date(2011, 9, 25)
}).then(function (picker) {
datePicker = picker;
cleanup = addGlobChangeEvent(picker);
var c = new glob.Calendar();
var myCalendar = new glob.Calendar(c.languages, "GregorianCalendar", c.getClock());
myCalendar.year = 2011;
myCalendar.month = 10;
myCalendar.day = 25;
myCalendar.changeCalendarSystem("HijriCalendar");
setBackEnd(myCalendar);
setUI(myCalendar, calendarType);
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendarType), getActualUIOrder(), "Incorrect UI order");
checkMonthNames(selectControls, calendarType);
myCalendar.addMonths(1);
++selectControls.monthSelect.selectedIndex;
setBackEnd(myCalendar);
setUI(myCalendar, calendarType);
fireOnchange(selectControls.monthSelect);
})
.then(null, unhandledTestError)
.then(cleanup) //placed after the error handler to make sure it gets removed even if the test case failed
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testUpdateDatePickerToHijriCalendar = function (complete) {
if (isWinRTEnabled()) {
var cleanup;
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 9, 25)
}).then(function (picker) {
datePicker = picker;
cleanup = addGlobChangeEvent(picker);
var c = new glob.Calendar();
var calendarType = "GregorianCalendar";
var myCalendar = new glob.Calendar(c.languages, calendarType, c.getClock());
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendarType), getActualUIOrder(), "Incorrect UI order for GregorianCalendar");
calendarType = "HijriCalendar";
picker.winControl.calendar = calendarType;
myCalendar.changeCalendarSystem(calendarType);
LiveUnit.Assert.areEqual(getExpectedOrder(calendarType), getActualUIOrder(), "Incorrect UI order for HijriCalendar");
})
.then(null, unhandledTestError)
.then(cleanup) //placed after the error handler to make sure it gets removed even if the test case failed
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testHijriCalenderLeapDays = function (complete) {
if (isWinRTEnabled()) {
var calendarType = 'HijriCalendar';
createPickerWithAppend({
calendar: calendarType
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
//var calendar = picker['data-win-control'].calendar;
var myCalendar = new glob.Calendar(c.languages, calendarType, c.getClock());
var totalNumOfDays = 30;
var selectControls = getControls(picker);
checkMonthNames(selectControls, calendarType);
LiveUnit.Assert.areEqual(getExpectedOrder(calendarType), getActualUIOrder(), "Incorrect UI order");
for (var i = 0; i < 12; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
if (i === 11 && hijriLeapYear(selectControls.yearSelect.value))
i++;
LiveUnit.Assert.areEqual(totalNumOfDays - (i % 2), selectControls.dateSelect.length, "Error in the number of days in " + selectControls.monthSelect.value + " the Hijri calendar");
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testHijriCalenderLeapDaysInLeapYears = function (complete) {
if (isWinRTEnabled()) {
var calendarType = 'HijriCalendar';
createPickerWithAppend({
calendar: calendarType
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var totalNumOfDays = 30;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
selectControls.yearSelect.value = "1431"; //example of Leap year
fireOnchange(selectControls.yearSelect);
checkMonthNames(selectControls, calendar);
for (var i = 0; i < 12; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
if (i === 11 && hijriLeapYear(selectControls.yearSelect.value))
i++;
LiveUnit.Assert.areEqual(totalNumOfDays - (i % 2), selectControls.dateSelect.length, "Error in the number of days in " + selectControls.monthSelect.value + " the Hijri calendar");
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testSpecialHebrewCalendarScenario = function (complete) {
if (isWinRTEnabled()) {
var calendarType = 'HebrewCalendar';
createPickerWithAppend({
calendar: calendarType
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
var d = new Date();
var currentYear = d.getFullYear();
//5784 in hebrew === 2024 in Gregorian
selectControls.yearSelect.selectedIndex = selectControls.yearSelect.selectedIndex + (2024 - currentYear);
fireOnchange(selectControls.yearSelect);
selectControls.dateSelect.selectedIndex = 28;
fireOnchange(selectControls.dateSelect);
selectControls.monthSelect.selectedIndex = 3;
fireOnchange(selectControls.monthSelect);
var max = selectControls.dateSelect.length;
LiveUnit.Assert.areEqual(29, max, "Wrong number of days populated into dateControl");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testSpecialHebrewCalendar = function (complete) {
if (isWinRTEnabled()) {
var calendarType = 'HebrewCalendar';
createPickerWithAppend({
calendar: calendarType,
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var totalNumOfDays = 30;
var years = ["5784", "5785"]; //first is a leap year and second is not leap year
var gregorianYears = [2024, 2025]; //Gregorian Years
var numOfmonths;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
for (var j = 0; j < years.length; j++) {
var d = new Date();
var currentYear = d.getFullYear();
selectControls.yearSelect.selectedIndex = selectControls.yearSelect.selectedIndex + (parseInt(years[j]) - myCalendar.year); //selectControls.yearSelect.selectedIndex + (gregorianYears[j] - currentYear);
myCalendar.year = parseInt(years[j]); // Update local calendar to stay in sync with DatePicker's private calendar
fireOnchange(selectControls.yearSelect);
checkMonthNames(selectControls, calendar, years[j]);
numOfmonths = 12;
var isLeap = isHebrewLeapYear(years[j]);
if (isLeap)
numOfmonths = 13;
LiveUnit.Assert.areEqual(numOfmonths, selectControls.monthSelect.length, "incorrect number of months in year " + years[j]);
for (var i = 0; i < numOfmonths; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
validateMonth(i + 1, isLeap, selectControls.dateSelect.length);
}
}
LiveUnit.Assert.areEqual(numOfmonths, selectControls.monthSelect.length, "Error in the number of months in the Hebrew calendar");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testNonLeapYearInGregorianCalendar = function (complete) {
if (isWinRTEnabled()) {
var calendarType = 'GregorianCalendar';
var cleanup;
createPickerWithAppend({
calendar: calendarType,
minYear: 1899,
current: new Date(1900, 3, 7)
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
checkMonthNames(selectControls, calendar);
selectControls.monthSelect.selectedIndex = 1;
fireOnchange(selectControls.monthSelect);
var totalNumofDays = 28;
LiveUnit.Assert.areEqual(totalNumofDays, selectControls.dateSelect.length, "Error in the number of days in a non leap year");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testLeapYearInGregorianCalendar = function (complete) {
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'GregorianCalendar';
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2000, 3, 7)
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var selectControls = getControls(picker);
checkMonthNames(selectControls, calendar);
selectControls.monthSelect.selectedIndex = 1;
fireOnchange(selectControls.monthSelect);
var totalNumofDays = 29;
LiveUnit.Assert.areEqual(totalNumofDays, selectControls.dateSelect.length, "Error in the number of days in a non leap year");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testNumOfDaysInKoreanCalendar = function (complete) {
//WinRT bug
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'KoreanCalendar';
createPickerWithAppend({
calendar: calendarType
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
checkMonthNames(selectControls, calendar);
for (var j = 0; j < 5; j++) {
for (var i = 0; i < 12; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
var numOfdaysInMonth = daysInMonth(convertFromKoreanToGreogrianYear(parseInt(selectControls.yearSelect.value)), i);
LiveUnit.Assert.areEqual(numOfdaysInMonth, selectControls.dateSelect.length, "Error in the number of days in Korean Calendar month " + (i + 1) + " and year " + selectControls.yearSelect.value);
}
selectControls.yearSelect.selectedIndex++; //to make sure we included a leap year
fireOnchange(selectControls.yearSelect);
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testKnownDayInThai = function (complete) {
//BugID: 449918
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'ThaiCalendar';
createPickerWithAppend({
calendar: calendarType,
minYear: 2000,
current: new Date(2001, 0, 1)
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
checkMonthNames(selectControls, calendar);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
var year = numInYear(selectControls.yearSelect.value);
LiveUnit.Assert.areEqual('2544', year, "Error in known year in Thai");
LiveUnit.Assert.areEqual(0, selectControls.monthSelect.selectedIndex, "Error in known month in Thai");
LiveUnit.Assert.areEqual(0, selectControls.dateSelect.selectedIndex, "Error in known day in Thai");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testNumOfDaysInThaiCalendar = function (complete) {
//BugID: 651414
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'ThaiCalendar';
createPickerWithAppend({
calendar: calendarType
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
for (var j = 0; j < 5; j++) {
checkMonthNames(selectControls, calendar, selectControls.yearSelect.value);
for (var i = 0; i < 12; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
var numOfdaysInMonth = daysInMonth(convertFromThaiToGreogrianYear(parseInt(selectControls.yearSelect.value)), i);
LiveUnit.Assert.areEqual(numOfdaysInMonth, selectControls.dateSelect.length, "Error in the number of days in Thai Calendar month " + (i + 1) + " and year " + selectControls.yearSelect.value);
}
selectControls.yearSelect.selectedIndex++; //to make sure we included a leap year
fireOnchange(selectControls.yearSelect);
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testJapaneseCalendarKnownDate = function (complete) {
//BugID: 628192
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'JapaneseCalendar';
createPickerWithAppend({
calendar: calendarType,
current: new Date(2001, 0, 1)
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
checkMonthNames(selectControls, calendar);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
var year = numInYear(selectControls.yearSelect.value);
LiveUnit.Assert.areEqual("13", year, "Error in known year in Japanese");
LiveUnit.Assert.areEqual(0, selectControls.monthSelect.selectedIndex, "Error in known month in Japanese");
LiveUnit.Assert.areEqual(0, selectControls.dateSelect.selectedIndex, "Error in known day in Japanese");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testJapaneseCalendarKnownBuggyDate = function (complete) {
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'JapaneseCalendar';
createPickerWithAppend({
calendar: calendarType,
current: new Date(1989, 0, 7)
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
LiveUnit.Assert.areEqual(1, selectControls.monthSelect.length, "Error in number of months in Japanese Calendar");
LiveUnit.Assert.areEqual(7, selectControls.dateSelect.length, "Error in number of days in Japanese Calendar");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testJapaneseCalendarKnownDate_temp = function (complete) {
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'JapaneseCalendar';
createPickerWithAppend({
calendar: calendarType,
current: new Date(2001, 0, 1),
minYear: 1990,
maxYear: 2010
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
checkMonthNames(selectControls, calendar);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
var year = numInYear(selectControls.yearSelect.value);
LiveUnit.Assert.areEqual("13", year, "Error in known year in Japanese");
LiveUnit.Assert.areEqual(0, selectControls.monthSelect.selectedIndex, "Error in known month in Japanese");
LiveUnit.Assert.areEqual(0, selectControls.dateSelect.selectedIndex, "Error in known day in Japanese");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testNumOfDaysInJapaneseCalendar = function (complete) {
//WinRT bug
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'JapaneseCalendar';
createPickerWithAppend({
calendar: calendarType
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
for (var j = 0; j < 5; j++) {
myCalendar.addMonths(-1 * myCalendar.month + 1);
checkMonthNames(selectControls, calendar, selectControls.yearSelect.value);
for (var i = 0; i < 12; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
setBackEnd(myCalendar);
var numOfdaysInMonth = daysInMonth(myCalendar.year, i);
myCalendar.changeCalendarSystem(calendar);
if (i !== 1) //in order not to add an extra year by mistake
myCalendar.addMonths(1);
LiveUnit.Assert.areEqual(numOfdaysInMonth, selectControls.dateSelect.length, "Error in the number of days in Japanese Calendar month " + (i + 1) + " and year " + selectControls.yearSelect.value);
}
myCalendar.addYears(1);
selectControls.yearSelect.selectedIndex++; //to make sure we included a leap year
fireOnchange(selectControls.yearSelect);
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testMinAndMaxYearGlob = function (complete) {
//BugID: 450489
if (isWinRTEnabled()) {
var calendarType = 'HijriCalendar';
var cleanup;
var minYearValue = 1430;
var maxYearValue = 1462;
createPickerWithAppend({
calendar: calendarType,
minYear: 2009,
maxYear: 2040
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
checkMonthNames(selectControls, calendar);
LiveUnit.Assert.areEqual(minYearValue + '', selectControls.yearSelect[0].value, "Error in the specified minimum year");
LiveUnit.Assert.areEqual(maxYearValue + '', selectControls.yearSelect[selectControls.yearSelect.length - 1].value, "Error in the specified maximum year");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testJulianCalendarKnownDay = function (complete) {
//not working because of a problem with WinRT Glob
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'JulianCalendar';
createPickerWithAppend({
calendar: calendarType,
current: new Date(2001, 0, 1)
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
checkMonthNames(selectControls, calendar);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
var year = numInYear(selectControls.yearSelect.value);
LiveUnit.Assert.areEqual("2000", year, "Error in known year in Julian");
LiveUnit.Assert.areEqual(11, selectControls.monthSelect.selectedIndex, "Error in known month in Julian");
LiveUnit.Assert.areEqual(18, selectControls.dateSelect.selectedIndex, "Error in known day in Julian");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testJulianCalendarNumOfDays = function (complete) {
//not working because of a problem with WinRT Glob
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'JulianCalendar';
createPickerWithAppend({
calendar: calendarType,
minYear: 1889,
maxYear: 2050
}).then(function (picker) {
datePicker = picker;
//1900 is a leap year in Julian Calendar but not a leap year in Gregorian Calendar
//2000 is a leap year in both Gregorian and Julian Calendars due to the exception fo divisible by 400
//2002 is a non leap year in both Gregorian and Julian Calendars
//2004 is a leap year in both Gregorian and Julian Calendars with no exceptions of divisible by 400
var years = [1900, 2000, 2002, 2004];
var calendar = calendarType;
var selectControls = getControls(picker);
for (var i = 0; i < years.length; i++) {
selectControls.yearSelect.value = years[i];
fireOnchange(selectControls.yearSelect);
checkMonthNames(selectControls, calendar, years[i]);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
var isLeap = isJulianLeapYear(years[i]);
for (var j = 0; j < 12; j++) {
selectControls.monthSelect.selectedIndex = j;
fireOnchange(selectControls.monthSelect);
var year = years[i];
if (isLeap) {
year = 2000; //to make sure that daysInMonth will work for Julian too to account for the case that the year is divisible by 100
}
var numOfDays = daysInMonth(year, j);
LiveUnit.Assert.areEqual(numOfDays, selectControls.dateSelect.length, "Correct number of days in month " + (j + 1) + " in year " + years[i]);
}
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testTaiwanKnownDate = function (complete) {
//BugID: 628192
//BugID: 449809
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'TaiwanCalendar';
createPickerWithAppend({
calendar: calendarType,
current: new Date(2001, 0, 1)
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
var year = numInYear(selectControls.yearSelect.value);
LiveUnit.Assert.areEqual("90", year, "Error in known year in Taiwan Calendar");
LiveUnit.Assert.areEqual(0, selectControls.monthSelect.selectedIndex, "Error in known month in Taiwan Calendar");
LiveUnit.Assert.areEqual(0, selectControls.dateSelect.selectedIndex, "Error in known day in Taiwan Calendar");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testTaiwanKnownDate_temp = function (complete) {
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'TaiwanCalendar';
createPickerWithAppend({
calendar: calendarType,
current: new Date(2001, 0, 1),
minYear: 1990,
maxYear: 2011
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
var year = numInYear(selectControls.yearSelect.value);
LiveUnit.Assert.areEqual("90", year, "Error in known year in Taiwan Calendar");
LiveUnit.Assert.areEqual(0, selectControls.monthSelect.selectedIndex, "Error in known month in Taiwan Calendar");
LiveUnit.Assert.areEqual(0, selectControls.dateSelect.selectedIndex, "Error in known day in Taiwan Calendar");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testTaiwanCalendarNumOfDays = function (complete) {
//BugID: 628192
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'TaiwanCalendar';
createPickerWithAppend({
calendar: calendarType,
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
for (var j = 0; j < 5; j++) {
checkMonthNames(selectControls, calendar, selectControls.yearSelect.value);
for (var i = 0; i < 12; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
var numOfdaysInMonth = daysInMonth(convertFromTaiwanToGreogrianYear(parseInt(selectControls.yearSelect.value)), i);
LiveUnit.Assert.areEqual(numOfdaysInMonth, selectControls.dateSelect.length, "Error in the number of days in Korean Calendar month " + (i + 1) + " and year " + selectControls.yearSelect.value);
}
selectControls.yearSelect.selectedIndex++; //to make sure we included a leap year
fireOnchange(selectControls.yearSelect);
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testTaiwanCalendarNumOfDays_temp = function (complete) {
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'TaiwanCalendar';
createPickerWithAppend({
calendar: calendarType,
maxYear: 2020,
minYear: 1990
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
for (var j = 0; j < 5; j++) {
checkMonthNames(selectControls, calendar, selectControls.yearSelect.value);
for (var i = 0; i < 12; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
var numOfdaysInMonth = daysInMonth(convertFromTaiwanToGreogrianYear(parseInt(selectControls.yearSelect.value)), i);
LiveUnit.Assert.areEqual(numOfdaysInMonth, selectControls.dateSelect.length, "Error in the number of days in Korean Calendar month " + (i + 1) + " and year " + selectControls.yearSelect.value);
}
selectControls.yearSelect.selectedIndex++; //to make sure we included a leap year
fireOnchange(selectControls.yearSelect);
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testUmAlQuraCalenderLeapDays = function (complete) {
//BugID: 449812
if (isWinRTEnabled()) {
var calendarType = 'UmAlQuraCalendar';
createPickerWithAppend({
calendar: calendarType
}).then(function (picker) {
datePicker = picker;
var c = new glob.Calendar();
var calendar = calendarType;
var myCalendar = new glob.Calendar(c.languages, calendar, c.getClock());
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
checkMonthNames(selectControls, calendar);
for (var i = 0; i < 12; i++) {
selectControls.monthSelect.selectedIndex = i;
fireOnchange(selectControls.monthSelect);
var numOfDays = selectControls.dateSelect.length;
if (numOfDays !== 29 && numOfDays !== 30)
LiveUnit.Assert.areEqual(30, numOfDays, "Error in the number of days in " + selectControls.monthSelect.value + " the UmAlQura calendar");
}
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testDateWithObviousFormat = function (complete) {
//BugID: 538276
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'April 01, 2011',
yearPattern: "{year.full}",
monthPattern: "{month.integer(2)}",
datePattern: "{day.integer(2)}",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: '01', month: '04', year: '2011' });
attachEventListeners(picker);
// change the day
picker.winControl.current = 'April 02, 2011';
verifyDatePickerContent(picker, { day: '02', month: '04', year: '2011' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
}
else {
complete();
}
};
testDateWithAbbreviatedNameFormat = function (complete) {
//BugID: 538276
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'December 22, 2011',
yearPattern: "{year.abbreviated(2)}",
monthPattern: "{month.abbreviated(3)} .",
datePattern: "{dayofweek.abbreviated(4)} .",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: 'Thu .', month: 'Dec .', year: '11' });
picker.winControl.current = 'February 02, 2005';
verifyDatePickerContent(picker, { day: 'Wed .', month: 'Feb .', year: '05' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
}
else {
complete();
}
};
testDateWithAbbreviatedFormat = function (complete) {
//BugID: 538276
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'April 05, 2011',
yearPattern: "year {year.full}",
monthPattern: "month {month.full}",
datePattern: "day {dayofweek.solo.full}",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: 'day Tuesday', month: 'month April', year: 'year 2011' });
// change the day
picker.winControl.current = 'March 25, 2012';
verifyDatePickerContent(picker, { day: 'day Sunday', month: 'month March', year: 'year 2012' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
}
else {
complete();
}
};
testDateWithSoloFormats = function (complete) {
//BugID: 628192
//BugID: 538276
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'May 30, 1999',
yearPattern: "example {year.abbreviated(2)}",
monthPattern: "month {month.solo.full}",
datePattern: "day {dayofweek.solo.full}",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: 'day Sunday', month: 'month May', year: 'example 99' });
// change the day
picker.winControl.current = 'July 26, 2019';
verifyDatePickerContent(picker, { day: 'day Friday', month: 'month July', year: 'example 19' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
}
else {
complete();
}
};
testDateWithSoloFormats_temp = function (complete) {
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'May 30, 1999',
minYear: 1990,
maxyYear: 2011,
yearPattern: "example {year.abbreviated(2)}",
monthPattern: "month {month.solo.full}",
datePattern: "day {dayofweek.solo.full}",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: 'day Sunday', month: 'month May', year: 'example 99' });
// change the day
picker.winControl.current = 'July 26, 2019';
verifyDatePickerContent(picker, { day: 'day Friday', month: 'month July', year: 'example 19' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
}
else {
complete();
}
};
testDateWithSoloAbbreviatedFormats = function (complete) {
//BugID: 628192
//BugID: 538276
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'May 30, 1999',
yearPattern: "example {year.abbreviated(2)}",
monthPattern: "month {month.solo.abbreviated(3)}",
datePattern: "day {dayofweek.solo.abbreviated(2)}",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: 'day Su', month: 'month May', year: 'example 99' });
// change the day
picker.winControl.current = 'July 26, 2019';
verifyDatePickerContent(picker, { day: 'day Fr', month: 'month Jul', year: 'example 19' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
}
else {
complete();
}
};
testDateWithSoloAbbreviatedFormats_temp = function (complete) {
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'May 30, 1999',
minYear: 1990,
maxYear: 2020,
yearPattern: "example {year.abbreviated(2)}",
monthPattern: "month {month.solo.abbreviated(3)}",
datePattern: "day {dayofweek.solo.abbreviated(2)}",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: 'day Su', month: 'month May', year: 'example 99' });
// change the day
picker.winControl.current = 'July 26, 2019';
verifyDatePickerContent(picker, { day: 'day Fr', month: 'month Jul', year: 'example 19' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
}
else {
complete();
}
};
testCreateMutipleDatePickersOneWithPatternAndOneWithout = function (complete) {
//BugID: 628192
//BugID: 538276
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'May 30, 1999',
yearPattern: "example {year.abbreviated(2)}",
monthPattern: "month {month.solo.abbreviated(3)}",
datePattern: "day {dayofweek.solo.abbreviated(2)}",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: 'day Su', month: 'month May', year: 'example 99' });
// change the day
picker.winControl.current = 'July 26, 2019';
verifyDatePickerContent(picker, { day: 'day Fr', month: 'month Jul', year: 'example 19' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(function () {
createPickerWithAppend({
current: 'October 30, 2011',
calendar: 'GregorianCalendar',
}).then(function (picker) {
verifyDatePickerContent(picker, { day: '30', month: 'October', year: '2011' });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker);
})
.then(complete, complete);
}
else {
complete();
}
};
xtestVerifyCSSVerticalLayout = function (complete) {
/* bug #555425, test passes in IE and wwahost if you comment out these lines in the ui-dark.css file:
.win-datepicker {
display: -ms-inline-box;
height: auto;
width: auto;
}
when bug #555425 is fixed, similar test case needs to be added to timepicker-decl.js
*/
var targetStyleSheet = null;
var newRuleIndex = -1;
createPickerWithAppend().then(function (picker:any) {
/* add this rule so that any subelements starting with 'win-datepicker' get the new style to make them layout vertical
.vertAlwaysDate *[class^="win-datepicker"] {
display:block;
float:none;
}
*/
var countStyleSheets = document.styleSheets.length;
// append new stylesheet to head
targetStyleSheet = document.createElement('STYLE');
document.head.appendChild(targetStyleSheet);
// verify new style sheet was added
LiveUnit.Assert.isTrue(document.styleSheets.length === countStyleSheets + 1);
countStyleSheets++;
// append new rule to the style sheet
targetStyleSheet = document.styleSheets[countStyleSheets - 1];
var countRules = targetStyleSheet.cssRules.length;
// note: return from addRule is squirrely. When adding to sheet 0 it returns 1735 (perhaps index of *all* rules??), but cssRules.length is only 389 for the sheet 0
targetStyleSheet.addRule(".vertAlwaysDate *[class^='win-datepicker']", "float: none; display: block; background-color:red;");
newRuleIndex = targetStyleSheet.cssRules.length - 1;
LiveUnit.Assert.isTrue(targetStyleSheet.cssRules.length === countRules + 1, "expected #cssRules + 1 after addRule; previous #cssRules=" + countRules + ", after addRule #cssRules=" + targetStyleSheet.cssRules.length);
LiveUnit.Assert.areEqual(".vertAlwaysDate *[class^='win-datepicker'] { float: none; display: block; background-color: red; }", targetStyleSheet.cssRules[newRuleIndex].cssText);
// add the vertAlwaysDate class to the datepicker control
picker.className += " vertAlwaysDate";
// verify the Y coordinates of child items are in increasing order by at least height of the child SELECT element
var currTop, currHeight;
var prevTop = -1;
var height0 = picker.childNodes[0].offsetHeight;
for (var x = 0; x < picker.childNodes.length; x++) {
currHeight = picker.childNodes[x].offsetHeight;
LiveUnit.Assert.isTrue(currHeight === height0, "expected height of current element === height of first element. Actual: currHeight=" + currHeight + ", height0=" + height0);
currTop = picker.childNodes[x].offsetTop;
LiveUnit.Assert.isTrue(currTop >= (prevTop + currHeight), "expecting currTop > (prevTop + currHeight). Actual: currTop=" + currTop + ", prevTop=" + prevTop + ", currHeight=" + currHeight);
prevTop = currTop;
}
})
.then(null, unhandledTestError)
.then(function () {
if (targetStyleSheet) {
targetStyleSheet.removeRule(newRuleIndex);
}
cleanupDatePicker();
})
.then(complete, complete);
};
testGetInformationCheckValidityOfControls = function (complete) {
if (!isWinRTEnabled()) {
var cleanup;
DatePicker.getInformation = getInformationJS;
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: new Date(2011, 11, 31)
}).then(function (picker) {
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual("DYM", getActualUIOrder(), "Incorrect UI order");
LiveUnit.Assert.areEqual(6, selectControls.monthSelect.length, "checking the number of months in the custom calendar");
LiveUnit.Assert.areEqual("sixthMonth", selectControls.monthSelect.value, "checking the correctness of the selected month");
LiveUnit.Assert.areEqual("61", selectControls.dateSelect.value, "checking the correctness of the selected day");
LiveUnit.Assert.areEqual("2011", selectControls.yearSelect.value, "checking the correctness of the selected year");
for (var j = 0; j < 4; j++) { // to make sure that we will hit a leap year
setYear(picker, (parseInt(selectControls.yearSelect.value) + 1) + '');
for (var i = 1; i <= selectControls.monthSelect.length; i++) {
setMonth(picker, i);
LiveUnit.Assert.isTrue(checkDayCount(selectControls));
}
}
})
.then(null, unhandledTestError)
.then(cleanup) //placed after the error handler to make sure it gets removed even if the test case failed
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else {
complete();
}
};
testSpecialCustomCalendarCasesWithChangeEvents = function (complete) {
if (!isWinRTEnabled()) {
var cleanup;
DatePicker.getInformation = getInformationJS;
createPickerWithAppend({ current: new Date(2011, 11, 31) }).then(function (picker) {
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual("DYM", getActualUIOrder(), "Incorrect UI order");
LiveUnit.Assert.areEqual(6, selectControls.monthSelect.length, "checking the number of months in the custom calendar");
LiveUnit.Assert.areEqual("sixthMonth", selectControls.monthSelect.value, "checking the correctness of the selected month");
LiveUnit.Assert.areEqual("61", selectControls.dateSelect.value, "checking the correctness of the selected day");
LiveUnit.Assert.areEqual("2011", selectControls.yearSelect.value, "checking the correctness of the selected year");
setMonth(picker, 1);
LiveUnit.Assert.areEqual(6, selectControls.monthSelect.length, "checking the number of months in the custom calendar");
LiveUnit.Assert.areEqual("firstMonth", selectControls.monthSelect.value, "checking the correctness of the selected month");
LiveUnit.Assert.areEqual("59", selectControls.dateSelect.value, "checking the correctness of the selected day");
LiveUnit.Assert.areEqual("2011", selectControls.yearSelect.value, "checking the correctness of the selected year");
setMonth(picker, 4);
setDate(picker, 62);
LiveUnit.Assert.areEqual(6, selectControls.monthSelect.length, "checking the number of months in the custom calendar");
LiveUnit.Assert.areEqual("fourthMonth", selectControls.monthSelect.value, "checking the correctness of the selected month");
LiveUnit.Assert.areEqual("62", selectControls.dateSelect.value, "checking the correctness of the selected day");
LiveUnit.Assert.areEqual("2011", selectControls.yearSelect.value, "checking the correctness of the selected year");
setYear(picker, "2012");
setMonth(picker, 5);
LiveUnit.Assert.areEqual(6, selectControls.monthSelect.length, "checking the number of months in the custom calendar");
LiveUnit.Assert.areEqual("fifthMonth", selectControls.monthSelect.value, "checking the correctness of the selected month");
LiveUnit.Assert.areEqual("61", selectControls.dateSelect.value, "checking the correctness of the selected day");
LiveUnit.Assert.areEqual("2012", selectControls.yearSelect.value, "checking the correctness of the selected year");
setMonth(picker, 1);
LiveUnit.Assert.areEqual(6, selectControls.monthSelect.length, "checking the number of months in the custom calendar");
LiveUnit.Assert.areEqual("firstMonth", selectControls.monthSelect.value, "checking the correctness of the selected month");
LiveUnit.Assert.areEqual("60", selectControls.dateSelect.value, "checking the correctness of the selected day");
LiveUnit.Assert.areEqual("2012", selectControls.yearSelect.value, "checking the correctness of the selected year");
})
.then(null, unhandledTestError)
.then(cleanup) //placed after the error handler to make sure it gets removed even if the test case failed
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else {
complete();
}
};
testUmAlQuaraCalenderKnownDate = function (complete) {
if (isWinRTEnabled()) {
var calendarType = 'UmAlQuraCalendar';
var cleanup;
createPickerWithAppend({
calendar: calendarType,
current: new Date(2011, 9, 25)
}).then(function (picker) {
datePicker = picker;
cleanup = addGlobChangeEvent(picker);
var c = new glob.Calendar();
var myCalendar = new glob.Calendar(c.languages, "GregorianCalendar", c.getClock());
myCalendar.year = 2011;
myCalendar.month = 10;
myCalendar.day = 25;
myCalendar.changeCalendarSystem("UmAlQuraCalendar");
setBackEnd(myCalendar);
setUI(myCalendar, calendarType);
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendarType), getActualUIOrder(), "Incorrect UI order");
checkMonthNames(selectControls, calendarType);
myCalendar.addMonths(1);
++selectControls.monthSelect.selectedIndex;
setBackEnd(myCalendar);
setUI(myCalendar, calendarType);
fireOnchange(selectControls.monthSelect);
})
.then(null, unhandledTestError)
.then(cleanup) //placed after the error handler to make sure it gets removed even if the test case failed
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testMaxAndMinInUmAlQuraCalender = function (complete) {
//BugID: 566405
//UmAlquara calendar supports up to 2029
if (isWinRTEnabled()) {
var calendarType = 'UmAlQuraCalendar';
createPickerWithAppend({
calendar: calendarType,
maxYear: 2200,
minYear: 623 //first year of umalquara is 1900
}).then(function (picker) {
datePicker = picker;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual("1318", selectControls.yearSelect[0].value, "Incorrect min date");
LiveUnit.Assert.areEqual("1500", selectControls.yearSelect[selectControls.yearSelect.length - 1].value, "Incorrect max date");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testMaxAndMinInHijriCalender = function (complete) {
//BugID: 628192
if (isWinRTEnabled()) {
var calendarType = 'HijriCalendar';
createPickerWithAppend({
calendar: calendarType,
maxYear: 2200,
minYear: 623 //first year of HijriCalendar
}).then(function (picker) {
datePicker = picker;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual("1627", selectControls.yearSelect[selectControls.yearSelect.length - 1].value, "Incorrect max date");
LiveUnit.Assert.areEqual("1", selectControls.yearSelect[0].value, "Incorrect min date");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testMaxAndMinYearInGregorianWithZeroMinYear = function (complete) {
//BugID: 566275
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
maxYear: 2000,
minYear: 0
}).then(function (picker) {
datePicker = picker;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual("1", selectControls.yearSelect[0].value, "Incorrect min date");
LiveUnit.Assert.areEqual("2000", selectControls.yearSelect[selectControls.yearSelect.length - 1].value, "Incorrect max date");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testMaxAndMinYearInGregorianWithNegativeMinYear = function (complete) {
//BugID: 628192
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
maxYear: 2000,
minYear: -1
}).then(function (picker) {
datePicker = picker;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual("1", selectControls.yearSelect[0].value, "Incorrect min date");
LiveUnit.Assert.areEqual("2000", selectControls.yearSelect[selectControls.yearSelect.length - 1].value, "Incorrect max date");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testTaiwanLeapMinYears = function (complete) {
//BugID: 628192
if (isWinRTEnabled()) {
var cleanup;
var calendarType = 'TaiwanCalendar';
createPickerWithAppend({
calendar: calendarType,
minYear: 1899,
maxYear: 2111,
current: new Date(1900, 0, 1)
}).then(function (picker) {
datePicker = picker;
var calendar = calendarType;
var selectControls = getControls(picker);
LiveUnit.Assert.areEqual(getExpectedOrder(calendar), getActualUIOrder(), "Incorrect UI order");
LiveUnit.Assert.areEqual("1", selectControls.yearSelect[0].value, "Incorrect min date");
LiveUnit.Assert.areEqual("200", selectControls.yearSelect[selectControls.yearSelect.length - 1].value, "Incorrect max date");
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, unhandledTestError);
}
else
complete();
};
testDateWithAbbreviatedWithSpecialCharacters = function (complete) {
if (isWinRTEnabled()) {
createPickerWithAppend({
calendar: 'GregorianCalendar',
current: 'April 05, 2011',
yearPattern: "year: ' & < > # {year.full}",
monthPattern: 'month: ! @ $ % ^ " {month.full}',
datePattern: "day ( ) - + = _ {dayofweek.solo.full}",
}).then(function (picker) {
verifyDatePickerContent(picker, { day: 'day ( ) - + = _ Tuesday', month: 'month: ! @ $ % ^ " April', year: "year: ' & < > # 2011" });
// change the day
picker.winControl.current = 'March 25, 2012';
verifyDatePickerContent(picker, { day: 'day ( ) - + = _ Sunday', month: 'month: ! @ $ % ^ " March', year: "year: ' & < > # 2012" });
})
.then(null, unhandledTestError)
.then(cleanupDatePicker)
.then(complete, complete);
}
else {
complete();
}
};
testConstructionWithEventHandlerInOptions = function (complete) {
var handler = function () {
complete();
};
var dp = new DatePicker(null, { onchange: handler });
document.body.appendChild(dp.element);
var evnt = document.createEvent("UIEvents");
evnt.initUIEvent("change", false, false, window, 0);
dp.element.dispatchEvent(evnt);
};
};
}
LiveUnit.registerTestClass("CorsicaTests.DatePickerDecl");