as-test 0.3.0 → 0.3.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/.github/workflows/as-test.yml +0 -3
- package/CHANGELOG.md +2 -0
- package/README.md +3 -8
- package/assembly/__tests__/mock.spec.ts +22 -0
- package/assembly/__tests__/mock.ts +7 -0
- package/assembly/index.ts +13 -19
- package/assets/img/screenshot.png +0 -0
- package/bin/build.js +77 -65
- package/bin/index.js +161 -131
- package/bin/init.js +110 -98
- package/bin/reporter.js +1 -1
- package/bin/run.js +236 -205
- package/bin/types.js +25 -25
- package/bin/util.js +42 -35
- package/cli/index.ts +1 -1
- package/cli/init.ts +2 -3
- package/cli/run.ts +1 -1
- package/package.json +1 -2
- package/run/package.json +1 -1
- package/tests/mock.run.js +14 -0
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/mock.js +76 -7
- package/transform/lib/mock.js.map +1 -1
- package/transform/package.json +1 -1
- package/transform/src/mock.ts +92 -8
- package/assets/img/download.png +0 -0
- package/jest.test.js +0 -44
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "as-test",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Testing framework for AssemblyScript. Compatible with WASI or Bindings ",
|
|
5
5
|
"types": "assembly/index.ts",
|
|
6
6
|
"author": "Jairus Tanaka",
|
|
@@ -31,7 +31,6 @@
|
|
|
31
31
|
"as-variant": "^0.4.1",
|
|
32
32
|
"chalk": "^5.3.0",
|
|
33
33
|
"glob": "^11.0.0",
|
|
34
|
-
"jest": "^29.7.0",
|
|
35
34
|
"json-as": "^0.9.14",
|
|
36
35
|
"typer-diff": "^1.1.1"
|
|
37
36
|
},
|
package/run/package.json
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
import { instantiate } from "../build/mock.spec.js";
|
|
3
|
+
|
|
4
|
+
const binary = readFileSync("./build/mock.spec.wasm");
|
|
5
|
+
const module = new WebAssembly.Module(binary);
|
|
6
|
+
|
|
7
|
+
const exports = instantiate(module, {
|
|
8
|
+
"mock.spec": {},
|
|
9
|
+
mock: {
|
|
10
|
+
foo: () => {
|
|
11
|
+
return "buz";
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAEL,IAAI,EAGJ,MAAM,EACN,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAEL,IAAI,EAGJ,MAAM,EACN,SAAS,GACV,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;IAEhD,UAAU,CAAC,MAAc;QAEvB,MAAM,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAGzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;aAC3B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACrC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;YACf,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;YAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;YAC1B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjC,OAAO,CAAC,CAAC,CAAC;YACZ,CAAC;iBAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxC,OAAO,CAAC,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC,CAAC,CAAC;QACL,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAwB,CAC5C,CAAC,UAAU,CAAC;QAEb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CACvC,IAAI,EACJ;gBACE,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,EAC3D,IAAI,KAEJ,IAAI,EACJ,IAAI,CAAC,6BAA6B,CAAC,SAAS,GAAG,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EACnE,MAAM,CAAC,KAAK,CACb;aACF,EACD,MAAM,CAAC,KAAK,CACb,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnB,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBACrC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;gBACxD,MAAM,SAAS,GAAG,IAAI,SAAS,CAC7B,IAAI,MAAM,IAER,MAAM,CAAC,cAAc,EACrB,kEAAkE,CACnE,CACF,CAAC;gBACF,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC;gBACxC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAE,CAAC,CAAC;gBACrE,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;YAChC,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,gBAAgB,GAAG,EAAE,CAAC;IACjC,CAAC;CACF"}
|
package/transform/lib/mock.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Node,
|
|
3
|
+
FunctionDeclaration,
|
|
4
|
+
} from "assemblyscript/dist/assemblyscript.js";
|
|
2
5
|
import { BaseVisitor } from "visitor-as/dist/index.js";
|
|
3
6
|
import { isStdlib, toString } from "visitor-as/dist/utils.js";
|
|
4
7
|
export class MockTransform extends BaseVisitor {
|
|
5
8
|
currentSource;
|
|
6
9
|
globalStatements = [];
|
|
7
|
-
fn = new Map();
|
|
8
10
|
mocked = new Set();
|
|
11
|
+
importFns = [];
|
|
12
|
+
importMocked = new Set();
|
|
9
13
|
visitCallExpression(node) {
|
|
10
14
|
super.visitCallExpression(node);
|
|
11
15
|
const name = toString(node.expression)
|
|
@@ -19,10 +23,13 @@ export class MockTransform extends BaseVisitor {
|
|
|
19
23
|
);
|
|
20
24
|
return;
|
|
21
25
|
}
|
|
26
|
+
if (name == "mockImport") {
|
|
27
|
+
this.importMocked.add(node.args[0].value);
|
|
28
|
+
}
|
|
22
29
|
if (name != "mockFn") return;
|
|
23
|
-
const ov = node.args[0];
|
|
30
|
+
const ov = toString(node.args[0]);
|
|
24
31
|
const cb = node.args[1];
|
|
25
|
-
const newName = ov
|
|
32
|
+
const newName = ov
|
|
26
33
|
.replaceAll(".", "_")
|
|
27
34
|
.replaceAll("[", "_")
|
|
28
35
|
.replaceAll("]", "_");
|
|
@@ -49,10 +56,8 @@ export class MockTransform extends BaseVisitor {
|
|
|
49
56
|
this.mocked.add(newFn.name.text);
|
|
50
57
|
}
|
|
51
58
|
visitFunctionDeclaration(node, isDefault) {
|
|
59
|
+
if (!node.body) this.importFns.push(node);
|
|
52
60
|
super.visitFunctionDeclaration(node, isDefault);
|
|
53
|
-
const name = node.name.text;
|
|
54
|
-
if (!name) return;
|
|
55
|
-
this.fn.set(name, node);
|
|
56
61
|
}
|
|
57
62
|
visitSource(node) {
|
|
58
63
|
if (node.isLibrary || isStdlib(node)) {
|
|
@@ -63,6 +68,70 @@ export class MockTransform extends BaseVisitor {
|
|
|
63
68
|
this.mocked = new Set();
|
|
64
69
|
this.currentSource = node;
|
|
65
70
|
super.visitSource(node);
|
|
71
|
+
for (const node of this.importFns) {
|
|
72
|
+
let path = "";
|
|
73
|
+
const dec = node.decorators?.find((v) => v.name.text == "external");
|
|
74
|
+
if (dec.args[0] && dec.args[1])
|
|
75
|
+
path = dec.args.map((v) => v.value).join(".");
|
|
76
|
+
else if (dec.args[0])
|
|
77
|
+
path = this.currentSource.simplePath + "." + dec.args[0].value;
|
|
78
|
+
else path = this.currentSource.simplePath + "." + node.name.text;
|
|
79
|
+
if (!this.importMocked.has(path)) return;
|
|
80
|
+
let args = [
|
|
81
|
+
Node.createCallExpression(
|
|
82
|
+
Node.createPropertyAccessExpression(
|
|
83
|
+
Node.createIdentifierExpression("__mock_import", node.range),
|
|
84
|
+
Node.createIdentifierExpression("get", node.range),
|
|
85
|
+
node.range,
|
|
86
|
+
),
|
|
87
|
+
null,
|
|
88
|
+
[Node.createStringLiteralExpression(path, node.range)],
|
|
89
|
+
node.range,
|
|
90
|
+
),
|
|
91
|
+
];
|
|
92
|
+
for (const param of node.signature.parameters) {
|
|
93
|
+
args.push(Node.createIdentifierExpression(param.name.text, node.range));
|
|
94
|
+
}
|
|
95
|
+
const newFn = Node.createFunctionDeclaration(
|
|
96
|
+
node.name,
|
|
97
|
+
node.decorators.filter((v) => v.name.text != "external"),
|
|
98
|
+
node.flags - 32768 - 4,
|
|
99
|
+
null,
|
|
100
|
+
node.signature,
|
|
101
|
+
Node.createBlockStatement(
|
|
102
|
+
[
|
|
103
|
+
Node.createReturnStatement(
|
|
104
|
+
Node.createCallExpression(
|
|
105
|
+
Node.createIdentifierExpression("call_indirect", node.range),
|
|
106
|
+
null,
|
|
107
|
+
args,
|
|
108
|
+
node.range,
|
|
109
|
+
),
|
|
110
|
+
node.range,
|
|
111
|
+
),
|
|
112
|
+
],
|
|
113
|
+
node.range,
|
|
114
|
+
),
|
|
115
|
+
0,
|
|
116
|
+
node.range,
|
|
117
|
+
);
|
|
118
|
+
newFn.signature = node.signature;
|
|
119
|
+
const stmts = this.currentSource.statements;
|
|
120
|
+
let index = -1;
|
|
121
|
+
for (let i = 0; i < stmts.length; i++) {
|
|
122
|
+
const stmt = stmts[i];
|
|
123
|
+
if (
|
|
124
|
+
stmt instanceof FunctionDeclaration &&
|
|
125
|
+
stmt.name.text === node.name.text
|
|
126
|
+
) {
|
|
127
|
+
index = i;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (index === -1) return;
|
|
132
|
+
stmts.splice(index, 1, newFn);
|
|
133
|
+
}
|
|
134
|
+
this.importFns = [];
|
|
66
135
|
}
|
|
67
136
|
}
|
|
68
137
|
//# sourceMappingURL=mock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../src/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,IAAI,
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../src/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,IAAI,EAIJ,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC9D,MAAM,OAAO,aAAc,SAAQ,WAAW;IACrC,aAAa,CAAS;IACtB,gBAAgB,GAAgB,EAAE,CAAC;IACnC,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3B,SAAS,GAA0B,EAAE,CAAC;IACtC,YAAY,GAAgB,IAAI,GAAG,EAAU,CAAC;IACrD,mBAAmB,CAAC,IAAoB;QACtC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;aACnC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;aACpB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;aACpB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAExB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,0BAA0B,CAC/C,IAAI,GAAG,OAAO,EACd,IAAI,CAAC,UAAU,CAAC,KAAK,CACtB,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,IAAI,IAAI,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAA6B,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,IAAI,IAAI,QAAQ;YAAE,OAAO;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAuB,CAAC;QAC9C,MAAM,OAAO,GAAG,EAAE;aACf,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;aACpB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;aACpB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,CAC1C,IAAI,CAAC,0BAA0B,CAAC,OAAO,GAAG,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,EAC5D,EAAE,CAAC,WAAW,CAAC,UAAU,KAEzB,EAAE,CAAC,WAAW,CAAC,cAAc,EAC7B,EAAE,CAAC,WAAW,CAAC,SAAS,EACxB,EAAE,CAAC,WAAW,CAAC,IAAI,EACnB,EAAE,CAAC,WAAW,CAAC,SAAS,EACxB,EAAE,CAAC,KAAK,CACT,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,SAAS;YACnD,KAAK,GAAG,CAAC,CAAC;YACV,MAAM;QACR,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO;QACzB,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,wBAAwB,CACtB,IAAyB,EACzB,SAAmB;QAEnB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IACD,WAAW,CAAC,IAAY;QACtB,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpD,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAExB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,IAA6B,CAAC,IAAI,IAAI,UAAU,CAC3D,CAAC;YACF,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,IAAI,GAAG,GAAG,CAAC,IAAI;qBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAA6B,CAAC,KAAK,CAAC;qBAChD,IAAI,CAAC,GAAG,CAAC,CAAC;iBACV,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClB,IAAI;oBACF,IAAI,CAAC,aAAa,CAAC,UAAU;wBAC7B,GAAG;wBACF,GAAG,CAAC,IAAI,CAAC,CAAC,CAA6B,CAAC,KAAK,CAAC;;gBAC9C,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAEjE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAEzC,IAAI,IAAI,GAAiB;gBACvB,IAAI,CAAC,oBAAoB,CACvB,IAAI,CAAC,8BAA8B,CACjC,IAAI,CAAC,0BAA0B,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,EAC5D,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAClD,IAAI,CAAC,KAAK,CACX,EACD,IAAI,EACJ,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EACtD,IAAI,CAAC,KAAK,CACX;aACF,CAAC;YAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,CAC1C,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,UAAU,CAAC,MAAM,CACpB,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,IAA6B,CAAC,IAAI,IAAI,UAAU,CAC3D,EACD,IAAI,CAAC,KAAK,QAAsB,IAAsB,EACtD,IAAI,EACJ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,oBAAoB,CACvB;gBACE,IAAI,CAAC,qBAAqB,CACxB,IAAI,CAAC,oBAAoB,CACvB,IAAI,CAAC,0BAA0B,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,EAC5D,IAAI,EACJ,IAAI,EACJ,IAAI,CAAC,KAAK,CACX,EACD,IAAI,CAAC,KAAK,CACX;aACF,EACD,IAAI,CAAC,KAAK,CACX,KAED,IAAI,CAAC,KAAK,CACX,CAAC;YAEF,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;YAC5C,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IACE,IAAI,YAAY,mBAAmB;oBACnC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EACjC,CAAC;oBACD,KAAK,GAAG,CAAC,CAAC;oBACV,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,OAAO;YACzB,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;CACF"}
|
package/transform/package.json
CHANGED
package/transform/src/mock.ts
CHANGED
|
@@ -6,16 +6,20 @@ import {
|
|
|
6
6
|
FunctionExpression,
|
|
7
7
|
CommonFlags,
|
|
8
8
|
Node,
|
|
9
|
+
ArrowKind,
|
|
10
|
+
IdentifierExpression,
|
|
11
|
+
Expression,
|
|
12
|
+
FunctionDeclaration,
|
|
9
13
|
} from "assemblyscript/dist/assemblyscript.js";
|
|
10
|
-
import { FunctionDeclaration } from "types:assemblyscript/src/ast";
|
|
11
14
|
|
|
12
15
|
import { BaseVisitor } from "visitor-as/dist/index.js";
|
|
13
16
|
import { isStdlib, toString } from "visitor-as/dist/utils.js";
|
|
14
17
|
export class MockTransform extends BaseVisitor {
|
|
15
18
|
public currentSource: Source;
|
|
16
19
|
public globalStatements: Statement[] = [];
|
|
17
|
-
public fn = new Map<string, FunctionDeclaration>();
|
|
18
20
|
public mocked = new Set<string>();
|
|
21
|
+
public importFns: FunctionDeclaration[] = [];
|
|
22
|
+
public importMocked: Set<string> = new Set<string>();
|
|
19
23
|
visitCallExpression(node: CallExpression): void {
|
|
20
24
|
super.visitCallExpression(node);
|
|
21
25
|
const name = toString(node.expression)
|
|
@@ -31,11 +35,13 @@ export class MockTransform extends BaseVisitor {
|
|
|
31
35
|
return;
|
|
32
36
|
}
|
|
33
37
|
|
|
38
|
+
if (name == "mockImport") {
|
|
39
|
+
this.importMocked.add((node.args[0] as StringLiteralExpression).value);
|
|
40
|
+
}
|
|
34
41
|
if (name != "mockFn") return;
|
|
35
|
-
const ov = node.args[0]
|
|
42
|
+
const ov = toString(node.args[0]);
|
|
36
43
|
const cb = node.args[1] as FunctionExpression;
|
|
37
|
-
|
|
38
|
-
const newName = ov.value
|
|
44
|
+
const newName = ov
|
|
39
45
|
.replaceAll(".", "_")
|
|
40
46
|
.replaceAll("[", "_")
|
|
41
47
|
.replaceAll("]", "_");
|
|
@@ -67,10 +73,8 @@ export class MockTransform extends BaseVisitor {
|
|
|
67
73
|
node: FunctionDeclaration,
|
|
68
74
|
isDefault?: boolean,
|
|
69
75
|
): void {
|
|
76
|
+
if (!node.body) this.importFns.push(node);
|
|
70
77
|
super.visitFunctionDeclaration(node, isDefault);
|
|
71
|
-
const name = node.name.text;
|
|
72
|
-
if (!name) return;
|
|
73
|
-
this.fn.set(name, node);
|
|
74
78
|
}
|
|
75
79
|
visitSource(node: Source): void {
|
|
76
80
|
if (node.isLibrary || isStdlib(node)) {
|
|
@@ -81,5 +85,85 @@ export class MockTransform extends BaseVisitor {
|
|
|
81
85
|
this.mocked = new Set<string>();
|
|
82
86
|
this.currentSource = node;
|
|
83
87
|
super.visitSource(node);
|
|
88
|
+
|
|
89
|
+
for (const node of this.importFns) {
|
|
90
|
+
let path = "";
|
|
91
|
+
const dec = node.decorators?.find(
|
|
92
|
+
(v) => (v.name as IdentifierExpression).text == "external",
|
|
93
|
+
);
|
|
94
|
+
if (dec.args[0] && dec.args[1])
|
|
95
|
+
path = dec.args
|
|
96
|
+
.map((v) => (v as StringLiteralExpression).value)
|
|
97
|
+
.join(".");
|
|
98
|
+
else if (dec.args[0])
|
|
99
|
+
path =
|
|
100
|
+
this.currentSource.simplePath +
|
|
101
|
+
"." +
|
|
102
|
+
(dec.args[0] as StringLiteralExpression).value;
|
|
103
|
+
else path = this.currentSource.simplePath + "." + node.name.text;
|
|
104
|
+
|
|
105
|
+
if (!this.importMocked.has(path)) return;
|
|
106
|
+
|
|
107
|
+
let args: Expression[] = [
|
|
108
|
+
Node.createCallExpression(
|
|
109
|
+
Node.createPropertyAccessExpression(
|
|
110
|
+
Node.createIdentifierExpression("__mock_import", node.range),
|
|
111
|
+
Node.createIdentifierExpression("get", node.range),
|
|
112
|
+
node.range,
|
|
113
|
+
),
|
|
114
|
+
null,
|
|
115
|
+
[Node.createStringLiteralExpression(path, node.range)],
|
|
116
|
+
node.range,
|
|
117
|
+
),
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
for (const param of node.signature.parameters) {
|
|
121
|
+
args.push(Node.createIdentifierExpression(param.name.text, node.range));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const newFn = Node.createFunctionDeclaration(
|
|
125
|
+
node.name,
|
|
126
|
+
node.decorators.filter(
|
|
127
|
+
(v) => (v.name as IdentifierExpression).text != "external",
|
|
128
|
+
),
|
|
129
|
+
node.flags - CommonFlags.Ambient - CommonFlags.Declare,
|
|
130
|
+
null,
|
|
131
|
+
node.signature,
|
|
132
|
+
Node.createBlockStatement(
|
|
133
|
+
[
|
|
134
|
+
Node.createReturnStatement(
|
|
135
|
+
Node.createCallExpression(
|
|
136
|
+
Node.createIdentifierExpression("call_indirect", node.range),
|
|
137
|
+
null,
|
|
138
|
+
args,
|
|
139
|
+
node.range,
|
|
140
|
+
),
|
|
141
|
+
node.range,
|
|
142
|
+
),
|
|
143
|
+
],
|
|
144
|
+
node.range,
|
|
145
|
+
),
|
|
146
|
+
ArrowKind.None,
|
|
147
|
+
node.range,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
newFn.signature = node.signature;
|
|
151
|
+
|
|
152
|
+
const stmts = this.currentSource.statements;
|
|
153
|
+
let index = -1;
|
|
154
|
+
for (let i = 0; i < stmts.length; i++) {
|
|
155
|
+
const stmt = stmts[i];
|
|
156
|
+
if (
|
|
157
|
+
stmt instanceof FunctionDeclaration &&
|
|
158
|
+
stmt.name.text === node.name.text
|
|
159
|
+
) {
|
|
160
|
+
index = i;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (index === -1) return;
|
|
165
|
+
stmts.splice(index, 1, newFn);
|
|
166
|
+
}
|
|
167
|
+
this.importFns = [];
|
|
84
168
|
}
|
|
85
169
|
}
|
package/assets/img/download.png
DELETED
|
Binary file
|
package/jest.test.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
describe("Math operations", () => {
|
|
2
|
-
// Setup before each test in this group (optional)
|
|
3
|
-
beforeEach(() => {
|
|
4
|
-
log("Initializing test...");
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
// Teardown after each test in this group (optional)
|
|
8
|
-
afterEach(() => {
|
|
9
|
-
log("Cleaning up after test...");
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test("Addition", () => {
|
|
13
|
-
expect(1 + 2).toBe(3);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
test("Comparison", () => {
|
|
17
|
-
expect(5).toBeGreaterThan(3);
|
|
18
|
-
expect(2).toBeLessThan(4);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test("Type checking", () => {
|
|
22
|
-
expect("hello").toBeString();
|
|
23
|
-
expect(true).toBeBoolean();
|
|
24
|
-
expect(10.5).toBeNumber();
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
let myArray = [];
|
|
29
|
-
|
|
30
|
-
describe("Array manipulation", () => {
|
|
31
|
-
beforeAll(() => {
|
|
32
|
-
myArray = [1, 2, 3];
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test("Array length", () => {
|
|
36
|
-
expect(myArray).toHaveLength(3);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test("Array inclusion", () => {
|
|
40
|
-
expect(myArray).toContain(2);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
function foo() {}
|