warpo 2.4.0 → 2.5.0-alpha-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/debug_server/dapServer.d.ts +1 -0
- package/dist/debug_server/dapServer.js +27 -0
- package/dist/debug_server/dapServer.js.map +1 -0
- package/dist/debug_server/debugSession.d.ts +19 -0
- package/dist/debug_server/debugSession.js +71 -0
- package/dist/debug_server/debugSession.js.map +1 -0
- package/dist/debug_server/tests/debugSession.test.d.ts +1 -0
- package/dist/debug_server/tests/debugSession.test.js +61 -0
- package/dist/debug_server/tests/debugSession.test.js.map +1 -0
- package/dist/debug_server/tests/launcher.d.ts +10 -0
- package/dist/debug_server/tests/launcher.js +21 -0
- package/dist/debug_server/tests/launcher.js.map +1 -0
- package/dist/scripts/lib.d.ts +7 -0
- package/dist/{lib.js → scripts/lib.js} +20 -6
- package/dist/scripts/lib.js.map +1 -0
- package/dist/test_runner/cli.d.ts +2 -0
- package/dist/test_runner/cli.js +85 -0
- package/dist/test_runner/cli.js.map +1 -0
- package/dist/test_runner/core/analyze.d.ts +13 -0
- package/dist/test_runner/core/analyze.js +58 -0
- package/dist/test_runner/core/analyze.js.map +1 -0
- package/dist/test_runner/core/compile.d.ts +4 -0
- package/dist/test_runner/core/compile.js +23 -0
- package/dist/test_runner/core/compile.js.map +1 -0
- package/dist/test_runner/core/compiler.d.ts +11 -0
- package/dist/test_runner/core/compiler.js +47 -0
- package/dist/test_runner/core/compiler.js.map +1 -0
- package/dist/test_runner/core/covRecorder.d.ts +5 -0
- package/dist/test_runner/core/covRecorder.js +26 -0
- package/dist/test_runner/core/covRecorder.js.map +1 -0
- package/dist/test_runner/core/execute.d.ts +4 -0
- package/dist/test_runner/core/execute.js +76 -0
- package/dist/test_runner/core/execute.js.map +1 -0
- package/dist/test_runner/core/executionRecorder.d.ts +52 -0
- package/dist/test_runner/core/executionRecorder.js +164 -0
- package/dist/test_runner/core/executionRecorder.js.map +1 -0
- package/dist/test_runner/core/mockStatusRecorder.d.ts +10 -0
- package/dist/test_runner/core/mockStatusRecorder.js +62 -0
- package/dist/test_runner/core/mockStatusRecorder.js.map +1 -0
- package/dist/test_runner/executionResult.d.ts +11 -0
- package/dist/test_runner/executionResult.js +112 -0
- package/dist/test_runner/executionResult.js.map +1 -0
- package/dist/test_runner/generator/html-generator/genCode.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/genCode.js +124 -0
- package/dist/test_runner/generator/html-generator/genCode.js.map +1 -0
- package/dist/test_runner/generator/html-generator/genFolder.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/genFolder.js +155 -0
- package/dist/test_runner/generator/html-generator/genFolder.js.map +1 -0
- package/dist/test_runner/generator/html-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/index.js +33 -0
- package/dist/test_runner/generator/html-generator/index.js.map +1 -0
- package/dist/test_runner/generator/index.d.ts +9 -0
- package/dist/test_runner/generator/index.js +30 -0
- package/dist/test_runner/generator/index.js.map +1 -0
- package/dist/test_runner/generator/json-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/json-generator/index.js +45 -0
- package/dist/test_runner/generator/json-generator/index.js.map +1 -0
- package/dist/test_runner/generator/table-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/table-generator/index.js +85 -0
- package/dist/test_runner/generator/table-generator/index.js.map +1 -0
- package/dist/test_runner/index.d.ts +3 -0
- package/dist/test_runner/index.js +70 -0
- package/dist/test_runner/index.js.map +1 -0
- package/dist/test_runner/interface.d.ts +36 -0
- package/dist/test_runner/interface.js +12 -0
- package/dist/test_runner/interface.js.map +1 -0
- package/dist/test_runner/parser/index.d.ts +35 -0
- package/dist/test_runner/parser/index.js +146 -0
- package/dist/test_runner/parser/index.js.map +1 -0
- package/dist/test_runner/parser/singleFileAnalysis.d.ts +8 -0
- package/dist/test_runner/parser/singleFileAnalysis.js +51 -0
- package/dist/test_runner/parser/singleFileAnalysis.js.map +1 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.d.ts +16 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.js +97 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.js.map +1 -0
- package/dist/test_runner/testOption.d.ts +16 -0
- package/dist/test_runner/testOption.js +2 -0
- package/dist/test_runner/testOption.js.map +1 -0
- package/dist/test_runner/utils/errorTraceHandler.d.ts +12 -0
- package/dist/test_runner/utils/errorTraceHandler.js +87 -0
- package/dist/test_runner/utils/errorTraceHandler.js.map +1 -0
- package/dist/test_runner/utils/escape.d.ts +1 -0
- package/dist/test_runner/utils/escape.js +14 -0
- package/dist/test_runner/utils/escape.js.map +1 -0
- package/dist/test_runner/utils/index.d.ts +14 -0
- package/dist/test_runner/utils/index.js +88 -0
- package/dist/test_runner/utils/index.js.map +1 -0
- package/dist/test_runner/utils/interface.d.ts +100 -0
- package/dist/test_runner/utils/interface.js +86 -0
- package/dist/test_runner/utils/interface.js.map +1 -0
- package/dist/test_runner/utils/name.d.ts +2 -0
- package/dist/test_runner/utils/name.js +3 -0
- package/dist/test_runner/utils/name.js.map +1 -0
- package/dist/test_runner/utils/pathResolver.d.ts +6 -0
- package/dist/test_runner/utils/pathResolver.js +98 -0
- package/dist/test_runner/utils/pathResolver.js.map +1 -0
- package/dist/test_runner/utils/projectRoot.d.ts +1 -0
- package/dist/test_runner/utils/projectRoot.js +4 -0
- package/dist/test_runner/utils/projectRoot.js.map +1 -0
- package/dist/test_runner/utils/wasm.d.ts +12 -0
- package/dist/test_runner/utils/wasm.js +45 -0
- package/dist/test_runner/utils/wasm.js.map +1 -0
- package/dist/warpo.js +10 -3
- package/dist/warpo.js.map +1 -0
- package/dist/warpo_internal.d.ts +7 -0
- package/dist/warpo_internal.js +74 -0
- package/dist/warpo_internal.js.map +1 -0
- package/package.json +37 -9
- package/types/std/index.d.ts +8 -261
- package/types/warpo/index.d.ts +94 -0
- package/dist/lib.d.ts +0 -5
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { isFunctionInsideFile, checkGenerics, json2map, checkVarargs } from "../utils/index.js";
|
|
4
|
+
import { SingleFileCoverageAnalysis } from "./singleFileAnalysis.js";
|
|
5
|
+
import { SingleFunctionCoverageAnalysis } from "./singleFunctionAnalysis.js";
|
|
6
|
+
import { FunctionCoverageResult, COVERAGE_DEBUG_INFO_SECTION_NAME, } from "../utils/interface.js";
|
|
7
|
+
export class Parser {
|
|
8
|
+
fileCoverageResults = [];
|
|
9
|
+
functionCoverageResults = [];
|
|
10
|
+
/** key: functionName, value: CodeSnippetIndex trace */
|
|
11
|
+
functionCovTraceMap = new Map();
|
|
12
|
+
/** key: functionName, value: { branchInfo, lineInfo } */
|
|
13
|
+
functionCovInfoMap = new Map();
|
|
14
|
+
async parse(wasmModule, sourceCodePaths) {
|
|
15
|
+
await this.traceParse(wasmModule);
|
|
16
|
+
this.generateFunctionCoverage();
|
|
17
|
+
await this.generateFileCoverage(sourceCodePaths);
|
|
18
|
+
return this.fileCoverageResults;
|
|
19
|
+
}
|
|
20
|
+
async getTempCovTraceMap(traceFile) {
|
|
21
|
+
const traces = (await fs.readJson(traceFile));
|
|
22
|
+
const tempCovTraceMap = new Map();
|
|
23
|
+
for (const trace of traces) {
|
|
24
|
+
const [funIndex, codeSnippetIndex] = trace;
|
|
25
|
+
const codeIndexes = tempCovTraceMap.get(funIndex);
|
|
26
|
+
if (codeIndexes) {
|
|
27
|
+
codeIndexes.push(codeSnippetIndex);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
tempCovTraceMap.set(funIndex, [codeSnippetIndex]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return tempCovTraceMap;
|
|
34
|
+
}
|
|
35
|
+
async getDebugInfos(instrumentResult) {
|
|
36
|
+
const jsonText = await instrumentResult.getCustomSectionUtf8(COVERAGE_DEBUG_INFO_SECTION_NAME);
|
|
37
|
+
if (jsonText === null) {
|
|
38
|
+
throw new Error(`missing wasm custom section '${COVERAGE_DEBUG_INFO_SECTION_NAME}' in ${instrumentResult.wasm}`);
|
|
39
|
+
}
|
|
40
|
+
const debugInfo = JSON.parse(jsonText);
|
|
41
|
+
const debugInfos = json2map(debugInfo.debugInfos);
|
|
42
|
+
const debugFiles = debugInfo.debugFiles;
|
|
43
|
+
return { debugInfos, debugFiles };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @brief
|
|
47
|
+
* parse debugInfo and traceInfo to functionCovTraceMap and functionCovInfoMap
|
|
48
|
+
* @param debugInfoFile debugInfo file path generated by instrumentation
|
|
49
|
+
*/
|
|
50
|
+
async traceParse(instrumentResult) {
|
|
51
|
+
const [tempCovTraceMap, { debugInfos, debugFiles }] = await Promise.all([
|
|
52
|
+
this.getTempCovTraceMap(instrumentResult.traceFile),
|
|
53
|
+
this.getDebugInfos(instrumentResult),
|
|
54
|
+
]);
|
|
55
|
+
for (const [name, info] of debugInfos) {
|
|
56
|
+
const traces = tempCovTraceMap.get(info.index);
|
|
57
|
+
if (traces !== undefined) {
|
|
58
|
+
const originTraces = this.functionCovTraceMap.get(name) ?? [];
|
|
59
|
+
this.functionCovTraceMap.set(name, originTraces.concat(traces));
|
|
60
|
+
}
|
|
61
|
+
const lineInfoMap = new Map();
|
|
62
|
+
info.lineInfo.forEach((ranges, index) => {
|
|
63
|
+
// If instrument return basic block == null, ignore it.
|
|
64
|
+
if (ranges === null)
|
|
65
|
+
return;
|
|
66
|
+
const lineInfoArray = ranges
|
|
67
|
+
.filter((range) => {
|
|
68
|
+
const filename = debugFiles[range[0]];
|
|
69
|
+
if (filename === undefined) {
|
|
70
|
+
throw new Error(`unknown error: not find fileIndex ${range[0]} in ${instrumentResult.wasm}`);
|
|
71
|
+
}
|
|
72
|
+
// if basicBlock is inline function from other files, ignore it
|
|
73
|
+
return isFunctionInsideFile(filename, name);
|
|
74
|
+
})
|
|
75
|
+
.map((range) => range[1]);
|
|
76
|
+
// basic block index start at 0
|
|
77
|
+
lineInfoMap.set(index, new Set(lineInfoArray));
|
|
78
|
+
});
|
|
79
|
+
const covInfo = { branchInfo: info.branchInfo, lineInfo: lineInfoMap };
|
|
80
|
+
this.functionCovInfoMap.set(name, covInfo);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* @brief
|
|
85
|
+
* generate FunctionCoverageInfo for each Function based on CovTrace and CovInfo.
|
|
86
|
+
* FunctionCoverageInfo of Function<T> will be merged into Function:
|
|
87
|
+
* FunctionCoverageInfo of toJson<f64> and toJson<i32> will be merged into toJson.
|
|
88
|
+
*/
|
|
89
|
+
generateFunctionCoverage() {
|
|
90
|
+
const genericFunctionCovInfoMap = new Map();
|
|
91
|
+
for (const [functionName, singleFunctionCovTrace] of this.functionCovTraceMap.entries()) {
|
|
92
|
+
const singleFunctionCovInfo = this.functionCovInfoMap.get(functionName);
|
|
93
|
+
if (singleFunctionCovInfo === undefined) {
|
|
94
|
+
throw new Error(`CovInfo And CovTrace of Function ${functionName} mismatch`);
|
|
95
|
+
}
|
|
96
|
+
const singleFunctionAnalysis = new SingleFunctionCoverageAnalysis(singleFunctionCovInfo, functionName);
|
|
97
|
+
const singleFunctionCoverageInfo = singleFunctionAnalysis.update(singleFunctionCovTrace);
|
|
98
|
+
const functionNameWithoutGeneric = checkGenerics(functionName);
|
|
99
|
+
if (functionNameWithoutGeneric) {
|
|
100
|
+
const genericFunctionCovInfos = genericFunctionCovInfoMap.get(functionNameWithoutGeneric);
|
|
101
|
+
if (genericFunctionCovInfos) {
|
|
102
|
+
genericFunctionCovInfos.push(singleFunctionCoverageInfo);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
genericFunctionCovInfoMap.set(functionNameWithoutGeneric, [singleFunctionCoverageInfo]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.functionCoverageResults.push(singleFunctionCoverageInfo);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
for (const [name, infos] of genericFunctionCovInfoMap) {
|
|
113
|
+
this.functionCoverageResults.push(FunctionCoverageResult.mergeFromGeneric(name, infos));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @brief
|
|
118
|
+
* For each sourceFile:
|
|
119
|
+
* First, filter out all functionCoverageResult from this.functionCoverageResults based on checkFunctionName(sourceFilePath, functionName).
|
|
120
|
+
* And then, find out which sourceFunction has been tested and which sourceFunction has not been tested.
|
|
121
|
+
* based on the function name match or lineRange match.
|
|
122
|
+
* Finally, merge the functionCoverageResult to fileCoverageResult.
|
|
123
|
+
*/
|
|
124
|
+
async generateFileCoverage(sourceCodePaths) {
|
|
125
|
+
for (const sourceCodePath of sourceCodePaths) {
|
|
126
|
+
const source = await readFile(sourceCodePath, { encoding: "utf8" });
|
|
127
|
+
const singleFileAnalysis = new SingleFileCoverageAnalysis(sourceCodePath, source);
|
|
128
|
+
const functionCovInfosInCurrentFile = this.functionCoverageResults.filter((result) => isFunctionInsideFile(sourceCodePath, result.functionName));
|
|
129
|
+
singleFileAnalysis.setTotalFunction(getTotalFunctionCount(this.functionCovInfoMap, sourceCodePath));
|
|
130
|
+
singleFileAnalysis.merge(functionCovInfosInCurrentFile);
|
|
131
|
+
this.fileCoverageResults.push(singleFileAnalysis.getResult());
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function getTotalFunctionCount(functionCovInfoMap, sourceCodePath) {
|
|
136
|
+
const totalFunctionCount = new Set(Array.from(functionCovInfoMap.keys())
|
|
137
|
+
.map((functionName) => cleanupFunctionVariants(functionName) ?? functionName)
|
|
138
|
+
.filter((functionName) => isFunctionInsideFile(sourceCodePath, functionName))).size;
|
|
139
|
+
return totalFunctionCount;
|
|
140
|
+
}
|
|
141
|
+
function cleanupFunctionVariants(functionName) {
|
|
142
|
+
functionName = checkGenerics(functionName) ?? functionName;
|
|
143
|
+
functionName = checkVarargs(functionName) ?? functionName;
|
|
144
|
+
return functionName;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../tools/test_runner/parser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FileCoverageResult, FunctionCoverageResult } from "../utils/interface.js";
|
|
2
|
+
export declare class SingleFileCoverageAnalysis {
|
|
3
|
+
result: FileCoverageResult;
|
|
4
|
+
constructor(fileName: string, source: string);
|
|
5
|
+
setTotalFunction(count: number): void;
|
|
6
|
+
merge(results: FunctionCoverageResult[]): void;
|
|
7
|
+
getResult(): FileCoverageResult;
|
|
8
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Rate, CodeCoverage, FileCoverageResult } from "../utils/interface.js";
|
|
2
|
+
export class SingleFileCoverageAnalysis {
|
|
3
|
+
result;
|
|
4
|
+
constructor(fileName, source) {
|
|
5
|
+
this.result = new FileCoverageResult(fileName);
|
|
6
|
+
for (const srcLine of source.split(/\r?\n/)) {
|
|
7
|
+
this.result.sourceUsedCount.push(new CodeCoverage(srcLine));
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
setTotalFunction(count) {
|
|
11
|
+
this.result.functionCoverageRate.total = count;
|
|
12
|
+
}
|
|
13
|
+
merge(results) {
|
|
14
|
+
// SingleFileCoverageAnalysis contains FileCoverageResult
|
|
15
|
+
if (results.length === 0)
|
|
16
|
+
return;
|
|
17
|
+
for (const functionCovResult of results) {
|
|
18
|
+
for (const line of functionCovResult.uncoveredLines)
|
|
19
|
+
this.result.uncoveredLines.add(line);
|
|
20
|
+
for (const [lineIndex, count] of functionCovResult.sourceUsedCount.entries()) {
|
|
21
|
+
const srcLineUsedCount = this.result.sourceUsedCount[lineIndex - 1];
|
|
22
|
+
if (srcLineUsedCount === undefined) {
|
|
23
|
+
throw new Error(`unknown error: There is not Line ${lineIndex} in ${JSON.stringify(this.result.sourceUsedCount)}`);
|
|
24
|
+
}
|
|
25
|
+
if (srcLineUsedCount.usedCount === CodeCoverage.default) {
|
|
26
|
+
srcLineUsedCount.usedCount = count;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
srcLineUsedCount.usedCount += count;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const branchCoverageRates = results.map((result) => result.branchCoverageRate);
|
|
34
|
+
branchCoverageRates.push(this.result.branchCoverageRate);
|
|
35
|
+
this.result.branchCoverageRate = Rate.summarize(branchCoverageRates);
|
|
36
|
+
this.result.functionCoverageRate.used += results.length;
|
|
37
|
+
}
|
|
38
|
+
getResult() {
|
|
39
|
+
for (const cov of this.result.sourceUsedCount) {
|
|
40
|
+
if (cov.usedCount === CodeCoverage.default)
|
|
41
|
+
continue;
|
|
42
|
+
if (cov.usedCount > 0) {
|
|
43
|
+
this.result.lineCoverageRate.used++;
|
|
44
|
+
}
|
|
45
|
+
this.result.lineCoverageRate.total++;
|
|
46
|
+
}
|
|
47
|
+
this.result.statementCoverageRate = this.result.lineCoverageRate;
|
|
48
|
+
return this.result;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=singleFileAnalysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleFileAnalysis.js","sourceRoot":"","sources":["../../../tools/test_runner/parser/singleFileAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAA0B,MAAM,uBAAuB,CAAC;AAEvG,MAAM,OAAO,0BAA0B;IACrC,MAAM,CAAqB;IAC3B,YAAY,QAAgB,EAAE,MAAc;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,GAAG,KAAK,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,OAAiC;QACrC,yDAAyD;QACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,KAAK,MAAM,iBAAiB,IAAI,OAAO,EAAE,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,cAAc;gBAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1F,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7E,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gBACpE,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CACb,oCAAoC,SAAS,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAClG,CAAC;gBACJ,CAAC;gBACD,IAAI,gBAAgB,CAAC,SAAS,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBACxD,gBAAgB,CAAC,SAAS,GAAG,KAAK,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,gBAAgB,CAAC,SAAS,IAAI,KAAK,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/E,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1D,CAAC;IAED,SAAS;QACP,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9C,IAAI,GAAG,CAAC,SAAS,KAAK,YAAY,CAAC,OAAO;gBAAE,SAAS;YACrD,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAEjE,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CodeSnippetIndex, CovInfo, FunctionCoverageResult, UncoveredBasicBlocks } from "../utils/interface.js";
|
|
2
|
+
type BranchGraph = Map<number, Map<number, boolean>>;
|
|
3
|
+
export declare class SingleFunctionCoverageAnalysis {
|
|
4
|
+
covInfo: CovInfo;
|
|
5
|
+
result: FunctionCoverageResult;
|
|
6
|
+
branchGraph: BranchGraph;
|
|
7
|
+
notFullyCoveredBasicBlock: UncoveredBasicBlocks;
|
|
8
|
+
constructor(covInfo: CovInfo, name: string);
|
|
9
|
+
update(indexSerialInSingleFunction: CodeSnippetIndex[]): FunctionCoverageResult;
|
|
10
|
+
updateLine(indexSerialInSingleFunction: CodeSnippetIndex[]): void;
|
|
11
|
+
updateBranch(indexSerialInSingleFunction: CodeSnippetIndex[]): void;
|
|
12
|
+
private markCoveredBranches;
|
|
13
|
+
private calculateBranchCoverage;
|
|
14
|
+
private addUncoveredLines;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { FunctionCoverageResult } from "../utils/interface.js";
|
|
3
|
+
export class SingleFunctionCoverageAnalysis {
|
|
4
|
+
covInfo;
|
|
5
|
+
result;
|
|
6
|
+
branchGraph = new Map();
|
|
7
|
+
notFullyCoveredBasicBlock = new Set();
|
|
8
|
+
constructor(covInfo, name) {
|
|
9
|
+
this.covInfo = covInfo;
|
|
10
|
+
this.result = new FunctionCoverageResult(name);
|
|
11
|
+
this.result.branchCoverageRate.total = covInfo.branchInfo.length;
|
|
12
|
+
let maxLine = Number.MIN_SAFE_INTEGER, minLine = Number.MAX_SAFE_INTEGER;
|
|
13
|
+
for (const branchInfo of covInfo.branchInfo) {
|
|
14
|
+
const branches = this.branchGraph.get(branchInfo[0]);
|
|
15
|
+
if (branches) {
|
|
16
|
+
branches.set(branchInfo[1], false);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this.branchGraph.set(branchInfo[0], new Map([[branchInfo[1], false]]));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
for (const lineIndexSet of covInfo.lineInfo.values()) {
|
|
23
|
+
for (const lineIndex of lineIndexSet.values()) {
|
|
24
|
+
minLine = Math.min(minLine, lineIndex);
|
|
25
|
+
maxLine = Math.max(maxLine, lineIndex);
|
|
26
|
+
this.result.sourceUsedCount.set(lineIndex, 0);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (this.result.sourceUsedCount.size > 0) {
|
|
30
|
+
this.result.lineRange = [minLine, maxLine];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
update(indexSerialInSingleFunction) {
|
|
34
|
+
this.updateLine(indexSerialInSingleFunction);
|
|
35
|
+
this.updateBranch(indexSerialInSingleFunction);
|
|
36
|
+
return this.result;
|
|
37
|
+
}
|
|
38
|
+
updateLine(indexSerialInSingleFunction) {
|
|
39
|
+
const indexCount = new Map();
|
|
40
|
+
for (const index of indexSerialInSingleFunction) {
|
|
41
|
+
const count = indexCount.get(index);
|
|
42
|
+
indexCount.set(index, count === undefined ? 1 : count + 1);
|
|
43
|
+
}
|
|
44
|
+
for (const [index, count] of indexCount.entries()) {
|
|
45
|
+
const codeLines = this.covInfo.lineInfo.get(index);
|
|
46
|
+
if (codeLines === undefined) {
|
|
47
|
+
throw new Error(`CovInfo And CovTrace of Function ${this.result.functionName} mismatch: Index: ${index}`);
|
|
48
|
+
}
|
|
49
|
+
for (const lineIndex of codeLines) {
|
|
50
|
+
const usedCount = this.result.sourceUsedCount.get(lineIndex);
|
|
51
|
+
this.result.sourceUsedCount.set(lineIndex, usedCount === undefined ? count : usedCount + count);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
updateBranch(indexSerialInSingleFunction) {
|
|
56
|
+
if (this.branchGraph.size === 0) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.markCoveredBranches(indexSerialInSingleFunction);
|
|
60
|
+
this.calculateBranchCoverage();
|
|
61
|
+
this.addUncoveredLines();
|
|
62
|
+
}
|
|
63
|
+
markCoveredBranches(indexSerialInSingleFunction) {
|
|
64
|
+
for (let i = 1; i < indexSerialInSingleFunction.length; i++) {
|
|
65
|
+
const first = indexSerialInSingleFunction[i - 1], second = indexSerialInSingleFunction[i];
|
|
66
|
+
assert(first !== undefined);
|
|
67
|
+
assert(second !== undefined);
|
|
68
|
+
const toNodes = this.branchGraph.get(first);
|
|
69
|
+
if (toNodes && toNodes.get(second) === false) {
|
|
70
|
+
toNodes.set(second, true);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
calculateBranchCoverage() {
|
|
75
|
+
for (const [currentBasicBlock, branchesForThatBasicBlock] of this.branchGraph) {
|
|
76
|
+
let used = 0;
|
|
77
|
+
for (const isCovered of branchesForThatBasicBlock.values()) {
|
|
78
|
+
if (isCovered) {
|
|
79
|
+
used++;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.notFullyCoveredBasicBlock.add(currentBasicBlock);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
this.result.branchCoverageRate.used += used;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
addUncoveredLines() {
|
|
89
|
+
for (const block of this.notFullyCoveredBasicBlock) {
|
|
90
|
+
const lineInfo = this.covInfo.lineInfo.get(block);
|
|
91
|
+
if (lineInfo !== undefined && lineInfo.size > 0) {
|
|
92
|
+
this.result.uncoveredLines.add(Math.max(...lineInfo));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=singleFunctionAnalysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleFunctionAnalysis.js","sourceRoot":"","sources":["../../../tools/test_runner/parser/singleFunctionAnalysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Imports, OutputMode } from "./interface.js";
|
|
2
|
+
export interface TestOption {
|
|
3
|
+
includes: string[];
|
|
4
|
+
excludes: string[];
|
|
5
|
+
entryFiles: string[] | null;
|
|
6
|
+
testFiles: string[] | null;
|
|
7
|
+
testNamePattern: string | null;
|
|
8
|
+
collectCoverage: boolean;
|
|
9
|
+
onlyFailures: boolean;
|
|
10
|
+
flags: string;
|
|
11
|
+
imports?: Imports;
|
|
12
|
+
outputFolder: string;
|
|
13
|
+
mode: OutputMode | OutputMode[];
|
|
14
|
+
warnLimit?: number;
|
|
15
|
+
errorLimit?: number;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testOption.js","sourceRoot":"","sources":["../../tools/test_runner/testOption.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WebAssemblyModule } from "./wasm.js";
|
|
2
|
+
export interface WebAssemblyCallSite {
|
|
3
|
+
functionName: string;
|
|
4
|
+
fileName: string;
|
|
5
|
+
lineNumber: number;
|
|
6
|
+
columnNumber: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ExecutionError {
|
|
9
|
+
message: string;
|
|
10
|
+
stacks: WebAssemblyCallSite[];
|
|
11
|
+
}
|
|
12
|
+
export declare function handleWebAssemblyError(error: WebAssembly.RuntimeError, wasmModule: WebAssemblyModule): Promise<ExecutionError>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// ref: https://v8.dev/docs/stack-trace-api
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { SourceMapConsumer } from "source-map";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { env } from "node:process";
|
|
6
|
+
function getOriginLocationWithSourceMap(line, column, sourceMapConsumer) {
|
|
7
|
+
if (sourceMapConsumer === null || line === null || column === null) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const originPosition = sourceMapConsumer.originalPositionFor({
|
|
11
|
+
line: line,
|
|
12
|
+
column: column,
|
|
13
|
+
});
|
|
14
|
+
if (originPosition.source === null || originPosition.line === null || originPosition.column === null) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
fileName: originPosition.source,
|
|
19
|
+
lineNumber: originPosition.line,
|
|
20
|
+
columnNumber: originPosition.column,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function getWebAssemblyFunctionName(callSite) {
|
|
24
|
+
return callSite.getFunctionName() ?? `wasm-function[${callSite.getFunction()?.toString() ?? "unknown"}]`;
|
|
25
|
+
}
|
|
26
|
+
function createWebAssemblyCallSite(callSite, moduleInfo) {
|
|
27
|
+
if (!callSite.getFileName()?.startsWith("wasm")) {
|
|
28
|
+
// ignore non-wasm call sites
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const line = callSite.getLineNumber();
|
|
32
|
+
const column = callSite.getColumnNumber();
|
|
33
|
+
const originalPosition = getOriginLocationWithSourceMap(line, column, moduleInfo.sourceMapConsumer);
|
|
34
|
+
if (originalPosition) {
|
|
35
|
+
return {
|
|
36
|
+
fileName: originalPosition.fileName,
|
|
37
|
+
functionName: getWebAssemblyFunctionName(callSite),
|
|
38
|
+
lineNumber: originalPosition.lineNumber,
|
|
39
|
+
columnNumber: originalPosition.columnNumber,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// fallback to the original call site
|
|
43
|
+
return {
|
|
44
|
+
fileName: moduleInfo.wasmPath,
|
|
45
|
+
functionName: getWebAssemblyFunctionName(callSite),
|
|
46
|
+
lineNumber: line ?? -1,
|
|
47
|
+
columnNumber: env["WARPO_TEST"] ? -1 : (column ?? -1),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async function getSourceMapConsumer(sourceMapPath) {
|
|
51
|
+
const sourceMapContent = await (async () => {
|
|
52
|
+
try {
|
|
53
|
+
return await readFile(sourceMapPath, "utf8");
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof Error) {
|
|
57
|
+
console.log(chalk.yellow(`Failed to read source map file: ${sourceMapPath} due to ${error}`));
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
})();
|
|
62
|
+
if (sourceMapContent === null) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return await new SourceMapConsumer(sourceMapContent, undefined);
|
|
66
|
+
}
|
|
67
|
+
export async function handleWebAssemblyError(error, wasmModule) {
|
|
68
|
+
let stackTrace = [];
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
70
|
+
const originalPrepareStackTrace = Error.prepareStackTrace;
|
|
71
|
+
Error.prepareStackTrace = (_, structuredStackTrace) => {
|
|
72
|
+
stackTrace = structuredStackTrace;
|
|
73
|
+
};
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
75
|
+
error.stack; // trigger prepareStackTrace
|
|
76
|
+
Error.prepareStackTrace = originalPrepareStackTrace;
|
|
77
|
+
let sourceMapConsumer = await getSourceMapConsumer(wasmModule.sourceMap);
|
|
78
|
+
const stacks = stackTrace
|
|
79
|
+
.map((callSite) => createWebAssemblyCallSite(callSite, { wasmPath: wasmModule.wasm, sourceMapConsumer }))
|
|
80
|
+
.filter((callSite) => callSite !== null);
|
|
81
|
+
sourceMapConsumer?.destroy(); // clean up the source map consumer
|
|
82
|
+
return {
|
|
83
|
+
message: error.message,
|
|
84
|
+
stacks,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=errorTraceHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorTraceHandler.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/errorTraceHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function escape(es: string): string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const escapeChars = {
|
|
2
|
+
"&": "&",
|
|
3
|
+
"<": "<",
|
|
4
|
+
">": ">",
|
|
5
|
+
"'": "'",
|
|
6
|
+
'"': """,
|
|
7
|
+
};
|
|
8
|
+
const pe = (m) => {
|
|
9
|
+
return escapeChars[m];
|
|
10
|
+
};
|
|
11
|
+
export function escape(es) {
|
|
12
|
+
return es.replaceAll(/["&'<>]/g, pe);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/escape.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE;IACvB,OAAO,WAAW,CAAC,CAAQ,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,EAAU;IAC/B,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Imports as ASImports } from "@assemblyscript/loader";
|
|
2
|
+
import { ImportsArgument } from "../interface.js";
|
|
3
|
+
export declare function json2map<V>(json: Record<string, V>): Map<string, V>;
|
|
4
|
+
/**
|
|
5
|
+
* return if the functionName is in fileName.
|
|
6
|
+
* @param fileName example: "assembly/assertCollector.ts"
|
|
7
|
+
* @param functionName example:
|
|
8
|
+
* "start:assembly/assertCollector~anonymous|0"
|
|
9
|
+
* || "assembly/assertCollector/addDescription"
|
|
10
|
+
*/
|
|
11
|
+
export declare function isFunctionInsideFile(fileName: string, functionName: string): boolean;
|
|
12
|
+
export declare function checkGenerics(functionName: string): string | undefined;
|
|
13
|
+
export declare function checkVarargs(functionName: string): string | undefined;
|
|
14
|
+
export declare function injectDefaultFunction(infos: WebAssembly.ModuleImportDescriptor[], importObject: ASImports, importsArg: ImportsArgument): void;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export function json2map(json) {
|
|
2
|
+
const res = new Map();
|
|
3
|
+
for (const key in json) {
|
|
4
|
+
const value = json[key];
|
|
5
|
+
if (value === undefined) {
|
|
6
|
+
throw new Error(`json parse failed: ${JSON.stringify(json)}`);
|
|
7
|
+
}
|
|
8
|
+
res.set(key, value);
|
|
9
|
+
}
|
|
10
|
+
return res;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* return if the functionName is in fileName.
|
|
14
|
+
* @param fileName example: "assembly/assertCollector.ts"
|
|
15
|
+
* @param functionName example:
|
|
16
|
+
* "start:assembly/assertCollector~anonymous|0"
|
|
17
|
+
* || "assembly/assertCollector/addDescription"
|
|
18
|
+
*/
|
|
19
|
+
export function isFunctionInsideFile(fileName, functionName) {
|
|
20
|
+
// `/`: parent is File
|
|
21
|
+
// `#`: parent is Class, this is non-static
|
|
22
|
+
// `.`: parent is Class, this is static
|
|
23
|
+
// `<`: generic
|
|
24
|
+
// `~`: parent is Function
|
|
25
|
+
const regex = new RegExp(`^(start:)?${fileName.slice(0, -3)}[/~](?<rest>.+)`);
|
|
26
|
+
const matchPrefix = regex.exec(functionName);
|
|
27
|
+
const rest = matchPrefix?.groups?.["rest"] ?? null;
|
|
28
|
+
if (rest === null) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const specialCharIndex = rest.search(/[/#.<~]/g);
|
|
32
|
+
if (specialCharIndex === -1) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
return rest[specialCharIndex] !== "/";
|
|
36
|
+
}
|
|
37
|
+
export function checkGenerics(functionName) {
|
|
38
|
+
// FIXME: cannot handle nested generic method in generic class
|
|
39
|
+
const startIndex = functionName.indexOf("<");
|
|
40
|
+
const endIndex = functionName.lastIndexOf(">");
|
|
41
|
+
if (startIndex !== -1 && endIndex !== -1) {
|
|
42
|
+
return functionName.slice(0, startIndex) + functionName.slice(endIndex + 1);
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
export function checkVarargs(functionName) {
|
|
47
|
+
if (functionName.endsWith("@varargs")) {
|
|
48
|
+
return functionName.slice(0, -8);
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
export function injectDefaultFunction(infos, importObject, importsArg) {
|
|
53
|
+
for (const info of infos) {
|
|
54
|
+
const { module, name, kind } = info;
|
|
55
|
+
const importObjectModule = importObject[module] ?? {};
|
|
56
|
+
importObject[module] = importObjectModule;
|
|
57
|
+
if (importObjectModule[name] !== undefined) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (module === "env" && name === "abort") {
|
|
61
|
+
importObjectModule[name] = (msg, file, line, col) => {
|
|
62
|
+
const exports = importsArg.exports;
|
|
63
|
+
throw new WebAssembly.RuntimeError(`abort: ${exports.__getString(msg)} at ${exports.__getString(file)}:${line}:${col}`);
|
|
64
|
+
};
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (module === "env" && name === "trace") {
|
|
68
|
+
importObjectModule[name] = (msg, n, ...args) => {
|
|
69
|
+
const exports = importsArg.exports;
|
|
70
|
+
importsArg.framework.log(`trace: ${exports.__getString(msg)}${n > 0 ? " " : ""}${args.slice(0, n).join(", ")}`);
|
|
71
|
+
};
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (kind === "function") {
|
|
75
|
+
importObjectModule[name] = () => {
|
|
76
|
+
// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-tobigint
|
|
77
|
+
// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-tonumber
|
|
78
|
+
// When return js value to wasm, spec requires to convert the value to bigint for i64 and number for others.
|
|
79
|
+
// Here return a number does not work for bigint because a TypeError will be thrown.
|
|
80
|
+
// The common solution is to return boolean that can be converted to both number and bigint
|
|
81
|
+
return false;
|
|
82
|
+
};
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
throw new Error(`unsupported import: ${module}.${name} of kind ${kind}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/index.ts"],"names":[],"mappings":"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"}
|