Skip to content

Commit 3872f1d

Browse files
committed
x
# Conflicts: # src/test/all_browser.js
1 parent ff01e8d commit 3872f1d

4 files changed

Lines changed: 229 additions & 56 deletions

File tree

src/background_tokenizer_test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ module.exports = {
2525
"*/",
2626
"var juhu"
2727
]);
28-
doc.setMode("./mode/javascript");
28+
doc.setMode(new JavaScriptMode);
2929

3030
forceTokenize(doc);
3131
testStates(doc, ["comment1", "start", "no_regex"]);
@@ -49,7 +49,7 @@ module.exports = {
4949
"juhu",
5050
"*/"
5151
]);
52-
doc.setMode("./mode/javascript");
52+
doc.setMode(new JavaScriptMode);
5353

5454
var updateEvent = null;
5555
doc.bgTokenizer.on("update", function(e) {
@@ -92,7 +92,7 @@ module.exports = {
9292
"kinners]]--",
9393
""
9494
]);
95-
doc.setMode("./mode/lua");
95+
doc.setMode(new LuaMode);
9696
forceTokenize(doc);
9797
var string = "bracketedString,2,start";
9898
var comment = "bracketedComment,2,start";

src/test/all_browser.js

Lines changed: 205 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,33 @@
11
"use strict";
22

33
require("ace/lib/fixoldbrowsers");
4+
45
var mockdom = require("../test/mockdom");
5-
var AsyncTest = require("asyncjs").test;
6-
var async = require("asyncjs");
76
var buildDom = require("../lib/dom").buildDom;
87
var escapeRegExp = require("ace/lib/lang").escapeRegExp;
98

109
var useMockdom = location.search.indexOf("mock=1") != -1;
1110
var forceShow = location.search.indexOf("show=1") != -1;
1211

13-
var passed = 0;
14-
var failed = 0;
15-
var log = document.getElementById("log");
12+
var documentElement = document.documentElement;
13+
var log = buildDom(["div", {id: "log"}], documentElement);
1614

1715
// change buildDom to use real document in mockdom
1816
var createElement = document.createElement.bind(document);
1917
var createTextNode = document.createTextNode.bind(document);
2018
var buildDom = eval("(" + buildDom.toString().replace(/document\./g, "") + ")");
2119

20+
window.onerror = function name(...params) {
21+
console.error(">>>>>>>>>>>>>>", ...params)
22+
}
23+
window.addEventListener('unhandledrejection', (event) => {
24+
console.error("Unhandled promise rejection:", event.promise, event.reason);
25+
});
26+
2227
var testNames = require("./test_list");
2328

2429
var html = [
30+
["div", {ref: "summary"}],
2531
useMockdom
2632
? ["a", {href: normalizeHref(location.search.replace('mock=1', '')) + location.hash}, "do not use mockdom"]
2733
: ["a", {href: normalizeHref(location.search + '&mock=1') + location.hash}, "use mockdom"],
@@ -36,18 +42,24 @@ var html = [
3642
for (var i in testNames) {
3743
html.push(testLink(testNames[i]), ["br"]);
3844
}
39-
45+
function testHref(suiteName, name) {
46+
var href = '?' + suiteName + (useMockdom ? "&mock=1" : "");
47+
if (name) href += "#" + escapeRegExp(name.replace(/^test\s*/, ""));
48+
return href;
49+
}
4050
function testLink(name) {
41-
return ["a", {href:'?' + name + (useMockdom ? "&mock=1" : "")}, name.replace(/^ace\//, "")];
51+
return ["a", {href: testHref(name)}, name.replace(/^ace\//, "") + ".js"];
4252
}
4353
function normalizeHref(str) {
4454
return str.replace(/([?&])&+/g, "$1");
4555
}
4656

47-
var nav = buildDom(["div", {style: "position:absolute;right:0;top:0"}, html], document.body);
57+
var refs = {};
58+
var nav = buildDom(["div", {id: "sidebar"}, html], documentElement, refs);
4859

4960

5061
if (forceShow) {
62+
// @ts-ignore
5163
require(["ace/virtual_renderer", "ace/test/mockrenderer"], function(real, mock) {
5264
var VirtualRenderer = real.VirtualRenderer;
5365
mock.MockRenderer = function() {
@@ -79,68 +91,208 @@ if (location.search) {
7991
var filter = decodeURIComponent(location.hash.substr(1));
8092
window.onhashchange = function() { location.reload(); };
8193

82-
require(selectedTests, function() {
83-
var tests = selectedTests.map(function(x) {
94+
// @ts-ignore
95+
require(selectedTests, async function() {
96+
var testSuites = selectedTests.map(function(x) {
8497
var module = require(x);
8598
module.href = x;
8699
return module;
87100
});
88101

89-
async.list(tests)
90-
.expand(function(test) {
91-
if (filter) {
92-
Object.keys(test).forEach(function(method) {
93-
if (method.match(/^>?test/) && !method.match(filter))
94-
test[method] = undefined;
95-
});
96-
}
97-
return AsyncTest.testcase(test);
98-
}, AsyncTest.TestGenerator)
99-
.run()
100-
.each(function(test, next) {
101-
if (test.index == 1 && test.context.href) {
102-
var href = test.context.href;
103-
buildDom(["div", {}, testLink(href)], log);
104-
}
105-
102+
var failed = 0;
103+
var passed = 0;
104+
var skipped = 0;
105+
var reporter = {
106+
beforeEach: function(test) {
107+
if (!test.name) return;
106108
var messageHeader = "[" + test.index + "/" + test.count + "]";
107-
108-
var node = buildDom(["div", {class: test.passed ? "passed" : "failed"},
109-
["a", {href: "#" + escapeRegExp(test.name.replace(/^test\s*/, ""))}, messageHeader],
109+
var node = buildDom(["div", {class: test.skip ? "skipped" : "waiting"},
110+
["a", {href: testHref(test.testSuite.href, test.name)}, messageHeader],
110111
" ",
111-
(test.suiteName ? test.suiteName + ": " : ""),
112112
test.name,
113-
(test.passed ? " OK" : " FAIL")
113+
["span", (test.skip ? " SKIP" : " ...")],
114114
], log);
115-
116-
if (!test.passed) {
117-
if (test.err.stack)
118-
var err = test.err.stack;
119-
else
120-
var err = test.err;
121-
122-
console.error(node.textContent);
123-
console.error(err);
124-
buildDom(["pre", {class: "error"}, err + ""], node);
115+
test.reportNode = node;
116+
console.log(messageHeader + test.name);
117+
},
118+
afterEach: function(test) {
119+
if (!log.parentElement) {
120+
documentElement.appendChild(log)
121+
debugger
122+
}
123+
if (!test.name) return;
124+
if (test.skip) {
125+
skipped++
126+
return;
127+
} else if (test.passed) {
128+
passed++;
125129
} else {
126-
console.log(node.textContent);
130+
failed++;
127131
}
132+
133+
test.reportNode.className = test.passed ? "passed" : "failed";
134+
test.reportNode.lastChild.remove()
135+
buildDom(["span", (test.passed ? " OK" : " FAIL") + " " + test.time + "ms"], test.reportNode)
136+
if (test.error && test.error != true)
137+
buildDom(["pre", {class: "error"}, test.error + ""], log);
138+
if (test.error) console.log(test.fn);
128139

129-
next();
130-
})
131-
.each(function(test) {
132-
if (test.passed)
133-
passed += 1;
134-
else
135-
failed += 1;
136-
})
137-
.end(function() {
140+
refs.summary.innerText = "Passed: " + passed + ", Failed: " + failed + ", Skipped: " + skipped;
141+
},
142+
before: function(testSuite) {
143+
var counter = " [" + testSuite.index + "/" + testSuite.count + "]";
144+
var href = testSuite.href;
145+
buildDom(["div", {}, testLink(href), counter], log);
146+
console.log(href, counter);
147+
},
148+
after: function(test) {
149+
150+
},
151+
done: function() {
152+
if (!log.parentElement) {
153+
documentElement.appendChild(log)
154+
debugger
155+
}
138156
var node = buildDom(["div", {class: "summary"},
139157
["br"], "Summary:", ["br"], ["br"],
140-
"Total number of tests: " + (passed + failed), ["br"],
158+
"Total number of tests: " + (passed + failed + skipped), ["br"],
141159
(passed && [null, "Passed tests: " + passed, ["br"]]),
160+
(passed && [null, "Passed tests: " + skipped, ["br"]]),
142161
(failed && [null, "Failed tests: " + failed])
143162
], log);
144163
console.log(node.innerText);
164+
}
165+
};
166+
167+
var stepIndex = 0
168+
async function runStep() {
169+
try {
170+
var step = steps[stepIndex++];
171+
if (!step) return;
172+
if (step.type == "before") {
173+
reporter.before(step.testSuite);
174+
}
175+
try {
176+
if (step.fn) await runTimed(step)
177+
} finally {
178+
if (step.type == "after") {
179+
reporter.after(step.testSuite);
180+
} else if (step.type == "done") {
181+
reporter.done();
182+
}
183+
}
184+
} finally {
185+
if (!step) return;
186+
setTimeout(runStep,0);
187+
}
188+
}
189+
async function runTimed(step, callback) {
190+
var fn = step.fn;
191+
var testSuite = step.testSuite;
192+
193+
var resolve;
194+
var result = new Promise(function(resolve_, reject_) {
195+
resolve = resolve_;
145196
});
197+
result.name = step.name;
198+
199+
var doneCalled = false;
200+
var done = function(error) {
201+
if (doneCalled) return;
202+
if (error) step.error = error;
203+
step.passed = !step.error;
204+
clearTimeout(timeoutId);
205+
step.time = Date.now() - t;
206+
doneCalled = true;
207+
resolve();
208+
reporter.afterEach(step);
209+
};
210+
var timeout = testSuite.timeout || 3000;
211+
var interactiveTimeStep = 100;
212+
var remainingTime = timeout;
213+
var timeoutId = setTimeout(function wait() {
214+
remainingTime -= interactiveTimeStep;
215+
if (remainingTime > 0) {
216+
timeoutId = setTimeout(wait, Math.min(interactiveTimeStep, remainingTime))
217+
} else {
218+
done(new Error("Source did not respond after " + timeout + "ms!"))
219+
}
220+
}, Math.min(interactiveTimeStep, remainingTime));
221+
222+
var t = Date.now();
223+
step.passed = false;
224+
reporter.beforeEach(step);
225+
var callFailed = true;
226+
try {
227+
(fn.length ? fn.call(testSuite, done) : fn.call(testSuite));
228+
callFailed = false;
229+
} finally {
230+
if (!fn.length)
231+
done(callFailed)
232+
return result;
233+
}
234+
}
235+
236+
var currentStep
237+
var waitForStepCallback;
238+
var watchdog
239+
async function runAll() {
240+
watchdog = setInterval(() => {
241+
if (!currentStep) return;
242+
currentStep.interactiveTime = (currentStep.interactiveTime || 0) + 50;
243+
if (currentStep.interactiveTime >= currentStep.timeout) {
244+
if (currentStep.error == undefined)
245+
currentStep.error = new Error("Source did not respond after " + (currentStep.timeout || 0) + "ms!");
246+
waitForStepCallback()
247+
}
248+
}, 50);
249+
while (currentStep = steps.shift()) {
250+
currentStep.timeout = (currentStep?.testSuite.timeout || 3000);
251+
var waitForStep = new Promise(resolve => { waitForStepCallback = resolve });
252+
setTimeout(runOne, 0);
253+
await waitForStep
254+
}
255+
clearInterval(watchdog);
256+
}
257+
async function runOne() {
258+
debugger
259+
waitForStepCallback()
260+
}
261+
262+
var steps = [];
263+
for (var i = 0; i < testSuites.length; i++) {
264+
var testSuite = testSuites[i];
265+
testSuite.index = i + 1;
266+
testSuite.count = testSuites.length;
267+
268+
var testArray = [];
269+
Object.keys(testSuite).forEach(name => {
270+
if (!name.match(/^>?test/))
271+
return;
272+
var test = {name, testSuite, fn: testSuite[name]};
273+
if (filter && !test.name.match(filter)) {
274+
test.skip = true;
275+
}
276+
testArray.push(test);
277+
})
278+
279+
if (!testArray.length) continue;
280+
281+
steps.push({type: "before", testSuite, fn: testSuite.setUpSuite})
282+
for (var j = 0; j < testArray.length; j++) {
283+
var test = testArray[j];
284+
test.index = j + 1;
285+
test.count = testArray.length;
286+
steps.push({type: "beforeEach", testSuite, fn: testSuite.setUp});
287+
steps.push(test);
288+
steps.push({type: "afterEach", testSuite, fn: testSuite.tearDown});
289+
}
290+
steps.push({type: "after", testSuite, fn: testSuite.tearDownSuite});
291+
}
292+
293+
steps.push({type: "done"})
294+
295+
runStep();
296+
297+
// runAll()
146298
});

src/test/tests.html

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,26 @@
1717
#log pre.error {
1818
color: black;
1919
}
20+
#log .skipped {
21+
color: lightblue;
22+
}
23+
#sidebar {
24+
height: 100vh;
25+
overflow: auto;
26+
position: absolute;
27+
right:0;
28+
top:0
29+
}
30+
31+
#log {
32+
height: 100vh;
33+
overflow: auto;
34+
position: absolute;
35+
left:0;
36+
37+
right:30em;
38+
top:0
39+
}
2040
</style>
2141
</head>
2242
<body>

src/tooltip_test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ var dom = require("./lib/dom");
1313
var lang = require("./lib/lang");
1414

1515
var editor, docTooltip;
16+
1617
module.exports = {
1718
setUp: function() {
1819
docTooltip = new HoverTooltip();

0 commit comments

Comments
 (0)