import testModule = require("../../ui-test"); import TKUnit = require("../../TKUnit"); import helper = require("../helper"); import viewModule = require("ui/core/view"); import labelModule = require("ui/label"); import stackLayoutModule = require("ui/layouts/stack-layout"); import tabViewTestsNative = require("./tab-view-tests-native"); import frameModule = require("ui/frame"); import pageModule = require("ui/page"); import listViewModule = require("ui/list-view"); import buttonModule = require("ui/button"); import observable = require("data/observable"); import builder = require("ui/builder"); // // # TabView // ### Declaring the TabView in xml. //```XML // // // // // // // // // // // // // // //``` // Using a TabView requires the "ui/tab-view" module. // ``` JavaScript import tabViewModule = require("ui/tab-view"); // ``` // var ASYNC = 2; export class TabViewTest extends testModule.UITest { public create(): tabViewModule.TabView { // // ## Creating a TabView // ``` JavaScript var tabView = new tabViewModule.TabView(); // ``` // tabView.id = "TabView"; return tabView; } private _createItems(count: number): Array { var items = new Array(); for (var i = 0; i < count; i++) { var label = new labelModule.Label(); label.text = "Tab " + i; var tabEntry = new tabViewModule.TabViewItem({ title: "Tab " + i, view: label }); items.push(tabEntry); } return items; } private _createListView(): listViewModule.ListView { var listView = new listViewModule.ListView(); listView.id = "ListView"; var items = Array.apply(null, Array(10)).map(function (_, i) { return i; }); listView.on(listViewModule.ListView.itemLoadingEvent, function (args: listViewModule.ItemEventData) { var button = args.view; if (!button) { button = new buttonModule.Button(); args.view = button; } button.text = "Button" + args.index; button.id = button.text; button.on(buttonModule.Button.tapEvent, this._clickHandlerFactory(args.index)); }); listView.items = items; return listView; } private _clickHandlerFactory = function (index: number) { return function () { var pageFactory = function (): pageModule.Page { var detailsLabel = new labelModule.Label(); detailsLabel.text = "Details Page " + index; var detailsPage = new pageModule.Page(); detailsPage.content = detailsLabel; return detailsPage; }; helper.navigate(pageFactory); } } public testWhenTabViewIsCreatedItemsAreUndefined = function () { TKUnit.assertEqual(this.testView.items, undefined, "Items should be undefined initally."); } public testWhenTabViewIsCreatedSelectedIndexIsUndefined = function () { TKUnit.assertEqual(this.testView.selectedIndex, undefined, "selectedIndex should be undefined initally."); } public testWhenSettingItemsToNonEmptyArrayTheSameAmountOfNativeTabsIsCreated = function () { this.testView.items = this._createItems(10); this.waitUntilTestElementIsLoaded(); let expectedValue = this.testView.items.length; let actualValue = tabViewTestsNative.getNativeTabCount(this.testView); TKUnit.assertEqual(actualValue, expectedValue, "NativeItems not equal to JS items."); } public testWhenSettingItemsToEmptyArrayZeroNativeTabsAreCreated = function () { var tabView = this.testView; tabView.items = []; this.waitUntilTestElementIsLoaded(); var expectedValue = tabView.items.length; var actualValue = tabViewTestsNative.getNativeTabCount(tabView); TKUnit.assertEqual(actualValue, expectedValue, "Should have 0 native tabs."); } public testSelectedIndexBecomesZeroWhenItemsBoundToNonEmptyArray = function () { var tabView = this.testView; // // ### Binding TabView.items // ``` JavaScript var items = []; var StackLayout0 = new stackLayoutModule.StackLayout(); var label0 = new labelModule.Label(); label0.text = "Tab 0"; StackLayout0.addChild(label0); var tabEntry0 = { title: "Tab 0", view: StackLayout0 }; items.push(tabEntry0); var StackLayout1 = new stackLayoutModule.StackLayout(); var label1 = new labelModule.Label(); label1.text = "Tab 1"; StackLayout1.addChild(label1); var tabEntry1 = { title: "Tab 1", view: StackLayout1 }; items.push(tabEntry1); tabView.items = items; // ``` // this.waitUntilTestElementIsLoaded(); var expectedValue = 0; var actualValue = tabView.selectedIndex; TKUnit.assertEqual(actualValue, expectedValue, "When bound selectedIndex should be 0."); } public testSelectedIndexBecomesUndefinedWhenItemsBoundToEmptyArray = function () { var tabView = this.testView; tabView.items = this._createItems(10); this.waitUntilTestElementIsLoaded(); // // ### Selecting a tab programmatically // ``` JavaScript tabView.selectedIndex = 9; // ``` // tabView.items = []; var expectedValue = undefined; var actualValue = tabView.selectedIndex; TKUnit.assertEqual(actualValue, expectedValue, "selectedIndex should be undefined."); } public testSelectedIndexBecomesUndefinedWhenItemsSetToUndefined = function () { var tabView = this.testView; tabView.items = this._createItems(10); this.waitUntilTestElementIsLoaded(); tabView.selectedIndex = 9; tabView.items = undefined; var expectedValue = undefined; var actualValue = tabView.selectedIndex; TKUnit.assertEqual(actualValue, expectedValue, "selectedIndex should be undefined."); } public testSelectedIndexBecomesUndefinedWhenItemsSetToNull = function () { var tabView = this.testView; tabView.items = this._createItems(10); tabView.selectedIndex = 9; this.waitUntilTestElementIsLoaded(); tabView.items = null; var expectedValue = undefined; var actualValue = tabView.selectedIndex; TKUnit.assertEqual(actualValue, expectedValue, "selectedIndex should be undefined."); } public testItemsIsResolvedCorrectlyIfSetBeforeViewIsLoaded = function () { var tabView = this.testView; var expectedValue = 10; tabView.items = this._createItems(expectedValue); tabView.selectedIndex = 9; this.waitUntilTestElementIsLoaded(); var actualValue = tabView.items.length; TKUnit.assertEqual(actualValue, expectedValue, "items.length should be 10"); } public testSelectedIndexIsResolvedCorrectlyIfSetBeforeViewIsLoaded = function () { var tabView = this.testView; tabView.items = this._createItems(10); var expectedValue = 9; tabView.selectedIndex = expectedValue; this.waitUntilTestElementIsLoaded(); var actualValue = tabView.selectedIndex; TKUnit.assertEqual(actualValue, expectedValue, "selectedIndex"); } public testSettingNegativeSelectedIndexShouldThrow = function () { var tabView = this.testView; this.waitUntilTestElementIsLoaded(); tabView.items = this._createItems(10); TKUnit.assertThrows(function () { tabView.selectedIndex = -1; }, "Setting selectedIndex to a negative number should throw."); } public testSettingSelectedIndexLargerThanCountShouldThrow = function () { var tabView = this.testView; this.waitUntilTestElementIsLoaded(); tabView.items = this._createItems(10); TKUnit.assertThrows(function () { tabView.selectedIndex = 10; }, "Setting selectedIndex to a negative number should throw."); } public testBindingToTabEntryWithUndefinedViewShouldThrow = function () { var tabView = this.testView; this.waitUntilTestElementIsLoaded(); TKUnit.assertThrows(function () { tabView.items = [new tabViewModule.TabViewItem({ title: "Tab 0", view: undefined })]; }, "Binding TabView to a TabViewItem with undefined view should throw."); } public testBindingToTabEntryWithNullViewShouldThrow = function () { var tabView = this.testView; this.waitUntilTestElementIsLoaded(); TKUnit.assertThrows(function () { tabView.items = [new tabViewModule.TabViewItem({ title: "Tab 0", view: null })]; }, "Binding TabView to a TabViewItem with null view should throw."); } public testWhenSelectingATabNativelySelectedIndexIsUpdatedProperly = function () { var tabView = this.testView; tabView.items = this._createItems(2); this.waitUntilTestElementIsLoaded(); var expectedValue = 1; tabViewTestsNative.selectNativeTab(tabView, expectedValue); TKUnit.waitUntilReady(function () { return tabView.selectedIndex === expectedValue; }, helper.ASYNC); var actualValue = tabView.selectedIndex; TKUnit.assertEqual(actualValue, expectedValue, "selectedIndex"); } public testWhenSelectingATabNativelySelectedIndexChangedEventIsRaised = function () { var tabView = this.testView; tabView.items = this._createItems(10); this.waitUntilTestElementIsLoaded(); var expectedOldIndex = 3; var expectedNewIndex = 5; var actualOldIndex; var actualNewIndex; tabViewTestsNative.selectNativeTab(tabView, expectedOldIndex); TKUnit.waitUntilReady(function () { return tabView.selectedIndex === expectedOldIndex; }, helper.ASYNC); tabView.on(tabViewModule.TabView.selectedIndexChangedEvent, (args: tabViewModule.SelectedIndexChangedEventData) => { actualOldIndex = args.oldIndex; actualNewIndex = args.newIndex; }); tabViewTestsNative.selectNativeTab(tabView, expectedNewIndex); TKUnit.waitUntilReady(function () { return tabView.selectedIndex === expectedNewIndex; }, helper.ASYNC); TKUnit.assertEqual(actualOldIndex, expectedOldIndex, "expectedOldIndex"); TKUnit.assertEqual(actualNewIndex, expectedNewIndex, "expectedNewIndex"); } public testWhenSettingSelectedIndexProgramaticallySelectedIndexChangedEventIsRaised = function () { var tabView = this.testView; tabView.items = this._createItems(10); this.waitUntilTestElementIsLoaded(); var expectedOldIndex = 2; var expectedNewIndex = 6; var actualOldIndex; var actualNewIndex; tabView.selectedIndex = expectedOldIndex; TKUnit.waitUntilReady(function () { return tabViewTestsNative.getNativeSelectedIndex(tabView) === expectedOldIndex; }, helper.ASYNC); tabView.on(tabViewModule.TabView.selectedIndexChangedEvent, (args: tabViewModule.SelectedIndexChangedEventData) => { actualOldIndex = args.oldIndex; actualNewIndex = args.newIndex; }); tabView.selectedIndex = expectedNewIndex; TKUnit.waitUntilReady(function () { return tabViewTestsNative.getNativeSelectedIndex(tabView) === expectedNewIndex; }, helper.ASYNC); TKUnit.assertEqual(actualOldIndex, expectedOldIndex, "expectedOldIndex"); TKUnit.assertEqual(actualNewIndex, expectedNewIndex, "expectedNewIndex"); } /* public testBindingIsRefreshedWhenTabViewItemIsUnselectedAndThenSelectedAgain() { var viewModel = new observable.Observable(); viewModel.set("counter", 0); this.testPage.bindingContext = viewModel; var tabView = this.testView; var items = this._createItems(10); var StackLayout0 = new stackLayoutModule.StackLayout(); var label0 = new labelModule.Label(); label0.text = "Tab 0"; label0.id = "testLabel"; label0.bind({ sourceProperty: "counter", targetProperty: "text", twoWay: true }); StackLayout0.addChild(label0); var tabEntry0 = new tabViewModule.TabViewItem({ title: "Tab 0", view: StackLayout0 }); items.push(tabEntry0); tabView.items = items; tabView.selectedIndex = 10; TKUnit.waitUntilReady(function () { return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex; }, helper.ASYNC); TKUnit.assertEqual(label0.text, 0, "binding is not working!"); tabView.selectedIndex = 0; TKUnit.waitUntilReady(function () { return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex; }, helper.ASYNC); tabView.selectedIndex = 10; TKUnit.waitUntilReady(function () { return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex; }, helper.ASYNC); var expectedValue = 5; viewModel.set("counter", expectedValue); TKUnit.assertEqual(label0.text, expectedValue, "binding is not working!"); }*/ } export function createTestCase(): TabViewTest { return new TabViewTest(); } export function test__tabview_selectedindex_will_work_from_xml() { var p = builder.parse( '' + '' + ''+ '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''); function testAction(views: Array) { var tab: tabViewModule.TabView = p.content; TKUnit.wait(0.2); TKUnit.assertEqual(tab.selectedIndex, 1); }; helper.navigate(function () { return p; }); try { testAction([p.content, p]); } finally { helper.goBack(); } }