// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
///
///
///
module CorsicaTests {
"use strict";
export class Nav2Tests {
testNavigationEvents(complete) {
WinJS.Navigation.history = {};
var navHit = false;
var navPromiseHit = false;
var navingHit = false;
var navingPromiseHit = false;
var beforeNavHit = false;
var nav = function (e) {
WinJS.Navigation.removeEventListener("navigated", nav, true);
navHit = true;
LiveUnit.Assert.areEqual("navigated", e.type);
LiveUnit.Assert.areEqual("home", e.detail.location);
LiveUnit.Assert.areEqual(123, e.detail.state.a);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
e.detail.setPromise(WinJS.Promise.timeout(16).then(function () { navPromiseHit = true; }));
};
var naving = function (e) {
WinJS.Navigation.removeEventListener("navigating", naving, true);
navingHit = true;
LiveUnit.Assert.areEqual("navigating", e.type);
LiveUnit.Assert.areEqual("home", e.detail.location);
LiveUnit.Assert.areEqual(123, e.detail.state.a);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
e.detail.setPromise(WinJS.Promise.timeout(16).then(function () { navingPromiseHit = true; }));
};
var beforeNav = function (e) {
WinJS.Navigation.removeEventListener("beforenavigate", beforeNav, true);
LiveUnit.Assert.areEqual("beforenavigate", e.type);
LiveUnit.Assert.areEqual("home", e.detail.location);
LiveUnit.Assert.areEqual(123, e.detail.state.a);
e.detail.setPromise(WinJS.Promise.timeout(16).then(function () { beforeNavHit = true; }));
};
WinJS.Navigation.addEventListener("navigating", naving, true);
WinJS.Navigation.addEventListener("navigated", nav, true);
WinJS.Navigation.addEventListener("beforenavigate", beforeNav, true);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
WinJS.Navigation.navigate("home", { a: 123 }).then(function () {
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
LiveUnit.Assert.isTrue(navingHit);
LiveUnit.Assert.isTrue(navingPromiseHit);
LiveUnit.Assert.isTrue(navHit);
LiveUnit.Assert.isTrue(navPromiseHit);
LiveUnit.Assert.isTrue(beforeNavHit);
var cancelBeforeNav = function (e) {
WinJS.Navigation.removeEventListener("beforenavigate", cancelBeforeNav, true);
e.preventDefault();
};
WinJS.Navigation.addEventListener("beforenavigate", cancelBeforeNav, true);
WinJS.Navigation.navigate("second!").then(function (s) {
LiveUnit.Assert.isFalse(s);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
complete();
});
});
}
testNavigationEventsTyped(complete) {
WinJS.Navigation.history = {};
var navHit = false;
var navPromiseHit = false;
var navingHit = false;
var navingPromiseHit = false;
var beforeNavHit = false;
var nav = function (e) {
WinJS.Navigation.onnavigated = undefined;
navHit = true;
LiveUnit.Assert.areEqual("navigated", e.type);
LiveUnit.Assert.areEqual("home", e.detail.location);
LiveUnit.Assert.areEqual(123, e.detail.state.a);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
e.detail.setPromise(WinJS.Promise.timeout(16).then(function () { navPromiseHit = true; }));
};
var naving = function (e) {
WinJS.Navigation.onnavigating = undefined;
navingHit = true;
LiveUnit.Assert.areEqual("navigating", e.type);
LiveUnit.Assert.areEqual("home", e.detail.location);
LiveUnit.Assert.areEqual(123, e.detail.state.a);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
e.detail.setPromise(WinJS.Promise.timeout(16).then(function () { navingPromiseHit = true; }));
};
var beforeNav = function (e) {
WinJS.Navigation.onbeforenavigate = undefined;
LiveUnit.Assert.areEqual("beforenavigate", e.type);
LiveUnit.Assert.areEqual("home", e.detail.location);
LiveUnit.Assert.areEqual(123, e.detail.state.a);
e.detail.setPromise(WinJS.Promise.timeout(16).then(function () { beforeNavHit = true; }));
};
WinJS.Navigation.onnavigating = naving;
WinJS.Navigation.onnavigated = nav;
WinJS.Navigation.onbeforenavigate = beforeNav;
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
WinJS.Navigation.navigate("home", { a: 123 }).then(function () {
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
LiveUnit.Assert.isTrue(navingHit);
LiveUnit.Assert.isTrue(navingPromiseHit);
LiveUnit.Assert.isTrue(navHit);
LiveUnit.Assert.isTrue(navPromiseHit);
LiveUnit.Assert.isTrue(beforeNavHit);
var cancelBeforeNav = function (e) {
WinJS.Navigation.onbeforenavigate = undefined;
e.preventDefault();
};
WinJS.Navigation.onbeforenavigate = cancelBeforeNav;
WinJS.Navigation.navigate("second!").then(function (s) {
LiveUnit.Assert.isFalse(s);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
complete();
});
});
}
testNavigationErrors(complete) {
WinJS.Navigation.history = {};
var navHit = false;
var navingHit = false;
var navingPromiseHit = false;
var nav = function (e) {
WinJS.Navigation.removeEventListener("navigated", nav, true);
navHit = true;
LiveUnit.Assert.areEqual("navigated", e.type);
LiveUnit.Assert.areEqual("error", e.detail.error);
LiveUnit.Assert.areEqual("home", e.detail.location);
LiveUnit.Assert.areEqual(123, e.detail.state.a);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
};
var naving = function (e) {
WinJS.Navigation.removeEventListener("navigating", naving, true);
navingHit = true;
LiveUnit.Assert.areEqual("navigating", e.type);
LiveUnit.Assert.areEqual("home", e.detail.location);
LiveUnit.Assert.areEqual(123, e.detail.state.a);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
e.detail.setPromise(WinJS.Promise.timeout(16).then(function () { navingPromiseHit = true; throw "error" }));
};
WinJS.Navigation.addEventListener("navigating", naving, true);
WinJS.Navigation.addEventListener("navigated", nav, true);
// error is signaled *before* navigated is raised.
//
WinJS.Navigation.navigate("home", { a: 123 }).
then(
function () {
LiveUnit.Assert.fail("This should not be called!");
},
function (err) {
LiveUnit.Assert.areEqual("error", err);
LiveUnit.Assert.isTrue(navingHit);
LiveUnit.Assert.isTrue(navingPromiseHit);
LiveUnit.Assert.isTrue(navHit); // per WinBlue:136721 "If there is any error from 'navigating' then 'navigated' event should be fired after error is signaled"
complete();
}
);
}
testBasicNavigation(complete) {
WinJS.Navigation.history = {};
WinJS.Navigation.navigate("home", { a: 123 }).then(function () {
;
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location, "first nav location correct");
LiveUnit.Assert.areEqual(123, WinJS.Navigation.state.a, "first nav state correct");
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
return WinJS.Navigation.navigate("a", { a: 321 });
}).then(function () {
LiveUnit.Assert.areEqual("a", WinJS.Navigation.location, "second nav location correct");
LiveUnit.Assert.areEqual(321, WinJS.Navigation.state.a, "second nav state correct");
LiveUnit.Assert.isTrue(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
return WinJS.Navigation.back();
}).then(function () {
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location, "back worked");
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isTrue(WinJS.Navigation.canGoForward);
return WinJS.Navigation.forward();
}).then(function () {
LiveUnit.Assert.areEqual("a", WinJS.Navigation.location, "forward worked");
LiveUnit.Assert.isTrue(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
complete();
});
}
testCanceledNavigation(complete) {
var cancelBeforeNav = function (e) {
e.preventDefault();
};
WinJS.Navigation.history = {};
WinJS.Navigation.navigate("home", { a: 123 });
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
LiveUnit.Assert.areEqual(123, WinJS.Navigation.state.a);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
WinJS.Navigation.navigate("a", { a: 321 });
LiveUnit.Assert.areEqual("a", WinJS.Navigation.location);
LiveUnit.Assert.areEqual(321, WinJS.Navigation.state.a);
LiveUnit.Assert.isTrue(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
WinJS.Navigation.addEventListener("beforenavigate", cancelBeforeNav);
WinJS.Navigation.back().then(function (s) {
LiveUnit.Assert.isFalse(s);
LiveUnit.Assert.areEqual("a", WinJS.Navigation.location);
WinJS.Navigation.removeEventListener("beforenavigate", cancelBeforeNav);
return WinJS.Navigation.back();
}).then(function (s) {
LiveUnit.Assert.isTrue(s);
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
WinJS.Navigation.addEventListener("beforenavigate", cancelBeforeNav);
return WinJS.Navigation.forward();
}).then(function (s) {
LiveUnit.Assert.isFalse(s);
WinJS.Navigation.removeEventListener("beforenavigate", cancelBeforeNav);
complete();
});
}
testStateRoundtrip(complete) {
WinJS.Navigation.history = {};
WinJS.Navigation.navigate("home", { a: 123 });
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
var lastState = WinJS.Navigation.history;
WinJS.Navigation.history = {};
LiveUnit.Assert.areEqual("", WinJS.Navigation.location);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
WinJS.Navigation.history = lastState;
LiveUnit.Assert.areEqual("home", WinJS.Navigation.location);
LiveUnit.Assert.areEqual(123, WinJS.Navigation.state.a);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
complete();
}
testBackForwardDepthTest(complete) {
WinJS.Navigation.history = {};
WinJS.Navigation.navigate("a");
WinJS.Navigation.navigate("b");
WinJS.Navigation.navigate("c");
WinJS.Navigation.navigate("d");
WinJS.Navigation.back();
LiveUnit.Assert.areEqual("c", WinJS.Navigation.location);
WinJS.Navigation.forward();
LiveUnit.Assert.areEqual("d", WinJS.Navigation.location);
WinJS.Navigation.back(2);
LiveUnit.Assert.areEqual("b", WinJS.Navigation.location);
WinJS.Navigation.forward();
LiveUnit.Assert.areEqual("c", WinJS.Navigation.location);
WinJS.Navigation.forward();
LiveUnit.Assert.areEqual("d", WinJS.Navigation.location);
WinJS.Navigation.back(3);
LiveUnit.Assert.areEqual("a", WinJS.Navigation.location);
WinJS.Navigation.forward(2);
LiveUnit.Assert.areEqual("c", WinJS.Navigation.location);
WinJS.Navigation.forward(1);
LiveUnit.Assert.areEqual("d", WinJS.Navigation.location);
WinJS.Navigation.back(1000);
LiveUnit.Assert.areEqual("a", WinJS.Navigation.location);
WinJS.Navigation.forward(1000).then(function () {
LiveUnit.Assert.areEqual("d", WinJS.Navigation.location);
complete();
});
}
testInitialNavigation(complete) {
WinJS.Navigation.history = {
backStack: [],
current: { location: "", initialPlaceholder: true },
forwardStack: []
};
WinJS.Navigation.navigate("a");
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
WinJS.Navigation.history = {};
WinJS.Navigation.navigate("a");
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoBack);
complete();
}
testStateManip(complete) {
WinJS.Navigation.history = {};
WinJS.Navigation.navigate("a", { step: 1 });
WinJS.Navigation.navigate("b", { step: 2 });
WinJS.Navigation.navigate("c", { step: 3 });
LiveUnit.Assert.areEqual("c", WinJS.Navigation.location);
LiveUnit.Assert.areEqual(3, WinJS.Navigation.state.step);
WinJS.Navigation.state = { step: 5 };
LiveUnit.Assert.areEqual(5, WinJS.Navigation.state.step);
WinJS.Navigation.back();
LiveUnit.Assert.areEqual("b", WinJS.Navigation.location);
LiveUnit.Assert.areEqual(2, WinJS.Navigation.state.step);
WinJS.Navigation.state = { step: 4 };
WinJS.Navigation.forward();
LiveUnit.Assert.areEqual("c", WinJS.Navigation.location);
LiveUnit.Assert.areEqual(5, WinJS.Navigation.state.step);
WinJS.Navigation.back();
LiveUnit.Assert.areEqual("b", WinJS.Navigation.location);
LiveUnit.Assert.areEqual(4, WinJS.Navigation.state.step);
complete();
}
testCheckEventErrors(complete) {
WinJS.Navigation.history = {};
var failed1;
var failed2;
try {
WinJS.Navigation.addEventListener("foo", function () { });
failed1 = true;
}
catch (e) {
failed1 = e;
}
try {
WinJS.Navigation.removeEventListener("foo", function () { });
failed2 = true;
}
catch (e) {
failed2 = e;
}
LiveUnit.Assert.areEqual(true, failed1);
LiveUnit.Assert.isTrue(true, failed2);
complete();
}
// use different types for location and state
testTypeAsLocationState() {
WinJS.Navigation.history = {};
// string, number, array, Boolean, Date, regex, function. If you want to add new types, just add them to the array.
var jsTypes = ["string", 2, [1, 2], true, new Date(), /^\d+$/, function () { return 3; }];
// assign different types to location going forward
jsTypes.forEach(function (item, index) {
LiveUnit.Assert.isTrue(WinJS.Navigation.navigate(item, item));
LiveUnit.Assert.isFalse(WinJS.Navigation.canGoForward);
LiveUnit.Assert.areEqual(WinJS.Navigation.canGoBack, index > 0);
});
// now go backwards and verify location == jsType[n]
for (var n = jsTypes.length - 1; n >= 0; n--) {
LiveUnit.Assert.areEqual(jsTypes[n], WinJS.Navigation.location);
LiveUnit.Assert.areEqual(jsTypes[n], WinJS.Navigation.state);
LiveUnit.Assert.areEqual(WinJS.Navigation.canGoForward, n < jsTypes.length - 1);
LiveUnit.Assert.areEqual(WinJS.Navigation.canGoBack, n > 0);
if (WinJS.Navigation.canGoBack) {
LiveUnit.Assert.isTrue(WinJS.Navigation.back());
}
}
}
testBoundaryConditions(complete) {
WinJS.Navigation.history = {};
// going back with empty history should be ignored
WinJS.Navigation.back().then(function (v) {
LiveUnit.Assert.isFalse(v);
// going forward with empty history should be ignored
return WinJS.Navigation.forward();
}).then(function (v) {
LiveUnit.Assert.isFalse(v);
WinJS.Navigation.navigate("a");
WinJS.Navigation.navigate("b");
return WinJS.Navigation.forward();
}).then(function (v) {
// going forward from the end of the history 'b' should be ignored
LiveUnit.Assert.isFalse(v);
WinJS.Navigation.back(1);
// going back from the start of the history 'a' should be ignored
return WinJS.Navigation.back();
}).then(function (v) {
LiveUnit.Assert.isFalse(v);
complete();
});
}
};
}
LiveUnit.registerTestClass("CorsicaTests.Nav2Tests");