125 lines
3.3 KiB
JavaScript
125 lines
3.3 KiB
JavaScript
var createDefaultStream = require('./lib/default_stream');
|
|
var Render = require('./lib/render');
|
|
var Test = require('./lib/test');
|
|
|
|
exports = module.exports = createHarness();
|
|
exports.createHarness = createHarness;
|
|
exports.Test = Test;
|
|
|
|
var canEmitExit = typeof process !== 'undefined' && process
|
|
&& typeof process.on === 'function'
|
|
;
|
|
var canExit = typeof process !== 'undefined' && process
|
|
&& typeof process.exit === 'function'
|
|
;
|
|
var onexit = (function () {
|
|
var stack = [];
|
|
if (canEmitExit) process.on('exit', function (code) {
|
|
for (var i = 0; i < stack.length; i++) stack[i](code);
|
|
});
|
|
return function (cb) { stack.push(cb) };
|
|
})();
|
|
|
|
function createHarness (conf_) {
|
|
var pending = [];
|
|
var running = false;
|
|
var count = 0;
|
|
|
|
var began = false;
|
|
var only = false;
|
|
var closed = false;
|
|
var out = new Render();
|
|
|
|
var test = function (name, conf, cb) {
|
|
count++;
|
|
var t = new Test(name, conf, cb);
|
|
if (!conf || typeof conf !== 'object') conf = conf_ || {};
|
|
|
|
if (conf.exit !== false) {
|
|
onexit(function (code) {
|
|
t._exit();
|
|
if (!closed) {
|
|
closed = true
|
|
out.close();
|
|
}
|
|
if (!code && !t._ok && (!only || name === only)) {
|
|
process.exit(1);
|
|
}
|
|
});
|
|
}
|
|
|
|
process.nextTick(function () {
|
|
if (!out.piped) out.pipe(createDefaultStream());
|
|
if (!began) out.begin();
|
|
began = true;
|
|
|
|
var run = function () {
|
|
running = true;
|
|
out.push(t);
|
|
t.run();
|
|
};
|
|
|
|
if (only && name !== only) {
|
|
count--;
|
|
return;
|
|
}
|
|
|
|
if (running || pending.length) {
|
|
pending.push(run);
|
|
}
|
|
else run();
|
|
});
|
|
|
|
t.on('test', function sub (st) {
|
|
count++;
|
|
st.on('test', sub);
|
|
st.on('end', onend);
|
|
});
|
|
|
|
t.on('end', onend);
|
|
|
|
return t;
|
|
|
|
function onend () {
|
|
count--;
|
|
if (this._progeny.length) {
|
|
var unshifts = this._progeny.map(function (st) {
|
|
return function () {
|
|
running = true;
|
|
out.push(st);
|
|
st.run();
|
|
};
|
|
});
|
|
pending.unshift.apply(pending, unshifts);
|
|
}
|
|
|
|
process.nextTick(function () {
|
|
running = false;
|
|
if (pending.length) return pending.shift()();
|
|
if (count === 0 && !closed) {
|
|
closed = true
|
|
out.close();
|
|
}
|
|
if (conf.exit !== false && canExit && !t._ok) {
|
|
process.exit(1);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
test.only = function (name) {
|
|
if (only) {
|
|
throw new Error("there can only be one only test");
|
|
}
|
|
|
|
only = name;
|
|
|
|
return test.apply(null, arguments);
|
|
};
|
|
|
|
test.stream = out;
|
|
return test;
|
|
}
|
|
|
|
// vim: set softtabstop=4 shiftwidth=4:
|