forked from jussi-kalliokoski/web-midi-test-suite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest-helpers.js
125 lines (94 loc) · 2.02 KB
/
test-helpers.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
var addTest = function () {
var remaining = [];
var done = [];
var errors = [];
function canRun (task) {
if (!task.dependencies) return true;
var i;
for(i=0; i<task.dependencies.length; i++) {
if (done.indexOf(task.dependencies[i]) === -1) {
return false;
}
}
return true;
}
function addTest (name, func, dependencies) {
remaining.push({
name: name,
run: func,
dependencies: dependencies
});
}
addTest.onsuccess = function (test) {
console.log('Success!');
};
addTest.onerror = function (test, e) {
console.error('Error' + (test ? ' in ' + test.name : '') + '!', e);
};
addTest.onrun = function (test) {
};
addTest.onfailure = function (failed, norun) {
console.error('Tests failed: ' +
failed.map(function (e) {
return e.name;
}).join(', '));
console.error('Tests did not satisfy dependencies: ' +
norun.map(function (e) {
return e.name;
}).join(', '));
};
function run () {
var i, test, waitForReady;
function ready (e) {
if (typeof e === 'undefined' || e === true) {
done.push(test.name);
console.log(test.name + ' finished succesfully.');
return run();
}
errors.push({
name: test.name,
error: e
});
addTest.onerror(test, e);
run();
}
function aready (e) {
setTimeout(function () {
ready(e);
}, 0);
}
ready.async = function () {
waitForReady = true;
};
if (!remaining.length) {
if (!errors.length) {
return setTimeout(addTest.onsuccess, 0);
} else {
return setTimeout(function () {
addTest.onfailure(errors, remaining);
}, 0);
}
}
for (i=0; i<remaining.length; i++) {
test = remaining[i];
if (!canRun(test)) continue;
remaining.splice(i--, 1);
try {
test.run(ready);
} catch (e) {
return aready(e);
}
if (waitForReady) return;
return aready();
}
addTest.onerror(null, Error("No more tests with satisfied dependencies!"));
setTimeout(function () {
addTest.onfailure(errors, remaining);
}, 0);
}
addTest.run = run;
return addTest;
}();
if (typeof module !== 'undefined') {
module.exports = addTest;
}