// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
//
///
module WinJSTests {
interface ListeningModeStateChangedEvent extends CustomEvent {
label: string;
state: string;
}
var ListeningModeStateChangedEventName = "ListeningStateChanged";
var DisambiguationText = "Item One";
function fireActiveMode(element: HTMLElement, label: string) {
var e = document.createEvent("CustomEvent");
e.initCustomEvent(ListeningModeStateChangedEventName, true, false, null);
e.state = "active";
e.label = label;
element.dispatchEvent(e);
}
function fireDisambigMode(element: HTMLElement, label: string) {
var e = document.createEvent("CustomEvent");
e.initCustomEvent(ListeningModeStateChangedEventName, true, false, null);
e.state = "disambiguation";
e.label = label;
element.dispatchEvent(e);
}
function fireInactiveMode(element: HTMLElement) {
var e = document.createEvent("CustomEvent");
e.initCustomEvent(ListeningModeStateChangedEventName, true, false, null);
e.state = "inactive";
e.label = null;
element.dispatchEvent(e);
}
function simulateVuiStateChanges(
element: HTMLElement,
activeHandler: (e: ListeningModeStateChangedEvent) => any,
disambigHandler: (e: ListeningModeStateChangedEvent) => any,
inactiveHandler: (e: ListeningModeStateChangedEvent) => any,
completeHandler?: Function) {
function handler(e: ListeningModeStateChangedEvent) {
if (e.target !== element) {
return;
}
switch (e.state) {
case "active":
activeHandler(e);
break;
case "disambiguation":
disambigHandler(e);
break;
case "inactive":
inactiveHandler(e);
break;
}
}
document.addEventListener(ListeningModeStateChangedEventName, handler);
var origText = element.textContent;
var activeText = element.getAttribute("aria-label")
// Inactive > Active > Inactive
fireActiveMode(element, activeText);
fireInactiveMode(element);
// Inactive > Active > Disambiguation > Inactive
fireActiveMode(element, activeText);
fireDisambigMode(element, DisambiguationText);
fireInactiveMode(element);
// Inactive > Active > Disambiguation > Active > Inactive
fireActiveMode(element, activeText);
fireDisambigMode(element, DisambiguationText);
fireActiveMode(element, activeText);
fireInactiveMode(element);
// Inactive > Active > Disambiguation > Active > Disambiguation > Inactive
fireActiveMode(element, activeText);
fireDisambigMode(element, DisambiguationText);
fireActiveMode(element, activeText);
fireDisambigMode(element, DisambiguationText);
fireInactiveMode(element);
document.removeEventListener(ListeningModeStateChangedEventName, handler);
completeHandler && completeHandler();
}
export class VUITests {
testContainer: HTMLElement;
setUp() {
this.testContainer = document.createElement("div");
document.body.appendChild(this.testContainer);
}
tearDown() {
this.testContainer.parentElement.removeChild(this.testContainer);
this.testContainer = null;
}
testButton() {
var inactiveText = "Inactive Text";
var activeText = "Active Text";
var button = document.createElement("button");
button.textContent = inactiveText;
button.setAttribute("aria-label", activeText);
this.testContainer.appendChild(button);
simulateVuiStateChanges(button,
e => {
// Active
LiveUnit.Assert.isTrue(button.classList.contains("win-vui-active"));
LiveUnit.Assert.isFalse(button.classList.contains("win-vui-disambiguation"));
LiveUnit.Assert.areEqual(activeText, button.textContent);
},
e => {
// Disambig
LiveUnit.Assert.isTrue(button.classList.contains("win-vui-active"));
LiveUnit.Assert.isTrue(button.classList.contains("win-vui-disambiguation"));
LiveUnit.Assert.areEqual(DisambiguationText, button.textContent);
},
e => {
// Inactive
LiveUnit.Assert.isFalse(button.classList.contains("win-vui-active"));
LiveUnit.Assert.isFalse(button.classList.contains("win-vui-disambiguation"));
LiveUnit.Assert.areEqual(inactiveText, button.textContent);
});
}
testButtonWithChildren() {
var activeText = "Active Text";
var button = document.createElement("button");
button.setAttribute("aria-label", activeText);
button.innerHTML = "A button with two spans in it";
this.testContainer.appendChild(button);
var span1 = button.children[0];
var span2 = button.children[1];
var inactiveText = button.textContent;
simulateVuiStateChanges(button,
e => {
// Active
LiveUnit.Assert.areEqual(activeText, button.textContent);
},
e => {
// Disambig
LiveUnit.Assert.areEqual(DisambiguationText, button.textContent);
},
e => {
// Inactive
LiveUnit.Assert.areEqual(inactiveText, button.textContent);
LiveUnit.Assert.areEqual(2, button.childElementCount);
LiveUnit.Assert.isTrue(button.children[0] === span1);
LiveUnit.Assert.isTrue(button.children[1] === span2);
});
}
testButtonFreezesSize() {
var activeText = "This text is so long it is going to make the button grow ridiculously!!";
var button = document.createElement("button");
button.textContent = "Hello World";
button.setAttribute("aria-label", activeText);
this.testContainer.appendChild(button);
var origWidth = parseFloat(getComputedStyle(button).width);
var origHeight = parseFloat(getComputedStyle(button).height);
if ((origWidth | 0) !== button.offsetWidth) {
// On IE11, getComputedStyle returns the wrong actual dimensions, skip test
return;
}
simulateVuiStateChanges(button,
e => {
// Active
var cs = getComputedStyle(button);
LiveUnit.Assert.areEqual(origWidth, parseFloat(cs.width));
LiveUnit.Assert.areEqual(origHeight, parseFloat(cs.height));
},
e => {
// Disambig
var cs = getComputedStyle(button);
LiveUnit.Assert.areEqual(origWidth, parseFloat(cs.width));
LiveUnit.Assert.areEqual(origHeight, parseFloat(cs.height));
},
e => {
// Inactive
var cs = getComputedStyle(button);
LiveUnit.Assert.areEqual(origWidth, parseFloat(cs.width));
LiveUnit.Assert.areEqual(origHeight, parseFloat(cs.height));
});
}
}
}
LiveUnit.registerTestClass("WinJSTests.VUITests");