backoffice/node_modules/tape/index.js

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: