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 @@
1
+ {"version":3,"file":"genCode.js","sourceRoot":"","sources":["../../../../tools/test_runner/generator/html-generator/genCode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FileCoverageResult } from "../../utils/interface.js";
2
+ export declare function generateFolderHtml(relativePathOfRoot: string, filesInfo: FileCoverageResult[]): string;
@@ -0,0 +1,155 @@
1
+ import { reportConfig } from "../index.js";
2
+ import { Rate } from "../../utils/interface.js";
3
+ import { OrganizationName, Repository } from "../../utils/name.js";
4
+ function getLevel(rate) {
5
+ const r = rate.getRate();
6
+ if (r > reportConfig.warningLimit) {
7
+ return "high";
8
+ }
9
+ else if (r > reportConfig.errorLimit) {
10
+ return "medium";
11
+ }
12
+ else {
13
+ return "low";
14
+ }
15
+ }
16
+ function generateFileInfo(fileInfo) {
17
+ const { filename, statementCoverageRate: statement, branchCoverageRate: branch, functionCoverageRate: func, lineCoverageRate: line, } = fileInfo;
18
+ return `
19
+ <tr>
20
+ <td class="file ${getLevel(statement)}" data-value="${filename}">
21
+ <a href="${filename}.html">${filename}</a>
22
+ </td>
23
+ <td data-value="${statement.getRate()}" class="pic ${getLevel(statement)}">
24
+ <div class="chart"><div class="cover-fill cover-full" style="width: ${statement.getRate()}%"></div>
25
+ </td>
26
+ <td data-value="${statement.getRate()}" class="pct ${getLevel(statement)}">${statement.getRate()}%</td>
27
+ <td data-value="${statement.total}" class="abs ${getLevel(statement)}">${statement.toString()}</td>
28
+ <td data-value="${branch.getRate()}" class="pct ${getLevel(branch)}">${branch.getRate()}%</td>
29
+ <td data-value="${branch.total}" class="abs ${getLevel(branch)}">${branch.toString()}</td>
30
+ <td data-value="${func.getRate()}" class="pct ${getLevel(func)}">${func.getRate()}%</td>
31
+ <td data-value="${func.total}" class="abs ${getLevel(func)}">${func.toString()}</td>
32
+ <td data-value="${line.getRate()}" class="pct ${getLevel(line)}">${line.getRate()}%</td>
33
+ <td data-value="${line.total}" class="abs ${getLevel(line)}">${line.toString()}</td>
34
+ </tr>
35
+ `;
36
+ }
37
+ function generateFileInfos(filesInfo) {
38
+ return filesInfo.map((v) => generateFileInfo(v)).join("\n");
39
+ }
40
+ export function generateFolderHtml(relativePathOfRoot, filesInfo) {
41
+ const statementCoverageRate = new Rate();
42
+ const branchCoverageRate = new Rate();
43
+ const functionCoverageRate = new Rate();
44
+ const lineCoverageRate = new Rate();
45
+ for (const fileinfo of filesInfo) {
46
+ statementCoverageRate.used += fileinfo.statementCoverageRate.used;
47
+ statementCoverageRate.total += fileinfo.statementCoverageRate.total;
48
+ branchCoverageRate.used += fileinfo.branchCoverageRate.used;
49
+ branchCoverageRate.total += fileinfo.branchCoverageRate.total;
50
+ functionCoverageRate.used += fileinfo.functionCoverageRate.used;
51
+ functionCoverageRate.total += fileinfo.functionCoverageRate.total;
52
+ lineCoverageRate.used += fileinfo.lineCoverageRate.used;
53
+ lineCoverageRate.total += fileinfo.lineCoverageRate.total;
54
+ }
55
+ return `
56
+
57
+ <!doctype html>
58
+ <html lang="en">
59
+
60
+ <head>
61
+ <title>Code coverage report for tests</title>
62
+ <meta charset="utf-8" />
63
+ <link rel="stylesheet" href="${relativePathOfRoot}/resource/prettify.css" />
64
+ <link rel="stylesheet" href="${relativePathOfRoot}/resource/base.css" />
65
+ <meta name="viewport" content="width=device-width, initial-scale=1">
66
+ <style type='text/css'>
67
+ .coverage-summary .sorter {
68
+ background-image: url(${relativePathOfRoot}/resource/sort-arrow-sprite.png);
69
+ }
70
+ </style>
71
+ </head>
72
+
73
+ <body>
74
+ <div class='wrapper'>
75
+ <div class='pad1'>
76
+ <h1><a href="${relativePathOfRoot}/index.html">All files</a> tests</h1>
77
+ <div class='clearfix'>
78
+ <div class='fl pad1y space-right2'>
79
+ <span class="strong">${statementCoverageRate.getRate()}% </span>
80
+ <span class="quiet">Statements</span>
81
+ <span class='fraction'>${statementCoverageRate.toString()}</span>
82
+ </div>
83
+
84
+ <div class='fl pad1y space-right2'>
85
+ <span class="strong">${branchCoverageRate.getRate()}% </span>
86
+ <span class="quiet">Branches</span>
87
+ <span class='fraction'>${branchCoverageRate.toString()}</span>
88
+ </div>
89
+
90
+
91
+ <div class='fl pad1y space-right2'>
92
+ <span class="strong">${functionCoverageRate.getRate()}% </span>
93
+ <span class="quiet">Functions</span>
94
+ <span class='fraction'>${functionCoverageRate.toString()}</span>
95
+ </div>
96
+
97
+ <div class='fl pad1y space-right2'>
98
+ <span class="strong">${lineCoverageRate.getRate()}% </span>
99
+ <span class="quiet">Lines</span>
100
+ <span class='fraction'>${lineCoverageRate.toString()}</span>
101
+ </div>
102
+ </div>
103
+
104
+ <p class="quiet">
105
+ 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 previous block.
106
+ </p>
107
+ </div>
108
+
109
+ <div class='status-line high'></div>
110
+ <div class="pad1">
111
+ <table class="coverage-summary">
112
+ <thead>
113
+ <tr>
114
+ <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
115
+ <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
116
+ <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
117
+ <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
118
+ <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
119
+ <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
120
+ <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
121
+ <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
122
+ <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
123
+ <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
124
+ </tr>
125
+ </thead>
126
+
127
+ <tbody>
128
+ ${generateFileInfos(filesInfo)}
129
+ </tbody>
130
+ </table>
131
+ </div>
132
+
133
+ <div class='push'></div>
134
+ </div>
135
+
136
+ <div class="footer quiet pad2 space-top1 center small">
137
+ Code coverage generated by
138
+ <a href="${Repository}" target="_blank">${OrganizationName}</a>
139
+ at ${new Date().toUTCString()}
140
+ </div>
141
+
142
+ </div>
143
+ <script src="${relativePathOfRoot}/resource/prettify.js"></script>
144
+ <script>
145
+ window.onload = function () {
146
+ prettyPrint();
147
+ };
148
+ </script>
149
+ <script src="${relativePathOfRoot}/resource/sorter.js"></script>
150
+ <script src="${relativePathOfRoot}/resource/block-navigation.js"></script>
151
+ </body>
152
+
153
+ `;
154
+ }
155
+ //# sourceMappingURL=genFolder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genFolder.js","sourceRoot":"","sources":["../../../../tools/test_runner/generator/html-generator/genFolder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FileCoverageResult } from "../../utils/interface.js";
2
+ export declare function genHtml(target: string, filesInfos: FileCoverageResult[]): void;
@@ -0,0 +1,33 @@
1
+ import { ensureDirSync } from "fs-extra";
2
+ import { copyFile, writeFileSync } from "node:fs";
3
+ import { basename, dirname, join, relative } from "node:path";
4
+ import { generateFolderHtml } from "./genFolder.js";
5
+ import { generateCodeHtml } from "./genCode.js";
6
+ import { projectRoot } from "../../utils/projectRoot.js";
7
+ const resourceFiles = [
8
+ "base.css",
9
+ "block-navigation.js",
10
+ "prettify.css",
11
+ "prettify.js",
12
+ "sort-arrow-sprite.png",
13
+ "sorter.js",
14
+ ];
15
+ export function genHtml(target, filesInfos) {
16
+ const resourceFolder = join(target, "resource");
17
+ ensureDirSync(resourceFolder);
18
+ for (const file of resourceFiles) {
19
+ copyFile(join(projectRoot, "resource", file), join(resourceFolder, basename(file)), () => {
20
+ return;
21
+ });
22
+ }
23
+ const html = generateFolderHtml(".", filesInfos);
24
+ writeFileSync(join(target, "index.html"), html);
25
+ for (const filesInfo of filesInfos) {
26
+ const htmlPath = join(target, filesInfo.filename + ".html");
27
+ const relativePath = relative(dirname(htmlPath), target);
28
+ const html = generateCodeHtml(relativePath, filesInfo);
29
+ ensureDirSync(dirname(htmlPath));
30
+ writeFileSync(htmlPath, html);
31
+ }
32
+ }
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../tools/test_runner/generator/html-generator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,aAAa,GAAG;IACpB,UAAU;IACV,qBAAqB;IACrB,cAAc;IACd,aAAa;IACb,uBAAuB;IACvB,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,UAAgC;IACtE,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChD,aAAa,CAAC,cAAc,CAAC,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE;YACvF,OAAO;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACjD,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACvD,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { OutputMode } from "../interface.js";
2
+ import { FileCoverageResult } from "../utils/interface.js";
3
+ declare class GeneratorConfig {
4
+ warningLimit: number;
5
+ errorLimit: number;
6
+ }
7
+ export declare const reportConfig: GeneratorConfig;
8
+ export declare function generateReport(modes: OutputMode | OutputMode[], outputFolder: string, fileCoverageResult: FileCoverageResult[]): void;
9
+ export {};
@@ -0,0 +1,30 @@
1
+ import { genHtml } from "./html-generator/index.js";
2
+ import { genJson } from "./json-generator/index.js";
3
+ import { genTable } from "./table-generator/index.js";
4
+ class GeneratorConfig {
5
+ warningLimit = 80;
6
+ errorLimit = 50;
7
+ }
8
+ export const reportConfig = new GeneratorConfig();
9
+ export function generateReport(modes, outputFolder, fileCoverageResult) {
10
+ for (const mode of [modes].flat()) {
11
+ switch (mode) {
12
+ case "html": {
13
+ genHtml(outputFolder, fileCoverageResult);
14
+ break;
15
+ }
16
+ case "json": {
17
+ genJson(outputFolder, fileCoverageResult);
18
+ break;
19
+ }
20
+ case "table": {
21
+ genTable(fileCoverageResult);
22
+ break;
23
+ }
24
+ default: {
25
+ throw new Error("output mode illegal");
26
+ }
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../tools/test_runner/generator/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,MAAM,eAAe;IACnB,YAAY,GAAG,EAAE,CAAC;IAClB,UAAU,GAAG,EAAE,CAAC;CACjB;AACD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;AAElD,MAAM,UAAU,cAAc,CAC5B,KAAgC,EAChC,YAAoB,EACpB,kBAAwC;IAExC,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;gBAC1C,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;gBAC1C,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,QAAQ,CAAC,kBAAkB,CAAC,CAAC;gBAC7B,MAAM;YACR,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { FileCoverageResult } from "../../utils/interface.js";
2
+ export declare function genJson(target: string, filesInfos: FileCoverageResult[]): void;
@@ -0,0 +1,45 @@
1
+ import { join } from "node:path";
2
+ import { writeFileSync } from "node:fs";
3
+ import { Rate } from "../../utils/interface.js";
4
+ class JsonRate {
5
+ total;
6
+ used;
7
+ rate;
8
+ constructor(rate) {
9
+ this.total = rate.total;
10
+ this.used = rate.used;
11
+ this.rate = rate.getRate();
12
+ }
13
+ }
14
+ export function genJson(target, filesInfos) {
15
+ const jsonOutput = {};
16
+ const statementCoverageTotalRate = new Rate();
17
+ const branchCoverageTotalRate = new Rate();
18
+ const functionCoverageTotalRate = new Rate();
19
+ const lineCoverageTotalRate = new Rate();
20
+ for (const cur of filesInfos) {
21
+ const { filename, statementCoverageRate, branchCoverageRate, functionCoverageRate, lineCoverageRate } = cur;
22
+ jsonOutput[filename] = {
23
+ statementCoverageRate: new JsonRate(statementCoverageRate),
24
+ branchCoverageRate: new JsonRate(branchCoverageRate),
25
+ functionCoverageRate: new JsonRate(functionCoverageRate),
26
+ lineCoverageRate: new JsonRate(lineCoverageRate),
27
+ };
28
+ statementCoverageTotalRate.total += statementCoverageRate.total;
29
+ statementCoverageTotalRate.used += statementCoverageRate.used;
30
+ branchCoverageTotalRate.total += branchCoverageRate.total;
31
+ branchCoverageTotalRate.used += branchCoverageRate.used;
32
+ functionCoverageTotalRate.total += functionCoverageRate.total;
33
+ functionCoverageTotalRate.used += functionCoverageRate.used;
34
+ lineCoverageTotalRate.total += lineCoverageRate.total;
35
+ lineCoverageTotalRate.used += lineCoverageRate.used;
36
+ }
37
+ jsonOutput["All files"] = {
38
+ statementCoverageRate: new JsonRate(statementCoverageTotalRate),
39
+ branchCoverageRate: new JsonRate(branchCoverageTotalRate),
40
+ functionCoverageRate: new JsonRate(functionCoverageTotalRate),
41
+ lineCoverageRate: new JsonRate(lineCoverageTotalRate),
42
+ };
43
+ writeFileSync(join(target, "coverage.json"), JSON.stringify(jsonOutput, null, 4), {});
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../tools/test_runner/generator/json-generator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAsB,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAUpE,MAAM,QAAQ;IACZ,KAAK,CAAS;IACd,IAAI,CAAS;IACb,IAAI,CAAS;IACb,YAAY,IAAU;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,UAAgC;IACtE,MAAM,UAAU,GAAe,EAAE,CAAC;IAElC,MAAM,0BAA0B,GAAG,IAAI,IAAI,EAAE,CAAC;IAC9C,MAAM,uBAAuB,GAAG,IAAI,IAAI,EAAE,CAAC;IAC3C,MAAM,yBAAyB,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7C,MAAM,qBAAqB,GAAG,IAAI,IAAI,EAAE,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC;QAC5G,UAAU,CAAC,QAAQ,CAAC,GAAG;YACrB,qBAAqB,EAAE,IAAI,QAAQ,CAAC,qBAAqB,CAAC;YAC1D,kBAAkB,EAAE,IAAI,QAAQ,CAAC,kBAAkB,CAAC;YACpD,oBAAoB,EAAE,IAAI,QAAQ,CAAC,oBAAoB,CAAC;YACxD,gBAAgB,EAAE,IAAI,QAAQ,CAAC,gBAAgB,CAAC;SACjD,CAAC;QACF,0BAA0B,CAAC,KAAK,IAAI,qBAAqB,CAAC,KAAK,CAAC;QAChE,0BAA0B,CAAC,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC9D,uBAAuB,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAC1D,uBAAuB,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC;QACxD,yBAAyB,CAAC,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC;QAC9D,yBAAyB,CAAC,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC;QAC5D,qBAAqB,CAAC,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC;QACtD,qBAAqB,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;IACtD,CAAC;IACD,UAAU,CAAC,WAAW,CAAC,GAAG;QACxB,qBAAqB,EAAE,IAAI,QAAQ,CAAC,0BAA0B,CAAC;QAC/D,kBAAkB,EAAE,IAAI,QAAQ,CAAC,uBAAuB,CAAC;QACzD,oBAAoB,EAAE,IAAI,QAAQ,CAAC,yBAAyB,CAAC;QAC7D,gBAAgB,EAAE,IAAI,QAAQ,CAAC,qBAAqB,CAAC;KACtD,CAAC;IAEF,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { FileCoverageResult } from "../../utils/interface.js";
2
+ export declare function genTable(filesInfos: FileCoverageResult[]): void;
@@ -0,0 +1,85 @@
1
+ import chalk from "chalk";
2
+ import { basename, dirname } from "node:path";
3
+ import { reportConfig } from "../index.js";
4
+ import { Rate } from "../../utils/interface.js";
5
+ class Table {
6
+ lineWidth = [];
7
+ titles;
8
+ lines = [];
9
+ constructor(titles) {
10
+ this.titles = titles;
11
+ this.lineWidth = titles.map((title) => title.length);
12
+ }
13
+ addItem(items) {
14
+ this.lines.push(items);
15
+ for (let i = 0; i < this.lineWidth.length; i++) {
16
+ this.lineWidth[i] = Math.max(this.lineWidth[i] ?? 0, items[i]?.length ?? 0);
17
+ }
18
+ }
19
+ static padding(str, total) {
20
+ return str + " ".repeat(total - str.length);
21
+ }
22
+ printTitle() {
23
+ return this.titles.map((title, index) => Table.padding(title, this.lineWidth[index] ?? title.length)).join(" | ");
24
+ }
25
+ printSplit() {
26
+ return this.lineWidth.map((width) => "-".repeat(width)).join("-|-");
27
+ }
28
+ printLines() {
29
+ return this.lines.map((line) => line.map((item, index) => Table.padding(item, this.lineWidth[index] ?? item.length)).join(" | "));
30
+ }
31
+ }
32
+ function render(rate) {
33
+ return rate.getRate().toString();
34
+ }
35
+ export function genTable(filesInfos) {
36
+ const table = new Table(["File", "% Stmts", "% Branch", "% Funcs", "% Lines"]);
37
+ const map = new Map();
38
+ for (const fileInfo of filesInfos) {
39
+ const { filename } = fileInfo;
40
+ const value = map.get(dirname(filename));
41
+ if (value === undefined) {
42
+ map.set(dirname(filename), [fileInfo]);
43
+ }
44
+ else {
45
+ value.push(fileInfo);
46
+ }
47
+ }
48
+ for (const [folder, infos] of map) {
49
+ table.addItem([
50
+ folder,
51
+ render(Rate.summarize(infos.map((info) => info.statementCoverageRate))),
52
+ render(Rate.summarize(infos.map((info) => info.branchCoverageRate))),
53
+ render(Rate.summarize(infos.map((info) => info.functionCoverageRate))),
54
+ render(Rate.summarize(infos.map((info) => info.lineCoverageRate))),
55
+ ]);
56
+ for (const info of infos) {
57
+ const { filename, statementCoverageRate, branchCoverageRate, functionCoverageRate, lineCoverageRate } = info;
58
+ table.addItem([
59
+ " " + basename(filename),
60
+ render(statementCoverageRate),
61
+ render(branchCoverageRate),
62
+ render(functionCoverageRate),
63
+ render(lineCoverageRate),
64
+ ]);
65
+ }
66
+ }
67
+ console.log(table.printSplit());
68
+ console.log(table.printTitle());
69
+ console.log(table.printSplit());
70
+ const lines = table
71
+ .printLines()
72
+ .join("\n")
73
+ .replaceAll(/\d+(.\d+)?/g, (str) => {
74
+ const v = Number.parseFloat(str);
75
+ if (v > reportConfig.warningLimit)
76
+ return chalk.bold.greenBright(str);
77
+ if (v > reportConfig.errorLimit)
78
+ return chalk.bold.yellowBright(str);
79
+ return chalk.bold.redBright(str);
80
+ });
81
+ console.log(lines);
82
+ console.log(table.printSplit());
83
+ console.log();
84
+ }
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../tools/test_runner/generator/table-generator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TestOption } from "./testOption.js";
2
+ export declare function validateArgument(includes: unknown, excludes: unknown): void;
3
+ export declare function start(options: TestOption): Promise<number>;
@@ -0,0 +1,70 @@
1
+ import chalk from "chalk";
2
+ import pkg from "fs-extra";
3
+ import { Parser } from "./parser/index.js";
4
+ import { compile } from "./core/compile.js";
5
+ import { analyze } from "./core/analyze.js";
6
+ import { execWasmBinaries } from "./core/execute.js";
7
+ import { generateReport, reportConfig } from "./generator/index.js";
8
+ import { join } from "node:path";
9
+ import { CompilationError } from "./core/compiler.js";
10
+ const { readFileSync, emptydirSync } = pkg;
11
+ export function validateArgument(includes, excludes) {
12
+ if (!Array.isArray(includes)) {
13
+ throw new TypeError("include section illegal");
14
+ }
15
+ if (!Array.isArray(excludes)) {
16
+ throw new TypeError("exclude section illegal");
17
+ }
18
+ for (const includePath of includes) {
19
+ if (typeof includePath !== "string") {
20
+ throw new TypeError("include section illegal");
21
+ }
22
+ }
23
+ for (const excludePath of excludes) {
24
+ if (typeof excludePath !== "string") {
25
+ throw new TypeError("exclude section illegal");
26
+ }
27
+ }
28
+ }
29
+ async function startUniTestImpl(options) {
30
+ const failurePath = join(options.outputFolder, "failures.json");
31
+ let failedTestCases = [];
32
+ if (options.onlyFailures) {
33
+ failedTestCases = JSON.parse(readFileSync(failurePath, "utf8"));
34
+ if (failedTestCases.length === 0) {
35
+ options.collectCoverage = true;
36
+ console.log(chalk.yellowBright('Warning: no failed test cases found while enabled "onlyFailures", execute all test cases by default'));
37
+ }
38
+ }
39
+ emptydirSync(options.outputFolder);
40
+ const { sourceCodePaths, testCodePaths, entryFiles, filterByName } = analyze(options, failedTestCases);
41
+ console.log(chalk.blueBright("code analysis: ") + chalk.bold.greenBright("OK"));
42
+ const wasmModule = await compile(testCodePaths, entryFiles, options);
43
+ console.log(chalk.blueBright("compile test files: ") + chalk.bold.greenBright("OK"));
44
+ const executedResult = await execWasmBinaries(wasmModule, filterByName, options.imports);
45
+ console.log(chalk.blueBright("execute test files: ") + chalk.bold.greenBright("OK"));
46
+ await executedResult.writeFailures(failurePath);
47
+ executedResult.print(console.log);
48
+ if (options.collectCoverage) {
49
+ const parser = new Parser();
50
+ const fileCoverageInfo = await parser.parse(wasmModule, sourceCodePaths);
51
+ reportConfig.warningLimit = options.warnLimit || reportConfig.warningLimit;
52
+ reportConfig.errorLimit = options.errorLimit || reportConfig.errorLimit;
53
+ generateReport(options.mode, options.outputFolder, fileCoverageInfo);
54
+ }
55
+ return executedResult.fail === 0 ? 0 : 1;
56
+ }
57
+ export async function start(options) {
58
+ try {
59
+ return await startUniTestImpl(options);
60
+ }
61
+ catch (error) {
62
+ if (error instanceof CompilationError) {
63
+ console.log(error.message);
64
+ return 2;
65
+ }
66
+ // unknown exception.
67
+ throw error;
68
+ }
69
+ }
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../tools/test_runner/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { ASUtil } from "@assemblyscript/loader";
2
+ export declare abstract class UnitTestFramework {
3
+ /**
4
+ * function to redirect log message to unittest framework
5
+ * @param msg: message to log
6
+ */
7
+ abstract log(msg: string): void;
8
+ }
9
+ export declare class ImportsArgument {
10
+ framework: UnitTestFramework;
11
+ module: WebAssembly.Module | null;
12
+ instance: WebAssembly.Instance | null;
13
+ exports: (ASUtil & Record<string, unknown>) | null;
14
+ constructor(framework: UnitTestFramework);
15
+ }
16
+ export type OutputMode = "html" | "json" | "table";
17
+ export type Imports = ((arg: ImportsArgument) => Record<string, unknown>) | null;
18
+ export declare class Config {
19
+ /** Files to include in testing and coverage statistics */
20
+ include: string[];
21
+ /** Files to exclude from testing and coverage statistics, has higher priority than include */
22
+ exclude?: string[];
23
+ /** entry files for the whole projects, used to collect all source code information. default value is `${include}/index.ts` */
24
+ entryFiles?: string[];
25
+ /** whether to collect coverage information, default is true */
26
+ collectCoverage?: boolean;
27
+ /** create an wasm instance for each test files. default is false (will be true in next major version) */
28
+ isolated?: boolean;
29
+ /** assemblyscript compile flag, default is --exportStart __unit_test_start --sourceMap --debug -O0 */
30
+ flags?: string;
31
+ imports?: Imports;
32
+ /** report folder path, default "./coverage" */
33
+ output?: string;
34
+ /** output report mode, default is "table" */
35
+ mode?: OutputMode | OutputMode[];
36
+ }
@@ -0,0 +1,12 @@
1
+ export class UnitTestFramework {
2
+ }
3
+ export class ImportsArgument {
4
+ framework;
5
+ module = null;
6
+ instance = null;
7
+ exports = null;
8
+ constructor(framework) {
9
+ this.framework = framework;
10
+ }
11
+ }
12
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../tools/test_runner/interface.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,iBAAiB;CAMtC;AAED,MAAM,OAAO,eAAe;IAIP;IAHnB,MAAM,GAA8B,IAAI,CAAC;IACzC,QAAQ,GAAgC,IAAI,CAAC;IAC7C,OAAO,GAA8C,IAAI,CAAC;IAC1D,YAAmB,SAA4B;QAA5B,cAAS,GAAT,SAAS,CAAmB;IAAG,CAAC;CACpD"}
@@ -0,0 +1,35 @@
1
+ import { FileCoverageResult, CovInfo, FunctionCoverageResult } from "../utils/interface.js";
2
+ import { WebAssemblyModule } from "../utils/wasm.js";
3
+ export declare class Parser {
4
+ fileCoverageResults: FileCoverageResult[];
5
+ functionCoverageResults: FunctionCoverageResult[];
6
+ /** key: functionName, value: CodeSnippetIndex trace */
7
+ functionCovTraceMap: Map<string, number[]>;
8
+ /** key: functionName, value: { branchInfo, lineInfo } */
9
+ functionCovInfoMap: Map<string, CovInfo>;
10
+ parse(wasmModule: WebAssemblyModule, sourceCodePaths: string[]): Promise<FileCoverageResult[]>;
11
+ private getTempCovTraceMap;
12
+ private getDebugInfos;
13
+ /**
14
+ * @brief
15
+ * parse debugInfo and traceInfo to functionCovTraceMap and functionCovInfoMap
16
+ * @param debugInfoFile debugInfo file path generated by instrumentation
17
+ */
18
+ traceParse(instrumentResult: WebAssemblyModule): Promise<void>;
19
+ /**
20
+ * @brief
21
+ * generate FunctionCoverageInfo for each Function based on CovTrace and CovInfo.
22
+ * FunctionCoverageInfo of Function<T> will be merged into Function:
23
+ * FunctionCoverageInfo of toJson<f64> and toJson<i32> will be merged into toJson.
24
+ */
25
+ generateFunctionCoverage(): void;
26
+ /**
27
+ * @brief
28
+ * For each sourceFile:
29
+ * First, filter out all functionCoverageResult from this.functionCoverageResults based on checkFunctionName(sourceFilePath, functionName).
30
+ * And then, find out which sourceFunction has been tested and which sourceFunction has not been tested.
31
+ * based on the function name match or lineRange match.
32
+ * Finally, merge the functionCoverageResult to fileCoverageResult.
33
+ */
34
+ generateFileCoverage(sourceCodePaths: string[]): Promise<void>;
35
+ }