From 2954dacdef87324ae0a192deac194f83c6200441 Mon Sep 17 00:00:00 2001 From: James Halliday Date: Fri, 22 Nov 2013 16:08:18 +0800 Subject: [PATCH] is now properly noisy when more commits than expected were run --- index.js | 41 ++++++++++++++--------------- lib/results.js | 70 ++++++++++++++++++++++++++++---------------------- package.json | 3 ++- 3 files changed, 63 insertions(+), 51 deletions(-) diff --git a/index.js b/index.js index b39936df..b8f0b563 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,7 @@ +var defined = require('defined'); var createDefaultStream = require('./lib/default_stream'); var Test = require('./lib/test'); -var createResultStream = require('./lib/results'); +var createResult = require('./lib/results'); var canEmitExit = typeof process !== 'undefined' && process && typeof process.on === 'function' @@ -17,13 +18,17 @@ var nextTick = typeof setImmediate !== 'undefined' exports = module.exports = (function () { var harness; var lazyLoad = function () { - if (!harness) harness = createExitHarness(); + if (!harness) harness = createExitHarness({ + autoclose: !canEmitExit + }); return harness.apply(this, arguments); }; lazyLoad.only = function () { - if (!harness) harness = createExitHarness(); + if (!harness) harness = createExitHarness({ + autoclose: !canEmitExit + }); return harness.only.apply(this, arguments); } @@ -33,7 +38,10 @@ exports = module.exports = (function () { function createExitHarness (conf) { if (!conf) conf = {}; - var harness = createHarness(); + var harness = createHarness({ + autoclose: defined(conf.autoclose, false) + }); + var stream = harness.createStream(); stream.pipe(createDefaultStream()); @@ -62,6 +70,7 @@ function createExitHarness (conf) { t._exit(); } } + harness.close(); process.exit(code || harness._exitCode); }); return harness; @@ -74,14 +83,13 @@ exports.test = exports; // tap compat var exitInterval; function createHarness (conf_) { - var results; + if (!conf_) conf_ = {}; + var results = createResult(); + if (conf_.autoclose !== false) { + results.once('done', function () { results.close() }); + } var test = function (name, conf, cb) { - if (!results) { - results = createResultStream(); - results.pause(); - } - var t = new Test(name, conf, cb); test._tests.push(t); @@ -101,16 +109,7 @@ function createHarness (conf_) { test._tests = []; test.createStream = function () { - if (!results) results = createResultStream(); - - var _pause = results.pause; - var paused = false; - results.pause = function () { paused = true }; - - nextTick(function () { - if (!paused) results.resume(); - }); - return results; + return results.createStream(); }; var only = false; @@ -122,5 +121,7 @@ function createHarness (conf_) { }; test._exitCode = 0; + test.close = function () { results.close() }; + return test; } diff --git a/lib/results.js b/lib/results.js index 4b4c4b8a..d8ba3f07 100644 --- a/lib/results.js +++ b/lib/results.js @@ -1,54 +1,64 @@ var Stream = require('stream'); +var EventEmitter = require('events').EventEmitter; +var inherits = require('inherits'); var json = typeof JSON === 'object' ? JSON : require('jsonify'); var through = require('through'); +var resumer = require('resumer'); var nextTick = typeof setImmediate !== 'undefined' ? setImmediate : process.nextTick ; -module.exports = function () { - var output = through(); - output.pause(); - output.queue('TAP version 13\n'); - - var results = new Results(output); - output.push = function (t) { results.push(t) }; - - output.only = function (name) { - results.only = name; - }; - - nextTick(function next () { - var t = getNextTest(results); - if (t) t.run(); - else results.close(); - }); - - return output; -}; +module.exports = Results; +inherits(Results, EventEmitter); -function Results (stream) { +function Results () { + if (!(this instanceof Results)) return new Results; this.count = 0; this.fail = 0; this.pass = 0; - this.stream = stream; + this._stream = through(); this.tests = []; } +Results.prototype.createStream = function () { + var self = this; + var output = resumer(); + output.queue('TAP version 13\n'); + + nextTick(function () { + var t = getNextTest(self); + if (t) t.run() + else self.emit('done') + }); + self._stream.pipe(output); + + return output; +}; + Results.prototype.push = function (t) { var self = this; self.tests.push(t); self._watch(t); t.once('end', function () { var nt = getNextTest(self); - if (nt) nt.run(); - else self.close(); + if (nt) nt.run() + else self.emit('done') }); }; +Results.prototype.only = function (name) { + if (this._only) { + self.count ++; + self.fail ++; + write('not ok ' + self.count + ' already called .only()\n'); + } + this._only = name; +}; + Results.prototype._watch = function (t) { var self = this; - var write = function (s) { self.stream.queue(s) }; + var write = function (s) { self._stream.queue(s) }; t.once('prerun', function () { write('# ' + t.name + '\n'); }); @@ -70,9 +80,9 @@ Results.prototype._watch = function (t) { Results.prototype.close = function () { var self = this; - if (self.closed) self.stream.emit('error', new Error('ALREADY CLOSED')); + if (self.closed) self._stream.emit('error', new Error('ALREADY CLOSED')); self.closed = true; - var write = function (s) { self.stream.queue(s) }; + var write = function (s) { self._stream.queue(s) }; write('\n1..' + self.count + '\n'); write('# tests ' + self.count + '\n'); @@ -80,7 +90,7 @@ Results.prototype.close = function () { if (self.fail) write('# fail ' + self.fail + '\n') else write('\n# ok\n') - self.stream.queue(null); + self._stream.queue(null); }; function encodeResult (res, count) { @@ -148,7 +158,7 @@ function getSerialize () { } function getNextTest(results) { - if (!results.only) { + if (!results._only) { return results.tests.shift(); } @@ -157,7 +167,7 @@ function getNextTest(results) { if (!t) { return null; } - if (results.only === t.name) { + if (results._only === t.name) { return t; } } while (results.tests.length !== 0) diff --git a/package.json b/package.json index 92247b69..c315dcfc 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "defined" : "~0.0.0", "through": "~2.3.4", "stream-combiner": "~0.0.2", - "split": "~0.2.10" + "split": "~0.2.10", + "inherits": "~2.0.1" }, "devDependencies" : { "tap" : "~0.3.0",