// 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 testHost; var lv; function generateListView(host, rowsPerPage, columnsPerPage, pages, options?) { rowsPerPage = Math.max(rowsPerPage | 0, 1); columnsPerPage = Math.max(columnsPerPage | 0, 1); pages = Math.max(pages | 0, 1); options = options || {}; var controlHeight = 600; var controlWidth = 600; //This calculation is accurate for the first page. Starting margins // can cause more columns per page on page 2+ var itemHeight = controlHeight / rowsPerPage - 10; //10px total margin per item var itemWidth = (controlWidth - 70) / columnsPerPage; //70px starting margin function template(itemPromise) { var el = document.createElement("div"); el.style.height = itemHeight + "px"; el.style.width = itemWidth + "px"; itemPromise.then(function (item) { el.textContent = item.index; }); return el; } options.itemTemplate = template; var itemCount = rowsPerPage * columnsPerPage * pages; var myList: any = []; for (var i = 0; i < itemCount; i++) { myList.push({ index: i }); } myList = new WinJS.Binding.List(myList); options.itemDataSource = myList.dataSource; options.layout = new WinJS.UI.ListLayout({ orientation: 'horizontal' }); var lv = new WinJS.UI.ListView(null, options); lv.element.style.height = controlHeight + "px"; lv.element.style.width = controlWidth + "px"; host.appendChild(lv.element); lv['testOptions'] = { rowsPerPage: rowsPerPage, columnsPerPage: columnsPerPage, pages: pages }; return lv; } function checkFirstLastVisible(lv) { LiveUnit.Assert.areEqual(Helper.ListView.Utils.getFirstVisibleElement(lv).querySelector(".win-item").innerHTML, lv.elementFromIndex(lv.indexOfFirstVisible).innerHTML); LiveUnit.Assert.areEqual(Helper.ListView.Utils.getLastVisibleElement(lv).querySelector(".win-item").innerHTML, lv.elementFromIndex(lv.indexOfLastVisible).innerHTML); } function setScrollAndWait(scrollLeft) { var viewport = lv._viewport; return new WinJS.Promise(function (c) { viewport.addEventListener("scroll", function handleScroll() { viewport.removeEventListener("scroll", handleScroll); lv.addEventListener("loadingstatechanged", function handleLoadingState() { if (lv.loadingState === "viewPortLoaded") { lv.removeEventListener("loadingstatechanged", handleLoadingState); c(); } }); }); WinJS.Utilities.setScrollPosition(viewport, { scrollLeft: scrollLeft, scrollTop: 0 }); }); } export class HorizontalListTest { setUp() { LiveUnit.LoggingCore.logComment("In setup"); var newNode = document.createElement("div"); newNode.id = "HorizontalListTest"; newNode.style.width = "600px"; newNode.style.height = "600px"; document.body.appendChild(newNode); testHost = newNode; lv = null; } tearDown() { LiveUnit.LoggingCore.logComment("In tearDown"); var element = document.getElementById("HorizontalListTest"); if (element && document.body.contains(element)) { WinJS.Utilities.disposeSubTree(element); document.body.removeChild(element); } lv = null; } } // Test generator function generateTest(name, testFunction) { var configurations = [ { rowsPerPage: 1, columnsPerPage: 1, pages: 5 }, { rowsPerPage: 1, columnsPerPage: 2, pages: 3 }, { rowsPerPage: 1, columnsPerPage: 3, pages: 5 }, { rowsPerPage: 1, columnsPerPage: 5, pages: 3 }, { rowsPerPage: 1, columnsPerPage: 1, pages: 5 } ]; configurations.forEach(function (options) { var testName = name + "_HList_" + options.rowsPerPage + 'X' + options.columnsPerPage + 'X' + options.pages; HorizontalListTest.prototype[testName] = function (complete) { lv = generateListView(testHost, options.rowsPerPage, options.columnsPerPage, options.pages); testFunction.call(null, complete); }; }); }; // Test cases generateTest("testGetScrollPosition", function (complete) { var viewport = lv.element.querySelector(".win-viewport"); var scrollPositions; var scrollIndex; Helper.ListView.Utils.waitForReady(lv)().done(function () { Helper.asyncWhile(function () { if (!scrollPositions) { var scrollMax = viewport.scrollWidth - viewport.clientWidth; scrollPositions = [50, Math.floor(scrollMax / 2), scrollMax]; scrollIndex = 0; } else { scrollIndex++; } return WinJS.Promise.wrap(scrollIndex < scrollPositions.length); }, function () { return new WinJS.Promise(function (c) { var targetScrollPosition = scrollPositions[scrollIndex]; setScrollAndWait(targetScrollPosition).done(function () { LiveUnit.Assert.areEqual(targetScrollPosition, lv.scrollPosition); c(); }); }); }).done(complete); }); }); generateTest("testSetScrollPosition", function (complete) { var viewport = lv.element.querySelector(".win-viewport"); var scrollMax = 0; var increment = 50; Helper.ListView.Utils.waitForReady(lv)().done(function () { Helper.asyncWhile(function () { scrollMax = viewport.scrollWidth - viewport.clientWidth; return WinJS.Promise.wrap(WinJS.Utilities.getScrollPosition(viewport).scrollLeft < scrollMax); }, function () { return new WinJS.Promise(function (c) { var targetScrollPosition = Math.min(WinJS.Utilities.getScrollPosition(viewport).scrollLeft + increment, scrollMax); lv.scrollPosition = targetScrollPosition; Helper.ListView.Utils.waitForReady(lv)().done(function () { LiveUnit.Assert.areEqual(targetScrollPosition, WinJS.Utilities.getScrollPosition(viewport).scrollLeft); c(); }); }); }).done(complete); }); }); generateTest("testGetIndexOfFirstLastVisible", function (complete) { var viewport = lv.element.querySelector(".win-viewport"); var scrollPositions; var scrollIndex; Helper.ListView.Utils.waitForReady(lv)().done(function () { Helper.asyncWhile(function () { if (!scrollPositions) { var scrollMax = viewport.scrollWidth - viewport.clientWidth; scrollPositions = [50, Math.floor(scrollMax / 2), scrollMax]; scrollIndex = 0; } else { scrollIndex++; } return WinJS.Promise.wrap(scrollIndex < scrollPositions.length); }, function () { return new WinJS.Promise(function (c) { var targetScrollPosition = scrollPositions[scrollIndex]; setScrollAndWait(targetScrollPosition).done(function () { checkFirstLastVisible(lv); c(); }); }); }).done(complete); }); }); generateTest("testSetIndexOfFirstVisible", function (complete) { var columnsPerPage = lv.testOptions.columnsPerPage; var rowsPerPage = lv.testOptions.rowsPerPage; var pages = lv.testOptions.pages; var itemCount = columnsPerPage * rowsPerPage * pages; var maxFirstVisibleIndex = itemCount - ((1 + columnsPerPage) * rowsPerPage); // Skip the last page and 1 column Helper.ListView.Utils.waitForReady(lv)().done(function () { Helper.asyncWhile(function () { return WinJS.Promise.wrap(lv.indexOfFirstVisible < maxFirstVisibleIndex); }, function () { return new WinJS.Promise(function (c) { var expectedIndexOfFirstVisible = Math.min(maxFirstVisibleIndex, Math.max(0, lv.indexOfFirstVisible) + rowsPerPage); lv.indexOfFirstVisible = expectedIndexOfFirstVisible; Helper.ListView.Utils.waitForReady(lv)().done(function () { LiveUnit.Assert.areEqual(expectedIndexOfFirstVisible, lv.indexOfFirstVisible, "Read value is different after setting"); checkFirstLastVisible(lv); c(); }); }); }).done(complete); }); }); generateTest("testEnsureVisible", function (complete) { var columnsPerPage = lv.testOptions.columnsPerPage; var rowsPerPage = lv.testOptions.rowsPerPage; var pages = lv.testOptions.pages; var itemCount = columnsPerPage * rowsPerPage * pages; var ensureVisibleTargets = [ 0, // start ((itemCount / 2) | 0) - 1, // middle itemCount - 1 // end ]; Helper.asyncWhile(function () { return WinJS.Promise.wrap(ensureVisibleTargets.length > 0); }, function () { return new WinJS.Promise(function (c) { var ensureVisibleIndex = ensureVisibleTargets.pop(); lv.ensureVisible(ensureVisibleIndex); Helper.ListView.Utils.waitForReady(lv)().done(function () { LiveUnit.Assert.isTrue(ensureVisibleIndex >= lv.indexOfFirstVisible, "Index of first visible should be less than or eq to ensured visible item index"); LiveUnit.Assert.isTrue(ensureVisibleIndex <= lv.indexOfLastVisible, "Index of first visible should be greater than or eq to ensured visible item index"); c(); }); }); }).done(complete); }); } // register the object as a test class by passing in the name LiveUnit.registerTestClass("WinJSTests.HorizontalListTest");