@git.zone/tstest 3.1.3 → 3.1.5
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 +1 -1
- package/dist_ts/tstest.classes.tap.parser.d.ts +9 -0
- package/dist_ts/tstest.classes.tap.parser.js +89 -32
- package/dist_ts/tstest.classes.tap.testresult.d.ts +6 -1
- package/dist_ts/tstest.classes.tap.testresult.js +10 -2
- package/dist_ts/tstest.logging.d.ts +2 -0
- package/dist_ts/tstest.logging.js +37 -2
- package/dist_ts_tapbundle/webhelpers.js +12 -2
- package/npmextra.json +11 -5
- package/package.json +12 -11
- package/readme.hints.md +46 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/tstest.classes.tap.parser.ts +96 -33
- package/ts/tstest.classes.tap.testresult.ts +10 -1
- package/ts/tstest.logging.ts +39 -3
- package/dist_ts/tstest.classes.tap.parser.old.d.ts +0 -50
- package/dist_ts/tstest.classes.tap.parser.old.js +0 -332
- package/dist_ts_tapbundle/tapbundle.protocols.d.ts +0 -88
- package/dist_ts_tapbundle/tapbundle.protocols.js +0 -168
- package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.d.ts +0 -8
- package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.js +0 -9
- package/dist_ts_tapbundle/ts_tapbundle/index.d.ts +0 -6
- package/dist_ts_tapbundle/ts_tapbundle/index.js +0 -7
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.d.ts +0 -10
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.js +0 -13
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.d.ts +0 -104
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.js +0 -401
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.d.ts +0 -38
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.js +0 -110
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.d.ts +0 -109
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.js +0 -241
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.d.ts +0 -8
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.js +0 -7
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.d.ts +0 -8
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.js +0 -10
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.d.ts +0 -3
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.js +0 -5
- package/dist_ts_tapbundle/ts_tapbundle/webhelpers.d.ts +0 -7
- package/dist_ts_tapbundle/ts_tapbundle/webhelpers.js +0 -35
- package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.d.ts +0 -5
- package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.js +0 -13
- package/dist_ts_tapbundle/ts_tapbundle_node/plugins.d.ts +0 -11
- package/dist_ts_tapbundle/ts_tapbundle_node/plugins.js +0 -14
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
import { ChildProcess } from 'child_process';
|
|
2
|
-
import { coloredString as cs } from '@push.rocks/consolecolor';
|
|
3
|
-
// ============
|
|
4
|
-
// combines different tap test files to an overall result
|
|
5
|
-
// ============
|
|
6
|
-
import * as plugins from './tstest.plugins.js';
|
|
7
|
-
import { TapTestResult } from './tstest.classes.tap.testresult.js';
|
|
8
|
-
import * as logPrefixes from './tstest.logprefixes.js';
|
|
9
|
-
import { TsTestLogger } from './tstest.logging.js';
|
|
10
|
-
import { ProtocolParser } from '../dist_ts_tapbundle_protocol/index.js';
|
|
11
|
-
export class TapParser {
|
|
12
|
-
/**
|
|
13
|
-
* the constructor for TapParser
|
|
14
|
-
*/
|
|
15
|
-
constructor(fileName, logger) {
|
|
16
|
-
this.fileName = fileName;
|
|
17
|
-
this.testStore = [];
|
|
18
|
-
this.expectedTestsRegex = /([0-9]*)\.\.([0-9]*)$/;
|
|
19
|
-
this.testStatusRegex = /(ok|not\sok)\s([0-9]+)\s-\s(.*?)(\s#\s(.*))?$/;
|
|
20
|
-
this.collectingErrorDetails = false;
|
|
21
|
-
this.currentTestError = [];
|
|
22
|
-
this.pretaskRegex = /^::__PRETASK:(.*)$/;
|
|
23
|
-
this.logger = logger;
|
|
24
|
-
this.protocolParser = new ProtocolParser();
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Handle test file timeout
|
|
28
|
-
*/
|
|
29
|
-
handleTimeout(timeoutSeconds) {
|
|
30
|
-
// If no tests have been defined yet, set expected to 1
|
|
31
|
-
if (this.expectedTests === 0) {
|
|
32
|
-
this.expectedTests = 1;
|
|
33
|
-
}
|
|
34
|
-
// Create a fake failing test result for timeout
|
|
35
|
-
this._getNewTapTestResult();
|
|
36
|
-
this.activeTapTestResult.testOk = false;
|
|
37
|
-
this.activeTapTestResult.testSettled = true;
|
|
38
|
-
this.testStore.push(this.activeTapTestResult);
|
|
39
|
-
// Log the timeout error
|
|
40
|
-
if (this.logger) {
|
|
41
|
-
// First log the test result
|
|
42
|
-
this.logger.testResult(`Test file timeout`, false, timeoutSeconds * 1000, `Error: Test file exceeded timeout of ${timeoutSeconds} seconds`);
|
|
43
|
-
this.logger.testErrorDetails(`Test execution was terminated after ${timeoutSeconds} seconds`);
|
|
44
|
-
}
|
|
45
|
-
// Don't call evaluateFinalResult here, let the caller handle it
|
|
46
|
-
}
|
|
47
|
-
_getNewTapTestResult() {
|
|
48
|
-
this.activeTapTestResult = new TapTestResult(this.testStore.length + 1);
|
|
49
|
-
}
|
|
50
|
-
_processLog(logChunk) {
|
|
51
|
-
if (Buffer.isBuffer(logChunk)) {
|
|
52
|
-
logChunk = logChunk.toString();
|
|
53
|
-
}
|
|
54
|
-
const logLineArray = logChunk.split('\n');
|
|
55
|
-
if (logLineArray[logLineArray.length - 1] === '') {
|
|
56
|
-
logLineArray.pop();
|
|
57
|
-
}
|
|
58
|
-
// lets parse the log information
|
|
59
|
-
for (const logLine of logLineArray) {
|
|
60
|
-
let logLineIsTapProtocol = false;
|
|
61
|
-
if (!this.expectedTests && this.expectedTestsRegex.test(logLine)) {
|
|
62
|
-
logLineIsTapProtocol = true;
|
|
63
|
-
const regexResult = this.expectedTestsRegex.exec(logLine);
|
|
64
|
-
this.expectedTests = parseInt(regexResult[2]);
|
|
65
|
-
if (this.logger) {
|
|
66
|
-
this.logger.tapOutput(`Expecting ${this.expectedTests} tests!`);
|
|
67
|
-
}
|
|
68
|
-
// initiating first TapResult
|
|
69
|
-
this._getNewTapTestResult();
|
|
70
|
-
}
|
|
71
|
-
else if (this.pretaskRegex.test(logLine)) {
|
|
72
|
-
logLineIsTapProtocol = true;
|
|
73
|
-
const pretaskContentMatch = this.pretaskRegex.exec(logLine);
|
|
74
|
-
if (pretaskContentMatch && pretaskContentMatch[1]) {
|
|
75
|
-
if (this.logger) {
|
|
76
|
-
this.logger.tapOutput(`Pretask -> ${pretaskContentMatch[1]}: Success.`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
else if (this.testStatusRegex.test(logLine)) {
|
|
81
|
-
logLineIsTapProtocol = true;
|
|
82
|
-
const regexResult = this.testStatusRegex.exec(logLine);
|
|
83
|
-
// const testId = parseInt(regexResult[2]); // Currently unused
|
|
84
|
-
const testOk = (() => {
|
|
85
|
-
if (regexResult[1] === 'ok') {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
})();
|
|
90
|
-
const testSubject = regexResult[3].trim();
|
|
91
|
-
const testMetadata = regexResult[5]; // This will be either "time=XXXms" or "SKIP reason" or "TODO reason"
|
|
92
|
-
let testDuration = 0;
|
|
93
|
-
if (testMetadata) {
|
|
94
|
-
const timeMatch = testMetadata.match(/time=(\d+)ms/);
|
|
95
|
-
// const skipMatch = testMetadata.match(/SKIP\s*(.*)/); // Currently unused
|
|
96
|
-
// const todoMatch = testMetadata.match(/TODO\s*(.*)/); // Currently unused
|
|
97
|
-
if (timeMatch) {
|
|
98
|
-
testDuration = parseInt(timeMatch[1]);
|
|
99
|
-
}
|
|
100
|
-
// Skip/todo handling could be added here in the future
|
|
101
|
-
}
|
|
102
|
-
// test for protocol error - disabled as it's not critical
|
|
103
|
-
// The test ID mismatch can occur when tests are filtered, skipped, or use todo
|
|
104
|
-
// if (testId !== this.activeTapTestResult.id) {
|
|
105
|
-
// if (this.logger) {
|
|
106
|
-
// this.logger.error('Something is strange! Test Ids are not equal!');
|
|
107
|
-
// }
|
|
108
|
-
// }
|
|
109
|
-
this.activeTapTestResult.setTestResult(testOk);
|
|
110
|
-
if (testOk) {
|
|
111
|
-
if (this.logger) {
|
|
112
|
-
this.logger.testResult(testSubject, true, testDuration);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
// Start collecting error details for failed test
|
|
117
|
-
this.collectingErrorDetails = true;
|
|
118
|
-
this.currentTestError = [];
|
|
119
|
-
if (this.logger) {
|
|
120
|
-
this.logger.testResult(testSubject, false, testDuration);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (!logLineIsTapProtocol) {
|
|
125
|
-
if (this.activeTapTestResult) {
|
|
126
|
-
this.activeTapTestResult.addLogLine(logLine);
|
|
127
|
-
}
|
|
128
|
-
// Check for snapshot communication
|
|
129
|
-
const snapshotMatch = logLine.match(/###SNAPSHOT###(.+)###SNAPSHOT###/);
|
|
130
|
-
if (snapshotMatch) {
|
|
131
|
-
const base64Data = snapshotMatch[1];
|
|
132
|
-
try {
|
|
133
|
-
const snapshotData = JSON.parse(Buffer.from(base64Data, 'base64').toString());
|
|
134
|
-
this.handleSnapshot(snapshotData);
|
|
135
|
-
}
|
|
136
|
-
catch (error) {
|
|
137
|
-
if (this.logger) {
|
|
138
|
-
this.logger.testConsoleOutput(`Error parsing snapshot data: ${error.message}`);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
// Check if we're collecting error details
|
|
144
|
-
if (this.collectingErrorDetails) {
|
|
145
|
-
// Check if this line is an error detail (starts with Error: or has stack trace characteristics)
|
|
146
|
-
if (logLine.trim().startsWith('Error:') || logLine.trim().match(/^\s*at\s/)) {
|
|
147
|
-
this.currentTestError.push(logLine);
|
|
148
|
-
}
|
|
149
|
-
else if (this.currentTestError.length > 0) {
|
|
150
|
-
// End of error details, show the error
|
|
151
|
-
const errorMessage = this.currentTestError.join('\n');
|
|
152
|
-
if (this.logger) {
|
|
153
|
-
this.logger.testErrorDetails(errorMessage);
|
|
154
|
-
}
|
|
155
|
-
this.collectingErrorDetails = false;
|
|
156
|
-
this.currentTestError = [];
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// Don't output TAP error details as console output when we're collecting them
|
|
160
|
-
if (!this.collectingErrorDetails || (!logLine.trim().startsWith('Error:') && !logLine.trim().match(/^\s*at\s/))) {
|
|
161
|
-
if (this.logger) {
|
|
162
|
-
// This is console output from the test file, not TAP protocol
|
|
163
|
-
this.logger.testConsoleOutput(logLine);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
if (this.activeTapTestResult && this.activeTapTestResult.testSettled) {
|
|
169
|
-
// Ensure any pending error is shown before settling the test
|
|
170
|
-
if (this.collectingErrorDetails && this.currentTestError.length > 0) {
|
|
171
|
-
const errorMessage = this.currentTestError.join('\n');
|
|
172
|
-
if (this.logger) {
|
|
173
|
-
this.logger.testErrorDetails(errorMessage);
|
|
174
|
-
}
|
|
175
|
-
this.collectingErrorDetails = false;
|
|
176
|
-
this.currentTestError = [];
|
|
177
|
-
}
|
|
178
|
-
this.testStore.push(this.activeTapTestResult);
|
|
179
|
-
this._getNewTapTestResult();
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* returns all tests that are not completed
|
|
185
|
-
*/
|
|
186
|
-
getUncompletedTests() {
|
|
187
|
-
// TODO:
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* returns all tests that threw an error
|
|
191
|
-
*/
|
|
192
|
-
getErrorTests() {
|
|
193
|
-
return this.testStore.filter((tapTestArg) => {
|
|
194
|
-
return !tapTestArg.testOk;
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* returns a test overview as string
|
|
199
|
-
*/
|
|
200
|
-
getTestOverviewAsString() {
|
|
201
|
-
let overviewString = '';
|
|
202
|
-
for (const test of this.testStore) {
|
|
203
|
-
if (overviewString !== '') {
|
|
204
|
-
overviewString += ' | ';
|
|
205
|
-
}
|
|
206
|
-
if (test.testOk) {
|
|
207
|
-
overviewString += cs(`T${test.id} ${plugins.figures.tick}`, 'green');
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
overviewString += cs(`T${test.id} ${plugins.figures.cross}`, 'red');
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return overviewString;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* handles a tap process
|
|
217
|
-
* @param childProcessArg
|
|
218
|
-
*/
|
|
219
|
-
async handleTapProcess(childProcessArg) {
|
|
220
|
-
const done = plugins.smartpromise.defer();
|
|
221
|
-
childProcessArg.stdout.on('data', (data) => {
|
|
222
|
-
this._processLog(data);
|
|
223
|
-
});
|
|
224
|
-
childProcessArg.stderr.on('data', (data) => {
|
|
225
|
-
this._processLog(data);
|
|
226
|
-
});
|
|
227
|
-
childProcessArg.on('exit', async () => {
|
|
228
|
-
await this.evaluateFinalResult();
|
|
229
|
-
done.resolve();
|
|
230
|
-
});
|
|
231
|
-
await done.promise;
|
|
232
|
-
}
|
|
233
|
-
async handleTapLog(tapLog) {
|
|
234
|
-
this._processLog(tapLog);
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Handle snapshot data from the test
|
|
238
|
-
*/
|
|
239
|
-
async handleSnapshot(snapshotData) {
|
|
240
|
-
try {
|
|
241
|
-
const smartfile = await import('@push.rocks/smartfile');
|
|
242
|
-
if (snapshotData.action === 'compare') {
|
|
243
|
-
// Try to read existing snapshot
|
|
244
|
-
try {
|
|
245
|
-
const existingSnapshot = await smartfile.fs.toStringSync(snapshotData.path);
|
|
246
|
-
if (existingSnapshot !== snapshotData.content) {
|
|
247
|
-
// Snapshot mismatch
|
|
248
|
-
if (this.logger) {
|
|
249
|
-
this.logger.testConsoleOutput(`Snapshot mismatch: ${snapshotData.path}`);
|
|
250
|
-
this.logger.testConsoleOutput(`Expected:\n${existingSnapshot}`);
|
|
251
|
-
this.logger.testConsoleOutput(`Received:\n${snapshotData.content}`);
|
|
252
|
-
}
|
|
253
|
-
// TODO: Communicate failure back to the test
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
if (this.logger) {
|
|
257
|
-
this.logger.testConsoleOutput(`Snapshot matched: ${snapshotData.path}`);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
catch (error) {
|
|
262
|
-
if (error.code === 'ENOENT') {
|
|
263
|
-
// Snapshot doesn't exist, create it
|
|
264
|
-
const dirPath = snapshotData.path.substring(0, snapshotData.path.lastIndexOf('/'));
|
|
265
|
-
await smartfile.fs.ensureDir(dirPath);
|
|
266
|
-
await smartfile.memory.toFs(snapshotData.content, snapshotData.path);
|
|
267
|
-
if (this.logger) {
|
|
268
|
-
this.logger.testConsoleOutput(`Snapshot created: ${snapshotData.path}`);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
throw error;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else if (snapshotData.action === 'update') {
|
|
277
|
-
// Update snapshot
|
|
278
|
-
const dirPath = snapshotData.path.substring(0, snapshotData.path.lastIndexOf('/'));
|
|
279
|
-
await smartfile.fs.ensureDir(dirPath);
|
|
280
|
-
await smartfile.memory.toFs(snapshotData.content, snapshotData.path);
|
|
281
|
-
if (this.logger) {
|
|
282
|
-
this.logger.testConsoleOutput(`Snapshot updated: ${snapshotData.path}`);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
catch (error) {
|
|
287
|
-
if (this.logger) {
|
|
288
|
-
this.logger.testConsoleOutput(`Error handling snapshot: ${error.message}`);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
async evaluateFinalResult() {
|
|
293
|
-
this.receivedTests = this.testStore.length;
|
|
294
|
-
// check wether all tests ran
|
|
295
|
-
if (this.expectedTests === this.receivedTests) {
|
|
296
|
-
if (this.logger) {
|
|
297
|
-
this.logger.tapOutput(`${this.receivedTests} out of ${this.expectedTests} Tests completed!`);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
if (this.logger) {
|
|
302
|
-
this.logger.error(`Only ${this.receivedTests} out of ${this.expectedTests} completed!`);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
if (!this.expectedTests && this.receivedTests === 0) {
|
|
306
|
-
if (this.logger) {
|
|
307
|
-
this.logger.error('No tests were defined. Therefore the testfile failed!');
|
|
308
|
-
this.logger.testFileEnd(0, 1, 0); // Count as 1 failure
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
else if (this.expectedTests !== this.receivedTests) {
|
|
312
|
-
if (this.logger) {
|
|
313
|
-
this.logger.error('The amount of received tests and expectedTests is unequal! Therefore the testfile failed');
|
|
314
|
-
const errorCount = this.getErrorTests().length || 1; // At least 1 error
|
|
315
|
-
this.logger.testFileEnd(this.receivedTests - errorCount, errorCount, 0);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
else if (this.getErrorTests().length === 0) {
|
|
319
|
-
if (this.logger) {
|
|
320
|
-
this.logger.tapOutput('All tests are successfull!!!');
|
|
321
|
-
this.logger.testFileEnd(this.receivedTests, 0, 0);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
if (this.logger) {
|
|
326
|
-
this.logger.tapOutput(`${this.getErrorTests().length} tests threw an error!!!`, true);
|
|
327
|
-
this.logger.testFileEnd(this.receivedTests - this.getErrorTests().length, this.getErrorTests().length, 0);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN0ZXN0LmNsYXNzZXMudGFwLnBhcnNlci5vbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3Rlc3QuY2xhc3Nlcy50YXAucGFyc2VyLm9sZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLElBQUksRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0QsZUFBZTtBQUNmLHlEQUF5RDtBQUN6RCxlQUFlO0FBQ2YsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBR3hFLE1BQU0sT0FBTyxTQUFTO0lBaUJwQjs7T0FFRztJQUNILFlBQW1CLFFBQWdCLEVBQUUsTUFBcUI7UUFBdkMsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQW5CbkMsY0FBUyxHQUFvQixFQUFFLENBQUM7UUFFaEMsdUJBQWtCLEdBQUcsdUJBQXVCLENBQUM7UUFJN0Msb0JBQWUsR0FBRywrQ0FBK0MsQ0FBQztRQUVsRSwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMscUJBQWdCLEdBQWEsRUFBRSxDQUFDO1FBRWhDLGlCQUFZLEdBQUcsb0JBQW9CLENBQUM7UUFTbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxjQUFzQjtRQUN6Qyx1REFBdUQ7UUFDdkQsSUFBSSxJQUFJLENBQUMsYUFB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
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Internal protocol constants and utilities for improved TAP communication
|
|
3
|
-
* between tapbundle and tstest
|
|
4
|
-
*/
|
|
5
|
-
export declare const PROTOCOL: {
|
|
6
|
-
readonly VERSION: "2.0";
|
|
7
|
-
readonly MARKERS: {
|
|
8
|
-
readonly START: "⟦TSTEST:";
|
|
9
|
-
readonly END: "⟧";
|
|
10
|
-
readonly BLOCK_END: "⟦/TSTEST:";
|
|
11
|
-
};
|
|
12
|
-
readonly TYPES: {
|
|
13
|
-
readonly META: "META";
|
|
14
|
-
readonly ERROR: "ERROR";
|
|
15
|
-
readonly SKIP: "SKIP";
|
|
16
|
-
readonly TODO: "TODO";
|
|
17
|
-
readonly SNAPSHOT: "SNAPSHOT";
|
|
18
|
-
readonly PROTOCOL: "PROTOCOL";
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
export interface TestMetadata {
|
|
22
|
-
time?: number;
|
|
23
|
-
startTime?: number;
|
|
24
|
-
endTime?: number;
|
|
25
|
-
skip?: string;
|
|
26
|
-
todo?: string;
|
|
27
|
-
retry?: number;
|
|
28
|
-
maxRetries?: number;
|
|
29
|
-
error?: {
|
|
30
|
-
message: string;
|
|
31
|
-
stack?: string;
|
|
32
|
-
diff?: string;
|
|
33
|
-
actual?: any;
|
|
34
|
-
expected?: any;
|
|
35
|
-
};
|
|
36
|
-
file?: string;
|
|
37
|
-
line?: number;
|
|
38
|
-
column?: number;
|
|
39
|
-
tags?: string[];
|
|
40
|
-
custom?: Record<string, any>;
|
|
41
|
-
}
|
|
42
|
-
export declare class ProtocolEncoder {
|
|
43
|
-
/**
|
|
44
|
-
* Encode metadata for inline inclusion
|
|
45
|
-
*/
|
|
46
|
-
static encodeInline(type: string, data: any): string;
|
|
47
|
-
/**
|
|
48
|
-
* Encode block data for multi-line content
|
|
49
|
-
*/
|
|
50
|
-
static encodeBlock(type: string, data: any): string[];
|
|
51
|
-
/**
|
|
52
|
-
* Create a TAP line with metadata
|
|
53
|
-
*/
|
|
54
|
-
static createTestLine(status: 'ok' | 'not ok', number: number, description: string, metadata?: TestMetadata): string;
|
|
55
|
-
}
|
|
56
|
-
export declare class ProtocolDecoder {
|
|
57
|
-
/**
|
|
58
|
-
* Extract all protocol markers from a line
|
|
59
|
-
*/
|
|
60
|
-
static extractMarkers(line: string): Array<{
|
|
61
|
-
type: string;
|
|
62
|
-
data: any;
|
|
63
|
-
start: number;
|
|
64
|
-
end: number;
|
|
65
|
-
}>;
|
|
66
|
-
/**
|
|
67
|
-
* Remove protocol markers from a line
|
|
68
|
-
*/
|
|
69
|
-
static cleanLine(line: string): string;
|
|
70
|
-
/**
|
|
71
|
-
* Parse a test line and extract metadata
|
|
72
|
-
*/
|
|
73
|
-
static parseTestLine(line: string): {
|
|
74
|
-
cleaned: string;
|
|
75
|
-
metadata: TestMetadata;
|
|
76
|
-
};
|
|
77
|
-
/**
|
|
78
|
-
* Check if a line starts a protocol block
|
|
79
|
-
*/
|
|
80
|
-
static isBlockStart(line: string): {
|
|
81
|
-
isBlock: boolean;
|
|
82
|
-
type?: string;
|
|
83
|
-
};
|
|
84
|
-
/**
|
|
85
|
-
* Check if a line ends a protocol block
|
|
86
|
-
*/
|
|
87
|
-
static isBlockEnd(line: string, type: string): boolean;
|
|
88
|
-
}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Internal protocol constants and utilities for improved TAP communication
|
|
3
|
-
* between tapbundle and tstest
|
|
4
|
-
*/
|
|
5
|
-
export const PROTOCOL = {
|
|
6
|
-
VERSION: '2.0',
|
|
7
|
-
MARKERS: {
|
|
8
|
-
START: '⟦TSTEST:',
|
|
9
|
-
END: '⟧',
|
|
10
|
-
BLOCK_END: '⟦/TSTEST:',
|
|
11
|
-
},
|
|
12
|
-
TYPES: {
|
|
13
|
-
META: 'META',
|
|
14
|
-
ERROR: 'ERROR',
|
|
15
|
-
SKIP: 'SKIP',
|
|
16
|
-
TODO: 'TODO',
|
|
17
|
-
SNAPSHOT: 'SNAPSHOT',
|
|
18
|
-
PROTOCOL: 'PROTOCOL',
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
export class ProtocolEncoder {
|
|
22
|
-
/**
|
|
23
|
-
* Encode metadata for inline inclusion
|
|
24
|
-
*/
|
|
25
|
-
static encodeInline(type, data) {
|
|
26
|
-
if (typeof data === 'string') {
|
|
27
|
-
return `${PROTOCOL.MARKERS.START}${type}:${data}${PROTOCOL.MARKERS.END}`;
|
|
28
|
-
}
|
|
29
|
-
return `${PROTOCOL.MARKERS.START}${type}:${JSON.stringify(data)}${PROTOCOL.MARKERS.END}`;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Encode block data for multi-line content
|
|
33
|
-
*/
|
|
34
|
-
static encodeBlock(type, data) {
|
|
35
|
-
const lines = [];
|
|
36
|
-
lines.push(`${PROTOCOL.MARKERS.START}${type}${PROTOCOL.MARKERS.END}`);
|
|
37
|
-
if (typeof data === 'string') {
|
|
38
|
-
lines.push(data);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
lines.push(JSON.stringify(data, null, 2));
|
|
42
|
-
}
|
|
43
|
-
lines.push(`${PROTOCOL.MARKERS.BLOCK_END}${type}${PROTOCOL.MARKERS.END}`);
|
|
44
|
-
return lines;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Create a TAP line with metadata
|
|
48
|
-
*/
|
|
49
|
-
static createTestLine(status, number, description, metadata) {
|
|
50
|
-
let line = `${status} ${number} - ${description}`;
|
|
51
|
-
if (metadata) {
|
|
52
|
-
// For skip/todo, use inline format for compatibility
|
|
53
|
-
if (metadata.skip) {
|
|
54
|
-
line += ` ${this.encodeInline(PROTOCOL.TYPES.SKIP, metadata.skip)}`;
|
|
55
|
-
}
|
|
56
|
-
else if (metadata.todo) {
|
|
57
|
-
line += ` ${this.encodeInline(PROTOCOL.TYPES.TODO, metadata.todo)}`;
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
// For other metadata, append inline
|
|
61
|
-
const metaCopy = { ...metadata };
|
|
62
|
-
delete metaCopy.error; // Error details go in separate block
|
|
63
|
-
if (Object.keys(metaCopy).length > 0) {
|
|
64
|
-
line += ` ${this.encodeInline(PROTOCOL.TYPES.META, metaCopy)}`;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return line;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
export class ProtocolDecoder {
|
|
72
|
-
/**
|
|
73
|
-
* Extract all protocol markers from a line
|
|
74
|
-
*/
|
|
75
|
-
static extractMarkers(line) {
|
|
76
|
-
const markers = [];
|
|
77
|
-
let searchFrom = 0;
|
|
78
|
-
while (true) {
|
|
79
|
-
const start = line.indexOf(PROTOCOL.MARKERS.START, searchFrom);
|
|
80
|
-
if (start === -1)
|
|
81
|
-
break;
|
|
82
|
-
const end = line.indexOf(PROTOCOL.MARKERS.END, start);
|
|
83
|
-
if (end === -1)
|
|
84
|
-
break;
|
|
85
|
-
const content = line.substring(start + PROTOCOL.MARKERS.START.length, end);
|
|
86
|
-
const colonIndex = content.indexOf(':');
|
|
87
|
-
if (colonIndex !== -1) {
|
|
88
|
-
const type = content.substring(0, colonIndex);
|
|
89
|
-
const dataStr = content.substring(colonIndex + 1);
|
|
90
|
-
let data;
|
|
91
|
-
try {
|
|
92
|
-
// Try to parse as JSON first
|
|
93
|
-
data = JSON.parse(dataStr);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
// If not JSON, treat as string
|
|
97
|
-
data = dataStr;
|
|
98
|
-
}
|
|
99
|
-
markers.push({
|
|
100
|
-
type,
|
|
101
|
-
data,
|
|
102
|
-
start,
|
|
103
|
-
end: end + PROTOCOL.MARKERS.END.length
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
searchFrom = end + 1;
|
|
107
|
-
}
|
|
108
|
-
return markers;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Remove protocol markers from a line
|
|
112
|
-
*/
|
|
113
|
-
static cleanLine(line) {
|
|
114
|
-
const markers = this.extractMarkers(line);
|
|
115
|
-
// Remove markers from end to start to preserve indices
|
|
116
|
-
let cleanedLine = line;
|
|
117
|
-
for (let i = markers.length - 1; i >= 0; i--) {
|
|
118
|
-
const marker = markers[i];
|
|
119
|
-
cleanedLine = cleanedLine.substring(0, marker.start) +
|
|
120
|
-
cleanedLine.substring(marker.end);
|
|
121
|
-
}
|
|
122
|
-
return cleanedLine.trim();
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Parse a test line and extract metadata
|
|
126
|
-
*/
|
|
127
|
-
static parseTestLine(line) {
|
|
128
|
-
const markers = this.extractMarkers(line);
|
|
129
|
-
const metadata = {};
|
|
130
|
-
for (const marker of markers) {
|
|
131
|
-
switch (marker.type) {
|
|
132
|
-
case PROTOCOL.TYPES.META:
|
|
133
|
-
Object.assign(metadata, marker.data);
|
|
134
|
-
break;
|
|
135
|
-
case PROTOCOL.TYPES.SKIP:
|
|
136
|
-
metadata.skip = marker.data;
|
|
137
|
-
break;
|
|
138
|
-
case PROTOCOL.TYPES.TODO:
|
|
139
|
-
metadata.todo = marker.data;
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return {
|
|
144
|
-
cleaned: this.cleanLine(line),
|
|
145
|
-
metadata
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Check if a line starts a protocol block
|
|
150
|
-
*/
|
|
151
|
-
static isBlockStart(line) {
|
|
152
|
-
const trimmed = line.trim();
|
|
153
|
-
if (trimmed.startsWith(PROTOCOL.MARKERS.START) && trimmed.endsWith(PROTOCOL.MARKERS.END)) {
|
|
154
|
-
const content = trimmed.slice(PROTOCOL.MARKERS.START.length, -PROTOCOL.MARKERS.END.length);
|
|
155
|
-
if (!content.includes(':')) {
|
|
156
|
-
return { isBlock: true, type: content };
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return { isBlock: false };
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Check if a line ends a protocol block
|
|
163
|
-
*/
|
|
164
|
-
static isBlockEnd(line, type) {
|
|
165
|
-
return line.trim() === `${PROTOCOL.MARKERS.BLOCK_END}${type}${PROTOCOL.MARKERS.END}`;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLnByb3RvY29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUucHJvdG9jb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixPQUFPLEVBQUUsS0FBSztJQUNkLE9BQU8sRUFBRTtRQUNQLEtBQUssRUFBRSxVQUFVO1FBQ2pCLEdBQUcsRUFBRSxHQUFHO1FBQ1IsU0FBUyxFQUFFLFdBQVc7S0FDdkI7SUFDRCxLQUFLLEVBQUU7UUFDTCxJQUFJLEVBQUUsTUFBTTtRQUNaLEtBQUssRUFBRSxPQUFPO1FBQ2QsSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUUsTUFBTTtRQUNaLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLFFBQVEsRUFBRSxVQUFVO0tBQ3JCO0NBQ08sQ0FBQztBQWlDWCxNQUFNLE9BQU8sZUFBZTtJQUMxQjs7T0FFRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBWSxFQUFFLElBQVM7UUFDekMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNFLENBQUM7UUFDRCxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMzRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQVksRUFBRSxJQUFTO1FBQ3hDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixLQUFLLENBQUMsSUFBSSxD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
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* autocreated commitinfo by @push.rocks/commitinfo
|
|
3
|
-
*/
|
|
4
|
-
export const commitinfo = {
|
|
5
|
-
name: '@push.rocks/tapbundle',
|
|
6
|
-
version: '6.0.3',
|
|
7
|
-
description: 'A comprehensive testing automation library that provides a wide range of utilities and tools for TAP (Test Anything Protocol) based testing, especially suitable for projects using tapbuffer.'
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfdGFwYnVuZGxlLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsdUJBQXVCO0lBQzdCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxnTUFBZ007Q0FDOU0sQ0FBQSJ9
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { tap } from './tapbundle.classes.tap.js';
|
|
2
|
-
export { TapWrap } from './tapbundle.classes.tapwrap.js';
|
|
3
|
-
export { webhelpers } from './webhelpers.js';
|
|
4
|
-
export { TapTools } from './tapbundle.classes.taptools.js';
|
|
5
|
-
import { expect } from '@push.rocks/smartexpect';
|
|
6
|
-
export { expect };
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { tap } from './tapbundle.classes.tap.js';
|
|
2
|
-
export { TapWrap } from './tapbundle.classes.tapwrap.js';
|
|
3
|
-
export { webhelpers } from './webhelpers.js';
|
|
4
|
-
export { TapTools } from './tapbundle.classes.taptools.js';
|
|
5
|
-
import { expect } from '@push.rocks/smartexpect';
|
|
6
|
-
export { expect };
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c190YXBidW5kbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMifQ==
|