Skip to content

Commit

Permalink
test_runner: refactor tap_parser to use more primordials
Browse files Browse the repository at this point in the history
PR-URL: #45745
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
  • Loading branch information
aduh95 authored and targos committed Dec 13, 2022
1 parent cee6f38 commit ffc0f3d
Showing 1 changed file with 30 additions and 24 deletions.
54 changes: 30 additions & 24 deletions lib/internal/test_runner/tap_parser.js
@@ -1,28 +1,30 @@
'use strict';

const Transform = require('internal/streams/transform');
const { TapLexer, TokenKind } = require('internal/test_runner/tap_lexer');
const { TapChecker } = require('internal/test_runner/tap_checker');
const {
codes: { ERR_TAP_VALIDATION_ERROR, ERR_TAP_PARSER_ERROR },
} = require('internal/errors');
const { kEmptyObject } = require('internal/util');
const {
ArrayPrototypeFilter,
ArrayPrototypeForEach,
ArrayPrototypeIncludes,
ArrayPrototypeJoin,
ArrayPrototypeMap,
ArrayPrototypePop,
ArrayPrototypePush,
ArrayPrototypeIncludes,
ArrayPrototypeSplice,
Boolean,
Number,
RegExpPrototypeExec,
RegExpPrototypeSymbolReplace,
String,
StringPrototypeTrim,
StringPrototypeEndsWith,
StringPrototypeReplaceAll,
StringPrototypeSlice,
StringPrototypeSplit,
StringPrototypeTrim,
} = primordials;
const Transform = require('internal/streams/transform');
const { TapLexer, TokenKind } = require('internal/test_runner/tap_lexer');
const { TapChecker } = require('internal/test_runner/tap_checker');
const {
codes: { ERR_TAP_VALIDATION_ERROR, ERR_TAP_PARSER_ERROR },
} = require('internal/errors');
const { kEmptyObject } = require('internal/util');
/**
*
* TAP14 specifications
Expand Down Expand Up @@ -149,22 +151,26 @@ class TapParser extends Transform {
processChunk(chunk) {
const str = this.#lastLine + chunk.toString('utf8');
const lines = StringPrototypeSplit(str, '\n');
this.#lastLine = ArrayPrototypeSplice(lines, lines.length - 1, 1)[0];
this.#lastLine = ArrayPrototypePop(lines);

let chunkAsString = lines.join('\n');
let chunkAsString = ArrayPrototypeJoin(lines, '\n');
// Special case where chunk is emitted by a child process
chunkAsString = RegExpPrototypeSymbolReplace(
/\[out\] /g,
chunkAsString = StringPrototypeReplaceAll(
chunkAsString,
'[out] ',
''
);
chunkAsString = RegExpPrototypeSymbolReplace(
/\[err\] /g,
chunkAsString = StringPrototypeReplaceAll(
chunkAsString,
'[err] ',
''
);
chunkAsString = RegExpPrototypeSymbolReplace(/\n$/, chunkAsString, '');
chunkAsString = RegExpPrototypeSymbolReplace(/EOF$/, chunkAsString, '');
if (StringPrototypeEndsWith(chunkAsString, '\n')) {
chunkAsString = StringPrototypeSlice(chunkAsString, 0, -1);
}
if (StringPrototypeEndsWith(chunkAsString, 'EOF')) {
chunkAsString = StringPrototypeSlice(chunkAsString, 0, -3);
}

return chunkAsString;
}
Expand Down Expand Up @@ -371,7 +377,7 @@ class TapParser extends Transform {
}

#addDiagnosticsToLastTestPoint(currentNode) {
const lastTestPoint = this.#bufferedTestPoints.at(-1);
const { length, [length - 1]: lastTestPoint } = this.#bufferedTestPoints;

// Diagnostic nodes are only added to Test points of the same nesting level
if (lastTestPoint && lastTestPoint.nesting === currentNode.nesting) {
Expand All @@ -396,7 +402,7 @@ class TapParser extends Transform {

#flushBufferedTestPointNode(shouldClearBuffer = true) {
if (this.#bufferedTestPoints.length > 0) {
this.#emit(this.#bufferedTestPoints.at(0));
this.#emit(this.#bufferedTestPoints[0]);

if (shouldClearBuffer) {
this.#bufferedTestPoints = [];
Expand Down Expand Up @@ -797,7 +803,7 @@ class TapParser extends Transform {

const commentContent = this.#peek();
if (commentContent) {
if (/^Subtest:/i.test(commentContent.value)) {
if (RegExpPrototypeExec(/^Subtest:/i, commentContent.value) !== null) {
this.#next(); // skip subtest keyword
const name = StringPrototypeTrim(this.#readNextLiterals());
const node = {
Expand Down Expand Up @@ -898,7 +904,7 @@ class TapParser extends Transform {
// YAMLLine := " " (YAML)* "\n"
#YAMLLine() {
const yamlLiteral = this.#readNextLiterals();
const { 0: key, 1: value } = StringPrototypeSplit(yamlLiteral, ':');
const { 0: key, 1: value } = StringPrototypeSplit(yamlLiteral, ':', 2);

// Note that this.#lastTestPointDetails has been cleared when we encounter a YAML start marker

Expand Down Expand Up @@ -960,7 +966,7 @@ class TapParser extends Transform {

// In some cases, pragma key can be followed by a comma separator,
// so we need to remove it
pragmaKey = RegExpPrototypeSymbolReplace(/,/g, pragmaKey, '');
pragmaKey = StringPrototypeReplaceAll(pragmaKey, ',', '');

pragmas[pragmaKey] = isEnabled;
nextToken = this.#peek();
Expand Down

0 comments on commit ffc0f3d

Please sign in to comment.