|
1 <!doctype html> |
|
2 <html> |
|
3 <head> |
|
4 <meta charset="utf-8"> |
|
5 <title>CodeMirror: VIM/Emacs tests</title> |
|
6 <link rel="stylesheet" href="chrome://browser/content/devtools/codemirror/codemirror.css"> |
|
7 <link rel="stylesheet" href="cm_mode_test.css"> |
|
8 <!--<link rel="stylesheet" href="../doc/docs.css">--> |
|
9 |
|
10 <script src="chrome://browser/content/devtools/codemirror/codemirror.js"></script> |
|
11 <script src="chrome://browser/content/devtools/codemirror/searchcursor.js"></script> |
|
12 <script src="chrome://browser/content/devtools/codemirror/dialog.js"></script> |
|
13 <script src="chrome://browser/content/devtools/codemirror/matchbrackets.js"></script> |
|
14 <script src="chrome://browser/content/devtools/codemirror/comment.js"></script> |
|
15 <script src="chrome://browser/content/devtools/codemirror/javascript.js"></script> |
|
16 <script src="chrome://browser/content/devtools/codemirror/vim.js"></script> |
|
17 <script src="chrome://browser/content/devtools/codemirror/sublime.js"></script> |
|
18 <script src="chrome://browser/content/devtools/codemirror/emacs.js"></script> |
|
19 |
|
20 <!--<script src="../addon/mode/overlay.js"></script> |
|
21 <script src="../addon/mode/multiplex.js"></script> |
|
22 <script src="../mode/xml/xml.js"></script>--> |
|
23 |
|
24 <style type="text/css"> |
|
25 .ok {color: #090;} |
|
26 .fail {color: #e00;} |
|
27 .error {color: #c90;} |
|
28 .done {font-weight: bold;} |
|
29 #progress { |
|
30 background: #45d; |
|
31 color: white; |
|
32 text-shadow: 0 0 1px #45d, 0 0 2px #45d, 0 0 3px #45d; |
|
33 font-weight: bold; |
|
34 white-space: pre; |
|
35 } |
|
36 #testground { |
|
37 visibility: hidden; |
|
38 } |
|
39 #testground.offscreen { |
|
40 visibility: visible; |
|
41 position: absolute; |
|
42 left: -10000px; |
|
43 top: -10000px; |
|
44 } |
|
45 .CodeMirror { border: 1px solid black; } |
|
46 </style> |
|
47 </head> |
|
48 <body> |
|
49 <h1>CodeMirror: VIM/Emacs tests</h1> |
|
50 |
|
51 <p>A limited set of programmatic sanity tests for CodeMirror.</p> |
|
52 |
|
53 <div style="border: 1px solid black; padding: 1px; max-width: 700px;"> |
|
54 <div style="width: 0px;" id=progress><div style="padding: 3px;">Ran <span id="progress_ran">0</span><span id="progress_total"> of 0</span> tests</div></div> |
|
55 </div> |
|
56 <p id=status>Please enable JavaScript...</p> |
|
57 <div id=output></div> |
|
58 |
|
59 <div id=testground></div> |
|
60 |
|
61 <script src="cm_driver.js"></script> |
|
62 <script src="cm_sublime_test.js"></script> |
|
63 <script src="cm_vim_test.js"></script> |
|
64 <script src="cm_emacs_test.js"></script> |
|
65 |
|
66 <!-- Basic tests are in codemirror.html |
|
67 <script src="cm_driver.js"></script> |
|
68 <script src="cm_test.js"></script> |
|
69 <script src="cm_comment_test.js"></script> |
|
70 <script src="cm_doc_test.js"></script> |
|
71 <script src="cm_driver.js"></script> |
|
72 <script src="cm_emacs_test.js"></script> |
|
73 <script src="cm_mode_test.js"></script> |
|
74 <script src="cm_mode_javascript_test.js"></script> |
|
75 <script src="cm_multi_test.js"></script> |
|
76 <script src="cm_search_test.js"></script> |
|
77 --> |
|
78 |
|
79 <!-- These modes/addons are not used by Editor |
|
80 <script src="doc_test.js"></script> |
|
81 <script src="../mode/css/css.js"></script> |
|
82 <script src="../mode/css/test.js"></script> |
|
83 <script src="../mode/css/scss_test.js"></script> |
|
84 <script src="../mode/xml/xml.js"></script> |
|
85 <script src="../mode/htmlmixed/htmlmixed.js"></script> |
|
86 <script src="../mode/ruby/ruby.js"></script> |
|
87 <script src="../mode/haml/haml.js"></script> |
|
88 <script src="../mode/haml/test.js"></script> |
|
89 <script src="../mode/markdown/markdown.js"></script> |
|
90 <script src="../mode/markdown/test.js"></script> |
|
91 <script src="../mode/gfm/gfm.js"></script> |
|
92 <script src="../mode/gfm/test.js"></script> |
|
93 <script src="../mode/stex/stex.js"></script> |
|
94 <script src="../mode/stex/test.js"></script> |
|
95 <script src="../mode/xquery/xquery.js"></script> |
|
96 <script src="../mode/xquery/test.js"></script> |
|
97 <script src="../addon/mode/multiplex_test.js"></script>--> |
|
98 |
|
99 <script> |
|
100 window.onload = runHarness; |
|
101 CodeMirror.on(window, 'hashchange', runHarness); |
|
102 |
|
103 function esc(str) { |
|
104 return str.replace(/[<&]/, function(ch) { return ch == "<" ? "<" : "&"; }); |
|
105 } |
|
106 |
|
107 var output = document.getElementById("output"), |
|
108 progress = document.getElementById("progress"), |
|
109 progressRan = document.getElementById("progress_ran").childNodes[0], |
|
110 progressTotal = document.getElementById("progress_total").childNodes[0]; |
|
111 |
|
112 var count = 0, |
|
113 failed = 0, |
|
114 skipped = 0, |
|
115 bad = "", |
|
116 running = false, // Flag that states tests are running |
|
117 quit = false, // Flag to quit tests ASAP |
|
118 verbose = false, // Adds message for *every* test to output |
|
119 phantom = false; |
|
120 |
|
121 function runHarness(){ |
|
122 if (running) { |
|
123 quit = true; |
|
124 setStatus("Restarting tests...", '', true); |
|
125 setTimeout(function(){runHarness();}, 500); |
|
126 return; |
|
127 } |
|
128 filters = []; |
|
129 verbose = false; |
|
130 if (window.location.hash.substr(1)){ |
|
131 var strings = window.location.hash.substr(1).split(","); |
|
132 while (strings.length) { |
|
133 var s = strings.shift(); |
|
134 if (s === "verbose") |
|
135 verbose = true; |
|
136 else |
|
137 filters.push(parseTestFilter(decodeURIComponent(s))); |
|
138 } |
|
139 } |
|
140 quit = false; |
|
141 running = true; |
|
142 setStatus("Loading tests..."); |
|
143 count = 0; |
|
144 failed = 0; |
|
145 skipped = 0; |
|
146 bad = ""; |
|
147 totalTests = countTests(); |
|
148 progressTotal.nodeValue = " of " + totalTests; |
|
149 progressRan.nodeValue = count; |
|
150 output.innerHTML = ''; |
|
151 document.getElementById("testground").innerHTML = "<form>" + |
|
152 "<textarea id=\"code\" name=\"code\"></textarea>" + |
|
153 "<input type=submit value=ok name=submit>" + |
|
154 "</form>"; |
|
155 runTests(displayTest); |
|
156 } |
|
157 |
|
158 function setStatus(message, className, force){ |
|
159 if (quit && !force) return; |
|
160 if (!message) throw("must provide message"); |
|
161 var status = document.getElementById("status").childNodes[0]; |
|
162 status.nodeValue = message; |
|
163 status.parentNode.className = className; |
|
164 } |
|
165 function addOutput(name, className, code){ |
|
166 var newOutput = document.createElement("dl"); |
|
167 var newTitle = document.createElement("dt"); |
|
168 newTitle.className = className; |
|
169 newTitle.appendChild(document.createTextNode(name)); |
|
170 newOutput.appendChild(newTitle); |
|
171 var newMessage = document.createElement("dd"); |
|
172 newMessage.innerHTML = code; |
|
173 newOutput.appendChild(newTitle); |
|
174 newOutput.appendChild(newMessage); |
|
175 output.appendChild(newOutput); |
|
176 } |
|
177 function displayTest(type, name, customMessage) { |
|
178 var message = "???"; |
|
179 if (type != "done" && type != "skipped") ++count; |
|
180 progress.style.width = (count * (progress.parentNode.clientWidth - 2) / totalTests) + "px"; |
|
181 progressRan.nodeValue = count; |
|
182 if (type == "ok") { |
|
183 message = "Test '" + name + "' succeeded"; |
|
184 if (!verbose) customMessage = false; |
|
185 } else if (type == "skipped") { |
|
186 message = "Test '" + name + "' skipped"; |
|
187 ++skipped; |
|
188 if (!verbose) customMessage = false; |
|
189 } else if (type == "expected") { |
|
190 message = "Test '" + name + "' failed as expected"; |
|
191 if (!verbose) customMessage = false; |
|
192 } else if (type == "error" || type == "fail") { |
|
193 ++failed; |
|
194 message = "Test '" + name + "' failed"; |
|
195 } else if (type == "done") { |
|
196 if (failed) { |
|
197 type += " fail"; |
|
198 message = failed + " failure" + (failed > 1 ? "s" : ""); |
|
199 } else if (count < totalTests) { |
|
200 failed = totalTests - count; |
|
201 type += " fail"; |
|
202 message = failed + " failure" + (failed > 1 ? "s" : ""); |
|
203 } else { |
|
204 type += " ok"; |
|
205 message = "All passed"; |
|
206 if (skipped) { |
|
207 message += " (" + skipped + " skipped)"; |
|
208 } |
|
209 } |
|
210 progressTotal.nodeValue = ''; |
|
211 customMessage = true; // Hack to avoid adding to output |
|
212 } |
|
213 if (window.mozilla_setStatus) |
|
214 mozilla_setStatus(message, type, customMessage); |
|
215 if (verbose && !customMessage) customMessage = message; |
|
216 setStatus(message, type); |
|
217 if (customMessage && customMessage.length > 0) { |
|
218 addOutput(name, type, customMessage); |
|
219 } |
|
220 } |
|
221 </script> |
|
222 </body> |
|
223 </html> |