Skip to content

Commit c67f4fb

Browse files
committed
refactor(test_runner): rewrite spec reporter to generator function
1 parent bac85be commit c67f4fb

File tree

1 file changed

+31
-33
lines changed
  • lib/internal/test_runner/reporter

1 file changed

+31
-33
lines changed

lib/internal/test_runner/reporter/spec.js

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ const {
1111
SafeMap,
1212
StringPrototypeRepeat,
1313
} = primordials;
14+
1415
const assert = require('assert');
15-
const Transform = require('internal/streams/transform');
1616
const { inspectWithNoCustomRetry } = require('internal/errors');
1717
const { green, blue, red, white, gray, shouldColorize } = require('internal/util/colors');
1818
const { kSubtestsFailed } = require('internal/test_runner/test');
@@ -27,6 +27,7 @@ const colors = {
2727
'test:pass': green,
2828
'test:diagnostic': blue,
2929
};
30+
3031
const symbols = {
3132
'__proto__': null,
3233
'test:fail': '\u2716 ',
@@ -36,27 +37,25 @@ const symbols = {
3637
'arrow:right': '\u25B6 ',
3738
'hyphen:minus': '\uFE63 ',
3839
};
39-
class SpecReporter extends Transform {
40-
#stack = [];
41-
#reported = [];
42-
#indentMemo = new SafeMap();
43-
#failedTests = [];
44-
#cwd = process.cwd();
45-
46-
constructor() {
47-
super({ __proto__: null, writableObjectMode: true });
48-
}
4940

50-
#indent(nesting) {
51-
let value = this.#indentMemo.get(nesting);
41+
module.exports = async function* specReporter(source) {
42+
let stack = [];
43+
let reported = [];
44+
let indentMemo = new SafeMap();
45+
let failedTests = [];
46+
let cwd = process.cwd();
47+
48+
function indent(nesting) {
49+
let value = indentMemo.get(nesting);
5250
if (value === undefined) {
5351
value = StringPrototypeRepeat(' ', nesting);
54-
this.#indentMemo.set(nesting, value);
52+
indentMemo.set(nesting, value);
5553
}
5654

5755
return value;
5856
}
59-
#formatError(error, indent) {
57+
58+
function formatError(error, indent) {
6059
if (!error) return '';
6160
const err = error.code === 'ERR_TEST_FAILURE' ? error.cause : error;
6261
const message = ArrayPrototypeJoin(
@@ -66,7 +65,8 @@ class SpecReporter extends Transform {
6665
), `\n${indent} `);
6766
return `\n${indent} ${message}\n`;
6867
}
69-
#formatTestReport(type, data, prefix = '', indent = '', hasChildren = false) {
68+
69+
function formatTestReport(type, data, prefix = '', indent = '', hasChildren = false) {
7070
let color = colors[type] ?? white;
7171
let symbol = symbols[type] ?? ' ';
7272
const { skip, todo } = data;
@@ -89,7 +89,8 @@ class SpecReporter extends Transform {
8989
}
9090
return `${prefix}${indent}${color}${symbol}${title}${white}${error}`;
9191
}
92-
#handleTestReportEvent(type, data) {
92+
93+
function handleTestReportEvent(type, data) {
9394
const subtest = ArrayPrototypeShift(this.#stack); // This is the matching `test:start` event
9495
if (subtest) {
9596
assert(subtest.type === 'test:start');
@@ -113,7 +114,8 @@ class SpecReporter extends Transform {
113114
const indent = this.#indent(data.nesting);
114115
return `${this.#formatTestReport(type, data, prefix, indent, hasChildren)}\n`;
115116
}
116-
#handleEvent({ type, data }) {
117+
118+
function handleEvent({ type, data }) {
117119
switch (type) {
118120
case 'test:fail':
119121
if (data.details?.error?.failureType !== kSubtestsFailed) {
@@ -134,25 +136,21 @@ class SpecReporter extends Transform {
134136
return getCoverageReport(this.#indent(data.nesting), data.summary, symbols['test:coverage'], blue, true);
135137
}
136138
}
137-
_transform({ type, data }, encoding, callback) {
138-
callback(null, this.#handleEvent({ __proto__: null, type, data }));
139+
140+
for await (const event of source) {
141+
yield handleEvent(event);
139142
}
140-
_flush(callback) {
141-
if (this.#failedTests.length === 0) {
142-
callback(null, '');
143-
return;
144-
}
143+
144+
if (failedTests.length !== 0) {
145145
const results = [`\n${colors['test:fail']}${symbols['test:fail']}failing tests:${white}\n`];
146-
for (let i = 0; i < this.#failedTests.length; i++) {
147-
const test = this.#failedTests[i];
148-
const relPath = relative(this.#cwd, test.file);
149-
const formattedErr = this.#formatTestReport('test:fail', test);
146+
for (let i = 0; i < failedTests.length; i++) {
147+
const test = failedTests[i];
148+
const relPath = relative(cwd, test.file);
149+
const formattedErr = formatTestReport('test:fail', test);
150150
const location = `test at ${relPath}:${test.line}:${test.column}`;
151151

152152
ArrayPrototypePush(results, location, formattedErr);
153153
}
154-
callback(null, ArrayPrototypeJoin(results, '\n'));
154+
yield ArrayPrototypeJoin(results, '\n');
155155
}
156-
}
157-
158-
module.exports = SpecReporter;
156+
};

0 commit comments

Comments
 (0)