Improve unit-tests (#1946)

* Improved unit-tests speed & reliability

* Fixed iOS tests.
Improved message output
This commit is contained in:
Hristo Hristov
2016-04-13 10:28:28 +03:00
parent 3ca4e34d3b
commit a66636fc6b
29 changed files with 1083 additions and 1596 deletions

View File

@@ -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

View File

@@ -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 () {
// <snippet module="ui/frame" title="frame">
// ### Navigating to a Module
@@ -57,9 +55,4 @@ export var ignore_test_DummyTestForSnippetOnly3 = function () {
topmost.goBack();
// ```
// </snippet>
}
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);
}

View File

@@ -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; });

View File

@@ -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();
}

View File

@@ -110,6 +110,7 @@ var testsWithLongDelay = {
testLoadInvalidUrl: 10000
}
var duration;
var running = false;
var testsQueue = new Array<TestInfo>();
@@ -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<TKUnit.TestFailure> = [];
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;

View File

@@ -54,7 +54,6 @@ export class UITest<T extends View> implements trace.TraceWriter {
this._testPage = null;
this._testView = null;
trace.removeWriter(this);
navHelper.goBack();
}
public setUp() {

View File

@@ -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<string>("content", "action-bar", "page"));
}
finally {
helper.goBack();
}
};
TKUnit.arrayAssert(loadedEvents, new Array<string>("content", "action-bar", "page"));
}
export function test_LoadedEventsOrder_WithoutPageContent() {
var loadedEvents = new Array<string>();
@@ -457,13 +432,8 @@ export function test_LoadedEventsOrder_WithoutPageContent() {
helper.navigate(pageFactory);
try {
TKUnit.arrayAssert(loadedEvents, new Array<string>("action-bar", "page"));
}
finally {
helper.goBack();
}
};
TKUnit.arrayAssert(loadedEvents, new Array<string>("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;

View File

@@ -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 = <android.support.v7.widget.Toolbar>(<any>page.actionBar)._toolbar;
var menu = toolbar.getMenu();
page.actionBar.actionItems.addItem(actionItem);
var toolbar = <android.support.v7.widget.Toolbar>(<any>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 = <android.support.v7.widget.Toolbar>(<any>page.actionBar)._toolbar;
var toolbar = <android.support.v7.widget.Toolbar>(<any>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");
}

View File

@@ -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 = (<UIViewController>page.ios);
var navigationItem: UINavigationItem = viewController.navigationItem;
var viewController = (<UIViewController>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 = (<UIViewController>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 = (<UIViewController>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");
}

View File

@@ -49,14 +49,12 @@ export var test_AnimatingProperties = function(done) {
////console.log("Animation finished.");
// <hide>
assertIOSNativeTransformIsCorrect(label);
helper.goBack();
done();
// </hide>
})
.catch((e) => {
console.log(e.message);
// <hide>
helper.goBack();
done(e);
// </hide>
});
@@ -94,7 +92,6 @@ export var test_CancellingAnimation = function(done) {
.catch((e) => {
////console.log("Animation cancelled");
// <hide>
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");
// <hide>
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");
// <hide>
assertIOSNativeTransformIsCorrect(label);
helper.goBack();
done();
// </hide>
})
.catch((e) => {
console.log(e.message);
// <hide>
helper.goBack();
done(e);
// </hide>
});
@@ -230,14 +224,12 @@ export var test_ReusingAnimations = function(done) {
////console.log("Animation finished");
// <hide>
assertIOSNativeTransformIsCorrect(label);
helper.goBack();
done();
// </hide>
})
.catch((e) => {
console.log(e.message);
// <hide>
helper.goBack();
done(e);
// </hide>
});
@@ -284,14 +276,12 @@ export var test_AnimatingMultipleViews = function(done) {
assertIOSNativeTransformIsCorrect(label1);
assertIOSNativeTransformIsCorrect(label2);
assertIOSNativeTransformIsCorrect(label3);
helper.goBack();
done();
// </hide>
})
.catch((e) => {
console.log(e.message);
// <hide>
helper.goBack();
done(e);
// </hide>
});
@@ -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: <any>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();
});

View File

@@ -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;

View File

@@ -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);
(<pageModule.Page>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.");
}

View File

@@ -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) {

View File

@@ -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<view.View>) => 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<view.View>) => 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<view.View>) => 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<view.View>) => void,
assert: (views: Array<view.View>) => 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<T extends view.View>(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<T extends view.View>(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();
}
}

View File

@@ -1,6 +1,5 @@
import TKUnit = require("../../TKUnit");
import helper = require("../helper");
import page = require("ui/page");
import types = require("utils/types");
// <snippet module="ui/html-view" title="HtmlView">
@@ -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;
// <snippet module="ui/html-view" title="HtmlView">
// ### Using HtmlView
@@ -49,11 +42,9 @@ export var testLoadHTMLString = function () {
// ```
// </snippet>
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());
}
}
}

View File

@@ -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");
// <snippet module="ui/list-picker" title="ListPicker">
@@ -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 () {

View File

@@ -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");
// </snippet>
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;
// <snippet module="ui/page" title="Page">
// ### 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);
// ```
// </snippet>
TKUnit.waitUntilReady(() => { return topFrame.currentPage !== currentPage });
currentPage = topFrame.currentPage;
TKUnit.waitUntilReady(() => { return testPage.isLayoutValid });
// <snippet module="ui/page" title="Page">
// ### Navigating backward is as simple as calling a single method.
@@ -134,7 +131,7 @@ export function test_NavigateToNewPage() {
// ```
// </snippet>
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;
// <snippet module="ui/page" title="Page">
// ### 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);
// ```
// </snippet>
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 = <LabelModule.Label>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 = <Label>topFrame.currentPage.content;
TKUnit.assertEqual(testLabel.text, "Label created within a page module.");
}
export function test_LoadPageFromDeclarativeWithCSS() {
let topFrame = frameModule.topmost();
helper.navigateToModule("ui/page/test-page-declarative-css");
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-css.");
var testLabel = <LabelModule.Label>topFrame.currentPage.content;
TKUnit.assert(testLabel.text === "Label created within a page declarative file with css.");
TKUnit.assert(testLabel.style.backgroundColor.hex === "#ff00ff00", "Expected: #ff00ff00, Actual: " + testLabel.style.backgroundColor.hex);
helper.goBack();
TKUnit.assert(topFrame.currentPage.content instanceof Label, "Content of the test page should be a Label created within test-page-module-css.");
var testLabel = <Label>topFrame.currentPage.content;
TKUnit.assertEqual(testLabel.text, "Label created within a page declarative file with css.");
TKUnit.assertEqual(testLabel.style.backgroundColor.hex, "#ff00ff00");
}
export function test_LoadPageFromModuleWithCSS() {
let topFrame = frameModule.topmost();
helper.navigateToModule("ui/page/test-page-module-css");
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-css.");
var testLabel = <LabelModule.Label>topFrame.currentPage.content;
TKUnit.assert(testLabel.text === "Label created within a page module css.");
TKUnit.assert(testLabel.style.backgroundColor.hex === "#ff00ff00", "Expected: #ff00ff00, Actual: " + testLabel.style.backgroundColor.hex);
helper.goBack();
TKUnit.assert(topFrame.currentPage.content instanceof Label, "Content of the test page should be a Label created within test-page-module-css.");
var testLabel = <Label>topFrame.currentPage.content;
TKUnit.assertEqual(testLabel.text, "Label created within a page module css.");
TKUnit.assertEqual(testLabel.style.backgroundColor.hex, "#ff00ff00");
}
export function test_NavigateToPageCreatedWithNavigationEntry() {
var expectedText = "Label created with a NavigationEntry";
var testPage: PageModule.Page;
var testPage: Page;
var pageFactory = function () {
testPage = new PageModule.Page();
testPage = new Page();
addLabelToPage(testPage, expectedText);
return testPage;
};
helper.navigate(pageFactory);
var actualContent = <LabelModule.Label>testPage.content;
TKUnit.assert(actualContent.text === expectedText, "Expected: " + expectedText + ", Actual: " + actualContent.text);
helper.goBack();
var actualContent = <Label>testPage.content;
TKUnit.assertEqual(actualContent.text, expectedText);
}
export function test_cssShouldBeAppliedToAllNestedElements() {
var label: LabelModule.Label;
var StackLayout: stackLayoutModule.StackLayout;
var pageFactory = function () {
var testPage = new PageModule.Page();
label = new LabelModule.Label();
label.text = expectedText;
StackLayout = new stackLayoutModule.StackLayout();
StackLayout.addChild(label);
testPage.content = StackLayout;
testPage.css = "stackLayout {background-color: #ffff0000;} label {background-color: #ff00ff00;}";
let expectedText = "Some text";
let testPage = new Page();
let label = new Label();
label.text = expectedText;
let stackLayout = new StackLayout();
stackLayout.addChild(label);
testPage.content = stackLayout;
testPage.css = "stackLayout {background-color: #ffff0000;} label {background-color: #ff00ff00;}";
let pageFactory = function () {
return testPage;
};
helper.navigate(pageFactory);
var expectedText = "Some text";
TKUnit.assert(label.style.backgroundColor.hex === "#ff00ff00", "Expected: #ff00ff00, Actual: " + label.style.backgroundColor.hex);
TKUnit.assert(StackLayout.style.backgroundColor.hex === "#ffff0000", "Expected: #ffff0000, Actual: " + StackLayout.style.backgroundColor.hex);
helper.goBack();
TKUnit.assertEqual(label.style.backgroundColor.hex, "#ff00ff00");
TKUnit.assertEqual(stackLayout.style.backgroundColor.hex, "#ffff0000");
}
export function test_cssShouldBeAppliedAfterChangeToAllNestedElements() {
var testPage: PageModule.Page;
var label: LabelModule.Label;
var StackLayout: stackLayoutModule.StackLayout;
var pageFactory = function () {
testPage = new PageModule.Page();
label = new LabelModule.Label();
label.text = expectedText;
StackLayout = new stackLayoutModule.StackLayout();
StackLayout.addChild(label);
testPage.content = StackLayout;
testPage.css = "stackLayout {background-color: #ffff0000;} label {background-color: #ff00ff00;}";
let expectedText = "Some text";
let testPage = new Page();
let label = new Label();
label.text = expectedText;
let stackLayout = new StackLayout();
stackLayout.addChild(label);
testPage.content = stackLayout;
testPage.css = "stackLayout {background-color: #ffff0000;} label {background-color: #ff00ff00;}";
let pageFactory = function () {
return testPage;
};
helper.navigate(pageFactory);
var expectedText = "Some text";
TKUnit.assert(label.style.backgroundColor.hex === "#ff00ff00", "Expected: #ff00ff00, Actual: " + label.style.backgroundColor.hex);
TKUnit.assert(StackLayout.style.backgroundColor.hex === "#ffff0000", "Expected: #ffff0000, Actual: " + StackLayout.style.backgroundColor.hex);
TKUnit.assertEqual(label.style.backgroundColor.hex, "#ff00ff00");
TKUnit.assertEqual(stackLayout.style.backgroundColor.hex, "#ffff0000");
testPage.css = "stackLayout {background-color: #ff0000ff;} label {background-color: #ffff0000;}";
TKUnit.assert(label.style.backgroundColor.hex === "#ffff0000", "Expected: #ffff0000, Actual: " + label.style.backgroundColor.hex);
TKUnit.assert(StackLayout.style.backgroundColor.hex === "#ff0000ff", "Expected: #ff0000ff, Actual: " + StackLayout.style.backgroundColor.hex);
helper.goBack();
TKUnit.assertEqual(label.style.backgroundColor.hex, "#ffff0000");
TKUnit.assertEqual(stackLayout.style.backgroundColor.hex, "#ff0000ff");
}
export function test_page_backgroundColor_is_white() {
helper.do_PageTest_WithButton(function testBackground(views: Array<view.View>) {
var page = <PageModule.Page>views[0];
TKUnit.assertEqual(page.style.backgroundColor.hex.toLowerCase(), "#ffffff", "page background-color");
});
let page = new Page();
let factory = () => page;
helper.navigate(factory);
TKUnit.assertEqual(page.style.backgroundColor.hex.toLowerCase(), "#ffffff", "page background-color");
}
export function test_WhenPageIsLoadedFrameCurrentPageIsNotYetTheSameAsThePage() {
var page;
var loadedEventHandler = function (args) {
TKUnit.assert(FrameModule.topmost().currentPage !== args.object, `When a page is loaded it should not yet be the current page. Loaded: ${args.object.id}; Current: ${FrameModule.topmost().currentPage.id};`);
TKUnit.assertNotEqual(frameModule.topmost().currentPage, args.object, "When a page is loaded it should not yet be the current page.");
}
var pageFactory = function (): PageModule.Page {
page = new PageModule.Page();
var pageFactory = function (): Page {
page = new Page();
page.id = "newPage";
page.on(view.View.loadedEvent, loadedEventHandler);
var label = new LabelModule.Label();
var label = new Label();
label.text = "Text";
page.content = label;
return page;
@@ -383,20 +391,19 @@ export function test_WhenPageIsLoadedFrameCurrentPageIsNotYetTheSameAsThePage()
helper.navigate(pageFactory);
page.off(view.View.loadedEvent, loadedEventHandler);
helper.goBack();
}
export function test_WhenPageIsNavigatedToFrameCurrentPageIsNowTheSameAsThePage() {
var page;
var navigatedEventHandler = function (args) {
TKUnit.assert(FrameModule.topmost().currentPage === args.object, `frame.topmost().currentPage should be equal to args.object page instance in the page.navigatedTo event handler. Expected: ${args.object.id}; Actual: ${FrameModule.topmost().currentPage.id};`);
TKUnit.assertEqual(frameModule.topmost().currentPage, args.object, `frame.topmost().currentPage should be equal to args.object page instance in the page.navigatedTo event handler. Expected: ${args.object.id}; Actual: ${frameModule.topmost().currentPage.id};`);
}
var pageFactory = function (): PageModule.Page {
page = new PageModule.Page();
var pageFactory = function (): Page {
page = new Page();
page.id = "newPage";
page.on(PageModule.Page.navigatedToEvent, navigatedEventHandler);
var label = new LabelModule.Label();
page.on(Page.navigatedToEvent, navigatedEventHandler);
var label = new Label();
label.text = "Text";
page.content = label;
return page;
@@ -404,7 +411,6 @@ export function test_WhenPageIsNavigatedToFrameCurrentPageIsNowTheSameAsThePage(
helper.navigate(pageFactory);
page.off(view.View.loadedEvent, navigatedEventHandler);
helper.goBack();
}
export function test_WhenNavigatingForwardAndBack_IsBackNavigationIsCorrect() {
@@ -412,7 +418,7 @@ export function test_WhenNavigatingForwardAndBack_IsBackNavigationIsCorrect() {
var page2;
var forwardCounter = 0;
var backCounter = 0;
var navigatedEventHandler = function (args: PageModule.NavigatedData) {
var navigatedEventHandler = function (args: NavigatedData) {
if (args.isBackNavigation) {
backCounter++;
}
@@ -421,26 +427,29 @@ export function test_WhenNavigatingForwardAndBack_IsBackNavigationIsCorrect() {
}
}
var pageFactory1 = function (): PageModule.Page {
page1 = new PageModule.Page();
page1.on(PageModule.Page.navigatedToEvent, navigatedEventHandler);
var pageFactory1 = function (): Page {
page1 = new Page();
page1.on(Page.navigatedToEvent, navigatedEventHandler);
return page1;
};
var pageFactory2 = function (): PageModule.Page {
page2 = new PageModule.Page();
page2.on(PageModule.Page.navigatedToEvent, navigatedEventHandler);
var pageFactory2 = function (): Page {
page2 = new Page();
page2.on(Page.navigatedToEvent, navigatedEventHandler);
return page2;
};
helper.navigate(pageFactory1);
helper.navigate(pageFactory2);
helper.goBack();
let topFrame = frameModule.topmost();
helper.navigateWithHistory(pageFactory1);
helper.navigateWithHistory(pageFactory2);
frameModule.goBack();
TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage === page1);
TKUnit.assertEqual(forwardCounter, 2, "Forward navigation counter should be 1");
TKUnit.assertEqual(backCounter, 1, "Backward navigation counter should be 1");
page1.off(PageModule.Page.navigatedToEvent, navigatedEventHandler);
page2.off(PageModule.Page.navigatedToEvent, navigatedEventHandler);
helper.goBack();
page1.off(Page.navigatedToEvent, navigatedEventHandler);
page2.off(Page.navigatedToEvent, navigatedEventHandler);
}
export function test_WhenPageIsNavigatedToItCanShowAnotherPageAsModal() {
@@ -498,27 +507,22 @@ export function test_WhenPageIsNavigatedToItCanShowAnotherPageAsModal() {
return masterPage;
};
try {
helper.navigate(masterPageFactory);
helper.navigate(masterPageFactory);
TKUnit.waitUntilReady(() => { return modalUnloaded > 0; });
TKUnit.assertEqual(shownModally, 1, "shownModally");
TKUnit.assertEqual(modalLoaded, 1, "modalLoaded");
TKUnit.assertEqual(modalUnloaded, 1, "modalUnloaded");
TKUnit.waitUntilReady(() => { return modalUnloaded > 0; });
TKUnit.assertEqual(shownModally, 1, "shownModally");
TKUnit.assertEqual(modalLoaded, 1, "modalLoaded");
TKUnit.assertEqual(modalUnloaded, 1, "modalUnloaded");
masterPage.off(Page.navigatedToEvent, navigatedToEventHandler);
}
finally {
helper.goBack();
}
masterPage.off(Page.navigatedToEvent, navigatedToEventHandler);
}
//export function test_ModalPage_Layout_is_Correct() {
// var testPage: PageModule.Page;
// var label: LabelModule.Label;
// var testPage: Page;
// var label: Label;
// var pageFactory = function () {
// testPage = new PageModule.Page();
// label = new LabelModule.Label();
// testPage = new Page();
// label = new Label();
// label.text = "Will Show modal page";
// testPage.content = label;
// return testPage;
@@ -534,7 +538,7 @@ export function test_WhenPageIsNavigatedToItCanShowAnotherPageAsModal() {
// var closeCallback: Function = (<any>testPage).close;
// try {
// var layout = <stackLayoutModule.StackLayout>childPage.content;
// var layout = <StackLayout>childPage.content;
// var repeater = layout.getChildAt(1);
// TKUnit.assertTrue(repeater.isLayoutValid, "layout should be valid.");
// var bounds = repeater._getCurrentLayoutBounds();

View File

@@ -7,39 +7,11 @@ import frame = require("ui/frame");
global.moduleMerge(PageTestCommon, exports);
export var test_NavigateToNewPage_WithAndroidCache = function () {
var testPage: PageModule.Page;
var pageFactory = function (): PageModule.Page {
testPage = new PageModule.Page();
var label = new LabelModule.Label();
label.text = "The quick brown fox jumps over the lazy dog.";
testPage.content = label;
return testPage;
};
var androidFrame = frame.topmost().android;
var cachingBefore = androidFrame.cachePagesOnNavigate;
try {
androidFrame.cachePagesOnNavigate = true;
helper.navigate(pageFactory);
helper.goBack();
}
finally {
androidFrame.cachePagesOnNavigate = cachingBefore;
}
TKUnit.assert(testPage.parent === undefined, "Page.parent 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 var test_NavigateToNewPage_InnerControl_WithAndroidCache = function () {
export function test_NavigateToNewPage_WithAndroidCache() {
var testPage: PageModule.Page;
var label: LabelModule.Label;
var pageFactory = function () {
var pageFactory = function (): PageModule.Page {
testPage = new PageModule.Page();
label = new LabelModule.Label();
label.text = "The quick brown fox jumps over the lazy dog.";
@@ -50,16 +22,23 @@ export var test_NavigateToNewPage_InnerControl_WithAndroidCache = function () {
var androidFrame = frame.topmost().android;
var cachingBefore = androidFrame.cachePagesOnNavigate;
try {
let currentPage = frame.topmost().currentPage;
androidFrame.cachePagesOnNavigate = true;
helper.navigate(pageFactory);
helper.navigateWithHistory(pageFactory);
helper.goBack();
frame.goBack();
TKUnit.waitUntilReady(() => frame.topmost().currentPage !== null && frame.topmost().currentPage === currentPage);
}
finally {
androidFrame.cachePagesOnNavigate = cachingBefore;
}
TKUnit.assert(testPage.parent === undefined, "Page.parent 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");
TKUnit.assert(label._context === undefined, "InnerControl._context should not be set after navigate back.");
TKUnit.assert(label.android === undefined, "InnerControl.android should not be set after navigate back.");
TKUnit.assert(label._nativeView === undefined, "InnerControl._nativeView hould not be set after navigate back.");
@@ -75,9 +54,10 @@ export var test_NavigateToNewPage_InnerControl = function () {
return testPage;
};
helper.navigate(pageFactory);
helper.goBack();
let currentPage = frame.topmost().currentPage;
helper.navigateWithHistory(pageFactory);
frame.goBack();
TKUnit.waitUntilReady(() => frame.topmost().currentPage !== null && frame.topmost().currentPage === currentPage);
var label = <LabelModule.Label>testPage.content;
@@ -99,7 +79,7 @@ export var test_ChangePageCaching_AfterNavigated_Throws = function () {
var androidFrame = frame.topmost().android;
var cachingBefore = androidFrame.cachePagesOnNavigate;
helper.navigate(pageFactory);
helper.navigateWithHistory(pageFactory);
try {
TKUnit.assertThrows(() => {
@@ -111,7 +91,6 @@ export var test_ChangePageCaching_AfterNavigated_Throws = function () {
);
}
finally {
helper.goBack();
androidFrame.cachePagesOnNavigate = cachingBefore;
}
}
@@ -134,7 +113,6 @@ export var test_SetPageCaching_ToTheSameValue_AfterNavigated_DoesNotThrow = func
androidFrame.cachePagesOnNavigate = cachingBefore;
}
finally {
helper.goBack();
androidFrame.cachePagesOnNavigate = cachingBefore;
}
}
@@ -151,4 +129,4 @@ export var test_ChangePageCaching_BeforeNavigated_DoesNotThrow = function () {
finally {
androidFrame.cachePagesOnNavigate = cachingBefore;
}
}
}

View File

@@ -6,6 +6,7 @@ import helper = require("../helper");
import {View} from "ui/core/view";
import {EventData} from "data/observable";
import uiUtils = require("ui/utils");
import * as frame from "ui/frame";
global.moduleMerge(PageTestCommon, exports);
@@ -17,11 +18,13 @@ export function test_NavigateToNewPage_InnerControl() {
return testPage;
};
helper.navigate(pageFactory);
helper.goBack();
let currentPage = helper.getCurrentPage();
helper.navigateWithHistory(pageFactory);
var label = <Label>testPage.content;
frame.goBack();
TKUnit.waitUntilReady(() => !label.isLoaded && frame.topmost().currentPage === currentPage);
TKUnit.assertEqual(label._context, undefined, "label._context should be undefined after navigate back.");
TKUnit.assertEqual(label.android, undefined, "label.android should be undefined after navigate back.");
TKUnit.assertFalse(label.isLoaded, "label.isLoaded should become false after navigating back");
@@ -60,16 +63,11 @@ export function test_WhenShowingModalPageUnloadedIsNotFiredForTheMasterPage() {
return masterPage;
};
try {
helper.navigate(masterPageFactory);
TKUnit.waitUntilReady(() => { return modalUnloaded > 0; });
TKUnit.assert(!masterPageUnloaded, "Master page should not raise 'unloaded' when showing modal!");
masterPage.off(View.loadedEvent, navigatedToEventHandler);
masterPage.off(View.unloadedEvent, unloadedEventHandler);
}
finally {
helper.goBack();
}
helper.navigate(masterPageFactory);
TKUnit.waitUntilReady(() => { return modalUnloaded > 0; });
TKUnit.assert(!masterPageUnloaded, "Master page should not raise 'unloaded' when showing modal!");
masterPage.off(View.loadedEvent, navigatedToEventHandler);
masterPage.off(View.unloadedEvent, unloadedEventHandler);
}
export function test_page_no_anctionBar_measure_no_spanUnderBackground_measure_layout_size_isCorrect() {
@@ -79,39 +77,34 @@ export function test_page_no_anctionBar_measure_no_spanUnderBackground_measure_l
let lbl = new Label();
page.content = lbl;
try {
helper.navigate(() => { return page; });
TKUnit.waitUntilReady(() => { return page.isLayoutValid; });
TKUnit.assertTrue(page.isLoaded, "page NOT loaded!");
helper.navigate(() => { return page; });
TKUnit.waitUntilReady(() => { return page.isLayoutValid; });
TKUnit.assertTrue(page.isLoaded, "page NOT loaded!");
let bounds = page._getCurrentLayoutBounds();
let pageHeight = bounds.bottom - bounds.top;
let frameBounds = page.frame._getCurrentLayoutBounds();
let frameHeight = frameBounds.bottom - frameBounds.top;
TKUnit.assertEqual(pageHeight, frameHeight, "Page height should match Frame height.");
let bounds = page._getCurrentLayoutBounds();
let pageHeight = bounds.bottom - bounds.top;
let frameBounds = page.frame._getCurrentLayoutBounds();
let frameHeight = frameBounds.bottom - frameBounds.top;
TKUnit.assertEqual(pageHeight, frameHeight, "Page height should match Frame height.");
let contentHeight = lbl._getCurrentLayoutBounds().bottom - lbl._getCurrentLayoutBounds().top;
let statusBarHeight = uiUtils.ios.getStatusBarHeight();
TKUnit.assertEqual(contentHeight, frameHeight - statusBarHeight, "Page.content height should match Frame height - statusBar height.");
let contentHeight = lbl._getCurrentLayoutBounds().bottom - lbl._getCurrentLayoutBounds().top;
let statusBarHeight = uiUtils.ios.getStatusBarHeight();
TKUnit.assertEqual(contentHeight, frameHeight - statusBarHeight, "Page.content height should match Frame height - statusBar height.");
page.backgroundSpanUnderStatusBar = false;
TKUnit.waitUntilReady(() => { return page.isLayoutValid; });
pageHeight = page._getCurrentLayoutBounds().bottom - page._getCurrentLayoutBounds().top;
TKUnit.assertEqual(pageHeight, frameHeight - statusBarHeight, "Page should be given Frame height - statusBar height.");
page.backgroundSpanUnderStatusBar = false;
TKUnit.waitUntilReady(() => { return page.isLayoutValid; });
pageHeight = page._getCurrentLayoutBounds().bottom - page._getCurrentLayoutBounds().top;
TKUnit.assertEqual(pageHeight, frameHeight - statusBarHeight, "Page should be given Frame height - statusBar height.");
contentHeight = lbl._getCurrentLayoutBounds().bottom - lbl._getCurrentLayoutBounds().top;
TKUnit.assertEqual(contentHeight, pageHeight, "Page.content height should match Page height.");
contentHeight = lbl._getCurrentLayoutBounds().bottom - lbl._getCurrentLayoutBounds().top;
TKUnit.assertEqual(contentHeight, pageHeight, "Page.content height should match Page height.");
page.actionBarHidden = false;
TKUnit.waitUntilReady(() => { return page.isLayoutValid; });
page.actionBarHidden = false;
TKUnit.waitUntilReady(() => { return page.isLayoutValid; });
pageHeight = page._getCurrentLayoutBounds().bottom - page._getCurrentLayoutBounds().top;
TKUnit.assertEqual(pageHeight, frameHeight - statusBarHeight, "Page should be given Frame height - statusBar height.");
pageHeight = page._getCurrentLayoutBounds().bottom - page._getCurrentLayoutBounds().top;
TKUnit.assertEqual(pageHeight, frameHeight - statusBarHeight, "Page should be given Frame height - statusBar height.");
contentHeight = lbl._getCurrentLayoutBounds().bottom - lbl._getCurrentLayoutBounds().top;
TKUnit.assertTrue(contentHeight < pageHeight, "Page.content be given less space than Page when ActionBar is shown.");
}
finally {
helper.goBack();
}
contentHeight = lbl._getCurrentLayoutBounds().bottom - lbl._getCurrentLayoutBounds().top;
TKUnit.assertTrue(contentHeight < pageHeight, "Page.content be given less space than Page when ActionBar is shown.");
}

View File

@@ -1,10 +1,11 @@
import TKUnit = require("../../TKUnit");
import app = require("application");
import helper = require("../helper");
import button = require("ui/button");
import enums = require("ui/enums");
import testModule = require("../../ui-test");
import layoutHelper = require("../../layouts/layout-helper");
import {Page} from "ui/page";
import * as frame from "ui/frame";
// <snippet module="ui/scroll-view" title="scroll-view">
// # ScrollView
@@ -170,9 +171,15 @@ class ScrollLayoutTest extends testModule.UITest<scrollViewModule.ScrollView> {
this.testView.scrollToVerticalOffset(layoutHelper.dp(100), false);
TKUnit.assertAreClose(layoutHelper.dip(this.testView.verticalOffset), 100, 0.1, "this.testView.verticalOffset before navigation");
helper.do_PageTest_WithButton((t) => {
// Just navigate forward and back.
});
let page = new Page();
let createFunc = () => {
return page;
};
let entry: frame.NavigationEntry = { create: createFunc, animated: false };
frame.topmost().navigate(entry);
TKUnit.waitUntilReady(() => page.isLayoutValid);
frame.topmost().goBack();
// Wait for the page to reload.
TKUnit.waitUntilReady(() => { return TKUnit.areClose(layoutHelper.dip(this.testView.verticalOffset), 100, 0.1); });
@@ -189,9 +196,15 @@ class ScrollLayoutTest extends testModule.UITest<scrollViewModule.ScrollView> {
TKUnit.assertAreClose(layoutHelper.dip(this.testView.horizontalOffset), 100, 0.1, "this.testView.horizontalOffset before navigation");
helper.do_PageTest_WithButton((t) => {
// Just navigate forward and back.
});
let page = new Page();
let createFunc = () => {
return page;
};
let entry: frame.NavigationEntry = { create: createFunc, animated: false };
frame.topmost().navigate(entry);
TKUnit.waitUntilReady(() => page.isLayoutValid);
frame.topmost().goBack();
// Wait for the page to reload.
TKUnit.waitUntilReady(() => { return TKUnit.areClose(layoutHelper.dip(this.testView.horizontalOffset), 100, 0.1); });

View File

@@ -29,7 +29,6 @@ export function setUpModule() {
}
export function tearDownModule() {
helper.goBack();
testBtn = null;
testPage = null;
}

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,102 +1,61 @@
import color = require("color");
import button = require("ui/button");
import page = require("ui/page");
import stack = require("ui/layouts/stack-layout");
import helper = require("../helper");
export var test_value_Inherited_stronger_than_Default = function () {
var testPage: page.Page;
var btn: button.Button;
var pageFactory = function (): page.Page {
testPage = new page.Page();
var testStack = new stack.StackLayout();
testPage.content = testStack;
btn = new button.Button();
testStack.addChild(btn);
testPage.css = "stackLayout { color: red; }";
return testPage;
};
// Act & Assert
helper.navigate(pageFactory);
let page = helper.getCurrentPage();
let btn = new button.Button();
let testStack = new stack.StackLayout();
page.content = testStack;
testStack.addChild(btn);
page.css = "stackLayout { color: red; }";
helper.assertViewColor(btn, "#FF0000");
helper.goBack();
page.css = "";
}
export var test_value_Css_stronger_than_Inherited = function () {
var testPage: page.Page;
var btn: button.Button;
var pageFactory = function (): page.Page {
testPage = new page.Page();
var testStack = new stack.StackLayout();
testPage.content = testStack;
let page = helper.getCurrentPage();
let testStack = new stack.StackLayout();
page.content = testStack;
btn = new button.Button();
testStack.addChild(btn);
testPage.css = "stackLayout { color: red; } button { color: blue; }";
return testPage;
};
// Act & Assert
helper.navigate(pageFactory);
let btn = new button.Button();
testStack.addChild(btn);
page.css = "stackLayout { color: red; } button { color: blue; }";
helper.assertViewColor(btn, "#0000FF");
helper.goBack();
}
export var test_value_Local_stronger_than_Css = function () {
var testPage: page.Page;
var btn: button.Button;
var pageFactory = function (): page.Page {
testPage = new page.Page();
var testStack = new stack.StackLayout();
testPage.content = testStack;
let testPage = helper.getCurrentPage();
let testStack = new stack.StackLayout();
testPage.content = testStack;
btn = new button.Button();
testStack.addChild(btn);
testPage.css = "button { color: red; }";
return testPage;
};
// Act & Assert
helper.navigate(pageFactory);
let btn = new button.Button();
testStack.addChild(btn);
testPage.css = "button { color: red; }";
helper.assertViewColor(btn, "#FF0000");
btn.style.color = new color.Color("#0000FF");
helper.assertViewColor(btn, "#0000FF");
btn.style.color = undefined;
helper.assertViewColor(btn, "#FF0000");
helper.goBack();
}
export var test_value_VisualState_stronger_than_Local = function () {
var testPage: page.Page;
var btn: button.Button;
var pageFactory = function (): page.Page {
testPage = new page.Page();
var testStack = new stack.StackLayout();
testPage.content = testStack;
let testPage = helper.getCurrentPage();
btn = new button.Button();
btn.style.color = new color.Color("#FF0000");
testStack.addChild(btn);
testPage.css = "button:pressed { color: #0000FF; }";
return testPage;
};
let testStack = new stack.StackLayout();
testPage.content = testStack;
// Act & Assert
helper.navigate(pageFactory);
let btn = new button.Button();
btn.style.color = new color.Color("#FF0000");
testStack.addChild(btn);
testPage.css = "button:pressed { color: #0000FF; }";
helper.assertViewColor(btn, "#FF0000");
btn._goToVisualState("pressed");
helper.assertViewColor(btn, "#0000FF");
btn._goToVisualState("normal");
helper.assertViewColor(btn, "#FF0000");
helper.goBack();
}

View File

@@ -103,19 +103,19 @@ export function testWhenNavigatingBackToANonCachedPageContainingATabViewWithALis
return tabViewPage;
}
helper.navigate(pageFactory);
TKUnit.waitUntilReady(() => { return topFrame.currentPage.id === "tab-view-page" }, ASYNC);
TKUnit.waitUntilReady(() => { return tabViewIsFullyLoaded(tabView) }, ASYNC);
helper.navigateWithHistory(pageFactory);
TKUnit.waitUntilReady(() => topFrame.currentPage.id === "tab-view-page", ASYNC);
TKUnit.waitUntilReady(() => tabViewIsFullyLoaded(tabView), ASYNC);
// This will navigate to a details page. The wait is inside the method.
_clickTheFirstButtonInTheListViewNatively(tabView);
TKUnit.waitUntilReady(() => { return topFrame.currentPage.id === "details-page" }, ASYNC);
helper.goBack();
frameModule.goBack();
TKUnit.waitUntilReady(() => { return topFrame.currentPage.id === "tab-view-page" }, ASYNC);
TKUnit.waitUntilReady(() => { return tabViewIsFullyLoaded(tabView) }, ASYNC);
helper.goBack();
frameModule.goBack();
TKUnit.waitUntilReady(() => { return topFrame.currentPage.id === "mainPage" }, ASYNC);
if (topFrame.android) {
@@ -156,6 +156,7 @@ function tabViewIsFullyLoaded(tabView: TabView): boolean {
function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack(enablePageCache: boolean) {
var topFrame = frameModule.topmost();
topFrame.currentPage.id = "mainPage";
var oldChache;
if (topFrame.android) {
@@ -197,15 +198,19 @@ function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack(enablePageCache
tabView.items[i].view.on("unloaded", createUnloadedFor(i));
}
helper.navigate(() => {
var detailsPage = new Page();
detailsPage.id = "details-page";
detailsPage.content = new Label();
var detailsPage = new Page();
detailsPage.id = "details-page";
let createFunc = () => {
return detailsPage;
});
};
let entry: frameModule.NavigationEntry = { create: createFunc, animated: false };
topFrame.navigate(entry);
TKUnit.waitUntilReady(() => { return topFrame.currentPage.id === "details-page" }, ASYNC);
helper.goBack();
topFrame.goBack();
TKUnit.waitUntilReady(() => { return topFrame.currentPage.id === "tab-view-page" }, ASYNC);
TKUnit.waitUntilReady(() => { return tabViewIsFullyLoaded(tabView) }, ASYNC);
@@ -214,13 +219,16 @@ function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack(enablePageCache
tabView.items[i].view.off("unloaded");
}
helper.goBack();
topFrame.goBack();
TKUnit.waitUntilReady(() => { return topFrame.currentPage.id === "mainPage" }, ASYNC);
if (topFrame.android) {
topFrame.android.cachePagesOnNavigate = oldChache;
}
topFrame.currentPage.id = null;
TKUnit.arrayAssert(loadedEventsCount, [1, 1]);
TKUnit.arrayAssert(unloadedEventsCount, [1, 1]);
}

View File

@@ -99,15 +99,11 @@ export var test_parent_IsReset_WhenDetached_FromVisualTree = function () {
cachedViews = views;
}
helper.do_PageTest_WithButton(test);
helper.do_PageTest_WithStackLayout_AndButton(test);
// the test will call goBack to the current frame and will remove the test page
// verify the first view returned in the helper callback is detached (no parent)
TKUnit.assert(types.isUndefined(cachedViews[0].parent));
// the button (second view) should have a parent
TKUnit.assert(types.isDefined(cachedViews[1].parent));
TKUnit.assert(cachedViews[1].parent === cachedViews[0]);
TKUnit.assert(types.isUndefined(cachedViews[1].parent));
TKUnit.assert(types.isDefined(cachedViews[2].parent));
TKUnit.assert(cachedViews[2].parent === cachedViews[1]);
}
export var test_domId_IsUnique = function () {
@@ -152,14 +148,12 @@ export var test_event_LoadedUnloaded_IsRaised = function () {
helper.do_PageTest_WithStackLayout_AndButton(test);
}
export var test_bindingContext_IsInherited = function () {
export function test_bindingContext_IsInherited() {
var context = {};
frame.topmost().bindingContext = context;
var test = function (views: Array<viewModule.View>) {
var i;
for (i = 0; i < views.length; i++) {
TKUnit.assert(views[i].bindingContext === context);
views[0].bindingContext = context;
for (let i = 0; i < views.length; i++) {
TKUnit.assertEqual(views[i].bindingContext, context);
}
}
@@ -169,8 +163,8 @@ export var test_bindingContext_IsInherited = function () {
export var test_isAddedToNativeVisualTree_IsUpdated = function () {
var test = function (views: Array<viewModule.View>) {
var i;
for (i = 0; i < views.length; i++) {
for (let i = 0; i < views.length; i++) {
TKUnit.assert(views[i]._isAddedToNativeVisualTree);
}
@@ -243,17 +237,14 @@ export class TestButton extends button.Button {
}
export var test_InheritableStylePropertiesWhenUsedWithExtendedClass_AreInherited = function () {
var test = function (views: Array<viewModule.View>) {
var redColor = new color.Color("red");
views[0].style.color = redColor;
let page = frame.topmost().currentPage;
let redColor = new color.Color("red");
page.style.color = redColor;
var newButton = new TestButton();
views[1]._addView(newButton);
let newButton = new TestButton();
page.content = newButton;
TKUnit.assert(newButton.style.color === redColor);
}
helper.do_PageTest_WithStackLayout_AndButton(test);
TKUnit.assertEqual(newButton.style.color, redColor);
}
var inheritanceTestDefaultValue = 42;

View File

@@ -7,7 +7,7 @@ import types = require("utils/types");
import stack = require("ui/layouts/stack-layout");
import labelModule = require("ui/label");
import background = require("ui/styling/background");
import frame = require("ui/frame");
import trace = require("trace");
// enable the trace, it is disabled by default
trace.enable();
@@ -19,12 +19,11 @@ export var test_event_onAttached_IsRaised = function () {
trace.addEventListener(listener);
var test = function (views: Array<view.View>) {
// 4 onAttached calls: page, stack, button, actionBar
TKUnit.assertEqual(listener.receivedEvents.length, 4, "onAttached calls");
// 2 onAttached calls: stack, button
TKUnit.assertEqual(listener.receivedEvents.length, 2, "onAttached calls");
var i;
for (i = 0; i < listener.receivedEvents.length; i++) {
TKUnit.assertEqual(listener.receivedEvents[i].sender, views[i]);
for (let i = 0; i < listener.receivedEvents.length; i++) {
TKUnit.assertEqual(listener.receivedEvents[i].sender, views[i + 1]); // 0 is Page, so start with +1.
TKUnit.assertEqual(listener.receivedEvents[i].name, "_onAttached");
}
}
@@ -57,12 +56,11 @@ export var test_event_onContextChanged_IsRaised_WhenAttached = function () {
trace.addEventListener(listener);
var test = function (views: Array<view.View>) {
// 4 onContextChanged calls: page, stack, button, actionBar
TKUnit.assertEqual(listener.receivedEvents.length, 4, "onContextChanged calls");
// 2 onContextChanged calls: stack, button
TKUnit.assertEqual(listener.receivedEvents.length, 2, "onContextChanged calls");
var i;
for (i = 0; i < listener.receivedEvents.length; i++) {
TKUnit.assertEqual(listener.receivedEvents[i].sender, views[i]);
for (let i = 0; i < listener.receivedEvents.length; i++) {
TKUnit.assertEqual(listener.receivedEvents[i].sender, views[i + 1]); // 0 is Page, so start with +1.
TKUnit.assertEqual(listener.receivedEvents[i].name, "_onContextChanged");
}
}
@@ -104,13 +102,11 @@ export var test_event_onDetached_IsRaised = function () {
helper.do_PageTest_WithStackLayout_AndButton(test);
// 4 detached calls: page, stack, button, actionBar
TKUnit.assertEqual(listener.receivedEvents.length, 4, "onDetached calls");
// 2 detached calls: page, stack, button, actionBar
TKUnit.assertEqual(listener.receivedEvents.length, 2, "onDetached calls");
var i
var j;
// _onDetached event is propagated to nested children first
for (i = 0, j = listener.receivedEvents.length - 1; i < listener.receivedEvents.length; i++ , j--) {
for (let i = 0, j = listener.receivedEvents.length - 1; i < listener.receivedEvents.length; i++ , j--) {
// check the sender and remove
var index = cachedViews.indexOf(<view.View>listener.receivedEvents[i].sender);
TKUnit.assert(index >= 0, "_onDetached called for unknown sender");
@@ -142,41 +138,38 @@ export var test_event_onDetached_IsRaised_WhenRemoved_Dynamically = function ()
}
export var test_events_onDetachedAndRemovedFromNativeVisualTree_AreRaised_WhenNavigateBack = function () {
var onDetachedListener = new Listener("_onDetached");
var removeFromNativeVisualTreeListener = new Listener("childInLayoutRemovedFromNativeVisualTree");
let onDetachedListener = new Listener("_onDetached");
let removeFromNativeVisualTreeListener = new Listener("childInLayoutRemovedFromNativeVisualTree");
var test = function (views: Array<view.View>) {
trace.addEventListener(onDetachedListener);
trace.addEventListener(removeFromNativeVisualTreeListener);
};
let page = frame.topmost().currentPage;
let stackLayout = new stack.StackLayout();
let btn = new button.Button();
stackLayout.addChild(btn);
page.content = stackLayout;
var assert = function (views: Array<view.View>) {
// 4 onDetached calls: page, stack, button, actionBar
TKUnit.assertEqual(onDetachedListener.receivedEvents.length, 4, "onDetached calls");
trace.addEventListener(onDetachedListener);
trace.addEventListener(removeFromNativeVisualTreeListener);
TKUnit.assertEqual(onDetachedListener.receivedEvents[0].name, "_onDetached");
TKUnit.assertEqual(onDetachedListener.receivedEvents[0].sender, views[2]); // Button
TKUnit.assertEqual(onDetachedListener.receivedEvents[1].sender, views[1]); // Stack
TKUnit.assertEqual(onDetachedListener.receivedEvents[2].sender, views[3]); // ActionBar
TKUnit.assertEqual(onDetachedListener.receivedEvents[3].sender, views[0]); // Page
page.content = null;
// this is an event fired from CustomLayoutView when a child is removed from the native visual tree
// therefore this event is fired for StackLayout and Button (which is inside StackLayout).
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents.length, 3);
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[0].name, "childInLayoutRemovedFromNativeVisualTree");
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[0].sender, views[1]);
// 2 onDetached calls: stack, button
TKUnit.assertEqual(onDetachedListener.receivedEvents.length, 2, "onDetached calls");
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[1].name, "childInLayoutRemovedFromNativeVisualTree");
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[1].sender, views[2]);
TKUnit.assertEqual(onDetachedListener.receivedEvents[0].name, "_onDetached");
TKUnit.assertEqual(onDetachedListener.receivedEvents[0].sender, btn); // Button
TKUnit.assertEqual(onDetachedListener.receivedEvents[1].sender, stackLayout); // stackLayout
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[2].name, "childInLayoutRemovedFromNativeVisualTree");
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[2].sender, views[3]);
// this is an event fired from CustomLayoutView when a child is removed from the native visual tree
// therefore this event is fired for StackLayout and Button (which is inside StackLayout).
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents.length, 2);
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[0].name, "childInLayoutRemovedFromNativeVisualTree");
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[0].sender, stackLayout);
trace.removeEventListener(onDetachedListener);
trace.removeEventListener(removeFromNativeVisualTreeListener);
};
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[1].name, "childInLayoutRemovedFromNativeVisualTree");
TKUnit.assertEqual(removeFromNativeVisualTreeListener.receivedEvents[1].sender, btn);
helper.do_PageTest_WithStackLayout_AndButton_NavigatedBack(test, assert);
trace.removeEventListener(onDetachedListener);
trace.removeEventListener(removeFromNativeVisualTreeListener);
}
export var test_cachedProperties_Applied_WhenNativeWidged_IsCreated = function () {

View File

@@ -1,10 +1,8 @@
import commonTests = require("./view-tests-common");
import view = require("ui/core/view");
import grid = require("ui/layouts/grid-layout");
import color = require("color");
import helper = require("../helper");
import page = require("ui/page");
import TKUnit = require("../../TKUnit");
import button = require("ui/button");
@@ -37,54 +35,44 @@ export function checkNativeBackgroundImage(v: view.View): boolean {
}
export function testBackgroundInternalChangedOnceOnResize() {
var layout = new grid.GridLayout();
let root = helper.getCurrentPage();
let layout = new grid.GridLayout();
layout.className = "myClass";
layout.backgroundColor = new color.Color(255, 255, 0, 0);
var pageFactory = () => {
var root = new page.Page();
root.css = ".myClass { background-image: url('~/tests/logo.png') }";
root.content = layout;
return root;
root.css = ".myClass { background-image: url('~/tests/logo.png') }";
root.content = layout;
let sizeChangedCount = 0;
function trackCount() {
let result = sizeChangedCount;
sizeChangedCount = 0;
return result;
}
helper.navigate(pageFactory);
try {
var sizeChangedCount = 0;
function trackCount() {
var result = sizeChangedCount;
sizeChangedCount = 0;
return result;
var base = (<any>layout.style)._applyStyleProperty;
(<any>layout.style)._applyStyleProperty = function (property) {
base.apply(layout.style, arguments);
if (property.name === "_backgroundInternal") {
++sizeChangedCount;
}
var base = (<any>layout.style)._applyStyleProperty;
(<any>layout.style)._applyStyleProperty = function(property) {
base.apply(layout.style, arguments);
if (property.name === "_backgroundInternal") {
++sizeChangedCount;
}
}
layout.requestLayout();
layout.layout(0, 0, 200, 200);
TKUnit.assertEqual(trackCount(), 1, "Expected background to be re-applied at most once when the view is layed-out on 0 0 200 200.");
layout.requestLayout();
layout.layout(50, 50, 250, 250);
TKUnit.assertEqual(trackCount(), 0, "Expected background to NOT change when view is layed-out from 0 0 200 200 to 50 50 250 250.");
layout.requestLayout();
layout.layout(0, 0, 250, 250);
TKUnit.assertEqual(trackCount(), 1, "Expected background to be re-applied at most once when the view is layed-out from 50 50 250 250 to 0 0 250 250.");
}
finally {
helper.goBack();
}
layout.requestLayout();
layout.layout(0, 0, 200, 200);
TKUnit.assertEqual(trackCount(), 1, "Expected background to be re-applied at most once when the view is layed-out on 0 0 200 200.");
layout.requestLayout();
layout.layout(50, 50, 250, 250);
TKUnit.assertEqual(trackCount(), 0, "Expected background to NOT change when view is layed-out from 0 0 200 200 to 50 50 250 250.");
layout.requestLayout();
layout.layout(0, 0, 250, 250);
TKUnit.assertEqual(trackCount(), 1, "Expected background to be re-applied at most once when the view is layed-out from 50 50 250 250 to 0 0 250 250.");
}
export function test_automation_text_set_to_native() {

View File

@@ -27,23 +27,21 @@ import segmentedBar = require("ui/segmented-bar");
import { Source } from "utils/debug";
export function test_load_IsDefined() {
TKUnit.assert(types.isFunction(builder.load), "ui/builder should have load method!");
TKUnit.assertTrue(types.isFunction(builder.load), "ui/builder should have load method!");
};
export function test_parse_IsDefined() {
TKUnit.assert(types.isFunction(builder.parse), "ui/builder should have parse method!");
TKUnit.assertTrue(types.isFunction(builder.parse), "ui/builder should have parse method!");
};
export function test_load_ShouldNotCrashWithInvalidFileName() {
var v = builder.load(fs.path.join(__dirname, "mainPage1.xml"));
TKUnit.assert(types.isUndefined(v), "Expected result: undefined; Actual result: " + v + ";");
TKUnit.assertTrue(types.isUndefined(v), "Expected result: undefined; Actual result: " + v + ";");
};
export function test_load_ShouldNotCrashWithoutExports() {
var v = builder.load(fs.path.join(__dirname, "mainPage.xml"));
TKUnit.assert(v instanceof view.View, "Expected result: View; Actual result: " + v + ";");
TKUnit.assertTrue(v instanceof view.View, "Expected result: View; Actual result: " + v + ";");
};
export function test_loadWithOptionsNoXML() {
@@ -54,32 +52,20 @@ export function test_loadWithOptionsNoXML() {
page: new Page()
});
TKUnit.assert(v instanceof view.View, "Expected result: View; Actual result: " + v + ";");
TKUnit.assertTrue(v instanceof view.View, "Expected result: View; Actual result: " + v + ";");
};
export function test_loadWithOptionsNoXML_CSSIsApplied() {
var newPage: Page;
var pageFactory = function (): Page {
newPage = new Page();
let newPage = helper.getCurrentPage();
newPage.content = builder.load({
path: "~/xml-declaration/mymodule",
name: "MyControl",
exports: exports,
page: newPage
});
newPage.content = builder.load({
path: "~/xml-declaration/mymodule",
name: "MyControl",
exports: exports,
page: newPage
});
return newPage;
};
helper.navigate(pageFactory);
TKUnit.assert(newPage.isLoaded, "The page should be loaded here.");
try {
helper.assertViewBackgroundColor(newPage.content, "#FF0000");
}
finally {
helper.goBack();
}
helper.assertViewBackgroundColor(newPage.content, "#FF0000");
};
export function test_loadInheritedPageAndResolveFromChild() {
@@ -89,13 +75,13 @@ export function test_loadInheritedPageAndResolveFromChild() {
TKUnit.assertEqual("Inherited and loaded", contentLabel.text);
let discoveredPage = contentLabel.page;
TKUnit.assert(page === discoveredPage);
TKUnit.assertEqual(page, discoveredPage);
let discoveredAncestorByBaseType = viewModule.getAncestor(contentLabel, Page);
TKUnit.assert(page === discoveredAncestorByBaseType);
TKUnit.assertEqual(page, discoveredAncestorByBaseType);
let discoveredAncestorByInheritedTypeName = viewModule.getAncestor(contentLabel, "InheritedPage");
TKUnit.assert(page === discoveredAncestorByInheritedTypeName);
TKUnit.assertEqual(page, discoveredAncestorByInheritedTypeName);
});
}
@@ -106,7 +92,7 @@ export function test_loadWithOptionsWithXML() {
exports: exports,
page: new Page()
});
TKUnit.assert(v instanceof view.View, "Expected result: View; Actual result: " + v + ";");
TKUnit.assertTrue(v instanceof view.View, "Expected result: View; Actual result: " + v + ";");
};
export function test_loadWithOptionsWithXML_CSSIsApplied() {
@@ -126,12 +112,7 @@ export function test_loadWithOptionsWithXML_CSSIsApplied() {
helper.navigate(pageFactory);
TKUnit.assert(newPage.isLoaded, "The page should be loaded here.");
try {
helper.assertViewBackgroundColor(newPage.content, "#008000");
}
finally {
helper.goBack();
}
helper.assertViewBackgroundColor(newPage.content, "#008000");
};
export function test_loadWithOptionsFromTNS() {
@@ -204,13 +185,7 @@ export function test_parse_ShouldResolveExportsFromCodeFileForTemplates() {
};
helper.navigate(function () { return p; });
try {
testAction([p.content, p]);
}
finally {
helper.goBack();
}
testAction([p.content, p]);
}
export function test_parse_css_is_applied_by_type_to_lower_case_dashed_components() {
@@ -222,12 +197,7 @@ export function test_parse_css_is_applied_by_type_to_lower_case_dashed_component
helper.navigate(pageFactory);
TKUnit.assert(newPage.isLoaded, "The page should be loaded here.");
try {
helper.assertViewBackgroundColor(newPage.content, "#008000");
}
finally {
helper.goBack();
}
helper.assertViewBackgroundColor(newPage.content, "#008000");
};
export function test_parse_ShouldApplyCssFromCssFile() {
@@ -239,12 +209,7 @@ export function test_parse_ShouldApplyCssFromCssFile() {
helper.navigate(pageFactory);
TKUnit.assert(newPage.isLoaded, "The page should be loaded here.");
try {
helper.assertViewBackgroundColor(newPage.content, "#008000");
}
finally {
helper.goBack();
}
helper.assertViewBackgroundColor(newPage.content, "#008000");
};
export function test_parse_ShouldResolveExportsFromCodeFileAndApplyCssFile() {
@@ -257,12 +222,7 @@ export function test_parse_ShouldResolveExportsFromCodeFileAndApplyCssFile() {
helper.navigate(pageFactory);
TKUnit.assert(newPage.isLoaded, "The page should be loaded here.");
TKUnit.assert((<any>newPage).customCodeLoaded, "Parse should resolve exports from custom code file.");
try {
helper.assertViewBackgroundColor(newPage.content, "#008000");
}
finally {
helper.goBack();
}
helper.assertViewBackgroundColor(newPage.content, "#008000");
};
export function test_parse_ShouldFindEventHandlersInExports() {
@@ -274,7 +234,7 @@ export function test_parse_ShouldFindEventHandlersInExports() {
});
page._emit("loaded");
TKUnit.assert(loaded, "Parse should find event handlers in exports.");
TKUnit.assertTrue(loaded, "Parse should find event handlers in exports.");
};
export function test_parse_ShouldFindEventHandlersWithOnInExports() {
@@ -286,7 +246,7 @@ export function test_parse_ShouldFindEventHandlersWithOnInExports() {
});
page._emit("loaded");
TKUnit.assert(loaded, "Parse should find event handlers in exports.");
TKUnit.assertTrue(loaded, "Parse should find event handlers in exports.");
};
export function test_parse_ShouldSetGridAttachedProperties() {
@@ -295,16 +255,16 @@ export function test_parse_ShouldSetGridAttachedProperties() {
var child = grid.getChildAt(0);
var col = gridLayoutModule.GridLayout.getColumn(child);
TKUnit.assert(col === 2, "Expected result for grid column: 2; Actual result: " + col + ";");
TKUnit.assertEqual(col, 2, "Expected result for grid column: 2; Actual result: " + col + ";");
var row = gridLayoutModule.GridLayout.getRow(child);
TKUnit.assert(row === 1, "Expected result for grid row: 1; Actual result: " + row + ";");
TKUnit.assertEqual(row, 1, "Expected result for grid row: 1; Actual result: " + row + ";");
var colSpan = gridLayoutModule.GridLayout.getColumnSpan(child);
TKUnit.assert(colSpan === 4, "Expected result for grid column span: 4; Actual result: " + colSpan + ";");
TKUnit.assertEqual(colSpan, 4, "Expected result for grid column span: 4; Actual result: " + colSpan + ";");
var rowSpan = gridLayoutModule.GridLayout.getRowSpan(child);
TKUnit.assert(rowSpan === 3, "Expected result for grid row span: 3; Actual result: " + rowSpan + ";");
TKUnit.assertEqual(rowSpan, 3, "Expected result for grid row span: 3; Actual result: " + rowSpan + ";");
};
export function test_parse_ShouldSetCanvasAttachedProperties() {
@@ -313,23 +273,23 @@ export function test_parse_ShouldSetCanvasAttachedProperties() {
var child = grid.getChildAt(0);
var left = absoluteLayoutModule.AbsoluteLayout.getLeft(child);
TKUnit.assert(left === 1, "Expected result for canvas left: 1; Actual result: " + left + ";");
TKUnit.assertEqual(left, 1, "Expected result for canvas left: 1; Actual result: " + left + ";");
var top = absoluteLayoutModule.AbsoluteLayout.getTop(child);
TKUnit.assert(top === 2, "Expected result for canvas top: 2; Actual result: " + top + ";");
TKUnit.assertEqual(top, 2, "Expected result for canvas top: 2; Actual result: " + top + ";");
};
export function test_parse_ShouldParseNumberProperties() {
var p = <Page>builder.parse("<Page width='100' />");
TKUnit.assert(p.width === 100, "Expected result: 100; Actual result: " + p.width + "; type: " + typeof (p.width));
TKUnit.assertEqual(p.width, 100, "Expected result: 100; Actual result: " + p.width + "; type: " + typeof (p.width));
};
export function test_parse_ShouldParseBooleanProperties() {
var p = <Page>builder.parse("<Page><Switch checked='true' /></Page>");
var sw = <switchModule.Switch>p.content;
TKUnit.assert(sw.checked === true, "Expected result: true; Actual result: " + sw.checked + "; type: " + typeof (sw.checked));
TKUnit.assertTrue(sw.checked, "Expected result: true; Actual result: " + sw.checked + "; type: " + typeof (sw.checked));
};
export function test_parse_ShouldParseBooleanPropertiesIgnoreCase() {
@@ -343,7 +303,7 @@ export function test_parse_ShouldParseBooleanPropertiesIgnoreCaseInverted() {
var p = <Page>builder.parse("<Page><TextField editable='False' /></Page>");
var tf = <textFieldModule.TextField>p.content;
TKUnit.assert(tf.editable === false, "Expected result: false; Actual result: " + tf.editable + "; type: " + typeof (tf.editable));
TKUnit.assertFalse(tf.editable, "Expected result: false; Actual result: " + tf.editable + "; type: " + typeof (tf.editable));
};
export function test_parse_ShouldParsePlatformSpecificProperties() {
@@ -351,9 +311,9 @@ export function test_parse_ShouldParsePlatformSpecificProperties() {
var tf = <textFieldModule.TextField>p.content;
if (platform.device.os === platform.platformNames.ios) {
TKUnit.assert(tf.editable === false, "Expected result: false; Actual result: " + tf.editable + "; type: " + typeof (tf.editable));
TKUnit.assertFalse(tf.editable, "Expected result: false; Actual result: " + tf.editable + "; type: " + typeof (tf.editable));
} else {
TKUnit.assert(tf.editable === true, "Expected result: true; Actual result: " + tf.editable + "; type: " + typeof (tf.editable));
TKUnit.assertTrue(tf.editable, "Expected result: true; Actual result: " + tf.editable + "; type: " + typeof (tf.editable));
}
};
@@ -383,7 +343,7 @@ export function test_parse_ShouldParseBindings() {
p.bindingContext = { myProp: true };
var sw = <switchModule.Switch>p.content;
TKUnit.assert(sw.checked === true, "Expected result: true; Actual result: " + sw.checked + "; type: " + typeof (sw.checked));
TKUnit.assertTrue(sw.checked, "Expected result: true; Actual result: " + sw.checked + "; type: " + typeof (sw.checked));
};
export function test_parse_ShouldParseBindingsWithObservable() {
@@ -393,11 +353,11 @@ export function test_parse_ShouldParseBindingsWithObservable() {
p.bindingContext = obj;
var sw = <switchModule.Switch>p.content;
TKUnit.assert(sw.checked === true, "Expected result: true; Actual result: " + sw.checked + "; type: " + typeof (sw.checked));
TKUnit.assertTrue(sw.checked, "Expected result: true; Actual result: " + sw.checked + "; type: " + typeof (sw.checked));
obj.set("myProp", false);
TKUnit.assert(sw.checked === false, "Expected result: false; Actual result: " + sw.checked + "; type: " + typeof (sw.checked));
TKUnit.assertFalse(sw.checked, "Expected result: false; Actual result: " + sw.checked + "; type: " + typeof (sw.checked));
};
export function test_parse_ShouldParseBindingsToEvents() {
@@ -592,68 +552,48 @@ export function test_parse_ShouldParseCustomComponentWithoutXmlInListViewTemplat
var p = <Page>builder.parse('<Page xmlns:customControls="xml-declaration/mymodule"><ListView items="{{ items }}" itemLoading="{{ itemLoading }}"><ListView.itemTemplate><customControls:MyControl /></ListView.itemTemplate></ListView></Page>');
function testAction(views: Array<viewModule.View>) {
var ctrl;
var obj = new observable.Observable();
let ctrl;
let obj = new observable.Observable();
obj.set("items", [1]);
obj.set("itemLoading", function (args: listViewModule.ItemEventData) {
ctrl = args.view
});
p.bindingContext = obj;
TKUnit.wait(0.2);
TKUnit.waitUntilReady(() => ctrl);
TKUnit.assert(ctrl instanceof myCustomControlWithoutXml.MyControl, "Expected result: custom control is defined!; Actual result: " + ctrl);
};
helper.navigate(function () { return p; });
try {
testAction([p.content, p]);
}
finally {
helper.goBack();
}
testAction([p.content, p]);
}
export function test_parse_ShouldParseNestedListViewInListViewTemplate() {
var p = <Page>builder.parse('<Page xmlns="http://schemas.nativescript.org/tns.xsd"><ListView items="{{ items }}" itemLoading="{{ itemLoading }}"><ListView.itemTemplate><ListView items="{{ subItems }}" /></ListView.itemTemplate></ListView></Page>');
function testAction(views: Array<viewModule.View>) {
var ctrl;
var obj = new observable.Observable();
let ctrl;
let obj = new observable.Observable();
obj.set("items", [{ subItems: [1] }]);
obj.set("itemLoading", function (args: listViewModule.ItemEventData) {
ctrl = args.view
});
p.bindingContext = obj;
TKUnit.wait(0.2);
TKUnit.waitUntilReady(() => ctrl);
TKUnit.assert(ctrl instanceof listViewModule.ListView, "Expected result: ListView!; Actual result: " + ctrl);
};
helper.navigate(function () { return p; });
try {
testAction([p.content, p]);
}
finally {
helper.goBack();
}
testAction([p.content, p]);
}
export function test_parse_ShouldEvaluateEventBindingExpressionInListViewTemplate() {
var p = <Page>builder.parse('<Page xmlns="http://schemas.nativescript.org/tns.xsd"><ListView items="{{ items }}" itemLoading="{{ itemLoading }}"><ListView.itemTemplate><SegmentedBar items="{{ $parents[\'ListView\'].items }}" selectedIndexChanged="{{ $parents[\'ListView\'].changed }}" /></ListView.itemTemplate></ListView></Page>');
function testAction(views: Array<viewModule.View>) {
var ctrl: segmentedBar.SegmentedBar;
var changed;
var obj = new observable.Observable();
let ctrl: segmentedBar.SegmentedBar = null;
let changed;
let obj = new observable.Observable();
obj.set("items", [1, 2, 3]);
obj.set("itemLoading", function (args: listViewModule.ItemEventData) {
ctrl = <segmentedBar.SegmentedBar>args.view
});
@@ -663,22 +603,14 @@ export function test_parse_ShouldEvaluateEventBindingExpressionInListViewTemplat
});
p.bindingContext = obj;
TKUnit.wait(0.2);
TKUnit.waitUntilReady(() => ctrl !== null);
ctrl.selectedIndex = 1;
TKUnit.assert(changed, "Expected result: true!; Actual result: " + changed);
};
helper.navigate(function () { return p; });
try {
testAction([p.content, p]);
}
finally {
helper.goBack();
}
testAction([p.content, p]);
}
export function test_parse_NestedRepeaters() {
@@ -725,13 +657,7 @@ export function test_parse_NestedRepeaters() {
};
helper.navigate(function () { return p; });
try {
testAction([p.content, p]);
}
finally {
helper.goBack();
}
testAction([p.content, p]);
}
export function test_parseSpansDirectlyOnLabel() {
@@ -744,12 +670,7 @@ export function test_parseSpansDirectlyOnLabel() {
}
helper.navigate(function () { return p; });
try {
testAction([p]);
}
finally {
helper.goBack();
}
testAction([p]);
}
export function test_parseSpansDirectlyOnButton() {
@@ -762,12 +683,7 @@ export function test_parseSpansDirectlyOnButton() {
}
helper.navigate(function () { return p; });
try {
testAction([p]);
}
finally {
helper.goBack();
}
testAction([p]);
}
export function test_parseFormattedStringWithoutFormattedText() {
@@ -780,12 +696,7 @@ export function test_parseFormattedStringWithoutFormattedText() {
}
helper.navigate(function () { return p; });
try {
testAction([p]);
}
finally {
helper.goBack();
}
testAction([p]);
}
export function test_parseFormattedStringFullSyntax() {
@@ -798,12 +709,7 @@ export function test_parseFormattedStringFullSyntax() {
}
helper.navigate(function () { return p; });
try {
testAction([p]);
}
finally {
helper.goBack();
}
testAction([p]);
}
export function test_parseSpansDirectlyToFormattedString() {
@@ -816,12 +722,7 @@ export function test_parseSpansDirectlyToFormattedString() {
}
helper.navigate(function () { return p; });
try {
testAction([p]);
}
finally {
helper.goBack();
}
testAction([p]);
}
export function test_searchbar_donotcrash_whentext_isempty() {
@@ -844,7 +745,7 @@ export function test_parse_template_property() {
var templateView = <TemplateView>page.getViewById("template-view");
TKUnit.assert(templateView, "Expected TemplateView.");
TKUnit.assert(templateView.template, "Expected the template of the TemplateView to be defined");
TKUnit.assertEqual(templateView.getChildrenCount(), 0, "Expected TemplateView initially to have no children.");
templateView.parseTemplate();
TKUnit.assertEqual(templateView.getChildrenCount(), 1, "Expected TemplateView initially to have 1 child.");
@@ -855,46 +756,46 @@ export function test_parse_template_property() {
export function test_NonExistingElementError() {
var basePath = "xml-declaration/";
var expectedErrorStart =
"Building UI from XML. @file:///app/" + basePath + "errors/non-existing-element.xml:11:5\n" +
" ↳Module 'ui/unicorn' not found for element 'Unicorn'.";
var message;
try {
builder.load(__dirname + "/errors/non-existing-element.xml");
} catch(e) {
message = e.message;
}
TKUnit.assertEqual(message.substr(0, expectedErrorStart.length), expectedErrorStart, "Expected load to throw, and the message to start with specific string");
var expectedErrorStart =
"Building UI from XML. @file:///app/" + basePath + "errors/non-existing-element.xml:11:5\n" +
" ↳Module 'ui/unicorn' not found for element 'Unicorn'.";
var message;
try {
builder.load(__dirname + "/errors/non-existing-element.xml");
} catch (e) {
message = e.message;
}
TKUnit.assertEqual(message.substr(0, expectedErrorStart.length), expectedErrorStart, "Expected load to throw, and the message to start with specific string");
}
export function test_NonExistingElementInTemplateError() {
var basePath = "xml-declaration/";
var expectedErrorStart =
"Building UI from XML. @file:///app/" + basePath + "errors/non-existing-element-in-template.xml:14:17\n" +
" ↳Module 'ui/unicorn' not found for element 'Unicorn'.";
var message;
var expectedErrorStart =
"Building UI from XML. @file:///app/" + basePath + "errors/non-existing-element-in-template.xml:14:17\n" +
" ↳Module 'ui/unicorn' not found for element 'Unicorn'.";
var message;
var page = builder.load(__dirname + "/errors/non-existing-element-in-template.xml");
TKUnit.assert(view, "Expected the xml to generate a page");
var templateView = <TemplateView>page.getViewById("template-view");
TKUnit.assert(templateView, "Expected the page to have a TemplateView with 'temaplte-view' id.");
try {
try {
templateView.parseTemplate();
} catch(e) {
message = e.message;
}
TKUnit.assertEqual(message.substr(0, expectedErrorStart.length), expectedErrorStart, "Expected load to throw, and the message to start with specific string");
} catch (e) {
message = e.message;
}
TKUnit.assertEqual(message.substr(0, expectedErrorStart.length), expectedErrorStart, "Expected load to throw, and the message to start with specific string");
}
export function test_EventInTemplate() {
var pageCode = require("./template-builder-tests/event-in-template");
var notified = false;
pageCode.test = (args) => {
notified = true;
}
var page = builder.load(__dirname + "/template-builder-tests/event-in-template.xml", pageCode);
var page = builder.load(__dirname + "/template-builder-tests/event-in-template.xml", pageCode);
TKUnit.assert(view, "Expected the xml to generate a page");
var templateView = <TemplateView>page.getViewById("template-view");
TKUnit.assert(templateView, "Expected the page to have a TemplateView with 'temaplte-view' id.");
@@ -906,19 +807,19 @@ export function test_EventInTemplate() {
eventName: "test",
object: childTemplateView
});
TKUnit.assert(notified, "Expected the child to raise the test event.");
}
export function test_EventInCodelessFragment() {
var pageCode = require("./template-builder-tests/event-in-codeless-fragment");
var notified = false;
pageCode.test = (args) => {
notified = true;
}
var page = builder.load(__dirname + "/template-builder-tests/event-in-codeless-fragment.xml", pageCode);
var page = builder.load(__dirname + "/template-builder-tests/event-in-codeless-fragment.xml", pageCode);
TKUnit.assert(view, "Expected the xml to generate a page");
var templateView = <TemplateView>page.getViewById("template-view");
TKUnit.assert(templateView, "Expected the page to have a TemplateView with 'temaplte-view' id.");
@@ -930,27 +831,27 @@ export function test_EventInCodelessFragment() {
eventName: "test",
object: childTemplateView
});
TKUnit.assert(notified, "Expected the child to raise the test event.");
}
export function test_tabview_selectedindex_will_work_from_xml() {
var p = <Page>builder.parse(
'<Page>' +
'<TabView selectedIndex= "1">' +
'<TabView.items>'+
'<TabViewItem title="First">' +
'<TabViewItem.view>' +
'<Label text="First View" />' +
'</TabViewItem.view>' +
'</TabViewItem>' +
'<TabViewItem title= "Second">' +
'<TabViewItem.view>' +
'<Label text="Second View" />' +
'</TabViewItem.view>' +
'</TabViewItem>' +
'</TabView.items>' +
'</TabView>' +
'<TabView selectedIndex= "1">' +
'<TabView.items>' +
'<TabViewItem title="First">' +
'<TabViewItem.view>' +
'<Label text="First View" />' +
'</TabViewItem.view>' +
'</TabViewItem>' +
'<TabViewItem title= "Second">' +
'<TabViewItem.view>' +
'<Label text="Second View" />' +
'</TabViewItem.view>' +
'</TabViewItem>' +
'</TabView.items>' +
'</TabView>' +
'</Page>');
function testAction(views: Array<viewModule.View>) {
@@ -962,17 +863,11 @@ export function test_tabview_selectedindex_will_work_from_xml() {
};
helper.navigate(function () { return p; });
try {
testAction([p.content, p]);
}
finally {
helper.goBack();
}
testAction([p.content, p]);
}
export function test_TabViewHasCorrectParentChain() {
var testFunc = function(page: Page) {
var testFunc = function (page: Page) {
TKUnit.assert(page.bindingContext.get("testPassed"));
}
var moduleName = __dirname.substr(fs.knownFolders.currentApp().path.length);
@@ -990,4 +885,4 @@ export function test_hasSourceCodeLocations() {
var label = page.getViewById("label");
var labelSource = Source.get(label);
TKUnit.assertEqual(labelSource.toString(), "file:///app/" + basePath + "examples/test-page.xml:3:5");
}
}