Skip to content

Commit 5cfb3e2

Browse files
committed
Fixed tape runner
1 parent a7fbc3e commit 5cfb3e2

File tree

1 file changed

+61
-46
lines changed
  • Nodejs/Product/Nodejs/TestFrameworks/Tape

1 file changed

+61
-46
lines changed

Nodejs/Product/Nodejs/TestFrameworks/Tape/tape.js

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -57,58 +57,73 @@ function run_tests(testInfo, callback) {
5757
return;
5858
}
5959

60-
var harness = tape.getHarness();
61-
62-
testInfo.forEach(function (info) {
63-
runTest(info, harness, function (result) {
64-
callback(result);
65-
});
66-
});
67-
68-
tape.onFinish(function () {
69-
// executes when all tests are done running
60+
var harness = tape.getHarness({objectMode: true});
61+
var capture = false; // Only capture between 'test' and 'end' events to avoid skipped test events.
62+
harness.createStream({ objectMode: true }).on('data', function (evt){
63+
switch (evt.type) {
64+
case 'test':
65+
capture = true;
66+
// Test is starting. Reset the result object. Send a "test start" event.
67+
result = {
68+
'title': evt.name,
69+
'passed': true,
70+
'stdOut': '',
71+
'stdErr': ''
72+
};
73+
callback({
74+
'type': 'test start',
75+
'title': result.title,
76+
'result': result
77+
});
78+
break;
79+
case 'assert':
80+
if (!capture) break;
81+
// Correlate the success/failure asserts for this test. There may be multiple per test
82+
var msg = "Operator: " + evt.operator + ". Expected: " + evt.expected + ". Actual: " + evt.actual + "\n";
83+
if (evt.ok) {
84+
result.stdOut += msg;
85+
} else {
86+
result.stdErr += msg + (evt.error.stack || evt.error.message) + "\n";
87+
result.passed = false;
88+
}
89+
break;
90+
case 'end':
91+
if (!capture) break;
92+
// Test is done. Send a "result" event.
93+
callback({
94+
'type': 'result',
95+
'title': result.title,
96+
'result': result
97+
});
98+
capture = false;
99+
break;
100+
default:
101+
break;
102+
}
70103
});
71104

72-
function runTest(testInfo, harness, done) {
73-
var stream = harness.createStream({ objectMode: true });
74-
var title = testInfo.testName;
105+
loadTestCases(testInfo[0].testFile);
75106

76-
stream.on(('data'), function (result) {
77-
if (result.type === 'test') {
78-
done({
79-
type: 'test start',
80-
title: title
81-
});
82-
}
83-
});
107+
// Skip those not selected to run. The rest will start running on the next tick.
108+
harness['_tests'].forEach(function(test){
109+
if( !testInfo.some( function(ti){ return ti.testName == test.name; }) ) {
110+
test._skip = true;
111+
}
112+
});
84113

85-
try {
86-
var htest = tape.test(title, {}, function (result) {
87-
done({
88-
type: 'result',
89-
title: title,
90-
result: {
91-
'title': title,
92-
'passed': result._ok,
93-
'stdOut': '',
94-
'stdErr': ''
95-
}
96-
});
97-
});
98-
} catch (e) {
99-
console.error('NTVS_ERROR:', e);
100-
done({
101-
type: 'result',
102-
title: title,
103-
result: {
104-
'title': title,
105-
'passed': false,
106-
'stdOut': '',
107-
'stdErr': e.message
108-
}
114+
harness.onFinish(function () {
115+
// TODO: This still doesn't seem to handle async tests with plan issues.
116+
if (capture) {
117+
// Something didn't finish. Finish it now.
118+
result.passed = false;
119+
callback({
120+
'type': 'result',
121+
'title': result.title,
122+
'result': result
109123
});
110124
}
111-
}
125+
process.exit(0);
126+
});
112127
}
113128
module.exports.run_tests = run_tests;
114129

0 commit comments

Comments
 (0)