// 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 COUNT = 6;
var JUMPSCOUNT = 10;
var FlipView = WinJS.UI.FlipView;
function narratorScrollChangedTest(element, flipview, rawData, complete) {
var tests = [
function () {
LiveUnit.Assert.areEqual(0, flipview.currentPage);
if (flipview.orientation === "horizontal") {
var scrollPosition = WinJS.Utilities.getScrollPosition(flipview._panningDivContainer);
scrollPosition.scrollLeft += 400;
WinJS.Utilities.setScrollPosition(flipview._panningDivContainer, scrollPosition);
} else {
flipview._panningDivContainer.scrollTop += 400;
}
// This should trigger a scroll position changed, and eventually
// a pageselected event. This simulates the 1-finger swipe
// scenario with the narrator touch
},
function () {
LiveUnit.Assert.areEqual(1, flipview.currentPage);
flipview.currentPage = 0;
},
function () {
LiveUnit.Assert.areEqual(0, flipview.currentPage);
complete();
}
];
runFlipViewTests(flipview, tests);
}
function verifyDisplayedItem(flipView, rawData) {
LiveUnit.LoggingCore.logComment("Verifying displayed page is correct");
LiveUnit.Assert.isTrue(currentPageInView(flipView));
flipView.itemTemplate.verifyOutput(getDisplayedElement(flipView), rawData);
}
function navigationTest(element, flipView, rawData, complete) {
var tests = [];
for (var i = 0; i < COUNT - 1; i++) {
var getWrappedNext = function getWrappedNext(targetIndex) {
return function () {
LiveUnit.LoggingCore.logComment("Should be at " + targetIndex);
LiveUnit.Assert.areEqual(targetIndex, flipView.currentPage);
verifyDisplayedItem(flipView, rawData[targetIndex]);
LiveUnit.LoggingCore.logComment("Flipping ahead");
LiveUnit.Assert.isTrue(flipView.next());
}
};
tests.push(getWrappedNext(i));
}
tests.push(function () {
LiveUnit.LoggingCore.logComment("Should now be at end, flipView.next should fail");
LiveUnit.Assert.areEqual(COUNT - 1, flipView.currentPage);
verifyDisplayedItem(flipView, rawData[COUNT - 1]);
LiveUnit.Assert.isFalse(flipView.next());
return true;
});
for (var i = COUNT - 1; i > 0; i--) {
var getWrappedPrevious = function getWrappedPrevious(targetIndex) {
return function () {
LiveUnit.LoggingCore.logComment("Should be at " + targetIndex);
LiveUnit.Assert.areEqual(targetIndex, flipView.currentPage);
verifyDisplayedItem(flipView, rawData[targetIndex]);
LiveUnit.LoggingCore.logComment("Flipping back");
LiveUnit.Assert.isTrue(flipView.previous());
}
};
tests.push(getWrappedPrevious(i));
}
tests.push(function () {
LiveUnit.LoggingCore.logComment("Should now be at beginning, flipView.previous should fail");
LiveUnit.Assert.areEqual(0, flipView.currentPage);
verifyDisplayedItem(flipView, rawData[0]);
LiveUnit.Assert.isFalse(flipView.previous());
complete();
});
runFlipViewTests(flipView, tests);
}
function jumpToTest(element, flipView, rawData, complete) {
var tests = [],
lastIndex = 0;
for (var i = 0; i < JUMPSCOUNT; i++) {
var getWrappedJump = function getWrappedJump(targetIndex, lastIndex) {
return function () {
// Validate aria-flowto attributes
var curr = flipView._pageManager._currentPage;
LiveUnit.Assert.areEqual(flipView._pageManager._bufferAriaStartMarker.getAttribute("aria-flowto"), curr.element.id);
var next = curr.next;
if (next && next.element) {
LiveUnit.Assert.areEqual(curr.element.getAttribute("aria-flowto"), next.element.id);
LiveUnit.Assert.areEqual(next.element.getAttribute("x-ms-aria-flowfrom"), curr.element.id);
var nextOfNext = curr.next.next;
if (nextOfNext && nextOfNext.element) {
LiveUnit.Assert.areEqual(next.element.getAttribute("aria-flowto"), nextOfNext.element.id);
LiveUnit.Assert.areEqual(nextOfNext.element.getAttribute("x-ms-aria-flowfrom"), next.element.id);
LiveUnit.Assert.areEqual(nextOfNext.element.getAttribute("aria-flowto"), flipView._pageManager._bufferAriaEndMarker.id);
}
}
var prev = curr.prev;
if (prev && prev.element) {
LiveUnit.Assert.areEqual(prev.element.getAttribute("aria-flowto"), curr.element.id);
LiveUnit.Assert.areEqual(curr.element.getAttribute("x-ms-aria-flowfrom"), prev.element.id);
var prevOfPrev = curr.prev.prev;
if (prevOfPrev && prevOfPrev.element) {
LiveUnit.Assert.areEqual(prevOfPrev.element.getAttribute("aria-flowto"), prev.element.id);
LiveUnit.Assert.areEqual(prev.element.getAttribute("x-ms-aria-flowfrom"), prevOfPrev.element.id);
}
}
LiveUnit.LoggingCore.logComment("Should be at " + lastIndex);
LiveUnit.Assert.areEqual(lastIndex, flipView.currentPage);
verifyDisplayedItem(flipView, rawData[lastIndex]);
LiveUnit.LoggingCore.logComment("Flipping to " + targetIndex);
flipView.currentPage = targetIndex;
return targetIndex === lastIndex;
}
};
var nextIndex = pseudorandom(COUNT);
tests.push(getWrappedJump(nextIndex, lastIndex));
lastIndex = nextIndex;
}
tests.push(function () {
if (flipView.currentPage === 0) {
return true;
}
flipView.currentPage = 0;
});
tests.push(function () {
flipView.currentPage = COUNT + 1;
});
tests.push(function () {
LiveUnit.Assert.areEqual(COUNT - 1, flipView.currentPage);
verifyDisplayedItem(flipView, rawData[COUNT - 1]);
flipView.currentPage = -9999;
});
tests.push(function () {
LiveUnit.Assert.areEqual(0, flipView.currentPage);
verifyDisplayedItem(flipView, rawData[0]);
complete();
});
runFlipViewTests(flipView, tests);
}
export class FlipViewNavigationTests {
setUp() {
LiveUnit.LoggingCore.logComment("In setup");
var newNode = document.createElement("div");
newNode.id = "BasicFlipView";
newNode.style.width = "400px";
newNode.style.height = "400px";
document.body.appendChild(newNode);
}
tearDown() {
LiveUnit.LoggingCore.logComment("In tearDown");
var element = document.getElementById("BasicFlipView");
if (element) {
WinJS.Utilities.disposeSubTree(element);
document.body.removeChild(element);
}
}
testZoombieFlipViewDuringNavigation(complete) {
var element = document.getElementById("BasicFlipView"),
testData = createArraySource(COUNT, ["400px"], ["400px"]),
rawData = testData.rawData,
flipView = new WinJS.UI.FlipView(element, { itemDataSource: testData.dataSource, itemTemplate: basicInstantRenderer });
flipView.addEventListener("pageselected", function pageSelectedHandler() {
flipView.removeEventListener("pageselected", pageSelectedHandler);
LiveUnit.Assert.areEqual(0, flipView.currentPage);
flipView.currentPage = 3;
flipView.element.textContent = null;
//Ensure that we don't get a JS exception when the animation completes
setTimeout(complete, WinJS.UI._animationTimeAdjustment(1000));
});
}
testCurrentPageDuringNavigationAnimation(complete) {
var element = document.getElementById("BasicFlipView"),
testData = createArraySource(COUNT, ["400px"], ["400px"]),
rawData = testData.rawData,
flipView = new FlipView(element, { itemDataSource: testData.dataSource, itemTemplate: basicInstantRenderer });
flipView.addEventListener("pageselected", function pageSelectedHandler() {
flipView.removeEventListener("pageselected", pageSelectedHandler);
LiveUnit.Assert.areEqual(0, flipView.currentPage);
// Go to the next page, and while it is animating, go back to the previous page. We should
// end up in the first page.
flipView.next();
});
var pageVisibleCount = 0,
pageInvisibleCount = 0;
flipView.addEventListener("pagevisibilitychanged", function pageVisibilityHandler(ev) {
ev.detail.visible ? pageVisibleCount++ : pageInvisibleCount++;
if (pageInvisibleCount === 2) {
LiveUnit.Assert.areEqual(0, flipView.currentPage, "Flipview did not end in the first page");
flipView.removeEventListener("pagevisibilitychanged", pageVisibilityHandler);
complete();
}
WinJS.Utilities.Scheduler.schedule(function () {
if (pageVisibleCount === 1) {
LiveUnit.Assert.isTrue(flipView._animating);
LiveUnit.Assert.areEqual(1, flipView.currentPage);
LiveUnit.Assert.isTrue(flipView._animating);
flipView.previous();
}
}, WinJS.Utilities.Scheduler.Priority.normal);
});
}
};
function generate(name, testFunction) {
function generateTest(orientation) {
FlipViewNavigationTests.prototype[name + "_" + orientation] = function (complete) {
var element = document.getElementById("BasicFlipView"),
testData = createArraySource(COUNT, ["4200px"], ["4200px"]),
rawData = testData.rawData,
flipView;
element.style.width = "4200px";
element.style.height = "4200px";
flipView = new WinJS.UI.FlipView(element, { itemDataSource: testData.dataSource, itemTemplate: basicInstantRenderer, orientation: orientation });
setupQuickAnimations(flipView);
testFunction(element, flipView, rawData, complete);
};
}
generateTest("horizontal");
generateTest("vertical");
}
generate("testFlipViewOn4KDisplay", navigationTest);
function generate2(name, testFunction) {
function generateTest(orientation) {
FlipViewNavigationTests.prototype[name + "_" + orientation] = function (complete) {
var element = document.getElementById("BasicFlipView"),
testData = createArraySource(COUNT, ["400px"], ["400px"]),
rawData = testData.rawData,
flipView = new WinJS.UI.FlipView(element, { itemDataSource: testData.dataSource, itemTemplate: basicInstantRenderer, orientation: orientation });
setupQuickAnimations(flipView);
testFunction(element, flipView, rawData, complete);
};
}
generateTest("horizontal");
generateTest("vertical");
}
generate2("testBasicFlipViewNavigation", navigationTest);
generate2("testJumpToNavigation", jumpToTest);
generate2("testScrollChangedByNarrator", narratorScrollChangedTest);
}
LiveUnit.registerTestClass("WinJSTests.FlipViewNavigationTests");