redscript-mc 2.0.0 → 2.1.1

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 (643) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +48 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +321 -0
  22. package/dist/src/__tests__/mc-syntax.test.js +1 -6
  23. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  24. package/dist/src/__tests__/mc-version.test.js +154 -0
  25. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  26. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  27. package/dist/src/__tests__/modules.test.d.ts +7 -0
  28. package/dist/src/__tests__/modules.test.js +333 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  30. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  31. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  32. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  33. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  34. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  35. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  36. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  37. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  38. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  39. package/dist/src/__tests__/option.test.d.ts +14 -0
  40. package/dist/src/__tests__/option.test.js +275 -0
  41. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  42. package/dist/src/__tests__/schedule.test.js +98 -0
  43. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  44. package/dist/src/__tests__/sourcemap.test.js +227 -0
  45. package/dist/src/__tests__/stdlib-include.test.js +86 -0
  46. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  47. package/dist/src/__tests__/tuple.test.js +202 -0
  48. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  49. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  50. package/dist/src/ast/types.d.ts +56 -2
  51. package/dist/src/cache/deps.d.ts +41 -0
  52. package/dist/src/cache/deps.js +158 -0
  53. package/dist/src/cache/incremental.d.ts +35 -0
  54. package/dist/src/cache/incremental.js +165 -0
  55. package/dist/src/cache/index.d.ts +37 -0
  56. package/dist/src/cache/index.js +152 -0
  57. package/dist/src/cli.js +83 -45
  58. package/dist/src/compile.d.ts +3 -2
  59. package/dist/src/compile.js +34 -11
  60. package/dist/src/diagnostics/index.d.ts +1 -1
  61. package/dist/src/diagnostics/index.js +8 -11
  62. package/dist/src/emit/compile.d.ts +31 -0
  63. package/dist/src/emit/compile.js +143 -0
  64. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  65. package/dist/{src2 → src}/emit/index.js +59 -8
  66. package/dist/src/emit/modules.d.ts +29 -0
  67. package/dist/src/emit/modules.js +492 -0
  68. package/dist/src/emit/sourcemap.d.ts +53 -0
  69. package/dist/src/emit/sourcemap.js +73 -0
  70. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  71. package/dist/{src2 → src}/hir/lower.js +22 -1
  72. package/dist/src/hir/monomorphize.d.ts +22 -0
  73. package/dist/src/hir/monomorphize.js +379 -0
  74. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  75. package/dist/src/index.d.ts +19 -2
  76. package/dist/src/index.js +36 -14
  77. package/dist/src/lexer/index.d.ts +1 -1
  78. package/dist/src/lexer/index.js +1 -0
  79. package/dist/src/lir/budget.d.ts +37 -0
  80. package/dist/src/lir/budget.js +280 -0
  81. package/dist/{src2 → src}/lir/lower.js +19 -0
  82. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  83. package/dist/src/lsp/main.d.ts +8 -0
  84. package/dist/src/lsp/main.js +11 -0
  85. package/dist/src/lsp/server.d.ts +11 -0
  86. package/dist/src/lsp/server.js +403 -0
  87. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  88. package/dist/{src2 → src}/mir/lower.js +244 -10
  89. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  90. package/dist/src/optimizer/coroutine.d.ts +34 -0
  91. package/dist/src/optimizer/coroutine.js +789 -0
  92. package/dist/src/optimizer/dce.d.ts +8 -34
  93. package/dist/src/optimizer/dce.js +146 -629
  94. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  95. package/dist/src/optimizer/interprocedural.js +186 -0
  96. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  97. package/dist/src/optimizer/lir/const_imm.js +139 -0
  98. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  99. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  100. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  101. package/dist/src/optimizer/lir/peephole.js +52 -0
  102. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  103. package/dist/src/optimizer/lir/pipeline.js +34 -0
  104. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  105. package/dist/src/optimizer/nbt-batch.js +51 -0
  106. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  107. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  108. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  109. package/dist/src/optimizer/selector-cache.js +100 -0
  110. package/dist/src/optimizer/unroll.d.ts +32 -0
  111. package/dist/src/optimizer/unroll.js +348 -0
  112. package/dist/src/parser/index.d.ts +8 -0
  113. package/dist/src/parser/index.js +204 -14
  114. package/dist/src/repl.d.ts +1 -1
  115. package/dist/src/typechecker/index.d.ts +4 -0
  116. package/dist/src/typechecker/index.js +198 -13
  117. package/dist/src/types/mc-version.d.ts +24 -0
  118. package/dist/src/types/mc-version.js +49 -0
  119. package/docs/ROADMAP.md +395 -0
  120. package/docs/compiler-pipeline-redesign.md +27 -10
  121. package/editors/vscode/out/extension.js +25176 -8000
  122. package/editors/vscode/package-lock.json +90 -6
  123. package/editors/vscode/package.json +3 -2
  124. package/editors/vscode/src/extension.ts +97 -67
  125. package/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
  126. package/examples/coroutine-demo.mcrs +50 -0
  127. package/examples/enum-demo.mcrs +95 -0
  128. package/examples/scheduler-demo.mcrs +59 -0
  129. package/examples/showcase.mcrs +3 -3
  130. package/jest.config.js +1 -1
  131. package/package.json +9 -3
  132. package/src/__tests__/budget.test.ts +297 -0
  133. package/src/__tests__/diagnostics.test.ts +2 -3
  134. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  135. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  136. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  137. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  138. package/src/__tests__/enum.test.ts +425 -0
  139. package/src/__tests__/generics.test.ts +390 -0
  140. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  141. package/src/__tests__/incremental.test.ts +337 -0
  142. package/src/__tests__/lsp.test.ts +359 -0
  143. package/src/__tests__/mc-syntax.test.ts +1 -7
  144. package/src/__tests__/mc-version.test.ts +178 -0
  145. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  146. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  147. package/src/__tests__/modules.test.ts +365 -0
  148. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  149. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  150. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  151. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  152. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  153. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  154. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  155. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  156. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  157. package/src/__tests__/option.test.ts +299 -0
  158. package/src/__tests__/schedule.test.ts +105 -0
  159. package/src/__tests__/sourcemap.test.ts +254 -0
  160. package/src/__tests__/stdlib-include.test.ts +61 -0
  161. package/src/__tests__/tuple.test.ts +220 -0
  162. package/src/__tests__/typechecker-strict.test.ts +216 -0
  163. package/src/ast/types.ts +33 -2
  164. package/src/cache/deps.ts +132 -0
  165. package/src/cache/incremental.ts +173 -0
  166. package/src/cache/index.ts +135 -0
  167. package/src/cli.ts +96 -45
  168. package/src/compile.ts +46 -17
  169. package/src/diagnostics/index.ts +8 -11
  170. package/src/emit/compile.ts +179 -0
  171. package/{src2 → src}/emit/index.ts +72 -8
  172. package/src/emit/modules.ts +581 -0
  173. package/src/emit/sourcemap.ts +101 -0
  174. package/{src2 → src}/hir/lower.ts +29 -2
  175. package/src/hir/monomorphize.ts +416 -0
  176. package/{src2 → src}/hir/types.ts +15 -3
  177. package/src/index.ts +29 -10
  178. package/src/lexer/index.ts +2 -1
  179. package/src/lir/budget.ts +321 -0
  180. package/{src2 → src}/lir/lower.ts +32 -1
  181. package/{src2 → src}/lir/types.ts +7 -3
  182. package/src/lsp/main.ts +9 -0
  183. package/src/lsp/server.ts +469 -0
  184. package/{src2 → src}/mir/lower.ts +251 -8
  185. package/{src2 → src}/mir/types.ts +12 -1
  186. package/src/optimizer/coroutine.ts +996 -0
  187. package/{src2 → src}/optimizer/dce.ts +2 -1
  188. package/src/optimizer/interprocedural.ts +177 -0
  189. package/src/optimizer/lir/const_imm.ts +143 -0
  190. package/src/optimizer/lir/dead_slot.ts +123 -0
  191. package/src/optimizer/lir/peephole.ts +57 -0
  192. package/src/optimizer/lir/pipeline.ts +37 -0
  193. package/src/optimizer/nbt-batch.ts +50 -0
  194. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  195. package/src/optimizer/selector-cache.ts +103 -0
  196. package/src/optimizer/unroll.ts +386 -0
  197. package/src/parser/index.ts +212 -15
  198. package/src/repl.ts +1 -1
  199. package/src/stdlib/math.mcrs +4 -4
  200. package/src/templates/quest.mcrs +4 -4
  201. package/src/typechecker/index.ts +215 -15
  202. package/src/types/mc-version.ts +46 -0
  203. package/tsconfig.json +1 -1
  204. package/.claude/commands/build-test.md +0 -10
  205. package/.claude/commands/deploy-demo.md +0 -12
  206. package/.claude/commands/stage-status.md +0 -13
  207. package/.claude/settings.json +0 -12
  208. package/CLAUDE.md +0 -231
  209. package/dist/__tests__/cli.test.js +0 -278
  210. package/dist/__tests__/codegen.test.js +0 -152
  211. package/dist/__tests__/compile-all.test.d.ts +0 -10
  212. package/dist/__tests__/compile-all.test.js +0 -108
  213. package/dist/__tests__/dce.test.js +0 -138
  214. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  215. package/dist/__tests__/diagnostics.test.js +0 -149
  216. package/dist/__tests__/e2e.test.d.ts +0 -6
  217. package/dist/__tests__/e2e.test.js +0 -1847
  218. package/dist/__tests__/entity-types.test.js +0 -203
  219. package/dist/__tests__/formatter.test.js +0 -40
  220. package/dist/__tests__/lexer.test.js +0 -343
  221. package/dist/__tests__/lowering.test.js +0 -1015
  222. package/dist/__tests__/macro.test.d.ts +0 -8
  223. package/dist/__tests__/macro.test.js +0 -305
  224. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  225. package/dist/__tests__/mc-integration.test.js +0 -819
  226. package/dist/__tests__/mc-syntax.test.js +0 -124
  227. package/dist/__tests__/nbt.test.js +0 -82
  228. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  229. package/dist/__tests__/optimizer.test.js +0 -149
  230. package/dist/__tests__/parser.test.d.ts +0 -1
  231. package/dist/__tests__/parser.test.js +0 -807
  232. package/dist/__tests__/repl.test.d.ts +0 -1
  233. package/dist/__tests__/repl.test.js +0 -27
  234. package/dist/__tests__/runtime.test.d.ts +0 -1
  235. package/dist/__tests__/runtime.test.js +0 -289
  236. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  237. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  238. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  239. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  240. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  241. package/dist/__tests__/stdlib-math.test.js +0 -352
  242. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  243. package/dist/__tests__/stdlib-vec.test.js +0 -264
  244. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  245. package/dist/__tests__/structure-optimizer.test.js +0 -33
  246. package/dist/__tests__/typechecker.test.d.ts +0 -1
  247. package/dist/__tests__/typechecker.test.js +0 -552
  248. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  249. package/dist/__tests__/var-allocator.test.js +0 -69
  250. package/dist/ast/types.d.ts +0 -514
  251. package/dist/ast/types.js +0 -9
  252. package/dist/builtins/metadata.d.ts +0 -36
  253. package/dist/builtins/metadata.js +0 -1014
  254. package/dist/cli.d.ts +0 -11
  255. package/dist/codegen/cmdblock/index.d.ts +0 -26
  256. package/dist/codegen/cmdblock/index.js +0 -45
  257. package/dist/codegen/mcfunction/index.d.ts +0 -40
  258. package/dist/codegen/mcfunction/index.js +0 -606
  259. package/dist/codegen/structure/index.d.ts +0 -24
  260. package/dist/codegen/structure/index.js +0 -279
  261. package/dist/codegen/var-allocator.d.ts +0 -45
  262. package/dist/codegen/var-allocator.js +0 -104
  263. package/dist/compile.d.ts +0 -68
  264. package/dist/data/arena/function/__load.mcfunction +0 -6
  265. package/dist/data/arena/function/__tick.mcfunction +0 -2
  266. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  267. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  268. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  269. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  270. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  271. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  272. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  273. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  274. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  275. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  276. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  277. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  278. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  279. package/dist/data/counter/function/__load.mcfunction +0 -5
  280. package/dist/data/counter/function/__tick.mcfunction +0 -2
  281. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  282. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  283. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  284. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  285. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  286. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  287. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  288. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  289. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  290. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  291. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  292. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  293. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  294. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  295. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  296. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  297. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  298. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  299. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  300. package/dist/data/gcd3/function/test.mcfunction +0 -7
  301. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  302. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  303. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  304. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  305. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  306. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  307. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  308. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  309. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  310. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  311. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  312. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  313. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  314. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  315. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  316. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  317. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  318. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  319. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  320. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  321. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  322. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  323. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  324. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  325. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  326. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  327. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  328. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  329. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  330. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  331. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  332. package/dist/data/mathtest/function/test.mcfunction +0 -5
  333. package/dist/data/minecraft/tags/function/load.json +0 -5
  334. package/dist/data/minecraft/tags/function/tick.json +0 -5
  335. package/dist/data/mypack/function/__load.mcfunction +0 -13
  336. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  337. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  338. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  339. package/dist/data/mypack/function/abs.mcfunction +0 -6
  340. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  341. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  342. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  343. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  346. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  347. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  348. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  352. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  353. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  354. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  357. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  358. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  359. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  360. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  361. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  365. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  366. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  367. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  368. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  369. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  370. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  371. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  372. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  373. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  374. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  375. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  376. package/dist/data/quiz/function/__load.mcfunction +0 -16
  377. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  378. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  379. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  380. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  381. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  382. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  383. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  384. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  386. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  387. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  388. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  389. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  390. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  391. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  392. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  393. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  394. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  395. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  396. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  397. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  398. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  399. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  400. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  402. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  403. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  404. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  405. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  406. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  407. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  408. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  409. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  410. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  411. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  412. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  413. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  414. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  415. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  416. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  417. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  418. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  419. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  420. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  421. package/dist/data/runtime/function/__load.mcfunction +0 -5
  422. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  423. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  424. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  425. package/dist/data/shop/function/__load.mcfunction +0 -7
  426. package/dist/data/shop/function/__tick.mcfunction +0 -3
  427. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  429. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  430. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  431. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  432. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  433. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  434. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  435. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  436. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  437. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  438. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  439. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  440. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  441. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  442. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  443. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  444. package/dist/data/turret/function/__load.mcfunction +0 -5
  445. package/dist/data/turret/function/__tick.mcfunction +0 -4
  446. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  447. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  448. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  449. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  450. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  451. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  452. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  453. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  454. package/dist/diagnostics/index.d.ts +0 -44
  455. package/dist/diagnostics/index.js +0 -140
  456. package/dist/events/types.d.ts +0 -35
  457. package/dist/events/types.js +0 -59
  458. package/dist/formatter/index.d.ts +0 -1
  459. package/dist/formatter/index.js +0 -26
  460. package/dist/gcd2.map.json +0 -15
  461. package/dist/gcd3.map.json +0 -17
  462. package/dist/gcd_test.map.json +0 -15
  463. package/dist/index.d.ts +0 -62
  464. package/dist/ir/builder.d.ts +0 -33
  465. package/dist/ir/builder.js +0 -99
  466. package/dist/ir/types.d.ts +0 -132
  467. package/dist/ir/types.js +0 -15
  468. package/dist/isqrttest.map.json +0 -15
  469. package/dist/lexer/index.d.ts +0 -37
  470. package/dist/lexer/index.js +0 -569
  471. package/dist/lowering/index.d.ts +0 -188
  472. package/dist/lowering/index.js +0 -3405
  473. package/dist/mathtest.map.json +0 -6
  474. package/dist/mc-test/client.d.ts +0 -128
  475. package/dist/mc-test/client.js +0 -174
  476. package/dist/mc-test/runner.d.ts +0 -28
  477. package/dist/mc-test/runner.js +0 -150
  478. package/dist/mc-test/setup.d.ts +0 -11
  479. package/dist/mc-test/setup.js +0 -98
  480. package/dist/mc-validator/index.d.ts +0 -17
  481. package/dist/mc-validator/index.js +0 -322
  482. package/dist/mypack.map.json +0 -27
  483. package/dist/nbt/index.d.ts +0 -86
  484. package/dist/nbt/index.js +0 -250
  485. package/dist/optimizer/commands.d.ts +0 -38
  486. package/dist/optimizer/commands.js +0 -451
  487. package/dist/optimizer/dce.d.ts +0 -34
  488. package/dist/optimizer/dce.js +0 -639
  489. package/dist/optimizer/passes.d.ts +0 -34
  490. package/dist/optimizer/passes.js +0 -243
  491. package/dist/optimizer/structure.d.ts +0 -9
  492. package/dist/optimizer/structure.js +0 -356
  493. package/dist/pack.mcmeta +0 -6
  494. package/dist/parser/index.d.ts +0 -93
  495. package/dist/parser/index.js +0 -1687
  496. package/dist/repl.d.ts +0 -16
  497. package/dist/repl.js +0 -165
  498. package/dist/reqtest.map.json +0 -4
  499. package/dist/reqtest2.map.json +0 -4
  500. package/dist/runtime/index.d.ts +0 -107
  501. package/dist/runtime/index.js +0 -1409
  502. package/dist/runtime.map.json +0 -7
  503. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  504. package/dist/src/__tests__/codegen.test.js +0 -152
  505. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  506. package/dist/src/__tests__/e2e.test.js +0 -1789
  507. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  508. package/dist/src/__tests__/entity-types.test.js +0 -203
  509. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  510. package/dist/src/__tests__/lowering.test.js +0 -1015
  511. package/dist/src/__tests__/macro.test.d.ts +0 -8
  512. package/dist/src/__tests__/macro.test.js +0 -306
  513. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  514. package/dist/src/__tests__/nbt.test.js +0 -82
  515. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  516. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  517. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  518. package/dist/src/__tests__/optimizer.test.js +0 -149
  519. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  520. package/dist/src/__tests__/runtime.test.js +0 -289
  521. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  522. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  523. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  524. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  525. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  526. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  527. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  528. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  529. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  530. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  531. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  532. package/dist/src/__tests__/var-allocator.test.js +0 -69
  533. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  534. package/dist/src/codegen/cmdblock/index.js +0 -45
  535. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  536. package/dist/src/codegen/mcfunction/index.js +0 -606
  537. package/dist/src/codegen/structure/index.d.ts +0 -24
  538. package/dist/src/codegen/structure/index.js +0 -279
  539. package/dist/src/codegen/var-allocator.d.ts +0 -45
  540. package/dist/src/codegen/var-allocator.js +0 -104
  541. package/dist/src/ir/builder.d.ts +0 -33
  542. package/dist/src/ir/builder.js +0 -99
  543. package/dist/src/ir/types.d.ts +0 -132
  544. package/dist/src/ir/types.js +0 -15
  545. package/dist/src/lowering/index.d.ts +0 -188
  546. package/dist/src/lowering/index.js +0 -3405
  547. package/dist/src/optimizer/commands.d.ts +0 -38
  548. package/dist/src/optimizer/commands.js +0 -451
  549. package/dist/src/optimizer/passes.d.ts +0 -34
  550. package/dist/src/optimizer/passes.js +0 -243
  551. package/dist/src/optimizer/structure.d.ts +0 -9
  552. package/dist/src/optimizer/structure.js +0 -356
  553. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  554. package/dist/src2/emit/compile.d.ts +0 -19
  555. package/dist/src2/emit/compile.js +0 -80
  556. package/dist/src2/optimizer/dce.d.ts +0 -8
  557. package/dist/src2/optimizer/dce.js +0 -155
  558. package/dist/swap_test.map.json +0 -14
  559. package/dist/tsconfig.tsbuildinfo +0 -1
  560. package/dist/typechecker/index.d.ts +0 -61
  561. package/dist/typechecker/index.js +0 -1034
  562. package/dist/types/entity-hierarchy.d.ts +0 -29
  563. package/dist/types/entity-hierarchy.js +0 -107
  564. package/examples/spiral.mcrs +0 -43
  565. package/src/examples/arena.mcrs +0 -44
  566. package/src/examples/counter.mcrs +0 -12
  567. package/src/examples/new_features_demo.mcrs +0 -193
  568. package/src/examples/rpg.mcrs +0 -13
  569. package/src/examples/stdlib_demo.mcrs +0 -181
  570. package/src2/emit/compile.ts +0 -99
  571. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  572. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  576. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  578. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  579. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  580. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  581. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  582. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  583. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  584. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  585. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  586. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  587. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  588. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  589. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  590. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  592. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  593. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  594. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  595. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  596. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  597. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  598. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  599. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  600. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  601. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  602. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  603. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  604. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  605. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  606. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  607. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
  608. /package/dist/{src2 → src}/hir/types.js +0 -0
  609. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  610. /package/dist/{src2 → src}/lir/types.js +0 -0
  611. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  612. /package/dist/{src2 → src}/lir/verify.js +0 -0
  613. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  614. /package/dist/{src2 → src}/mir/macro.js +0 -0
  615. /package/dist/{src2 → src}/mir/types.js +0 -0
  616. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  617. /package/dist/{src2 → src}/mir/verify.js +0 -0
  618. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  619. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  620. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  621. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  622. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  623. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  624. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  625. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  626. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  627. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  628. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  629. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  630. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  631. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  632. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  633. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  634. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  635. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  636. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  637. /package/{src2 → src}/lir/verify.ts +0 -0
  638. /package/{src2 → src}/mir/macro.ts +0 -0
  639. /package/{src2 → src}/mir/verify.ts +0 -0
  640. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  641. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  642. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  643. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -1,819 +0,0 @@
1
- "use strict";
2
- /**
3
- * RedScript MC Integration Tests
4
- *
5
- * Tests compiled datapacks against a real Paper 1.21.4 server.
6
- *
7
- * Prerequisites:
8
- * - Paper server running with TestHarnessPlugin on port 25561
9
- * - MC_SERVER_DIR env var pointing to server directory
10
- *
11
- * Run: MC_SERVER_DIR=~/mc-test-server npx jest mc-integration --testTimeout=120000
12
- */
13
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- var desc = Object.getOwnPropertyDescriptor(m, k);
16
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
- desc = { enumerable: true, get: function() { return m[k]; } };
18
- }
19
- Object.defineProperty(o, k2, desc);
20
- }) : (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- o[k2] = m[k];
23
- }));
24
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
- Object.defineProperty(o, "default", { enumerable: true, value: v });
26
- }) : function(o, v) {
27
- o["default"] = v;
28
- });
29
- var __importStar = (this && this.__importStar) || (function () {
30
- var ownKeys = function(o) {
31
- ownKeys = Object.getOwnPropertyNames || function (o) {
32
- var ar = [];
33
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
- return ar;
35
- };
36
- return ownKeys(o);
37
- };
38
- return function (mod) {
39
- if (mod && mod.__esModule) return mod;
40
- var result = {};
41
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
- __setModuleDefault(result, mod);
43
- return result;
44
- };
45
- })();
46
- Object.defineProperty(exports, "__esModule", { value: true });
47
- const fs = __importStar(require("fs"));
48
- const path = __importStar(require("path"));
49
- const compile_1 = require("../compile");
50
- const client_1 = require("../mc-test/client");
51
- const MC_HOST = process.env.MC_HOST ?? 'localhost';
52
- const MC_PORT = parseInt(process.env.MC_PORT ?? '25561');
53
- const MC_SERVER_DIR = process.env.MC_SERVER_DIR ?? path.join(process.env.HOME, 'mc-test-server');
54
- const DATAPACK_DIR = path.join(MC_SERVER_DIR, 'world', 'datapacks', 'redscript-test');
55
- const FIXTURE_DIR = path.join(__dirname, 'fixtures');
56
- let serverOnline = false;
57
- let mc;
58
- /** Write compiled RedScript source into the shared test datapack directory.
59
- * Merges minecraft tag files (tick.json / load.json) instead of overwriting. */
60
- function writeFixture(source, namespace) {
61
- fs.mkdirSync(DATAPACK_DIR, { recursive: true });
62
- // Write pack.mcmeta once
63
- if (!fs.existsSync(path.join(DATAPACK_DIR, 'pack.mcmeta'))) {
64
- fs.writeFileSync(path.join(DATAPACK_DIR, 'pack.mcmeta'), JSON.stringify({
65
- pack: { pack_format: 48, description: 'RedScript integration tests' }
66
- }));
67
- }
68
- const result = (0, compile_1.compile)(source, { namespace });
69
- if (result.error)
70
- throw new Error(`Compile error in ${namespace}: ${result.error}`);
71
- for (const file of result.files ?? []) {
72
- if (file.path === 'pack.mcmeta')
73
- continue;
74
- const filePath = path.join(DATAPACK_DIR, file.path);
75
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
76
- // Merge minecraft tag files (tick.json, load.json) instead of overwriting
77
- if (file.path.includes('data/minecraft/tags/') && fs.existsSync(filePath)) {
78
- const existing = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
79
- const incoming = JSON.parse(file.content);
80
- const merged = { values: [...new Set([...(existing.values ?? []), ...(incoming.values ?? [])])] };
81
- fs.writeFileSync(filePath, JSON.stringify(merged, null, 2));
82
- }
83
- else {
84
- fs.writeFileSync(filePath, file.content);
85
- }
86
- }
87
- }
88
- function writeFixtureFile(fileName, namespace) {
89
- writeFixture(fs.readFileSync(path.join(FIXTURE_DIR, fileName), 'utf-8'), namespace);
90
- }
91
- async function waitForServer(client, timeoutMs = 30000) {
92
- const deadline = Date.now() + timeoutMs;
93
- while (Date.now() < deadline) {
94
- if (await client.isOnline()) {
95
- return true;
96
- }
97
- await new Promise(resolve => setTimeout(resolve, 1000));
98
- }
99
- return false;
100
- }
101
- beforeAll(async () => {
102
- mc = new client_1.MCTestClient(MC_HOST, MC_PORT);
103
- serverOnline = await waitForServer(mc);
104
- if (!serverOnline) {
105
- console.warn(`⚠ MC server not running at ${MC_HOST}:${MC_PORT} — skipping integration tests`);
106
- console.warn(` Run: MC_SERVER_DIR=~/mc-test-server npx ts-node src/mc-test/setup.ts`);
107
- console.warn(` Then restart the MC server and re-run tests.`);
108
- return;
109
- }
110
- // ── Write fixtures + use safe reloadData (no /reload confirm) ───────
111
- // counter.mcrs
112
- if (fs.existsSync(path.join(__dirname, '../examples/counter.mcrs'))) {
113
- writeFixture(fs.readFileSync(path.join(__dirname, '../examples/counter.mcrs'), 'utf-8'), 'counter');
114
- }
115
- if (fs.existsSync(path.join(__dirname, '../examples/world_manager.mcrs'))) {
116
- writeFixture(fs.readFileSync(path.join(__dirname, '../examples/world_manager.mcrs'), 'utf-8'), 'world_manager');
117
- }
118
- writeFixture(`
119
- @tick
120
- fn on_tick() {
121
- scoreboard_set("#tick_counter", #ticks, scoreboard_get("#tick_counter", #ticks) + 1);
122
- }
123
- `, 'tick_test');
124
- writeFixture(`
125
- fn check_score() {
126
- let x: int = scoreboard_get("#check_x", #test_score);
127
- if (x > 5) {
128
- scoreboard_set("#check_x", #result, 1);
129
- } else {
130
- scoreboard_set("#check_x", #result, 0);
131
- }
132
- }
133
- `, 'inline_test');
134
- // ── E2E scenario fixtures ────────────────────────────────────────────
135
- // Scenario A: mini game loop (timer countdown + ended flag)
136
- writeFixture(`
137
- @tick
138
- fn game_tick() {
139
- let time: int = scoreboard_get("#game", #timer);
140
- if (time > 0) {
141
- scoreboard_set("#game", #timer, time - 1);
142
- }
143
- if (time == 1) {
144
- scoreboard_set("#game", #ended, 1);
145
- }
146
- }
147
- fn start_game() {
148
- scoreboard_set("#game", #timer, 5);
149
- scoreboard_set("#game", #ended, 0);
150
- }
151
- `, 'game_loop');
152
- // Scenario B: two functions, same temp var namespace — verify no collision
153
- writeFixture(`
154
- fn calc_sum() {
155
- let a: int = scoreboard_get("#math", #val_a);
156
- let b: int = scoreboard_get("#math", #val_b);
157
- scoreboard_set("#math", #sum, a + b);
158
- }
159
- fn calc_product() {
160
- let x: int = scoreboard_get("#math", #val_x);
161
- let y: int = scoreboard_get("#math", #val_y);
162
- scoreboard_set("#math", #product, x * y);
163
- }
164
- fn run_both() {
165
- calc_sum();
166
- calc_product();
167
- }
168
- `, 'math_test');
169
- // Scenario C: 3-deep call chain, each step modifies shared state
170
- writeFixture(`
171
- fn step3() {
172
- let v: int = scoreboard_get("#chain", #val);
173
- scoreboard_set("#chain", #val, v * 2);
174
- }
175
- fn step2() {
176
- let v: int = scoreboard_get("#chain", #val);
177
- scoreboard_set("#chain", #val, v + 5);
178
- step3();
179
- }
180
- fn step1() {
181
- scoreboard_set("#chain", #val, 10);
182
- step2();
183
- }
184
- `, 'call_chain');
185
- // Scenario D: setblock batching optimizer — 4 adjacent setblocks → fill
186
- writeFixture(`
187
- fn build_row() {
188
- setblock((0, 70, 0), "minecraft:stone");
189
- setblock((1, 70, 0), "minecraft:stone");
190
- setblock((2, 70, 0), "minecraft:stone");
191
- setblock((3, 70, 0), "minecraft:stone");
192
- }
193
- `, 'fill_test');
194
- // Scenario E: for-range loop — loop counter increments exactly N times
195
- writeFixture(`
196
- fn count_to_five() {
197
- scoreboard_set("#range", #counter, 0);
198
- for i in 0..5 {
199
- let c: int = scoreboard_get("#range", #counter);
200
- scoreboard_set("#range", #counter, c + 1);
201
- }
202
- }
203
- `, 'range_test');
204
- // Scenario F: function call with return value — verifies $ret propagation
205
- writeFixture(`
206
- fn triple(x: int) -> int {
207
- return x * 3;
208
- }
209
- fn run_nested() {
210
- let a: int = triple(4);
211
- scoreboard_set("#nested", #result, a);
212
- }
213
- `, 'nested_test');
214
- // Scenario G: match statement dispatches to correct branch
215
- writeFixture(`
216
- fn classify(x: int) {
217
- match (x) {
218
- 1 => { scoreboard_set("#match", #out, 10); }
219
- 2 => { scoreboard_set("#match", #out, 20); }
220
- 3 => { scoreboard_set("#match", #out, 30); }
221
- _ => { scoreboard_set("#match", #out, -1); }
222
- }
223
- }
224
- `, 'match_test');
225
- // Scenario H: while loop counts down
226
- writeFixture(`
227
- fn countdown() {
228
- scoreboard_set("#wloop", #i, 10);
229
- scoreboard_set("#wloop", #steps, 0);
230
- let i: int = scoreboard_get("#wloop", #i);
231
- while (i > 0) {
232
- let s: int = scoreboard_get("#wloop", #steps);
233
- scoreboard_set("#wloop", #steps, s + 1);
234
- i = i - 1;
235
- scoreboard_set("#wloop", #i, i);
236
- }
237
- }
238
- `, 'while_test');
239
- // Scenario I: multiple if/else branches (boundary test)
240
- writeFixture(`
241
- fn classify_score() {
242
- let x: int = scoreboard_get("#boundary", #input);
243
- if (x > 100) {
244
- scoreboard_set("#boundary", #tier, 3);
245
- } else {
246
- if (x > 50) {
247
- scoreboard_set("#boundary", #tier, 2);
248
- } else {
249
- if (x > 0) {
250
- scoreboard_set("#boundary", #tier, 1);
251
- } else {
252
- scoreboard_set("#boundary", #tier, 0);
253
- }
254
- }
255
- }
256
- }
257
- `, 'boundary_test');
258
- // Scenario J: entity management — summon via raw commands
259
- writeFixture(`
260
- fn tag_entities() {
261
- raw("summon minecraft:armor_stand 10 65 10");
262
- raw("summon minecraft:armor_stand 11 65 10");
263
- raw("summon minecraft:armor_stand 12 65 10");
264
- }
265
- `, 'tag_test');
266
- // Scenario K: mixed arithmetic — order of operations
267
- writeFixture(`
268
- fn math_order() {
269
- let a: int = 2;
270
- let b: int = 3;
271
- let c: int = 4;
272
- scoreboard_set("#order", #r1, a + b * c);
273
- scoreboard_set("#order", #r2, (a + b) * c);
274
- let d: int = 100;
275
- let e: int = d / 3;
276
- scoreboard_set("#order", #r3, e);
277
- }
278
- `, 'order_test');
279
- // Scenario L: scoreboard read-modify-write chain
280
- writeFixture(`
281
- fn chain_rmw() {
282
- scoreboard_set("#rmw", #v, 1);
283
- let v: int = scoreboard_get("#rmw", #v);
284
- scoreboard_set("#rmw", #v, v * 2);
285
- v = scoreboard_get("#rmw", #v);
286
- scoreboard_set("#rmw", #v, v * 2);
287
- v = scoreboard_get("#rmw", #v);
288
- scoreboard_set("#rmw", #v, v * 2);
289
- }
290
- `, 'rmw_test');
291
- writeFixtureFile('impl-test.mcrs', 'impl_test');
292
- writeFixtureFile('timeout-test.mcrs', 'timeout_test');
293
- writeFixtureFile('interval-test.mcrs', 'interval_test');
294
- writeFixtureFile('is-check-test.mcrs', 'is_check_test');
295
- writeFixtureFile('event-test.mcrs', 'event_test');
296
- // ── Full reset + safe data reload ────────────────────────────────────
297
- await mc.fullReset();
298
- // Pre-create scoreboards
299
- for (const obj of ['ticks', 'seconds', 'test_score', 'result', 'calc', 'rs',
300
- 'timer', 'ended', 'val_a', 'val_b', 'sum', 'val_x', 'val_y', 'product', 'val',
301
- 'counter', 'out', 'i', 'steps', 'input', 'tier', 'r1', 'r2', 'r3', 'v',
302
- 'done', 'fired', 'players', 'zombies']) {
303
- await mc.command(`/scoreboard objectives add ${obj} dummy`).catch(() => { });
304
- }
305
- await mc.command('/scoreboard players set counter ticks 0');
306
- await mc.command('/scoreboard players set #tick_counter ticks 0');
307
- await mc.command('/scoreboard players set #check_x test_score 10');
308
- await mc.command('/scoreboard players set #check_x result 99');
309
- // Safe reload (Bukkit.reloadData — only datapacks, no plugin restart)
310
- console.log(' Reloading datapacks (safe reloadData)...');
311
- await mc.reload();
312
- await new Promise(r => setTimeout(r, 5000)); // wall-clock wait for data reload
313
- // Initialize __load functions
314
- await mc.command('/function counter:__load').catch(() => { });
315
- await mc.command('/function inline_test:__load').catch(() => { });
316
- await mc.ticks(20);
317
- console.log(' Setup complete.');
318
- }, 60000);
319
- describe('MC Integration Tests', () => {
320
- // ─── Test 1: Server connectivity ─────────────────────────────────────
321
- test('server is online and healthy', async () => {
322
- if (!serverOnline)
323
- return;
324
- const status = await mc.status();
325
- expect(status.online).toBe(true);
326
- expect(status.tps_1m).toBeGreaterThan(10); // Allow recovery after reload
327
- console.log(` Server: ${status.version}, TPS: ${status.tps_1m.toFixed(1)}`);
328
- });
329
- // ─── Test 2: Counter tick ─────────────────────────────────────────────
330
- test('counter.mcrs: tick function increments scoreboard over time', async () => {
331
- if (!serverOnline)
332
- return;
333
- await mc.ticks(40); // Wait 2s (counter was already init'd in beforeAll)
334
- const count = await mc.scoreboard('counter', 'ticks');
335
- expect(count).toBeGreaterThan(0);
336
- console.log(` counter/ticks after setup+40 ticks: ${count}`);
337
- });
338
- // ─── Test 3: setblock ────────────────────────────────────────────────
339
- test('world_manager.mcrs: setblock places correct block', async () => {
340
- if (!serverOnline)
341
- return;
342
- // Clear just the lobby area, keep other state
343
- await mc.fullReset({ x1: -10, y1: 60, z1: -10, x2: 15, y2: 80, z2: 15, resetScoreboards: false });
344
- await mc.command('/function world_manager:__load');
345
- await mc.command('/function world_manager:reset_lobby_platform');
346
- await mc.ticks(10);
347
- const block = await mc.block(4, 65, 4);
348
- expect(block.type).toBe('minecraft:gold_block');
349
- console.log(` Block at (4,65,4): ${block.type}`);
350
- });
351
- // ─── Test 4: fill ────────────────────────────────────────────────────
352
- test('world_manager.mcrs: fill creates smooth_stone floor', async () => {
353
- if (!serverOnline)
354
- return;
355
- // Runs after test 3, floor should still be there
356
- const block = await mc.block(4, 64, 4);
357
- expect(block.type).toBe('minecraft:smooth_stone');
358
- console.log(` Floor at (4,64,4): ${block.type}`);
359
- });
360
- // ─── Test 5: Scoreboard arithmetic ───────────────────────────────────
361
- test('scoreboard arithmetic works via commands', async () => {
362
- if (!serverOnline)
363
- return;
364
- await mc.command('/scoreboard players set TestA calc 10');
365
- await mc.command('/scoreboard players set TestB calc 25');
366
- await mc.command('/scoreboard players operation TestA calc += TestB calc');
367
- await mc.ticks(2);
368
- const result = await mc.scoreboard('TestA', 'calc');
369
- expect(result).toBe(35);
370
- console.log(` 10 + 25 = ${result}`);
371
- });
372
- // ─── Test 6: Scoreboard proxy for announce ────────────────────────────
373
- test('scoreboard proxy test (chat logging not supported for /say)', async () => {
374
- if (!serverOnline)
375
- return;
376
- await mc.command('/scoreboard objectives add announce_test dummy');
377
- await mc.command('/scoreboard players set announce_marker announce_test 42');
378
- await mc.ticks(2);
379
- const marker = await mc.scoreboard('announce_marker', 'announce_test');
380
- expect(marker).toBe(42);
381
- console.log(` Marker value: ${marker}`);
382
- });
383
- // ─── Test 7: if/else logic via inline script ──────────────────────────
384
- test('inline rs: if/else (x=10 > 5) sets result=1', async () => {
385
- if (!serverOnline)
386
- return;
387
- // #check_x test_score=10 was set in beforeAll, run check_score
388
- await mc.command('/function inline_test:check_score');
389
- await mc.ticks(5);
390
- const result = await mc.scoreboard('#check_x', 'result');
391
- expect(result).toBe(1);
392
- console.log(` if (10 > 5) → result: ${result}`);
393
- });
394
- // ─── Test 8: Entity counting ──────────────────────────────────────────
395
- test('entity query: armor_stands survive peaceful mode', async () => {
396
- if (!serverOnline)
397
- return;
398
- await mc.fullReset({ clearArea: false, killEntities: true, resetScoreboards: false });
399
- await mc.command('/summon minecraft:armor_stand 0 65 0');
400
- await mc.command('/summon minecraft:armor_stand 2 65 0');
401
- await mc.command('/summon minecraft:armor_stand 4 65 0');
402
- await mc.ticks(5);
403
- const stands = await mc.entities('@e[type=minecraft:armor_stand]');
404
- expect(stands.length).toBe(3);
405
- console.log(` Spawned 3 armor_stands, found: ${stands.length}`);
406
- await mc.command('/kill @e[type=minecraft:armor_stand]');
407
- });
408
- // ─── Test 9: @tick dispatcher runs every tick ─────────────────────────
409
- test('@tick: tick_test increments #tick_counter every tick', async () => {
410
- if (!serverOnline)
411
- return;
412
- // Reset counter
413
- await mc.command('/scoreboard players set #tick_counter ticks 0');
414
- await mc.ticks(40); // 2s
415
- const ticks = await mc.scoreboard('#tick_counter', 'ticks');
416
- expect(ticks).toBeGreaterThanOrEqual(10); // At least 10 of 40 ticks fired
417
- console.log(` #tick_counter after 40 ticks: ${ticks}`);
418
- });
419
- // ─── Test 10: fullReset clears blocks ─────────────────────────────────
420
- test('fullReset clears previously placed blocks', async () => {
421
- if (!serverOnline)
422
- return;
423
- await mc.command('/setblock 5 65 5 minecraft:diamond_block');
424
- await mc.ticks(2);
425
- let block = await mc.block(5, 65, 5);
426
- expect(block.type).toBe('minecraft:diamond_block');
427
- await mc.fullReset({ x1: 0, y1: 60, z1: 0, x2: 10, y2: 75, z2: 10, resetScoreboards: false });
428
- block = await mc.block(5, 65, 5);
429
- expect(block.type).toBe('minecraft:air');
430
- console.log(` Block after reset: ${block.type} ✓`);
431
- });
432
- });
433
- // ─── E2E Scenario Tests ───────────────────────────────────────────────────────
434
- describe('E2E Scenario Tests', () => {
435
- // Scenario A: Mini game loop
436
- // Verifies: @tick auto-runs, scoreboard read-modify-write, two if conditions
437
- // in the same function, timer countdown converges to ended=1
438
- test('A: game_loop timer countdown sets ended=1 after N ticks', async () => {
439
- if (!serverOnline)
440
- return;
441
- // game_tick is @tick - it runs every server tick automatically.
442
- // start_game sets timer=5, but game_tick may already decrement it by the
443
- // time we query. Use a large timer and just verify it reaches 0 eventually.
444
- await mc.command('/scoreboard players set #game timer 0');
445
- await mc.command('/scoreboard players set #game ended 0');
446
- await mc.ticks(2);
447
- await mc.command('/function game_loop:__load');
448
- await mc.command('/function game_loop:start_game'); // timer=5, ended=0
449
- // Wait 25 ticks — enough for 5 decrements + margin
450
- await mc.ticks(25);
451
- const ended = await mc.scoreboard('#game', 'ended');
452
- expect(ended).toBe(1);
453
- const finalTimer = await mc.scoreboard('#game', 'timer');
454
- expect(finalTimer).toBe(0);
455
- console.log(` timer hit 0 (final=${finalTimer}), ended=${ended} ✓`);
456
- });
457
- // Scenario B: No temp var collision between two functions called in sequence
458
- // Verifies: each function's temp vars are isolated per-call via globally unique names
459
- // If there's a bug, calc_product would see sum's leftover $t vars and produce wrong result
460
- test('B: calc_sum + calc_product called in sequence — no temp var collision', async () => {
461
- if (!serverOnline)
462
- return;
463
- await mc.command('/function math_test:__load');
464
- await mc.command('/scoreboard players set #math val_a 7');
465
- await mc.command('/scoreboard players set #math val_b 3');
466
- await mc.command('/scoreboard players set #math val_x 4');
467
- await mc.command('/scoreboard players set #math val_y 5');
468
- await mc.command('/function math_test:run_both'); // calc_sum() then calc_product()
469
- await mc.ticks(5);
470
- const sum = await mc.scoreboard('#math', 'sum');
471
- const product = await mc.scoreboard('#math', 'product');
472
- expect(sum).toBe(10); // 7 + 3
473
- expect(product).toBe(20); // 4 × 5
474
- console.log(` sum=${sum} (expect 10), product=${product} (expect 20) ✓`);
475
- });
476
- // Scenario C: 3-deep call chain, shared state threaded through
477
- // Verifies: function calls preserve scoreboard state across stack frames
478
- // step1: val=10 → step2: val=10+5=15 → step3: val=15×2=30
479
- test('C: 3-deep call chain preserves intermediate state (10→15→30)', async () => {
480
- if (!serverOnline)
481
- return;
482
- await mc.command('/function call_chain:__load');
483
- await mc.command('/scoreboard players set #chain val 0');
484
- await mc.command('/function call_chain:step1');
485
- await mc.ticks(5);
486
- const val = await mc.scoreboard('#chain', 'val');
487
- expect(val).toBe(30); // (10 + 5) * 2 = 30
488
- console.log(` call chain result: ${val} (expect 30) ✓`);
489
- });
490
- // Scenario D: Setblock batching optimizer — 4 adjacent setblocks compiled to fill
491
- // Verifies: optimizer's fill-batching pass produces correct MC behavior
492
- // (not just that the output says "fill", but that ALL 4 blocks are actually stone)
493
- test('D: fill optimizer — 4 adjacent setblocks all placed correctly', async () => {
494
- if (!serverOnline)
495
- return;
496
- await mc.fullReset({ x1: -5, y1: 65, z1: -5, x2: 10, y2: 75, z2: 10, resetScoreboards: false });
497
- await mc.command('/function fill_test:__load');
498
- await mc.command('/function fill_test:build_row');
499
- await mc.ticks(5);
500
- // All 4 blocks should be stone (optimizer batched into fill 0 70 0 3 70 0 stone)
501
- for (let x = 0; x <= 3; x++) {
502
- const block = await mc.block(x, 70, 0);
503
- expect(block.type).toBe('minecraft:stone');
504
- }
505
- // Neighbors should still be air (fill didn't overshoot)
506
- const before = await mc.block(-1, 70, 0);
507
- const after = await mc.block(4, 70, 0);
508
- expect(before.type).toBe('minecraft:air');
509
- expect(after.type).toBe('minecraft:air');
510
- console.log(` fill_test: blocks [0-3,70,0]=stone, [-1]/[4]=air ✓`);
511
- });
512
- // Scenario E: for-range loop executes body exactly N times
513
- // Verifies: for i in 0..5 increments counter 5 times
514
- test('E: for-range loop increments counter exactly 5 times', async () => {
515
- if (!serverOnline)
516
- return;
517
- await mc.command('/function range_test:__load');
518
- await mc.command('/function range_test:count_to_five');
519
- await mc.ticks(10);
520
- const counter = await mc.scoreboard('#range', 'counter');
521
- expect(counter).toBe(5);
522
- console.log(` for-range 0..5 → counter=${counter} (expect 5) ✓`);
523
- });
524
- // Scenario F: function return value propagation
525
- // Verifies: $ret from callee is correctly captured in caller's variable
526
- test('F: function return value — triple(4) = 12', async () => {
527
- if (!serverOnline)
528
- return;
529
- await mc.command('/function nested_test:__load');
530
- await mc.command('/function nested_test:run_nested');
531
- await mc.ticks(10);
532
- const result = await mc.scoreboard('#nested', 'result');
533
- expect(result).toBe(12); // triple(4) = 4*3 = 12
534
- console.log(` triple(4) = ${result} (expect 12) ✓`);
535
- });
536
- // Scenario G: match dispatches to correct branch
537
- // Verifies: match statement selects right arm for values 1, 2, 3, and default
538
- test('G: match statement dispatches to correct branch', async () => {
539
- if (!serverOnline)
540
- return;
541
- await mc.command('/function match_test:__load');
542
- // Test match on value 2
543
- await mc.command('/scoreboard players set $p0 rs 2');
544
- await mc.command('/function match_test:classify');
545
- await mc.ticks(5);
546
- let out = await mc.scoreboard('#match', 'out');
547
- expect(out).toBe(20);
548
- console.log(` match(2) → out=${out} (expect 20) ✓`);
549
- // Test match on value 3
550
- await mc.command('/scoreboard players set $p0 rs 3');
551
- await mc.command('/function match_test:classify');
552
- await mc.ticks(5);
553
- out = await mc.scoreboard('#match', 'out');
554
- expect(out).toBe(30);
555
- console.log(` match(3) → out=${out} (expect 30) ✓`);
556
- // Test default branch (value 99)
557
- await mc.command('/scoreboard players set $p0 rs 99');
558
- await mc.command('/function match_test:classify');
559
- await mc.ticks(5);
560
- out = await mc.scoreboard('#match', 'out');
561
- expect(out).toBe(-1);
562
- console.log(` match(99) → out=${out} (expect -1, default) ✓`);
563
- });
564
- // Scenario H: while loop counts down from 10 to 0
565
- // Verifies: while loop body executes correct number of iterations
566
- test('H: while loop counts down 10 steps', async () => {
567
- if (!serverOnline)
568
- return;
569
- await mc.command('/function while_test:__load');
570
- await mc.command('/function while_test:countdown');
571
- await mc.ticks(10);
572
- const i = await mc.scoreboard('#wloop', 'i');
573
- const steps = await mc.scoreboard('#wloop', 'steps');
574
- expect(i).toBe(0);
575
- expect(steps).toBe(10);
576
- console.log(` while countdown: i=${i} (expect 0), steps=${steps} (expect 10) ✓`);
577
- });
578
- // Scenario I: nested if/else boundary classification
579
- // Verifies: correct branch taken at boundaries (0, 50, 100)
580
- test('I: nested if/else boundary classification', async () => {
581
- if (!serverOnline)
582
- return;
583
- await mc.command('/function boundary_test:__load');
584
- // Test x=0 → tier 0
585
- await mc.command('/scoreboard players set #boundary input 0');
586
- await mc.command('/function boundary_test:classify_score');
587
- await mc.ticks(5);
588
- let tier = await mc.scoreboard('#boundary', 'tier');
589
- expect(tier).toBe(0);
590
- console.log(` classify(0) → tier=${tier} (expect 0) ✓`);
591
- // Test x=50 → tier 1 (> 0 but not > 50)
592
- await mc.command('/scoreboard players set #boundary input 50');
593
- await mc.command('/function boundary_test:classify_score');
594
- await mc.ticks(5);
595
- tier = await mc.scoreboard('#boundary', 'tier');
596
- expect(tier).toBe(1);
597
- console.log(` classify(50) → tier=${tier} (expect 1) ✓`);
598
- // Test x=51 → tier 2 (> 50 but not > 100)
599
- await mc.command('/scoreboard players set #boundary input 51');
600
- await mc.command('/function boundary_test:classify_score');
601
- await mc.ticks(5);
602
- tier = await mc.scoreboard('#boundary', 'tier');
603
- expect(tier).toBe(2);
604
- console.log(` classify(51) → tier=${tier} (expect 2) ✓`);
605
- // Test x=101 → tier 3
606
- await mc.command('/scoreboard players set #boundary input 101');
607
- await mc.command('/function boundary_test:classify_score');
608
- await mc.ticks(5);
609
- tier = await mc.scoreboard('#boundary', 'tier');
610
- expect(tier).toBe(3);
611
- console.log(` classify(101) → tier=${tier} (expect 3) ✓`);
612
- });
613
- // Scenario J: entity summon and query
614
- // Verifies: entities spawned via compiled function are queryable
615
- test('J: summon entities via compiled function', async () => {
616
- if (!serverOnline)
617
- return;
618
- await mc.command('/kill @e[type=minecraft:armor_stand]');
619
- await mc.ticks(2);
620
- await mc.command('/function tag_test:__load');
621
- await mc.command('/function tag_test:tag_entities');
622
- await mc.ticks(5);
623
- const stands = await mc.entities('@e[type=minecraft:armor_stand]');
624
- expect(stands.length).toBe(3);
625
- console.log(` Summoned 3 armor_stands via tag_test, found: ${stands.length} ✓`);
626
- await mc.command('/kill @e[type=minecraft:armor_stand]');
627
- });
628
- // Scenario K: arithmetic order of operations
629
- // Verifies: MC scoreboard arithmetic matches expected evaluation order
630
- test('K: arithmetic order of operations', async () => {
631
- if (!serverOnline)
632
- return;
633
- await mc.command('/function order_test:__load');
634
- await mc.command('/function order_test:math_order');
635
- await mc.ticks(10);
636
- const r1 = await mc.scoreboard('#order', 'r1');
637
- const r2 = await mc.scoreboard('#order', 'r2');
638
- const r3 = await mc.scoreboard('#order', 'r3');
639
- // a + b * c = 2 + 3*4 = 14 (if precedence respected) or (2+3)*4 = 20 (left-to-right)
640
- // MC scoreboard does left-to-right, so compiler may emit either depending on lowering
641
- // (a + b) * c = 5 * 4 = 20 (explicit parens)
642
- expect(r2).toBe(20); // This one is unambiguous
643
- // 100 / 3 = 33 (integer division)
644
- expect(r3).toBe(33);
645
- console.log(` r1=${r1}, r2=${r2} (expect 20), r3=${r3} (expect 33) ✓`);
646
- });
647
- // Scenario L: scoreboard read-modify-write chain (1 → 2 → 4 → 8)
648
- // Verifies: sequential RMW operations don't lose intermediate state
649
- test('L: scoreboard RMW chain — 1*2*2*2 = 8', async () => {
650
- if (!serverOnline)
651
- return;
652
- await mc.command('/function rmw_test:__load');
653
- await mc.command('/function rmw_test:chain_rmw');
654
- await mc.ticks(10);
655
- const v = await mc.scoreboard('#rmw', 'v');
656
- expect(v).toBe(8);
657
- console.log(` RMW chain: 1→2→4→8, got ${v} (expect 8) ✓`);
658
- });
659
- });
660
- describe('MC Integration - New Features', () => {
661
- test('impl-test.mcrs: Timer::new/start/tick/done works in-game', async () => {
662
- if (!serverOnline)
663
- return;
664
- await mc.command('/scoreboard players set #impl done 0');
665
- await mc.command('/scoreboard players set timer_ticks rs 0');
666
- await mc.command('/scoreboard players set timer_active rs 0');
667
- await mc.command('/function impl_test:__load').catch(() => { });
668
- await mc.command('/function impl_test:test');
669
- await mc.ticks(5);
670
- const done = await mc.scoreboard('#impl', 'done');
671
- const ticks = await mc.scoreboard('timer_ticks', 'rs');
672
- expect(done).toBe(1);
673
- expect(ticks).toBe(3);
674
- });
675
- test('timeout-test.mcrs: setTimeout executes after delay', async () => {
676
- if (!serverOnline)
677
- return;
678
- await mc.command('/scoreboard players set #timeout fired 0');
679
- await mc.command('/function timeout_test:__load').catch(() => { });
680
- await mc.command('/function timeout_test:start');
681
- await mc.ticks(10);
682
- expect(await mc.scoreboard('#timeout', 'fired')).toBe(0);
683
- await mc.ticks(15);
684
- expect(await mc.scoreboard('#timeout', 'fired')).toBe(1);
685
- });
686
- test('interval-test.mcrs: setInterval repeats on schedule', async () => {
687
- if (!serverOnline)
688
- return;
689
- await mc.command('/scoreboard players set #interval ticks 0');
690
- await mc.command('/function interval_test:__load').catch(() => { });
691
- await mc.command('/function interval_test:start');
692
- await mc.ticks(70);
693
- const count = await mc.scoreboard('#interval', 'ticks');
694
- expect(count).toBeGreaterThanOrEqual(3);
695
- expect(count).toBeLessThanOrEqual(3);
696
- });
697
- test('is-check-test.mcrs: foreach is-narrowing correctly matches entity types', async () => {
698
- if (!serverOnline)
699
- return;
700
- await mc.fullReset({ clearArea: false, killEntities: true, resetScoreboards: false });
701
- await mc.command('/forceload add 0 0').catch(() => { }); // Ensure chunk is loaded
702
- await mc.command('/scoreboard objectives add armor_stands dummy').catch(() => { });
703
- await mc.command('/scoreboard objectives add items dummy').catch(() => { });
704
- await mc.command('/scoreboard players set #is_check armor_stands 0');
705
- await mc.command('/scoreboard players set #is_check items 0');
706
- await mc.command('/function is_check_test:__load').catch(() => { });
707
- // Spawn 2 armor_stands and 1 item (all persist without players)
708
- await mc.command('/summon minecraft:armor_stand 0 65 0 {Tags:["is_check_target"],NoGravity:1b}');
709
- await mc.command('/summon minecraft:armor_stand 2 65 0 {Tags:["is_check_target"],NoGravity:1b}');
710
- await mc.command('/summon minecraft:item 4 65 0 {Tags:["is_check_target"],Item:{id:"minecraft:stone",count:1},Age:-32768}');
711
- await mc.ticks(5);
712
- await mc.command('/function is_check_test:check_types');
713
- await mc.ticks(5);
714
- const armorStands = await mc.scoreboard('#is_check', 'armor_stands');
715
- const items = await mc.scoreboard('#is_check', 'items');
716
- expect(armorStands).toBe(2); // 2 armor_stands matched
717
- expect(items).toBe(1); // 1 item matched
718
- await mc.command('/function is_check_test:cleanup').catch(() => { });
719
- });
720
- test('event-test.mcrs: @on(PlayerDeath) compiles and loads', async () => {
721
- if (!serverOnline)
722
- return;
723
- // Verify the event system compiles correctly
724
- await mc.command('/function event_test:__load').catch(() => { });
725
- await mc.ticks(5);
726
- // Verify the trigger function exists
727
- const result = await mc.command('/function event_test:trigger_fake_death');
728
- expect(result.ok).toBe(true);
729
- // Verify __tick exists (event dispatcher)
730
- const tickResult = await mc.command('/function event_test:__tick').catch(() => ({ ok: false }));
731
- expect(tickResult.ok).toBe(true);
732
- });
733
- });
734
- describe('MC Integration - Extended Coverage', () => {
735
- test('struct-test.mcrs: struct instantiation and field access', async () => {
736
- if (!serverOnline)
737
- return;
738
- writeFixtureFile('struct-test.mcrs', 'struct_test');
739
- await mc.reload();
740
- await mc.command('/function struct_test:__load').catch(() => { });
741
- await mc.command('/function struct_test:test_struct');
742
- await mc.ticks(5);
743
- expect(await mc.scoreboard('#struct_x', 'rs')).toBe(10);
744
- expect(await mc.scoreboard('#struct_y', 'rs')).toBe(64);
745
- expect(await mc.scoreboard('#struct_z', 'rs')).toBe(-5);
746
- expect(await mc.scoreboard('#struct_x2', 'rs')).toBe(15); // 10+5
747
- expect(await mc.scoreboard('#struct_z2', 'rs')).toBe(-10); // -5*2
748
- expect(await mc.scoreboard('#struct_alive', 'rs')).toBe(1);
749
- expect(await mc.scoreboard('#struct_score', 'rs')).toBe(100);
750
- });
751
- test('enum-test.mcrs: enum values and match', async () => {
752
- if (!serverOnline)
753
- return;
754
- writeFixtureFile('enum-test.mcrs', 'enum_test');
755
- await mc.reload();
756
- await mc.command('/function enum_test:__load').catch(() => { });
757
- await mc.command('/function enum_test:test_enum');
758
- await mc.ticks(5);
759
- expect(await mc.scoreboard('#enum_phase', 'rs')).toBe(2); // Playing=2
760
- expect(await mc.scoreboard('#enum_match', 'rs')).toBe(2); // matched Playing
761
- expect(await mc.scoreboard('#enum_rank', 'rs')).toBe(10); // Diamond=10
762
- expect(await mc.scoreboard('#enum_high', 'rs')).toBe(1); // Diamond > Gold
763
- });
764
- test('array-test.mcrs: array operations', async () => {
765
- if (!serverOnline)
766
- return;
767
- writeFixtureFile('array-test.mcrs', 'array_test');
768
- await mc.reload();
769
- await mc.command('/function array_test:__load').catch(() => { });
770
- await mc.command('/function array_test:test_array');
771
- await mc.ticks(5);
772
- expect(await mc.scoreboard('#arr_0', 'rs')).toBe(10);
773
- expect(await mc.scoreboard('#arr_2', 'rs')).toBe(30);
774
- expect(await mc.scoreboard('#arr_4', 'rs')).toBe(50);
775
- expect(await mc.scoreboard('#arr_len', 'rs')).toBe(5);
776
- expect(await mc.scoreboard('#arr_sum', 'rs')).toBe(150); // 10+20+30+40+50
777
- expect(await mc.scoreboard('#arr_push', 'rs')).toBe(4); // [1,2,3,4].len
778
- expect(await mc.scoreboard('#arr_pop', 'rs')).toBe(4); // popped value
779
- });
780
- test('break-continue-test.mcrs: break and continue statements', async () => {
781
- if (!serverOnline)
782
- return;
783
- writeFixtureFile('break-continue-test.mcrs', 'break_continue_test');
784
- await mc.reload();
785
- await mc.command('/function break_continue_test:__load').catch(() => { });
786
- await mc.command('/function break_continue_test:test_break_continue');
787
- await mc.ticks(10);
788
- expect(await mc.scoreboard('#break_at', 'rs')).toBe(5);
789
- expect(await mc.scoreboard('#sum_evens', 'rs')).toBe(20); // 0+2+4+6+8
790
- expect(await mc.scoreboard('#while_break', 'rs')).toBe(7);
791
- expect(await mc.scoreboard('#nested_break', 'rs')).toBe(3); // outer completes 3 times
792
- });
793
- test('match-range-test.mcrs: match with range patterns', async () => {
794
- if (!serverOnline)
795
- return;
796
- writeFixtureFile('match-range-test.mcrs', 'match_range_test');
797
- await mc.reload();
798
- await mc.command('/function match_range_test:__load').catch(() => { });
799
- await mc.command('/function match_range_test:test_match_range');
800
- await mc.ticks(5);
801
- expect(await mc.scoreboard('#grade', 'rs')).toBe(4); // score=85 → B
802
- expect(await mc.scoreboard('#boundary_59', 'rs')).toBe(1); // 59 matches 0..59
803
- expect(await mc.scoreboard('#boundary_60', 'rs')).toBe(2); // 60 matches 60..100
804
- expect(await mc.scoreboard('#neg_range', 'rs')).toBe(1); // -5 matches ..0
805
- });
806
- test('foreach-at-test.mcrs: foreach with at @s context', async () => {
807
- if (!serverOnline)
808
- return;
809
- writeFixtureFile('foreach-at-test.mcrs', 'foreach_at_test');
810
- await mc.reload();
811
- await mc.fullReset({ clearArea: false, killEntities: true, resetScoreboards: false });
812
- await mc.command('/function foreach_at_test:setup').catch(() => { });
813
- await mc.command('/function foreach_at_test:test_foreach_at');
814
- await mc.ticks(10);
815
- expect(await mc.scoreboard('#foreach_count', 'rs')).toBe(3);
816
- expect(await mc.scoreboard('#foreach_at_count', 'rs')).toBe(3);
817
- });
818
- });
819
- //# sourceMappingURL=mc-integration.test.js.map