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.
- package/.github/workflows/ci.yml +11 -0
- package/CHANGELOG.md +18 -9
- package/README-benchmarks.md +48 -0
- package/README-vscode-test.md +251 -0
- package/RELEASE_NOTES.md +74 -0
- package/ROADMAP.md +131 -167
- package/benchmarks/_shared.ts +468 -0
- package/benchmarks/baseline.json +2816 -0
- package/benchmarks/baseline.md +13 -0
- package/benchmarks/compiler-perf.report.json +207 -0
- package/benchmarks/compiler-perf.ts +76 -0
- package/benchmarks/results.md +13 -0
- package/benchmarks/stdlib-complexity.report.json +2606 -0
- package/benchmarks/stdlib-complexity.ts +54 -0
- package/benchmarks/stdlib-size.md +57 -0
- package/benchmarks/stdlib-size.ts +91 -0
- package/coverage-report.md +177 -0
- package/dist/src/__tests__/budget.test.js +4 -0
- package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
- package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
- package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
- package/dist/src/__tests__/cache-extra.test.js +211 -0
- package/dist/src/__tests__/cli-init.test.d.ts +1 -0
- package/dist/src/__tests__/cli-init.test.js +97 -0
- package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
- package/dist/src/__tests__/cli-publish.test.js +189 -0
- package/dist/src/__tests__/cli.test.js +76 -0
- package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
- package/dist/src/__tests__/compile-preprocess.test.js +328 -0
- package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
- package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
- package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
- package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
- package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/do-while.test.js +120 -0
- package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
- package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
- package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/interface.test.js +258 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
- package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/match-string.test.js +43 -0
- package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/memoize.test.js +113 -0
- package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
- package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
- package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
- package/dist/src/__tests__/compiler/module-import.test.js +261 -0
- package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
- package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
- package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
- package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
- package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
- package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
- package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
- package/dist/src/__tests__/config/project-config.test.js +199 -0
- package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
- package/dist/src/__tests__/config-decorator.test.js +142 -0
- package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
- package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
- package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
- package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
- package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
- package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
- package/dist/src/__tests__/emit/index.test.js +2 -1
- package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
- package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
- package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
- package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
- package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
- package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
- package/dist/src/__tests__/emit/source-map.test.js +167 -0
- package/dist/src/__tests__/enum.test.js +9 -4
- package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
- package/dist/src/__tests__/error-recovery.test.js +217 -0
- package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
- package/dist/src/__tests__/events-types-extra.test.js +91 -0
- package/dist/src/__tests__/events-types.test.d.ts +4 -0
- package/dist/src/__tests__/events-types.test.js +56 -0
- package/dist/src/__tests__/formatter.test.js +13 -5
- package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
- package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
- package/dist/src/__tests__/incremental.test.js +10 -2
- package/dist/src/__tests__/index-extra.test.d.ts +10 -0
- package/dist/src/__tests__/index-extra.test.js +71 -0
- package/dist/src/__tests__/lexer.test.js +2 -2
- package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
- package/dist/src/__tests__/lint/rules.test.js +208 -0
- package/dist/src/__tests__/lir/lower.test.js +29 -0
- package/dist/src/__tests__/lir/verify.test.js +30 -0
- package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/completion.test.js +583 -0
- package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/definition.test.js +454 -0
- package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
- package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
- package/dist/src/__tests__/lsp.test.js +4 -1
- package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
- package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
- package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
- package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
- package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
- package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
- package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
- package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
- package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
- package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
- package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
- package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
- package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
- package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
- package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
- package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
- package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
- package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
- package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
- package/dist/src/__tests__/optimizer/cse.test.js +178 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
- package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/licm.test.js +244 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
- package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
- package/dist/src/__tests__/optimizer/tco.test.js +203 -0
- package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/parser-coverage.test.js +491 -0
- package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
- package/dist/src/__tests__/parser-extra.test.js +451 -0
- package/dist/src/__tests__/parser.test.js +12 -0
- package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
- package/dist/src/__tests__/repl-extra.test.js +174 -0
- package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
- package/dist/src/__tests__/repl-server-extra.test.js +161 -0
- package/dist/src/__tests__/repl-server.test.d.ts +6 -0
- package/dist/src/__tests__/repl-server.test.js +146 -0
- package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
- package/dist/src/__tests__/runtime-extra.test.js +732 -0
- package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
- package/dist/src/__tests__/singleton-decorator.test.js +260 -0
- package/dist/src/__tests__/sourcemap.test.js +1 -1
- package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
- package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
- package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bits.test.js +96 -0
- package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
- package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/color.test.js +84 -0
- package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/combat.test.js +64 -0
- package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
- package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
- package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
- package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/effects.test.js +72 -0
- package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/events.test.js +55 -0
- package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/expr.test.js +77 -0
- package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/fft.test.js +82 -0
- package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/graph.test.js +102 -0
- package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
- package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
- package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
- package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/map.test.js +84 -0
- package/dist/src/__tests__/stdlib/math.test.js +19 -6
- package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
- package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
- package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/noise.test.js +73 -0
- package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ode.test.js +68 -0
- package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
- package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/particles.test.js +68 -0
- package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/physics.test.js +76 -0
- package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/player.test.js +64 -0
- package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
- package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/queue.test.js +97 -0
- package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/random.test.js +76 -0
- package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/result.test.js +329 -0
- package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
- package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
- package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
- package/dist/src/__tests__/stdlib/sets.test.js +60 -0
- package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/signal.test.js +84 -0
- package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
- package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/string.test.js +231 -0
- package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/strings.test.js +83 -0
- package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/tags.test.js +57 -0
- package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/teams.test.js +72 -0
- package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/timer.test.js +79 -0
- package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/vec.test.js +94 -0
- package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/world.test.js +72 -0
- package/dist/src/__tests__/struct-display.test.d.ts +1 -0
- package/dist/src/__tests__/struct-display.test.js +64 -0
- package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
- package/dist/src/__tests__/test-framework/runner.test.js +193 -0
- package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
- package/dist/src/__tests__/tuner/adapters.test.js +194 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
- package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
- package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
- package/dist/src/__tests__/typechecker.test.js +3 -3
- package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/watch-decorator.test.js +54 -0
- package/dist/src/ast/types.d.ts +102 -3
- package/dist/src/cache/incremental.d.ts +13 -14
- package/dist/src/cache/incremental.js +106 -89
- package/dist/src/cache/index.d.ts +8 -2
- package/dist/src/cache/index.js +18 -6
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.js +466 -17
- package/dist/src/config/project-config.d.ts +29 -0
- package/dist/src/config/project-config.js +180 -0
- package/dist/src/diagnostics/index.d.ts +9 -0
- package/dist/src/diagnostics/index.js +18 -1
- package/dist/src/emit/compile.d.ts +10 -0
- package/dist/src/emit/compile.js +395 -50
- package/dist/src/emit/index.d.ts +40 -0
- package/dist/src/emit/index.js +307 -14
- package/dist/src/emit/modules.js +21 -3
- package/dist/src/emit/sourcemap.d.ts +23 -27
- package/dist/src/emit/sourcemap.js +52 -30
- package/dist/src/formatter/index.js +33 -8
- package/dist/src/hir/deprecated.d.ts +13 -0
- package/dist/src/hir/deprecated.js +218 -0
- package/dist/src/hir/lower.js +114 -8
- package/dist/src/hir/monomorphize.js +22 -2
- package/dist/src/hir/types.d.ts +65 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +18 -3
- package/dist/src/lexer/index.d.ts +2 -1
- package/dist/src/lexer/index.js +39 -3
- package/dist/src/lint/index.d.ts +45 -0
- package/dist/src/lint/index.js +930 -0
- package/dist/src/lir/lower.js +29 -2
- package/dist/src/lir/types.d.ts +2 -0
- package/dist/src/lsp/server.js +92 -5
- package/dist/src/mir/lower.js +775 -34
- package/dist/src/mir/macro.js +36 -2
- package/dist/src/mir/types.d.ts +12 -0
- package/dist/src/mir/verify.js +9 -0
- package/dist/src/optimizer/auto-inline.d.ts +2 -0
- package/dist/src/optimizer/auto-inline.js +67 -0
- package/dist/src/optimizer/cse.d.ts +20 -0
- package/dist/src/optimizer/cse.js +234 -0
- package/dist/src/optimizer/inline.d.ts +26 -0
- package/dist/src/optimizer/inline.js +286 -0
- package/dist/src/optimizer/interprocedural.js +4 -0
- package/dist/src/optimizer/licm.d.ts +32 -0
- package/dist/src/optimizer/licm.js +371 -0
- package/dist/src/optimizer/pipeline.js +12 -2
- package/dist/src/optimizer/strength_reduction.d.ts +15 -0
- package/dist/src/optimizer/strength_reduction.js +90 -0
- package/dist/src/optimizer/tco.d.ts +53 -0
- package/dist/src/optimizer/tco.js +238 -0
- package/dist/src/parser/index.d.ts +32 -0
- package/dist/src/parser/index.js +421 -59
- package/dist/src/repl-server.d.ts +13 -0
- package/dist/src/repl-server.js +127 -0
- package/dist/src/structs/expand.d.ts +15 -0
- package/dist/src/structs/expand.js +46 -0
- package/dist/src/testing/runner.d.ts +40 -0
- package/dist/src/testing/runner.js +237 -0
- package/dist/src/typechecker/index.d.ts +3 -0
- package/dist/src/typechecker/index.js +254 -9
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
- package/docs/stdlib/result.md +156 -0
- package/docs/stdlib/result.zh.md +156 -0
- package/editors/vscode/fixtures/test.mcrs +7 -0
- package/editors/vscode/out/extension.js +2095 -225
- package/editors/vscode/out/lsp-server.js +519 -51
- package/editors/vscode/package-lock.json +9 -4
- package/editors/vscode/package.json +1 -1
- package/examples/display-demo.mcrs +64 -0
- package/examples/game/racing.mcrs +301 -0
- package/examples/game/tower_defense.mcrs +311 -0
- package/examples/math/physics_sim.mcrs +322 -0
- package/examples/rpg/boss_fight.mcrs +313 -0
- package/examples/rpg/health_system.mcrs +237 -0
- package/examples/rpg/inventory.mcrs +265 -0
- package/examples/util/debug_hud.mcrs +279 -0
- package/jest.config.js +10 -0
- package/package.json +12 -3
- package/playground/index.html +823 -0
- package/scripts/gen-docs.ts +533 -0
- package/scripts/update-redscript-docs-stdlib.sh +770 -0
- package/src/__tests__/budget.test.ts +5 -0
- package/src/__tests__/cache/cache-behavior.test.ts +480 -0
- package/src/__tests__/cache-extra.test.ts +199 -0
- package/src/__tests__/cli-docs.test.ts +77 -0
- package/src/__tests__/cli-init.test.ts +91 -0
- package/src/__tests__/cli-publish.test.ts +190 -0
- package/src/__tests__/cli.test.ts +117 -1
- package/src/__tests__/compile-preprocess.test.ts +366 -0
- package/src/__tests__/compiler/break-stmt.test.ts +66 -0
- package/src/__tests__/compiler/const-decl.test.ts +141 -0
- package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
- package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
- package/src/__tests__/compiler/deprecated.test.ts +305 -0
- package/src/__tests__/compiler/do-while.test.ts +130 -0
- package/src/__tests__/compiler/enum-payload.test.ts +299 -0
- package/src/__tests__/compiler/interface.test.ts +287 -0
- package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
- package/src/__tests__/compiler/match-string.test.ts +45 -0
- package/src/__tests__/compiler/memoize.test.ts +126 -0
- package/src/__tests__/compiler/method-chain.test.ts +121 -0
- package/src/__tests__/compiler/module-import.test.ts +240 -0
- package/src/__tests__/compiler/option-extensions.test.ts +207 -0
- package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
- package/src/__tests__/compiler/string-advanced.test.ts +310 -0
- package/src/__tests__/compiler/struct-extends.test.ts +109 -0
- package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
- package/src/__tests__/compiler/tuple-type.test.ts +263 -0
- package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
- package/src/__tests__/config/project-config.test.ts +181 -0
- package/src/__tests__/config-decorator.test.ts +157 -0
- package/src/__tests__/diagnostics-extra.test.ts +155 -0
- package/src/__tests__/emit/compile-branches.test.ts +135 -0
- package/src/__tests__/emit/compile-coverage.test.ts +696 -0
- package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
- package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
- package/src/__tests__/emit/compile.test.ts +6 -1
- package/src/__tests__/emit/execute-chain.test.ts +114 -0
- package/src/__tests__/emit/index.test.ts +2 -1
- package/src/__tests__/emit/modules-branches.test.ts +90 -0
- package/src/__tests__/emit/modules-coverage.test.ts +241 -0
- package/src/__tests__/emit/modules-errors.test.ts +192 -0
- package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
- package/src/__tests__/emit/source-map.test.ts +152 -0
- package/src/__tests__/enum.test.ts +9 -4
- package/src/__tests__/error-recovery.test.ts +226 -0
- package/src/__tests__/events-types-extra.test.ts +110 -0
- package/src/__tests__/events-types.test.ts +66 -0
- package/src/__tests__/formatter.test.ts +15 -5
- package/src/__tests__/generics.test.ts +16 -9
- package/src/__tests__/hir/lower-extra.test.ts +151 -0
- package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
- package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
- package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
- package/src/__tests__/impl.test.ts +12 -8
- package/src/__tests__/incremental.test.ts +10 -2
- package/src/__tests__/index-extra.test.ts +79 -0
- package/src/__tests__/lexer.test.ts +2 -2
- package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
- package/src/__tests__/lint/rules-coverage.test.ts +598 -0
- package/src/__tests__/lint/rules.test.ts +230 -0
- package/src/__tests__/lir/lower.test.ts +33 -0
- package/src/__tests__/lir/verify.test.ts +33 -0
- package/src/__tests__/lsp/completion.test.ts +687 -0
- package/src/__tests__/lsp/definition.test.ts +499 -0
- package/src/__tests__/lsp/diagnostics.test.ts +108 -0
- package/src/__tests__/lsp/hover-docs.test.ts +222 -0
- package/src/__tests__/lsp.test.ts +4 -1
- package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
- package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
- package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
- package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
- package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
- package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
- package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
- package/src/__tests__/mc-validator-coverage.test.ts +325 -0
- package/src/__tests__/mc-validator-extra.test.ts +252 -0
- package/src/__tests__/mir/lower-extra.test.ts +402 -0
- package/src/__tests__/mir/lower-extra2.test.ts +348 -0
- package/src/__tests__/mir/lower-extra3.test.ts +277 -0
- package/src/__tests__/mir/lower-extra4.test.ts +636 -0
- package/src/__tests__/mir/lower-extra5.test.ts +612 -0
- package/src/__tests__/mir/lower-extra6.test.ts +520 -0
- package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
- package/src/__tests__/mir/lower-extra8.test.ts +704 -0
- package/src/__tests__/mir/lower-extra9.test.ts +821 -0
- package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
- package/src/__tests__/optimizer/cse.test.ts +195 -0
- package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
- package/src/__tests__/optimizer/licm.test.ts +358 -0
- package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
- package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
- package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
- package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
- package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
- package/src/__tests__/optimizer/tco.test.ts +238 -0
- package/src/__tests__/option.test.ts +14 -7
- package/src/__tests__/parser-coverage.test.ts +576 -0
- package/src/__tests__/parser-extra.test.ts +531 -0
- package/src/__tests__/parser.test.ts +14 -0
- package/src/__tests__/repl-extra.test.ts +195 -0
- package/src/__tests__/repl-server-extra.test.ts +150 -0
- package/src/__tests__/repl-server.test.ts +122 -0
- package/src/__tests__/runtime-extra.test.ts +862 -0
- package/src/__tests__/singleton-decorator.test.ts +285 -0
- package/src/__tests__/sourcemap.test.ts +1 -1
- package/src/__tests__/stdlib/advanced.test.ts +312 -0
- package/src/__tests__/stdlib/bigint.test.ts +57 -0
- package/src/__tests__/stdlib/bits.test.ts +75 -0
- package/src/__tests__/stdlib/bossbar.test.ts +45 -0
- package/src/__tests__/stdlib/color.test.ts +60 -0
- package/src/__tests__/stdlib/combat.test.ts +35 -0
- package/src/__tests__/stdlib/cooldown.test.ts +35 -0
- package/src/__tests__/stdlib/dialog.test.ts +14 -6
- package/src/__tests__/stdlib/ecs.test.ts +54 -0
- package/src/__tests__/stdlib/effects.test.ts +45 -0
- package/src/__tests__/stdlib/events.test.ts +23 -0
- package/src/__tests__/stdlib/expr.test.ts +48 -0
- package/src/__tests__/stdlib/fft.test.ts +54 -0
- package/src/__tests__/stdlib/graph.test.ts +77 -0
- package/src/__tests__/stdlib/interactions.test.ts +30 -0
- package/src/__tests__/stdlib/inventory.test.ts +40 -0
- package/src/__tests__/stdlib/linalg.test.ts +52 -0
- package/src/__tests__/stdlib/map.test.ts +55 -0
- package/src/__tests__/stdlib/math.test.ts +19 -5
- package/src/__tests__/stdlib/math_hp.test.ts +55 -0
- package/src/__tests__/stdlib/mobs.test.ts +40 -0
- package/src/__tests__/stdlib/noise.test.ts +46 -0
- package/src/__tests__/stdlib/ode.test.ts +40 -0
- package/src/__tests__/stdlib/parabola.test.ts +51 -0
- package/src/__tests__/stdlib/particles.test.ts +40 -0
- package/src/__tests__/stdlib/physics.test.ts +50 -0
- package/src/__tests__/stdlib/player.test.ts +35 -0
- package/src/__tests__/stdlib/quaternion.test.ts +46 -0
- package/src/__tests__/stdlib/queue.test.ts +73 -0
- package/src/__tests__/stdlib/random.test.ts +50 -0
- package/src/__tests__/stdlib/result.test.ts +326 -0
- package/src/__tests__/stdlib/scheduler.test.ts +18 -7
- package/src/__tests__/stdlib/set_int.test.ts +62 -0
- package/src/__tests__/stdlib/sets.test.ts +28 -0
- package/src/__tests__/stdlib/signal.test.ts +60 -0
- package/src/__tests__/stdlib/spawn.test.ts +40 -0
- package/src/__tests__/stdlib/string.test.ts +224 -0
- package/src/__tests__/stdlib/strings.test.ts +55 -0
- package/src/__tests__/stdlib/tags.test.ts +32 -0
- package/src/__tests__/stdlib/teams.test.ts +45 -0
- package/src/__tests__/stdlib/timer.test.ts +53 -0
- package/src/__tests__/stdlib/vec.test.ts +72 -0
- package/src/__tests__/stdlib/world.test.ts +45 -0
- package/src/__tests__/struct-display.test.ts +69 -0
- package/src/__tests__/test-framework/runner.test.ts +208 -0
- package/src/__tests__/tuner/adapters.test.ts +232 -0
- package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
- package/src/__tests__/tuple.test.ts +11 -4
- package/src/__tests__/typechecker-coverage.test.ts +671 -0
- package/src/__tests__/typechecker.test.ts +4 -3
- package/src/__tests__/watch-decorator.test.ts +59 -0
- package/src/ast/types.ts +65 -3
- package/src/cache/incremental.ts +128 -99
- package/src/cache/index.ts +35 -8
- package/src/cli.ts +538 -29
- package/src/config/project-config.ts +176 -0
- package/src/diagnostics/index.ts +22 -0
- package/src/docs.ts +98 -0
- package/src/emit/compile.ts +408 -51
- package/src/emit/index.ts +366 -18
- package/src/emit/modules.ts +19 -3
- package/src/emit/sourcemap.ts +64 -43
- package/src/formatter/index.ts +35 -8
- package/src/hir/deprecated.ts +212 -0
- package/src/hir/lower.ts +128 -8
- package/src/hir/monomorphize.ts +24 -2
- package/src/hir/types.ts +26 -1
- package/src/index.ts +23 -3
- package/src/lexer/index.ts +45 -6
- package/src/lint/index.ts +922 -0
- package/src/lir/lower.ts +30 -2
- package/src/lir/types.ts +4 -0
- package/src/lsp/server.ts +100 -1
- package/src/mir/lower.ts +785 -40
- package/src/mir/macro.ts +30 -2
- package/src/mir/types.ts +13 -0
- package/src/mir/verify.ts +10 -2
- package/src/optimizer/auto-inline.ts +86 -0
- package/src/optimizer/copy_prop.ts +2 -2
- package/src/optimizer/coroutine.ts +3 -3
- package/src/optimizer/cse.ts +205 -0
- package/src/optimizer/dce.ts +2 -2
- package/src/optimizer/inline.ts +335 -0
- package/src/optimizer/interprocedural.ts +5 -1
- package/src/optimizer/licm.ts +454 -0
- package/src/optimizer/nbt-coalesce.ts +109 -0
- package/src/optimizer/pipeline.ts +16 -2
- package/src/optimizer/scoreboard-batch.ts +52 -0
- package/src/optimizer/strength_reduction.ts +95 -0
- package/src/optimizer/tco.ts +267 -0
- package/src/optimizer/unroll.ts +2 -2
- package/src/parser/index.ts +426 -53
- package/src/repl-server.ts +102 -0
- package/src/stdlib/advanced.mcrs +271 -101
- package/src/stdlib/bigint.mcrs +97 -11
- package/src/stdlib/bits.mcrs +75 -12
- package/src/stdlib/bossbar.mcrs +37 -8
- package/src/stdlib/calculus.mcrs +82 -26
- package/src/stdlib/color.mcrs +98 -16
- package/src/stdlib/combat.mcrs +23 -5
- package/src/stdlib/cooldown.mcrs +19 -0
- package/src/stdlib/dialog.mcrs +45 -7
- package/src/stdlib/easing.mcrs +132 -12
- package/src/stdlib/ecs.mcrs +142 -25
- package/src/stdlib/effects.mcrs +88 -12
- package/src/stdlib/events.mcrs +21 -2
- package/src/stdlib/expr.mcrs +18 -3
- package/src/stdlib/fft.mcrs +66 -56
- package/src/stdlib/geometry.mcrs +137 -39
- package/src/stdlib/graph.mcrs +73 -0
- package/src/stdlib/heap.mcrs +49 -8
- package/src/stdlib/i18n/zh.yaml +2891 -0
- package/src/stdlib/interactions.mcrs +43 -20
- package/src/stdlib/inventory.mcrs +14 -3
- package/src/stdlib/linalg.mcrs +185 -30
- package/src/stdlib/list.mcrs +168 -18
- package/src/stdlib/map.mcrs +112 -0
- package/src/stdlib/math.mcrs +68 -18
- package/src/stdlib/math_hp.mcrs +124 -33
- package/src/stdlib/matrix.mcrs +133 -20
- package/src/stdlib/mobs.mcrs +87 -0
- package/src/stdlib/noise.mcrs +65 -21
- package/src/stdlib/ode.mcrs +96 -0
- package/src/stdlib/parabola.mcrs +104 -29
- package/src/stdlib/particles.mcrs +78 -21
- package/src/stdlib/pathfind.mcrs +89 -35
- package/src/stdlib/physics.mcrs +134 -26
- package/src/stdlib/player.mcrs +18 -0
- package/src/stdlib/quaternion.mcrs +213 -9
- package/src/stdlib/queue.mcrs +123 -0
- package/src/stdlib/random.mcrs +63 -18
- package/src/stdlib/result.mcrs +111 -0
- package/src/stdlib/scheduler.mcrs +59 -10
- package/src/stdlib/set_int.mcrs +240 -0
- package/src/stdlib/sets.mcrs +49 -19
- package/src/stdlib/signal.mcrs +151 -79
- package/src/stdlib/sort.mcrs +44 -24
- package/src/stdlib/spawn.mcrs +30 -7
- package/src/stdlib/state.mcrs +40 -5
- package/src/stdlib/strings.mcrs +131 -3
- package/src/stdlib/tags.mcrs +2 -2
- package/src/stdlib/teams.mcrs +22 -10
- package/src/stdlib/timer.mcrs +36 -6
- package/src/stdlib/vec.mcrs +44 -9
- package/src/stdlib/world.mcrs +57 -25
- package/src/structs/expand.ts +64 -0
- package/src/testing/runner.ts +271 -0
- 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
|