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,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
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAsB,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEnE,SAAS,QAAQ,CAAC,IAAU;IAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,YAAY,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;SAAM,IAAI,CAAC,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA4B;IACpD,MAAM,EACJ,QAAQ,EACR,qBAAqB,EAAE,SAAS,EAChC,kBAAkB,EAAE,MAAM,EAC1B,oBAAoB,EAAE,IAAI,EAC1B,gBAAgB,EAAE,IAAI,GACvB,GAAG,QAAQ,CAAC;IACb,OAAO;;oBAEW,QAAQ,CAAC,SAAS,CAAC,iBAAiB,QAAQ;eACjD,QAAQ,UAAU,QAAQ;;oBAErB,SAAS,CAAC,OAAO,EAAE,gBAAgB,QAAQ,CAAC,SAAS,CAAC;0EACA,SAAS,CAAC,OAAO,EAAE;;oBAEzE,SAAS,CAAC,OAAO,EAAE,gBAAgB,QAAQ,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,OAAO,EAAE;oBAC9E,SAAS,CAAC,KAAK,gBAAgB,QAAQ,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,QAAQ,EAAE;oBAC3E,MAAM,CAAC,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE;oBACrE,MAAM,CAAC,KAAK,gBAAgB,QAAQ,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,QAAQ,EAAE;oBAClE,IAAI,CAAC,OAAO,EAAE,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;oBAC/D,IAAI,CAAC,KAAK,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;oBAC5D,IAAI,CAAC,OAAO,EAAE,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;oBAC/D,IAAI,CAAC,KAAK,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;;GAE7E,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA+B;IACxD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,kBAA0B,EAAE,SAA+B;IAC5F,MAAM,qBAAqB,GAAS,IAAI,IAAI,EAAE,CAAC;IAC/C,MAAM,kBAAkB,GAAS,IAAI,IAAI,EAAE,CAAC;IAC5C,MAAM,oBAAoB,GAAS,IAAI,IAAI,EAAE,CAAC;IAC9C,MAAM,gBAAgB,GAAS,IAAI,IAAI,EAAE,CAAC;IAC1C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,qBAAqB,CAAC,IAAI,IAAI,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC;QAClE,qBAAqB,CAAC,KAAK,IAAI,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC;QACpE,kBAAkB,CAAC,IAAI,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC5D,kBAAkB,CAAC,KAAK,IAAI,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAC9D,oBAAoB,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAChE,oBAAoB,CAAC,KAAK,IAAI,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAClE,gBAAgB,CAAC,IAAI,IAAI,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACxD,gBAAgB,CAAC,KAAK,IAAI,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAC5D,CAAC;IAED,OAAO;;;;;;;;iCAQwB,kBAAkB;iCAClB,kBAAkB;;;;gCAInB,kBAAkB;;;;;;;;qBAQ7B,kBAAkB;;;iCAGN,qBAAqB,CAAC,OAAO,EAAE;;mCAE7B,qBAAqB,CAAC,QAAQ,EAAE;;;;iCAIlC,kBAAkB,CAAC,OAAO,EAAE;;mCAE1B,kBAAkB,CAAC,QAAQ,EAAE;;;;;iCAK/B,oBAAoB,CAAC,OAAO,EAAE;;mCAE5B,oBAAoB,CAAC,QAAQ,EAAE;;;;iCAIjC,gBAAgB,CAAC,OAAO,EAAE;;mCAExB,gBAAgB,CAAC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA4BlD,iBAAiB,CAAC,SAAS,CAAC;;;;;;;;;;eAUzB,UAAU,qBAAqB,gBAAgB;SACrD,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;iBAIhB,kBAAkB;;;;;;iBAMlB,kBAAkB;iBAClB,kBAAkB;;;OAG5B,CAAC;AACR,CAAC"}
@@ -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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAsB,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,KAAK;IACD,SAAS,GAAa,EAAE,CAAC;IACzB,MAAM,CAAW;IACjB,KAAK,GAAe,EAAE,CAAC;IAE/B,YAAY,MAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,KAAe;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpH,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CACjG,CAAC;IACJ,CAAC;CACF;AAED,SAAS,MAAM,CAAC,IAAU;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,UAAgC;IACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAgC,CAAC;IACpD,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;QAClC,KAAK,CAAC,OAAO,CAAC;YACZ,MAAM;YACN,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;SACnE,CAAC,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;YAC7G,KAAK,CAAC,OAAO,CAAC;gBACZ,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACzB,MAAM,CAAC,qBAAqB,CAAC;gBAC7B,MAAM,CAAC,kBAAkB,CAAC;gBAC1B,MAAM,CAAC,oBAAoB,CAAC;gBAC5B,MAAM,CAAC,gBAAgB,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK;SAChB,UAAU,EAAE;SACZ,IAAI,CAAC,IAAI,CAAC;SACV,UAAU,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,YAAY,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,YAAY,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -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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"}