redscript-mc 1.2.30 → 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 (269) 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/demo.gif +0 -0
  8. package/dist/cli.js +2 -554
  9. package/dist/compile.js +2 -266
  10. package/dist/index.js +2 -159
  11. package/dist/lowering/index.js +5 -3
  12. package/dist/src/__tests__/cli.test.d.ts +1 -0
  13. package/dist/src/__tests__/cli.test.js +104 -0
  14. package/dist/src/__tests__/codegen.test.d.ts +1 -0
  15. package/dist/src/__tests__/codegen.test.js +152 -0
  16. package/dist/src/__tests__/compile-all.test.d.ts +10 -0
  17. package/dist/src/__tests__/compile-all.test.js +108 -0
  18. package/dist/src/__tests__/dce.test.d.ts +1 -0
  19. package/dist/src/__tests__/dce.test.js +102 -0
  20. package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
  21. package/dist/src/__tests__/diagnostics.test.js +177 -0
  22. package/dist/src/__tests__/e2e.test.d.ts +6 -0
  23. package/dist/src/__tests__/e2e.test.js +1789 -0
  24. package/dist/src/__tests__/entity-types.test.d.ts +1 -0
  25. package/dist/src/__tests__/entity-types.test.js +203 -0
  26. package/dist/src/__tests__/formatter.test.d.ts +1 -0
  27. package/dist/src/__tests__/formatter.test.js +40 -0
  28. package/dist/src/__tests__/lexer.test.d.ts +1 -0
  29. package/dist/src/__tests__/lexer.test.js +343 -0
  30. package/dist/src/__tests__/lowering.test.d.ts +1 -0
  31. package/dist/src/__tests__/lowering.test.js +1015 -0
  32. package/dist/src/__tests__/macro.test.d.ts +8 -0
  33. package/dist/src/__tests__/macro.test.js +306 -0
  34. package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
  35. package/dist/src/__tests__/mc-integration.test.js +817 -0
  36. package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
  37. package/dist/src/__tests__/mc-syntax.test.js +124 -0
  38. package/dist/src/__tests__/nbt.test.d.ts +1 -0
  39. package/dist/src/__tests__/nbt.test.js +82 -0
  40. package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
  41. package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
  42. package/dist/src/__tests__/optimizer.test.d.ts +1 -0
  43. package/dist/src/__tests__/optimizer.test.js +149 -0
  44. package/dist/src/__tests__/parser.test.d.ts +1 -0
  45. package/dist/src/__tests__/parser.test.js +807 -0
  46. package/dist/src/__tests__/repl.test.d.ts +1 -0
  47. package/dist/src/__tests__/repl.test.js +27 -0
  48. package/dist/src/__tests__/runtime.test.d.ts +1 -0
  49. package/dist/src/__tests__/runtime.test.js +289 -0
  50. package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
  51. package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
  52. package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
  53. package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
  54. package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
  55. package/dist/src/__tests__/stdlib-math.test.js +351 -0
  56. package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
  57. package/dist/src/__tests__/stdlib-vec.test.js +263 -0
  58. package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
  59. package/dist/src/__tests__/structure-optimizer.test.js +33 -0
  60. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  61. package/dist/src/__tests__/typechecker.test.js +552 -0
  62. package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
  63. package/dist/src/__tests__/var-allocator.test.js +69 -0
  64. package/dist/src/ast/types.d.ts +515 -0
  65. package/dist/src/ast/types.js +9 -0
  66. package/dist/src/builtins/metadata.d.ts +36 -0
  67. package/dist/src/builtins/metadata.js +1014 -0
  68. package/dist/src/cli.d.ts +11 -0
  69. package/dist/src/cli.js +443 -0
  70. package/dist/src/codegen/cmdblock/index.d.ts +26 -0
  71. package/dist/src/codegen/cmdblock/index.js +45 -0
  72. package/dist/src/codegen/mcfunction/index.d.ts +40 -0
  73. package/dist/src/codegen/mcfunction/index.js +606 -0
  74. package/dist/src/codegen/structure/index.d.ts +24 -0
  75. package/dist/src/codegen/structure/index.js +279 -0
  76. package/dist/src/codegen/var-allocator.d.ts +45 -0
  77. package/dist/src/codegen/var-allocator.js +104 -0
  78. package/dist/src/compile.d.ts +37 -0
  79. package/dist/src/compile.js +165 -0
  80. package/dist/src/diagnostics/index.d.ts +44 -0
  81. package/dist/src/diagnostics/index.js +140 -0
  82. package/dist/src/events/types.d.ts +35 -0
  83. package/dist/src/events/types.js +59 -0
  84. package/dist/src/formatter/index.d.ts +1 -0
  85. package/dist/src/formatter/index.js +26 -0
  86. package/dist/src/index.d.ts +22 -0
  87. package/dist/src/index.js +45 -0
  88. package/dist/src/ir/builder.d.ts +33 -0
  89. package/dist/src/ir/builder.js +99 -0
  90. package/dist/src/ir/types.d.ts +132 -0
  91. package/dist/src/ir/types.js +15 -0
  92. package/dist/src/lexer/index.d.ts +37 -0
  93. package/dist/src/lexer/index.js +569 -0
  94. package/dist/src/lowering/index.d.ts +188 -0
  95. package/dist/src/lowering/index.js +3405 -0
  96. package/dist/src/mc-test/client.d.ts +128 -0
  97. package/dist/src/mc-test/client.js +174 -0
  98. package/dist/src/mc-test/runner.d.ts +28 -0
  99. package/dist/src/mc-test/runner.js +151 -0
  100. package/dist/src/mc-test/setup.d.ts +11 -0
  101. package/dist/src/mc-test/setup.js +98 -0
  102. package/dist/src/mc-validator/index.d.ts +17 -0
  103. package/dist/src/mc-validator/index.js +322 -0
  104. package/dist/src/nbt/index.d.ts +86 -0
  105. package/dist/src/nbt/index.js +250 -0
  106. package/dist/src/optimizer/commands.d.ts +38 -0
  107. package/dist/src/optimizer/commands.js +451 -0
  108. package/dist/src/optimizer/dce.d.ts +34 -0
  109. package/dist/src/optimizer/dce.js +639 -0
  110. package/dist/src/optimizer/passes.d.ts +34 -0
  111. package/dist/src/optimizer/passes.js +243 -0
  112. package/dist/src/optimizer/structure.d.ts +9 -0
  113. package/dist/src/optimizer/structure.js +356 -0
  114. package/dist/src/parser/index.d.ts +93 -0
  115. package/dist/src/parser/index.js +1687 -0
  116. package/dist/src/repl.d.ts +16 -0
  117. package/dist/src/repl.js +165 -0
  118. package/dist/src/runtime/index.d.ts +107 -0
  119. package/dist/src/runtime/index.js +1409 -0
  120. package/dist/src/typechecker/index.d.ts +61 -0
  121. package/dist/src/typechecker/index.js +1034 -0
  122. package/dist/src/types/entity-hierarchy.d.ts +29 -0
  123. package/dist/src/types/entity-hierarchy.js +107 -0
  124. package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
  125. package/dist/src2/__tests__/e2e/basic.test.js +140 -0
  126. package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
  127. package/dist/src2/__tests__/e2e/macros.test.js +182 -0
  128. package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
  129. package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
  130. package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
  131. package/dist/src2/__tests__/hir/desugar.test.js +234 -0
  132. package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
  133. package/dist/src2/__tests__/lir/lower.test.js +559 -0
  134. package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
  135. package/dist/src2/__tests__/lir/types.test.js +185 -0
  136. package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
  137. package/dist/src2/__tests__/lir/verify.test.js +221 -0
  138. package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
  139. package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
  140. package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
  141. package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
  142. package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
  143. package/dist/src2/__tests__/mir/verify.test.js +223 -0
  144. package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
  145. package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
  146. package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
  147. package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
  148. package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
  149. package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
  150. package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
  151. package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
  152. package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
  153. package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
  154. package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
  155. package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
  156. package/dist/src2/emit/compile.d.ts +19 -0
  157. package/dist/src2/emit/compile.js +80 -0
  158. package/dist/src2/emit/index.d.ts +17 -0
  159. package/dist/src2/emit/index.js +172 -0
  160. package/dist/src2/hir/lower.d.ts +15 -0
  161. package/dist/src2/hir/lower.js +378 -0
  162. package/dist/src2/hir/types.d.ts +373 -0
  163. package/dist/src2/hir/types.js +16 -0
  164. package/dist/src2/lir/lower.d.ts +15 -0
  165. package/dist/src2/lir/lower.js +453 -0
  166. package/dist/src2/lir/types.d.ts +136 -0
  167. package/dist/src2/lir/types.js +11 -0
  168. package/dist/src2/lir/verify.d.ts +14 -0
  169. package/dist/src2/lir/verify.js +113 -0
  170. package/dist/src2/mir/lower.d.ts +9 -0
  171. package/dist/src2/mir/lower.js +1030 -0
  172. package/dist/src2/mir/macro.d.ts +22 -0
  173. package/dist/src2/mir/macro.js +168 -0
  174. package/dist/src2/mir/types.d.ts +183 -0
  175. package/dist/src2/mir/types.js +11 -0
  176. package/dist/src2/mir/verify.d.ts +16 -0
  177. package/dist/src2/mir/verify.js +216 -0
  178. package/dist/src2/optimizer/block_merge.d.ts +12 -0
  179. package/dist/src2/optimizer/block_merge.js +84 -0
  180. package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
  181. package/dist/src2/optimizer/branch_simplify.js +28 -0
  182. package/dist/src2/optimizer/constant_fold.d.ts +10 -0
  183. package/dist/src2/optimizer/constant_fold.js +85 -0
  184. package/dist/src2/optimizer/copy_prop.d.ts +9 -0
  185. package/dist/src2/optimizer/copy_prop.js +113 -0
  186. package/dist/src2/optimizer/dce.d.ts +8 -0
  187. package/dist/src2/optimizer/dce.js +155 -0
  188. package/dist/src2/optimizer/pipeline.d.ts +10 -0
  189. package/dist/src2/optimizer/pipeline.js +42 -0
  190. package/dist/tsconfig.tsbuildinfo +1 -0
  191. package/docs/compiler-pipeline-redesign.md +2243 -0
  192. package/docs/optimization-ideas.md +1076 -0
  193. package/editors/vscode/package-lock.json +3 -3
  194. package/editors/vscode/package.json +1 -1
  195. package/jest.config.js +1 -1
  196. package/package.json +6 -5
  197. package/scripts/postbuild.js +15 -0
  198. package/src/__tests__/cli.test.ts +8 -220
  199. package/src/__tests__/dce.test.ts +11 -56
  200. package/src/__tests__/diagnostics.test.ts +59 -38
  201. package/src/__tests__/mc-integration.test.ts +1 -2
  202. package/src/ast/types.ts +6 -1
  203. package/src/cli.ts +29 -156
  204. package/src/compile.ts +6 -162
  205. package/src/index.ts +14 -178
  206. package/src/mc-test/runner.ts +4 -3
  207. package/src/parser/index.ts +1 -1
  208. package/src/repl.ts +1 -1
  209. package/src/runtime/index.ts +1 -1
  210. package/src2/__tests__/e2e/basic.test.ts +154 -0
  211. package/src2/__tests__/e2e/macros.test.ts +199 -0
  212. package/src2/__tests__/e2e/migrate.test.ts +3008 -0
  213. package/src2/__tests__/hir/desugar.test.ts +263 -0
  214. package/src2/__tests__/lir/lower.test.ts +619 -0
  215. package/src2/__tests__/lir/types.test.ts +207 -0
  216. package/src2/__tests__/lir/verify.test.ts +249 -0
  217. package/src2/__tests__/mir/arithmetic.test.ts +156 -0
  218. package/src2/__tests__/mir/control-flow.test.ts +242 -0
  219. package/src2/__tests__/mir/verify.test.ts +254 -0
  220. package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
  221. package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
  222. package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
  223. package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
  224. package/src2/__tests__/optimizer/dce.test.ts +83 -0
  225. package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
  226. package/src2/emit/compile.ts +99 -0
  227. package/src2/emit/index.ts +222 -0
  228. package/src2/hir/lower.ts +428 -0
  229. package/src2/hir/types.ts +216 -0
  230. package/src2/lir/lower.ts +556 -0
  231. package/src2/lir/types.ts +109 -0
  232. package/src2/lir/verify.ts +129 -0
  233. package/src2/mir/lower.ts +1160 -0
  234. package/src2/mir/macro.ts +167 -0
  235. package/src2/mir/types.ts +106 -0
  236. package/src2/mir/verify.ts +218 -0
  237. package/src2/optimizer/block_merge.ts +93 -0
  238. package/src2/optimizer/branch_simplify.ts +27 -0
  239. package/src2/optimizer/constant_fold.ts +88 -0
  240. package/src2/optimizer/copy_prop.ts +106 -0
  241. package/src2/optimizer/dce.ts +133 -0
  242. package/src2/optimizer/pipeline.ts +44 -0
  243. package/tsconfig.json +2 -2
  244. package/src/__tests__/codegen.test.ts +0 -161
  245. package/src/__tests__/e2e.test.ts +0 -2039
  246. package/src/__tests__/entity-types.test.ts +0 -236
  247. package/src/__tests__/lowering.test.ts +0 -1185
  248. package/src/__tests__/macro.test.ts +0 -343
  249. package/src/__tests__/nbt.test.ts +0 -58
  250. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  251. package/src/__tests__/optimizer.test.ts +0 -162
  252. package/src/__tests__/runtime.test.ts +0 -305
  253. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  254. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  255. package/src/__tests__/stdlib-math.test.ts +0 -374
  256. package/src/__tests__/stdlib-vec.test.ts +0 -259
  257. package/src/__tests__/structure-optimizer.test.ts +0 -38
  258. package/src/__tests__/var-allocator.test.ts +0 -75
  259. package/src/codegen/cmdblock/index.ts +0 -63
  260. package/src/codegen/mcfunction/index.ts +0 -662
  261. package/src/codegen/structure/index.ts +0 -346
  262. package/src/codegen/var-allocator.ts +0 -104
  263. package/src/ir/builder.ts +0 -116
  264. package/src/ir/types.ts +0 -134
  265. package/src/lowering/index.ts +0 -3876
  266. package/src/optimizer/commands.ts +0 -534
  267. package/src/optimizer/dce.ts +0 -679
  268. package/src/optimizer/passes.ts +0 -250
  269. package/src/optimizer/structure.ts +0 -450
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ /**
3
+ * stdlib/math.mcrs — Runtime behavioural tests
4
+ *
5
+ * Each test compiles the math stdlib together with a small driver function,
6
+ * runs it through MCRuntime, and checks scoreboard 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
+ function run(driver) {
48
+ // Use librarySources so math functions are only compiled when actually called
49
+ const result = (0, compile_1.compile)(driver, { namespace: 'mathtest', librarySources: [MATH_SRC] });
50
+ // v2: compile() throws on error; success is always true if we reach here
51
+ const runtime = new runtime_1.MCRuntime('mathtest');
52
+ for (const file of result.files ?? []) {
53
+ if (!file.path.endsWith('.mcfunction'))
54
+ continue;
55
+ const match = file.path.match(/data\/([^/]+)\/function\/(.+)\.mcfunction$/);
56
+ if (!match)
57
+ continue;
58
+ runtime.loadFunction(`${match[1]}:${match[2]}`, file.content.split('\n'));
59
+ }
60
+ runtime.load();
61
+ return runtime;
62
+ }
63
+ function scoreOf(rt, key) {
64
+ return rt.getScore('out', `mathtest.${key}`);
65
+ }
66
+ // ─── abs ─────────────────────────────────────────────────────────────────────
67
+ describe('abs', () => {
68
+ it('abs of positive', () => {
69
+ const rt = run(`fn test() { scoreboard_set("out", "r", abs(42)); }`);
70
+ rt.execFunction('test');
71
+ expect(scoreOf(rt, 'r')).toBe(42);
72
+ });
73
+ it('abs of negative', () => {
74
+ const rt = run(`fn test() { scoreboard_set("out", "r", abs(-7)); }`);
75
+ rt.execFunction('test');
76
+ expect(scoreOf(rt, 'r')).toBe(7);
77
+ });
78
+ it('abs of zero', () => {
79
+ const rt = run(`fn test() { scoreboard_set("out", "r", abs(0)); }`);
80
+ rt.execFunction('test');
81
+ expect(scoreOf(rt, 'r')).toBe(0);
82
+ });
83
+ });
84
+ // ─── sign ────────────────────────────────────────────────────────────────────
85
+ describe('sign', () => {
86
+ it.each([
87
+ [5, 1],
88
+ [-3, -1],
89
+ [0, 0],
90
+ ])('sign(%d) == %d', (x, expected) => {
91
+ const rt = run(`fn test() { scoreboard_set("out", "r", sign(${x})); }`);
92
+ rt.execFunction('test');
93
+ expect(scoreOf(rt, 'r')).toBe(expected);
94
+ });
95
+ });
96
+ // ─── min / max ───────────────────────────────────────────────────────────────
97
+ describe('min', () => {
98
+ it.each([
99
+ [3, 7, 3],
100
+ [7, 3, 3],
101
+ [5, 5, 5],
102
+ [-2, 0, -2],
103
+ ])('min(%d, %d) == %d', (a, b, expected) => {
104
+ const rt = run(`fn test() { scoreboard_set("out", "r", min(${a}, ${b})); }`);
105
+ rt.execFunction('test');
106
+ expect(scoreOf(rt, 'r')).toBe(expected);
107
+ });
108
+ });
109
+ describe('max', () => {
110
+ it.each([
111
+ [3, 7, 7],
112
+ [7, 3, 7],
113
+ [5, 5, 5],
114
+ [-2, 0, 0],
115
+ ])('max(%d, %d) == %d', (a, b, expected) => {
116
+ const rt = run(`fn test() { scoreboard_set("out", "r", max(${a}, ${b})); }`);
117
+ rt.execFunction('test');
118
+ expect(scoreOf(rt, 'r')).toBe(expected);
119
+ });
120
+ });
121
+ // ─── clamp ───────────────────────────────────────────────────────────────────
122
+ describe('clamp', () => {
123
+ it.each([
124
+ [5, 0, 10, 5], // in range
125
+ [-5, 0, 10, 0], // below lo
126
+ [15, 0, 10, 10], // above hi
127
+ [0, 0, 10, 0], // at lo
128
+ [10, 0, 10, 10], // at hi
129
+ ])('clamp(%d, %d, %d) == %d', (x, lo, hi, expected) => {
130
+ const rt = run(`fn test() { scoreboard_set("out", "r", clamp(${x}, ${lo}, ${hi})); }`);
131
+ rt.execFunction('test');
132
+ expect(scoreOf(rt, 'r')).toBe(expected);
133
+ });
134
+ });
135
+ // ─── lerp ────────────────────────────────────────────────────────────────────
136
+ describe('lerp', () => {
137
+ it.each([
138
+ [0, 1000, 0, 0], // t=0 → a
139
+ [0, 1000, 1000, 1000], // t=1000 → b
140
+ [0, 1000, 500, 500], // t=0.5 → midpoint
141
+ [100, 200, 750, 175], // 100 + (200-100)*0.75 = 175
142
+ [0, 100, 333, 33], // integer division truncation
143
+ ])('lerp(%d, %d, %d) == %d', (a, b, t, expected) => {
144
+ const rt = run(`fn test() { scoreboard_set("out", "r", lerp(${a}, ${b}, ${t})); }`);
145
+ rt.execFunction('test');
146
+ expect(scoreOf(rt, 'r')).toBe(expected);
147
+ });
148
+ });
149
+ // ─── isqrt ───────────────────────────────────────────────────────────────────
150
+ describe('isqrt', () => {
151
+ it.each([
152
+ [0, 0],
153
+ [1, 1],
154
+ [4, 2],
155
+ [9, 3],
156
+ [10, 3], // floor
157
+ [16, 4],
158
+ [24, 4], // floor
159
+ [25, 5],
160
+ [100, 10],
161
+ [1000000, 1000],
162
+ ])('isqrt(%d) == %d', (n, expected) => {
163
+ const rt = run(`fn test() { scoreboard_set("out", "r", isqrt(${n})); }`);
164
+ rt.execFunction('test');
165
+ expect(scoreOf(rt, 'r')).toBe(expected);
166
+ });
167
+ });
168
+ // ─── sqrt_fixed ──────────────────────────────────────────────────────────────
169
+ describe('sqrt_fixed (scale=1000)', () => {
170
+ it.each([
171
+ [1000, 1000], // sqrt(1.0) = 1.0
172
+ [4000, 2000], // sqrt(4.0) = 2.0
173
+ [2000, 1414], // sqrt(2.0) ≈ 1.414 (truncated)
174
+ [9000, 3000], // sqrt(9.0) = 3.0
175
+ ])('sqrt_fixed(%d) ≈ %d', (x, expected) => {
176
+ const rt = run(`fn test() { scoreboard_set("out", "r", sqrt_fixed(${x})); }`);
177
+ rt.execFunction('test');
178
+ // Allow ±1 from integer truncation
179
+ expect(Math.abs(scoreOf(rt, 'r') - expected)).toBeLessThanOrEqual(1);
180
+ });
181
+ });
182
+ // ─── pow_int ─────────────────────────────────────────────────────────────────
183
+ describe('pow_int', () => {
184
+ it.each([
185
+ [2, 0, 1],
186
+ [2, 1, 2],
187
+ [2, 10, 1024],
188
+ [3, 3, 27],
189
+ [5, 4, 625],
190
+ [10, 5, 100000],
191
+ [7, 0, 1],
192
+ [1, 100, 1],
193
+ ])('pow_int(%d, %d) == %d', (base, exp, expected) => {
194
+ const rt = run(`fn test() { scoreboard_set("out", "r", pow_int(${base}, ${exp})); }`);
195
+ rt.execFunction('test');
196
+ expect(scoreOf(rt, 'r')).toBe(expected);
197
+ });
198
+ });
199
+ // ─── gcd ─────────────────────────────────────────────────────────────────────
200
+ describe('gcd', () => {
201
+ it.each([
202
+ [12, 8, 4],
203
+ [7, 5, 1],
204
+ [100, 25, 25],
205
+ [0, 5, 5],
206
+ [5, 0, 5],
207
+ [12, 12, 12],
208
+ [-12, 8, 4], // abs handled internally
209
+ ])('gcd(%d, %d) == %d', (a, b, expected) => {
210
+ const rt = run(`fn test() { scoreboard_set("out", "r", gcd(${a}, ${b})); }`);
211
+ rt.execFunction('test');
212
+ expect(scoreOf(rt, 'r')).toBe(expected);
213
+ });
214
+ });
215
+ // ─── Phase 4: Number theory & utilities ──────────────────────────────────────
216
+ describe('lcm', () => {
217
+ it.each([
218
+ [4, 6, 12],
219
+ [3, 5, 15],
220
+ [0, 5, 0],
221
+ [12, 12, 12],
222
+ [7, 1, 7],
223
+ ])('lcm(%d, %d) == %d', (a, b, expected) => {
224
+ const rt = run(`fn test() { scoreboard_set("out", "r", lcm(${a}, ${b})); }`);
225
+ rt.execFunction('test');
226
+ expect(scoreOf(rt, 'r')).toBe(expected);
227
+ });
228
+ });
229
+ describe('map', () => {
230
+ it.each([
231
+ [5, 0, 10, 0, 100, 50],
232
+ [0, 0, 10, 0, 100, 0],
233
+ [10, 0, 10, 0, 100, 100],
234
+ [1, 0, 10, 100, 200, 110],
235
+ [5, 0, 10, -100, 100, 0],
236
+ ])('map(%d, %d, %d, %d, %d) == %d', (x, il, ih, ol, oh, expected) => {
237
+ const rt = run(`fn test() { scoreboard_set("out", "r", map(${x}, ${il}, ${ih}, ${ol}, ${oh})); }`);
238
+ rt.execFunction('test');
239
+ expect(scoreOf(rt, 'r')).toBe(expected);
240
+ });
241
+ });
242
+ describe('ceil_div', () => {
243
+ it.each([
244
+ [7, 3, 3],
245
+ [6, 3, 2],
246
+ [9, 3, 3],
247
+ [1, 5, 1],
248
+ [10, 10, 1],
249
+ ])('ceil_div(%d, %d) == %d', (a, b, expected) => {
250
+ const rt = run(`fn test() { scoreboard_set("out", "r", ceil_div(${a}, ${b})); }`);
251
+ rt.execFunction('test');
252
+ expect(scoreOf(rt, 'r')).toBe(expected);
253
+ });
254
+ });
255
+ describe('log2_int', () => {
256
+ it.each([
257
+ [1, 0],
258
+ [2, 1],
259
+ [4, 2],
260
+ [8, 3],
261
+ [7, 2],
262
+ [1024, 10],
263
+ [0, -1],
264
+ ])('log2_int(%d) == %d', (n, expected) => {
265
+ const rt = run(`fn test() { scoreboard_set("out", "r", log2_int(${n})); }`);
266
+ rt.execFunction('test');
267
+ expect(scoreOf(rt, 'r')).toBe(expected);
268
+ });
269
+ });
270
+ // ─── Phase 3: Trigonometry ────────────────────────────────────────────────────
271
+ // MCRuntime doesn't support real NBT storage macro functions (data get storage
272
+ // path[$(i)]) — those require Minecraft 1.20.2+.
273
+ // We test what we can: compile-only + sin table initialisation check,
274
+ // and verify sin_fixed output for key angles where the MCRuntime
275
+ // can simulate the scoreboard value after we manually stub the lookup.
276
+ describe('sin table init', () => {
277
+ it('_math_init in __load when sin_fixed is called (via librarySources)', () => {
278
+ const mathSrc = require('fs').readFileSync(require('path').join(__dirname, '../../src/stdlib/math.mcrs'), 'utf-8');
279
+ const result = require('../compile').compile('fn test() { scoreboard_set("out", "r", sin_fixed(30)); }', { namespace: 'mathtest', librarySources: [mathSrc] });
280
+ expect(result.success).toBe(true);
281
+ const hasSinTable = result.files?.some((f) => f.content?.includes('data modify storage math:tables sin set value'));
282
+ expect(hasSinTable).toBe(true);
283
+ });
284
+ it('_math_init NOT in output when sin_fixed is not used (library DCE)', () => {
285
+ const mathSrc = require('fs').readFileSync(require('path').join(__dirname, '../../src/stdlib/math.mcrs'), 'utf-8');
286
+ const result = require('../compile').compile('fn test() { scoreboard_set("out", "r", abs(-5)); }', { namespace: 'mathtest', librarySources: [mathSrc] });
287
+ expect(result.success).toBe(true);
288
+ const hasSinTable = result.files?.some((f) => f.content?.includes('data modify storage math:tables sin set value'));
289
+ expect(hasSinTable).toBe(false);
290
+ });
291
+ });
292
+ describe('sin_fixed compile check', () => {
293
+ it('sin_fixed compiles without errors', () => {
294
+ const mathSrc = require('fs').readFileSync(require('path').join(__dirname, '../../src/stdlib/math.mcrs'), 'utf-8');
295
+ const result = require('../compile').compile('fn test() { scoreboard_set("out", "r", sin_fixed(30)); }', { namespace: 'mathtest', librarySources: [mathSrc] });
296
+ expect(result.success).toBe(true);
297
+ });
298
+ it('cos_fixed compiles without errors', () => {
299
+ const mathSrc = require('fs').readFileSync(require('path').join(__dirname, '../../src/stdlib/math.mcrs'), 'utf-8');
300
+ const result = require('../compile').compile('fn test() { scoreboard_set("out", "r", cos_fixed(0)); }', { namespace: 'mathtest', librarySources: [mathSrc] });
301
+ expect(result.success).toBe(true);
302
+ });
303
+ });
304
+ // ─── Phase 5: Vectors, directions & easing ───────────────────────────────────
305
+ describe('mulfix / divfix', () => {
306
+ it.each([
307
+ [500, 707, 353], // 0.5 × 0.707 ≈ 0.353
308
+ [1000, 1000, 1000],
309
+ [1000, 500, 500],
310
+ [0, 999, 0],
311
+ ])('mulfix(%d, %d) == %d', (a, b, expected) => {
312
+ const rt = run(`fn test() { scoreboard_set("out", "r", mulfix(${a}, ${b})); }`);
313
+ rt.execFunction('test');
314
+ expect(scoreOf(rt, 'r')).toBe(expected);
315
+ });
316
+ it.each([
317
+ [1, 3, 333],
318
+ [1, 2, 500],
319
+ [2, 1, 2000],
320
+ [0, 5, 0],
321
+ ])('divfix(%d, %d) == %d', (a, b, expected) => {
322
+ const rt = run(`fn test() { scoreboard_set("out", "r", divfix(${a}, ${b})); }`);
323
+ rt.execFunction('test');
324
+ expect(scoreOf(rt, 'r')).toBe(expected);
325
+ });
326
+ });
327
+ // dot2d, cross2d, length2d_fixed, manhattan, chebyshev, atan2_fixed
328
+ // have moved to vec.mcrs — tested in stdlib-vec.test.ts
329
+ describe('smoothstep', () => {
330
+ it.each([
331
+ [0, 0],
332
+ [100, 1000],
333
+ [50, 500], // midpoint: 3×0.5²−2×0.5³ = 0.5 → 500
334
+ ])('smoothstep(0,100,%d) == %d', (x, expected) => {
335
+ const rt = run(`fn test() { scoreboard_set("out", "r", smoothstep(0, 100, ${x})); }`);
336
+ rt.execFunction('test');
337
+ expect(scoreOf(rt, 'r')).toBe(expected);
338
+ });
339
+ it('smoothstep is monotonically increasing', () => {
340
+ let prev = -1;
341
+ for (const x of [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]) {
342
+ const rt = run(`fn test() { scoreboard_set("out", "r", smoothstep(0, 100, ${x})); }`);
343
+ rt.execFunction('test');
344
+ const v = scoreOf(rt, 'r');
345
+ expect(v).toBeGreaterThanOrEqual(prev);
346
+ prev = v;
347
+ }
348
+ });
349
+ });
350
+ // atan2_fixed / _atan_init tests moved to stdlib-vec.test.ts
351
+ //# sourceMappingURL=stdlib-math.test.js.map
@@ -0,0 +1,4 @@
1
+ /**
2
+ * stdlib/vec.mcrs — runtime behavioural tests
3
+ */
4
+ export {};
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ /**
3
+ * stdlib/vec.mcrs — runtime behavioural tests
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const compile_1 = require("../compile");
42
+ const runtime_1 = require("../runtime");
43
+ const MATH_SRC = fs.readFileSync(path.join(__dirname, '../../src/stdlib/math.mcrs'), 'utf-8');
44
+ const VEC_SRC = fs.readFileSync(path.join(__dirname, '../../src/stdlib/vec.mcrs'), 'utf-8');
45
+ function run(driver) {
46
+ const result = (0, compile_1.compile)(driver, {
47
+ namespace: 'vectest',
48
+ librarySources: [MATH_SRC, VEC_SRC],
49
+ });
50
+ // v2: compile() throws on error; success is always true if we reach here
51
+ const rt = new runtime_1.MCRuntime('vectest');
52
+ for (const file of result.files ?? []) {
53
+ if (!file.path.endsWith('.mcfunction'))
54
+ continue;
55
+ const match = file.path.match(/data\/([^/]+)\/function\/(.+)\.mcfunction$/);
56
+ if (!match)
57
+ continue;
58
+ rt.loadFunction(`${match[1]}:${match[2]}`, file.content.split('\n'));
59
+ }
60
+ rt.load();
61
+ return rt;
62
+ }
63
+ function scoreOf(rt, key) {
64
+ return rt.getScore('out', `vectest.${key}`);
65
+ }
66
+ // ─── 2D basic ────────────────────────────────────────────────────────────────
67
+ describe('dot2d', () => {
68
+ it('dot2d(3,4,3,4) == 25', () => {
69
+ const rt = run(`fn test() { scoreboard_set("out", "r", dot2d(3,4,3,4)); }`);
70
+ rt.execFunction('test');
71
+ expect(scoreOf(rt, 'r')).toBe(25);
72
+ });
73
+ it('perpendicular == 0', () => {
74
+ const rt = run(`fn test() { scoreboard_set("out", "r", dot2d(1,0,0,1)); }`);
75
+ rt.execFunction('test');
76
+ expect(scoreOf(rt, 'r')).toBe(0);
77
+ });
78
+ });
79
+ describe('cross2d', () => {
80
+ it('cross2d(1,0,0,1) == 1', () => {
81
+ const rt = run(`fn test() { scoreboard_set("out", "r", cross2d(1,0,0,1)); }`);
82
+ rt.execFunction('test');
83
+ expect(scoreOf(rt, 'r')).toBe(1);
84
+ });
85
+ it('cross2d parallel == 0', () => {
86
+ const rt = run(`fn test() { scoreboard_set("out", "r", cross2d(3,0,6,0)); }`);
87
+ rt.execFunction('test');
88
+ expect(scoreOf(rt, 'r')).toBe(0);
89
+ });
90
+ });
91
+ describe('length2d_fixed', () => {
92
+ it.each([
93
+ [3, 4, 5000],
94
+ [0, 5, 5000],
95
+ [5, 0, 5000],
96
+ [1, 1, 1414],
97
+ ])('length2d_fixed(%d,%d) == %d', (x, y, expected) => {
98
+ const rt = run(`fn test() { scoreboard_set("out", "r", length2d_fixed(${x},${y})); }`);
99
+ rt.execFunction('test');
100
+ expect(scoreOf(rt, 'r')).toBe(expected);
101
+ });
102
+ });
103
+ describe('distance2d_fixed', () => {
104
+ it('distance2d_fixed(0,0,3,4) == 5000', () => {
105
+ const rt = run(`fn test() { scoreboard_set("out", "r", distance2d_fixed(0,0,3,4)); }`);
106
+ rt.execFunction('test');
107
+ expect(scoreOf(rt, 'r')).toBe(5000);
108
+ });
109
+ it('distance2d_fixed(p,p) == 0', () => {
110
+ const rt = run(`fn test() { scoreboard_set("out", "r", distance2d_fixed(5,7,5,7)); }`);
111
+ rt.execFunction('test');
112
+ expect(scoreOf(rt, 'r')).toBe(0);
113
+ });
114
+ });
115
+ describe('manhattan', () => {
116
+ it.each([
117
+ [0, 0, 3, 4, 7],
118
+ [0, 0, 0, 5, 5],
119
+ [1, 1, 1, 1, 0],
120
+ ])('manhattan(%d,%d,%d,%d) == %d', (x1, y1, x2, y2, e) => {
121
+ const rt = run(`fn test() { scoreboard_set("out", "r", manhattan(${x1},${y1},${x2},${y2})); }`);
122
+ rt.execFunction('test');
123
+ expect(scoreOf(rt, 'r')).toBe(e);
124
+ });
125
+ });
126
+ describe('chebyshev', () => {
127
+ it.each([
128
+ [0, 0, 3, 4, 4],
129
+ [0, 0, 4, 3, 4],
130
+ [0, 0, 5, 5, 5],
131
+ ])('chebyshev(%d,%d,%d,%d) == %d', (x1, y1, x2, y2, e) => {
132
+ const rt = run(`fn test() { scoreboard_set("out", "r", chebyshev(${x1},${y1},${x2},${y2})); }`);
133
+ rt.execFunction('test');
134
+ expect(scoreOf(rt, 'r')).toBe(e);
135
+ });
136
+ });
137
+ describe('normalize2d', () => {
138
+ it('normalize2d_x(3,4) == 600', () => {
139
+ const rt = run(`fn test() { scoreboard_set("out", "r", normalize2d_x(3,4)); }`);
140
+ rt.execFunction('test');
141
+ expect(scoreOf(rt, 'r')).toBe(600);
142
+ });
143
+ it('normalize2d_y(3,4) == 800', () => {
144
+ const rt = run(`fn test() { scoreboard_set("out", "r", normalize2d_y(3,4)); }`);
145
+ rt.execFunction('test');
146
+ expect(scoreOf(rt, 'r')).toBe(800);
147
+ });
148
+ it('zero vector → 0', () => {
149
+ const rt = run(`fn test() { scoreboard_set("out", "r", normalize2d_x(0,0)); }`);
150
+ rt.execFunction('test');
151
+ expect(scoreOf(rt, 'r')).toBe(0);
152
+ });
153
+ });
154
+ describe('lerp2d', () => {
155
+ it('lerp2d_x midpoint', () => {
156
+ const rt = run(`fn test() { scoreboard_set("out", "r", lerp2d_x(0,0,100,200,500)); }`);
157
+ rt.execFunction('test');
158
+ expect(scoreOf(rt, 'r')).toBe(50);
159
+ });
160
+ it('lerp2d_y midpoint', () => {
161
+ const rt = run(`fn test() { scoreboard_set("out", "r", lerp2d_y(0,0,100,200,500)); }`);
162
+ rt.execFunction('test');
163
+ expect(scoreOf(rt, 'r')).toBe(100);
164
+ });
165
+ });
166
+ // ─── 2D direction ────────────────────────────────────────────────────────────
167
+ describe('atan2_fixed', () => {
168
+ it.each([
169
+ [0, 1, 0],
170
+ [1, 0, 90],
171
+ [0, -1, 180],
172
+ [-1, 0, 270],
173
+ [1, 1, 45],
174
+ ])('atan2_fixed(%d,%d) == %d', (y, x, expected) => {
175
+ const rt = run(`fn test() { scoreboard_set("out", "r", atan2_fixed(${y},${x})); }`);
176
+ rt.execFunction('test');
177
+ expect(scoreOf(rt, 'r')).toBe(expected);
178
+ });
179
+ });
180
+ describe('rotate2d', () => {
181
+ it('rotate 90°: (1000,0) → x≈0', () => {
182
+ const rt = run(`fn test() { scoreboard_set("out", "r", rotate2d_x(1000,0,90)); }`);
183
+ rt.execFunction('test');
184
+ expect(Math.abs(scoreOf(rt, 'r'))).toBeLessThan(5); // ≈0, allow rounding
185
+ });
186
+ it('rotate 90°: (1000,0) → y≈1000', () => {
187
+ const rt = run(`fn test() { scoreboard_set("out", "r", rotate2d_y(1000,0,90)); }`);
188
+ rt.execFunction('test');
189
+ expect(scoreOf(rt, 'r')).toBe(1000);
190
+ });
191
+ it('rotate 0°: no change', () => {
192
+ const rt = run(`fn test() { scoreboard_set("out", "r", rotate2d_x(700,0,0)); }`);
193
+ rt.execFunction('test');
194
+ expect(scoreOf(rt, 'r')).toBe(700);
195
+ });
196
+ });
197
+ // ─── 3D geometry ─────────────────────────────────────────────────────────────
198
+ describe('dot3d', () => {
199
+ it('dot3d(1,0,0,1,0,0) == 1', () => {
200
+ const rt = run(`fn test() { scoreboard_set("out", "r", dot3d(1,0,0,1,0,0)); }`);
201
+ rt.execFunction('test');
202
+ expect(scoreOf(rt, 'r')).toBe(1);
203
+ });
204
+ it('perpendicular == 0', () => {
205
+ const rt = run(`fn test() { scoreboard_set("out", "r", dot3d(1,0,0,0,1,0)); }`);
206
+ rt.execFunction('test');
207
+ expect(scoreOf(rt, 'r')).toBe(0);
208
+ });
209
+ });
210
+ describe('cross3d', () => {
211
+ // (1,0,0) × (0,1,0) = (0,0,1)
212
+ it('cross3d_z(1,0,0,0,1,0) == 1', () => {
213
+ const rt = run(`fn test() { scoreboard_set("out", "r", cross3d_z(1,0,0,0,1,0)); }`);
214
+ rt.execFunction('test');
215
+ expect(scoreOf(rt, 'r')).toBe(1);
216
+ });
217
+ it('cross3d_x(1,0,0,0,1,0) == 0', () => {
218
+ const rt = run(`fn test() { scoreboard_set("out", "r", cross3d_x(1,0,0,0,1,0)); }`);
219
+ rt.execFunction('test');
220
+ expect(scoreOf(rt, 'r')).toBe(0);
221
+ });
222
+ });
223
+ describe('length3d_fixed', () => {
224
+ it('length3d_fixed(1,1,1) == 1732', () => {
225
+ const rt = run(`fn test() { scoreboard_set("out", "r", length3d_fixed(1,1,1)); }`);
226
+ rt.execFunction('test');
227
+ expect(scoreOf(rt, 'r')).toBe(1732);
228
+ });
229
+ it('length3d_fixed(3,4,0) == 5000', () => {
230
+ const rt = run(`fn test() { scoreboard_set("out", "r", length3d_fixed(3,4,0)); }`);
231
+ rt.execFunction('test');
232
+ expect(scoreOf(rt, 'r')).toBe(5000);
233
+ });
234
+ });
235
+ describe('manhattan3d / chebyshev3d', () => {
236
+ it('manhattan3d(0,0,0,1,2,3) == 6', () => {
237
+ const rt = run(`fn test() { scoreboard_set("out", "r", manhattan3d(0,0,0,1,2,3)); }`);
238
+ rt.execFunction('test');
239
+ expect(scoreOf(rt, 'r')).toBe(6);
240
+ });
241
+ it('chebyshev3d(0,0,0,3,1,2) == 3', () => {
242
+ const rt = run(`fn test() { scoreboard_set("out", "r", chebyshev3d(0,0,0,3,1,2)); }`);
243
+ rt.execFunction('test');
244
+ expect(scoreOf(rt, 'r')).toBe(3);
245
+ });
246
+ });
247
+ // ─── library DCE check ────────────────────────────────────────────────────────
248
+ describe('library DCE: vec.mcrs', () => {
249
+ it('only dot2d compiled when only dot2d called', () => {
250
+ const result = require('../compile').compile('fn test() { scoreboard_set("out", "r", dot2d(1,0,0,1)); }', { namespace: 'vectest', librarySources: [MATH_SRC, VEC_SRC] });
251
+ expect(result.success).toBe(true);
252
+ // atan2_fixed not called → no tan table in __load
253
+ const hasTanTable = result.files?.some((f) => f.content?.includes('data modify storage math:tables tan set value'));
254
+ expect(hasTanTable).toBe(false);
255
+ });
256
+ it('_atan_init in __load when atan2_fixed is called', () => {
257
+ const result = require('../compile').compile('fn test() { scoreboard_set("out", "r", atan2_fixed(1,0)); }', { namespace: 'vectest', librarySources: [MATH_SRC, VEC_SRC] });
258
+ expect(result.success).toBe(true);
259
+ const hasTanTable = result.files?.some((f) => f.content?.includes('data modify storage math:tables tan set value'));
260
+ expect(hasTanTable).toBe(true);
261
+ });
262
+ });
263
+ //# sourceMappingURL=stdlib-vec.test.js.map
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const structure_1 = require("../codegen/structure");
4
+ describe('structure target optimizer', () => {
5
+ test('inlines small then-branch into conditional chain', () => {
6
+ const source = `
7
+ fn test() {
8
+ let x: int = 5;
9
+ if (x > 3) {
10
+ say("big");
11
+ }
12
+ }
13
+ `;
14
+ const result = (0, structure_1.compileToStructure)(source, 'test');
15
+ expect(result.blocks.some(block => block.command.includes('run function test:test/'))).toBe(false);
16
+ expect(result.blocks.some(block => block.command.includes('say big'))).toBe(true);
17
+ });
18
+ test('emits conditional chain blocks for an inlined if body', () => {
19
+ const source = `
20
+ fn test(x: int) {
21
+ if (x > 3) {
22
+ say("big");
23
+ say("still big");
24
+ }
25
+ }
26
+ `;
27
+ const result = (0, structure_1.compileToStructure)(source, 'test');
28
+ const bodyBlocks = result.blocks.filter(block => block.command.includes('say big') || block.command.includes('say still big'));
29
+ expect(bodyBlocks).toHaveLength(2);
30
+ expect(bodyBlocks.every(block => block.conditional)).toBe(true);
31
+ });
32
+ });
33
+ //# sourceMappingURL=structure-optimizer.test.js.map
@@ -0,0 +1 @@
1
+ export {};