UNPKG

4.07 kBJavaScriptView Raw
1var defined = require('defined');
2var createDefaultStream = require('./lib/default_stream');
3var Test = require('./lib/test');
4var createResult = require('./lib/results');
5var through = require('through');
6
7var canEmitExit = typeof process !== 'undefined' && process
8 && typeof process.on === 'function' && process.browser !== true
9;
10var canExit = typeof process !== 'undefined' && process
11 && typeof process.exit === 'function'
12;
13
14var nextTick = typeof setImmediate !== 'undefined'
15 ? setImmediate
16 : process.nextTick
17;
18
19exports = module.exports = (function () {
20 var harness;
21 var lazyLoad = function () {
22 return getHarness().apply(this, arguments);
23 };
24
25 lazyLoad.only = function () {
26 return getHarness().only.apply(this, arguments);
27 };
28
29 lazyLoad.createStream = function (opts) {
30 if (!opts) opts = {};
31 if (!harness) {
32 var output = through();
33 getHarness({ stream: output, objectMode: opts.objectMode });
34 return output;
35 }
36 return harness.createStream(opts);
37 };
38
39 lazyLoad.onFinish = function () {
40 return getHarness().onFinish.apply(this, arguments);
41 };
42
43 lazyLoad.onFailure = function () {
44 return getHarness().onFailure.apply(this, arguments);
45 };
46
47 lazyLoad.getHarness = getHarness;
48
49 return lazyLoad;
50
51 function getHarness(opts) {
52 if (!opts) opts = {};
53 opts.autoclose = !canEmitExit;
54 if (!harness) harness = createExitHarness(opts);
55 return harness;
56 }
57})();
58
59function createExitHarness(conf) {
60 if (!conf) conf = {};
61 var harness = createHarness({
62 autoclose: defined(conf.autoclose, false)
63 });
64
65 var stream = harness.createStream({ objectMode: conf.objectMode });
66 var es = stream.pipe(conf.stream || createDefaultStream());
67 if (canEmitExit) {
68 es.on('error', function (err) { harness._exitCode = 1; });
69 }
70
71 var ended = false;
72 stream.on('end', function () { ended = true; });
73
74 if (conf.exit === false) return harness;
75 if (!canEmitExit || !canExit) return harness;
76
77 process.on('exit', function (code) {
78 // let the process exit cleanly.
79 if (code !== 0) {
80 return;
81 }
82
83 if (!ended) {
84 var only = harness._results._only;
85 for (var i = 0; i < harness._tests.length; i++) {
86 var t = harness._tests[i];
87 if (only && t !== only) continue;
88 t._exit();
89 }
90 }
91 harness.close();
92 process.exit(code || harness._exitCode);
93 });
94
95 return harness;
96}
97
98exports.createHarness = createHarness;
99exports.Test = Test;
100exports.test = exports; // tap compat
101exports.test.skip = Test.skip;
102
103var exitInterval;
104
105function createHarness(conf_) {
106 if (!conf_) conf_ = {};
107 var results = createResult();
108 if (conf_.autoclose !== false) {
109 results.once('done', function () { results.close(); });
110 }
111
112 var test = function (name, conf, cb) {
113 var t = new Test(name, conf, cb);
114 test._tests.push(t);
115
116 (function inspectCode(st) {
117 st.on('test', function sub(st_) {
118 inspectCode(st_);
119 });
120 st.on('result', function (r) {
121 if (!r.todo && !r.ok && typeof r !== 'string') test._exitCode = 1;
122 });
123 })(t);
124
125 results.push(t);
126 return t;
127 };
128 test._results = results;
129
130 test._tests = [];
131
132 test.createStream = function (opts) {
133 return results.createStream(opts);
134 };
135
136 test.onFinish = function (cb) {
137 results.on('done', cb);
138 };
139
140 test.onFailure = function (cb) {
141 results.on('fail', cb);
142 };
143
144 var only = false;
145 test.only = function () {
146 if (only) throw new Error('there can only be one only test');
147 only = true;
148 var t = test.apply(null, arguments);
149 results.only(t);
150 return t;
151 };
152 test._exitCode = 0;
153
154 test.close = function () { results.close(); };
155
156 return test;
157}