// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. // // module CorsicaTests { "use strict"; var glob; function isWinRTEnabled() { if (window && window['Windows']) { glob = Windows.Globalization; return true; } return false; } function process(root) { return WinJS.UI.processAll(root); } // returns string with leading zero prepended for values < 10 function addLeadingZero(value) { if (value < 10) { return '0' + value.toString(); } else { return value.toString(); } } function createPicker(options) { var dp = document.createElement('div'); dp.setAttribute('data-win-control', 'WinJS.UI.TimePicker'); if (options !== undefined) { 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. return process(dp).then(function () { return WinJS.Promise.timeout().then( function () { return dp; }); }); } var elementToBeRemoved; function createPickerWithAppend(options?) { var dp = document.createElement('div'); document.body.appendChild(dp); elementToBeRemoved = dp; dp.setAttribute('data-win-control', 'WinJS.UI.TimePicker'); if (options !== undefined) { 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. return process(dp).then(function () { return WinJS.Promise.timeout().then( function () { return dp; }); }); } // return the select element containing the hour component function hourElement(picker) { return picker.querySelector('.win-timepicker .win-timepicker-hour'); } // return the select element containing the minute component function minuteElement(picker) { return picker.querySelector('.win-timepicker .win-timepicker-minute'); } // return the select element containing the period component function periodElement(picker) { return picker.querySelector('.win-timepicker .win-timepicker-period'); } function timeToString(time) { return "[h=" + time.hour + ", m=" + time.minute + ", period=" + time.period + "]"; } function addChangeEvent(picker) { picker.addEventListener("change", checkValues); return function () { picker.removeEventListener("change", checkValues); }; } var hourBackEnd, minuteBackEnd; var AM = 0, PM = 1; function setHours(picker, h, notFire = false) { var selectHourElement = hourElement(picker); hourBackEnd = h; selectHourElement.value = hourBackEnd; var selectPeriodElement = periodElement(picker); if (selectPeriodElement && selectPeriodElement.selectedIndex === PM && hourBackEnd < 12) { hourBackEnd += 12; } else if (selectPeriodElement && selectPeriodElement.selectedIndex === AM && hourBackEnd === 12) { hourBackEnd -= 12; } if (!notFire) { fireOnchange(selectHourElement); } } function setPeriod(picker, p, notFire = false) { var selectPeriodElement = periodElement(picker); if (p === PM && hourBackEnd < 12) { hourBackEnd += 12; } else if (p === AM && hourBackEnd >= 12) { hourBackEnd -= 12; } selectPeriodElement.selectedIndex = p; if (!notFire) { fireOnchange(selectPeriodElement); } } function setMinutes(picker, m, notFire = false) { var selectMinuteElement = minuteElement(picker); minuteBackEnd = m; selectMinuteElement.selectedIndex = minuteBackEnd; if (!notFire) { fireOnchange(selectMinuteElement); } } function setValues() { var today = new Date(); hourBackEnd = today.getHours(); minuteBackEnd = today.getMinutes(); } var timePicker; function checkValues(e) { var d = new Date(timePicker.winControl.current); LiveUnit.Assert.areEqual(hourBackEnd, d.getHours(), "The backend date object has a wrong hour value"); LiveUnit.Assert.areEqual(minuteBackEnd, d.getMinutes(), "The backend date object has a wrong minute value"); } function cleanupTimePicker() { try { WinJS.Utilities.disposeSubTree(elementToBeRemoved); document.body.removeChild(elementToBeRemoved); } catch (e) { LiveUnit.Assert.fail("cleanupTimePicker() failed: " + e); } } // time object can contain values for 'hour', 'minute', 'period'. If any of these values // is not present, function will expect querySelector to return null for that cell. function verifyTime(picker, time) { LiveUnit.LoggingCore.logComment("picker.winControl.current=" + picker.winControl.current + "; expected=" + timeToString(time)); var periodControl = isPeriodControl(); if ('period' in time && !periodControl && 'hour' in time) { if (time.period.toUpperCase() === "PM") { if (time.hour < 12) { time.hour = (parseInt(time.hour) + 12) + ''; } } else { if (time.hour === 12) { time.hour = "0"; } } } if ('hour' in time) { LiveUnit.Assert.areEqual(time.hour.toString() >> 0, hourElement(picker).value >> 0); } else { LiveUnit.Assert.areEqual(null, hourElement(picker).value); } if ('minute' in time) { LiveUnit.Assert.areEqual(time.minute.toString() >> 0, minuteElement(picker).value >> 0); } else { LiveUnit.Assert.areEqual(null, minuteElement(picker).value); } if ('period' in time && periodControl) { LiveUnit.Assert.areEqual(time.period.toString() >> 0, periodElement(picker).value >> 0); } else { LiveUnit.Assert.areEqual(null, periodElement(picker)); } } // given an integer hour, return appropriate 'am' or 'pm' value // TODO: make local smart function calcPeriod(hour) { if (hour < 12) { return 'AM'; } else { return 'PM'; } } 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; } function isPeriodControl() { if (isWinRTEnabled()) { var calendar = new Windows.Globalization.Calendar(); var computedClock = calendar.getClock(); return (computedClock !== "24HourClock"); } return true; } var changeHit = 0; var changeType = "change"; function logEventHits(e) { LiveUnit.LoggingCore.logComment(e.type + ": changeHit=" + changeHit); } var changeHandler = function (e) { changeHit++; LiveUnit.Assert.areEqual(e.type, changeType); logEventHits(e); }; function attachEventListeners(picker) { changeHit = 0; picker.addEventListener(changeType, changeHandler, false); return function () { changeHit = 0; picker.removeEventListener(changeType, changeHandler, false); }; } // 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); } function checkPeriodControlValue(expectedValue, control, force?) { if (force || isPeriodControl()) { LiveUnit.Assert.areEqual(expectedValue, control.value, "period element was set incorrectly"); } else { LiveUnit.Assert.areEqual(null, control, "period element should not be there"); } } function getActualUIOrder() { var minutePos, periodPos, hourPos; var domElement = document.getElementsByClassName('win-timepicker')[0]; for (var i = 0; i < domElement.children.length; i++) { var elem = (domElement.childNodes[i]).className; if (elem.indexOf('picker-hour') !== -1) { hourPos = i; } else if (elem.indexOf('picker-minute') !== -1) { minutePos = i; } else { periodPos = i; } } return getOrder(hourPos, minutePos, periodPos); } function getOrder(hourPos, minutePos, periodPos) { if (!periodPos && periodPos !== 0) { if (hourPos < minutePos) { return "HM"; } return "MH"; } else if (minutePos < periodPos && minutePos < hourPos) { if (periodPos < hourPos) { return "MPH"; } else { return "MHP"; } } else if (periodPos < minutePos && periodPos < hourPos) { if (minutePos < hourPos) { return "PMH"; } else { return "PHM"; } } else { if (periodPos < minutePos) { return "HPM"; } else { return "HMP"; } } } function getExpectedOrder(calendar, clock) { var dtf = Windows.Globalization.DateTimeFormatting; var s = "hour minute"; var c = new dtf.DateTimeFormatter(s); c = new dtf.DateTimeFormatter(s); var formatter = new dtf.DateTimeFormatter(s, c.languages, c.geographicRegion, calendar, clock); var pattern = formatter.patterns[0]; var hourIndex = pattern.indexOf("hour"); var minuteIndex = pattern.indexOf("minute"); var periodIndex = pattern.indexOf("period"); if (periodIndex === -1) { periodIndex = null; } return getOrder(hourIndex, minuteIndex, periodIndex); } function getControls(picker) { return { hourSelect: hourElement(picker), minuteSelect: minuteElement(picker), periodSelect: periodElement(picker) }; } function getInformationJS(clock, minuteIncrement) { var hours = ["twelve", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]; var minutes = { getLength: null, getValue: null }; minutes.getLength = function () { return 60 / minuteIncrement; }; minutes.getValue = function (index) { var display = index * minuteIncrement; if (display < 10) { return "0" + display.toString(); } else { return display.toString(); } }; var order = ["period", "minute", "hour"]; if (clock === "24HourClock") { hours = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve"]; hours.push("thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenteen", "twenty-one", "twenty-two", "twenty-three"); order = ["hour", "minute"]; } return { minutes: minutes, hours: hours, clock: clock || "12HourClock", periods: ["AM", "PM"], order: order }; }; export class TimePickerDecl { testCorrectBackEndValue(complete) { var cleanup; createPickerWithAppend().then(function (picker) { timePicker = picker; setValues(); cleanup = addChangeEvent(picker); setMinutes(picker, 30); setHours(picker, 11); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testBackEndAtNoon(complete) { // bug 437064 var cleanup; createPickerWithAppend().then(function (picker) { timePicker = picker; setValues(); cleanup = addChangeEvent(picker); setPeriod(picker, AM); setMinutes(picker, 30); setHours(picker, 12); setPeriod(picker, PM); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } // create default picker. Note, this test uses runtime date/time value so needs to be smart as the date // value will change between runs and locales. before/after noon, etc.. testSimpleTime(complete) { var today = new Date(); createPickerWithAppend().then(function (picker) { var expectedHour = today.getHours(); var periodControl = isPeriodControl(); // workaround date object defaulting to 24h format. if (expectedHour > 12 && periodControl) { expectedHour -= 12; } if (expectedHour === 0) { expectedHour = 12; } verifyTime(picker, { hour: expectedHour, minute: today.getMinutes(), period: calcPeriod(today.getHours()) }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testDefaults(complete) { // validate timePicker defaults createPickerWithAppend().then(function (picker) { var c = picker.winControl; LiveUnit.Assert.isFalse(c.disabled); // verify all 3 elements are displayed, style display="" LiveUnit.Assert.areEqual("", hourElement(picker).style.display); LiveUnit.Assert.areEqual("", minuteElement(picker).style.display); if (periodElement(picker)) { LiveUnit.Assert.areEqual("", periodElement(picker).style.display); } LiveUnit.Assert.areEqual(1, c.minuteIncrement); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testDefaultFormats(complete) { // validate datePicker default format createPickerWithAppend({ current: '1:23 am' }).then(function (picker) { LiveUnit.Assert.areEqual("1", getText(hourElement(picker))); LiveUnit.Assert.areEqual("23", getText(minuteElement(picker))); if (isPeriodControl()) { LiveUnit.Assert.areEqual("AM", getText(periodElement(picker))); } else { LiveUnit.Assert.areEqual(null, periodElement(picker), "period control is not found in 24HourClock"); } }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testSetCurrentFromDate(complete) { createPickerWithAppend().then(function (picker) { var date = new Date(2011, 1, 3, 10, 11, 12); picker.winControl.current = date; verifyTime(picker, { hour: '10', minute: '11', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testDisabled1(complete) { createPickerWithAppend({ current: '10:11 pm', disabled: true }) .then(function (picker) { verifyTime(picker, { hour: '10', minute: '11', period: 'PM' }); LiveUnit.Assert.isTrue(picker.winControl.disabled); picker.winControl.disabled = false; LiveUnit.Assert.isFalse(picker.winControl.disabled); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testDisabled2(complete) { createPickerWithAppend({ current: '10:11 pm', disabled: false }) .then(function (picker) { verifyTime(picker, { hour: '10', minute: '11', period: 'PM' }); LiveUnit.Assert.isFalse(picker.winControl.disabled); picker.winControl.disabled = true; LiveUnit.Assert.isTrue(picker.winControl.disabled); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement1(complete) { // verify time snaps backward to last valid increment createPickerWithAppend({ current: '10:15 am', minuteIncrement: 15 }).then(function (picker) { verifyTime(picker, { hour: '10', minute: '15', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement2(complete) { // verify time snaps backward to last valid increment createPickerWithAppend({ current: '10:16 am', minuteIncrement: 15 }).then(function (picker) { verifyTime(picker, { hour: '10', minute: '15', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement3(complete) { // verify time snaps backward to last valid increment createPickerWithAppend({ current: '10:29 am', minuteIncrement: 15 }).then(function (picker) { verifyTime(picker, { hour: '10', minute: '15', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement4(complete) { // verify time snaps backward to last valid increment not evenly divisible createPickerWithAppend({ current: '10:51 am', minuteIncrement: 50 }).then(function (picker) { verifyTime(picker, { hour: '10', minute: '50', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement_boundary1(complete) { // verify time not changed for 0 increment createPickerWithAppend({ current: '10:11 am', minuteIncrement: 0 }).then(function (picker) { verifyTime(picker, { hour: '10', minute: '11', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement_boundary2(complete) { // verify time not changed for increment == 60 createPickerWithAppend({ current: '10:21 am', minuteIncrement: 60 }).then(function (picker) { verifyTime(picker, { hour: '10', minute: '21', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement_boundary3(complete) { // verify time not changed for increment > 60 createPickerWithAppend({ current: '10:31 am', minuteIncrement: 61 }).then(function (picker) { verifyTime(picker, { hour: '10', minute: '31', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement_boundary4(complete) { // verify time not changed for increment < 0 createPickerWithAppend({ current: '10:41 am', minuteIncrement: -15 }).then(function (picker) { verifyTime(picker, { hour: '10', minute: '30', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testMinuteIncrement_boundary5(complete) { // verify increment > 60 == increment mod 60 createPickerWithAppend({ current: '10:51 am', minuteIncrement: 74 }).then(function (picker) { // 74-60=14, 14*3 = 42 verifyTime(picker, { hour: '10', minute: '42', period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testCustomTimePM(complete) { // bug WIN8 250170: Expected '"05"' but actual was '"5"' createPickerWithAppend({ current: '17:00:01' }).then(function (picker) { verifyTime(picker, { hour: 5, minute: '00', period: 'PM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testCustomTimeAM(complete) { createPickerWithAppend({ current: '0:53:15' }).then(function (picker) { verifyTime(picker, { hour: 12, minute: 53, period: 'AM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testCustomTimeNoon(complete) { // UNDONE: This may actually be 'AM' in certain locales. // createPickerWithAppend({ current: '12:00:00' }).then(function (picker) { verifyTime(picker, { hour: 12, minute: '00', period: calcPeriod(12) }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testCustomTimeNoonPlus(complete) { createPickerWithAppend({ current: '12:01:00' }).then(function (picker) { verifyTime(picker, { hour: 12, minute: '01', period: 'PM' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testFireHourchangeEvent(complete) { var cleanup; createPickerWithAppend({ current: '11:20 pm' }).then(function (picker) { timePicker = picker; cleanup = attachEventListeners(picker); fireOnchange(hourElement(picker)); LiveUnit.Assert.areEqual(1, changeHit); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, unhandledTestError); } testFireMinutechangeEvent(complete) { var cleanup; createPickerWithAppend({ current: '11:21 pm' }).then(function (picker) { timePicker = picker; cleanup = attachEventListeners(picker); fireOnchange(minuteElement(picker)); LiveUnit.Assert.areEqual(1, changeHit); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testFirePeriodchangeEvent(complete) { var cleanup; createPickerWithAppend({ current: '11:22 pm' }).then(function (picker) { if (isPeriodControl()) { timePicker = picker; cleanup = attachEventListeners(picker); fireOnchange(periodElement(picker)); LiveUnit.Assert.areEqual(1, changeHit); } }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testFireAllEventsAndRemove(complete) { var cleanup; createPickerWithAppend({ current: '11:23 pm' }).then(function (picker) { timePicker = picker; cleanup = attachEventListeners(picker); verifyTime(picker, { hour: '11', minute: '23', period: 'pm' }); fireOnchange(hourElement(picker)); fireOnchange(minuteElement(picker)); if (isPeriodControl()) { fireOnchange(periodElement(picker)); LiveUnit.Assert.areEqual(3, changeHit); } else { LiveUnit.Assert.areEqual(2, changeHit); } // make sure time hasn't changed verifyTime(picker, { hour: '11', minute: '23', period: 'pm' }); cleanup(); fireOnchange(hourElement(picker)); fireOnchange(minuteElement(picker)); if (isPeriodControl()) { fireOnchange(periodElement(picker)); } LiveUnit.Assert.areEqual(0, changeHit); // make sure time hasn't changed verifyTime(picker, { hour: '11', minute: '23', period: 'pm' }); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } testFireMultipleChangeEvents(complete) { var cleanup; createPickerWithAppend({ current: '11:24 pm' }).then(function (picker) { timePicker = picker; cleanup = attachEventListeners(picker); for (var n = 1; n <= 15; n++) { fireOnchange(hourElement(picker)); fireOnchange(minuteElement(picker)); if (isPeriodControl()) { fireOnchange(periodElement(picker)); LiveUnit.Assert.areEqual(n * 3, changeHit); } else { LiveUnit.Assert.areEqual(n * 2, changeHit); } } // make sure time hasn't changed verifyTime(picker, { hour: '11', minute: '24', period: 'pm' }); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testhourchangeEvent(complete) { var cleanup; createPickerWithAppend({ current: '11:12 am' }).then(function (picker) { timePicker = picker; verifyTime(picker, { hour: '11', minute: '12', period: 'AM' }); cleanup = attachEventListeners(picker); // change the hour picker.winControl.current = '10:12 am'; verifyTime(picker, { hour: '10', minute: '12', period: 'AM' }); LiveUnit.Assert.areEqual(0, changeHit); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testminutechangeEvent(complete) { var cleanup; createPickerWithAppend({ current: '11:12 am' }).then(function (picker) { timePicker = picker; verifyTime(picker, { hour: '11', minute: '12', period: 'AM' }); cleanup = attachEventListeners(picker); // change the minute picker.winControl.current = '11:10 am'; verifyTime(picker, { hour: '11', minute: '10', period: 'AM' }); LiveUnit.Assert.areEqual(0, changeHit); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testPeriodChangeEvent(complete) { var cleanup; createPickerWithAppend({ current: '11:12 pm' }).then(function (picker) { timePicker = picker; verifyTime(picker, { hour: '11', minute: '12', period: 'PM' }); cleanup = attachEventListeners(picker); // change the period picker.winControl.current = '11:12 am'; verifyTime(picker, { hour: '11', minute: '12', period: 'AM' }); LiveUnit.Assert.areEqual(0, changeHit); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testChangeThreeEventsAndRemove(complete) { var cleanup; createPickerWithAppend({ current: '10:11 am' }).then(function (picker) { timePicker = picker; cleanup = attachEventListeners(picker); verifyTime(picker, { hour: '10', minute: '11', period: 'AM' }); // change all 3 picker.winControl.current = '11:12 pm'; verifyTime(picker, { hour: '11', minute: '12', period: 'PM' }); LiveUnit.Assert.areEqual(0, changeHit); picker.winControl.current = '10:11 am'; verifyTime(picker, { hour: '10', minute: '11', period: 'am' }); LiveUnit.Assert.areEqual(0, changeHit); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } test24Format(complete) { var cleanup; createPickerWithAppend( { clock: '24HourClock', current: '13:05:00' }).then(function (picker) { timePicker = picker; var expectedHour = "13"; var expectedMinute = "05"; cleanup = addChangeEvent(picker); var hour = hourElement(picker).value; var minute = minuteElement(picker).value; var current = picker.winControl.current; LiveUnit.Assert.areEqual(null, periodElement(picker), "period element was generated incorrectly"); LiveUnit.Assert.areEqual(expectedHour, hour, "Wrong value for the hour"); LiveUnit.Assert.areEqual(expectedMinute, minute, "Wrong value for the minute"); LiveUnit.Assert.areEqual(parseInt(expectedHour), current.getHours(), "Wrong value for the current hour"); LiveUnit.Assert.areEqual(parseInt(expectedMinute), current.getMinutes(), "Wrong value for the current minute"); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } test12Format(complete) { //BUGID: 729979 var cleanup; createPickerWithAppend( { clock: '12HourClock', current: '08:05:00' }).then(function (picker) { timePicker = picker; var expectedHour = "8"; var expectedMinute = "05"; var expectedPeriod = "AM"; cleanup = addChangeEvent(picker); var hour = hourElement(picker).value; var minute = minuteElement(picker).value; var current = picker.winControl.current; LiveUnit.Assert.areEqual(expectedPeriod, periodElement(picker).value, "period element was set incorrectly"); LiveUnit.Assert.areEqual(expectedHour, hour, "Wrong value for the hour"); LiveUnit.Assert.areEqual(expectedMinute, minute, "Wrong value for the minute"); LiveUnit.Assert.areEqual(parseInt(expectedHour), current.getHours(), "Wrong value for the current hour"); LiveUnit.Assert.areEqual(parseInt(expectedMinute), current.getMinutes(), "Wrong value for the current minute"); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testImplicit12Format(complete) { var cleanup; createPickerWithAppend( { current: '08:05:00' }).then(function (picker) { timePicker = picker; var expectedHour = "8"; var expectedMinute = "05"; var expectedPeriod = "AM"; cleanup = addChangeEvent(picker); var hour = hourElement(picker).value; var minute = minuteElement(picker).value; var current = picker.winControl.current; checkPeriodControlValue(expectedPeriod, periodElement(picker)); LiveUnit.Assert.areEqual(expectedHour, hour, "Wrong value for the hour"); LiveUnit.Assert.areEqual(expectedMinute, minute, "Wrong value for the minute"); LiveUnit.Assert.areEqual(parseInt(expectedHour), current.getHours(), "Wrong value for the current hour"); LiveUnit.Assert.areEqual(parseInt(expectedMinute), current.getMinutes(), "Wrong value for the current minute"); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } testTimePickerGlobalization = function (complete) { var cleanup; if (isWinRTEnabled()) { createPickerWithAppend( { current: '13:05:00-05:00' }).then(function (picker) { timePicker = picker; var calendar = new glob.Calendar(); // calendar.changeClock("12HourClock"); var clock = calendar.getClock(); var expectedCount = 12; var definedPeriod = true; if (clock === "12HourClock") { expectedCount = 12; } else { expectedCount = 24; definedPeriod = false; } var selectControls = getControls(picker); LiveUnit.Assert.areEqual(expectedCount, selectControls.hourSelect.length, "wrong number of hour elements"); LiveUnit.Assert.areEqual(definedPeriod, !!selectControls.periodSelect, "Not expected behavior of period control"); var UIOrder = getActualUIOrder(); var actualOrder = getExpectedOrder(calendar.getCalendarSystem(), clock); LiveUnit.Assert.areEqual(actualOrder, UIOrder, "Order is not corrrect on 12HourClock"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); }; testTimePicker24HourClockGlobalization = function (complete) { if (isWinRTEnabled()) { var cleanup; createPickerWithAppend( { current: '13:05:00', clock: "24HourClock" }).then(function (picker) { timePicker = picker; var calendar = new glob.Calendar(); calendar.changeClock("24HourClock"); var clock = calendar.getClock(); var expectedCount = 12; var definedPeriod = true; if (clock === "12HourClock") { expectedCount = 12; } else { expectedCount = 24; definedPeriod = false; } var selectControls = getControls(picker); LiveUnit.Assert.areEqual(expectedCount, selectControls.hourSelect.length, "wrong number of hour elements"); LiveUnit.Assert.areEqual(definedPeriod, !!selectControls.periodSelect, "Not expected behavior of period control"); var UIOrder = getActualUIOrder(); var actualOrder = getExpectedOrder(calendar.getCalendarSystem(), clock); LiveUnit.Assert.areEqual(actualOrder, UIOrder, "Order is not corrrect on 12HourClock"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); }; testtimePickerExplicit12HourClockGlobalization(complete) { //BUGID: 729979 if (isWinRTEnabled()) { var cleanup; createPickerWithAppend( { current: '13:05:00', clock: "12HourClock" }).then(function (picker) { timePicker = picker; var calendar = new glob.Calendar(); calendar.changeClock("12HourClock"); var clock = calendar.getClock(); var expectedCount = 12; var definedPeriod = true; if (clock === "12HourClock") { expectedCount = 12; } else { expectedCount = 24; definedPeriod = false; } var selectControls = getControls(picker); LiveUnit.Assert.areEqual(expectedCount, selectControls.hourSelect.length, "wrong number of hour elements"); LiveUnit.Assert.areEqual(definedPeriod, !!selectControls.periodSelect, "The period control visibility is not correct"); var UIOrder = getActualUIOrder(); var actualOrder = getExpectedOrder(calendar.getCalendarSystem(), clock); LiveUnit.Assert.areEqual(actualOrder, UIOrder, "Order is not corrrect on 12HourClock"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testTimePickerGlobalizationWithCornerCaseCurrnet(complete) { if (isWinRTEnabled()) { var cleanup; createPickerWithAppend( { current: '13:05:00+05:00' }).then(function (picker) { timePicker = picker; var calendar = new glob.Calendar(); var clock = calendar.getClock(); var expectedCount = 12; var definedPeriod = true; if (clock === "12HourClock") { expectedCount = 12; } else { expectedCount = 24; definedPeriod = false; } var selectControls = getControls(picker); LiveUnit.Assert.areEqual(expectedCount, selectControls.hourSelect.length, "wrong number of hour elements"); LiveUnit.Assert.areEqual(definedPeriod, !!selectControls.periodSelect, "Not expected behavior of period control"); var UIOrder = getActualUIOrder(); var actualOrder = getExpectedOrder(calendar.getCalendarSystem(), clock); LiveUnit.Assert.areEqual(actualOrder, UIOrder, "Order is not corrrect on 12HourClock"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testCorrectBackEndValueWith24HourClock(complete) { if (isWinRTEnabled()) { var cleanup; createPickerWithAppend({ clock: "24HourClock" }). then(function (picker) { timePicker = picker; setValues(); cleanup = addChangeEvent(picker); setMinutes(picker, 30); for (var i = 1; i < 24; i++) setHours(picker, i); }) .then(null, unhandledTestError) .then(cleanup) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testDirectPatternDeclaratively(complete) { //BugID: 538276 if (isWinRTEnabled()) { var cleanup; createPickerWithAppend({ hourPattern: "{hour.integer(2)}", minutePattern: "{minute.integer(2)}", current: '05:10:01' }). then(function (picker) { var hour = hourElement(picker).value; var minute = minuteElement(picker).value; var current = picker.winControl.current; LiveUnit.Assert.areEqual('05', hour, "checking the content of hour"); LiveUnit.Assert.areEqual('10', minute, "checking the content of minute"); checkPeriodControlValue("AM", periodElement(picker)); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testPatternWithSmallIntegersDeclaratively(complete) { //BugID: 538276 if (isWinRTEnabled()) { var cleanup, cleanupListeners; createPickerWithAppend({ hourPattern: "{hour.integer(1)}", minutePattern: "{minute.integer(1)}", periodPattern: "{period.abbreviated(1)}", current: '12:25:01' }). then(function (picker) { var hour = hourElement(picker).value; var minute = minuteElement(picker).value; //var period = periodElement(picker).value; var current = picker.winControl.current; checkPeriodControlValue("P", periodElement(picker)); //LiveUnit.Assert.areEqual('P', period, "checking the content of period"); LiveUnit.Assert.areEqual('12', hour, "checking the content of hour"); LiveUnit.Assert.areEqual('25', minute, "checking the content of minute"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testPatternWithInvalidPatternDeclaratively(complete) { //BugID: 538276 if (isWinRTEnabled()) { createPickerWithAppend({ hourPattern: "{hour.integer(3)}", minutePattern: "{minute.integer(3)}", periodPattern: "{period.abbreviated(3)}", current: '15:45:01' }). then(function (picker) { var hour = hourElement(picker).value; var minute = minuteElement(picker).value; //var period = periodElement(picker).value; var current = picker.winControl.current; checkPeriodControlValue("PM", periodElement(picker)); //LiveUnit.Assert.areEqual('PM', period, "checking the content of period"); if (isPeriodControl()) { LiveUnit.Assert.areEqual('003', hour, "checking the content of hour"); } else { LiveUnit.Assert.areEqual('015', hour, "checking the content of hour"); } LiveUnit.Assert.areEqual('045', minute, "checking the content of minute"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testPatternWithIntegerAndAdditionPatternDeclaratively(complete) { //BugID: 538276 if (isWinRTEnabled()) { createPickerWithAppend({ hourPattern: "{hour.integer(2)} clock", minutePattern: "{minute.integer(2)} minutes", periodPattern: "{period.abbreviated(2)} period", current: '15:45:01' }). then(function (picker) { var current = picker.winControl.current; var periodControl = periodElement(picker); var minuteControl = minuteElement(picker); var hourControl = hourElement(picker); checkPeriodControlValue("PM period", periodControl); if (isPeriodControl()) { LiveUnit.Assert.areEqual('03 clock', hourControl.value, "checking the content of hour"); } else { LiveUnit.Assert.areEqual('15 clock', hourControl.value, "checking the content of hour"); } LiveUnit.Assert.areEqual('45 minutes', minuteControl.value, "checking the content of minute"); if (isPeriodControl()) { periodControl.selectedIndex = 0; //AM fireOnchange(periodControl); } minuteControl.selectedIndex = 30; //30 fireOnchange(minuteControl); hourControl.selectedIndex = 11; fireOnchange(hourControl); checkPeriodControlValue("AM period", periodControl); LiveUnit.Assert.areEqual('11 clock', hourControl.value, "checking the content of hour"); LiveUnit.Assert.areEqual('30 minutes', minuteControl.value, "checking the content of minute"); hourControl.selectedIndex = 0; fireOnchange(hourControl); checkPeriodControlValue("AM period", periodControl); if (isPeriodControl()) { LiveUnit.Assert.areEqual('12 clock', hourControl.value, "checking the content of hour"); } else { LiveUnit.Assert.areEqual('00 clock', hourControl.value, "checking the content of hour"); } LiveUnit.Assert.areEqual('30 minutes', minuteControl.value, "checking the content of minute"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testTwoTimePickerOneWithPatternAndOneWithout(complete) { //BugID: 538276 if (isWinRTEnabled()) { createPickerWithAppend({ hourPattern: "{hour.integer(2)} clock", minutePattern: "{minute.integer(2)} minutes", periodPattern: "{period.abbreviated(2)} period", current: '15:45:01' }).then(function (picker) { var current = picker.winControl.current; var periodControl = periodElement(picker); var minuteControl = minuteElement(picker); var hourControl = hourElement(picker); checkPeriodControlValue('PM period', periodControl); if (isPeriodControl()) { LiveUnit.Assert.areEqual('03 clock', hourControl.value, "checking the content of hour"); } else { LiveUnit.Assert.areEqual('15 clock', hourControl.value, "checking the content of hour"); } LiveUnit.Assert.areEqual('45 minutes', minuteControl.value, "checking the content of minute"); }). then(null, unhandledTestError). then(cleanupTimePicker). then(function () { createPickerWithAppend({ current: '02:30:02', }).then(function (picker) { var periodControl = periodElement(picker); var minuteControl = minuteElement(picker); var hourControl = hourElement(picker); checkPeriodControlValue('AM', periodControl); LiveUnit.Assert.areEqual('2', hourControl.value, "checking the content of hour"); LiveUnit.Assert.areEqual('30', minuteControl.value, "checking the content of minute"); }). then(null, unhandledTestError). then(cleanupTimePicker); }) .then(complete, complete); } else { complete(); } } testCustomInformationProvider12HourClock = function (complete) { if (!isWinRTEnabled()) { var old = (WinJS.UI.TimePicker).getInformation; var newComplete = function () { (WinJS.UI.TimePicker).getInformation = old; complete(); }; (WinJS.UI.TimePicker).getInformation = getInformationJS; createPickerWithAppend({ clock: '12HourClock', current: '13:05:00' }).then(function (picker) { var current = picker.winControl.current; var periodControl = periodElement(picker); var minuteControl = minuteElement(picker); var hourControl = hourElement(picker); LiveUnit.Assert.areEqual('PM', periodControl.value, "checking the content of period"); LiveUnit.Assert.areEqual('one', hourControl.value, "checking the content of hour"); LiveUnit.Assert.areEqual('05', minuteControl.value, "checking the content of minute"); LiveUnit.Assert.areEqual("PMH", getActualUIOrder(), "checking the correctness of the order"); LiveUnit.Assert.areEqual(12, hourControl.length, "checking that 24 elements are added"); LiveUnit.Assert.areEqual(60, minuteControl.length, "checking that 24 elements are added"); }). then(null, unhandledTestError). then(cleanupTimePicker). then(newComplete, newComplete); } else { complete(); } }; testCustomInformationProvider24HourClock(complete) { if (!isWinRTEnabled()) { var old = (WinJS.UI.TimePicker).getInformation; var newComplete = function () { (WinJS.UI.TimePicker).getInformation = old; complete(); }; (WinJS.UI.TimePicker).getInformation = getInformationJS; createPickerWithAppend({ clock: '24HourClock', current: '00:30:00' }).then(function (picker) { var x = 2; var current = picker.winControl.current; var periodControl = periodElement(picker); var minuteControl = minuteElement(picker); var hourControl = hourElement(picker); LiveUnit.Assert.isTrue(!periodControl, "checking the content of period"); LiveUnit.Assert.areEqual('zero', hourControl.value, "checking the content of hour"); LiveUnit.Assert.areEqual('30', minuteControl.value, "checking the content of minute"); LiveUnit.Assert.areEqual("HM", getActualUIOrder(), "checking the correctness of the order"); LiveUnit.Assert.areEqual(24, hourControl.length, "checking that 24 elements are added"); LiveUnit.Assert.areEqual(60, minuteControl.length, "checking that 24 elements are added"); }). then(null, unhandledTestError). then(cleanupTimePicker). then(newComplete, newComplete); } else { complete(); } } testCustomInformationProvider24HourClockWithDifferentIncrements(complete) { if (!isWinRTEnabled()) { var old = (WinJS.UI.TimePicker).getInformation; var newComplete = function () { (WinJS.UI.TimePicker).getInformation = old; complete(); }; (WinJS.UI.TimePicker).getInformation = getInformationJS; createPickerWithAppend({ clock: '24HourClock', current: '23:30:00', minuteIncrement: 15 }).then(function (picker) { var x = 2; var current = picker.winControl.current; var periodControl = periodElement(picker); var minuteControl = minuteElement(picker); var hourControl = hourElement(picker); LiveUnit.Assert.isTrue(!periodControl, "checking the content of period"); LiveUnit.Assert.areEqual('twenty-three', hourControl.value, "checking the content of hour"); LiveUnit.Assert.areEqual('30', minuteControl.value, "checking the content of minute"); LiveUnit.Assert.areEqual("HM", getActualUIOrder(), "checking the correctness of the order"); LiveUnit.Assert.areEqual(24, hourControl.length, "checking that 24 elements are added"); LiveUnit.Assert.areEqual(4, minuteControl.length, "checking that 24 elements are added"); }). then(null, unhandledTestError). then(cleanupTimePicker). then(newComplete, newComplete); } else { complete(); } } testChangingClockFormat(complete) { //BUGID: 729979 var cleanup; if (isWinRTEnabled()) { createPickerWithAppend( { clock: '12HourClock', current: '13:05:00' }).then(function (picker) { timePicker = picker; var clock = "12HourClock"; var calendar = new glob.Calendar(); calendar.changeClock(clock); clock = calendar.getClock(); var expectedCount = 12; var definedPeriod = true; var selectControls = getControls(picker); LiveUnit.Assert.areEqual(expectedCount, selectControls.hourSelect.length, "wrong number of hour elements"); LiveUnit.Assert.areEqual(definedPeriod, !!selectControls.periodSelect, "Not expected behavior of period control"); var UIOrder = getActualUIOrder(); var actualOrder = getExpectedOrder(calendar.getCalendarSystem(), clock); LiveUnit.Assert.areEqual(actualOrder, UIOrder, "Order is not corrrect on 12HourClock"); LiveUnit.Assert.areEqual("1", selectControls.hourSelect.value, "Expected Value for hourControl in 12HourClock is not correct"); LiveUnit.Assert.areEqual("05", selectControls.minuteSelect.value, "Expected Value for minuteControl in 12HourClock is not correct"); checkPeriodControlValue("PM", selectControls.periodSelect, true); clock = "24HourClock"; calendar.changeClock(clock); picker.winControl.clock = clock; picker.winControl.minuteIncrement = "15"; clock = calendar.getClock(); expectedCount = 24; definedPeriod = false; actualOrder = getExpectedOrder(calendar.getCalendarSystem(), clock); selectControls = getControls(picker); LiveUnit.Assert.areEqual(expectedCount, selectControls.hourSelect.length, "wrong number of hour elements"); LiveUnit.Assert.areEqual(definedPeriod, !!selectControls.periodSelect, "Not expected behavior of period control for 24 hour clock"); UIOrder = getActualUIOrder(); LiveUnit.Assert.areEqual(actualOrder, UIOrder, "Order is not corrrect on 12HourClock"); LiveUnit.Assert.areEqual("13", selectControls.hourSelect.value, "Expected Value for hourControl in 24HourClock is not correct"); LiveUnit.Assert.areEqual("00", selectControls.minuteSelect.value, "Expected Value for minuteControl in 24HourClock is not correct"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testPatternWithSpecialCharacters(complete) { if (isWinRTEnabled()) { createPickerWithAppend({ hourPattern: " ' & < > # {hour.integer(3)}", minutePattern: " ' & < > # {minute.integer(3)}", periodPattern: ': ! @ $ % ^ " {period.abbreviated(3)}', current: '15:45:01' }). then(function (picker) { var hour = hourElement(picker).value; var minute = minuteElement(picker).value; var period = periodElement(picker); var current = picker.winControl.current; checkPeriodControlValue(': ! @ $ % ^ " PM', period); if (isPeriodControl()) { LiveUnit.Assert.areEqual(" ' & < > # 003", hour, "checking the content of hour"); } else { LiveUnit.Assert.areEqual(" ' & < > # 015", hour, "checking the content of hour"); } LiveUnit.Assert.areEqual(" ' & < > # 045", minute, "checking the content of minute"); picker.winControl.current = '05:20:03'; hour = hourElement(picker).value; minute = minuteElement(picker).value; checkPeriodControlValue(': ! @ $ % ^ " AM', period); LiveUnit.Assert.areEqual(" ' & < > # 005", hour, "checking the content of hour"); LiveUnit.Assert.areEqual(" ' & < > # 020", minute, "checking the content of minute"); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testMinuteIncrement(complete) { if (isWinRTEnabled()) { createPickerWithAppend({ minuteIncrement: 5, current: '3:30PM' }). then(function (picker) { function setAndCheck(increment) { picker.winControl.minuteIncrement = increment; var minute = minuteElement(picker).value; LiveUnit.Assert.areEqual("30", minute, "checking the content of minute"); } setAndCheck(15); setAndCheck(10); setAndCheck(30); setAndCheck(5); }) .then(null, unhandledTestError) .then(cleanupTimePicker) .then(complete, complete); } else complete(); } testConstructionWithEventHandlerInOptions(complete) { var handler = function () { complete(); }; var dp = new WinJS.UI.TimePicker(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.TimePickerDecl");