// 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";
function isPeriodControl() {
if (window && window['Windows']) {
var calendar = new Windows.Globalization.Calendar();
var computedClock = calendar.getClock();
return (computedClock !== "24HourClock");
}
return true;
}
export class TimePicker {
TimePickerClassName = {
TimePicker: "win-timepicker",
TimePicker_Hour: "win-timepicker-hour",
TimePicker_Minute: "win-timepicker-minute",
TimePicker_Period: "win-timepicker-period"
}
TimePickerQuery = {
Hour: this.TimePickerClassName.TimePicker + " ." + this.TimePickerClassName.TimePicker_Hour,
Minute: this.TimePickerClassName.TimePicker + " ." + this.TimePickerClassName.TimePicker_Minute,
Period: this.TimePickerClassName.TimePicker + " ." + this.TimePickerClassName.TimePicker_Period
}
testDefaultConstructor() {
var controlElement = document.createElement("div");
var t = new Date();
var date1 = new Date(t.getFullYear(), t.getMonth(), t.getDate(), t.getHours(), t.getMinutes(), 0, 0);
var control = new WinJS.UI.TimePicker(controlElement);
t = new Date();
var date2 = new Date(t.getFullYear(), t.getMonth(), t.getDate(), t.getHours(), t.getMinutes(), 0, 0);
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.current.getHours() <= date2.getHours());
LiveUnit.Assert.isTrue(control.current.getMinutes() <= date2.getMinutes());
LiveUnit.Assert.isTrue(control.current.getHours() >= date1.getHours());
LiveUnit.Assert.isTrue(control.current.getMinutes() >= date1.getMinutes());
LiveUnit.Assert.isTrue(control.minuteIncrement === 1);
LiveUnit.Assert.isTrue(!control.disabled);
}
// 7/8/11: default date/time pickers look visually correct with redline spec, so verifying corresponding margin values below
testRedlines() {
var controlElement = document.createElement("div");
try {
var control = new WinJS.UI.TimePicker(controlElement);
document.body.appendChild(controlElement);
LiveUnit.Assert.areEqual("80px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Hour))["minWidth"]);
LiveUnit.Assert.areEqual("80px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Minute))["minWidth"]);
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("80px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Period))["minWidth"]);
}
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Hour)).marginTop);
LiveUnit.Assert.areEqual("20px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Hour)).marginRight);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Hour)).marginBottom);
LiveUnit.Assert.areEqual("0px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Hour)).marginLeft);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Minute)).marginTop);
LiveUnit.Assert.areEqual("20px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Minute)).marginRight);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Minute)).marginBottom);
LiveUnit.Assert.areEqual("0px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Minute)).marginLeft);
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Period)).marginTop);
LiveUnit.Assert.areEqual("0px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Period)).marginRight);
LiveUnit.Assert.areEqual("4px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Period)).marginBottom);
LiveUnit.Assert.areEqual("0px", getComputedStyle(controlElement.querySelector("." + this.TimePickerQuery.Period)).marginLeft);
}
} finally {
WinJS.Utilities.disposeSubTree(controlElement);
document.body.removeChild(controlElement);
}
}
testRedlines2() {
var controlElement = document.createElement("div");
// this select element will be used as the truth, ie styles of the datepicker subelements
// should be the same as a basic select element
var selectElement = document.createElement("select");
selectElement.className = "win-dropdown";
try {
var control = new WinJS.UI.TimePicker(controlElement);
document.body.appendChild(controlElement);
document.body.appendChild(selectElement);
// classes of the timepicker
var classes = ["." + this.TimePickerClassName.TimePicker_Hour, "." + this.TimePickerClassName.TimePicker_Minute, "." + this.TimePickerClassName.TimePicker_Period];
// specific elements of the datepicker corresponding to the classes
var subElements = [];
// styles of the subelements to compare to the select element
var stylesToVerify = ["color",
"lineHeight",
"fontStyle",
"fontWeight",
"fontSize",
"fontStretch",
"fontSizeAdjust",
"borderTopWidth",
"borderRightWidth",
"borderLeftWidth",
"borderBottomWidth",
"borderTopStyle",
"borderRightStyle",
"borderLeftStyle",
"borderBottomStyle",
];
// initialize the subelements
classes.forEach(function (item, index) {
subElements[index] = controlElement.querySelector(".win-timepicker " + item);
});
// compare styles of subelements to the basic select element
subElements.forEach(function (subElement) {
if (subElement !== null) {
stylesToVerify.forEach(function (testStyle) {
LiveUnit.Assert.areEqual(getComputedStyle(selectElement)[testStyle], getComputedStyle(subElement)[testStyle],
"testing subElement=" + subElement.getAttribute("class") + ", style=" + testStyle);
});
}
});
} finally {
WinJS.Utilities.disposeSubTree(controlElement);
WinJS.Utilities.disposeSubTree(selectElement);
document.body.removeChild(controlElement);
document.body.removeChild(selectElement);
}
}
testEmptyOptions() {
var controlElement = document.createElement("div");
var t = new Date();
var date1 = new Date(t.getFullYear(), t.getMonth(), t.getDate(), t.getHours(), t.getMinutes(), 0, 0);
var control = new WinJS.UI.TimePicker(controlElement, {});
t = new Date();
var date2 = new Date(t.getFullYear(), t.getMonth(), t.getDate(), t.getHours(), t.getMinutes(), 0, 0);
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.current.getHours() <= date2.getHours());
LiveUnit.Assert.isTrue(control.current.getMinutes() <= date2.getMinutes());
LiveUnit.Assert.isTrue(control.current.getHours() >= date1.getHours());
LiveUnit.Assert.isTrue(control.current.getMinutes() >= date1.getMinutes());
LiveUnit.Assert.isTrue(control.minuteIncrement === 1);
LiveUnit.Assert.isTrue(!control.disabled);
}
testEmptyConstructor() {
var control = new WinJS.UI.TimePicker();
// verify an element was created with class "win-timepicker"
LiveUnit.Assert.isTrue(control.element.outerHTML.indexOf("win-timepicker") > 0);
LiveUnit.Assert.areEqual(control, control.element.winControl);
}
testElementProperty() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { current: '3:30 PM' });
LiveUnit.Assert.areEqual(controlElement, control.element);
LiveUnit.Assert.areEqual(control, control.element.winControl);
}
testTimePattern() {
if (window['Windows'] && Windows.Globalization && Windows.Globalization.Calendar) {
var controlElement = document.createElement("div");
try {
var control = new WinJS.UI.TimePicker(controlElement, { current: '3:03 PM' });
document.body.appendChild(controlElement);
// specific elements of the datepicker corresponding to the classes
var getHourElementValue = function () { return (control._domElement.querySelector(".win-timepicker-hour")).value; };
var getMinuteElementValue = function () { return (control._domElement.querySelector(".win-timepicker-minute")).value; };
var getPeriodElementValue = function () { return (control._domElement.querySelector(".win-timepicker-period")).value; };
//Verify current display value
//Default pattern {hour.integer(1)} {minute.integer(2)} {period.abbreviated(2)}
LiveUnit.Assert.areEqual("03", getMinuteElementValue(), "Check minute");
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("3", getHourElementValue(), "Check hour");
LiveUnit.Assert.areEqual("PM", getPeriodElementValue(), "Check period");
}
else {
LiveUnit.Assert.areEqual("15", getHourElementValue(), "Check hour");
}
//Update hour pattern
control.hourPattern = "{hour.integer(2)} hours";
LiveUnit.Assert.areEqual("03", getMinuteElementValue(), "Check minute");
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("03 hours", getHourElementValue(), "Check hour");
LiveUnit.Assert.areEqual("PM", getPeriodElementValue(), "Check period");
}
else {
LiveUnit.Assert.areEqual("15 hours", getHourElementValue(), "Check hour");
}
//Update minute pattern
control.minutePattern = "{minute.integer(1)} minutes";
LiveUnit.Assert.areEqual("3 minutes", getMinuteElementValue(), "Check minute");
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("03 hours", getHourElementValue(), "Check hour");
LiveUnit.Assert.areEqual("PM", getPeriodElementValue(), "Check period");
}
else {
LiveUnit.Assert.areEqual("15 hours", getHourElementValue(), "Check hour");
}
//Update period pattern
control.periodPattern = "{period.abbreviated(2)} period";
LiveUnit.Assert.areEqual("3 minutes", getMinuteElementValue(), "Check month");
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("03 hours", getHourElementValue(), "Check hour");
LiveUnit.Assert.areEqual("PM period", getPeriodElementValue(), "Check period");
}
else {
LiveUnit.Assert.areEqual("15 hours", getHourElementValue(), "Check hour");
}
//update year, expect everything day of week updated with the new pattern
control.current = new Date(2011, 1, 1, 5, 9);
LiveUnit.Assert.areEqual("05 hours", getHourElementValue(), "Check year");
LiveUnit.Assert.areEqual("9 minutes", getMinuteElementValue(), "Check month");
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("AM period", getPeriodElementValue(), "Check date");
}
} finally {
WinJS.Utilities.disposeSubTree(controlElement);
document.body.removeChild(controlElement);
}
}
}
testImperativeEvent() {
var control = new WinJS.UI.TimePicker();
var hitCount = 0;
// 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);
}
control.addEventListener("change", function (e) { hitCount++; });
fireOnchange(control.element);
LiveUnit.Assert.areEqual(1, hitCount);
}
testTimeString() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { current: '3:30 PM' });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.current.getHours() === 15);
LiveUnit.Assert.isTrue(control.current.getMinutes() === 30);
LiveUnit.Assert.isTrue(control.minuteIncrement === 1);
LiveUnit.Assert.isTrue(!control.disabled);
}
testTime24HourString() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { current: '22:30' });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.current.getHours() === 22);
LiveUnit.Assert.isTrue(control.current.getMinutes() === 30);
LiveUnit.Assert.isTrue(control.minuteIncrement === 1);
LiveUnit.Assert.isTrue(!control.disabled);
}
testTime() {
var date = new Date(2010, 5, 4, 1, 2, 3, 4);
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { current: date });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.current.getHours() === 1);
LiveUnit.Assert.isTrue(control.current.getMinutes() === 2);
LiveUnit.Assert.isTrue(control.current.getSeconds() === 0);
LiveUnit.Assert.isTrue(control.minuteIncrement === 1);
LiveUnit.Assert.isTrue(!control.disabled);
}
testDisabledTrue() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { disabled: true });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isTrue(control.disabled);
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-timepicker-hour").getAttribute("disabled"));
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-timepicker-minute").getAttribute("disabled"));
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-timepicker-period").getAttribute("disabled"));
}
}
testDisabledFalse() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { disabled: false });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isFalse(control.disabled);
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-timepicker-hour").getAttribute("disabled"));
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-timepicker-minute").getAttribute("disabled"));
if (isPeriodControl()) {
LiveUnit.Assert.isFalse(control._domElement.querySelector(".win-timepicker-period").getAttribute("disabled"));
}
}
testDisabledTrueDelayed() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(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-timepicker-hour").getAttribute("disabled"));
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-timepicker-minute").getAttribute("disabled"));
if (isPeriodControl()) {
LiveUnit.Assert.areEqual("disabled", control._domElement.querySelector(".win-timepicker-period").getAttribute("disabled"));
}
}
testDisabledFalseDelayed() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { disabled: true });
control.disabled = false;
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.isFalse(control.disabled);
LiveUnit.Assert.isFalse(control._hourElement.disabled);
LiveUnit.Assert.isFalse(control._minuteElement.disabled);
if (isPeriodControl()) {
LiveUnit.Assert.isFalse(control._ampmElement.disabled);
}
}
testBadMinuteIncrement() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { minuteIncrement: 0 });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(control.minuteIncrement, 1);
// If we got here, then 0 correctly didn't cause infinite loop when filling minutes
}
testBadMinuteIncrement2() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { minuteIncrement: -1 });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(control.minuteIncrement, 1);
// If we got here, then -1 correctly didn't cause infinite loop when filling minutes
}
testBadMinuteIncrement3() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { minuteIncrement: 63 });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(control.minuteIncrement, 3);
}
testBadMinuteIncrement4() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { minuteIncrement: 60 });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(control.minuteIncrement, 1);
}
testBadMinuteIncrement5() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { minuteIncrement: "fish" });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(control.minuteIncrement, 1);
}
testNormalMinuteIncrement() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { minuteIncrement: 15 });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(control.minuteIncrement, 15);
}
testWeirdMinuteIncrement() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { minuteIncrement: 7 });
LiveUnit.Assert.areEqual(controlElement, control._domElement);
LiveUnit.Assert.areEqual(control.minuteIncrement, 7);
}
testAdjustMinuteIncrement() {
var date = new Date(2010, 5, 4, 14, 23);
var control = new WinJS.UI.TimePicker(null, { current: date });
LiveUnit.Assert.isTrue(control.current.getHours() === 14);
LiveUnit.Assert.isTrue(control.current.getMinutes() === 23);
LiveUnit.Assert.isTrue(control.current.getSeconds() === 0);
control.minuteIncrement = 10;
LiveUnit.Assert.isTrue(control.current.getHours() === 14);
LiveUnit.Assert.isTrue(control.current.getMinutes() === 20);
LiveUnit.Assert.isTrue(control.current.getSeconds() === 0);
LiveUnit.Assert.areEqual(20, +((control.element.querySelector(".win-timepicker-minute")).value), "UI should be updated to minute increment");
}
testAccessibilityAttributeVerification() {
var controlElement = document.createElement("div");
var control = new WinJS.UI.TimePicker(controlElement, { current: "4:31 AM" });
document.body.appendChild(controlElement);
var that = this;
var timeChecker = function (hourNow, hourText, minNow, minText, ampmNow, ampmText, maxMinute?) {
maxMinute = maxMinute || "59";
var childNodes = controlElement.childNodes;
for (var i = 0; i < childNodes.length; i++) {
var child = childNodes[i];
if (child.classList.contains(that.TimePickerClassName.TimePicker_Hour) && child.classList.contains("win-order0")) {
LiveUnit.Assert.areEqual("Select Hour", child.getAttribute("aria-label"));
continue;
}
if (child.classList.contains(that.TimePickerClassName.TimePicker_Minute) && child.classList.contains("win-order1")) {
LiveUnit.Assert.areEqual("Select Minute", child.getAttribute("aria-label"));
continue;
}
if (child.classList.contains(that.TimePickerClassName.TimePicker_Period) && child.classList.contains("win-order2")) {
LiveUnit.Assert.areEqual("Select A.M P.M", child.getAttribute("aria-label"));
continue;
}
LiveUnit.Assert.fail("unexpected child node: " + child.className);
}
};
LiveUnit.Assert.areEqual(controlElement.getAttribute("role"), "group");
timeChecker("4", "4", "31", "31", "AM", "AM");
//Update current and re-check values
control.current = new Date(2012, 1, 1, 12, 32);
timeChecker("12", "12", "32", "32", "AM", "AM");
//Update minute Increment and re-check values
control.minuteIncrement = 15;
timeChecker("12", "12", "30", "30", "AM", "AM", "45");
//Update minute Increment and re-check values
control.minuteIncrement = 1;
timeChecker("12", "12", "32", "32", "AM", "AM");
//cleanup
WinJS.Utilities.disposeSubTree(controlElement);
document.body.removeChild(controlElement);
}
testTimePickerDispose() {
var tp = new WinJS.UI.TimePicker();
LiveUnit.Assert.isTrue(tp.dispose);
LiveUnit.Assert.isTrue(tp.element.classList.contains("win-disposable"));
LiveUnit.Assert.isFalse(tp._disposed);
// Double dispose sentinel
var sentinel: any = document.createElement("div");
sentinel.disposed = false;
WinJS.Utilities.addClass(sentinel, "win-disposable");
tp.element.appendChild(sentinel);
tp.dispose();
tp.dispose();
}
};
}
LiveUnit.registerTestClass("CorsicaTests.TimePicker");