|
1 /* vim: set ts=2 et sw=2 tw=80: */ |
|
2 /* Any copyright is dedicated to the Public Domain. |
|
3 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
4 |
|
5 "use strict"; |
|
6 |
|
7 const cssAutoCompleter = require("devtools/sourceeditor/css-autocompleter"); |
|
8 const { Cc, Ci } = require("chrome"); |
|
9 |
|
10 const CSS_URI = "http://mochi.test:8888/browser/browser/devtools/sourceeditor" + |
|
11 "/test/css_statemachine_testcases.css"; |
|
12 const TESTS_URI = "http://mochi.test:8888/browser/browser/devtools/sourceeditor" + |
|
13 "/test/css_statemachine_tests.json"; |
|
14 |
|
15 const source = read(CSS_URI); |
|
16 const tests = eval(read(TESTS_URI)); |
|
17 |
|
18 const TEST_URI = "data:text/html;charset=UTF-8," + encodeURIComponent( |
|
19 ["<!DOCTYPE html>", |
|
20 "<html>", |
|
21 " <head>", |
|
22 " <title>CSS State machine tests.</title>", |
|
23 " <style type='text/css'>", |
|
24 "#progress {", |
|
25 " width: 500px; height: 30px;", |
|
26 " border: 1px solid black;", |
|
27 " position: relative", |
|
28 "}", |
|
29 "#progress div {", |
|
30 " width: 0%; height: 100%;", |
|
31 " background: green;", |
|
32 " position: absolute;", |
|
33 " z-index: -1; top: 0", |
|
34 "}", |
|
35 "#progress.failed div {", |
|
36 " background: red !important;", |
|
37 "}", |
|
38 "#progress.failed:after {", |
|
39 " content: 'Some tests failed';", |
|
40 " color: white", |
|
41 "}", |
|
42 "#progress:before {", |
|
43 " content: 'Running test ' attr(data-progress) ' of " + tests.length + "';", |
|
44 " color: white;", |
|
45 " text-shadow: 0 0 2px darkgreen;", |
|
46 "}", |
|
47 " </style>", |
|
48 " </head>", |
|
49 " <body>", |
|
50 " <h2>State machine tests for CSS autocompleter.</h2><br>", |
|
51 " <div id='progress' data-progress='0'>", |
|
52 " <div></div>", |
|
53 " </div>", |
|
54 " </body>", |
|
55 " </html>" |
|
56 ].join("\n")); |
|
57 |
|
58 let doc = null; |
|
59 function test() { |
|
60 waitForExplicitFinish(); |
|
61 gBrowser.selectedTab = gBrowser.addTab(); |
|
62 gBrowser.selectedBrowser.addEventListener("load", function onload() { |
|
63 gBrowser.selectedBrowser.removeEventListener("load", onload, true); |
|
64 doc = content.document; |
|
65 runTests(); |
|
66 }, true); |
|
67 content.location = TEST_URI; |
|
68 } |
|
69 |
|
70 function runTests() { |
|
71 let completer = new cssAutoCompleter(); |
|
72 let checkState = state => { |
|
73 if (state[0] == 'null' && (!completer.state || completer.state == 'null')) { |
|
74 return true; |
|
75 } else if (state[0] == completer.state && state[0] == 'selector' && |
|
76 state[1] == completer.selectorState && |
|
77 state[2] == completer.completing && |
|
78 state[3] == completer.selector) { |
|
79 return true; |
|
80 } else if (state[0] == completer.state && state[0] == 'value' && |
|
81 state[2] == completer.completing && |
|
82 state[3] == completer.propertyName) { |
|
83 return true; |
|
84 } else if (state[0] == completer.state && |
|
85 state[2] == completer.completing && |
|
86 state[0] != 'selector' && state[0] != 'value') { |
|
87 return true; |
|
88 } |
|
89 return false; |
|
90 }; |
|
91 |
|
92 let progress = doc.getElementById("progress"); |
|
93 let progressDiv = doc.querySelector("#progress > div"); |
|
94 let i = 0; |
|
95 for (let test of tests) { |
|
96 progress.dataset.progress = ++i; |
|
97 progressDiv.style.width = 100*i/tests.length + "%"; |
|
98 completer.resolveState(limit(source, test[0]), |
|
99 {line: test[0][0], ch: test[0][1]}); |
|
100 if (checkState(test[1])) { |
|
101 ok(true, "Test " + i + " passed. "); |
|
102 } |
|
103 else { |
|
104 ok(false, "Test " + i + " failed. Expected state : [" + test[1] + "] but" + |
|
105 " found [" + completer.state + ", " + completer.selectorState + ", " + |
|
106 completer.completing + ", " + |
|
107 (completer.propertyName || completer.selector) + "]."); |
|
108 progress.classList.add("failed"); |
|
109 } |
|
110 } |
|
111 gBrowser.removeCurrentTab(); |
|
112 finish(); |
|
113 } |