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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for stdlib/random.mcrs — LCG / PCG RNG helpers.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { compile } from '../../emit/compile'
|
|
6
|
+
import * as fs from 'fs'
|
|
7
|
+
import * as path from 'path'
|
|
8
|
+
|
|
9
|
+
const SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/random.mcrs'), 'utf-8')
|
|
10
|
+
|
|
11
|
+
function compileWith(extra: string) {
|
|
12
|
+
return compile(SRC + '\n' + extra, { namespace: 'test' })
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
describe('stdlib/random.mcrs', () => {
|
|
16
|
+
test('compiles without errors', () => {
|
|
17
|
+
const r = compileWith('')
|
|
18
|
+
expect(r.files.length).toBeGreaterThan(0)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
test('next_lcg is emitted', () => {
|
|
22
|
+
const r = compileWith(`@keep fn t(): int { return next_lcg(12345); }`)
|
|
23
|
+
expect(r.files.some(f => f.path.includes('next_lcg'))).toBe(true)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('random_range is emitted', () => {
|
|
27
|
+
const r = compileWith(`@keep fn t(): int { return random_range(999, 0, 100); }`)
|
|
28
|
+
expect(r.files.some(f => f.path.includes('random_range'))).toBe(true)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
test('random_bool is emitted', () => {
|
|
32
|
+
const r = compileWith(`@keep fn t(): int { return random_bool(42); }`)
|
|
33
|
+
expect(r.files.some(f => f.path.includes('random_bool'))).toBe(true)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('pcg_next_lo is emitted', () => {
|
|
37
|
+
const r = compileWith(`@keep fn t(): int { return pcg_next_lo(123); }`)
|
|
38
|
+
expect(r.files.some(f => f.path.includes('pcg_next_lo'))).toBe(true)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('binomial_sample is emitted', () => {
|
|
42
|
+
const r = compileWith(`@keep fn t(): int { return binomial_sample(10, 5000, 777); }`)
|
|
43
|
+
expect(r.files.some(f => f.path.includes('binomial_sample'))).toBe(true)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
test('hypergeometric_sample is emitted', () => {
|
|
47
|
+
const r = compileWith(`@keep fn t(): int { return hypergeometric_sample(20, 5, 10, 999); }`)
|
|
48
|
+
expect(r.files.some(f => f.path.includes('hypergeometric_sample'))).toBe(true)
|
|
49
|
+
})
|
|
50
|
+
})
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for stdlib/result.mcrs — Result<T> error handling type.
|
|
3
|
+
*
|
|
4
|
+
* Covers:
|
|
5
|
+
* - Compilation succeeds for the full stdlib file
|
|
6
|
+
* - Result::Ok and Result::Err construction emit correct scoreboard/NBT commands
|
|
7
|
+
* - result_is_ok / result_is_err helper functions compile and are emitted
|
|
8
|
+
* - result_value / result_code extraction helpers compile and are emitted
|
|
9
|
+
* - result_divide safe division example compiles correctly
|
|
10
|
+
* - match on Result arms emits correct tag comparison and NBT reads
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { compile } from '../../emit/compile'
|
|
14
|
+
import * as fs from 'fs'
|
|
15
|
+
import * as path from 'path'
|
|
16
|
+
|
|
17
|
+
const RESULT_STDLIB = path.join(__dirname, '../../stdlib/result.mcrs')
|
|
18
|
+
const resultSrc = fs.readFileSync(RESULT_STDLIB, 'utf-8')
|
|
19
|
+
|
|
20
|
+
function getCommands(source: string, namespace = 'test'): string[] {
|
|
21
|
+
const result = compile(source, { namespace })
|
|
22
|
+
if (!result.success) {
|
|
23
|
+
const errors = (result as any).errors ?? []
|
|
24
|
+
throw new Error(`Compilation failed:\n${errors.map((e: any) => e.message ?? e).join('\n')}`)
|
|
25
|
+
}
|
|
26
|
+
return (result.files ?? [])
|
|
27
|
+
.filter(f => f.path.endsWith('.mcfunction'))
|
|
28
|
+
.flatMap(f => f.content.split('\n'))
|
|
29
|
+
.filter(line => line.trim().length > 0)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function compileWithResult(extra: string): { path: string; content: string }[] {
|
|
33
|
+
const result = compile(resultSrc + '\n' + extra, { namespace: 'test' })
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
const errors = (result as any).errors ?? []
|
|
36
|
+
throw new Error(`Compilation failed:\n${errors.map((e: any) => e.message ?? e).join('\n')}`)
|
|
37
|
+
}
|
|
38
|
+
return result.files ?? []
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getFn(files: { path: string; content: string }[], fnName: string): string {
|
|
42
|
+
const f = files.find(f => f.path.endsWith(`/${fnName}.mcfunction`))
|
|
43
|
+
if (!f) {
|
|
44
|
+
const paths = files.map(f => f.path).join('\n')
|
|
45
|
+
throw new Error(`Function '${fnName}' not found in:\n${paths}`)
|
|
46
|
+
}
|
|
47
|
+
return f.content
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ===========================================================================
|
|
51
|
+
// Basic compilation
|
|
52
|
+
// ===========================================================================
|
|
53
|
+
|
|
54
|
+
describe('stdlib/result.mcrs: compilation', () => {
|
|
55
|
+
test('compiles the full stdlib file without errors', () => {
|
|
56
|
+
const result = compile(resultSrc, { namespace: 'test' })
|
|
57
|
+
// Library modules may emit no files if nothing is referenced — just check no crash
|
|
58
|
+
expect(result.success).toBe(true)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
test('Result enum is recognized by type checker', () => {
|
|
62
|
+
const source = resultSrc + `
|
|
63
|
+
@keep fn test_ok(): Result {
|
|
64
|
+
return Result::Ok(value: 42);
|
|
65
|
+
}
|
|
66
|
+
`
|
|
67
|
+
const result = compile(source, { namespace: 'test' })
|
|
68
|
+
expect(result.success).toBe(true)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
test('Result::Err construction compiles', () => {
|
|
72
|
+
const source = resultSrc + `
|
|
73
|
+
@keep fn test_err(): Result {
|
|
74
|
+
return Result::Err(code: -1);
|
|
75
|
+
}
|
|
76
|
+
`
|
|
77
|
+
const result = compile(source, { namespace: 'test' })
|
|
78
|
+
expect(result.success).toBe(true)
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
// ===========================================================================
|
|
83
|
+
// Constructor helpers
|
|
84
|
+
// ===========================================================================
|
|
85
|
+
|
|
86
|
+
describe('stdlib/result.mcrs: constructors', () => {
|
|
87
|
+
test('result_ok helper is emitted', () => {
|
|
88
|
+
const files = compileWithResult(`@keep fn t() { let r: Result = result_ok(100); }`)
|
|
89
|
+
expect(files.some(f => f.path.includes('result_ok'))).toBe(true)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
test('result_err helper is emitted', () => {
|
|
93
|
+
const files = compileWithResult(`@keep fn t() { let r: Result = result_err(-1); }`)
|
|
94
|
+
expect(files.some(f => f.path.includes('result_err'))).toBe(true)
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
test('Result::Ok emits tag=0 (Ok is first variant)', () => {
|
|
98
|
+
const source = resultSrc + `
|
|
99
|
+
@keep fn t(): Result {
|
|
100
|
+
return Result::Ok(value: 42);
|
|
101
|
+
}
|
|
102
|
+
`
|
|
103
|
+
const cmds = getCommands(source)
|
|
104
|
+
// Ok is variant index 0
|
|
105
|
+
const tagSets = cmds.filter(c => c.includes('scoreboard players set') && c.includes(' 0'))
|
|
106
|
+
expect(tagSets.length).toBeGreaterThan(0)
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
test('Result::Ok emits NBT write for payload value', () => {
|
|
110
|
+
const source = resultSrc + `
|
|
111
|
+
@keep fn t(): Result {
|
|
112
|
+
return Result::Ok(value: 99);
|
|
113
|
+
}
|
|
114
|
+
`
|
|
115
|
+
const cmds = getCommands(source)
|
|
116
|
+
const allCmds = cmds.join('\n')
|
|
117
|
+
expect(allCmds).toContain('storage rs:enums')
|
|
118
|
+
expect(allCmds).toContain('Result_value')
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
test('Result::Err emits tag=1 (Err is second variant)', () => {
|
|
122
|
+
const source = resultSrc + `
|
|
123
|
+
@keep fn t(): Result {
|
|
124
|
+
return Result::Err(code: -2);
|
|
125
|
+
}
|
|
126
|
+
`
|
|
127
|
+
const cmds = getCommands(source)
|
|
128
|
+
// Err is variant index 1
|
|
129
|
+
const tagSets = cmds.filter(c => c.includes('scoreboard players set') && c.includes(' 1'))
|
|
130
|
+
expect(tagSets.length).toBeGreaterThan(0)
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
test('Result::Err emits NBT write for payload code', () => {
|
|
134
|
+
const source = resultSrc + `
|
|
135
|
+
@keep fn t(): Result {
|
|
136
|
+
return Result::Err(code: -1);
|
|
137
|
+
}
|
|
138
|
+
`
|
|
139
|
+
const cmds = getCommands(source)
|
|
140
|
+
const allCmds = cmds.join('\n')
|
|
141
|
+
expect(allCmds).toContain('storage rs:enums')
|
|
142
|
+
expect(allCmds).toContain('Result_code')
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
// ===========================================================================
|
|
147
|
+
// Query helpers
|
|
148
|
+
// ===========================================================================
|
|
149
|
+
|
|
150
|
+
describe('stdlib/result.mcrs: query helpers', () => {
|
|
151
|
+
test('result_is_ok is emitted when called', () => {
|
|
152
|
+
const files = compileWithResult(`
|
|
153
|
+
@keep fn t(r: Result): int {
|
|
154
|
+
return result_is_ok(r);
|
|
155
|
+
}
|
|
156
|
+
`)
|
|
157
|
+
expect(files.some(f => f.path.includes('result_is_ok'))).toBe(true)
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
test('result_is_err is emitted when called', () => {
|
|
161
|
+
const files = compileWithResult(`
|
|
162
|
+
@keep fn t(r: Result): int {
|
|
163
|
+
return result_is_err(r);
|
|
164
|
+
}
|
|
165
|
+
`)
|
|
166
|
+
expect(files.some(f => f.path.includes('result_is_err'))).toBe(true)
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
test('result_is_ok match emits tag comparison', () => {
|
|
170
|
+
const source = resultSrc + `
|
|
171
|
+
@keep fn t(r: Result): int {
|
|
172
|
+
return result_is_ok(r);
|
|
173
|
+
}
|
|
174
|
+
`
|
|
175
|
+
const cmds = getCommands(source)
|
|
176
|
+
const allCmds = cmds.join('\n')
|
|
177
|
+
expect(allCmds).toContain('execute if score')
|
|
178
|
+
})
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
// ===========================================================================
|
|
182
|
+
// Extraction helpers
|
|
183
|
+
// ===========================================================================
|
|
184
|
+
|
|
185
|
+
describe('stdlib/result.mcrs: extraction helpers', () => {
|
|
186
|
+
test('result_value is emitted when called', () => {
|
|
187
|
+
const files = compileWithResult(`
|
|
188
|
+
@keep fn t(r: Result): int {
|
|
189
|
+
return result_value(r);
|
|
190
|
+
}
|
|
191
|
+
`)
|
|
192
|
+
expect(files.some(f => f.path.includes('result_value'))).toBe(true)
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
test('result_code is emitted when called', () => {
|
|
196
|
+
const files = compileWithResult(`
|
|
197
|
+
@keep fn t(r: Result): int {
|
|
198
|
+
return result_code(r);
|
|
199
|
+
}
|
|
200
|
+
`)
|
|
201
|
+
expect(files.some(f => f.path.includes('result_code'))).toBe(true)
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
test('result_value reads NBT payload field', () => {
|
|
205
|
+
const source = resultSrc + `
|
|
206
|
+
@keep fn t(r: Result): int {
|
|
207
|
+
return result_value(r);
|
|
208
|
+
}
|
|
209
|
+
`
|
|
210
|
+
const cmds = getCommands(source)
|
|
211
|
+
const allCmds = cmds.join('\n')
|
|
212
|
+
expect(allCmds).toContain('Result_value')
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
test('result_code reads NBT payload field', () => {
|
|
216
|
+
const source = resultSrc + `
|
|
217
|
+
@keep fn t(r: Result): int {
|
|
218
|
+
return result_code(r);
|
|
219
|
+
}
|
|
220
|
+
`
|
|
221
|
+
const cmds = getCommands(source)
|
|
222
|
+
const allCmds = cmds.join('\n')
|
|
223
|
+
expect(allCmds).toContain('Result_code')
|
|
224
|
+
})
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
// ===========================================================================
|
|
228
|
+
// Safe division example
|
|
229
|
+
// ===========================================================================
|
|
230
|
+
|
|
231
|
+
describe('stdlib/result.mcrs: result_divide', () => {
|
|
232
|
+
test('result_divide compiles and is emitted', () => {
|
|
233
|
+
const files = compileWithResult(`
|
|
234
|
+
@keep fn t(): Result {
|
|
235
|
+
return result_divide(10, 2);
|
|
236
|
+
}
|
|
237
|
+
`)
|
|
238
|
+
expect(files.some(f => f.path.includes('result_divide'))).toBe(true)
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
test('result_divide emits conditional branch guard', () => {
|
|
242
|
+
const source = resultSrc + `
|
|
243
|
+
@keep fn t(): Result {
|
|
244
|
+
return result_divide(10, 2);
|
|
245
|
+
}
|
|
246
|
+
`
|
|
247
|
+
const cmds = getCommands(source)
|
|
248
|
+
// The if (b == 0) check compiles to: execute store success score ... if score ... = ... then execute if score matches 1 run return
|
|
249
|
+
expect(cmds.some(c => c.includes('execute if score') || c.includes('execute store success'))).toBe(true)
|
|
250
|
+
})
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
// ===========================================================================
|
|
254
|
+
// Match on Result
|
|
255
|
+
// ===========================================================================
|
|
256
|
+
|
|
257
|
+
describe('stdlib/result.mcrs: match', () => {
|
|
258
|
+
test('match on Result::Ok arm emits tag=0 check', () => {
|
|
259
|
+
const source = resultSrc + `
|
|
260
|
+
@keep fn t(r: Result): int {
|
|
261
|
+
match r {
|
|
262
|
+
Result::Ok(value) => { return value; }
|
|
263
|
+
Result::Err(code) => { return code; }
|
|
264
|
+
}
|
|
265
|
+
return -1;
|
|
266
|
+
}
|
|
267
|
+
`
|
|
268
|
+
const result = compile(source, { namespace: 'test' })
|
|
269
|
+
expect(result.success).toBe(true)
|
|
270
|
+
const cmds = (result.files ?? [])
|
|
271
|
+
.filter(f => f.path.endsWith('.mcfunction'))
|
|
272
|
+
.flatMap(f => f.content.split('\n'))
|
|
273
|
+
.filter(l => l.trim())
|
|
274
|
+
const allCmds = cmds.join('\n')
|
|
275
|
+
expect(allCmds).toContain('execute if score')
|
|
276
|
+
expect(allCmds).toContain('storage rs:enums')
|
|
277
|
+
})
|
|
278
|
+
|
|
279
|
+
test('match on Result extracts Ok value binding', () => {
|
|
280
|
+
const source = resultSrc + `
|
|
281
|
+
@keep fn t(r: Result): int {
|
|
282
|
+
match r {
|
|
283
|
+
Result::Ok(value) => { return value; }
|
|
284
|
+
Result::Err(code) => { return 0; }
|
|
285
|
+
}
|
|
286
|
+
return -1;
|
|
287
|
+
}
|
|
288
|
+
`
|
|
289
|
+
const cmds = getCommands(source)
|
|
290
|
+
const allCmds = cmds.join('\n')
|
|
291
|
+
expect(allCmds).toContain('Result_value')
|
|
292
|
+
})
|
|
293
|
+
|
|
294
|
+
test('match on Result extracts Err code binding', () => {
|
|
295
|
+
const source = resultSrc + `
|
|
296
|
+
@keep fn t(r: Result): int {
|
|
297
|
+
match r {
|
|
298
|
+
Result::Ok(value) => { return 0; }
|
|
299
|
+
Result::Err(code) => { return code; }
|
|
300
|
+
}
|
|
301
|
+
return -1;
|
|
302
|
+
}
|
|
303
|
+
`
|
|
304
|
+
const cmds = getCommands(source)
|
|
305
|
+
const allCmds = cmds.join('\n')
|
|
306
|
+
expect(allCmds).toContain('Result_code')
|
|
307
|
+
})
|
|
308
|
+
|
|
309
|
+
test('full divide-and-use pattern compiles end-to-end', () => {
|
|
310
|
+
const source = resultSrc + `
|
|
311
|
+
@keep fn use_divide() {
|
|
312
|
+
let r: Result = result_divide(10, 2);
|
|
313
|
+
match r {
|
|
314
|
+
Result::Ok(value) => {
|
|
315
|
+
let dummy: int = value;
|
|
316
|
+
}
|
|
317
|
+
Result::Err(code) => {
|
|
318
|
+
let dummy: int = code;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
`
|
|
323
|
+
const result = compile(source, { namespace: 'test' })
|
|
324
|
+
expect(result.success).toBe(true)
|
|
325
|
+
})
|
|
326
|
+
})
|
|
@@ -17,7 +17,12 @@ function compileWith(extra: string): { path: string; content: string }[] {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
function getFn(files: { path: string; content: string }[], fnName: string): string {
|
|
20
|
+
// Match exact name or specialized variants (e.g. fn__const_0_0)
|
|
20
21
|
const f = files.find(f => f.path.endsWith(`/${fnName}.mcfunction`))
|
|
22
|
+
?? files.find(f => {
|
|
23
|
+
const base = f.path.split('/').pop()!
|
|
24
|
+
return base.startsWith(`${fnName}__`)
|
|
25
|
+
})
|
|
21
26
|
if (!f) {
|
|
22
27
|
const paths = files.map(f => f.path).join('\n')
|
|
23
28
|
throw new Error(`Function '${fnName}' not found. Files:\n${paths}`)
|
|
@@ -113,22 +118,28 @@ describe('stdlib/scheduler.mcrs', () => {
|
|
|
113
118
|
// ── scheduler_tick ─────────────────────────────────────────────────────────
|
|
114
119
|
|
|
115
120
|
test('scheduler_tick is emitted', () => {
|
|
121
|
+
// scheduler_tick may be inlined (no branches → no separate file); check all content
|
|
116
122
|
const files = compileWith(`@keep fn t() { scheduler_tick(); }`)
|
|
117
|
-
|
|
123
|
+
const allContent = files.map(f => f.content).join('\n')
|
|
124
|
+
const hasFile = files.some(f => f.path.includes('scheduler_tick'))
|
|
125
|
+
const hasContent = allContent.includes('rs.t0') || allContent.includes('rs.g0')
|
|
126
|
+
expect(hasFile || hasContent).toBe(true)
|
|
118
127
|
})
|
|
119
128
|
|
|
120
129
|
test('scheduler_tick decrements per-player slots', () => {
|
|
121
130
|
const files = compileWith(`@keep fn t() { scheduler_tick(); }`)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
expect(
|
|
131
|
+
// May be inlined — check all generated file content
|
|
132
|
+
const allContent = files.map(f => f.content).join('\n')
|
|
133
|
+
expect(allContent).toContain('rs.t0')
|
|
134
|
+
expect(allContent).toContain('scoreboard')
|
|
125
135
|
})
|
|
126
136
|
|
|
127
137
|
test('scheduler_tick decrements global slots', () => {
|
|
128
138
|
const files = compileWith(`@keep fn t() { scheduler_tick(); }`)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
expect(
|
|
139
|
+
// May be inlined — check all generated file content
|
|
140
|
+
const allContent = files.map(f => f.content).join('\n')
|
|
141
|
+
expect(allContent).toContain('rs.g0')
|
|
142
|
+
expect(allContent).toContain('#rs')
|
|
132
143
|
})
|
|
133
144
|
|
|
134
145
|
// ── Combined usage ─────────────────────────────────────────────────────────
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { compile } from '../../emit/compile'
|
|
2
|
+
import * as fs from 'fs'
|
|
3
|
+
import * as path from 'path'
|
|
4
|
+
|
|
5
|
+
const SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/set_int.mcrs'), 'utf-8')
|
|
6
|
+
|
|
7
|
+
function compileWith(extra: string) {
|
|
8
|
+
return compile(SRC + '\n' + extra, { namespace: 'test' })
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
describe('stdlib/set_int.mcrs', () => {
|
|
12
|
+
test('compiles without errors', () => {
|
|
13
|
+
const r = compileWith('')
|
|
14
|
+
expect(r.files.length).toBeGreaterThan(0)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
test('set_add loads named storage, deduplicates, and stores back', () => {
|
|
18
|
+
const r = compileWith(`@keep fn t() { set_add("Visited", 42); }`)
|
|
19
|
+
const all = r.files.map(f => f.content).join('\n')
|
|
20
|
+
expect(all).toContain('data modify storage rs:macro_args set_name set from storage rs:strings __sp0')
|
|
21
|
+
expect(all).toContain('function test:__set_int_load_items_apply with storage rs:macro_args')
|
|
22
|
+
expect(all).toContain('$data modify storage test:arrays items set from storage rs:set_int $(set_name)')
|
|
23
|
+
expect(all).toContain('function test:__set_int_store_items_apply with storage rs:macro_args')
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('set_has emits array scan helper usage', () => {
|
|
27
|
+
const r = compileWith(`@keep fn t(): int { return set_has("Visited", 42); }`)
|
|
28
|
+
const all = r.files.map(f => f.content).join('\n')
|
|
29
|
+
expect(all).toContain('function test:__set_int_load_items_apply with storage rs:macro_args')
|
|
30
|
+
expect(all).toContain('function test:_set_int_array_has')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
test('set_remove filters elements and writes rebuilt set', () => {
|
|
34
|
+
const r = compileWith(`@keep fn t() { set_remove("Visited", 42); }`)
|
|
35
|
+
const all = r.files.map(f => f.content).join('\n')
|
|
36
|
+
expect(all).toContain('function test:__set_int_store_kept_apply with storage rs:macro_args')
|
|
37
|
+
expect(all).toContain('$data modify storage rs:set_int $(set_name) set from storage test:arrays kept')
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
test('set_size initializes zero default and reads list length from storage', () => {
|
|
41
|
+
const r = compileWith(`@keep fn t(): int { return set_size("Visited"); }`)
|
|
42
|
+
expect(r.files.length).toBeGreaterThan(0)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test('set_clear resets named set to an empty list', () => {
|
|
46
|
+
const r = compileWith(`@keep fn t() { set_clear("Visited"); }`)
|
|
47
|
+
expect(r.files.length).toBeGreaterThan(0)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
test('set_union merges both sets into the result storage', () => {
|
|
51
|
+
const r = compileWith(`@keep fn t() { set_union("A", "B", "Out"); }`)
|
|
52
|
+
const all = r.files.map(f => f.content).join('\n')
|
|
53
|
+
expect(all).toContain('$data modify storage rs:set_int $(result) set from storage test:arrays merged')
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test('set_intersect scans both sources and writes the shared result', () => {
|
|
57
|
+
const r = compileWith(`@keep fn t() { set_intersect("A", "B", "Both"); }`)
|
|
58
|
+
const all = r.files.map(f => f.content).join('\n')
|
|
59
|
+
expect(all).toContain('$data modify storage rs:set_int $(result) set from storage test:arrays shared')
|
|
60
|
+
expect(all).toContain('function test:_set_int_array_has')
|
|
61
|
+
})
|
|
62
|
+
})
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for stdlib/sets.mcrs — runtime set documentation (builtins).
|
|
3
|
+
* The actual set_new/set_add/set_contains are compiler builtins; sets.mcrs
|
|
4
|
+
* only contains documentation comments.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { compile } from '../../emit/compile'
|
|
8
|
+
import * as fs from 'fs'
|
|
9
|
+
import * as path from 'path'
|
|
10
|
+
|
|
11
|
+
const SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/sets.mcrs'), 'utf-8')
|
|
12
|
+
|
|
13
|
+
describe('stdlib/sets.mcrs', () => {
|
|
14
|
+
test('file loads without parse errors', () => {
|
|
15
|
+
// sets.mcrs is documentation-only; just ensure it doesn't throw on compile
|
|
16
|
+
expect(() => {
|
|
17
|
+
compile(SRC + '\nfn _noop(): int { return 0; }', { namespace: 'test' })
|
|
18
|
+
}).not.toThrow()
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
test('set builtin functions compile when called', () => {
|
|
22
|
+
// set_new, set_add, set_contains, set_remove, set_clear are compiler builtins
|
|
23
|
+
const r = compile(`
|
|
24
|
+
fn _noop(): int { return 0; }
|
|
25
|
+
`, { namespace: 'test' })
|
|
26
|
+
expect(r.files.length).toBeGreaterThan(0)
|
|
27
|
+
})
|
|
28
|
+
})
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for stdlib/signal.mcrs — statistical distributions and probability.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { compile } from '../../emit/compile'
|
|
6
|
+
import * as fs from 'fs'
|
|
7
|
+
import * as path from 'path'
|
|
8
|
+
|
|
9
|
+
const SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/signal.mcrs'), 'utf-8')
|
|
10
|
+
|
|
11
|
+
function compileWith(extra: string) {
|
|
12
|
+
return compile(SRC + '\n' + extra, { namespace: 'test' })
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
describe('stdlib/signal.mcrs', () => {
|
|
16
|
+
test('compiles without errors', () => {
|
|
17
|
+
const r = compileWith('')
|
|
18
|
+
expect(r.files.length).toBeGreaterThan(0)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
test('uniform_int is emitted', () => {
|
|
22
|
+
const r = compileWith(`@keep fn t(): int { return uniform_int(42, 0, 100); }`)
|
|
23
|
+
expect(r.files.some(f => f.path.includes('uniform_int'))).toBe(true)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('uniform_frac is emitted', () => {
|
|
27
|
+
const r = compileWith(`@keep fn t(): int { return uniform_frac(999); }`)
|
|
28
|
+
expect(r.files.some(f => f.path.includes('uniform_frac'))).toBe(true)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
test('bernoulli is emitted', () => {
|
|
32
|
+
const r = compileWith(`@keep fn t(): int { return bernoulli(77, 5000); }`)
|
|
33
|
+
expect(r.files.some(f => f.path.includes('bernoulli'))).toBe(true)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('weighted2 is emitted', () => {
|
|
37
|
+
const r = compileWith(`@keep fn t(): int { return weighted2(55, 3, 7); }`)
|
|
38
|
+
expect(r.files.some(f => f.path.includes('weighted2'))).toBe(true)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('weighted3 is emitted', () => {
|
|
42
|
+
const r = compileWith(`@keep fn t(): int { return weighted3(55, 2, 5, 3); }`)
|
|
43
|
+
expect(r.files.some(f => f.path.includes('weighted3'))).toBe(true)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
test('poisson_sample is emitted', () => {
|
|
47
|
+
const r = compileWith(`@keep fn t(): int { return poisson_sample(30000, 123); }`)
|
|
48
|
+
expect(r.files.some(f => f.path.includes('poisson_sample'))).toBe(true)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('geometric_sample is emitted', () => {
|
|
52
|
+
const r = compileWith(`@keep fn t(): int { return geometric_sample(3000, 456); }`)
|
|
53
|
+
expect(r.files.some(f => f.path.includes('geometric_sample'))).toBe(true)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test('dft_magnitude is emitted', () => {
|
|
57
|
+
const r = compileWith(`@keep fn t(): int { return dft_magnitude(10000, 0, -10000, 0, 0, 0, 0, 0, 4, 0); }`)
|
|
58
|
+
expect(r.files.some(f => f.path.includes('dft_magnitude'))).toBe(true)
|
|
59
|
+
})
|
|
60
|
+
})
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for stdlib/spawn.mcrs — spawn / teleportation utilities.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { compile } from '../../emit/compile'
|
|
6
|
+
import * as fs from 'fs'
|
|
7
|
+
import * as path from 'path'
|
|
8
|
+
|
|
9
|
+
const SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/spawn.mcrs'), 'utf-8')
|
|
10
|
+
|
|
11
|
+
function compileWith(extra: string) {
|
|
12
|
+
return compile(SRC + '\n' + extra, { namespace: 'test' })
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
describe('stdlib/spawn.mcrs', () => {
|
|
16
|
+
test('compiles without errors', () => {
|
|
17
|
+
const r = compileWith('')
|
|
18
|
+
expect(r.files.length).toBeGreaterThan(0)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
test('teleport_to is emitted', () => {
|
|
22
|
+
const r = compileWith(`@keep fn t() { teleport_to(@s, 0, 64, 0); }`)
|
|
23
|
+
expect(r.files.some(f => f.path.includes('teleport_to'))).toBe(true)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('spread_players is emitted', () => {
|
|
27
|
+
const r = compileWith(`@keep fn t() { spread_players(0, 0, 50); }`)
|
|
28
|
+
expect(r.files.some(f => f.path.includes('spread_players'))).toBe(true)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
test('gather_all is emitted', () => {
|
|
32
|
+
const r = compileWith(`@keep fn t() { gather_all(0, 64, 0); }`)
|
|
33
|
+
expect(r.files.some(f => f.path.includes('gather_all'))).toBe(true)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('launch_up is emitted', () => {
|
|
37
|
+
const r = compileWith(`@keep fn t() { launch_up(@s, 10); }`)
|
|
38
|
+
expect(r.files.some(f => f.path.includes('launch_up'))).toBe(true)
|
|
39
|
+
})
|
|
40
|
+
})
|