test
Version:
Node.js 18's node:test, as an npm package
819 lines (814 loc) • 17.1 kB
JavaScript
// https://github.com/nodejs/node/blob/4c08c20e575a0954fe3977a20e9f52b4980a2e48/test/parallel/test-runner-tap-parser-stream.js
// Flags: --expose-internals
'use strict'
const common = require('../common')
const assert = require('node:assert')
const { TapParser } = require('#internal/test_runner/tap_parser')
const { TapChecker } = require('#internal/test_runner/tap_checker')
const { toArray } = require('readable-stream/lib/internal/streams/operators').promiseReturningOperators
const cases = [
{
input: 'TAP version 13',
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
}
]
},
{
input: '123',
expected: [
{
kind: 'Unknown',
node: { value: '123' },
nesting: 0,
lexeme: '123'
}
]
},
{
input: '# 123',
expected: [
{
kind: 'Comment',
node: { comment: '123' },
nesting: 0,
lexeme: '# 123'
}
]
},
{
input: '1..',
expected: [
{
kind: 'Unknown',
node: { value: '1..' },
nesting: 0,
lexeme: '1..'
}
]
},
{
input: '1..abc',
expected: [
{
kind: 'Unknown',
node: { value: '1..abc' },
nesting: 0,
lexeme: '1..abc'
}
]
},
{
input: '1..-1',
expected: [
{
kind: 'Unknown',
node: { value: '1..-1' },
nesting: 0,
lexeme: '1..-1'
}
]
},
{
input: '1.1',
expected: [
{
kind: 'Unknown',
node: { value: '1.1' },
nesting: 0,
lexeme: '1.1'
}
]
},
{
input: '1.....4',
expected: [
{
kind: 'Unknown',
node: { value: '1.....4' },
nesting: 0,
lexeme: '1.....4'
}
]
},
{
input: 'TAP 12',
expected: [
{
kind: 'Unknown',
node: { value: 'TAP 12' },
nesting: 0,
lexeme: 'TAP 12'
}
]
},
{
input: 'TAP version',
expected: [
{
kind: 'Unknown',
node: { value: 'TAP version' },
nesting: 0,
lexeme: 'TAP version'
}
]
},
{
input: 'TAP version v14',
expected: [
{
kind: 'Unknown',
node: { value: 'TAP version v14' },
nesting: 0,
lexeme: 'TAP version v14'
}
]
},
{
input: 'TAP TAP TAP',
expected: [
{
kind: 'Unknown',
node: { value: 'TAP TAP TAP' },
nesting: 0,
lexeme: 'TAP TAP TAP'
}
]
},
{
input: '--- yaml',
expected: [
{
kind: 'Unknown',
node: { value: '--- yaml' },
nesting: 0,
lexeme: '--- yaml'
}
]
},
{
input: '... ... yaml',
expected: [
{
kind: 'Unknown',
node: { value: '... ... yaml' },
nesting: 0,
lexeme: '... ... yaml'
}
]
},
{
input: 'ook 1',
expected: [
{
kind: 'Unknown',
node: { value: 'ook 1' },
nesting: 0,
lexeme: 'ook 1'
}
]
},
{
input: ' ok 98',
expected: [
{
kind: 'Unknown',
node: { value: ' ok 98' },
nesting: 0,
lexeme: ' ok 98'
}
]
},
{
input: 'pragma ++++++',
expected: [
{
kind: 'Unknown',
node: { value: 'pragma ++++++' },
nesting: 0,
lexeme: 'pragma ++++++'
}
]
},
{
input: 'Bailout!',
expected: [
{
kind: 'Unknown',
node: { value: 'Bailout!' },
nesting: 0,
lexeme: 'Bailout!'
}
]
},
{
input: 'invalid tap',
expected: [
{
nesting: 0,
kind: 'Unknown',
node: { value: 'invalid tap' },
lexeme: 'invalid tap'
}
]
},
{
input: 'TAP version 13\ninvalid tap after harness',
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
nesting: 0,
kind: 'Unknown',
node: { value: 'invalid tap after harness' },
lexeme: 'invalid tap after harness'
}
]
},
{
input: `TAP version 13
# nested diagnostic
# diagnostic comment`,
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
nesting: 1,
kind: 'Comment',
node: { comment: 'nested diagnostic' },
lexeme: ' # nested diagnostic'
},
{
nesting: 0,
kind: 'Comment',
node: { comment: 'diagnostic comment' },
lexeme: '# diagnostic comment'
}
]
},
{
input: `TAP version 13
1..5
1..3
2..2`,
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
nesting: 1,
kind: 'PlanKeyword',
node: { start: '1', end: '5' },
lexeme: ' 1..5'
},
{
nesting: 0,
kind: 'PlanKeyword',
node: { start: '1', end: '3' },
lexeme: '1..3'
},
{
nesting: 0,
kind: 'PlanKeyword',
node: { start: '2', end: '2' },
lexeme: '2..2'
}
]
},
{
input: `TAP version 13
ok 1 - test
ok 2 - test # SKIP
not ok 3 - test # TODO reason`,
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '1',
description: 'test',
reason: '',
time: 0,
diagnostics: []
},
lexeme: 'ok 1 - test'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: true },
id: '2',
description: 'test',
reason: '',
time: 0,
diagnostics: []
},
lexeme: 'ok 2 - test # SKIP'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: true, pass: false, todo: true, skip: false },
id: '3',
description: 'test',
reason: 'reason',
time: 0,
diagnostics: []
},
lexeme: 'not ok 3 - test # TODO reason'
}
]
},
{
input: `TAP version 13
# Subtest: test
ok 1 - test
ok 2 - test`,
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
nesting: 0,
kind: 'SubTestPointKeyword',
node: { name: 'test' },
lexeme: '# Subtest: test'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '1',
description: 'test',
reason: '',
time: 0,
diagnostics: []
},
lexeme: 'ok 1 - test'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '2',
description: 'test',
reason: '',
time: 0,
diagnostics: []
},
lexeme: 'ok 2 - test'
}
]
},
{
input: `TAP version 13
# Subtest: test
ok 1 - test
---
foo: bar
duration_ms: 0.0001
prop: |-
multiple
lines
...`,
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
nesting: 0,
kind: 'SubTestPointKeyword',
node: { name: 'test' },
lexeme: '# Subtest: test'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '1',
description: 'test',
reason: '',
time: 0.0001,
diagnostics: [
'foo: bar',
'duration_ms: 0.0001',
'prop: |-',
' multiple',
' lines'
]
},
lexeme: 'ok 1 - test'
}
]
},
{
input: `TAP version 13
# Subtest: test/fixtures/test-runner/index.test.js
# Subtest: this should pass
ok 1 - this should pass
---
duration_ms: 0.0001
...
1..1`,
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
kind: 'SubTestPointKeyword',
lexeme: '# Subtest: test/fixtures/test-runner/index.test.js',
nesting: 0,
node: {
name: 'test/fixtures/test-runner/index.test.js'
}
},
{
kind: 'SubTestPointKeyword',
lexeme: ' # Subtest: this should pass',
nesting: 1,
node: {
name: 'this should pass'
}
},
{
kind: 'TestPointKeyword',
lexeme: ' ok 1 - this should pass',
nesting: 1,
node: {
description: 'this should pass',
diagnostics: ['duration_ms: 0.0001'],
id: '1',
reason: '',
status: {
fail: false,
pass: true,
skip: false,
todo: false
},
time: 0.0001
}
},
{
kind: 'PlanKeyword',
lexeme: ' 1..1',
nesting: 1,
node: {
end: '1',
start: '1'
}
}
]
},
{
input: `TAP version 13
# Subtest: test 1
ok 1 - test 1
---
foo: bar
duration_ms: 1.00
prop: |-
multiple
lines
...
# Subtest: test 2
ok 2 - test 2
---
duration_ms: 2.00
...
# Subtest: test 3
ok 3 - test 3
---
foo: bar
duration_ms: 3.00
prop: |-
multiple
lines
...`,
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
nesting: 0,
kind: 'SubTestPointKeyword',
node: { name: 'test 1' },
lexeme: '# Subtest: test 1'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '1',
description: 'test 1',
reason: '',
time: 1.0,
diagnostics: [
'foo: bar',
'duration_ms: 1.00',
'prop: |-',
' multiple',
' lines'
]
},
lexeme: 'ok 1 - test 1'
},
{
nesting: 0,
kind: 'SubTestPointKeyword',
node: { name: 'test 2' },
lexeme: '# Subtest: test 2'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '2',
description: 'test 2',
reason: '',
time: 2.0,
diagnostics: ['duration_ms: 2.00']
},
lexeme: 'ok 2 - test 2'
},
{
nesting: 0,
kind: 'SubTestPointKeyword',
node: { name: 'test 3' },
lexeme: '# Subtest: test 3'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '3',
description: 'test 3',
reason: '',
time: 3.0,
diagnostics: [
'foo: bar',
'duration_ms: 3.00',
'prop: |-',
' multiple',
' lines'
]
},
lexeme: 'ok 3 - test 3'
}
]
},
{
input: `TAP version 13
# Subtest: test 1
ok 1 - test 1
---
foo: bar
duration_ms: 1.00
prop: |-
multiple
lines
...
# Subtest: test 11
ok 11 - test 11
---
duration_ms: 11.00
...
# Subtest: test 111
ok 111 - test 111
---
foo: bar
duration_ms: 111.00
prop: |-
multiple
lines
...`,
expected: [
{
nesting: 0,
kind: 'VersionKeyword',
node: { version: '13' },
lexeme: 'TAP version 13'
},
{
nesting: 0,
kind: 'SubTestPointKeyword',
node: { name: 'test 1' },
lexeme: '# Subtest: test 1'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '1',
description: 'test 1',
reason: '',
time: 1.0,
diagnostics: [
'foo: bar',
'duration_ms: 1.00',
'prop: |-',
' multiple',
' lines'
]
},
lexeme: 'ok 1 - test 1'
},
{
nesting: 1,
kind: 'SubTestPointKeyword',
node: { name: 'test 11' },
lexeme: ' # Subtest: test 11'
},
{
nesting: 1,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '11',
description: 'test 11',
reason: '',
time: 11.0,
diagnostics: ['duration_ms: 11.00']
},
lexeme: ' ok 11 - test 11'
},
{
nesting: 2,
kind: 'SubTestPointKeyword',
node: { name: 'test 111' },
lexeme: ' # Subtest: test 111'
},
{
nesting: 2,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '111',
description: 'test 111',
reason: '',
time: 111.0,
diagnostics: [
'foo: bar',
'duration_ms: 111.00',
'prop: |-',
' multiple',
' lines'
]
},
lexeme: ' ok 111 - test 111'
}
]
}
];
(async () => {
for (const { input, expected } of cases) {
const parser = new TapParser()
parser.write(input)
parser.end()
const actual = await toArray.call(parser)
assert.deepStrictEqual(
actual,
expected.map((item) => ({ __proto__: null, ...item }))
)
}
})().then(common.mustCall());
(async () => {
const expected = [
{
kind: 'PlanKeyword',
node: { start: '1', end: '3' },
nesting: 0,
lexeme: '1..3'
},
{
nesting: 0,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: false, skip: false },
id: '1',
description: 'Input file opened',
reason: '',
time: 0,
diagnostics: []
},
lexeme: 'ok 1 - Input file opened'
},
{
kind: 'TestPointKeyword',
node: {
status: { fail: true, pass: false, todo: false, skip: false },
id: '2',
description: '',
reason: '',
time: 0,
diagnostics: []
},
nesting: 0,
lexeme: 'not ok 2 '
},
{
kind: 'SubTestPointKeyword',
node: { name: 'foobar' },
nesting: 1,
lexeme: ' # Subtest: foobar'
},
{
__proto__: null,
kind: 'TestPointKeyword',
node: {
status: { fail: false, pass: true, todo: true, skip: false },
id: '3',
description: '',
reason: '',
time: 0.0001,
diagnostics: [
'foo: bar',
'duration_ms: 0.0001',
'prop: |-',
' foo',
' bar'
]
},
nesting: 0,
lexeme: 'ok 3 # TODO'
}
]
const parser = new TapParser({ specs: TapChecker.TAP14 })
parser.write('\n')
parser.write('1')
parser.write('.')
parser.write('.')
parser.write('3')
parser.write('\n')
parser.write('ok 1 ')
parser.write('- Input file opened\n')
parser.write('not')
parser.write(' ok')
parser.write(' 2 \n')
parser.write('\n')
parser.write(' # ')
parser.write('Subtest: foo')
parser.write('bar')
parser.write('\n')
parser.write('')
parser.write('ok')
parser.write(' 3 #')
parser.write(' TODO')
parser.write('\n')
parser.write(' ---\n')
parser.write(' foo: bar\n')
parser.write(' duration_ms: ')
parser.write(' 0.0001\n')
parser.write(' prop: |-\n')
parser.write(' foo\n')
parser.write(' bar\n')
parser.write(' ...\n')
parser.end()
const actual = await toArray.call(parser)
assert.deepStrictEqual(
actual,
expected.map((item) => ({ __proto__: null, ...item }))
)
})().then(common.mustCall())