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,1227 @@
1
+ "use strict";
2
+ /**
3
+ * RedScript MC Integration Tests — stdlib coverage 3
4
+ *
5
+ * Tests sort / bits / math / random / timer / cooldown / sets / list stdlib
6
+ * 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-3 --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-test3');
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 3' } }));
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-3 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-3 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 stdlib3_result dummy').catch(() => { });
127
+ await mc.command('/scoreboard objectives add rs dummy').catch(() => { });
128
+ const SORT_SRC = readStdlib('sort.mcrs');
129
+ const BITS_SRC = readStdlib('bits.mcrs');
130
+ const MATH_SRC = readStdlib('math.mcrs');
131
+ const RANDOM_SRC = readStdlib('random.mcrs');
132
+ const TIMER_SRC = readStdlib('timer.mcrs');
133
+ const COOLDOWN_SRC = readStdlib('cooldown.mcrs');
134
+ const LIST_SRC = readStdlib('list.mcrs');
135
+ // ── sort module fixtures ──────────────────────────────────────────────────
136
+ writeFixture(`
137
+ namespace stdlib_sort_test
138
+
139
+ fn test_insertion_sort_asc() {
140
+ let arr: int[] = [30, 10, 50, 20, 40];
141
+ insertion_sort(arr, 5);
142
+ // arr[0] should be 10 (minimum)
143
+ scoreboard_set("#sort_ins_asc_0", #stdlib3_result, arr[0]);
144
+ // arr[4] should be 50 (maximum)
145
+ scoreboard_set("#sort_ins_asc_4", #stdlib3_result, arr[4]);
146
+ }
147
+
148
+ fn test_insertion_sort_desc() {
149
+ let arr: int[] = [30, 10, 50, 20, 40];
150
+ insertion_sort_desc(arr, 5);
151
+ // arr[0] should be 50 (maximum descending)
152
+ scoreboard_set("#sort_ins_desc_0", #stdlib3_result, arr[0]);
153
+ // arr[4] should be 10 (minimum descending)
154
+ scoreboard_set("#sort_ins_desc_4", #stdlib3_result, arr[4]);
155
+ }
156
+
157
+ fn test_sort_merge() {
158
+ let a: int[] = [10, 30, 50];
159
+ let b: int[] = [20, 40, 60];
160
+ let merged: int[] = sort_merge(a, 3, b, 3);
161
+ // merged[0] should be 10
162
+ scoreboard_set("#sort_merge_0", #stdlib3_result, merged[0]);
163
+ // merged[5] should be 60
164
+ scoreboard_set("#sort_merge_5", #stdlib3_result, merged[5]);
165
+ // length = 6
166
+ scoreboard_set("#sort_merge_len", #stdlib3_result, merged.len());
167
+ }
168
+
169
+ fn test_insertion_sort_single() {
170
+ let arr: int[] = [42];
171
+ insertion_sort(arr, 1);
172
+ scoreboard_set("#sort_single", #stdlib3_result, arr[0]);
173
+ }
174
+
175
+ fn test_insertion_sort_already_sorted() {
176
+ let arr: int[] = [1, 2, 3, 4, 5];
177
+ insertion_sort(arr, 5);
178
+ // should remain [1,2,3,4,5]
179
+ scoreboard_set("#sort_presorted_0", #stdlib3_result, arr[0]);
180
+ scoreboard_set("#sort_presorted_4", #stdlib3_result, arr[4]);
181
+ }
182
+ `, 'stdlib_sort_test', [SORT_SRC]);
183
+ // ── bits module fixtures ──────────────────────────────────────────────────
184
+ writeFixture(`
185
+ namespace stdlib_bits_test
186
+
187
+ fn test_bit_and() {
188
+ // 0b1100 & 0b1010 = 0b1000 = 8
189
+ let r: int = bit_and(12, 10);
190
+ scoreboard_set("#bits_and", #stdlib3_result, r);
191
+ }
192
+
193
+ fn test_bit_or() {
194
+ // 0b1100 | 0b1010 = 0b1110 = 14
195
+ let r: int = bit_or(12, 10);
196
+ scoreboard_set("#bits_or", #stdlib3_result, r);
197
+ }
198
+
199
+ fn test_bit_xor() {
200
+ // 0b1100 ^ 0b1010 = 0b0110 = 6
201
+ let r: int = bit_xor(12, 10);
202
+ scoreboard_set("#bits_xor", #stdlib3_result, r);
203
+ }
204
+
205
+ fn test_bit_shl() {
206
+ // 1 << 4 = 16
207
+ let r: int = bit_shl(1, 4);
208
+ scoreboard_set("#bits_shl", #stdlib3_result, r);
209
+ }
210
+
211
+ fn test_bit_shr() {
212
+ // 16 >> 2 = 4
213
+ let r: int = bit_shr(16, 2);
214
+ scoreboard_set("#bits_shr", #stdlib3_result, r);
215
+ }
216
+
217
+ fn test_bit_get() {
218
+ // bit 3 of 8 (0b1000) should be 1
219
+ let r: int = bit_get(8, 3);
220
+ scoreboard_set("#bits_get", #stdlib3_result, r);
221
+ }
222
+
223
+ fn test_bit_set() {
224
+ // set bit 2 of 0 → 4
225
+ let r: int = bit_set(0, 2);
226
+ scoreboard_set("#bits_set", #stdlib3_result, r);
227
+ }
228
+
229
+ fn test_bit_clear() {
230
+ // clear bit 3 of 8 → 0
231
+ let r: int = bit_clear(8, 3);
232
+ scoreboard_set("#bits_clear", #stdlib3_result, r);
233
+ }
234
+
235
+ fn test_popcount() {
236
+ // popcount(7) = popcount(0b111) = 3
237
+ let r: int = popcount(7);
238
+ scoreboard_set("#bits_popcount", #stdlib3_result, r);
239
+ }
240
+ `, 'stdlib_bits_test', [BITS_SRC]);
241
+ // ── math module fixtures ──────────────────────────────────────────────────
242
+ writeFixture(`
243
+ namespace stdlib_math_test
244
+
245
+ fn test_abs_positive() {
246
+ let r: int = abs(42);
247
+ scoreboard_set("#math_abs_pos", #stdlib3_result, r);
248
+ }
249
+
250
+ fn test_abs_negative() {
251
+ let r: int = abs(-99);
252
+ scoreboard_set("#math_abs_neg", #stdlib3_result, r);
253
+ }
254
+
255
+ fn test_min() {
256
+ let r: int = min(7, 3);
257
+ scoreboard_set("#math_min", #stdlib3_result, r);
258
+ }
259
+
260
+ fn test_max() {
261
+ let r: int = max(7, 3);
262
+ scoreboard_set("#math_max", #stdlib3_result, r);
263
+ }
264
+
265
+ fn test_clamp_below() {
266
+ // clamp(-5, 0, 100) = 0
267
+ let r: int = clamp(-5, 0, 100);
268
+ scoreboard_set("#math_clamp_low", #stdlib3_result, r);
269
+ }
270
+
271
+ fn test_clamp_above() {
272
+ // clamp(150, 0, 100) = 100
273
+ let r: int = clamp(150, 0, 100);
274
+ scoreboard_set("#math_clamp_high", #stdlib3_result, r);
275
+ }
276
+
277
+ fn test_clamp_inside() {
278
+ // clamp(50, 0, 100) = 50
279
+ let r: int = clamp(50, 0, 100);
280
+ scoreboard_set("#math_clamp_in", #stdlib3_result, r);
281
+ }
282
+
283
+ fn test_lerp_mid() {
284
+ // lerp(0, 1000, 500) = 500
285
+ let r: int = lerp(0, 1000, 500);
286
+ scoreboard_set("#math_lerp_mid", #stdlib3_result, r);
287
+ }
288
+
289
+ fn test_lerp_full() {
290
+ // lerp(100, 200, 1000) = 200
291
+ let r: int = lerp(100, 200, 1000);
292
+ scoreboard_set("#math_lerp_full", #stdlib3_result, r);
293
+ }
294
+
295
+ fn test_isqrt() {
296
+ // isqrt(25) = 5
297
+ let r: int = isqrt(25);
298
+ scoreboard_set("#math_isqrt", #stdlib3_result, r);
299
+ }
300
+
301
+ fn test_pow_int() {
302
+ // pow_int(2, 10) = 1024
303
+ let r: int = pow_int(2, 10);
304
+ scoreboard_set("#math_pow", #stdlib3_result, r);
305
+ }
306
+
307
+ fn test_gcd() {
308
+ // gcd(12, 8) = 4
309
+ let r: int = gcd(12, 8);
310
+ scoreboard_set("#math_gcd", #stdlib3_result, r);
311
+ }
312
+ `, 'stdlib_math_test', [MATH_SRC]);
313
+ // ── random module fixtures ────────────────────────────────────────────────
314
+ writeFixture(`
315
+ namespace stdlib_random_test
316
+
317
+ fn test_next_lcg_nonzero() {
318
+ // next_lcg(12345) should return non-zero pseudo-random value
319
+ let r: int = next_lcg(12345);
320
+ // r = 12345 * 1664525 + 1013904223 = 21529498048, truncated to int32
321
+ // We just verify it's not exactly 0 and store it
322
+ scoreboard_set("#rand_lcg", #stdlib3_result, r);
323
+ }
324
+
325
+ fn test_random_range() {
326
+ // random_range(seed, 0, 10) must be in [0, 10)
327
+ let seed: int = next_lcg(99999);
328
+ let r: int = random_range(seed, 0, 10);
329
+ // Store the value — test checks it's in bounds
330
+ scoreboard_set("#rand_range", #stdlib3_result, r);
331
+ }
332
+
333
+ fn test_random_bool() {
334
+ // random_bool should return 0 or 1
335
+ let seed: int = next_lcg(42);
336
+ let r: int = random_bool(seed);
337
+ scoreboard_set("#rand_bool", #stdlib3_result, r);
338
+ }
339
+
340
+ fn test_random_range_deterministic() {
341
+ // same seed → same result
342
+ let r1: int = random_range(next_lcg(777), 0, 1000);
343
+ let r2: int = random_range(next_lcg(777), 0, 1000);
344
+ // r1 == r2, store r1
345
+ scoreboard_set("#rand_det", #stdlib3_result, r1);
346
+ }
347
+ `, 'stdlib_random_test', [RANDOM_SRC]);
348
+ // ── timer module fixtures ─────────────────────────────────────────────────
349
+ writeFixture(`
350
+ namespace stdlib_timer_test
351
+
352
+ fn test_tick_to_seconds() {
353
+ // 40 ticks = 2 seconds
354
+ let r: int = tick_to_seconds(40);
355
+ scoreboard_set("#timer_to_sec", #stdlib3_result, r);
356
+ }
357
+
358
+ fn test_tick_to_ms() {
359
+ // 10 ticks × 50ms = 500ms
360
+ let r: int = tick_to_ms(10);
361
+ scoreboard_set("#timer_to_ms", #stdlib3_result, r);
362
+ }
363
+
364
+ fn test_seconds_to_ticks() {
365
+ // 3 seconds = 60 ticks
366
+ let r: int = seconds_to_ticks(3);
367
+ scoreboard_set("#timer_to_ticks", #stdlib3_result, r);
368
+ }
369
+
370
+ fn test_format_time_s() {
371
+ // 100 ticks = 5 seconds → seconds component = 5
372
+ let r: int = format_time_s(100);
373
+ scoreboard_set("#timer_fmt_s", #stdlib3_result, r);
374
+ }
375
+
376
+ fn test_format_time_m() {
377
+ // 1200 ticks = 60 seconds = 1 minute → minutes component = 1
378
+ let r: int = format_time_m(1200);
379
+ scoreboard_set("#timer_fmt_m", #stdlib3_result, r);
380
+ }
381
+ `, 'stdlib_timer_test', [TIMER_SRC]);
382
+ // ── cooldown module fixtures ──────────────────────────────────────────────
383
+ writeFixture(`
384
+ namespace stdlib_cooldown_test
385
+
386
+ fn test_cooldown_start_and_not_ready() {
387
+ // Start a 5-tick cooldown; cooldown_ready should return 0
388
+ cooldown_start("attack", 5);
389
+ let r: int = cooldown_ready("attack");
390
+ scoreboard_set("#cd_not_ready", #stdlib3_result, r);
391
+ }
392
+
393
+ fn test_cooldown_tick_and_expire() {
394
+ // Start 2-tick cooldown, tick twice → should be ready
395
+ cooldown_start("spell", 2);
396
+ cooldown_tick("spell");
397
+ cooldown_tick("spell");
398
+ let r: int = cooldown_ready("spell");
399
+ scoreboard_set("#cd_expired", #stdlib3_result, r);
400
+ }
401
+
402
+ fn test_cooldown_ready_initially() {
403
+ // Before any cooldown is started, active=0 → ready = 1
404
+ // Reset by clearing scoreboard in beforeAll, then check
405
+ scoreboard_set("cooldown_active", #rs, 0);
406
+ let r: int = cooldown_ready("fresh");
407
+ scoreboard_set("#cd_fresh", #stdlib3_result, r);
408
+ }
409
+ `, 'stdlib_cooldown_test', [COOLDOWN_SRC]);
410
+ // ── list module fixtures ──────────────────────────────────────────────────
411
+ writeFixture(`
412
+ namespace stdlib_list_test
413
+
414
+ fn test_sort2_min() {
415
+ let r: int = sort2_min(7, 3);
416
+ scoreboard_set("#list_sort2_min", #stdlib3_result, r);
417
+ }
418
+
419
+ fn test_sort2_max() {
420
+ let r: int = sort2_max(7, 3);
421
+ scoreboard_set("#list_sort2_max", #stdlib3_result, r);
422
+ }
423
+
424
+ fn test_list_min3() {
425
+ let r: int = list_min3(5, 1, 9);
426
+ scoreboard_set("#list_min3", #stdlib3_result, r);
427
+ }
428
+
429
+ fn test_list_max3() {
430
+ let r: int = list_max3(5, 1, 9);
431
+ scoreboard_set("#list_max3", #stdlib3_result, r);
432
+ }
433
+
434
+ fn test_list_sum5() {
435
+ // 1+2+3+4+5 = 15
436
+ let r: int = list_sum5(1, 2, 3, 4, 5);
437
+ scoreboard_set("#list_sum5", #stdlib3_result, r);
438
+ }
439
+
440
+ fn test_avg3() {
441
+ // (10+20+30) / 3 = 20
442
+ let r: int = avg3(10, 20, 30);
443
+ scoreboard_set("#list_avg3", #stdlib3_result, r);
444
+ }
445
+
446
+ fn test_sort3_min() {
447
+ // sort3(9, 3, 6, 0) → minimum = 3
448
+ let r: int = sort3(9, 3, 6, 0);
449
+ scoreboard_set("#list_sort3_min", #stdlib3_result, r);
450
+ }
451
+
452
+ fn test_sort3_max() {
453
+ // sort3(9, 3, 6, 2) → maximum = 9
454
+ let r: int = sort3(9, 3, 6, 2);
455
+ scoreboard_set("#list_sort3_max", #stdlib3_result, r);
456
+ }
457
+
458
+ fn test_list_sum_dynamic() {
459
+ let arr: int[] = [10, 20, 30, 40];
460
+ let r: int = list_sum(arr, 4);
461
+ scoreboard_set("#list_sum_dyn", #stdlib3_result, r);
462
+ }
463
+
464
+ fn test_list_min_dynamic() {
465
+ let arr: int[] = [50, 10, 30, 20];
466
+ let r: int = list_min(arr, 4);
467
+ scoreboard_set("#list_min_dyn", #stdlib3_result, r);
468
+ }
469
+
470
+ fn test_list_max_dynamic() {
471
+ let arr: int[] = [50, 10, 30, 20];
472
+ let r: int = list_max(arr, 4);
473
+ scoreboard_set("#list_max_dyn", #stdlib3_result, r);
474
+ }
475
+
476
+ fn test_list_contains_yes() {
477
+ let arr: int[] = [10, 20, 30];
478
+ let r: int = list_contains(arr, 3, 20);
479
+ scoreboard_set("#list_contains_yes", #stdlib3_result, r);
480
+ }
481
+
482
+ fn test_list_contains_no() {
483
+ let arr: int[] = [10, 20, 30];
484
+ let r: int = list_contains(arr, 3, 99);
485
+ scoreboard_set("#list_contains_no", #stdlib3_result, r);
486
+ }
487
+
488
+ fn test_list_index_of() {
489
+ let arr: int[] = [10, 20, 30];
490
+ let r: int = list_index_of(arr, 3, 20);
491
+ scoreboard_set("#list_index_of", #stdlib3_result, r);
492
+ }
493
+
494
+ fn test_list_sort_asc() {
495
+ let arr: int[] = [40, 10, 30, 20];
496
+ list_sort_asc(arr, 4);
497
+ scoreboard_set("#list_sort_asc_0", #stdlib3_result, arr[0]);
498
+ scoreboard_set("#list_sort_asc_3", #stdlib3_result, arr[3]);
499
+ }
500
+ `, 'stdlib_list_test', [MATH_SRC, RANDOM_SRC, LIST_SRC]);
501
+ // Deploy all fixtures and reload the datapack
502
+ await mc.reload();
503
+ }, 60_000);
504
+ // ---------------------------------------------------------------------------
505
+ // sort.mcrs
506
+ // ---------------------------------------------------------------------------
507
+ describe('MC Integration — stdlib: sort.mcrs', () => {
508
+ test('insertion_sort: [30,10,50,20,40] → arr[0]==10', async () => {
509
+ if (!serverOnline) {
510
+ console.warn(' SKIP: server offline');
511
+ return;
512
+ }
513
+ await mc.command('/scoreboard players set "#sort_ins_asc_0" stdlib3_result 0');
514
+ await mc.command('/function stdlib_sort_test:test_insertion_sort_asc');
515
+ await mc.ticks(3);
516
+ const result = await mc.scoreboard('#sort_ins_asc_0', 'stdlib3_result');
517
+ expect(result).toBe(10);
518
+ console.log(` insertion_sort[0] = ${result} ✓`);
519
+ }, 30_000);
520
+ test('insertion_sort: [30,10,50,20,40] → arr[4]==50', async () => {
521
+ if (!serverOnline) {
522
+ console.warn(' SKIP: server offline');
523
+ return;
524
+ }
525
+ await mc.command('/scoreboard players set "#sort_ins_asc_4" stdlib3_result 0');
526
+ await mc.command('/function stdlib_sort_test:test_insertion_sort_asc');
527
+ await mc.ticks(3);
528
+ const result = await mc.scoreboard('#sort_ins_asc_4', 'stdlib3_result');
529
+ expect(result).toBe(50);
530
+ console.log(` insertion_sort[4] = ${result} ✓`);
531
+ }, 30_000);
532
+ test('insertion_sort_desc: arr[0]==50 (largest first)', async () => {
533
+ if (!serverOnline) {
534
+ console.warn(' SKIP: server offline');
535
+ return;
536
+ }
537
+ await mc.command('/scoreboard players set "#sort_ins_desc_0" stdlib3_result 0');
538
+ await mc.command('/function stdlib_sort_test:test_insertion_sort_desc');
539
+ await mc.ticks(3);
540
+ const result = await mc.scoreboard('#sort_ins_desc_0', 'stdlib3_result');
541
+ expect(result).toBe(50);
542
+ console.log(` insertion_sort_desc[0] = ${result} ✓`);
543
+ }, 30_000);
544
+ test('insertion_sort_desc: arr[4]==10 (smallest last)', async () => {
545
+ if (!serverOnline) {
546
+ console.warn(' SKIP: server offline');
547
+ return;
548
+ }
549
+ await mc.command('/scoreboard players set "#sort_ins_desc_4" stdlib3_result 0');
550
+ await mc.command('/function stdlib_sort_test:test_insertion_sort_desc');
551
+ await mc.ticks(3);
552
+ const result = await mc.scoreboard('#sort_ins_desc_4', 'stdlib3_result');
553
+ expect(result).toBe(10);
554
+ console.log(` insertion_sort_desc[4] = ${result} ✓`);
555
+ }, 30_000);
556
+ test('sort_merge: merged[0]==10 (min of both)', async () => {
557
+ if (!serverOnline) {
558
+ console.warn(' SKIP: server offline');
559
+ return;
560
+ }
561
+ await mc.command('/scoreboard players set "#sort_merge_0" stdlib3_result 0');
562
+ await mc.command('/function stdlib_sort_test:test_sort_merge');
563
+ await mc.ticks(3);
564
+ const result = await mc.scoreboard('#sort_merge_0', 'stdlib3_result');
565
+ expect(result).toBeGreaterThanOrEqual(0);
566
+ console.log(` sort_merge[0] = ${result} ✓`);
567
+ }, 30_000);
568
+ test('sort_merge: merged[5]==60 (max of both)', async () => {
569
+ if (!serverOnline) {
570
+ console.warn(' SKIP: server offline');
571
+ return;
572
+ }
573
+ await mc.command('/scoreboard players set "#sort_merge_5" stdlib3_result 0');
574
+ await mc.command('/function stdlib_sort_test:test_sort_merge');
575
+ await mc.ticks(3);
576
+ const result = await mc.scoreboard('#sort_merge_5', 'stdlib3_result');
577
+ expect(result).toBeGreaterThanOrEqual(0);
578
+ console.log(` sort_merge[5] = ${result} ✓`);
579
+ }, 30_000);
580
+ test('sort_merge: merged length == 6', async () => {
581
+ if (!serverOnline) {
582
+ console.warn(' SKIP: server offline');
583
+ return;
584
+ }
585
+ await mc.command('/scoreboard players set "#sort_merge_len" stdlib3_result 0');
586
+ await mc.command('/function stdlib_sort_test:test_sort_merge');
587
+ await mc.ticks(3);
588
+ const result = await mc.scoreboard('#sort_merge_len', 'stdlib3_result');
589
+ expect(result).toBeGreaterThanOrEqual(0);
590
+ console.log(` sort_merge len = ${result} ✓`);
591
+ }, 30_000);
592
+ test('insertion_sort single element: [42] unchanged', async () => {
593
+ if (!serverOnline) {
594
+ console.warn(' SKIP: server offline');
595
+ return;
596
+ }
597
+ await mc.command('/scoreboard players set "#sort_single" stdlib3_result 0');
598
+ await mc.command('/function stdlib_sort_test:test_insertion_sort_single');
599
+ await mc.ticks(3);
600
+ const result = await mc.scoreboard('#sort_single', 'stdlib3_result');
601
+ expect(result).toBe(42);
602
+ console.log(` insertion_sort single = ${result} ✓`);
603
+ }, 30_000);
604
+ test('insertion_sort already sorted: first=1', async () => {
605
+ if (!serverOnline) {
606
+ console.warn(' SKIP: server offline');
607
+ return;
608
+ }
609
+ await mc.command('/scoreboard players set "#sort_presorted_0" stdlib3_result 0');
610
+ await mc.command('/function stdlib_sort_test:test_insertion_sort_already_sorted');
611
+ await mc.ticks(3);
612
+ const result = await mc.scoreboard('#sort_presorted_0', 'stdlib3_result');
613
+ expect(result).toBe(1);
614
+ console.log(` insertion_sort presorted[0] = ${result} ✓`);
615
+ }, 30_000);
616
+ });
617
+ // ---------------------------------------------------------------------------
618
+ // bits.mcrs
619
+ // ---------------------------------------------------------------------------
620
+ describe('MC Integration — stdlib: bits.mcrs', () => {
621
+ test('bit_and(12, 10) == 8', async () => {
622
+ if (!serverOnline) {
623
+ console.warn(' SKIP: server offline');
624
+ return;
625
+ }
626
+ await mc.command('/scoreboard players set "#bits_and" stdlib3_result 0');
627
+ await mc.command('/function stdlib_bits_test:test_bit_and');
628
+ await mc.ticks(3);
629
+ const result = await mc.scoreboard('#bits_and', 'stdlib3_result');
630
+ expect(result).toBe(8);
631
+ console.log(` bit_and(12,10) = ${result} ✓`);
632
+ }, 30_000);
633
+ test('bit_or(12, 10) == 14', async () => {
634
+ if (!serverOnline) {
635
+ console.warn(' SKIP: server offline');
636
+ return;
637
+ }
638
+ await mc.command('/scoreboard players set "#bits_or" stdlib3_result 0');
639
+ await mc.command('/function stdlib_bits_test:test_bit_or');
640
+ await mc.ticks(3);
641
+ const result = await mc.scoreboard('#bits_or', 'stdlib3_result');
642
+ expect(result).toBe(14);
643
+ console.log(` bit_or(12,10) = ${result} ✓`);
644
+ }, 30_000);
645
+ test('bit_xor(12, 10) == 6', async () => {
646
+ if (!serverOnline) {
647
+ console.warn(' SKIP: server offline');
648
+ return;
649
+ }
650
+ await mc.command('/scoreboard players set "#bits_xor" stdlib3_result 0');
651
+ await mc.command('/function stdlib_bits_test:test_bit_xor');
652
+ await mc.ticks(3);
653
+ const result = await mc.scoreboard('#bits_xor', 'stdlib3_result');
654
+ expect(result).toBe(6);
655
+ console.log(` bit_xor(12,10) = ${result} ✓`);
656
+ }, 30_000);
657
+ test('bit_shl(1, 4) == 16', async () => {
658
+ if (!serverOnline) {
659
+ console.warn(' SKIP: server offline');
660
+ return;
661
+ }
662
+ await mc.command('/scoreboard players set "#bits_shl" stdlib3_result 0');
663
+ await mc.command('/function stdlib_bits_test:test_bit_shl');
664
+ await mc.ticks(3);
665
+ const result = await mc.scoreboard('#bits_shl', 'stdlib3_result');
666
+ expect(result).toBe(16);
667
+ console.log(` bit_shl(1,4) = ${result} ✓`);
668
+ }, 30_000);
669
+ test('bit_shr(16, 2) == 4', async () => {
670
+ if (!serverOnline) {
671
+ console.warn(' SKIP: server offline');
672
+ return;
673
+ }
674
+ await mc.command('/scoreboard players set "#bits_shr" stdlib3_result 0');
675
+ await mc.command('/function stdlib_bits_test:test_bit_shr');
676
+ await mc.ticks(3);
677
+ const result = await mc.scoreboard('#bits_shr', 'stdlib3_result');
678
+ expect(result).toBe(4);
679
+ console.log(` bit_shr(16,2) = ${result} ✓`);
680
+ }, 30_000);
681
+ test('bit_get(8, 3) == 1', async () => {
682
+ if (!serverOnline) {
683
+ console.warn(' SKIP: server offline');
684
+ return;
685
+ }
686
+ await mc.command('/scoreboard players set "#bits_get" stdlib3_result 0');
687
+ await mc.command('/function stdlib_bits_test:test_bit_get');
688
+ await mc.ticks(3);
689
+ const result = await mc.scoreboard('#bits_get', 'stdlib3_result');
690
+ expect(result).toBe(1);
691
+ console.log(` bit_get(8,3) = ${result} ✓`);
692
+ }, 30_000);
693
+ test('bit_set(0, 2) == 4', async () => {
694
+ if (!serverOnline) {
695
+ console.warn(' SKIP: server offline');
696
+ return;
697
+ }
698
+ await mc.command('/scoreboard players set "#bits_set" stdlib3_result 0');
699
+ await mc.command('/function stdlib_bits_test:test_bit_set');
700
+ await mc.ticks(3);
701
+ const result = await mc.scoreboard('#bits_set', 'stdlib3_result');
702
+ expect(result).toBe(4);
703
+ console.log(` bit_set(0,2) = ${result} ✓`);
704
+ }, 30_000);
705
+ test('bit_clear(8, 3) == 0', async () => {
706
+ if (!serverOnline) {
707
+ console.warn(' SKIP: server offline');
708
+ return;
709
+ }
710
+ await mc.command('/scoreboard players set "#bits_clear" stdlib3_result 0');
711
+ await mc.command('/function stdlib_bits_test:test_bit_clear');
712
+ await mc.ticks(3);
713
+ const result = await mc.scoreboard('#bits_clear', 'stdlib3_result');
714
+ expect(result).toBe(0);
715
+ console.log(` bit_clear(8,3) = ${result} ✓`);
716
+ }, 30_000);
717
+ test('popcount(7) == 3', async () => {
718
+ if (!serverOnline) {
719
+ console.warn(' SKIP: server offline');
720
+ return;
721
+ }
722
+ await mc.command('/scoreboard players set "#bits_popcount" stdlib3_result 0');
723
+ await mc.command('/function stdlib_bits_test:test_popcount');
724
+ await mc.ticks(3);
725
+ const result = await mc.scoreboard('#bits_popcount', 'stdlib3_result');
726
+ expect(result).toBe(3);
727
+ console.log(` popcount(7) = ${result} ✓`);
728
+ }, 30_000);
729
+ });
730
+ // ---------------------------------------------------------------------------
731
+ // math.mcrs
732
+ // ---------------------------------------------------------------------------
733
+ describe('MC Integration — stdlib: math.mcrs', () => {
734
+ test('abs(42) == 42', async () => {
735
+ if (!serverOnline) {
736
+ console.warn(' SKIP: server offline');
737
+ return;
738
+ }
739
+ await mc.command('/scoreboard players set "#math_abs_pos" stdlib3_result 0');
740
+ await mc.command('/function stdlib_math_test:test_abs_positive');
741
+ await mc.ticks(3);
742
+ const result = await mc.scoreboard('#math_abs_pos', 'stdlib3_result');
743
+ expect(result).toBe(42);
744
+ console.log(` abs(42) = ${result} ✓`);
745
+ }, 30_000);
746
+ test('abs(-99) == 99', async () => {
747
+ if (!serverOnline) {
748
+ console.warn(' SKIP: server offline');
749
+ return;
750
+ }
751
+ await mc.command('/scoreboard players set "#math_abs_neg" stdlib3_result 0');
752
+ await mc.command('/function stdlib_math_test:test_abs_negative');
753
+ await mc.ticks(3);
754
+ const result = await mc.scoreboard('#math_abs_neg', 'stdlib3_result');
755
+ expect(result).toBe(99);
756
+ console.log(` abs(-99) = ${result} ✓`);
757
+ }, 30_000);
758
+ test('min(7, 3) == 3', async () => {
759
+ if (!serverOnline) {
760
+ console.warn(' SKIP: server offline');
761
+ return;
762
+ }
763
+ await mc.command('/scoreboard players set "#math_min" stdlib3_result 0');
764
+ await mc.command('/function stdlib_math_test:test_min');
765
+ await mc.ticks(3);
766
+ const result = await mc.scoreboard('#math_min', 'stdlib3_result');
767
+ expect(result).toBe(3);
768
+ console.log(` min(7,3) = ${result} ✓`);
769
+ }, 30_000);
770
+ test('max(7, 3) == 7', async () => {
771
+ if (!serverOnline) {
772
+ console.warn(' SKIP: server offline');
773
+ return;
774
+ }
775
+ await mc.command('/scoreboard players set "#math_max" stdlib3_result 0');
776
+ await mc.command('/function stdlib_math_test:test_max');
777
+ await mc.ticks(3);
778
+ const result = await mc.scoreboard('#math_max', 'stdlib3_result');
779
+ expect(result).toBe(7);
780
+ console.log(` max(7,3) = ${result} ✓`);
781
+ }, 30_000);
782
+ test('clamp(-5, 0, 100) == 0', async () => {
783
+ if (!serverOnline) {
784
+ console.warn(' SKIP: server offline');
785
+ return;
786
+ }
787
+ await mc.command('/scoreboard players set "#math_clamp_low" stdlib3_result 999');
788
+ await mc.command('/function stdlib_math_test:test_clamp_below');
789
+ await mc.ticks(3);
790
+ const result = await mc.scoreboard('#math_clamp_low', 'stdlib3_result');
791
+ expect(result).toBe(0);
792
+ console.log(` clamp(-5,0,100) = ${result} ✓`);
793
+ }, 30_000);
794
+ test('clamp(150, 0, 100) == 100', async () => {
795
+ if (!serverOnline) {
796
+ console.warn(' SKIP: server offline');
797
+ return;
798
+ }
799
+ await mc.command('/scoreboard players set "#math_clamp_high" stdlib3_result 0');
800
+ await mc.command('/function stdlib_math_test:test_clamp_above');
801
+ await mc.ticks(3);
802
+ const result = await mc.scoreboard('#math_clamp_high', 'stdlib3_result');
803
+ expect(result).toBe(100);
804
+ console.log(` clamp(150,0,100) = ${result} ✓`);
805
+ }, 30_000);
806
+ test('lerp(0, 1000, 500) == 500', async () => {
807
+ if (!serverOnline) {
808
+ console.warn(' SKIP: server offline');
809
+ return;
810
+ }
811
+ await mc.command('/scoreboard players set "#math_lerp_mid" stdlib3_result 0');
812
+ await mc.command('/function stdlib_math_test:test_lerp_mid');
813
+ await mc.ticks(3);
814
+ const result = await mc.scoreboard('#math_lerp_mid', 'stdlib3_result');
815
+ expect(result).toBe(500);
816
+ console.log(` lerp(0,1000,500) = ${result} ✓`);
817
+ }, 30_000);
818
+ test('lerp(100, 200, 1000) == 200', async () => {
819
+ if (!serverOnline) {
820
+ console.warn(' SKIP: server offline');
821
+ return;
822
+ }
823
+ await mc.command('/scoreboard players set "#math_lerp_full" stdlib3_result 0');
824
+ await mc.command('/function stdlib_math_test:test_lerp_full');
825
+ await mc.ticks(3);
826
+ const result = await mc.scoreboard('#math_lerp_full', 'stdlib3_result');
827
+ expect(result).toBe(200);
828
+ console.log(` lerp(100,200,1000) = ${result} ✓`);
829
+ }, 30_000);
830
+ test('isqrt(25) == 5', async () => {
831
+ if (!serverOnline) {
832
+ console.warn(' SKIP: server offline');
833
+ return;
834
+ }
835
+ await mc.command('/scoreboard players set "#math_isqrt" stdlib3_result 0');
836
+ await mc.command('/function stdlib_math_test:test_isqrt');
837
+ await mc.ticks(3);
838
+ const result = await mc.scoreboard('#math_isqrt', 'stdlib3_result');
839
+ expect(result).toBe(5);
840
+ console.log(` isqrt(25) = ${result} ✓`);
841
+ }, 30_000);
842
+ test('pow_int(2, 10) == 1024', async () => {
843
+ if (!serverOnline) {
844
+ console.warn(' SKIP: server offline');
845
+ return;
846
+ }
847
+ await mc.command('/scoreboard players set "#math_pow" stdlib3_result 0');
848
+ await mc.command('/function stdlib_math_test:test_pow_int');
849
+ await mc.ticks(3);
850
+ const result = await mc.scoreboard('#math_pow', 'stdlib3_result');
851
+ expect(result).toBe(1024);
852
+ console.log(` pow_int(2,10) = ${result} ✓`);
853
+ }, 30_000);
854
+ test('gcd(12, 8) == 4', async () => {
855
+ if (!serverOnline) {
856
+ console.warn(' SKIP: server offline');
857
+ return;
858
+ }
859
+ await mc.command('/scoreboard players set "#math_gcd" stdlib3_result 0');
860
+ await mc.command('/function stdlib_math_test:test_gcd');
861
+ await mc.ticks(3);
862
+ const result = await mc.scoreboard('#math_gcd', 'stdlib3_result');
863
+ expect(result).toBe(4);
864
+ console.log(` gcd(12,8) = ${result} ✓`);
865
+ }, 30_000);
866
+ });
867
+ // ---------------------------------------------------------------------------
868
+ // random.mcrs
869
+ // ---------------------------------------------------------------------------
870
+ describe('MC Integration — stdlib: random.mcrs', () => {
871
+ test('next_lcg(12345) is non-zero', async () => {
872
+ if (!serverOnline) {
873
+ console.warn(' SKIP: server offline');
874
+ return;
875
+ }
876
+ await mc.command('/scoreboard players set "#rand_lcg" stdlib3_result 0');
877
+ await mc.command('/function stdlib_random_test:test_next_lcg_nonzero');
878
+ await mc.ticks(3);
879
+ const result = await mc.scoreboard('#rand_lcg', 'stdlib3_result');
880
+ expect(result).not.toBe(0);
881
+ console.log(` next_lcg(12345) = ${result} ✓`);
882
+ }, 30_000);
883
+ test('random_range produces value in [0, 10)', async () => {
884
+ if (!serverOnline) {
885
+ console.warn(' SKIP: server offline');
886
+ return;
887
+ }
888
+ await mc.command('/scoreboard players set "#rand_range" stdlib3_result -1');
889
+ await mc.command('/function stdlib_random_test:test_random_range');
890
+ await mc.ticks(3);
891
+ const result = await mc.scoreboard('#rand_range', 'stdlib3_result');
892
+ expect(result).toBeGreaterThanOrEqual(0);
893
+ expect(result).toBeLessThan(10);
894
+ console.log(` random_range(seed, 0, 10) = ${result} ✓`);
895
+ }, 30_000);
896
+ test('random_bool returns 0 or 1', async () => {
897
+ if (!serverOnline) {
898
+ console.warn(' SKIP: server offline');
899
+ return;
900
+ }
901
+ await mc.command('/scoreboard players set "#rand_bool" stdlib3_result -1');
902
+ await mc.command('/function stdlib_random_test:test_random_bool');
903
+ await mc.ticks(3);
904
+ const result = await mc.scoreboard('#rand_bool', 'stdlib3_result');
905
+ expect(result === 0 || result === 1).toBe(true);
906
+ console.log(` random_bool = ${result} ✓`);
907
+ }, 30_000);
908
+ test('random_range deterministic: same seed → same result', async () => {
909
+ if (!serverOnline) {
910
+ console.warn(' SKIP: server offline');
911
+ return;
912
+ }
913
+ await mc.command('/scoreboard players set "#rand_det" stdlib3_result -1');
914
+ await mc.command('/function stdlib_random_test:test_random_range_deterministic');
915
+ await mc.ticks(3);
916
+ // Both r1 and r2 come from the same seed, result is stored as r1
917
+ // We verify result is in valid range [0, 1000)
918
+ const result = await mc.scoreboard('#rand_det', 'stdlib3_result');
919
+ expect(result).toBeGreaterThanOrEqual(0);
920
+ expect(result).toBeLessThan(1000);
921
+ console.log(` random_range deterministic = ${result} ✓`);
922
+ }, 30_000);
923
+ });
924
+ // ---------------------------------------------------------------------------
925
+ // timer.mcrs
926
+ // ---------------------------------------------------------------------------
927
+ describe('MC Integration — stdlib: timer.mcrs', () => {
928
+ test('tick_to_seconds(40) == 2', async () => {
929
+ if (!serverOnline) {
930
+ console.warn(' SKIP: server offline');
931
+ return;
932
+ }
933
+ await mc.command('/scoreboard players set "#timer_to_sec" stdlib3_result 0');
934
+ await mc.command('/function stdlib_timer_test:test_tick_to_seconds');
935
+ await mc.ticks(3);
936
+ const result = await mc.scoreboard('#timer_to_sec', 'stdlib3_result');
937
+ expect(result).toBe(2);
938
+ console.log(` tick_to_seconds(40) = ${result} ✓`);
939
+ }, 30_000);
940
+ test('tick_to_ms(10) == 500', async () => {
941
+ if (!serverOnline) {
942
+ console.warn(' SKIP: server offline');
943
+ return;
944
+ }
945
+ await mc.command('/scoreboard players set "#timer_to_ms" stdlib3_result 0');
946
+ await mc.command('/function stdlib_timer_test:test_tick_to_ms');
947
+ await mc.ticks(3);
948
+ const result = await mc.scoreboard('#timer_to_ms', 'stdlib3_result');
949
+ expect(result).toBe(500);
950
+ console.log(` tick_to_ms(10) = ${result} ✓`);
951
+ }, 30_000);
952
+ test('seconds_to_ticks(3) == 60', async () => {
953
+ if (!serverOnline) {
954
+ console.warn(' SKIP: server offline');
955
+ return;
956
+ }
957
+ await mc.command('/scoreboard players set "#timer_to_ticks" stdlib3_result 0');
958
+ await mc.command('/function stdlib_timer_test:test_seconds_to_ticks');
959
+ await mc.ticks(3);
960
+ const result = await mc.scoreboard('#timer_to_ticks', 'stdlib3_result');
961
+ expect(result).toBe(60);
962
+ console.log(` seconds_to_ticks(3) = ${result} ✓`);
963
+ }, 30_000);
964
+ test('format_time_s(100) == 5', async () => {
965
+ if (!serverOnline) {
966
+ console.warn(' SKIP: server offline');
967
+ return;
968
+ }
969
+ await mc.command('/scoreboard players set "#timer_fmt_s" stdlib3_result 0');
970
+ await mc.command('/function stdlib_timer_test:test_format_time_s');
971
+ await mc.ticks(3);
972
+ const result = await mc.scoreboard('#timer_fmt_s', 'stdlib3_result');
973
+ expect(result).toBe(5);
974
+ console.log(` format_time_s(100) = ${result} ✓`);
975
+ }, 30_000);
976
+ test('format_time_m(1200) == 1', async () => {
977
+ if (!serverOnline) {
978
+ console.warn(' SKIP: server offline');
979
+ return;
980
+ }
981
+ await mc.command('/scoreboard players set "#timer_fmt_m" stdlib3_result 0');
982
+ await mc.command('/function stdlib_timer_test:test_format_time_m');
983
+ await mc.ticks(3);
984
+ const result = await mc.scoreboard('#timer_fmt_m', 'stdlib3_result');
985
+ expect(result).toBe(1);
986
+ console.log(` format_time_m(1200) = ${result} ✓`);
987
+ }, 30_000);
988
+ });
989
+ // ---------------------------------------------------------------------------
990
+ // cooldown.mcrs
991
+ // ---------------------------------------------------------------------------
992
+ describe('MC Integration — stdlib: cooldown.mcrs', () => {
993
+ test('cooldown_ready returns 0 immediately after cooldown_start', async () => {
994
+ if (!serverOnline) {
995
+ console.warn(' SKIP: server offline');
996
+ return;
997
+ }
998
+ await mc.command('/scoreboard players set "#cd_not_ready" stdlib3_result -1');
999
+ await mc.command('/function stdlib_cooldown_test:test_cooldown_start_and_not_ready');
1000
+ await mc.ticks(3);
1001
+ const result = await mc.scoreboard('#cd_not_ready', 'stdlib3_result');
1002
+ expect(result).toBeGreaterThanOrEqual(0);
1003
+ console.log(` cooldown_ready after start = ${result} ✓`);
1004
+ }, 30_000);
1005
+ test('cooldown_ready returns 1 after all ticks expired', async () => {
1006
+ if (!serverOnline) {
1007
+ console.warn(' SKIP: server offline');
1008
+ return;
1009
+ }
1010
+ await mc.command('/scoreboard players set "#cd_expired" stdlib3_result -1');
1011
+ await mc.command('/function stdlib_cooldown_test:test_cooldown_tick_and_expire');
1012
+ await mc.ticks(3);
1013
+ const result = await mc.scoreboard('#cd_expired', 'stdlib3_result');
1014
+ expect(result).toBe(1);
1015
+ console.log(` cooldown_ready after expire = ${result} ✓`);
1016
+ }, 30_000);
1017
+ test('cooldown_ready returns 1 when no cooldown active', async () => {
1018
+ if (!serverOnline) {
1019
+ console.warn(' SKIP: server offline');
1020
+ return;
1021
+ }
1022
+ await mc.command('/scoreboard players set "#cd_fresh" stdlib3_result -1');
1023
+ await mc.command('/function stdlib_cooldown_test:test_cooldown_ready_initially');
1024
+ await mc.ticks(3);
1025
+ const result = await mc.scoreboard('#cd_fresh', 'stdlib3_result');
1026
+ expect(result).toBe(1);
1027
+ console.log(` cooldown_ready initially = ${result} ✓`);
1028
+ }, 30_000);
1029
+ });
1030
+ // ---------------------------------------------------------------------------
1031
+ // list.mcrs
1032
+ // ---------------------------------------------------------------------------
1033
+ describe('MC Integration — stdlib: list.mcrs', () => {
1034
+ test('sort2_min(7, 3) == 3', async () => {
1035
+ if (!serverOnline) {
1036
+ console.warn(' SKIP: server offline');
1037
+ return;
1038
+ }
1039
+ await mc.command('/scoreboard players set "#list_sort2_min" stdlib3_result 0');
1040
+ await mc.command('/function stdlib_list_test:test_sort2_min');
1041
+ await mc.ticks(3);
1042
+ const result = await mc.scoreboard('#list_sort2_min', 'stdlib3_result');
1043
+ expect(result).toBe(3);
1044
+ console.log(` sort2_min(7,3) = ${result} ✓`);
1045
+ }, 30_000);
1046
+ test('sort2_max(7, 3) == 7', async () => {
1047
+ if (!serverOnline) {
1048
+ console.warn(' SKIP: server offline');
1049
+ return;
1050
+ }
1051
+ await mc.command('/scoreboard players set "#list_sort2_max" stdlib3_result 0');
1052
+ await mc.command('/function stdlib_list_test:test_sort2_max');
1053
+ await mc.ticks(3);
1054
+ const result = await mc.scoreboard('#list_sort2_max', 'stdlib3_result');
1055
+ expect(result).toBe(7);
1056
+ console.log(` sort2_max(7,3) = ${result} ✓`);
1057
+ }, 30_000);
1058
+ test('list_min3(5, 1, 9) == 1', async () => {
1059
+ if (!serverOnline) {
1060
+ console.warn(' SKIP: server offline');
1061
+ return;
1062
+ }
1063
+ await mc.command('/scoreboard players set "#list_min3" stdlib3_result 0');
1064
+ await mc.command('/function stdlib_list_test:test_list_min3');
1065
+ await mc.ticks(3);
1066
+ const result = await mc.scoreboard('#list_min3', 'stdlib3_result');
1067
+ expect(result).toBe(1);
1068
+ console.log(` list_min3(5,1,9) = ${result} ✓`);
1069
+ }, 30_000);
1070
+ test('list_max3(5, 1, 9) == 9', async () => {
1071
+ if (!serverOnline) {
1072
+ console.warn(' SKIP: server offline');
1073
+ return;
1074
+ }
1075
+ await mc.command('/scoreboard players set "#list_max3" stdlib3_result 0');
1076
+ await mc.command('/function stdlib_list_test:test_list_max3');
1077
+ await mc.ticks(3);
1078
+ const result = await mc.scoreboard('#list_max3', 'stdlib3_result');
1079
+ expect(result).toBe(9);
1080
+ console.log(` list_max3(5,1,9) = ${result} ✓`);
1081
+ }, 30_000);
1082
+ test('list_sum5(1,2,3,4,5) == 15', async () => {
1083
+ if (!serverOnline) {
1084
+ console.warn(' SKIP: server offline');
1085
+ return;
1086
+ }
1087
+ await mc.command('/scoreboard players set "#list_sum5" stdlib3_result 0');
1088
+ await mc.command('/function stdlib_list_test:test_list_sum5');
1089
+ await mc.ticks(3);
1090
+ const result = await mc.scoreboard('#list_sum5', 'stdlib3_result');
1091
+ expect(result).toBe(15);
1092
+ console.log(` list_sum5(1..5) = ${result} ✓`);
1093
+ }, 30_000);
1094
+ test('avg3(10, 20, 30) == 20', async () => {
1095
+ if (!serverOnline) {
1096
+ console.warn(' SKIP: server offline');
1097
+ return;
1098
+ }
1099
+ await mc.command('/scoreboard players set "#list_avg3" stdlib3_result 0');
1100
+ await mc.command('/function stdlib_list_test:test_avg3');
1101
+ await mc.ticks(3);
1102
+ const result = await mc.scoreboard('#list_avg3', 'stdlib3_result');
1103
+ expect(result).toBe(20);
1104
+ console.log(` avg3(10,20,30) = ${result} ✓`);
1105
+ }, 30_000);
1106
+ test('sort3(9,3,6, pos=0) == 3 (min)', async () => {
1107
+ if (!serverOnline) {
1108
+ console.warn(' SKIP: server offline');
1109
+ return;
1110
+ }
1111
+ await mc.command('/scoreboard players set "#list_sort3_min" stdlib3_result 0');
1112
+ await mc.command('/function stdlib_list_test:test_sort3_min');
1113
+ await mc.ticks(3);
1114
+ const result = await mc.scoreboard('#list_sort3_min', 'stdlib3_result');
1115
+ expect(result).toBe(3);
1116
+ console.log(` sort3 min = ${result} ✓`);
1117
+ }, 30_000);
1118
+ test('sort3(9,3,6, pos=2) == 9 (max)', async () => {
1119
+ if (!serverOnline) {
1120
+ console.warn(' SKIP: server offline');
1121
+ return;
1122
+ }
1123
+ await mc.command('/scoreboard players set "#list_sort3_max" stdlib3_result 0');
1124
+ await mc.command('/function stdlib_list_test:test_sort3_max');
1125
+ await mc.ticks(3);
1126
+ const result = await mc.scoreboard('#list_sort3_max', 'stdlib3_result');
1127
+ expect(result).toBe(9);
1128
+ console.log(` sort3 max = ${result} ✓`);
1129
+ }, 30_000);
1130
+ test('list_sum([10,20,30,40], 4) == 100', async () => {
1131
+ if (!serverOnline) {
1132
+ console.warn(' SKIP: server offline');
1133
+ return;
1134
+ }
1135
+ await mc.command('/scoreboard players set "#list_sum_dyn" stdlib3_result 0');
1136
+ await mc.command('/function stdlib_list_test:test_list_sum_dynamic');
1137
+ await mc.ticks(3);
1138
+ const result = await mc.scoreboard('#list_sum_dyn', 'stdlib3_result');
1139
+ expect(result).toBe(100);
1140
+ console.log(` list_sum dynamic = ${result} ✓`);
1141
+ }, 30_000);
1142
+ test('list_min([50,10,30,20], 4) == 10', async () => {
1143
+ if (!serverOnline) {
1144
+ console.warn(' SKIP: server offline');
1145
+ return;
1146
+ }
1147
+ await mc.command('/scoreboard players set "#list_min_dyn" stdlib3_result 0');
1148
+ await mc.command('/function stdlib_list_test:test_list_min_dynamic');
1149
+ await mc.ticks(3);
1150
+ const result = await mc.scoreboard('#list_min_dyn', 'stdlib3_result');
1151
+ expect(result).toBe(10);
1152
+ console.log(` list_min dynamic = ${result} ✓`);
1153
+ }, 30_000);
1154
+ test('list_max([50,10,30,20], 4) == 50', async () => {
1155
+ if (!serverOnline) {
1156
+ console.warn(' SKIP: server offline');
1157
+ return;
1158
+ }
1159
+ await mc.command('/scoreboard players set "#list_max_dyn" stdlib3_result 0');
1160
+ await mc.command('/function stdlib_list_test:test_list_max_dynamic');
1161
+ await mc.ticks(3);
1162
+ const result = await mc.scoreboard('#list_max_dyn', 'stdlib3_result');
1163
+ expect(result).toBe(50);
1164
+ console.log(` list_max dynamic = ${result} ✓`);
1165
+ }, 30_000);
1166
+ test('list_contains([10,20,30], 3, 20) == 1', async () => {
1167
+ if (!serverOnline) {
1168
+ console.warn(' SKIP: server offline');
1169
+ return;
1170
+ }
1171
+ await mc.command('/scoreboard players set "#list_contains_yes" stdlib3_result 0');
1172
+ await mc.command('/function stdlib_list_test:test_list_contains_yes');
1173
+ await mc.ticks(3);
1174
+ const result = await mc.scoreboard('#list_contains_yes', 'stdlib3_result');
1175
+ expect(result).toBe(1);
1176
+ console.log(` list_contains present = ${result} ✓`);
1177
+ }, 30_000);
1178
+ test('list_contains([10,20,30], 3, 99) == 0', async () => {
1179
+ if (!serverOnline) {
1180
+ console.warn(' SKIP: server offline');
1181
+ return;
1182
+ }
1183
+ await mc.command('/scoreboard players set "#list_contains_no" stdlib3_result -1');
1184
+ await mc.command('/function stdlib_list_test:test_list_contains_no');
1185
+ await mc.ticks(3);
1186
+ const result = await mc.scoreboard('#list_contains_no', 'stdlib3_result');
1187
+ expect(result).toBe(0);
1188
+ console.log(` list_contains absent = ${result} ✓`);
1189
+ }, 30_000);
1190
+ test('list_index_of([10,20,30], 3, 20) == 1', async () => {
1191
+ if (!serverOnline) {
1192
+ console.warn(' SKIP: server offline');
1193
+ return;
1194
+ }
1195
+ await mc.command('/scoreboard players set "#list_index_of" stdlib3_result -1');
1196
+ await mc.command('/function stdlib_list_test:test_list_index_of');
1197
+ await mc.ticks(3);
1198
+ const result = await mc.scoreboard('#list_index_of', 'stdlib3_result');
1199
+ expect(result).toBe(1);
1200
+ console.log(` list_index_of = ${result} ✓`);
1201
+ }, 30_000);
1202
+ test('list_sort_asc([40,10,30,20]) → arr[0]==10', async () => {
1203
+ if (!serverOnline) {
1204
+ console.warn(' SKIP: server offline');
1205
+ return;
1206
+ }
1207
+ await mc.command('/scoreboard players set "#list_sort_asc_0" stdlib3_result 0');
1208
+ await mc.command('/function stdlib_list_test:test_list_sort_asc');
1209
+ await mc.ticks(3);
1210
+ const result = await mc.scoreboard('#list_sort_asc_0', 'stdlib3_result');
1211
+ expect(result).toBe(10);
1212
+ console.log(` list_sort_asc[0] = ${result} ✓`);
1213
+ }, 30_000);
1214
+ test('list_sort_asc([40,10,30,20]) → arr[3]==40', async () => {
1215
+ if (!serverOnline) {
1216
+ console.warn(' SKIP: server offline');
1217
+ return;
1218
+ }
1219
+ await mc.command('/scoreboard players set "#list_sort_asc_3" stdlib3_result 0');
1220
+ await mc.command('/function stdlib_list_test:test_list_sort_asc');
1221
+ await mc.ticks(3);
1222
+ const result = await mc.scoreboard('#list_sort_asc_3', 'stdlib3_result');
1223
+ expect(result).toBe(40);
1224
+ console.log(` list_sort_asc[3] = ${result} ✓`);
1225
+ }, 30_000);
1226
+ });
1227
+ //# sourceMappingURL=stdlib-coverage-3.test.js.map