// >> article-require-page-module import { Page, ShownModallyData, NavigatedData } from "tns-core-modules/ui/page"; // FrameModule is needed in order to have an option to navigate to the new page. import { topmost, NavigationEntry } from "tns-core-modules/ui/frame"; // << article-require-page-module // TODO: Remove this and get it from global to decouple builder for angular import { createViewFromEntry } from "tns-core-modules/ui/builder"; // >> article-set-bindingcontext function pageLoaded(args) { const page = args.object; page.bindingContext = { name: "Some name" }; } exports.pageLoaded = pageLoaded; // << article-set-bindingcontext import * as TKUnit from "../../tk-unit"; import * as helper from "../../ui-helper"; import { StackLayout } from "tns-core-modules/ui/layouts/stack-layout"; import { View, PercentLength, unsetValue, EventData, isIOS } from "tns-core-modules/ui/core/view"; import { Frame, _stack } from "tns-core-modules/ui/frame"; import { Label } from "tns-core-modules/ui/label"; import { Color } from "tns-core-modules/color"; import { TabView, TabViewItem } from "tns-core-modules/ui/tab-view/tab-view"; import { _resetRootView } from "tns-core-modules/application"; import { Button } from "tns-core-modules/ui/button/button"; import { ios } from "tns-core-modules/utils/utils"; export function addLabelToPage(page: Page, text?: string) { const label = new Label(); label.text = text || "The quick brown fox jumps over the lazy dog."; page.content = label; } export function test_recycling() { helper.nativeView_recycling_test(() => new Page()); } export function test_AfterPageLoaded_is_called_NativeInstance_is_created() { let page: Page; let label: Label; let nativeInstanceCreated = false; const handler = (data) => nativeInstanceCreated = !!label.nativeViewProtected; const pageFactory = () => { page = new Page(); page.id = `page_test_AfterPageLoaded_is_called_NativeInstance_is_created`; page.on(Label.loadedEvent, handler); label = new Label(); label.text = "Text"; page.content = label; return page; }; helper.navigate(pageFactory); TKUnit.assertTrue(nativeInstanceCreated, "nativeInstanceCreated"); page.off(Label.loadedEvent, handler); } export function test_PageLoaded_is_called_once() { let page1: Page; let page2: Page; let loaded = 0; const handler = function (data) { loaded++; }; const pageFactory = function (): Page { page1 = new Page(); page1.id = `page1_test_PageLoaded_is_called_once`; addLabelToPage(page1, "Page 1"); return page1; }; helper.navigate(pageFactory); TKUnit.assertEqual(loaded, 0); const pageFactory2 = function (): Page { page2 = new Page(); page2.id = `page2_test_PageLoaded_is_called_once`; addLabelToPage(page2, "Page 2"); page2.on(Label.loadedEvent, handler); return page2; }; helper.navigate(pageFactory2); TKUnit.assertEqual(loaded, 1); page2.off(Label.loadedEvent, handler); } export function test_NavigateToNewPage() { // >> article-create-navigate-to-page const topFrame = topmost(); let testPage: Page; const pageFactory = function (): Page { testPage = new Page(); const label = new Label(); label.text = "The quick brown fox jumps over the lazy dog."; testPage.content = label; return testPage; }; const navEntry = { create: pageFactory, animated: false }; topFrame.navigate(navEntry); // << article-create-navigate-to-page TKUnit.waitUntilReady(() => testPage.isLayoutValid); // >> article-navigating-backward topFrame.goBack(); // << article-navigating-backward TKUnit.waitUntilReady(() => topFrame.navigationQueueIsEmpty()); TKUnit.assertNull(testPage.parent, "Page.parent should become undefined after navigating back"); TKUnit.assertNull(testPage._context, "Page._context should become undefined after navigating back"); TKUnit.assertFalse(testPage.isLoaded, "Page.isLoaded should become false after navigating back"); TKUnit.assertNull(testPage.frame, "Page.frame should become undefined after navigating back"); TKUnit.assertFalse(testPage._isAddedToNativeVisualTree, "Page._isAddedToNativeVisualTree should become false after navigating back"); } export function test_PageNavigation_EventSequence_WithTransition() { _test_PageNavigation_EventSequence(true); } export function test_PageNavigation_EventSequence_WithoutTransition() { _test_PageNavigation_EventSequence(false); } function _test_PageNavigation_EventSequence(withTransition: boolean) { const context = { property: "this is the context" }; const eventSequence = []; let testPage: Page; const pageFactory = () => { testPage = new Page(); testPage.id = "testPage_test_PageNavigation_EventSequence"; addLabelToPage(testPage); testPage.on(Page.navigatingToEvent, function (data: NavigatedData) { eventSequence.push("navigatingTo"); TKUnit.assertEqual(data.context, context, "navigatingTo: navigationContext"); }); testPage.on(Page.loadedEvent, function (data: EventData) { eventSequence.push("loaded"); TKUnit.assertNotEqual(topmost().currentPage, data.object); }); testPage.on(Page.navigatedToEvent, function (data: NavigatedData) { eventSequence.push("navigatedTo"); TKUnit.assertEqual(data.context, context, "navigatedTo : navigationContext"); TKUnit.assertEqual(topmost().currentPage, data.object); }); testPage.on(Page.navigatingFromEvent, function (data: NavigatedData) { eventSequence.push("navigatingFrom"); TKUnit.assertEqual(data.context, context, "navigatingFrom: navigationContext"); }); testPage.on(Page.navigatedFromEvent, function (data: NavigatedData) { eventSequence.push("navigatedFrom"); TKUnit.assertEqual(data.context, context, "navigatedFrom: navigationContext"); }); testPage.on(Page.unloadedEvent, function (data) { eventSequence.push("unloaded"); }); return testPage; }; const navigationEntry: NavigationEntry = { create: pageFactory, context: context, animated: withTransition, transition: withTransition ? { name: "slide", duration: 10, } : undefined }; helper.navigateWithEntry(navigationEntry); helper.goBack(); const expectedEventSequence = ["navigatingTo", "loaded", "navigatedTo", "navigatingFrom", "unloaded", "navigatedFrom"]; TKUnit.arrayAssert(eventSequence, expectedEventSequence, "Actual event sequence is not equal to expected. Actual: " + eventSequence + "; Expected: " + expectedEventSequence); } export function test_NavigateTo_WithContext() { // >> article-pass-data let testPage: Page; const pageFactory = function (): Page { testPage = new Page(); testPage.on(Page.navigatedToEvent, function () { //console.log(JSON.stringify(context)); }); return testPage; }; const navEntry = { create: pageFactory, context: "myContext", animated: false }; const topFrame = topmost(); topFrame.navigate(navEntry); // << article-pass-data TKUnit.waitUntilReady(() => topFrame.navigationQueueIsEmpty()); const actualContextValue = testPage.navigationContext; TKUnit.assertEqual(actualContextValue, "myContext"); helper.goBack(); TKUnit.assertNull(testPage.navigationContext, "Navigation context should be cleared on navigating back"); } //https://github.com/NativeScript/NativeScript/issues/731 export function test_NavigateTo_WithBindingContext() { let testPage: Page; let bindingContext; const pageFactory = function (): Page { testPage = new Page(); testPage.on(Page.navigatingToEvent, function (args: NavigatedData) { bindingContext = (args.object).bindingContext; }); return testPage; }; const navEntry = { create: pageFactory, bindingContext: "bindng context", animated: false }; const topFrame = topmost(); topFrame.navigate(navEntry); TKUnit.waitUntilReady(() => topFrame.navigationQueueIsEmpty()); helper.goBack(); TKUnit.assertEqual(bindingContext, navEntry.bindingContext, "The Page's bindingContext should be equal to the NavigationEntry.bindingContext property when navigating to."); } export function test_FrameBackStack_WhenNavigatingForwardAndBack() { helper.navigate(() => new Page()); let testPage: Page; const pageFactory = function () { testPage = new Page(); testPage.id = "testPage_test_FrameBackStack_WhenNavigatingForwardAndBack"; addLabelToPage(testPage); return testPage; }; helper.navigateWithHistory(pageFactory); const topFrame = topmost(); TKUnit.assertEqual(topFrame.backStack.length, 1); TKUnit.assertTrue(topFrame.canGoBack(), "topFrame.canGoBack() should be true"); helper.goBack(); TKUnit.assertEqual(topFrame.backStack.length, 0); TKUnit.assertFalse(topFrame.canGoBack(), "topFrame.canGoBack() should be false"); } export function test_LoadPageFromModule() { const topFrame = topmost(); helper.navigateToModule("ui/page/test-page-module"); TKUnit.assert(topFrame.currentPage.content instanceof Label, "Content of the test page should be a Label created within test-page-module."); const testLabel =