From a66636fc6bd647e02aac9629a2ae7529a2c9e2f8 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Wed, 13 Apr 2016 10:28:28 +0300 Subject: [PATCH] Improve unit-tests (#1946) * Improved unit-tests speed & reliability * Fixed iOS tests. Improved message output --- apps/tests/TKUnit.ts | 2 +- apps/tests/frame-tests.ts | 7 - apps/tests/navigation/navigation-tests.ts | 4 + apps/tests/navigation/transition-tests.ts | 8 +- apps/tests/testRunner.ts | 7 +- apps/tests/ui-test.ts | 1 - .../ui/action-bar/action-bar-tests-common.ts | 51 +- .../ui/action-bar/action-bar-tests.android.ts | 35 +- .../ui/action-bar/action-bar-tests.ios.ts | 59 +- apps/tests/ui/animation/animation-tests.ts | 32 - .../tests/ui/animation/css-animation-tests.ts | 1 - apps/tests/ui/bindable-tests.ts | 174 ++--- apps/tests/ui/binding-expressions-tests.ts | 100 +-- apps/tests/ui/helper.ts | 327 ++++----- apps/tests/ui/html-view/html-view-tests.ts | 17 +- .../tests/ui/list-picker/list-picker-tests.ts | 29 +- apps/tests/ui/page/page-tests-common.ts | 334 ++++----- apps/tests/ui/page/page-tests.android.ts | 58 +- apps/tests/ui/page/page-tests.ios.ts | 75 +- .../tests/ui/scroll-view/scroll-view-tests.ts | 27 +- apps/tests/ui/style/style-properties-tests.ts | 1 - apps/tests/ui/style/style-tests.ts | 692 ++++++++---------- apps/tests/ui/style/value-source-tests.ts | 93 +-- .../ui/tab-view/tab-view-navigation-tests.ts | 34 +- apps/tests/ui/view/view-tests-common.ts | 41 +- apps/tests/ui/view/view-tests.android.ts | 79 +- apps/tests/ui/view/view-tests.ios.ts | 76 +- .../xml-declaration/xml-declaration-tests.ts | 311 +++----- ui/styling/style-scope.ts | 4 +- 29 files changed, 1083 insertions(+), 1596 deletions(-) diff --git a/apps/tests/TKUnit.ts b/apps/tests/TKUnit.ts index af2e7752e..4b134e044 100644 --- a/apps/tests/TKUnit.ts +++ b/apps/tests/TKUnit.ts @@ -193,7 +193,7 @@ export function assertNotEqual(actual: any, expected: any, message?: string) { if (types.isUndefined(actual) && types.isUndefined(expected)) { equals = true; } - else if (!types.isUndefined(actual) && !types.isUndefined(expected)) { + else if (!types.isNullOrUndefined(actual) && !types.isNullOrUndefined(expected)) { if (types.isFunction(actual.equals)) { // Use the equals method diff --git a/apps/tests/frame-tests.ts b/apps/tests/frame-tests.ts index cbefa8232..6cce6dfd3 100644 --- a/apps/tests/frame-tests.ts +++ b/apps/tests/frame-tests.ts @@ -9,8 +9,6 @@ var topmost = frameModule.topmost(); import labelModule = require("ui/label"); import pagesModule = require("ui/page"); -import TKUnit = require("./TKUnit"); - export var ignore_test_DummyTestForSnippetOnly0 = function () { // // ### Navigating to a Module @@ -57,9 +55,4 @@ export var ignore_test_DummyTestForSnippetOnly3 = function () { topmost.goBack(); // ``` // -} - -export function test_currentEntry() { - var moduleName = frameModule.topmost().currentEntry.moduleName; - TKUnit.assert(moduleName === "tests/app/mainPage" || moduleName === "app/mainPage", "Expected frameModule.topmost().currentEntry.moduleName to return tests/app/mainPage or app/mainPage but instead returned " + moduleName); } \ No newline at end of file diff --git a/apps/tests/navigation/navigation-tests.ts b/apps/tests/navigation/navigation-tests.ts index 6ad351ac2..659a3bce2 100644 --- a/apps/tests/navigation/navigation-tests.ts +++ b/apps/tests/navigation/navigation-tests.ts @@ -84,6 +84,10 @@ export var test_ClearHistory = function () { var currentPage: Page; + currentPage = topmostFrame().currentPage; + topmostFrame().navigate({ create: pageFactory, clearHistory: true }); + TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== currentPage; }); + currentPage = topmostFrame().currentPage; topmostFrame().navigate({ create: pageFactory }); TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== currentPage; }); diff --git a/apps/tests/navigation/transition-tests.ts b/apps/tests/navigation/transition-tests.ts index 2e01bce21..1911249ca 100644 --- a/apps/tests/navigation/transition-tests.ts +++ b/apps/tests/navigation/transition-tests.ts @@ -3,7 +3,6 @@ import * as helper from "../ui/helper"; import * as platform from "platform"; import * as trace from "trace"; import {Color} from "color"; -import {GC} from "utils/utils"; import {NavigationEntry, NavigationTransition} from "ui/frame"; import {Page} from "ui/page"; import {AnimationCurve} from "ui/enums" @@ -13,7 +12,7 @@ function _testTransition(navigationTransition: NavigationTransition) { trace.write(`Testing ${testId}`, trace.categories.Test); var navigationEntry: NavigationEntry = { create: function (): Page { - var page = new Page(); + let page = new Page(); page.id = testId; page.style.backgroundColor = new Color(255, Math.round(Math.random() * 255), Math.round(Math.random() * 255), Math.round(Math.random() * 255)); return page; @@ -24,9 +23,6 @@ function _testTransition(navigationTransition: NavigationTransition) { helper.navigateWithEntry(navigationEntry); TKUnit.wait(0.100); - helper.goBack(); - TKUnit.wait(0.100); - GC(); } // Extremely slow. Run only if needed. @@ -79,6 +75,4 @@ export var test_Transitions = function () { var customTransition = new customTransitionModule.CustomTransition(); _testTransition({ instance: customTransition }); } - - helper.goBack(); } diff --git a/apps/tests/testRunner.ts b/apps/tests/testRunner.ts index 64712dc63..ffdd3ef1a 100644 --- a/apps/tests/testRunner.ts +++ b/apps/tests/testRunner.ts @@ -110,6 +110,7 @@ var testsWithLongDelay = { testLoadInvalidUrl: 10000 } +var duration; var running = false; var testsQueue = new Array(); @@ -127,7 +128,7 @@ function printRunTestStats() { for (j = 0; j < allTests.length; j++) { let testName = allTests[j].testName; - let duration = allTests[j].duration / 1000; + let duration = Math.round(allTests[j].duration / 1000); if (!allTests[j].isPassed) { failedTestCount++; @@ -144,7 +145,7 @@ function printRunTestStats() { } - let finalMessage = "=== ALL TESTS COMPLETE === \n" + (allTests.length - failedTestCount) + " OK, " + failedTestCount + " failed" + "\n"; + let finalMessage = `=== ALL TESTS COMPLETE for ${Math.round(TKUnit.time() - duration)} ms === \n${(allTests.length - failedTestCount)} OK, ${failedTestCount} failed\n`; TKUnit.write(finalMessage, messageType.info); for (j = 0; j < failedTestInfo.length; j++) { let failureMessage = failedTestInfo[j]; @@ -210,7 +211,7 @@ export var runAll = function (testSelector?: string) { var totalSuccess = 0; var totalFailed: Array = []; - testsQueue.push(new TestInfo(function () { running = true; })); + testsQueue.push(new TestInfo(() => { running = true; duration = TKUnit.time(); })); for (var name in allTests) { if (singleModuleName && (singleModuleName !== name.toLowerCase())) { continue; diff --git a/apps/tests/ui-test.ts b/apps/tests/ui-test.ts index 04d8fe876..fa52f0a03 100644 --- a/apps/tests/ui-test.ts +++ b/apps/tests/ui-test.ts @@ -54,7 +54,6 @@ export class UITest implements trace.TraceWriter { this._testPage = null; this._testView = null; trace.removeWriter(this); - navHelper.goBack(); } public setUp() { diff --git a/apps/tests/ui/action-bar/action-bar-tests-common.ts b/apps/tests/ui/action-bar/action-bar-tests-common.ts index 5d61b3a5e..28b695332 100644 --- a/apps/tests/ui/action-bar/action-bar-tests-common.ts +++ b/apps/tests/ui/action-bar/action-bar-tests-common.ts @@ -179,12 +179,7 @@ export function test_actionItem_inherit_bindingContext() { helper.navigate(pageFactory); - try { - TKUnit.assertEqual(page.actionBar.actionItems.getItemAt(0).text, "item", "actionItem.text"); - } - finally { - helper.goBack(); - } + TKUnit.assertEqual(page.actionBar.actionItems.getItemAt(0).text, "item", "actionItem.text"); } export function test_actionBar_inherit_bindingContext_inXML() { @@ -325,12 +320,7 @@ export function test_ActionBarItemBindingToEvent() { } helper.navigate(function () { return p; }); - try { - testAction([p]); - } - finally { - helper.goBack(); - } + testAction([p]); } export function test_Setting_ActionItems_doesnt_thrown() { @@ -358,12 +348,7 @@ export function test_Setting_ActionItems_doesnt_thrown() { gotException = true; } - try { - TKUnit.assert(!gotException, "Expected: false, Actual: " + gotException); - } - finally { - helper.goBack(); - } + TKUnit.assert(!gotException, "Expected: false, Actual: " + gotException); } export function test_Setting_ActionItemsWithNumberAsText_doesnt_thrown() { @@ -379,12 +364,7 @@ export function test_Setting_ActionItemsWithNumberAsText_doesnt_thrown() { gotException = true; } - try { - TKUnit.assert(!gotException, "Expected: false, Actual: " + gotException); - } - finally { - helper.goBack(); - } + TKUnit.assert(!gotException, "Expected: false, Actual: " + gotException); } export function test_CanDefineEverythingAsContentBetweenTheTwoTags() { @@ -432,13 +412,8 @@ export function test_LoadedEventsOrder() { helper.navigate(pageFactory); - try { - TKUnit.arrayAssert(loadedEvents, new Array("content", "action-bar", "page")); - } - finally { - helper.goBack(); - } -}; + TKUnit.arrayAssert(loadedEvents, new Array("content", "action-bar", "page")); +} export function test_LoadedEventsOrder_WithoutPageContent() { var loadedEvents = new Array(); @@ -457,13 +432,8 @@ export function test_LoadedEventsOrder_WithoutPageContent() { helper.navigate(pageFactory); - try { - TKUnit.arrayAssert(loadedEvents, new Array("action-bar", "page")); - } - finally { - helper.goBack(); - } -}; + TKUnit.arrayAssert(loadedEvents, new Array("action-bar", "page")); +} export function test_setId() { var pageFactory = function (): PageModule.Page { @@ -479,10 +449,7 @@ export function test_setId() { catch (e) { TKUnit.assert(false, "Failed to apply property 'id' to actionBar before its nativeView is ready."); } - finally { - helper.goBack(); - } -}; +} export function createPageAndNavigate() { var page: PageModule.Page; diff --git a/apps/tests/ui/action-bar/action-bar-tests.android.ts b/apps/tests/ui/action-bar/action-bar-tests.android.ts index 19fbea9fd..d498a4127 100644 --- a/apps/tests/ui/action-bar/action-bar-tests.android.ts +++ b/apps/tests/ui/action-bar/action-bar-tests.android.ts @@ -1,5 +1,4 @@ import actionTestsCommon = require("./action-bar-tests-common"); -import helper = require("../helper"); import TKUnit = require("../../TKUnit"); import { ActionItem } from "ui/action-bar"; import { Visibility } from "ui/enums"; @@ -10,34 +9,24 @@ export function test_actionItem_visibility() { var actionItem = new ActionItem(); actionItem.text = "Test"; var page = actionTestsCommon.createPageAndNavigate(); - try { - page.actionBar.actionItems.addItem(actionItem); - var toolbar = (page.actionBar)._toolbar; - var menu = toolbar.getMenu(); + page.actionBar.actionItems.addItem(actionItem); + var toolbar = (page.actionBar)._toolbar; + var menu = toolbar.getMenu(); - TKUnit.assertTrue(menu.hasVisibleItems(), "Visibility does not work"); - actionItem.visibility = Visibility.collapse; - TKUnit.assertFalse(menu.hasVisibleItems(), "Visibility does not work"); - } - finally { - helper.goBack(); - } + TKUnit.assertTrue(menu.hasVisibleItems(), "Visibility does not work"); + actionItem.visibility = Visibility.collapse; + TKUnit.assertFalse(menu.hasVisibleItems(), "Visibility does not work"); } export function test_navigationButton_visibility() { var actionItem = new ActionItem(); actionItem.icon = "~/small-image.png"; var page = actionTestsCommon.createPageAndNavigate(); - try { - page.actionBar.navigationButton = actionItem; + page.actionBar.navigationButton = actionItem; - var toolbar = (page.actionBar)._toolbar; + var toolbar = (page.actionBar)._toolbar; - TKUnit.assertNotNull(toolbar.getNavigationIcon(), "Visibility does not work"); - actionItem.visibility = Visibility.collapse; - TKUnit.assertNull(toolbar.getNavigationIcon(), "Visibility does not work"); - } - finally { - helper.goBack(); - } -} + TKUnit.assertNotNull(toolbar.getNavigationIcon(), "Visibility does not work"); + actionItem.visibility = Visibility.collapse; + TKUnit.assertNull(toolbar.getNavigationIcon(), "Visibility does not work"); +} \ No newline at end of file diff --git a/apps/tests/ui/action-bar/action-bar-tests.ios.ts b/apps/tests/ui/action-bar/action-bar-tests.ios.ts index 20ca9f473..badc27c16 100644 --- a/apps/tests/ui/action-bar/action-bar-tests.ios.ts +++ b/apps/tests/ui/action-bar/action-bar-tests.ios.ts @@ -40,7 +40,6 @@ export function test_NavBar_isVisible_when_MenuItems_areSet() { } finally { page.off(view.View.loadedEvent, handler); - helper.goBack(); } } @@ -79,7 +78,6 @@ export function test_NavBarItemsAreClearedFromNativeWhenClearedFromNativeScript( } finally { page.off(view.View.loadedEvent, handler); - helper.goBack(); } } @@ -89,50 +87,41 @@ export function test_actionItem_visibility() { actionItem.ios.position = "left"; var page = actionTestsCommon.createPageAndNavigate(); - try { - page.actionBar.actionItems.addItem(actionItem); + page.actionBar.actionItems.addItem(actionItem); - var viewController = (page.ios); - var navigationItem: UINavigationItem = viewController.navigationItem; + var viewController = (page.ios); + var navigationItem: UINavigationItem = viewController.navigationItem; - var leftBarButtonItemsCount = navigationItem.leftBarButtonItems ? navigationItem.leftBarButtonItems.count : 0; - TKUnit.assertEqual(leftBarButtonItemsCount, 1, "Visibility does not work"); - actionItem.visibility = Visibility.collapse; - - TKUnit.waitUntilReady(() => { - leftBarButtonItemsCount = navigationItem.leftBarButtonItems ? navigationItem.leftBarButtonItems.count : 0; - - return leftBarButtonItemsCount === 0; - }); + var leftBarButtonItemsCount = navigationItem.leftBarButtonItems ? navigationItem.leftBarButtonItems.count : 0; + TKUnit.assertEqual(leftBarButtonItemsCount, 1, "Visibility does not work"); + actionItem.visibility = Visibility.collapse; + TKUnit.waitUntilReady(() => { leftBarButtonItemsCount = navigationItem.leftBarButtonItems ? navigationItem.leftBarButtonItems.count : 0; - TKUnit.assertEqual(leftBarButtonItemsCount, 0, "Visibility does not work"); - } - finally { - helper.goBack(); - } + + return leftBarButtonItemsCount === 0; + }); + + leftBarButtonItemsCount = navigationItem.leftBarButtonItems ? navigationItem.leftBarButtonItems.count : 0; + TKUnit.assertEqual(leftBarButtonItemsCount, 0, "Visibility does not work"); } export function test_navigationButton_visibility() { var actionItem = new actionBar.ActionItem(); actionItem.text = "Test"; var page = actionTestsCommon.createPageAndNavigate(); - try { - page.actionBar.navigationButton = actionItem; - var viewController = (page.ios); - var navigationItem: UINavigationItem = viewController.navigationItem; + page.actionBar.navigationButton = actionItem; - TKUnit.assertFalse(navigationItem.hidesBackButton, "Visibility does not work"); - actionItem.visibility = Visibility.collapse; + var viewController = (page.ios); + var navigationItem: UINavigationItem = viewController.navigationItem; - TKUnit.waitUntilReady(() => { - return navigationItem.hidesBackButton; - }); + TKUnit.assertFalse(navigationItem.hidesBackButton, "Visibility does not work"); + actionItem.visibility = Visibility.collapse; - TKUnit.assertTrue(navigationItem.hidesBackButton, "Visibility does not work"); - } - finally { - helper.goBack(); - } -} + TKUnit.waitUntilReady(() => { + return navigationItem.hidesBackButton; + }); + + TKUnit.assertTrue(navigationItem.hidesBackButton, "Visibility does not work"); +} \ No newline at end of file diff --git a/apps/tests/ui/animation/animation-tests.ts b/apps/tests/ui/animation/animation-tests.ts index a27a35c2c..47e5df0e4 100644 --- a/apps/tests/ui/animation/animation-tests.ts +++ b/apps/tests/ui/animation/animation-tests.ts @@ -49,14 +49,12 @@ export var test_AnimatingProperties = function(done) { ////console.log("Animation finished."); // assertIOSNativeTransformIsCorrect(label); - helper.goBack(); done(); // }) .catch((e) => { console.log(e.message); // - helper.goBack(); done(e); // }); @@ -94,7 +92,6 @@ export var test_CancellingAnimation = function(done) { .catch((e) => { ////console.log("Animation cancelled"); // - helper.goBack(); if (!e) { done(new Error("Cancel path did not have proper error")); } else if (e.toString() === "Error: Animation cancelled.") { @@ -138,7 +135,6 @@ export var test_CancellingAnimate = function(done) { .catch((e) => { ////console.log("Animation cancelled"); // - helper.goBack(); if (!e) { done(new Error("Cancel path did not have proper error")); } else if (e.toString() === "Error: Animation cancelled.") { @@ -183,14 +179,12 @@ export var test_ChainingAnimations = function(done) { ////console.log("Animation finished"); // assertIOSNativeTransformIsCorrect(label); - helper.goBack(); done(); // }) .catch((e) => { console.log(e.message); // - helper.goBack(); done(e); // }); @@ -230,14 +224,12 @@ export var test_ReusingAnimations = function(done) { ////console.log("Animation finished"); // assertIOSNativeTransformIsCorrect(label); - helper.goBack(); done(); // }) .catch((e) => { console.log(e.message); // - helper.goBack(); done(e); // }); @@ -284,14 +276,12 @@ export var test_AnimatingMultipleViews = function(done) { assertIOSNativeTransformIsCorrect(label1); assertIOSNativeTransformIsCorrect(label2); assertIOSNativeTransformIsCorrect(label3); - helper.goBack(); done(); // }) .catch((e) => { console.log(e.message); // - helper.goBack(); done(e); // }); @@ -318,11 +308,9 @@ export var test_AnimateOpacity = function(done) { label.animate({ opacity: 0.75 }) .then(() => { TKUnit.assertEqual(label.opacity, 0.75, "label.opacity"); - helper.goBack(); done(); }) .catch((e) => { - helper.goBack(); done(e); }); } @@ -419,11 +407,9 @@ export var test_AnimateBackgroundColor = function(done) { label.animate({ backgroundColor: red }) .then(() => { TKUnit.assert(label.backgroundColor.equals(red)); - helper.goBack(); done(); }) .catch((e) => { - helper.goBack(); done(e); }); } @@ -450,11 +436,9 @@ export var test_AnimateBackgroundColor_FromString = function(done) { label.animate({ backgroundColor: expected }) .then(() => { TKUnit.assert(label.backgroundColor.equals(clr)); - helper.goBack(); done(); }) .catch((e) => { - helper.goBack(); done(e); }); } @@ -480,11 +464,9 @@ export var test_AnimateTranslate = function(done) { TKUnit.assertEqual(label.translateX, 100, "label.translateX"); TKUnit.assertEqual(label.translateY, 200, "label.translateY"); assertIOSNativeTransformIsCorrect(label); - helper.goBack(); done(); }) .catch((e) => { - helper.goBack(); done(e); }); } @@ -510,11 +492,9 @@ export var test_AnimateScale = function(done) { TKUnit.assertEqual(label.scaleX, 2, "label.scaleX"); TKUnit.assertEqual(label.scaleY, 3, "label.scaleY"); assertIOSNativeTransformIsCorrect(label); - helper.goBack(); done(); }) .catch((e) => { - helper.goBack(); done(e); }); } @@ -539,11 +519,9 @@ export var test_AnimateRotate = function(done) { .then(() => { TKUnit.assertEqual(label.rotate, 123, "label.rotate"); assertIOSNativeTransformIsCorrect(label); - helper.goBack(); done(); }) .catch((e) => { - helper.goBack(); done(e); }); } @@ -576,11 +554,9 @@ export var test_AnimateTranslateScaleAndRotateSimultaneously = function(done) { TKUnit.assertEqual(label.scaleY, 3, "label.scaleY"); TKUnit.assertEqual(label.rotate, 123, "label.rotate"); assertIOSNativeTransformIsCorrect(label); - helper.goBack(); done(); }) .catch((e) => { - helper.goBack(); done(e); }); } @@ -623,11 +599,9 @@ export var test_AnimateTranslateScaleAndRotateSequentially = function(done) { TKUnit.assertEqual(label.scaleY, 3, "label.scaleY"); TKUnit.assertEqual(label.rotate, 123, "label.rotate"); assertIOSNativeTransformIsCorrect(label); - helper.goBack(); done(); }) .catch((e) => { - helper.goBack(); done(e); }); } @@ -658,12 +632,10 @@ export var test_AnimationsAreAlwaysPlayed = function(done) { }) .then(() => { TKUnit.assert(label.opacity === 1, `Label opacity should be 1 after second animation, actual value is ${label.opacity}.`); - helper.goBack(); done(); }) .catch((e) => { console.log(e.message); - helper.goBack(); done(e); }); } @@ -689,11 +661,9 @@ export var test_PlayPromiseIsResolvedWhenAnimationFinishes = function(done) { animation.play() .then(function onResolved() { TKUnit.assert(animation.isPlaying === false, "Animation.isPlaying should be false when animation play promise is resolved."); - helper.goBack(); done(); }, function onRejected(e) { TKUnit.assert(1 === 2, "Animation play promise should be resolved, not rejected."); - helper.goBack(); done(e); }); } @@ -719,11 +689,9 @@ export var test_PlayPromiseIsRejectedWhenAnimationIsCancelled = function(done) { animation.play() .then(function onResolved() { TKUnit.assert(1 === 2, "Animation play promise should be rejected, not resolved."); - helper.goBack(); done(); }, function onRejected(e) { TKUnit.assert(animation.isPlaying === false, "Animation.isPlaying should be false when animation play promise is rejected."); - helper.goBack(); done(); }); diff --git a/apps/tests/ui/animation/css-animation-tests.ts b/apps/tests/ui/animation/css-animation-tests.ts index 2b13ac871..6aff374b5 100644 --- a/apps/tests/ui/animation/css-animation-tests.ts +++ b/apps/tests/ui/animation/css-animation-tests.ts @@ -247,7 +247,6 @@ exports.test_ExecuteCSSAnimation = function () { label.className = "l"; TKUnit.waitUntilReady(function () { return new color.Color("green").equals(label.backgroundColor); }, 1); TKUnit.assert(new color.Color("green").equals(label.backgroundColor)); - helper.goBack(); }; // exports.test_ExecuteFillMode = function () { // let mainPage; diff --git a/apps/tests/ui/bindable-tests.ts b/apps/tests/ui/bindable-tests.ts index f41e1c91e..3af9b5712 100644 --- a/apps/tests/ui/bindable-tests.ts +++ b/apps/tests/ui/bindable-tests.ts @@ -185,57 +185,52 @@ export var test_bindingContext_Change_IsReflected_Properly = function () { helper.do_PageTest_WithButton(test); } -export var test_WhenBindingIsSetToAnElement_AndElementIsRemoved_ShouldBeCollectedByGC = function (done) { - var testFinished = false; - var pageFactory = function () { - var page = new pageModule.Page(); - var stack = new stackLayoutModule.StackLayout(); +export function test_WhenBindingIsSetToAnElement_AndElementIsRemoved_ShouldBeCollectedByGC(done) { + let testFinished = false; - var expectedValue = "testValue"; - var sourcePropertyName = "testProperty"; - var targetPropertyName = "text"; + let page = helper.getCurrentPage(); + let stack = new stackLayoutModule.StackLayout(); - page.on(viewModule.View.loadedEvent, () => { - var model = new observable.Observable(); - model.set(sourcePropertyName, expectedValue); + let expectedValue = "testValue"; + let sourcePropertyName = "testProperty"; + let targetPropertyName = "text"; - function createButton(bindContext) { - var button = new buttonModule.Button(); - button.bind({ - sourceProperty: sourcePropertyName, - targetProperty: targetPropertyName - }, bindContext); - return new WeakRef(button); - } + stack.on(viewModule.View.loadedEvent, () => { + var model = new observable.Observable(); + model.set(sourcePropertyName, expectedValue); - var weakRef = createButton(model); + function createButton(bindContext) { + let button = new buttonModule.Button(); + button.bind({ + sourceProperty: sourcePropertyName, + targetProperty: targetPropertyName + }, bindContext); + return new WeakRef(button); + } - try { - stack.addChild(weakRef.get()); - TKUnit.assert(weakRef.get().text === expectedValue, "Binding is not working properly!"); - stack.removeChild(weakRef.get()); - TKUnit.waitUntilReady(() => { return !weakRef.get().isLoaded }); - utils.GC(); - TKUnit.assert(!weakRef.get(), "UIElement is still alive!"); - testFinished = true; - } - catch (e) { - done(e); - } - }); + var weakRef = createButton(model); - page.content = stack; - return page; - }; + try { + stack.addChild(weakRef.get()); + TKUnit.assertEqual(weakRef.get().text, expectedValue, "Binding is not working properly!"); + stack.removeChild(weakRef.get()); + TKUnit.waitUntilReady(() => { return !weakRef.get().isLoaded }); + utils.GC(); + TKUnit.assert(!weakRef.get(), "UIElement is still alive!"); + testFinished = true; + } + catch (e) { + done(e); + } + }); + + page.content = stack; - helper.navigate(pageFactory); - TKUnit.waitUntilReady(() => { return testFinished }); - helper.goBack(); done(null); } -export var test_OneBindableToBindMoreThanOneProperty_ToSameSource = function () { +export function test_OneBindableToBindMoreThanOneProperty_ToSameSource() { var model = new observable.Observable(); var firstPropertyOptions: bindable.BindingOptions = { @@ -255,8 +250,8 @@ export var test_OneBindableToBindMoreThanOneProperty_ToSameSource = function () model.set("name", "John"); model.set("sourceProperty", "testValue"); - TKUnit.assert(obj.get("test") === "John", "Binding does not updates target property."); - TKUnit.assert(obj.get("targetProperty") === "testValue", "Binding does not updates target property1."); + TKUnit.assertEqual(obj.get("test"), "John", "Binding does not updates target property."); + TKUnit.assertEqual(obj.get("targetProperty"), "testValue", "Binding does not updates target property1."); } export var test_MoreThanOneBindables_BindToASameSourceAndProperty = function () { @@ -275,8 +270,8 @@ export var test_MoreThanOneBindables_BindToASameSourceAndProperty = function () model.set("sourceProperty", "testValue"); - TKUnit.assert(obj1.get("targetProperty") === "testValue", "Binding does not updates target property for first object."); - TKUnit.assert(obj2.get("targetProperty") === "testValue", "Binding does not updates target property for second object."); + TKUnit.assertEqual(obj1.get("targetProperty"), "testValue", "Binding does not updates target property for first object."); + TKUnit.assertEqual(obj2.get("targetProperty"), "testValue", "Binding does not updates target property for second object."); } class TestClass extends bindable.Bindable { @@ -887,51 +882,42 @@ export function test_NestedPropertiesBindingTwoTargetsAndReplacingSomeNestedObje } export function test_NullSourcePropertyShouldNotCrash() { - var expectedValue = "Expected Value"; - var target = new bindable.Bindable(); - var convFunc = function (value) { - return value + "Converted"; - } - var model = new observable.Observable(); - model.set("field", expectedValue); - model.set("convFunc", convFunc); - target.bind({ - sourceProperty: null, - targetProperty: "targetProp", - expression: "convFunc(field)" - }, model); + var expectedValue = "Expected Value"; + var target = new bindable.Bindable(); + var convFunc = function (value) { + return value + "Converted"; + } + var model = new observable.Observable(); + model.set("field", expectedValue); + model.set("convFunc", convFunc); + target.bind({ + sourceProperty: null, + targetProperty: "targetProp", + expression: "convFunc(field)" + }, model); - TKUnit.assertEqual(target.get("targetProp"), convFunc(expectedValue)); + TKUnit.assertEqual(target.get("targetProp"), convFunc(expectedValue)); } -export var test_BindingContextOfAChildElementIsNotOverwrittenBySettingTheBindingContextOfPage = function (done) { +export function test_BindingContextOfAChildElementIsNotOverwrittenBySettingTheBindingContextOfPage() { var testFinished = false; - var pageFactory = function () { - var page = new pageModule.Page(); - var child = new stackLayoutModule.StackLayout(); - page.content = child; - var childModel; - page.on(pageModule.Page.navigatingToEvent, (args) => { - childModel = new observable.Observable(); - child.bindingContext = childModel; - TKUnit.assertEqual(child.bindingContext, childModel); - page.off(pageModule.Page.navigatingToEvent); - }); - page.on(pageModule.Page.loadedEvent, (args) => { - TKUnit.assertEqual(child.bindingContext, childModel); - (args.object).bindingContext = new observable.Observable(); - TKUnit.assertEqual(child.bindingContext, childModel); - page.off(pageModule.Page.loadedEvent); - testFinished = true; - }); - return page; - }; + let page = helper.getCurrentPage(); + let child = new stackLayoutModule.StackLayout(); + let childModel = new observable.Observable(); + child.bindingContext = childModel; + TKUnit.assertEqual(child.bindingContext, childModel); - helper.navigate(pageFactory); + child.on(stackLayoutModule.StackLayout.loadedEvent, (args) => { + TKUnit.assertEqual(child.bindingContext, childModel); + page.bindingContext = new observable.Observable(); + TKUnit.assertEqual(child.bindingContext, childModel); + child.off(stackLayoutModule.StackLayout.loadedEvent); + testFinished = true; + }); + + page.content = child; TKUnit.waitUntilReady(() => { return testFinished }); - helper.goBack(); - done(null); } export var test_BindingHitsGetterTooManyTimes = function () { @@ -970,21 +956,21 @@ export function test_SupportFunctionsInExpressions() { return this.get("anyColor") === "red"; } }); - + var bindableObj = new bindable.Bindable(); - + bindableObj.bind({ "sourceProperty": "$value", "targetProperty": "test", "expression": "isVisible() ? 'visible' : 'collapsed'" }, model); - + model.set("anyColor", "blue"); - + TKUnit.assertEqual(bindableObj.get("test"), "collapsed", "When anyColor is blue test property should be collapsed."); - + model.set("anyColor", "red"); - + TKUnit.assertEqual(bindableObj.get("test"), "visible", "When anyColor is red test property should be visible."); } @@ -995,20 +981,20 @@ export function test_$ValueSupportWithinExpression() { return this.get("anyColor") === "red"; } }); - + var bindableObj = new bindable.Bindable(); - + bindableObj.bind({ "sourceProperty": "$value", "targetProperty": "test", "expression": "$value.anyColor === 'red' ? 'red' : 'blue'" }, model); - + model.set("anyColor", "blue"); - + TKUnit.assertEqual(bindableObj.get("test"), "blue", "When anyColor is blue test property should be blue too."); - + model.set("anyColor", "red"); - + TKUnit.assertEqual(bindableObj.get("test"), "red", "When anyColor is red test property should be red too."); } \ No newline at end of file diff --git a/apps/tests/ui/binding-expressions-tests.ts b/apps/tests/ui/binding-expressions-tests.ts index 62f30d037..4e8bd96e9 100644 --- a/apps/tests/ui/binding-expressions-tests.ts +++ b/apps/tests/ui/binding-expressions-tests.ts @@ -5,100 +5,68 @@ import helper = require("../ui/helper"); export var test_BindingExpressions_ArrayAccess = function () { navigateToPage("bindingExpressions_arrayAccess_testPage"); - try { - assertElementString("textField1", "bindings"); - assertElementString("textField2", "1"); - } finally { - helper.goBack(); - } + assertElementString("textField1", "bindings"); + assertElementString("textField2", "1"); } export var test_BindingExpressions_LogicalOperators = function () { navigateToPage("bindingExpressions_logicalOperators_testPage"); - try { - assertElementString("textField1", "true"); - assertElementString("textField2", "false"); - assertElementString("textField3", "true"); - } finally { - helper.goBack(); - } + assertElementString("textField1", "true"); + assertElementString("textField2", "false"); + assertElementString("textField3", "true"); } export var test_BindingExpressions_UnaryOperators = function () { navigateToPage("bindingExpressions_unaryOperators_testPage"); - try { - assertElementString("textField1", "5"); - assertElementString("textField2", "-5"); - assertElementString("textField3", "3"); - assertElementString("textField4", "-3"); - assertElementString("textField5", "1"); - assertElementString("textField6", "-1"); - assertElementValueIsNaN("textField7"); - assertElementValueIsNaN("textField8"); - } finally { - helper.goBack(); - } + assertElementString("textField1", "5"); + assertElementString("textField2", "-5"); + assertElementString("textField3", "3"); + assertElementString("textField4", "-3"); + assertElementString("textField5", "1"); + assertElementString("textField6", "-1"); + assertElementValueIsNaN("textField7"); + assertElementValueIsNaN("textField8"); } export var test_BindingExpressions_BinaryOperators = function () { navigateToPage("bindingExpressions_binaryOperators_testPage"); - try { - assertElementString("textField1", "1"); - assertElementString("textField2", "-1"); - assertElementString("textField3", "0"); - assertElementString("textField4", "0"); - assertElementString("textField5", "Infinity"); - assertElementString("textField6", "0"); - assertElementValueIsNaN("textField7"); - } finally { - helper.goBack(); - } + assertElementString("textField1", "1"); + assertElementString("textField2", "-1"); + assertElementString("textField3", "0"); + assertElementString("textField4", "0"); + assertElementString("textField5", "Infinity"); + assertElementString("textField6", "0"); + assertElementValueIsNaN("textField7"); } export var test_BindingExpressions_ComparisonOperators = function () { navigateToPage("bindingExpressions_comparisonOperators_testPage"); - try { - assertElementString("textField1", "true"); - //assertElementString("textField2", "false"); - assertElementString("textField3", "true"); - //assertElementString("textField4", "false"); - assertElementString("textField5", "false"); - assertElementString("textField6", "true"); - assertElementString("textField7", "false"); - assertElementString("textField8", "true"); - } finally { - helper.goBack(); - } + assertElementString("textField1", "true"); + //assertElementString("textField2", "false"); + assertElementString("textField3", "true"); + //assertElementString("textField4", "false"); + assertElementString("textField5", "false"); + assertElementString("textField6", "true"); + assertElementString("textField7", "false"); + assertElementString("textField8", "true"); } export var test_BindingExpressions_LogicalComparisonOperators = function () { navigateToPage("bindingExpressions_logicalComparisonOperators_testPage"); - try { - assertElementString("textField1", "false"); - assertElementString("textField2", "true"); - assertElementString("textField3", "Text"); - } finally { - helper.goBack(); - } + assertElementString("textField1", "false"); + assertElementString("textField2", "true"); + assertElementString("textField3", "Text"); } export var test_BindingExpressions_TernaryOperator = function () { navigateToPage("bindingExpressions_ternaryOperator_testPage"); - try { - assertElementString("textField1", "by Pratchett"); - } finally { - helper.goBack(); - } + assertElementString("textField1", "by Pratchett"); } export var test_BindingExpressions_GroupingParenthesis = function () { navigateToPage("bindingExpressions_groupingParenthesis_testPage"); - try { - assertElementString("textField1", "21"); - assertElementString("textField2", "8"); - } finally { - helper.goBack(); - } + assertElementString("textField1", "21"); + assertElementString("textField2", "8"); } export var assertElementString = function (elementId: string, value: any) { diff --git a/apps/tests/ui/helper.ts b/apps/tests/ui/helper.ts index e2f471ea2..8e1fdbb7a 100644 --- a/apps/tests/ui/helper.ts +++ b/apps/tests/ui/helper.ts @@ -14,99 +14,148 @@ var DELTA = 0.1; export var ASYNC = 0.2; export var MEMORY_ASYNC = 2; +function clearPage(): void { + let newPage = frame.topmost().currentPage; + if (!newPage) { + TKUnit.waitUntilReady(() => frame.topmost().currentPage !== null); + newPage = frame.topmost().currentPage; + } + + if (!newPage) { + throw new Error("NO CURRENT PAGE!!!!"); + } + + newPage.style._resetValue(styling.properties.backgroundColorProperty); + newPage.style._resetValue(styling.properties.colorProperty); + newPage._resetValue(button.Button.bindingContextProperty); + newPage._resetValue(button.Button.cssClassProperty); + newPage._resetValue(button.Button.idProperty); +} + export function do_PageTest(test: (views: Array) => void, content: view.View, secondView: view.View, thirdView: view.View) { - var newPage: page.Page; - var pageFactory = function (): page.Page { - newPage = new page.Page(); - newPage.content = content; - return newPage; - }; - - navigate(pageFactory); - - try { - test([newPage, content, secondView, thirdView, newPage.actionBar]); - } - finally { - goBack(); - } + clearPage(); + let newPage = frame.topmost().currentPage; + newPage.content = content; + test([newPage, content, secondView, thirdView, newPage.actionBar]); + newPage.content = null; } export function do_PageTest_WithButton(test: (views: Array) => void) { - var newPage: page.Page; - var btn: button.Button; - var pageFactory = function (): page.Page { - newPage = new page.Page(); - btn = new button.Button(); - newPage.content = btn; - return newPage; - }; - - navigate(pageFactory); - - try { - test([newPage, btn, newPage.actionBar]); - } - finally { - goBack(); - } + clearPage(); + let newPage = frame.topmost().currentPage; + let btn = new button.Button(); + newPage.content = btn; + test([newPage, btn, newPage.actionBar]); + newPage.content = null; } export function do_PageTest_WithStackLayout_AndButton(test: (views: Array) => void) { - var newPage: page.Page; - var stackLayout; - var btn; - var pageFactory = function (): page.Page { - newPage = new page.Page(); - stackLayout = new stackLayoutModule.StackLayout(); - btn = new button.Button(); - - stackLayout.addChild(btn); - newPage.content = stackLayout; - return newPage; - }; - - navigate(pageFactory); - - try { - test([newPage, stackLayout, btn, newPage.actionBar]); - } - finally { - goBack(); - } + clearPage(); + let newPage = frame.topmost().currentPage; + let stackLayout = new stackLayoutModule.StackLayout(); + let btn = new button.Button(); + stackLayout.addChild(btn); + newPage.content = stackLayout; + test([newPage, stackLayout, btn, newPage.actionBar]); + newPage.content = null; } -export function do_PageTest_WithStackLayout_AndButton_NavigatedBack(test: (views: Array) => void, - assert: (views: Array) => void) { - - var newPage: page.Page; - var stackLayout; - var btn; - var pageFactory = function (): page.Page { - newPage = new page.Page(); - stackLayout = new stackLayoutModule.StackLayout(); - btn = new button.Button(); - stackLayout.addChild(btn); - newPage.content = stackLayout; - return newPage; - }; - - navigate(pageFactory); - - try { - test([newPage, stackLayout, btn, newPage.actionBar]); - } - finally { - goBack(); +//export function buildUIAndRunTest(controlToTest, testFunction, pageCss?, testDelay?) { +export function buildUIAndRunTest(controlToTest, testFunction, pageCss?) { + clearPage(); + let newPage = frame.topmost().currentPage; + newPage.content = controlToTest; + if (pageCss) { + newPage.css = pageCss; } - try { - assert([newPage, stackLayout, btn, newPage.actionBar]); - } - finally { - // wait to ensure asynchronous navigation - TKUnit.wait(ASYNC); + testFunction([controlToTest, newPage]); + newPage.content = null; + newPage.css = null; +} + +export function buildUIWithWeakRefAndInteract(createFunc: () => T, interactWithViewFunc?: (view: T) => void, done?) { + clearPage(); + let newPage = frame.topmost().currentPage; + let sp = new stackLayoutModule.StackLayout(); + let testFinished = false; + + sp.on("loaded", () => { + let weakRef = new WeakRef(createFunc()); + try { + sp.addChild(weakRef.get()); + + if (interactWithViewFunc) { + interactWithViewFunc(weakRef.get()); + } + + sp.removeChild(weakRef.get()); + if (newPage.ios) { + /* tslint:disable:no-unused-expression */ + // Could cause GC on the next call. + // NOTE: Don't replace this with forceGC(); + new ArrayBuffer(4 * 1024 * 1024); + } + utils.GC(); + + TKUnit.waitUntilReady(() => { return weakRef.get() ? !(weakRef.get().isLoaded) : true; }, MEMORY_ASYNC); + TKUnit.assert(!weakRef.get(), weakRef.get() + " leaked!"); + testFinished = true; + } + catch (e) { + done(e); + } + }); + + newPage.content = sp; + + TKUnit.waitUntilReady(() => { return testFinished; }, MEMORY_ASYNC); + done(null); +} + +export function navigateToModuleAndRunTest(moduleName, context, testFunction) { + let page = navigateToModule(moduleName, context); + testFunction(page); +} + +export function navigate(pageFactory: () => page.Page, navigationContext?: any): page.Page { + let entry: frame.NavigationEntry = { create: pageFactory, animated: false, context: navigationContext, clearHistory: true }; + return navigateWithEntry(entry); +} + +export function navigateWithHistory(pageFactory: () => page.Page, navigationContext?: any): page.Page { + let entry: frame.NavigationEntry = { create: pageFactory, animated: false, context: navigationContext, clearHistory: false }; + return navigateWithEntry(entry); +} + +export function navigateToModule(moduleName: string, context?: any): page.Page { + let entry: frame.NavigationEntry = { moduleName: moduleName, context: context, animated: false, clearHistory: true }; + return navigateWithEntry(entry); +} + +export function navigateWithEntry(entry: frame.NavigationEntry): page.Page { + let page = frame.resolvePageFromEntry(entry); + entry.moduleName = null; + entry.animated = false + entry.create = function () { + return page; } + + let currentPage = getCurrentPage(); + frame.topmost().navigate(entry); + TKUnit.waitUntilReady(() => getCurrentPage() !== null && getCurrentPage() !== currentPage); + return page; +} + +export function getCurrentPage(): page.Page { + return frame.topmost().currentPage; +} + +export function assertAreClose(actual: number, expected: number, message: string): void { + var density = utils.layout.getDisplayDensity(); + var delta = Math.floor(density) !== density ? 1.1 : DELTA; + + TKUnit.assertAreClose(actual, expected, delta, message); } export function assertViewColor(testView: view.View, hexColor: string, valueSource?: number) { @@ -123,119 +172,6 @@ export function assertViewBackgroundColor(testView: view.View, hexColor: string) TKUnit.assertEqual(testView.style.backgroundColor.hex, hexColor, "backgroundColor property"); } -//export function buildUIAndRunTest(controlToTest, testFunction, pageCss?, testDelay?) { -export function buildUIAndRunTest(controlToTest, testFunction, pageCss?) { - var newPage: page.Page; - var pageFactory = function (): page.Page { - newPage = new page.Page(); - newPage.content = controlToTest; - if (pageCss) { - newPage.css = pageCss; - } - return newPage; - }; - - navigate(pageFactory); - TKUnit.assert(newPage.isLoaded, "The page should be loaded here."); - try { - testFunction([controlToTest, newPage]); - } - finally { - goBack(); - } -} - -export function navigateToModuleAndRunTest(moduleName, context, testFunction) { - navigateToModule(moduleName, context); - try { - testFunction(frame.topmost().currentPage); - } - finally { - goBack(); - } -} - -export function buildUIWithWeakRefAndInteract(createFunc: () => T, interactWithViewFunc?: (view: T) => void, done?) { - var newPage: page.Page; - var testFinished = false; - var pageFactory = function (): page.Page { - newPage = new page.Page(); - var sp = new stackLayoutModule.StackLayout(); - newPage.content = sp; - var loaded = false; - - newPage.on("loaded", () => { - loaded = true; - var weakRef = new WeakRef(createFunc()); - try { - sp.addChild(weakRef.get()); - - if (interactWithViewFunc) { - interactWithViewFunc(weakRef.get()); - } - - sp.removeChild(weakRef.get()); - if (newPage.ios) { - /* tslint:disable:no-unused-expression */ - // Could cause GC on the next call. - // NOTE: Don't replace this with forceGC(); - new ArrayBuffer(4 * 1024 * 1024); - } - utils.GC(); - - TKUnit.waitUntilReady(() => { return weakRef.get() ? !(weakRef.get().isLoaded) : true; }, MEMORY_ASYNC); - TKUnit.assert(!weakRef.get(), weakRef.get() + " leaked!"); - testFinished = true; - } - catch (e) { - done(e); - } - }); - - return newPage; - }; - - try { - navigate(pageFactory); - TKUnit.waitUntilReady(() => { return testFinished; }, MEMORY_ASYNC); - } - finally { - goBack(); - done(null); - } -} - -export function navigate(pageFactory: () => page.Page, navigationContext?: any) { - var currentPage = frame.topmost().currentPage; - frame.topmost().navigate({ create: pageFactory, animated: false, context: navigationContext }); - TKUnit.waitUntilReady(() => { return frame.topmost().currentPage !== currentPage && frame.topmost().currentPage.isLoaded && !currentPage.isLoaded; }); -} - -export function navigateToModule(moduleName: string, context?: any) { - var currentPage = frame.topmost().currentPage; - frame.topmost().navigate({ moduleName: moduleName, context: context, animated: false }); - TKUnit.waitUntilReady(() => { return frame.topmost().currentPage !== currentPage && frame.topmost().currentPage.isLoaded && !currentPage.isLoaded; }); -} - -export function navigateWithEntry(navigationEntry: frame.NavigationEntry) { - var currentPage = frame.topmost().currentPage; - frame.topmost().navigate(navigationEntry); - TKUnit.waitUntilReady(() => { return frame.topmost().currentPage !== currentPage && frame.topmost().currentPage.isLoaded && !currentPage.isLoaded; }); -} - -export function goBack(): void { - var currentPage = frame.topmost().currentPage; - frame.topmost().goBack(); - TKUnit.waitUntilReady(() => { return frame.topmost().currentPage !== currentPage && frame.topmost().currentPage.isLoaded && !currentPage.isLoaded; }); -} - -export function assertAreClose(actual: number, expected: number, message: string): void { - var density = utils.layout.getDisplayDensity(); - var delta = Math.floor(density) !== density ? 1.1 : DELTA; - - TKUnit.assertAreClose(actual, expected, delta, message); -} - export function forceGC() { if (platform.device.os === platform.platformNames.ios) { /* tslint:disable:no-unused-expression */ @@ -243,5 +179,6 @@ export function forceGC() { new ArrayBuffer(4 * 1024 * 1024); TKUnit.wait(ASYNC); } + utils.GC(); -} +} \ No newline at end of file diff --git a/apps/tests/ui/html-view/html-view-tests.ts b/apps/tests/ui/html-view/html-view-tests.ts index 141f1c3d8..a0fd6dfe7 100644 --- a/apps/tests/ui/html-view/html-view-tests.ts +++ b/apps/tests/ui/html-view/html-view-tests.ts @@ -1,6 +1,5 @@ import TKUnit = require("../../TKUnit"); import helper = require("../helper"); -import page = require("ui/page"); import types = require("utils/types"); // @@ -32,15 +31,9 @@ var _createHtmlViewFunc = function (): htmlViewModule.HtmlView { } export var testLoadHTMLString = function () { - var newPage: page.Page; - var htmlView = _createHtmlViewFunc(); - var pageFactory = function (): page.Page { - newPage = new page.Page(); - newPage.content = htmlView; - return newPage; - }; - - helper.navigate(pageFactory); + let page = helper.getCurrentPage(); + let htmlView = _createHtmlViewFunc(); + page.content = htmlView; // // ### Using HtmlView @@ -49,11 +42,9 @@ export var testLoadHTMLString = function () { // ``` // - helper.goBack(); - if (htmlView.ios) { TKUnit.assert(!types.isNullOrUndefined(htmlView.ios.attributedText), "HTML string not loaded properly. Actual: " + htmlView.ios.attributedText); } else if (htmlView.android) { TKUnit.assert(htmlView.android.getText(), "HTML string not loaded properly. Actual: " + htmlView.android.getText()); } -} +} \ No newline at end of file diff --git a/apps/tests/ui/list-picker/list-picker-tests.ts b/apps/tests/ui/list-picker/list-picker-tests.ts index e5f6e9914..4795ea7b3 100644 --- a/apps/tests/ui/list-picker/list-picker-tests.ts +++ b/apps/tests/ui/list-picker/list-picker-tests.ts @@ -2,7 +2,6 @@ import helper = require("../helper"); import viewModule = require("ui/core/view"); import listPickerTestsNative = require("./list-picker-tests-native"); -import pageModule = require("ui/page"); import application = require("application"); // @@ -174,29 +173,17 @@ export var testSettingSelectedIndexLargerThanCountShouldThrow = function () { } export var testWhenSelectingAnItemNativelySelectedIndexIsUpdatedProperly = function () { - var listPicker: listPickerModule.ListPicker; - var mainPage: pageModule.Page; - var pageFactory = function (): pageModule.Page { - listPicker = _createListPicker(); - listPicker.items = _createItems(2); - mainPage = new pageModule.Page(); - mainPage.content = listPicker; - return mainPage; - }; + let listPicker = _createListPicker(); + let mainPage = helper.getCurrentPage(); + listPicker.items = _createItems(2); + mainPage.content = listPicker; - helper.navigate(pageFactory); - - var expectedValue = 1; + let expectedValue = 1; listPickerTestsNative.selectNativeItem(listPicker, expectedValue); - TKUnit.wait(helper.ASYNC); + TKUnit.waitUntilReady(() => listPicker.selectedIndex === 1); - var actualValue = listPicker.selectedIndex; - try { - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); - } - finally { - helper.goBack(); - } + let actualValue = listPicker.selectedIndex; + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); } export var test_Android_MaxValueIsOneLessThanItemsCount = function () { diff --git a/apps/tests/ui/page/page-tests-common.ts b/apps/tests/ui/page/page-tests-common.ts index f7872467f..37405011f 100644 --- a/apps/tests/ui/page/page-tests-common.ts +++ b/apps/tests/ui/page/page-tests-common.ts @@ -2,9 +2,9 @@ // # Page // Using a page requires the Page module. // ``` JavaScript -import PageModule = require("ui/page"); +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"); +import frameModule = require("ui/frame"); // ``` // ### Attaching event handler for the Page loaded event to set bindingContext. @@ -23,25 +23,25 @@ import FrameModule = require("ui/frame"); // import TKUnit = require("../../TKUnit"); -import LabelModule = require("ui/label"); -import stackLayoutModule = require("ui/layouts/stack-layout"); +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} from "ui/page"; +import {Page, ShownModallyData, NavigatedData} from "ui/page"; import {Label} from "ui/label"; import {EventData} from "data/observable"; -export function addLabelToPage(page: PageModule.Page, text?: string) { - var label = new LabelModule.Label(); +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: PageModule.Page; - var label: LabelModule.Label; + var page: Page; + var label: Label; var nativeInstanceCreated = false; var handler = function (data) { @@ -50,11 +50,11 @@ export function test_AfterPageLoaded_is_called_NativeInstance_is_created() { } } - var pageFactory = function (): PageModule.Page { - page = new PageModule.Page(); + var pageFactory = function (): Page { + page = new Page(); page.on(view.View.loadedEvent, handler); - label = new LabelModule.Label(); + label = new Label(); label.text = "Text"; page.content = label; return page; @@ -62,32 +62,31 @@ export function test_AfterPageLoaded_is_called_NativeInstance_is_created() { helper.navigate(pageFactory); - TKUnit.assert(nativeInstanceCreated, "Expected: true, Actual: " + nativeInstanceCreated); + TKUnit.assertTrue(nativeInstanceCreated, "nativeInstanceCreated"); page.off(view.View.loadedEvent, handler); - helper.goBack(); } export function test_PageLoaded_is_called_once() { - var page1: PageModule.Page; - var page2: PageModule.Page; + var page1: Page; + var page2: Page; var loaded = 0; var handler = function (data) { loaded++; } - var pageFactory = function (): PageModule.Page { - page1 = new PageModule.Page(); + var pageFactory = function (): Page { + page1 = new Page(); addLabelToPage(page1, "Page 1"); return page1; }; helper.navigate(pageFactory); - TKUnit.assert(loaded === 0, "Expected: 0, Actual: " + loaded); + TKUnit.assertEqual(loaded, 0); - var pageFactory2 = function (): PageModule.Page { - page2 = new PageModule.Page(); + var pageFactory2 = function (): Page { + page2 = new Page(); addLabelToPage(page2, "Page 2"); page2.on(view.View.loadedEvent, handler); return page2; @@ -95,22 +94,22 @@ export function test_PageLoaded_is_called_once() { helper.navigate(pageFactory2); - TKUnit.assert(loaded === 1, "Expected: 1, Actual: " + loaded); + TKUnit.assertEqual(loaded, 1); page2.off(view.View.loadedEvent, handler); - helper.goBack(); - helper.goBack(); } export function test_NavigateToNewPage() { var currentPage; - currentPage = FrameModule.topmost().currentPage; + var topFrame = frameModule.topmost(); + currentPage = topFrame.currentPage; + // // ### Creating and navigating to the created page. // ``` JavaScript - var testPage: PageModule.Page; - var pageFactory = function (): PageModule.Page { - testPage = new PageModule.Page(); - var label = new LabelModule.Label(); + 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; @@ -119,13 +118,11 @@ export function test_NavigateToNewPage() { create: pageFactory, animated: false }; - var topFrame = FrameModule.topmost(); topFrame.navigate(navEntry); // ``` // - TKUnit.waitUntilReady(() => { return topFrame.currentPage !== currentPage }); - currentPage = topFrame.currentPage; + TKUnit.waitUntilReady(() => { return testPage.isLayoutValid }); // // ### Navigating backward is as simple as calling a single method. @@ -134,7 +131,7 @@ export function test_NavigateToNewPage() { // ``` // - TKUnit.waitUntilReady(() => { return topFrame.currentPage !== currentPage }); + 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"); @@ -151,79 +148,86 @@ export function test_PageNavigation_EventSequence_WithoutTransition() { } function _test_PageNavigation_EventSequence(withTransition: boolean) { - var testPage: PageModule.Page; + var testPage: Page; var context = { property: "this is the context" }; var eventSequence = []; var pageFactory = function () { - testPage = new PageModule.Page(); + testPage = new Page(); addLabelToPage(testPage); - testPage.on(PageModule.Page.navigatingToEvent, function (data: PageModule.NavigatedData) { + testPage.on(Page.navigatingToEvent, function (data: NavigatedData) { eventSequence.push("navigatingTo"); TKUnit.assertEqual(data.context, context, "navigatingTo: navigationContext"); }); - testPage.on(PageModule.Page.loadedEvent, function (data: observable.EventData) { + testPage.on(Page.loadedEvent, function (data: observable.EventData) { eventSequence.push("loaded"); - TKUnit.assertNotEqual(FrameModule.topmost().currentPage, data.object); + TKUnit.assertNotEqual(frameModule.topmost().currentPage, data.object); }); - testPage.on(PageModule.Page.navigatedToEvent, function (data: PageModule.NavigatedData) { + testPage.on(Page.navigatedToEvent, function (data: NavigatedData) { eventSequence.push("navigatedTo"); TKUnit.assertEqual(data.context, context, "navigatedTo : navigationContext"); - TKUnit.assertEqual(FrameModule.topmost().currentPage, data.object); + TKUnit.assertEqual(frameModule.topmost().currentPage, data.object); }); - testPage.on(PageModule.Page.navigatingFromEvent, function (data: PageModule.NavigatedData) { + testPage.on(Page.navigatingFromEvent, function (data: NavigatedData) { eventSequence.push("navigatingFrom"); TKUnit.assertEqual(data.context, context, "navigatingFrom: navigationContext"); }); - testPage.on(PageModule.Page.navigatedFromEvent, function (data: PageModule.NavigatedData) { + testPage.on(Page.navigatedFromEvent, function (data: NavigatedData) { eventSequence.push("navigatedFrom"); TKUnit.assertEqual(data.context, context, "navigatedFrom: navigationContext"); }); - testPage.on(PageModule.Page.unloadedEvent, function (data) { + testPage.on(Page.unloadedEvent, function (data) { eventSequence.push("unloaded"); }); return testPage; }; + let currentPage = frameModule.topmost().currentPage; if (withTransition) { - var navigationTransition: FrameModule.NavigationTransition = { + var navigationTransition: frameModule.NavigationTransition = { name: "slide", duration: 100, }; - var navigationEntry: FrameModule.NavigationEntry = { + var navigationEntry: frameModule.NavigationEntry = { create: pageFactory, context: context, animated: true, transition: navigationTransition } - helper.navigateWithEntry(navigationEntry); + frameModule.topmost().navigate(navigationEntry); } else { - helper.navigate(pageFactory, context); + var navigationEntry: frameModule.NavigationEntry = { + create: pageFactory, + context: context, + } + frameModule.topmost().navigate(navigationEntry); } - helper.goBack(); + 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() { - var currentPage; - currentPage = FrameModule.topmost().currentPage; + 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 () { + 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; @@ -233,149 +237,153 @@ export function test_NavigateTo_WithContext() { context: "myContext", animated: false }; - var topFrame = FrameModule.topmost(); + let topFrame = frameModule.topmost(); topFrame.navigate(navEntry); // ``` // - TKUnit.waitUntilReady(() => { return topFrame.currentPage !== currentPage }); + TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage !== currentPage && testPage.isLayoutValid); var actualContextValue = testPage.navigationContext; - TKUnit.assert(actualContextValue === "myContext", "Expected: myContext" + ", Actual: " + actualContextValue); - helper.goBack(); + TKUnit.assertEqual(actualContextValue, "myContext"); - TKUnit.assert(testPage.navigationContext === undefined, "Navigation context should be cleared on navigating back"); + 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 () { - var testPage = new PageModule.Page(); + testPage = new Page(); addLabelToPage(testPage); return testPage; }; - helper.navigate(pageFactory); + let topFrame = frameModule.topmost(); + let currentPage = topFrame.currentPage; - var topFrame = FrameModule.topmost(); - TKUnit.assert(topFrame.backStack.length === 1, "Expected: 1, Actual: " + topFrame.backStack.length); - TKUnit.assert(topFrame.canGoBack(), "We should can go back."); - helper.goBack(); + topFrame.navigate(pageFactory); + TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage === testPage); - TKUnit.assert(topFrame.backStack.length === 0, "Expected: 0, Actual: " + topFrame.backStack.length); - TKUnit.assert(topFrame.canGoBack() === false, "canGoBack should return false."); + 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"); - var topFrame = FrameModule.topmost(); - TKUnit.assert(topFrame.currentPage.content instanceof LabelModule.Label, "Content of the test page should be a Label created within test-page-module."); - var testLabel = topFrame.currentPage.content; - TKUnit.assert(testLabel.text === "Label created within a page module."); - helper.goBack(); + + TKUnit.assert(topFrame.currentPage.content instanceof Label, "Content of the test page should be a Label created within test-page-module."); + let testLabel =