// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
//
//
module CorsicaTests {
"use strict";
// A small do-nothing control used to test manipulation of controls by the QueryCollection
var DummyControl = WinJS.Class.define(function DummyControl(element, options) {
this.element = element;
element.winControl = this;
WinJS.UI.setOptions(this, options);
});
// Options:
// - eventProperties: An object representing the event's properties that should be passed to initEvent.
// - overridenProperties: An object representing the properties that should be overriden by the
// PointerEventProxy object.
// - eventHandler: An event handler which receives a PointerEventProxy instance as its argument.
// Use this callback as an opportunity to make assertions on the PointerEventProxy object.
// Returns false if any handler called preventDefault. Returns true otherwise. (the return value of dispatchEvent).
function testPointerEventProxy(options) {
var eventProperties = options.eventProperties || {};
var overridenProperties = options.overridenProperties || {};
var eventHandler = options.eventHandler || function () { };
var targetElement = document.createElement("div");
try {
targetElement.id = "target-element";
document.body.appendChild(targetElement);
var eventObject = document.createEvent("MouseEvent");
Helper.initMouseEvent(eventObject, "touchstart", eventProperties);
var handlerRan = false;
targetElement.addEventListener("touchstart", function (e) {
eventHandler(new WinJS.Utilities._PointerEventProxy(e, overridenProperties));
handlerRan = true;
});
var doDefaultAction = targetElement.dispatchEvent(eventObject);
LiveUnit.Assert.isTrue(handlerRan, "touchstart event handler should have run");
return doDefaultAction;
} finally {
var parent = targetElement.parentNode;
parent && parent.removeChild(targetElement);
}
}
export class Utilities {
testSimpleAddRemove() {
var holder = document.createElement("div");
LiveUnit.Assert.areEqual(holder.className, "");
LiveUnit.Assert.areEqual(WinJS.Utilities.addClass(holder, "a"), holder);
LiveUnit.Assert.areEqual(holder.className, "a");
WinJS.Utilities.addClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className, "a");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.addClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className, "a b");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.addClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className, "a b");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
LiveUnit.Assert.areEqual(WinJS.Utilities.removeClass(holder, "a"), holder);
LiveUnit.Assert.areEqual(holder.className, "b");
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.removeClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className, "b");
WinJS.Utilities.removeClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className, "");
WinJS.Utilities.removeClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className, "");
}
testRemoveDups() {
var holder = document.createElement("div");
holder.className = "a a a b a c ";
LiveUnit.Assert.areEqual(WinJS.Utilities.removeClass(holder, "a"), holder);
LiveUnit.Assert.areEqual(holder.classList.length, 2);
LiveUnit.Assert.isTrue(holder.classList.contains("b"));
LiveUnit.Assert.isTrue(holder.classList.contains("c"));
}
testMultipleAddRemove() {
var holder = document.createElement("div");
LiveUnit.Assert.areEqual(holder.className, "");
LiveUnit.Assert.areEqual(WinJS.Utilities.addClass(holder, "a b"), holder);
LiveUnit.Assert.areEqual(holder.className, "a b");
WinJS.Utilities.addClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className, "a b");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.addClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className, "a b");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.addClass(holder, "b");
LiveUnit.Assert.areEqual("a b", holder.className);
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
LiveUnit.Assert.areEqual(WinJS.Utilities.removeClass(holder, " a b "), holder);
LiveUnit.Assert.areEqual("", holder.className);
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.removeClass(holder, "a");
LiveUnit.Assert.areEqual("", holder.className);
WinJS.Utilities.removeClass(holder, "b");
LiveUnit.Assert.areEqual("", holder.className);
WinJS.Utilities.removeClass(holder, "b");
LiveUnit.Assert.areEqual("", holder.className);
LiveUnit.Assert.areEqual(WinJS.Utilities.addClass(holder, "a b"), holder);
LiveUnit.Assert.areEqual(WinJS.Utilities.addClass(holder, " b c "), holder);
LiveUnit.Assert.areEqual(WinJS.Utilities.addClass(holder, "a b c d "), holder);
LiveUnit.Assert.areEqual(WinJS.Utilities.removeClass(holder, " b c "), holder);
LiveUnit.Assert.areEqual("a d", holder.className);
LiveUnit.Assert.areEqual(WinJS.Utilities.removeClass(holder, " b c "), holder);
LiveUnit.Assert.areEqual("a d", holder.className);
LiveUnit.Assert.areEqual(WinJS.Utilities.removeClass(holder, "a b c d"), holder);
LiveUnit.Assert.areEqual("", holder.className);
}
testSimpleAddRemoveSVG() {
var holder = document.createElementNS('http://www.w3.org/2000/svg', "g");
LiveUnit.Assert.areEqual(holder.className.baseVal, "");
WinJS.Utilities.addClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className.baseVal, "a");
WinJS.Utilities.addClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className.baseVal, "a");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.addClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className.baseVal, "a b");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.addClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className.baseVal, "a b");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.removeClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className.baseVal, "b");
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "a"));
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "b"));
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "c"));
WinJS.Utilities.removeClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className.baseVal, "b");
WinJS.Utilities.removeClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className.baseVal, "");
WinJS.Utilities.removeClass(holder, "b");
LiveUnit.Assert.areEqual(holder.className.baseVal, "");
}
testSubstringAddRemove() {
var holder = document.createElement("div");
LiveUnit.Assert.areEqual(holder.className, "");
WinJS.Utilities.addClass(holder, "aa");
LiveUnit.Assert.areEqual(holder.className, "aa");
WinJS.Utilities.addClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className, "aa a");
WinJS.Utilities.removeClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className, "aa");
WinJS.Utilities.removeClass(holder, "aa");
LiveUnit.Assert.areEqual(holder.className, "");
}
testToggle() {
var holder = document.createElement("div");
LiveUnit.Assert.areEqual(WinJS.Utilities.toggleClass(holder, "a"), holder);
LiveUnit.Assert.areEqual(holder.className, "a");
WinJS.Utilities.toggleClass(holder, "a");
LiveUnit.Assert.areEqual(holder.className, "");
var holder = document.createElementNS('http://www.w3.org/2000/svg', "g");
WinJS.Utilities.addClass(holder, "a");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
WinJS.Utilities.toggleClass(holder, "a");
LiveUnit.Assert.isFalse(WinJS.Utilities.hasClass(holder, "a"));
WinJS.Utilities.toggleClass(holder, "a");
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(holder, "a"));
}
testLongToggle() {
var holder = document.createElement("div");
WinJS.Utilities.toggleClass(holder, "a");
WinJS.Utilities.toggleClass(holder, "b");
WinJS.Utilities.toggleClass(holder, "c");
WinJS.Utilities.toggleClass(holder, "d");
WinJS.Utilities.toggleClass(holder, "e");
LiveUnit.Assert.areEqual(holder.className, "a b c d e");
WinJS.Utilities.toggleClass(holder, "b");
WinJS.Utilities.toggleClass(holder, "d");
LiveUnit.Assert.areEqual(holder.className, "a c e");
WinJS.Utilities.toggleClass(holder, "a");
WinJS.Utilities.toggleClass(holder, "c");
WinJS.Utilities.toggleClass(holder, "e");
LiveUnit.Assert.areEqual(holder.className, "");
}
testLongAddRemove() {
var holder = document.createElement("div");
WinJS.Utilities.addClass(holder, "a");
WinJS.Utilities.addClass(holder, "b");
WinJS.Utilities.addClass(holder, "c");
WinJS.Utilities.addClass(holder, "d");
WinJS.Utilities.addClass(holder, "e");
WinJS.Utilities.removeClass(holder, "b");
WinJS.Utilities.removeClass(holder, "d");
LiveUnit.Assert.areEqual(holder.className, "a c e");
WinJS.Utilities.removeClass(holder, "a");
WinJS.Utilities.removeClass(holder, "c");
WinJS.Utilities.removeClass(holder, "e");
LiveUnit.Assert.areEqual(holder.className, "");
}
testQuery() {
var holder = document.createElement("div");
holder.innerHTML = "";
var result = WinJS.Utilities.children(holder);
LiveUnit.Assert.areEqual(result.length, 4);
LiveUnit.Assert.areEqual(result.get(0).className, "a");
LiveUnit.Assert.areEqual(result.get(1).className, "b");
LiveUnit.Assert.areEqual(result.get(2).className, "b");
LiveUnit.Assert.areEqual(result.get(3).className, "c");
result = WinJS.Utilities.query(".b", holder);
LiveUnit.Assert.areEqual(result.length, 2);
LiveUnit.Assert.isTrue(result[0] === holder.firstChild.nextSibling);
var r2 = WinJS.Utilities.query(".qq", holder);
LiveUnit.Assert.areEqual(r2.length, 0);
result.toggleClass("qq");
LiveUnit.Assert.areEqual(true, result.hasClass("qq"));
r2 = WinJS.Utilities.query(".qq", holder);
LiveUnit.Assert.areEqual(r2.length, 2);
result.removeClass("qq");
LiveUnit.Assert.areEqual(false, result.hasClass("qq"));
r2 = WinJS.Utilities.query(".qq", holder);
LiveUnit.Assert.areEqual(r2.length, 0);
result.addClass("qq");
r2 = WinJS.Utilities.query(".qq", holder);
LiveUnit.Assert.areEqual(r2.length, 2);
LiveUnit.Assert.areEqual(r2.reduce(function (r: any, e) { return r + 1; }, 0), 2);
var element = document.createElement("div");
element.id = "testQueryById";
document.body.appendChild(element);
result = WinJS.Utilities.id("testQueryById1");
LiveUnit.Assert.areEqual(result.length, 0);
result = WinJS.Utilities.id("testQueryById");
LiveUnit.Assert.areEqual(result.length, 1);
LiveUnit.Assert.areEqual(result.get(0), element);
document.body.removeChild(element);
}
testQueryEvents() {
var holder = document.createElement("div");
holder.innerHTML = "";
var result = WinJS.Utilities.query(".a", holder);
LiveUnit.Assert.areEqual(result.length, 1);
var clicked = 0;
var clickHandler = function () {
clicked++;
}
result.listen("click", clickHandler, false);
var event = document.createEvent("UIEvents");
event.initUIEvent("click", true, true, window, 1);
holder.firstChild.dispatchEvent(event);
LiveUnit.Assert.areEqual(1, clicked);
result.removeEventListener("click", clickHandler, false);
holder.firstChild.dispatchEvent(event);
LiveUnit.Assert.areEqual(1, clicked);
}
testQueryAttribute() {
var holder = document.createElement("div");
holder.innerHTML = "";
var result = WinJS.Utilities.query(".b", holder);
LiveUnit.Assert.areEqual(result.length, 2);
result.setAttribute("role", "button");
LiveUnit.Assert.areEqual((holder.firstChild.nextSibling).getAttribute("role"), "button");
LiveUnit.Assert.areEqual((holder.firstChild.nextSibling.nextSibling).getAttribute("role"), "button");
LiveUnit.Assert.areEqual(result.getAttribute("role"), "button");
}
testQueryStyle() {
var holder = document.createElement("div");
holder.innerHTML = "";
var result = WinJS.Utilities.query(".b", holder);
LiveUnit.Assert.areEqual(result.length, 2);
result.setStyle("display", "none");
LiveUnit.Assert.areEqual((holder.firstChild.nextSibling).style.display, "none");
LiveUnit.Assert.areEqual((holder.firstChild.nextSibling.nextSibling).style.display, "none");
result.clearStyle("display");
LiveUnit.Assert.areEqual((holder.firstChild.nextSibling).style.display, "");
LiveUnit.Assert.areEqual((holder.firstChild.nextSibling.nextSibling).style.display, "");
}
testNestedQuery() {
var holder = document.createElement("div");
holder.innerHTML = "";
var result = WinJS.Utilities.query(".b", holder);
var count = 0;
// checks that forEach works, and returns QueryCollection
//
result = result.forEach(function () { count++; });
LiveUnit.Assert.areEqual(2, count);
LiveUnit.Assert.areEqual(2, result.length);
var nested = result.query("div");
LiveUnit.Assert.areEqual(4, nested.length);
}
testForEachInUtilitiesQuery() {
var holder = document.createElement("div");
holder.innerHTML = "";
var result = 0;
WinJS.Utilities.query(".b", holder).forEach(function (e) {
e.classList.add('c')
result++;
});
LiveUnit.Assert.areEqual(result, 2, "counting the number of b classes");
result = 0;
WinJS.Utilities.query(".c", holder).forEach(function (e) {
LiveUnit.Assert.areEqual(e.classList.length, 2, "Checking the presence of two classes ");
result++;
});
LiveUnit.Assert.areEqual(result, 2, "counting the number of c classes");
}
testCanCreateSingleControl() {
var holder = document.createElement("div");
holder.innerHTML = "";
WinJS.Utilities.query(".target", holder).control(DummyControl, { a: 1 });
var target = holder.querySelector(".target");
LiveUnit.Assert.isTrue(target.winControl);
LiveUnit.Assert.areEqual(1, target.winControl.a);
LiveUnit.Assert.isTrue(target.winControl instanceof DummyControl);
}
testCanCreateMultipleControls() {
var holder = document.createElement("div");
holder.innerHTML = "Some Text Here";
WinJS.Utilities.query(".target", holder).control(DummyControl, { b: 2 });
var targets = holder.querySelectorAll(".target");
var controls = [];
for (var i = 0, len = targets.length; i < len; ++i) {
controls.push((targets[i]).winControl);
}
LiveUnit.Assert.areEqual(2, controls.length);
controls.forEach(function (control) {
LiveUnit.Assert.areEqual(2, control.b);
});
}
testControlFunctionOverwritesExistingControl() {
var holder = document.createElement("div");
holder.innerHTML = "";
var target = holder.querySelector(".target");
var original = new DummyControl(target, { a: 1 });
WinJS.Utilities.query(".target", holder).control(DummyControl, { c: "new control" });
var currentControl = target.winControl;
LiveUnit.Assert.isFalse(currentControl.a);
LiveUnit.Assert.areEqual("new control", currentControl.c);
}
testCanUpdateControl() {
var holder = document.createElement("div");
holder.innerHTML = "";
var target = holder.querySelector(".target");
var control = new DummyControl(target, { a: 1 });
WinJS.Utilities.query(".target", holder).control({ b: 3 });
LiveUnit.Assert.areEqual(1, control.a);
LiveUnit.Assert.areEqual(3, control.b);
}
testCanChainAfterControlMethod() {
var holder = document.createElement("div");
holder.innerHTML = "Some Text Here";
WinJS.Utilities.query(".target", holder).control(DummyControl, { b: 2 })
.addClass("chained");
var chained = holder.querySelectorAll(".chained");
LiveUnit.Assert.areEqual(2, chained.length);
for (var i = 0, len = chained.length; i < len; ++i) {
var element = chained[i];
LiveUnit.Assert.isTrue(WinJS.Utilities.hasClass(element, "target"));
LiveUnit.Assert.isTrue(element.winControl);
LiveUnit.Assert.areEqual(2, element.winControl.b);
}
}
testCanUpdateDeclarativeControl() {
window['QueryCollectionTest'] = { DummyControl: DummyControl };
var holder = document.createElement("div");
holder.innerHTML = "";
WinJS.Utilities.query(".target", holder).control({ c: "new value" });
var control = holder.querySelector(".target").winControl;
LiveUnit.Assert.isTrue(control);
LiveUnit.Assert.areEqual(5, control.a);
LiveUnit.Assert.areEqual("new value", control.c);
delete window['QueryCollectionTest'];
}
testInclude() {
var holder = document.createElement("div");
holder.innerHTML = "";
var result = WinJS.Utilities.query(".a", holder);
LiveUnit.Assert.areEqual(result.length, 2);
result.include(WinJS.Utilities.query(".b", holder));
LiveUnit.Assert.areEqual(result.length, 4);
result.include(document.createElement("div"));
LiveUnit.Assert.areEqual(result.length, 5);
var element = document.createElement("div");
element.innerHTML = "";
result.include(element.children);
LiveUnit.Assert.areEqual(result.length, 7);
var fragment = document.createDocumentFragment();
fragment.appendChild(document.createElement("div"));
fragment.appendChild(document.createElement("div"));
fragment.appendChild(document.createElement("div"));
result.include(fragment);
LiveUnit.Assert.areEqual(result.length, 10);
}
testData() {
var holder = document.createElement("div");
WinJS.Utilities.data(holder).int = 1;
LiveUnit.Assert.areEqual(WinJS.Utilities.data(holder).int, 1);
LiveUnit.Assert.areEqual(WinJS.Utilities.data(holder).dummy, undefined);
}
testEmpty() {
var temp = document.createElement("div");
for (var i = 0; i < 5; i++) {
var el = document.createElement("p");
el.textContent = "lorem ipsum";
temp.appendChild(el);
}
WinJS.Utilities.empty(temp);
LiveUnit.Assert.areEqual(0, temp.children.length);
}
testGetRelativeLeft() {
LiveUnit.Assert.areEqual(0, WinJS.Utilities.getRelativeLeft(null));
var temp = document.createElement("div");
temp.style.padding = "10px";
var child = document.createElement("p");
child.textContent = "lorem ipsum";
temp.appendChild(child);
document.body.appendChild(temp);
var offset = WinJS.Utilities.getRelativeLeft(child, temp);
document.body.removeChild(temp);
LiveUnit.Assert.areEqual(10, offset);
}
testGetRelativeTop() {
LiveUnit.Assert.areEqual(0, WinJS.Utilities.getRelativeTop(null));
var temp = document.createElement("div");
temp.style.padding = "10px";
var child = document.createElement("div");
child.textContent = "lorem ipsum";
temp.appendChild(child);
document.body.appendChild(temp);
var offset = WinJS.Utilities.getRelativeTop(child, temp);
document.body.removeChild(temp);
LiveUnit.Assert.areEqual(10, offset);
}
testMetrics() {
function verify(selector, dimensions) {
var utils = WinJS.Utilities;
var element = document.getElementById(selector);
LiveUnit.Assert.areEqual(dimensions[0], utils.getContentWidth(element));
LiveUnit.Assert.areEqual(dimensions[1], element.offsetWidth);
LiveUnit.Assert.areEqual(dimensions[2], utils.getTotalWidth(element));
LiveUnit.Assert.areEqual(dimensions[3], utils.getContentHeight(element));
LiveUnit.Assert.areEqual(dimensions[4], element.offsetHeight);
LiveUnit.Assert.areEqual(dimensions[5], utils.getTotalHeight(element));
}
var newNode = document.createElement("div");
newNode.id = "file-metrics-css";
newNode.innerHTML =
"" +
"" +
"" +
"" +
"" +
"";
document.body.appendChild(newNode);
try {
verify("defaults", [10, 10, 10, 20, 20, 20]);
verify("one", [10, 10, 10, 20, 20, 20]);
verify("two", [10, 16, 16, 20, 24, 24]);
verify("three", [10, 22, 22, 20, 28, 28]);
verify("four", [10, 22, 52, 20, 28, 48]);
verify("five", [10, 298, 394, 20, 308, 404]);
} finally {
document.body.removeChild(newNode);
}
}
testPositon() {
function check(x, y, childId, markup, callback?) {
var utils = WinJS.Utilities,
root,
rootPos,
child,
childPos;
root = document.createElement("div");
root.style.padding = "10px 10px 10px 10px";
root.innerHTML = markup;
document.body.appendChild(root);
if (callback) {
callback(root);
}
rootPos = utils.getPosition(root);
child = document.getElementById(childId);
childPos = utils.getPosition(child);
LiveUnit.Assert.areEqual(x, childPos.left - rootPos.left - 10);
LiveUnit.Assert.areEqual(y, childPos.top - rootPos.top - 10);
document.body.removeChild(root);
}
function checkAbsolute(x, y, childId, markup) {
var utils = WinJS.Utilities,
root,
child,
childPos;
root = document.createElement("div");
root.style.padding = "10px 10px 10px 10px";
root.innerHTML = markup;
document.body.appendChild(root);
child = document.getElementById(childId);
childPos = utils.getPosition(child);
LiveUnit.Assert.areEqual(x, childPos.left);
LiveUnit.Assert.areEqual(y, childPos.top);
document.body.removeChild(root);
}
check(10, 20, "child1", "Child1
");
check(17, 25, "child2",
"");
check(27, 31, "child4",
"");
check(90, 0, "child2",
"");
checkAbsolute(48, 48, "child1",
"" +
"
");
check(10, 20, "child2",
"",
function (root) {
var child1 = document.getElementById("child1");
child1.scrollTop = 30;
});
}
testPointerEventProxyBasic() {
testPointerEventProxy({
eventProperties: {
cancelable: true,
clientX: 19,
clientY: 46
},
eventHandler: function (e) {
LiveUnit.Assert.areEqual("touchstart", e.type, "event.type incorrectly initialized");
LiveUnit.Assert.areEqual(19, e.clientX, "event.clientX incorrectly initialized");
LiveUnit.Assert.areEqual(46, e.clientY, "event.clientY incorrectly initialized");
}
});
}
testPointerEventProxyOverrides() {
testPointerEventProxy({
eventProperties: {
cancelable: true,
clientX: 19,
clientY: 46
},
overridenProperties: {
clientX: 84
},
eventHandler: function (e) {
LiveUnit.Assert.areEqual("touchstart", e.type, "event.type incorrectly initialized");
LiveUnit.Assert.areEqual(84, e.clientX, "event.clientX should have been overriden");
LiveUnit.Assert.areEqual(46, e.clientY, "event.clientY incorrectly initialized");
}
});
}
testPointerEventProxyFunctions() {
var doDefaultAction;
doDefaultAction = testPointerEventProxy({
eventProperties: { cancelable: true }
});
LiveUnit.Assert.isTrue(doDefaultAction, "default should not have been prevented");
doDefaultAction = testPointerEventProxy({
eventProperties: { cancelable: true },
eventHandler: function (e) {
e.preventDefault();
}
});
LiveUnit.Assert.isFalse(doDefaultAction, "default should have been prevented");
}
// Verifies that WinJS.Utilities._getComputedStyle returns an object whose keys map to strings
// even when called within an iframe that is display:none.
testGetComputedStyleHelperInHiddenIframe(complete) {
var iframe = document.createElement("iframe");
iframe.style.display = "none";
iframe.src = "$(TESTDATA)/WinJSSandbox.html";
iframe.onload = function () {
var iframeGlobal = iframe.contentWindow;
var element = iframeGlobal.document.createElement("div");
iframeGlobal.document.body.appendChild(element);
var computedStyle = (iframeGlobal).WinJS.Utilities._getComputedStyle(element);
LiveUnit.Assert.isNotNull(computedStyle, "getComputedStyle helper should return an object");
LiveUnit.Assert.isTrue(typeof computedStyle.color === "string",
"getComputedStyle helper should return an object with a 'color' property that is a string ");
document.body.removeChild(iframe);
complete();
};
document.body.appendChild(iframe);
}
}
// Verifies that *setActive* gives an element focus without causing its parent scroller to scroll.
function generateTestNoScroll(rtl, setActive) {
return function (complete) {
var scroller = document.createElement("div");
var child = document.createElement("div");
if (rtl) {
scroller.setAttribute("dir", "rtl");
}
scroller.style.position = "relative";
scroller.style.overflow = "auto";
scroller.style.width = "100px";
scroller.style.height = "100px";
scroller.style.backgroundColor = "steelblue";
scroller.className = "testNoScroll";
child.style.position = "absolute";
child.style.left = (rtl ? -200 : 200) + "px";
child.style.top = "200px";
child.style.width = "50px";
child.style.height = "50px";
child.tabIndex = 0;
child.style.backgroundColor = "orange";
scroller.appendChild(child);
document.body.appendChild(scroller);
var initPos = { scrollLeft: 5, scrollTop: 8 };
Helper.waitForScroll(scroller).then(function () {
var pos = WinJS.Utilities.getScrollPosition(scroller);
LiveUnit.Assert.areEqual(initPos.scrollLeft, pos.scrollLeft, "scrollLeft wasn't initialized properly");
LiveUnit.Assert.areEqual(initPos.scrollTop, pos.scrollTop, "scrollTop wasn't initialized properly");
return Helper.waitForFocus(child, function () {
setActive(child, scroller);
});
}).then(function () {
// Post to guarantee we aren't running within a focus handler. Within a focus handler, the
// setActive helper may not have restored the scroll position yet.
return WinJS.Promise.timeout();
}).then(function () {
var pos = WinJS.Utilities.getScrollPosition(scroller);
LiveUnit.Assert.areEqual(child, document.activeElement, "Focus should have been moved to child");
LiveUnit.Assert.areEqual(initPos.scrollLeft, pos.scrollLeft, "scroller's scrollLeft shouldn't have changed");
LiveUnit.Assert.areEqual(initPos.scrollTop, pos.scrollTop, "scroller's scrollTop shouldn't have changed");
scroller.parentNode && scroller.parentNode.removeChild(scroller);
complete();
});
WinJS.Utilities.setScrollPosition(scroller, initPos);
};
};
// Sets the tabIndex before calling *setActiveWithin*.
function setActiveWithinWithTabIndex(tabIndex, setActiveWithin) {
return function (elem, scroller) {
elem.tabIndex = tabIndex;
setActiveWithin(scroller, scroller);
};
}
var Utils = WinJS.Utilities;
var setActiveTests = {
_setActive: Utils._setActive.bind(Utils),
_trySetActive: Utils._trySetActive.bind(Utils),
_setActiveFirstFocusableElement0: setActiveWithinWithTabIndex(0, Utils._setActiveFirstFocusableElement.bind(Utils)),
_setActiveFirstFocusableElementPos: setActiveWithinWithTabIndex(1, Utils._setActiveFirstFocusableElement.bind(Utils)),
_setActiveLastFocusableElement0: setActiveWithinWithTabIndex(0, Utils._setActiveLastFocusableElement.bind(Utils)),
_setActiveLastFocusableElementPos: setActiveWithinWithTabIndex(1, Utils._setActiveLastFocusableElement.bind(Utils)),
};
Object.keys(setActiveTests).forEach(function (name) {
Utilities.prototype["testNoScroll" + name + "_ltr"] = generateTestNoScroll(false, setActiveTests[name]);
Utilities.prototype["testNoScroll" + name + "_rtl"] = generateTestNoScroll(true, setActiveTests[name]);
});
}
LiveUnit.registerTestClass("CorsicaTests.Utilities");