// 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; var checkFirstLastVisible = 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 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; var itemHeight = controlHeight / rowsPerPage - 10; var itemWidth = (controlWidth - 70) / columnsPerPage - 10 /*10 is the margin in vertical grid for win-container*/; 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.GridLayout({ orientation: 'vertical' }); 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; } export class VerticalGridTests { setUp() { LiveUnit.LoggingCore.logComment("In setup"); var newNode = document.createElement("div"); newNode.id = "VerticalGridTests"; 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("VerticalGridTests"); if (element && document.body.contains(element)) { document.body.removeChild(element); } lv = null; } } // Test generator var generateTest = function (name, testFunction) { var configurations = [ { rowsPerPage: 4, columnsPerPage: 1, pages: 5 }, { rowsPerPage: 4, columnsPerPage: 2, pages: 5 }, { rowsPerPage: 4, columnsPerPage: 5, pages: 5 }, { rowsPerPage: 1, columnsPerPage: 1, pages: 5 }, { rowsPerPage: 4, columnsPerPage: 3, pages: 5 } ]; configurations.forEach(function (options) { var testName = name + "_VGrid_" + options.rowsPerPage + 'X' + options.columnsPerPage + 'X' + options.pages; VerticalGridTests.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 scrollMax = 0; var increment = 50; Helper.ListView.Utils.waitForReady(lv)().done(function () { Helper.asyncWhile(function () { scrollMax = viewport.scrollHeight - viewport.clientHeight; return WinJS.Promise.wrap(viewport.scrollTop < scrollMax); }, function () { return new WinJS.Promise(function (c) { var targetScrollPosition = Math.min(viewport.scrollTop + increment, scrollMax); viewport.scrollTop = targetScrollPosition; //use requestAnimationFrame to match ListView's timing requestAnimationFrame(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.scrollHeight - viewport.clientHeight; return WinJS.Promise.wrap(viewport.scrollTop < scrollMax); }, function () { return new WinJS.Promise(function (c) { var targetScrollPosition = Math.min(viewport.scrollTop + increment, scrollMax); lv.scrollPosition = targetScrollPosition; Helper.ListView.Utils.waitForReady(lv)().done(function () { LiveUnit.Assert.areEqual(targetScrollPosition, viewport.scrollTop); c(); }); }); }).done(complete); }); }); generateTest("testGetIndexOfFirstLastVisible", function (complete) { var viewport = lv.element.querySelector(".win-viewport"); var increment = 50; Helper.asyncWhile(function () { var scrollMax = viewport.scrollHeight - viewport.clientHeight; return WinJS.Promise.wrap(viewport.scrollTop < scrollMax); }, function () { return new WinJS.Promise(function (c) { viewport.scrollTop += increment; Helper.ListView.Utils.waitForReady(lv)().done(function () { checkFirstLastVisible(lv); c(); }); }); }).done(complete); }); generateTest("testGetIndexOfFirstLastVisibleWithGroups", function (complete) { var groupedDS = lv.itemDataSource._list.createGrouped(function groupKey(item) { return (item.index / 10) | 0; }, function groupData(group) { return { title: (group.index / 10) | 0 } }); lv.itemDataSource = groupedDS.dataSource; lv.groupDataSource = groupedDS.groups.dataSource; var viewport = lv.element.querySelector(".win-viewport"); var increment = 50; Helper.asyncWhile(function () { var scrollMax = viewport.scrollHeight - viewport.clientHeight; return WinJS.Promise.wrap(viewport.scrollTop < scrollMax); }, function () { return new WinJS.Promise(function (c) { viewport.scrollTop += increment; Helper.ListView.Utils.waitForReady(lv)().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 - (columnsPerPage * (rowsPerPage + 1)); //Skip the last page and 1 row 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) + columnsPerPage); 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 - 1; 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)().then(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.VerticalGridTests");