// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
//
///
///
///
///
module WinJSTests {
"use strict";
var util = NavigationUtils;
var nav = WinJS.Navigation;
function unHandledError(error) {
LiveUnit.Assert.fail("unHandledError: ");
}
function verifyOnScreen(element) {
var assert = LiveUnit.Assert;
assert.isTrue(document.body.contains(element));
var rects = element.getClientRects();
assert.areEqual(1, rects.length);
var rect = rects[0];
assert.isTrue(rect.left >= 0);
assert.isTrue(rect.top >= 0);
assert.isTrue(rect.right > 0);
assert.isTrue(rect.bottom > 0);
// we also need to make sure it is in the parentRect, so it is fully onScreen
var parentRects = element.parentNode.getClientRects();
assert.areEqual(1, parentRects.length);
var parentRect = parentRects[0];
assert.isTrue(parentRect.left >= 0);
assert.isTrue(parentRect.top >= 0);
assert.isTrue(parentRect.right > 0);
assert.isTrue(parentRect.bottom > 0);
assert.isTrue(parentRect.left <= rect.left);
assert.isTrue(parentRect.top <= rect.top);
assert.isTrue(parentRect.right >= rect.right);
assert.isTrue(parentRect.bottom >= rect.bottom);
}
var inPageBackButtonContainerSelector = "#backButtonContainer";
var inPageNextPageButtonSelector = "#nextPage";
var inPageRandomPageButtonSelector = "#randomPage";
var inPageIndexSelector = "#pageIndex";
var _element;
var _pageControl = null;
var _backButtonContainer = null;
var _nextPageButton = null;
var _randomPageButton = null;
var _pageIndex;
function _initialize() {
return util.createPageControl(_element).then(function (pageControl) {
_pageControl = pageControl;
_loadPageControlContent();
});
}
function _loadPageControlContent() {
_backButtonContainer = _pageControl._element.querySelector(inPageBackButtonContainerSelector);
_nextPageButton = _pageControl._element.querySelector(inPageNextPageButtonSelector);
_randomPageButton = _pageControl._element.querySelector(inPageRandomPageButtonSelector);
_pageIndex = parseInt(_pageControl._element.querySelector(inPageIndexSelector).textContent);
}
function helper_createBackButton(type?) {
_loadPageControlContent();
if (type == "HTML") {
return util.createBackButtonWithHTML(_backButtonContainer);
} else {
return util.createBackButtonWithJS(_backButtonContainer);
}
}
function helper_NavigateToPage(index) {
return nav.navigate(_pageControl.home, { pageIndex: index });
}
function helper_VerifyCurrentPageIndex(index) {
_loadPageControlContent();
LiveUnit.Assert.areEqual(index, _pageIndex);
return WinJS.Promise.wrap();
}
function helper_VerifyNavigatedToPage(action, index) {
return new WinJS.Promise(function (complete) {
var completed = false;
var listener = function () {
_loadPageControlContent();
nav.removeEventListener("navigated", listener);
LiveUnit.Assert.areEqual(index, _pageIndex);
completed = true;
complete();
};
nav.addEventListener("navigated", listener);
WinJS.Promise.timeout(2000).then(function () {
if (!completed) {
nav.removeEventListener("navigated", listener);
LiveUnit.Assert.fail("Navigation didn't happen");
}
});
action();
});
}
function helper_VerifyNoNavigationHappened(action) {
return new WinJS.Promise(function (complete) {
var completed = false;
var listener = function () {
if (!completed) {
nav.removeEventListener("navigated", listener);
LiveUnit.Assert.fail("Navigation happened which is not expected");
}
};
nav.addEventListener("navigated", listener);
WinJS.Promise.timeout(2000).then(function () {
nav.removeEventListener("navigated", listener);
completed = true;
complete();
});
action();
});
};
export class BackButtonTests {
setUp() {
LiveUnit.LoggingCore.logComment("In setup");
var newNode = document.createElement("div");
newNode.id = "BackButtonTests";
document.body.appendChild(newNode);
_element = newNode;
}
tearDown() {
LiveUnit.LoggingCore.logComment("In tearDown");
if (_element) {
WinJS.Utilities.disposeSubTree(_element);
document.body.removeChild(_element);
_element = null;
}
nav.history = {
backStack: null,
forwardStack: null,
current: null,
};
_pageControl = null;
_backButtonContainer = null;
_nextPageButton = null;
_randomPageButton = null;
}
test_existence_createInPageControlHTML = function BackButtonTests_test_existence_createInPageControlHTML(complete) {
_initialize().then(function () {
util.createBackButtonWithHTML(_backButtonContainer).then(function (backButton) {
verifyOnScreen(backButton._element);
complete();
});
});
};
test_existence_createInPageControlJS = function BackButtonTests_test_existence_createInPageControlJS(complete) {
_initialize().then(function () {
util.createBackButtonWithJS(_backButtonContainer).then(function (backButton) {
verifyOnScreen(backButton._element);
complete();
});
});
};
test_existence_createOutOfPageControlHTML = function BackButtonTests_test_existence_createOutOfPageControlHTML(complete) {
_initialize().then(function () {
util.createBackButtonWithHTML(_element).then(function (backButton) {
verifyOnScreen(backButton._element);
complete();
});
});
};
test_existence_createOutOfPageControlJS = function BackButtonTests_test_existence_createOutOfPageControlJS(complete) {
_initialize().then(function () {
util.createBackButtonWithJS(_element).then(function (backButton) {
verifyOnScreen(backButton._element);
complete();
});
});
};
test_styling_className = function BackButtonTests_test_styling_className(complete) {
_initialize().then(function () {
util.createBackButtonWithJS(_backButtonContainer).then(function (backButton) {
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(backButton._element, "win-navigation-backbutton"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(backButton._element.childNodes[0], "win-back"));
complete();
});
});
};
test_interaction_click = function BackButtonTests_test_interaction_click(complete) {
_initialize().then(function () {
return helper_NavigateToPage(1);
}).then(function () {
return helper_VerifyCurrentPageIndex(1);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 0);
}).then(complete, unHandledError);
};
test_interaction_click_nothingInHistory = function BackButtonTests_test_interaction_click_nothingInHistory(complete) {
_initialize().then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNoNavigationHappened(function () { backButton._element.click(); });
}).then(complete, unHandledError);
};
test_interaction_click_3times = function BackButtonTests_test_interaction_click_3times(complete) {
_initialize().then(function () {
return helper_NavigateToPage(1);
}).then(function () {
return helper_VerifyCurrentPageIndex(1);
}).then(function () {
return helper_NavigateToPage(2);
}).then(function () {
return helper_VerifyCurrentPageIndex(2);
}).then(function () {
return helper_NavigateToPage(3);
}).then(function () {
return helper_VerifyCurrentPageIndex(3);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 2);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 1);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 0);
}).then(complete, unHandledError);
};
test_interaction_click_3times_but2available = function BackButtonTests_test_interaction_click_3times_but2available(complete) {
_initialize().then(function () {
return helper_NavigateToPage(1);
}).then(function () {
return helper_VerifyCurrentPageIndex(1);
}).then(function () {
return helper_NavigateToPage(2);
}).then(function () {
return helper_VerifyCurrentPageIndex(2);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 1);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 0);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNoNavigationHappened(function () { backButton._element.click(); });
}).then(complete, unHandledError);
};
test_userWorkflow = function BackButtonTests_test_userWorkflow(complete) {
_initialize().then(function () {
return helper_NavigateToPage(1);
}).then(function () {
return helper_VerifyCurrentPageIndex(1);
}).then(function () {
return helper_NavigateToPage(2);
}).then(function () {
return helper_VerifyCurrentPageIndex(2);
}).then(function () {
return helper_NavigateToPage(3);
}).then(function () {
return helper_VerifyCurrentPageIndex(3);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 2);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 1);
}).then(function () {
return helper_NavigateToPage(4);
}).then(function () {
return helper_VerifyCurrentPageIndex(4);
}).then(function () {
return helper_NavigateToPage(5);
}).then(function () {
return helper_VerifyCurrentPageIndex(5);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 4);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 1);
}).then(function () {
return helper_createBackButton();
}).then(function (backButton) {
return helper_VerifyNavigatedToPage(function () { backButton._element.click(); }, 0);
}).then(complete, unHandledError);
};
}
}
LiveUnit.registerTestClass("WinJSTests.BackButtonTests");