// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
//
///
module WinJSTests {
var utils = repeaterUtils,
loadedEvent = utils.events.loadedEvent,
insertingEvent = utils.events.insertingEvent,
insertedEvent = utils.events.insertedEvent,
removingEvent = utils.events.removingEvent,
removedEvent = utils.events.removedEvent,
movingEvent = utils.events.movingEvent,
movedEvent = utils.events.movedEvent,
changingEvent = utils.events.changingEvent,
changedEvent = utils.events.changedEvent,
reloadingEvent = utils.events.reloadingEvent,
reloadedEvent = utils.events.reloadedEvent,
affectedWinControl,
controlTemplate = (function () {
var root = document.createElement("div");
root.innerHTML = '
';
return new WinJS.Binding.Template(root);
} ());
export class RepeaterSetPromiseTests {
"use strict";
// 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);
}
}
}
(function () {
function generateTest(editType, editBeforeEvent, editAfterEvent, deferElementDisposal) {
return function (complete) {
var data = utils.createMonthsList(),
newData = utils.createWeekdaysList(),
repeaterElem = document.getElementById("RepeaterTests"),
editAfterEventFired = 0,
editBeforeEventFired = 0;
LiveUnit.LoggingCore.logComment("Creating a repeater control");
var repeater = new WinJS.UI.Repeater(repeaterElem, {
data: data,
template: controlTemplate
});
LiveUnit.LoggingCore.logComment("Repeater control created");
repeater.addEventListener(editAfterEvent, editAfterEventHandler);
function editAfterEventHandler(ev) {
// verify the item is still removed from the DOM, but still not disposed.
LiveUnit.LoggingCore.logComment(editAfterEvent + " event fired: " + editAfterEventFired);
var isElementInDOM = document.body.contains(affectedWinControl._element);
LiveUnit.Assert.areEqual(false, isElementInDOM,
"Repeater child element should be removed from the DOM by now.");
var isControlDisposed = affectedWinControl._disposed;
LiveUnit.Assert.areEqual(false, isControlDisposed,
"Repeater child element is removed from the DOM but should not be disposed yet.");
}
repeater.addEventListener(editBeforeEvent, editBeforeEventHandler);
function editBeforeEventHandler(ev) {
// Verify element to be modified has not been disposed yet.
if (deferElementDisposal) {
ev.setPromise(WinJS.Promise.timeout(0));
}
var isControlDisposed;
switch (editType) {
case "pop":
affectedWinControl = ev.affectedElement.firstElementChild.winControl;
isControlDisposed = affectedWinControl._disposed;
LiveUnit.LoggingCore.logComment("Remove event fired:" + editBeforeEventFired);
LiveUnit.Assert.areEqual(false, isControlDisposed,
"Repeater's child element that is about to be removed should not be disposed yet.");
break;
case "setAt":
affectedWinControl = ev.oldElement.firstElementChild.winControl;
isControlDisposed = affectedWinControl._disposed;
LiveUnit.LoggingCore.logComment("Change event fired:" + editBeforeEventFired);
LiveUnit.Assert.areEqual(false, isControlDisposed,
"Repeater's child element that is about to be changed should not be disposed yet.");
break;
case "reverse":
affectedWinControl = ev.affectedElements[0].firstElementChild.winControl;
isControlDisposed = affectedWinControl._disposed;
LiveUnit.Assert.areEqual(false, isControlDisposed,
"Repeater's child element that is about to be reloaded should not be disposed yet.");
break;
default:
LiveUnit.Assert.fail("Unrecognized edit type");
}
}
// Perform data edits
switch (editType) {
case "pop":
LiveUnit.LoggingCore.logComment("Performing pop operation");
data.pop();
break;
case "setAt":
LiveUnit.LoggingCore.logComment("Performing setAt operation");
var item = newData.getAt(0);
data.setAt(0, item);
break;
case "reverse":
LiveUnit.LoggingCore.logComment("Performing reverse operation");
data.reverse();
break;
default:
LiveUnit.Assert.fail("Unrecognized insert operation");
}
var isControlDisposed = affectedWinControl._disposed;
if (deferElementDisposal) {
LiveUnit.Assert.areEqual(false, isControlDisposed,
"Repeater's child element should not be disposed until the setPromise timeout promise is complete.");
WinJS.Utilities._setImmediate(function () {
isControlDisposed = affectedWinControl._disposed;
LiveUnit.Assert.areEqual(true, isControlDisposed,
"Repeater's child element should be disposed now that the setPromise timeout promise is complete.");
complete(); // Done
});
} else {
// verify it was already disposed
LiveUnit.Assert.areEqual(true, isControlDisposed,
"Repeater's child element should be disposed synchronously when setPromise is not used.");
complete(); // Done
}
};
}
// Verify disposal of elements is not deferred for itemremoving,itemchanging and itemsreloading events
var deferElementDisposal = false;
RepeaterSetPromiseTests.prototype["testElementDisposeAfterListPop"] = generateTest("pop", removingEvent, removedEvent, deferElementDisposal);
RepeaterSetPromiseTests.prototype["testElementDisposeAfterListSetAt"] = generateTest("setAt", changingEvent, changedEvent, deferElementDisposal);
RepeaterSetPromiseTests.prototype["testElementDisposeAfterListReverse"] = generateTest("reverse", reloadingEvent, reloadedEvent, deferElementDisposal);
// Verify disposal of elements is deferred for itemremoving,itemchanging and itemsreloading events
deferElementDisposal = true;
RepeaterSetPromiseTests.prototype["testSetPromiseAfterListPop"] = generateTest("pop", removingEvent, removedEvent, deferElementDisposal);
RepeaterSetPromiseTests.prototype["testSetPromiseAfterListSetAt"] = generateTest("setAt", changingEvent, changedEvent, deferElementDisposal);
RepeaterSetPromiseTests.prototype["testSetPromiseAfterListReverse"] = generateTest("reverse", reloadingEvent, reloadedEvent, deferElementDisposal);
})();
}
// register the object as a test class by passing in the name
LiveUnit.registerTestClass("WinJSTests.RepeaterSetPromiseTests");