Merge pull request #186 from NativeScript/date-picker-tests

Fixed all DatePicker issues in both platforms and covered with tests.
This commit is contained in:
Rossen Hristov
2015-03-17 12:32:56 +02:00
15 changed files with 282 additions and 41 deletions

View File

@@ -131,6 +131,14 @@
<DependentUpon>segmented-bar-tests-native.d.ts</DependentUpon>
</TypeScriptCompile>
<TypeScriptCompile Include="apps\tests\ui\segmented-bar\segmented-bar-tests.ts" />
<TypeScriptCompile Include="apps\tests\ui\date-picker\date-picker-tests-native.android.ts">
<DependentUpon>date-picker-tests-native.d.ts</DependentUpon>
</TypeScriptCompile>
<TypeScriptCompile Include="apps\tests\ui\date-picker\date-picker-tests-native.d.ts" />
<TypeScriptCompile Include="apps\tests\ui\date-picker\date-picker-tests-native.ios.ts">
<DependentUpon>date-picker-tests-native.d.ts</DependentUpon>
</TypeScriptCompile>
<TypeScriptCompile Include="apps\tests\ui\date-picker\date-picker-tests.ts" />
<TypeScriptCompile Include="apps\tests\ui\list-picker\list-picker-tests-native.d.ts" />
<TypeScriptCompile Include="apps\tests\ui\list-picker\list-picker-tests-native.android.ts">
<DependentUpon>list-picker-tests-native.d.ts</DependentUpon>
@@ -1483,7 +1491,7 @@
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
</FlavorProperties>
<UserProperties ui_2scroll-view_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2editable-text-demo_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2absolute-layout-demo_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2gallery-app_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2content-view_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2web-view_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2linear-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2absolute-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2dock-layout_2package_1json__JSONSchema="" ui_2layouts_2grid-layout_2package_1json__JSONSchema="" ui_2layouts_2wrap-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" />
<UserProperties ui_2layouts_2wrap-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2grid-layout_2package_1json__JSONSchema="" ui_2layouts_2dock-layout_2package_1json__JSONSchema="" ui_2layouts_2absolute-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2linear-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2web-view_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2content-view_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2gallery-app_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2absolute-layout-demo_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2editable-text-demo_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2scroll-view_2package_1json__JSONSchema="http://json.schemastore.org/package" />
</VisualStudio>
</ProjectExtensions>
</Project>

View File

@@ -18,16 +18,26 @@ export function onPageLoaded(args: observableModule.EventData) {
page = <pagesModule.Page>args.object;
page.bindingContext = viewModel;
viewModel.items = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
viewModel.selectedIndex = 5;
label = page.getViewById<labelModule.Label>("label");
listPicker = page.getViewById<listPickerModule.ListPicker>("listPicker");
datePicker = page.getViewById<datePickerModule.DatePicker>("datePicker");
timePicker = page.getViewById<timePickerModule.TimePicker>("timePicker");
viewModel.items = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
viewModel.selectedIndex = 5;
//viewModel.day = 9;
//viewModel.month = 2;
//viewModel.year = 1980;
}
export function onTap(args: observableModule.EventData) {
console.log("onTap");
viewModel.items = ["Male", "Female"];
viewModel.selectedIndex = 1;
viewModel.day = viewModel.day + 1;
viewModel.month = viewModel.month + 1;
viewModel.year = viewModel.year + 1;
}

View File

@@ -3,7 +3,7 @@
<Button id="button" text="GO!" height="50" width="100" tap="onTap"/>
<Label id="label" text="{{ selectedIndex }}" height="50" width="100" />
<ListPicker id="listPicker" selectedIndex="{{ selectedIndex }}" items="{{ items }}"/>
<DatePicker id="datePicker"/>
<DatePicker id="datePicker" day="{{ day }}" month="{{ month }}" year="{{ year }}"/>
<TimePicker id="timePicker"/>
</StackLayout>
</Page>

View File

@@ -24,4 +24,34 @@ export class WebViewModel extends observable.Observable {
this._items = value;
this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "items", value: value });
}
private _day: number;
get day(): number {
return this._day;
}
set day(value: number) {
console.log("day:" + value);
this._day = value;
this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "day", value: value });
}
private _month: number;
get month(): number {
return this._month;
}
set month(value: number) {
console.log("month:" + value);
this._month = value;
this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "month", value: value });
}
private _year: number;
get year(): number {
return this._year;
}
set year(value: number) {
console.log("year:" + value);
this._year = value;
this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "year", value: value });
}
}

View File

@@ -48,6 +48,7 @@ allTests["FORMATTEDSTRING"] = require("./text/formatted-string-tests");
allTests["FILE-SYSTEM-ACCESS"] = require("./file-system-access-tests/file-system-access-tests");
allTests["XML-DECLARATION"] = require("./xml-declaration/xml-declaration-tests");
allTests["LIST-PICKER"] = require("./ui/list-picker/list-picker-tests");
allTests["DATE-PICKER"] = require("./ui/date-picker/date-picker-tests");
var testsWithLongDelay = {
testLocation: 10000,

View File

@@ -0,0 +1,25 @@
import datePickerModule = require("ui/date-picker");
export function getNativeYear(datePicker: datePickerModule.DatePicker): number {
return datePicker.android.getYear();
}
export function getNativeMonth(datePicker: datePickerModule.DatePicker): number {
return datePicker.android.getMonth() + 1;
}
export function getNativeDay(datePicker: datePickerModule.DatePicker): number {
return datePicker.android.getDayOfMonth();
}
export function setNativeYear(datePicker: datePickerModule.DatePicker, value: number): void {
datePicker.android.updateDate(value, datePicker.android.getMonth(), datePicker.android.getDayOfMonth());
}
export function setNativeMonth(datePicker: datePickerModule.DatePicker, value: number): void {
datePicker.android.updateDate(datePicker.android.getYear(), value - 1, datePicker.android.getDayOfMonth());
}
export function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void {
datePicker.android.updateDate(datePicker.android.getYear(), datePicker.android.getMonth(), value);
}

View File

@@ -0,0 +1,10 @@
//@private
import datePickerModule = require("ui/date-picker");
export declare function getNativeYear(datePicker: datePickerModule.DatePicker): number;
export declare function getNativeMonth(datePicker: datePickerModule.DatePicker): number;
export declare function getNativeDay(datePicker: datePickerModule.DatePicker): number;
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;

View File

@@ -0,0 +1,36 @@
import datePickerModule = require("ui/date-picker");
export function getNativeYear(datePicker: datePickerModule.DatePicker): number {
return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date).year;
}
export function getNativeMonth(datePicker: datePickerModule.DatePicker): number {
return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date).month;
}
export function getNativeDay(datePicker: datePickerModule.DatePicker): number {
return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date).day;
}
export function setNativeYear(datePicker: datePickerModule.DatePicker, value: number): void {
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date);
comps.year = value;
datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
(<any>datePicker)._changeHandler.valueChanged(datePicker.ios);
}
export function setNativeMonth(datePicker: datePickerModule.DatePicker, value: number): void {
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date);
comps.month = value;
datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
(<any>datePicker)._changeHandler.valueChanged(datePicker.ios);
}
export function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void {
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date);
comps.day = value;
datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
(<any>datePicker)._changeHandler.valueChanged(datePicker.ios);
}

View File

@@ -0,0 +1,109 @@
import TKUnit = require("../../TKUnit");
import helper = require("../helper");
import viewModule = require("ui/core/view");
import datePickerTestsNative = require("./date-picker-tests-native");
// <snippet module="ui/date-picker" title="DatePicker">
// # DatePicker
// Using a DatePicker requires the "ui/date-picker" module.
// ``` JavaScript
import datePickerModule = require("ui/date-picker");
function _createDatePicker(): datePickerModule.DatePicker {
// <snippet module="ui/date-picker" title="DatePicker">
// ## Creating a DatePicker
// ``` JavaScript
var datePicker = new datePickerModule.DatePicker();
// ```
// </snippet>
datePicker.id = "DatePicker";
return datePicker;
}
export var test_WhenCreated_YearIsUndefined = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var actualValue = datePicker.year;
var expectedValue = undefined;
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var test_WhenCreated_MonthIsUndefined = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var actualValue = datePicker.month;
var expectedValue = undefined;
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var test_WhenCreated_DayIsUndefined = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var actualValue = datePicker.day;
var expectedValue = undefined;
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testYearFromLocalToNative = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var expectedValue = 1980;
datePicker.year = expectedValue;
var actualValue = datePickerTestsNative.getNativeYear(datePicker);
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testMonthFromLocalToNative = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var expectedValue = 5;
datePicker.month = expectedValue;
var actualValue = datePickerTestsNative.getNativeMonth(datePicker);
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testDayFromLocalToNative = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var expectedValue = 19;
datePicker.day = expectedValue;
var actualValue = datePickerTestsNative.getNativeDay(datePicker);
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testYearFromNativeToLocal = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var expectedValue = 1981;
datePickerTestsNative.setNativeYear(datePicker, expectedValue);
var actualValue = datePicker.year;
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testMonthFromNativeToLocal = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var expectedValue = 6;
datePickerTestsNative.setNativeMonth(datePicker, expectedValue);
var actualValue = datePicker.month;
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testDayFromNativeToLocal = function () {
helper.buildUIAndRunTest(_createDatePicker(), function (views: Array<viewModule.View>) {
var datePicker = <datePickerModule.DatePicker>views[0];
var expectedValue = 20;
datePickerTestsNative.setNativeDay(datePicker, expectedValue);
var actualValue = datePicker.day;
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}

View File

@@ -167,7 +167,7 @@ export var testSettingSelectedIndexLargerThanCountShouldThrow = function () {
listPicker.items = _createItems(10);
TKUnit.assertThrows(function () {
listPicker.selectedIndex = 10;
}, "Setting selectedIndex to a negative number should throw.");
}, "Setting selectedIndex to a number larger than item count should throw.");
});
}

View File

@@ -4,9 +4,9 @@ import proxy = require("ui/core/proxy");
import view = require("ui/core/view");
export class DatePicker extends view.View implements definition.DatePicker {
public static yearProperty = new dependencyObservable.Property("year", "DatePicker", new proxy.PropertyMetadata(0));
public static monthProperty = new dependencyObservable.Property("month", "DatePicker", new proxy.PropertyMetadata(0));
public static dayProperty = new dependencyObservable.Property("day", "DatePicker", new proxy.PropertyMetadata(0));
public static yearProperty = new dependencyObservable.Property("year", "DatePicker", new proxy.PropertyMetadata(undefined));
public static monthProperty = new dependencyObservable.Property("month", "DatePicker", new proxy.PropertyMetadata(undefined));
public static dayProperty = new dependencyObservable.Property("day", "DatePicker", new proxy.PropertyMetadata(undefined));
constructor() {
super();

View File

@@ -5,8 +5,8 @@ import proxy = require("ui/core/proxy");
function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.android) {
picker.android.init(data.newValue, picker.month, picker.day, picker._listener);
if (picker.android && picker.android.getYear() !== data.newValue) {
picker.android.updateDate(data.newValue, picker.android.getMonth(), picker.android.getDayOfMonth());
}
}
@@ -15,8 +15,8 @@ function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) {
function onMonthPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.android) {
picker.android.init(picker.year, data.newValue, picker.day, picker._listener);
if (picker.android && picker.android.getMonth() !== (data.newValue - 1)) {
picker.android.updateDate(picker.android.getYear(), data.newValue - 1, picker.android.getDayOfMonth());
}
}
@@ -25,8 +25,8 @@ function onMonthPropertyChanged(data: dependencyObservable.PropertyChangeData) {
function onDayPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.android) {
picker.android.init(picker.year, picker.month, data.newValue, picker._listener);
if (picker.android && picker.android.getDayOfMonth !== data.newValue) {
picker.android.updateDate(picker.android.getYear(), picker.android.getMonth(), data.newValue);
}
}
@@ -54,11 +54,20 @@ export class DatePicker extends common.DatePicker {
return that.get();
},
onDateChanged: function (picker: android.widget.DatePicker, monthOfYear: number, dayOfMonth: number) {
onDateChanged: function (picker: android.widget.DatePicker, year: number, month: number, day: number) {
if (this.owner) {
this.owner._onPropertyChangedFromNative(common.DatePicker.yearProperty, picker.getYear());
this.owner._onPropertyChangedFromNative(common.DatePicker.monthProperty, monthOfYear);
this.owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, dayOfMonth);
if (year !== this.owner.year) {
this.owner._onPropertyChangedFromNative(common.DatePicker.yearProperty, year);
}
if ((month + 1) !== this.owner.month) {
this.owner._onPropertyChangedFromNative(common.DatePicker.monthProperty, month + 1);
}
if (day !== this.owner.day) {
this.owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, day);
}
}
}
});
@@ -67,5 +76,6 @@ export class DatePicker extends common.DatePicker {
public _createUI() {
this._android = new android.widget.DatePicker(this._context);
this._android.setCalendarViewShown(false);
this._android.init(0, 0, 0, this._listener);
}
}

View File

@@ -31,12 +31,12 @@ declare module "ui/date-picker" {
year: number;
/**
* Gets or sets the month.
* Gets or sets the month. The months start from 1.
*/
month: number;
/**
* Gets or sets the day.
* Gets or sets the day. The days start from 1.
*/
day: number;
}

View File

@@ -6,7 +6,9 @@ function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.ios) {
setYearMonthDay(picker.ios, data.newValue, picker.month, picker.day);
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, picker.ios.date);
comps.year = data.newValue;
picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
}
}
@@ -16,7 +18,9 @@ function onMonthPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.ios) {
setYearMonthDay(picker.ios, picker.year, data.newValue, picker.day);
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, picker.ios.date);
comps.month = data.newValue;
picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
}
}
@@ -26,7 +30,9 @@ function onDayPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.ios) {
setYearMonthDay(picker.ios, picker.year, picker.month, data.newValue);
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, picker.ios.date);
comps.day = data.newValue;
picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
}
}
@@ -68,26 +74,22 @@ class UIDatePickerChangeHandlerImpl extends NSObject {
}
public valueChanged(sender: UIDatePicker) {
var calendar = NSCalendar.currentCalendar();
var comp = calendar.componentsFromDate(NSCalendarUnit.NSHourCalendarUnit | NSCalendarUnit.NSMinuteCalendarUnit, sender.date);
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, sender.date);
if (comps.year !== this._owner.year) {
this._owner._onPropertyChangedFromNative(common.DatePicker.yearProperty, comps.year);
}
this._owner._onPropertyChangedFromNative(common.DatePicker.yearProperty, comp.year);
this._owner._onPropertyChangedFromNative(common.DatePicker.monthProperty, comp.month);
this._owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, comp.day);
if (comps.month !== this._owner.month) {
this._owner._onPropertyChangedFromNative(common.DatePicker.monthProperty, comps.month);
}
if (comps.day !== this._owner.day) {
this._owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, comps.day);
}
}
public static ObjCExposedMethods = {
'valueChanged': { returns: interop.types.void, params: [UIDatePicker] }
};
}
function setYearMonthDay(picker: UIDatePicker, year: number, month: number, day: number) {
var calendar = NSCalendar.currentCalendar();
var comps = new NSDateComponents();
comps.year = year;
comps.month = month;
comps.day = day;
picker.setDateAnimated(calendar.dateFromComponents(comps), false);
}

View File

@@ -53,7 +53,7 @@ export class ListPicker extends view.View implements definition.ListPicker {
if (types.isDefined(this.items)) {
if (index < 0 || index >= this.items.length) {
this.selectedIndex = undefined;
throw new Error("SelectedIndex should be between [0, items.length)");
throw new Error("selectedIndex should be between [0, items.length - 1]");
}
}
}