@git.zone/tstest 1.11.5 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/index.js +24 -2
- package/dist_ts/tstest.classes.tap.parser.d.ts +10 -5
- package/dist_ts/tstest.classes.tap.parser.js +239 -99
- package/dist_ts/tstest.classes.tap.parser.old.d.ts +50 -0
- package/dist_ts/tstest.classes.tap.parser.old.js +332 -0
- package/dist_ts/tstest.classes.tstest.d.ts +1 -0
- package/dist_ts/tstest.classes.tstest.js +93 -4
- package/dist_ts/tstest.logging.d.ts +4 -0
- package/dist_ts/tstest.logging.js +36 -1
- package/dist_ts/tstest.plugins.d.ts +2 -1
- package/dist_ts/tstest.plugins.js +3 -2
- package/dist_ts_tapbundle/index.d.ts +1 -3
- package/dist_ts_tapbundle/index.js +3 -5
- package/dist_ts_tapbundle/tapbundle.classes.settingsmanager.d.ts +36 -0
- package/dist_ts_tapbundle/tapbundle.classes.settingsmanager.js +114 -0
- package/dist_ts_tapbundle/tapbundle.classes.tap.d.ts +26 -3
- package/dist_ts_tapbundle/tapbundle.classes.tap.js +218 -22
- package/dist_ts_tapbundle/tapbundle.classes.taptest.d.ts +5 -0
- package/dist_ts_tapbundle/tapbundle.classes.taptest.js +161 -7
- package/dist_ts_tapbundle/tapbundle.classes.taptools.d.ts +14 -0
- package/dist_ts_tapbundle/tapbundle.classes.taptools.js +24 -1
- package/dist_ts_tapbundle/tapbundle.expect.wrapper.d.ts +11 -0
- package/dist_ts_tapbundle/tapbundle.expect.wrapper.js +71 -0
- package/dist_ts_tapbundle/tapbundle.interfaces.d.ts +27 -0
- package/dist_ts_tapbundle/tapbundle.interfaces.js +2 -0
- package/dist_ts_tapbundle/tapbundle.utilities.diff.d.ts +5 -0
- package/dist_ts_tapbundle/tapbundle.utilities.diff.js +179 -0
- package/dist_ts_tapbundle_protocol/index.d.ts +6 -0
- package/dist_ts_tapbundle_protocol/index.js +11 -0
- package/dist_ts_tapbundle_protocol/protocol.emitter.d.ts +55 -0
- package/dist_ts_tapbundle_protocol/protocol.emitter.js +155 -0
- package/dist_ts_tapbundle_protocol/protocol.parser.d.ts +79 -0
- package/dist_ts_tapbundle_protocol/protocol.parser.js +359 -0
- package/dist_ts_tapbundle_protocol/protocol.types.d.ts +111 -0
- package/dist_ts_tapbundle_protocol/protocol.types.js +19 -0
- package/package.json +2 -1
- package/readme.hints.md +166 -5
- package/readme.md +134 -3
- package/readme.plan.md +145 -56
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +22 -1
- package/ts/tspublish.json +1 -1
- package/ts/tstest.classes.tap.parser.ts +271 -110
- package/ts/tstest.classes.tstest.ts +112 -5
- package/ts/tstest.logging.ts +43 -0
- package/ts/tstest.plugins.ts +2 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a diff between two values
|
|
3
|
+
*/
|
|
4
|
+
export function generateDiff(expected, actual, context = 3) {
|
|
5
|
+
// Handle same values
|
|
6
|
+
if (expected === actual) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
// Determine diff type based on values
|
|
10
|
+
if (typeof expected === 'string' && typeof actual === 'string') {
|
|
11
|
+
return generateStringDiff(expected, actual, context);
|
|
12
|
+
}
|
|
13
|
+
else if (Array.isArray(expected) && Array.isArray(actual)) {
|
|
14
|
+
return generateArrayDiff(expected, actual);
|
|
15
|
+
}
|
|
16
|
+
else if (expected && actual && typeof expected === 'object' && typeof actual === 'object') {
|
|
17
|
+
return generateObjectDiff(expected, actual);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
return generatePrimitiveDiff(expected, actual);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate diff for primitive values
|
|
25
|
+
*/
|
|
26
|
+
function generatePrimitiveDiff(expected, actual) {
|
|
27
|
+
return {
|
|
28
|
+
type: 'primitive',
|
|
29
|
+
changes: [{
|
|
30
|
+
type: 'modify',
|
|
31
|
+
oldValue: expected,
|
|
32
|
+
newValue: actual
|
|
33
|
+
}]
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generate diff for strings (line-by-line)
|
|
38
|
+
*/
|
|
39
|
+
function generateStringDiff(expected, actual, context) {
|
|
40
|
+
const expectedLines = expected.split('\n');
|
|
41
|
+
const actualLines = actual.split('\n');
|
|
42
|
+
const changes = [];
|
|
43
|
+
// Simple line-by-line diff
|
|
44
|
+
const maxLines = Math.max(expectedLines.length, actualLines.length);
|
|
45
|
+
for (let i = 0; i < maxLines; i++) {
|
|
46
|
+
const expectedLine = expectedLines[i];
|
|
47
|
+
const actualLine = actualLines[i];
|
|
48
|
+
if (expectedLine === undefined) {
|
|
49
|
+
changes.push({
|
|
50
|
+
type: 'add',
|
|
51
|
+
line: i,
|
|
52
|
+
content: actualLine
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else if (actualLine === undefined) {
|
|
56
|
+
changes.push({
|
|
57
|
+
type: 'remove',
|
|
58
|
+
line: i,
|
|
59
|
+
content: expectedLine
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else if (expectedLine !== actualLine) {
|
|
63
|
+
changes.push({
|
|
64
|
+
type: 'remove',
|
|
65
|
+
line: i,
|
|
66
|
+
content: expectedLine
|
|
67
|
+
});
|
|
68
|
+
changes.push({
|
|
69
|
+
type: 'add',
|
|
70
|
+
line: i,
|
|
71
|
+
content: actualLine
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
type: 'string',
|
|
77
|
+
changes,
|
|
78
|
+
context
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate diff for arrays
|
|
83
|
+
*/
|
|
84
|
+
function generateArrayDiff(expected, actual) {
|
|
85
|
+
const changes = [];
|
|
86
|
+
const maxLength = Math.max(expected.length, actual.length);
|
|
87
|
+
for (let i = 0; i < maxLength; i++) {
|
|
88
|
+
const expectedItem = expected[i];
|
|
89
|
+
const actualItem = actual[i];
|
|
90
|
+
if (i >= expected.length) {
|
|
91
|
+
changes.push({
|
|
92
|
+
type: 'add',
|
|
93
|
+
path: [String(i)],
|
|
94
|
+
newValue: actualItem
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else if (i >= actual.length) {
|
|
98
|
+
changes.push({
|
|
99
|
+
type: 'remove',
|
|
100
|
+
path: [String(i)],
|
|
101
|
+
oldValue: expectedItem
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else if (!deepEqual(expectedItem, actualItem)) {
|
|
105
|
+
changes.push({
|
|
106
|
+
type: 'modify',
|
|
107
|
+
path: [String(i)],
|
|
108
|
+
oldValue: expectedItem,
|
|
109
|
+
newValue: actualItem
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
type: 'array',
|
|
115
|
+
changes
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generate diff for objects
|
|
120
|
+
*/
|
|
121
|
+
function generateObjectDiff(expected, actual) {
|
|
122
|
+
const changes = [];
|
|
123
|
+
const allKeys = new Set([...Object.keys(expected), ...Object.keys(actual)]);
|
|
124
|
+
for (const key of allKeys) {
|
|
125
|
+
const expectedValue = expected[key];
|
|
126
|
+
const actualValue = actual[key];
|
|
127
|
+
if (!(key in expected)) {
|
|
128
|
+
changes.push({
|
|
129
|
+
type: 'add',
|
|
130
|
+
path: [key],
|
|
131
|
+
newValue: actualValue
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else if (!(key in actual)) {
|
|
135
|
+
changes.push({
|
|
136
|
+
type: 'remove',
|
|
137
|
+
path: [key],
|
|
138
|
+
oldValue: expectedValue
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
else if (!deepEqual(expectedValue, actualValue)) {
|
|
142
|
+
changes.push({
|
|
143
|
+
type: 'modify',
|
|
144
|
+
path: [key],
|
|
145
|
+
oldValue: expectedValue,
|
|
146
|
+
newValue: actualValue
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
type: 'object',
|
|
152
|
+
changes
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Deep equality check
|
|
157
|
+
*/
|
|
158
|
+
function deepEqual(a, b) {
|
|
159
|
+
if (a === b)
|
|
160
|
+
return true;
|
|
161
|
+
if (a === null || b === null)
|
|
162
|
+
return false;
|
|
163
|
+
if (typeof a !== typeof b)
|
|
164
|
+
return false;
|
|
165
|
+
if (typeof a === 'object') {
|
|
166
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
167
|
+
if (a.length !== b.length)
|
|
168
|
+
return false;
|
|
169
|
+
return a.every((item, index) => deepEqual(item, b[index]));
|
|
170
|
+
}
|
|
171
|
+
const keysA = Object.keys(a);
|
|
172
|
+
const keysB = Object.keys(b);
|
|
173
|
+
if (keysA.length !== keysB.length)
|
|
174
|
+
return false;
|
|
175
|
+
return keysA.every(key => deepEqual(a[key], b[key]));
|
|
176
|
+
}
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLnV0aWxpdGllcy5kaWZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdGFwYnVuZGxlL3RhcGJ1bmRsZS51dGlsaXRpZXMuZGlmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsUUFBYSxFQUFFLE1BQVcsRUFBRSxVQUFrQixDQUFDO0lBQzFFLHFCQUFxQjtJQUNyQixJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDL0QsT0FBTyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzVELE9BQU8saUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7U0FBTSxJQUFJLFFBQVEsSUFBSSxNQUFNLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVGLE9BQU8sa0JBQWtCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMscUJBQXFCLENBQUMsUUFBYSxFQUFFLE1BQVc7SUFDdkQsT0FBTztRQUNMLElBQUksRUFBRSxXQUFXO1FBQ2pCLE9BQU8sRUFB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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './protocol.types.js';
|
|
2
|
+
export * from './protocol.emitter.js';
|
|
3
|
+
export * from './protocol.parser.js';
|
|
4
|
+
export { ProtocolEmitter } from './protocol.emitter.js';
|
|
5
|
+
export { ProtocolParser } from './protocol.parser.js';
|
|
6
|
+
export { PROTOCOL_MARKERS, PROTOCOL_VERSION } from './protocol.types.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Protocol V2 - Isomorphic implementation for improved TAP protocol
|
|
2
|
+
// This module is designed to work in both browser and Node.js environments
|
|
3
|
+
export * from './protocol.types.js';
|
|
4
|
+
export * from './protocol.emitter.js';
|
|
5
|
+
export * from './protocol.parser.js';
|
|
6
|
+
// Re-export main classes for convenience
|
|
7
|
+
export { ProtocolEmitter } from './protocol.emitter.js';
|
|
8
|
+
export { ProtocolParser } from './protocol.parser.js';
|
|
9
|
+
// Re-export constants
|
|
10
|
+
export { PROTOCOL_MARKERS, PROTOCOL_VERSION } from './protocol.types.js';
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGVfcHJvdG9jb2wvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0VBQW9FO0FBQ3BFLDJFQUEyRTtBQUUzRSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxzQkFBc0IsQ0FBQztBQUVyQyx5Q0FBeUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxzQkFBc0I7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUMifQ==
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ITestResult, IPlanLine, ISnapshotData, IErrorBlock, ITestEvent } from './protocol.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ProtocolEmitter generates Protocol V2 messages
|
|
4
|
+
* This class is used by tapbundle to emit test results in the new protocol format
|
|
5
|
+
*/
|
|
6
|
+
export declare class ProtocolEmitter {
|
|
7
|
+
/**
|
|
8
|
+
* Emit protocol version header
|
|
9
|
+
*/
|
|
10
|
+
emitProtocolHeader(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Emit TAP version line
|
|
13
|
+
*/
|
|
14
|
+
emitTapVersion(version?: number): string;
|
|
15
|
+
/**
|
|
16
|
+
* Emit test plan
|
|
17
|
+
*/
|
|
18
|
+
emitPlan(plan: IPlanLine): string;
|
|
19
|
+
/**
|
|
20
|
+
* Emit a test result
|
|
21
|
+
*/
|
|
22
|
+
emitTest(result: ITestResult): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Emit a comment line
|
|
25
|
+
*/
|
|
26
|
+
emitComment(comment: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Emit bailout
|
|
29
|
+
*/
|
|
30
|
+
emitBailout(reason: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Emit snapshot data
|
|
33
|
+
*/
|
|
34
|
+
emitSnapshot(snapshot: ISnapshotData): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Emit error block
|
|
37
|
+
*/
|
|
38
|
+
emitError(error: IErrorBlock): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Emit test event
|
|
41
|
+
*/
|
|
42
|
+
emitEvent(event: ITestEvent): string;
|
|
43
|
+
/**
|
|
44
|
+
* Check if metadata should be inline
|
|
45
|
+
*/
|
|
46
|
+
private shouldUseInlineMetadata;
|
|
47
|
+
/**
|
|
48
|
+
* Create inline metadata string
|
|
49
|
+
*/
|
|
50
|
+
private createInlineMetadata;
|
|
51
|
+
/**
|
|
52
|
+
* Create block metadata lines
|
|
53
|
+
*/
|
|
54
|
+
private createBlockMetadata;
|
|
55
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { PROTOCOL_MARKERS, PROTOCOL_VERSION } from './protocol.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ProtocolEmitter generates Protocol V2 messages
|
|
4
|
+
* This class is used by tapbundle to emit test results in the new protocol format
|
|
5
|
+
*/
|
|
6
|
+
export class ProtocolEmitter {
|
|
7
|
+
/**
|
|
8
|
+
* Emit protocol version header
|
|
9
|
+
*/
|
|
10
|
+
emitProtocolHeader() {
|
|
11
|
+
return `${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.PROTOCOL_PREFIX}${PROTOCOL_VERSION}${PROTOCOL_MARKERS.END}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Emit TAP version line
|
|
15
|
+
*/
|
|
16
|
+
emitTapVersion(version = 13) {
|
|
17
|
+
return `TAP version ${version}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Emit test plan
|
|
21
|
+
*/
|
|
22
|
+
emitPlan(plan) {
|
|
23
|
+
if (plan.skipAll) {
|
|
24
|
+
return `1..0 # Skipped: ${plan.skipAll}`;
|
|
25
|
+
}
|
|
26
|
+
return `${plan.start}..${plan.end}`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Emit a test result
|
|
30
|
+
*/
|
|
31
|
+
emitTest(result) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
// Build the basic TAP line
|
|
34
|
+
let tapLine = result.ok ? 'ok' : 'not ok';
|
|
35
|
+
tapLine += ` ${result.testNumber}`;
|
|
36
|
+
tapLine += ` - ${result.description}`;
|
|
37
|
+
// Add directive if present
|
|
38
|
+
if (result.directive) {
|
|
39
|
+
tapLine += ` # ${result.directive.type.toUpperCase()}`;
|
|
40
|
+
if (result.directive.reason) {
|
|
41
|
+
tapLine += ` ${result.directive.reason}`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Add inline metadata for simple cases
|
|
45
|
+
if (result.metadata && this.shouldUseInlineMetadata(result.metadata)) {
|
|
46
|
+
const metaStr = this.createInlineMetadata(result.metadata);
|
|
47
|
+
if (metaStr) {
|
|
48
|
+
tapLine += ` ${metaStr}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
lines.push(tapLine);
|
|
52
|
+
// Add block metadata for complex cases
|
|
53
|
+
if (result.metadata && !this.shouldUseInlineMetadata(result.metadata)) {
|
|
54
|
+
lines.push(...this.createBlockMetadata(result.metadata, result.testNumber));
|
|
55
|
+
}
|
|
56
|
+
return lines;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Emit a comment line
|
|
60
|
+
*/
|
|
61
|
+
emitComment(comment) {
|
|
62
|
+
return `# ${comment}`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Emit bailout
|
|
66
|
+
*/
|
|
67
|
+
emitBailout(reason) {
|
|
68
|
+
return `Bail out! ${reason}`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Emit snapshot data
|
|
72
|
+
*/
|
|
73
|
+
emitSnapshot(snapshot) {
|
|
74
|
+
const lines = [];
|
|
75
|
+
lines.push(`${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.SNAPSHOT_PREFIX}${snapshot.name}${PROTOCOL_MARKERS.END}`);
|
|
76
|
+
if (snapshot.format === 'json') {
|
|
77
|
+
lines.push(JSON.stringify(snapshot.content, null, 2));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
lines.push(String(snapshot.content));
|
|
81
|
+
}
|
|
82
|
+
lines.push(`${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.SNAPSHOT_END}${PROTOCOL_MARKERS.END}`);
|
|
83
|
+
return lines;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Emit error block
|
|
87
|
+
*/
|
|
88
|
+
emitError(error) {
|
|
89
|
+
const lines = [];
|
|
90
|
+
lines.push(`${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.ERROR_PREFIX}${PROTOCOL_MARKERS.END}`);
|
|
91
|
+
lines.push(JSON.stringify(error, null, 2));
|
|
92
|
+
lines.push(`${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.ERROR_END}${PROTOCOL_MARKERS.END}`);
|
|
93
|
+
return lines;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Emit test event
|
|
97
|
+
*/
|
|
98
|
+
emitEvent(event) {
|
|
99
|
+
const eventJson = JSON.stringify(event);
|
|
100
|
+
return `${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.EVENT_PREFIX}${eventJson}${PROTOCOL_MARKERS.END}`;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if metadata should be inline
|
|
104
|
+
*/
|
|
105
|
+
shouldUseInlineMetadata(metadata) {
|
|
106
|
+
// Use inline for simple metadata (time, retry, simple skip/todo)
|
|
107
|
+
const hasComplexData = metadata.error ||
|
|
108
|
+
metadata.custom ||
|
|
109
|
+
(metadata.tags && metadata.tags.length > 0) ||
|
|
110
|
+
metadata.file ||
|
|
111
|
+
metadata.line;
|
|
112
|
+
return !hasComplexData;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Create inline metadata string
|
|
116
|
+
*/
|
|
117
|
+
createInlineMetadata(metadata) {
|
|
118
|
+
const parts = [];
|
|
119
|
+
if (metadata.time !== undefined) {
|
|
120
|
+
parts.push(`time:${metadata.time}`);
|
|
121
|
+
}
|
|
122
|
+
if (metadata.retry !== undefined) {
|
|
123
|
+
parts.push(`retry:${metadata.retry}`);
|
|
124
|
+
}
|
|
125
|
+
if (metadata.skip) {
|
|
126
|
+
return `${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.SKIP_PREFIX}${metadata.skip}${PROTOCOL_MARKERS.END}`;
|
|
127
|
+
}
|
|
128
|
+
if (metadata.todo) {
|
|
129
|
+
return `${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.TODO_PREFIX}${metadata.todo}${PROTOCOL_MARKERS.END}`;
|
|
130
|
+
}
|
|
131
|
+
if (parts.length > 0) {
|
|
132
|
+
return `${PROTOCOL_MARKERS.START}${parts.join(',')}${PROTOCOL_MARKERS.END}`;
|
|
133
|
+
}
|
|
134
|
+
return '';
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create block metadata lines
|
|
138
|
+
*/
|
|
139
|
+
createBlockMetadata(metadata, testNumber) {
|
|
140
|
+
const lines = [];
|
|
141
|
+
// Create a clean metadata object without skip/todo (handled inline)
|
|
142
|
+
const blockMeta = { ...metadata };
|
|
143
|
+
delete blockMeta.skip;
|
|
144
|
+
delete blockMeta.todo;
|
|
145
|
+
// Emit metadata block
|
|
146
|
+
const metaJson = JSON.stringify(blockMeta);
|
|
147
|
+
lines.push(`${PROTOCOL_MARKERS.START}${PROTOCOL_MARKERS.META_PREFIX}${metaJson}${PROTOCOL_MARKERS.END}`);
|
|
148
|
+
// Emit separate error block if present
|
|
149
|
+
if (metadata.error) {
|
|
150
|
+
lines.push(...this.emitError({ testNumber, error: metadata.error }));
|
|
151
|
+
}
|
|
152
|
+
return lines;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wuZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZV9wcm90b2NvbC9wcm90b2NvbC5lbWl0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2pCLE1BQU0scUJBQXFCLENBQUM7QUFFN0I7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUI7O09BRUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxHQUFHLGdCQUFnQixDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEgsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYyxDQUFDLFVBQWtCLEVBQUU7UUFDeEMsT0FBTyxlQUFlLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxJQUFlO1FBQzdCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE9BQU8sbUJBQW1CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxNQUFtQjtRQUNqQyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFFM0IsMkJBQTJCO1FBQzNCLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzFDLE9BQU8sSUFBSSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFdEMsMkJBQTJCO1FB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
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { IProtocolMessage } from './protocol.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ProtocolParser parses Protocol V2 messages
|
|
4
|
+
* This class is used by tstest to parse test results from the new protocol format
|
|
5
|
+
*/
|
|
6
|
+
export declare class ProtocolParser {
|
|
7
|
+
private protocolVersion;
|
|
8
|
+
private inBlock;
|
|
9
|
+
private blockType;
|
|
10
|
+
private blockContent;
|
|
11
|
+
/**
|
|
12
|
+
* Parse a single line and return protocol messages
|
|
13
|
+
*/
|
|
14
|
+
parseLine(line: string): IProtocolMessage[];
|
|
15
|
+
/**
|
|
16
|
+
* Parse protocol version header
|
|
17
|
+
*/
|
|
18
|
+
private parseProtocolVersion;
|
|
19
|
+
/**
|
|
20
|
+
* Parse TAP version line
|
|
21
|
+
*/
|
|
22
|
+
private parseTapVersion;
|
|
23
|
+
/**
|
|
24
|
+
* Parse plan line
|
|
25
|
+
*/
|
|
26
|
+
private parsePlan;
|
|
27
|
+
/**
|
|
28
|
+
* Parse bailout
|
|
29
|
+
*/
|
|
30
|
+
private parseBailout;
|
|
31
|
+
/**
|
|
32
|
+
* Parse event
|
|
33
|
+
*/
|
|
34
|
+
private parseEvent;
|
|
35
|
+
/**
|
|
36
|
+
* Check if line is a comment
|
|
37
|
+
*/
|
|
38
|
+
private isComment;
|
|
39
|
+
/**
|
|
40
|
+
* Parse test result line
|
|
41
|
+
*/
|
|
42
|
+
private parseTestResult;
|
|
43
|
+
/**
|
|
44
|
+
* Extract inline metadata from line
|
|
45
|
+
*/
|
|
46
|
+
private extractInlineMetadata;
|
|
47
|
+
/**
|
|
48
|
+
* Remove inline metadata from line
|
|
49
|
+
*/
|
|
50
|
+
private removeInlineMetadata;
|
|
51
|
+
/**
|
|
52
|
+
* Extract protocol data with specific prefix
|
|
53
|
+
*/
|
|
54
|
+
private extractProtocolData;
|
|
55
|
+
/**
|
|
56
|
+
* Check if line starts a block
|
|
57
|
+
*/
|
|
58
|
+
private isBlockStart;
|
|
59
|
+
/**
|
|
60
|
+
* Check if line ends a block
|
|
61
|
+
*/
|
|
62
|
+
private isBlockEnd;
|
|
63
|
+
/**
|
|
64
|
+
* Extract block type from start line
|
|
65
|
+
*/
|
|
66
|
+
private extractBlockType;
|
|
67
|
+
/**
|
|
68
|
+
* Finalize current block
|
|
69
|
+
*/
|
|
70
|
+
private finalizeBlock;
|
|
71
|
+
/**
|
|
72
|
+
* Escape regex special characters
|
|
73
|
+
*/
|
|
74
|
+
private escapeRegex;
|
|
75
|
+
/**
|
|
76
|
+
* Get protocol version
|
|
77
|
+
*/
|
|
78
|
+
getProtocolVersion(): string | null;
|
|
79
|
+
}
|