@git.zone/tstest 1.5.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 (67) 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_tapbundle/index.d.ts +1 -0
  10. package/dist_ts_tapbundle/index.js +2 -1
  11. package/dist_ts_tapbundle/tapbundle.classes.tap.d.ts +54 -1
  12. package/dist_ts_tapbundle/tapbundle.classes.tap.js +288 -24
  13. package/dist_ts_tapbundle/tapbundle.classes.taptest.d.ts +7 -1
  14. package/dist_ts_tapbundle/tapbundle.classes.taptest.js +75 -27
  15. package/dist_ts_tapbundle/tapbundle.classes.taptools.d.ts +81 -1
  16. package/dist_ts_tapbundle/tapbundle.classes.taptools.js +180 -2
  17. package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.d.ts +8 -0
  18. package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.js +9 -0
  19. package/dist_ts_tapbundle/ts_tapbundle/index.d.ts +6 -0
  20. package/dist_ts_tapbundle/ts_tapbundle/index.js +7 -0
  21. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.d.ts +10 -0
  22. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.js +13 -0
  23. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.d.ts +104 -0
  24. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.js +401 -0
  25. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
  26. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.js +110 -0
  27. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.d.ts +109 -0
  28. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.js +241 -0
  29. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.d.ts +8 -0
  30. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.js +7 -0
  31. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.d.ts +8 -0
  32. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.js +10 -0
  33. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
  34. package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.js +5 -0
  35. package/dist_ts_tapbundle/ts_tapbundle/webhelpers.d.ts +7 -0
  36. package/dist_ts_tapbundle/ts_tapbundle/webhelpers.js +35 -0
  37. package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.d.ts +5 -0
  38. package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.js +13 -0
  39. package/dist_ts_tapbundle/ts_tapbundle_node/plugins.d.ts +11 -0
  40. package/dist_ts_tapbundle/ts_tapbundle_node/plugins.js +14 -0
  41. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
  42. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptest.js +110 -0
  43. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptools.d.ts +109 -0
  44. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptools.js +241 -0
  45. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.plugins.d.ts +8 -0
  46. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.plugins.js +10 -0
  47. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
  48. package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.tapcreator.js +5 -0
  49. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.pathinject.d.ts +5 -0
  50. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.pathinject.js +13 -0
  51. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.tapnodetools.d.ts +25 -0
  52. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.tapnodetools.js +81 -0
  53. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.testfileprovider.d.ts +6 -0
  54. package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.testfileprovider.js +16 -0
  55. package/dist_ts_tapbundle_node/ts_tapbundle_node/index.d.ts +2 -0
  56. package/dist_ts_tapbundle_node/ts_tapbundle_node/index.js +3 -0
  57. package/dist_ts_tapbundle_node/ts_tapbundle_node/paths.d.ts +2 -0
  58. package/dist_ts_tapbundle_node/ts_tapbundle_node/paths.js +4 -0
  59. package/dist_ts_tapbundle_node/ts_tapbundle_node/plugins.d.ts +11 -0
  60. package/dist_ts_tapbundle_node/ts_tapbundle_node/plugins.js +14 -0
  61. package/package.json +11 -8
  62. package/readme.plan.md +253 -30
  63. package/ts/00_commitinfo_data.ts +1 -1
  64. package/ts/index.ts +8 -1
  65. package/ts/tstest.classes.tap.parser.ts +111 -25
  66. package/ts/tstest.classes.testdirectory.ts +39 -0
  67. package/ts/tstest.classes.tstest.ts +61 -27
@@ -1,6 +1,6 @@
1
1
  import * as plugins from './tapbundle.plugins.js';
2
2
  import { tapCreator } from './tapbundle.tapcreator.js';
3
- import { TapTools } from './tapbundle.classes.taptools.js';
3
+ import { TapTools, SkipError } from './tapbundle.classes.taptools.js';
4
4
  // imported interfaces
5
5
  import { Deferred } from '@push.rocks/smartpromise';
6
6
  import { HrtMeasurement } from '@push.rocks/smarttime';
@@ -9,6 +9,9 @@ export class TapTest {
9
9
  * constructor
10
10
  */
11
11
  constructor(optionsArg) {
12
+ this.isTodo = false;
13
+ this.tags = [];
14
+ this.priority = 'medium';
12
15
  this.testDeferred = plugins.smartpromise.defer();
13
16
  this.testPromise = this.testDeferred.promise;
14
17
  this.testResultDeferred = plugins.smartpromise.defer();
@@ -24,39 +27,84 @@ export class TapTest {
24
27
  * run the test
25
28
  */
26
29
  async run(testKeyArg) {
27
- this.hrtMeasurement.start();
28
30
  this.testKey = testKeyArg;
29
31
  const testNumber = testKeyArg + 1;
30
- try {
31
- const testReturnValue = await this.testFunction(this.tapTools);
32
- if (this.status === 'timeout') {
33
- throw new Error('Test succeeded, but timed out...');
34
- }
35
- this.hrtMeasurement.stop();
36
- console.log(`ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
32
+ // Handle todo tests
33
+ if (this.isTodo) {
34
+ const todoText = this.todoReason ? `# TODO ${this.todoReason}` : '# TODO';
35
+ console.log(`ok ${testNumber} - ${this.description} ${todoText}`);
37
36
  this.status = 'success';
38
37
  this.testDeferred.resolve(this);
39
- this.testResultDeferred.resolve(testReturnValue);
38
+ return;
40
39
  }
41
- catch (err) {
42
- this.hrtMeasurement.stop();
43
- console.log(`not ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
44
- this.testDeferred.resolve(this);
45
- this.testResultDeferred.resolve(err);
46
- // if the test has already succeeded before
47
- if (this.status === 'success') {
48
- this.status = 'errorAfterSuccess';
49
- console.log('!!! ALERT !!!: weird behaviour, since test has been already successfull');
50
- }
51
- else {
52
- this.status = 'error';
40
+ // Run test with retries
41
+ let lastError;
42
+ const maxRetries = this.tapTools.maxRetries;
43
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
44
+ this.hrtMeasurement.start();
45
+ try {
46
+ // Set up timeout if specified
47
+ let timeoutHandle;
48
+ let timeoutPromise = null;
49
+ if (this.timeoutMs) {
50
+ timeoutPromise = new Promise((_, reject) => {
51
+ timeoutHandle = setTimeout(() => {
52
+ this.status = 'timeout';
53
+ reject(new Error(`Test timed out after ${this.timeoutMs}ms`));
54
+ }, this.timeoutMs);
55
+ });
56
+ }
57
+ // Run the test function with potential timeout
58
+ const testPromise = this.testFunction(this.tapTools);
59
+ const testReturnValue = timeoutPromise
60
+ ? await Promise.race([testPromise, timeoutPromise])
61
+ : await testPromise;
62
+ // Clear timeout if test completed
63
+ if (timeoutHandle) {
64
+ clearTimeout(timeoutHandle);
65
+ }
66
+ this.hrtMeasurement.stop();
67
+ console.log(`ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
68
+ this.status = 'success';
69
+ this.testDeferred.resolve(this);
70
+ this.testResultDeferred.resolve(testReturnValue);
71
+ return; // Success, exit retry loop
53
72
  }
54
- // if the test is allowed to fail
55
- if (this.failureAllowed) {
56
- console.log(`please note: failure allowed!`);
73
+ catch (err) {
74
+ this.hrtMeasurement.stop();
75
+ // Handle skip
76
+ if (err instanceof SkipError || err.name === 'SkipError') {
77
+ console.log(`ok ${testNumber} - ${this.description} # SKIP ${err.message.replace('Skipped: ', '')}`);
78
+ this.status = 'skipped';
79
+ this.testDeferred.resolve(this);
80
+ return;
81
+ }
82
+ lastError = err;
83
+ // If we have retries left, try again
84
+ if (attempt < maxRetries) {
85
+ console.log(`# Retry ${attempt + 1}/${maxRetries} for test: ${this.description}`);
86
+ this.tapTools._incrementRetryCount();
87
+ continue;
88
+ }
89
+ // Final failure
90
+ console.log(`not ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
91
+ this.testDeferred.resolve(this);
92
+ this.testResultDeferred.resolve(err);
93
+ // if the test has already succeeded before
94
+ if (this.status === 'success') {
95
+ this.status = 'errorAfterSuccess';
96
+ console.log('!!! ALERT !!!: weird behaviour, since test has been already successfull');
97
+ }
98
+ else {
99
+ this.status = 'error';
100
+ }
101
+ // if the test is allowed to fail
102
+ if (this.failureAllowed) {
103
+ console.log(`please note: failure allowed!`);
104
+ }
105
+ console.log(err);
57
106
  }
58
- console.log(err);
59
107
  }
60
108
  }
61
109
  }
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy50YXB0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUzRCxzQkFBc0I7QUFDdEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVN2RCxNQUFNLE9BQU8sT0FBTztJQWFsQjs7T0FFRztJQUNILFlBQVksVUFJWDtRQVhPLGlCQUFZLEdBQXlCLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkUsZ0JBQVcsR0FBd0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDNUQsdUJBQWtCLEdBQWdCLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEUsc0JBQWlCLEdBQWUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztRQVNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQWtCO1FBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUM7WUFDSCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9ELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxVQUFVLE1BQU0sSUFBSSxDQUFDLFdBQVcsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksSUFBSSxDQUN0RixDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsVUFBVSxVQUFVLE1BQU0sSUFBSSxDQUFDLFdBQVcsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksSUFBSSxDQUMxRixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVyQywyQ0FBMkM7WUFDM0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDO2dCQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7WUFDekYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLENBQUM7WUFFRCxpQ0FBaUM7WUFDakMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy50YXB0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdEUsc0JBQXNCO0FBQ3RCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFTdkQsTUFBTSxPQUFPLE9BQU87SUFtQmxCOztPQUVHO0lBQ0gsWUFBWSxVQUlYO1FBaEJNLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFFeEIsU0FBSSxHQUFhLEVBQUUsQ0FBQztRQUNwQixhQUFRLEdBQThCLFFBQVEsQ0FBQztRQUU5QyxpQkFBWSxHQUF5QixPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25FLGdCQUFXLEdBQXdCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQzVELHVCQUFrQixHQUFnQixPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hFLHNCQUFpQixHQUFlLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFTckUsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDeEIsSUFBSSxD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
@@ -3,25 +3,105 @@ import { TapTest } from './tapbundle.classes.taptest.js';
3
3
  export interface IPromiseFunc {
4
4
  (): Promise<any>;
5
5
  }
6
+ export declare class SkipError extends Error {
7
+ constructor(message: string);
8
+ }
6
9
  export declare class TapTools {
7
10
  /**
8
11
  * the referenced TapTest
9
12
  */
10
13
  private _tapTest;
14
+ private _retries;
15
+ private _retryCount;
16
+ testData: any;
17
+ private static _sharedContext;
18
+ private _snapshotPath;
11
19
  constructor(TapTestArg: TapTest<any>);
12
20
  /**
13
21
  * allow failure
14
22
  */
15
23
  allowFailure(): void;
24
+ /**
25
+ * skip the rest of the test
26
+ */
27
+ skip(reason?: string): never;
28
+ /**
29
+ * conditionally skip the rest of the test
30
+ */
31
+ skipIf(condition: boolean, reason?: string): void;
32
+ /**
33
+ * mark test as todo
34
+ */
35
+ todo(reason?: string): void;
36
+ /**
37
+ * set the number of retries for this test
38
+ */
39
+ retry(count: number): void;
40
+ /**
41
+ * get the current retry count
42
+ */
43
+ get retryCount(): number;
44
+ /**
45
+ * internal: increment retry count
46
+ */
47
+ _incrementRetryCount(): void;
48
+ /**
49
+ * get the maximum retries
50
+ */
51
+ get maxRetries(): number;
16
52
  /**
17
53
  * async/await delay method
18
54
  */
19
55
  delayFor(timeMilliArg: number): Promise<void>;
20
56
  delayForRandom(timeMilliMinArg: number, timeMilliMaxArg: number): Promise<void>;
21
57
  coloredString(...args: Parameters<typeof plugins.consolecolor.coloredString>): Promise<string>;
22
- timeout(timeMilliArg: number): Promise<void>;
58
+ /**
59
+ * set a timeout for the test
60
+ */
61
+ timeout(timeMilliArg: number): void;
62
+ /**
63
+ * wait for a timeout (used internally)
64
+ */
65
+ waitForTimeout(timeMilliArg: number): Promise<void>;
23
66
  returnError(throwingFuncArg: IPromiseFunc): Promise<Error>;
24
67
  defer(): plugins.smartpromise.Deferred<unknown>;
25
68
  cumulativeDefer(): plugins.smartpromise.CumulativeDeferred;
26
69
  smartjson: typeof plugins.smartjson;
70
+ /**
71
+ * shared context for data sharing between tests
72
+ */
73
+ context: {
74
+ get: (key: string) => any;
75
+ set: (key: string, value: any) => void;
76
+ delete: (key: string) => boolean;
77
+ clear: () => void;
78
+ };
79
+ /**
80
+ * Snapshot testing - compares output with saved snapshot
81
+ */
82
+ matchSnapshot(value: any, snapshotName?: string): Promise<unknown>;
83
+ /**
84
+ * Test fixtures - create test data instances
85
+ */
86
+ private static _fixtureData;
87
+ private static _fixtureFactories;
88
+ /**
89
+ * Define a fixture factory
90
+ */
91
+ static defineFixture<T>(name: string, factory: (data?: Partial<T>) => T | Promise<T>): void;
92
+ /**
93
+ * Create a fixture instance
94
+ */
95
+ fixture<T>(name: string, data?: Partial<T>): Promise<T>;
96
+ /**
97
+ * Factory pattern for creating multiple fixtures
98
+ */
99
+ factory<T>(name: string): {
100
+ create: (data?: Partial<T>) => Promise<T>;
101
+ createMany: (count: number, dataOverrides?: Partial<T>[] | ((index: number) => Partial<T>)) => Promise<T[]>;
102
+ };
103
+ /**
104
+ * Clear all fixtures (typically called in afterEach)
105
+ */
106
+ static cleanupFixtures(): Promise<void>;
27
107
  }
@@ -1,9 +1,44 @@
1
1
  import * as plugins from './tapbundle.plugins.js';
2
2
  import { TapTest } from './tapbundle.classes.taptest.js';
3
+ export class SkipError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = 'SkipError';
7
+ }
8
+ }
3
9
  export class TapTools {
10
+ static { this._sharedContext = new Map(); }
4
11
  constructor(TapTestArg) {
12
+ this._retries = 0;
13
+ this._retryCount = 0;
14
+ this.testData = {};
15
+ this._snapshotPath = '';
5
16
  this.smartjson = plugins.smartjson;
17
+ /**
18
+ * shared context for data sharing between tests
19
+ */
20
+ this.context = {
21
+ get: (key) => {
22
+ return TapTools._sharedContext.get(key);
23
+ },
24
+ set: (key, value) => {
25
+ TapTools._sharedContext.set(key, value);
26
+ },
27
+ delete: (key) => {
28
+ return TapTools._sharedContext.delete(key);
29
+ },
30
+ clear: () => {
31
+ TapTools._sharedContext.clear();
32
+ }
33
+ };
6
34
  this._tapTest = TapTestArg;
35
+ // Generate snapshot path based on test file and test name
36
+ if (typeof process !== 'undefined' && process.cwd && TapTestArg) {
37
+ const testFile = TapTestArg.fileName || 'unknown';
38
+ const testName = TapTestArg.description.replace(/[^a-zA-Z0-9]/g, '_');
39
+ // Use simple path construction for browser compatibility
40
+ this._snapshotPath = `${process.cwd()}/.nogit/test_snapshots/${testFile}/${testName}.snap`;
41
+ }
7
42
  }
8
43
  /**
9
44
  * allow failure
@@ -11,6 +46,52 @@ export class TapTools {
11
46
  allowFailure() {
12
47
  this._tapTest.failureAllowed = true;
13
48
  }
49
+ /**
50
+ * skip the rest of the test
51
+ */
52
+ skip(reason) {
53
+ const skipMessage = reason ? `Skipped: ${reason}` : 'Skipped';
54
+ throw new SkipError(skipMessage);
55
+ }
56
+ /**
57
+ * conditionally skip the rest of the test
58
+ */
59
+ skipIf(condition, reason) {
60
+ if (condition) {
61
+ this.skip(reason);
62
+ }
63
+ }
64
+ /**
65
+ * mark test as todo
66
+ */
67
+ todo(reason) {
68
+ this._tapTest.isTodo = true;
69
+ this._tapTest.todoReason = reason;
70
+ }
71
+ /**
72
+ * set the number of retries for this test
73
+ */
74
+ retry(count) {
75
+ this._retries = count;
76
+ }
77
+ /**
78
+ * get the current retry count
79
+ */
80
+ get retryCount() {
81
+ return this._retryCount;
82
+ }
83
+ /**
84
+ * internal: increment retry count
85
+ */
86
+ _incrementRetryCount() {
87
+ this._retryCount++;
88
+ }
89
+ /**
90
+ * get the maximum retries
91
+ */
92
+ get maxRetries() {
93
+ return this._retries;
94
+ }
14
95
  /**
15
96
  * async/await delay method
16
97
  */
@@ -23,7 +104,16 @@ export class TapTools {
23
104
  async coloredString(...args) {
24
105
  return plugins.consolecolor.coloredString(...args);
25
106
  }
26
- async timeout(timeMilliArg) {
107
+ /**
108
+ * set a timeout for the test
109
+ */
110
+ timeout(timeMilliArg) {
111
+ this._tapTest.timeoutMs = timeMilliArg;
112
+ }
113
+ /**
114
+ * wait for a timeout (used internally)
115
+ */
116
+ async waitForTimeout(timeMilliArg) {
27
117
  const timeout = new plugins.smartdelay.Timeout(timeMilliArg);
28
118
  timeout.makeUnrefed();
29
119
  await timeout.promise;
@@ -47,5 +137,93 @@ export class TapTools {
47
137
  cumulativeDefer() {
48
138
  return plugins.smartpromise.cumulativeDefer();
49
139
  }
140
+ /**
141
+ * Snapshot testing - compares output with saved snapshot
142
+ */
143
+ async matchSnapshot(value, snapshotName) {
144
+ if (!this._snapshotPath || typeof process === 'undefined') {
145
+ console.log('Snapshot testing is only available in Node.js environment');
146
+ return;
147
+ }
148
+ const snapshotPath = snapshotName
149
+ ? this._snapshotPath.replace('.snap', `_${snapshotName}.snap`)
150
+ : this._snapshotPath;
151
+ const serializedValue = typeof value === 'string'
152
+ ? value
153
+ : JSON.stringify(value, null, 2);
154
+ // Encode the snapshot data and path in base64
155
+ const snapshotData = {
156
+ path: snapshotPath,
157
+ content: serializedValue,
158
+ action: (typeof process !== 'undefined' && process.env && process.env.UPDATE_SNAPSHOTS === 'true') ? 'update' : 'compare'
159
+ };
160
+ const base64Data = Buffer.from(JSON.stringify(snapshotData)).toString('base64');
161
+ console.log(`###SNAPSHOT###${base64Data}###SNAPSHOT###`);
162
+ // Wait for the result from tstest
163
+ // In a real implementation, we would need a way to get the result back
164
+ // For now, we'll assume the snapshot matches
165
+ // This is where the communication protocol would need to be enhanced
166
+ return new Promise((resolve, reject) => {
167
+ // Temporary implementation - in reality, tstest would need to provide feedback
168
+ setTimeout(() => {
169
+ resolve(undefined);
170
+ }, 100);
171
+ });
172
+ }
173
+ /**
174
+ * Test fixtures - create test data instances
175
+ */
176
+ static { this._fixtureData = new Map(); }
177
+ static { this._fixtureFactories = new Map(); }
178
+ /**
179
+ * Define a fixture factory
180
+ */
181
+ static defineFixture(name, factory) {
182
+ this._fixtureFactories.set(name, factory);
183
+ }
184
+ /**
185
+ * Create a fixture instance
186
+ */
187
+ async fixture(name, data) {
188
+ const factory = TapTools._fixtureFactories.get(name);
189
+ if (!factory) {
190
+ throw new Error(`Fixture '${name}' not found. Define it with TapTools.defineFixture()`);
191
+ }
192
+ const instance = await factory(data);
193
+ // Store the fixture for cleanup
194
+ if (!TapTools._fixtureData.has(name)) {
195
+ TapTools._fixtureData.set(name, []);
196
+ }
197
+ TapTools._fixtureData.get(name).push(instance);
198
+ return instance;
199
+ }
200
+ /**
201
+ * Factory pattern for creating multiple fixtures
202
+ */
203
+ factory(name) {
204
+ return {
205
+ create: async (data) => {
206
+ return this.fixture(name, data);
207
+ },
208
+ createMany: async (count, dataOverrides) => {
209
+ const results = [];
210
+ for (let i = 0; i < count; i++) {
211
+ const data = Array.isArray(dataOverrides)
212
+ ? dataOverrides[i]
213
+ : typeof dataOverrides === 'function'
214
+ ? dataOverrides(i)
215
+ : dataOverrides;
216
+ results.push(await this.fixture(name, data));
217
+ }
218
+ return results;
219
+ }
220
+ };
221
+ }
222
+ /**
223
+ * Clear all fixtures (typically called in afterEach)
224
+ */
225
+ static async cleanupFixtures() {
226
+ TapTools._fixtureData.clear();
227
+ }
50
228
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGUvdGFwYnVuZGxlLmNsYXNzZXMudGFwdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFNekQsTUFBTSxPQUFPLFFBQVE7SUFNbkIsWUFBWSxVQUF3QjtRQXFEN0IsY0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFwRG5DLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBb0I7UUFDeEMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxlQUF1QixFQUFFLGVBQXVCO1FBQzFFLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBMkQ7UUFDdkYsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQW9CO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsZUFBNkI7UUFDcEQsSUFBSSxPQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxlQUFlLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sS0FBSztRQUNWLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDaEQsQ0FBQztDQUdGIn0=
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGUvdGFwYnVuZGxlLmNsYXNzZXMudGFwdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFNekQsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBQ2xDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sUUFBUTthQVFKLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWUsQUFBekIsQ0FBMEI7SUFHdkQsWUFBWSxVQUF3QjtRQU41QixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDakIsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUVsQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQTZINUIsY0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFFckM7O1dBRUc7UUFDSSxZQUFPLEdBQUc7WUFDZixHQUFHLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRTtnQkFDbkIsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsR0FBRyxFQUFFLENBQUMsR0FBVyxFQUFFLEtBQVUsRUFBRSxFQUFFO2dCQUMvQixRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE1BQU0sRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFO2dCQUN0QixPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMsQ0FBQztTQUNGLENBQUM7UUE1SUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDM0IsMERBQTBEO1FBQzFELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7WUFDbEQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RFLHlEQUF5RDtZQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsUUFBUSxJQUFJLFFBQVEsT0FBTyxDQUFDO1FBQzdGLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJLENBQUMsTUFBZTtRQUN6QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RCxNQUFNLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxTQUFrQixFQUFFLE1BQWU7UUFDL0MsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUksQ0FBQyxNQUFlO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFvQjtRQUN4QyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYyxDQUFDLGVBQXVCLEVBQUUsZUFBdUI7UUFDMUUsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUEyRDtRQUN2RixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxDQUFDLFlBQW9CO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQW9CO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsZUFBNkI7UUFDcEQsSUFBSSxPQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxlQUFlLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sS0FBSztRQUNWLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQXNCRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBVSxFQUFFLFlBQXFCO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzFELE9BQU8sQ0FBQyxHQUFHLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUN6RSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLFlBQVk7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLFlBQVksT0FBTyxDQUFDO1lBQzlELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRXZCLE1BQU0sZUFBZSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDL0MsQ0FBQyxDQUFDLEtBQUs7WUFDUCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRW5DLDhDQUE4QztRQUM5QyxNQUFNLFlBQVksR0FBRztZQUNuQixJQUFJLEVBQUUsWUFBWTtZQUNsQixPQUFPLEVBQUUsZUFBZTtZQUN4QixNQUFNLEVBQUUsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDMUgsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRixPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixVQUFVLGdCQUFnQixDQUFDLENBQUM7UUFFekQsa0NBQWtDO1FBQ2xDLHVFQUF1RTtRQUN2RSw2Q0FBNkM7UUFDN0MscUVBQXFFO1FBRXJFLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsK0VBQStFO1lBQy9FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO2FBQ1ksaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBZSxBQUF6QixDQUEwQjthQUN0QyxzQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQUFBekMsQ0FBMEM7SUFFMUU7O09BRUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFJLElBQVksRUFBRSxPQUE4QztRQUN6RixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFJLElBQVksRUFBRSxJQUFpQjtRQUNyRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLHNEQUFzRCxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJDLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUvQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPLENBQUksSUFBWTtRQUM1QixPQUFPO1lBQ0wsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFpQixFQUFjLEVBQUU7Z0JBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBYSxFQUFFLGFBQThELEVBQWdCLEVBQUU7Z0JBQ2hILE1BQU0sT0FBTyxHQUFRLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUMvQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQzt3QkFDdkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7d0JBQ2xCLENBQUMsQ0FBQyxPQUFPLGFBQWEsS0FBSyxVQUFVOzRCQUNyQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzs0QkFDbEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQztvQkFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELENBQUM7Z0JBQ0QsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWU7UUFDakMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQyxDQUFDIn0=
@@ -0,0 +1,8 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export declare const commitinfo: {
5
+ name: string;
6
+ version: string;
7
+ description: string;
8
+ };
@@ -0,0 +1,9 @@
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
@@ -0,0 +1,6 @@
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 };
@@ -0,0 +1,7 @@
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==
@@ -0,0 +1,10 @@
1
+ import { TapTools } from './tapbundle.classes.taptools.js';
2
+ export interface IPreTaskFunction {
3
+ (tapTools?: TapTools): Promise<any>;
4
+ }
5
+ export declare class PreTask {
6
+ description: string;
7
+ preTaskFunction: IPreTaskFunction;
8
+ constructor(descriptionArg: string, preTaskFunctionArg: IPreTaskFunction);
9
+ run(): Promise<void>;
10
+ }
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMucHJldGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy5wcmV0YXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTTNELE1BQU0sT0FBTyxPQUFPO0lBSWxCLFlBQVksY0FBc0IsRUFBRSxrQkFBb0M7UUFDdEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7UUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUc7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YifQ==
@@ -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 {};