xbintsc 0.3.14 → 0.3.16
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/README.md +22 -22
- package/README.zh-CN.md +20 -19
- package/bin/xbintsc.js +1 -2
- package/dist/src/cli/main.js +8 -5
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/codegen/generator/state.js +8 -0
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/tables.d.ts +5 -6
- package/dist/src/codegen/generator/tables.js +13 -6
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/driver/bundler/graph.d.ts +8 -0
- package/dist/src/driver/bundler/graph.js +85 -0
- package/dist/src/driver/bundler/graph.js.map +1 -0
- package/dist/src/driver/bundler/merge.d.ts +11 -0
- package/dist/src/driver/bundler/merge.js +288 -0
- package/dist/src/driver/bundler/merge.js.map +1 -0
- package/dist/src/driver/bundler/resolve.d.ts +12 -0
- package/dist/src/driver/bundler/resolve.js +246 -0
- package/dist/src/driver/bundler/resolve.js.map +1 -0
- package/dist/src/driver/bundler/symbols.d.ts +15 -0
- package/dist/src/driver/bundler/symbols.js +51 -0
- package/dist/src/driver/bundler/symbols.js.map +1 -0
- package/dist/src/driver/bundler/types.d.ts +36 -0
- package/dist/src/driver/bundler/types.js +5 -0
- package/dist/src/driver/bundler/types.js.map +1 -0
- package/dist/src/driver/index.d.ts +1 -2
- package/dist/src/driver/index.js +1 -2
- package/dist/src/driver/index.js.map +1 -1
- package/dist/src/driver/modules.d.ts +9 -16
- package/dist/src/driver/modules.js +8 -644
- package/dist/src/driver/modules.js.map +1 -1
- package/dist/src/driver/paths.d.ts +0 -9
- package/dist/src/driver/paths.js +0 -31
- package/dist/src/driver/paths.js.map +1 -1
- package/dist/src/driver/toolchain-provider.d.ts +10 -10
- package/dist/src/driver/toolchain-provider.js +9 -38
- package/dist/src/driver/toolchain-provider.js.map +1 -1
- package/dist/src/driver/toolchain.js +8 -2
- package/dist/src/driver/toolchain.js.map +1 -1
- package/dist/src/extensions/catalog.js +2 -1
- package/dist/src/extensions/catalog.js.map +1 -1
- package/dist/src/extensions/gui/index.d.ts +24 -0
- package/dist/src/extensions/gui/index.js +101 -0
- package/dist/src/extensions/gui/index.js.map +1 -0
- package/dist/src/extensions/native.d.ts +2 -3
- package/dist/src/extensions/native.js +2 -3
- package/dist/src/extensions/native.js.map +1 -1
- package/dist/tests/driver/paths.test.js +1 -9
- package/dist/tests/driver/paths.test.js.map +1 -1
- package/dist/tests/driver/toolchain-provider.test.js +12 -79
- package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
- package/dist/tests/e2e/compile-basics.test.d.ts +4 -0
- package/dist/tests/e2e/compile-basics.test.js +134 -0
- package/dist/tests/e2e/compile-basics.test.js.map +1 -0
- package/dist/tests/e2e/compile-builtins.test.d.ts +4 -0
- package/dist/tests/e2e/compile-builtins.test.js +191 -0
- package/dist/tests/e2e/compile-builtins.test.js.map +1 -0
- package/dist/tests/e2e/compile-control-flow.test.d.ts +4 -0
- package/dist/tests/e2e/compile-control-flow.test.js +190 -0
- package/dist/tests/e2e/compile-control-flow.test.js.map +1 -0
- package/dist/tests/e2e/compile-modules.test.d.ts +4 -0
- package/dist/tests/e2e/compile-modules.test.js +48 -0
- package/dist/tests/e2e/compile-modules.test.js.map +1 -0
- package/dist/tests/e2e/compile-objects-classes.test.d.ts +4 -0
- package/dist/tests/e2e/compile-objects-classes.test.js +362 -0
- package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -0
- package/dist/tests/e2e/differential-helpers.d.ts +12 -0
- package/dist/tests/e2e/differential-helpers.js +16 -0
- package/dist/tests/e2e/differential-helpers.js.map +1 -0
- package/dist/tests/e2e/differential-language.test.d.ts +4 -0
- package/dist/tests/e2e/{differential.test.js → differential-language.test.js} +5 -287
- package/dist/tests/e2e/differential-language.test.js.map +1 -0
- package/dist/tests/e2e/differential-symbols.test.d.ts +4 -0
- package/dist/tests/e2e/differential-symbols.test.js +92 -0
- package/dist/tests/e2e/differential-symbols.test.js.map +1 -0
- package/dist/tests/e2e/differential-values.test.d.ts +4 -0
- package/dist/tests/e2e/differential-values.test.js +197 -0
- package/dist/tests/e2e/differential-values.test.js.map +1 -0
- package/dist/tests/e2e/gui.test.d.ts +12 -0
- package/dist/tests/e2e/gui.test.js +493 -0
- package/dist/tests/e2e/gui.test.js.map +1 -0
- package/dist/tests/e2e/native-extensions.test.d.ts +4 -5
- package/dist/tests/e2e/native-extensions.test.js +6 -7
- package/dist/tests/e2e/native-extensions.test.js.map +1 -1
- package/dist/tests/e2e/runtime-coverage-buffer.test.d.ts +4 -0
- package/dist/tests/e2e/runtime-coverage-buffer.test.js +97 -0
- package/dist/tests/e2e/runtime-coverage-buffer.test.js.map +1 -0
- package/dist/tests/e2e/runtime-coverage-globals.test.d.ts +4 -0
- package/dist/tests/e2e/runtime-coverage-globals.test.js +149 -0
- package/dist/tests/e2e/runtime-coverage-globals.test.js.map +1 -0
- package/dist/tests/e2e/runtime-coverage-node-modules.test.d.ts +4 -0
- package/dist/tests/e2e/runtime-coverage-node-modules.test.js +177 -0
- package/dist/tests/e2e/runtime-coverage-node-modules.test.js.map +1 -0
- package/dist/tests/e2e/runtime-coverage-streams.test.d.ts +4 -0
- package/dist/tests/e2e/runtime-coverage-streams.test.js +161 -0
- package/dist/tests/e2e/runtime-coverage-streams.test.js.map +1 -0
- package/dist/tests/e2e/runtime-coverage-system.test.d.ts +4 -0
- package/dist/tests/e2e/runtime-coverage-system.test.js +91 -0
- package/dist/tests/e2e/runtime-coverage-system.test.js.map +1 -0
- package/dist/tests/e2e/timers.test.d.ts +7 -0
- package/dist/tests/e2e/timers.test.js +63 -0
- package/dist/tests/e2e/timers.test.js.map +1 -0
- package/package.json +2 -2
- package/runtime/ext_gui/css.cpp +743 -0
- package/runtime/ext_gui/css.h +98 -0
- package/runtime/ext_gui/document.cpp +264 -0
- package/runtime/ext_gui/document.h +89 -0
- package/runtime/ext_gui/dom.cpp +472 -0
- package/runtime/ext_gui/dom.h +71 -0
- package/runtime/ext_gui/gui.cpp +457 -0
- package/runtime/ext_gui/gui_engine.h +81 -0
- package/runtime/ext_gui/image.cpp +125 -0
- package/runtime/ext_gui/image.h +42 -0
- package/runtime/ext_gui/layout.cpp +748 -0
- package/runtime/ext_gui/layout.h +93 -0
- package/runtime/ext_gui/paint.cpp +137 -0
- package/runtime/ext_gui/paint.h +75 -0
- package/runtime/ext_gui/renderer.cpp +959 -0
- package/runtime/ext_gui/renderer.h +68 -0
- package/runtime/ext_gui/stb_image.h +7988 -0
- package/runtime/ext_gui/style.cpp +771 -0
- package/runtime/ext_gui/style.h +117 -0
- package/runtime/ext_gui/text.cpp +378 -0
- package/runtime/ext_gui/text.h +78 -0
- package/runtime/ext_gui/window.cpp +405 -0
- package/runtime/ext_node/fs/fs_common.h +13 -527
- package/runtime/ext_node/fs/meta_ops.c +3 -3
- package/runtime/ext_node/fs/parts/buffer-bridge.inc +6 -0
- package/runtime/ext_node/fs/parts/builtins.inc +69 -0
- package/runtime/ext_node/fs/parts/dir.inc +47 -0
- package/runtime/ext_node/fs/parts/encoding.inc +186 -0
- package/runtime/ext_node/fs/parts/errors.inc +66 -0
- package/runtime/ext_node/fs/parts/flags.inc +39 -0
- package/runtime/ext_node/fs/parts/platform.inc +86 -0
- package/runtime/ext_node/fs/parts/promisify.inc +15 -0
- package/runtime/ext_node/fs/parts/time.inc +9 -0
- package/runtime/rt.h +36 -4
- package/runtime/rt_internal.h +10 -23
- package/runtime/xt_builtins.c +4 -0
- package/runtime/xt_containers/access.inc +168 -0
- package/runtime/xt_containers/arrays.inc +108 -0
- package/runtime/xt_containers/boxes.inc +11 -0
- package/runtime/xt_containers/objects.inc +326 -0
- package/runtime/xt_containers.c +8 -618
- package/runtime/xt_ext.h +0 -1
- package/runtime/xt_io/base64.inc +87 -0
- package/runtime/xt_io/console.inc +119 -0
- package/runtime/xt_io/exception.inc +142 -0
- package/runtime/xt_io/inspect.inc +212 -0
- package/runtime/xt_io.c +11 -556
- package/runtime/xt_loop.c +262 -24
- package/runtime/xt_regex/api.inc +58 -0
- package/runtime/xt_regex/helpers.inc +68 -0
- package/runtime/xt_regex/matcher.inc +248 -0
- package/runtime/xt_regex/parser.inc +236 -0
- package/runtime/xt_regex/types.inc +58 -0
- package/runtime/xt_regex.h +9 -672
- package/runtime/xt_stdlib2/helpers.inc +2 -4
- package/runtime/xt_values/arithmetic.inc +150 -0
- package/runtime/xt_values/comparison.inc +112 -0
- package/runtime/xt_values/constructors.inc +41 -0
- package/runtime/xt_values/conversions.inc +115 -0
- package/runtime/xt_values/number-format.inc +180 -0
- package/runtime/xt_values/strings.inc +22 -0
- package/runtime/xt_values.c +10 -626
- package/scripts/build-gui.ts +317 -0
- package/scripts/build-runtime.ts +7 -8
- package/scripts/coverage-runtime.ts +4 -4
- package/scripts/package-release.ts +12 -84
- package/src/cli/main.ts +8 -4
- package/src/codegen/generator/state.ts +8 -0
- package/src/codegen/generator/tables.ts +13 -6
- package/src/driver/bundler/graph.ts +95 -0
- package/src/driver/bundler/merge.ts +312 -0
- package/src/driver/bundler/resolve.ts +240 -0
- package/src/driver/bundler/symbols.ts +55 -0
- package/src/driver/bundler/types.ts +37 -0
- package/src/driver/index.ts +1 -9
- package/src/driver/modules.ts +9 -693
- package/src/driver/paths.ts +0 -31
- package/src/driver/toolchain-provider.ts +12 -45
- package/src/driver/toolchain.ts +7 -2
- package/src/extensions/catalog.ts +2 -1
- package/src/extensions/gui/index.ts +107 -0
- package/src/extensions/native.ts +2 -3
- package/dist/src/driver/toolchain-download.d.ts +0 -50
- package/dist/src/driver/toolchain-download.js +0 -102
- package/dist/src/driver/toolchain-download.js.map +0 -1
- package/dist/tests/driver/toolchain-download.test.d.ts +0 -1
- package/dist/tests/driver/toolchain-download.test.js +0 -53
- package/dist/tests/driver/toolchain-download.test.js.map +0 -1
- package/dist/tests/e2e/compile.test.d.ts +0 -8
- package/dist/tests/e2e/compile.test.js +0 -893
- package/dist/tests/e2e/compile.test.js.map +0 -1
- package/dist/tests/e2e/differential.test.d.ts +0 -7
- package/dist/tests/e2e/differential.test.js.map +0 -1
- package/dist/tests/e2e/runtime-coverage.test.d.ts +0 -11
- package/dist/tests/e2e/runtime-coverage.test.js +0 -646
- package/dist/tests/e2e/runtime-coverage.test.js.map +0 -1
- package/scripts/fetch-toolchain.ts +0 -101
- package/src/driver/toolchain-download.ts +0 -135
|
@@ -1,29 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
1
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
2
|
import { resolveToolchain } from "../../src/driver/toolchain-provider.js";
|
|
6
3
|
import { ToolchainError } from "../../src/driver/toolchain.js";
|
|
7
|
-
// The real `findVendorDir` also looks next to the package, so a toolchain
|
|
8
|
-
// already fetched on the machine (e.g. the CI `vendor/` for Windows ARM64)
|
|
9
|
-
// would shadow the temporary one each test creates. Restrict discovery to the
|
|
10
|
-
// working directory so the tests are hermetic.
|
|
11
|
-
vi.mock("../../src/driver/paths.js", async (importOriginal) => {
|
|
12
|
-
const actual = await importOriginal();
|
|
13
|
-
const { existsSync } = await import("node:fs");
|
|
14
|
-
const { join: joinPath } = await import("node:path");
|
|
15
|
-
return {
|
|
16
|
-
...actual,
|
|
17
|
-
findVendorDir: () => {
|
|
18
|
-
const root = process.cwd();
|
|
19
|
-
const specific = joinPath(root, "vendor", `${process.platform}-${process.arch}`);
|
|
20
|
-
if (existsSync(specific))
|
|
21
|
-
return specific;
|
|
22
|
-
const generic = joinPath(root, "vendor");
|
|
23
|
-
return existsSync(generic) ? generic : undefined;
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
});
|
|
27
4
|
const saved = { ...process.env };
|
|
28
5
|
afterEach(() => {
|
|
29
6
|
process.env = { ...saved };
|
|
@@ -36,22 +13,6 @@ function runnerThatWorks(...commands) {
|
|
|
36
13
|
},
|
|
37
14
|
};
|
|
38
15
|
}
|
|
39
|
-
/** Run `fn` inside a temporary working directory and always restore it. */
|
|
40
|
-
function withWorkingDirectory(fn) {
|
|
41
|
-
const created = mkdtempSync(join(tmpdir(), "xbintsc-toolchain-"));
|
|
42
|
-
const previous = process.cwd();
|
|
43
|
-
process.chdir(created);
|
|
44
|
-
// `process.cwd()` may resolve symlinks (e.g. /var -> /private/var on macOS),
|
|
45
|
-
// so hand the caller the canonical path the provider will actually see.
|
|
46
|
-
const directory = process.cwd();
|
|
47
|
-
try {
|
|
48
|
-
return fn(directory);
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
process.chdir(previous);
|
|
52
|
-
rmSync(created, { recursive: true, force: true });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
16
|
describe("resolveToolchain", () => {
|
|
56
17
|
it("prefers an explicit xbintsc_CLANG", () => {
|
|
57
18
|
process.env.xbintsc_CLANG = "my-clang";
|
|
@@ -93,46 +54,18 @@ describe("resolveToolchain", () => {
|
|
|
93
54
|
const toolchain = resolveToolchain(runnerThatWorks("my-clang"));
|
|
94
55
|
expect(toolchain.linkerArgs).toEqual(["--foo", "--bar"]);
|
|
95
56
|
});
|
|
96
|
-
it("
|
|
97
|
-
delete process.env.xbintsc_CLANG;
|
|
98
|
-
delete process.env.xbintsc_TOOLCHAIN;
|
|
99
|
-
withWorkingDirectory((directory) => {
|
|
100
|
-
mkdirSync(join(directory, "vendor", "bin"), { recursive: true });
|
|
101
|
-
const clang = join(directory, "vendor", "bin", "clang");
|
|
102
|
-
writeFileSync(clang, "");
|
|
103
|
-
const toolchain = resolveToolchain(runnerThatWorks(clang));
|
|
104
|
-
expect(toolchain.source).toBe("vendor");
|
|
105
|
-
expect(toolchain.clang).toBe(clang);
|
|
106
|
-
expect(toolchain.linkerArgs).toContain("-fuse-ld=lld");
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
it("ignores a vendor directory whose compiler does not work", () => {
|
|
110
|
-
delete process.env.xbintsc_CLANG;
|
|
111
|
-
delete process.env.xbintsc_TOOLCHAIN;
|
|
112
|
-
withWorkingDirectory((directory) => {
|
|
113
|
-
mkdirSync(join(directory, "vendor", "bin"), { recursive: true });
|
|
114
|
-
writeFileSync(join(directory, "vendor", "bin", "clang"), "");
|
|
115
|
-
const toolchain = resolveToolchain(runnerThatWorks("clang"));
|
|
116
|
-
expect(toolchain.source).toBe("system");
|
|
117
|
-
expect(toolchain.clang).toBe("clang");
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
it("still succeeds when an explicit compiler throws and a vendor exists", () => {
|
|
57
|
+
it("still succeeds when an explicit compiler throws", () => {
|
|
121
58
|
process.env.xbintsc_CLANG = "exploding-clang";
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
};
|
|
133
|
-
const toolchain = resolveToolchain(runner);
|
|
134
|
-
expect(toolchain.source).toBe("vendor");
|
|
135
|
-
});
|
|
59
|
+
const runner = {
|
|
60
|
+
run(command) {
|
|
61
|
+
if (command === "exploding-clang")
|
|
62
|
+
throw new Error("cannot spawn");
|
|
63
|
+
return { status: command === "clang" ? 0 : 1, stdout: "", stderr: "" };
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const toolchain = resolveToolchain(runner);
|
|
67
|
+
expect(toolchain.source).toBe("system");
|
|
68
|
+
expect(toolchain.clang).toBe("clang");
|
|
136
69
|
});
|
|
137
70
|
it("throws when no compiler can be found at all", () => {
|
|
138
71
|
delete process.env.xbintsc_CLANG;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolchain-provider.test.js","sourceRoot":"","sources":["../../../tests/driver/toolchain-provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"toolchain-provider.test.js","sourceRoot":"","sources":["../../../tests/driver/toolchain-provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end tests for core expressions, statements, functions and objects.
|
|
3
|
+
*/
|
|
4
|
+
import { expect, it } from "vitest";
|
|
5
|
+
import { describeE2E } from "./harness.js";
|
|
6
|
+
describeE2E("end-to-end basics", (harness) => {
|
|
7
|
+
const { runProgram } = harness;
|
|
8
|
+
it("evaluates arithmetic and prints results", () => {
|
|
9
|
+
expect(runProgram('console.log("sum", 2 + 3 * 4);')).toBe("sum 14");
|
|
10
|
+
});
|
|
11
|
+
it("interpolates template literals", () => {
|
|
12
|
+
const source = `
|
|
13
|
+
const name = "world";
|
|
14
|
+
console.log(\`Hello, \${name}!\`);
|
|
15
|
+
console.log(\`\${1 + 1}-\${2 + 2}\`, \`plain\`, "[" + \`\` + "]");
|
|
16
|
+
`;
|
|
17
|
+
expect(runProgram(source)).toBe("Hello, world!\n2-4 plain []");
|
|
18
|
+
});
|
|
19
|
+
it("runs recursive functions", () => {
|
|
20
|
+
const source = `
|
|
21
|
+
function fib(n: number): number {
|
|
22
|
+
if (n < 2) return n;
|
|
23
|
+
return fib(n - 1) + fib(n - 2);
|
|
24
|
+
}
|
|
25
|
+
console.log(fib(10));
|
|
26
|
+
`;
|
|
27
|
+
expect(runProgram(source)).toBe("55");
|
|
28
|
+
});
|
|
29
|
+
it("supports loops, arrays and string concatenation", () => {
|
|
30
|
+
const source = `
|
|
31
|
+
const numbers = [1, 2, 3, 4];
|
|
32
|
+
let total = 0;
|
|
33
|
+
for (const n of numbers) {
|
|
34
|
+
total += n;
|
|
35
|
+
}
|
|
36
|
+
console.log("total = " + total);
|
|
37
|
+
`;
|
|
38
|
+
expect(runProgram(source)).toBe("total = 10");
|
|
39
|
+
});
|
|
40
|
+
it("prints objects and arrays with JS-like formatting", () => {
|
|
41
|
+
const source = `
|
|
42
|
+
const user = { name: "ada", tags: ["math", "code"], age: 36 };
|
|
43
|
+
console.log(user);
|
|
44
|
+
`;
|
|
45
|
+
expect(runProgram(source)).toBe("{ name: 'ada', tags: [ 'math', 'code' ], age: 36 }");
|
|
46
|
+
});
|
|
47
|
+
it("orders object keys like JavaScript", () => {
|
|
48
|
+
const source = `
|
|
49
|
+
console.log(JSON.stringify({ b: 1, a: 2, 10: 3, 2: 4 }));
|
|
50
|
+
const o: any = {};
|
|
51
|
+
o.z = 1; o[5] = 2; o.a = 3; o[1] = 4; o["01"] = 5; o[100] = 6;
|
|
52
|
+
console.log(Object.keys(o).join(" "));
|
|
53
|
+
let seen = "";
|
|
54
|
+
for (const k in o) seen += k + ",";
|
|
55
|
+
console.log(seen);
|
|
56
|
+
console.log(JSON.stringify(Object.fromEntries([["b", 1], ["2", 2], ["a", 3]])));
|
|
57
|
+
`;
|
|
58
|
+
expect(runProgram(source)).toBe([
|
|
59
|
+
'{"2":4,"10":3,"b":1,"a":2}',
|
|
60
|
+
"1 5 100 z a 01",
|
|
61
|
+
"1,5,100,z,a,01,",
|
|
62
|
+
'{"2":2,"b":1,"a":3}',
|
|
63
|
+
].join("\n"));
|
|
64
|
+
});
|
|
65
|
+
it("supports switch statements with fall-through", () => {
|
|
66
|
+
const source = `
|
|
67
|
+
function size(n: number): string {
|
|
68
|
+
switch (n) {
|
|
69
|
+
case 0:
|
|
70
|
+
return "none";
|
|
71
|
+
case 1:
|
|
72
|
+
case 2:
|
|
73
|
+
return "few";
|
|
74
|
+
default:
|
|
75
|
+
return "many";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
console.log(size(0), size(1), size(2), size(7));
|
|
79
|
+
`;
|
|
80
|
+
expect(runProgram(source)).toBe("none few few many");
|
|
81
|
+
});
|
|
82
|
+
it("parses large integer literals without 32-bit clamping", () => {
|
|
83
|
+
// Regression: `parseInt` used to go through `strtol`, whose `long` is only
|
|
84
|
+
// 32 bits on Windows, so hex literals above INT32_MAX (used by the
|
|
85
|
+
// compiler's own `hashText`) were clamped to 2147483647.
|
|
86
|
+
const source = `
|
|
87
|
+
console.log(parseInt("cbf29ce4", 16), parseInt("80000000", 16), parseInt("100000000", 16));
|
|
88
|
+
console.log(parseInt("0xcbf29ce4"), parseInt("0x80000000"), parseInt("4503599627370496"));
|
|
89
|
+
console.log(parseInt("-42"), parseInt("0x10", 10), parseInt("42px"));
|
|
90
|
+
console.log(isNaN(parseInt("xyz")));
|
|
91
|
+
`;
|
|
92
|
+
expect(runProgram(source)).toBe("3421674724 2147483648 4294967296\n3421674724 2147483648 4503599627370496\n-42 0 42\ntrue");
|
|
93
|
+
});
|
|
94
|
+
it("supports default parameters, rest parameters and arguments", () => {
|
|
95
|
+
const source = `
|
|
96
|
+
function greet(name: string = "world", mark: string = "!"): string {
|
|
97
|
+
return "hi " + name + mark;
|
|
98
|
+
}
|
|
99
|
+
function total(...nums: number[]): number {
|
|
100
|
+
let sum = 0;
|
|
101
|
+
for (const n of nums) sum += n;
|
|
102
|
+
return sum;
|
|
103
|
+
}
|
|
104
|
+
function countArgs(): number {
|
|
105
|
+
return arguments.length;
|
|
106
|
+
}
|
|
107
|
+
console.log(greet(), greet("ada"), total(1, 2, 3), countArgs(1, 2, 3, 4));
|
|
108
|
+
`;
|
|
109
|
+
expect(runProgram(source)).toBe("hi world! hi ada! 6 4");
|
|
110
|
+
});
|
|
111
|
+
it("supports Object helpers, spread, in and delete", () => {
|
|
112
|
+
const source = `
|
|
113
|
+
const base = { a: 1, b: 2 };
|
|
114
|
+
const merged = Object.assign({}, base, { c: 3 });
|
|
115
|
+
const copy = { ...base, a: 9 };
|
|
116
|
+
console.log(Object.keys(base).join(","), Object.values(base).join(","));
|
|
117
|
+
console.log(Object.entries(base).map((e) => e[0] + "=" + e[1]).join(","));
|
|
118
|
+
console.log(merged.a, merged.b, merged.c, copy.a, "a" in base, "z" in base);
|
|
119
|
+
delete base.a;
|
|
120
|
+
console.log("a" in base, Object.keys(base).join(","));
|
|
121
|
+
`;
|
|
122
|
+
expect(runProgram(source)).toBe("a,b 1,2\na=1,b=2\n1 2 3 9 true false\nfalse b");
|
|
123
|
+
});
|
|
124
|
+
it("iterates object keys with for...in", () => {
|
|
125
|
+
const source = `
|
|
126
|
+
const obj = { x: 1, y: 2 };
|
|
127
|
+
let out = "";
|
|
128
|
+
for (const key in obj) out += key + "=" + obj[key] + ";";
|
|
129
|
+
console.log(out);
|
|
130
|
+
`;
|
|
131
|
+
expect(runProgram(source)).toBe("x=1;y=2;");
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=compile-basics.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-basics.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile-basics.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end tests for the built-in standard library (BigInt, collections, async, ...).
|
|
3
|
+
*/
|
|
4
|
+
import { expect, it } from "vitest";
|
|
5
|
+
import { describeE2E } from "./harness.js";
|
|
6
|
+
describeE2E("end-to-end built-in library", (harness) => {
|
|
7
|
+
const { runProgram, runProgramFull } = harness;
|
|
8
|
+
it("supports arbitrary-precision BigInt values", () => {
|
|
9
|
+
const source = `
|
|
10
|
+
const a = 123456789012345678901234567890n;
|
|
11
|
+
console.log(a * a);
|
|
12
|
+
console.log((2n ** 100n).toString(16));
|
|
13
|
+
console.log(-7n / 3n, -7n % 3n);
|
|
14
|
+
console.log(~5n, 1n << 130n);
|
|
15
|
+
console.log(typeof 1n, BigInt.asIntN(8, 0xFFn), BigInt.asUintN(8, 0xFFn));
|
|
16
|
+
console.log("x" + 5n, 2n < 3n, 2n === 2);
|
|
17
|
+
`;
|
|
18
|
+
expect(runProgram(source)).toBe([
|
|
19
|
+
"15241578753238836750495351562536198787501905199875019052100n",
|
|
20
|
+
"10000000000000000000000000",
|
|
21
|
+
"-2n -1n",
|
|
22
|
+
"-6n 1361129467683753853853498429727072845824n",
|
|
23
|
+
"bigint -1n 255n",
|
|
24
|
+
"x5 true false",
|
|
25
|
+
].join("\n"));
|
|
26
|
+
});
|
|
27
|
+
it("provides common array and string methods", () => {
|
|
28
|
+
const source = `
|
|
29
|
+
const xs = [3, 1, 2];
|
|
30
|
+
xs.push(4);
|
|
31
|
+
const doubled = xs.map((x) => x * 2).filter((x) => x > 4);
|
|
32
|
+
const total = xs.reduce((a, x) => a + x, 0);
|
|
33
|
+
console.log(xs.join("-"), doubled.join(","), total, xs.includes(2), xs.indexOf(1));
|
|
34
|
+
const s = " Hello World ";
|
|
35
|
+
console.log(s.trim().toUpperCase(), s.trim().slice(0, 5), "a,b,c".split(",").join("|"));
|
|
36
|
+
`;
|
|
37
|
+
expect(runProgram(source)).toBe("3-1-2-4 6,8 10 true 1\nHELLO WORLD Hello a|b|c");
|
|
38
|
+
});
|
|
39
|
+
it("supports Math, global functions and console levels", () => {
|
|
40
|
+
const source = `
|
|
41
|
+
console.log(Math.max(1, 9, 4), Math.abs(-3), Math.floor(2.9), Math.pow(2, 8), Math.PI > 3.14);
|
|
42
|
+
console.log(parseInt("42px"), parseFloat("2.5x"), isNaN(NaN), isFinite(1), Number("7"), String(9), Boolean(0));
|
|
43
|
+
console.warn("warned");
|
|
44
|
+
console.error("failed");
|
|
45
|
+
`;
|
|
46
|
+
const result = runProgramFull(source);
|
|
47
|
+
expect(result.status).toBe(0);
|
|
48
|
+
expect(result.stdout.trim()).toBe("9 3 2 256 true\n42 2.5 true true 7 9 false");
|
|
49
|
+
expect(result.stderr.trim()).toBe("warned\nfailed");
|
|
50
|
+
});
|
|
51
|
+
it("encodes and decodes URIs like the specification", () => {
|
|
52
|
+
const source = `
|
|
53
|
+
console.log(encodeURI("a/b?c=d&e#f"), encodeURIComponent("a/b?c=d&e#f"));
|
|
54
|
+
console.log(encodeURI("café"), encodeURIComponent("😀 中文"));
|
|
55
|
+
console.log(decodeURI("%2f%2F"), decodeURIComponent("a%23b"));
|
|
56
|
+
console.log(decodeURIComponent("%C3%A9"), decodeURIComponent("%F0%9F%98%80"));
|
|
57
|
+
console.log(typeof encodeURIComponent, typeof decodeURI);
|
|
58
|
+
try { decodeURIComponent("%E0%80%80"); } catch (e) { console.log(String(e)); }
|
|
59
|
+
`;
|
|
60
|
+
expect(runProgram(source)).toBe([
|
|
61
|
+
"a/b?c=d&e#f a%2Fb%3Fc%3Dd%26e%23f",
|
|
62
|
+
"caf%C3%A9 %F0%9F%98%80%20%E4%B8%AD%E6%96%87",
|
|
63
|
+
"%2f%2F a#b",
|
|
64
|
+
"é 😀",
|
|
65
|
+
"function function",
|
|
66
|
+
"URIError: URI malformed",
|
|
67
|
+
].join("\n"));
|
|
68
|
+
});
|
|
69
|
+
it("exposes RegExp capture groups in exec, match, replace and split", () => {
|
|
70
|
+
const source = `
|
|
71
|
+
const m = "12-34".match(/(\\d+)-(\\d+)/)!;
|
|
72
|
+
console.log(JSON.stringify([m[0], m[1], m[2], m.index]), Array.isArray(m), m.length);
|
|
73
|
+
console.log(JSON.stringify("a1b2c3".split(/(\\d)/)));
|
|
74
|
+
console.log(JSON.stringify("a1b2c3".split(/\\d/)));
|
|
75
|
+
console.log("2020-01-02".replace(/(\\d+)-(\\d+)-(\\d+)/, "$3/$2/$1"));
|
|
76
|
+
console.log("a1b2".replace(/(\\d)/g, "[$1]"));
|
|
77
|
+
console.log("a1b2".replace(/\\d/g, (x: string) => "<" + x + ">"));
|
|
78
|
+
console.log("a.b.c".search(/\\./));
|
|
79
|
+
console.log(JSON.stringify("abc".split(/(?:)/)));
|
|
80
|
+
`;
|
|
81
|
+
expect(runProgram(source)).toBe([
|
|
82
|
+
'["12-34","12","34",0] true 3',
|
|
83
|
+
'["a","1","b","2","c","3",""]',
|
|
84
|
+
'["a","b","c",""]',
|
|
85
|
+
"02/01/2020",
|
|
86
|
+
"a[1]b[2]",
|
|
87
|
+
"a<1>b<2>",
|
|
88
|
+
"1",
|
|
89
|
+
'["a","b","c"]',
|
|
90
|
+
].join("\n"));
|
|
91
|
+
});
|
|
92
|
+
it("supports the immutable array methods and Object statics", () => {
|
|
93
|
+
const source = `
|
|
94
|
+
const a = [3, 1, 2];
|
|
95
|
+
console.log(JSON.stringify(a.toSorted((x, y) => x - y)), JSON.stringify(a));
|
|
96
|
+
console.log(JSON.stringify(a.toReversed()), JSON.stringify(a));
|
|
97
|
+
console.log(JSON.stringify(a.toSpliced(1, 1, 9, 9)), JSON.stringify(a));
|
|
98
|
+
console.log(JSON.stringify(a.with(1, 9)), JSON.stringify(a.with(-1, 9)));
|
|
99
|
+
console.log(JSON.stringify(Object.getOwnPropertyNames({ b: 1, a: 2 })));
|
|
100
|
+
console.log(JSON.stringify(Object.getOwnPropertyNames([1, 2])));
|
|
101
|
+
console.log(JSON.stringify(Object.groupBy([1, 2, 3, 4], (n: number) => (n % 2 === 0 ? "even" : "odd"))));
|
|
102
|
+
`;
|
|
103
|
+
expect(runProgram(source)).toBe([
|
|
104
|
+
"[1,2,3] [3,1,2]",
|
|
105
|
+
"[2,1,3] [3,1,2]",
|
|
106
|
+
"[3,9,9,2] [3,1,2]",
|
|
107
|
+
"[3,9,2] [3,1,9]",
|
|
108
|
+
'["b","a"]',
|
|
109
|
+
'["0","1","length"]',
|
|
110
|
+
'{"odd":[1,3],"even":[2,4]}',
|
|
111
|
+
].join("\n"));
|
|
112
|
+
});
|
|
113
|
+
it("supports async/await and promises", () => {
|
|
114
|
+
const source = `
|
|
115
|
+
async function greet(name: string): Promise<string> {
|
|
116
|
+
return "hello " + name;
|
|
117
|
+
}
|
|
118
|
+
async function main(): Promise<void> {
|
|
119
|
+
const message = await greet("world");
|
|
120
|
+
console.log(message);
|
|
121
|
+
const all = await Promise.all([Promise.resolve(1), Promise.resolve(2)]);
|
|
122
|
+
console.log(all[0] + all[1]);
|
|
123
|
+
const settled = await Promise.allSettled([Promise.resolve(1), Promise.reject("no")]);
|
|
124
|
+
console.log(settled[0].status, settled[1].status);
|
|
125
|
+
try {
|
|
126
|
+
await Promise.reject("boom");
|
|
127
|
+
} catch (err) {
|
|
128
|
+
console.log("caught", err);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
main();
|
|
132
|
+
Promise.resolve(10).then((x) => console.log("then", x + 1));
|
|
133
|
+
`;
|
|
134
|
+
expect(runProgram(source)).toBe("hello world\n3\nfulfilled rejected\ncaught boom\nthen 11");
|
|
135
|
+
});
|
|
136
|
+
it("supports Map, Set, JSON and extended standard library methods", () => {
|
|
137
|
+
const source = `
|
|
138
|
+
const map = new Map<string, number>();
|
|
139
|
+
map.set("a", 1);
|
|
140
|
+
map.set("b", 2);
|
|
141
|
+
const nums = new Set<number>();
|
|
142
|
+
nums.add(3);
|
|
143
|
+
nums.add(3);
|
|
144
|
+
console.log(map.get("a"), map.size, nums.has(3), nums.size);
|
|
145
|
+
const obj = { x: 1, y: [2, 3] };
|
|
146
|
+
console.log(JSON.stringify(obj));
|
|
147
|
+
console.log(JSON.parse('{"k":5}').k);
|
|
148
|
+
console.log([3, 1, 2].sort().join(","), [1, 2, 3].find((n) => n > 1));
|
|
149
|
+
console.log("abc".padStart(5, "*"), (255).toString(16), (3.14159).toFixed(2));
|
|
150
|
+
console.log(Number.isInteger(3), Array.isArray([1]), Math.imul(2, 3));
|
|
151
|
+
`;
|
|
152
|
+
expect(runProgram(source)).toBe("1 2 true 1\n{\"x\":1,\"y\":[2,3]}\n5\n1,2,3 2\n**abc ff 3.14\ntrue true 6");
|
|
153
|
+
});
|
|
154
|
+
it("assigns array.length and spreads iterables (Map/Set/string)", () => {
|
|
155
|
+
const source = `
|
|
156
|
+
const a = [10, 20, 30];
|
|
157
|
+
a.length = 1;
|
|
158
|
+
console.log(a.length, a[0], a[1]);
|
|
159
|
+
a.length = 3;
|
|
160
|
+
console.log(a.length, a[1], a[2]);
|
|
161
|
+
const set = new Set<string>();
|
|
162
|
+
set.add("x");
|
|
163
|
+
set.add("y");
|
|
164
|
+
set.add("x");
|
|
165
|
+
console.log([...set].length, [...set].join(","), ["a", ...set, "b"].join(","));
|
|
166
|
+
const map = new Map<string, number>();
|
|
167
|
+
map.set("k", 1);
|
|
168
|
+
map.set("v", 2);
|
|
169
|
+
console.log([...map].length, [...map].map((p) => p[0] + ":" + p[1]).join(","));
|
|
170
|
+
console.log([..."abc"].length, [..."abc"].join("-"));
|
|
171
|
+
`;
|
|
172
|
+
expect(runProgram(source)).toBe("1 10 undefined\n3 undefined undefined\n2 x,y a,x,y,b\n2 k:1,v:2\n3 a-b-c");
|
|
173
|
+
});
|
|
174
|
+
it("iterates Map and Set with for...of", () => {
|
|
175
|
+
const source = `
|
|
176
|
+
const map = new Map<string, number>();
|
|
177
|
+
map.set("a", 1);
|
|
178
|
+
map.set("b", 2);
|
|
179
|
+
let out = "";
|
|
180
|
+
for (const [k, v] of map) out += k + "=" + v + ";";
|
|
181
|
+
const set = new Set<number>();
|
|
182
|
+
set.add(10);
|
|
183
|
+
set.add(20);
|
|
184
|
+
let sum = 0;
|
|
185
|
+
for (const n of set) sum += n;
|
|
186
|
+
console.log(out, sum);
|
|
187
|
+
`;
|
|
188
|
+
expect(runProgram(source)).toBe("a=1;b=2; 30");
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=compile-builtins.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-builtins.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile-builtins.test.ts"],"names":[],"mappings":"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"}
|