// 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"; export class CommonListViewLayoutTests { setUp() { LiveUnit.LoggingCore.logComment("In setup"); var newNode = document.createElement("div"); newNode.id = "CommonLayoutTests"; document.body.appendChild(newNode); } tearDown() { LiveUnit.LoggingCore.logComment("In tearDown"); var element = document.getElementById("CommonLayoutTests"); if (element) { WinJS.Utilities.disposeSubTree(element); document.body.removeChild(element); } } } function generate(name, testFunction) { function generateTest(direction, grouped, headersAbove, rtl, layoutName, forceOneItemPerBar) { var fullName = name + layoutName + "_" + direction + (grouped ? "_grouped_" + (headersAbove ? "headersOnTop_" : "headersOnLeft_") : "_") + (rtl ? "rtl" : "ltr"); if (forceOneItemPerBar) { fullName += "(OneRow/Col)"; } CommonListViewLayoutTests.prototype[fullName] = function (complete) { LiveUnit.LoggingCore.logComment("in " + fullName); var element = document.getElementById("CommonLayoutTests"); var lvDetails = Helper.ListView.buildGenericListView(element, { orientation: direction, layout: layoutName, rtl: rtl, grouped: grouped, headersAbove: headersAbove, forceOneItemPerBar: forceOneItemPerBar }); var listView = lvDetails.listView; Helper.ListView.waitForAllContainers(listView).then(function () { testFunction(listView, lvDetails.layoutInfo, rtl, complete); }); }; } function generateTestSuite(layoutName, forceOneItemPerBar?) { function generateTestsForOrientation(o) { generateTest(o, false, false, false, layoutName, forceOneItemPerBar); generateTest(o, false, false, true, layoutName, forceOneItemPerBar); generateTest(o, true, false, false, layoutName, forceOneItemPerBar); generateTest(o, true, false, true, layoutName, forceOneItemPerBar); generateTest(o, true, true, false, layoutName, forceOneItemPerBar); generateTest(o, true, true, true, layoutName, forceOneItemPerBar); } generateTestsForOrientation("horizontal"); generateTestsForOrientation("vertical"); } generateTestSuite("ListLayout"); generateTestSuite("GridLayout"); generateTestSuite("GridLayout", true); } generate("testFirstLastVisible", function (listView, layoutDetails, rtl, complete) { var layout = listView.layout; var groupsCount = layoutDetails.groupsInfo.length; for (var i = 0; i < groupsCount; i++) { var currentGroup = layoutDetails.groupsInfo[i]; var groupBars = currentGroup.bars; for (var j = 0; j < groupBars.length; j++) { var currentBar = groupBars[j], firstItemInBar = currentBar[0], lastItemInBar = currentBar[currentBar.length - 1]; for (var indexInBar = 0; indexInBar < currentBar.length; indexInBar++) { var itemInfo = currentBar[indexInBar]; LiveUnit.Assert.areEqual(firstItemInBar.absoluteIndex, layout._firstItemFromRange(itemInfo.start, { wholeItem: false })); LiveUnit.Assert.areEqual(firstItemInBar.absoluteIndex, layout._firstItemFromRange(itemInfo.start, { wholeItem: true })); if (j < groupBars.length - 1 || (j === groupBars.length - 1 && i < groupsCount - 1)) { var nextBar = (j < groupBars.length - 1 ? groupBars[j + 1] : layoutDetails.groupsInfo[i + 1].bars[0]), lastItemInNextBar = nextBar[nextBar.length - 1]; if (j === groupBars.length - 1 && itemInfo.end !== lastItemInNextBar.start) { // itemInfo.end is in the margin or header between groups so it's not yet in // the next bar. LiveUnit.Assert.areEqual(lastItemInBar.absoluteIndex, layout._lastItemFromRange(itemInfo.end, { wholeItem: false })); } else { LiveUnit.Assert.areEqual(lastItemInNextBar.absoluteIndex, layout._lastItemFromRange(itemInfo.end, { wholeItem: false })); } LiveUnit.Assert.areEqual(lastItemInBar.absoluteIndex, layout._lastItemFromRange(itemInfo.end, { wholeItem: true })); } } } } complete(); }); function getKeysForConfiguration(horizontal, rtl) { var Key = WinJS.Utilities.Key; var leftArrow = rtl ? Key.rightArrow : Key.leftArrow, rightArrow = rtl ? Key.leftArrow : Key.rightArrow; // In vertical mode, the keys to change slots back get swapped with keys to change bars back, // and slots forward with bars forward (in other words, up/down move you between columns, while left/right go between rows in vertical). var keyInfo = { moveOneSlotBack: horizontal ? Key.upArrow : leftArrow, moveOneSlotForward: horizontal ? Key.downArrow : rightArrow, moveOneBarBack: horizontal ? leftArrow : Key.upArrow, moveOneBarForward: horizontal ? rightArrow : Key.downArrow }; return keyInfo; } generate("testKeyboardArrows", function (listView, layoutDetails, rtl, complete) { var layout = listView.layout; var keyHelper = getKeysForConfiguration(layoutDetails.horizontal, rtl); var groupsCount = layoutDetails.groupsInfo.length; var oneItemPerBar = (layoutDetails.itemsPerBar === 1); for (var i = 0; i < groupsCount; i++) { var currentGroup = layoutDetails.groupsInfo[i]; var groupBars = currentGroup.bars; for (var j = 0; j < groupBars.length; j++) { var currentBar = groupBars[j], firstItemInBar = currentBar[0], lastItemInBar = currentBar[currentBar.length - 1]; for (var indexInBar = 0; indexInBar < currentBar.length; indexInBar++) { var itemInfo = currentBar[indexInBar]; var currentItem = { type: "item", index: itemInfo.absoluteIndex }; if (oneItemPerBar) { LiveUnit.Assert.areEqual(itemInfo.absoluteIndex - 1, layout.getAdjacent(currentItem, keyHelper.moveOneSlotBack).index); LiveUnit.Assert.areEqual(itemInfo.absoluteIndex - 1, layout.getAdjacent(currentItem, keyHelper.moveOneBarBack).index); LiveUnit.Assert.areEqual(Math.min(itemInfo.absoluteIndex + 1, layoutDetails.itemsCount - 1), layout.getAdjacent(currentItem, keyHelper.moveOneSlotForward).index); LiveUnit.Assert.areEqual(Math.min(itemInfo.absoluteIndex + 1, layoutDetails.itemsCount - 1), layout.getAdjacent(currentItem, keyHelper.moveOneBarForward).index); } else { var expectedSlotBackwards = Math.max(firstItemInBar.absoluteIndex, itemInfo.absoluteIndex - 1), expectedSlotForwards = Math.min(lastItemInBar.absoluteIndex, itemInfo.absoluteIndex + 1), expectedBarForwards = -1, expectedBarBackwards = -1; if (i + 1 < layoutDetails.groupsInfo.length || j + 1 < groupBars.length) { var nextBar = (j + 1 < groupBars.length ? groupBars[j + 1] : layoutDetails.groupsInfo[i + 1].bars[0]); var slotInBar = Math.min(nextBar.length - 1, itemInfo.slot); expectedBarForwards = nextBar[slotInBar].absoluteIndex; } if (i - 1 >= 0 || j - 1 >= 0) { var previousBar = (j - 1 >= 0 ? groupBars[j - 1] : layoutDetails.groupsInfo[i - 1].bars[layoutDetails.groupsInfo[i - 1].bars.length - 1]); var slotInBar = Math.min(previousBar.length - 1, itemInfo.slot); expectedBarBackwards = previousBar[slotInBar].absoluteIndex; } LiveUnit.Assert.areEqual(expectedSlotBackwards, layout.getAdjacent(currentItem, keyHelper.moveOneSlotBack).index); LiveUnit.Assert.areEqual(expectedSlotForwards, layout.getAdjacent(currentItem, keyHelper.moveOneSlotForward).index); if (expectedBarForwards >= 0) { LiveUnit.Assert.areEqual(expectedBarForwards, layout.getAdjacent(currentItem, keyHelper.moveOneBarForward).index); } if (expectedBarBackwards >= 0) { LiveUnit.Assert.areEqual(expectedBarBackwards, layout.getAdjacent(currentItem, keyHelper.moveOneBarBack).index); } } } } } complete(); }); function getLocationsInsideItem(itemInfo, horizontal, useListSemantics, grouped) { var positions = { topLeft: { x: itemInfo.left + (itemInfo.itemWidth / 3), y: itemInfo.top + (itemInfo.itemHeight / 3), expectedInsertAfter: undefined }, topRight: { x: itemInfo.left + 2 * (itemInfo.itemWidth / 3), y: itemInfo.top + (itemInfo.itemHeight / 3), expectedInsertAfter: undefined }, bottomLeft: { x: itemInfo.left + (itemInfo.itemWidth / 3), y: itemInfo.top + 2 * (itemInfo.itemHeight / 3), expectedInsertAfter: undefined }, bottomRight: { x: itemInfo.left + 2 * (itemInfo.itemWidth / 3), y: itemInfo.top + 2 * (itemInfo.itemHeight / 3), expectedInsertAfter: undefined } }; function populateVerticalMidPoint() { positions.topLeft.expectedInsertAfter = itemInfo.absoluteIndex - 1, positions.bottomLeft.expectedInsertAfter = itemInfo.absoluteIndex - 1; positions.topRight.expectedInsertAfter = itemInfo.absoluteIndex; positions.bottomRight.expectedInsertAfter = itemInfo.absoluteIndex; } function populateHorizontalMidPoint() { positions.topLeft.expectedInsertAfter = itemInfo.absoluteIndex - 1, positions.topRight.expectedInsertAfter = itemInfo.absoluteIndex - 1; positions.bottomLeft.expectedInsertAfter = itemInfo.absoluteIndex; positions.bottomRight.expectedInsertAfter = itemInfo.absoluteIndex; } if (!grouped) { if (useListSemantics) { if (horizontal) { populateVerticalMidPoint(); } else { populateHorizontalMidPoint(); } } else { if (horizontal) { populateHorizontalMidPoint(); } else { populateVerticalMidPoint(); } } } return positions; } generate("testHitTest", function (listView, layoutDetails, rtl, complete) { var layout = listView.layout; var keyHelper = getKeysForConfiguration(layoutDetails.horizontal, rtl); var groupsCount = layoutDetails.groupsInfo.length; var oneItemPerBar = (layoutDetails.itemsPerBar === 1); for (var i = 0; i < groupsCount; i++) { var currentGroup = layoutDetails.groupsInfo[i]; var groupBars = currentGroup.bars; for (var j = 0; j < groupBars.length; j++) { var currentBar = groupBars[j]; for (var indexInBar = 0; indexInBar < currentBar.length; indexInBar++) { var itemInfo = currentBar[indexInBar]; var locations = getLocationsInsideItem(itemInfo, layoutDetails.horizontal, oneItemPerBar, layoutDetails.grouped); for (var position in locations) { var hitTestResult = layout.hitTest(locations[position].x, locations[position].y); LiveUnit.Assert.areEqual(itemInfo.absoluteIndex, hitTestResult.index); if (!layoutDetails.grouped) { LiveUnit.Assert.areEqual(locations[position].expectedInsertAfter, hitTestResult.insertAfterIndex); } } } } } complete(); }); } LiveUnit.registerTestClass("WinJSTests.CommonListViewLayoutTests");