summaryrefslogtreecommitdiffstats
path: root/devtools/client/sourceeditor/test/browser_css_getInfo.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/sourceeditor/test/browser_css_getInfo.js')
-rw-r--r--devtools/client/sourceeditor/test/browser_css_getInfo.js176
1 files changed, 176 insertions, 0 deletions
diff --git a/devtools/client/sourceeditor/test/browser_css_getInfo.js b/devtools/client/sourceeditor/test/browser_css_getInfo.js
new file mode 100644
index 000000000..21b0b92b9
--- /dev/null
+++ b/devtools/client/sourceeditor/test/browser_css_getInfo.js
@@ -0,0 +1,176 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const CSSCompleter =
+ require("devtools/client/sourceeditor/css-autocompleter");
+
+const source = [
+ ".devtools-toolbar {",
+ " -moz-appearance: none;",
+ " padding:4px 3px;border-bottom-width: 1px;",
+ " border-bottom-style: solid;",
+ "}",
+ "",
+ "#devtools-menu.devtools-menulist,",
+ ".devtools-toolbarbutton#devtools-menu {",
+ " -moz-appearance: none;",
+ " -moz-box-align: center;",
+ " min-width: 78px;",
+ " min-height: 22px;",
+ " text-shadow: 0 -1px 0 hsla(210,8%,5%,.45);",
+ " border: 1px solid hsla(210,8%,5%,.45);",
+ " border-radius: 3px;",
+ " background: linear-gradient(hsla(212,7%,57%,.35),",
+ " hsla(212,7%,57%,.1)) padding-box;",
+ " margin: 0 3px;",
+ " color: inherit;",
+ "}",
+ "",
+ ".devtools-toolbarbutton > hbox.toolbarbutton-menubutton-button {",
+ " -moz-box-orient: horizontal;",
+ "}",
+ "",
+ ".devtools-menulist:active,",
+ "#devtools-toolbarbutton:focus {",
+ " outline: 1px dotted hsla(210,30%,85%,0.7);",
+ " outline-offset : -4px;",
+ "}",
+ "",
+ ".devtools-toolbarbutton:not([label]) {",
+ " min-width: 32px;",
+ "}",
+ "",
+ ".devtools-toolbarbutton:not([label]) > .toolbarbutton-text, .devtools-toolbar {",
+ " display: none;",
+ "}",
+].join("\n");
+
+// Format of test cases :
+// [
+// {line, ch}, - The caret position at which the getInfo call should be made
+// expectedState, - The expected state at the caret
+// expectedSelector, - The expected selector for the state
+// expectedProperty, - The expected property name for states value and property
+// expectedValue, - If state is value, then the expected value
+// ]
+const tests = [
+ [{line: 0, ch: 13}, "selector", ".devtools-toolbar"],
+ [{line: 8, ch: 13}, "property", ["#devtools-menu.devtools-menulist",
+ ".devtools-toolbarbutton#devtools-menu "], "-moz-appearance"],
+ [{line: 28, ch: 25}, "value", [".devtools-menulist:active",
+ "#devtools-toolbarbutton:focus "], "outline-offset", "-4px"],
+ [{line: 4, ch: 1}, "null"],
+ [{line: 5, ch: 0}, "null"],
+ [{line: 31, ch: 13}, "selector", ".devtools-toolbarbutton:not([label])"],
+ [{line: 35, ch: 23}, "selector", ".devtools-toolbarbutton:not([label]) > .toolbarbutton-text"],
+ [{line: 35, ch: 70}, "selector", ".devtools-toolbar"],
+ [{line: 27, ch: 14}, "value", [".devtools-menulist:active",
+ "#devtools-toolbarbutton:focus "], "outline", "1px dotted hsla(210,30%,85%,0.7)"],
+ [{line: 16, ch: 16}, "value", ["#devtools-menu.devtools-menulist",
+ ".devtools-toolbarbutton#devtools-menu "], "background",
+ "linear-gradient(hsla(212,7%,57%,.35),\n hsla(212,7%,57%,.1)) padding-box"],
+ [{line: 16, ch: 3}, "value", ["#devtools-menu.devtools-menulist",
+ ".devtools-toolbarbutton#devtools-menu "], "background",
+ "linear-gradient(hsla(212,7%,57%,.35),\n hsla(212,7%,57%,.1)) padding-box"],
+ [{line: 15, ch: 25}, "value", ["#devtools-menu.devtools-menulist",
+ ".devtools-toolbarbutton#devtools-menu "], "background",
+ "linear-gradient(hsla(212,7%,57%,.35),\n hsla(212,7%,57%,.1)) padding-box"],
+];
+
+const TEST_URI = "data:text/html;charset=UTF-8," + encodeURIComponent(
+ ["<!DOCTYPE html>",
+ "<html>",
+ " <head>",
+ " <title>CSS contextual information tests.</title>",
+ " <style type='text/css'>",
+ "#progress {",
+ " width: 500px; height: 30px;",
+ " border: 1px solid black;",
+ " position: relative",
+ "}",
+ "#progress div {",
+ " width: 0%; height: 100%;",
+ " background: green;",
+ " position: absolute;",
+ " z-index: -1; top: 0",
+ "}",
+ "#progress.failed div {",
+ " background: red !important;",
+ "}",
+ "#progress.failed:after {",
+ " content: 'Some tests failed';",
+ " color: white",
+ "}",
+ "#progress:before {",
+ " content: 'Running test ' attr(data-progress) ' of " + tests.length + "';",
+ " color: white;",
+ " text-shadow: 0 0 2px darkgreen;",
+ "}",
+ " </style>",
+ " </head>",
+ " <body>",
+ " <h2>State machine tests for CSS autocompleter.</h2><br>",
+ " <div id='progress' data-progress='0'>",
+ " <div></div>",
+ " </div>",
+ " </body>",
+ " </html>"
+ ].join("\n"));
+
+let doc = null;
+function test() {
+ waitForExplicitFinish();
+ gBrowser.selectedTab = gBrowser.addTab();
+ BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
+ doc = content.document;
+ runTests();
+ });
+ gBrowser.loadURI(TEST_URI);
+}
+
+function runTests() {
+ let completer = new CSSCompleter({cssProperties: getClientCssProperties()});
+ let matches = (arr, toCheck) => !arr.some((x, i) => x != toCheck[i]);
+ let checkState = (expected, actual) => {
+ if (expected[0] == "null" && actual == null) {
+ return true;
+ } else if (expected[0] == actual.state && expected[0] == "selector" &&
+ expected[1] == actual.selector) {
+ return true;
+ } else if (expected[0] == actual.state && expected[0] == "property" &&
+ matches(expected[1], actual.selectors) &&
+ expected[2] == actual.propertyName) {
+ return true;
+ } else if (expected[0] == actual.state && expected[0] == "value" &&
+ matches(expected[1], actual.selectors) &&
+ expected[2] == actual.propertyName &&
+ expected[3] == actual.value) {
+ return true;
+ }
+ return false;
+ };
+
+ let progress = doc.getElementById("progress");
+ let progressDiv = doc.querySelector("#progress > div");
+ let i = 0;
+ for (let expected of tests) {
+ let caret = expected.splice(0, 1)[0];
+ progress.dataset.progress = ++i;
+ progressDiv.style.width = 100 * i / tests.length + "%";
+ let actual = completer.getInfoAt(source, caret);
+ if (checkState(expected, actual)) {
+ ok(true, "Test " + i + " passed. ");
+ } else {
+ ok(false, "Test " + i + " failed. Expected state : [" + expected + "] " +
+ "but found [" + actual.state + ", " +
+ (actual.selector || actual.selectors) + ", " +
+ actual.propertyName + ", " + actual.value + "].");
+ progress.classList.add("failed");
+ }
+ }
+ gBrowser.removeCurrentTab();
+ finish();
+}