//
// # Page
// Using a page requires the Page module.
// ``` JavaScript
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");
// ```
// ### Attaching event handler for the Page loaded event to set bindingContext.
//``` XML
//
// {%raw%}{%endraw%}
//
//```
//``` JavaScript
// function pageLoaded(args) {
// var page = args.object;
// page.bindingContext = { name : "Some name" };
// }
// exports.pageLoaded = pageLoaded;
//```
//
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";
export function addLabelToPage(page: Page, text?: string) {
var 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() {
var page: Page;
var label: Label;
var nativeInstanceCreated = false;
var handler = function (data) {
if (label.ios || label.android) {
nativeInstanceCreated = true;
}
}
var pageFactory = function (): Page {
page = new Page();
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() {
var page1: Page;
var page2: Page;
var loaded = 0;
var handler = function (data) {
loaded++;
}
var pageFactory = function (): Page {
page1 = new Page();
addLabelToPage(page1, "Page 1");
return page1;
};
helper.navigate(pageFactory);
TKUnit.assertEqual(loaded, 0);
var pageFactory2 = function (): Page {
page2 = new Page();
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() {
var currentPage;
var topFrame = frameModule.topmost();
currentPage = topFrame.currentPage;
//
// ### Creating and navigating to the created page.
// ``` JavaScript
var testPage: Page;
var 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;
};
var navEntry = {
create: pageFactory,
animated: false
};
topFrame.navigate(navEntry);
// ```
//
TKUnit.waitUntilReady(() => { return testPage.isLayoutValid });
//
// ### Navigating backward is as simple as calling a single method.
// ``` JavaScript
topFrame.goBack();
// ```
//
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) {
var testPage: Page;
var context = { property: "this is the context" };
var eventSequence = [];
var pageFactory = function () {
testPage = new Page();
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 currentPage = frameModule.topmost().currentPage;
if (withTransition) {
var navigationTransition: frameModule.NavigationTransition = {
name: "slide",
duration: 100,
};
var navigationEntry: frameModule.NavigationEntry = {
create: pageFactory,
context: context,
animated: true,
transition: navigationTransition
}
frameModule.topmost().navigate(navigationEntry);
}
else {
var navigationEntry: frameModule.NavigationEntry = {
create: pageFactory,
context: context,
}
frameModule.topmost().navigate(navigationEntry);
}
TKUnit.waitUntilReady(() => frameModule.topmost().currentPage !== null && frameModule.topmost().currentPage === testPage);
frameModule.goBack();
TKUnit.waitUntilReady(() => frameModule.topmost().currentPage !== null && frameModule.topmost().currentPage === currentPage);
var 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;
//
// ### Pass data to the new page.
// ``` JavaScript
var testPage: pageModule.Page;
var pageFactory = function (): pageModule.Page {
testPage = new pageModule.Page();
testPage.on(pageModule.Page.navigatedToEvent, function () {
////console.log(JSON.stringify(context));
});
return testPage;
};
var navEntry = {
create: pageFactory,
context: "myContext",
animated: false
};
let topFrame = frameModule.topmost();
topFrame.navigate(navEntry);
// ```
//
TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage !== currentPage && testPage.isLayoutValid);
var actualContextValue = testPage.navigationContext;
TKUnit.assertEqual(actualContextValue, "myContext");
topFrame.goBack();
TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage === currentPage);
TKUnit.assertNull(testPage.navigationContext, "Navigation context should be cleared on navigating back");
}
export function test_FrameBackStack_WhenNavigatingForwardAndBack() {
var testPage: Page;
var pageFactory = function () {
testPage = new Page();
addLabelToPage(testPage);
return testPage;
};
let topFrame = frameModule.topmost();
let currentPage = topFrame.currentPage;
topFrame.navigate(pageFactory);
TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage === testPage);
TKUnit.assertEqual(topFrame.backStack.length, 1);
TKUnit.assertTrue(topFrame.canGoBack(), "We should can go back.");
topFrame.goBack();
TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage === currentPage);
TKUnit.assertEqual(topFrame.backStack.length, 0);
TKUnit.assertFalse(topFrame.canGoBack(), "canGoBack should return 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 =