@git.zone/tstest 3.1.1 → 3.1.4
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_tapbundle/webhelpers.js +12 -2
- package/npmextra.json +11 -5
- package/package.json +13 -12
- package/readme.md +19 -0
- package/ts/00_commitinfo_data.ts +1 -1
- 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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tstest',
|
|
6
|
-
version: '3.1.
|
|
6
|
+
version: '3.1.4',
|
|
7
7
|
description: 'a test utility to run tests that match test/**/*.ts'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHFEQUFxRDtDQUNuRSxDQUFBIn0=
|
|
@@ -19,7 +19,17 @@ class WebHelpers {
|
|
|
19
19
|
this.fixture = async (htmlString) => {
|
|
20
20
|
const container = document.createElement('div');
|
|
21
21
|
container.innerHTML = htmlString.trim();
|
|
22
|
-
const element = container.
|
|
22
|
+
const element = container.firstElementChild;
|
|
23
|
+
// Append to document so custom elements upgrade and lifecycle hooks fire
|
|
24
|
+
document.body.appendChild(element);
|
|
25
|
+
// Wait for custom element definition if it's a custom element
|
|
26
|
+
if (element.localName.includes('-')) {
|
|
27
|
+
await customElements.whenDefined(element.localName).catch(() => { });
|
|
28
|
+
}
|
|
29
|
+
// Wait for Lit/async components to finish rendering
|
|
30
|
+
if (element.updateComplete) {
|
|
31
|
+
await element.updateComplete;
|
|
32
|
+
}
|
|
23
33
|
return element;
|
|
24
34
|
};
|
|
25
35
|
}
|
|
@@ -32,4 +42,4 @@ class WebHelpers {
|
|
|
32
42
|
}
|
|
33
43
|
}
|
|
34
44
|
export const webhelpers = new WebHelpers();
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS93ZWJoZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWpELE1BQU0sVUFBVTtJQUlkO1FBQ0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpELHdDQUF3QztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBNkIsRUFBRSxHQUFHLE1BQWEsRUFBRSxFQUFFO1lBQzlELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDO1FBRUYsbURBQW1EO1FBQ25ELElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxFQUF5QixVQUFrQixFQUFjLEVBQUU7Z0JBQzdFLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsaUJBQXNCLENBQUM7Z0JBRWpELHlFQUF5RTtnQkFDekUsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRW5DLDhEQUE4RDtnQkFDOUQsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNwQyxNQUFNLGNBQWMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEUsQ0FBQztnQkFFRCxvREFBb0Q7Z0JBQ3BELElBQUssT0FBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNwQyxNQUFPLE9BQWUsQ0FBQyxjQUFjLENBQUM7Z0JBQ3hDLENBQUM7Z0JBRUQsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQyxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixxRUFBcUU7WUFDckUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsVUFBa0IsRUFBZ0IsRUFBRTtnQkFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1lBQ2pGLENBQUMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQyJ9
|
package/npmextra.json
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"npmGlobalTools": [],
|
|
4
|
-
"npmAccessLevel": "public"
|
|
5
|
-
},
|
|
6
|
-
"gitzone": {
|
|
2
|
+
"@git.zone/cli": {
|
|
7
3
|
"projectType": "npm",
|
|
8
4
|
"module": {
|
|
9
5
|
"githost": "code.foss.global",
|
|
@@ -12,6 +8,16 @@
|
|
|
12
8
|
"description": "a test utility to run tests that match test/**/*.ts",
|
|
13
9
|
"npmPackagename": "@git.zone/tstest",
|
|
14
10
|
"license": "MIT"
|
|
11
|
+
},
|
|
12
|
+
"release": {
|
|
13
|
+
"registries": [
|
|
14
|
+
"https://verdaccio.lossless.digital",
|
|
15
|
+
"https://registry.npmjs.org"
|
|
16
|
+
],
|
|
17
|
+
"accessLevel": "public"
|
|
15
18
|
}
|
|
19
|
+
},
|
|
20
|
+
"@ship.zone/szci": {
|
|
21
|
+
"npmGlobalTools": []
|
|
16
22
|
}
|
|
17
23
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tstest",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "a test utility to run tests that match test/**/*.ts",
|
|
6
6
|
"exports": {
|
|
@@ -10,11 +10,20 @@
|
|
|
10
10
|
"./tapbundle_protocol": "./dist_ts_tapbundle_protocol/index.js"
|
|
11
11
|
},
|
|
12
12
|
"type": "module",
|
|
13
|
-
"author": "
|
|
13
|
+
"author": "Task Venture Capital GmbH",
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"bin": {
|
|
16
16
|
"tstest": "./cli.js"
|
|
17
17
|
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"test": "pnpm run build && pnpm run test:tapbundle:verbose && pnpm run test:tstest:verbose",
|
|
20
|
+
"test:tapbundle": "tsx ./cli.child.ts \"test/tapbundle/**/*.ts\"",
|
|
21
|
+
"test:tapbundle:verbose": "tsx ./cli.child.ts \"test/tapbundle/**/*.ts\" --verbose",
|
|
22
|
+
"test:tstest": "tsx ./cli.child.ts \"test/tstest/**/*.ts\"",
|
|
23
|
+
"test:tstest:verbose": "tsx ./cli.child.ts \"test/tstest/**/*.ts\" --verbose",
|
|
24
|
+
"build": "(tsbuild tsfolders)",
|
|
25
|
+
"buildDocs": "tsdoc"
|
|
26
|
+
},
|
|
18
27
|
"devDependencies": {
|
|
19
28
|
"@git.zone/tsbuild": "^3.1.0",
|
|
20
29
|
"@types/node": "^22.15.21"
|
|
@@ -61,13 +70,5 @@
|
|
|
61
70
|
"browserslist": [
|
|
62
71
|
"last 1 chrome versions"
|
|
63
72
|
],
|
|
64
|
-
"
|
|
65
|
-
|
|
66
|
-
"test:tapbundle": "tsx ./cli.child.ts \"test/tapbundle/**/*.ts\"",
|
|
67
|
-
"test:tapbundle:verbose": "tsx ./cli.child.ts \"test/tapbundle/**/*.ts\" --verbose",
|
|
68
|
-
"test:tstest": "tsx ./cli.child.ts \"test/tstest/**/*.ts\"",
|
|
69
|
-
"test:tstest:verbose": "tsx ./cli.child.ts \"test/tstest/**/*.ts\" --verbose",
|
|
70
|
-
"build": "(tsbuild tsfolders)",
|
|
71
|
-
"buildDocs": "tsdoc"
|
|
72
|
-
}
|
|
73
|
-
}
|
|
73
|
+
"packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
|
|
74
|
+
}
|
package/readme.md
CHANGED
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
* [npmjs.org (npm package)](https://www.npmjs.com/package/@git.zone/tstest)
|
|
6
6
|
* [code.foss.global (source)](https://code.foss.global/git.zone/tstest)
|
|
7
7
|
|
|
8
|
+
## Issue Reporting and Security
|
|
9
|
+
|
|
10
|
+
For reporting bugs, issues, or security vulnerabilities, please visit https://community.foss.global/. This is the central community hub for all issue reporting. Developers who want to sign a contribution agreement and go through identification can also get a code.foss.global account to submit Pull Requests directly.
|
|
11
|
+
|
|
8
12
|
## Why tstest?
|
|
9
13
|
|
|
10
14
|
**tstest** is a TypeScript test runner that makes testing delightful. It's designed for modern development workflows with beautiful output, flexible test execution, and powerful features that make debugging a breeze.
|
|
@@ -1074,6 +1078,21 @@ tstest test/api/endpoints.test.ts --verbose --timeout 60
|
|
|
1074
1078
|
|
|
1075
1079
|
## Changelog
|
|
1076
1080
|
|
|
1081
|
+
### Version 3.1.1
|
|
1082
|
+
- 🐛 Fixed TapTools parameter passing to suite lifecycle hooks (beforeAll/afterAll)
|
|
1083
|
+
- 📦 Updated @push.rocks/smarts3 dependency to ^3.0.0
|
|
1084
|
+
|
|
1085
|
+
### Version 3.1.0
|
|
1086
|
+
- 🎯 **postTask() API** - Global teardown method for cleanup after all tests
|
|
1087
|
+
- 🏗️ **Suite beforeAll/afterAll** - Lifecycle hooks that run once per describe block
|
|
1088
|
+
- ⚡ **parallel() Fluent API** - New fluent entry point for parallel tests
|
|
1089
|
+
- 📚 Enhanced tapbundle documentation with complete API reference
|
|
1090
|
+
|
|
1091
|
+
### Version 3.0.0
|
|
1092
|
+
- 🔥 **BREAKING:** Renamed tapbundle_node to tapbundle_serverside for clarity
|
|
1093
|
+
- 🔧 Migrated all server-side utilities to tapbundle_serverside
|
|
1094
|
+
- 📦 Improved module separation and organization
|
|
1095
|
+
|
|
1077
1096
|
### Version 2.4.0
|
|
1078
1097
|
- 🚀 **Multi-Runtime Architecture** - Support for Deno, Bun, Node.js, and Chromium
|
|
1079
1098
|
- 🔀 **New Naming Convention** - Flexible `.runtime1+runtime2.ts` pattern
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { ChildProcess } from 'child_process';
|
|
2
|
-
import { TapTestResult } from './tstest.classes.tap.testresult.js';
|
|
3
|
-
import { TsTestLogger } from './tstest.logging.js';
|
|
4
|
-
export declare class TapParser {
|
|
5
|
-
fileName: string;
|
|
6
|
-
testStore: TapTestResult[];
|
|
7
|
-
expectedTestsRegex: RegExp;
|
|
8
|
-
expectedTests: number;
|
|
9
|
-
receivedTests: number;
|
|
10
|
-
testStatusRegex: RegExp;
|
|
11
|
-
activeTapTestResult: TapTestResult;
|
|
12
|
-
collectingErrorDetails: boolean;
|
|
13
|
-
currentTestError: string[];
|
|
14
|
-
pretaskRegex: RegExp;
|
|
15
|
-
private logger;
|
|
16
|
-
private protocolParser;
|
|
17
|
-
/**
|
|
18
|
-
* the constructor for TapParser
|
|
19
|
-
*/
|
|
20
|
-
constructor(fileName: string, logger?: TsTestLogger);
|
|
21
|
-
/**
|
|
22
|
-
* Handle test file timeout
|
|
23
|
-
*/
|
|
24
|
-
handleTimeout(timeoutSeconds: number): void;
|
|
25
|
-
private _getNewTapTestResult;
|
|
26
|
-
private _processLog;
|
|
27
|
-
/**
|
|
28
|
-
* returns all tests that are not completed
|
|
29
|
-
*/
|
|
30
|
-
getUncompletedTests(): void;
|
|
31
|
-
/**
|
|
32
|
-
* returns all tests that threw an error
|
|
33
|
-
*/
|
|
34
|
-
getErrorTests(): TapTestResult[];
|
|
35
|
-
/**
|
|
36
|
-
* returns a test overview as string
|
|
37
|
-
*/
|
|
38
|
-
getTestOverviewAsString(): string;
|
|
39
|
-
/**
|
|
40
|
-
* handles a tap process
|
|
41
|
-
* @param childProcessArg
|
|
42
|
-
*/
|
|
43
|
-
handleTapProcess(childProcessArg: ChildProcess): Promise<void>;
|
|
44
|
-
handleTapLog(tapLog: string): Promise<void>;
|
|
45
|
-
/**
|
|
46
|
-
* Handle snapshot data from the test
|
|
47
|
-
*/
|
|
48
|
-
private handleSnapshot;
|
|
49
|
-
evaluateFinalResult(): Promise<void>;
|
|
50
|
-
}
|
|
@@ -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
|
-
}
|