// 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;
function isWinRTEnabled() {
if (window && window['Windows']) {
glob = Windows.Globalization;
return true;
}
return false;
}
var DatePicker = WinJS.UI.DatePicker;
export class DatePickerTests {
DatePickerClassName = {
DatePicker: "win-datepicker",
DatePicker_Month: "win-datepicker-month",
DatePicker_Year: "win-datepicker-year",
DatePicker_Date: "win-datepicker-date"
};
DatePickerQuery = {
Month: this.DatePickerClassName.DatePicker + " ." + this.DatePickerClassName.DatePicker_Month,
Year: this.DatePickerClassName.DatePicker + " ." + this.DatePickerClassName.DatePicker_Year,
Date: this.DatePickerClassName.DatePicker + " ." + this.DatePickerClassName.DatePicker_Date
};
testMaxMinCurrentDatesFarTop = function () {
if (!isWinRTEnabled()) { return; }
var dp = new WinJS.UI.DatePicker(null, { calendar: "UmAlQuraCalendar", minYear: 29220, maxYear: 29221 });
var cur = dp.current;
var min = dp.minYear;
var max = dp.maxYear;
LiveUnit.Assert.areEqual(2076, cur.getFullYear());
LiveUnit.Assert.areEqual(2076, min);
LiveUnit.Assert.areEqual(2077, max);
};
testMaxMinCurrentDatesFarBottom = function () {
if (!isWinRTEnabled()) { return; }
var dp = new WinJS.UI.DatePicker(null, { calendar: "UmAlQuraCalendar", minYear: 0, maxYear: 1 });
var cur = dp.current;
var min = dp.minYear;
var max = dp.maxYear;
LiveUnit.Assert.areEqual(1901, cur.getFullYear());
LiveUnit.Assert.areEqual(1900, min);
LiveUnit.Assert.areEqual(1901, max);
};
testMaxMinCurrentDatesMiddle = function () {
if (!isWinRTEnabled()) { return; }
var dp = new WinJS.UI.DatePicker(null, { calendar: "UmAlQuraCalendar", minYear: 1910, maxYear: 2110 });
var cur = dp.current;
var min = dp.minYear;
var max = dp.maxYear;
LiveUnit.Assert.areEqual(new Date().getFullYear(), cur.getFullYear());
LiveUnit.Assert.areEqual(1909, min);
LiveUnit.Assert.areEqual(2077, max);
};
testDefaultConstructor = function () {
var controlElement = document.createElement("div");
var t = new Date();
var date1 = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 12, 0, 0, 0);
var control = new DatePicker(controlElement, { calendar: "GregorianCalendar" });
t = new Date();
var date2 = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 12, 0, 0, 0);
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.current <= date2);
LiveUnit.Assert.isTrue(control.current >= date1);
LiveUnit.Assert.isTrue(control.minYear == date1.getFullYear() - 100);
LiveUnit.Assert.isTrue(control.maxYear == date1.getFullYear() + 100);
LiveUnit.Assert.isTrue(!control.disabled);
};
testRoundTripWinRT = function () {
if (isWinRTEnabled()) {
var calendars = ["HijriCalendar", "GregorianCalendar"];
var dateRanges = [{ start: new Date(2009, 0, 1), end: new Date(2012, 11, 31) }, { start: new Date(2008, 0, 1), end: new Date(2013, 11, 31) }];
var dates = [new Date(2010, 0, 1), new Date(2010, 1, 1), new Date(2010, 11, 31), ];
dateRanges.forEach(function (range) {
dates.forEach(function (date) {
calendars.forEach(function (cal) {
var ni = DatePicker.getInformation(
range.start,
range.end,
cal);
var f2 = date;
var f3 = ni.getIndex(f2);
var f4 = ni.getDate(f3);
LiveUnit.Assert.areEqual(f2.getFullYear(), f4.getFullYear());
LiveUnit.Assert.areEqual(f2.getMonth(), f4.getMonth());
LiveUnit.Assert.areEqual(f2.getDate(), f4.getDate());
});
});
});
}
};
testAdjustDates = function () {
if (isWinRTEnabled()) {
var dateRanges = [
{ start: new Date(2009, 0, 1, 12, 0, 0, 0), end: new Date(2012, 11, 31, 12, 0, 0, 0) },
{ start: new Date(2008, 0, 1, 12, 0, 0, 0), end: new Date(2013, 11, 31, 12, 0, 0, 0) }
];
dateRanges.forEach(function (range) {
var ni = DatePicker.getInformation(range.start, range.end);
var f2 = new Date(2012, 7, 31);
var f3 = ni.getIndex(f2);
f3.month = 1; // feb
var f4 = ni.getDate(f3);
LiveUnit.Assert.areEqual(f2.getFullYear(), f4.getFullYear());
LiveUnit.Assert.areEqual(1, f4.getMonth());
LiveUnit.Assert.areEqual(29, f4.getDate());
var f5 = ni.getIndex(f4);
f5.year--; // 2011
var f6 = ni.getDate(f5);
LiveUnit.Assert.areEqual(2011, f6.getFullYear());
LiveUnit.Assert.areEqual(1, f6.getMonth());
LiveUnit.Assert.areEqual(28, f6.getDate());
});
}
};
// 7/8/11: default date/time pickers look visually correct with redline spec, so verifying corresponding margin values below
testRedlines = function () {
var controlElement = document.createElement("div");
try {
var control = new DatePicker(controlElement);
document.body.appendChild(controlElement);
LiveUnit.Assert.areEqual("80px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Month))["minWidth"]);
LiveUnit.Assert.areEqual("80px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Date))["minWidth"]);
LiveUnit.Assert.areEqual("80px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Year))["minWidth"]);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Month)).marginTop);
LiveUnit.Assert.areEqual("20px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Month)).marginRight);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Month)).marginBottom);
LiveUnit.Assert.areEqual("0px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Month)).marginLeft);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Date)).marginTop);
LiveUnit.Assert.areEqual("20px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Date)).marginRight);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Date)).marginBottom);
LiveUnit.Assert.areEqual("0px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Date)).marginLeft);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Year)).marginTop);
LiveUnit.Assert.areEqual("0px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Year)).marginRight);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Year)).marginBottom);
LiveUnit.Assert.areEqual("0px", getComputedStyle(controlElement.querySelector("." + this.DatePickerQuery.Year)).marginLeft);
} finally {
WinJS.Utilities.disposeSubTree(controlElement);
document.body.removeChild(controlElement);
}
};
testEmptyOptions = function () {
var controlElement = document.createElement("div");
var t = new Date();
var date1 = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 12, 0, 0, 0);
var control = new DatePicker(controlElement, { calendar: "GregorianCalendar" });
t = new Date();
var date2 = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 12, 0, 0, 0);
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.current <= date2);
LiveUnit.Assert.isTrue(control.current >= date1);
LiveUnit.Assert.areEqual(control.minYear, date1.getFullYear() - 100);
LiveUnit.Assert.areEqual(control.maxYear, date1.getFullYear() + 100);
LiveUnit.Assert.isTrue(!control.disabled);
};
testEmptyConstructor = function () {
var control = new DatePicker();
// verify an element was created with class "win-datepicker"
LiveUnit.Assert.isTrue(control.element.outerHTML.indexOf("win-datepicker") > 0);
LiveUnit.Assert.areEqual(control, control.element.winControl);
};
testElementProperty = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { current: 'january 10, 1995' });
LiveUnit.Assert.areEqual(controlElement, control.element);
LiveUnit.Assert.areEqual(control, control.element.winControl);
};
testImperativeEvent = function () {
// 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 control = new DatePicker();
var hitCount = 0;
control.addEventListener("change", function (e) { hitCount++; });
fireOnchange(control.element);
LiveUnit.Assert.areEqual(1, hitCount);
};
testDateString = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { current: 'january 10, 1995' });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(0, control.current.getMonth());
LiveUnit.Assert.areEqual(10, control.current.getDate());
LiveUnit.Assert.areEqual(1995, control.current.getFullYear());
LiveUnit.Assert.isTrue(!control.disabled);
};
testDateString2 = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { current: '2/4/1995' });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(1, control.current.getMonth());
LiveUnit.Assert.areEqual(4, control.current.getDate());
LiveUnit.Assert.areEqual(1995, control.current.getFullYear());
LiveUnit.Assert.isTrue(!control.disabled);
};
// test cases adapted from \\devx-snap\testsnew\FBLIEDEV1\IE\IE9\ScriptEngine\EzeJSTestFiles\Date\Date.js
testDateString3 = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { calendar: "GregorianCalendar" });
// note: if month is July, put 7 as expected month value and we'll adjust to 0 base in comparison below
var dateStrings = [[new Date(2011, 6, 28, 13, 30, 57), 7, 28, 2011], // time that found original bug #427727
["2/29/2000", 2, 29, 2000], // y2k leap year date
["1969/12/31 23:59:59", 12, 31, 1969], // *almost* midnight
["1999/12/31 23:59:59", 12, 31, 1999], // just before Y2K
["2000/01/01 00:00:00", 1, 1, 2000], // just after Y2K
["1582/10/04 23:59:59", 10, 4, 1582], // gJulianEnd,
["1582/10/05 00:00:00", 10, 5, 1582], // gJulianEnd + 1,
["1582/10/15 00:00:00", 10, 15, 1582], // gGregorianStart,
["1582/10/14 23:59:59", 10, 14, 1582], // gGregorianStart-1
// bug 464745 fails under wwahost ["29222/04/25 16:53:20", 4, 25, 29222], // gMaxMs, This makes actual date Mon Apr 25 16:53:20 PDT 29222
// bug 464745 fails under wwahost ["-25283/09/08 07:06:40", 9, 8, 25283], // -1*gMaxMs,
];
var dateString = 0, month = 1, date = 2, year = 3;
dateStrings.forEach(function (item: any) {
// set min/maxYear range to allow correct date. Note, if you set maxYear = 29222 first, you can end up with
// a date range of prevMin (1900...29222) and corrsponding options for all those which take 70s to removeChild()
control.minYear = Math.abs(item[year]);
control.maxYear = Math.abs(item[year]);
// assign test value
control.current = item[dateString];
// subtract 1 from expected month to align with javascript date 0 based month conventions
LiveUnit.Assert.areEqual(item[month] - 1, control.current.getMonth(), "month of: " + item[dateString] + ", actual=" + control.current);
LiveUnit.Assert.areEqual(item[date], control.current.getDate(), "date of: " + item[dateString] + ", actual=" + control.current);
LiveUnit.Assert.areEqual(item[year], control.current.getFullYear(), "year of: " + item[dateString] + ", actual=" + control.current);
});
};
testDate = function () {
var date = new Date(2010, 5, 4, 1, 2, 3, 4);
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { current: date });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(5, control.current.getMonth());
LiveUnit.Assert.areEqual(4, control.current.getDate());
LiveUnit.Assert.areEqual(2010, control.current.getFullYear());
LiveUnit.Assert.areEqual(12, control.current.getHours());
LiveUnit.Assert.areEqual(0, control.current.getMinutes());
LiveUnit.Assert.areEqual(0, control.current.getSeconds());
LiveUnit.Assert.isTrue(!control.disabled);
};
testDateChange = function () {
var controlElement = document.createElement("div");
var picker = new DatePicker(controlElement, { current: new Date(2011, 7, 31) });
LiveUnit.Assert.areEqual(2011, picker.current.getFullYear(), "Check the Year");
LiveUnit.Assert.areEqual(7, picker.current.getMonth(), "Check the Month");
LiveUnit.Assert.areEqual(31, picker.current.getDate(), "Check the Day of Month");
// Change the date to display
picker.current = new Date(1968, 10, 21);
LiveUnit.Assert.areEqual(1968, picker.current.getFullYear(), "Check the Year");
LiveUnit.Assert.areEqual(10, picker.current.getMonth(), "Check the Month");
LiveUnit.Assert.areEqual(21, picker.current.getDate(), "Check the Day on Month");
};
testDatePattern = function () {
if (window['Windows'] && Windows.Globalization && Windows.Globalization.Calendar) {
var controlElement = document.createElement("div");
try {
var control = new DatePicker(controlElement, { current: new Date(2011, 6, 1), calendar: "GregorianCalendar" });
document.body.appendChild(controlElement);
// specific elements of the datepicker corresponding to the classes
var getYearElementValue = function () { return (controlElement.querySelector(".win-datepicker-year")).value; };
var getMonthElementValue = function () { return (controlElement.querySelector(".win-datepicker-month")).value; };
var getDateElementValue = function () { return (controlElement.querySelector(".win-datepicker-date")).value; };
//Verify current display value
//Default pattern {year.full} {month.full} {day.integer(2)}
LiveUnit.Assert.areEqual("2011", getYearElementValue(), "Check year");
LiveUnit.Assert.areEqual("July", getMonthElementValue(), "Check month");
LiveUnit.Assert.areEqual("1", getDateElementValue(), "Check date");
//Update year pattern
control.yearPattern = "{year.full} {era.abbreviated}";
LiveUnit.Assert.areEqual("2011 A.D.", getYearElementValue(), "Check year");
LiveUnit.Assert.areEqual("July", getMonthElementValue(), "Check month");
LiveUnit.Assert.areEqual("1", getDateElementValue(), "Check date");
//Update date pattern
control.datePattern = "{day.integer(1)} {dayofweek.abbreviated}";
LiveUnit.Assert.areEqual("2011 A.D.", getYearElementValue(), "Check year");
LiveUnit.Assert.areEqual("July", getMonthElementValue(), "Check month");
LiveUnit.Assert.areEqual("1 Fri", getDateElementValue(), "Check date");
//Update month pattern
control.monthPattern = "{month.abbreviated(3)}";
LiveUnit.Assert.areEqual("2011 A.D.", getYearElementValue(), "Check year");
LiveUnit.Assert.areEqual("Jul", getMonthElementValue(), "Check month");
LiveUnit.Assert.areEqual("1 Fri", getDateElementValue(), "Check date");
//update year, expect everything day of week updated with the new pattern
control.current = new Date(2012, 6, 1);
LiveUnit.Assert.areEqual("2012 A.D.", getYearElementValue(), "Check year");
LiveUnit.Assert.areEqual("Jul", getMonthElementValue(), "Check month");
LiveUnit.Assert.areEqual("1 Sun", getDateElementValue(), "Check date");
} finally {
WinJS.Utilities.disposeSubTree(controlElement);
document.body.removeChild(controlElement);
}
}
};
testDisabledTrue = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { disabled: true });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.disabled);
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-datepicker-year").getAttribute("disabled"));
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-datepicker-month").getAttribute("disabled"));
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-datepicker-date").getAttribute("disabled"));
};
testDisabledFalse = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { disabled: false });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isFalse(control.disabled);
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-datepicker-year").getAttribute("disabled"));
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-datepicker-month").getAttribute("disabled"));
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-datepicker-date").getAttribute("disabled"));
};
testDisabledTrueDelayed = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { disabled: false });
control.disabled = true;
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.disabled);
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-datepicker-year").getAttribute("disabled"));
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-datepicker-month").getAttribute("disabled"));
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-datepicker-date").getAttribute("disabled"));
};
testDisabledFalseDelayed = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { disabled: true });
control.disabled = false;
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isFalse(control.disabled);
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-datepicker-year").getAttribute("disabled"));
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-datepicker-month").getAttribute("disabled"));
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-datepicker-date").getAttribute("disabled"));
};
testAccessibilityAttributeVerification = function () {
var controlElement = document.createElement("div");
var control = new DatePicker(controlElement, { current: "January 1 2010", minYear: 2000, maxYear: 2020 });
document.body.appendChild(controlElement);
LiveUnit.Assert.areEqual(controlElement.getAttribute("role"), "group");
var that = this;
var dateChecker = function (monthNow, monthText, dayNow, dayText, yearNow, yearText) {
var childNodes = controlElement.childNodes;
for (var i = 0; i < childNodes.length; i++) {
var child = childNodes[i];
if (child.className == that.DatePickerQuery.Month) {
LiveUnit.Assert.areEqual("Select Month", child.getAttribute("aria-label"));
}
if (child.className == that.DatePickerQuery.Date) {
LiveUnit.Assert.areEqual("Select Day", child.getAttribute("aria-label"));
}
if (child.className == that.DatePickerQuery.Year) {
LiveUnit.Assert.areEqual("Select Year", child.getAttribute("aria-label"));
}
}
};
//modify current and re-check updated values
control.current = new Date(2011, 1, 1);
dateChecker("2", "February", "1", "1", "2011", "2011");
//cleanup
WinJS.Utilities.disposeSubTree(controlElement);
document.body.removeChild(controlElement);
};
testDatePickerDispose = function () {
var dp = new DatePicker();
LiveUnit.Assert.isTrue(dp.dispose);
LiveUnit.Assert.isTrue(dp.element.classList.contains("win-disposable"));
LiveUnit.Assert.isFalse(dp._disposed);
dp.dispose();
dp.dispose();
};
};
}
LiveUnit.registerTestClass("CorsicaTests.DatePickerTests");