UNPKG

4.09 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 var inErrorState = false;
78
79 process.on('exit', function (code) {
80 // let the process exit cleanly.
81 if (code !== 0) {
82 return
83 }
84
85 if (!ended) {
86 var only = harness._results._only;
87 for (var i = 0; i < harness._tests.length; i++) {
88 var t = harness._tests[i];
89 if (only && t !== only) continue;
90 t._exit();
91 }
92 }
93 harness.close();
94 process.exit(code || harness._exitCode);
95 });
96
97 return harness;
98}
99
100exports.createHarness = createHarness;
101exports.Test = Test;
102exports.test = exports; // tap compat
103exports.test.skip = Test.skip;
104
105var exitInterval;
106
107function createHarness (conf_) {
108 if (!conf_) conf_ = {};
109 var results = createResult();
110 if (conf_.autoclose !== false) {
111 results.once('done', function () { results.close() });
112 }
113
114 var test = function (name, conf, cb) {
115 var t = new Test(name, conf, cb);
116 test._tests.push(t);
117
118 (function inspectCode (st) {
119 st.on('test', function sub (st_) {
120 inspectCode(st_);
121 });
122 st.on('result', function (r) {
123 if (!r.ok && typeof r !== 'string') test._exitCode = 1
124 });
125 })(t);
126
127 results.push(t);
128 return t;
129 };
130 test._results = results;
131
132 test._tests = [];
133
134 test.createStream = function (opts) {
135 return results.createStream(opts);
136 };
137
138 test.onFinish = function (cb) {
139 results.on('done', cb);
140 };
141
142 test.onFailure = function (cb) {
143 results.on('fail', cb);
144 };
145
146 var only = false;
147 test.only = function () {
148 if (only) throw new Error('there can only be one only test');
149 only = true;
150 var t = test.apply(null, arguments);
151 results.only(t);
152 return t;
153 };
154 test._exitCode = 0;
155
156 test.close = function () { results.close() };
157
158 return test;
159}