// >> article-require-page-module import pageModule = require("ui/page"); // FrameModule is needed in order to have an option to navigate to the new page. import frameModule = require("ui/frame"); // << article-require-page-module // >> article-set-bindingcontext function pageLoaded(args) { let page = args.object; page.bindingContext = { name : "Some name" }; } exports.pageLoaded = pageLoaded; // << article-set-bindingcontext import TKUnit = require("../../TKUnit"); import labelModule = require("ui/label"); import {StackLayout} from "ui/layouts/stack-layout"; import helper = require("../helper"); import view = require("ui/core/view"); import observable = require("data/observable"); import {Page, ShownModallyData, NavigatedData} from "ui/page"; import {Label} from "ui/label"; import {EventData} from "data/observable"; import platform = require("platform"); export function addLabelToPage(page: Page, text?: string) { let label = new Label(); label.text = text || "The quick brown fox jumps over the lazy dog."; page.content = label; } export function test_AfterPageLoaded_is_called_NativeInstance_is_created() { let page: Page; let label: Label; let nativeInstanceCreated = false; let handler = function (data) { if (label.ios || label.android) { nativeInstanceCreated = true; } } let pageFactory = function (): Page { page = new Page(); page.id = `page_test_AfterPageLoaded_is_called_NativeInstance_is_created`; page.on(view.View.loadedEvent, handler); label = new Label(); label.text = "Text"; page.content = label; return page; }; helper.navigate(pageFactory); TKUnit.assertTrue(nativeInstanceCreated, "nativeInstanceCreated"); page.off(view.View.loadedEvent, handler); } export function test_PageLoaded_is_called_once() { let page1: Page; let page2: Page; let loaded = 0; let handler = function (data) { loaded++; } let 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); let pageFactory2 = function (): Page { page2 = new Page(); page2.id = `page2_test_PageLoaded_is_called_once`; addLabelToPage(page2, "Page 2"); page2.on(view.View.loadedEvent, handler); return page2; }; helper.navigate(pageFactory2); TKUnit.assertEqual(loaded, 1); page2.off(view.View.loadedEvent, handler); } export function test_NavigateToNewPage() { // >> artivle-create-navigate-to-page let currentPage; let topFrame = frameModule.topmost(); currentPage = topFrame.currentPage; let testPage: Page; let pageFactory = function (): Page { testPage = new pageModule.Page(); let label = new labelModule.Label(); label.text = "The quick brown fox jumps over the lazy dog."; testPage.content = label; return testPage; }; let navEntry = { create: pageFactory, animated: false }; topFrame.navigate(navEntry); // << artivle-create-navigate-to-page TKUnit.waitUntilReady(() => { return testPage.isLayoutValid }); // >> article-navigating-backward topFrame.goBack(); // << article-navigating-backward TKUnit.waitUntilReady(() => { return topFrame.currentPage !== null && topFrame.currentPage === currentPage }); TKUnit.assert(testPage.parent === undefined, "Page.parent should become undefined after navigating back"); TKUnit.assert(testPage._context === undefined, "Page._context should become undefined after navigating back"); TKUnit.assert(testPage.isLoaded === false, "Page.isLoaded should become false after navigating back"); TKUnit.assert(testPage.frame === undefined, "Page.frame should become undefined after navigating back"); TKUnit.assert(testPage._isAddedToNativeVisualTree === false, "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) { let testPage: Page; let context = { property: "this is the context" }; let eventSequence = []; let pageFactory = function () { 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: observable.EventData) { eventSequence.push("loaded"); TKUnit.assertNotEqual(frameModule.topmost().currentPage, data.object); }); testPage.on(Page.navigatedToEvent, function (data: NavigatedData) { eventSequence.push("navigatedTo"); TKUnit.assertEqual(data.context, context, "navigatedTo : navigationContext"); TKUnit.assertEqual(frameModule.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; }; let navigationEntry: frameModule.NavigationEntry; if (withTransition) { navigationEntry = { create: pageFactory, context: context, animated: true, transition: { name: "slide", duration: 100, } } } else { navigationEntry = { create: pageFactory, context: context, animated: false } } helper.navigateWithEntry(navigationEntry); helper.goBack(); let 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() { let currentPage = frameModule.topmost().currentPage; // >> article-pass-data let testPage: pageModule.Page; let pageFactory = function (): pageModule.Page { testPage = new pageModule.Page(); testPage.on(pageModule.Page.navigatedToEvent, function () { //console.log(JSON.stringify(context)); }); return testPage; }; let navEntry = { create: pageFactory, context: "myContext", animated: false }; let topFrame = frameModule.topmost(); topFrame.navigate(navEntry); // << article-pass-data TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage !== currentPage && testPage.isLayoutValid); let actualContextValue = testPage.navigationContext; TKUnit.assertEqual(actualContextValue, "myContext"); helper.goBack(); TKUnit.assertNull(testPage.navigationContext, "Navigation context should be cleared on navigating back"); } export function test_FrameBackStack_WhenNavigatingForwardAndBack() { let testPage: Page; let pageFactory = function () { testPage = new Page(); testPage.id = "testPage_test_FrameBackStack_WhenNavigatingForwardAndBack"; addLabelToPage(testPage); return testPage; }; helper.navigateWithHistory(pageFactory); let topFrame = frameModule.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() { let topFrame = frameModule.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."); let testLabel =