nole 2.2.2 → 3.0.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 (110) hide show
  1. package/README.md +142 -236
  2. package/bin/nole.js +43 -44
  3. package/dist/const.d.ts +8 -0
  4. package/dist/const.d.ts.map +1 -0
  5. package/dist/const.js +9 -0
  6. package/dist/core.d.ts +22 -0
  7. package/dist/core.d.ts.map +1 -0
  8. package/dist/core.js +56 -0
  9. package/dist/dynamic.d.ts +4 -1
  10. package/dist/dynamic.d.ts.map +1 -1
  11. package/dist/dynamic.js +25 -1
  12. package/dist/handle/after-each-hooks.d.ts +3 -0
  13. package/dist/handle/after-each-hooks.d.ts.map +1 -0
  14. package/dist/handle/after-each-hooks.js +26 -0
  15. package/dist/handle/after-hooks.d.ts +3 -0
  16. package/dist/handle/after-hooks.d.ts.map +1 -0
  17. package/dist/handle/after-hooks.js +24 -0
  18. package/dist/handle/before-each-hooks.d.ts +3 -0
  19. package/dist/handle/before-each-hooks.d.ts.map +1 -0
  20. package/dist/handle/before-each-hooks.js +26 -0
  21. package/dist/handle/before-hooks.d.ts +3 -0
  22. package/dist/handle/before-hooks.d.ts.map +1 -0
  23. package/dist/handle/before-hooks.js +24 -0
  24. package/dist/handle/cleanup-hooks.d.ts +3 -0
  25. package/dist/handle/cleanup-hooks.d.ts.map +1 -0
  26. package/dist/handle/cleanup-hooks.js +34 -0
  27. package/dist/handle/specs.d.ts +3 -0
  28. package/dist/handle/specs.d.ts.map +1 -0
  29. package/dist/handle/specs.js +41 -0
  30. package/dist/index.d.ts +3 -3
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +4 -4
  33. package/dist/run.d.ts +7 -6
  34. package/dist/run.d.ts.map +1 -1
  35. package/dist/run.js +158 -196
  36. package/dist/symbol.d.ts +2 -0
  37. package/dist/symbol.d.ts.map +1 -0
  38. package/dist/symbol.js +2 -0
  39. package/dist/test-wrap.d.ts +37 -0
  40. package/dist/test-wrap.d.ts.map +1 -0
  41. package/dist/test-wrap.js +30 -0
  42. package/dist/utils/executor.js +1 -1
  43. package/dist/utils/executor.test.d.ts +3 -1
  44. package/dist/utils/executor.test.d.ts.map +1 -1
  45. package/dist/utils/executor.test.js +3 -30
  46. package/dist/utils/time_difference.d.ts +9 -0
  47. package/dist/utils/time_difference.d.ts.map +1 -1
  48. package/dist/utils/time_difference.js +10 -1
  49. package/dist/utils/time_difference.test.d.ts +3 -1
  50. package/dist/utils/time_difference.test.d.ts.map +1 -1
  51. package/dist/utils/time_difference.test.js +5 -18
  52. package/dist/utils/time_factor.d.ts.map +1 -1
  53. package/dist/utils/time_factor.js +2 -3
  54. package/dist/utils/time_factor.test.d.ts +3 -1
  55. package/dist/utils/time_factor.test.d.ts.map +1 -1
  56. package/dist/utils/time_factor.test.js +3 -18
  57. package/package.json +6 -6
  58. package/src/const.ts +11 -0
  59. package/src/core.ts +89 -0
  60. package/src/dynamic.ts +43 -1
  61. package/src/handle/after-each-hooks.ts +41 -0
  62. package/src/handle/after-hooks.ts +38 -0
  63. package/src/handle/before-each-hooks.ts +40 -0
  64. package/src/handle/before-hooks.ts +39 -0
  65. package/src/handle/cleanup-hooks.ts +55 -0
  66. package/src/handle/specs.ts +68 -0
  67. package/src/index.ts +3 -13
  68. package/src/run.ts +184 -256
  69. package/src/symbol.ts +1 -0
  70. package/src/{test.ts → test-wrap.ts} +13 -12
  71. package/src/utils/executor.test.ts +2 -5
  72. package/src/utils/executor.ts +1 -1
  73. package/src/utils/time_difference.test.ts +2 -3
  74. package/src/utils/time_factor.test.ts +2 -3
  75. package/src/utils/time_factor.ts +1 -3
  76. package/test/basic.test.ts +8 -9
  77. package/test/before.test.ts +14 -27
  78. package/test/clean-up.test.ts +12 -16
  79. package/test/dynamic-skip.test.ts +2 -4
  80. package/test/dynamic.test.ts +23 -8
  81. package/test/extend.test.ts +43 -0
  82. package/test/hook.test.ts +9 -10
  83. package/test/multi-dependency.test.ts +25 -27
  84. package/test/multiple-uppercased-chars.test.ts +8 -7
  85. package/test/skip-all.test.ts +4 -13
  86. package/test/turkish-chars.test.ts +8 -7
  87. package/tsconfig.json +5 -7
  88. package/dist/data.d.ts +0 -3
  89. package/dist/data.d.ts.map +0 -1
  90. package/dist/data.js +0 -9
  91. package/dist/data.js.map +0 -1
  92. package/dist/decorators.d.ts +0 -9
  93. package/dist/decorators.d.ts.map +0 -1
  94. package/dist/decorators.js +0 -118
  95. package/dist/decorators.js.map +0 -1
  96. package/dist/dynamic.js.map +0 -1
  97. package/dist/index.js.map +0 -1
  98. package/dist/run.js.map +0 -1
  99. package/dist/test.d.ts +0 -39
  100. package/dist/test.d.ts.map +0 -1
  101. package/dist/test.js +0 -25
  102. package/dist/test.js.map +0 -1
  103. package/dist/utils/executor.js.map +0 -1
  104. package/dist/utils/executor.test.js.map +0 -1
  105. package/dist/utils/time_difference.js.map +0 -1
  106. package/dist/utils/time_difference.test.js.map +0 -1
  107. package/dist/utils/time_factor.js.map +0 -1
  108. package/dist/utils/time_factor.test.js.map +0 -1
  109. package/src/data.ts +0 -13
  110. package/src/decorators.ts +0 -208
@@ -1,24 +1,11 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- import { Spec } from "../index.js";
1
+ import * as assert from "assert";
2
+ import { Test } from "../index.js";
3
+ import { Executor } from "./executor.js";
11
4
  import { TimeDifference } from "./time_difference.js";
12
- export class TimeDifferenceTest {
5
+ export class TimeDifferenceTest extends Test() {
13
6
  async evaluate() {
14
7
  const td = TimeDifference.begin();
15
8
  td.end();
16
9
  }
17
10
  }
18
- __decorate([
19
- Spec(),
20
- __metadata("design:type", Function),
21
- __metadata("design:paramtypes", []),
22
- __metadata("design:returntype", Promise)
23
- ], TimeDifferenceTest.prototype, "evaluate", null);
24
- //# sourceMappingURL=time_difference.test.js.map
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZV9kaWZmZXJlbmNlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdGltZV9kaWZmZXJlbmNlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsSUFBSSxFQUFFO0lBQzVDLEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNYLENBQUM7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"time_factor.d.ts","sourceRoot":"","sources":["../../src/utils/time_factor.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAUvD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,UAcrC;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
1
+ {"version":3,"file":"time_factor.d.ts","sourceRoot":"","sources":["../../src/utils/time_factor.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAUvD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,UAcrC;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
@@ -1,5 +1,4 @@
1
- import * as clrs from "colors/safe.js";
2
- const colors = clrs.default;
1
+ import { colors } from "../const.js";
3
2
  export function TimeFactor(diff, timeout) {
4
3
  if (diff < timeout / 5) {
5
4
  return colors.green(TimeResolve(diff).padStart(9, " "));
@@ -24,4 +23,4 @@ export function TimeResolve(ms) {
24
23
  export function Delay(ms) {
25
24
  return new Promise((resolve) => setTimeout(resolve, ms));
26
25
  }
27
- //# sourceMappingURL=time_factor.js.map
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZV9mYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdGltZV9mYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVksRUFBRSxPQUFlO0lBQ3RELElBQUksSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxJQUFJLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFVO0lBQ3BDLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQUMsRUFBVTtJQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQyJ9
@@ -1,4 +1,6 @@
1
- export declare class TimeFactorTest {
1
+ declare const TimeFactorTest_base: new () => {} & import("../core.js").BaseTest;
2
+ export declare class TimeFactorTest extends TimeFactorTest_base {
2
3
  evaluate(): Promise<void>;
3
4
  }
5
+ export {};
4
6
  //# sourceMappingURL=time_factor.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time_factor.test.d.ts","sourceRoot":"","sources":["../../src/utils/time_factor.test.ts"],"names":[],"mappings":"AAGA,qBAAa,cAAc;IAEnB,QAAQ;CAuBf"}
1
+ {"version":3,"file":"time_factor.test.d.ts","sourceRoot":"","sources":["../../src/utils/time_factor.test.ts"],"names":[],"mappings":";AAGA,qBAAa,cAAe,SAAQ,mBAAM;IAClC,QAAQ;CAuBf"}
@@ -1,15 +1,6 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- import { Spec } from "../index.js";
1
+ import { Test } from "../index.js";
11
2
  import { Delay, TimeFactor } from "./time_factor.js";
12
- export class TimeFactorTest {
3
+ export class TimeFactorTest extends Test() {
13
4
  async evaluate() {
14
5
  await Delay(1);
15
6
  for (const n of [
@@ -33,10 +24,4 @@ export class TimeFactorTest {
33
24
  }
34
25
  }
35
26
  }
36
- __decorate([
37
- Spec(),
38
- __metadata("design:type", Function),
39
- __metadata("design:paramtypes", []),
40
- __metadata("design:returntype", Promise)
41
- ], TimeFactorTest.prototype, "evaluate", null);
42
- //# sourceMappingURL=time_factor.test.js.map
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZV9mYWN0b3IudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy90aW1lX2ZhY3Rvci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxNQUFNLE9BQU8sY0FBZSxTQUFRLElBQUksRUFBRTtJQUN4QyxLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWYsS0FBSyxNQUFNLENBQUMsSUFBSTtZQUNkLEdBQUc7WUFDSCxJQUFJO1lBQ0osRUFBRSxHQUFHLElBQUk7WUFDVCxHQUFHLEdBQUcsSUFBSTtZQUNWLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtZQUNkLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtZQUNkLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7U0FDcEIsRUFBRSxDQUFDO1lBQ0YsVUFBVSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEIsVUFBVSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsVUFBVSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQixVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nole",
3
- "version": "2.2.2",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "description": "Testing Library for Typescript projects",
6
6
  "main": "dist/index.js",
@@ -28,16 +28,16 @@
28
28
  "camelcase": "^7.0.0",
29
29
  "colors": "^1.3.3",
30
30
  "commander": "^2.19.0",
31
- "glob": "^7.2.3",
32
- "typescript": "^5.8.2"
31
+ "glob": "^13.0.2"
33
32
  },
34
33
  "peerDependencies": {
35
- "ts-node": "^10.9.2"
34
+ "tsx": "^4.21.0"
36
35
  },
37
36
  "devDependencies": {
38
37
  "@types/node": "^20.17.25",
39
38
  "c8": "^7.11.3",
40
- "ts-node": "^10.9.2"
39
+ "tsx": "^4.21.0",
40
+ "typescript": "^5.9.3"
41
41
  },
42
42
  "c8": {
43
43
  "all": true,
@@ -55,4 +55,4 @@
55
55
  "**/*.test.ts"
56
56
  ]
57
57
  }
58
- }
58
+ }
package/src/const.ts ADDED
@@ -0,0 +1,11 @@
1
+ import * as clrs from "colors/safe.js";
2
+
3
+ export const colors = (clrs as any).default;
4
+
5
+ export const OK_TEXT = colors.bold(colors.green(" (ok) "));
6
+ export const SKIP_TEXT = colors.bold(colors.yellow(" (skip) "));
7
+ export const DYNAMIC_SKIP_TEXT = colors.bold(colors.blue(" (dskip) "));
8
+ export const FAILED_TEXT = colors.bold(colors.red(" (failed) "));
9
+ export const HOOK_FAILED_TEXT = colors.bold(colors.red(" (hook failed) "));
10
+
11
+ export const DEFAULT_TIMEOUT = 5000;
package/src/core.ts ADDED
@@ -0,0 +1,89 @@
1
+ import { TEST_CLASS_KEY } from "./symbol.js";
2
+
3
+ export interface TestClassInfo {
4
+ dependencies?: Map<string, () => new () => BaseTest>;
5
+ skip?: string;
6
+ before?: () => Array<new () => BaseTest>;
7
+ after?: () => Array<new () => BaseTest>;
8
+ timeout?: number;
9
+ }
10
+
11
+ export class BaseTest {
12
+ static [TEST_CLASS_KEY]: TestClassInfo = {
13
+ dependencies: new Map(),
14
+ timeout: 5000,
15
+ };
16
+ }
17
+
18
+ type DependencyDefinitionRule<T extends BaseTest> = () => new () => T;
19
+ type InferDependencyDefinition<T> = T extends () => infer U ? U : never;
20
+
21
+ export function Test<
22
+ Deps extends Record<string, DependencyDefinitionRule<any>> = {},
23
+ >({
24
+ dependencies,
25
+ skip,
26
+ before,
27
+ after,
28
+ timeout,
29
+ }: {
30
+ dependencies?: Deps;
31
+ skip?: string;
32
+ before?: () => Array<new () => BaseTest>;
33
+ after?: () => Array<new () => BaseTest>;
34
+ timeout?: number;
35
+ } = {}) {
36
+ type Props = {
37
+ [K in keyof Deps]: InstanceType<InferDependencyDefinition<Deps[K]>>;
38
+ };
39
+
40
+ function wrap(superClassInfo: TestClassInfo): TestClassInfo {
41
+ const deps = dependencies ? dependencies : ({} as Deps);
42
+
43
+ const classInfo = { ...superClassInfo };
44
+
45
+ if (!classInfo.dependencies) {
46
+ classInfo.dependencies = new Map();
47
+ } else {
48
+ classInfo.dependencies = new Map(classInfo.dependencies);
49
+ }
50
+
51
+ if (before !== undefined) {
52
+ classInfo.before = before;
53
+ }
54
+
55
+ if (after !== undefined) {
56
+ classInfo.after = after;
57
+ }
58
+
59
+ for (const key of Object.keys(deps)) {
60
+ const config = deps[key];
61
+
62
+ if (TEST_CLASS_KEY in config) {
63
+ classInfo.dependencies.set(key, (() => config) as any);
64
+ } else if (typeof config === "function") {
65
+ classInfo.dependencies.set(key, config);
66
+ } else {
67
+ throw new Error(`Invalid dependency configuration for key ${key}`);
68
+ }
69
+ }
70
+
71
+ if (skip !== undefined) {
72
+ classInfo.skip = skip;
73
+ }
74
+
75
+ if (timeout !== undefined) {
76
+ classInfo.timeout = timeout;
77
+ }
78
+
79
+ return classInfo;
80
+ }
81
+
82
+ return class extends BaseTest {
83
+ static [TEST_CLASS_KEY]: TestClassInfo = wrap(super[TEST_CLASS_KEY]);
84
+
85
+ constructor() {
86
+ super();
87
+ }
88
+ } as unknown as new () => Props & BaseTest;
89
+ }
package/src/dynamic.ts CHANGED
@@ -1,4 +1,13 @@
1
- export function skipTest(reason?: string) {
1
+ import { BaseTest } from "./core.js";
2
+ import {
3
+ createInstanceIfNotExists,
4
+ getFutureTestMap,
5
+ getTestMap,
6
+ updateInformationForClass,
7
+ } from "./run.js";
8
+ import { TestWrap } from "./test-wrap.js";
9
+
10
+ export function skipTest(reason?: string): never {
2
11
  throw new NoleManualSkip(reason);
3
12
  }
4
13
 
@@ -9,3 +18,36 @@ class NoleManualSkip extends Error {
9
18
  super(`Dynamicly skipped! ${reason}`);
10
19
  }
11
20
  }
21
+
22
+ export function getTest<T extends BaseTest>(
23
+ test: () => new () => T,
24
+ ): Partial<T> | null {
25
+ const testWrap = getTestMap().get(test() as any) as TestWrap | undefined;
26
+
27
+ if (!testWrap) {
28
+ return null;
29
+ }
30
+
31
+ createInstanceIfNotExists(testWrap);
32
+
33
+ return testWrap.testInstance;
34
+ }
35
+
36
+ export function addTest<T extends BaseTest>(test: () => new () => T) {
37
+ const testMap = getTestMap();
38
+ const remainingTests = getFutureTestMap();
39
+
40
+ const testClass = test();
41
+
42
+ if (testMap.has(testClass)) {
43
+ return false;
44
+ }
45
+
46
+ const testWrap = new TestWrap(testClass);
47
+ remainingTests.set(testClass, testWrap);
48
+ testMap.set(testClass, testWrap);
49
+
50
+ updateInformationForClass(testClass, testWrap, testMap);
51
+
52
+ return true;
53
+ }
@@ -0,0 +1,41 @@
1
+ import { HookType, TestWrap } from "../test-wrap.js";
2
+ import { Executor } from "../utils/executor.js";
3
+ import { TimeFactor } from "../utils/time_factor.js";
4
+ import {
5
+ colors,
6
+ DEFAULT_TIMEOUT,
7
+ HOOK_FAILED_TEXT,
8
+ OK_TEXT,
9
+ } from "../const.js";
10
+
11
+ export async function handleAfterEachHooks(test: TestWrap) {
12
+ const timeout = test.config.timeout ?? DEFAULT_TIMEOUT;
13
+
14
+ for (let [propertyKey, hook] of test.hooks.entries()) {
15
+ if (hook.type != HookType.AfterEach) continue;
16
+
17
+ let hookName = colors.bold(
18
+ colors.yellow(
19
+ test.name +
20
+ (propertyKey != "afterEach"
21
+ ? `.${propertyKey}:afterEach`
22
+ : ":afterEach"),
23
+ ),
24
+ );
25
+
26
+ try {
27
+ await Executor(
28
+ test.testInstance[propertyKey].bind(test.testInstance),
29
+ timeout,
30
+ );
31
+
32
+ let timeText = TimeFactor(0, timeout);
33
+
34
+ console.log(`${OK_TEXT} ${timeText} ${hookName}()`);
35
+ } catch (e) {
36
+ console.error(`${HOOK_FAILED_TEXT} ${hookName}()`);
37
+ console.error((e as any)?.stack ?? e);
38
+ throw e;
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,38 @@
1
+ import { HookType, TestWrap } from "../test-wrap.js";
2
+ import { Executor } from "../utils/executor.js";
3
+ import { TimeFactor } from "../utils/time_factor.js";
4
+ import {
5
+ colors,
6
+ DEFAULT_TIMEOUT,
7
+ HOOK_FAILED_TEXT,
8
+ OK_TEXT,
9
+ } from "../const.js";
10
+
11
+ export async function handleAfterHooks(test: TestWrap) {
12
+ const timeout = test.config.timeout ?? DEFAULT_TIMEOUT;
13
+
14
+ for (let [propertyKey, hook] of test.hooks.entries()) {
15
+ if (hook.type != HookType.After) continue;
16
+
17
+ let hookName = colors.bold(
18
+ colors.yellow(
19
+ test.name +
20
+ (propertyKey != "after" ? `.${propertyKey}:after` : ":after"),
21
+ ),
22
+ );
23
+
24
+ try {
25
+ await Executor(
26
+ test.testInstance[propertyKey].bind(test.testInstance),
27
+ timeout,
28
+ );
29
+ let timeText = TimeFactor(0, timeout);
30
+
31
+ console.log(`${OK_TEXT} ${timeText} ${hookName}()`);
32
+ } catch (e) {
33
+ console.error(`${HOOK_FAILED_TEXT} ${hookName}()`);
34
+ console.error((e as any)?.stack ?? e);
35
+ throw e;
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,40 @@
1
+ import { HookType, TestWrap } from "../test-wrap.js";
2
+ import { Executor } from "../utils/executor.js";
3
+ import { TimeFactor } from "../utils/time_factor.js";
4
+ import {
5
+ colors,
6
+ DEFAULT_TIMEOUT,
7
+ HOOK_FAILED_TEXT,
8
+ OK_TEXT,
9
+ } from "../const.js";
10
+
11
+ export async function handleBeforeEachHooks(test: TestWrap) {
12
+ const timeout = test.config.timeout ?? DEFAULT_TIMEOUT;
13
+
14
+ for (let [propertyKey, hook] of test.hooks.entries()) {
15
+ if (hook.type != HookType.BeforeEach) continue;
16
+ let hookName = colors.bold(
17
+ colors.yellow(
18
+ test.name +
19
+ (propertyKey != "beforeEach"
20
+ ? `.${propertyKey}:beforeEach`
21
+ : ":beforeEach"),
22
+ ),
23
+ );
24
+
25
+ try {
26
+ await Executor(
27
+ test.testInstance[propertyKey].bind(test.testInstance),
28
+ timeout,
29
+ );
30
+
31
+ let timeText = TimeFactor(0, timeout);
32
+
33
+ console.log(`${OK_TEXT} ${timeText} ${hookName}()`);
34
+ } catch (e) {
35
+ console.error(`${HOOK_FAILED_TEXT} ${hookName}()`);
36
+ console.error((e as any)?.stack ?? e);
37
+ throw e;
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,39 @@
1
+ import { HookType, TestWrap } from "../test-wrap.js";
2
+ import { Executor } from "../utils/executor.js";
3
+ import { TimeFactor } from "../utils/time_factor.js";
4
+ import {
5
+ colors,
6
+ DEFAULT_TIMEOUT,
7
+ HOOK_FAILED_TEXT,
8
+ OK_TEXT,
9
+ } from "../const.js";
10
+
11
+ export async function handleBeforeHooks(test: TestWrap) {
12
+ const timeout = test.config.timeout ?? DEFAULT_TIMEOUT;
13
+
14
+ for (let [propertyKey, hook] of test.hooks.entries()) {
15
+ if (hook.type != HookType.Before) continue;
16
+
17
+ let hookName = colors.bold(
18
+ colors.yellow(
19
+ test.name +
20
+ (propertyKey != "before" ? `.${propertyKey}:before` : ":before"),
21
+ ),
22
+ );
23
+
24
+ try {
25
+ await Executor(
26
+ test.testInstance[propertyKey].bind(test.testInstance),
27
+ timeout,
28
+ );
29
+
30
+ let timeText = TimeFactor(0, timeout);
31
+
32
+ console.log(`${OK_TEXT} ${timeText} ${hookName}()`);
33
+ } catch (e) {
34
+ console.error(`${HOOK_FAILED_TEXT} ${hookName}()`);
35
+ console.error((e as any)?.stack ?? e);
36
+ throw e;
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,55 @@
1
+ import { HookType, TestWrap } from "../test-wrap.js";
2
+ import { Executor } from "../utils/executor.js";
3
+ import { TimeDifference } from "../utils/time_difference.js";
4
+ import { TimeFactor } from "../utils/time_factor.js";
5
+ import {
6
+ colors,
7
+ DEFAULT_TIMEOUT,
8
+ HOOK_FAILED_TEXT,
9
+ OK_TEXT,
10
+ } from "../const.js";
11
+
12
+ export async function handleCleanUp(test: TestWrap) {
13
+ const timeout = test.config.timeout ?? DEFAULT_TIMEOUT;
14
+
15
+ if (test.cleanUpCalled) return;
16
+ if (
17
+ !test.dependents.every(
18
+ (dependent) => dependent.isFinished && dependent.cleanUpCalled,
19
+ )
20
+ )
21
+ return;
22
+
23
+ test.cleanUpCalled = true;
24
+
25
+ for (let [propertyKey, hook] of test.hooks.entries()) {
26
+ if (hook.type != HookType.CleanUp) continue;
27
+
28
+ let hookName = colors.bold(
29
+ colors.yellow(
30
+ test.name +
31
+ (propertyKey != "cleanUp" ? `.${propertyKey}:cleanUp` : ":cleanUp"),
32
+ ),
33
+ );
34
+ let start = TimeDifference.begin();
35
+
36
+ try {
37
+ await Executor(
38
+ test.testInstance[propertyKey].bind(test.testInstance),
39
+ timeout,
40
+ );
41
+
42
+ let timeText = TimeFactor(start.end(), timeout);
43
+
44
+ console.log(`${OK_TEXT} ${timeText} ${hookName}()`);
45
+ } catch (e) {
46
+ console.error(`${HOOK_FAILED_TEXT} ${hookName}()`);
47
+ console.error((e as any)?.stack ?? e);
48
+ throw e;
49
+ }
50
+ }
51
+
52
+ for (let tree of test.dependencies) {
53
+ await handleCleanUp(tree.dependency);
54
+ }
55
+ }
@@ -0,0 +1,68 @@
1
+ import { HookType, TestWrap } from "../test-wrap.js";
2
+ import { Executor } from "../utils/executor.js";
3
+ import { TimeDifference } from "../utils/time_difference.js";
4
+ import { TimeFactor } from "../utils/time_factor.js";
5
+ import { handleAfterEachHooks } from "./after-each-hooks.js";
6
+ import { handleBeforeEachHooks } from "./before-each-hooks.js";
7
+ import {
8
+ colors,
9
+ DEFAULT_TIMEOUT,
10
+ DYNAMIC_SKIP_TEXT,
11
+ FAILED_TEXT,
12
+ OK_TEXT,
13
+ SKIP_TEXT,
14
+ } from "../const.js";
15
+
16
+ export async function handleSpecs(test: TestWrap) {
17
+ const timeout = test.config.timeout ?? DEFAULT_TIMEOUT;
18
+
19
+ for (let [propertyKey, spec] of test.specs.entries()) {
20
+ let testName = colors.bold(colors.yellow(test.name + "." + propertyKey));
21
+
22
+ const shouldPropertySkip = test.skip.has(propertyKey);
23
+ if (shouldPropertySkip || test.skipClass) {
24
+ let reason = shouldPropertySkip
25
+ ? test.skip.get(propertyKey)!.reason
26
+ : test.skipClass!.reason;
27
+ console.log(
28
+ `${SKIP_TEXT} ${" ".repeat(9)} ${testName}() ${
29
+ reason ? "{" + reason + "}" : ""
30
+ }`,
31
+ );
32
+ continue;
33
+ }
34
+
35
+ await handleBeforeEachHooks(test);
36
+
37
+ let start = TimeDifference.begin();
38
+
39
+ try {
40
+ await Executor(
41
+ test.testInstance[propertyKey].bind(test.testInstance),
42
+ timeout,
43
+ );
44
+
45
+ let timeText = TimeFactor(start.end(), timeout);
46
+
47
+ console.log(`${OK_TEXT} ${timeText} ${testName}()`);
48
+ } catch (e) {
49
+ if ((e as any)?._nole_anchor) {
50
+ let reason = (e as any).reason;
51
+ console.log(
52
+ `${DYNAMIC_SKIP_TEXT} ${" ".repeat(8)} ${testName}() ${
53
+ reason ? "{" + reason + "}" : ""
54
+ }`,
55
+ );
56
+ continue;
57
+ }
58
+
59
+ let timeText = TimeFactor(start.end(), timeout);
60
+
61
+ console.error(`${FAILED_TEXT} ${timeText} ${testName}()`);
62
+ console.error((e as any)?.stack ?? e);
63
+ throw e;
64
+ }
65
+
66
+ await handleAfterEachHooks(test);
67
+ }
68
+ }
package/src/index.ts CHANGED
@@ -1,13 +1,3 @@
1
- export {
2
- Dependency,
3
- Spec,
4
- Hook,
5
- Skip,
6
- SkipClass,
7
- Dependencies,
8
- Dependencies as After,
9
- Dependents as Before,
10
- Dependents,
11
- } from "./decorators.js";
12
- export { HookType } from "./test.js";
13
- export { skipTest } from "./dynamic.js";
1
+ export { HookType } from "./test-wrap.js";
2
+ export { Test } from "./core.js";
3
+ export { skipTest, getTest, addTest } from "./dynamic.js";