// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
module CorsicaTests {
var testElementId = "accent-test-element";
var testElementId2 = "foo";
var testElement: HTMLDivElement;
var testElement2: HTMLDivElement;
var Accents = WinJS.UI._Accents;
function getDynamicStyleElement() {
return document.head.querySelector("#WinJSAccentsStyle");
}
export class AccentTests {
setUp() {
Accents._reset();
testElement = document.createElement("div");
testElement2 = document.createElement("div");
testElement.id = testElementId;
testElement2.id = testElementId;
document.body.appendChild(testElement);
document.body.appendChild(testElement2);
}
tearDown() {
document.body.parentElement.classList.remove("win-ui-light");
testElement && testElement.parentElement && testElement.parentElement.removeChild(testElement);
testElement2 && testElement2.parentElement && testElement2.parentElement.removeChild(testElement2);
testElement = testElement2 = null;
}
testCreateAccentRuleSimple(complete) {
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.accent], getComputedStyle(testElement).color);
Accents.createAccentRule("#accent-test-element", [{ name: "color", value: Accents.ColorTypes.accent }]);
WinJS.Promise.timeout().done(() => {
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "#accent-test-element");
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes.accent], getComputedStyle(testElement).color);
complete();
});
}
testCreateAccentRuleInverse(complete) {
document.body.parentElement.classList.add("win-ui-light");
var cs = getComputedStyle(testElement);
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes._listSelectRestInverse], cs.backgroundColor);
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes._listSelectHoverInverse], cs.borderBottomColor);
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes._listSelectPressInverse], cs.outlineColor);
Accents.createAccentRule("#accent-test-element", [
{ name: "background-color", value: Accents.ColorTypes.listSelectRest },
{ name: "border-bottom-color", value: Accents.ColorTypes.listSelectHover },
{ name: "outline-color", value: Accents.ColorTypes.listSelectPress },
]);
WinJS.Promise.timeout().done(() => {
var expectedlistSelectPressInverseColor = Accents._colors[Accents.ColorTypes._listSelectPressInverse];
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes._listSelectRestInverse], getComputedStyle(testElement).backgroundColor);
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes._listSelectHoverInverse], getComputedStyle(testElement).borderBottomColor);
// Some browsers end up computing 'rgba(x,x,x,0.7)' to 'rgba(x,x,x,0.70196)' so we have to change the assertion
LiveUnit.Assert.stringContains(getComputedStyle(testElement).outlineColor, (expectedlistSelectPressInverseColor.substr(0, expectedlistSelectPressInverseColor.length - 2)));
complete();
});
}
testCreateAccentRuleInverseHover(complete) {
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.listSelectHover], getComputedStyle(testElement).color);
Accents.createAccentRule("html.win-hoverable #accent-test-element", [{ name: "color", value: Accents.ColorTypes.listSelectHover }]);
WinJS.Promise.timeout().done(() => {
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "html.win-hoverable #accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "html.win-hoverable .win-ui-light #accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "html.win-hoverable .win-ui-light#accent-test-element");
complete();
});
}
testCreateAccentRuleInverseHoverNoLeadingToken(complete) {
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.listSelectHover], getComputedStyle(testElement).color);
Accents.createAccentRule("html.win-hoverable randomTag", [{ name: "color", value: Accents.ColorTypes.listSelectHover }]);
WinJS.Promise.timeout().done(() => {
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "html.win-hoverable randomTag");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "html.win-hoverable .win-ui-light randomTag");
LiveUnit.Assert.stringDoesNotContain(getDynamicStyleElement().textContent, "html.win-hoverable .win-ui-lightrandomTag");
complete();
});
}
testCreateAccentRuleInverseHoverWithWhitespace(complete) {
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.listSelectHover], getComputedStyle(testElement).color);
Accents.createAccentRule(" html.win-hoverable #accent-test-element ", [{ name: "color", value: Accents.ColorTypes.listSelectHover }]);
WinJS.Promise.timeout().done(() => {
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "html.win-hoverable #accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "html.win-hoverable .win-ui-light #accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "html.win-hoverable .win-ui-light#accent-test-element");
complete();
});
}
testCreateAccentRuleInverseNoLeadingToken(complete) {
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.listSelectHover], getComputedStyle(testElement).color);
Accents.createAccentRule("randomTag", [{ name: "color", value: Accents.ColorTypes.listSelectHover }]);
WinJS.Promise.timeout().done(() => {
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "randomTag");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, ".win-ui-light randomTag");
LiveUnit.Assert.stringDoesNotContain(getDynamicStyleElement().textContent, ".win-ui-lightrandomTag");
complete();
});
}
testMultipleSelectors(complete) {
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.accent], getComputedStyle(testElement).color);
Accents.createAccentRule("#accent-test-element, #foo", [{ name: "color", value: Accents.ColorTypes.accent }]);
WinJS.Promise.timeout().done(() => {
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "#accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "#foo");
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes.accent], getComputedStyle(testElement).color);
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes.accent], getComputedStyle(testElement2).color);
complete();
});
}
testMultipleSelectorsWithWhitespace(complete) {
Accents.createAccentRule(" #accent-test-element , #foo ", [{ name: "color", value: Accents.ColorTypes.accent }]);
WinJS.Promise.timeout().done(() => {
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "#accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "#foo");
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes.accent], getComputedStyle(testElement).color);
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes.accent], getComputedStyle(testElement2).color);
complete();
});
}
testMultipleSelectorsInverse(complete) {
document.body.parentElement.classList.add("win-ui-light");
var cs = getComputedStyle(testElement);
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes._listSelectRestInverse], cs.backgroundColor);
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes._listSelectHoverInverse], cs.borderBottomColor);
Accents.createAccentRule("randomTag, #accent-test-element", [
{ name: "background-color", value: Accents.ColorTypes.listSelectRest },
{ name: "border-bottom-color", value: Accents.ColorTypes.listSelectHover },
]);
WinJS.Promise.timeout().done(() => {
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "randomTag");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "#accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, ".win-ui-light #accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, ".win-ui-light#accent-test-element");
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, ".win-ui-light randomTag");
LiveUnit.Assert.stringDoesNotContain(getDynamicStyleElement().textContent, ".win-ui-lightrandomTag");
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes._listSelectRestInverse], getComputedStyle(testElement).backgroundColor);
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes._listSelectHoverInverse], getComputedStyle(testElement).borderBottomColor);
complete();
});
}
testMultiPropertyRule(complete) {
var cs = getComputedStyle(testElement);
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.accent], cs.color);
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.listSelectRest], cs.backgroundColor);
LiveUnit.Assert.areNotEqual(Accents._colors[Accents.ColorTypes.listSelectHover], cs.borderBottomColor);
Accents.createAccentRule("#accent-test-element", [
{ name: "color", value: Accents.ColorTypes.accent },
{ name: "background-color", value: Accents.ColorTypes.listSelectRest },
{ name: "border-bottom-color", value: Accents.ColorTypes.listSelectHover },
{ name: "outline-color", value: Accents.ColorTypes.listSelectPress },
]);
WinJS.Promise.timeout().done(() => {
var expectedlistSelectPressColor = Accents._colors[Accents.ColorTypes.listSelectPress];
cs = getComputedStyle(testElement);
LiveUnit.Assert.stringContains(getDynamicStyleElement().textContent, "#accent-test-element");
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes.accent], cs.color);
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes.listSelectRest], cs.backgroundColor);
LiveUnit.Assert.areEqual(Accents._colors[Accents.ColorTypes.listSelectHover], cs.borderBottomColor);
// Some browsers end up computing 'rgba(x,x,x,0.9)' to 'rgba(x,x,x,0.90196)' so we have to change the assertion
LiveUnit.Assert.stringContains(getComputedStyle(testElement).outlineColor, (expectedlistSelectPressColor.substr(0, expectedlistSelectPressColor.length - 2)));
complete();
});
}
verifyThemeDetection(args: {
iframeSrc: string;
verify(iframeWinJS: typeof WinJS): void;
complete(): void;
}) {
var iframe = document.createElement("iframe");
iframe.src = args.iframeSrc;
iframe.width = "500";
iframe.height = "500";
iframe.onload = function () {
var iframeGlobal = iframe.contentWindow;
var iframeWinJS = (iframe.contentWindow).WinJS;
args.verify(iframeWinJS);
args.complete();
};
testElement.appendChild(iframe);
}
testThemeDetectionUiDark(complete) {
this.verifyThemeDetection({
iframeSrc: "$(TESTDATA)/WinJSSandbox.html",
verify: (iframeWinJS) => {
LiveUnit.Assert.isTrue(iframeWinJS.UI._Accents._isDarkTheme,
"Accent color system should have detected the dark stylesheet theme");
},
complete: complete
});
}
testThemeDetectionUiLight(complete) {
this.verifyThemeDetection({
iframeSrc: "$(TESTDATA)/WinJSSandboxLight.html",
verify: (iframeWinJS) => {
LiveUnit.Assert.isFalse(iframeWinJS.UI._Accents._isDarkTheme,
"Accent color system should have detected the light stylesheet theme");
},
complete: complete
});
}
testAccentsInDisplayNoneIFrameDoesNotCrash(complete) {
var iframe = document.createElement("iframe");
iframe.style.display = "none";
iframe.src = "$(TESTDATA)/WinJSSandbox.html";
document.body.appendChild(iframe);
iframe.contentWindow.onerror = () => {
LiveUnit.Assert.fail("Exception in loading WinJS in a display:none iframe");
};
iframe.onload = complete;
}
}
}
LiveUnit.registerTestClass("CorsicaTests.AccentTests");