redscript-mc 1.2.29 → 2.0.0

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 (274) hide show
  1. package/.claude/commands/build-test.md +10 -0
  2. package/.claude/commands/deploy-demo.md +12 -0
  3. package/.claude/commands/stage-status.md +13 -0
  4. package/.claude/settings.json +12 -0
  5. package/.github/workflows/ci.yml +1 -0
  6. package/CLAUDE.md +231 -0
  7. package/README.md +29 -28
  8. package/README.zh.md +28 -28
  9. package/demo.gif +0 -0
  10. package/dist/cli.js +2 -554
  11. package/dist/compile.js +2 -266
  12. package/dist/index.js +2 -159
  13. package/dist/lexer/index.js +9 -1
  14. package/dist/lowering/index.js +22 -5
  15. package/dist/src/__tests__/cli.test.d.ts +1 -0
  16. package/dist/src/__tests__/cli.test.js +104 -0
  17. package/dist/src/__tests__/codegen.test.d.ts +1 -0
  18. package/dist/src/__tests__/codegen.test.js +152 -0
  19. package/dist/src/__tests__/compile-all.test.d.ts +10 -0
  20. package/dist/src/__tests__/compile-all.test.js +108 -0
  21. package/dist/src/__tests__/dce.test.d.ts +1 -0
  22. package/dist/src/__tests__/dce.test.js +102 -0
  23. package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
  24. package/dist/src/__tests__/diagnostics.test.js +177 -0
  25. package/dist/src/__tests__/e2e.test.d.ts +6 -0
  26. package/dist/src/__tests__/e2e.test.js +1789 -0
  27. package/dist/src/__tests__/entity-types.test.d.ts +1 -0
  28. package/dist/src/__tests__/entity-types.test.js +203 -0
  29. package/dist/src/__tests__/formatter.test.d.ts +1 -0
  30. package/dist/src/__tests__/formatter.test.js +40 -0
  31. package/dist/src/__tests__/lexer.test.d.ts +1 -0
  32. package/dist/src/__tests__/lexer.test.js +343 -0
  33. package/dist/src/__tests__/lowering.test.d.ts +1 -0
  34. package/dist/src/__tests__/lowering.test.js +1015 -0
  35. package/dist/src/__tests__/macro.test.d.ts +8 -0
  36. package/dist/src/__tests__/macro.test.js +306 -0
  37. package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
  38. package/dist/src/__tests__/mc-integration.test.js +817 -0
  39. package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
  40. package/dist/src/__tests__/mc-syntax.test.js +124 -0
  41. package/dist/src/__tests__/nbt.test.d.ts +1 -0
  42. package/dist/src/__tests__/nbt.test.js +82 -0
  43. package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
  44. package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
  45. package/dist/src/__tests__/optimizer.test.d.ts +1 -0
  46. package/dist/src/__tests__/optimizer.test.js +149 -0
  47. package/dist/src/__tests__/parser.test.d.ts +1 -0
  48. package/dist/src/__tests__/parser.test.js +807 -0
  49. package/dist/src/__tests__/repl.test.d.ts +1 -0
  50. package/dist/src/__tests__/repl.test.js +27 -0
  51. package/dist/src/__tests__/runtime.test.d.ts +1 -0
  52. package/dist/src/__tests__/runtime.test.js +289 -0
  53. package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
  54. package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
  55. package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
  56. package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
  57. package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
  58. package/dist/src/__tests__/stdlib-math.test.js +351 -0
  59. package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
  60. package/dist/src/__tests__/stdlib-vec.test.js +263 -0
  61. package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
  62. package/dist/src/__tests__/structure-optimizer.test.js +33 -0
  63. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  64. package/dist/src/__tests__/typechecker.test.js +552 -0
  65. package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
  66. package/dist/src/__tests__/var-allocator.test.js +69 -0
  67. package/dist/src/ast/types.d.ts +515 -0
  68. package/dist/src/ast/types.js +9 -0
  69. package/dist/src/builtins/metadata.d.ts +36 -0
  70. package/dist/src/builtins/metadata.js +1014 -0
  71. package/dist/src/cli.d.ts +11 -0
  72. package/dist/src/cli.js +443 -0
  73. package/dist/src/codegen/cmdblock/index.d.ts +26 -0
  74. package/dist/src/codegen/cmdblock/index.js +45 -0
  75. package/dist/src/codegen/mcfunction/index.d.ts +40 -0
  76. package/dist/src/codegen/mcfunction/index.js +606 -0
  77. package/dist/src/codegen/structure/index.d.ts +24 -0
  78. package/dist/src/codegen/structure/index.js +279 -0
  79. package/dist/src/codegen/var-allocator.d.ts +45 -0
  80. package/dist/src/codegen/var-allocator.js +104 -0
  81. package/dist/src/compile.d.ts +37 -0
  82. package/dist/src/compile.js +165 -0
  83. package/dist/src/diagnostics/index.d.ts +44 -0
  84. package/dist/src/diagnostics/index.js +140 -0
  85. package/dist/src/events/types.d.ts +35 -0
  86. package/dist/src/events/types.js +59 -0
  87. package/dist/src/formatter/index.d.ts +1 -0
  88. package/dist/src/formatter/index.js +26 -0
  89. package/dist/src/index.d.ts +22 -0
  90. package/dist/src/index.js +45 -0
  91. package/dist/src/ir/builder.d.ts +33 -0
  92. package/dist/src/ir/builder.js +99 -0
  93. package/dist/src/ir/types.d.ts +132 -0
  94. package/dist/src/ir/types.js +15 -0
  95. package/dist/src/lexer/index.d.ts +37 -0
  96. package/dist/src/lexer/index.js +569 -0
  97. package/dist/src/lowering/index.d.ts +188 -0
  98. package/dist/src/lowering/index.js +3405 -0
  99. package/dist/src/mc-test/client.d.ts +128 -0
  100. package/dist/src/mc-test/client.js +174 -0
  101. package/dist/src/mc-test/runner.d.ts +28 -0
  102. package/dist/src/mc-test/runner.js +151 -0
  103. package/dist/src/mc-test/setup.d.ts +11 -0
  104. package/dist/src/mc-test/setup.js +98 -0
  105. package/dist/src/mc-validator/index.d.ts +17 -0
  106. package/dist/src/mc-validator/index.js +322 -0
  107. package/dist/src/nbt/index.d.ts +86 -0
  108. package/dist/src/nbt/index.js +250 -0
  109. package/dist/src/optimizer/commands.d.ts +38 -0
  110. package/dist/src/optimizer/commands.js +451 -0
  111. package/dist/src/optimizer/dce.d.ts +34 -0
  112. package/dist/src/optimizer/dce.js +639 -0
  113. package/dist/src/optimizer/passes.d.ts +34 -0
  114. package/dist/src/optimizer/passes.js +243 -0
  115. package/dist/src/optimizer/structure.d.ts +9 -0
  116. package/dist/src/optimizer/structure.js +356 -0
  117. package/dist/src/parser/index.d.ts +93 -0
  118. package/dist/src/parser/index.js +1687 -0
  119. package/dist/src/repl.d.ts +16 -0
  120. package/dist/src/repl.js +165 -0
  121. package/dist/src/runtime/index.d.ts +107 -0
  122. package/dist/src/runtime/index.js +1409 -0
  123. package/dist/src/typechecker/index.d.ts +61 -0
  124. package/dist/src/typechecker/index.js +1034 -0
  125. package/dist/src/types/entity-hierarchy.d.ts +29 -0
  126. package/dist/src/types/entity-hierarchy.js +107 -0
  127. package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
  128. package/dist/src2/__tests__/e2e/basic.test.js +140 -0
  129. package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
  130. package/dist/src2/__tests__/e2e/macros.test.js +182 -0
  131. package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
  132. package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
  133. package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
  134. package/dist/src2/__tests__/hir/desugar.test.js +234 -0
  135. package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
  136. package/dist/src2/__tests__/lir/lower.test.js +559 -0
  137. package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
  138. package/dist/src2/__tests__/lir/types.test.js +185 -0
  139. package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
  140. package/dist/src2/__tests__/lir/verify.test.js +221 -0
  141. package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
  142. package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
  143. package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
  144. package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
  145. package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
  146. package/dist/src2/__tests__/mir/verify.test.js +223 -0
  147. package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
  148. package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
  149. package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
  150. package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
  151. package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
  152. package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
  153. package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
  154. package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
  155. package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
  156. package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
  157. package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
  158. package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
  159. package/dist/src2/emit/compile.d.ts +19 -0
  160. package/dist/src2/emit/compile.js +80 -0
  161. package/dist/src2/emit/index.d.ts +17 -0
  162. package/dist/src2/emit/index.js +172 -0
  163. package/dist/src2/hir/lower.d.ts +15 -0
  164. package/dist/src2/hir/lower.js +378 -0
  165. package/dist/src2/hir/types.d.ts +373 -0
  166. package/dist/src2/hir/types.js +16 -0
  167. package/dist/src2/lir/lower.d.ts +15 -0
  168. package/dist/src2/lir/lower.js +453 -0
  169. package/dist/src2/lir/types.d.ts +136 -0
  170. package/dist/src2/lir/types.js +11 -0
  171. package/dist/src2/lir/verify.d.ts +14 -0
  172. package/dist/src2/lir/verify.js +113 -0
  173. package/dist/src2/mir/lower.d.ts +9 -0
  174. package/dist/src2/mir/lower.js +1030 -0
  175. package/dist/src2/mir/macro.d.ts +22 -0
  176. package/dist/src2/mir/macro.js +168 -0
  177. package/dist/src2/mir/types.d.ts +183 -0
  178. package/dist/src2/mir/types.js +11 -0
  179. package/dist/src2/mir/verify.d.ts +16 -0
  180. package/dist/src2/mir/verify.js +216 -0
  181. package/dist/src2/optimizer/block_merge.d.ts +12 -0
  182. package/dist/src2/optimizer/block_merge.js +84 -0
  183. package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
  184. package/dist/src2/optimizer/branch_simplify.js +28 -0
  185. package/dist/src2/optimizer/constant_fold.d.ts +10 -0
  186. package/dist/src2/optimizer/constant_fold.js +85 -0
  187. package/dist/src2/optimizer/copy_prop.d.ts +9 -0
  188. package/dist/src2/optimizer/copy_prop.js +113 -0
  189. package/dist/src2/optimizer/dce.d.ts +8 -0
  190. package/dist/src2/optimizer/dce.js +155 -0
  191. package/dist/src2/optimizer/pipeline.d.ts +10 -0
  192. package/dist/src2/optimizer/pipeline.js +42 -0
  193. package/dist/tsconfig.tsbuildinfo +1 -0
  194. package/docs/compiler-pipeline-redesign.md +2243 -0
  195. package/docs/optimization-ideas.md +1076 -0
  196. package/editors/vscode/package-lock.json +3 -3
  197. package/editors/vscode/package.json +1 -1
  198. package/examples/readme-demo.mcrs +44 -66
  199. package/jest.config.js +1 -1
  200. package/package.json +6 -5
  201. package/scripts/postbuild.js +15 -0
  202. package/src/__tests__/cli.test.ts +8 -220
  203. package/src/__tests__/dce.test.ts +11 -56
  204. package/src/__tests__/diagnostics.test.ts +59 -38
  205. package/src/__tests__/mc-integration.test.ts +1 -2
  206. package/src/ast/types.ts +6 -1
  207. package/src/cli.ts +29 -156
  208. package/src/compile.ts +6 -162
  209. package/src/index.ts +14 -178
  210. package/src/lexer/index.ts +9 -1
  211. package/src/mc-test/runner.ts +4 -3
  212. package/src/parser/index.ts +1 -1
  213. package/src/repl.ts +1 -1
  214. package/src/runtime/index.ts +1 -1
  215. package/src2/__tests__/e2e/basic.test.ts +154 -0
  216. package/src2/__tests__/e2e/macros.test.ts +199 -0
  217. package/src2/__tests__/e2e/migrate.test.ts +3008 -0
  218. package/src2/__tests__/hir/desugar.test.ts +263 -0
  219. package/src2/__tests__/lir/lower.test.ts +619 -0
  220. package/src2/__tests__/lir/types.test.ts +207 -0
  221. package/src2/__tests__/lir/verify.test.ts +249 -0
  222. package/src2/__tests__/mir/arithmetic.test.ts +156 -0
  223. package/src2/__tests__/mir/control-flow.test.ts +242 -0
  224. package/src2/__tests__/mir/verify.test.ts +254 -0
  225. package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
  226. package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
  227. package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
  228. package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
  229. package/src2/__tests__/optimizer/dce.test.ts +83 -0
  230. package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
  231. package/src2/emit/compile.ts +99 -0
  232. package/src2/emit/index.ts +222 -0
  233. package/src2/hir/lower.ts +428 -0
  234. package/src2/hir/types.ts +216 -0
  235. package/src2/lir/lower.ts +556 -0
  236. package/src2/lir/types.ts +109 -0
  237. package/src2/lir/verify.ts +129 -0
  238. package/src2/mir/lower.ts +1160 -0
  239. package/src2/mir/macro.ts +167 -0
  240. package/src2/mir/types.ts +106 -0
  241. package/src2/mir/verify.ts +218 -0
  242. package/src2/optimizer/block_merge.ts +93 -0
  243. package/src2/optimizer/branch_simplify.ts +27 -0
  244. package/src2/optimizer/constant_fold.ts +88 -0
  245. package/src2/optimizer/copy_prop.ts +106 -0
  246. package/src2/optimizer/dce.ts +133 -0
  247. package/src2/optimizer/pipeline.ts +44 -0
  248. package/tsconfig.json +2 -2
  249. package/src/__tests__/codegen.test.ts +0 -161
  250. package/src/__tests__/e2e.test.ts +0 -2039
  251. package/src/__tests__/entity-types.test.ts +0 -236
  252. package/src/__tests__/lowering.test.ts +0 -1185
  253. package/src/__tests__/macro.test.ts +0 -343
  254. package/src/__tests__/nbt.test.ts +0 -58
  255. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  256. package/src/__tests__/optimizer.test.ts +0 -162
  257. package/src/__tests__/runtime.test.ts +0 -305
  258. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  259. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  260. package/src/__tests__/stdlib-math.test.ts +0 -374
  261. package/src/__tests__/stdlib-vec.test.ts +0 -259
  262. package/src/__tests__/structure-optimizer.test.ts +0 -38
  263. package/src/__tests__/var-allocator.test.ts +0 -75
  264. package/src/codegen/cmdblock/index.ts +0 -63
  265. package/src/codegen/mcfunction/index.ts +0 -662
  266. package/src/codegen/structure/index.ts +0 -346
  267. package/src/codegen/var-allocator.ts +0 -104
  268. package/src/ir/builder.ts +0 -116
  269. package/src/ir/types.ts +0 -134
  270. package/src/lowering/index.ts +0 -3860
  271. package/src/optimizer/commands.ts +0 -534
  272. package/src/optimizer/dce.ts +0 -679
  273. package/src/optimizer/passes.ts +0 -250
  274. package/src/optimizer/structure.ts +0 -450
@@ -0,0 +1,426 @@
1
+ "use strict";
2
+ /**
3
+ * stdlib/bigint.mcrs — runtime behavioural tests
4
+ *
5
+ * Tests basic BigInt operations (base 10000, 8 limbs = 32 decimal digits).
6
+ * All arithmetic validated against known values.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const compile_1 = require("../compile");
45
+ const runtime_1 = require("../runtime");
46
+ const MATH_SRC = fs.readFileSync(path.join(__dirname, '../../src/stdlib/math.mcrs'), 'utf-8');
47
+ const BIGINT_SRC = fs.readFileSync(path.join(__dirname, '../../src/stdlib/bigint.mcrs'), 'utf-8');
48
+ function run(driver) {
49
+ const result = (0, compile_1.compile)(driver, {
50
+ namespace: 'bitest',
51
+ librarySources: [MATH_SRC, BIGINT_SRC],
52
+ });
53
+ const rt = new runtime_1.MCRuntime('bitest');
54
+ for (const file of result.files) {
55
+ if (!file.path.endsWith('.mcfunction'))
56
+ continue;
57
+ const match = file.path.match(/data\/([^/]+)\/function\/(.+)\.mcfunction$/);
58
+ if (!match)
59
+ continue;
60
+ rt.loadFunction(`${match[1]}:${match[2]}`, file.content.split('\n'));
61
+ }
62
+ rt.load();
63
+ return rt;
64
+ }
65
+ function sc(rt, key) {
66
+ return rt.getScore('out', `bitest.${key}`) ?? 0;
67
+ }
68
+ // ── storage_set_int roundtrip ─────────────────────────────────────────────────
69
+ describe('storage_set_int roundtrip', () => {
70
+ it('static index: write 99 to arr[2], read back', () => {
71
+ const rt = run(`fn test() {
72
+ storage_set_array("rs:t", "arr", "[10,20,30,40]");
73
+ storage_set_int("rs:t", "arr", 2, 99);
74
+ scoreboard_set("out", "r", storage_get_int("rs:t", "arr", 2));
75
+ }`);
76
+ rt.execFunction('test');
77
+ expect(sc(rt, 'r')).toBe(99);
78
+ });
79
+ it('runtime index: write 777 to arr[idx], read back', () => {
80
+ const rt = run(`fn test() {
81
+ storage_set_array("rs:t", "arr", "[1,2,3,4,5]");
82
+ let idx: int = 3;
83
+ storage_set_int("rs:t", "arr", idx, 777);
84
+ scoreboard_set("out", "r", storage_get_int("rs:t", "arr", idx));
85
+ }`);
86
+ rt.execFunction('test');
87
+ expect(sc(rt, 'r')).toBe(777);
88
+ });
89
+ it('loop write: fill arr[0..3] with 10,20,30,40', () => {
90
+ const rt = run(`fn test() {
91
+ storage_set_array("rs:t", "arr", "[0,0,0,0]");
92
+ let i: int = 0;
93
+ while (i < 4) {
94
+ storage_set_int("rs:t", "arr", i, (i + 1) * 10);
95
+ i = i + 1;
96
+ }
97
+ scoreboard_set("out", "a", storage_get_int("rs:t", "arr", 0));
98
+ scoreboard_set("out", "b", storage_get_int("rs:t", "arr", 1));
99
+ scoreboard_set("out", "c", storage_get_int("rs:t", "arr", 2));
100
+ scoreboard_set("out", "d", storage_get_int("rs:t", "arr", 3));
101
+ }`);
102
+ rt.execFunction('test');
103
+ expect(sc(rt, 'a')).toBe(10);
104
+ expect(sc(rt, 'b')).toBe(20);
105
+ expect(sc(rt, 'c')).toBe(30);
106
+ expect(sc(rt, 'd')).toBe(40);
107
+ });
108
+ });
109
+ // ── bigint_init + from_int ────────────────────────────────────────────────────
110
+ describe('bigint init and load', () => {
111
+ it('bigint_init zeros registers', () => {
112
+ const rt = run(`fn test() {
113
+ bigint_init();
114
+ scoreboard_set("out", "r", bigint_get_a(0));
115
+ }`);
116
+ rt.execFunction('test');
117
+ expect(sc(rt, 'r')).toBe(0);
118
+ });
119
+ it('bigint_from_int_a(12345678): limb0=5678, limb1=1234', () => {
120
+ const rt = run(`fn test() {
121
+ bigint_init();
122
+ bigint_from_int_a(12345678);
123
+ scoreboard_set("out", "l0", bigint_get_a(0));
124
+ scoreboard_set("out", "l1", bigint_get_a(1));
125
+ scoreboard_set("out", "l2", bigint_get_a(2));
126
+ }`);
127
+ rt.execFunction('test');
128
+ expect(sc(rt, 'l0')).toBe(5678);
129
+ expect(sc(rt, 'l1')).toBe(1234);
130
+ expect(sc(rt, 'l2')).toBe(0);
131
+ });
132
+ it('bigint_from_int_a(2000000000): limb0=0, limb1=0, limb2=20', () => {
133
+ // 2000000000 = 20 × 10000^2 (not 2000: 20 × 10^8 = 2×10^9 ✓)
134
+ const rt = run(`fn test() {
135
+ bigint_init();
136
+ bigint_from_int_a(2000000000);
137
+ scoreboard_set("out", "l0", bigint_get_a(0));
138
+ scoreboard_set("out", "l1", bigint_get_a(1));
139
+ scoreboard_set("out", "l2", bigint_get_a(2));
140
+ }`);
141
+ rt.execFunction('test');
142
+ expect(sc(rt, 'l0')).toBe(0);
143
+ expect(sc(rt, 'l1')).toBe(0);
144
+ expect(sc(rt, 'l2')).toBe(20);
145
+ });
146
+ });
147
+ // ── bigint_add ────────────────────────────────────────────────────────────────
148
+ describe('bigint_add', () => {
149
+ it('1 + 1 = 2 (simple)', () => {
150
+ const rt = run(`fn test() {
151
+ bigint_init();
152
+ bigint_from_int_a(1);
153
+ bigint_from_int_b(1);
154
+ bigint_add();
155
+ scoreboard_set("out", "r", bigint_get_c(0));
156
+ }`);
157
+ rt.execFunction('test');
158
+ expect(sc(rt, 'r')).toBe(2);
159
+ });
160
+ it('9999 + 1 = 10000: carry across limb boundary', () => {
161
+ // a=[9999,0,...] + b=[1,0,...] = c=[0,1,0,...] (carry to limb1)
162
+ const rt = run(`fn test() {
163
+ bigint_init();
164
+ bigint_from_int_a(9999);
165
+ bigint_from_int_b(1);
166
+ bigint_add();
167
+ scoreboard_set("out", "l0", bigint_get_c(0));
168
+ scoreboard_set("out", "l1", bigint_get_c(1));
169
+ }`);
170
+ rt.execFunction('test');
171
+ expect(sc(rt, 'l0')).toBe(0);
172
+ expect(sc(rt, 'l1')).toBe(1);
173
+ });
174
+ it('99990000 + 10000 = 100000000: multi-limb carry', () => {
175
+ // a=[0,9999,...] + b=[0,1,...] = c=[0,0,1,...] (carry to limb2)
176
+ const rt = run(`fn test() {
177
+ bigint_init();
178
+ bigint_from_int_a(99990000);
179
+ bigint_from_int_b(10000);
180
+ bigint_add();
181
+ scoreboard_set("out", "l0", bigint_get_c(0));
182
+ scoreboard_set("out", "l1", bigint_get_c(1));
183
+ scoreboard_set("out", "l2", bigint_get_c(2));
184
+ }`);
185
+ rt.execFunction('test');
186
+ expect(sc(rt, 'l0')).toBe(0);
187
+ expect(sc(rt, 'l1')).toBe(0);
188
+ expect(sc(rt, 'l2')).toBe(1);
189
+ });
190
+ it('large add: 999999999 + 999999999', () => {
191
+ // 999999999 = [9999, 9999, 9, 0, ...]
192
+ // + same = [9998, 9999, 18, 0, ...] after carry
193
+ // = 1999999998: l0=9998, l1=9999, l2=19 (carry: 9+9=18, no carry from l2)
194
+ // Wait: l0=9999+9999=19998, carry=1, l0=9998
195
+ // l1=9999+9999+1=19999, carry=1, l1=9999
196
+ // l2=9+9+1=19, carry=0, l2=19
197
+ const rt = run(`fn test() {
198
+ bigint_init();
199
+ bigint_from_int_a(999999999);
200
+ bigint_from_int_b(999999999);
201
+ bigint_add();
202
+ scoreboard_set("out", "l0", bigint_get_c(0));
203
+ scoreboard_set("out", "l1", bigint_get_c(1));
204
+ scoreboard_set("out", "l2", bigint_get_c(2));
205
+ }`);
206
+ rt.execFunction('test');
207
+ expect(sc(rt, 'l0')).toBe(9998); // 1999999998 % 10000 = 9998
208
+ expect(sc(rt, 'l1')).toBe(9999); // floor(1999999998 / 10000) % 10000 = 9999
209
+ expect(sc(rt, 'l2')).toBe(19); // floor(1999999998 / 100000000) = 19
210
+ });
211
+ });
212
+ // ── bigint_sub ────────────────────────────────────────────────────────────────
213
+ describe('bigint_sub', () => {
214
+ it('10 - 3 = 7', () => {
215
+ const rt = run(`fn test() {
216
+ bigint_init();
217
+ bigint_from_int_a(10);
218
+ bigint_from_int_b(3);
219
+ bigint_sub();
220
+ scoreboard_set("out", "r", bigint_get_c(0));
221
+ }`);
222
+ rt.execFunction('test');
223
+ expect(sc(rt, 'r')).toBe(7);
224
+ });
225
+ it('10000 - 1 = 9999: borrow across limb boundary', () => {
226
+ // a=[0,1,...] - b=[1,0,...] = c=[9999,0,...] (borrow from limb1)
227
+ const rt = run(`fn test() {
228
+ bigint_init();
229
+ bigint_from_int_a(10000);
230
+ bigint_from_int_b(1);
231
+ bigint_sub();
232
+ scoreboard_set("out", "l0", bigint_get_c(0));
233
+ scoreboard_set("out", "l1", bigint_get_c(1));
234
+ }`);
235
+ rt.execFunction('test');
236
+ expect(sc(rt, 'l0')).toBe(9999);
237
+ expect(sc(rt, 'l1')).toBe(0);
238
+ });
239
+ });
240
+ // ── bigint_compare ────────────────────────────────────────────────────────────
241
+ describe('bigint_compare', () => {
242
+ it('1 == 1 → 0', () => {
243
+ const rt = run(`fn test() {
244
+ bigint_init();
245
+ bigint_from_int_a(1);
246
+ bigint_from_int_b(1);
247
+ scoreboard_set("out", "r", bigint_compare());
248
+ }`);
249
+ rt.execFunction('test');
250
+ expect(sc(rt, 'r')).toBe(0);
251
+ });
252
+ it('2 > 1 → 1', () => {
253
+ const rt = run(`fn test() {
254
+ bigint_init();
255
+ bigint_from_int_a(2);
256
+ bigint_from_int_b(1);
257
+ scoreboard_set("out", "r", bigint_compare());
258
+ }`);
259
+ rt.execFunction('test');
260
+ expect(sc(rt, 'r')).toBe(1);
261
+ });
262
+ it('1 < 2 → -1', () => {
263
+ const rt = run(`fn test() {
264
+ bigint_init();
265
+ bigint_from_int_a(1);
266
+ bigint_from_int_b(2);
267
+ scoreboard_set("out", "r", bigint_compare());
268
+ }`);
269
+ rt.execFunction('test');
270
+ expect(sc(rt, 'r')).toBe(-1);
271
+ });
272
+ });
273
+ // ── bigint_mul_small ──────────────────────────────────────────────────────────
274
+ describe('bigint_mul_small', () => {
275
+ it('12345 * 2 = 24690', () => {
276
+ const rt = run(`fn test() {
277
+ bigint_init();
278
+ bigint_from_int_a(12345);
279
+ bigint_mul_small(2);
280
+ scoreboard_set("out", "l0", bigint_get_c(0));
281
+ scoreboard_set("out", "l1", bigint_get_c(1));
282
+ }`);
283
+ rt.execFunction('test');
284
+ expect(sc(rt, 'l0')).toBe(4690);
285
+ expect(sc(rt, 'l1')).toBe(2);
286
+ });
287
+ it('9999 * 9999 = 99980001: carry', () => {
288
+ // c[0] = 99980001 % 10000 = 1
289
+ // c[1] = floor(99980001 / 10000) = 9998
290
+ const rt = run(`fn test() {
291
+ bigint_init();
292
+ bigint_from_int_a(9999);
293
+ bigint_mul_small(9999);
294
+ scoreboard_set("out", "l0", bigint_get_c(0));
295
+ scoreboard_set("out", "l1", bigint_get_c(1));
296
+ }`);
297
+ rt.execFunction('test');
298
+ expect(sc(rt, 'l0')).toBe(1); // 99980001 % 10000 = 1 (actually 0001)
299
+ expect(sc(rt, 'l1')).toBe(9998); // 9998
300
+ });
301
+ });
302
+ // ── bigint_mul ────────────────────────────────────────────────────────────────
303
+ describe('bigint_mul', () => {
304
+ it('3 * 4 = 12', () => {
305
+ const rt = run(`fn test() {
306
+ bigint_init();
307
+ bigint_from_int_a(3);
308
+ bigint_from_int_b(4);
309
+ bigint_mul();
310
+ scoreboard_set("out", "r", bigint_get_c(0));
311
+ }`);
312
+ rt.execFunction('test');
313
+ expect(sc(rt, 'r')).toBe(12);
314
+ });
315
+ it('9999 * 9999 = 99980001', () => {
316
+ const rt = run(`fn test() {
317
+ bigint_init();
318
+ bigint_from_int_a(9999);
319
+ bigint_from_int_b(9999);
320
+ bigint_mul();
321
+ scoreboard_set("out", "l0", bigint_get_c(0));
322
+ scoreboard_set("out", "l1", bigint_get_c(1));
323
+ }`);
324
+ rt.execFunction('test');
325
+ expect(sc(rt, 'l0')).toBe(1);
326
+ expect(sc(rt, 'l1')).toBe(9998);
327
+ });
328
+ it('100000 * 100000 = 10^10: spans 3 limbs', () => {
329
+ // 10^10 = [0, 0, 0, 1, 0, ...] in base 10000 (1 * 10000^3 = 10^12? no)
330
+ // 10^10 / 10000^0 % 10000 = 0
331
+ // 10^10 / 10000^1 % 10000 = 0
332
+ // 10^10 / 10000^2 % 10000 = 10000 → wait: 10^10 / 10^8 = 100, 100 % 10000 = 100
333
+ // Actually: 10^10 = 100 * 10^8 = 100 * (10^4)^2
334
+ // l0 = 10^10 % 10^4 = 0
335
+ // l1 = floor(10^10 / 10^4) % 10^4 = floor(10^6) % 10000 = 0
336
+ // l2 = floor(10^10 / 10^8) % 10^4 = 100 % 10000 = 100
337
+ const rt = run(`fn test() {
338
+ bigint_init();
339
+ bigint_from_int_a(100000);
340
+ bigint_from_int_b(100000);
341
+ bigint_mul();
342
+ scoreboard_set("out", "l0", bigint_get_c(0));
343
+ scoreboard_set("out", "l1", bigint_get_c(1));
344
+ scoreboard_set("out", "l2", bigint_get_c(2));
345
+ }`);
346
+ rt.execFunction('test');
347
+ expect(sc(rt, 'l0')).toBe(0);
348
+ expect(sc(rt, 'l1')).toBe(0);
349
+ expect(sc(rt, 'l2')).toBe(100);
350
+ });
351
+ });
352
+ // ── bigint_fib ────────────────────────────────────────────────────────────────
353
+ describe('bigint_fib', () => {
354
+ it('F(0) = 0', () => {
355
+ const rt = run(`fn test() {
356
+ bigint_fib(0);
357
+ scoreboard_set("out", "r", bigint_get_a(0));
358
+ }`);
359
+ rt.execFunction('test');
360
+ expect(sc(rt, 'r')).toBe(0);
361
+ });
362
+ it('F(1) = 1', () => {
363
+ const rt = run(`fn test() {
364
+ bigint_fib(1);
365
+ scoreboard_set("out", "r", bigint_get_a(0));
366
+ }`);
367
+ rt.execFunction('test');
368
+ expect(sc(rt, 'r')).toBe(1);
369
+ });
370
+ it('F(10) = 55', () => {
371
+ const rt = run(`fn test() {
372
+ bigint_fib(10);
373
+ scoreboard_set("out", "r", bigint_get_a(0));
374
+ }`);
375
+ rt.execFunction('test');
376
+ expect(sc(rt, 'r')).toBe(55);
377
+ });
378
+ it('F(20) = 6765', () => {
379
+ const rt = run(`fn test() {
380
+ bigint_fib(20);
381
+ scoreboard_set("out", "r", bigint_get_a(0));
382
+ }`);
383
+ rt.execFunction('test');
384
+ expect(sc(rt, 'r')).toBe(6765);
385
+ });
386
+ it('F(50) = 12586269025: limb0=9025, limb1=8626, limb2=125', () => {
387
+ // F(50) = 12,586,269,025
388
+ // 12586269025 % 10000 = 9025
389
+ // floor(12586269025 / 10000) % 10000 = 1258626 % 10000 = 8626
390
+ // floor(12586269025 / 10^8) = 125
391
+ const rt = run(`fn test() {
392
+ bigint_fib(50);
393
+ scoreboard_set("out", "l0", bigint_get_a(0));
394
+ scoreboard_set("out", "l1", bigint_get_a(1));
395
+ scoreboard_set("out", "l2", bigint_get_a(2));
396
+ }`);
397
+ rt.execFunction('test');
398
+ expect(sc(rt, 'l0')).toBe(9025);
399
+ expect(sc(rt, 'l1')).toBe(8626);
400
+ expect(sc(rt, 'l2')).toBe(125);
401
+ });
402
+ it('F(100) low limbs check', () => {
403
+ // F(100) = 354224848179261915075
404
+ // % 10000 = 5075
405
+ // floor / 10000 % 10000 = floor(35422484817926191.5075) % 10000 = ...
406
+ // Let's compute:
407
+ // 354224848179261915075 % 10000 = 5075
408
+ // floor(354224848179261915075 / 10000) = 35422484817926191507 (JS BigInt)
409
+ // 35422484817926191507 % 10000 = 1507
410
+ // floor(35422484817926191507 / 10000) = 3542248481792619 (roughly)
411
+ // % 10000 = 2619
412
+ const rt = run(`fn test() {
413
+ bigint_fib(100);
414
+ scoreboard_set("out", "l0", bigint_get_a(0));
415
+ scoreboard_set("out", "l1", bigint_get_a(1));
416
+ scoreboard_set("out", "l2", bigint_get_a(2));
417
+ }`);
418
+ rt.execFunction('test');
419
+ const f100 = BigInt('354224848179261915075');
420
+ const b = BigInt(10000);
421
+ expect(sc(rt, 'l0')).toBe(Number(f100 % b));
422
+ expect(sc(rt, 'l1')).toBe(Number((f100 / b) % b));
423
+ expect(sc(rt, 'l2')).toBe(Number((f100 / b / b) % b));
424
+ });
425
+ });
426
+ //# sourceMappingURL=stdlib-bigint.test.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * stdlib/math.mcrs — Runtime behavioural tests
3
+ *
4
+ * Each test compiles the math stdlib together with a small driver function,
5
+ * runs it through MCRuntime, and checks scoreboard values.
6
+ */
7
+ export {};