@git.zone/tstest 1.4.0 → 1.7.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.
Files changed (94) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/index.js +9 -2
  3. package/dist_ts/tstest.classes.tap.parser.d.ts +4 -0
  4. package/dist_ts/tstest.classes.tap.parser.js +114 -24
  5. package/dist_ts/tstest.classes.testdirectory.d.ts +10 -0
  6. package/dist_ts/tstest.classes.testdirectory.js +31 -1
  7. package/dist_ts/tstest.classes.tstest.d.ts +3 -1
  8. package/dist_ts/tstest.classes.tstest.js +52 -27
  9. package/dist_ts/tstest.plugins.d.ts +1 -1
  10. package/dist_ts/tstest.plugins.js +2 -2
  11. package/dist_ts_tapbundle/00_commitinfo_data.d.ts +8 -0
  12. package/dist_ts_tapbundle/00_commitinfo_data.js +9 -0
  13. package/dist_ts_tapbundle/index.d.ts +6 -0
  14. package/dist_ts_tapbundle/index.js +7 -0
  15. package/dist_ts_tapbundle/tapbundle.classes.pretask.d.ts +10 -0
  16. package/dist_ts_tapbundle/tapbundle.classes.pretask.js +13 -0
  17. package/dist_ts_tapbundle/tapbundle.classes.tap.d.ts +104 -0
  18. package/dist_ts_tapbundle/tapbundle.classes.tap.js +418 -0
  19. package/dist_ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
  20. package/dist_ts_tapbundle/tapbundle.classes.taptest.js +110 -0
  21. package/dist_ts_tapbundle/tapbundle.classes.taptools.d.ts +107 -0
  22. package/dist_ts_tapbundle/tapbundle.classes.taptools.js +229 -0
  23. package/dist_ts_tapbundle/tapbundle.classes.tapwrap.d.ts +8 -0
  24. package/dist_ts_tapbundle/tapbundle.classes.tapwrap.js +7 -0
  25. package/dist_ts_tapbundle/tapbundle.plugins.d.ts +7 -0
  26. package/dist_ts_tapbundle/tapbundle.plugins.js +9 -0
  27. package/dist_ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
  28. package/dist_ts_tapbundle/tapbundle.tapcreator.js +5 -0
  29. package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.d.ts +8 -0
  30. package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.js +9 -0
  31. package/dist_ts_tapbundle/ts_tapbundle/index.d.ts +6 -0
  32. package/dist_ts_tapbundle/ts_tapbundle/index.js +7 -0
  33. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.d.ts +10 -0
  34. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.js +13 -0
  35. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.d.ts +104 -0
  36. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.js +401 -0
  37. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
  38. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.js +110 -0
  39. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.d.ts +109 -0
  40. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.js +241 -0
  41. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.d.ts +8 -0
  42. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.js +7 -0
  43. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.d.ts +8 -0
  44. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.js +10 -0
  45. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
  46. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.js +5 -0
  47. package/dist_ts_tapbundle/ts_tapbundle/webhelpers.d.ts +7 -0
  48. package/dist_ts_tapbundle/ts_tapbundle/webhelpers.js +35 -0
  49. package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.d.ts +5 -0
  50. package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.js +13 -0
  51. package/dist_ts_tapbundle/ts_tapbundle_node/plugins.d.ts +11 -0
  52. package/dist_ts_tapbundle/ts_tapbundle_node/plugins.js +14 -0
  53. package/dist_ts_tapbundle/webhelpers.d.ts +7 -0
  54. package/dist_ts_tapbundle/webhelpers.js +35 -0
  55. package/dist_ts_tapbundle_node/classes.tapnodetools.d.ts +25 -0
  56. package/dist_ts_tapbundle_node/classes.tapnodetools.js +81 -0
  57. package/dist_ts_tapbundle_node/classes.testfileprovider.d.ts +6 -0
  58. package/dist_ts_tapbundle_node/classes.testfileprovider.js +16 -0
  59. package/dist_ts_tapbundle_node/index.d.ts +1 -0
  60. package/dist_ts_tapbundle_node/index.js +2 -0
  61. package/dist_ts_tapbundle_node/paths.d.ts +2 -0
  62. package/dist_ts_tapbundle_node/paths.js +4 -0
  63. package/dist_ts_tapbundle_node/plugins.d.ts +11 -0
  64. package/dist_ts_tapbundle_node/plugins.js +14 -0
  65. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
  66. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptest.js +110 -0
  67. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptools.d.ts +109 -0
  68. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptools.js +241 -0
  69. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.plugins.d.ts +8 -0
  70. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.plugins.js +10 -0
  71. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
  72. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.tapcreator.js +5 -0
  73. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.pathinject.d.ts +5 -0
  74. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.pathinject.js +13 -0
  75. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.tapnodetools.d.ts +25 -0
  76. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.tapnodetools.js +81 -0
  77. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.testfileprovider.d.ts +6 -0
  78. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.testfileprovider.js +16 -0
  79. package/dist_ts_tapbundle_node/ts_tapbundle_node/index.d.ts +2 -0
  80. package/dist_ts_tapbundle_node/ts_tapbundle_node/index.js +3 -0
  81. package/dist_ts_tapbundle_node/ts_tapbundle_node/paths.d.ts +2 -0
  82. package/dist_ts_tapbundle_node/ts_tapbundle_node/paths.js +4 -0
  83. package/dist_ts_tapbundle_node/ts_tapbundle_node/plugins.d.ts +11 -0
  84. package/dist_ts_tapbundle_node/ts_tapbundle_node/plugins.js +14 -0
  85. package/package.json +23 -10
  86. package/readme.hints.md +62 -0
  87. package/readme.plan.md +253 -30
  88. package/ts/00_commitinfo_data.ts +1 -1
  89. package/ts/index.ts +8 -1
  90. package/ts/tspublish.json +3 -0
  91. package/ts/tstest.classes.tap.parser.ts +111 -25
  92. package/ts/tstest.classes.testdirectory.ts +39 -0
  93. package/ts/tstest.classes.tstest.ts +61 -27
  94. package/ts/tstest.plugins.ts +1 -1
@@ -0,0 +1,13 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ import { TapTools } from './tapbundle.classes.taptools.js';
3
+ export class PreTask {
4
+ constructor(descriptionArg, preTaskFunctionArg) {
5
+ this.description = descriptionArg;
6
+ this.preTaskFunction = preTaskFunctionArg;
7
+ }
8
+ async run() {
9
+ console.log(`::__PRETASK: ${this.description}`);
10
+ await this.preTaskFunction(new TapTools(null));
11
+ }
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMucHJldGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy5wcmV0YXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTTNELE1BQU0sT0FBTyxPQUFPO0lBSWxCLFlBQVksY0FBc0IsRUFBRSxrQkFBb0M7UUFDdEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7UUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUc7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,104 @@
1
+ import { type IPreTaskFunction } from './tapbundle.classes.pretask.js';
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
+ }
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>;
34
+ /**
35
+ * skips a test
36
+ * tests marked with tap.skip.test() are never executed
37
+ */
38
+ skip: {
39
+ test: (descriptionArg: string, functionArg: ITestFunction<T>) => void;
40
+ testParallel: (descriptionArg: string, functionArg: ITestFunction<T>) => void;
41
+ };
42
+ /**
43
+ * only executes tests marked as ONLY
44
+ */
45
+ only: {
46
+ test: (descriptionArg: string, testFunctionArg: ITestFunction<T>) => void;
47
+ };
48
+ private _tapPreTasks;
49
+ private _tapTests;
50
+ private _tapTestsOnly;
51
+ private _currentSuite;
52
+ private _rootSuites;
53
+ /**
54
+ * Normal test function, will run one by one
55
+ * @param testDescription - A description of what the test does
56
+ * @param testFunction - A Function that returns a Promise and resolves or rejects
57
+ */
58
+ test(testDescription: string, testFunction: ITestFunction<T>, modeArg?: 'normal' | 'only' | 'skip'): TapTest<T>;
59
+ preTask(descriptionArg: string, functionArg: IPreTaskFunction): void;
60
+ /**
61
+ * A parallel test that will not be waited for before the next starts.
62
+ * @param testDescription - A description of what the test does
63
+ * @param testFunction - A Function that returns a Promise and resolves or rejects
64
+ */
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;
82
+ /**
83
+ * starts the test evaluation
84
+ */
85
+ start(optionsArg?: {
86
+ throwOnError: boolean;
87
+ }): Promise<void>;
88
+ /**
89
+ * Run tests in a suite with lifecycle hooks
90
+ */
91
+ private _runSuite;
92
+ stopForcefully(codeArg?: number, directArg?: boolean): Promise<void>;
93
+ /**
94
+ * handle errors
95
+ */
96
+ threw(err: Error): void;
97
+ /**
98
+ * Explicitly fail the current test with a custom message
99
+ * @param message - The failure message to display
100
+ */
101
+ fail(message?: string): never;
102
+ }
103
+ export declare const tap: Tap<unknown>;
104
+ export {};
@@ -0,0 +1,418 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ import { PreTask } from './tapbundle.classes.pretask.js';
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
+ }
72
+ export class Tap {
73
+ constructor() {
74
+ this._skipCount = 0;
75
+ this._filterTags = [];
76
+ /**
77
+ * skips a test
78
+ * tests marked with tap.skip.test() are never executed
79
+ */
80
+ this.skip = {
81
+ test: (descriptionArg, functionArg) => {
82
+ console.log(`skipped test: ${descriptionArg}`);
83
+ this._skipCount++;
84
+ },
85
+ testParallel: (descriptionArg, functionArg) => {
86
+ console.log(`skipped test: ${descriptionArg}`);
87
+ this._skipCount++;
88
+ },
89
+ };
90
+ /**
91
+ * only executes tests marked as ONLY
92
+ */
93
+ this.only = {
94
+ test: (descriptionArg, testFunctionArg) => {
95
+ this.test(descriptionArg, testFunctionArg, 'only');
96
+ },
97
+ };
98
+ this._tapPreTasks = [];
99
+ this._tapTests = [];
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);
124
+ }
125
+ /**
126
+ * Normal test function, will run one by one
127
+ * @param testDescription - A description of what the test does
128
+ * @param testFunction - A Function that returns a Promise and resolves or rejects
129
+ */
130
+ test(testDescription, testFunction, modeArg = 'normal') {
131
+ const localTest = new TapTest({
132
+ description: testDescription,
133
+ testFunction,
134
+ parallel: false,
135
+ });
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);
140
+ }
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
+ }
149
+ }
150
+ return localTest;
151
+ }
152
+ preTask(descriptionArg, functionArg) {
153
+ this._tapPreTasks.push(new PreTask(descriptionArg, functionArg));
154
+ }
155
+ /**
156
+ * A parallel test that will not be waited for before the next starts.
157
+ * @param testDescription - A description of what the test does
158
+ * @param testFunction - A Function that returns a Promise and resolves or rejects
159
+ */
160
+ testParallel(testDescription, testFunction) {
161
+ const localTest = new TapTest({
162
+ description: testDescription,
163
+ testFunction,
164
+ parallel: true,
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;
231
+ }
232
+ /**
233
+ * starts the test evaluation
234
+ */
235
+ async start(optionsArg) {
236
+ // lets set the tapbundle promise
237
+ const smartenvInstance = new plugins.smartenv.Smartenv();
238
+ const globalPromise = plugins.smartpromise.defer();
239
+ smartenvInstance.isBrowser
240
+ ? (globalThis.tapbundleDeferred = globalPromise)
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
247
+ // lets continue with running the tests
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
+ }
254
+ // safeguard against empty test array
255
+ if (allTests.length === 0 && this._tapTestsOnly.length === 0) {
256
+ console.log('no tests specified. Ending here!');
257
+ return;
258
+ }
259
+ // determine which tests to run
260
+ let concerningTests;
261
+ if (this._tapTestsOnly.length > 0) {
262
+ concerningTests = this._tapTestsOnly;
263
+ }
264
+ else {
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
+ });
277
+ }
278
+ // lets run the pretasks
279
+ for (const preTask of this._tapPreTasks) {
280
+ await preTask.run();
281
+ }
282
+ // Count actual tests that will be run
283
+ console.log(`1..${concerningTests.length}`);
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++);
308
+ if (currentTest.parallel) {
309
+ promiseArray.push(testPromise);
310
+ }
311
+ else {
312
+ await testPromise;
313
+ }
314
+ }
315
+ await Promise.all(promiseArray);
316
+ // when tests have been run and all promises are fullfilled
317
+ const failReasons = [];
318
+ const executionNotes = [];
319
+ // collect failed tests
320
+ for (const tapTest of concerningTests) {
321
+ if (tapTest.status !== 'success' && tapTest.status !== 'skipped') {
322
+ failReasons.push(`Test ${tapTest.testKey + 1} failed with status ${tapTest.status}:\n` +
323
+ `|| ${tapTest.description}\n` +
324
+ `|| for more information please take a look the logs above`);
325
+ }
326
+ }
327
+ // render fail Reasons
328
+ for (const failReason of failReasons) {
329
+ console.log(failReason);
330
+ }
331
+ if (optionsArg && optionsArg.throwOnError && failReasons.length > 0) {
332
+ if (!smartenvInstance.isBrowser && typeof process !== 'undefined')
333
+ process.exit(1);
334
+ }
335
+ if (smartenvInstance.isBrowser) {
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);
388
+ }
389
+ }
390
+ async stopForcefully(codeArg = 0, directArg = false) {
391
+ console.log(`tap stopping forcefully! Code: ${codeArg} / Direct: ${directArg}`);
392
+ if (typeof process !== 'undefined') {
393
+ if (directArg) {
394
+ process.exit(codeArg);
395
+ }
396
+ else {
397
+ setTimeout(() => {
398
+ process.exit(codeArg);
399
+ }, 10);
400
+ }
401
+ }
402
+ }
403
+ /**
404
+ * handle errors
405
+ */
406
+ threw(err) {
407
+ console.log(err);
408
+ }
409
+ /**
410
+ * Explicitly fail the current test with a custom message
411
+ * @param message - The failure message to display
412
+ */
413
+ fail(message = 'Test failed') {
414
+ throw new Error(message);
415
+ }
416
+ }
417
+ export const tap = new Tap();
418
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdGFwYnVuZGxlL3RhcGJ1bmRsZS5jbGFzc2VzLnRhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHdCQUF3QixDQUFDO0FBRWxELE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBc0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQVc3RSxNQUFNLFdBQVc7SUFPZixZQUFZLEdBQVc7UUFMZixVQUFLLEdBQWEsRUFBRSxDQUFDO1FBQ3JCLGNBQVMsR0FBOEIsUUFBUSxDQUFDO1FBS3RELElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLENBQUMsR0FBRyxJQUFjO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFnQztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBYTtRQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLENBQUMsRUFBVTtRQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLENBQUMsV0FBbUIsRUFBRSxZQUE4QjtRQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpFLDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FB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
@@ -0,0 +1,38 @@
1
+ import { TapTools } from './tapbundle.classes.taptools.js';
2
+ import { HrtMeasurement } from '@push.rocks/smarttime';
3
+ export type TTestStatus = 'success' | 'error' | 'pending' | 'errorAfterSuccess' | 'timeout' | 'skipped';
4
+ export interface ITestFunction<T> {
5
+ (tapTools?: TapTools): Promise<T>;
6
+ }
7
+ export declare class TapTest<T = unknown> {
8
+ description: string;
9
+ failureAllowed: boolean;
10
+ hrtMeasurement: HrtMeasurement;
11
+ parallel: boolean;
12
+ status: TTestStatus;
13
+ tapTools: TapTools;
14
+ testFunction: ITestFunction<T>;
15
+ testKey: number;
16
+ timeoutMs?: number;
17
+ isTodo: boolean;
18
+ todoReason?: string;
19
+ tags: string[];
20
+ priority: 'high' | 'medium' | 'low';
21
+ fileName?: string;
22
+ private testDeferred;
23
+ testPromise: Promise<TapTest<T>>;
24
+ private testResultDeferred;
25
+ testResultPromise: Promise<T>;
26
+ /**
27
+ * constructor
28
+ */
29
+ constructor(optionsArg: {
30
+ description: string;
31
+ testFunction: ITestFunction<T>;
32
+ parallel: boolean;
33
+ });
34
+ /**
35
+ * run the test
36
+ */
37
+ run(testKeyArg: number): Promise<void>;
38
+ }