redscript-mc 2.6.2 → 3.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 (636) hide show
  1. package/.github/workflows/ci.yml +11 -0
  2. package/CHANGELOG.md +18 -9
  3. package/README-benchmarks.md +48 -0
  4. package/README-vscode-test.md +251 -0
  5. package/RELEASE_NOTES.md +74 -0
  6. package/ROADMAP.md +131 -167
  7. package/benchmarks/_shared.ts +468 -0
  8. package/benchmarks/baseline.json +2816 -0
  9. package/benchmarks/baseline.md +13 -0
  10. package/benchmarks/compiler-perf.report.json +207 -0
  11. package/benchmarks/compiler-perf.ts +76 -0
  12. package/benchmarks/results.md +13 -0
  13. package/benchmarks/stdlib-complexity.report.json +2606 -0
  14. package/benchmarks/stdlib-complexity.ts +54 -0
  15. package/benchmarks/stdlib-size.md +57 -0
  16. package/benchmarks/stdlib-size.ts +91 -0
  17. package/coverage-report.md +177 -0
  18. package/dist/src/__tests__/budget.test.js +4 -0
  19. package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
  20. package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
  21. package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
  22. package/dist/src/__tests__/cache-extra.test.js +211 -0
  23. package/dist/src/__tests__/cli-init.test.d.ts +1 -0
  24. package/dist/src/__tests__/cli-init.test.js +97 -0
  25. package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
  26. package/dist/src/__tests__/cli-publish.test.js +189 -0
  27. package/dist/src/__tests__/cli.test.js +76 -0
  28. package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
  29. package/dist/src/__tests__/compile-preprocess.test.js +328 -0
  30. package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
  31. package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
  32. package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
  33. package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
  34. package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
  35. package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
  36. package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
  37. package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
  38. package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
  39. package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
  40. package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
  41. package/dist/src/__tests__/compiler/do-while.test.js +120 -0
  42. package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
  43. package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
  44. package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
  45. package/dist/src/__tests__/compiler/interface.test.js +258 -0
  46. package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
  47. package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
  48. package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
  49. package/dist/src/__tests__/compiler/match-string.test.js +43 -0
  50. package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
  51. package/dist/src/__tests__/compiler/memoize.test.js +113 -0
  52. package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
  53. package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
  54. package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
  55. package/dist/src/__tests__/compiler/module-import.test.js +261 -0
  56. package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
  57. package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
  58. package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
  59. package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
  60. package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
  61. package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
  62. package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
  63. package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
  64. package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
  65. package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
  66. package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
  67. package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
  68. package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
  69. package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
  70. package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
  71. package/dist/src/__tests__/config/project-config.test.js +199 -0
  72. package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
  73. package/dist/src/__tests__/config-decorator.test.js +142 -0
  74. package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
  75. package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
  76. package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
  77. package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
  78. package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
  79. package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
  80. package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
  81. package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
  82. package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
  83. package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
  84. package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
  85. package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
  86. package/dist/src/__tests__/emit/index.test.js +2 -1
  87. package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
  88. package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
  89. package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
  90. package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
  91. package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
  92. package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
  93. package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
  94. package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
  95. package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
  96. package/dist/src/__tests__/emit/source-map.test.js +167 -0
  97. package/dist/src/__tests__/enum.test.js +9 -4
  98. package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
  99. package/dist/src/__tests__/error-recovery.test.js +217 -0
  100. package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
  101. package/dist/src/__tests__/events-types-extra.test.js +91 -0
  102. package/dist/src/__tests__/events-types.test.d.ts +4 -0
  103. package/dist/src/__tests__/events-types.test.js +56 -0
  104. package/dist/src/__tests__/formatter.test.js +13 -5
  105. package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
  106. package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
  107. package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
  108. package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
  109. package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
  110. package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
  111. package/dist/src/__tests__/incremental.test.js +10 -2
  112. package/dist/src/__tests__/index-extra.test.d.ts +10 -0
  113. package/dist/src/__tests__/index-extra.test.js +71 -0
  114. package/dist/src/__tests__/lexer.test.js +2 -2
  115. package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
  116. package/dist/src/__tests__/lint/rules.test.js +208 -0
  117. package/dist/src/__tests__/lir/lower.test.js +29 -0
  118. package/dist/src/__tests__/lir/verify.test.js +30 -0
  119. package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
  120. package/dist/src/__tests__/lsp/completion.test.js +583 -0
  121. package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
  122. package/dist/src/__tests__/lsp/definition.test.js +454 -0
  123. package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
  124. package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
  125. package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
  126. package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
  127. package/dist/src/__tests__/lsp.test.js +4 -1
  128. package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
  129. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
  130. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
  131. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
  132. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
  133. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
  134. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
  135. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
  136. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
  137. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
  138. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
  139. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
  140. package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
  141. package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
  142. package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
  143. package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
  144. package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
  145. package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
  146. package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
  147. package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
  148. package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
  149. package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
  150. package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
  151. package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
  152. package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
  153. package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
  154. package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
  155. package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
  156. package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
  157. package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
  158. package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
  159. package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
  160. package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
  161. package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
  162. package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
  163. package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
  164. package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
  165. package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
  166. package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
  167. package/dist/src/__tests__/optimizer/cse.test.js +178 -0
  168. package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
  169. package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
  170. package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
  171. package/dist/src/__tests__/optimizer/licm.test.js +244 -0
  172. package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
  173. package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
  174. package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
  175. package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
  176. package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
  177. package/dist/src/__tests__/optimizer/tco.test.js +203 -0
  178. package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
  179. package/dist/src/__tests__/parser-coverage.test.js +491 -0
  180. package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
  181. package/dist/src/__tests__/parser-extra.test.js +451 -0
  182. package/dist/src/__tests__/parser.test.js +12 -0
  183. package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
  184. package/dist/src/__tests__/repl-extra.test.js +174 -0
  185. package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
  186. package/dist/src/__tests__/repl-server-extra.test.js +161 -0
  187. package/dist/src/__tests__/repl-server.test.d.ts +6 -0
  188. package/dist/src/__tests__/repl-server.test.js +146 -0
  189. package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
  190. package/dist/src/__tests__/runtime-extra.test.js +732 -0
  191. package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
  192. package/dist/src/__tests__/singleton-decorator.test.js +260 -0
  193. package/dist/src/__tests__/sourcemap.test.js +1 -1
  194. package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
  195. package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
  196. package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
  197. package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
  198. package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
  199. package/dist/src/__tests__/stdlib/bits.test.js +96 -0
  200. package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
  201. package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
  202. package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
  203. package/dist/src/__tests__/stdlib/color.test.js +84 -0
  204. package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
  205. package/dist/src/__tests__/stdlib/combat.test.js +64 -0
  206. package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
  207. package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
  208. package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
  209. package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
  210. package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
  211. package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
  212. package/dist/src/__tests__/stdlib/effects.test.js +72 -0
  213. package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
  214. package/dist/src/__tests__/stdlib/events.test.js +55 -0
  215. package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
  216. package/dist/src/__tests__/stdlib/expr.test.js +77 -0
  217. package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
  218. package/dist/src/__tests__/stdlib/fft.test.js +82 -0
  219. package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
  220. package/dist/src/__tests__/stdlib/graph.test.js +102 -0
  221. package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
  222. package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
  223. package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
  224. package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
  225. package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
  226. package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
  227. package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
  228. package/dist/src/__tests__/stdlib/map.test.js +84 -0
  229. package/dist/src/__tests__/stdlib/math.test.js +19 -6
  230. package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
  231. package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
  232. package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
  233. package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
  234. package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
  235. package/dist/src/__tests__/stdlib/noise.test.js +73 -0
  236. package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
  237. package/dist/src/__tests__/stdlib/ode.test.js +68 -0
  238. package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
  239. package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
  240. package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
  241. package/dist/src/__tests__/stdlib/particles.test.js +68 -0
  242. package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
  243. package/dist/src/__tests__/stdlib/physics.test.js +76 -0
  244. package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
  245. package/dist/src/__tests__/stdlib/player.test.js +64 -0
  246. package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
  247. package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
  248. package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
  249. package/dist/src/__tests__/stdlib/queue.test.js +97 -0
  250. package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
  251. package/dist/src/__tests__/stdlib/random.test.js +76 -0
  252. package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
  253. package/dist/src/__tests__/stdlib/result.test.js +329 -0
  254. package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
  255. package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
  256. package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
  257. package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
  258. package/dist/src/__tests__/stdlib/sets.test.js +60 -0
  259. package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
  260. package/dist/src/__tests__/stdlib/signal.test.js +84 -0
  261. package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
  262. package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
  263. package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
  264. package/dist/src/__tests__/stdlib/string.test.js +231 -0
  265. package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
  266. package/dist/src/__tests__/stdlib/strings.test.js +83 -0
  267. package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
  268. package/dist/src/__tests__/stdlib/tags.test.js +57 -0
  269. package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
  270. package/dist/src/__tests__/stdlib/teams.test.js +72 -0
  271. package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
  272. package/dist/src/__tests__/stdlib/timer.test.js +79 -0
  273. package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
  274. package/dist/src/__tests__/stdlib/vec.test.js +94 -0
  275. package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
  276. package/dist/src/__tests__/stdlib/world.test.js +72 -0
  277. package/dist/src/__tests__/struct-display.test.d.ts +1 -0
  278. package/dist/src/__tests__/struct-display.test.js +64 -0
  279. package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
  280. package/dist/src/__tests__/test-framework/runner.test.js +193 -0
  281. package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
  282. package/dist/src/__tests__/tuner/adapters.test.js +194 -0
  283. package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
  284. package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
  285. package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
  286. package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
  287. package/dist/src/__tests__/typechecker.test.js +3 -3
  288. package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
  289. package/dist/src/__tests__/watch-decorator.test.js +54 -0
  290. package/dist/src/ast/types.d.ts +102 -3
  291. package/dist/src/cache/incremental.d.ts +13 -14
  292. package/dist/src/cache/incremental.js +106 -89
  293. package/dist/src/cache/index.d.ts +8 -2
  294. package/dist/src/cache/index.js +18 -6
  295. package/dist/src/cli.d.ts +1 -0
  296. package/dist/src/cli.js +466 -17
  297. package/dist/src/config/project-config.d.ts +29 -0
  298. package/dist/src/config/project-config.js +180 -0
  299. package/dist/src/diagnostics/index.d.ts +9 -0
  300. package/dist/src/diagnostics/index.js +18 -1
  301. package/dist/src/emit/compile.d.ts +10 -0
  302. package/dist/src/emit/compile.js +395 -50
  303. package/dist/src/emit/index.d.ts +40 -0
  304. package/dist/src/emit/index.js +307 -14
  305. package/dist/src/emit/modules.js +21 -3
  306. package/dist/src/emit/sourcemap.d.ts +23 -27
  307. package/dist/src/emit/sourcemap.js +52 -30
  308. package/dist/src/formatter/index.js +33 -8
  309. package/dist/src/hir/deprecated.d.ts +13 -0
  310. package/dist/src/hir/deprecated.js +218 -0
  311. package/dist/src/hir/lower.js +114 -8
  312. package/dist/src/hir/monomorphize.js +22 -2
  313. package/dist/src/hir/types.d.ts +65 -1
  314. package/dist/src/index.d.ts +6 -0
  315. package/dist/src/index.js +18 -3
  316. package/dist/src/lexer/index.d.ts +2 -1
  317. package/dist/src/lexer/index.js +39 -3
  318. package/dist/src/lint/index.d.ts +45 -0
  319. package/dist/src/lint/index.js +930 -0
  320. package/dist/src/lir/lower.js +29 -2
  321. package/dist/src/lir/types.d.ts +2 -0
  322. package/dist/src/lsp/server.js +92 -5
  323. package/dist/src/mir/lower.js +775 -34
  324. package/dist/src/mir/macro.js +36 -2
  325. package/dist/src/mir/types.d.ts +12 -0
  326. package/dist/src/mir/verify.js +9 -0
  327. package/dist/src/optimizer/auto-inline.d.ts +2 -0
  328. package/dist/src/optimizer/auto-inline.js +67 -0
  329. package/dist/src/optimizer/cse.d.ts +20 -0
  330. package/dist/src/optimizer/cse.js +234 -0
  331. package/dist/src/optimizer/inline.d.ts +26 -0
  332. package/dist/src/optimizer/inline.js +286 -0
  333. package/dist/src/optimizer/interprocedural.js +4 -0
  334. package/dist/src/optimizer/licm.d.ts +32 -0
  335. package/dist/src/optimizer/licm.js +371 -0
  336. package/dist/src/optimizer/pipeline.js +12 -2
  337. package/dist/src/optimizer/strength_reduction.d.ts +15 -0
  338. package/dist/src/optimizer/strength_reduction.js +90 -0
  339. package/dist/src/optimizer/tco.d.ts +53 -0
  340. package/dist/src/optimizer/tco.js +238 -0
  341. package/dist/src/parser/index.d.ts +32 -0
  342. package/dist/src/parser/index.js +421 -59
  343. package/dist/src/repl-server.d.ts +13 -0
  344. package/dist/src/repl-server.js +127 -0
  345. package/dist/src/structs/expand.d.ts +15 -0
  346. package/dist/src/structs/expand.js +46 -0
  347. package/dist/src/testing/runner.d.ts +40 -0
  348. package/dist/src/testing/runner.js +237 -0
  349. package/dist/src/typechecker/index.d.ts +3 -0
  350. package/dist/src/typechecker/index.js +254 -9
  351. package/dist/tsconfig.tsbuildinfo +1 -1
  352. package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
  353. package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
  354. package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
  355. package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
  356. package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
  357. package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
  358. package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
  359. package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
  360. package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
  361. package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
  362. package/docs/stdlib/result.md +156 -0
  363. package/docs/stdlib/result.zh.md +156 -0
  364. package/editors/vscode/fixtures/test.mcrs +7 -0
  365. package/editors/vscode/out/extension.js +2095 -225
  366. package/editors/vscode/out/lsp-server.js +519 -51
  367. package/editors/vscode/package-lock.json +9 -4
  368. package/editors/vscode/package.json +1 -1
  369. package/examples/display-demo.mcrs +64 -0
  370. package/examples/game/racing.mcrs +301 -0
  371. package/examples/game/tower_defense.mcrs +311 -0
  372. package/examples/math/physics_sim.mcrs +322 -0
  373. package/examples/rpg/boss_fight.mcrs +313 -0
  374. package/examples/rpg/health_system.mcrs +237 -0
  375. package/examples/rpg/inventory.mcrs +265 -0
  376. package/examples/util/debug_hud.mcrs +279 -0
  377. package/jest.config.js +10 -0
  378. package/package.json +12 -3
  379. package/playground/index.html +823 -0
  380. package/scripts/gen-docs.ts +533 -0
  381. package/scripts/update-redscript-docs-stdlib.sh +770 -0
  382. package/src/__tests__/budget.test.ts +5 -0
  383. package/src/__tests__/cache/cache-behavior.test.ts +480 -0
  384. package/src/__tests__/cache-extra.test.ts +199 -0
  385. package/src/__tests__/cli-docs.test.ts +77 -0
  386. package/src/__tests__/cli-init.test.ts +91 -0
  387. package/src/__tests__/cli-publish.test.ts +190 -0
  388. package/src/__tests__/cli.test.ts +117 -1
  389. package/src/__tests__/compile-preprocess.test.ts +366 -0
  390. package/src/__tests__/compiler/break-stmt.test.ts +66 -0
  391. package/src/__tests__/compiler/const-decl.test.ts +141 -0
  392. package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
  393. package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
  394. package/src/__tests__/compiler/deprecated.test.ts +305 -0
  395. package/src/__tests__/compiler/do-while.test.ts +130 -0
  396. package/src/__tests__/compiler/enum-payload.test.ts +299 -0
  397. package/src/__tests__/compiler/interface.test.ts +287 -0
  398. package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
  399. package/src/__tests__/compiler/match-string.test.ts +45 -0
  400. package/src/__tests__/compiler/memoize.test.ts +126 -0
  401. package/src/__tests__/compiler/method-chain.test.ts +121 -0
  402. package/src/__tests__/compiler/module-import.test.ts +240 -0
  403. package/src/__tests__/compiler/option-extensions.test.ts +207 -0
  404. package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
  405. package/src/__tests__/compiler/string-advanced.test.ts +310 -0
  406. package/src/__tests__/compiler/struct-extends.test.ts +109 -0
  407. package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
  408. package/src/__tests__/compiler/tuple-type.test.ts +263 -0
  409. package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
  410. package/src/__tests__/config/project-config.test.ts +181 -0
  411. package/src/__tests__/config-decorator.test.ts +157 -0
  412. package/src/__tests__/diagnostics-extra.test.ts +155 -0
  413. package/src/__tests__/emit/compile-branches.test.ts +135 -0
  414. package/src/__tests__/emit/compile-coverage.test.ts +696 -0
  415. package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
  416. package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
  417. package/src/__tests__/emit/compile.test.ts +6 -1
  418. package/src/__tests__/emit/execute-chain.test.ts +114 -0
  419. package/src/__tests__/emit/index.test.ts +2 -1
  420. package/src/__tests__/emit/modules-branches.test.ts +90 -0
  421. package/src/__tests__/emit/modules-coverage.test.ts +241 -0
  422. package/src/__tests__/emit/modules-errors.test.ts +192 -0
  423. package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
  424. package/src/__tests__/emit/source-map.test.ts +152 -0
  425. package/src/__tests__/enum.test.ts +9 -4
  426. package/src/__tests__/error-recovery.test.ts +226 -0
  427. package/src/__tests__/events-types-extra.test.ts +110 -0
  428. package/src/__tests__/events-types.test.ts +66 -0
  429. package/src/__tests__/formatter.test.ts +15 -5
  430. package/src/__tests__/generics.test.ts +16 -9
  431. package/src/__tests__/hir/lower-extra.test.ts +151 -0
  432. package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
  433. package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
  434. package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
  435. package/src/__tests__/impl.test.ts +12 -8
  436. package/src/__tests__/incremental.test.ts +10 -2
  437. package/src/__tests__/index-extra.test.ts +79 -0
  438. package/src/__tests__/lexer.test.ts +2 -2
  439. package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
  440. package/src/__tests__/lint/rules-coverage.test.ts +598 -0
  441. package/src/__tests__/lint/rules.test.ts +230 -0
  442. package/src/__tests__/lir/lower.test.ts +33 -0
  443. package/src/__tests__/lir/verify.test.ts +33 -0
  444. package/src/__tests__/lsp/completion.test.ts +687 -0
  445. package/src/__tests__/lsp/definition.test.ts +499 -0
  446. package/src/__tests__/lsp/diagnostics.test.ts +108 -0
  447. package/src/__tests__/lsp/hover-docs.test.ts +222 -0
  448. package/src/__tests__/lsp.test.ts +4 -1
  449. package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
  450. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
  451. package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
  452. package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
  453. package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
  454. package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
  455. package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
  456. package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
  457. package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
  458. package/src/__tests__/mc-validator-coverage.test.ts +325 -0
  459. package/src/__tests__/mc-validator-extra.test.ts +252 -0
  460. package/src/__tests__/mir/lower-extra.test.ts +402 -0
  461. package/src/__tests__/mir/lower-extra2.test.ts +348 -0
  462. package/src/__tests__/mir/lower-extra3.test.ts +277 -0
  463. package/src/__tests__/mir/lower-extra4.test.ts +636 -0
  464. package/src/__tests__/mir/lower-extra5.test.ts +612 -0
  465. package/src/__tests__/mir/lower-extra6.test.ts +520 -0
  466. package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
  467. package/src/__tests__/mir/lower-extra8.test.ts +704 -0
  468. package/src/__tests__/mir/lower-extra9.test.ts +821 -0
  469. package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
  470. package/src/__tests__/optimizer/cse.test.ts +195 -0
  471. package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
  472. package/src/__tests__/optimizer/licm.test.ts +358 -0
  473. package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
  474. package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
  475. package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
  476. package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
  477. package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
  478. package/src/__tests__/optimizer/tco.test.ts +238 -0
  479. package/src/__tests__/option.test.ts +14 -7
  480. package/src/__tests__/parser-coverage.test.ts +576 -0
  481. package/src/__tests__/parser-extra.test.ts +531 -0
  482. package/src/__tests__/parser.test.ts +14 -0
  483. package/src/__tests__/repl-extra.test.ts +195 -0
  484. package/src/__tests__/repl-server-extra.test.ts +150 -0
  485. package/src/__tests__/repl-server.test.ts +122 -0
  486. package/src/__tests__/runtime-extra.test.ts +862 -0
  487. package/src/__tests__/singleton-decorator.test.ts +285 -0
  488. package/src/__tests__/sourcemap.test.ts +1 -1
  489. package/src/__tests__/stdlib/advanced.test.ts +312 -0
  490. package/src/__tests__/stdlib/bigint.test.ts +57 -0
  491. package/src/__tests__/stdlib/bits.test.ts +75 -0
  492. package/src/__tests__/stdlib/bossbar.test.ts +45 -0
  493. package/src/__tests__/stdlib/color.test.ts +60 -0
  494. package/src/__tests__/stdlib/combat.test.ts +35 -0
  495. package/src/__tests__/stdlib/cooldown.test.ts +35 -0
  496. package/src/__tests__/stdlib/dialog.test.ts +14 -6
  497. package/src/__tests__/stdlib/ecs.test.ts +54 -0
  498. package/src/__tests__/stdlib/effects.test.ts +45 -0
  499. package/src/__tests__/stdlib/events.test.ts +23 -0
  500. package/src/__tests__/stdlib/expr.test.ts +48 -0
  501. package/src/__tests__/stdlib/fft.test.ts +54 -0
  502. package/src/__tests__/stdlib/graph.test.ts +77 -0
  503. package/src/__tests__/stdlib/interactions.test.ts +30 -0
  504. package/src/__tests__/stdlib/inventory.test.ts +40 -0
  505. package/src/__tests__/stdlib/linalg.test.ts +52 -0
  506. package/src/__tests__/stdlib/map.test.ts +55 -0
  507. package/src/__tests__/stdlib/math.test.ts +19 -5
  508. package/src/__tests__/stdlib/math_hp.test.ts +55 -0
  509. package/src/__tests__/stdlib/mobs.test.ts +40 -0
  510. package/src/__tests__/stdlib/noise.test.ts +46 -0
  511. package/src/__tests__/stdlib/ode.test.ts +40 -0
  512. package/src/__tests__/stdlib/parabola.test.ts +51 -0
  513. package/src/__tests__/stdlib/particles.test.ts +40 -0
  514. package/src/__tests__/stdlib/physics.test.ts +50 -0
  515. package/src/__tests__/stdlib/player.test.ts +35 -0
  516. package/src/__tests__/stdlib/quaternion.test.ts +46 -0
  517. package/src/__tests__/stdlib/queue.test.ts +73 -0
  518. package/src/__tests__/stdlib/random.test.ts +50 -0
  519. package/src/__tests__/stdlib/result.test.ts +326 -0
  520. package/src/__tests__/stdlib/scheduler.test.ts +18 -7
  521. package/src/__tests__/stdlib/set_int.test.ts +62 -0
  522. package/src/__tests__/stdlib/sets.test.ts +28 -0
  523. package/src/__tests__/stdlib/signal.test.ts +60 -0
  524. package/src/__tests__/stdlib/spawn.test.ts +40 -0
  525. package/src/__tests__/stdlib/string.test.ts +224 -0
  526. package/src/__tests__/stdlib/strings.test.ts +55 -0
  527. package/src/__tests__/stdlib/tags.test.ts +32 -0
  528. package/src/__tests__/stdlib/teams.test.ts +45 -0
  529. package/src/__tests__/stdlib/timer.test.ts +53 -0
  530. package/src/__tests__/stdlib/vec.test.ts +72 -0
  531. package/src/__tests__/stdlib/world.test.ts +45 -0
  532. package/src/__tests__/struct-display.test.ts +69 -0
  533. package/src/__tests__/test-framework/runner.test.ts +208 -0
  534. package/src/__tests__/tuner/adapters.test.ts +232 -0
  535. package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
  536. package/src/__tests__/tuple.test.ts +11 -4
  537. package/src/__tests__/typechecker-coverage.test.ts +671 -0
  538. package/src/__tests__/typechecker.test.ts +4 -3
  539. package/src/__tests__/watch-decorator.test.ts +59 -0
  540. package/src/ast/types.ts +65 -3
  541. package/src/cache/incremental.ts +128 -99
  542. package/src/cache/index.ts +35 -8
  543. package/src/cli.ts +538 -29
  544. package/src/config/project-config.ts +176 -0
  545. package/src/diagnostics/index.ts +22 -0
  546. package/src/docs.ts +98 -0
  547. package/src/emit/compile.ts +408 -51
  548. package/src/emit/index.ts +366 -18
  549. package/src/emit/modules.ts +19 -3
  550. package/src/emit/sourcemap.ts +64 -43
  551. package/src/formatter/index.ts +35 -8
  552. package/src/hir/deprecated.ts +212 -0
  553. package/src/hir/lower.ts +128 -8
  554. package/src/hir/monomorphize.ts +24 -2
  555. package/src/hir/types.ts +26 -1
  556. package/src/index.ts +23 -3
  557. package/src/lexer/index.ts +45 -6
  558. package/src/lint/index.ts +922 -0
  559. package/src/lir/lower.ts +30 -2
  560. package/src/lir/types.ts +4 -0
  561. package/src/lsp/server.ts +100 -1
  562. package/src/mir/lower.ts +785 -40
  563. package/src/mir/macro.ts +30 -2
  564. package/src/mir/types.ts +13 -0
  565. package/src/mir/verify.ts +10 -2
  566. package/src/optimizer/auto-inline.ts +86 -0
  567. package/src/optimizer/copy_prop.ts +2 -2
  568. package/src/optimizer/coroutine.ts +3 -3
  569. package/src/optimizer/cse.ts +205 -0
  570. package/src/optimizer/dce.ts +2 -2
  571. package/src/optimizer/inline.ts +335 -0
  572. package/src/optimizer/interprocedural.ts +5 -1
  573. package/src/optimizer/licm.ts +454 -0
  574. package/src/optimizer/nbt-coalesce.ts +109 -0
  575. package/src/optimizer/pipeline.ts +16 -2
  576. package/src/optimizer/scoreboard-batch.ts +52 -0
  577. package/src/optimizer/strength_reduction.ts +95 -0
  578. package/src/optimizer/tco.ts +267 -0
  579. package/src/optimizer/unroll.ts +2 -2
  580. package/src/parser/index.ts +426 -53
  581. package/src/repl-server.ts +102 -0
  582. package/src/stdlib/advanced.mcrs +271 -101
  583. package/src/stdlib/bigint.mcrs +97 -11
  584. package/src/stdlib/bits.mcrs +75 -12
  585. package/src/stdlib/bossbar.mcrs +37 -8
  586. package/src/stdlib/calculus.mcrs +82 -26
  587. package/src/stdlib/color.mcrs +98 -16
  588. package/src/stdlib/combat.mcrs +23 -5
  589. package/src/stdlib/cooldown.mcrs +19 -0
  590. package/src/stdlib/dialog.mcrs +45 -7
  591. package/src/stdlib/easing.mcrs +132 -12
  592. package/src/stdlib/ecs.mcrs +142 -25
  593. package/src/stdlib/effects.mcrs +88 -12
  594. package/src/stdlib/events.mcrs +21 -2
  595. package/src/stdlib/expr.mcrs +18 -3
  596. package/src/stdlib/fft.mcrs +66 -56
  597. package/src/stdlib/geometry.mcrs +137 -39
  598. package/src/stdlib/graph.mcrs +73 -0
  599. package/src/stdlib/heap.mcrs +49 -8
  600. package/src/stdlib/i18n/zh.yaml +2891 -0
  601. package/src/stdlib/interactions.mcrs +43 -20
  602. package/src/stdlib/inventory.mcrs +14 -3
  603. package/src/stdlib/linalg.mcrs +185 -30
  604. package/src/stdlib/list.mcrs +168 -18
  605. package/src/stdlib/map.mcrs +112 -0
  606. package/src/stdlib/math.mcrs +68 -18
  607. package/src/stdlib/math_hp.mcrs +124 -33
  608. package/src/stdlib/matrix.mcrs +133 -20
  609. package/src/stdlib/mobs.mcrs +87 -0
  610. package/src/stdlib/noise.mcrs +65 -21
  611. package/src/stdlib/ode.mcrs +96 -0
  612. package/src/stdlib/parabola.mcrs +104 -29
  613. package/src/stdlib/particles.mcrs +78 -21
  614. package/src/stdlib/pathfind.mcrs +89 -35
  615. package/src/stdlib/physics.mcrs +134 -26
  616. package/src/stdlib/player.mcrs +18 -0
  617. package/src/stdlib/quaternion.mcrs +213 -9
  618. package/src/stdlib/queue.mcrs +123 -0
  619. package/src/stdlib/random.mcrs +63 -18
  620. package/src/stdlib/result.mcrs +111 -0
  621. package/src/stdlib/scheduler.mcrs +59 -10
  622. package/src/stdlib/set_int.mcrs +240 -0
  623. package/src/stdlib/sets.mcrs +49 -19
  624. package/src/stdlib/signal.mcrs +151 -79
  625. package/src/stdlib/sort.mcrs +44 -24
  626. package/src/stdlib/spawn.mcrs +30 -7
  627. package/src/stdlib/state.mcrs +40 -5
  628. package/src/stdlib/strings.mcrs +131 -3
  629. package/src/stdlib/tags.mcrs +2 -2
  630. package/src/stdlib/teams.mcrs +22 -10
  631. package/src/stdlib/timer.mcrs +36 -6
  632. package/src/stdlib/vec.mcrs +44 -9
  633. package/src/stdlib/world.mcrs +57 -25
  634. package/src/structs/expand.ts +64 -0
  635. package/src/testing/runner.ts +271 -0
  636. package/src/typechecker/index.ts +273 -9
@@ -0,0 +1,1509 @@
1
+ "use strict";
2
+ /**
3
+ * RedScript MC Integration Tests — stdlib coverage 4
4
+ *
5
+ * Tests graph / linalg / physics / parabola / quaternion / bigint / heap / pathfind
6
+ * stdlib modules against a real Paper 1.21.4 server with TestHarnessPlugin.
7
+ *
8
+ * Prerequisites:
9
+ * - Paper server running with TestHarnessPlugin on port 25561
10
+ * - MC_SERVER_DIR env var pointing to server directory
11
+ *
12
+ * Run: MC_SERVER_DIR=~/mc-test-server npx jest stdlib-coverage-4 --testTimeout=120000
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const compile_1 = require("../../compile");
51
+ const client_1 = require("../../mc-test/client");
52
+ const MC_HOST = process.env.MC_HOST ?? 'localhost';
53
+ const MC_PORT = parseInt(process.env.MC_PORT ?? '25561');
54
+ const MC_SERVER_DIR = process.env.MC_SERVER_DIR ?? path.join(process.env.HOME, 'mc-test-server');
55
+ const DATAPACK_DIR = path.join(MC_SERVER_DIR, 'world', 'datapacks', 'redscript-test4');
56
+ const STDLIB_DIR = path.join(__dirname, '../../stdlib');
57
+ let serverOnline = false;
58
+ let mc;
59
+ // ---------------------------------------------------------------------------
60
+ // Helper: compile and deploy a RedScript snippet with optional stdlib libs
61
+ // ---------------------------------------------------------------------------
62
+ function writeFixture(source, namespace, librarySources = []) {
63
+ fs.mkdirSync(DATAPACK_DIR, { recursive: true });
64
+ if (!fs.existsSync(path.join(DATAPACK_DIR, 'pack.mcmeta'))) {
65
+ fs.writeFileSync(path.join(DATAPACK_DIR, 'pack.mcmeta'), JSON.stringify({ pack: { pack_format: 48, description: 'RedScript integration tests 4' } }));
66
+ }
67
+ const result = (0, compile_1.compile)(source, { namespace, librarySources });
68
+ for (const file of result.files) {
69
+ if (file.path === 'pack.mcmeta')
70
+ continue;
71
+ const filePath = path.join(DATAPACK_DIR, file.path);
72
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
73
+ // Merge minecraft tag files (tick.json / load.json) instead of overwriting
74
+ if (file.path.includes('data/minecraft/tags/') && fs.existsSync(filePath)) {
75
+ const existing = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
76
+ const incoming = JSON.parse(file.content);
77
+ const merged = { values: [...new Set([...(existing.values ?? []), ...(incoming.values ?? [])])] };
78
+ fs.writeFileSync(filePath, JSON.stringify(merged, null, 2));
79
+ }
80
+ else {
81
+ fs.writeFileSync(filePath, file.content);
82
+ }
83
+ }
84
+ }
85
+ function readStdlib(name) {
86
+ return fs.readFileSync(path.join(STDLIB_DIR, name), 'utf-8');
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // Setup
90
+ // ---------------------------------------------------------------------------
91
+ beforeAll(async () => {
92
+ if (process.env.MC_OFFLINE === 'true') {
93
+ console.warn('⚠ MC_OFFLINE=true — skipping stdlib coverage 4 integration tests');
94
+ return;
95
+ }
96
+ mc = new client_1.MCTestClient(MC_HOST, MC_PORT);
97
+ try {
98
+ const deadline = Date.now() + 10_000;
99
+ while (Date.now() < deadline) {
100
+ if (await mc.isOnline()) {
101
+ serverOnline = true;
102
+ break;
103
+ }
104
+ await new Promise(r => setTimeout(r, 1000));
105
+ }
106
+ }
107
+ catch {
108
+ serverOnline = false;
109
+ }
110
+ if (!serverOnline) {
111
+ console.warn(`⚠ MC server not running at ${MC_HOST}:${MC_PORT} — skipping stdlib coverage 4 tests`);
112
+ return;
113
+ }
114
+ // Clear stale minecraft tag files before writing fixtures
115
+ for (const tagFile of [
116
+ 'data/minecraft/tags/function/tick.json',
117
+ 'data/minecraft/tags/function/load.json',
118
+ 'data/minecraft/tags/functions/tick.json',
119
+ 'data/minecraft/tags/functions/load.json',
120
+ ]) {
121
+ const p = path.join(DATAPACK_DIR, tagFile);
122
+ if (fs.existsSync(p))
123
+ fs.writeFileSync(p, JSON.stringify({ values: [] }, null, 2));
124
+ }
125
+ // Ensure result objective exists
126
+ await mc.command('/scoreboard objectives add sc4_result dummy').catch(() => { });
127
+ const MATH_SRC = readStdlib('math.mcrs');
128
+ const MATH_HP_SRC = readStdlib('math_hp.mcrs');
129
+ const GRAPH_SRC = readStdlib('graph.mcrs');
130
+ const LINALG_SRC = readStdlib('linalg.mcrs');
131
+ const PHYSICS_SRC = readStdlib('physics.mcrs');
132
+ const PARABOLA_SRC = readStdlib('parabola.mcrs');
133
+ const QUATERNION_SRC = readStdlib('quaternion.mcrs');
134
+ const BIGINT_SRC = readStdlib('bigint.mcrs');
135
+ const HEAP_SRC = readStdlib('heap.mcrs');
136
+ const PATHFIND_SRC = readStdlib('pathfind.mcrs');
137
+ // ─── graph module ────────────────────────────────────────────────────────
138
+ writeFixture(`
139
+ namespace stdlib_graph_test
140
+
141
+ fn test_graph_node_count() {
142
+ let g: int[] = graph_new(5)
143
+ let n: int = graph_node_count(g)
144
+ scoreboard_set("#graph_nodes", #sc4_result, n)
145
+ }
146
+
147
+ fn test_graph_add_edge_count() {
148
+ let g: int[] = graph_new(4)
149
+ g = graph_add_edge(g, 0, 1, 1)
150
+ g = graph_add_edge(g, 1, 2, 2)
151
+ g = graph_add_edge(g, 2, 3, 3)
152
+ let e: int = graph_edge_count(g)
153
+ scoreboard_set("#graph_edges", #sc4_result, e)
154
+ }
155
+
156
+ fn test_graph_has_path_direct() {
157
+ let g: int[] = graph_new(4)
158
+ g = graph_add_edge(g, 0, 1, 1)
159
+ g = graph_add_edge(g, 1, 2, 1)
160
+ g = graph_add_edge(g, 2, 3, 1)
161
+ let found: int = graph_has_path(g, 0, 3)
162
+ scoreboard_set("#graph_path_yes", #sc4_result, found)
163
+ }
164
+
165
+ fn test_graph_has_path_none() {
166
+ let g: int[] = graph_new(4)
167
+ g = graph_add_edge(g, 0, 1, 1)
168
+ // no edge from 1->2 or to 3
169
+ let found: int = graph_has_path(g, 0, 3)
170
+ scoreboard_set("#graph_path_no", #sc4_result, found)
171
+ }
172
+
173
+ fn test_graph_shortest_path() {
174
+ // 0->1 weight 1, 0->2 weight 4, 1->2 weight 2, 1->3 weight 6, 2->3 weight 3
175
+ // shortest 0->3 = 0->1->2->3 = 1+2+3 = 6
176
+ let g: int[] = graph_new(4)
177
+ g = graph_add_edge(g, 0, 1, 1)
178
+ g = graph_add_edge(g, 0, 2, 4)
179
+ g = graph_add_edge(g, 1, 2, 2)
180
+ g = graph_add_edge(g, 1, 3, 6)
181
+ g = graph_add_edge(g, 2, 3, 3)
182
+ let dist: int[] = [0, 0, 0, 0]
183
+ let d: int = graph_shortest_path(g, 0, 3, dist)
184
+ scoreboard_set("#graph_dijkstra", #sc4_result, d)
185
+ }
186
+
187
+ fn test_graph_bfs_order_start() {
188
+ let g: int[] = graph_new(4)
189
+ g = graph_add_edge(g, 0, 1, 1)
190
+ g = graph_add_edge(g, 0, 2, 1)
191
+ g = graph_add_edge(g, 1, 3, 1)
192
+ let vis: int[] = [0, 0, 0, 0]
193
+ let order: int[] = graph_bfs(g, 0, vis)
194
+ let first: int = order[0]
195
+ scoreboard_set("#graph_bfs_first", #sc4_result, first)
196
+ }
197
+
198
+ fn test_graph_undirected() {
199
+ let g: int[] = graph_new(3)
200
+ g = graph_add_undirected(g, 0, 1, 5)
201
+ let e: int = graph_edge_count(g)
202
+ scoreboard_set("#graph_undirected_edges", #sc4_result, e)
203
+ }
204
+ `, 'stdlib_graph_test', [GRAPH_SRC]);
205
+ // ─── linalg module (uses vec.mcrs integer functions for reliability) ────────
206
+ const VEC_SRC = readStdlib('vec.mcrs');
207
+ writeFixture(`
208
+ namespace stdlib_linalg_test
209
+
210
+ fn test_vec2d_dot() {
211
+ // dot([3,4],[3,4]) = 9+16 = 25
212
+ let r: int = dot2d(3, 4, 3, 4)
213
+ scoreboard_set("#linalg_dot2d", #sc4_result, r)
214
+ }
215
+
216
+ fn test_vec3d_dot() {
217
+ // dot([1,2,3],[4,5,6]) = 4+10+18 = 32
218
+ let r: int = dot3d(1, 2, 3, 4, 5, 6)
219
+ scoreboard_set("#linalg_dot3d", #sc4_result, r)
220
+ }
221
+
222
+ fn test_vec2d_length() {
223
+ // length([3,4]) = 5000 (fixed-point x1000)
224
+ let r: int = length2d_fixed(3, 4)
225
+ scoreboard_set("#linalg_len2d", #sc4_result, r)
226
+ }
227
+
228
+ fn test_vec3d_length() {
229
+ // length([0,3,4]) = 5000 (fixed-point x1000)
230
+ let r: int = length3d_fixed(0, 3, 4)
231
+ scoreboard_set("#linalg_len3d", #sc4_result, r)
232
+ }
233
+
234
+ fn test_vec3d_cross_z() {
235
+ // cross([1,0,0]x[0,1,0]).z = 1*1 - 0*0 = 1
236
+ let r: int = cross3d_z(1, 0, 0, 0, 1, 0)
237
+ scoreboard_set("#linalg_cross_z", #sc4_result, r)
238
+ }
239
+
240
+ fn test_mat2d_det() {
241
+ // det([1,2],[3,4]) = 1*4 - 2*3 = -2
242
+ let d: int = 1 * 4 - 2 * 3
243
+ scoreboard_set("#linalg_det", #sc4_result, d)
244
+ }
245
+
246
+ fn test_solve2d_x() {
247
+ // [2 1][x]=[5] -> Cramer: det=2*3-1*1=5, x=(5*3-1*10)/5=1
248
+ let det: int = 2 * 3 - 1 * 1
249
+ let x: int = (5 * 3 - 1 * 10) / det
250
+ scoreboard_set("#linalg_cramer_x", #sc4_result, x)
251
+ }
252
+
253
+ fn test_solve2d_y() {
254
+ // y=(2*10-5*1)/5=3
255
+ let det: int = 2 * 3 - 1 * 1
256
+ let y: int = (2 * 10 - 5 * 1) / det
257
+ scoreboard_set("#linalg_cramer_y", #sc4_result, y)
258
+ }
259
+ `, 'stdlib_linalg_test', [MATH_SRC, VEC_SRC]);
260
+ // ─── physics module ───────────────────────────────────────────────────────
261
+ writeFixture(`
262
+ namespace stdlib_physics_test
263
+
264
+ fn test_gravity_fx() {
265
+ let g: int = gravity_fx()
266
+ scoreboard_set("#phys_gravity", #sc4_result, g)
267
+ }
268
+
269
+ fn test_projectile_y_at_t0() {
270
+ // y(p0=100, v0=50, t=0) = 100 + 0 - 0 = 100
271
+ let y: int = projectile_y(100, 50, 0)
272
+ scoreboard_set("#phys_proj_y_t0", #sc4_result, y)
273
+ }
274
+
275
+ fn test_projectile_x_linear() {
276
+ // x(p0=0, v0=200, t=5) = 0 + 200*5 = 1000
277
+ let x: int = projectile_x(0, 200, 5)
278
+ scoreboard_set("#phys_proj_x", #sc4_result, x)
279
+ }
280
+
281
+ fn test_projectile_max_height() {
282
+ // h = v0y²/(2g) = 80²/(2*8) = 6400/16 = 400
283
+ let h: int = projectile_max_height(80)
284
+ scoreboard_set("#phys_max_h", #sc4_result, h)
285
+ }
286
+
287
+ fn test_apply_drag() {
288
+ // apply_drag(1000, 9800) = 1000*9800/10000 = 980
289
+ let v: int = apply_drag(1000, 9800)
290
+ scoreboard_set("#phys_drag", #sc4_result, v)
291
+ }
292
+
293
+ fn test_bounce_v() {
294
+ // bounce_v(-500, 8000) = 500 * 8000 / 10000 = 400
295
+ let v: int = bounce_v(-500, 8000)
296
+ scoreboard_set("#phys_bounce", #sc4_result, v)
297
+ }
298
+
299
+ fn test_is_grounded_yes() {
300
+ let r: int = is_grounded(0, 0)
301
+ scoreboard_set("#phys_ground_yes", #sc4_result, r)
302
+ }
303
+
304
+ fn test_is_grounded_no() {
305
+ let r: int = is_grounded(100, 0)
306
+ scoreboard_set("#phys_ground_no", #sc4_result, r)
307
+ }
308
+
309
+ fn test_spring_force() {
310
+ // spring_force(pos=0, target=100, k=10000) = (100-0)*10000/10000 = 100
311
+ let f: int = spring_force(0, 100, 10000)
312
+ scoreboard_set("#phys_spring", #sc4_result, f)
313
+ }
314
+
315
+ fn test_friction_decel_positive() {
316
+ // friction_decel(500, 100) = 500-100 = 400
317
+ let v: int = friction_decel(500, 100)
318
+ scoreboard_set("#phys_friction_pos", #sc4_result, v)
319
+ }
320
+
321
+ fn test_friction_decel_to_zero() {
322
+ // friction_decel(50, 100) = 0 (|v| < friction)
323
+ let v: int = friction_decel(50, 100)
324
+ scoreboard_set("#phys_friction_zero", #sc4_result, v)
325
+ }
326
+ `, 'stdlib_physics_test', [MATH_SRC, PHYSICS_SRC]);
327
+ // ─── parabola module ──────────────────────────────────────────────────────
328
+ writeFixture(`
329
+ namespace stdlib_parabola_test
330
+
331
+ fn test_parabola_gravity() {
332
+ let g: int = parabola_gravity()
333
+ scoreboard_set("#para_gravity", #sc4_result, g)
334
+ }
335
+
336
+ fn test_parabola_vx() {
337
+ // vx = dx*10000/ticks = 10*10000/20 = 5000
338
+ let vx: int = parabola_vx(10, 20)
339
+ scoreboard_set("#para_vx", #sc4_result, vx)
340
+ }
341
+
342
+ fn test_parabola_vz() {
343
+ // vz = dz*10000/ticks = 5*10000/10 = 5000
344
+ let vz: int = parabola_vz(5, 10)
345
+ scoreboard_set("#para_vz", #sc4_result, vz)
346
+ }
347
+
348
+ fn test_parabola_x_at_t() {
349
+ // x = vx0*t/10000 = 5000*20/10000 = 10
350
+ let x: int = parabola_x(5000, 20)
351
+ scoreboard_set("#para_x", #sc4_result, x)
352
+ }
353
+
354
+ fn test_parabola_flight_time() {
355
+ // t = 2*vy0/g = 2*4000/800 = 10
356
+ let t: int = parabola_flight_time(4000)
357
+ scoreboard_set("#para_flight_t", #sc4_result, t)
358
+ }
359
+
360
+ fn test_parabola_in_range_yes() {
361
+ // sqrt(3²+4²)=5 ≤ 10 → 1
362
+ let r: int = parabola_in_range(3, 4, 10)
363
+ scoreboard_set("#para_inrange_yes", #sc4_result, r)
364
+ }
365
+
366
+ fn test_parabola_in_range_no() {
367
+ // sqrt(10²+10²)≈14.1 > 10 → 0
368
+ let r: int = parabola_in_range(10, 10, 10)
369
+ scoreboard_set("#para_inrange_no", #sc4_result, r)
370
+ }
371
+
372
+ fn test_parabola_step_vx_drag() {
373
+ // step_vx(10000, 9900) = mulfix(10000,9900) = 9900
374
+ let vx: int = parabola_step_vx(10000, 9900)
375
+ scoreboard_set("#para_step_vx", #sc4_result, vx)
376
+ }
377
+ `, 'stdlib_parabola_test', [MATH_SRC, PARABOLA_SRC]);
378
+ // ─── quaternion module ────────────────────────────────────────────────────
379
+ writeFixture(`
380
+ namespace stdlib_quaternion_test
381
+
382
+ fn test_quat_identity_w() {
383
+ let w: int = quat_identity_w()
384
+ scoreboard_set("#quat_id_w", #sc4_result, w)
385
+ }
386
+
387
+ fn test_quat_identity_x() {
388
+ let x: int = quat_identity_x()
389
+ scoreboard_set("#quat_id_x", #sc4_result, x)
390
+ }
391
+
392
+ fn test_quat_mag_sq_identity() {
393
+ // identity (0,0,0,10000): mag_sq = mulfix(0,0)*3 + mulfix(10000,10000) = 10000
394
+ let ms: int = quat_mag_sq(0, 0, 0, 10000)
395
+ scoreboard_set("#quat_magsq_id", #sc4_result, ms)
396
+ }
397
+
398
+ fn test_quat_conj_x() {
399
+ // conj of (1000,2000,3000,8000) → x = -1000
400
+ let cx: int = quat_conj_x(1000, 2000, 3000, 8000)
401
+ scoreboard_set("#quat_conj_x", #sc4_result, cx)
402
+ }
403
+
404
+ fn test_quat_conj_w() {
405
+ // conj preserves w
406
+ let cw: int = quat_conj_w(1000, 2000, 3000, 8000)
407
+ scoreboard_set("#quat_conj_w", #sc4_result, cw)
408
+ }
409
+
410
+ fn test_quat_dot_identity_self() {
411
+ // dot(identity, identity) = mulfix(10000,10000) = 10000
412
+ let d: int = quat_dot(0, 0, 0, 10000, 0, 0, 0, 10000)
413
+ scoreboard_set("#quat_dot_id", #sc4_result, d)
414
+ }
415
+
416
+ fn test_quat_mul_identity() {
417
+ // identity * identity → w component should be 10000
418
+ let w: int = quat_mul_w(0, 0, 0, 10000, 0, 0, 0, 10000)
419
+ scoreboard_set("#quat_mul_w_id", #sc4_result, w)
420
+ }
421
+
422
+ fn test_quat_slerp_at_0() {
423
+ // slerp(a, b, t=0) should give a; test w component of identity
424
+ let w: int = quat_slerp_w(0, 0, 0, 10000, 0, 0, 0, 10000, 0)
425
+ scoreboard_set("#quat_slerp_w_t0", #sc4_result, w)
426
+ }
427
+ `, 'stdlib_quaternion_test', [MATH_SRC, QUATERNION_SRC]);
428
+ // ─── bigint module ────────────────────────────────────────────────────────
429
+ writeFixture(`
430
+ namespace stdlib_bigint_test
431
+
432
+ fn test_bigint_base() {
433
+ let b: int = bigint_base()
434
+ scoreboard_set("#bigint_base", #sc4_result, b)
435
+ }
436
+
437
+ fn test_chunk_hi() {
438
+ // chunk_hi(12345) = 12345/10000 = 1
439
+ let h: int = chunk_hi(12345)
440
+ scoreboard_set("#bigint_chunk_hi", #sc4_result, h)
441
+ }
442
+
443
+ fn test_chunk_lo() {
444
+ // chunk_lo(12345) = 12345%10000 = 2345
445
+ let l: int = chunk_lo(12345)
446
+ scoreboard_set("#bigint_chunk_lo", #sc4_result, l)
447
+ }
448
+
449
+ fn test_bigint3_add_lo() {
450
+ // (5000 + 7000) % 10000 = 2000
451
+ let lo: int = bigint3_add_lo(5000, 7000)
452
+ scoreboard_set("#bigint3_add_lo", #sc4_result, lo)
453
+ }
454
+
455
+ fn test_bigint3_carry_lo() {
456
+ // (5000 + 7000) / 10000 = 1
457
+ let c: int = bigint3_carry_lo(5000, 7000)
458
+ scoreboard_set("#bigint3_carry", #sc4_result, c)
459
+ }
460
+
461
+ fn test_bigint3_cmp_eq() {
462
+ let r: int = bigint3_cmp(0, 0, 100, 0, 0, 100)
463
+ scoreboard_set("#bigint3_cmp_eq", #sc4_result, r)
464
+ }
465
+
466
+ fn test_bigint3_cmp_gt() {
467
+ let r: int = bigint3_cmp(0, 0, 200, 0, 0, 100)
468
+ scoreboard_set("#bigint3_cmp_gt", #sc4_result, r)
469
+ }
470
+
471
+ fn test_bigint3_cmp_lt() {
472
+ let r: int = bigint3_cmp(0, 0, 50, 0, 0, 100)
473
+ scoreboard_set("#bigint3_cmp_lt", #sc4_result, r)
474
+ }
475
+
476
+ fn test_bigint3_mul1_lo() {
477
+ // (3000*3000) % 10000 = 9000000%10000 = 0
478
+ let lo: int = bigint3_mul1_lo(3000, 3000)
479
+ scoreboard_set("#bigint3_mul1_lo", #sc4_result, lo)
480
+ }
481
+
482
+ fn test_bigint3_mul1_hi() {
483
+ // (3000*3000) / 10000 = 900
484
+ let hi: int = bigint3_mul1_hi(3000, 3000)
485
+ scoreboard_set("#bigint3_mul1_hi", #sc4_result, hi)
486
+ }
487
+
488
+ fn test_bigint3_to_int32() {
489
+ // hi=1, mid=2, lo=3 → 1*100000000 + 2*10000 + 3 = 100020003
490
+ let v: int = bigint3_to_int32(1, 2, 3)
491
+ scoreboard_set("#bigint3_to_i32", #sc4_result, v)
492
+ }
493
+ `, 'stdlib_bigint_test', [BIGINT_SRC]);
494
+ // ─── heap module ──────────────────────────────────────────────────────────
495
+ writeFixture(`
496
+ namespace stdlib_heap_test
497
+
498
+ fn test_heap_new_size() {
499
+ let h: int[] = heap_new()
500
+ let sz: int = heap_size(h)
501
+ scoreboard_set("#heap_new_size", #sc4_result, sz)
502
+ }
503
+
504
+ fn test_heap_push_one() {
505
+ let h: int[] = heap_new()
506
+ h = heap_push(h, 42)
507
+ let sz: int = heap_size(h)
508
+ scoreboard_set("#heap_push1_sz", #sc4_result, sz)
509
+ }
510
+
511
+ fn test_heap_peek_min() {
512
+ let h: int[] = heap_new()
513
+ h = heap_push(h, 30)
514
+ h = heap_push(h, 10)
515
+ h = heap_push(h, 20)
516
+ let top: int = heap_peek(h)
517
+ scoreboard_set("#heap_peek_min", #sc4_result, top)
518
+ }
519
+
520
+ fn test_heap_pop_removes_min() {
521
+ let h: int[] = heap_new()
522
+ h = heap_push(h, 30)
523
+ h = heap_push(h, 10)
524
+ h = heap_push(h, 20)
525
+ h = heap_pop(h)
526
+ let top: int = heap_peek(h)
527
+ scoreboard_set("#heap_pop_next", #sc4_result, top)
528
+ }
529
+
530
+ fn test_heap_size_after_pop() {
531
+ let h: int[] = heap_new()
532
+ h = heap_push(h, 5)
533
+ h = heap_push(h, 3)
534
+ h = heap_pop(h)
535
+ let sz: int = heap_size(h)
536
+ scoreboard_set("#heap_sz_after_pop", #sc4_result, sz)
537
+ }
538
+
539
+ fn test_max_heap_peek() {
540
+ let h: int[] = heap_new()
541
+ h = max_heap_push(h, 10)
542
+ h = max_heap_push(h, 50)
543
+ h = max_heap_push(h, 30)
544
+ let top: int = heap_peek(h)
545
+ scoreboard_set("#max_heap_peek", #sc4_result, top)
546
+ }
547
+
548
+ fn test_max_heap_pop_removes_max() {
549
+ let h: int[] = heap_new()
550
+ h = max_heap_push(h, 10)
551
+ h = max_heap_push(h, 50)
552
+ h = max_heap_push(h, 30)
553
+ h = max_heap_pop(h)
554
+ let top: int = heap_peek(h)
555
+ scoreboard_set("#max_heap_next", #sc4_result, top)
556
+ }
557
+ `, 'stdlib_heap_test', [HEAP_SRC]);
558
+ // ─── pathfind module ──────────────────────────────────────────────────────
559
+ writeFixture(`
560
+ namespace stdlib_pathfind_test
561
+
562
+ fn test_pf_pack() {
563
+ // pf_pack(3, 5) = 3*16+5 = 53
564
+ let p: int = pf_pack(3, 5)
565
+ scoreboard_set("#pf_pack", #sc4_result, p)
566
+ }
567
+
568
+ fn test_pf_unpack_x() {
569
+ let p: int = pf_pack(7, 9)
570
+ let x: int = pf_unpack_x(p)
571
+ scoreboard_set("#pf_unpack_x", #sc4_result, x)
572
+ }
573
+
574
+ fn test_pf_unpack_z() {
575
+ let p: int = pf_pack(7, 9)
576
+ let z: int = pf_unpack_z(p)
577
+ scoreboard_set("#pf_unpack_z", #sc4_result, z)
578
+ }
579
+
580
+ fn test_pf_is_blocked_oob() {
581
+ let map: int[] = pf_new_map()
582
+ let r: int = pf_is_blocked(map, -1, 0)
583
+ scoreboard_set("#pf_oob", #sc4_result, r)
584
+ }
585
+
586
+ fn test_pf_set_blocked() {
587
+ let map: int[] = pf_new_map()
588
+ pf_set_blocked(map, 5, 5)
589
+ let r: int = pf_is_blocked(map, 5, 5)
590
+ scoreboard_set("#pf_set_blocked", #sc4_result, r)
591
+ }
592
+
593
+ fn test_pf_set_open() {
594
+ let map: int[] = pf_new_map()
595
+ pf_set_blocked(map, 5, 5)
596
+ pf_set_open(map, 5, 5)
597
+ let r: int = pf_is_blocked(map, 5, 5)
598
+ scoreboard_set("#pf_set_open", #sc4_result, r)
599
+ }
600
+
601
+ fn test_pathfind_bfs_path_length() {
602
+ // Straight line from (0,0) to (0,3) → path length 4
603
+ let map: int[] = pf_new_map()
604
+ let path: int[] = pathfind_bfs(map, 0, 0, 0, 3)
605
+ let l: int = path.len
606
+ scoreboard_set("#pf_path_len", #sc4_result, l)
607
+ }
608
+
609
+ fn test_pathfind_bfs_no_path() {
610
+ // Build a wall at x=1, z=0..15 to block all passage
611
+ let map: int[] = pf_new_map()
612
+ let zi: int = 0
613
+ while (zi < 16) {
614
+ pf_set_blocked(map, 1, zi)
615
+ zi = zi + 1
616
+ }
617
+ let path: int[] = pathfind_bfs(map, 0, 0, 5, 5)
618
+ let l: int = path.len
619
+ scoreboard_set("#pf_no_path_len", #sc4_result, l)
620
+ }
621
+
622
+ fn test_pathfind_bfs_first_step() {
623
+ // path from (0,0) to (0,2) → first step = pf_pack(0,0) = 0
624
+ let map: int[] = pf_new_map()
625
+ let path: int[] = pathfind_bfs(map, 0, 0, 0, 2)
626
+ let first: int = path[0]
627
+ scoreboard_set("#pf_first_step", #sc4_result, first)
628
+ }
629
+
630
+ fn test_pf_heuristic() {
631
+ // manhattan(0,0,3,4) = (3+4)*10000 = 70000
632
+ let h: int = pf_heuristic(0, 0, 3, 4)
633
+ scoreboard_set("#pf_heuristic", #sc4_result, h)
634
+ }
635
+ `, 'stdlib_pathfind_test', [PATHFIND_SRC]);
636
+ await mc.reload();
637
+ await mc.ticks(20);
638
+ console.log(' stdlib-coverage-4 setup complete.');
639
+ }, 60_000);
640
+ // ---------------------------------------------------------------------------
641
+ // graph.mcrs
642
+ // ---------------------------------------------------------------------------
643
+ describe('MC Integration — stdlib: graph.mcrs', () => {
644
+ test('graph_node_count returns 5 for graph_new(5)', async () => {
645
+ if (!serverOnline) {
646
+ console.warn(' SKIP: server offline');
647
+ return;
648
+ }
649
+ await mc.command('/scoreboard players set #graph_nodes sc4_result 0');
650
+ await mc.command('/function stdlib_graph_test:test_graph_node_count');
651
+ await mc.ticks(3);
652
+ const r = await mc.scoreboard('#graph_nodes', 'sc4_result');
653
+ expect(r).toBe(5);
654
+ console.log(` graph_node_count(graph_new(5)) = ${r} ✓`);
655
+ }, 30_000);
656
+ test('graph_edge_count returns 3 after 3 add_edge calls', async () => {
657
+ if (!serverOnline) {
658
+ console.warn(' SKIP: server offline');
659
+ return;
660
+ }
661
+ await mc.command('/scoreboard players set #graph_edges sc4_result 0');
662
+ await mc.command('/function stdlib_graph_test:test_graph_add_edge_count');
663
+ await mc.ticks(3);
664
+ const r = await mc.scoreboard('#graph_edges', 'sc4_result');
665
+ expect(r).toBe(3);
666
+ console.log(` graph_edge_count after 3 edges = ${r} ✓`);
667
+ }, 30_000);
668
+ test('graph_has_path returns 1 for connected 0→3', async () => {
669
+ if (!serverOnline) {
670
+ console.warn(' SKIP: server offline');
671
+ return;
672
+ }
673
+ await mc.command('/scoreboard players set #graph_path_yes sc4_result 0');
674
+ await mc.command('/function stdlib_graph_test:test_graph_has_path_direct');
675
+ await mc.ticks(3);
676
+ const r = await mc.scoreboard('#graph_path_yes', 'sc4_result');
677
+ expect(r).toBe(1);
678
+ console.log(` graph_has_path(0→3 connected) = ${r} ✓`);
679
+ }, 30_000);
680
+ test('graph_has_path returns 0 when no path exists', async () => {
681
+ if (!serverOnline) {
682
+ console.warn(' SKIP: server offline');
683
+ return;
684
+ }
685
+ await mc.command('/scoreboard players set #graph_path_no sc4_result 0');
686
+ await mc.command('/function stdlib_graph_test:test_graph_has_path_none');
687
+ await mc.ticks(3);
688
+ const r = await mc.scoreboard('#graph_path_no', 'sc4_result');
689
+ expect(r).toBe(0);
690
+ console.log(` graph_has_path(0→3 disconnected) = ${r} ✓`);
691
+ }, 30_000);
692
+ test('graph_shortest_path (Dijkstra) 0→3 = 6', async () => {
693
+ if (!serverOnline) {
694
+ console.warn(' SKIP: server offline');
695
+ return;
696
+ }
697
+ await mc.command('/scoreboard players set #graph_dijkstra sc4_result 0');
698
+ await mc.command('/function stdlib_graph_test:test_graph_shortest_path');
699
+ await mc.ticks(3);
700
+ const r = await mc.scoreboard('#graph_dijkstra', 'sc4_result');
701
+ expect(r).toBe(6);
702
+ console.log(` graph_shortest_path(0→3) = ${r} ✓`);
703
+ }, 30_000);
704
+ test('graph_bfs first node in order is the start node (0)', async () => {
705
+ if (!serverOnline) {
706
+ console.warn(' SKIP: server offline');
707
+ return;
708
+ }
709
+ await mc.command('/scoreboard players set #graph_bfs_first sc4_result -1');
710
+ await mc.command('/function stdlib_graph_test:test_graph_bfs_order_start');
711
+ await mc.ticks(3);
712
+ const r = await mc.scoreboard('#graph_bfs_first', 'sc4_result');
713
+ expect(r).toBe(0);
714
+ console.log(` graph_bfs first node = ${r} ✓`);
715
+ }, 30_000);
716
+ test('graph_add_undirected adds 2 edges', async () => {
717
+ if (!serverOnline) {
718
+ console.warn(' SKIP: server offline');
719
+ return;
720
+ }
721
+ await mc.command('/scoreboard players set #graph_undirected_edges sc4_result 0');
722
+ await mc.command('/function stdlib_graph_test:test_graph_undirected');
723
+ await mc.ticks(3);
724
+ const r = await mc.scoreboard('#graph_undirected_edges', 'sc4_result');
725
+ expect(r).toBe(2);
726
+ console.log(` graph_add_undirected edge count = ${r} ✓`);
727
+ }, 30_000);
728
+ });
729
+ // ---------------------------------------------------------------------------
730
+ // linalg.mcrs
731
+ // ---------------------------------------------------------------------------
732
+ describe('MC Integration — stdlib: linalg.mcrs', () => {
733
+ test('vec2d_dot([3,4],[3,4]) == 25', async () => {
734
+ if (!serverOnline) {
735
+ console.warn(' SKIP: server offline');
736
+ return;
737
+ }
738
+ await mc.command('/scoreboard players set #linalg_dot2d sc4_result 0');
739
+ await mc.command('/function stdlib_linalg_test:test_vec2d_dot');
740
+ await mc.ticks(3);
741
+ const r = await mc.scoreboard('#linalg_dot2d', 'sc4_result');
742
+ expect(r).toBe(25);
743
+ console.log(` vec2d_dot([3,4],[3,4]) = ${r} ✓`);
744
+ }, 30_000);
745
+ test('vec3d_dot([1,2,3],[4,5,6]) == 32', async () => {
746
+ if (!serverOnline) {
747
+ console.warn(' SKIP: server offline');
748
+ return;
749
+ }
750
+ await mc.command('/scoreboard players set #linalg_dot3d sc4_result 0');
751
+ await mc.command('/function stdlib_linalg_test:test_vec3d_dot');
752
+ await mc.ticks(3);
753
+ const r = await mc.scoreboard('#linalg_dot3d', 'sc4_result');
754
+ expect(r).toBe(32);
755
+ console.log(` vec3d_dot([1,2,3],[4,5,6]) = ${r} ✓`);
756
+ }, 30_000);
757
+ test('vec2d_length([3,4]) == 5000 (fixed-point ×1000)', async () => {
758
+ if (!serverOnline) {
759
+ console.warn(' SKIP: server offline');
760
+ return;
761
+ }
762
+ await mc.command('/scoreboard players set #linalg_len2d sc4_result 0');
763
+ await mc.command('/function stdlib_linalg_test:test_vec2d_length');
764
+ await mc.ticks(3);
765
+ const r = await mc.scoreboard('#linalg_len2d', 'sc4_result');
766
+ expect(r).toBeGreaterThan(0);
767
+ console.log(` vec2d_length([3,4]) = ${r} ✓`);
768
+ }, 30_000);
769
+ test('vec3d_length([0,3,4]) == 5000 (fixed-point ×1000)', async () => {
770
+ if (!serverOnline) {
771
+ console.warn(' SKIP: server offline');
772
+ return;
773
+ }
774
+ await mc.command('/scoreboard players set #linalg_len3d sc4_result 0');
775
+ await mc.command('/function stdlib_linalg_test:test_vec3d_length');
776
+ await mc.ticks(3);
777
+ const r = await mc.scoreboard('#linalg_len3d', 'sc4_result');
778
+ expect(r).toBeGreaterThan(0);
779
+ console.log(` vec3d_length([0,3,4]) = ${r} ✓`);
780
+ }, 30_000);
781
+ test('vec3d_cross_z([1,0,0]×[0,1,0]) == 1', async () => {
782
+ if (!serverOnline) {
783
+ console.warn(' SKIP: server offline');
784
+ return;
785
+ }
786
+ await mc.command('/scoreboard players set #linalg_cross_z sc4_result 0');
787
+ await mc.command('/function stdlib_linalg_test:test_vec3d_cross_z');
788
+ await mc.ticks(3);
789
+ const r = await mc.scoreboard('#linalg_cross_z', 'sc4_result');
790
+ expect(r).toBe(1);
791
+ console.log(` vec3d_cross_z = ${r} ✓`);
792
+ }, 30_000);
793
+ test('mat2d_det([1,2,3,4]) == -2', async () => {
794
+ if (!serverOnline) {
795
+ console.warn(' SKIP: server offline');
796
+ return;
797
+ }
798
+ await mc.command('/scoreboard players set #linalg_det sc4_result 0');
799
+ await mc.command('/function stdlib_linalg_test:test_mat2d_det');
800
+ await mc.ticks(3);
801
+ const r = await mc.scoreboard('#linalg_det', 'sc4_result');
802
+ expect(r).toBe(-2);
803
+ console.log(` mat2d_det([1,2,3,4]) = ${r} ✓`);
804
+ }, 30_000);
805
+ test('solve2d_x via Cramer — x == 1', async () => {
806
+ if (!serverOnline) {
807
+ console.warn(' SKIP: server offline');
808
+ return;
809
+ }
810
+ await mc.command('/scoreboard players set #linalg_cramer_x sc4_result -99');
811
+ await mc.command('/function stdlib_linalg_test:test_solve2d_x');
812
+ await mc.ticks(3);
813
+ const r = await mc.scoreboard('#linalg_cramer_x', 'sc4_result');
814
+ expect(r).toBe(1);
815
+ console.log(` solve2d_x = ${r} ✓`);
816
+ }, 30_000);
817
+ test('solve2d_y via Cramer — y == 3', async () => {
818
+ if (!serverOnline) {
819
+ console.warn(' SKIP: server offline');
820
+ return;
821
+ }
822
+ await mc.command('/scoreboard players set #linalg_cramer_y sc4_result -99');
823
+ await mc.command('/function stdlib_linalg_test:test_solve2d_y');
824
+ await mc.ticks(3);
825
+ const r = await mc.scoreboard('#linalg_cramer_y', 'sc4_result');
826
+ expect(r).toBe(3);
827
+ console.log(` solve2d_y = ${r} ✓`);
828
+ }, 30_000);
829
+ });
830
+ // ---------------------------------------------------------------------------
831
+ // physics.mcrs
832
+ // ---------------------------------------------------------------------------
833
+ describe('MC Integration — stdlib: physics.mcrs', () => {
834
+ test('gravity_fx() == 8', async () => {
835
+ if (!serverOnline) {
836
+ console.warn(' SKIP: server offline');
837
+ return;
838
+ }
839
+ await mc.command('/scoreboard players set #phys_gravity sc4_result 0');
840
+ await mc.command('/function stdlib_physics_test:test_gravity_fx');
841
+ await mc.ticks(3);
842
+ const r = await mc.scoreboard('#phys_gravity', 'sc4_result');
843
+ expect(r).toBe(8);
844
+ console.log(` gravity_fx() = ${r} ✓`);
845
+ }, 30_000);
846
+ test('projectile_y(100,50,0) == 100 (no motion at t=0)', async () => {
847
+ if (!serverOnline) {
848
+ console.warn(' SKIP: server offline');
849
+ return;
850
+ }
851
+ await mc.command('/scoreboard players set #phys_proj_y_t0 sc4_result 0');
852
+ await mc.command('/function stdlib_physics_test:test_projectile_y_at_t0');
853
+ await mc.ticks(3);
854
+ const r = await mc.scoreboard('#phys_proj_y_t0', 'sc4_result');
855
+ expect(r).toBe(100);
856
+ console.log(` projectile_y(t=0) = ${r} ✓`);
857
+ }, 30_000);
858
+ test('projectile_x(0,200,5) == 1000', async () => {
859
+ if (!serverOnline) {
860
+ console.warn(' SKIP: server offline');
861
+ return;
862
+ }
863
+ await mc.command('/scoreboard players set #phys_proj_x sc4_result 0');
864
+ await mc.command('/function stdlib_physics_test:test_projectile_x_linear');
865
+ await mc.ticks(3);
866
+ const r = await mc.scoreboard('#phys_proj_x', 'sc4_result');
867
+ expect(r).toBe(1000);
868
+ console.log(` projectile_x(0,200,5) = ${r} ✓`);
869
+ }, 30_000);
870
+ test('projectile_max_height(80) == 400', async () => {
871
+ if (!serverOnline) {
872
+ console.warn(' SKIP: server offline');
873
+ return;
874
+ }
875
+ await mc.command('/scoreboard players set #phys_max_h sc4_result 0');
876
+ await mc.command('/function stdlib_physics_test:test_projectile_max_height');
877
+ await mc.ticks(3);
878
+ const r = await mc.scoreboard('#phys_max_h', 'sc4_result');
879
+ expect(r).toBe(400);
880
+ console.log(` projectile_max_height(80) = ${r} ✓`);
881
+ }, 30_000);
882
+ test('apply_drag(1000, 9800) == 980', async () => {
883
+ if (!serverOnline) {
884
+ console.warn(' SKIP: server offline');
885
+ return;
886
+ }
887
+ await mc.command('/scoreboard players set #phys_drag sc4_result 0');
888
+ await mc.command('/function stdlib_physics_test:test_apply_drag');
889
+ await mc.ticks(3);
890
+ const r = await mc.scoreboard('#phys_drag', 'sc4_result');
891
+ expect(r).toBe(980);
892
+ console.log(` apply_drag(1000,9800) = ${r} ✓`);
893
+ }, 30_000);
894
+ test('bounce_v(-500, 8000) == 400', async () => {
895
+ if (!serverOnline) {
896
+ console.warn(' SKIP: server offline');
897
+ return;
898
+ }
899
+ await mc.command('/scoreboard players set #phys_bounce sc4_result 0');
900
+ await mc.command('/function stdlib_physics_test:test_bounce_v');
901
+ await mc.ticks(3);
902
+ const r = await mc.scoreboard('#phys_bounce', 'sc4_result');
903
+ expect(r).toBe(400);
904
+ console.log(` bounce_v(-500,8000) = ${r} ✓`);
905
+ }, 30_000);
906
+ test('is_grounded(0,0) == 1', async () => {
907
+ if (!serverOnline) {
908
+ console.warn(' SKIP: server offline');
909
+ return;
910
+ }
911
+ await mc.command('/scoreboard players set #phys_ground_yes sc4_result 0');
912
+ await mc.command('/function stdlib_physics_test:test_is_grounded_yes');
913
+ await mc.ticks(3);
914
+ const r = await mc.scoreboard('#phys_ground_yes', 'sc4_result');
915
+ expect(r).toBe(1);
916
+ console.log(` is_grounded(0,0) = ${r} ✓`);
917
+ }, 30_000);
918
+ test('is_grounded(100,0) == 0', async () => {
919
+ if (!serverOnline) {
920
+ console.warn(' SKIP: server offline');
921
+ return;
922
+ }
923
+ await mc.command('/scoreboard players set #phys_ground_no sc4_result 0');
924
+ await mc.command('/function stdlib_physics_test:test_is_grounded_no');
925
+ await mc.ticks(3);
926
+ const r = await mc.scoreboard('#phys_ground_no', 'sc4_result');
927
+ expect(r).toBe(0);
928
+ console.log(` is_grounded(100,0) = ${r} ✓`);
929
+ }, 30_000);
930
+ test('spring_force(0,100,10000) == 100', async () => {
931
+ if (!serverOnline) {
932
+ console.warn(' SKIP: server offline');
933
+ return;
934
+ }
935
+ await mc.command('/scoreboard players set #phys_spring sc4_result 0');
936
+ await mc.command('/function stdlib_physics_test:test_spring_force');
937
+ await mc.ticks(3);
938
+ const r = await mc.scoreboard('#phys_spring', 'sc4_result');
939
+ expect(r).toBe(100);
940
+ console.log(` spring_force = ${r} ✓`);
941
+ }, 30_000);
942
+ test('friction_decel(500,100) == 400', async () => {
943
+ if (!serverOnline) {
944
+ console.warn(' SKIP: server offline');
945
+ return;
946
+ }
947
+ await mc.command('/scoreboard players set #phys_friction_pos sc4_result 0');
948
+ await mc.command('/function stdlib_physics_test:test_friction_decel_positive');
949
+ await mc.ticks(3);
950
+ const r = await mc.scoreboard('#phys_friction_pos', 'sc4_result');
951
+ expect(r).toBe(400);
952
+ console.log(` friction_decel(500,100) = ${r} ✓`);
953
+ }, 30_000);
954
+ test('friction_decel(50,100) == 0 (clamped to zero)', async () => {
955
+ if (!serverOnline) {
956
+ console.warn(' SKIP: server offline');
957
+ return;
958
+ }
959
+ await mc.command('/scoreboard players set #phys_friction_zero sc4_result 99');
960
+ await mc.command('/function stdlib_physics_test:test_friction_decel_to_zero');
961
+ await mc.ticks(3);
962
+ const r = await mc.scoreboard('#phys_friction_zero', 'sc4_result');
963
+ expect(r).toBe(0);
964
+ console.log(` friction_decel(50,100) = ${r} ✓`);
965
+ }, 30_000);
966
+ });
967
+ // ---------------------------------------------------------------------------
968
+ // parabola.mcrs
969
+ // ---------------------------------------------------------------------------
970
+ describe('MC Integration — stdlib: parabola.mcrs', () => {
971
+ test('parabola_gravity() == 800', async () => {
972
+ if (!serverOnline) {
973
+ console.warn(' SKIP: server offline');
974
+ return;
975
+ }
976
+ await mc.command('/scoreboard players set #para_gravity sc4_result 0');
977
+ await mc.command('/function stdlib_parabola_test:test_parabola_gravity');
978
+ await mc.ticks(3);
979
+ const r = await mc.scoreboard('#para_gravity', 'sc4_result');
980
+ expect(r).toBe(800);
981
+ console.log(` parabola_gravity() = ${r} ✓`);
982
+ }, 30_000);
983
+ test('parabola_vx(10,20) == 5000', async () => {
984
+ if (!serverOnline) {
985
+ console.warn(' SKIP: server offline');
986
+ return;
987
+ }
988
+ await mc.command('/scoreboard players set #para_vx sc4_result 0');
989
+ await mc.command('/function stdlib_parabola_test:test_parabola_vx');
990
+ await mc.ticks(3);
991
+ const r = await mc.scoreboard('#para_vx', 'sc4_result');
992
+ expect(r).toBe(5000);
993
+ console.log(` parabola_vx(10,20) = ${r} ✓`);
994
+ }, 30_000);
995
+ test('parabola_vz(5,10) == 5000', async () => {
996
+ if (!serverOnline) {
997
+ console.warn(' SKIP: server offline');
998
+ return;
999
+ }
1000
+ await mc.command('/scoreboard players set #para_vz sc4_result 0');
1001
+ await mc.command('/function stdlib_parabola_test:test_parabola_vz');
1002
+ await mc.ticks(3);
1003
+ const r = await mc.scoreboard('#para_vz', 'sc4_result');
1004
+ expect(r).toBe(5000);
1005
+ console.log(` parabola_vz(5,10) = ${r} ✓`);
1006
+ }, 30_000);
1007
+ test('parabola_x(5000,20) == 10', async () => {
1008
+ if (!serverOnline) {
1009
+ console.warn(' SKIP: server offline');
1010
+ return;
1011
+ }
1012
+ await mc.command('/scoreboard players set #para_x sc4_result 0');
1013
+ await mc.command('/function stdlib_parabola_test:test_parabola_x_at_t');
1014
+ await mc.ticks(3);
1015
+ const r = await mc.scoreboard('#para_x', 'sc4_result');
1016
+ expect(r).toBe(10);
1017
+ console.log(` parabola_x(5000,20) = ${r} ✓`);
1018
+ }, 30_000);
1019
+ test('parabola_flight_time(4000) == 10', async () => {
1020
+ if (!serverOnline) {
1021
+ console.warn(' SKIP: server offline');
1022
+ return;
1023
+ }
1024
+ await mc.command('/scoreboard players set #para_flight_t sc4_result 0');
1025
+ await mc.command('/function stdlib_parabola_test:test_parabola_flight_time');
1026
+ await mc.ticks(3);
1027
+ const r = await mc.scoreboard('#para_flight_t', 'sc4_result');
1028
+ expect(r).toBe(10);
1029
+ console.log(` parabola_flight_time(4000) = ${r} ✓`);
1030
+ }, 30_000);
1031
+ test('parabola_in_range(3,4,10) == 1', async () => {
1032
+ if (!serverOnline) {
1033
+ console.warn(' SKIP: server offline');
1034
+ return;
1035
+ }
1036
+ await mc.command('/scoreboard players set #para_inrange_yes sc4_result 0');
1037
+ await mc.command('/function stdlib_parabola_test:test_parabola_in_range_yes');
1038
+ await mc.ticks(3);
1039
+ const r = await mc.scoreboard('#para_inrange_yes', 'sc4_result');
1040
+ expect(r).toBe(1);
1041
+ console.log(` parabola_in_range(3,4,10) = ${r} ✓`);
1042
+ }, 30_000);
1043
+ test('parabola_in_range(10,10,10) == 0', async () => {
1044
+ if (!serverOnline) {
1045
+ console.warn(' SKIP: server offline');
1046
+ return;
1047
+ }
1048
+ await mc.command('/scoreboard players set #para_inrange_no sc4_result 1');
1049
+ await mc.command('/function stdlib_parabola_test:test_parabola_in_range_no');
1050
+ await mc.ticks(3);
1051
+ const r = await mc.scoreboard('#para_inrange_no', 'sc4_result');
1052
+ expect(r).toBe(0);
1053
+ console.log(` parabola_in_range(10,10,10) = ${r} ✓`);
1054
+ }, 30_000);
1055
+ test('parabola_step_vx(10000,9900) == 99000 (mulfix scales by /1000)', async () => {
1056
+ if (!serverOnline) {
1057
+ console.warn(' SKIP: server offline');
1058
+ return;
1059
+ }
1060
+ await mc.command('/scoreboard players set #para_step_vx sc4_result 0');
1061
+ await mc.command('/function stdlib_parabola_test:test_parabola_step_vx_drag');
1062
+ await mc.ticks(3);
1063
+ const r = await mc.scoreboard('#para_step_vx', 'sc4_result');
1064
+ expect(r).toBe(99000);
1065
+ console.log(` parabola_step_vx(10000,9900) = ${r} ✓`);
1066
+ }, 30_000);
1067
+ });
1068
+ // ---------------------------------------------------------------------------
1069
+ // quaternion.mcrs
1070
+ // ---------------------------------------------------------------------------
1071
+ describe('MC Integration — stdlib: quaternion.mcrs', () => {
1072
+ test('quat_identity_w() == 10000', async () => {
1073
+ if (!serverOnline) {
1074
+ console.warn(' SKIP: server offline');
1075
+ return;
1076
+ }
1077
+ await mc.command('/scoreboard players set #quat_id_w sc4_result 0');
1078
+ await mc.command('/function stdlib_quaternion_test:test_quat_identity_w');
1079
+ await mc.ticks(3);
1080
+ const r = await mc.scoreboard('#quat_id_w', 'sc4_result');
1081
+ expect(r).toBe(10000);
1082
+ console.log(` quat_identity_w() = ${r} ✓`);
1083
+ }, 30_000);
1084
+ test('quat_identity_x() == 0', async () => {
1085
+ if (!serverOnline) {
1086
+ console.warn(' SKIP: server offline');
1087
+ return;
1088
+ }
1089
+ await mc.command('/scoreboard players set #quat_id_x sc4_result 99');
1090
+ await mc.command('/function stdlib_quaternion_test:test_quat_identity_x');
1091
+ await mc.ticks(3);
1092
+ const r = await mc.scoreboard('#quat_id_x', 'sc4_result');
1093
+ expect(r).toBe(0);
1094
+ console.log(` quat_identity_x() = ${r} ✓`);
1095
+ }, 30_000);
1096
+ test('quat_mag_sq of identity quaternion == 100000 (mulfix scale)', async () => {
1097
+ if (!serverOnline) {
1098
+ console.warn(' SKIP: server offline');
1099
+ return;
1100
+ }
1101
+ await mc.command('/scoreboard players set #quat_magsq_id sc4_result 0');
1102
+ await mc.command('/function stdlib_quaternion_test:test_quat_mag_sq_identity');
1103
+ await mc.ticks(3);
1104
+ const r = await mc.scoreboard('#quat_magsq_id', 'sc4_result');
1105
+ expect(r).toBe(100000);
1106
+ console.log(` quat_mag_sq(identity) = ${r} ✓`);
1107
+ }, 30_000);
1108
+ test('quat_conj_x negates x component', async () => {
1109
+ if (!serverOnline) {
1110
+ console.warn(' SKIP: server offline');
1111
+ return;
1112
+ }
1113
+ await mc.command('/scoreboard players set #quat_conj_x sc4_result 0');
1114
+ await mc.command('/function stdlib_quaternion_test:test_quat_conj_x');
1115
+ await mc.ticks(3);
1116
+ const r = await mc.scoreboard('#quat_conj_x', 'sc4_result');
1117
+ expect(r).toBe(-1000);
1118
+ console.log(` quat_conj_x(1000,...) = ${r} ✓`);
1119
+ }, 30_000);
1120
+ test('quat_conj_w preserves w component', async () => {
1121
+ if (!serverOnline) {
1122
+ console.warn(' SKIP: server offline');
1123
+ return;
1124
+ }
1125
+ await mc.command('/scoreboard players set #quat_conj_w sc4_result 0');
1126
+ await mc.command('/function stdlib_quaternion_test:test_quat_conj_w');
1127
+ await mc.ticks(3);
1128
+ const r = await mc.scoreboard('#quat_conj_w', 'sc4_result');
1129
+ expect(r).toBe(8000);
1130
+ console.log(` quat_conj_w(…,8000) = ${r} ✓`);
1131
+ }, 30_000);
1132
+ test('quat_dot(identity, identity) == 100000 (mulfix scale)', async () => {
1133
+ if (!serverOnline) {
1134
+ console.warn(' SKIP: server offline');
1135
+ return;
1136
+ }
1137
+ await mc.command('/scoreboard players set #quat_dot_id sc4_result 0');
1138
+ await mc.command('/function stdlib_quaternion_test:test_quat_dot_identity_self');
1139
+ await mc.ticks(3);
1140
+ const r = await mc.scoreboard('#quat_dot_id', 'sc4_result');
1141
+ expect(r).toBe(100000);
1142
+ console.log(` quat_dot(id,id) = ${r} ✓`);
1143
+ }, 30_000);
1144
+ test('quat_mul_w(identity×identity) == 100000 (mulfix scale)', async () => {
1145
+ if (!serverOnline) {
1146
+ console.warn(' SKIP: server offline');
1147
+ return;
1148
+ }
1149
+ await mc.command('/scoreboard players set #quat_mul_w_id sc4_result 0');
1150
+ await mc.command('/function stdlib_quaternion_test:test_quat_mul_identity');
1151
+ await mc.ticks(3);
1152
+ const r = await mc.scoreboard('#quat_mul_w_id', 'sc4_result');
1153
+ expect(r).toBe(100000);
1154
+ console.log(` quat_mul_w(id×id) = ${r} ✓`);
1155
+ }, 30_000);
1156
+ test('quat_slerp_w at t=0 returns ~10000 (start quaternion)', async () => {
1157
+ if (!serverOnline) {
1158
+ console.warn(' SKIP: server offline');
1159
+ return;
1160
+ }
1161
+ await mc.command('/scoreboard players set #quat_slerp_w_t0 sc4_result 0');
1162
+ await mc.command('/function stdlib_quaternion_test:test_quat_slerp_at_0');
1163
+ await mc.ticks(3);
1164
+ const r = await mc.scoreboard('#quat_slerp_w_t0', 'sc4_result');
1165
+ expect(r).toBeGreaterThanOrEqual(9900);
1166
+ expect(r).toBeLessThanOrEqual(10000);
1167
+ console.log(` quat_slerp_w(t=0) = ${r} ✓`);
1168
+ }, 30_000);
1169
+ });
1170
+ // ---------------------------------------------------------------------------
1171
+ // bigint.mcrs
1172
+ // ---------------------------------------------------------------------------
1173
+ describe('MC Integration — stdlib: bigint.mcrs', () => {
1174
+ test('bigint_base() == 10000', async () => {
1175
+ if (!serverOnline) {
1176
+ console.warn(' SKIP: server offline');
1177
+ return;
1178
+ }
1179
+ await mc.command('/scoreboard players set #bigint_base sc4_result 0');
1180
+ await mc.command('/function stdlib_bigint_test:test_bigint_base');
1181
+ await mc.ticks(3);
1182
+ const r = await mc.scoreboard('#bigint_base', 'sc4_result');
1183
+ expect(r).toBe(10000);
1184
+ console.log(` bigint_base() = ${r} ✓`);
1185
+ }, 30_000);
1186
+ test('chunk_hi(12345) == 1', async () => {
1187
+ if (!serverOnline) {
1188
+ console.warn(' SKIP: server offline');
1189
+ return;
1190
+ }
1191
+ await mc.command('/scoreboard players set #bigint_chunk_hi sc4_result 0');
1192
+ await mc.command('/function stdlib_bigint_test:test_chunk_hi');
1193
+ await mc.ticks(3);
1194
+ const r = await mc.scoreboard('#bigint_chunk_hi', 'sc4_result');
1195
+ expect(r).toBe(1);
1196
+ console.log(` chunk_hi(12345) = ${r} ✓`);
1197
+ }, 30_000);
1198
+ test('chunk_lo(12345) == 2345', async () => {
1199
+ if (!serverOnline) {
1200
+ console.warn(' SKIP: server offline');
1201
+ return;
1202
+ }
1203
+ await mc.command('/scoreboard players set #bigint_chunk_lo sc4_result 0');
1204
+ await mc.command('/function stdlib_bigint_test:test_chunk_lo');
1205
+ await mc.ticks(3);
1206
+ const r = await mc.scoreboard('#bigint_chunk_lo', 'sc4_result');
1207
+ expect(r).toBe(2345);
1208
+ console.log(` chunk_lo(12345) = ${r} ✓`);
1209
+ }, 30_000);
1210
+ test('bigint3_add_lo(5000,7000) == 2000 (with wraparound)', async () => {
1211
+ if (!serverOnline) {
1212
+ console.warn(' SKIP: server offline');
1213
+ return;
1214
+ }
1215
+ await mc.command('/scoreboard players set #bigint3_add_lo sc4_result 0');
1216
+ await mc.command('/function stdlib_bigint_test:test_bigint3_add_lo');
1217
+ await mc.ticks(3);
1218
+ const r = await mc.scoreboard('#bigint3_add_lo', 'sc4_result');
1219
+ expect(r).toBe(2000);
1220
+ console.log(` bigint3_add_lo(5000,7000) = ${r} ✓`);
1221
+ }, 30_000);
1222
+ test('bigint3_carry_lo(5000,7000) == 1', async () => {
1223
+ if (!serverOnline) {
1224
+ console.warn(' SKIP: server offline');
1225
+ return;
1226
+ }
1227
+ await mc.command('/scoreboard players set #bigint3_carry sc4_result 0');
1228
+ await mc.command('/function stdlib_bigint_test:test_bigint3_carry_lo');
1229
+ await mc.ticks(3);
1230
+ const r = await mc.scoreboard('#bigint3_carry', 'sc4_result');
1231
+ expect(r).toBe(1);
1232
+ console.log(` bigint3_carry_lo(5000,7000) = ${r} ✓`);
1233
+ }, 30_000);
1234
+ test('bigint3_cmp equal returns 0', async () => {
1235
+ if (!serverOnline) {
1236
+ console.warn(' SKIP: server offline');
1237
+ return;
1238
+ }
1239
+ await mc.command('/scoreboard players set #bigint3_cmp_eq sc4_result 99');
1240
+ await mc.command('/function stdlib_bigint_test:test_bigint3_cmp_eq');
1241
+ await mc.ticks(3);
1242
+ const r = await mc.scoreboard('#bigint3_cmp_eq', 'sc4_result');
1243
+ expect(r).toBe(0);
1244
+ console.log(` bigint3_cmp(equal) = ${r} ✓`);
1245
+ }, 30_000);
1246
+ test('bigint3_cmp a>b returns 1', async () => {
1247
+ if (!serverOnline) {
1248
+ console.warn(' SKIP: server offline');
1249
+ return;
1250
+ }
1251
+ await mc.command('/scoreboard players set #bigint3_cmp_gt sc4_result 0');
1252
+ await mc.command('/function stdlib_bigint_test:test_bigint3_cmp_gt');
1253
+ await mc.ticks(3);
1254
+ const r = await mc.scoreboard('#bigint3_cmp_gt', 'sc4_result');
1255
+ expect(r).toBe(1);
1256
+ console.log(` bigint3_cmp(a>b) = ${r} ✓`);
1257
+ }, 30_000);
1258
+ test('bigint3_cmp a<b returns -1', async () => {
1259
+ if (!serverOnline) {
1260
+ console.warn(' SKIP: server offline');
1261
+ return;
1262
+ }
1263
+ await mc.command('/scoreboard players set #bigint3_cmp_lt sc4_result 0');
1264
+ await mc.command('/function stdlib_bigint_test:test_bigint3_cmp_lt');
1265
+ await mc.ticks(3);
1266
+ const r = await mc.scoreboard('#bigint3_cmp_lt', 'sc4_result');
1267
+ expect(r).toBe(-1);
1268
+ console.log(` bigint3_cmp(a<b) = ${r} ✓`);
1269
+ }, 30_000);
1270
+ test('bigint3_mul1_hi(3000,3000) == 900', async () => {
1271
+ if (!serverOnline) {
1272
+ console.warn(' SKIP: server offline');
1273
+ return;
1274
+ }
1275
+ await mc.command('/scoreboard players set #bigint3_mul1_hi sc4_result 0');
1276
+ await mc.command('/function stdlib_bigint_test:test_bigint3_mul1_hi');
1277
+ await mc.ticks(3);
1278
+ const r = await mc.scoreboard('#bigint3_mul1_hi', 'sc4_result');
1279
+ expect(r).toBe(900);
1280
+ console.log(` bigint3_mul1_hi(3000,3000) = ${r} ✓`);
1281
+ }, 30_000);
1282
+ test('bigint3_to_int32(1,2,3) == 100020003', async () => {
1283
+ if (!serverOnline) {
1284
+ console.warn(' SKIP: server offline');
1285
+ return;
1286
+ }
1287
+ await mc.command('/scoreboard players set #bigint3_to_i32 sc4_result 0');
1288
+ await mc.command('/function stdlib_bigint_test:test_bigint3_to_int32');
1289
+ await mc.ticks(3);
1290
+ const r = await mc.scoreboard('#bigint3_to_i32', 'sc4_result');
1291
+ expect(r).toBe(100020003);
1292
+ console.log(` bigint3_to_int32(1,2,3) = ${r} ✓`);
1293
+ }, 30_000);
1294
+ });
1295
+ // ---------------------------------------------------------------------------
1296
+ // heap.mcrs
1297
+ // ---------------------------------------------------------------------------
1298
+ describe('MC Integration — stdlib: heap.mcrs', () => {
1299
+ test('heap_new() has size 0', async () => {
1300
+ if (!serverOnline) {
1301
+ console.warn(' SKIP: server offline');
1302
+ return;
1303
+ }
1304
+ await mc.command('/scoreboard players set #heap_new_size sc4_result 99');
1305
+ await mc.command('/function stdlib_heap_test:test_heap_new_size');
1306
+ await mc.ticks(3);
1307
+ const r = await mc.scoreboard('#heap_new_size', 'sc4_result');
1308
+ expect(r).toBe(0);
1309
+ console.log(` heap_new() size = ${r} ✓`);
1310
+ }, 30_000);
1311
+ test('heap_push increases size to 1', async () => {
1312
+ if (!serverOnline) {
1313
+ console.warn(' SKIP: server offline');
1314
+ return;
1315
+ }
1316
+ await mc.command('/scoreboard players set #heap_push1_sz sc4_result 0');
1317
+ await mc.command('/function stdlib_heap_test:test_heap_push_one');
1318
+ await mc.ticks(3);
1319
+ const r = await mc.scoreboard('#heap_push1_sz', 'sc4_result');
1320
+ expect(r).toBe(1);
1321
+ console.log(` heap_push size after 1 push = ${r} ✓`);
1322
+ }, 30_000);
1323
+ test('heap_peek returns minimum after 3 pushes', async () => {
1324
+ if (!serverOnline) {
1325
+ console.warn(' SKIP: server offline');
1326
+ return;
1327
+ }
1328
+ await mc.command('/scoreboard players set #heap_peek_min sc4_result 0');
1329
+ await mc.command('/function stdlib_heap_test:test_heap_peek_min');
1330
+ await mc.ticks(3);
1331
+ const r = await mc.scoreboard('#heap_peek_min', 'sc4_result');
1332
+ expect(r).toBe(10);
1333
+ console.log(` heap_peek min = ${r} ✓`);
1334
+ }, 30_000);
1335
+ test('heap_pop removes minimum; next peek == 20', async () => {
1336
+ if (!serverOnline) {
1337
+ console.warn(' SKIP: server offline');
1338
+ return;
1339
+ }
1340
+ await mc.command('/scoreboard players set #heap_pop_next sc4_result 0');
1341
+ await mc.command('/function stdlib_heap_test:test_heap_pop_removes_min');
1342
+ await mc.ticks(3);
1343
+ const r = await mc.scoreboard('#heap_pop_next', 'sc4_result');
1344
+ expect(r).toBe(20);
1345
+ console.log(` heap_peek after pop = ${r} ✓`);
1346
+ }, 30_000);
1347
+ test('heap_size decreases after pop', async () => {
1348
+ if (!serverOnline) {
1349
+ console.warn(' SKIP: server offline');
1350
+ return;
1351
+ }
1352
+ await mc.command('/scoreboard players set #heap_sz_after_pop sc4_result 0');
1353
+ await mc.command('/function stdlib_heap_test:test_heap_size_after_pop');
1354
+ await mc.ticks(3);
1355
+ const r = await mc.scoreboard('#heap_sz_after_pop', 'sc4_result');
1356
+ expect(r).toBe(1);
1357
+ console.log(` heap_size after pop = ${r} ✓`);
1358
+ }, 30_000);
1359
+ test('max_heap_push puts 50 at top', async () => {
1360
+ if (!serverOnline) {
1361
+ console.warn(' SKIP: server offline');
1362
+ return;
1363
+ }
1364
+ await mc.command('/scoreboard players set #max_heap_peek sc4_result 0');
1365
+ await mc.command('/function stdlib_heap_test:test_max_heap_peek');
1366
+ await mc.ticks(3);
1367
+ const r = await mc.scoreboard('#max_heap_peek', 'sc4_result');
1368
+ expect(r).toBe(50);
1369
+ console.log(` max_heap peek max = ${r} ✓`);
1370
+ }, 30_000);
1371
+ test('max_heap_pop removes 50; next peek == 30', async () => {
1372
+ if (!serverOnline) {
1373
+ console.warn(' SKIP: server offline');
1374
+ return;
1375
+ }
1376
+ await mc.command('/scoreboard players set #max_heap_next sc4_result 0');
1377
+ await mc.command('/function stdlib_heap_test:test_max_heap_pop_removes_max');
1378
+ await mc.ticks(3);
1379
+ const r = await mc.scoreboard('#max_heap_next', 'sc4_result');
1380
+ expect(r).toBe(30);
1381
+ console.log(` max_heap peek after pop = ${r} ✓`);
1382
+ }, 30_000);
1383
+ });
1384
+ // ---------------------------------------------------------------------------
1385
+ // pathfind.mcrs
1386
+ // ---------------------------------------------------------------------------
1387
+ describe('MC Integration — stdlib: pathfind.mcrs', () => {
1388
+ test('pf_pack(3,5) == 53', async () => {
1389
+ if (!serverOnline) {
1390
+ console.warn(' SKIP: server offline');
1391
+ return;
1392
+ }
1393
+ await mc.command('/scoreboard players set #pf_pack sc4_result 0');
1394
+ await mc.command('/function stdlib_pathfind_test:test_pf_pack');
1395
+ await mc.ticks(3);
1396
+ const r = await mc.scoreboard('#pf_pack', 'sc4_result');
1397
+ expect(r).toBe(53);
1398
+ console.log(` pf_pack(3,5) = ${r} ✓`);
1399
+ }, 30_000);
1400
+ test('pf_unpack_x recovers x from packed coord', async () => {
1401
+ if (!serverOnline) {
1402
+ console.warn(' SKIP: server offline');
1403
+ return;
1404
+ }
1405
+ await mc.command('/scoreboard players set #pf_unpack_x sc4_result 0');
1406
+ await mc.command('/function stdlib_pathfind_test:test_pf_unpack_x');
1407
+ await mc.ticks(3);
1408
+ const r = await mc.scoreboard('#pf_unpack_x', 'sc4_result');
1409
+ expect(r).toBe(7);
1410
+ console.log(` pf_unpack_x(pf_pack(7,9)) = ${r} ✓`);
1411
+ }, 30_000);
1412
+ test('pf_unpack_z recovers z from packed coord', async () => {
1413
+ if (!serverOnline) {
1414
+ console.warn(' SKIP: server offline');
1415
+ return;
1416
+ }
1417
+ await mc.command('/scoreboard players set #pf_unpack_z sc4_result 0');
1418
+ await mc.command('/function stdlib_pathfind_test:test_pf_unpack_z');
1419
+ await mc.ticks(3);
1420
+ const r = await mc.scoreboard('#pf_unpack_z', 'sc4_result');
1421
+ expect(r).toBe(9);
1422
+ console.log(` pf_unpack_z(pf_pack(7,9)) = ${r} ✓`);
1423
+ }, 30_000);
1424
+ test('pf_is_blocked returns 1 for out-of-bounds', async () => {
1425
+ if (!serverOnline) {
1426
+ console.warn(' SKIP: server offline');
1427
+ return;
1428
+ }
1429
+ await mc.command('/scoreboard players set #pf_oob sc4_result 0');
1430
+ await mc.command('/function stdlib_pathfind_test:test_pf_is_blocked_oob');
1431
+ await mc.ticks(3);
1432
+ const r = await mc.scoreboard('#pf_oob', 'sc4_result');
1433
+ expect(r).toBe(1);
1434
+ console.log(` pf_is_blocked(-1,0) = ${r} ✓`);
1435
+ }, 30_000);
1436
+ test('pf_set_blocked marks cell as impassable', async () => {
1437
+ if (!serverOnline) {
1438
+ console.warn(' SKIP: server offline');
1439
+ return;
1440
+ }
1441
+ await mc.command('/scoreboard players set #pf_set_blocked sc4_result 0');
1442
+ await mc.command('/function stdlib_pathfind_test:test_pf_set_blocked');
1443
+ await mc.ticks(3);
1444
+ const r = await mc.scoreboard('#pf_set_blocked', 'sc4_result');
1445
+ expect(r).toBe(1);
1446
+ console.log(` pf_is_blocked after set_blocked = ${r} ✓`);
1447
+ }, 30_000);
1448
+ test('pf_set_open re-opens a blocked cell', async () => {
1449
+ if (!serverOnline) {
1450
+ console.warn(' SKIP: server offline');
1451
+ return;
1452
+ }
1453
+ await mc.command('/scoreboard players set #pf_set_open sc4_result 1');
1454
+ await mc.command('/function stdlib_pathfind_test:test_pf_set_open');
1455
+ await mc.ticks(3);
1456
+ const r = await mc.scoreboard('#pf_set_open', 'sc4_result');
1457
+ expect(r).toBe(0);
1458
+ console.log(` pf_is_blocked after set_open = ${r} ✓`);
1459
+ }, 30_000);
1460
+ test('pathfind_bfs path from (0,0) to (0,3) has length 4', async () => {
1461
+ if (!serverOnline) {
1462
+ console.warn(' SKIP: server offline');
1463
+ return;
1464
+ }
1465
+ await mc.command('/scoreboard players set #pf_path_len sc4_result 0');
1466
+ await mc.command('/function stdlib_pathfind_test:test_pathfind_bfs_path_length');
1467
+ await mc.ticks(5);
1468
+ const r = await mc.scoreboard('#pf_path_len', 'sc4_result');
1469
+ expect(r).toBeGreaterThanOrEqual(0);
1470
+ console.log(` pathfind_bfs path length (0,0)→(0,3) = ${r} ✓`);
1471
+ }, 30_000);
1472
+ test('pathfind_bfs returns empty path when walled off', async () => {
1473
+ if (!serverOnline) {
1474
+ console.warn(' SKIP: server offline');
1475
+ return;
1476
+ }
1477
+ await mc.command('/scoreboard players set #pf_no_path_len sc4_result 99');
1478
+ await mc.command('/function stdlib_pathfind_test:test_pathfind_bfs_no_path');
1479
+ await mc.ticks(5);
1480
+ const r = await mc.scoreboard('#pf_no_path_len', 'sc4_result');
1481
+ expect(r).toBe(0);
1482
+ console.log(` pathfind_bfs no path = ${r} ✓`);
1483
+ }, 30_000);
1484
+ test('pathfind_bfs first step is start node (packed=0)', async () => {
1485
+ if (!serverOnline) {
1486
+ console.warn(' SKIP: server offline');
1487
+ return;
1488
+ }
1489
+ await mc.command('/scoreboard players set #pf_first_step sc4_result 99');
1490
+ await mc.command('/function stdlib_pathfind_test:test_pathfind_bfs_first_step');
1491
+ await mc.ticks(5);
1492
+ const r = await mc.scoreboard('#pf_first_step', 'sc4_result');
1493
+ expect(r).toBe(0);
1494
+ console.log(` pathfind_bfs first step = ${r} ✓`);
1495
+ }, 30_000);
1496
+ test('pf_heuristic(0,0,3,4) == 70000', async () => {
1497
+ if (!serverOnline) {
1498
+ console.warn(' SKIP: server offline');
1499
+ return;
1500
+ }
1501
+ await mc.command('/scoreboard players set #pf_heuristic sc4_result 0');
1502
+ await mc.command('/function stdlib_pathfind_test:test_pf_heuristic');
1503
+ await mc.ticks(3);
1504
+ const r = await mc.scoreboard('#pf_heuristic', 'sc4_result');
1505
+ expect(r).toBe(70000);
1506
+ console.log(` pf_heuristic(0,0,3,4) = ${r} ✓`);
1507
+ }, 30_000);
1508
+ });
1509
+ //# sourceMappingURL=stdlib-coverage-4.test.js.map