warpo 2.4.0 → 2.5.0-alpha-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/dist/debug_server/dapServer.d.ts +1 -0
- package/dist/debug_server/dapServer.js +27 -0
- package/dist/debug_server/dapServer.js.map +1 -0
- package/dist/debug_server/debugSession.d.ts +19 -0
- package/dist/debug_server/debugSession.js +71 -0
- package/dist/debug_server/debugSession.js.map +1 -0
- package/dist/debug_server/tests/debugSession.test.d.ts +1 -0
- package/dist/debug_server/tests/debugSession.test.js +61 -0
- package/dist/debug_server/tests/debugSession.test.js.map +1 -0
- package/dist/debug_server/tests/launcher.d.ts +10 -0
- package/dist/debug_server/tests/launcher.js +21 -0
- package/dist/debug_server/tests/launcher.js.map +1 -0
- package/dist/scripts/lib.d.ts +7 -0
- package/dist/{lib.js → scripts/lib.js} +20 -6
- package/dist/scripts/lib.js.map +1 -0
- package/dist/test_runner/cli.d.ts +2 -0
- package/dist/test_runner/cli.js +85 -0
- package/dist/test_runner/cli.js.map +1 -0
- package/dist/test_runner/core/analyze.d.ts +13 -0
- package/dist/test_runner/core/analyze.js +58 -0
- package/dist/test_runner/core/analyze.js.map +1 -0
- package/dist/test_runner/core/compile.d.ts +4 -0
- package/dist/test_runner/core/compile.js +23 -0
- package/dist/test_runner/core/compile.js.map +1 -0
- package/dist/test_runner/core/compiler.d.ts +11 -0
- package/dist/test_runner/core/compiler.js +47 -0
- package/dist/test_runner/core/compiler.js.map +1 -0
- package/dist/test_runner/core/covRecorder.d.ts +5 -0
- package/dist/test_runner/core/covRecorder.js +26 -0
- package/dist/test_runner/core/covRecorder.js.map +1 -0
- package/dist/test_runner/core/execute.d.ts +4 -0
- package/dist/test_runner/core/execute.js +76 -0
- package/dist/test_runner/core/execute.js.map +1 -0
- package/dist/test_runner/core/executionRecorder.d.ts +52 -0
- package/dist/test_runner/core/executionRecorder.js +164 -0
- package/dist/test_runner/core/executionRecorder.js.map +1 -0
- package/dist/test_runner/core/mockStatusRecorder.d.ts +10 -0
- package/dist/test_runner/core/mockStatusRecorder.js +62 -0
- package/dist/test_runner/core/mockStatusRecorder.js.map +1 -0
- package/dist/test_runner/executionResult.d.ts +11 -0
- package/dist/test_runner/executionResult.js +112 -0
- package/dist/test_runner/executionResult.js.map +1 -0
- package/dist/test_runner/generator/html-generator/genCode.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/genCode.js +124 -0
- package/dist/test_runner/generator/html-generator/genCode.js.map +1 -0
- package/dist/test_runner/generator/html-generator/genFolder.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/genFolder.js +155 -0
- package/dist/test_runner/generator/html-generator/genFolder.js.map +1 -0
- package/dist/test_runner/generator/html-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/index.js +33 -0
- package/dist/test_runner/generator/html-generator/index.js.map +1 -0
- package/dist/test_runner/generator/index.d.ts +9 -0
- package/dist/test_runner/generator/index.js +30 -0
- package/dist/test_runner/generator/index.js.map +1 -0
- package/dist/test_runner/generator/json-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/json-generator/index.js +45 -0
- package/dist/test_runner/generator/json-generator/index.js.map +1 -0
- package/dist/test_runner/generator/table-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/table-generator/index.js +85 -0
- package/dist/test_runner/generator/table-generator/index.js.map +1 -0
- package/dist/test_runner/index.d.ts +3 -0
- package/dist/test_runner/index.js +70 -0
- package/dist/test_runner/index.js.map +1 -0
- package/dist/test_runner/interface.d.ts +36 -0
- package/dist/test_runner/interface.js +12 -0
- package/dist/test_runner/interface.js.map +1 -0
- package/dist/test_runner/parser/index.d.ts +35 -0
- package/dist/test_runner/parser/index.js +146 -0
- package/dist/test_runner/parser/index.js.map +1 -0
- package/dist/test_runner/parser/singleFileAnalysis.d.ts +8 -0
- package/dist/test_runner/parser/singleFileAnalysis.js +51 -0
- package/dist/test_runner/parser/singleFileAnalysis.js.map +1 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.d.ts +16 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.js +97 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.js.map +1 -0
- package/dist/test_runner/testOption.d.ts +16 -0
- package/dist/test_runner/testOption.js +2 -0
- package/dist/test_runner/testOption.js.map +1 -0
- package/dist/test_runner/utils/errorTraceHandler.d.ts +12 -0
- package/dist/test_runner/utils/errorTraceHandler.js +87 -0
- package/dist/test_runner/utils/errorTraceHandler.js.map +1 -0
- package/dist/test_runner/utils/escape.d.ts +1 -0
- package/dist/test_runner/utils/escape.js +14 -0
- package/dist/test_runner/utils/escape.js.map +1 -0
- package/dist/test_runner/utils/index.d.ts +14 -0
- package/dist/test_runner/utils/index.js +88 -0
- package/dist/test_runner/utils/index.js.map +1 -0
- package/dist/test_runner/utils/interface.d.ts +100 -0
- package/dist/test_runner/utils/interface.js +86 -0
- package/dist/test_runner/utils/interface.js.map +1 -0
- package/dist/test_runner/utils/name.d.ts +2 -0
- package/dist/test_runner/utils/name.js +3 -0
- package/dist/test_runner/utils/name.js.map +1 -0
- package/dist/test_runner/utils/pathResolver.d.ts +6 -0
- package/dist/test_runner/utils/pathResolver.js +98 -0
- package/dist/test_runner/utils/pathResolver.js.map +1 -0
- package/dist/test_runner/utils/projectRoot.d.ts +1 -0
- package/dist/test_runner/utils/projectRoot.js +4 -0
- package/dist/test_runner/utils/projectRoot.js.map +1 -0
- package/dist/test_runner/utils/wasm.d.ts +12 -0
- package/dist/test_runner/utils/wasm.js +45 -0
- package/dist/test_runner/utils/wasm.js.map +1 -0
- package/dist/warpo.js +10 -3
- package/dist/warpo.js.map +1 -0
- package/dist/warpo_internal.d.ts +7 -0
- package/dist/warpo_internal.js +74 -0
- package/dist/warpo_internal.js.map +1 -0
- package/package.json +37 -9
- package/types/std/index.d.ts +8 -261
- package/types/warpo/index.d.ts +94 -0
- package/dist/lib.d.ts +0 -5
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ExecutionResultSummary } from "../executionResult.js";
|
|
2
|
+
import { Imports } from "../interface.js";
|
|
3
|
+
import { WebAssemblyModule } from "../utils/wasm.js";
|
|
4
|
+
export declare function execWasmBinaries(wasmModule: WebAssemblyModule, filterByName: (fullTestName: string) => boolean, imports?: Imports): Promise<ExecutionResultSummary>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { instantiate } from "@assemblyscript/loader";
|
|
2
|
+
import { ExecutionResultSummary } from "../executionResult.js";
|
|
3
|
+
import { ImportsArgument } from "../interface.js";
|
|
4
|
+
import { ExecutionRecorder } from "./executionRecorder.js";
|
|
5
|
+
import { MockStatusRecorder } from "./mockStatusRecorder.js";
|
|
6
|
+
import { CoverageRecorder } from "./covRecorder.js";
|
|
7
|
+
import { handleWebAssemblyError } from "../utils/errorTraceHandler.js";
|
|
8
|
+
import { injectDefaultFunction } from "../utils/index.js";
|
|
9
|
+
async function nodeExecutor(wasmModule, filterByName, imports) {
|
|
10
|
+
const executionRecorder = new ExecutionRecorder();
|
|
11
|
+
const coverageRecorder = new CoverageRecorder();
|
|
12
|
+
const mockStatusRecorder = new MockStatusRecorder();
|
|
13
|
+
const importsArg = new ImportsArgument(executionRecorder);
|
|
14
|
+
const userDefinedImportsObject = imports === undefined ? {} : imports(importsArg);
|
|
15
|
+
const importObject = {
|
|
16
|
+
__unittest_framework_env: {
|
|
17
|
+
...executionRecorder.getCollectionFuncSet(importsArg),
|
|
18
|
+
...mockStatusRecorder.getMockFuncSet(),
|
|
19
|
+
...coverageRecorder.getCollectionFuncSet(),
|
|
20
|
+
},
|
|
21
|
+
...userDefinedImportsObject,
|
|
22
|
+
};
|
|
23
|
+
const wasmImports = await wasmModule.getImports();
|
|
24
|
+
injectDefaultFunction(wasmImports, importObject, importsArg);
|
|
25
|
+
const ins = await instantiate(await wasmModule.getModule(), importObject);
|
|
26
|
+
importsArg.module = ins.module;
|
|
27
|
+
importsArg.instance = ins.instance;
|
|
28
|
+
importsArg.exports = ins.exports;
|
|
29
|
+
let isCrashed = false; // we don't want to crash any code after crash. AS' heap may be broken.
|
|
30
|
+
const exceptionHandler = async (error) => {
|
|
31
|
+
if (error instanceof WebAssembly.RuntimeError) {
|
|
32
|
+
isCrashed = true;
|
|
33
|
+
const errorMessage = await handleWebAssemblyError(error, wasmModule);
|
|
34
|
+
executionRecorder.notifyTestCrash(errorMessage);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// unrecoverable error, rethrow
|
|
38
|
+
if (error instanceof Error) {
|
|
39
|
+
console.error(error.stack);
|
|
40
|
+
}
|
|
41
|
+
throw new Error("node executor abort");
|
|
42
|
+
};
|
|
43
|
+
await executionRecorder.runTestFunction(`${wasmModule.baseName} - init`, () => {
|
|
44
|
+
ins.exports["__unit_test_start"]();
|
|
45
|
+
}, exceptionHandler);
|
|
46
|
+
const execTestFunction = (functionIndex) => {
|
|
47
|
+
ins.exports.table.get(functionIndex)();
|
|
48
|
+
};
|
|
49
|
+
for (const testCase of executionRecorder.testCases) {
|
|
50
|
+
if (isCrashed) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
const { fullName, functionIndex, setupFunctions, teardownFunctions } = testCase;
|
|
54
|
+
if (filterByName(fullName)) {
|
|
55
|
+
await executionRecorder.runTestFunction(fullName, () => {
|
|
56
|
+
for (const setupFuncIndex of setupFunctions) {
|
|
57
|
+
execTestFunction(setupFuncIndex);
|
|
58
|
+
}
|
|
59
|
+
execTestFunction(functionIndex);
|
|
60
|
+
for (const teardownFuncIndex of teardownFunctions) {
|
|
61
|
+
execTestFunction(teardownFuncIndex);
|
|
62
|
+
}
|
|
63
|
+
}, exceptionHandler);
|
|
64
|
+
mockStatusRecorder.clear();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
coverageRecorder.outputTrace(wasmModule.traceFile);
|
|
68
|
+
return executionRecorder.result;
|
|
69
|
+
}
|
|
70
|
+
export async function execWasmBinaries(wasmModule, filterByName, imports) {
|
|
71
|
+
const assertRes = new ExecutionResultSummary();
|
|
72
|
+
const result = await nodeExecutor(wasmModule, filterByName, imports);
|
|
73
|
+
await assertRes.merge(result, wasmModule);
|
|
74
|
+
return assertRes;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../tools/test_runner/core/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { UnitTestFramework, ImportsArgument } from "../interface.js";
|
|
2
|
+
import { AssertFailMessage, IExecutionResult, FailedLogMessages, CrashInfo } from "../utils/interface.js";
|
|
3
|
+
import { ExecutionError } from "../utils/errorTraceHandler.js";
|
|
4
|
+
declare class LogRecorder {
|
|
5
|
+
#private;
|
|
6
|
+
addLog(msg: string): void;
|
|
7
|
+
markTestFailed(): void;
|
|
8
|
+
reset(): void;
|
|
9
|
+
onFinishTest(): string[] | null;
|
|
10
|
+
}
|
|
11
|
+
export declare class ExecutionResult implements IExecutionResult {
|
|
12
|
+
total: number;
|
|
13
|
+
fail: number;
|
|
14
|
+
failedInfo: AssertFailMessage;
|
|
15
|
+
crashInfo: CrashInfo;
|
|
16
|
+
failedLogMessages: FailedLogMessages;
|
|
17
|
+
}
|
|
18
|
+
declare class TestBlock {
|
|
19
|
+
description: string;
|
|
20
|
+
constructor(description: string);
|
|
21
|
+
setupFunctions: number[];
|
|
22
|
+
teardownFunctions: number[];
|
|
23
|
+
}
|
|
24
|
+
export declare class TestCase {
|
|
25
|
+
functionIndex: number;
|
|
26
|
+
fullName: string;
|
|
27
|
+
setupFunctions: number[];
|
|
28
|
+
teardownFunctions: number[];
|
|
29
|
+
constructor(testBlockStack: TestBlock[], functionIndex: number);
|
|
30
|
+
}
|
|
31
|
+
export declare class ExecutionRecorder implements UnitTestFramework {
|
|
32
|
+
#private;
|
|
33
|
+
result: ExecutionResult;
|
|
34
|
+
testBlockStack: TestBlock[];
|
|
35
|
+
testCases: TestCase[];
|
|
36
|
+
currentExecutedTestCaseFullName: string;
|
|
37
|
+
logRecorder: LogRecorder;
|
|
38
|
+
_addDescription(description: string): void;
|
|
39
|
+
_removeDescription(): void;
|
|
40
|
+
get lastTestBlock(): TestBlock | undefined;
|
|
41
|
+
_registerSetup(functionIndex: number): boolean;
|
|
42
|
+
_registerTeardown(functionIndex: number): boolean;
|
|
43
|
+
_addTestCase(functionIndex: number): void;
|
|
44
|
+
_startTestFunction(fullName: string): void;
|
|
45
|
+
_finishTestFunction(): void;
|
|
46
|
+
runTestFunction(fullName: string, runner: () => Promise<void> | void, exceptionHandler: (error: unknown) => Promise<void>): Promise<void>;
|
|
47
|
+
notifyTestCrash(error: ExecutionError): void;
|
|
48
|
+
collectCheckResult(result: boolean, codeInfoIndex: number, actualValue: string, expectValue: string): void;
|
|
49
|
+
log(msg: string): void;
|
|
50
|
+
getCollectionFuncSet(arg: ImportsArgument): Record<string, unknown>;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
class LogRecorder {
|
|
3
|
+
#currentTestLogMessages = [];
|
|
4
|
+
#isTestFailed = false;
|
|
5
|
+
addLog(msg) {
|
|
6
|
+
this.#currentTestLogMessages.push(msg);
|
|
7
|
+
}
|
|
8
|
+
markTestFailed() {
|
|
9
|
+
this.#isTestFailed = true;
|
|
10
|
+
}
|
|
11
|
+
reset() {
|
|
12
|
+
this.#currentTestLogMessages = [];
|
|
13
|
+
this.#isTestFailed = false;
|
|
14
|
+
}
|
|
15
|
+
onFinishTest() {
|
|
16
|
+
if (this.#currentTestLogMessages.length === 0) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
if (this.#isTestFailed === false) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return this.#currentTestLogMessages;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class ExecutionResult {
|
|
26
|
+
total = 0;
|
|
27
|
+
fail = 0;
|
|
28
|
+
failedInfo = {};
|
|
29
|
+
crashInfo = new Set();
|
|
30
|
+
failedLogMessages = {};
|
|
31
|
+
}
|
|
32
|
+
class TestBlock {
|
|
33
|
+
description;
|
|
34
|
+
constructor(description) {
|
|
35
|
+
this.description = description;
|
|
36
|
+
}
|
|
37
|
+
setupFunctions = [];
|
|
38
|
+
teardownFunctions = [];
|
|
39
|
+
}
|
|
40
|
+
export class TestCase {
|
|
41
|
+
functionIndex;
|
|
42
|
+
fullName;
|
|
43
|
+
setupFunctions;
|
|
44
|
+
teardownFunctions;
|
|
45
|
+
constructor(testBlockStack, functionIndex) {
|
|
46
|
+
this.functionIndex = functionIndex;
|
|
47
|
+
this.fullName = testBlockStack.map((block) => block.description).join(" ");
|
|
48
|
+
this.setupFunctions = testBlockStack.flatMap((block) => block.setupFunctions);
|
|
49
|
+
this.teardownFunctions = testBlockStack.flatMap((block) => block.teardownFunctions);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class ExecutionRecorder {
|
|
53
|
+
result = new ExecutionResult();
|
|
54
|
+
testBlockStack = [];
|
|
55
|
+
testCases = [];
|
|
56
|
+
currentExecutedTestCaseFullName = "";
|
|
57
|
+
logRecorder = new LogRecorder();
|
|
58
|
+
_addDescription(description) {
|
|
59
|
+
this.testBlockStack.push(new TestBlock(description));
|
|
60
|
+
}
|
|
61
|
+
_removeDescription() {
|
|
62
|
+
this.testBlockStack.pop();
|
|
63
|
+
}
|
|
64
|
+
get lastTestBlock() {
|
|
65
|
+
return this.testBlockStack.at(-1);
|
|
66
|
+
}
|
|
67
|
+
// return false if error
|
|
68
|
+
_registerSetup(functionIndex) {
|
|
69
|
+
const lastTestBlock = this.lastTestBlock;
|
|
70
|
+
if (lastTestBlock === undefined) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
lastTestBlock.setupFunctions.push(functionIndex);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// return false if error
|
|
79
|
+
_registerTeardown(functionIndex) {
|
|
80
|
+
const lastTestBlock = this.lastTestBlock;
|
|
81
|
+
if (lastTestBlock === undefined) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
lastTestBlock.teardownFunctions.push(functionIndex);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
_addTestCase(functionIndex) {
|
|
90
|
+
this.testCases.push(new TestCase(this.testBlockStack, functionIndex));
|
|
91
|
+
}
|
|
92
|
+
_startTestFunction(fullName) {
|
|
93
|
+
this.currentExecutedTestCaseFullName = fullName;
|
|
94
|
+
this.logRecorder.reset();
|
|
95
|
+
}
|
|
96
|
+
_finishTestFunction() {
|
|
97
|
+
const logMessages = this.logRecorder.onFinishTest();
|
|
98
|
+
if (logMessages !== null) {
|
|
99
|
+
this.result.failedLogMessages[this.currentExecutedTestCaseFullName] = (this.result.failedLogMessages[this.currentExecutedTestCaseFullName] || []).concat(logMessages);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async runTestFunction(fullName, runner, exceptionHandler) {
|
|
103
|
+
this._startTestFunction(fullName);
|
|
104
|
+
try {
|
|
105
|
+
const r = runner();
|
|
106
|
+
if (r instanceof Promise) {
|
|
107
|
+
await r;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
await exceptionHandler(error);
|
|
112
|
+
}
|
|
113
|
+
this._finishTestFunction();
|
|
114
|
+
}
|
|
115
|
+
notifyTestCrash(error) {
|
|
116
|
+
this.logRecorder.addLog(`Reason: ${chalk.red(error.message)}`);
|
|
117
|
+
this.logRecorder.addLog(error.stacks
|
|
118
|
+
.map((stack) => ` at ${stack.functionName} (${stack.fileName}:${stack.lineNumber}:${stack.columnNumber})`)
|
|
119
|
+
.join("\n"));
|
|
120
|
+
this.result.crashInfo.add(this.currentExecutedTestCaseFullName);
|
|
121
|
+
this.result.total++; // fake test cases
|
|
122
|
+
this.#increaseFailureCount();
|
|
123
|
+
}
|
|
124
|
+
collectCheckResult(result, codeInfoIndex, actualValue, expectValue) {
|
|
125
|
+
this.result.total++;
|
|
126
|
+
if (!result) {
|
|
127
|
+
this.#increaseFailureCount();
|
|
128
|
+
const testCaseFullName = this.currentExecutedTestCaseFullName;
|
|
129
|
+
const assertMessage = [codeInfoIndex.toString(), actualValue, expectValue];
|
|
130
|
+
this.result.failedInfo[testCaseFullName] = this.result.failedInfo[testCaseFullName] || [];
|
|
131
|
+
this.result.failedInfo[testCaseFullName].push(assertMessage);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
log(msg) {
|
|
135
|
+
this.logRecorder.addLog(msg);
|
|
136
|
+
}
|
|
137
|
+
getCollectionFuncSet(arg) {
|
|
138
|
+
return {
|
|
139
|
+
addDescription: (description) => {
|
|
140
|
+
this._addDescription(arg.exports.__getString(description));
|
|
141
|
+
},
|
|
142
|
+
removeDescription: () => {
|
|
143
|
+
this._removeDescription();
|
|
144
|
+
},
|
|
145
|
+
registerTestFunction: (index) => {
|
|
146
|
+
this._addTestCase(index);
|
|
147
|
+
},
|
|
148
|
+
registerBeforeEachFunction: (index) => {
|
|
149
|
+
return this._registerSetup(index);
|
|
150
|
+
},
|
|
151
|
+
registerAfterEachFunction: (index) => {
|
|
152
|
+
return this._registerTeardown(index);
|
|
153
|
+
},
|
|
154
|
+
collectCheckResult: (result, codeInfoIndex, actualValue, expectValue) => {
|
|
155
|
+
this.collectCheckResult(result !== 0, codeInfoIndex, arg.exports.__getString(actualValue), arg.exports.__getString(expectValue));
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
#increaseFailureCount() {
|
|
160
|
+
this.result.fail++;
|
|
161
|
+
this.logRecorder.markTestFailed();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=executionRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executionRecorder.js","sourceRoot":"","sources":["../../../tools/test_runner/core/executionRecorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class MockStatusRecorder {
|
|
2
|
+
private _mockStatus;
|
|
3
|
+
private hasMocked;
|
|
4
|
+
_checkMock(functionIndex: number, isCall: boolean): number;
|
|
5
|
+
_setMockFunction(originalFunctionIndex: number, mockFunctionIndex: number): void;
|
|
6
|
+
_getMockedFunctionCalls(originalFunctionIndex: number, mockFunctionIndex: number): number;
|
|
7
|
+
_setMockedFunctionIgnore(originalFunctionIndex: number, ignore: boolean): void;
|
|
8
|
+
clear(): void;
|
|
9
|
+
getMockFuncSet(): Record<string, unknown>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export class MockStatusRecorder {
|
|
2
|
+
_mockStatus = new Map();
|
|
3
|
+
hasMocked(functionIndex) {
|
|
4
|
+
const mockObject = this._mockStatus.get(functionIndex);
|
|
5
|
+
if (mockObject === undefined) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
return !mockObject.ignore;
|
|
9
|
+
}
|
|
10
|
+
// isCall = true, return -1 if not mocked;
|
|
11
|
+
// isCall = false, return oldIndex if not mocked.
|
|
12
|
+
_checkMock(functionIndex, isCall) {
|
|
13
|
+
if (this.hasMocked(functionIndex)) {
|
|
14
|
+
const mockObject = this._mockStatus.get(functionIndex);
|
|
15
|
+
mockObject.calls++;
|
|
16
|
+
return mockObject.mockFunctionIndex;
|
|
17
|
+
}
|
|
18
|
+
return isCall ? -1 : functionIndex;
|
|
19
|
+
}
|
|
20
|
+
_setMockFunction(originalFunctionIndex, mockFunctionIndex) {
|
|
21
|
+
const mockObject = {
|
|
22
|
+
calls: 0,
|
|
23
|
+
ignore: false,
|
|
24
|
+
mockFunctionIndex,
|
|
25
|
+
};
|
|
26
|
+
this._mockStatus.set(originalFunctionIndex, mockObject);
|
|
27
|
+
}
|
|
28
|
+
_getMockedFunctionCalls(originalFunctionIndex, mockFunctionIndex) {
|
|
29
|
+
const mockObject = this._mockStatus.get(originalFunctionIndex);
|
|
30
|
+
if (mockObject === undefined || mockObject.mockFunctionIndex !== mockFunctionIndex) {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
return mockObject.calls;
|
|
34
|
+
}
|
|
35
|
+
_setMockedFunctionIgnore(originalFunctionIndex, ignore) {
|
|
36
|
+
const mockObject = this._mockStatus.get(originalFunctionIndex);
|
|
37
|
+
if (mockObject === undefined) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
mockObject.ignore = ignore;
|
|
41
|
+
}
|
|
42
|
+
clear() {
|
|
43
|
+
this._mockStatus.clear();
|
|
44
|
+
}
|
|
45
|
+
getMockFuncSet() {
|
|
46
|
+
return {
|
|
47
|
+
checkMock: (functionIndex, isCall) => {
|
|
48
|
+
return this._checkMock(functionIndex, isCall);
|
|
49
|
+
},
|
|
50
|
+
setMockFunction: (originalFunctionIndex, mockFunctionIndex) => {
|
|
51
|
+
this._setMockFunction(originalFunctionIndex, mockFunctionIndex);
|
|
52
|
+
},
|
|
53
|
+
getMockedFunctionCalls: (originalFunctionIndex, mockFunctionIndex) => {
|
|
54
|
+
return this._getMockedFunctionCalls(originalFunctionIndex, mockFunctionIndex);
|
|
55
|
+
},
|
|
56
|
+
setMockedFunctionIgnore: (originalFunctionIndex, ignore) => {
|
|
57
|
+
this._setMockedFunctionIgnore(originalFunctionIndex, ignore);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=mockStatusRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockStatusRecorder.js","sourceRoot":"","sources":["../../../tools/test_runner/core/mockStatusRecorder.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,kBAAkB;IACrB,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE5C,SAAS,CAAC,aAAqB;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,2CAA2C;IAC3C,iDAAiD;IACjD,UAAU,CAAC,aAAqB,EAAE,MAAe;QAC/C,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvD,UAAW,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,UAAW,CAAC,iBAAiB,CAAC;QACvC,CAAC;QACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACrC,CAAC;IAED,gBAAgB,CAAC,qBAA6B,EAAE,iBAAyB;QACvE,MAAM,UAAU,GAAe;YAC7B,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,KAAK;YACb,iBAAiB;SAClB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,uBAAuB,CAAC,qBAA6B,EAAE,iBAAyB;QAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC/D,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,iBAAiB,KAAK,iBAAiB,EAAE,CAAC;YACnF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,wBAAwB,CAAC,qBAA6B,EAAE,MAAe;QACrE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC/D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,OAAO;YACL,SAAS,EAAE,CAAC,aAAqB,EAAE,MAAe,EAAU,EAAE;gBAC5D,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;YACD,eAAe,EAAE,CAAC,qBAA6B,EAAE,iBAAyB,EAAQ,EAAE;gBAClF,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;YAClE,CAAC;YACD,sBAAsB,EAAE,CAAC,qBAA6B,EAAE,iBAAyB,EAAU,EAAE;gBAC3F,OAAO,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;YAChF,CAAC;YACD,uBAAuB,EAAE,CAAC,qBAA6B,EAAE,MAAe,EAAQ,EAAE;gBAChF,IAAI,CAAC,wBAAwB,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC/D,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FailedInfoMap, IExecutionResult } from "./utils/interface.js";
|
|
2
|
+
import { WebAssemblyModule } from "./utils/wasm.js";
|
|
3
|
+
export declare class ExecutionResultSummary {
|
|
4
|
+
#private;
|
|
5
|
+
fail: number;
|
|
6
|
+
total: number;
|
|
7
|
+
failedInfos: FailedInfoMap;
|
|
8
|
+
merge(result: IExecutionResult, wasmModule: WebAssemblyModule): Promise<void>;
|
|
9
|
+
writeFailures(failuresPath: string): Promise<void>;
|
|
10
|
+
print(log: (msg: string) => void): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { promises } from "node:fs";
|
|
2
|
+
import { json2map } from "./utils/index.js";
|
|
3
|
+
import { TEST_EXPECT_INFO_SECTION_NAME, } from "./utils/interface.js";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import assert from "node:assert";
|
|
6
|
+
const { writeFile } = promises;
|
|
7
|
+
export class ExecutionResultSummary {
|
|
8
|
+
fail = 0;
|
|
9
|
+
total = 0;
|
|
10
|
+
failedInfos = new Map();
|
|
11
|
+
#prepareFailedInfos(testcaseName) {
|
|
12
|
+
if (this.failedInfos.has(testcaseName)) {
|
|
13
|
+
return this.failedInfos.get(testcaseName);
|
|
14
|
+
}
|
|
15
|
+
const failedInfo = {
|
|
16
|
+
hasCrash: false,
|
|
17
|
+
assertMessages: [],
|
|
18
|
+
logMessages: [],
|
|
19
|
+
};
|
|
20
|
+
this.failedInfos.set(testcaseName, failedInfo);
|
|
21
|
+
return failedInfo;
|
|
22
|
+
}
|
|
23
|
+
#processAssertInfo(failedInfo, expectInfo) {
|
|
24
|
+
for (const [testcaseName, value] of json2map(failedInfo)) {
|
|
25
|
+
const errorMsgs = [];
|
|
26
|
+
for (const msg of value) {
|
|
27
|
+
const [expectInfoIndex, actualValue, expectValue] = msg;
|
|
28
|
+
assert(expectInfo !== null && "missing expect info!");
|
|
29
|
+
const debugLocation = expectInfo[expectInfoIndex];
|
|
30
|
+
let errorMsg = `${debugLocation ?? ""} value: ${actualValue} expect: ${expectValue}`;
|
|
31
|
+
if (errorMsg.length > 160) {
|
|
32
|
+
errorMsg = `${debugLocation ?? ""}\nvalue: \n ${actualValue}\nexpect: \n ${expectValue}`;
|
|
33
|
+
}
|
|
34
|
+
errorMsgs.push(errorMsg);
|
|
35
|
+
}
|
|
36
|
+
this.#prepareFailedInfos(testcaseName).assertMessages =
|
|
37
|
+
this.#prepareFailedInfos(testcaseName).assertMessages.concat(errorMsgs);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
#processCrashInfo(crashInfo) {
|
|
41
|
+
for (const testcaseName of crashInfo) {
|
|
42
|
+
this.#prepareFailedInfos(testcaseName).hasCrash = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* It should be called after other error processed to append log messages.
|
|
47
|
+
*/
|
|
48
|
+
#processLogMessages(failedLogMessages) {
|
|
49
|
+
for (const [testcaseName, failedInfo] of this.failedInfos) {
|
|
50
|
+
if (failedLogMessages[testcaseName] !== undefined) {
|
|
51
|
+
failedInfo.logMessages = failedInfo.logMessages.concat(failedLogMessages[testcaseName]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async merge(result, wasmModule) {
|
|
56
|
+
this.fail += result.fail;
|
|
57
|
+
this.total += result.total;
|
|
58
|
+
if (result.fail > 0) {
|
|
59
|
+
try {
|
|
60
|
+
const jsonText = await wasmModule.getCustomSectionUtf8(TEST_EXPECT_INFO_SECTION_NAME);
|
|
61
|
+
if (jsonText === null) {
|
|
62
|
+
throw new Error(`missing wasm custom section '${TEST_EXPECT_INFO_SECTION_NAME}' in ${wasmModule.wasm}`);
|
|
63
|
+
}
|
|
64
|
+
const expectInfo = JSON.parse(jsonText);
|
|
65
|
+
this.#processAssertInfo(result.failedInfo, expectInfo);
|
|
66
|
+
this.#processCrashInfo(result.crashInfo);
|
|
67
|
+
this.#processLogMessages(result.failedLogMessages);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof Error) {
|
|
71
|
+
console.error(error.stack);
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async writeFailures(failuresPath) {
|
|
78
|
+
await writeFile(failuresPath, JSON.stringify(Array.from(this.failedInfos.keys())));
|
|
79
|
+
}
|
|
80
|
+
print(log) {
|
|
81
|
+
const rate = (this.fail === 0 ? chalk.greenBright(this.total) : chalk.redBright(this.total - this.fail)) +
|
|
82
|
+
"/" +
|
|
83
|
+
this.total.toString();
|
|
84
|
+
log(`\ntest case: ${rate} (success/total)`);
|
|
85
|
+
if (this.fail !== 0) {
|
|
86
|
+
log("");
|
|
87
|
+
this.#printErrorMessage(log);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
#printErrorMessage(log) {
|
|
91
|
+
log(chalk.red("Error Message: "));
|
|
92
|
+
// sort failedInfos by testcaseName to keep stability for e2e testing
|
|
93
|
+
const failedInfosArray = Array.from(this.failedInfos.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
94
|
+
for (const [testcaseName, { hasCrash, assertMessages, logMessages }] of failedInfosArray) {
|
|
95
|
+
log(` ${testcaseName}: `);
|
|
96
|
+
for (const assertMessage of assertMessages) {
|
|
97
|
+
log(" " + chalk.yellow(assertMessage));
|
|
98
|
+
}
|
|
99
|
+
if (hasCrash) {
|
|
100
|
+
log(" " + chalk.red("Test Crashed!"));
|
|
101
|
+
}
|
|
102
|
+
for (const logMessage of logMessages ?? []) {
|
|
103
|
+
log(chalk.gray(logMessage));
|
|
104
|
+
}
|
|
105
|
+
if (logMessages.length > 0) {
|
|
106
|
+
// empty line to separate test
|
|
107
|
+
log("");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=executionResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executionResult.js","sourceRoot":"","sources":["../../tools/test_runner/executionResult.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { CodeCoverage } from "../../utils/interface.js";
|
|
2
|
+
import { escape } from "../../utils/escape.js";
|
|
3
|
+
import { OrganizationName, Repository } from "../../utils/name.js";
|
|
4
|
+
function generateLineCount(totalLines) {
|
|
5
|
+
const str = [];
|
|
6
|
+
for (let line = 0; line < totalLines; line++) {
|
|
7
|
+
str.push(`<a name='L${line}'></a><a href='#L${line}'>${line}</a>`);
|
|
8
|
+
}
|
|
9
|
+
return str.join("\n");
|
|
10
|
+
}
|
|
11
|
+
function generateLineCoverage(codes) {
|
|
12
|
+
const str = [];
|
|
13
|
+
for (const code of codes) {
|
|
14
|
+
if (code.usedCount === CodeCoverage.default) {
|
|
15
|
+
str.push(`<span class="cline-any cline-neutral"> </span>`);
|
|
16
|
+
}
|
|
17
|
+
else if (code.usedCount === 0) {
|
|
18
|
+
str.push(`<span class="cline-any cline-no">${code.usedCount}x</span>`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
str.push(`<span class="cline-any cline-yes">${code.usedCount}x</span>`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return str.join("\n");
|
|
25
|
+
}
|
|
26
|
+
function generateSource(codes, uncoveredLines) {
|
|
27
|
+
const str = [];
|
|
28
|
+
for (const [index, code] of codes.entries()) {
|
|
29
|
+
if (uncoveredLines.has(index + 1)) {
|
|
30
|
+
// IMPORTANT! to add "nocode" here to preventing prettify from adding unwanted pln class
|
|
31
|
+
str.push('<span class="missing-if-branch nocode" title="Branch not taken">!</span>' + escape(code.source));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
str.push(escape(code.source));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return str.join("\n");
|
|
38
|
+
}
|
|
39
|
+
export function generateCodeHtml(relativePathOfRoot, result) {
|
|
40
|
+
const codes = result.sourceUsedCount;
|
|
41
|
+
const lineCoutHtml = generateLineCount(codes.length);
|
|
42
|
+
const lineCov = generateLineCoverage(codes);
|
|
43
|
+
const lineSource = generateSource(codes, result.uncoveredLines);
|
|
44
|
+
return `
|
|
45
|
+
<!DOCTYPE html>
|
|
46
|
+
<html lang="en">
|
|
47
|
+
<head>
|
|
48
|
+
<title>Code coverage report for ${result.filename}</title>
|
|
49
|
+
<meta charset="utf-8" />
|
|
50
|
+
<link rel="stylesheet" href="${relativePathOfRoot}/resource/prettify.css" />
|
|
51
|
+
<link rel="stylesheet" href="${relativePathOfRoot}/resource/base.css" />
|
|
52
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
53
|
+
<style type="text/css">
|
|
54
|
+
.coverage-summary .sorter {
|
|
55
|
+
background-image: url(${relativePathOfRoot}/resource/sort-arrow-sprite.png);
|
|
56
|
+
}
|
|
57
|
+
</style>
|
|
58
|
+
</head>
|
|
59
|
+
|
|
60
|
+
<body>
|
|
61
|
+
<div class="wrapper">
|
|
62
|
+
<div class="pad1">
|
|
63
|
+
<h1><a href="${relativePathOfRoot}/index.html">All files</a> / ${result.filename}</h1>
|
|
64
|
+
<div class="clearfix">
|
|
65
|
+
<div class="fl pad1y space-right2">
|
|
66
|
+
<span class="strong">${result.statementCoverageRate.getRate()}% </span>
|
|
67
|
+
<span class="quiet">Statements</span>
|
|
68
|
+
<span class="fraction">${result.statementCoverageRate.toString()}</span>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<div class="fl pad1y space-right2">
|
|
72
|
+
<span class="strong">${result.branchCoverageRate.getRate()}% </span>
|
|
73
|
+
<span class="quiet">Branches</span>
|
|
74
|
+
<span class="fraction">${result.branchCoverageRate.toString()}</span>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div class="fl pad1y space-right2">
|
|
78
|
+
<span class="strong">${result.functionCoverageRate.getRate()}% </span>
|
|
79
|
+
<span class="quiet">Functions</span>
|
|
80
|
+
<span class="fraction">${result.functionCoverageRate.toString()}</span>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<div class="fl pad1y space-right2">
|
|
84
|
+
<span class="strong">${result.lineCoverageRate.getRate()}% </span>
|
|
85
|
+
<span class="quiet">Lines</span>
|
|
86
|
+
<span class="fraction">${result.lineCoverageRate.toString()}</span>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
<p class="quiet">
|
|
90
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the
|
|
91
|
+
previous block.
|
|
92
|
+
</p>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="status-line high"></div>
|
|
95
|
+
<pre>
|
|
96
|
+
<table class="coverage">
|
|
97
|
+
<tr>
|
|
98
|
+
<td class="line-count quiet">${lineCoutHtml}</td><td class="line-coverage quiet">${lineCov}</td><td class="text"><pre class="prettyprint lang-js">${lineSource}</pre></td>
|
|
99
|
+
</tr>
|
|
100
|
+
</table>
|
|
101
|
+
</pre>
|
|
102
|
+
<div class="push"></div>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<div class="footer quiet pad2 space-top1 center small">
|
|
106
|
+
Code coverage generated by
|
|
107
|
+
<a href="${Repository}" target="_blank">${OrganizationName}</a>
|
|
108
|
+
at ${new Date().toUTCString()}
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<script src="${relativePathOfRoot}/resource/prettify.js"></script>
|
|
112
|
+
<script>
|
|
113
|
+
window.onload = function () {
|
|
114
|
+
prettyPrint();
|
|
115
|
+
};
|
|
116
|
+
</script>
|
|
117
|
+
<script src="${relativePathOfRoot}/resource/sorter.js"></script>
|
|
118
|
+
<script src="${relativePathOfRoot}/resource/block-navigation.js"></script>
|
|
119
|
+
</body>
|
|
120
|
+
</html>
|
|
121
|
+
|
|
122
|
+
`;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=genCode.js.map
|