@ricsam/quickjs-test-environment 0.0.1 → 0.2.1
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 +73 -43
- package/dist/cjs/describe.cjs +180 -0
- package/dist/cjs/describe.cjs.map +10 -0
- package/dist/cjs/expect.cjs +622 -0
- package/dist/cjs/expect.cjs.map +10 -0
- package/dist/cjs/handle.cjs +79 -0
- package/dist/cjs/handle.cjs.map +10 -0
- package/dist/cjs/hooks.cjs +83 -0
- package/dist/cjs/hooks.cjs.map +10 -0
- package/dist/cjs/index.cjs +39 -0
- package/dist/cjs/index.cjs.map +10 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/runner.cjs +346 -0
- package/dist/cjs/runner.cjs.map +10 -0
- package/dist/cjs/setup.cjs +70 -0
- package/dist/cjs/setup.cjs.map +10 -0
- package/dist/cjs/types.cjs +26 -0
- package/dist/cjs/types.cjs.map +9 -0
- package/dist/mjs/describe.mjs +149 -0
- package/dist/mjs/describe.mjs.map +10 -0
- package/dist/mjs/expect.mjs +591 -0
- package/dist/mjs/expect.mjs.map +10 -0
- package/dist/mjs/handle.mjs +48 -0
- package/dist/mjs/handle.mjs.map +10 -0
- package/dist/mjs/hooks.mjs +52 -0
- package/dist/mjs/hooks.mjs.map +10 -0
- package/dist/mjs/index.mjs +8 -0
- package/dist/mjs/index.mjs.map +10 -0
- package/dist/mjs/package.json +5 -0
- package/dist/mjs/runner.mjs +315 -0
- package/dist/mjs/runner.mjs.map +10 -0
- package/dist/mjs/setup.mjs +39 -0
- package/dist/mjs/setup.mjs.map +10 -0
- package/dist/mjs/types.mjs +3 -0
- package/dist/mjs/types.mjs.map +9 -0
- package/dist/types/globals/describe.d.ts +5 -0
- package/dist/types/globals/expect.d.ts +3 -0
- package/dist/types/globals/hooks.d.ts +3 -0
- package/dist/types/handle.d.ts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/runner.d.ts +5 -0
- package/dist/types/setup.d.ts +3 -0
- package/dist/types/types.d.ts +95 -0
- package/package.json +49 -6
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// @bun @bun-cjs
|
|
2
|
+
(function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
7
|
+
var __toCommonJS = (from) => {
|
|
8
|
+
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
if (entry)
|
|
10
|
+
return entry;
|
|
11
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
13
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
14
|
+
get: () => from[key],
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
}));
|
|
17
|
+
__moduleCache.set(from, entry);
|
|
18
|
+
return entry;
|
|
19
|
+
};
|
|
20
|
+
var __export = (target, all) => {
|
|
21
|
+
for (var name in all)
|
|
22
|
+
__defProp(target, name, {
|
|
23
|
+
get: all[name],
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
set: (newValue) => all[name] = () => newValue
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// packages/test-environment/src/handle.ts
|
|
31
|
+
var exports_handle = {};
|
|
32
|
+
__export(exports_handle, {
|
|
33
|
+
createTestEnvironmentHandle: () => createTestEnvironmentHandle
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(exports_handle);
|
|
36
|
+
var import_runner = require("./runner.ts");
|
|
37
|
+
function createTestEnvironmentHandle(state) {
|
|
38
|
+
return {
|
|
39
|
+
get stateMap() {
|
|
40
|
+
return state.stateMap;
|
|
41
|
+
},
|
|
42
|
+
async run() {
|
|
43
|
+
return import_runner.runTests(state);
|
|
44
|
+
},
|
|
45
|
+
hasTests() {
|
|
46
|
+
return state.suites.some((suite) => suite.tests.length > 0 || suite.children.length > 0);
|
|
47
|
+
},
|
|
48
|
+
getTestCount() {
|
|
49
|
+
let count = 0;
|
|
50
|
+
const countSuite = (suite) => {
|
|
51
|
+
count += suite.tests.length;
|
|
52
|
+
suite.children.forEach(countSuite);
|
|
53
|
+
};
|
|
54
|
+
state.suites.forEach(countSuite);
|
|
55
|
+
return count;
|
|
56
|
+
},
|
|
57
|
+
reset() {
|
|
58
|
+
const disposeSuite = (suite) => {
|
|
59
|
+
suite.tests.forEach((test) => test.fn.dispose());
|
|
60
|
+
suite.beforeAll.forEach((fn) => fn.dispose());
|
|
61
|
+
suite.afterAll.forEach((fn) => fn.dispose());
|
|
62
|
+
suite.beforeEach.forEach((fn) => fn.dispose());
|
|
63
|
+
suite.afterEach.forEach((fn) => fn.dispose());
|
|
64
|
+
suite.children.forEach(disposeSuite);
|
|
65
|
+
};
|
|
66
|
+
state.suites.forEach(disposeSuite);
|
|
67
|
+
state.suites = [];
|
|
68
|
+
state.currentSuite = null;
|
|
69
|
+
},
|
|
70
|
+
dispose() {
|
|
71
|
+
this.reset();
|
|
72
|
+
state.handles.forEach((handle) => handle.dispose());
|
|
73
|
+
state.handles = [];
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
//# debugId=CD29C4A7C662745A64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/handle.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { TestEnvironmentHandle, TestState, RunResults } from \"./types.ts\";\nimport { runTests } from \"./runner.ts\";\n\nexport function createTestEnvironmentHandle(state: TestState): TestEnvironmentHandle {\n return {\n get stateMap() {\n return state.stateMap;\n },\n\n async run(): Promise<RunResults> {\n return runTests(state);\n },\n\n hasTests(): boolean {\n return state.suites.some(suite =>\n suite.tests.length > 0 || suite.children.length > 0\n );\n },\n\n getTestCount(): number {\n let count = 0;\n const countSuite = (suite: typeof state.suites[0]) => {\n count += suite.tests.length;\n suite.children.forEach(countSuite);\n };\n state.suites.forEach(countSuite);\n return count;\n },\n\n reset(): void {\n // Dispose test function handles\n const disposeSuite = (suite: typeof state.suites[0]) => {\n suite.tests.forEach(test => test.fn.dispose());\n suite.beforeAll.forEach(fn => fn.dispose());\n suite.afterAll.forEach(fn => fn.dispose());\n suite.beforeEach.forEach(fn => fn.dispose());\n suite.afterEach.forEach(fn => fn.dispose());\n suite.children.forEach(disposeSuite);\n };\n state.suites.forEach(disposeSuite);\n\n state.suites = [];\n state.currentSuite = null;\n },\n\n dispose(): void {\n this.reset();\n // Dispose global function handles\n state.handles.forEach(handle => handle.dispose());\n state.handles = [];\n },\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACyB,IAAzB;AAEO,SAAS,2BAA2B,CAAC,OAAyC;AAAA,EACnF,OAAO;AAAA,QACD,QAAQ,GAAG;AAAA,MACb,OAAO,MAAM;AAAA;AAAA,SAGT,IAAG,GAAwB;AAAA,MAC/B,OAAO,uBAAS,KAAK;AAAA;AAAA,IAGvB,QAAQ,GAAY;AAAA,MAClB,OAAO,MAAM,OAAO,KAAK,WACvB,MAAM,MAAM,SAAS,KAAK,MAAM,SAAS,SAAS,CACpD;AAAA;AAAA,IAGF,YAAY,GAAW;AAAA,MACrB,IAAI,QAAQ;AAAA,MACZ,MAAM,aAAa,CAAC,UAAkC;AAAA,QACpD,SAAS,MAAM,MAAM;AAAA,QACrB,MAAM,SAAS,QAAQ,UAAU;AAAA;AAAA,MAEnC,MAAM,OAAO,QAAQ,UAAU;AAAA,MAC/B,OAAO;AAAA;AAAA,IAGT,KAAK,GAAS;AAAA,MAEZ,MAAM,eAAe,CAAC,UAAkC;AAAA,QACtD,MAAM,MAAM,QAAQ,UAAQ,KAAK,GAAG,QAAQ,CAAC;AAAA,QAC7C,MAAM,UAAU,QAAQ,QAAM,GAAG,QAAQ,CAAC;AAAA,QAC1C,MAAM,SAAS,QAAQ,QAAM,GAAG,QAAQ,CAAC;AAAA,QACzC,MAAM,WAAW,QAAQ,QAAM,GAAG,QAAQ,CAAC;AAAA,QAC3C,MAAM,UAAU,QAAQ,QAAM,GAAG,QAAQ,CAAC;AAAA,QAC1C,MAAM,SAAS,QAAQ,YAAY;AAAA;AAAA,MAErC,MAAM,OAAO,QAAQ,YAAY;AAAA,MAEjC,MAAM,SAAS,CAAC;AAAA,MAChB,MAAM,eAAe;AAAA;AAAA,IAGvB,OAAO,GAAS;AAAA,MACd,KAAK,MAAM;AAAA,MAEX,MAAM,QAAQ,QAAQ,YAAU,OAAO,QAAQ,CAAC;AAAA,MAChD,MAAM,UAAU,CAAC;AAAA;AAAA,EAErB;AAAA;",
|
|
8
|
+
"debugId": "CD29C4A7C662745A64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// @bun @bun-cjs
|
|
2
|
+
(function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
7
|
+
var __toCommonJS = (from) => {
|
|
8
|
+
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
if (entry)
|
|
10
|
+
return entry;
|
|
11
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
13
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
14
|
+
get: () => from[key],
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
}));
|
|
17
|
+
__moduleCache.set(from, entry);
|
|
18
|
+
return entry;
|
|
19
|
+
};
|
|
20
|
+
var __export = (target, all) => {
|
|
21
|
+
for (var name in all)
|
|
22
|
+
__defProp(target, name, {
|
|
23
|
+
get: all[name],
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
set: (newValue) => all[name] = () => newValue
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// packages/test-environment/src/globals/hooks.ts
|
|
31
|
+
var exports_hooks = {};
|
|
32
|
+
__export(exports_hooks, {
|
|
33
|
+
setupHooks: () => setupHooks
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(exports_hooks);
|
|
36
|
+
var import_describe = require("./describe.ts");
|
|
37
|
+
function ensureSuite(state) {
|
|
38
|
+
if (!state.currentSuite) {
|
|
39
|
+
const rootSuite = import_describe.createSuite("(root)", null);
|
|
40
|
+
state.suites.push(rootSuite);
|
|
41
|
+
state.currentSuite = rootSuite;
|
|
42
|
+
}
|
|
43
|
+
return state.currentSuite;
|
|
44
|
+
}
|
|
45
|
+
function setupHooks(context, state) {
|
|
46
|
+
const handles = [];
|
|
47
|
+
const beforeAllFn = context.newFunction("beforeAll", (fnHandle) => {
|
|
48
|
+
const suite = ensureSuite(state);
|
|
49
|
+
const fnDup = fnHandle.dup();
|
|
50
|
+
suite.beforeAll.push(fnDup);
|
|
51
|
+
return context.undefined;
|
|
52
|
+
});
|
|
53
|
+
context.setProp(context.global, "beforeAll", beforeAllFn);
|
|
54
|
+
handles.push(beforeAllFn);
|
|
55
|
+
const afterAllFn = context.newFunction("afterAll", (fnHandle) => {
|
|
56
|
+
const suite = ensureSuite(state);
|
|
57
|
+
const fnDup = fnHandle.dup();
|
|
58
|
+
suite.afterAll.push(fnDup);
|
|
59
|
+
return context.undefined;
|
|
60
|
+
});
|
|
61
|
+
context.setProp(context.global, "afterAll", afterAllFn);
|
|
62
|
+
handles.push(afterAllFn);
|
|
63
|
+
const beforeEachFn = context.newFunction("beforeEach", (fnHandle) => {
|
|
64
|
+
const suite = ensureSuite(state);
|
|
65
|
+
const fnDup = fnHandle.dup();
|
|
66
|
+
suite.beforeEach.push(fnDup);
|
|
67
|
+
return context.undefined;
|
|
68
|
+
});
|
|
69
|
+
context.setProp(context.global, "beforeEach", beforeEachFn);
|
|
70
|
+
handles.push(beforeEachFn);
|
|
71
|
+
const afterEachFn = context.newFunction("afterEach", (fnHandle) => {
|
|
72
|
+
const suite = ensureSuite(state);
|
|
73
|
+
const fnDup = fnHandle.dup();
|
|
74
|
+
suite.afterEach.push(fnDup);
|
|
75
|
+
return context.undefined;
|
|
76
|
+
});
|
|
77
|
+
context.setProp(context.global, "afterEach", afterEachFn);
|
|
78
|
+
handles.push(afterEachFn);
|
|
79
|
+
return handles;
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
//# debugId=5354281E8C85363564756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/globals/hooks.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { TestState, RegisteredSuite } from \"../types.ts\";\nimport { createSuite } from \"./describe.ts\";\n\n/**\n * Helper to ensure we have a current suite for hook registration.\n * Creates an implicit root suite if called at top level.\n */\nfunction ensureSuite(state: TestState): RegisteredSuite {\n if (!state.currentSuite) {\n // Create implicit root suite for top-level hooks\n const rootSuite = createSuite(\"(root)\", null);\n state.suites.push(rootSuite);\n state.currentSuite = rootSuite;\n }\n return state.currentSuite;\n}\n\nexport function setupHooks(\n context: QuickJSContext,\n state: TestState\n): QuickJSHandle[] {\n const handles: QuickJSHandle[] = [];\n\n // beforeAll - runs once before all tests in the suite\n const beforeAllFn = context.newFunction(\"beforeAll\", (fnHandle) => {\n const suite = ensureSuite(state);\n const fnDup = fnHandle.dup();\n suite.beforeAll.push(fnDup);\n return context.undefined;\n });\n context.setProp(context.global, \"beforeAll\", beforeAllFn);\n handles.push(beforeAllFn);\n\n // afterAll - runs once after all tests in the suite\n const afterAllFn = context.newFunction(\"afterAll\", (fnHandle) => {\n const suite = ensureSuite(state);\n const fnDup = fnHandle.dup();\n suite.afterAll.push(fnDup);\n return context.undefined;\n });\n context.setProp(context.global, \"afterAll\", afterAllFn);\n handles.push(afterAllFn);\n\n // beforeEach - runs before each test in the suite and nested suites\n const beforeEachFn = context.newFunction(\"beforeEach\", (fnHandle) => {\n const suite = ensureSuite(state);\n const fnDup = fnHandle.dup();\n suite.beforeEach.push(fnDup);\n return context.undefined;\n });\n context.setProp(context.global, \"beforeEach\", beforeEachFn);\n handles.push(beforeEachFn);\n\n // afterEach - runs after each test in the suite and nested suites\n const afterEachFn = context.newFunction(\"afterEach\", (fnHandle) => {\n const suite = ensureSuite(state);\n const fnDup = fnHandle.dup();\n suite.afterEach.push(fnDup);\n return context.undefined;\n });\n context.setProp(context.global, \"afterEach\", afterEachFn);\n handles.push(afterEachFn);\n\n return handles;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE4B,IAA5B;AAMA,SAAS,WAAW,CAAC,OAAmC;AAAA,EACtD,IAAI,CAAC,MAAM,cAAc;AAAA,IAEvB,MAAM,YAAY,4BAAY,UAAU,IAAI;AAAA,IAC5C,MAAM,OAAO,KAAK,SAAS;AAAA,IAC3B,MAAM,eAAe;AAAA,EACvB;AAAA,EACA,OAAO,MAAM;AAAA;AAGR,SAAS,UAAU,CACxB,SACA,OACiB;AAAA,EACjB,MAAM,UAA2B,CAAC;AAAA,EAGlC,MAAM,cAAc,QAAQ,YAAY,aAAa,CAAC,aAAa;AAAA,IACjE,MAAM,QAAQ,YAAY,KAAK;AAAA,IAC/B,MAAM,QAAQ,SAAS,IAAI;AAAA,IAC3B,MAAM,UAAU,KAAK,KAAK;AAAA,IAC1B,OAAO,QAAQ;AAAA,GAChB;AAAA,EACD,QAAQ,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AAAA,EACxD,QAAQ,KAAK,WAAW;AAAA,EAGxB,MAAM,aAAa,QAAQ,YAAY,YAAY,CAAC,aAAa;AAAA,IAC/D,MAAM,QAAQ,YAAY,KAAK;AAAA,IAC/B,MAAM,QAAQ,SAAS,IAAI;AAAA,IAC3B,MAAM,SAAS,KAAK,KAAK;AAAA,IACzB,OAAO,QAAQ;AAAA,GAChB;AAAA,EACD,QAAQ,QAAQ,QAAQ,QAAQ,YAAY,UAAU;AAAA,EACtD,QAAQ,KAAK,UAAU;AAAA,EAGvB,MAAM,eAAe,QAAQ,YAAY,cAAc,CAAC,aAAa;AAAA,IACnE,MAAM,QAAQ,YAAY,KAAK;AAAA,IAC/B,MAAM,QAAQ,SAAS,IAAI;AAAA,IAC3B,MAAM,WAAW,KAAK,KAAK;AAAA,IAC3B,OAAO,QAAQ;AAAA,GAChB;AAAA,EACD,QAAQ,QAAQ,QAAQ,QAAQ,cAAc,YAAY;AAAA,EAC1D,QAAQ,KAAK,YAAY;AAAA,EAGzB,MAAM,cAAc,QAAQ,YAAY,aAAa,CAAC,aAAa;AAAA,IACjE,MAAM,QAAQ,YAAY,KAAK;AAAA,IAC/B,MAAM,QAAQ,SAAS,IAAI;AAAA,IAC3B,MAAM,UAAU,KAAK,KAAK;AAAA,IAC1B,OAAO,QAAQ;AAAA,GAChB;AAAA,EACD,QAAQ,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AAAA,EACxD,QAAQ,KAAK,WAAW;AAAA,EAExB,OAAO;AAAA;",
|
|
8
|
+
"debugId": "5354281E8C85363564756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// @bun @bun-cjs
|
|
2
|
+
(function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
7
|
+
var __toCommonJS = (from) => {
|
|
8
|
+
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
if (entry)
|
|
10
|
+
return entry;
|
|
11
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
13
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
14
|
+
get: () => from[key],
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
}));
|
|
17
|
+
__moduleCache.set(from, entry);
|
|
18
|
+
return entry;
|
|
19
|
+
};
|
|
20
|
+
var __export = (target, all) => {
|
|
21
|
+
for (var name in all)
|
|
22
|
+
__defProp(target, name, {
|
|
23
|
+
get: all[name],
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
set: (newValue) => all[name] = () => newValue
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// packages/test-environment/src/index.ts
|
|
31
|
+
var exports_src = {};
|
|
32
|
+
__export(exports_src, {
|
|
33
|
+
setupTestEnvironment: () => import_setup.setupTestEnvironment
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(exports_src);
|
|
36
|
+
var import_setup = require("./setup.ts");
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
//# debugId=42D879EBF19B460064756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export { setupTestEnvironment } from \"./setup.ts\";\n\nexport type {\n SetupTestOptions,\n TestEnvironmentHandle,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n RunResults,\n} from \"./types.ts\";\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAqC,IAArC;",
|
|
8
|
+
"debugId": "42D879EBF19B460064756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
// @bun @bun-cjs
|
|
2
|
+
(function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
7
|
+
var __toCommonJS = (from) => {
|
|
8
|
+
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
if (entry)
|
|
10
|
+
return entry;
|
|
11
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
13
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
14
|
+
get: () => from[key],
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
}));
|
|
17
|
+
__moduleCache.set(from, entry);
|
|
18
|
+
return entry;
|
|
19
|
+
};
|
|
20
|
+
var __export = (target, all) => {
|
|
21
|
+
for (var name in all)
|
|
22
|
+
__defProp(target, name, {
|
|
23
|
+
get: all[name],
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
set: (newValue) => all[name] = () => newValue
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// packages/test-environment/src/runner.ts
|
|
31
|
+
var exports_runner = {};
|
|
32
|
+
__export(exports_runner, {
|
|
33
|
+
runTests: () => runTests
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(exports_runner);
|
|
36
|
+
function checkForOnly(suites) {
|
|
37
|
+
for (const suite of suites) {
|
|
38
|
+
if (suite.modifier === "only")
|
|
39
|
+
return true;
|
|
40
|
+
for (const test of suite.tests) {
|
|
41
|
+
if (test.modifier === "only")
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
if (checkForOnly(suite.children))
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
async function executeFunction(context, fn) {
|
|
50
|
+
const result = context.callFunction(fn, context.undefined);
|
|
51
|
+
if (result.error) {
|
|
52
|
+
const errorDump = context.dump(result.error);
|
|
53
|
+
result.error.dispose();
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
error: {
|
|
57
|
+
message: errorDump?.message || String(errorDump),
|
|
58
|
+
stack: errorDump?.stack,
|
|
59
|
+
expected: errorDump?.expected,
|
|
60
|
+
actual: errorDump?.actual,
|
|
61
|
+
matcherName: errorDump?.matcherName
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const isPromiseCode = context.evalCode(`
|
|
66
|
+
(function(val) { return val && typeof val.then === 'function'; })
|
|
67
|
+
`);
|
|
68
|
+
if (isPromiseCode.error) {
|
|
69
|
+
isPromiseCode.error.dispose();
|
|
70
|
+
result.value.dispose();
|
|
71
|
+
return { success: true };
|
|
72
|
+
}
|
|
73
|
+
const checkResult = context.callFunction(isPromiseCode.value, context.undefined, result.value);
|
|
74
|
+
isPromiseCode.value.dispose();
|
|
75
|
+
if (checkResult.error) {
|
|
76
|
+
checkResult.error.dispose();
|
|
77
|
+
result.value.dispose();
|
|
78
|
+
return { success: true };
|
|
79
|
+
}
|
|
80
|
+
const isPromise = context.dump(checkResult.value);
|
|
81
|
+
checkResult.value.dispose();
|
|
82
|
+
if (!isPromise) {
|
|
83
|
+
result.value.dispose();
|
|
84
|
+
return { success: true };
|
|
85
|
+
}
|
|
86
|
+
return new Promise((resolve) => {
|
|
87
|
+
const promiseHandle = result.value;
|
|
88
|
+
const thenFn = context.newFunction("then", () => {
|
|
89
|
+
resolve({ success: true });
|
|
90
|
+
return context.undefined;
|
|
91
|
+
});
|
|
92
|
+
const catchFn = context.newFunction("catch", (errorHandle) => {
|
|
93
|
+
const errorDump = context.dump(errorHandle);
|
|
94
|
+
resolve({
|
|
95
|
+
success: false,
|
|
96
|
+
error: {
|
|
97
|
+
message: errorDump?.message || String(errorDump),
|
|
98
|
+
stack: errorDump?.stack,
|
|
99
|
+
expected: errorDump?.expected,
|
|
100
|
+
actual: errorDump?.actual,
|
|
101
|
+
matcherName: errorDump?.matcherName
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return context.undefined;
|
|
105
|
+
});
|
|
106
|
+
const thenProp = context.getProp(promiseHandle, "then");
|
|
107
|
+
const thenResult = context.callFunction(thenProp, promiseHandle, thenFn);
|
|
108
|
+
thenProp.dispose();
|
|
109
|
+
if (thenResult.error) {
|
|
110
|
+
thenResult.error.dispose();
|
|
111
|
+
promiseHandle.dispose();
|
|
112
|
+
thenFn.dispose();
|
|
113
|
+
catchFn.dispose();
|
|
114
|
+
resolve({ success: true });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const catchProp = context.getProp(thenResult.value, "catch");
|
|
118
|
+
const catchResult = context.callFunction(catchProp, thenResult.value, catchFn);
|
|
119
|
+
catchProp.dispose();
|
|
120
|
+
thenResult.value.dispose();
|
|
121
|
+
if (catchResult.error) {
|
|
122
|
+
catchResult.error.dispose();
|
|
123
|
+
} else {
|
|
124
|
+
catchResult.value.dispose();
|
|
125
|
+
}
|
|
126
|
+
promiseHandle.dispose();
|
|
127
|
+
thenFn.dispose();
|
|
128
|
+
catchFn.dispose();
|
|
129
|
+
context.runtime.executePendingJobs();
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async function executeHooks(context, hooks) {
|
|
133
|
+
for (const hook of hooks) {
|
|
134
|
+
const result = await executeFunction(context, hook);
|
|
135
|
+
if (!result.success) {
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return { success: true };
|
|
140
|
+
}
|
|
141
|
+
function collectBeforeEachHooks(suite) {
|
|
142
|
+
const hooks = [];
|
|
143
|
+
const path = [];
|
|
144
|
+
let current = suite;
|
|
145
|
+
while (current) {
|
|
146
|
+
path.unshift(current);
|
|
147
|
+
current = current.parent;
|
|
148
|
+
}
|
|
149
|
+
for (const s of path) {
|
|
150
|
+
hooks.push(...s.beforeEach);
|
|
151
|
+
}
|
|
152
|
+
return hooks;
|
|
153
|
+
}
|
|
154
|
+
function collectAfterEachHooks(suite) {
|
|
155
|
+
const hooks = [];
|
|
156
|
+
const path = [];
|
|
157
|
+
let current = suite;
|
|
158
|
+
while (current) {
|
|
159
|
+
path.unshift(current);
|
|
160
|
+
current = current.parent;
|
|
161
|
+
}
|
|
162
|
+
for (const s of path.reverse()) {
|
|
163
|
+
hooks.push(...s.afterEach);
|
|
164
|
+
}
|
|
165
|
+
return hooks;
|
|
166
|
+
}
|
|
167
|
+
function hasOnlyAncestor(suite) {
|
|
168
|
+
let current = suite;
|
|
169
|
+
while (current) {
|
|
170
|
+
if (current.modifier === "only")
|
|
171
|
+
return true;
|
|
172
|
+
current = current.parent;
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
function hasOnlyDescendant(suite) {
|
|
177
|
+
for (const test of suite.tests) {
|
|
178
|
+
if (test.modifier === "only")
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
for (const child of suite.children) {
|
|
182
|
+
if (child.modifier === "only")
|
|
183
|
+
return true;
|
|
184
|
+
if (hasOnlyDescendant(child))
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
async function runTest(runCtx, test) {
|
|
190
|
+
const { state, context } = runCtx;
|
|
191
|
+
const testInfo = {
|
|
192
|
+
name: test.name,
|
|
193
|
+
suite: test.suite.path,
|
|
194
|
+
fullName: test.suite.path.length > 0 ? [...test.suite.path, test.name].join(" > ") : test.name
|
|
195
|
+
};
|
|
196
|
+
const shouldSkip = test.modifier === "skip" || test.modifier === "todo" || test.suite.modifier === "skip" || test.suite.modifier === "todo" || runCtx.hasOnly && test.modifier !== "only" && !hasOnlyAncestor(test.suite);
|
|
197
|
+
if (shouldSkip) {
|
|
198
|
+
const result2 = {
|
|
199
|
+
...testInfo,
|
|
200
|
+
status: test.modifier === "todo" ? "todo" : "skip",
|
|
201
|
+
duration: 0
|
|
202
|
+
};
|
|
203
|
+
runCtx.results.tests.push(result2);
|
|
204
|
+
if (result2.status === "skip")
|
|
205
|
+
runCtx.results.skipped++;
|
|
206
|
+
if (result2.status === "todo")
|
|
207
|
+
runCtx.results.todo++;
|
|
208
|
+
return result2;
|
|
209
|
+
}
|
|
210
|
+
state.handlers.onTestStart?.(testInfo);
|
|
211
|
+
const startTime = performance.now();
|
|
212
|
+
const beforeEachHooks = collectBeforeEachHooks(test.suite);
|
|
213
|
+
const beforeResult = await executeHooks(context, beforeEachHooks);
|
|
214
|
+
let testError;
|
|
215
|
+
if (!beforeResult.success) {
|
|
216
|
+
testError = beforeResult.error;
|
|
217
|
+
} else {
|
|
218
|
+
const testResult = await executeFunction(context, test.fn);
|
|
219
|
+
if (!testResult.success) {
|
|
220
|
+
testError = testResult.error;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const afterEachHooks = collectAfterEachHooks(test.suite);
|
|
224
|
+
await executeHooks(context, afterEachHooks);
|
|
225
|
+
const duration = performance.now() - startTime;
|
|
226
|
+
const result = {
|
|
227
|
+
...testInfo,
|
|
228
|
+
status: testError ? "fail" : "pass",
|
|
229
|
+
duration,
|
|
230
|
+
error: testError
|
|
231
|
+
};
|
|
232
|
+
runCtx.results.tests.push(result);
|
|
233
|
+
if (result.status === "pass") {
|
|
234
|
+
runCtx.results.passed++;
|
|
235
|
+
state.handlers.onTestPass?.(result);
|
|
236
|
+
} else {
|
|
237
|
+
runCtx.results.failed++;
|
|
238
|
+
state.handlers.onTestFail?.(result);
|
|
239
|
+
}
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
async function runSuite(runCtx, suite) {
|
|
243
|
+
const { state, context } = runCtx;
|
|
244
|
+
const suiteInfo = {
|
|
245
|
+
name: suite.name,
|
|
246
|
+
path: suite.path,
|
|
247
|
+
fullName: suite.path.join(" > ") || suite.name
|
|
248
|
+
};
|
|
249
|
+
state.handlers.onSuiteStart?.(suiteInfo);
|
|
250
|
+
const startTime = performance.now();
|
|
251
|
+
let passed = 0;
|
|
252
|
+
let failed = 0;
|
|
253
|
+
let skipped = 0;
|
|
254
|
+
const shouldSkipSuite = suite.modifier === "skip" || suite.modifier === "todo" || runCtx.hasOnly && suite.modifier !== "only" && !hasOnlyDescendant(suite) && !hasOnlyAncestor(suite);
|
|
255
|
+
if (!shouldSkipSuite) {
|
|
256
|
+
const beforeAllResult = await executeHooks(context, suite.beforeAll);
|
|
257
|
+
if (beforeAllResult.success) {
|
|
258
|
+
for (const test of suite.tests) {
|
|
259
|
+
const result = await runTest(runCtx, test);
|
|
260
|
+
if (result.status === "pass")
|
|
261
|
+
passed++;
|
|
262
|
+
else if (result.status === "fail")
|
|
263
|
+
failed++;
|
|
264
|
+
else
|
|
265
|
+
skipped++;
|
|
266
|
+
}
|
|
267
|
+
for (const child of suite.children) {
|
|
268
|
+
await runSuite(runCtx, child);
|
|
269
|
+
}
|
|
270
|
+
} else {
|
|
271
|
+
for (const test of suite.tests) {
|
|
272
|
+
const testResult = {
|
|
273
|
+
name: test.name,
|
|
274
|
+
suite: test.suite.path,
|
|
275
|
+
fullName: test.suite.path.length > 0 ? [...test.suite.path, test.name].join(" > ") : test.name,
|
|
276
|
+
status: "fail",
|
|
277
|
+
duration: 0,
|
|
278
|
+
error: beforeAllResult.error
|
|
279
|
+
};
|
|
280
|
+
runCtx.results.tests.push(testResult);
|
|
281
|
+
runCtx.results.failed++;
|
|
282
|
+
failed++;
|
|
283
|
+
state.handlers.onTestFail?.(testResult);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
await executeHooks(context, suite.afterAll);
|
|
287
|
+
} else {
|
|
288
|
+
for (const test of suite.tests) {
|
|
289
|
+
skipped++;
|
|
290
|
+
runCtx.results.skipped++;
|
|
291
|
+
runCtx.results.tests.push({
|
|
292
|
+
name: test.name,
|
|
293
|
+
suite: test.suite.path,
|
|
294
|
+
fullName: test.suite.path.length > 0 ? [...test.suite.path, test.name].join(" > ") : test.name,
|
|
295
|
+
status: "skip",
|
|
296
|
+
duration: 0
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
for (const child of suite.children) {
|
|
300
|
+
await runSuite(runCtx, child);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const duration = performance.now() - startTime;
|
|
304
|
+
const suiteResult = {
|
|
305
|
+
...suiteInfo,
|
|
306
|
+
passed,
|
|
307
|
+
failed,
|
|
308
|
+
skipped,
|
|
309
|
+
duration
|
|
310
|
+
};
|
|
311
|
+
runCtx.results.suites.push(suiteResult);
|
|
312
|
+
state.handlers.onSuiteEnd?.(suiteResult);
|
|
313
|
+
return suiteResult;
|
|
314
|
+
}
|
|
315
|
+
async function runTests(state) {
|
|
316
|
+
const startTime = performance.now();
|
|
317
|
+
const results = {
|
|
318
|
+
passed: 0,
|
|
319
|
+
failed: 0,
|
|
320
|
+
skipped: 0,
|
|
321
|
+
todo: 0,
|
|
322
|
+
total: 0,
|
|
323
|
+
duration: 0,
|
|
324
|
+
suites: [],
|
|
325
|
+
tests: [],
|
|
326
|
+
success: true
|
|
327
|
+
};
|
|
328
|
+
const hasOnly = checkForOnly(state.suites);
|
|
329
|
+
const runCtx = {
|
|
330
|
+
state,
|
|
331
|
+
context: state.context,
|
|
332
|
+
results,
|
|
333
|
+
hasOnly
|
|
334
|
+
};
|
|
335
|
+
for (const suite of state.suites) {
|
|
336
|
+
await runSuite(runCtx, suite);
|
|
337
|
+
}
|
|
338
|
+
results.duration = performance.now() - startTime;
|
|
339
|
+
results.total = results.passed + results.failed + results.skipped + results.todo;
|
|
340
|
+
results.success = results.failed === 0;
|
|
341
|
+
state.handlers.onRunComplete?.(results);
|
|
342
|
+
return results;
|
|
343
|
+
}
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
//# debugId=9BA8E805A3739F0764756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runner.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type {\n TestState,\n RegisteredSuite,\n RegisteredTest,\n RunResults,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"./types.ts\";\n\ninterface RunContext {\n state: TestState;\n context: QuickJSContext;\n results: RunResults;\n hasOnly: boolean;\n}\n\n/**\n * Check if any test or suite has .only modifier\n */\nfunction checkForOnly(suites: RegisteredSuite[]): boolean {\n for (const suite of suites) {\n if (suite.modifier === \"only\") return true;\n for (const test of suite.tests) {\n if (test.modifier === \"only\") return true;\n }\n if (checkForOnly(suite.children)) return true;\n }\n return false;\n}\n\n/**\n * Execute a function handle (sync or async)\n * Captures AssertionError properties from expect() matchers\n */\nasync function executeFunction(\n context: QuickJSContext,\n fn: QuickJSHandle\n): Promise<{ success: boolean; error?: TestError }> {\n const result = context.callFunction(fn, context.undefined);\n\n if (result.error) {\n const errorDump = context.dump(result.error);\n result.error.dispose();\n\n // Extract error properties (including expect() matcher metadata)\n return {\n success: false,\n error: {\n message: errorDump?.message || String(errorDump),\n stack: errorDump?.stack,\n expected: errorDump?.expected,\n actual: errorDump?.actual,\n matcherName: errorDump?.matcherName,\n },\n };\n }\n\n // Check if result is a promise\n const isPromiseCode = context.evalCode(`\n (function(val) { return val && typeof val.then === 'function'; })\n `);\n\n if (isPromiseCode.error) {\n isPromiseCode.error.dispose();\n result.value.dispose();\n return { success: true };\n }\n\n const checkResult = context.callFunction(\n isPromiseCode.value,\n context.undefined,\n result.value\n );\n isPromiseCode.value.dispose();\n\n if (checkResult.error) {\n checkResult.error.dispose();\n result.value.dispose();\n return { success: true };\n }\n\n const isPromise = context.dump(checkResult.value);\n checkResult.value.dispose();\n\n if (!isPromise) {\n result.value.dispose();\n return { success: true };\n }\n\n // Handle async - wrap in promise resolution tracking\n return new Promise((resolve) => {\n const promiseHandle = result.value;\n\n // Create resolve/reject callbacks\n const thenFn = context.newFunction(\"then\", () => {\n resolve({ success: true });\n return context.undefined;\n });\n\n const catchFn = context.newFunction(\"catch\", (errorHandle) => {\n const errorDump = context.dump(errorHandle);\n resolve({\n success: false,\n error: {\n message: errorDump?.message || String(errorDump),\n stack: errorDump?.stack,\n expected: errorDump?.expected,\n actual: errorDump?.actual,\n matcherName: errorDump?.matcherName,\n },\n });\n return context.undefined;\n });\n\n // Get the 'then' property from promise\n const thenProp = context.getProp(promiseHandle, \"then\");\n\n // Call promise.then().catch()\n const thenResult = context.callFunction(thenProp, promiseHandle, thenFn);\n thenProp.dispose();\n\n if (thenResult.error) {\n thenResult.error.dispose();\n promiseHandle.dispose();\n thenFn.dispose();\n catchFn.dispose();\n resolve({ success: true });\n return;\n }\n\n // Get 'catch' property from thenResult\n const catchProp = context.getProp(thenResult.value, \"catch\");\n const catchResult = context.callFunction(\n catchProp,\n thenResult.value,\n catchFn\n );\n catchProp.dispose();\n thenResult.value.dispose();\n\n if (catchResult.error) {\n catchResult.error.dispose();\n } else {\n catchResult.value.dispose();\n }\n\n promiseHandle.dispose();\n thenFn.dispose();\n catchFn.dispose();\n\n // Execute pending jobs to process the promise\n context.runtime.executePendingJobs();\n });\n}\n\n/**\n * Execute all hooks in an array\n */\nasync function executeHooks(\n context: QuickJSContext,\n hooks: QuickJSHandle[]\n): Promise<{ success: boolean; error?: TestError }> {\n for (const hook of hooks) {\n const result = await executeFunction(context, hook);\n if (!result.success) {\n return result;\n }\n }\n return { success: true };\n}\n\n/**\n * Collect beforeEach hooks from outer to inner\n */\nfunction collectBeforeEachHooks(suite: RegisteredSuite): QuickJSHandle[] {\n const hooks: QuickJSHandle[] = [];\n const path: RegisteredSuite[] = [];\n\n let current: RegisteredSuite | null = suite;\n while (current) {\n path.unshift(current);\n current = current.parent;\n }\n\n for (const s of path) {\n hooks.push(...s.beforeEach);\n }\n\n return hooks;\n}\n\n/**\n * Collect afterEach hooks from inner to outer\n */\nfunction collectAfterEachHooks(suite: RegisteredSuite): QuickJSHandle[] {\n const hooks: QuickJSHandle[] = [];\n const path: RegisteredSuite[] = [];\n\n let current: RegisteredSuite | null = suite;\n while (current) {\n path.unshift(current);\n current = current.parent;\n }\n\n // Reverse for inner to outer\n for (const s of path.reverse()) {\n hooks.push(...s.afterEach);\n }\n\n return hooks;\n}\n\n/**\n * Check if any ancestor suite has .only modifier\n */\nfunction hasOnlyAncestor(suite: RegisteredSuite): boolean {\n let current: RegisteredSuite | null = suite;\n while (current) {\n if (current.modifier === \"only\") return true;\n current = current.parent;\n }\n return false;\n}\n\n/**\n * Check if suite has any .only descendants\n */\nfunction hasOnlyDescendant(suite: RegisteredSuite): boolean {\n for (const test of suite.tests) {\n if (test.modifier === \"only\") return true;\n }\n for (const child of suite.children) {\n if (child.modifier === \"only\") return true;\n if (hasOnlyDescendant(child)) return true;\n }\n return false;\n}\n\n/**\n * Run a single test\n */\nasync function runTest(\n runCtx: RunContext,\n test: RegisteredTest\n): Promise<TestResult> {\n const { state, context } = runCtx;\n\n const testInfo: TestInfo = {\n name: test.name,\n suite: test.suite.path,\n fullName:\n test.suite.path.length > 0\n ? [...test.suite.path, test.name].join(\" > \")\n : test.name,\n };\n\n // Check if should skip\n const shouldSkip =\n test.modifier === \"skip\" ||\n test.modifier === \"todo\" ||\n test.suite.modifier === \"skip\" ||\n test.suite.modifier === \"todo\" ||\n (runCtx.hasOnly &&\n test.modifier !== \"only\" &&\n !hasOnlyAncestor(test.suite));\n\n if (shouldSkip) {\n const result: TestResult = {\n ...testInfo,\n status: test.modifier === \"todo\" ? \"todo\" : \"skip\",\n duration: 0,\n };\n\n runCtx.results.tests.push(result);\n if (result.status === \"skip\") runCtx.results.skipped++;\n if (result.status === \"todo\") runCtx.results.todo++;\n\n return result;\n }\n\n // Call onTestStart\n state.handlers.onTestStart?.(testInfo);\n\n const startTime = performance.now();\n\n // Run beforeEach hooks\n const beforeEachHooks = collectBeforeEachHooks(test.suite);\n const beforeResult = await executeHooks(context, beforeEachHooks);\n\n let testError: TestError | undefined;\n\n if (!beforeResult.success) {\n testError = beforeResult.error;\n } else {\n // Run the test\n const testResult = await executeFunction(context, test.fn);\n if (!testResult.success) {\n testError = testResult.error;\n }\n }\n\n // Run afterEach hooks (even if test failed)\n const afterEachHooks = collectAfterEachHooks(test.suite);\n await executeHooks(context, afterEachHooks);\n\n const duration = performance.now() - startTime;\n\n const result: TestResult = {\n ...testInfo,\n status: testError ? \"fail\" : \"pass\",\n duration,\n error: testError,\n };\n\n runCtx.results.tests.push(result);\n\n if (result.status === \"pass\") {\n runCtx.results.passed++;\n state.handlers.onTestPass?.(result);\n } else {\n runCtx.results.failed++;\n state.handlers.onTestFail?.(result);\n }\n\n return result;\n}\n\n/**\n * Run a suite and its children\n */\nasync function runSuite(\n runCtx: RunContext,\n suite: RegisteredSuite\n): Promise<SuiteResult> {\n const { state, context } = runCtx;\n\n const suiteInfo: SuiteInfo = {\n name: suite.name,\n path: suite.path,\n fullName: suite.path.join(\" > \") || suite.name,\n };\n\n // Call onSuiteStart\n state.handlers.onSuiteStart?.(suiteInfo);\n\n const startTime = performance.now();\n let passed = 0;\n let failed = 0;\n let skipped = 0;\n\n // Check if entire suite should skip\n const shouldSkipSuite =\n suite.modifier === \"skip\" ||\n suite.modifier === \"todo\" ||\n (runCtx.hasOnly &&\n suite.modifier !== \"only\" &&\n !hasOnlyDescendant(suite) &&\n !hasOnlyAncestor(suite));\n\n if (!shouldSkipSuite) {\n // Run beforeAll hooks\n const beforeAllResult = await executeHooks(context, suite.beforeAll);\n\n if (beforeAllResult.success) {\n // Run tests\n for (const test of suite.tests) {\n const result = await runTest(runCtx, test);\n if (result.status === \"pass\") passed++;\n else if (result.status === \"fail\") failed++;\n else skipped++;\n }\n\n // Run child suites\n for (const child of suite.children) {\n await runSuite(runCtx, child);\n }\n } else {\n // beforeAll failed - skip all tests in this suite\n for (const test of suite.tests) {\n const testResult: TestResult = {\n name: test.name,\n suite: test.suite.path,\n fullName:\n test.suite.path.length > 0\n ? [...test.suite.path, test.name].join(\" > \")\n : test.name,\n status: \"fail\",\n duration: 0,\n error: beforeAllResult.error,\n };\n runCtx.results.tests.push(testResult);\n runCtx.results.failed++;\n failed++;\n state.handlers.onTestFail?.(testResult);\n }\n }\n\n // Run afterAll hooks\n await executeHooks(context, suite.afterAll);\n } else {\n // Skip all tests\n for (const test of suite.tests) {\n skipped++;\n runCtx.results.skipped++;\n runCtx.results.tests.push({\n name: test.name,\n suite: test.suite.path,\n fullName:\n test.suite.path.length > 0\n ? [...test.suite.path, test.name].join(\" > \")\n : test.name,\n status: \"skip\",\n duration: 0,\n });\n }\n\n // Still process children (they might have .only)\n for (const child of suite.children) {\n await runSuite(runCtx, child);\n }\n }\n\n const duration = performance.now() - startTime;\n\n const suiteResult: SuiteResult = {\n ...suiteInfo,\n passed,\n failed,\n skipped,\n duration,\n };\n\n runCtx.results.suites.push(suiteResult);\n\n // Call onSuiteEnd\n state.handlers.onSuiteEnd?.(suiteResult);\n\n return suiteResult;\n}\n\n/**\n * Main run function\n */\nexport async function runTests(state: TestState): Promise<RunResults> {\n const startTime = performance.now();\n\n const results: RunResults = {\n passed: 0,\n failed: 0,\n skipped: 0,\n todo: 0,\n total: 0,\n duration: 0,\n suites: [],\n tests: [],\n success: true,\n };\n\n const hasOnly = checkForOnly(state.suites);\n\n const runCtx: RunContext = {\n state,\n context: state.context,\n results,\n hasOnly,\n };\n\n // Run all suites\n for (const suite of state.suites) {\n await runSuite(runCtx, suite);\n }\n\n results.duration = performance.now() - startTime;\n results.total = results.passed + results.failed + results.skipped + results.todo;\n results.success = results.failed === 0;\n\n // Call onRunComplete\n state.handlers.onRunComplete?.(results);\n\n return results;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "9BA8E805A3739F0764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|