@git.zone/tstest 1.5.0 → 1.8.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 +1 -1
- package/dist_ts/index.js +9 -2
- package/dist_ts/tstest.classes.tap.parser.d.ts +4 -0
- package/dist_ts/tstest.classes.tap.parser.js +114 -24
- package/dist_ts/tstest.classes.testdirectory.d.ts +10 -0
- package/dist_ts/tstest.classes.testdirectory.js +31 -1
- package/dist_ts/tstest.classes.tstest.d.ts +3 -1
- package/dist_ts/tstest.classes.tstest.js +52 -27
- package/dist_ts_tapbundle/index.d.ts +1 -0
- package/dist_ts_tapbundle/index.js +2 -1
- package/dist_ts_tapbundle/tapbundle.classes.tap.d.ts +54 -1
- package/dist_ts_tapbundle/tapbundle.classes.tap.js +288 -24
- package/dist_ts_tapbundle/tapbundle.classes.taptest.d.ts +7 -1
- package/dist_ts_tapbundle/tapbundle.classes.taptest.js +75 -27
- package/dist_ts_tapbundle/tapbundle.classes.taptools.d.ts +81 -1
- package/dist_ts_tapbundle/tapbundle.classes.taptools.js +180 -2
- package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.js +9 -0
- package/dist_ts_tapbundle/ts_tapbundle/index.d.ts +6 -0
- package/dist_ts_tapbundle/ts_tapbundle/index.js +7 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.d.ts +10 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.js +13 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.d.ts +104 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.js +401 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.js +110 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.d.ts +109 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.js +241 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.d.ts +8 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.js +7 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.d.ts +8 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.js +10 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.js +5 -0
- package/dist_ts_tapbundle/ts_tapbundle/webhelpers.d.ts +7 -0
- package/dist_ts_tapbundle/ts_tapbundle/webhelpers.js +35 -0
- package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.d.ts +5 -0
- package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.js +13 -0
- package/dist_ts_tapbundle/ts_tapbundle_node/plugins.d.ts +11 -0
- package/dist_ts_tapbundle/ts_tapbundle_node/plugins.js +14 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptest.js +110 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptools.d.ts +109 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptools.js +241 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.plugins.d.ts +8 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.plugins.js +10 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.tapcreator.js +5 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.pathinject.d.ts +5 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.pathinject.js +13 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.tapnodetools.d.ts +25 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.tapnodetools.js +81 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.testfileprovider.d.ts +6 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.testfileprovider.js +16 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/index.d.ts +2 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/index.js +3 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/paths.d.ts +2 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/paths.js +4 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/plugins.d.ts +11 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/plugins.js +14 -0
- package/package.json +11 -8
- package/readme.md +141 -0
- package/readme.plan.md +253 -30
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +8 -1
- package/ts/tstest.classes.tap.parser.ts +111 -25
- package/ts/tstest.classes.testdirectory.ts +39 -0
- package/ts/tstest.classes.tstest.ts +61 -27
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
import { type IPreTaskFunction } from './tapbundle.classes.pretask.js';
|
|
2
2
|
import { TapTest, type ITestFunction } from './tapbundle.classes.taptest.js';
|
|
3
|
+
export interface ITestSuite {
|
|
4
|
+
description: string;
|
|
5
|
+
tests: TapTest<any>[];
|
|
6
|
+
beforeEach?: ITestFunction<any>;
|
|
7
|
+
afterEach?: ITestFunction<any>;
|
|
8
|
+
parent?: ITestSuite;
|
|
9
|
+
children: ITestSuite[];
|
|
10
|
+
}
|
|
11
|
+
declare class TestBuilder<T> {
|
|
12
|
+
private _tap;
|
|
13
|
+
private _tags;
|
|
14
|
+
private _priority;
|
|
15
|
+
private _retryCount?;
|
|
16
|
+
private _timeoutMs?;
|
|
17
|
+
constructor(tap: Tap<T>);
|
|
18
|
+
tags(...tags: string[]): this;
|
|
19
|
+
priority(level: 'high' | 'medium' | 'low'): this;
|
|
20
|
+
retry(count: number): this;
|
|
21
|
+
timeout(ms: number): this;
|
|
22
|
+
test(description: string, testFunction: ITestFunction<T>): TapTest<T>;
|
|
23
|
+
testOnly(description: string, testFunction: ITestFunction<T>): TapTest<T>;
|
|
24
|
+
testSkip(description: string, testFunction: ITestFunction<T>): TapTest<T>;
|
|
25
|
+
}
|
|
3
26
|
export declare class Tap<T> {
|
|
27
|
+
private _skipCount;
|
|
28
|
+
private _filterTags;
|
|
29
|
+
constructor();
|
|
30
|
+
tags(...tags: string[]): TestBuilder<T>;
|
|
31
|
+
priority(level: 'high' | 'medium' | 'low'): TestBuilder<T>;
|
|
32
|
+
retry(count: number): TestBuilder<T>;
|
|
33
|
+
timeout(ms: number): TestBuilder<T>;
|
|
4
34
|
/**
|
|
5
35
|
* skips a test
|
|
6
36
|
* tests marked with tap.skip.test() are never executed
|
|
@@ -18,6 +48,8 @@ export declare class Tap<T> {
|
|
|
18
48
|
private _tapPreTasks;
|
|
19
49
|
private _tapTests;
|
|
20
50
|
private _tapTestsOnly;
|
|
51
|
+
private _currentSuite;
|
|
52
|
+
private _rootSuites;
|
|
21
53
|
/**
|
|
22
54
|
* Normal test function, will run one by one
|
|
23
55
|
* @param testDescription - A description of what the test does
|
|
@@ -31,12 +63,32 @@ export declare class Tap<T> {
|
|
|
31
63
|
* @param testFunction - A Function that returns a Promise and resolves or rejects
|
|
32
64
|
*/
|
|
33
65
|
testParallel(testDescription: string, testFunction: ITestFunction<T>): void;
|
|
66
|
+
/**
|
|
67
|
+
* Create a test suite for grouping related tests
|
|
68
|
+
*/
|
|
69
|
+
describe(description: string, suiteFunction: () => void): void;
|
|
70
|
+
/**
|
|
71
|
+
* Set up a function to run before each test in the current suite
|
|
72
|
+
*/
|
|
73
|
+
beforeEach(setupFunction: ITestFunction<any>): void;
|
|
74
|
+
/**
|
|
75
|
+
* Set up a function to run after each test in the current suite
|
|
76
|
+
*/
|
|
77
|
+
afterEach(teardownFunction: ITestFunction<any>): void;
|
|
78
|
+
/**
|
|
79
|
+
* collect all tests from suites
|
|
80
|
+
*/
|
|
81
|
+
private _collectTests;
|
|
34
82
|
/**
|
|
35
83
|
* starts the test evaluation
|
|
36
84
|
*/
|
|
37
85
|
start(optionsArg?: {
|
|
38
86
|
throwOnError: boolean;
|
|
39
87
|
}): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Run tests in a suite with lifecycle hooks
|
|
90
|
+
*/
|
|
91
|
+
private _runSuite;
|
|
40
92
|
stopForcefully(codeArg?: number, directArg?: boolean): Promise<void>;
|
|
41
93
|
/**
|
|
42
94
|
* handle errors
|
|
@@ -48,4 +100,5 @@ export declare class Tap<T> {
|
|
|
48
100
|
*/
|
|
49
101
|
fail(message?: string): never;
|
|
50
102
|
}
|
|
51
|
-
export declare
|
|
103
|
+
export declare const tap: Tap<unknown>;
|
|
104
|
+
export {};
|
|
@@ -1,8 +1,78 @@
|
|
|
1
1
|
import * as plugins from './tapbundle.plugins.js';
|
|
2
2
|
import { PreTask } from './tapbundle.classes.pretask.js';
|
|
3
3
|
import { TapTest } from './tapbundle.classes.taptest.js';
|
|
4
|
+
class TestBuilder {
|
|
5
|
+
constructor(tap) {
|
|
6
|
+
this._tags = [];
|
|
7
|
+
this._priority = 'medium';
|
|
8
|
+
this._tap = tap;
|
|
9
|
+
}
|
|
10
|
+
tags(...tags) {
|
|
11
|
+
this._tags = tags;
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
priority(level) {
|
|
15
|
+
this._priority = level;
|
|
16
|
+
return this;
|
|
17
|
+
}
|
|
18
|
+
retry(count) {
|
|
19
|
+
this._retryCount = count;
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
timeout(ms) {
|
|
23
|
+
this._timeoutMs = ms;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
test(description, testFunction) {
|
|
27
|
+
const test = this._tap.test(description, testFunction, 'normal');
|
|
28
|
+
// Apply settings to the test
|
|
29
|
+
if (this._tags.length > 0) {
|
|
30
|
+
test.tags = this._tags;
|
|
31
|
+
}
|
|
32
|
+
test.priority = this._priority;
|
|
33
|
+
if (this._retryCount !== undefined) {
|
|
34
|
+
test.tapTools.retry(this._retryCount);
|
|
35
|
+
}
|
|
36
|
+
if (this._timeoutMs !== undefined) {
|
|
37
|
+
test.timeoutMs = this._timeoutMs;
|
|
38
|
+
}
|
|
39
|
+
return test;
|
|
40
|
+
}
|
|
41
|
+
testOnly(description, testFunction) {
|
|
42
|
+
const test = this._tap.test(description, testFunction, 'only');
|
|
43
|
+
// Apply settings to the test
|
|
44
|
+
if (this._tags.length > 0) {
|
|
45
|
+
test.tags = this._tags;
|
|
46
|
+
}
|
|
47
|
+
test.priority = this._priority;
|
|
48
|
+
if (this._retryCount !== undefined) {
|
|
49
|
+
test.tapTools.retry(this._retryCount);
|
|
50
|
+
}
|
|
51
|
+
if (this._timeoutMs !== undefined) {
|
|
52
|
+
test.timeoutMs = this._timeoutMs;
|
|
53
|
+
}
|
|
54
|
+
return test;
|
|
55
|
+
}
|
|
56
|
+
testSkip(description, testFunction) {
|
|
57
|
+
const test = this._tap.test(description, testFunction, 'skip');
|
|
58
|
+
// Apply settings to the test
|
|
59
|
+
if (this._tags.length > 0) {
|
|
60
|
+
test.tags = this._tags;
|
|
61
|
+
}
|
|
62
|
+
test.priority = this._priority;
|
|
63
|
+
if (this._retryCount !== undefined) {
|
|
64
|
+
test.tapTools.retry(this._retryCount);
|
|
65
|
+
}
|
|
66
|
+
if (this._timeoutMs !== undefined) {
|
|
67
|
+
test.timeoutMs = this._timeoutMs;
|
|
68
|
+
}
|
|
69
|
+
return test;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
4
72
|
export class Tap {
|
|
5
73
|
constructor() {
|
|
74
|
+
this._skipCount = 0;
|
|
75
|
+
this._filterTags = [];
|
|
6
76
|
/**
|
|
7
77
|
* skips a test
|
|
8
78
|
* tests marked with tap.skip.test() are never executed
|
|
@@ -10,9 +80,11 @@ export class Tap {
|
|
|
10
80
|
this.skip = {
|
|
11
81
|
test: (descriptionArg, functionArg) => {
|
|
12
82
|
console.log(`skipped test: ${descriptionArg}`);
|
|
83
|
+
this._skipCount++;
|
|
13
84
|
},
|
|
14
85
|
testParallel: (descriptionArg, functionArg) => {
|
|
15
86
|
console.log(`skipped test: ${descriptionArg}`);
|
|
87
|
+
this._skipCount++;
|
|
16
88
|
},
|
|
17
89
|
};
|
|
18
90
|
/**
|
|
@@ -26,6 +98,29 @@ export class Tap {
|
|
|
26
98
|
this._tapPreTasks = [];
|
|
27
99
|
this._tapTests = [];
|
|
28
100
|
this._tapTestsOnly = [];
|
|
101
|
+
this._currentSuite = null;
|
|
102
|
+
this._rootSuites = [];
|
|
103
|
+
// Get filter tags from environment
|
|
104
|
+
if (typeof process !== 'undefined' && process.env && process.env.TSTEST_FILTER_TAGS) {
|
|
105
|
+
this._filterTags = process.env.TSTEST_FILTER_TAGS.split(',');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Fluent test builder
|
|
109
|
+
tags(...tags) {
|
|
110
|
+
const builder = new TestBuilder(this);
|
|
111
|
+
return builder.tags(...tags);
|
|
112
|
+
}
|
|
113
|
+
priority(level) {
|
|
114
|
+
const builder = new TestBuilder(this);
|
|
115
|
+
return builder.priority(level);
|
|
116
|
+
}
|
|
117
|
+
retry(count) {
|
|
118
|
+
const builder = new TestBuilder(this);
|
|
119
|
+
return builder.retry(count);
|
|
120
|
+
}
|
|
121
|
+
timeout(ms) {
|
|
122
|
+
const builder = new TestBuilder(this);
|
|
123
|
+
return builder.timeout(ms);
|
|
29
124
|
}
|
|
30
125
|
/**
|
|
31
126
|
* Normal test function, will run one by one
|
|
@@ -38,11 +133,19 @@ export class Tap {
|
|
|
38
133
|
testFunction,
|
|
39
134
|
parallel: false,
|
|
40
135
|
});
|
|
41
|
-
|
|
42
|
-
|
|
136
|
+
// No options applied here - use the fluent builder syntax instead
|
|
137
|
+
// If we're in a suite, add test to the suite
|
|
138
|
+
if (this._currentSuite) {
|
|
139
|
+
this._currentSuite.tests.push(localTest);
|
|
43
140
|
}
|
|
44
|
-
else
|
|
45
|
-
|
|
141
|
+
else {
|
|
142
|
+
// Otherwise add to global test list
|
|
143
|
+
if (modeArg === 'normal') {
|
|
144
|
+
this._tapTests.push(localTest);
|
|
145
|
+
}
|
|
146
|
+
else if (modeArg === 'only') {
|
|
147
|
+
this._tapTestsOnly.push(localTest);
|
|
148
|
+
}
|
|
46
149
|
}
|
|
47
150
|
return localTest;
|
|
48
151
|
}
|
|
@@ -55,11 +158,76 @@ export class Tap {
|
|
|
55
158
|
* @param testFunction - A Function that returns a Promise and resolves or rejects
|
|
56
159
|
*/
|
|
57
160
|
testParallel(testDescription, testFunction) {
|
|
58
|
-
|
|
161
|
+
const localTest = new TapTest({
|
|
59
162
|
description: testDescription,
|
|
60
163
|
testFunction,
|
|
61
164
|
parallel: true,
|
|
62
|
-
})
|
|
165
|
+
});
|
|
166
|
+
if (this._currentSuite) {
|
|
167
|
+
this._currentSuite.tests.push(localTest);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
this._tapTests.push(localTest);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Create a test suite for grouping related tests
|
|
175
|
+
*/
|
|
176
|
+
describe(description, suiteFunction) {
|
|
177
|
+
const suite = {
|
|
178
|
+
description,
|
|
179
|
+
tests: [],
|
|
180
|
+
children: [],
|
|
181
|
+
parent: this._currentSuite,
|
|
182
|
+
};
|
|
183
|
+
// Add to parent or root
|
|
184
|
+
if (this._currentSuite) {
|
|
185
|
+
this._currentSuite.children.push(suite);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
this._rootSuites.push(suite);
|
|
189
|
+
}
|
|
190
|
+
// Execute suite function in context
|
|
191
|
+
const previousSuite = this._currentSuite;
|
|
192
|
+
this._currentSuite = suite;
|
|
193
|
+
try {
|
|
194
|
+
suiteFunction();
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
this._currentSuite = previousSuite;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Set up a function to run before each test in the current suite
|
|
202
|
+
*/
|
|
203
|
+
beforeEach(setupFunction) {
|
|
204
|
+
if (this._currentSuite) {
|
|
205
|
+
this._currentSuite.beforeEach = setupFunction;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
throw new Error('beforeEach can only be used inside a describe block');
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Set up a function to run after each test in the current suite
|
|
213
|
+
*/
|
|
214
|
+
afterEach(teardownFunction) {
|
|
215
|
+
if (this._currentSuite) {
|
|
216
|
+
this._currentSuite.afterEach = teardownFunction;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
throw new Error('afterEach can only be used inside a describe block');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* collect all tests from suites
|
|
224
|
+
*/
|
|
225
|
+
_collectTests(suite, tests = []) {
|
|
226
|
+
tests.push(...suite.tests);
|
|
227
|
+
for (const childSuite of suite.children) {
|
|
228
|
+
this._collectTests(childSuite, tests);
|
|
229
|
+
}
|
|
230
|
+
return tests;
|
|
63
231
|
}
|
|
64
232
|
/**
|
|
65
233
|
* starts the test evaluation
|
|
@@ -67,15 +235,25 @@ export class Tap {
|
|
|
67
235
|
async start(optionsArg) {
|
|
68
236
|
// lets set the tapbundle promise
|
|
69
237
|
const smartenvInstance = new plugins.smartenv.Smartenv();
|
|
238
|
+
const globalPromise = plugins.smartpromise.defer();
|
|
70
239
|
smartenvInstance.isBrowser
|
|
71
|
-
? (globalThis.tapbundleDeferred =
|
|
240
|
+
? (globalThis.tapbundleDeferred = globalPromise)
|
|
72
241
|
: null;
|
|
242
|
+
// Also set tapPromise for backwards compatibility
|
|
243
|
+
smartenvInstance.isBrowser
|
|
244
|
+
? (globalThis.tapPromise = globalPromise.promise)
|
|
245
|
+
: null;
|
|
246
|
+
// Path helpers will be initialized by the Node.js environment if available
|
|
73
247
|
// lets continue with running the tests
|
|
74
248
|
const promiseArray = [];
|
|
249
|
+
// Collect all tests including those in suites
|
|
250
|
+
let allTests = [...this._tapTests];
|
|
251
|
+
for (const suite of this._rootSuites) {
|
|
252
|
+
this._collectTests(suite, allTests);
|
|
253
|
+
}
|
|
75
254
|
// safeguard against empty test array
|
|
76
|
-
if (this.
|
|
255
|
+
if (allTests.length === 0 && this._tapTestsOnly.length === 0) {
|
|
77
256
|
console.log('no tests specified. Ending here!');
|
|
78
|
-
// TODO: throw proper error
|
|
79
257
|
return;
|
|
80
258
|
}
|
|
81
259
|
// determine which tests to run
|
|
@@ -84,16 +262,49 @@ export class Tap {
|
|
|
84
262
|
concerningTests = this._tapTestsOnly;
|
|
85
263
|
}
|
|
86
264
|
else {
|
|
87
|
-
concerningTests =
|
|
265
|
+
concerningTests = allTests;
|
|
266
|
+
}
|
|
267
|
+
// Filter tests by tags if specified
|
|
268
|
+
if (this._filterTags.length > 0) {
|
|
269
|
+
concerningTests = concerningTests.filter(test => {
|
|
270
|
+
// Skip tests without tags when filtering is active
|
|
271
|
+
if (!test.tags || test.tags.length === 0) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
// Check if test has any of the filter tags
|
|
275
|
+
return test.tags.some(tag => this._filterTags.includes(tag));
|
|
276
|
+
});
|
|
88
277
|
}
|
|
89
278
|
// lets run the pretasks
|
|
90
279
|
for (const preTask of this._tapPreTasks) {
|
|
91
280
|
await preTask.run();
|
|
92
281
|
}
|
|
282
|
+
// Count actual tests that will be run
|
|
93
283
|
console.log(`1..${concerningTests.length}`);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
284
|
+
// Run tests from suites with lifecycle hooks
|
|
285
|
+
let testKey = 0;
|
|
286
|
+
// Run root suite tests with lifecycle hooks
|
|
287
|
+
if (this._rootSuites.length > 0) {
|
|
288
|
+
await this._runSuite(null, this._rootSuites, promiseArray, { testKey });
|
|
289
|
+
// Update testKey after running suite tests
|
|
290
|
+
for (const suite of this._rootSuites) {
|
|
291
|
+
const suiteTests = this._collectTests(suite);
|
|
292
|
+
testKey += suiteTests.length;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Run non-suite tests (tests added directly without describe)
|
|
296
|
+
const nonSuiteTests = concerningTests.filter(test => {
|
|
297
|
+
// Check if test is not in any suite
|
|
298
|
+
for (const suite of this._rootSuites) {
|
|
299
|
+
const suiteTests = this._collectTests(suite);
|
|
300
|
+
if (suiteTests.includes(test)) {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return true;
|
|
305
|
+
});
|
|
306
|
+
for (const currentTest of nonSuiteTests) {
|
|
307
|
+
const testPromise = currentTest.run(testKey++);
|
|
97
308
|
if (currentTest.parallel) {
|
|
98
309
|
promiseArray.push(testPromise);
|
|
99
310
|
}
|
|
@@ -107,7 +318,7 @@ export class Tap {
|
|
|
107
318
|
const executionNotes = [];
|
|
108
319
|
// collect failed tests
|
|
109
320
|
for (const tapTest of concerningTests) {
|
|
110
|
-
if (tapTest.status !== 'success') {
|
|
321
|
+
if (tapTest.status !== 'success' && tapTest.status !== 'skipped') {
|
|
111
322
|
failReasons.push(`Test ${tapTest.testKey + 1} failed with status ${tapTest.status}:\n` +
|
|
112
323
|
`|| ${tapTest.description}\n` +
|
|
113
324
|
`|| for more information please take a look the logs above`);
|
|
@@ -118,22 +329,75 @@ export class Tap {
|
|
|
118
329
|
console.log(failReason);
|
|
119
330
|
}
|
|
120
331
|
if (optionsArg && optionsArg.throwOnError && failReasons.length > 0) {
|
|
121
|
-
if (!smartenvInstance.isBrowser)
|
|
332
|
+
if (!smartenvInstance.isBrowser && typeof process !== 'undefined')
|
|
122
333
|
process.exit(1);
|
|
123
334
|
}
|
|
124
335
|
if (smartenvInstance.isBrowser) {
|
|
125
|
-
|
|
336
|
+
globalPromise.resolve();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Run tests in a suite with lifecycle hooks
|
|
341
|
+
*/
|
|
342
|
+
async _runSuite(parentSuite, suites, promiseArray, context) {
|
|
343
|
+
for (const suite of suites) {
|
|
344
|
+
// Run beforeEach from parent suites
|
|
345
|
+
const beforeEachFunctions = [];
|
|
346
|
+
let currentSuite = suite;
|
|
347
|
+
while (currentSuite) {
|
|
348
|
+
if (currentSuite.beforeEach) {
|
|
349
|
+
beforeEachFunctions.unshift(currentSuite.beforeEach);
|
|
350
|
+
}
|
|
351
|
+
currentSuite = currentSuite.parent || null;
|
|
352
|
+
}
|
|
353
|
+
// Run tests in this suite
|
|
354
|
+
for (const test of suite.tests) {
|
|
355
|
+
// Create wrapper test function that includes lifecycle hooks
|
|
356
|
+
const originalFunction = test.testFunction;
|
|
357
|
+
test.testFunction = async (tapTools) => {
|
|
358
|
+
// Run all beforeEach hooks
|
|
359
|
+
for (const beforeEach of beforeEachFunctions) {
|
|
360
|
+
await beforeEach(tapTools);
|
|
361
|
+
}
|
|
362
|
+
// Run the actual test
|
|
363
|
+
const result = await originalFunction(tapTools);
|
|
364
|
+
// Run afterEach hooks in reverse order
|
|
365
|
+
const afterEachFunctions = [];
|
|
366
|
+
currentSuite = suite;
|
|
367
|
+
while (currentSuite) {
|
|
368
|
+
if (currentSuite.afterEach) {
|
|
369
|
+
afterEachFunctions.push(currentSuite.afterEach);
|
|
370
|
+
}
|
|
371
|
+
currentSuite = currentSuite.parent || null;
|
|
372
|
+
}
|
|
373
|
+
for (const afterEach of afterEachFunctions) {
|
|
374
|
+
await afterEach(tapTools);
|
|
375
|
+
}
|
|
376
|
+
return result;
|
|
377
|
+
};
|
|
378
|
+
const testPromise = test.run(context.testKey++);
|
|
379
|
+
if (test.parallel) {
|
|
380
|
+
promiseArray.push(testPromise);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
await testPromise;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// Recursively run child suites
|
|
387
|
+
await this._runSuite(suite, suite.children, promiseArray, context);
|
|
126
388
|
}
|
|
127
389
|
}
|
|
128
390
|
async stopForcefully(codeArg = 0, directArg = false) {
|
|
129
391
|
console.log(`tap stopping forcefully! Code: ${codeArg} / Direct: ${directArg}`);
|
|
130
|
-
if (
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
setTimeout(() => {
|
|
392
|
+
if (typeof process !== 'undefined') {
|
|
393
|
+
if (directArg) {
|
|
135
394
|
process.exit(codeArg);
|
|
136
|
-
}
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
setTimeout(() => {
|
|
398
|
+
process.exit(codeArg);
|
|
399
|
+
}, 10);
|
|
400
|
+
}
|
|
137
401
|
}
|
|
138
402
|
}
|
|
139
403
|
/**
|
|
@@ -150,5 +414,5 @@ export class Tap {
|
|
|
150
414
|
throw new Error(message);
|
|
151
415
|
}
|
|
152
416
|
}
|
|
153
|
-
export
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdGFwYnVuZGxlL3RhcGJ1bmRsZS5jbGFzc2VzLnRhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHdCQUF3QixDQUFDO0FBRWxELE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBc0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RSxNQUFNLE9BQU8sR0FBRztJQUFoQjtRQUNFOzs7V0FHRztRQUNJLFNBQUksR0FBRztZQUNaLElBQUksRUFBRSxDQUFDLGNBQXNCLEVBQUUsV0FBNkIsRUFBRSxFQUFFO2dCQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFDRCxZQUFZLEVBQUUsQ0FBQyxjQUFzQixFQUFFLFdBQTZCLEVBQUUsRUFBRTtnQkFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUNqRCxDQUFDO1NBQ0YsQ0FBQztRQUVGOztXQUVHO1FBQ0ksU0FBSSxHQUFHO1lBQ1osSUFBSSxFQUFFLENBQUMsY0FBc0IsRUFBRSxlQUFpQyxFQUFFLEVBQUU7Z0JBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNyRCxDQUFDO1NBQ0YsQ0FBQztRQUVNLGlCQUFZLEdBQWMsRUFBRSxDQUFDO1FBQzdCLGNBQVMsR0FBbUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztJQTZJN0MsQ0FBQztJQTNJQzs7OztPQUlHO0lBQ0ksSUFBSSxDQUNULGVBQXVCLEVBQ3ZCLFlBQThCLEVBQzlCLFVBQXNDLFFBQVE7UUFFOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxPQUFPLENBQUk7WUFDL0IsV0FBVyxFQUFFLGVBQWU7WUFDNUIsWUFBWTtZQUNaLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxjQUFzQixFQUFFLFdBQTZCO1FBQ2xFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFDLGVBQXVCLEVBQUUsWUFBOEI7UUFDekUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2pCLElBQUksT0FBTyxDQUFDO1lBQ1YsV0FBVyxFQUFFLGVBQWU7WUFDNUIsWUFBWTtZQUNaLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQXNDO1FBQ3ZELGlDQUFpQztRQUNqQyxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RCxnQkFBZ0IsQ0FBQyxTQUFTO1lBQ3hCLENBQUMsQ0FBQyxDQUFFLFVBQWtCLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4RSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRVQsdUNBQXVDO1FBQ3ZDLE1BQU0sWUFBWSxHQUF3QixFQUFFLENBQUM7UUFFN0MscUNBQXFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ2hELDJCQUEyQjtZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELCtCQUErQjtRQUMvQixJQUFJLGVBQTBCLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ25DLENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEMsTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM1QyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QyxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6QixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLFdBQVcsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoQywyREFBMkQ7UUFDM0QsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQztRQUNwQyx1QkFBdUI7UUFDdkIsS0FBSyxNQUFNLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN0QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLFdBQVcsQ0FBQyxJQUFJLENBQ2QsUUFBUSxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsdUJBQXVCLE9BQU8sQ0FBQyxNQUFNLEtBQUs7b0JBQ25FLE1BQU0sT0FBTyxDQUFDLFdBQVcsSUFBSTtvQkFDN0IsMkRBQTJELENBQzlELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUztnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLFVBQWtCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLEtBQUs7UUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsT0FBTyxjQUFjLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDaEYsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxHQUFVO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLElBQUksQ0FBQyxVQUFrQixhQUFhO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMifQ==
|
|
417
|
+
export const tap = new Tap();
|
|
418
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdGFwYnVuZGxlL3RhcGJ1bmRsZS5jbGFzc2VzLnRhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHdCQUF3QixDQUFDO0FBRWxELE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBc0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQVc3RSxNQUFNLFdBQVc7SUFPZixZQUFZLEdBQVc7UUFMZixVQUFLLEdBQWEsRUFBRSxDQUFDO1FBQ3JCLGNBQVMsR0FBOEIsUUFBUSxDQUFDO1FBS3RELElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLENBQUMsR0FBRyxJQUFjO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFnQztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBYTtRQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLENBQUMsRUFBVTtRQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLENBQUMsV0FBbUIsRUFBRSxZQUE4QjtRQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpFLDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FB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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TapTools } from './tapbundle.classes.taptools.js';
|
|
2
2
|
import { HrtMeasurement } from '@push.rocks/smarttime';
|
|
3
|
-
export type TTestStatus = 'success' | 'error' | 'pending' | 'errorAfterSuccess' | 'timeout';
|
|
3
|
+
export type TTestStatus = 'success' | 'error' | 'pending' | 'errorAfterSuccess' | 'timeout' | 'skipped';
|
|
4
4
|
export interface ITestFunction<T> {
|
|
5
5
|
(tapTools?: TapTools): Promise<T>;
|
|
6
6
|
}
|
|
@@ -13,6 +13,12 @@ export declare class TapTest<T = unknown> {
|
|
|
13
13
|
tapTools: TapTools;
|
|
14
14
|
testFunction: ITestFunction<T>;
|
|
15
15
|
testKey: number;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
isTodo: boolean;
|
|
18
|
+
todoReason?: string;
|
|
19
|
+
tags: string[];
|
|
20
|
+
priority: 'high' | 'medium' | 'low';
|
|
21
|
+
fileName?: string;
|
|
16
22
|
private testDeferred;
|
|
17
23
|
testPromise: Promise<TapTest<T>>;
|
|
18
24
|
private testResultDeferred;
|