From 3bc025633b03ab03d4fef74d41d7dc10ecf39af7 Mon Sep 17 00:00:00 2001 From: vakrilov Date: Mon, 20 Apr 2015 15:57:11 +0300 Subject: [PATCH] Pickers fixes and tests --- .../date-picker-tests-native.android.ts | 4 + .../date-picker/date-picker-tests-native.d.ts | 4 +- .../date-picker-tests-native.ios.ts | 9 +- .../tests/ui/date-picker/date-picker-tests.ts | 96 ++++++++++++++++--- .../time-picker-tests-native.android.ts | 5 + .../time-picker/time-picker-tests-native.d.ts | 4 +- .../time-picker-tests-native.ios.ts | 8 ++ .../tests/ui/time-picker/time-picker-tests.ts | 67 +++++++++++-- ui/date-picker/date-picker.android.ts | 17 +++- ui/time-picker/time-picker.android.ts | 45 ++++++--- 10 files changed, 219 insertions(+), 40 deletions(-) diff --git a/apps/tests/ui/date-picker/date-picker-tests-native.android.ts b/apps/tests/ui/date-picker/date-picker-tests-native.android.ts index f44f9481b..e8326514b 100644 --- a/apps/tests/ui/date-picker/date-picker-tests-native.android.ts +++ b/apps/tests/ui/date-picker/date-picker-tests-native.android.ts @@ -31,3 +31,7 @@ export function setNativeMonth(datePicker: datePickerModule.DatePicker, value: n export function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void { datePicker.android.updateDate(datePicker.android.getYear(), datePicker.android.getMonth(), value); } + +export function setNativeDate(datePicker: datePickerModule.DatePicker, year: number, month: number, day: number): void { + datePicker.android.updateDate(year, month - 1, day); +} \ No newline at end of file diff --git a/apps/tests/ui/date-picker/date-picker-tests-native.d.ts b/apps/tests/ui/date-picker/date-picker-tests-native.d.ts index 6cc8e0556..d27549c13 100644 --- a/apps/tests/ui/date-picker/date-picker-tests-native.d.ts +++ b/apps/tests/ui/date-picker/date-picker-tests-native.d.ts @@ -9,4 +9,6 @@ export declare function getNativeMinDate(datePicker: datePickerModule.DatePicker export declare function setNativeYear(datePicker: datePickerModule.DatePicker, value: number): void; export declare function setNativeMonth(datePicker: datePickerModule.DatePicker, value: number): void; -export declare function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void; \ No newline at end of file +export declare function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void; + +export declare function setNativeDate(datePicker: datePickerModule.DatePicker, year: number, month: number, day: number): void; \ No newline at end of file diff --git a/apps/tests/ui/date-picker/date-picker-tests-native.ios.ts b/apps/tests/ui/date-picker/date-picker-tests-native.ios.ts index 6cc54d7b6..d8407e8c5 100644 --- a/apps/tests/ui/date-picker/date-picker-tests-native.ios.ts +++ b/apps/tests/ui/date-picker/date-picker-tests-native.ios.ts @@ -41,4 +41,11 @@ export function setNativeDay(datePicker: datePickerModule.DatePicker, value: num (datePicker)._changeHandler.valueChanged(datePicker.ios); } - \ No newline at end of file +export function setNativeDate(datePicker: datePickerModule.DatePicker, year: number, month: number, day: number): void { + var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date); + comps.year = year; + comps.month = month; + comps.day = day; + datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + (datePicker)._changeHandler.valueChanged(datePicker.ios); +} \ No newline at end of file diff --git a/apps/tests/ui/date-picker/date-picker-tests.ts b/apps/tests/ui/date-picker/date-picker-tests.ts index e596c7b2d..ca75f4adc 100644 --- a/apps/tests/ui/date-picker/date-picker-tests.ts +++ b/apps/tests/ui/date-picker/date-picker-tests.ts @@ -11,7 +11,7 @@ import datePickerModule = require("ui/date-picker"); // ``` // -function _createDatePicker(): datePickerModule.DatePicker { +function _createDatePicker(year?: number, month?: number, day?: number): datePickerModule.DatePicker { // // ## Creating a DatePicker // ``` JavaScript @@ -19,10 +19,23 @@ function _createDatePicker(): datePickerModule.DatePicker { // ``` // datePicker.id = "DatePicker"; + + if (year) { + datePicker.year = year; + } + + if (month) { + datePicker.month = month; + } + + if (day) { + datePicker.day = day; + } + return datePicker; } -export var test_DummyForCodeSnippet = function () { +export function test_DummyForCodeSnippet() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; // @@ -38,7 +51,7 @@ export var test_DummyForCodeSnippet = function () { }); } -export var test_WhenCreated_YearIsUndefined = function () { +export function test_WhenCreated_YearIsUndefined() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var actualValue = datePicker.year; @@ -47,7 +60,7 @@ export var test_WhenCreated_YearIsUndefined = function () { }); } -export var test_WhenCreated_MonthIsUndefined = function () { +export function test_WhenCreated_MonthIsUndefined() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var actualValue = datePicker.month; @@ -56,7 +69,7 @@ export var test_WhenCreated_MonthIsUndefined = function () { }); } -export var test_WhenCreated_DayIsUndefined = function () { +export function test_WhenCreated_DayIsUndefined() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var actualValue = datePicker.day; @@ -65,7 +78,7 @@ export var test_WhenCreated_DayIsUndefined = function () { }); } -export var testYearFromLocalToNative = function () { +export function testYearFromLocalToNative() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var expectedValue = 1980; @@ -75,7 +88,7 @@ export var testYearFromLocalToNative = function () { }); } -export var testMonthFromLocalToNative = function () { +export function testMonthFromLocalToNative() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var expectedValue = 5; @@ -85,7 +98,7 @@ export var testMonthFromLocalToNative = function () { }); } -export var testDayFromLocalToNative = function () { +export function testDayFromLocalToNative() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var expectedValue = 19; @@ -95,7 +108,7 @@ export var testDayFromLocalToNative = function () { }); } -export var testMaxDateFromLocalToNative = function () { +export function testMaxDateFromLocalToNative() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var expectedValue = new Date(1980, 1, 9); @@ -105,7 +118,7 @@ export var testMaxDateFromLocalToNative = function () { }); } -export var testMinDateFromLocalToNative = function () { +export function testMinDateFromLocalToNative() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var expectedValue = new Date(1980, 1, 9); @@ -115,7 +128,7 @@ export var testMinDateFromLocalToNative = function () { }); } -export var testYearFromNativeToLocal = function () { +export function testYearFromNativeToLocal() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var expectedValue = 1981; @@ -125,7 +138,7 @@ export var testYearFromNativeToLocal = function () { }); } -export var testMonthFromNativeToLocal = function () { +export function testMonthFromNativeToLocal() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var expectedValue = 6; @@ -135,7 +148,19 @@ export var testMonthFromNativeToLocal = function () { }); } -export var testDayFromNativeToLocal = function () { +export function testYearMonthDayFromNativeToLocal() { + var testYear = 2000; + var testMonth = 3; + var testDay = 24; + + helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { + var datePicker = views[0]; + datePickerTestsNative.setNativeDate(datePicker, testYear, testMonth, testDay); + assertDate(datePicker, testYear, testMonth, testDay); + }); +} + +export function testDayFromNativeToLocal() { helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { var datePicker = views[0]; var expectedValue = 20; @@ -145,7 +170,50 @@ export var testDayFromNativeToLocal = function () { }); } -//export var testWTF = function () { +export function testSetYearMonthDay_BeforeLoaded() { + var testYear = 2000; + var testMonth = 3; + var testDay = 24; + + helper.buildUIAndRunTest(_createDatePicker(testYear, testMonth, testDay), function (views: Array) { + var datePicker = views[0]; + + TKUnit.assertEqual(datePicker.year, testYear, "datePicker.year"); + TKUnit.assertEqual(datePicker.month, testMonth, "datePicker.month"); + TKUnit.assertEqual(datePicker.day, testDay, "datePicker.day"); + + TKUnit.assertEqual(datePickerTestsNative.getNativeYear(datePicker), testYear, "Native datePicker.year"); + TKUnit.assertEqual(datePickerTestsNative.getNativeMonth(datePicker), testMonth, "Native datePicker.month"); + TKUnit.assertEqual(datePickerTestsNative.getNativeDay(datePicker), testDay, "Native datePicker.day"); + }); +} + +export function testSetYearMonthDay_AfterLoaded() { + var testYear = 2000; + var testMonth = 3; + var testDay = 24; + + helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) { + var datePicker = views[0]; + datePicker.year = testYear; + datePicker.month = testMonth; + datePicker.day = testDay; + + assertDate(datePicker, testYear, testMonth, testDay); + }); +} + +function assertDate(datePicker: datePickerModule.DatePicker, expectedYear: number, expectedMonth: number, expectedDay: number) { + TKUnit.assertEqual(datePicker.year, expectedYear, "datePicker.year"); + TKUnit.assertEqual(datePicker.month, expectedMonth, "datePicker.month"); + TKUnit.assertEqual(datePicker.day, expectedDay, "datePicker.day"); + + TKUnit.assertEqual(datePickerTestsNative.getNativeYear(datePicker), expectedYear, "Native datePicker.year"); + TKUnit.assertEqual(datePickerTestsNative.getNativeMonth(datePicker), expectedMonth, "Native datePicker.month"); + TKUnit.assertEqual(datePickerTestsNative.getNativeDay(datePicker), expectedDay, "Native datePicker.day"); +} + +//export function testWTF() { // var picker = new UIDatePicker(); // picker.datePickerMode = UIDatePickerMode.UIDatePickerModeDate; // var jsDate = new Date(1980, 1, 9); diff --git a/apps/tests/ui/time-picker/time-picker-tests-native.android.ts b/apps/tests/ui/time-picker/time-picker-tests-native.android.ts index 290c7f1dd..ce5d7459f 100644 --- a/apps/tests/ui/time-picker/time-picker-tests-native.android.ts +++ b/apps/tests/ui/time-picker/time-picker-tests-native.android.ts @@ -14,4 +14,9 @@ export function setNativeHour(timePicker: timePickerModule.TimePicker, value: nu export function setNativeMinute(timePicker: timePickerModule.TimePicker, value: number): void { timePicker.android.setCurrentMinute(new java.lang.Integer(value)); +} + +export function setNativeTime(timePicker: timePickerModule.TimePicker, hour: number, minute: number): void { + timePicker.android.setCurrentHour(new java.lang.Integer(hour)); + timePicker.android.setCurrentMinute(new java.lang.Integer(minute)); } \ No newline at end of file diff --git a/apps/tests/ui/time-picker/time-picker-tests-native.d.ts b/apps/tests/ui/time-picker/time-picker-tests-native.d.ts index 41f6a61a9..d623430a3 100644 --- a/apps/tests/ui/time-picker/time-picker-tests-native.d.ts +++ b/apps/tests/ui/time-picker/time-picker-tests-native.d.ts @@ -5,4 +5,6 @@ export declare function getNativeHour(timePicker: timePickerModule.TimePicker): export declare function getNativeMinute(timePicker: timePickerModule.TimePicker): number; export declare function setNativeHour(timePicker: timePickerModule.TimePicker, value: number): void; -export declare function setNativeMinute(timePicker: timePickerModule.TimePicker, value: number): void; \ No newline at end of file +export declare function setNativeMinute(timePicker: timePickerModule.TimePicker, value: number): void; + +export declare function setNativeTime(timePicker: timePickerModule.TimePicker, hour: number, minute: number): void; \ No newline at end of file diff --git a/apps/tests/ui/time-picker/time-picker-tests-native.ios.ts b/apps/tests/ui/time-picker/time-picker-tests-native.ios.ts index c59cf3c92..5a4e8d2ae 100644 --- a/apps/tests/ui/time-picker/time-picker-tests-native.ios.ts +++ b/apps/tests/ui/time-picker/time-picker-tests-native.ios.ts @@ -21,4 +21,12 @@ export function setNativeMinute(timePicker: timePickerModule.TimePicker, value: timePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); (timePicker)._changeHandler.valueChanged(timePicker.ios); } + +export function setNativeTime(timePicker: timePickerModule.TimePicker, hour: number, minute: number): void { + var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitHour | NSCalendarUnit.NSCalendarUnitMinute, timePicker.ios.date); + comps.hour = hour; + comps.minute = minute; + timePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + (timePicker)._changeHandler.valueChanged(timePicker.ios); +} \ No newline at end of file diff --git a/apps/tests/ui/time-picker/time-picker-tests.ts b/apps/tests/ui/time-picker/time-picker-tests.ts index d921454a9..c35ea6e13 100644 --- a/apps/tests/ui/time-picker/time-picker-tests.ts +++ b/apps/tests/ui/time-picker/time-picker-tests.ts @@ -11,7 +11,7 @@ import timePickerModule = require("ui/time-picker"); // ``` // -function _createTimePicker(): timePickerModule.TimePicker { +function _createTimePicker(hour?: number, minute?: number): timePickerModule.TimePicker { // // ## Creating a TimePicker // ``` JavaScript @@ -19,10 +19,19 @@ function _createTimePicker(): timePickerModule.TimePicker { // ``` // timePicker.id = "timePicker"; + + if (hour) { + timePicker.hour = hour; + } + + if (minute) { + timePicker.minute = minute; + } + return timePicker; } -export var test_DummyForCodeSnippet = function () { +export function test_DummyForCodeSnippet() { helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { var timePicker = views[0]; // @@ -35,7 +44,7 @@ export var test_DummyForCodeSnippet = function () { }); } -export var test_WhenCreated_HourIsUndefined = function () { +export function test_WhenCreated_HourIsUndefined() { helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { var timePicker = views[0]; var actualValue = timePicker.hour; @@ -44,7 +53,7 @@ export var test_WhenCreated_HourIsUndefined = function () { }); } -export var test_WhenCreated_MinuteIsUndefined = function () { +export function test_WhenCreated_MinuteIsUndefined() { helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { var timePicker = views[0]; var actualValue = timePicker.minute; @@ -53,7 +62,7 @@ export var test_WhenCreated_MinuteIsUndefined = function () { }); } -export var testHourFromLocalToNative = function () { +export function testHourFromLocalToNative() { helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { var timePicker = views[0]; var expectedValue = 13; @@ -63,7 +72,7 @@ export var testHourFromLocalToNative = function () { }); } -export var testMinuteFromLocalToNative = function () { +export function testMinuteFromLocalToNative() { helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { var timePicker = views[0]; var expectedValue = 59; @@ -73,7 +82,7 @@ export var testMinuteFromLocalToNative = function () { }); } -export var testHourFromNativeToLocal = function () { +export function testHourFromNativeToLocal() { helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { var timePicker = views[0]; var expectedValue = 14; @@ -83,7 +92,7 @@ export var testHourFromNativeToLocal = function () { }); } -export var testMinuteFromNativeToLocal = function () { +export function testMinuteFromNativeToLocal() { helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { var timePicker = views[0]; var expectedValue = 33; @@ -91,4 +100,46 @@ export var testMinuteFromNativeToLocal = function () { var actualValue = timePicker.minute; TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); }); +} + +export function testHourAndMinuteFromNativeToLocal() { + var expectedHour = 12; + var expectedMinute = 34; + + helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { + var timePicker = views[0]; + timePickerTestsNative.setNativeTime(timePicker, expectedHour, expectedMinute); + assertTime(timePicker, expectedHour, expectedMinute); + }); +} + +export function testSetHourMinute_BeforeLoaded() { + var expectedHour = 12; + var expectedMinute = 34; + + helper.buildUIAndRunTest(_createTimePicker(expectedHour, expectedMinute), function (views: Array) { + var timePicker = views[0]; + assertTime(timePicker, expectedHour, expectedMinute); + }); +} + +export function testSetHourMinute_AfterLoaded() { + var expectedHour = 12; + var expectedMinute = 34; + + helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { + var timePicker = views[0]; + timePicker.hour = expectedHour; + timePicker.minute = expectedMinute; + + assertTime(timePicker, expectedHour, expectedMinute); + }); +} + +function assertTime(timePicker: timePickerModule.TimePicker, expectedHour: number, expectedMinute) { + TKUnit.assertEqual(timePicker.hour, expectedHour, "timePicker.hour"); + TKUnit.assertEqual(timePicker.minute, expectedMinute, "timePicker.minute"); + + TKUnit.assertEqual(timePickerTestsNative.getNativeHour(timePicker), expectedHour, "Native timePicker.hour"); + TKUnit.assertEqual(timePickerTestsNative.getNativeMinute(timePicker), expectedMinute, "Native timePicker.minute"); } \ No newline at end of file diff --git a/ui/date-picker/date-picker.android.ts b/ui/date-picker/date-picker.android.ts index 717837639..ea676e017 100644 --- a/ui/date-picker/date-picker.android.ts +++ b/ui/date-picker/date-picker.android.ts @@ -1,12 +1,13 @@ import common = require("ui/date-picker/date-picker-common"); import dependencyObservable = require("ui/core/dependency-observable"); import proxy = require("ui/core/proxy"); +import types = require("utils/types"); function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; if (picker.android && picker.android.getYear() !== data.newValue) { - picker.android.updateDate(data.newValue, picker.android.getMonth(), picker.android.getDayOfMonth()); + updateNativeDate(picker); } } @@ -16,7 +17,7 @@ function onMonthPropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; if (picker.android && picker.android.getMonth() !== (data.newValue - 1)) { - picker.android.updateDate(picker.android.getYear(), data.newValue - 1, picker.android.getDayOfMonth()); + updateNativeDate(picker); } } @@ -26,12 +27,20 @@ function onDayPropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; if (picker.android && picker.android.getDayOfMonth !== data.newValue) { - picker.android.updateDate(picker.android.getYear(), picker.android.getMonth(), data.newValue); + updateNativeDate(picker); } } (common.DatePicker.dayProperty.metadata).onSetNativeValue = onDayPropertyChanged; +function updateNativeDate(picker: DatePicker) { + var year = types.isNumber(picker.year) ? picker.year : picker.android.getYear(); + var month = types.isNumber(picker.month) ? (picker.month - 1) : picker.android.getMonth(); + var day = types.isNumber(picker.day) ? picker.day : picker.android.getDayOfMonth(); + + picker.android.updateDate(year, month, day); +} + function onMaxDatePropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; @@ -89,7 +98,7 @@ export class DatePicker extends common.DatePicker { if (day !== this.owner.day) { this.owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, day); - } + } } } }); diff --git a/ui/time-picker/time-picker.android.ts b/ui/time-picker/time-picker.android.ts index 4f642af22..f7268887d 100644 --- a/ui/time-picker/time-picker.android.ts +++ b/ui/time-picker/time-picker.android.ts @@ -4,20 +4,14 @@ import proxy = require("ui/core/proxy"); function onHourPropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; - - if (picker.android) { - picker.android.setCurrentHour(new java.lang.Integer(data.newValue)); - } + picker._setNativeHourSilently(data.newValue); } (common.TimePicker.hourProperty.metadata).onSetNativeValue = onHourPropertyChanged; function onMinutePropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; - - if (picker.android) { - picker.android.setCurrentMinute(new java.lang.Integer(data.newValue)); - } + picker._setNativeMinuteSilently(data.newValue); } (common.TimePicker.minuteProperty.metadata).onSetNativeValue = onMinutePropertyChanged; @@ -29,6 +23,7 @@ require("utils/module-merge").merge(common, exports); export class TimePicker extends common.TimePicker { private _android: android.widget.TimePicker; private _listener: android.widget.TimePicker.OnTimeChangedListener; + private _isSettingTime: boolean = false; get android(): android.widget.TimePicker { return this._android; @@ -45,12 +40,12 @@ export class TimePicker extends common.TimePicker { }, onTimeChanged: function (picker: android.widget.TimePicker, hour: number, minute: number) { - if (this.owner) { - + if (this.owner && !this.owner._isSettingTime) { + if (hour !== this.owner.hour) { this.owner._onPropertyChangedFromNative(common.TimePicker.hourProperty, hour); } - + if (minute !== this.owner.minute) { this.owner._onPropertyChangedFromNative(common.TimePicker.minuteProperty, minute); } @@ -59,4 +54,32 @@ export class TimePicker extends common.TimePicker { }); this._android.setOnTimeChangedListener(this._listener); } + + public _setNativeHourSilently(newValue: number) { + if (!this.android) { + return; + } + + this._isSettingTime = true; + try { + this.android.setCurrentHour(new java.lang.Integer(newValue)); + } + finally { + this._isSettingTime = false; + } + } + + public _setNativeMinuteSilently(newValue: number) { + if (!this.android) { + return; + } + + this._isSettingTime = true; + try { + this.android.setCurrentMinute(new java.lang.Integer(newValue)); + } + finally { + this._isSettingTime = false; + } + } } \ No newline at end of file