-
Notifications
You must be signed in to change notification settings - Fork 71
/
runner.js
136 lines (109 loc) · 4.57 KB
/
runner.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
126
127
128
129
130
131
132
133
134
135
require("narwhal").deprecated(
"test/runner is deprecated in favor of the CommonJS test module.\n" +
"test/runner will be removed in narhwal-0.4.")
// -- tlrobinson Tom Robinson
var system = require('system');
var file = require('file');
var util = require("narwhal/util");
var assert = require("./assert");
var stream = require("narwhal/term").stream;
var args = require("narwhal/args");
var parser = exports.parser = new args.Parser();
parser.option('--no-color', 'color').def(true).set(false);
parser.option('--loop', 'loop').def(false).set(true);
parser.option('--stacktrace', 'showStacktraces').def(false).set(true);
function getBacktrace(e) {
if (!e) {
return "";
}
else if (e.rhinoException) {
var s = new Packages.java.io.StringWriter();
e.rhinoException.printStackTrace(new Packages.java.io.PrintWriter(s));
return String(s.toString());
}
else if (e.javaException) {
var s = new Packages.java.io.StringWriter();
e.javaException.printStackTrace(new Packages.java.io.PrintWriter(s));
return String(s.toString());
}
return "";
}
exports.run = function(objectOrModule) {
var options = parser.parse([module.path].concat(system.args));
if (options.color == false)
stream.disable();
if (!objectOrModule) {
var id = file.canonical(options.args.shift());
objectOrModule = require(id);
}
do {
var result = _run(objectOrModule, options);
} while (options.loop);
return result;
}
var _run = function(objectOrModule, options, context) {
if (typeof objectOrModule === "string")
objectOrModule = require(objectOrModule);
if (!objectOrModule)
throw "Nothing to run";
var localContext = context || { passed : 0, failed : 0, error : 0, depth : 0 };
localContext.depth++;
for (var spaces=""; spaces.length < localContext.depth * 2; spaces += " ");
for (var property in objectOrModule) {
if (property.match(/^test/)) {
print(spaces + "+ Running "+property);
if (typeof objectOrModule[property] == "function") {
if (typeof objectOrModule.setup === "function")
objectOrModule.setup();
var globals = {};
for (var name in system.global) {
globals[name] = true;
}
try {
try {
objectOrModule[property]();
} finally {
if (!objectOrModule.addsGlobals) {
for (var name in system.global) {
if (!globals[name]) {
delete system.global[name];
throw new assert.AssertionError("New global introduced: " + util.enquote(name));
}
}
}
}
localContext.passed++;
} catch (e) {
if (e.name === "AssertionError") {
var backtrace = getBacktrace(e);
var message = "Assertion failed in "+property+":";
stream.print("\0violet("+message+"\0)");
stream.print("\0yellow("+e+"\0)");
if (options.showStacktraces && backtrace)
stream.print("\0blue("+backtrace+"\0)");
localContext.failed++;
} else {
var backtrace = getBacktrace(e);
var message = "Exception in "+property+":";
stream.print("\0violet("+message+"\0)");
stream.print("\0red("+e+"\0)");
if (backtrace)
stream.print("\0blue("+backtrace+"\0)");
localContext.error++;
}
} finally {
if (typeof objectOrModule.teardown === "function")
objectOrModule.teardown();
}
} else {
_run(objectOrModule[property], options, localContext);
}
}
}
localContext.depth--;
if (context === undefined)
print("Passed "+localContext.passed+"; Failed "+localContext.failed+"; Error "+localContext.error+";");
return localContext.failed + localContext.error;
};
if (require.main == module.id)
exports.run();