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.
Files changed (111) hide show
  1. package/dist/debug_server/dapServer.d.ts +1 -0
  2. package/dist/debug_server/dapServer.js +27 -0
  3. package/dist/debug_server/dapServer.js.map +1 -0
  4. package/dist/debug_server/debugSession.d.ts +19 -0
  5. package/dist/debug_server/debugSession.js +71 -0
  6. package/dist/debug_server/debugSession.js.map +1 -0
  7. package/dist/debug_server/tests/debugSession.test.d.ts +1 -0
  8. package/dist/debug_server/tests/debugSession.test.js +61 -0
  9. package/dist/debug_server/tests/debugSession.test.js.map +1 -0
  10. package/dist/debug_server/tests/launcher.d.ts +10 -0
  11. package/dist/debug_server/tests/launcher.js +21 -0
  12. package/dist/debug_server/tests/launcher.js.map +1 -0
  13. package/dist/scripts/lib.d.ts +7 -0
  14. package/dist/{lib.js → scripts/lib.js} +20 -6
  15. package/dist/scripts/lib.js.map +1 -0
  16. package/dist/test_runner/cli.d.ts +2 -0
  17. package/dist/test_runner/cli.js +85 -0
  18. package/dist/test_runner/cli.js.map +1 -0
  19. package/dist/test_runner/core/analyze.d.ts +13 -0
  20. package/dist/test_runner/core/analyze.js +58 -0
  21. package/dist/test_runner/core/analyze.js.map +1 -0
  22. package/dist/test_runner/core/compile.d.ts +4 -0
  23. package/dist/test_runner/core/compile.js +23 -0
  24. package/dist/test_runner/core/compile.js.map +1 -0
  25. package/dist/test_runner/core/compiler.d.ts +11 -0
  26. package/dist/test_runner/core/compiler.js +47 -0
  27. package/dist/test_runner/core/compiler.js.map +1 -0
  28. package/dist/test_runner/core/covRecorder.d.ts +5 -0
  29. package/dist/test_runner/core/covRecorder.js +26 -0
  30. package/dist/test_runner/core/covRecorder.js.map +1 -0
  31. package/dist/test_runner/core/execute.d.ts +4 -0
  32. package/dist/test_runner/core/execute.js +76 -0
  33. package/dist/test_runner/core/execute.js.map +1 -0
  34. package/dist/test_runner/core/executionRecorder.d.ts +52 -0
  35. package/dist/test_runner/core/executionRecorder.js +164 -0
  36. package/dist/test_runner/core/executionRecorder.js.map +1 -0
  37. package/dist/test_runner/core/mockStatusRecorder.d.ts +10 -0
  38. package/dist/test_runner/core/mockStatusRecorder.js +62 -0
  39. package/dist/test_runner/core/mockStatusRecorder.js.map +1 -0
  40. package/dist/test_runner/executionResult.d.ts +11 -0
  41. package/dist/test_runner/executionResult.js +112 -0
  42. package/dist/test_runner/executionResult.js.map +1 -0
  43. package/dist/test_runner/generator/html-generator/genCode.d.ts +2 -0
  44. package/dist/test_runner/generator/html-generator/genCode.js +124 -0
  45. package/dist/test_runner/generator/html-generator/genCode.js.map +1 -0
  46. package/dist/test_runner/generator/html-generator/genFolder.d.ts +2 -0
  47. package/dist/test_runner/generator/html-generator/genFolder.js +155 -0
  48. package/dist/test_runner/generator/html-generator/genFolder.js.map +1 -0
  49. package/dist/test_runner/generator/html-generator/index.d.ts +2 -0
  50. package/dist/test_runner/generator/html-generator/index.js +33 -0
  51. package/dist/test_runner/generator/html-generator/index.js.map +1 -0
  52. package/dist/test_runner/generator/index.d.ts +9 -0
  53. package/dist/test_runner/generator/index.js +30 -0
  54. package/dist/test_runner/generator/index.js.map +1 -0
  55. package/dist/test_runner/generator/json-generator/index.d.ts +2 -0
  56. package/dist/test_runner/generator/json-generator/index.js +45 -0
  57. package/dist/test_runner/generator/json-generator/index.js.map +1 -0
  58. package/dist/test_runner/generator/table-generator/index.d.ts +2 -0
  59. package/dist/test_runner/generator/table-generator/index.js +85 -0
  60. package/dist/test_runner/generator/table-generator/index.js.map +1 -0
  61. package/dist/test_runner/index.d.ts +3 -0
  62. package/dist/test_runner/index.js +70 -0
  63. package/dist/test_runner/index.js.map +1 -0
  64. package/dist/test_runner/interface.d.ts +36 -0
  65. package/dist/test_runner/interface.js +12 -0
  66. package/dist/test_runner/interface.js.map +1 -0
  67. package/dist/test_runner/parser/index.d.ts +35 -0
  68. package/dist/test_runner/parser/index.js +146 -0
  69. package/dist/test_runner/parser/index.js.map +1 -0
  70. package/dist/test_runner/parser/singleFileAnalysis.d.ts +8 -0
  71. package/dist/test_runner/parser/singleFileAnalysis.js +51 -0
  72. package/dist/test_runner/parser/singleFileAnalysis.js.map +1 -0
  73. package/dist/test_runner/parser/singleFunctionAnalysis.d.ts +16 -0
  74. package/dist/test_runner/parser/singleFunctionAnalysis.js +97 -0
  75. package/dist/test_runner/parser/singleFunctionAnalysis.js.map +1 -0
  76. package/dist/test_runner/testOption.d.ts +16 -0
  77. package/dist/test_runner/testOption.js +2 -0
  78. package/dist/test_runner/testOption.js.map +1 -0
  79. package/dist/test_runner/utils/errorTraceHandler.d.ts +12 -0
  80. package/dist/test_runner/utils/errorTraceHandler.js +87 -0
  81. package/dist/test_runner/utils/errorTraceHandler.js.map +1 -0
  82. package/dist/test_runner/utils/escape.d.ts +1 -0
  83. package/dist/test_runner/utils/escape.js +14 -0
  84. package/dist/test_runner/utils/escape.js.map +1 -0
  85. package/dist/test_runner/utils/index.d.ts +14 -0
  86. package/dist/test_runner/utils/index.js +88 -0
  87. package/dist/test_runner/utils/index.js.map +1 -0
  88. package/dist/test_runner/utils/interface.d.ts +100 -0
  89. package/dist/test_runner/utils/interface.js +86 -0
  90. package/dist/test_runner/utils/interface.js.map +1 -0
  91. package/dist/test_runner/utils/name.d.ts +2 -0
  92. package/dist/test_runner/utils/name.js +3 -0
  93. package/dist/test_runner/utils/name.js.map +1 -0
  94. package/dist/test_runner/utils/pathResolver.d.ts +6 -0
  95. package/dist/test_runner/utils/pathResolver.js +98 -0
  96. package/dist/test_runner/utils/pathResolver.js.map +1 -0
  97. package/dist/test_runner/utils/projectRoot.d.ts +1 -0
  98. package/dist/test_runner/utils/projectRoot.js +4 -0
  99. package/dist/test_runner/utils/projectRoot.js.map +1 -0
  100. package/dist/test_runner/utils/wasm.d.ts +12 -0
  101. package/dist/test_runner/utils/wasm.js +45 -0
  102. package/dist/test_runner/utils/wasm.js.map +1 -0
  103. package/dist/warpo.js +10 -3
  104. package/dist/warpo.js.map +1 -0
  105. package/dist/warpo_internal.d.ts +7 -0
  106. package/dist/warpo_internal.js +74 -0
  107. package/dist/warpo_internal.js.map +1 -0
  108. package/package.json +37 -9
  109. package/types/std/index.d.ts +8 -261
  110. package/types/warpo/index.d.ts +94 -0
  111. 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,2 @@
1
+ import { FileCoverageResult } from "../../utils/interface.js";
2
+ export declare function generateCodeHtml(relativePathOfRoot: string, result: FileCoverageResult): string;
@@ -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">&nbsp;</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