warpo 2.3.0 → 2.5.0-alpha-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/asconfig.schema.json +25 -3
  2. package/create/index.ts +4 -1
  3. package/dist/debug_server/dapServer.d.ts +1 -0
  4. package/dist/debug_server/dapServer.js +27 -0
  5. package/dist/debug_server/dapServer.js.map +1 -0
  6. package/dist/debug_server/debugSession.d.ts +19 -0
  7. package/dist/debug_server/debugSession.js +71 -0
  8. package/dist/debug_server/debugSession.js.map +1 -0
  9. package/dist/debug_server/tests/debugSession.test.d.ts +1 -0
  10. package/dist/debug_server/tests/debugSession.test.js +61 -0
  11. package/dist/debug_server/tests/debugSession.test.js.map +1 -0
  12. package/dist/debug_server/tests/launcher.d.ts +10 -0
  13. package/dist/debug_server/tests/launcher.js +21 -0
  14. package/dist/debug_server/tests/launcher.js.map +1 -0
  15. package/dist/scripts/lib.d.ts +7 -0
  16. package/dist/{lib.js → scripts/lib.js} +20 -6
  17. package/dist/scripts/lib.js.map +1 -0
  18. package/dist/test_runner/cli.d.ts +2 -0
  19. package/dist/test_runner/cli.js +85 -0
  20. package/dist/test_runner/cli.js.map +1 -0
  21. package/dist/test_runner/core/analyze.d.ts +13 -0
  22. package/dist/test_runner/core/analyze.js +58 -0
  23. package/dist/test_runner/core/analyze.js.map +1 -0
  24. package/dist/test_runner/core/compile.d.ts +4 -0
  25. package/dist/test_runner/core/compile.js +23 -0
  26. package/dist/test_runner/core/compile.js.map +1 -0
  27. package/dist/test_runner/core/compiler.d.ts +11 -0
  28. package/dist/test_runner/core/compiler.js +47 -0
  29. package/dist/test_runner/core/compiler.js.map +1 -0
  30. package/dist/test_runner/core/covRecorder.d.ts +5 -0
  31. package/dist/test_runner/core/covRecorder.js +26 -0
  32. package/dist/test_runner/core/covRecorder.js.map +1 -0
  33. package/dist/test_runner/core/execute.d.ts +4 -0
  34. package/dist/test_runner/core/execute.js +76 -0
  35. package/dist/test_runner/core/execute.js.map +1 -0
  36. package/dist/test_runner/core/executionRecorder.d.ts +52 -0
  37. package/dist/test_runner/core/executionRecorder.js +164 -0
  38. package/dist/test_runner/core/executionRecorder.js.map +1 -0
  39. package/dist/test_runner/core/mockStatusRecorder.d.ts +10 -0
  40. package/dist/test_runner/core/mockStatusRecorder.js +62 -0
  41. package/dist/test_runner/core/mockStatusRecorder.js.map +1 -0
  42. package/dist/test_runner/executionResult.d.ts +11 -0
  43. package/dist/test_runner/executionResult.js +112 -0
  44. package/dist/test_runner/executionResult.js.map +1 -0
  45. package/dist/test_runner/generator/html-generator/genCode.d.ts +2 -0
  46. package/dist/test_runner/generator/html-generator/genCode.js +124 -0
  47. package/dist/test_runner/generator/html-generator/genCode.js.map +1 -0
  48. package/dist/test_runner/generator/html-generator/genFolder.d.ts +2 -0
  49. package/dist/test_runner/generator/html-generator/genFolder.js +155 -0
  50. package/dist/test_runner/generator/html-generator/genFolder.js.map +1 -0
  51. package/dist/test_runner/generator/html-generator/index.d.ts +2 -0
  52. package/dist/test_runner/generator/html-generator/index.js +33 -0
  53. package/dist/test_runner/generator/html-generator/index.js.map +1 -0
  54. package/dist/test_runner/generator/index.d.ts +9 -0
  55. package/dist/test_runner/generator/index.js +30 -0
  56. package/dist/test_runner/generator/index.js.map +1 -0
  57. package/dist/test_runner/generator/json-generator/index.d.ts +2 -0
  58. package/dist/test_runner/generator/json-generator/index.js +45 -0
  59. package/dist/test_runner/generator/json-generator/index.js.map +1 -0
  60. package/dist/test_runner/generator/table-generator/index.d.ts +2 -0
  61. package/dist/test_runner/generator/table-generator/index.js +85 -0
  62. package/dist/test_runner/generator/table-generator/index.js.map +1 -0
  63. package/dist/test_runner/index.d.ts +3 -0
  64. package/dist/test_runner/index.js +70 -0
  65. package/dist/test_runner/index.js.map +1 -0
  66. package/dist/test_runner/interface.d.ts +36 -0
  67. package/dist/test_runner/interface.js +12 -0
  68. package/dist/test_runner/interface.js.map +1 -0
  69. package/dist/test_runner/parser/index.d.ts +35 -0
  70. package/dist/test_runner/parser/index.js +146 -0
  71. package/dist/test_runner/parser/index.js.map +1 -0
  72. package/dist/test_runner/parser/singleFileAnalysis.d.ts +8 -0
  73. package/dist/test_runner/parser/singleFileAnalysis.js +51 -0
  74. package/dist/test_runner/parser/singleFileAnalysis.js.map +1 -0
  75. package/dist/test_runner/parser/singleFunctionAnalysis.d.ts +16 -0
  76. package/dist/test_runner/parser/singleFunctionAnalysis.js +97 -0
  77. package/dist/test_runner/parser/singleFunctionAnalysis.js.map +1 -0
  78. package/dist/test_runner/testOption.d.ts +16 -0
  79. package/dist/test_runner/testOption.js +2 -0
  80. package/dist/test_runner/testOption.js.map +1 -0
  81. package/dist/test_runner/utils/errorTraceHandler.d.ts +12 -0
  82. package/dist/test_runner/utils/errorTraceHandler.js +87 -0
  83. package/dist/test_runner/utils/errorTraceHandler.js.map +1 -0
  84. package/dist/test_runner/utils/escape.d.ts +1 -0
  85. package/dist/test_runner/utils/escape.js +14 -0
  86. package/dist/test_runner/utils/escape.js.map +1 -0
  87. package/dist/test_runner/utils/index.d.ts +14 -0
  88. package/dist/test_runner/utils/index.js +88 -0
  89. package/dist/test_runner/utils/index.js.map +1 -0
  90. package/dist/test_runner/utils/interface.d.ts +100 -0
  91. package/dist/test_runner/utils/interface.js +86 -0
  92. package/dist/test_runner/utils/interface.js.map +1 -0
  93. package/dist/test_runner/utils/name.d.ts +2 -0
  94. package/dist/test_runner/utils/name.js +3 -0
  95. package/dist/test_runner/utils/name.js.map +1 -0
  96. package/dist/test_runner/utils/pathResolver.d.ts +6 -0
  97. package/dist/test_runner/utils/pathResolver.js +98 -0
  98. package/dist/test_runner/utils/pathResolver.js.map +1 -0
  99. package/dist/test_runner/utils/projectRoot.d.ts +1 -0
  100. package/dist/test_runner/utils/projectRoot.js +4 -0
  101. package/dist/test_runner/utils/projectRoot.js.map +1 -0
  102. package/dist/test_runner/utils/wasm.d.ts +12 -0
  103. package/dist/test_runner/utils/wasm.js +45 -0
  104. package/dist/test_runner/utils/wasm.js.map +1 -0
  105. package/dist/warpo.d.ts +7 -1
  106. package/dist/warpo.js +83 -3
  107. package/dist/warpo.js.map +1 -0
  108. package/package.json +36 -8
  109. package/tsconfig-warpo.json +2 -3
  110. package/{assemblyscript/std/assembly → types/std}/index.d.ts +26 -340
  111. package/types/std/package.json +3 -0
  112. package/types/std/tsconfig.json +4 -0
  113. package/types/tsconfig-base.json +15 -0
  114. package/types/tsconfig-std.json +13 -0
  115. package/types/warpo/index.d.ts +95 -1
  116. package/types/wasi_snapshot_preview1/index.d.ts +52 -0
  117. package/types/wasi_snapshot_preview1/package.json +3 -0
  118. package/types/wasi_snapshot_preview1/tsconfig.json +4 -0
  119. package/dist/lib.d.ts +0 -5
@@ -0,0 +1,47 @@
1
+ import * as warpo from "../../scripts/lib.js";
2
+ export class CompilationError extends Error {
3
+ constructor(errorMessage) {
4
+ super(errorMessage);
5
+ this.name = "CompilationError";
6
+ }
7
+ }
8
+ async function buildWithWARPO({ sources, output, userDefinedFlags, collectCoverage, }) {
9
+ let warpoArgv = [
10
+ ...sources,
11
+ "-o",
12
+ output.wasm,
13
+ "--exportTable",
14
+ // avoid name conflict with user-defined start functions
15
+ "--exportStart",
16
+ "__unit_test_start",
17
+ "--debug",
18
+ // instrumentation flags
19
+ "--instrument",
20
+ ];
21
+ if (!collectCoverage) {
22
+ warpoArgv.push("--instrument-no-coverage");
23
+ }
24
+ if (userDefinedFlags.length > 0) {
25
+ // command line options compatible with ASC
26
+ // --disable => --disable-feature
27
+ // --runtime incremental => remove (only support incremental runtime in warpo)
28
+ // --memoryBase 16 => remove (not supported yet)
29
+ const argv = userDefinedFlags
30
+ .replace("--disable", "--disable-feature")
31
+ .replace("--runtime incremental", "")
32
+ .replace("--memoryBase 16", "")
33
+ .split(" ");
34
+ warpoArgv = warpoArgv.concat(argv);
35
+ }
36
+ const returnCode = await warpo.build({
37
+ argv: warpoArgv,
38
+ env: process.env,
39
+ });
40
+ if (returnCode !== 0) {
41
+ throw new CompilationError(undefined);
42
+ }
43
+ }
44
+ export async function compileImpl(option) {
45
+ await buildWithWARPO(option);
46
+ }
47
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../../tools/test_runner/core/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAG9C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,YAAgC;QAC1C,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,KAAK,UAAU,cAAc,CAAC,EAC5B,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,eAAe,GACG;IAClB,IAAI,SAAS,GAAG;QACd,GAAG,OAAO;QACV,IAAI;QACJ,MAAM,CAAC,IAAI;QACX,eAAe;QACf,wDAAwD;QACxD,eAAe;QACf,mBAAmB;QACnB,SAAS;QACT,wBAAwB;QACxB,cAAc;KACf,CAAC;IACF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,2CAA2C;QAC3C,iCAAiC;QACjC,8EAA8E;QAC9E,gDAAgD;QAChD,MAAM,IAAI,GAAG,gBAAgB;aAC1B,OAAO,CAAC,WAAW,EAAE,mBAAmB,CAAC;aACzC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;aACpC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;aAC9B,KAAK,CAAC,GAAG,CAAC,CAAC;QACd,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC;QACnC,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyB;IACzD,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class CoverageRecorder {
2
+ private _runtimeTrace;
3
+ getCollectionFuncSet(): Record<string, unknown>;
4
+ outputTrace(traceFile: string): void;
5
+ }
@@ -0,0 +1,26 @@
1
+ import { writeFileSync } from "node:fs";
2
+ export class CoverageRecorder {
3
+ _runtimeTrace = [];
4
+ getCollectionFuncSet() {
5
+ return {
6
+ traceExpression: (functionIndex, basicBlockIndex, type) => {
7
+ switch (type) {
8
+ case 1: // call in
9
+ case 2: {
10
+ // call out
11
+ // do not need for now
12
+ break;
13
+ }
14
+ case 0: {
15
+ this._runtimeTrace.push([functionIndex, basicBlockIndex]);
16
+ break;
17
+ }
18
+ }
19
+ },
20
+ };
21
+ }
22
+ outputTrace(traceFile) {
23
+ writeFileSync(traceFile, JSON.stringify(this._runtimeTrace));
24
+ }
25
+ }
26
+ //# sourceMappingURL=covRecorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"covRecorder.js","sourceRoot":"","sources":["../../../tools/test_runner/core/covRecorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,OAAO,gBAAgB;IACnB,aAAa,GAA4B,EAAE,CAAC;IAEpD,oBAAoB;QAClB,OAAO;YACL,eAAe,EAAE,CAAC,aAAqB,EAAE,eAAuB,EAAE,IAAY,EAAQ,EAAE;gBACtF,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,CAAC,CAAC,CAAC,UAAU;oBAClB,KAAK,CAAC,CAAC,CAAC,CAAC;wBACP,WAAW;wBACX,sBAAsB;wBACtB,MAAM;oBACR,CAAC;oBACD,KAAK,CAAC,CAAC,CAAC,CAAC;wBACP,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC;wBAC1D,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAC/D,CAAC;CACF"}
@@ -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;