@overkill-dev/engine 0.0.1 → 0.0.2
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/LICENSE +21 -0
- package/assertion-protocol/assertion-evaluation.d.ts +13 -0
- package/assertion-protocol/assertion-evaluation.d.ts.map +1 -0
- package/assertion-protocol/assertion-evaluation.js +6 -0
- package/assertion-protocol/assertion-evaluation.js.map +1 -0
- package/assertion-protocol/assertion-node-shape.d.ts +71 -0
- package/assertion-protocol/assertion-node-shape.d.ts.map +1 -0
- package/assertion-protocol/assertion-node.d.ts +97 -0
- package/assertion-protocol/assertion-node.d.ts.map +1 -0
- package/assertion-protocol/assertion-node.js +33 -0
- package/assertion-protocol/assertion-node.js.map +1 -0
- package/assertion-protocol/assertion-reference.d.ts +73 -0
- package/assertion-protocol/assertion-reference.d.ts.map +1 -0
- package/assertion-protocol/assertion-reference.js +49 -0
- package/assertion-protocol/assertion-reference.js.map +1 -0
- package/assertion-protocol/assertions/boolean.d.ts +11 -0
- package/assertion-protocol/assertions/boolean.d.ts.map +1 -0
- package/assertion-protocol/assertions/boolean.js +12 -0
- package/assertion-protocol/assertions/boolean.js.map +1 -0
- package/assertion-protocol/assertions/collection.d.ts +22 -0
- package/assertion-protocol/assertions/collection.d.ts.map +1 -0
- package/assertion-protocol/assertions/collection.js +21 -0
- package/assertion-protocol/assertions/collection.js.map +1 -0
- package/assertion-protocol/assertions/dispatch.d.ts +88 -0
- package/assertion-protocol/assertions/dispatch.d.ts.map +1 -0
- package/assertion-protocol/assertions/dispatch.js +47 -0
- package/assertion-protocol/assertions/dispatch.js.map +1 -0
- package/assertion-protocol/assertions/equality.d.ts +17 -0
- package/assertion-protocol/assertions/equality.d.ts.map +1 -0
- package/assertion-protocol/assertions/equality.js +24 -0
- package/assertion-protocol/assertions/equality.js.map +1 -0
- package/assertion-protocol/assertions/fail.d.ts +13 -0
- package/assertion-protocol/assertions/fail.d.ts.map +1 -0
- package/assertion-protocol/assertions/fail.js +8 -0
- package/assertion-protocol/assertions/fail.js.map +1 -0
- package/assertion-protocol/assertions/numeric.d.ts +29 -0
- package/assertion-protocol/assertions/numeric.d.ts.map +1 -0
- package/assertion-protocol/assertions/numeric.js +43 -0
- package/assertion-protocol/assertions/numeric.js.map +1 -0
- package/assertion-protocol/assertions/partial.d.ts +14 -0
- package/assertion-protocol/assertions/partial.d.ts.map +1 -0
- package/assertion-protocol/assertions/partial.js +17 -0
- package/assertion-protocol/assertions/partial.js.map +1 -0
- package/assertion-protocol/assertions/presence.d.ts +17 -0
- package/assertion-protocol/assertions/presence.d.ts.map +1 -0
- package/assertion-protocol/assertions/presence.js +20 -0
- package/assertion-protocol/assertions/presence.js.map +1 -0
- package/assertion-protocol/assertions/string.d.ts +28 -0
- package/assertion-protocol/assertions/string.d.ts.map +1 -0
- package/assertion-protocol/assertions/string.js +33 -0
- package/assertion-protocol/assertions/string.js.map +1 -0
- package/assertion-protocol/assertions/type-shape.d.ts +42 -0
- package/assertion-protocol/assertions/type-shape.d.ts.map +1 -0
- package/assertion-protocol/assertions/type-shape.js +43 -0
- package/assertion-protocol/assertions/type-shape.js.map +1 -0
- package/assertion-protocol/collection-count.d.ts +6 -0
- package/assertion-protocol/collection-count.d.ts.map +1 -0
- package/assertion-protocol/collection-count.js +42 -0
- package/assertion-protocol/collection-count.js.map +1 -0
- package/assertion-protocol/evaluation.d.ts +32 -0
- package/assertion-protocol/evaluation.d.ts.map +1 -0
- package/assertion-protocol/evaluation.js +170 -0
- package/assertion-protocol/evaluation.js.map +1 -0
- package/assertion-protocol/partial-matching.d.ts +4 -0
- package/assertion-protocol/partial-matching.d.ts.map +1 -0
- package/assertion-protocol/partial-matching.js +13 -0
- package/assertion-protocol/partial-matching.js.map +1 -0
- package/assertion-protocol/source-location.d.ts +6 -0
- package/assertion-protocol/source-location.d.ts.map +1 -0
- package/assertion-protocol/source-location.js +76 -0
- package/assertion-protocol/source-location.js.map +1 -0
- package/assertion-protocol/thrown-error-record.d.ts +8 -0
- package/assertion-protocol/thrown-error-record.d.ts.map +1 -0
- package/assertion-protocol/thrown-error-record.js +17 -0
- package/assertion-protocol/thrown-error-record.js.map +1 -0
- package/assertion-protocol/thrown-matcher.d.ts +51 -0
- package/assertion-protocol/thrown-matcher.d.ts.map +1 -0
- package/assertion-protocol/thrown-matcher.js +201 -0
- package/assertion-protocol/thrown-matcher.js.map +1 -0
- package/compare/comparison-result.d.ts +25 -0
- package/compare/comparison-result.d.ts.map +1 -0
- package/compare/comparison-result.js +47 -0
- package/compare/comparison-result.js.map +1 -0
- package/compare/comparison-state.d.ts +7 -0
- package/compare/comparison-state.d.ts.map +1 -0
- package/compare/comparison-state.js +20 -0
- package/compare/comparison-state.js.map +1 -0
- package/compare/comparison.d.ts +12 -0
- package/compare/comparison.d.ts.map +1 -0
- package/compare/comparison.js +78 -0
- package/compare/comparison.js.map +1 -0
- package/compare/diff-path.d.ts +8 -0
- package/compare/diff-path.d.ts.map +1 -0
- package/compare/diff-path.js +37 -0
- package/compare/diff-path.js.map +1 -0
- package/compare/raw-comparison.d.ts +24 -0
- package/compare/raw-comparison.d.ts.map +1 -0
- package/compare/raw-comparison.js +285 -0
- package/compare/raw-comparison.js.map +1 -0
- package/compare/serialized-value-classification.d.ts +12 -0
- package/compare/serialized-value-classification.d.ts.map +1 -0
- package/compare/serialized-value-classification.js +99 -0
- package/compare/serialized-value-classification.js.map +1 -0
- package/compare/serialized-value-shape.d.ts +143 -0
- package/compare/serialized-value-shape.d.ts.map +1 -0
- package/compare/serialized-value-shape.js +12 -0
- package/compare/serialized-value-shape.js.map +1 -0
- package/compare/serialized-value-state.d.ts +12 -0
- package/compare/serialized-value-state.d.ts.map +1 -0
- package/compare/serialized-value-state.js +55 -0
- package/compare/serialized-value-state.js.map +1 -0
- package/compare/serialized-value.d.ts +11 -0
- package/compare/serialized-value.d.ts.map +1 -0
- package/compare/serialized-value.js +389 -0
- package/compare/serialized-value.js.map +1 -0
- package/compare/structured-diff.d.ts +4 -0
- package/compare/structured-diff.d.ts.map +1 -0
- package/compare/structured-diff.js +382 -0
- package/compare/structured-diff.js.map +1 -0
- package/compare/value-classification.d.ts +26 -0
- package/compare/value-classification.d.ts.map +1 -0
- package/compare/value-classification.js +112 -0
- package/compare/value-classification.js.map +1 -0
- package/diff/binary-diff.d.ts +4 -0
- package/diff/binary-diff.d.ts.map +1 -0
- package/diff/binary-diff.js +49 -0
- package/diff/binary-diff.js.map +1 -0
- package/diff/diff-shape.d.ts +117 -0
- package/diff/diff-shape.d.ts.map +1 -0
- package/diff/string-diff.d.ts +3 -0
- package/diff/string-diff.d.ts.map +1 -0
- package/diff/string-diff.js +22 -0
- package/diff/string-diff.js.map +1 -0
- package/engine/assertion-facade.d.ts +50 -0
- package/engine/assertion-facade.d.ts.map +1 -0
- package/engine/assertion-facade.js +361 -0
- package/engine/assertion-facade.js.map +1 -0
- package/engine/case-execution.d.ts +10 -0
- package/engine/case-execution.d.ts.map +1 -0
- package/engine/case-execution.js +408 -0
- package/engine/case-execution.js.map +1 -0
- package/engine/custom-assertion-recording.d.ts +33 -0
- package/engine/custom-assertion-recording.d.ts.map +1 -0
- package/engine/custom-assertion-recording.js +175 -0
- package/engine/custom-assertion-recording.js.map +1 -0
- package/engine/engine.d.ts +24 -0
- package/engine/engine.d.ts.map +1 -0
- package/engine/engine.js +33 -0
- package/engine/engine.js.map +1 -0
- package/engine/execution.d.ts +16 -0
- package/engine/execution.d.ts.map +1 -0
- package/engine/execution.js +223 -0
- package/engine/execution.js.map +1 -0
- package/engine/identity.d.ts +12 -0
- package/engine/identity.d.ts.map +1 -0
- package/engine/identity.js +20 -0
- package/engine/identity.js.map +1 -0
- package/engine/reporter.d.ts +103 -0
- package/engine/reporter.d.ts.map +1 -0
- package/engine/reporter.js +177 -0
- package/engine/reporter.js.map +1 -0
- package/engine/require-assertion-facade.d.ts +21 -0
- package/engine/require-assertion-facade.d.ts.map +1 -0
- package/engine/require-assertion-facade.js +127 -0
- package/engine/require-assertion-facade.js.map +1 -0
- package/engine/run-if-main.d.ts +20 -0
- package/engine/run-if-main.d.ts.map +1 -0
- package/engine/run-if-main.js +30 -0
- package/engine/run-if-main.js.map +1 -0
- package/engine/run-result.d.ts +110 -0
- package/engine/run-result.d.ts.map +1 -0
- package/engine/run-result.js +13 -0
- package/engine/run-result.js.map +1 -0
- package/engine/test-node.d.ts +88 -0
- package/engine/test-node.d.ts.map +1 -0
- package/engine/test-node.js +103 -0
- package/engine/test-node.js.map +1 -0
- package/engine/test-plan.d.ts +20 -0
- package/engine/test-plan.d.ts.map +1 -0
- package/engine/test-plan.js +115 -0
- package/engine/test-plan.js.map +1 -0
- package/package.json +78 -6
- package/packages/engine/assertion-protocol.entry-point.d.ts +9 -0
- package/packages/engine/assertion-protocol.entry-point.d.ts.map +1 -0
- package/packages/engine/assertion-protocol.entry-point.js +4 -0
- package/packages/engine/assertion-protocol.entry-point.js.map +1 -0
- package/packages/engine/engine.entry-point.d.ts +39 -0
- package/packages/engine/engine.entry-point.d.ts.map +1 -0
- package/packages/engine/engine.entry-point.js +47 -0
- package/packages/engine/engine.entry-point.js.map +1 -0
- package/readme.md +121 -5
- package/sbom.cdx.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../source/engine/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAGH,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,eAAe,EAEvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,MAAM,MAAM,GAAG;IACjB,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,KAAK,CAAC;IACvD,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,KAAK,CAAC;IACvD,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,QAAQ,CAAC;IAChE,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,YAAY,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF,wBAAgB,YAAY,CAAC,YAAY,EAAE,kBAAkB,GAAG,MAAM,CA4BrE"}
|
package/engine/engine.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { formatCaseId } from "./identity.js";
|
|
2
|
+
import { createRunIfMain } from "./run-if-main.js";
|
|
3
|
+
import { createTestNodeOwner, createTestNodeFactory } from "./test-node.js";
|
|
4
|
+
import { createTestPlanFactory } from "./test-plan.js";
|
|
5
|
+
export function createEngine(dependencies) {
|
|
6
|
+
const owner = createTestNodeOwner();
|
|
7
|
+
const { execute } = dependencies;
|
|
8
|
+
const constructedNodes = new Set();
|
|
9
|
+
const nodeFactory = createTestNodeFactory({
|
|
10
|
+
owner,
|
|
11
|
+
recordConstructedNode(node) {
|
|
12
|
+
constructedNodes.add(node);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
const createTestPlan = createTestPlanFactory(owner, constructedNodes);
|
|
16
|
+
return {
|
|
17
|
+
createSuite: nodeFactory.createSuite,
|
|
18
|
+
createTable: nodeFactory.createTable,
|
|
19
|
+
createTestCase: nodeFactory.createTestCase,
|
|
20
|
+
createTestPlan,
|
|
21
|
+
execute,
|
|
22
|
+
formatCaseId,
|
|
23
|
+
runIfMain: createRunIfMain({
|
|
24
|
+
createTestPlan,
|
|
25
|
+
execute,
|
|
26
|
+
nodeVersion: dependencies.nodeVersion,
|
|
27
|
+
readExitCode: dependencies.readExitCode,
|
|
28
|
+
wallClock: dependencies.wallClock,
|
|
29
|
+
writeExitCode: dependencies.writeExitCode
|
|
30
|
+
})
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../source/engine/engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAkB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACH,mBAAmB,EACnB,qBAAqB,EAQxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAwB,MAAM,gBAAgB,CAAC;AAoB7E,MAAM,UAAU,YAAY,CAAC,YAAgC;IACzD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;IACjC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAY,CAAC;IAC7C,MAAM,WAAW,GAAG,qBAAqB,CAAC;QACtC,KAAK;QACL,qBAAqB,CAAC,IAAI;YACtB,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;KACJ,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAEtE,OAAO;QACH,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,cAAc,EAAE,WAAW,CAAC,cAAc;QAC1C,cAAc;QACd,OAAO;QACP,YAAY;QACZ,SAAS,EAAE,eAAe,CAAC;YACvB,cAAc;YACd,OAAO;YACP,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,YAAY,EAAE,YAAY,CAAC,YAAY;YACvC,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,aAAa,EAAE,YAAY,CAAC,aAAa;SAC5C,CAAC;KACL,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WallClock } from '@enormora/wall-clock';
|
|
2
|
+
import { type Reporter, type ReporterDispatcher, type RunFacts } from './reporter.ts';
|
|
3
|
+
import type { RunResult } from './run-result.ts';
|
|
4
|
+
import type { TestPlan } from './test-plan.ts';
|
|
5
|
+
export type ExecuteOptions = {
|
|
6
|
+
readonly reporters: readonly Reporter[];
|
|
7
|
+
readonly runFacts: RunFacts;
|
|
8
|
+
readonly startedAt: string;
|
|
9
|
+
};
|
|
10
|
+
export type ExecuteDependencies = {
|
|
11
|
+
readonly reporterDispatcher: ReporterDispatcher;
|
|
12
|
+
readonly wallClock: WallClock;
|
|
13
|
+
};
|
|
14
|
+
export type Execute = (testPlan: TestPlan, options?: ExecuteOptions) => Promise<RunResult>;
|
|
15
|
+
export declare function createExecute(dependencies: ExecuteDependencies): Execute;
|
|
16
|
+
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../../../source/engine/execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EACH,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EAEhB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAiB,SAAS,EAAe,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,gBAAgB,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CACjC,CAAC;AA4UF,MAAM,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAE3F,wBAAgB,aAAa,CAAC,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAWxE"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { runTestCase } from "./case-execution.js";
|
|
2
|
+
import { caseIdentityKey } from "./identity.js";
|
|
3
|
+
import { validateReporterSinks } from "./reporter.js";
|
|
4
|
+
const epoch = new Date(0);
|
|
5
|
+
async function executeCase(testCase, attempt, reporters, dependencies) {
|
|
6
|
+
const startErrors = await dependencies.reporterDispatcher.reportEvent(reporters, {
|
|
7
|
+
attempt,
|
|
8
|
+
case: testCase.id,
|
|
9
|
+
kind: 'test-start'
|
|
10
|
+
});
|
|
11
|
+
const executedCase = await runTestCase(testCase, dependencies.wallClock);
|
|
12
|
+
const endErrors = await dependencies.reporterDispatcher.reportEvent(reporters, {
|
|
13
|
+
attempt,
|
|
14
|
+
case: testCase.id,
|
|
15
|
+
kind: 'test-end',
|
|
16
|
+
outcome: executedCase.result.outcome,
|
|
17
|
+
verdict: executedCase.result.verdict,
|
|
18
|
+
wallTimeMs: executedCase.wallTimeMs
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
reporterErrors: [...startErrors, ...endErrors],
|
|
22
|
+
result: executedCase.result
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function hasFailed(testResult) {
|
|
26
|
+
return testResult.outcome.kind === 'fail';
|
|
27
|
+
}
|
|
28
|
+
function isInconclusive(testResult) {
|
|
29
|
+
return testResult.outcome.kind === 'inconclusive';
|
|
30
|
+
}
|
|
31
|
+
function hasPassed(testResult) {
|
|
32
|
+
return testResult.outcome.kind === 'pass';
|
|
33
|
+
}
|
|
34
|
+
function wasSkipped(testResult) {
|
|
35
|
+
return testResult.outcome.kind === 'skip';
|
|
36
|
+
}
|
|
37
|
+
function countOutcomes(testPlan, perTest) {
|
|
38
|
+
return {
|
|
39
|
+
defined: testPlan.defined,
|
|
40
|
+
discovered: testPlan.discoveredCases.length,
|
|
41
|
+
failed: perTest.filter(hasFailed).length,
|
|
42
|
+
inconclusive: perTest.filter(isInconclusive).length,
|
|
43
|
+
passed: perTest.filter(hasPassed).length,
|
|
44
|
+
planned: testPlan.cases.length,
|
|
45
|
+
skipped: perTest.filter(wasSkipped).length
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function suiteKey(suitePath) {
|
|
49
|
+
return suitePath.join(' > ');
|
|
50
|
+
}
|
|
51
|
+
function emptySuiteRunCounts() {
|
|
52
|
+
return { discovered: 0, executed: 0, planned: 0 };
|
|
53
|
+
}
|
|
54
|
+
function incrementSuiteRunCounts(counts, field) {
|
|
55
|
+
return {
|
|
56
|
+
discovered: counts.discovered + (field === 'discovered' ? 1 : 0),
|
|
57
|
+
executed: counts.executed + (field === 'executed' ? 1 : 0),
|
|
58
|
+
planned: counts.planned + (field === 'planned' ? 1 : 0)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function countSuitePath(counts, suitePath, field) {
|
|
62
|
+
let updatedCounts = counts;
|
|
63
|
+
for (let pathLength = 1; pathLength <= suitePath.length; pathLength += 1) {
|
|
64
|
+
const key = suiteKey(suitePath.slice(0, pathLength));
|
|
65
|
+
updatedCounts = {
|
|
66
|
+
...updatedCounts,
|
|
67
|
+
[key]: incrementSuiteRunCounts(updatedCounts[key] ?? emptySuiteRunCounts(), field)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return updatedCounts;
|
|
71
|
+
}
|
|
72
|
+
function countSuites(testPlan, perTest) {
|
|
73
|
+
let counts = {};
|
|
74
|
+
const executedIds = new Set(perTest.map(function toId(result) {
|
|
75
|
+
return caseIdentityKey(result.id);
|
|
76
|
+
}));
|
|
77
|
+
for (const testCase of testPlan.discoveredCases) {
|
|
78
|
+
counts = countSuitePath(counts, testCase.suitePath, 'discovered');
|
|
79
|
+
}
|
|
80
|
+
for (const testCase of testPlan.cases) {
|
|
81
|
+
counts = countSuitePath(counts, testCase.suitePath, 'planned');
|
|
82
|
+
if (executedIds.has(caseIdentityKey(testCase.id))) {
|
|
83
|
+
counts = countSuitePath(counts, testCase.suitePath, 'executed');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return counts;
|
|
87
|
+
}
|
|
88
|
+
function commonSuitePrefixLength(firstSuitePath, secondSuitePath) {
|
|
89
|
+
const shortestLength = Math.min(firstSuitePath.length, secondSuitePath.length);
|
|
90
|
+
let prefixLength = 0;
|
|
91
|
+
while (prefixLength < shortestLength && firstSuitePath[prefixLength] === secondSuitePath[prefixLength]) {
|
|
92
|
+
prefixLength += 1;
|
|
93
|
+
}
|
|
94
|
+
return prefixLength;
|
|
95
|
+
}
|
|
96
|
+
async function reportSuiteTransition(reporters, dependencies, currentSuitePath, nextSuitePath) {
|
|
97
|
+
let reporterErrors = [];
|
|
98
|
+
const sharedPrefixLength = commonSuitePrefixLength(currentSuitePath, nextSuitePath);
|
|
99
|
+
for (let pathLength = currentSuitePath.length; pathLength > sharedPrefixLength; pathLength -= 1) {
|
|
100
|
+
reporterErrors = [
|
|
101
|
+
...reporterErrors,
|
|
102
|
+
...await dependencies.reporterDispatcher.reportEvent(reporters, {
|
|
103
|
+
kind: 'suite-end',
|
|
104
|
+
suitePath: currentSuitePath.slice(0, pathLength)
|
|
105
|
+
})
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
for (let pathLength = sharedPrefixLength + 1; pathLength <= nextSuitePath.length; pathLength += 1) {
|
|
109
|
+
reporterErrors = [
|
|
110
|
+
...reporterErrors,
|
|
111
|
+
...await dependencies.reporterDispatcher.reportEvent(reporters, {
|
|
112
|
+
kind: 'suite-start',
|
|
113
|
+
suitePath: nextSuitePath.slice(0, pathLength)
|
|
114
|
+
})
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
return reporterErrors;
|
|
118
|
+
}
|
|
119
|
+
async function executeTestPlanCases(testPlan, reporters, dependencies) {
|
|
120
|
+
let perTest = [];
|
|
121
|
+
let reporterErrors = [];
|
|
122
|
+
let currentSuitePath = [];
|
|
123
|
+
for (const testCase of testPlan.cases) {
|
|
124
|
+
const suiteErrors = await reportSuiteTransition(reporters, dependencies, currentSuitePath, testCase.suitePath);
|
|
125
|
+
currentSuitePath = testCase.suitePath;
|
|
126
|
+
const testRun = await executeCase(testCase, 0, reporters, dependencies);
|
|
127
|
+
reporterErrors = [...reporterErrors, ...suiteErrors, ...testRun.reporterErrors];
|
|
128
|
+
perTest = [...perTest, testRun.result];
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
perTest,
|
|
132
|
+
reporterErrors: [
|
|
133
|
+
...reporterErrors,
|
|
134
|
+
...await reportSuiteTransition(reporters, dependencies, currentSuitePath, [])
|
|
135
|
+
]
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function createRunResult(testPlan, perTest, reporterErrors, timing) {
|
|
139
|
+
const result = {
|
|
140
|
+
artifacts: [],
|
|
141
|
+
bySuite: countSuites(testPlan, perTest),
|
|
142
|
+
orphans: testPlan.orphans,
|
|
143
|
+
perTest,
|
|
144
|
+
runnerErrors: reporterErrors,
|
|
145
|
+
summary: countOutcomes(testPlan, perTest),
|
|
146
|
+
wallTimeMs: timing.wallClock.currentTimestampInMilliseconds - timing.startedAtMs
|
|
147
|
+
};
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
function appendRunnerErrors(result, runnerErrors) {
|
|
151
|
+
if (runnerErrors.length === 0) {
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
...result,
|
|
156
|
+
runnerErrors: [...result.runnerErrors, ...runnerErrors]
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function executeOptionsWithDefaults(options) {
|
|
160
|
+
return options ?? {
|
|
161
|
+
reporters: [],
|
|
162
|
+
runFacts: {},
|
|
163
|
+
startedAt: epoch.toISOString()
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function createReporterDisposal(reporters, dependencies) {
|
|
167
|
+
let reportersDisposed = false;
|
|
168
|
+
return {
|
|
169
|
+
async disposeOnce() {
|
|
170
|
+
if (reportersDisposed) {
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
reportersDisposed = true;
|
|
174
|
+
return await dependencies.reporterDispatcher.disposeReporters(reporters);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async function createRunResultBeforeRunEnd(testPlan, options, dependencies) {
|
|
179
|
+
const startedAtMs = dependencies.wallClock.currentTimestampInMilliseconds;
|
|
180
|
+
const startErrors = await dependencies.reporterDispatcher.reportEvent(options.reporters, {
|
|
181
|
+
facts: options.runFacts,
|
|
182
|
+
kind: 'run-start',
|
|
183
|
+
startedAt: options.startedAt
|
|
184
|
+
});
|
|
185
|
+
const executedTestPlan = await executeTestPlanCases(testPlan, options.reporters, dependencies);
|
|
186
|
+
const reporterErrors = [...startErrors, ...executedTestPlan.reporterErrors];
|
|
187
|
+
return createRunResult(testPlan, executedTestPlan.perTest, reporterErrors, {
|
|
188
|
+
startedAtMs,
|
|
189
|
+
wallClock: dependencies.wallClock
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
async function executeRun(testPlan, options, dependencies, reporterDisposal) {
|
|
193
|
+
validateReporterSinks(options.reporters);
|
|
194
|
+
const result = await createRunResultBeforeRunEnd(testPlan, options, dependencies);
|
|
195
|
+
const runEndErrors = await dependencies.reporterDispatcher.reportEvent(options.reporters, {
|
|
196
|
+
kind: 'run-end',
|
|
197
|
+
result
|
|
198
|
+
});
|
|
199
|
+
const resultForFinalReporting = appendRunnerErrors(result, runEndErrors);
|
|
200
|
+
const finalReporterErrors = await dependencies.reporterDispatcher.reportResult(options.reporters, resultForFinalReporting);
|
|
201
|
+
const disposeErrors = await reporterDisposal.disposeOnce();
|
|
202
|
+
return appendRunnerErrors(resultForFinalReporting, [...finalReporterErrors, ...disposeErrors]);
|
|
203
|
+
}
|
|
204
|
+
async function throwWithCleanupErrors(error, reporterDisposal) {
|
|
205
|
+
const disposeErrors = await reporterDisposal.disposeOnce();
|
|
206
|
+
if (disposeErrors.length > 0) {
|
|
207
|
+
throw new AggregateError([error, ...disposeErrors], 'Execution failed and reporter cleanup failed.', { cause: error });
|
|
208
|
+
}
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
export function createExecute(dependencies) {
|
|
212
|
+
return async function execute(testPlan, options) {
|
|
213
|
+
const executeOptions = executeOptionsWithDefaults(options);
|
|
214
|
+
const reporterDisposal = createReporterDisposal(executeOptions.reporters, dependencies);
|
|
215
|
+
try {
|
|
216
|
+
return await executeRun(testPlan, executeOptions, dependencies, reporterDisposal);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
return await throwWithCleanupErrors(error, reporterDisposal);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../../source/engine/execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type TestId = {
|
|
2
|
+
readonly file: string | null;
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly suite: readonly string[];
|
|
5
|
+
};
|
|
6
|
+
export type CaseId = TestId & {
|
|
7
|
+
readonly params: string | null;
|
|
8
|
+
};
|
|
9
|
+
export declare function createCaseId(suite: readonly string[], name: string, params: string | null): CaseId;
|
|
10
|
+
export declare function caseIdentityKey(caseId: CaseId): string;
|
|
11
|
+
export declare function formatCaseId(caseId: CaseId): string;
|
|
12
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../../source/engine/identity.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAOlG;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASnD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function createCaseId(suite, name, params) {
|
|
2
|
+
return {
|
|
3
|
+
file: null,
|
|
4
|
+
name,
|
|
5
|
+
params,
|
|
6
|
+
suite
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function caseIdentityKey(caseId) {
|
|
10
|
+
return JSON.stringify([caseId.file, caseId.suite, caseId.name, caseId.params]);
|
|
11
|
+
}
|
|
12
|
+
export function formatCaseId(caseId) {
|
|
13
|
+
const namePath = [...caseId.suite, caseId.name].join(' > ');
|
|
14
|
+
const originPath = caseId.file === null ? namePath : `${caseId.file}: ${namePath}`;
|
|
15
|
+
if (caseId.params === null) {
|
|
16
|
+
return originPath;
|
|
17
|
+
}
|
|
18
|
+
return `${originPath} [${caseId.params}]`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../../source/engine/identity.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,YAAY,CAAC,KAAwB,EAAE,IAAY,EAAE,MAAqB;IACtF,OAAO;QACH,IAAI,EAAE,IAAI;QACV,IAAI;QACJ,MAAM;QACN,KAAK;KACR,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAE,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACvC,MAAM,QAAQ,GAAG,CAAE,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;IAEnF,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,OAAO,GAAG,UAAU,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { WallClock } from '@enormora/wall-clock';
|
|
2
|
+
import type { CaseId } from './identity.ts';
|
|
3
|
+
import type { RunResult, RunnerError, TestOutcome } from './run-result.ts';
|
|
4
|
+
export type RunFacts = Readonly<Record<string, unknown>>;
|
|
5
|
+
export type StandardOutputSinkDeclaration = {
|
|
6
|
+
readonly conflictPolicy: 'exclusive' | 'shared';
|
|
7
|
+
readonly kind: 'stderr' | 'stdout';
|
|
8
|
+
};
|
|
9
|
+
export type FileSinkDeclaration = {
|
|
10
|
+
readonly conflictPolicy: 'exclusive';
|
|
11
|
+
readonly kind: 'file';
|
|
12
|
+
readonly path: string;
|
|
13
|
+
};
|
|
14
|
+
export type DirectorySinkDeclaration = {
|
|
15
|
+
readonly conflictPolicy: 'exclusive';
|
|
16
|
+
readonly kind: 'directory';
|
|
17
|
+
readonly path: string;
|
|
18
|
+
};
|
|
19
|
+
export type MemorySinkDeclaration = {
|
|
20
|
+
readonly conflictPolicy: 'shared';
|
|
21
|
+
readonly kind: 'memory';
|
|
22
|
+
};
|
|
23
|
+
export type StreamSinkDeclaration = {
|
|
24
|
+
readonly conflictPolicy: 'exclusive';
|
|
25
|
+
readonly kind: 'stream';
|
|
26
|
+
readonly provided: WritableStream<unknown>;
|
|
27
|
+
};
|
|
28
|
+
type FileSystemSinkDeclaration = DirectorySinkDeclaration | FileSinkDeclaration;
|
|
29
|
+
type PrivateSinkDeclaration = MemorySinkDeclaration | StreamSinkDeclaration;
|
|
30
|
+
type ReporterSinkDeclaration = FileSystemSinkDeclaration | StandardOutputSinkDeclaration;
|
|
31
|
+
export type SinkDeclaration = PrivateSinkDeclaration | ReporterSinkDeclaration;
|
|
32
|
+
type RunStartReporterEvent = {
|
|
33
|
+
readonly facts: RunFacts;
|
|
34
|
+
readonly kind: 'run-start';
|
|
35
|
+
readonly startedAt: string;
|
|
36
|
+
};
|
|
37
|
+
type RunEndReporterEvent = {
|
|
38
|
+
readonly kind: 'run-end';
|
|
39
|
+
readonly result: RunResult;
|
|
40
|
+
};
|
|
41
|
+
type RunnerErrorReporterEvent = {
|
|
42
|
+
readonly error: RunnerError;
|
|
43
|
+
readonly kind: 'runner-error';
|
|
44
|
+
};
|
|
45
|
+
type SuiteStartReporterEvent = {
|
|
46
|
+
readonly kind: 'suite-start';
|
|
47
|
+
readonly suitePath: readonly string[];
|
|
48
|
+
};
|
|
49
|
+
type SuiteEndReporterEvent = {
|
|
50
|
+
readonly kind: 'suite-end';
|
|
51
|
+
readonly suitePath: readonly string[];
|
|
52
|
+
};
|
|
53
|
+
type TestStartReporterEvent = {
|
|
54
|
+
readonly attempt: number;
|
|
55
|
+
readonly case: CaseId;
|
|
56
|
+
readonly kind: 'test-start';
|
|
57
|
+
};
|
|
58
|
+
type TestProgressReporterEvent = {
|
|
59
|
+
readonly attempt: number;
|
|
60
|
+
readonly case: CaseId;
|
|
61
|
+
readonly kind: 'test-progress';
|
|
62
|
+
readonly note: string;
|
|
63
|
+
};
|
|
64
|
+
type TestEndReporterEvent = {
|
|
65
|
+
readonly attempt: number;
|
|
66
|
+
readonly case: CaseId;
|
|
67
|
+
readonly kind: 'test-end';
|
|
68
|
+
readonly outcome: TestOutcome;
|
|
69
|
+
readonly verdict: TestOutcome['kind'];
|
|
70
|
+
readonly wallTimeMs: number;
|
|
71
|
+
};
|
|
72
|
+
type RunReporterEvent = RunEndReporterEvent | RunnerErrorReporterEvent | RunStartReporterEvent;
|
|
73
|
+
type SuiteReporterEvent = SuiteEndReporterEvent | SuiteStartReporterEvent;
|
|
74
|
+
type TestReporterEvent = TestEndReporterEvent | TestProgressReporterEvent | TestStartReporterEvent;
|
|
75
|
+
export type ReporterEvent = RunReporterEvent | SuiteReporterEvent | TestReporterEvent;
|
|
76
|
+
export type RealTimeReporter = {
|
|
77
|
+
readonly dispose: (() => Promise<void> | void) | null;
|
|
78
|
+
readonly kind: 'real-time';
|
|
79
|
+
readonly name: string;
|
|
80
|
+
readonly sinks: readonly SinkDeclaration[];
|
|
81
|
+
readonly onEvent: (event: ReporterEvent) => Promise<void> | void;
|
|
82
|
+
readonly onFinish: ((result: RunResult) => Promise<void> | void) | null;
|
|
83
|
+
};
|
|
84
|
+
export type FinalResultReporter = {
|
|
85
|
+
readonly dispose: (() => Promise<void> | void) | null;
|
|
86
|
+
readonly kind: 'final-result';
|
|
87
|
+
readonly name: string;
|
|
88
|
+
readonly sinks: readonly SinkDeclaration[];
|
|
89
|
+
readonly onResult: (result: RunResult) => Promise<void> | void;
|
|
90
|
+
};
|
|
91
|
+
export type Reporter = FinalResultReporter | RealTimeReporter;
|
|
92
|
+
export type ReporterDispatcher = {
|
|
93
|
+
readonly disposeReporters: (reporters: readonly Reporter[]) => Promise<readonly RunnerError[]>;
|
|
94
|
+
readonly reportEvent: (reporters: readonly Reporter[], event: ReporterEvent) => Promise<readonly RunnerError[]>;
|
|
95
|
+
readonly reportResult: (reporters: readonly Reporter[], result: RunResult) => Promise<readonly RunnerError[]>;
|
|
96
|
+
};
|
|
97
|
+
export type ReporterDispatcherDependencies = {
|
|
98
|
+
readonly wallClock: WallClock;
|
|
99
|
+
};
|
|
100
|
+
export declare function validateReporterSinks(reporters: readonly Reporter[]): void;
|
|
101
|
+
export declare function createReporterDispatcher(dependencies: ReporterDispatcherDependencies): ReporterDispatcher;
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../../source/engine/reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
const callbackTimeoutMs = 100;
|
|
2
|
+
function standardOutputSinkKey(sink) {
|
|
3
|
+
return `standard-output:${sink.kind}`;
|
|
4
|
+
}
|
|
5
|
+
function pathSinkKey(sink) {
|
|
6
|
+
return `path:${sink.path}`;
|
|
7
|
+
}
|
|
8
|
+
function validateStandardOutputSink(claimedSinks, sink) {
|
|
9
|
+
const key = standardOutputSinkKey(sink);
|
|
10
|
+
const existingSink = claimedSinks.get(key);
|
|
11
|
+
if (existingSink !== undefined &&
|
|
12
|
+
(existingSink.conflictPolicy === 'exclusive' || sink.conflictPolicy === 'exclusive')) {
|
|
13
|
+
throw new TypeError(`Reporter sink conflict: ${sink.kind} is claimed exclusively.`);
|
|
14
|
+
}
|
|
15
|
+
const updatedSinks = new Map(claimedSinks);
|
|
16
|
+
return updatedSinks.set(key, {
|
|
17
|
+
conflictPolicy: sink.conflictPolicy
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function validatePathSink(claimedSinks, sink) {
|
|
21
|
+
const key = pathSinkKey(sink);
|
|
22
|
+
if (claimedSinks.has(key)) {
|
|
23
|
+
throw new TypeError(`Reporter sink conflict: path "${sink.path}" is claimed by multiple reporters.`);
|
|
24
|
+
}
|
|
25
|
+
const updatedSinks = new Map(claimedSinks);
|
|
26
|
+
return updatedSinks.set(key, {
|
|
27
|
+
conflictPolicy: sink.conflictPolicy
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function validateReporterSink(claimedSinks, sink) {
|
|
31
|
+
if (sink.kind === 'stdout' || sink.kind === 'stderr') {
|
|
32
|
+
return validateStandardOutputSink(claimedSinks, sink);
|
|
33
|
+
}
|
|
34
|
+
if (sink.kind === 'file' || sink.kind === 'directory') {
|
|
35
|
+
return validatePathSink(claimedSinks, sink);
|
|
36
|
+
}
|
|
37
|
+
return claimedSinks;
|
|
38
|
+
}
|
|
39
|
+
export function validateReporterSinks(reporters) {
|
|
40
|
+
let claimedSinks = new Map();
|
|
41
|
+
for (const reporter of reporters) {
|
|
42
|
+
for (const sink of reporter.sinks) {
|
|
43
|
+
claimedSinks = validateReporterSink(claimedSinks, sink);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function formatReporterError(reporter, cause) {
|
|
48
|
+
const reason = cause instanceof Error ? cause.message : String(cause);
|
|
49
|
+
return {
|
|
50
|
+
attributedTo: null,
|
|
51
|
+
cause,
|
|
52
|
+
message: `${reporter.name}: ${reason}`,
|
|
53
|
+
subtype: 'reporter'
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function timeoutError(reporter) {
|
|
57
|
+
return new Error(`${reporter.name} reporter callback timed out after ${callbackTimeoutMs} ms.`);
|
|
58
|
+
}
|
|
59
|
+
async function runReporterCallback(callback) {
|
|
60
|
+
await callback();
|
|
61
|
+
}
|
|
62
|
+
export function createReporterDispatcher(dependencies) {
|
|
63
|
+
const { wallClock } = dependencies;
|
|
64
|
+
function createReporterTimeout(reporter) {
|
|
65
|
+
const { promise, reject } = Promise.withResolvers();
|
|
66
|
+
const timeout = wallClock.setTimeout(function rejectTimedOutCallback() {
|
|
67
|
+
reject(timeoutError(reporter));
|
|
68
|
+
}, callbackTimeoutMs);
|
|
69
|
+
return {
|
|
70
|
+
cancel() {
|
|
71
|
+
wallClock.clearTimeout(timeout);
|
|
72
|
+
},
|
|
73
|
+
promise
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function awaitReporterCallback(reporter, callback) {
|
|
77
|
+
const reporterTimeout = createReporterTimeout(reporter);
|
|
78
|
+
try {
|
|
79
|
+
await Promise.race([runReporterCallback(callback), reporterTimeout.promise]);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return formatReporterError(reporter, error);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
reporterTimeout.cancel();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function reportEventToReporter(reporter, event) {
|
|
90
|
+
const error = await awaitReporterCallback(reporter, function sendReporterEvent() {
|
|
91
|
+
return reporter.onEvent(event);
|
|
92
|
+
});
|
|
93
|
+
if (error === null) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return { error, reporter };
|
|
97
|
+
}
|
|
98
|
+
async function reportRunnerErrorToOtherReporters(reporters, failedReporter, error) {
|
|
99
|
+
const event = { error, kind: 'runner-error' };
|
|
100
|
+
const failures = await Promise.all(reporters.map(async function reportRunnerError(reporter) {
|
|
101
|
+
if (reporter.kind !== 'real-time' || reporter === failedReporter) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
return reportEventToReporter(reporter, event);
|
|
105
|
+
}));
|
|
106
|
+
return failures.flatMap(function collectFailure(failure) {
|
|
107
|
+
return failure === null ? [] : [failure.error];
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async function collectReporterErrorsWithNotifications(reporters, reporterErrors) {
|
|
111
|
+
const notificationErrors = await Promise.all(reporterErrors.map(async function reportError(failure) {
|
|
112
|
+
return reportRunnerErrorToOtherReporters(reporters, failure.reporter, failure.error);
|
|
113
|
+
}));
|
|
114
|
+
return [
|
|
115
|
+
...reporterErrors.map(function toError(failure) {
|
|
116
|
+
return failure.error;
|
|
117
|
+
}),
|
|
118
|
+
...notificationErrors.flat()
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
async function reportEvent(reporters, event) {
|
|
122
|
+
const failures = await Promise.all(reporters.map(async function reportRealTimeEvent(reporter) {
|
|
123
|
+
if (reporter.kind !== 'real-time') {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
return reportEventToReporter(reporter, event);
|
|
127
|
+
}));
|
|
128
|
+
const reporterErrors = failures.flatMap(function collectFailure(failure) {
|
|
129
|
+
return failure === null ? [] : [failure];
|
|
130
|
+
});
|
|
131
|
+
if (event.kind === 'runner-error') {
|
|
132
|
+
return reporterErrors.map(function toError(failure) {
|
|
133
|
+
return failure.error;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return collectReporterErrorsWithNotifications(reporters, reporterErrors);
|
|
137
|
+
}
|
|
138
|
+
async function reportResult(reporters, result) {
|
|
139
|
+
const failures = await Promise.all(reporters.map(async function reportFinalResult(reporter) {
|
|
140
|
+
if (reporter.kind === 'final-result') {
|
|
141
|
+
const error = await awaitReporterCallback(reporter, function reportResultToFinalReporter() {
|
|
142
|
+
return reporter.onResult(result);
|
|
143
|
+
});
|
|
144
|
+
return error === null ? null : { error, reporter };
|
|
145
|
+
}
|
|
146
|
+
if (reporter.onFinish === null) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const { onFinish } = reporter;
|
|
150
|
+
const error = await awaitReporterCallback(reporter, function reportResultToRealTimeReporter() {
|
|
151
|
+
return onFinish(result);
|
|
152
|
+
});
|
|
153
|
+
return error === null ? null : { error, reporter };
|
|
154
|
+
}));
|
|
155
|
+
const reporterErrors = failures.flatMap(function collectFailure(failure) {
|
|
156
|
+
return failure === null ? [] : [failure];
|
|
157
|
+
});
|
|
158
|
+
return collectReporterErrorsWithNotifications(reporters, reporterErrors);
|
|
159
|
+
}
|
|
160
|
+
async function disposeReporters(reporters) {
|
|
161
|
+
const failures = await Promise.all(reporters.map(async function disposeReporter(reporter) {
|
|
162
|
+
if (reporter.dispose === null) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
const { dispose } = reporter;
|
|
166
|
+
const error = await awaitReporterCallback(reporter, function disposeReporterResources() {
|
|
167
|
+
return dispose();
|
|
168
|
+
});
|
|
169
|
+
return error === null ? null : { error, reporter };
|
|
170
|
+
}));
|
|
171
|
+
return failures.flatMap(function collectFailure(failure) {
|
|
172
|
+
return failure === null ? [] : [failure.error];
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return { disposeReporters, reportEvent, reportResult };
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../../source/engine/reporter.ts"],"names":[],"mappings":"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"}
|