// 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 utils = repeaterUtils, loadedEvent = utils.events.loadedEvent, simpleRenderer = utils.simpleRenderer; function verifyDOM(elem, data, childrenClassQuery) { LiveUnit.LoggingCore.logComment("Verifying the DOM"); var repeatedChildren = elem.querySelectorAll(childrenClassQuery), numberOfDomChildren = repeatedChildren.length; // Verify the number of children elements LiveUnit.Assert.areEqual(data.length, numberOfDomChildren, "The DOM size is not equal to the number of data items"); // Verify that repeater owns the its innerHTML and that no other html elements have been injected into it.. LiveUnit.Assert.areEqual(numberOfDomChildren, elem.childNodes.length, "After initialization, Repeater's innerHTML should only contain the elements its template generated from the data set."); // Verify the DOM order data.forEach(function (item, index) { // Verify the content of the element var child = repeatedChildren[index]; LiveUnit.Assert.areEqual(item, child.textContent, "The data and the DOM element don't match"); }); // Verify Repeater's length property LiveUnit.Assert.areEqual(elem.winControl.length, numberOfDomChildren, "The Repeater's DOM size should be equal to its length property if there haven't been any outside modifications to its HTML tree"); // Verify that the length property is resilient to injected elements var injectedElement = document.createElement("DIV"); elem.appendChild(injectedElement); LiveUnit.Assert.areEqual(elem.winControl.length, elem.children.length - 1, "Repeater's length property should ingore DOM elements injected by outside sources"); elem.removeChild(injectedElement); } export class RepeaterPropertyTests { // This is the setup function that will be called at the beginning of each test function. setUp() { LiveUnit.LoggingCore.logComment("In setup"); var newNode = document.createElement("div"); newNode.id = "RepeaterTests"; document.body.appendChild(newNode); } tearDown() { LiveUnit.LoggingCore.logComment("In tearDown"); var element = document.getElementById("RepeaterTests"); if (element) { WinJS.Utilities.disposeSubTree(element); document.body.removeChild(element); } } testUpdateDataProperty = function (complete) { var oldData = utils.createWeekdaysList(), newData = utils.createMonthsList(), elem = document.getElementById("RepeaterTests"), loadedEventFired = 0; elem.addEventListener(loadedEvent, itemsLoadedHandler); function itemsLoadedHandler(ev) { LiveUnit.LoggingCore.logComment("Inside the itemsloaded event handler"); loadedEventFired++; } LiveUnit.LoggingCore.logComment("Creating a repeater control"); var repeater = new WinJS.UI.Repeater(elem, { data: oldData, template: simpleRenderer }); LiveUnit.LoggingCore.logComment("Repeater control created"); // Verify the DOM for old data verifyDOM(elem, oldData, ".repeater-child"); // Update the data property repeater.data = newData; // Verify the DOM for new data verifyDOM(elem, newData, ".repeater-child"); // Verify the itemsloaded fired twice LiveUnit.Assert.areEqual(2, loadedEventFired, "itemsloaded event fired unexpected number of times"); // Done complete(); }; testUpdateTemplateProperty = function (complete) { var data = utils.createWeekdaysList(), elem = document.getElementById("RepeaterTests"), loadedEventFired = 0; function createRenderer(className) { return function (item) { var root = document.createElement("div"); root.textContent = item; root.className = className; return root; } } elem.addEventListener(loadedEvent, itemsLoadedHandler); function itemsLoadedHandler(ev) { LiveUnit.LoggingCore.logComment("Inside the itemsloaded event handler"); loadedEventFired++; } LiveUnit.LoggingCore.logComment("Creating a repeater control"); var repeater = new WinJS.UI.Repeater(elem, { data: data, template: createRenderer("old-template") }); LiveUnit.LoggingCore.logComment("Repeater control created"); // Verify the DOM for old data verifyDOM(elem, data, ".old-template"); // Update the template property repeater.template = createRenderer("new-template"); // Verify the DOM for new-template generated data verifyDOM(elem, data, ".new-template"); // Verify the itemsloaded fired twice LiveUnit.Assert.areEqual(2, loadedEventFired, "itemsloaded event fired unexpected number of times"); // Done complete(); }; testElementProperty = function (complete) { var elem = document.getElementById("RepeaterTests"); LiveUnit.LoggingCore.logComment("Creating a repeater control"); var repeater = new WinJS.UI.Repeater(elem, {}); LiveUnit.LoggingCore.logComment("Repeater control created"); // Verify element property LiveUnit.Assert.areEqual(elem, repeater.element, "Element property didn't return the expected element"); // Done complete(); }; testWinControlExpando = function (complete) { var elem = document.getElementById("RepeaterTests"); LiveUnit.LoggingCore.logComment("Creating a repeater control"); var repeater = new WinJS.UI.Repeater(elem, {}); LiveUnit.LoggingCore.logComment("Repeater control created"); // Verify winControl expando property LiveUnit.Assert.areEqual(repeater, elem.winControl, "WinControl expando property didn't return the expected control"); // Done complete(); }; testElementFromIndexFunction = function (complete) { var data = utils.createWeekdaysList(), elem = document.getElementById("RepeaterTests"); LiveUnit.LoggingCore.logComment("Creating a repeater control"); var repeater = new WinJS.UI.Repeater(elem, { data: data, template: simpleRenderer }); LiveUnit.LoggingCore.logComment("Repeater control created"); var repeatedChildren = elem.querySelectorAll(".repeater-child"); // Verify the elementFromIndex() data.forEach(function (item, index) { // Verify the content of the element var child = repeatedChildren[index]; LiveUnit.Assert.areEqual(child, repeater.elementFromIndex(index), "The element returned by the elementFromIndex and the DOM element don't match"); }); // Done complete(); }; }; } // register the object as a test class by passing in the name LiveUnit.registerTestClass("WinJSTests.RepeaterPropertyTests");