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.
- package/README.md +142 -236
- package/bin/nole.js +43 -44
- package/dist/const.d.ts +8 -0
- package/dist/const.d.ts.map +1 -0
- package/dist/const.js +9 -0
- package/dist/core.d.ts +22 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +56 -0
- package/dist/dynamic.d.ts +4 -1
- package/dist/dynamic.d.ts.map +1 -1
- package/dist/dynamic.js +25 -1
- package/dist/handle/after-each-hooks.d.ts +3 -0
- package/dist/handle/after-each-hooks.d.ts.map +1 -0
- package/dist/handle/after-each-hooks.js +26 -0
- package/dist/handle/after-hooks.d.ts +3 -0
- package/dist/handle/after-hooks.d.ts.map +1 -0
- package/dist/handle/after-hooks.js +24 -0
- package/dist/handle/before-each-hooks.d.ts +3 -0
- package/dist/handle/before-each-hooks.d.ts.map +1 -0
- package/dist/handle/before-each-hooks.js +26 -0
- package/dist/handle/before-hooks.d.ts +3 -0
- package/dist/handle/before-hooks.d.ts.map +1 -0
- package/dist/handle/before-hooks.js +24 -0
- package/dist/handle/cleanup-hooks.d.ts +3 -0
- package/dist/handle/cleanup-hooks.d.ts.map +1 -0
- package/dist/handle/cleanup-hooks.js +34 -0
- package/dist/handle/specs.d.ts +3 -0
- package/dist/handle/specs.d.ts.map +1 -0
- package/dist/handle/specs.js +41 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/run.d.ts +7 -6
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +158 -196
- package/dist/symbol.d.ts +2 -0
- package/dist/symbol.d.ts.map +1 -0
- package/dist/symbol.js +2 -0
- package/dist/test-wrap.d.ts +37 -0
- package/dist/test-wrap.d.ts.map +1 -0
- package/dist/test-wrap.js +30 -0
- package/dist/utils/executor.js +1 -1
- package/dist/utils/executor.test.d.ts +3 -1
- package/dist/utils/executor.test.d.ts.map +1 -1
- package/dist/utils/executor.test.js +3 -30
- package/dist/utils/time_difference.d.ts +9 -0
- package/dist/utils/time_difference.d.ts.map +1 -1
- package/dist/utils/time_difference.js +10 -1
- package/dist/utils/time_difference.test.d.ts +3 -1
- package/dist/utils/time_difference.test.d.ts.map +1 -1
- package/dist/utils/time_difference.test.js +5 -18
- package/dist/utils/time_factor.d.ts.map +1 -1
- package/dist/utils/time_factor.js +2 -3
- package/dist/utils/time_factor.test.d.ts +3 -1
- package/dist/utils/time_factor.test.d.ts.map +1 -1
- package/dist/utils/time_factor.test.js +3 -18
- package/package.json +6 -6
- package/src/const.ts +11 -0
- package/src/core.ts +89 -0
- package/src/dynamic.ts +43 -1
- package/src/handle/after-each-hooks.ts +41 -0
- package/src/handle/after-hooks.ts +38 -0
- package/src/handle/before-each-hooks.ts +40 -0
- package/src/handle/before-hooks.ts +39 -0
- package/src/handle/cleanup-hooks.ts +55 -0
- package/src/handle/specs.ts +68 -0
- package/src/index.ts +3 -13
- package/src/run.ts +184 -256
- package/src/symbol.ts +1 -0
- package/src/{test.ts → test-wrap.ts} +13 -12
- package/src/utils/executor.test.ts +2 -5
- package/src/utils/executor.ts +1 -1
- package/src/utils/time_difference.test.ts +2 -3
- package/src/utils/time_factor.test.ts +2 -3
- package/src/utils/time_factor.ts +1 -3
- package/test/basic.test.ts +8 -9
- package/test/before.test.ts +14 -27
- package/test/clean-up.test.ts +12 -16
- package/test/dynamic-skip.test.ts +2 -4
- package/test/dynamic.test.ts +23 -8
- package/test/extend.test.ts +43 -0
- package/test/hook.test.ts +9 -10
- package/test/multi-dependency.test.ts +25 -27
- package/test/multiple-uppercased-chars.test.ts +8 -7
- package/test/skip-all.test.ts +4 -13
- package/test/turkish-chars.test.ts +8 -7
- package/tsconfig.json +5 -7
- package/dist/data.d.ts +0 -3
- package/dist/data.d.ts.map +0 -1
- package/dist/data.js +0 -9
- package/dist/data.js.map +0 -1
- package/dist/decorators.d.ts +0 -9
- package/dist/decorators.d.ts.map +0 -1
- package/dist/decorators.js +0 -118
- package/dist/decorators.js.map +0 -1
- package/dist/dynamic.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/run.js.map +0 -1
- package/dist/test.d.ts +0 -39
- package/dist/test.d.ts.map +0 -1
- package/dist/test.js +0 -25
- package/dist/test.js.map +0 -1
- package/dist/utils/executor.js.map +0 -1
- package/dist/utils/executor.test.js.map +0 -1
- package/dist/utils/time_difference.js.map +0 -1
- package/dist/utils/time_difference.test.js.map +0 -1
- package/dist/utils/time_factor.js.map +0 -1
- package/dist/utils/time_factor.test.js.map +0 -1
- package/src/data.ts +0 -13
- package/src/decorators.ts +0 -208
|
@@ -1,24 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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":"
|
|
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
|
|
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=
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZV9mYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdGltZV9mYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVksRUFBRSxPQUFlO0lBQ3RELElBQUksSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxJQUFJLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFVO0lBQ3BDLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQUMsRUFBVTtJQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQyJ9
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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": "
|
|
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": "^
|
|
32
|
-
"typescript": "^5.8.2"
|
|
31
|
+
"glob": "^13.0.2"
|
|
33
32
|
},
|
|
34
33
|
"peerDependencies": {
|
|
35
|
-
"
|
|
34
|
+
"tsx": "^4.21.0"
|
|
36
35
|
},
|
|
37
36
|
"devDependencies": {
|
|
38
37
|
"@types/node": "^20.17.25",
|
|
39
38
|
"c8": "^7.11.3",
|
|
40
|
-
"
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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";
|