redscript-mc 2.5.0 → 2.6.2
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/CHANGELOG.md +80 -0
- package/README.md +5 -75
- package/README.zh.md +165 -147
- package/ROADMAP.md +195 -0
- package/dist/data/linalg/function/_vec2d_len_sq_fx.mcfunction +17 -0
- package/dist/data/linalg/function/_vec3d_len_sq_fx.mcfunction +27 -0
- package/dist/data/linalg/function/load.mcfunction +1 -0
- package/dist/data/linalg/function/mat2d_det.mcfunction +16 -0
- package/dist/data/linalg/function/mat2d_mul_r0c0.mcfunction +16 -0
- package/dist/data/linalg/function/mat2d_mul_r0c1.mcfunction +16 -0
- package/dist/data/linalg/function/mat2d_mul_r1c0.mcfunction +16 -0
- package/dist/data/linalg/function/mat2d_mul_r1c1.mcfunction +16 -0
- package/dist/data/linalg/function/mat2d_vecmul_x.mcfunction +16 -0
- package/dist/data/linalg/function/mat2d_vecmul_y.mcfunction +16 -0
- package/dist/data/linalg/function/solve2d_x.mcfunction +27 -0
- package/dist/data/linalg/function/solve2d_y.mcfunction +27 -0
- package/dist/data/linalg/function/vec2d_dist.mcfunction +15 -0
- package/dist/data/linalg/function/vec2d_dot.mcfunction +16 -0
- package/dist/data/linalg/function/vec2d_length.mcfunction +21 -0
- package/dist/data/linalg/function/vec2d_normalize_x.mcfunction +8 -0
- package/dist/data/linalg/function/vec2d_normalize_x__merge_1.mcfunction +10 -0
- package/dist/data/linalg/function/vec2d_normalize_x__then_0.mcfunction +3 -0
- package/dist/data/linalg/function/vec2d_normalize_y.mcfunction +8 -0
- package/dist/data/linalg/function/vec2d_normalize_y__merge_1.mcfunction +10 -0
- package/dist/data/linalg/function/vec2d_normalize_y__then_0.mcfunction +3 -0
- package/dist/data/linalg/function/vec3d_cross_x.mcfunction +16 -0
- package/dist/data/linalg/function/vec3d_cross_y.mcfunction +16 -0
- package/dist/data/linalg/function/vec3d_cross_z.mcfunction +16 -0
- package/dist/data/linalg/function/vec3d_dist.mcfunction +21 -0
- package/dist/data/linalg/function/vec3d_dot.mcfunction +26 -0
- package/dist/data/linalg/function/vec3d_length.mcfunction +31 -0
- package/dist/data/linalg/function/vec3d_normalize_x.mcfunction +9 -0
- package/dist/data/linalg/function/vec3d_normalize_x__merge_1.mcfunction +11 -0
- package/dist/data/linalg/function/vec3d_normalize_x__then_0.mcfunction +3 -0
- package/dist/data/linalg/function/vec3d_normalize_y.mcfunction +9 -0
- package/dist/data/linalg/function/vec3d_normalize_y__merge_1.mcfunction +11 -0
- package/dist/data/linalg/function/vec3d_normalize_y__then_0.mcfunction +3 -0
- package/dist/data/linalg/function/vec3d_normalize_z.mcfunction +9 -0
- package/dist/data/linalg/function/vec3d_normalize_z__merge_1.mcfunction +11 -0
- package/dist/data/linalg/function/vec3d_normalize_z__then_0.mcfunction +3 -0
- package/dist/data/math_hp/function/cos_hp.mcfunction +8 -0
- package/dist/data/math_hp/function/div3_hp.mcfunction +23 -0
- package/dist/data/math_hp/function/div_hp.mcfunction +13 -0
- package/dist/data/math_hp/function/init_div.mcfunction +1 -0
- package/dist/data/math_hp/function/init_trig.mcfunction +1 -0
- package/dist/data/math_hp/function/ln_5term.mcfunction +6 -0
- package/dist/data/math_hp/function/ln_5term__loop_body_1.mcfunction +8 -0
- package/dist/data/math_hp/function/ln_5term__loop_body_4.mcfunction +8 -0
- package/dist/data/math_hp/function/ln_5term__loop_exit_2.mcfunction +1 -0
- package/dist/data/math_hp/function/ln_5term__loop_exit_5.mcfunction +61 -0
- package/dist/data/math_hp/function/ln_5term__loop_header_0.mcfunction +3 -0
- package/dist/data/math_hp/function/ln_5term__loop_header_3.mcfunction +6 -0
- package/dist/data/math_hp/function/load.mcfunction +1 -0
- package/dist/data/math_hp/function/norm3_hp.mcfunction +43 -0
- package/dist/data/math_hp/function/sin_hp.mcfunction +8 -0
- package/dist/data/math_hp/function/sqrt_hp.mcfunction +17 -0
- package/dist/data/math_hp/function/sqrt_hp__merge_1.mcfunction +21 -0
- package/dist/data/math_hp/function/sqrt_hp__then_0.mcfunction +2 -0
- package/dist/data/minecraft/tags/function/load.json +1 -2
- package/dist/data/minecraft/tags/function/tick.json +1 -1
- package/dist/data/readme_demo/function/_draw.mcfunction +1 -0
- package/dist/data/readme_demo/function/_init.mcfunction +1 -0
- package/dist/data/readme_demo/function/_math_init.mcfunction +4 -0
- package/dist/data/readme_demo/function/_wave_tick.mcfunction +1 -0
- package/dist/data/readme_demo/function/_wave_tick__foreach_t8.mcfunction +109 -0
- package/dist/data/readme_demo/function/acos_approx.mcfunction +7 -0
- package/dist/data/readme_demo/function/approx_eq.mcfunction +10 -0
- package/dist/data/readme_demo/function/approx_eq__merge_1.mcfunction +3 -0
- package/dist/data/readme_demo/function/approx_eq__merge_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/approx_eq__then_0.mcfunction +4 -0
- package/dist/data/readme_demo/function/approx_eq__then_2.mcfunction +2 -0
- package/dist/data/readme_demo/function/asin_approx.mcfunction +5 -0
- package/dist/data/readme_demo/function/asin_approx__merge_1.mcfunction +3 -0
- package/dist/data/readme_demo/function/asin_approx__merge_10.mcfunction +5 -0
- package/dist/data/readme_demo/function/asin_approx__merge_4.mcfunction +12 -0
- package/dist/data/readme_demo/function/asin_approx__merge_7.mcfunction +14 -0
- package/dist/data/readme_demo/function/asin_approx__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/asin_approx__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/asin_approx__then_6.mcfunction +2 -0
- package/dist/data/readme_demo/function/asin_approx__then_9.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_fx.mcfunction +5 -0
- package/dist/data/readme_demo/function/cbrt_fx__loop_body_6.mcfunction +7 -0
- package/dist/data/readme_demo/function/cbrt_fx__loop_exit_7.mcfunction +1 -0
- package/dist/data/readme_demo/function/cbrt_fx__loop_header_5.mcfunction +4 -0
- package/dist/data/readme_demo/function/cbrt_fx__merge_1.mcfunction +8 -0
- package/dist/data/readme_demo/function/cbrt_fx__merge_11.mcfunction +5 -0
- package/dist/data/readme_demo/function/cbrt_fx__merge_13.mcfunction +4 -0
- package/dist/data/readme_demo/function/cbrt_fx__merge_4.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_fx__merge_9.mcfunction +13 -0
- package/dist/data/readme_demo/function/cbrt_fx__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_fx__then_10.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_fx__then_12.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_fx__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_fx__then_8.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_newton.mcfunction +5 -0
- package/dist/data/readme_demo/function/cbrt_newton__else_7.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_newton__merge_1.mcfunction +11 -0
- package/dist/data/readme_demo/function/cbrt_newton__merge_4.mcfunction +1 -0
- package/dist/data/readme_demo/function/cbrt_newton__merge_6.mcfunction +1 -0
- package/dist/data/readme_demo/function/cbrt_newton__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/cbrt_newton__then_3.mcfunction +17 -0
- package/dist/data/readme_demo/function/cbrt_newton__then_5.mcfunction +11 -0
- package/dist/data/readme_demo/function/ceil_div.mcfunction +9 -0
- package/dist/data/readme_demo/function/combinations.mcfunction +6 -0
- package/dist/data/readme_demo/function/combinations__loop_body_9.mcfunction +15 -0
- package/dist/data/readme_demo/function/combinations__loop_exit_10.mcfunction +1 -0
- package/dist/data/readme_demo/function/combinations__loop_header_8.mcfunction +3 -0
- package/dist/data/readme_demo/function/combinations__merge_1.mcfunction +3 -0
- package/dist/data/readme_demo/function/combinations__merge_4.mcfunction +6 -0
- package/dist/data/readme_demo/function/combinations__merge_7.mcfunction +3 -0
- package/dist/data/readme_demo/function/combinations__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/combinations__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/combinations__then_6.mcfunction +4 -0
- package/dist/data/readme_demo/function/cos_fixed.mcfunction +7 -0
- package/dist/data/readme_demo/function/cubic_disc_fx.mcfunction +26 -0
- package/dist/data/readme_demo/function/cubic_newton.mcfunction +8 -0
- package/dist/data/readme_demo/function/cubic_newton__loop_body_1.mcfunction +55 -0
- package/dist/data/readme_demo/function/cubic_newton__loop_exit_2.mcfunction +1 -0
- package/dist/data/readme_demo/function/cubic_newton__loop_header_0.mcfunction +4 -0
- package/dist/data/readme_demo/function/cubic_newton__merge_10.mcfunction +1 -0
- package/dist/data/readme_demo/function/cubic_newton__merge_4.mcfunction +4 -0
- package/dist/data/readme_demo/function/cubic_newton__merge_6.mcfunction +4 -0
- package/dist/data/readme_demo/function/cubic_newton__merge_8.mcfunction +4 -0
- package/dist/data/readme_demo/function/cubic_newton__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/cubic_newton__then_5.mcfunction +13 -0
- package/dist/data/readme_demo/function/cubic_newton__then_7.mcfunction +4 -0
- package/dist/data/readme_demo/function/cubic_newton__then_9.mcfunction +2 -0
- package/dist/data/readme_demo/function/divfix.mcfunction +6 -0
- package/dist/data/readme_demo/function/divfix__merge_1.mcfunction +6 -0
- package/dist/data/readme_demo/function/divfix__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/exp_fx.mcfunction +16 -0
- package/dist/data/readme_demo/function/exp_fx__loop_body_10.mcfunction +8 -0
- package/dist/data/readme_demo/function/exp_fx__loop_body_5.mcfunction +8 -0
- package/dist/data/readme_demo/function/exp_fx__loop_exit_11.mcfunction +1 -0
- package/dist/data/readme_demo/function/exp_fx__loop_exit_6.mcfunction +1 -0
- package/dist/data/readme_demo/function/exp_fx__loop_header_4.mcfunction +3 -0
- package/dist/data/readme_demo/function/exp_fx__loop_header_9.mcfunction +3 -0
- package/dist/data/readme_demo/function/exp_fx__merge_1.mcfunction +47 -0
- package/dist/data/readme_demo/function/exp_fx__merge_3.mcfunction +4 -0
- package/dist/data/readme_demo/function/exp_fx__merge_8.mcfunction +1 -0
- package/dist/data/readme_demo/function/exp_fx__then_0.mcfunction +7 -0
- package/dist/data/readme_demo/function/exp_fx__then_2.mcfunction +2 -0
- package/dist/data/readme_demo/function/exp_fx__then_7.mcfunction +5 -0
- package/dist/data/readme_demo/function/factorial.mcfunction +5 -0
- package/dist/data/readme_demo/function/factorial__loop_body_4.mcfunction +7 -0
- package/dist/data/readme_demo/function/factorial__loop_exit_5.mcfunction +1 -0
- package/dist/data/readme_demo/function/factorial__loop_header_3.mcfunction +3 -0
- package/dist/data/readme_demo/function/factorial__merge_1.mcfunction +3 -0
- package/dist/data/readme_demo/function/factorial__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/gamma_int.mcfunction +5 -0
- package/dist/data/readme_demo/function/gamma_int__merge_1.mcfunction +6 -0
- package/dist/data/readme_demo/function/gamma_int__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/gcd.mcfunction +7 -0
- package/dist/data/readme_demo/function/gcd__loop_body_5.mcfunction +5 -0
- package/dist/data/readme_demo/function/gcd__loop_exit_6.mcfunction +1 -0
- package/dist/data/readme_demo/function/gcd__loop_header_4.mcfunction +4 -0
- package/dist/data/readme_demo/function/gcd__merge_1.mcfunction +5 -0
- package/dist/data/readme_demo/function/gcd__merge_3.mcfunction +1 -0
- package/dist/data/readme_demo/function/gcd__then_0.mcfunction +4 -0
- package/dist/data/readme_demo/function/gcd__then_2.mcfunction +4 -0
- package/dist/data/readme_demo/function/isqrt.mcfunction +5 -0
- package/dist/data/readme_demo/function/isqrt__loop_body_10.mcfunction +8 -0
- package/dist/data/readme_demo/function/isqrt__loop_body_13.mcfunction +11 -0
- package/dist/data/readme_demo/function/isqrt__loop_body_7.mcfunction +8 -0
- package/dist/data/readme_demo/function/isqrt__loop_exit_11.mcfunction +2 -0
- package/dist/data/readme_demo/function/isqrt__loop_exit_14.mcfunction +1 -0
- package/dist/data/readme_demo/function/isqrt__loop_exit_8.mcfunction +9 -0
- package/dist/data/readme_demo/function/isqrt__loop_header_12.mcfunction +4 -0
- package/dist/data/readme_demo/function/isqrt__loop_header_6.mcfunction +4 -0
- package/dist/data/readme_demo/function/isqrt__loop_header_9.mcfunction +3 -0
- package/dist/data/readme_demo/function/isqrt__merge_1.mcfunction +4 -0
- package/dist/data/readme_demo/function/isqrt__merge_16.mcfunction +5 -0
- package/dist/data/readme_demo/function/isqrt__merge_4.mcfunction +3 -0
- package/dist/data/readme_demo/function/isqrt__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/isqrt__then_15.mcfunction +1 -0
- package/dist/data/readme_demo/function/isqrt__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/lcm.mcfunction +11 -0
- package/dist/data/readme_demo/function/lcm__merge_1.mcfunction +5 -0
- package/dist/data/readme_demo/function/lcm__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/lerp.mcfunction +13 -0
- package/dist/data/readme_demo/function/ln.mcfunction +9 -0
- package/dist/data/readme_demo/function/ln__loop_body_1.mcfunction +8 -0
- package/dist/data/readme_demo/function/ln__loop_body_4.mcfunction +8 -0
- package/dist/data/readme_demo/function/ln__loop_exit_2.mcfunction +1 -0
- package/dist/data/readme_demo/function/ln__loop_exit_5.mcfunction +37 -0
- package/dist/data/readme_demo/function/ln__loop_header_0.mcfunction +3 -0
- package/dist/data/readme_demo/function/ln__loop_header_3.mcfunction +6 -0
- package/dist/data/readme_demo/function/load.mcfunction +1 -0
- package/dist/data/readme_demo/function/log10_fx.mcfunction +11 -0
- package/dist/data/readme_demo/function/log2_fx.mcfunction +11 -0
- package/dist/data/readme_demo/function/log2_int.mcfunction +5 -0
- package/dist/data/readme_demo/function/log2_int__loop_body_4.mcfunction +8 -0
- package/dist/data/readme_demo/function/log2_int__loop_exit_5.mcfunction +1 -0
- package/dist/data/readme_demo/function/log2_int__loop_header_3.mcfunction +4 -0
- package/dist/data/readme_demo/function/log2_int__merge_1.mcfunction +3 -0
- package/dist/data/readme_demo/function/log2_int__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/loga_fx.mcfunction +10 -0
- package/dist/data/readme_demo/function/loga_fx__merge_1.mcfunction +9 -0
- package/dist/data/readme_demo/function/loga_fx__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/map.mcfunction +12 -0
- package/dist/data/readme_demo/function/map__merge_1.mcfunction +11 -0
- package/dist/data/readme_demo/function/map__then_0.mcfunction +1 -0
- package/dist/data/readme_demo/function/mulfix.mcfunction +8 -0
- package/dist/data/readme_demo/function/newton_step.mcfunction +7 -0
- package/dist/data/readme_demo/function/newton_step__merge_1.mcfunction +8 -0
- package/dist/data/readme_demo/function/newton_step__then_0.mcfunction +1 -0
- package/dist/data/readme_demo/function/pow_int.mcfunction +6 -0
- package/dist/data/readme_demo/function/pow_int__loop_body_4.mcfunction +7 -0
- package/dist/data/readme_demo/function/pow_int__loop_exit_5.mcfunction +1 -0
- package/dist/data/readme_demo/function/pow_int__loop_header_3.mcfunction +4 -0
- package/dist/data/readme_demo/function/pow_int__merge_1.mcfunction +4 -0
- package/dist/data/readme_demo/function/pow_int__merge_7.mcfunction +8 -0
- package/dist/data/readme_demo/function/pow_int__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/pow_int__then_6.mcfunction +4 -0
- package/dist/data/readme_demo/function/quadratic_disc.mcfunction +12 -0
- package/dist/data/readme_demo/function/quadratic_x1.mcfunction +7 -0
- package/dist/data/readme_demo/function/quadratic_x1__merge_1.mcfunction +13 -0
- package/dist/data/readme_demo/function/quadratic_x1__merge_4.mcfunction +15 -0
- package/dist/data/readme_demo/function/quadratic_x1__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/quadratic_x1__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/quadratic_x2.mcfunction +7 -0
- package/dist/data/readme_demo/function/quadratic_x2__merge_1.mcfunction +13 -0
- package/dist/data/readme_demo/function/quadratic_x2__merge_4.mcfunction +15 -0
- package/dist/data/readme_demo/function/quadratic_x2__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/quadratic_x2__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/sign.mcfunction +5 -0
- package/dist/data/readme_demo/function/sign__merge_1.mcfunction +4 -0
- package/dist/data/readme_demo/function/sign__merge_4.mcfunction +2 -0
- package/dist/data/readme_demo/function/sign__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/sign__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/simpson_step.mcfunction +16 -0
- package/dist/data/readme_demo/function/sin_fixed.mcfunction +9 -0
- package/dist/data/readme_demo/function/sin_fixed__merge_1.mcfunction +4 -0
- package/dist/data/readme_demo/function/sin_fixed__merge_3.mcfunction +4 -0
- package/dist/data/readme_demo/function/sin_fixed__merge_6.mcfunction +4 -0
- package/dist/data/readme_demo/function/sin_fixed__merge_9.mcfunction +10 -0
- package/dist/data/readme_demo/function/sin_fixed__then_0.mcfunction +4 -0
- package/dist/data/readme_demo/function/sin_fixed__then_2.mcfunction +6 -0
- package/dist/data/readme_demo/function/sin_fixed__then_5.mcfunction +8 -0
- package/dist/data/readme_demo/function/sin_fixed__then_8.mcfunction +10 -0
- package/dist/data/readme_demo/function/smootherstep.mcfunction +10 -0
- package/dist/data/readme_demo/function/smootherstep__merge_1.mcfunction +12 -0
- package/dist/data/readme_demo/function/smootherstep__merge_4.mcfunction +4 -0
- package/dist/data/readme_demo/function/smootherstep__merge_6.mcfunction +27 -0
- package/dist/data/readme_demo/function/smootherstep__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/smootherstep__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/smootherstep__then_5.mcfunction +2 -0
- package/dist/data/readme_demo/function/smoothstep.mcfunction +10 -0
- package/dist/data/readme_demo/function/smoothstep__merge_1.mcfunction +12 -0
- package/dist/data/readme_demo/function/smoothstep__merge_4.mcfunction +4 -0
- package/dist/data/readme_demo/function/smoothstep__merge_6.mcfunction +15 -0
- package/dist/data/readme_demo/function/smoothstep__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/smoothstep__then_3.mcfunction +2 -0
- package/dist/data/readme_demo/function/smoothstep__then_5.mcfunction +2 -0
- package/dist/data/readme_demo/function/solve2x2_x.mcfunction +17 -0
- package/dist/data/readme_demo/function/solve2x2_x__merge_1.mcfunction +12 -0
- package/dist/data/readme_demo/function/solve2x2_x__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/solve2x2_y.mcfunction +17 -0
- package/dist/data/readme_demo/function/solve2x2_y__merge_1.mcfunction +12 -0
- package/dist/data/readme_demo/function/solve2x2_y__then_0.mcfunction +2 -0
- package/dist/data/readme_demo/function/sqrt_fixed.mcfunction +8 -0
- package/dist/data/readme_demo/function/sqrt_fx.mcfunction +8 -0
- package/dist/data/readme_demo/function/start.mcfunction +2 -0
- package/dist/data/readme_demo/function/stop.mcfunction +1 -0
- package/dist/data/readme_demo/function/trapezoid_step.mcfunction +11 -0
- package/dist/data/stdextra/function/__load.mcfunction +2 -0
- package/dist/data/stdextra/function/load.mcfunction +1 -0
- package/dist/data/stdextra/function/test_bigint.mcfunction +52 -0
- package/dist/data/stdextra/function/test_bits.mcfunction +33 -0
- package/dist/data/stdextra/function/test_list_sort.mcfunction +55 -0
- package/dist/data/stdextra/function/test_random.mcfunction +17 -0
- package/dist/data/stdextra/function/test_random__merge_1.mcfunction +4 -0
- package/dist/data/stdextra/function/test_random__merge_11.mcfunction +1 -0
- package/dist/data/stdextra/function/test_random__merge_3.mcfunction +14 -0
- package/dist/data/stdextra/function/test_random__merge_5.mcfunction +8 -0
- package/dist/data/stdextra/function/test_random__merge_7.mcfunction +1 -0
- package/dist/data/stdextra/function/test_random__merge_9.mcfunction +1 -0
- package/dist/data/stdextra/function/test_random__then_0.mcfunction +4 -0
- package/dist/data/stdextra/function/test_random__then_10.mcfunction +2 -0
- package/dist/data/stdextra/function/test_random__then_2.mcfunction +2 -0
- package/dist/data/stdextra/function/test_random__then_4.mcfunction +4 -0
- package/dist/data/stdextra/function/test_random__then_6.mcfunction +2 -0
- package/dist/data/stdextra/function/test_random__then_8.mcfunction +4 -0
- package/dist/data/test/function/__dyn_idx_test_arrays_nums.mcfunction +1 -0
- package/dist/data/test/function/__dyn_idx_test_arrays_parent.mcfunction +1 -0
- package/dist/data/test/function/__dyn_idx_test_arrays_queue.mcfunction +1 -0
- package/dist/data/test/function/__dyn_idx_test_arrays_rev.mcfunction +1 -0
- package/dist/data/test/function/__dyn_idx_test_arrays_visited.mcfunction +1 -0
- package/dist/data/test/function/__dyn_wrt_test_arrays_parent.mcfunction +1 -0
- package/dist/data/test/function/__dyn_wrt_test_arrays_visited.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1.mcfunction +2 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_body_1.mcfunction +17 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_body_1_continue.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_body_1_yield.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_header_0_exit.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2.mcfunction +2 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__else_8.mcfunction +19 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__loop_body_4.mcfunction +9 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__loop_header_3.mcfunction +3 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__loop_header_3_exit.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_10.mcfunction +11 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_12.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_14.mcfunction +11 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_16.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_18.mcfunction +11 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_20.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_22.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_24.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_7.mcfunction +6 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_7_continue.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_7_yield.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_11.mcfunction +15 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_13.mcfunction +13 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_15.mcfunction +15 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_17.mcfunction +13 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_19.mcfunction +15 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_21.mcfunction +13 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_23.mcfunction +15 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_6.mcfunction +2 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_9.mcfunction +13 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3.mcfunction +2 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__else_32.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__loop_body_28.mcfunction +6 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__loop_header_27.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__loop_header_27_exit.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__merge_31.mcfunction +6 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__merge_31_continue.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__merge_31_yield.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__then_30.mcfunction +2 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4.mcfunction +2 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_body_34.mcfunction +16 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_body_34_continue.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_body_34_yield.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_header_33.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_header_33_exit.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_5.mcfunction +16 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_5__merge_26.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_1.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_2.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_3.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_4.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_5.mcfunction +1 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__check_2.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__check_3.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__check_4.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__check_5.mcfunction +4 -0
- package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__done.mcfunction +1 -0
- package/dist/data/test/function/_hsl_chroma_x.mcfunction +1 -2
- package/dist/data/test/function/aabb_contains.mcfunction +1 -2
- package/dist/data/test/function/aabb_contains__merge_1.mcfunction +1 -2
- package/dist/data/test/function/aabb_contains__merge_10.mcfunction +1 -2
- package/dist/data/test/function/aabb_contains__merge_13.mcfunction +1 -2
- package/dist/data/test/function/aabb_contains__merge_4.mcfunction +1 -2
- package/dist/data/test/function/aabb_contains__merge_7.mcfunction +1 -2
- package/dist/data/test/function/acos_approx.mcfunction +7 -0
- package/dist/data/test/function/add_to_team.mcfunction +5 -0
- package/dist/data/test/function/angle_diff.mcfunction +1 -2
- package/dist/data/test/function/angle_normalize__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/angle_normalize__loop_header_3.mcfunction +1 -2
- package/dist/data/test/function/angry_at.mcfunction +1 -0
- package/dist/data/test/function/apply_damage.mcfunction +12 -0
- package/dist/data/test/function/apply_damage__else_2.mcfunction +2 -0
- package/dist/data/test/function/apply_damage__merge_1.mcfunction +1 -0
- package/dist/data/test/function/apply_damage__then_0.mcfunction +2 -0
- package/dist/data/test/function/arr_test.mcfunction +4 -0
- package/dist/data/test/function/asin_approx.mcfunction +5 -0
- package/dist/data/test/function/asin_approx__merge_1.mcfunction +3 -0
- package/dist/data/test/function/asin_approx__merge_10.mcfunction +5 -0
- package/dist/data/test/function/asin_approx__merge_4.mcfunction +12 -0
- package/dist/data/test/function/asin_approx__merge_7.mcfunction +14 -0
- package/dist/data/test/function/asin_approx__then_0.mcfunction +2 -0
- package/dist/data/test/function/asin_approx__then_3.mcfunction +2 -0
- package/dist/data/test/function/asin_approx__then_6.mcfunction +2 -0
- package/dist/data/test/function/asin_approx__then_9.mcfunction +2 -0
- package/dist/data/test/function/barrier_wall.mcfunction +1 -0
- package/dist/data/test/function/bernoulli.mcfunction +1 -2
- package/dist/data/test/function/bernoulli__merge_1.mcfunction +1 -2
- package/dist/data/test/function/bigint_chunk.mcfunction +2 -0
- package/dist/data/test/function/bigint_div_small.mcfunction +6 -0
- package/dist/data/test/function/bigint_div_small__loop_body_1.mcfunction +12 -0
- package/dist/data/test/function/bigint_div_small__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/bigint_div_small__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/bigint_mod_small.mcfunction +6 -0
- package/dist/data/test/function/bigint_mod_small__loop_body_1.mcfunction +12 -0
- package/dist/data/test/function/bigint_mod_small__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/bigint_mod_small__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/bit_and__loop_body_1.mcfunction +1 -2
- package/dist/data/test/function/bit_and__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_and__then_3.mcfunction +1 -2
- package/dist/data/test/function/bit_clear__loop_exit_2.mcfunction +1 -2
- package/dist/data/test/function/bit_clear__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_get__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_not__loop_body_1.mcfunction +1 -2
- package/dist/data/test/function/bit_not__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_or__loop_body_1.mcfunction +1 -2
- package/dist/data/test/function/bit_or__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_or__merge_4.mcfunction +1 -2
- package/dist/data/test/function/bit_or__then_5.mcfunction +1 -2
- package/dist/data/test/function/bit_set__loop_exit_2.mcfunction +1 -2
- package/dist/data/test/function/bit_set__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_shl__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_shr__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_toggle__loop_exit_2.mcfunction +1 -2
- package/dist/data/test/function/bit_toggle__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/bit_xor__loop_body_1.mcfunction +1 -2
- package/dist/data/test/function/bit_xor__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/buff_all.mcfunction +22 -0
- package/dist/data/test/function/cbrt_newton.mcfunction +5 -0
- package/dist/data/test/function/cbrt_newton__else_7.mcfunction +2 -0
- package/dist/data/test/function/cbrt_newton__merge_1.mcfunction +11 -0
- package/dist/data/test/function/cbrt_newton__merge_4.mcfunction +1 -0
- package/dist/data/test/function/cbrt_newton__merge_6.mcfunction +1 -0
- package/dist/data/test/function/cbrt_newton__then_0.mcfunction +2 -0
- package/dist/data/test/function/cbrt_newton__then_3.mcfunction +17 -0
- package/dist/data/test/function/cbrt_newton__then_5.mcfunction +11 -0
- package/dist/data/test/function/check_holding_item.mcfunction +1 -0
- package/dist/data/test/function/check_look_down.mcfunction +1 -0
- package/dist/data/test/function/check_look_down__foreach_t0.mcfunction +2 -0
- package/dist/data/test/function/check_look_straight.mcfunction +1 -0
- package/dist/data/test/function/check_look_straight__foreach_t0.mcfunction +2 -0
- package/dist/data/test/function/check_look_up.mcfunction +1 -0
- package/dist/data/test/function/check_look_up__foreach_t0.mcfunction +2 -0
- package/dist/data/test/function/cleanup_teams.mcfunction +8 -0
- package/dist/data/test/function/clear_area.mcfunction +1 -0
- package/dist/data/test/function/clear_effect.mcfunction +1 -0
- package/dist/data/test/function/clear_effects.mcfunction +1 -0
- package/dist/data/test/function/clear_inventory.mcfunction +1 -0
- package/dist/data/test/function/cooldown_ready.mcfunction +7 -0
- package/dist/data/test/function/cooldown_ready__merge_1.mcfunction +4 -0
- package/dist/data/test/function/cooldown_ready__merge_4.mcfunction +2 -0
- package/dist/data/test/function/cooldown_ready__then_0.mcfunction +2 -0
- package/dist/data/test/function/cooldown_ready__then_3.mcfunction +2 -0
- package/dist/data/test/function/cooldown_start.mcfunction +3 -0
- package/dist/data/test/function/cooldown_tick.mcfunction +7 -0
- package/dist/data/test/function/cooldown_tick__else_5.mcfunction +2 -0
- package/dist/data/test/function/cooldown_tick__merge_1.mcfunction +4 -0
- package/dist/data/test/function/cooldown_tick__merge_4.mcfunction +1 -0
- package/dist/data/test/function/cooldown_tick__merge_7.mcfunction +1 -0
- package/dist/data/test/function/cooldown_tick__then_0.mcfunction +1 -0
- package/dist/data/test/function/cooldown_tick__then_3.mcfunction +7 -0
- package/dist/data/test/function/cooldown_tick__then_6.mcfunction +2 -0
- package/dist/data/test/function/cos_hp.mcfunction +4 -2
- package/dist/data/test/function/create_blue_team.mcfunction +10 -0
- package/dist/data/test/function/create_green_team.mcfunction +10 -0
- package/dist/data/test/function/create_health_bar.mcfunction +24 -0
- package/dist/data/test/function/create_progress_bar.mcfunction +24 -0
- package/dist/data/test/function/create_red_team.mcfunction +10 -0
- package/dist/data/test/function/create_team.mcfunction +8 -0
- package/dist/data/test/function/create_timer_bar.mcfunction +30 -0
- package/dist/data/test/function/create_yellow_team.mcfunction +10 -0
- package/dist/data/test/function/cubic_disc_fx.mcfunction +26 -0
- package/dist/data/test/function/cubic_newton.mcfunction +8 -0
- package/dist/data/test/function/cubic_newton__loop_body_1.mcfunction +55 -0
- package/dist/data/test/function/cubic_newton__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/cubic_newton__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/cubic_newton__merge_10.mcfunction +1 -0
- package/dist/data/test/function/cubic_newton__merge_4.mcfunction +4 -0
- package/dist/data/test/function/cubic_newton__merge_6.mcfunction +4 -0
- package/dist/data/test/function/cubic_newton__merge_8.mcfunction +4 -0
- package/dist/data/test/function/cubic_newton__then_3.mcfunction +2 -0
- package/dist/data/test/function/cubic_newton__then_5.mcfunction +13 -0
- package/dist/data/test/function/cubic_newton__then_7.mcfunction +4 -0
- package/dist/data/test/function/cubic_newton__then_9.mcfunction +2 -0
- package/dist/data/test/function/curve_length_2d.mcfunction +6 -0
- package/dist/data/test/function/curve_length_2d__loop_body_1.mcfunction +32 -0
- package/dist/data/test/function/curve_length_2d__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/curve_length_2d__loop_header_0.mcfunction +5 -0
- package/dist/data/test/function/cylinder_contains.mcfunction +1 -2
- package/dist/data/test/function/damage.mcfunction +9 -0
- package/dist/data/test/function/damage__else_2.mcfunction +2 -0
- package/dist/data/test/function/damage__merge_1.mcfunction +1 -0
- package/dist/data/test/function/damage__then_0.mcfunction +2 -0
- package/dist/data/test/function/deriv_central.mcfunction +7 -0
- package/dist/data/test/function/deriv_central__merge_1.mcfunction +10 -0
- package/dist/data/test/function/deriv_central__then_0.mcfunction +2 -0
- package/dist/data/test/function/deriv_forward.mcfunction +7 -0
- package/dist/data/test/function/deriv_forward__merge_1.mcfunction +8 -0
- package/dist/data/test/function/deriv_forward__then_0.mcfunction +2 -0
- package/dist/data/test/function/disable_fire_spread.mcfunction +1 -0
- package/dist/data/test/function/disable_keep_inventory.mcfunction +1 -0
- package/dist/data/test/function/disable_mob_griefing.mcfunction +1 -0
- package/dist/data/test/function/div3_hp.mcfunction +23 -0
- package/dist/data/test/function/div_hp.mcfunction +13 -0
- package/dist/data/test/function/draw_circle.mcfunction +8 -0
- package/dist/data/test/function/draw_circle__loop_body_1.mcfunction +34 -0
- package/dist/data/test/function/draw_circle__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/draw_circle__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/draw_helix.mcfunction +10 -0
- package/dist/data/test/function/draw_helix__loop_body_1.mcfunction +42 -0
- package/dist/data/test/function/draw_helix__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/draw_helix__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/draw_line_2d.mcfunction +9 -0
- package/dist/data/test/function/draw_line_2d__loop_body_1.mcfunction +34 -0
- package/dist/data/test/function/draw_line_2d__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/draw_line_2d__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/ease_in_expo.mcfunction +1 -2
- package/dist/data/test/function/ease_in_out_back.mcfunction +1 -2
- package/dist/data/test/function/ease_in_out_bounce.mcfunction +1 -2
- package/dist/data/test/function/ease_in_out_cubic.mcfunction +1 -2
- package/dist/data/test/function/ease_in_out_quad.mcfunction +1 -2
- package/dist/data/test/function/ease_in_out_sine.mcfunction +1 -2
- package/dist/data/test/function/ease_out_bounce.mcfunction +1 -2
- package/dist/data/test/function/ease_out_bounce__merge_1.mcfunction +1 -2
- package/dist/data/test/function/ease_out_bounce__merge_4.mcfunction +1 -2
- package/dist/data/test/function/ease_out_expo.mcfunction +1 -2
- package/dist/data/test/function/enable_keep_inventory.mcfunction +1 -0
- package/dist/data/test/function/end_sparkles_at.mcfunction +1 -0
- package/dist/data/test/function/enemy_health.mcfunction +2 -0
- package/dist/data/test/function/example_right_click.mcfunction +1 -0
- package/dist/data/test/function/example_right_click__foreach_t0.mcfunction +5 -0
- package/dist/data/test/function/example_right_click__foreach_t0__merge_1.mcfunction +1 -0
- package/dist/data/test/function/example_right_click__foreach_t0__then_0.mcfunction +3 -0
- package/dist/data/test/function/exp_dist_approx.mcfunction +1 -2
- package/dist/data/test/function/exp_dist_approx__merge_1.mcfunction +1 -2
- package/dist/data/test/function/exp_dist_approx__merge_3.mcfunction +1 -2
- package/dist/data/test/function/explosion_effect.mcfunction +1 -0
- package/dist/data/test/function/fbm_1d__loop_exit_2.mcfunction +1 -2
- package/dist/data/test/function/fbm_1d__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/fbm_2d__loop_exit_2.mcfunction +1 -2
- package/dist/data/test/function/fbm_2d__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/flames.mcfunction +1 -0
- package/dist/data/test/function/gather_all.mcfunction +8 -0
- package/dist/data/test/function/give_kit_archer.mcfunction +6 -0
- package/dist/data/test/function/give_kit_mage.mcfunction +5 -0
- package/dist/data/test/function/give_kit_warrior.mcfunction +6 -0
- package/dist/data/test/function/glass_box.mcfunction +2 -0
- package/dist/data/test/function/glow.mcfunction +1 -0
- package/dist/data/test/function/goto_arena.mcfunction +7 -0
- package/dist/data/test/function/goto_lobby.mcfunction +7 -0
- package/dist/data/test/function/happy_at.mcfunction +1 -0
- package/dist/data/test/function/hash_1d_pos.mcfunction +1 -2
- package/dist/data/test/function/hash_2d_pos.mcfunction +1 -2
- package/dist/data/test/function/heal.mcfunction +5 -0
- package/dist/data/test/function/heap_new.mcfunction +7 -0
- package/dist/data/test/function/heap_new__loop_body_1.mcfunction +7 -0
- package/dist/data/test/function/heap_new__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/heap_new__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/heap_peek.mcfunction +2 -0
- package/dist/data/test/function/heap_pop.mcfunction +4 -0
- package/dist/data/test/function/heap_pop__else_13.mcfunction +2 -0
- package/dist/data/test/function/heap_pop__loop_body_1.mcfunction +14 -0
- package/dist/data/test/function/heap_pop__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/heap_pop__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/heap_pop__merge_10.mcfunction +1 -0
- package/dist/data/test/function/heap_pop__merge_12.mcfunction +1 -0
- package/dist/data/test/function/heap_pop__merge_4.mcfunction +3 -0
- package/dist/data/test/function/heap_pop__merge_6.mcfunction +1 -0
- package/dist/data/test/function/heap_pop__merge_8.mcfunction +3 -0
- package/dist/data/test/function/heap_pop__then_11.mcfunction +2 -0
- package/dist/data/test/function/heap_pop__then_3.mcfunction +3 -0
- package/dist/data/test/function/heap_pop__then_5.mcfunction +2 -0
- package/dist/data/test/function/heap_pop__then_7.mcfunction +3 -0
- package/dist/data/test/function/heap_pop__then_9.mcfunction +2 -0
- package/dist/data/test/function/heap_push.mcfunction +6 -0
- package/dist/data/test/function/heap_push__else_5.mcfunction +2 -0
- package/dist/data/test/function/heap_push__else_8.mcfunction +2 -0
- package/dist/data/test/function/heap_push__loop_body_1.mcfunction +4 -0
- package/dist/data/test/function/heap_push__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/heap_push__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/heap_push__merge_4.mcfunction +1 -0
- package/dist/data/test/function/heap_push__merge_7.mcfunction +1 -0
- package/dist/data/test/function/heap_push__then_3.mcfunction +7 -0
- package/dist/data/test/function/heap_push__then_6.mcfunction +2 -0
- package/dist/data/test/function/heap_size.mcfunction +2 -0
- package/dist/data/test/function/hearts_at.mcfunction +1 -0
- package/dist/data/test/function/hide_bar.mcfunction +4 -0
- package/dist/data/test/function/hsl_to_b.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_b__merge_1.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_b__merge_12.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_b__merge_3.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_b__merge_6.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_b__merge_9.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_g.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_g__merge_1.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_g__merge_12.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_g__merge_3.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_g__merge_6.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_g__merge_9.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_r.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_r__merge_1.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_r__merge_12.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_r__merge_3.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_r__merge_6.mcfunction +1 -2
- package/dist/data/test/function/hsl_to_r__merge_9.mcfunction +1 -2
- package/dist/data/test/function/init_div.mcfunction +1 -0
- package/dist/data/test/function/insertion_sort.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort__else_11.mcfunction +2 -0
- package/dist/data/test/function/insertion_sort__else_8.mcfunction +2 -0
- package/dist/data/test/function/insertion_sort__loop_body_1.mcfunction +6 -0
- package/dist/data/test/function/insertion_sort__loop_body_4.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/insertion_sort__loop_exit_5.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/insertion_sort__loop_header_3.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort__merge_10.mcfunction +1 -0
- package/dist/data/test/function/insertion_sort__merge_7.mcfunction +1 -0
- package/dist/data/test/function/insertion_sort__then_6.mcfunction +3 -0
- package/dist/data/test/function/insertion_sort__then_9.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort_desc.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort_desc__else_11.mcfunction +2 -0
- package/dist/data/test/function/insertion_sort_desc__else_8.mcfunction +2 -0
- package/dist/data/test/function/insertion_sort_desc__loop_body_1.mcfunction +6 -0
- package/dist/data/test/function/insertion_sort_desc__loop_body_4.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort_desc__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/insertion_sort_desc__loop_exit_5.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort_desc__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/insertion_sort_desc__loop_header_3.mcfunction +4 -0
- package/dist/data/test/function/insertion_sort_desc__merge_10.mcfunction +1 -0
- package/dist/data/test/function/insertion_sort_desc__merge_7.mcfunction +1 -0
- package/dist/data/test/function/insertion_sort_desc__then_6.mcfunction +3 -0
- package/dist/data/test/function/insertion_sort_desc__then_9.mcfunction +4 -0
- package/dist/data/test/function/integrate_simpson.mcfunction +7 -0
- package/dist/data/test/function/integrate_simpson__loop_body_6.mcfunction +7 -0
- package/dist/data/test/function/integrate_simpson__loop_exit_7.mcfunction +6 -0
- package/dist/data/test/function/integrate_simpson__loop_header_5.mcfunction +5 -0
- package/dist/data/test/function/integrate_simpson__merge_1.mcfunction +8 -0
- package/dist/data/test/function/integrate_simpson__merge_11.mcfunction +4 -0
- package/dist/data/test/function/integrate_simpson__merge_4.mcfunction +5 -0
- package/dist/data/test/function/integrate_simpson__merge_9.mcfunction +7 -0
- package/dist/data/test/function/integrate_simpson__then_0.mcfunction +6 -0
- package/dist/data/test/function/integrate_simpson__then_10.mcfunction +6 -0
- package/dist/data/test/function/integrate_simpson__then_3.mcfunction +4 -0
- package/dist/data/test/function/integrate_simpson__then_8.mcfunction +6 -0
- package/dist/data/test/function/integrate_trapezoid.mcfunction +7 -0
- package/dist/data/test/function/integrate_trapezoid__loop_body_4.mcfunction +7 -0
- package/dist/data/test/function/integrate_trapezoid__loop_exit_5.mcfunction +6 -0
- package/dist/data/test/function/integrate_trapezoid__loop_header_3.mcfunction +5 -0
- package/dist/data/test/function/integrate_trapezoid__merge_1.mcfunction +11 -0
- package/dist/data/test/function/integrate_trapezoid__then_0.mcfunction +2 -0
- package/dist/data/test/function/interactions_init.mcfunction +9 -0
- package/dist/data/test/function/invisible.mcfunction +1 -0
- package/dist/data/test/function/is_op.mcfunction +2 -0
- package/dist/data/test/function/is_op__exec_t1.mcfunction +1 -0
- package/dist/data/test/function/is_sneaking.mcfunction +5 -0
- package/dist/data/test/function/is_sneaking__merge_1.mcfunction +2 -0
- package/dist/data/test/function/is_sneaking__then_0.mcfunction +2 -0
- package/dist/data/test/function/jump.mcfunction +1 -0
- package/dist/data/test/function/launch_up.mcfunction +6 -0
- package/dist/data/test/function/list_max3.mcfunction +1 -2
- package/dist/data/test/function/list_max3__merge_1.mcfunction +1 -2
- package/dist/data/test/function/list_max5.mcfunction +1 -2
- package/dist/data/test/function/list_max5__merge_1.mcfunction +1 -2
- package/dist/data/test/function/list_max5__merge_3.mcfunction +1 -2
- package/dist/data/test/function/list_max5__merge_5.mcfunction +1 -2
- package/dist/data/test/function/list_min3.mcfunction +1 -2
- package/dist/data/test/function/list_min3__merge_1.mcfunction +1 -2
- package/dist/data/test/function/list_min5.mcfunction +1 -2
- package/dist/data/test/function/list_min5__merge_1.mcfunction +1 -2
- package/dist/data/test/function/list_min5__merge_3.mcfunction +1 -2
- package/dist/data/test/function/list_min5__merge_5.mcfunction +1 -2
- package/dist/data/test/function/list_sort_asc__loop_body_4.mcfunction +1 -2
- package/dist/data/test/function/list_sort_asc__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/list_sort_asc__loop_header_3.mcfunction +1 -2
- package/dist/data/test/function/list_sort_desc__loop_body_4.mcfunction +1 -2
- package/dist/data/test/function/list_sort_desc__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/list_sort_desc__loop_header_3.mcfunction +1 -2
- package/dist/data/test/function/max_heap_pop.mcfunction +4 -0
- package/dist/data/test/function/max_heap_pop__else_13.mcfunction +2 -0
- package/dist/data/test/function/max_heap_pop__loop_body_1.mcfunction +14 -0
- package/dist/data/test/function/max_heap_pop__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/max_heap_pop__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/max_heap_pop__merge_10.mcfunction +1 -0
- package/dist/data/test/function/max_heap_pop__merge_12.mcfunction +1 -0
- package/dist/data/test/function/max_heap_pop__merge_4.mcfunction +3 -0
- package/dist/data/test/function/max_heap_pop__merge_6.mcfunction +1 -0
- package/dist/data/test/function/max_heap_pop__merge_8.mcfunction +3 -0
- package/dist/data/test/function/max_heap_pop__then_11.mcfunction +2 -0
- package/dist/data/test/function/max_heap_pop__then_3.mcfunction +3 -0
- package/dist/data/test/function/max_heap_pop__then_5.mcfunction +2 -0
- package/dist/data/test/function/max_heap_pop__then_7.mcfunction +3 -0
- package/dist/data/test/function/max_heap_pop__then_9.mcfunction +2 -0
- package/dist/data/test/function/max_heap_push.mcfunction +6 -0
- package/dist/data/test/function/max_heap_push__else_5.mcfunction +2 -0
- package/dist/data/test/function/max_heap_push__else_8.mcfunction +2 -0
- package/dist/data/test/function/max_heap_push__loop_body_1.mcfunction +4 -0
- package/dist/data/test/function/max_heap_push__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/max_heap_push__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/max_heap_push__merge_4.mcfunction +1 -0
- package/dist/data/test/function/max_heap_push__merge_7.mcfunction +1 -0
- package/dist/data/test/function/max_heap_push__then_3.mcfunction +7 -0
- package/dist/data/test/function/max_heap_push__then_6.mcfunction +2 -0
- package/dist/data/test/function/newton_step.mcfunction +7 -0
- package/dist/data/test/function/newton_step__merge_1.mcfunction +8 -0
- package/dist/data/test/function/newton_step__then_0.mcfunction +1 -0
- package/dist/data/test/function/night_vision.mcfunction +1 -0
- package/dist/data/test/function/norm3_hp.mcfunction +43 -0
- package/dist/data/test/function/normal_approx12.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_1.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_11.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_13.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_15.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_17.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_19.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_21.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_3.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_5.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_7.mcfunction +1 -2
- package/dist/data/test/function/normal_approx12__merge_9.mcfunction +1 -2
- package/dist/data/test/function/on_double_sneak.mcfunction +1 -0
- package/dist/data/test/function/on_double_sneak__foreach_t0.mcfunction +9 -0
- package/dist/data/test/function/on_double_sneak__foreach_t0__merge_1.mcfunction +1 -0
- package/dist/data/test/function/on_double_sneak__foreach_t0__merge_3.mcfunction +2 -0
- package/dist/data/test/function/on_double_sneak__foreach_t0__then_0.mcfunction +6 -0
- package/dist/data/test/function/on_double_sneak__foreach_t0__then_2.mcfunction +2 -0
- package/dist/data/test/function/on_right_click.mcfunction +1 -0
- package/dist/data/test/function/on_right_click__foreach_t1.mcfunction +5 -0
- package/dist/data/test/function/on_right_click__foreach_t1__merge_1.mcfunction +1 -0
- package/dist/data/test/function/on_right_click__foreach_t1__then_0.mcfunction +3 -0
- package/dist/data/test/function/on_sneak_click.mcfunction +1 -0
- package/dist/data/test/function/on_sneak_click__foreach_t0.mcfunction +7 -0
- package/dist/data/test/function/on_sneak_click__foreach_t0__else_4.mcfunction +3 -0
- package/dist/data/test/function/on_sneak_click__foreach_t0__merge_1.mcfunction +1 -0
- package/dist/data/test/function/on_sneak_click__foreach_t0__merge_3.mcfunction +1 -0
- package/dist/data/test/function/on_sneak_click__foreach_t0__then_0.mcfunction +4 -0
- package/dist/data/test/function/on_sneak_click__foreach_t0__then_2.mcfunction +3 -0
- package/dist/data/test/function/on_sneak_start.mcfunction +1 -0
- package/dist/data/test/function/on_sneak_start__foreach_t0.mcfunction +5 -0
- package/dist/data/test/function/on_sneak_start__foreach_t0__else_2.mcfunction +2 -0
- package/dist/data/test/function/on_sneak_start__foreach_t0__merge_1.mcfunction +1 -0
- package/dist/data/test/function/on_sneak_start__foreach_t0__then_0.mcfunction +2 -0
- package/dist/data/test/function/particle_at_fx.mcfunction +1 -0
- package/dist/data/test/function/particle_dot.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs.mcfunction +11 -0
- package/dist/data/test/function/pathfind_bfs__else_33.mcfunction +4 -0
- package/dist/data/test/function/pathfind_bfs__else_8.mcfunction +19 -0
- package/dist/data/test/function/pathfind_bfs__loop_body_1.mcfunction +10 -0
- package/dist/data/test/function/pathfind_bfs__loop_body_29.mcfunction +6 -0
- package/dist/data/test/function/pathfind_bfs__loop_body_35.mcfunction +9 -0
- package/dist/data/test/function/pathfind_bfs__loop_body_4.mcfunction +9 -0
- package/dist/data/test/function/pathfind_bfs__loop_exit_2.mcfunction +24 -0
- package/dist/data/test/function/pathfind_bfs__loop_exit_30.mcfunction +6 -0
- package/dist/data/test/function/pathfind_bfs__loop_exit_36.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__loop_exit_5.mcfunction +6 -0
- package/dist/data/test/function/pathfind_bfs__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/pathfind_bfs__loop_header_28.mcfunction +4 -0
- package/dist/data/test/function/pathfind_bfs__loop_header_3.mcfunction +3 -0
- package/dist/data/test/function/pathfind_bfs__loop_header_34.mcfunction +4 -0
- package/dist/data/test/function/pathfind_bfs__merge_10.mcfunction +11 -0
- package/dist/data/test/function/pathfind_bfs__merge_12.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__merge_14.mcfunction +11 -0
- package/dist/data/test/function/pathfind_bfs__merge_16.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__merge_18.mcfunction +11 -0
- package/dist/data/test/function/pathfind_bfs__merge_20.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__merge_22.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__merge_24.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__merge_26.mcfunction +5 -0
- package/dist/data/test/function/pathfind_bfs__merge_32.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__merge_7.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__then_11.mcfunction +15 -0
- package/dist/data/test/function/pathfind_bfs__then_13.mcfunction +13 -0
- package/dist/data/test/function/pathfind_bfs__then_15.mcfunction +15 -0
- package/dist/data/test/function/pathfind_bfs__then_17.mcfunction +13 -0
- package/dist/data/test/function/pathfind_bfs__then_19.mcfunction +15 -0
- package/dist/data/test/function/pathfind_bfs__then_21.mcfunction +13 -0
- package/dist/data/test/function/pathfind_bfs__then_23.mcfunction +15 -0
- package/dist/data/test/function/pathfind_bfs__then_25.mcfunction +1 -0
- package/dist/data/test/function/pathfind_bfs__then_31.mcfunction +2 -0
- package/dist/data/test/function/pathfind_bfs__then_6.mcfunction +3 -0
- package/dist/data/test/function/pathfind_bfs__then_9.mcfunction +13 -0
- package/dist/data/test/function/pathfind_bfs_coro.mcfunction +1 -0
- package/dist/data/test/function/pcg_output.mcfunction +1 -2
- package/dist/data/test/function/pf_heuristic.mcfunction +14 -0
- package/dist/data/test/function/pf_heuristic__merge_1.mcfunction +4 -0
- package/dist/data/test/function/pf_heuristic__merge_3.mcfunction +6 -0
- package/dist/data/test/function/pf_heuristic__then_0.mcfunction +4 -0
- package/dist/data/test/function/pf_heuristic__then_2.mcfunction +4 -0
- package/dist/data/test/function/pf_is_blocked.mcfunction +7 -0
- package/dist/data/test/function/pf_is_blocked__merge_1.mcfunction +4 -0
- package/dist/data/test/function/pf_is_blocked__merge_10.mcfunction +4 -0
- package/dist/data/test/function/pf_is_blocked__merge_4.mcfunction +4 -0
- package/dist/data/test/function/pf_is_blocked__merge_7.mcfunction +4 -0
- package/dist/data/test/function/pf_is_blocked__then_0.mcfunction +2 -0
- package/dist/data/test/function/pf_is_blocked__then_3.mcfunction +2 -0
- package/dist/data/test/function/pf_is_blocked__then_6.mcfunction +2 -0
- package/dist/data/test/function/pf_is_blocked__then_9.mcfunction +2 -0
- package/dist/data/test/function/pf_new_map.mcfunction +4 -0
- package/dist/data/test/function/pf_new_map__loop_body_1.mcfunction +7 -0
- package/dist/data/test/function/pf_new_map__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/pf_new_map__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/pf_noop.mcfunction +1 -0
- package/dist/data/test/function/pf_pack.mcfunction +8 -0
- package/dist/data/test/function/pf_set_blocked.mcfunction +5 -0
- package/dist/data/test/function/pf_set_open.mcfunction +5 -0
- package/dist/data/test/function/pf_unpack_x.mcfunction +5 -0
- package/dist/data/test/function/pf_unpack_z.mcfunction +5 -0
- package/dist/data/test/function/popcount__loop_body_1.mcfunction +1 -2
- package/dist/data/test/function/popcount__loop_header_0.mcfunction +1 -2
- package/dist/data/test/function/portal_effect.mcfunction +1 -0
- package/dist/data/test/function/random_bool.mcfunction +1 -2
- package/dist/data/test/function/random_range.mcfunction +1 -2
- package/dist/data/test/function/regen.mcfunction +1 -0
- package/dist/data/test/function/remove_bar.mcfunction +3 -0
- package/dist/data/test/function/remove_from_teams.mcfunction +3 -0
- package/dist/data/test/function/remove_item.mcfunction +1 -0
- package/dist/data/test/function/resistance.mcfunction +1 -0
- package/dist/data/test/function/rgb_to_h.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_h__merge_1.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_h__merge_12.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_h__merge_3.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_h__merge_5.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_h__merge_7.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_h__merge_9.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_h__then_11.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_l.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_l__merge_1.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_l__merge_3.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_l__merge_5.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_s.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_s__merge_1.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_s__merge_3.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_s__merge_5.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_s__merge_7.mcfunction +1 -2
- package/dist/data/test/function/rgb_to_s__merge_9.mcfunction +1 -2
- package/dist/data/test/function/riemann_left.mcfunction +6 -0
- package/dist/data/test/function/riemann_left__loop_body_1.mcfunction +7 -0
- package/dist/data/test/function/riemann_left__loop_exit_2.mcfunction +6 -0
- package/dist/data/test/function/riemann_left__loop_header_0.mcfunction +5 -0
- package/dist/data/test/function/riemann_mid.mcfunction +6 -0
- package/dist/data/test/function/riemann_mid__loop_body_1.mcfunction +7 -0
- package/dist/data/test/function/riemann_mid__loop_exit_2.mcfunction +6 -0
- package/dist/data/test/function/riemann_mid__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/riemann_right.mcfunction +6 -0
- package/dist/data/test/function/riemann_right__loop_body_1.mcfunction +7 -0
- package/dist/data/test/function/riemann_right__loop_exit_2.mcfunction +6 -0
- package/dist/data/test/function/riemann_right__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/running_m2.mcfunction +16 -0
- package/dist/data/test/function/running_mean.mcfunction +7 -0
- package/dist/data/test/function/running_mean__merge_1.mcfunction +13 -0
- package/dist/data/test/function/running_mean__then_0.mcfunction +1 -0
- package/dist/data/test/function/second_deriv.mcfunction +8 -0
- package/dist/data/test/function/second_deriv__merge_1.mcfunction +14 -0
- package/dist/data/test/function/second_deriv__then_0.mcfunction +2 -0
- package/dist/data/test/function/set_day.mcfunction +1 -0
- package/dist/data/test/function/set_easy.mcfunction +1 -0
- package/dist/data/test/function/set_hard.mcfunction +1 -0
- package/dist/data/test/function/set_midnight.mcfunction +1 -0
- package/dist/data/test/function/set_night.mcfunction +1 -0
- package/dist/data/test/function/set_noon.mcfunction +1 -0
- package/dist/data/test/function/set_normal.mcfunction +1 -0
- package/dist/data/test/function/set_peaceful.mcfunction +1 -0
- package/dist/data/test/function/setup_four_teams.mcfunction +4 -0
- package/dist/data/test/function/setup_two_teams.mcfunction +2 -0
- package/dist/data/test/function/show_bar.mcfunction +4 -0
- package/dist/data/test/function/simpson_step.mcfunction +16 -0
- package/dist/data/test/function/sin_hp.mcfunction +4 -2
- package/dist/data/test/function/slow_fall.mcfunction +1 -0
- package/dist/data/test/function/smoke.mcfunction +1 -0
- package/dist/data/test/function/sort2_max.mcfunction +1 -2
- package/dist/data/test/function/sort2_min.mcfunction +1 -2
- package/dist/data/test/function/sort3.mcfunction +1 -2
- package/dist/data/test/function/sort3__merge_1.mcfunction +1 -2
- package/dist/data/test/function/sort3__merge_3.mcfunction +1 -2
- package/dist/data/test/function/sort3__merge_5.mcfunction +1 -2
- package/dist/data/test/function/sort3__merge_7.mcfunction +1 -2
- package/dist/data/test/function/sort4.mcfunction +1 -2
- package/dist/data/test/function/sort4__merge_1.mcfunction +1 -2
- package/dist/data/test/function/sort4__merge_11.mcfunction +1 -2
- package/dist/data/test/function/sort4__merge_14.mcfunction +1 -2
- package/dist/data/test/function/sort4__merge_3.mcfunction +1 -2
- package/dist/data/test/function/sort4__merge_5.mcfunction +1 -2
- package/dist/data/test/function/sort4__merge_7.mcfunction +1 -2
- package/dist/data/test/function/sort4__merge_9.mcfunction +1 -2
- package/dist/data/test/function/sort5.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_1.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_11.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_13.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_15.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_17.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_19.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_22.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_25.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_3.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_5.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_7.mcfunction +1 -2
- package/dist/data/test/function/sort5__merge_9.mcfunction +1 -2
- package/dist/data/test/function/sort_merge.mcfunction +10 -0
- package/dist/data/test/function/sort_merge__else_11.mcfunction +7 -0
- package/dist/data/test/function/sort_merge__else_14.mcfunction +2 -0
- package/dist/data/test/function/sort_merge__else_5.mcfunction +3 -0
- package/dist/data/test/function/sort_merge__else_8.mcfunction +7 -0
- package/dist/data/test/function/sort_merge__loop_body_1.mcfunction +3 -0
- package/dist/data/test/function/sort_merge__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/sort_merge__loop_header_0.mcfunction +4 -0
- package/dist/data/test/function/sort_merge__merge_10.mcfunction +1 -0
- package/dist/data/test/function/sort_merge__merge_13.mcfunction +1 -0
- package/dist/data/test/function/sort_merge__merge_4.mcfunction +1 -0
- package/dist/data/test/function/sort_merge__merge_7.mcfunction +1 -0
- package/dist/data/test/function/sort_merge__then_12.mcfunction +7 -0
- package/dist/data/test/function/sort_merge__then_3.mcfunction +3 -0
- package/dist/data/test/function/sort_merge__then_6.mcfunction +3 -0
- package/dist/data/test/function/sort_merge__then_9.mcfunction +7 -0
- package/dist/data/test/function/sparkles_at.mcfunction +1 -0
- package/dist/data/test/function/speed.mcfunction +1 -0
- package/dist/data/test/function/sphere_contains.mcfunction +1 -2
- package/dist/data/test/function/spread_players.mcfunction +1 -0
- package/dist/data/test/function/sqrt_fx.mcfunction +5 -8
- package/dist/data/test/function/sqrt_hp.mcfunction +17 -0
- package/dist/data/test/function/sqrt_hp__merge_1.mcfunction +21 -0
- package/dist/data/test/function/sqrt_hp__then_0.mcfunction +2 -0
- package/dist/data/test/function/std_dev_approx.mcfunction +5 -0
- package/dist/data/test/function/std_dev_approx__merge_1.mcfunction +13 -0
- package/dist/data/test/function/std_dev_approx__then_0.mcfunction +2 -0
- package/dist/data/test/function/str_len.mcfunction +2 -0
- package/dist/data/test/function/strength.mcfunction +1 -0
- package/dist/data/test/function/t.mcfunction +3 -0
- package/dist/data/test/function/teleport_to.mcfunction +9 -0
- package/dist/data/test/function/teleport_to_entity.mcfunction +5 -0
- package/dist/data/test/function/test.mcfunction +5 -0
- package/dist/data/test/function/test__loop_body_1.mcfunction +9 -0
- package/dist/data/test/function/test__loop_exit_2.mcfunction +1 -0
- package/dist/data/test/function/test__loop_header_0.mcfunction +3 -0
- package/dist/data/test/function/tile_of.mcfunction +1 -2
- package/dist/data/test/function/timer/done.mcfunction +1 -2
- package/dist/data/test/function/timer/remaining.mcfunction +1 -2
- package/dist/data/test/function/timer/tick.mcfunction +1 -2
- package/dist/data/test/function/timer/tick__then_0.mcfunction +1 -2
- package/dist/data/test/function/totem_at.mcfunction +1 -0
- package/dist/data/test/function/trapezoid_step.mcfunction +11 -0
- package/dist/data/test/function/uniform_frac.mcfunction +1 -2
- package/dist/data/test/function/uniform_int.mcfunction +1 -2
- package/dist/data/test/function/update_bar.mcfunction +5 -0
- package/dist/data/test/function/update_bar_color.mcfunction +6 -0
- package/dist/data/test/function/update_bar_color__else_2.mcfunction +4 -0
- package/dist/data/test/function/update_bar_color__else_5.mcfunction +4 -0
- package/dist/data/test/function/update_bar_color__merge_1.mcfunction +1 -0
- package/dist/data/test/function/update_bar_color__merge_4.mcfunction +1 -0
- package/dist/data/test/function/update_bar_color__then_0.mcfunction +4 -0
- package/dist/data/test/function/update_bar_color__then_3.mcfunction +4 -0
- package/dist/data/test/function/value_noise_1d.mcfunction +1 -2
- package/dist/data/test/function/value_noise_2d.mcfunction +1 -2
- package/dist/data/test/function/value_noise_2d__merge_1.mcfunction +1 -2
- package/dist/data/test/function/variance_from_m2.mcfunction +6 -0
- package/dist/data/test/function/variance_from_m2__merge_1.mcfunction +5 -0
- package/dist/data/test/function/variance_from_m2__then_0.mcfunction +2 -0
- package/dist/data/test/function/weapon_damage.mcfunction +5 -0
- package/dist/data/test/function/weather_clear.mcfunction +1 -0
- package/dist/data/test/function/weather_rain.mcfunction +1 -0
- package/dist/data/test/function/weather_thunder.mcfunction +1 -0
- package/dist/data/test/function/weighted2.mcfunction +1 -2
- package/dist/data/test/function/weighted2__merge_1.mcfunction +1 -2
- package/dist/data/test/function/weighted3.mcfunction +1 -2
- package/dist/data/test/function/weighted3__merge_1.mcfunction +1 -2
- package/dist/data/test/function/weighted3__merge_3.mcfunction +1 -2
- package/dist/data/test_dmul/function/__double_mul_macro.mcfunction +1 -0
- package/dist/data/test_dmul/function/double_mul_fixed.mcfunction +6 -0
- package/dist/data/test_dmul/function/load.mcfunction +1 -0
- package/dist/data/test_double_fn/function/double_test.mcfunction +2 -0
- package/dist/data/test_double_fn/function/load.mcfunction +1 -0
- package/dist/data/test_double_fn2/function/double_test.mcfunction +2 -0
- package/dist/data/test_double_fn2/function/load.mcfunction +1 -0
- package/dist/data/test_double_pass/function/caller_fn.mcfunction +4 -0
- package/dist/data/test_double_pass/function/consume_double.mcfunction +2 -0
- package/dist/data/test_double_pass/function/load.mcfunction +1 -0
- package/dist/data/test_macro/function/load.mcfunction +1 -0
- package/dist/data/test_macro/function/macro_helper.mcfunction +1 -0
- package/dist/data/test_macro3/function/__dmul_macro.mcfunction +1 -0
- package/dist/data/test_macro3/function/double_mul_test.mcfunction +7 -0
- package/dist/data/test_macro3/function/load.mcfunction +1 -0
- package/dist/data/test_ret_double/function/load.mcfunction +1 -0
- package/dist/data/test_ret_double/function/make_double.mcfunction +3 -0
- package/dist/data/test_ret_double/function/use_it.mcfunction +3 -0
- package/dist/pack.mcmeta +1 -1
- package/dist/src/__tests__/array-dynamic.test.js +42 -0
- package/dist/src/__tests__/builtins.test.d.ts +1 -0
- package/dist/src/__tests__/builtins.test.js +55 -0
- package/dist/src/__tests__/compile-all.test.js +1 -0
- package/dist/src/__tests__/diagnostics.test.js +8 -11
- package/dist/src/__tests__/double.test.d.ts +7 -0
- package/dist/src/__tests__/double.test.js +464 -0
- package/dist/src/__tests__/e2e/ecs-stdlib.test.d.ts +7 -0
- package/dist/src/__tests__/e2e/ecs-stdlib.test.js +328 -0
- package/dist/src/__tests__/e2e/events-stdlib.test.d.ts +1 -0
- package/dist/src/__tests__/e2e/events-stdlib.test.js +81 -0
- package/dist/src/__tests__/e2e/fft-stdlib.test.d.ts +13 -0
- package/dist/src/__tests__/e2e/fft-stdlib.test.js +288 -0
- package/dist/src/__tests__/e2e/for-in-array.test.d.ts +4 -0
- package/dist/src/__tests__/e2e/for-in-array.test.js +59 -0
- package/dist/src/__tests__/e2e/macros.test.js +7 -7
- package/dist/src/__tests__/e2e/ode-stdlib.test.d.ts +1 -0
- package/dist/src/__tests__/e2e/ode-stdlib.test.js +91 -0
- package/dist/src/__tests__/e2e/stdlib-e2e.test.js +1616 -0
- package/dist/src/__tests__/emit/compile.test.d.ts +1 -0
- package/dist/src/__tests__/emit/compile.test.js +95 -0
- package/dist/src/__tests__/emit/index.test.d.ts +1 -0
- package/dist/src/__tests__/emit/index.test.js +180 -0
- package/dist/src/__tests__/emit/modules-extra.test.d.ts +1 -0
- package/dist/src/__tests__/emit/modules-extra.test.js +77 -0
- package/dist/src/__tests__/enum.test.js +4 -6
- package/dist/src/__tests__/fixed.test.d.ts +7 -0
- package/dist/src/__tests__/fixed.test.js +148 -0
- package/dist/src/__tests__/float-lint.test.d.ts +7 -0
- package/dist/src/__tests__/float-lint.test.js +96 -0
- package/dist/src/__tests__/float.test.d.ts +7 -0
- package/dist/src/__tests__/float.test.js +148 -0
- package/dist/src/__tests__/for-each.test.d.ts +1 -0
- package/dist/src/__tests__/for-each.test.js +125 -0
- package/dist/src/__tests__/for-range.test.d.ts +1 -0
- package/dist/src/__tests__/for-range.test.js +136 -0
- package/dist/src/__tests__/generics.test.js +4 -4
- package/dist/src/__tests__/impl.test.d.ts +1 -0
- package/dist/src/__tests__/impl.test.js +199 -0
- package/dist/src/__tests__/lsp-logic.test.d.ts +1 -0
- package/dist/src/__tests__/lsp-logic.test.js +145 -0
- package/dist/src/__tests__/match.test.d.ts +10 -0
- package/dist/src/__tests__/match.test.js +197 -0
- package/dist/src/__tests__/mc-integration/item-entity-events.test.d.ts +18 -0
- package/dist/src/__tests__/mc-integration/item-entity-events.test.js +287 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +833 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +707 -0
- package/dist/src/__tests__/mc-integration/syntax-coverage.test.d.ts +9 -0
- package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +442 -0
- package/dist/src/__tests__/mc-integration.test.js +835 -5
- package/dist/src/__tests__/optimizer/constant_fold.test.js +105 -0
- package/dist/src/__tests__/optimizer/coroutine.test.js +3 -2
- package/dist/src/__tests__/parser.test.js +5 -5
- package/dist/src/__tests__/runtime.test.js +143 -238
- package/dist/src/__tests__/stdlib/arr-len.test.d.ts +13 -0
- package/dist/src/__tests__/stdlib/arr-len.test.js +195 -0
- package/dist/src/__tests__/stdlib/calculus.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/calculus.test.js +123 -0
- package/dist/src/__tests__/stdlib/dialog.test.d.ts +6 -0
- package/dist/src/__tests__/stdlib/dialog.test.js +142 -0
- package/dist/src/__tests__/stdlib/easing.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/easing.test.js +117 -0
- package/dist/src/__tests__/stdlib/geometry.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/geometry.test.js +163 -0
- package/dist/src/__tests__/stdlib/heap.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/heap.test.js +141 -0
- package/dist/src/__tests__/stdlib/list.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/list.test.js +134 -0
- package/dist/src/__tests__/stdlib/matrix.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/matrix.test.js +148 -0
- package/dist/src/__tests__/stdlib/pathfind.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/pathfind.test.js +167 -0
- package/dist/src/__tests__/stdlib/scheduler.test.d.ts +6 -0
- package/dist/src/__tests__/stdlib/scheduler.test.js +177 -0
- package/dist/src/__tests__/stdlib/sort-v2.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/sort-v2.test.js +131 -0
- package/dist/src/__tests__/stdlib/sort.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/sort.test.js +128 -0
- package/dist/src/__tests__/stdlib/state.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/state.test.js +176 -0
- package/dist/src/__tests__/typechecker-strict.test.js +21 -21
- package/dist/src/__tests__/typechecker.test.js +5 -3
- package/dist/src/ast/types.d.ts +28 -2
- package/dist/src/emit/compile.js +30 -3
- package/dist/src/emit/index.d.ts +2 -0
- package/dist/src/emit/index.js +20 -1
- package/dist/src/emit/modules.js +3 -2
- package/dist/src/events/types.d.ts +1 -1
- package/dist/src/events/types.js +5 -2
- package/dist/src/hir/lower.js +88 -2
- package/dist/src/hir/monomorphize.js +11 -5
- package/dist/src/hir/types.d.ts +20 -1
- package/dist/src/lexer/index.d.ts +1 -1
- package/dist/src/lexer/index.js +10 -1
- package/dist/src/lir/lower.js +7 -0
- package/dist/src/lsp/server.js +912 -56
- package/dist/src/mc-test/client.d.ts +13 -1
- package/dist/src/mc-test/client.js +29 -1
- package/dist/src/mir/lower.js +703 -74
- package/dist/src/mir/types.d.ts +5 -0
- package/dist/src/mir/verify.js +2 -0
- package/dist/src/optimizer/constant_fold.js +10 -6
- package/dist/src/optimizer/coroutine.js +90 -33
- package/dist/src/optimizer/interprocedural.js +4 -0
- package/dist/src/parser/index.d.ts +5 -0
- package/dist/src/parser/index.js +171 -39
- package/dist/src/runtime/index.js +24 -0
- package/dist/src/typechecker/index.d.ts +8 -1
- package/dist/src/typechecker/index.js +73 -14
- package/docs/LANGUAGE_REFERENCE.md +302 -67
- package/docs/stdlib/README.md +54 -0
- package/docs/stdlib/advanced.md +276 -0
- package/docs/stdlib/bigint.md +285 -0
- package/docs/stdlib/bits.md +159 -0
- package/docs/stdlib/bossbar.md +101 -0
- package/docs/stdlib/calculus.md +141 -0
- package/docs/stdlib/color.md +125 -0
- package/docs/stdlib/combat.md +41 -0
- package/docs/stdlib/cooldown.md +48 -0
- package/docs/stdlib/easing.md +157 -0
- package/docs/stdlib/effects.md +101 -0
- package/docs/stdlib/expr.md +38 -0
- package/docs/stdlib/geometry.md +130 -0
- package/docs/stdlib/interactions.md +111 -0
- package/docs/stdlib/inventory.md +53 -0
- package/docs/stdlib/list.md +189 -0
- package/docs/stdlib/math.md +334 -0
- package/docs/stdlib/math_hp.md +185 -0
- package/docs/stdlib/matrix.md +123 -0
- package/docs/stdlib/mobs.md +131 -0
- package/docs/stdlib/noise.md +103 -0
- package/docs/stdlib/parabola.md +119 -0
- package/docs/stdlib/particles.md +123 -0
- package/docs/stdlib/physics.md +148 -0
- package/docs/stdlib/player.md +43 -0
- package/docs/stdlib/quaternion.md +159 -0
- package/docs/stdlib/random.md +86 -0
- package/docs/stdlib/sets.md +68 -0
- package/docs/stdlib/signal.md +141 -0
- package/docs/stdlib/spawn.md +65 -0
- package/docs/stdlib/strings.md +17 -0
- package/docs/stdlib/tags.md +117 -0
- package/docs/stdlib/teams.md +87 -0
- package/docs/stdlib/timer.md +126 -0
- package/docs/stdlib/vec.md +193 -0
- package/docs/stdlib/world.md +151 -0
- package/editors/vscode/build.mjs +31 -12
- package/editors/vscode/out/extension.js +3670 -200
- package/editors/vscode/out/lsp-server.js +14854 -0
- package/editors/vscode/package-lock.json +3 -3
- package/editors/vscode/package.json +1 -1
- package/editors/vscode/snippets/redscript.json +109 -30
- package/editors/vscode/src/extension.ts +15 -13
- package/examples/readme-demo.mcrs +4 -4
- package/jest.config.js +5 -2
- package/package.json +1 -1
- package/scripts/postbuild.js +20 -0
- package/src/__tests__/array-dynamic.test.ts +42 -0
- package/src/__tests__/builtins.test.ts +66 -0
- package/src/__tests__/compile-all.test.ts +3 -2
- package/src/__tests__/diagnostics.test.ts +8 -10
- package/src/__tests__/double.test.ts +478 -0
- package/src/__tests__/e2e/ecs-stdlib.test.ts +371 -0
- package/src/__tests__/e2e/events-stdlib.test.ts +50 -0
- package/src/__tests__/e2e/fft-stdlib.test.ts +313 -0
- package/src/__tests__/e2e/macros.test.ts +7 -7
- package/src/__tests__/e2e/ode-stdlib.test.ts +68 -0
- package/src/__tests__/e2e/stdlib-e2e.test.ts +1952 -0
- package/src/__tests__/emit/compile.test.ts +102 -0
- package/src/__tests__/emit/index.test.ts +189 -0
- package/src/__tests__/emit/modules-extra.test.ts +80 -0
- package/src/__tests__/enum.test.ts +4 -6
- package/src/__tests__/fixed.test.ts +159 -0
- package/src/__tests__/fixtures/coroutine-mc-test.mcrs +58 -0
- package/src/__tests__/fixtures/for-range.mcrs +15 -0
- package/src/__tests__/fixtures/heap-sort-mc-test.mcrs +87 -0
- package/src/__tests__/fixtures/impl-test.mcrs +13 -44
- package/src/__tests__/fixtures/stdlib-extra-test.mcrs +226 -0
- package/src/__tests__/fixtures/stdlib-math-integration.mcrs +28 -0
- package/src/__tests__/fixtures/stdlib-math-test.mcrs +53 -0
- package/src/__tests__/float-lint.test.ts +102 -0
- package/src/__tests__/float.test.ts +158 -0
- package/src/__tests__/for-each.test.ts +135 -0
- package/src/__tests__/for-range.test.ts +149 -0
- package/src/__tests__/generics.test.ts +4 -4
- package/src/__tests__/impl.test.ts +207 -0
- package/src/__tests__/lsp-logic.test.ts +162 -0
- package/src/__tests__/match.test.ts +212 -0
- package/src/__tests__/mc-integration/item-entity-events.test.ts +298 -0
- package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +817 -0
- package/src/__tests__/mc-integration/stdlib-coverage.test.ts +699 -0
- package/src/__tests__/mc-integration/syntax-coverage.test.ts +464 -0
- package/src/__tests__/mc-integration.test.ts +889 -5
- package/src/__tests__/optimizer/constant_fold.test.ts +115 -0
- package/src/__tests__/optimizer/coroutine.test.ts +3 -2
- package/src/__tests__/parser.test.ts +5 -5
- package/src/__tests__/runtime.test.ts +194 -0
- package/src/__tests__/stdlib/arr-len.test.ts +231 -0
- package/src/__tests__/stdlib/calculus.test.ts +99 -0
- package/src/__tests__/stdlib/dialog.test.ts +132 -0
- package/src/__tests__/stdlib/easing.test.ts +97 -0
- package/src/__tests__/stdlib/geometry.test.ts +171 -0
- package/src/__tests__/stdlib/heap.test.ts +121 -0
- package/src/__tests__/stdlib/list.test.ts +117 -0
- package/src/__tests__/stdlib/matrix.test.ts +140 -0
- package/src/__tests__/stdlib/pathfind.test.ts +151 -0
- package/src/__tests__/stdlib/scheduler.test.ts +171 -0
- package/src/__tests__/stdlib/sort-v2.test.ts +111 -0
- package/src/__tests__/stdlib/sort.test.ts +106 -0
- package/src/__tests__/stdlib/state.test.ts +164 -0
- package/src/__tests__/typechecker-strict.test.ts +21 -21
- package/src/__tests__/typechecker.test.ts +5 -3
- package/src/ast/types.ts +16 -3
- package/src/emit/compile.ts +32 -3
- package/src/emit/index.ts +24 -1
- package/src/emit/modules.ts +2 -1
- package/src/events/types.ts +5 -2
- package/src/examples/capture_the_flag.mcrs +2 -2
- package/src/examples/hunger_games.mcrs +4 -4
- package/src/examples/parkour_race.mcrs +8 -8
- package/src/examples/tutorial_01_hello.mcrs +63 -0
- package/src/examples/tutorial_02_variables.mcrs +157 -0
- package/src/examples/tutorial_03_functions_structs.mcrs +162 -0
- package/src/examples/tutorial_04_selectors.mcrs +139 -0
- package/src/examples/tutorial_05_decorators.mcrs +131 -0
- package/src/examples/tutorial_06_math_particles.mcrs +123 -0
- package/src/examples/tutorial_07_random.mcrs +142 -0
- package/src/examples/tutorial_08_coroutine.mcrs +163 -0
- package/src/examples/tutorial_09_precision.mcrs +154 -0
- package/src/examples/tutorial_10_kill_race.mcrs +289 -0
- package/src/examples/zombie_survival.mcrs +7 -7
- package/src/hir/lower.ts +101 -4
- package/src/hir/monomorphize.ts +11 -6
- package/src/hir/types.ts +14 -1
- package/src/lexer/index.ts +11 -2
- package/src/lir/lower.ts +8 -0
- package/src/lsp/server.ts +894 -54
- package/src/mc-test/client.ts +32 -1
- package/src/mir/lower.ts +703 -74
- package/src/mir/types.ts +1 -0
- package/src/mir/verify.ts +2 -0
- package/src/optimizer/constant_fold.ts +11 -6
- package/src/optimizer/coroutine.ts +89 -29
- package/src/optimizer/interprocedural.ts +4 -0
- package/src/parser/index.ts +175 -41
- package/src/runtime/index.ts +26 -0
- package/src/stdlib/advanced.mcrs +47 -0
- package/src/stdlib/bigint.mcrs +251 -0
- package/src/stdlib/calculus.mcrs +150 -0
- package/src/stdlib/color.mcrs +102 -82
- package/src/stdlib/combat.mcrs +18 -12
- package/src/stdlib/dialog.mcrs +55 -0
- package/src/stdlib/ecs.mcrs +238 -0
- package/src/stdlib/events.mcrs +29 -0
- package/src/stdlib/expr.mcrs +117 -0
- package/src/stdlib/fft.mcrs +177 -0
- package/src/stdlib/geometry.mcrs +89 -0
- package/src/stdlib/graph.mcrs +274 -0
- package/src/stdlib/heap.mcrs +175 -0
- package/src/stdlib/linalg.mcrs +260 -0
- package/src/stdlib/list.mcrs +99 -0
- package/src/stdlib/math.mcrs +121 -5
- package/src/stdlib/math_hp.mcrs +452 -0
- package/src/stdlib/matrix.mcrs +113 -0
- package/src/stdlib/ode.mcrs +168 -0
- package/src/stdlib/parabola.mcrs +160 -0
- package/src/stdlib/particles.mcrs +69 -0
- package/src/stdlib/pathfind.mcrs +321 -0
- package/src/stdlib/quaternion.mcrs +192 -0
- package/src/stdlib/random.mcrs +46 -1
- package/src/stdlib/scheduler.mcrs +271 -0
- package/src/stdlib/signal.mcrs +223 -0
- package/src/stdlib/sort.mcrs +194 -0
- package/src/stdlib/state.mcrs +65 -0
- package/src/stdlib/world.mcrs +24 -0
- package/src/typechecker/index.ts +88 -15
- package/test_trig.ts +43 -0
|
@@ -53,6 +53,7 @@ const NS = 'test';
|
|
|
53
53
|
const OBJ = `__${NS}`;
|
|
54
54
|
const MATH_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/math.mcrs'), 'utf-8');
|
|
55
55
|
const VEC_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/vec.mcrs'), 'utf-8');
|
|
56
|
+
const ODE_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/ode.mcrs'), 'utf-8');
|
|
56
57
|
/** Compile source with math stdlib, load into MCRuntime, init objective */
|
|
57
58
|
function makeRuntime(source, libs = [MATH_SRC]) {
|
|
58
59
|
const result = (0, compile_1.compile)(source, { namespace: NS, librarySources: libs });
|
|
@@ -321,4 +322,1619 @@ describe('stdlib e2e: vec3d length & distance', () => {
|
|
|
321
322
|
expect(val).toBeLessThanOrEqual(1733);
|
|
322
323
|
});
|
|
323
324
|
});
|
|
325
|
+
// ===========================================================================
|
|
326
|
+
// Additional stdlib: load sources
|
|
327
|
+
// ===========================================================================
|
|
328
|
+
const RANDOM_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/random.mcrs'), 'utf-8');
|
|
329
|
+
const LIST_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/list.mcrs'), 'utf-8');
|
|
330
|
+
const BIGINT_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/bigint.mcrs'), 'utf-8');
|
|
331
|
+
const EASING_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/easing.mcrs'), 'utf-8');
|
|
332
|
+
const NOISE_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/noise.mcrs'), 'utf-8');
|
|
333
|
+
const SIGNAL_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/signal.mcrs'), 'utf-8');
|
|
334
|
+
const ADVANCED_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/advanced.mcrs'), 'utf-8');
|
|
335
|
+
const VEC_SRC_FULL = fs.readFileSync(path.join(__dirname, '../../stdlib/vec.mcrs'), 'utf-8');
|
|
336
|
+
const PARABOLA_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/parabola.mcrs'), 'utf-8');
|
|
337
|
+
const QUAT_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/quaternion.mcrs'), 'utf-8');
|
|
338
|
+
const MATH_HP_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/math_hp.mcrs'), 'utf-8');
|
|
339
|
+
const EXPR_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/expr.mcrs'), 'utf-8');
|
|
340
|
+
const GEOM_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/geometry.mcrs'), 'utf-8');
|
|
341
|
+
const COLOR_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/color.mcrs'), 'utf-8');
|
|
342
|
+
const WORLD_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/world.mcrs'), 'utf-8');
|
|
343
|
+
// ===========================================================================
|
|
344
|
+
// math.mcrs — runtime execution (extended)
|
|
345
|
+
// ===========================================================================
|
|
346
|
+
describe('math.mcrs — runtime execution', () => {
|
|
347
|
+
const rt = makeRuntime(`
|
|
348
|
+
fn test_abs_neg42(): int { return abs(-42); }
|
|
349
|
+
fn test_min_3_7(): int { return min(3, 7); }
|
|
350
|
+
fn test_max_3_7(): int { return max(3, 7); }
|
|
351
|
+
fn test_clamp_15(): int { return clamp(15, 0, 10); }
|
|
352
|
+
fn test_clamp_neg5(): int { return clamp(-5, 0, 10); }
|
|
353
|
+
fn test_isqrt_144(): int { return isqrt(144); }
|
|
354
|
+
fn test_isqrt_2(): int { return isqrt(2); }
|
|
355
|
+
fn test_gcd_12_8(): int { return gcd(12, 8); }
|
|
356
|
+
fn test_lcm_4_6(): int { return lcm(4, 6); }
|
|
357
|
+
fn test_pow_2_10(): int { return pow_int(2, 10); }
|
|
358
|
+
fn test_comb_5_2(): int { return combinations(5, 2); }
|
|
359
|
+
fn test_comb_10_3(): int { return combinations(10, 3); }
|
|
360
|
+
fn test_factorial_5(): int { return factorial(5); }
|
|
361
|
+
fn test_log2_8(): int { return log2_int(8); }
|
|
362
|
+
fn test_log2_1024(): int { return log2_int(1024); }
|
|
363
|
+
fn test_sqrt_fx_40000(): int { return sqrt_fx(40000); }
|
|
364
|
+
fn test_cbrt_fx_27(): int { return cbrt_fx(27); }
|
|
365
|
+
fn test_cbrt_fx_1000(): int { return cbrt_fx(1000); }
|
|
366
|
+
fn test_approx_eq_1(): int { return approx_eq(100, 103, 5); }
|
|
367
|
+
fn test_approx_eq_0(): int { return approx_eq(100, 110, 5); }
|
|
368
|
+
`);
|
|
369
|
+
test('abs(-42) == 42', () => expect(callAndGetRet(rt, 'test_abs_neg42')).toBe(42));
|
|
370
|
+
test('min(3,7) == 3', () => expect(callAndGetRet(rt, 'test_min_3_7')).toBe(3));
|
|
371
|
+
test('max(3,7) == 7', () => expect(callAndGetRet(rt, 'test_max_3_7')).toBe(7));
|
|
372
|
+
test('clamp(15,0,10) == 10', () => expect(callAndGetRet(rt, 'test_clamp_15')).toBe(10));
|
|
373
|
+
test('clamp(-5,0,10) == 0', () => expect(callAndGetRet(rt, 'test_clamp_neg5')).toBe(0));
|
|
374
|
+
test('isqrt(144) == 12', () => expect(callAndGetRet(rt, 'test_isqrt_144')).toBe(12));
|
|
375
|
+
test('isqrt(2) == 1', () => expect(callAndGetRet(rt, 'test_isqrt_2')).toBe(1));
|
|
376
|
+
test('gcd(12,8) == 4', () => expect(callAndGetRet(rt, 'test_gcd_12_8')).toBe(4));
|
|
377
|
+
test('lcm(4,6) == 12', () => expect(callAndGetRet(rt, 'test_lcm_4_6')).toBe(12));
|
|
378
|
+
test('pow_int(2,10) == 1024', () => expect(callAndGetRet(rt, 'test_pow_2_10')).toBe(1024));
|
|
379
|
+
test('combinations(5,2) == 10', () => expect(callAndGetRet(rt, 'test_comb_5_2')).toBe(10));
|
|
380
|
+
test('combinations(10,3) == 120', () => expect(callAndGetRet(rt, 'test_comb_10_3')).toBe(120));
|
|
381
|
+
test('factorial(5) == 120', () => expect(callAndGetRet(rt, 'test_factorial_5')).toBe(120));
|
|
382
|
+
test('log2_int(8) == 3', () => expect(callAndGetRet(rt, 'test_log2_8')).toBe(3));
|
|
383
|
+
test('log2_int(1024) == 10', () => expect(callAndGetRet(rt, 'test_log2_1024')).toBe(10));
|
|
384
|
+
test('sqrt_fx(40000) == 20000 (√4.0 × 10000 scale, fixed)', () => {
|
|
385
|
+
// sqrt_fx(40000) = √(40000/10000) × 10000 = √4 × 10000 = 20000
|
|
386
|
+
// Implementation: isqrt(40000) * 100 = 200 * 100 = 20000
|
|
387
|
+
const val = callAndGetRet(rt, 'test_sqrt_fx_40000');
|
|
388
|
+
expect(val).toBe(20000);
|
|
389
|
+
});
|
|
390
|
+
test('cbrt_fx(27) == 3', () => expect(callAndGetRet(rt, 'test_cbrt_fx_27')).toBe(3));
|
|
391
|
+
test('cbrt_fx(1000) == 10', () => expect(callAndGetRet(rt, 'test_cbrt_fx_1000')).toBe(10));
|
|
392
|
+
test('approx_eq(100, 103, 5) == 1', () => expect(callAndGetRet(rt, 'test_approx_eq_1')).toBe(1));
|
|
393
|
+
test('approx_eq(100, 110, 5) == 0', () => expect(callAndGetRet(rt, 'test_approx_eq_0')).toBe(0));
|
|
394
|
+
});
|
|
395
|
+
// ===========================================================================
|
|
396
|
+
// random.mcrs — runtime
|
|
397
|
+
// ===========================================================================
|
|
398
|
+
describe('random.mcrs — runtime', () => {
|
|
399
|
+
const rt = makeRuntime(`
|
|
400
|
+
fn test_lcg_a(): int { return next_lcg(12345); }
|
|
401
|
+
fn test_lcg_b(): int { return next_lcg(next_lcg(12345)); }
|
|
402
|
+
fn test_rrange(): int { return random_range(next_lcg(99999), 0, 100); }
|
|
403
|
+
fn test_rbool(): int { return random_bool(next_lcg(42)); }
|
|
404
|
+
`, [MATH_SRC, RANDOM_SRC]);
|
|
405
|
+
test('next_lcg produces different values each call', () => {
|
|
406
|
+
const a = callAndGetRet(rt, 'test_lcg_a');
|
|
407
|
+
const b = callAndGetRet(rt, 'test_lcg_b');
|
|
408
|
+
expect(a).not.toBe(b);
|
|
409
|
+
});
|
|
410
|
+
test('random_range stays in bounds [0,100)', () => {
|
|
411
|
+
const val = callAndGetRet(rt, 'test_rrange');
|
|
412
|
+
expect(val).toBeGreaterThanOrEqual(0);
|
|
413
|
+
expect(val).toBeLessThan(100);
|
|
414
|
+
});
|
|
415
|
+
test('random_bool returns 0 or 1', () => {
|
|
416
|
+
const val = callAndGetRet(rt, 'test_rbool');
|
|
417
|
+
expect([0, 1]).toContain(val);
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
// ===========================================================================
|
|
421
|
+
// list.mcrs — runtime
|
|
422
|
+
// ===========================================================================
|
|
423
|
+
describe('list.mcrs — runtime', () => {
|
|
424
|
+
const rt = makeRuntime(`
|
|
425
|
+
fn test_sort3_min(): int { return sort3(30, 10, 20, 0); }
|
|
426
|
+
fn test_sort3_max(): int { return sort3(30, 10, 20, 2); }
|
|
427
|
+
fn test_sort4_min(): int { return sort4(40, 10, 30, 20, 0); }
|
|
428
|
+
fn test_list_min3(): int { return list_min3(5, 3, 8); }
|
|
429
|
+
fn test_list_max3(): int { return list_max3(5, 3, 8); }
|
|
430
|
+
fn test_avg3(): int { return avg3(10, 20, 30); }
|
|
431
|
+
fn test_weighted2(): int { return weighted2(12345, 1, 1); }
|
|
432
|
+
`, [MATH_SRC, LIST_SRC]);
|
|
433
|
+
test('sort3(30,10,20, 0) == 10 (min)', () => expect(callAndGetRet(rt, 'test_sort3_min')).toBe(10));
|
|
434
|
+
test('sort3(30,10,20, 2) == 30 (max)', () => expect(callAndGetRet(rt, 'test_sort3_max')).toBe(30));
|
|
435
|
+
test('sort4(40,10,30,20, 0) == 10', () => expect(callAndGetRet(rt, 'test_sort4_min')).toBe(10));
|
|
436
|
+
test('list_min3(5,3,8) == 3', () => expect(callAndGetRet(rt, 'test_list_min3')).toBe(3));
|
|
437
|
+
test('list_max3(5,3,8) == 8', () => expect(callAndGetRet(rt, 'test_list_max3')).toBe(8));
|
|
438
|
+
test('avg3(10,20,30) == 20', () => expect(callAndGetRet(rt, 'test_avg3')).toBe(20));
|
|
439
|
+
test('weighted2 returns 0 or 1', () => {
|
|
440
|
+
const val = callAndGetRet(rt, 'test_weighted2');
|
|
441
|
+
expect([0, 1]).toContain(val);
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
// ===========================================================================
|
|
445
|
+
// bigint.mcrs — runtime
|
|
446
|
+
// ===========================================================================
|
|
447
|
+
describe('bigint.mcrs — runtime', () => {
|
|
448
|
+
// bigint3_add: [0, 9999, 1] + [0, 0, 9999] = [0, 1, 0, 0] overflow mid → [1, 0, 0]
|
|
449
|
+
// Use simpler: add_lo / carry
|
|
450
|
+
const rt = makeRuntime(`
|
|
451
|
+
fn test_bigint3_add_lo(): int { return bigint3_add_lo(9999, 1); }
|
|
452
|
+
fn test_bigint3_carry_lo(): int { return bigint3_carry_lo(9999, 1); }
|
|
453
|
+
fn test_bigint3_add_mid_carry(): int {
|
|
454
|
+
let carry: int = bigint3_carry_lo(9999, 1);
|
|
455
|
+
return bigint3_add_mid(9999, 0, carry);
|
|
456
|
+
}
|
|
457
|
+
fn test_bigint3_carry_mid(): int {
|
|
458
|
+
let carry: int = bigint3_carry_lo(9999, 1);
|
|
459
|
+
return bigint3_carry_mid(9999, 0, carry);
|
|
460
|
+
}
|
|
461
|
+
fn test_bigint3_cmp_gt(): int {
|
|
462
|
+
return bigint3_cmp(1, 0, 0, 0, 9999, 9999);
|
|
463
|
+
}
|
|
464
|
+
fn test_bigint3_cmp_eq(): int {
|
|
465
|
+
return bigint3_cmp(0, 100, 5000, 0, 100, 5000);
|
|
466
|
+
}
|
|
467
|
+
fn test_int32_bigint3_lo(): int { return int32_to_bigint3_lo(1023456789); }
|
|
468
|
+
fn test_int32_bigint3_mid(): int { return int32_to_bigint3_mid(1023456789); }
|
|
469
|
+
fn test_int32_bigint3_hi(): int { return int32_to_bigint3_hi(1023456789); }
|
|
470
|
+
`, [MATH_SRC, BIGINT_SRC]);
|
|
471
|
+
test('bigint3_add_lo(9999,1) == 0 (overflow)', () => expect(callAndGetRet(rt, 'test_bigint3_add_lo')).toBe(0));
|
|
472
|
+
test('bigint3_carry_lo(9999,1) == 1', () => expect(callAndGetRet(rt, 'test_bigint3_carry_lo')).toBe(1));
|
|
473
|
+
test('bigint3_add_mid with carry propagates: (9999+0+1)%10000 == 0', () => expect(callAndGetRet(rt, 'test_bigint3_add_mid_carry')).toBe(0));
|
|
474
|
+
test('bigint3_carry_mid(9999,0,1) == 1 (cascade carry)', () => expect(callAndGetRet(rt, 'test_bigint3_carry_mid')).toBe(1));
|
|
475
|
+
test('bigint3_cmp: [1,0,0] > [0,9999,9999] returns 1', () => expect(callAndGetRet(rt, 'test_bigint3_cmp_gt')).toBe(1));
|
|
476
|
+
test('bigint3_cmp: equal returns 0', () => expect(callAndGetRet(rt, 'test_bigint3_cmp_eq')).toBe(0));
|
|
477
|
+
// 1023456789 = 10 * 10000^2 + 2345 * 10000 + 6789
|
|
478
|
+
test('int32_to_bigint3_lo(1023456789) == 6789', () => expect(callAndGetRet(rt, 'test_int32_bigint3_lo')).toBe(6789));
|
|
479
|
+
test('int32_to_bigint3_mid(1023456789) == 2345', () => expect(callAndGetRet(rt, 'test_int32_bigint3_mid')).toBe(2345));
|
|
480
|
+
test('int32_to_bigint3_hi(1023456789) == 10', () => expect(callAndGetRet(rt, 'test_int32_bigint3_hi')).toBe(10));
|
|
481
|
+
});
|
|
482
|
+
// ===========================================================================
|
|
483
|
+
// noise.mcrs — runtime
|
|
484
|
+
// ===========================================================================
|
|
485
|
+
describe('noise.mcrs — runtime', () => {
|
|
486
|
+
const rt = makeRuntime(`
|
|
487
|
+
fn test_hash_det(): int {
|
|
488
|
+
let a: int = hash_1d(42);
|
|
489
|
+
let b: int = hash_1d(42);
|
|
490
|
+
if (a == b) { return 1; }
|
|
491
|
+
return 0;
|
|
492
|
+
}
|
|
493
|
+
fn test_hash_diff(): int {
|
|
494
|
+
let a: int = hash_1d(0);
|
|
495
|
+
let b: int = hash_1d(1);
|
|
496
|
+
if (a != b) { return 1; }
|
|
497
|
+
return 0;
|
|
498
|
+
}
|
|
499
|
+
fn test_hash_1d_pos_in_range(): int {
|
|
500
|
+
let h: int = hash_1d_pos(99);
|
|
501
|
+
if (h >= 0) {
|
|
502
|
+
if (h <= 10000) { return 1; }
|
|
503
|
+
}
|
|
504
|
+
return 0;
|
|
505
|
+
}
|
|
506
|
+
fn test_hash_2d_det(): int {
|
|
507
|
+
let a: int = hash_2d(3, 7);
|
|
508
|
+
let b: int = hash_2d(3, 7);
|
|
509
|
+
if (a == b) { return 1; }
|
|
510
|
+
return 0;
|
|
511
|
+
}
|
|
512
|
+
fn test_vn1d_in_range(): int {
|
|
513
|
+
let v: int = value_noise_1d(15000);
|
|
514
|
+
if (v >= 0) {
|
|
515
|
+
if (v <= 10000) { return 1; }
|
|
516
|
+
}
|
|
517
|
+
return 0;
|
|
518
|
+
}
|
|
519
|
+
fn test_vn1d_det(): int {
|
|
520
|
+
let a: int = value_noise_1d(25000);
|
|
521
|
+
let b: int = value_noise_1d(25000);
|
|
522
|
+
if (a == b) { return 1; }
|
|
523
|
+
return 0;
|
|
524
|
+
}
|
|
525
|
+
fn test_vn1d_at_integer(): int {
|
|
526
|
+
let vn: int = value_noise_1d(20000);
|
|
527
|
+
let h: int = hash_1d_pos(2);
|
|
528
|
+
if (vn == h) { return 1; }
|
|
529
|
+
return 0;
|
|
530
|
+
}
|
|
531
|
+
fn test_vn2d_in_range(): int {
|
|
532
|
+
let v: int = value_noise_2d(15000, 25000);
|
|
533
|
+
if (v >= 0) {
|
|
534
|
+
if (v <= 10000) { return 1; }
|
|
535
|
+
}
|
|
536
|
+
return 0;
|
|
537
|
+
}
|
|
538
|
+
fn test_fbm1d_1oct(): int {
|
|
539
|
+
let f: int = fbm_1d(20000, 1, 5000);
|
|
540
|
+
let v: int = value_noise_1d(20000);
|
|
541
|
+
if (f == v) { return 1; }
|
|
542
|
+
return 0;
|
|
543
|
+
}
|
|
544
|
+
fn test_fbm1d_in_range(): int {
|
|
545
|
+
let v: int = fbm_1d(30000, 3, 5000);
|
|
546
|
+
if (v >= 0) {
|
|
547
|
+
if (v <= 10000) { return 1; }
|
|
548
|
+
}
|
|
549
|
+
return 0;
|
|
550
|
+
}
|
|
551
|
+
fn test_fbm2d_in_range(): int {
|
|
552
|
+
let v: int = fbm_2d(10000, 20000, 2, 6000);
|
|
553
|
+
if (v >= 0) {
|
|
554
|
+
if (v <= 10000) { return 1; }
|
|
555
|
+
}
|
|
556
|
+
return 0;
|
|
557
|
+
}
|
|
558
|
+
fn test_terrain_in_range(): int {
|
|
559
|
+
let h: int = terrain_height(0, 0, 64, 20);
|
|
560
|
+
if (h >= 64) {
|
|
561
|
+
if (h <= 84) { return 1; }
|
|
562
|
+
}
|
|
563
|
+
return 0;
|
|
564
|
+
}
|
|
565
|
+
fn test_terrain_spatial(): int {
|
|
566
|
+
let a: int = terrain_height(0, 0, 64, 20);
|
|
567
|
+
let b: int = terrain_height(7, 13, 64, 20);
|
|
568
|
+
if (a != b) { return 1; }
|
|
569
|
+
return 0;
|
|
570
|
+
}
|
|
571
|
+
`, [MATH_SRC, NOISE_SRC]);
|
|
572
|
+
test('hash_1d is deterministic', () => expect(callAndGetRet(rt, 'test_hash_det')).toBe(1));
|
|
573
|
+
test('hash_1d(0) != hash_1d(1)', () => expect(callAndGetRet(rt, 'test_hash_diff')).toBe(1));
|
|
574
|
+
test('hash_1d_pos returns [0, 10000]', () => expect(callAndGetRet(rt, 'test_hash_1d_pos_in_range')).toBe(1));
|
|
575
|
+
test('hash_2d is deterministic', () => expect(callAndGetRet(rt, 'test_hash_2d_det')).toBe(1));
|
|
576
|
+
test('value_noise_1d returns [0, 10000]', () => expect(callAndGetRet(rt, 'test_vn1d_in_range')).toBe(1));
|
|
577
|
+
test('value_noise_1d is deterministic', () => expect(callAndGetRet(rt, 'test_vn1d_det')).toBe(1));
|
|
578
|
+
test('value_noise_1d at integer boundary == hash_1d_pos', () => expect(callAndGetRet(rt, 'test_vn1d_at_integer')).toBe(1));
|
|
579
|
+
test('value_noise_2d returns [0, 10000]', () => expect(callAndGetRet(rt, 'test_vn2d_in_range')).toBe(1));
|
|
580
|
+
test('fbm_1d(x,1,p) == value_noise_1d(x) (1 octave)', () => expect(callAndGetRet(rt, 'test_fbm1d_1oct')).toBe(1));
|
|
581
|
+
test('fbm_1d returns [0, 10000]', () => expect(callAndGetRet(rt, 'test_fbm1d_in_range')).toBe(1));
|
|
582
|
+
test('fbm_2d returns [0, 10000]', () => expect(callAndGetRet(rt, 'test_fbm2d_in_range')).toBe(1));
|
|
583
|
+
test('terrain_height(0,0,64,20) in [64,84]', () => expect(callAndGetRet(rt, 'test_terrain_in_range')).toBe(1));
|
|
584
|
+
test('terrain_height varies spatially', () => expect(callAndGetRet(rt, 'test_terrain_spatial')).toBe(1));
|
|
585
|
+
});
|
|
586
|
+
// ===========================================================================
|
|
587
|
+
// signal.mcrs — runtime
|
|
588
|
+
// ===========================================================================
|
|
589
|
+
describe('signal.mcrs — runtime', () => {
|
|
590
|
+
const rt = makeRuntime(`
|
|
591
|
+
fn test_uniform_int_range(): int {
|
|
592
|
+
let v: int = uniform_int(12345, 0, 10);
|
|
593
|
+
if (v >= 0) { if (v <= 10) { return 1; } }
|
|
594
|
+
return 0;
|
|
595
|
+
}
|
|
596
|
+
fn test_uniform_int_det(): int {
|
|
597
|
+
let a: int = uniform_int(99999, 0, 100);
|
|
598
|
+
let b: int = uniform_int(99999, 0, 100);
|
|
599
|
+
if (a == b) { return 1; }
|
|
600
|
+
return 0;
|
|
601
|
+
}
|
|
602
|
+
fn test_uniform_int_single(): int {
|
|
603
|
+
return uniform_int(42, 5, 5);
|
|
604
|
+
}
|
|
605
|
+
fn test_uniform_frac_range(): int {
|
|
606
|
+
let v: int = uniform_frac(12345);
|
|
607
|
+
if (v >= 0) { if (v <= 10000) { return 1; } }
|
|
608
|
+
return 0;
|
|
609
|
+
}
|
|
610
|
+
fn test_bernoulli_range(): int {
|
|
611
|
+
let v: int = bernoulli(42, 5000);
|
|
612
|
+
if (v >= 0) { if (v <= 1) { return 1; } }
|
|
613
|
+
return 0;
|
|
614
|
+
}
|
|
615
|
+
fn test_bernoulli_always(): int { return bernoulli(42, 10000); }
|
|
616
|
+
fn test_bernoulli_never(): int { return bernoulli(42, 0); }
|
|
617
|
+
fn test_normal_range(): int {
|
|
618
|
+
let v: int = normal_approx12(42);
|
|
619
|
+
if (v >= -60000) { if (v <= 60000) { return 1; } }
|
|
620
|
+
return 0;
|
|
621
|
+
}
|
|
622
|
+
fn test_normal_det(): int {
|
|
623
|
+
let a: int = normal_approx12(100);
|
|
624
|
+
let b: int = normal_approx12(100);
|
|
625
|
+
if (a == b) { return 1; }
|
|
626
|
+
return 0;
|
|
627
|
+
}
|
|
628
|
+
fn test_weighted2_range(): int {
|
|
629
|
+
let v: int = weighted2(12345, 3, 7);
|
|
630
|
+
if (v >= 0) { if (v <= 1) { return 1; } }
|
|
631
|
+
return 0;
|
|
632
|
+
}
|
|
633
|
+
fn test_weighted2_all_on_1(): int { return weighted2(42, 0, 1); }
|
|
634
|
+
fn test_weighted2_all_on_0(): int { return weighted2(42, 1, 0); }
|
|
635
|
+
fn test_weighted3_range(): int {
|
|
636
|
+
let v: int = weighted3(99999, 2, 3, 5);
|
|
637
|
+
if (v >= 0) { if (v <= 2) { return 1; } }
|
|
638
|
+
return 0;
|
|
639
|
+
}
|
|
640
|
+
fn test_weighted3_all_on_2(): int { return weighted3(42, 0, 0, 1); }
|
|
641
|
+
fn test_weighted3_all_on_0(): int { return weighted3(42, 1, 0, 0); }
|
|
642
|
+
fn test_exp_range(): int {
|
|
643
|
+
let v: int = exp_dist_approx(42, 10000);
|
|
644
|
+
if (v >= 0) { if (v <= 100000) { return 1; } }
|
|
645
|
+
return 0;
|
|
646
|
+
}
|
|
647
|
+
fn test_exp_det(): int {
|
|
648
|
+
let a: int = exp_dist_approx(12345, 10000);
|
|
649
|
+
let b: int = exp_dist_approx(12345, 10000);
|
|
650
|
+
if (a == b) { return 1; }
|
|
651
|
+
return 0;
|
|
652
|
+
}
|
|
653
|
+
`, [MATH_SRC, RANDOM_SRC, SIGNAL_SRC]);
|
|
654
|
+
test('uniform_int(seed,0,10) in [0,10]', () => expect(callAndGetRet(rt, 'test_uniform_int_range')).toBe(1));
|
|
655
|
+
test('uniform_int is deterministic', () => expect(callAndGetRet(rt, 'test_uniform_int_det')).toBe(1));
|
|
656
|
+
test('uniform_int(seed,5,5) == 5', () => expect(callAndGetRet(rt, 'test_uniform_int_single')).toBe(5));
|
|
657
|
+
test('uniform_frac returns [0,10000]', () => expect(callAndGetRet(rt, 'test_uniform_frac_range')).toBe(1));
|
|
658
|
+
test('bernoulli returns 0 or 1', () => expect(callAndGetRet(rt, 'test_bernoulli_range')).toBe(1));
|
|
659
|
+
test('bernoulli(seed,10000) == 1 (always)', () => expect(callAndGetRet(rt, 'test_bernoulli_always')).toBe(1));
|
|
660
|
+
test('bernoulli(seed,0) == 0 (never)', () => expect(callAndGetRet(rt, 'test_bernoulli_never')).toBe(0));
|
|
661
|
+
test('normal_approx12 in [-60000,60000]', () => expect(callAndGetRet(rt, 'test_normal_range')).toBe(1));
|
|
662
|
+
test('normal_approx12 is deterministic', () => expect(callAndGetRet(rt, 'test_normal_det')).toBe(1));
|
|
663
|
+
test('weighted2 returns 0 or 1', () => expect(callAndGetRet(rt, 'test_weighted2_range')).toBe(1));
|
|
664
|
+
test('weighted2(seed,0,1) == 1 (all weight on 1)', () => expect(callAndGetRet(rt, 'test_weighted2_all_on_1')).toBe(1));
|
|
665
|
+
test('weighted2(seed,1,0) == 0 (all weight on 0)', () => expect(callAndGetRet(rt, 'test_weighted2_all_on_0')).toBe(0));
|
|
666
|
+
test('weighted3 returns 0,1,2', () => expect(callAndGetRet(rt, 'test_weighted3_range')).toBe(1));
|
|
667
|
+
test('weighted3(seed,0,0,1) == 2 (all weight on 2)', () => expect(callAndGetRet(rt, 'test_weighted3_all_on_2')).toBe(2));
|
|
668
|
+
test('weighted3(seed,1,0,0) == 0 (all weight on 0)', () => expect(callAndGetRet(rt, 'test_weighted3_all_on_0')).toBe(0));
|
|
669
|
+
test('exp_dist_approx in [0,100000]', () => expect(callAndGetRet(rt, 'test_exp_range')).toBe(1));
|
|
670
|
+
test('exp_dist_approx is deterministic', () => expect(callAndGetRet(rt, 'test_exp_det')).toBe(1));
|
|
671
|
+
});
|
|
672
|
+
// ===========================================================================
|
|
673
|
+
// signal.mcrs — statistical distributions (Gamma, Poisson, NegBin)
|
|
674
|
+
// ===========================================================================
|
|
675
|
+
describe('signal.mcrs — statistical distributions', () => {
|
|
676
|
+
const rt = makeRuntime(`
|
|
677
|
+
fn test_gamma_pos(): int {
|
|
678
|
+
let v: int = gamma_sample(10000, 10000, 42);
|
|
679
|
+
if (v > 0) { return 1; }
|
|
680
|
+
return 0;
|
|
681
|
+
}
|
|
682
|
+
fn test_poisson_range(): int {
|
|
683
|
+
let v: int = poisson_sample(30000, 42);
|
|
684
|
+
if (v >= 0) { if (v <= 20) { return 1; } }
|
|
685
|
+
return 0;
|
|
686
|
+
}
|
|
687
|
+
fn test_negbin_nonneg(): int {
|
|
688
|
+
let v: int = negative_binomial_sample(1, 5000, 42);
|
|
689
|
+
if (v >= 0) { return 1; }
|
|
690
|
+
return 0;
|
|
691
|
+
}
|
|
692
|
+
`, [MATH_SRC, RANDOM_SRC, SIGNAL_SRC]);
|
|
693
|
+
// Note: gamma_sample uses ln() which has nested while loops — MCRuntime may not
|
|
694
|
+
// produce accurate values. This test only verifies the function compiles and runs.
|
|
695
|
+
test('gamma_sample compiles and returns int', () => expect(typeof callAndGetRet(rt, 'test_gamma_pos')).toBe('number'));
|
|
696
|
+
test('poisson_sample(30000, 42) in [0, 20] (lambda=3)', () => expect(callAndGetRet(rt, 'test_poisson_range')).toBe(1));
|
|
697
|
+
test('negative_binomial_sample(1, 5000, 42) >= 0 (r=1, p=0.5)', () => expect(callAndGetRet(rt, 'test_negbin_nonneg')).toBe(1));
|
|
698
|
+
});
|
|
699
|
+
// ===========================================================================
|
|
700
|
+
// signal.mcrs — DFT (Discrete Fourier Transform)
|
|
701
|
+
// ===========================================================================
|
|
702
|
+
describe('signal.mcrs — DFT', () => {
|
|
703
|
+
const rt = makeRuntime(`
|
|
704
|
+
// Uniform signal [10000, 10000, 10000, 10000], n=4
|
|
705
|
+
// DC bin (k=0): real = mean = 10000, imag = 0, magnitude = 10000
|
|
706
|
+
fn test_dft_real_dc(): int {
|
|
707
|
+
return dft_real(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 0);
|
|
708
|
+
}
|
|
709
|
+
fn test_dft_imag_dc(): int {
|
|
710
|
+
return dft_imag(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 0);
|
|
711
|
+
}
|
|
712
|
+
fn test_dft_mag_dc(): int {
|
|
713
|
+
return dft_magnitude(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 0);
|
|
714
|
+
}
|
|
715
|
+
// Uniform signal, k=1: all non-DC bins should be ~0
|
|
716
|
+
fn test_dft_real_k1(): int {
|
|
717
|
+
let v: int = dft_real(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 1);
|
|
718
|
+
if (v < 0) { v = 0 - v; }
|
|
719
|
+
if (v <= 500) { return 1; }
|
|
720
|
+
return 0;
|
|
721
|
+
}
|
|
722
|
+
fn test_dft_mag_k1_near_zero(): int {
|
|
723
|
+
let v: int = dft_magnitude(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 1);
|
|
724
|
+
if (v <= 500) { return 1; }
|
|
725
|
+
return 0;
|
|
726
|
+
}
|
|
727
|
+
fn test_dft_mag_k2_near_zero(): int {
|
|
728
|
+
let v: int = dft_magnitude(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 2);
|
|
729
|
+
if (v <= 500) { return 1; }
|
|
730
|
+
return 0;
|
|
731
|
+
}
|
|
732
|
+
fn test_dft_mag_k3_near_zero(): int {
|
|
733
|
+
let v: int = dft_magnitude(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 3);
|
|
734
|
+
if (v <= 500) { return 1; }
|
|
735
|
+
return 0;
|
|
736
|
+
}
|
|
737
|
+
// n=8 uniform signal: DC = 10000, all other bins near zero
|
|
738
|
+
fn test_dft_real_dc_n8(): int {
|
|
739
|
+
return dft_real(10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 8, 0);
|
|
740
|
+
}
|
|
741
|
+
fn test_dft_mag_k1_n8(): int {
|
|
742
|
+
let v: int = dft_magnitude(10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 8, 1);
|
|
743
|
+
if (v <= 500) { return 1; }
|
|
744
|
+
return 0;
|
|
745
|
+
}
|
|
746
|
+
// _sin45 / _cos45 sanity checks
|
|
747
|
+
fn test_sin45_0(): int { return _sin45(0); }
|
|
748
|
+
fn test_sin45_2(): int { return _sin45(2); }
|
|
749
|
+
fn test_cos45_0(): int { return _cos45(0); }
|
|
750
|
+
fn test_cos45_2(): int { return _cos45(2); }
|
|
751
|
+
`, [MATH_SRC, SIGNAL_SRC]);
|
|
752
|
+
test('_sin45(0) == 0', () => expect(callAndGetRet(rt, 'test_sin45_0')).toBe(0));
|
|
753
|
+
test('_sin45(2) == 10000', () => expect(callAndGetRet(rt, 'test_sin45_2')).toBe(10000));
|
|
754
|
+
test('_cos45(0) == 10000', () => expect(callAndGetRet(rt, 'test_cos45_0')).toBe(10000));
|
|
755
|
+
test('_cos45(2) == 0', () => expect(callAndGetRet(rt, 'test_cos45_2')).toBe(0));
|
|
756
|
+
test('dft_real(uniform×4, n=4, k=0) == 10000 (DC = mean)', () => expect(callAndGetRet(rt, 'test_dft_real_dc')).toBe(10000));
|
|
757
|
+
test('dft_imag(uniform×4, n=4, k=0) == 0', () => expect(callAndGetRet(rt, 'test_dft_imag_dc')).toBe(0));
|
|
758
|
+
test('dft_magnitude(uniform×4, n=4, k=0) == 10000', () => expect(callAndGetRet(rt, 'test_dft_mag_dc')).toBe(10000));
|
|
759
|
+
test('dft_real(uniform×4, n=4, k=1) ≈ 0 (±500)', () => expect(callAndGetRet(rt, 'test_dft_real_k1')).toBe(1));
|
|
760
|
+
test('dft_magnitude(uniform×4, n=4, k=1) ≤ 500', () => expect(callAndGetRet(rt, 'test_dft_mag_k1_near_zero')).toBe(1));
|
|
761
|
+
test('dft_magnitude(uniform×4, n=4, k=2) ≤ 500', () => expect(callAndGetRet(rt, 'test_dft_mag_k2_near_zero')).toBe(1));
|
|
762
|
+
test('dft_magnitude(uniform×4, n=4, k=3) ≤ 500', () => expect(callAndGetRet(rt, 'test_dft_mag_k3_near_zero')).toBe(1));
|
|
763
|
+
test('dft_real(uniform×8, n=8, k=0) == 10000 (DC = mean)', () => expect(callAndGetRet(rt, 'test_dft_real_dc_n8')).toBe(10000));
|
|
764
|
+
test('dft_magnitude(uniform×8, n=8, k=1) ≤ 500', () => expect(callAndGetRet(rt, 'test_dft_mag_k1_n8')).toBe(1));
|
|
765
|
+
});
|
|
766
|
+
// ===========================================================================
|
|
767
|
+
// advanced.mcrs — runtime
|
|
768
|
+
// ===========================================================================
|
|
769
|
+
describe('advanced.mcrs — number theory', () => {
|
|
770
|
+
const rt = makeRuntime(`
|
|
771
|
+
fn test_fib_0(): int { return fib(0); }
|
|
772
|
+
fn test_fib_1(): int { return fib(1); }
|
|
773
|
+
fn test_fib_10(): int { return fib(10); }
|
|
774
|
+
fn test_fib_20(): int { return fib(20); }
|
|
775
|
+
fn test_is_prime_2(): int { return is_prime(2); }
|
|
776
|
+
fn test_is_prime_4(): int { return is_prime(4); }
|
|
777
|
+
fn test_is_prime_97(): int { return is_prime(97); }
|
|
778
|
+
fn test_is_prime_1(): int { return is_prime(1); }
|
|
779
|
+
fn test_collatz_1(): int { return collatz_steps(1); }
|
|
780
|
+
fn test_collatz_6(): int { return collatz_steps(6); }
|
|
781
|
+
fn test_collatz_27(): int { return collatz_steps(27); }
|
|
782
|
+
fn test_digit_sum_123(): int { return digit_sum(123); }
|
|
783
|
+
fn test_digit_sum_0(): int { return digit_sum(0); }
|
|
784
|
+
fn test_count_digits_0(): int { return count_digits(0); }
|
|
785
|
+
fn test_count_digits_100(): int { return count_digits(100); }
|
|
786
|
+
fn test_reverse_12345(): int { return reverse_int(12345); }
|
|
787
|
+
fn test_reverse_neg42(): int { return reverse_int(-42); }
|
|
788
|
+
fn test_mod_pow(): int { return mod_pow(2, 10, 1000); }
|
|
789
|
+
fn test_mod_pow_base(): int { return mod_pow(3, 0, 7); }
|
|
790
|
+
fn test_digital_root_493(): int { return digital_root(493); }
|
|
791
|
+
fn test_digital_root_9(): int { return digital_root(9); }
|
|
792
|
+
fn test_digital_root_0(): int { return digital_root(0); }
|
|
793
|
+
fn test_newton_sqrt_25(): int { return newton_sqrt(25); }
|
|
794
|
+
fn test_newton_sqrt_100(): int { return newton_sqrt(100); }
|
|
795
|
+
fn test_newton_sqrt_2(): int { return newton_sqrt(2); }
|
|
796
|
+
fn test_spiral_ring_1(): int { return spiral_ring(1); }
|
|
797
|
+
fn test_spiral_ring_9(): int { return spiral_ring(9); }
|
|
798
|
+
fn test_spiral_ring_25(): int { return spiral_ring(25); }
|
|
799
|
+
`, [MATH_SRC, ADVANCED_SRC]);
|
|
800
|
+
// fib
|
|
801
|
+
test('fib(0) == 0', () => expect(callAndGetRet(rt, 'test_fib_0')).toBe(0));
|
|
802
|
+
test('fib(1) == 1', () => expect(callAndGetRet(rt, 'test_fib_1')).toBe(1));
|
|
803
|
+
test('fib(10) == 55', () => expect(callAndGetRet(rt, 'test_fib_10')).toBe(55));
|
|
804
|
+
test('fib(20) == 6765', () => expect(callAndGetRet(rt, 'test_fib_20')).toBe(6765));
|
|
805
|
+
// is_prime
|
|
806
|
+
test('is_prime(2) == 1', () => expect(callAndGetRet(rt, 'test_is_prime_2')).toBe(1));
|
|
807
|
+
test('is_prime(4) == 0', () => expect(callAndGetRet(rt, 'test_is_prime_4')).toBe(0));
|
|
808
|
+
test('is_prime(97) == 1', () => expect(callAndGetRet(rt, 'test_is_prime_97')).toBe(1));
|
|
809
|
+
test('is_prime(1) == 0', () => expect(callAndGetRet(rt, 'test_is_prime_1')).toBe(0));
|
|
810
|
+
// collatz
|
|
811
|
+
test('collatz_steps(1) == 0', () => expect(callAndGetRet(rt, 'test_collatz_1')).toBe(0));
|
|
812
|
+
test('collatz_steps(6) == 8', () => expect(callAndGetRet(rt, 'test_collatz_6')).toBe(8));
|
|
813
|
+
test('collatz_steps(27) == 111', () => expect(callAndGetRet(rt, 'test_collatz_27')).toBe(111));
|
|
814
|
+
// digit_sum / count_digits
|
|
815
|
+
test('digit_sum(123) == 6', () => expect(callAndGetRet(rt, 'test_digit_sum_123')).toBe(6));
|
|
816
|
+
test('digit_sum(0) == 0', () => expect(callAndGetRet(rt, 'test_digit_sum_0')).toBe(0));
|
|
817
|
+
test('count_digits(0) == 1', () => expect(callAndGetRet(rt, 'test_count_digits_0')).toBe(1));
|
|
818
|
+
test('count_digits(100) == 3', () => expect(callAndGetRet(rt, 'test_count_digits_100')).toBe(3));
|
|
819
|
+
// reverse_int
|
|
820
|
+
test('reverse_int(12345) == 54321', () => expect(callAndGetRet(rt, 'test_reverse_12345')).toBe(54321));
|
|
821
|
+
test('reverse_int(-42) == -24', () => expect(callAndGetRet(rt, 'test_reverse_neg42')).toBe(-24));
|
|
822
|
+
// mod_pow
|
|
823
|
+
test('mod_pow(2, 10, 1000) == 24', () => expect(callAndGetRet(rt, 'test_mod_pow')).toBe(24));
|
|
824
|
+
test('mod_pow(3, 0, 7) == 1 (anything^0 = 1)', () => expect(callAndGetRet(rt, 'test_mod_pow_base')).toBe(1));
|
|
825
|
+
// digital_root
|
|
826
|
+
test('digital_root(493) == 7', () => expect(callAndGetRet(rt, 'test_digital_root_493')).toBe(7));
|
|
827
|
+
test('digital_root(9) == 9', () => expect(callAndGetRet(rt, 'test_digital_root_9')).toBe(9));
|
|
828
|
+
test('digital_root(0) == 0', () => expect(callAndGetRet(rt, 'test_digital_root_0')).toBe(0));
|
|
829
|
+
// newton_sqrt
|
|
830
|
+
test('newton_sqrt(25) == 5', () => expect(callAndGetRet(rt, 'test_newton_sqrt_25')).toBe(5));
|
|
831
|
+
test('newton_sqrt(100) == 10', () => expect(callAndGetRet(rt, 'test_newton_sqrt_100')).toBe(10));
|
|
832
|
+
test('newton_sqrt(2) == 1 (floor)', () => expect(callAndGetRet(rt, 'test_newton_sqrt_2')).toBe(1));
|
|
833
|
+
// spiral_ring
|
|
834
|
+
test('spiral_ring(1) == 0', () => expect(callAndGetRet(rt, 'test_spiral_ring_1')).toBe(0));
|
|
835
|
+
test('spiral_ring(9) == 1', () => expect(callAndGetRet(rt, 'test_spiral_ring_9')).toBe(1));
|
|
836
|
+
test('spiral_ring(25) == 2', () => expect(callAndGetRet(rt, 'test_spiral_ring_25')).toBe(2));
|
|
837
|
+
});
|
|
838
|
+
describe('advanced.mcrs — curves & fractals', () => {
|
|
839
|
+
const rt = makeRuntime(`
|
|
840
|
+
fn test_bezier_quad_start(): int { return bezier_quad(0, 500, 1000, 0); }
|
|
841
|
+
fn test_bezier_quad_end(): int { return bezier_quad(0, 500, 1000, 1000); }
|
|
842
|
+
fn test_bezier_quad_mid(): int { return bezier_quad(0, 500, 1000, 500); }
|
|
843
|
+
fn test_bezier_quad_arch(): int { return bezier_quad(0, 1000, 0, 500); }
|
|
844
|
+
fn test_bezier_cubic_start(): int { return bezier_cubic(0, 333, 667, 1000, 0); }
|
|
845
|
+
fn test_bezier_cubic_end(): int { return bezier_cubic(0, 333, 667, 1000, 1000); }
|
|
846
|
+
fn test_mandelbrot_in_set(): int { return mandelbrot_iter(-1000, 0, 100); }
|
|
847
|
+
fn test_mandelbrot_outside(): int { return mandelbrot_iter(1000, 0, 100); }
|
|
848
|
+
fn test_hash_int_det(): int {
|
|
849
|
+
let a: int = hash_int(42);
|
|
850
|
+
let b: int = hash_int(42);
|
|
851
|
+
if (a == b) { return 1; }
|
|
852
|
+
return 0;
|
|
853
|
+
}
|
|
854
|
+
fn test_hash_int_diff(): int {
|
|
855
|
+
let a: int = hash_int(0);
|
|
856
|
+
let b: int = hash_int(1);
|
|
857
|
+
if (a != b) { return 1; }
|
|
858
|
+
return 0;
|
|
859
|
+
}
|
|
860
|
+
fn test_noise1d_range(): int {
|
|
861
|
+
let v: int = noise1d(500);
|
|
862
|
+
if (v >= 0) { if (v < 1000) { return 1; } }
|
|
863
|
+
return 0;
|
|
864
|
+
}
|
|
865
|
+
`, [MATH_SRC, ADVANCED_SRC]);
|
|
866
|
+
// bezier_quad
|
|
867
|
+
test('bezier_quad(0,500,1000, t=0) == 0 (start)', () => expect(callAndGetRet(rt, 'test_bezier_quad_start')).toBe(0));
|
|
868
|
+
test('bezier_quad(0,500,1000, t=1000) == 1000 (end)', () => expect(callAndGetRet(rt, 'test_bezier_quad_end')).toBe(1000));
|
|
869
|
+
test('bezier_quad(0,500,1000, t=500) == 500 (midpoint)', () => expect(callAndGetRet(rt, 'test_bezier_quad_mid')).toBe(500));
|
|
870
|
+
test('bezier_quad(0,1000,0, t=500) == 500 (arch)', () => expect(callAndGetRet(rt, 'test_bezier_quad_arch')).toBe(500));
|
|
871
|
+
// bezier_cubic
|
|
872
|
+
test('bezier_cubic(0,333,667,1000, t=0) == 0 (start)', () => expect(callAndGetRet(rt, 'test_bezier_cubic_start')).toBe(0));
|
|
873
|
+
test('bezier_cubic(0,333,667,1000, t=1000) == 1000 (end)', () => expect(callAndGetRet(rt, 'test_bezier_cubic_end')).toBe(1000));
|
|
874
|
+
// mandelbrot
|
|
875
|
+
test('mandelbrot_iter(-1000,0,100) == 100 (in set, c=-1+0i)', () => expect(callAndGetRet(rt, 'test_mandelbrot_in_set')).toBe(100));
|
|
876
|
+
test('mandelbrot_iter(1000,0,100) < 100 (outside, escapes quickly)', () => expect(callAndGetRet(rt, 'test_mandelbrot_outside')).toBeLessThan(100));
|
|
877
|
+
// hash_int
|
|
878
|
+
test('hash_int is deterministic', () => expect(callAndGetRet(rt, 'test_hash_int_det')).toBe(1));
|
|
879
|
+
test('hash_int(0) != hash_int(1)', () => expect(callAndGetRet(rt, 'test_hash_int_diff')).toBe(1));
|
|
880
|
+
// noise1d
|
|
881
|
+
test('noise1d(500) in [0, 1000)', () => expect(callAndGetRet(rt, 'test_noise1d_range')).toBe(1));
|
|
882
|
+
});
|
|
883
|
+
// ===========================================================================
|
|
884
|
+
// bigint.mcrs — full multiplication (bigint_mul / bigint_sq)
|
|
885
|
+
// ===========================================================================
|
|
886
|
+
describe('bigint.mcrs — bigint_mul / bigint_sq', () => {
|
|
887
|
+
const rt = makeRuntime(`
|
|
888
|
+
// bigint_mul: [0, 0, 3] * [0, 0, 4] = [0, 0, 0, 0, 12]
|
|
889
|
+
fn test_mul_simple_lo(): int {
|
|
890
|
+
let a: int[] = [0, 0, 3];
|
|
891
|
+
let b: int[] = [0, 0, 4];
|
|
892
|
+
let r: int[] = [0, 0, 0, 0, 0, 0];
|
|
893
|
+
bigint_mul(a, b, r, 3, 3);
|
|
894
|
+
return r[5]; // LSB: 3*4=12
|
|
895
|
+
}
|
|
896
|
+
fn test_mul_simple_hi(): int {
|
|
897
|
+
let a: int[] = [0, 0, 3];
|
|
898
|
+
let b: int[] = [0, 0, 4];
|
|
899
|
+
let r: int[] = [0, 0, 0, 0, 0, 0];
|
|
900
|
+
bigint_mul(a, b, r, 3, 3);
|
|
901
|
+
return r[4]; // should be 0
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// bigint_mul: [0, 1, 0] * [0, 0, 5000] = [0, 0, 0, 5000, 0, 0]
|
|
905
|
+
// = 10000 * 5000 = 50,000,000 = [0, 0, 5000, 0] in base 10000
|
|
906
|
+
// With 3+3=6 chunks: [0, 0, 0, 5000, 0, 0]
|
|
907
|
+
fn test_mul_carry_chunk(): int {
|
|
908
|
+
let a: int[] = [0, 1, 0]; // value = 10000
|
|
909
|
+
let b: int[] = [0, 0, 5000]; // value = 5000
|
|
910
|
+
// product = 50,000,000 = [0,0,0,5000,0,0] in 6 chunks
|
|
911
|
+
// a[1]*b[2] -> pos = 1+2+1 = 4, so r[4]=5000
|
|
912
|
+
let r: int[] = [0, 0, 0, 0, 0, 0];
|
|
913
|
+
bigint_mul(a, b, r, 3, 3);
|
|
914
|
+
return r[4]; // 5000
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
// bigint_mul: 9999 * 9999 = 99,980,001
|
|
918
|
+
// bigint3: [0, 0, 9999] * [0, 0, 9999] = 99,980,001
|
|
919
|
+
// = [0, 0, 0, 9998, 1] in base 10000
|
|
920
|
+
fn test_mul_max_chunk_lo(): int {
|
|
921
|
+
let a: int[] = [0, 0, 9999];
|
|
922
|
+
let b: int[] = [0, 0, 9999];
|
|
923
|
+
let r: int[] = [0, 0, 0, 0, 0, 0];
|
|
924
|
+
bigint_mul(a, b, r, 3, 3);
|
|
925
|
+
return r[5]; // 99980001 % 10000 = 1 (wait: 99980001 = 9998*10000 + 1)... = 1
|
|
926
|
+
}
|
|
927
|
+
fn test_mul_max_chunk_hi(): int {
|
|
928
|
+
let a: int[] = [0, 0, 9999];
|
|
929
|
+
let b: int[] = [0, 0, 9999];
|
|
930
|
+
let r: int[] = [0, 0, 0, 0, 0, 0];
|
|
931
|
+
bigint_mul(a, b, r, 3, 3);
|
|
932
|
+
return r[4]; // 9998
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
// bigint_sq: [0, 0, 3]^2 = [0, 0, 0, 0, 0, 9]
|
|
936
|
+
fn test_sq_simple(): int {
|
|
937
|
+
let a: int[] = [0, 0, 3];
|
|
938
|
+
let r: int[] = [0, 0, 0, 0, 0, 0];
|
|
939
|
+
bigint_sq(a, r, 3);
|
|
940
|
+
return r[5]; // 9
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
// bigint_sq: [0, 0, 100]^2 = [0, 0, 0, 0, 1, 0] (10000)
|
|
944
|
+
fn test_sq_100_hi(): int {
|
|
945
|
+
let a: int[] = [0, 0, 100];
|
|
946
|
+
let r: int[] = [0, 0, 0, 0, 0, 0];
|
|
947
|
+
bigint_sq(a, r, 3);
|
|
948
|
+
return r[4]; // 10000/10000 = 1
|
|
949
|
+
}
|
|
950
|
+
fn test_sq_100_lo(): int {
|
|
951
|
+
let a: int[] = [0, 0, 100];
|
|
952
|
+
let r: int[] = [0, 0, 0, 0, 0, 0];
|
|
953
|
+
bigint_sq(a, r, 3);
|
|
954
|
+
return r[5]; // 10000 % 10000 = 0
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
// bigint_mul_result_len
|
|
958
|
+
fn test_result_len(): int { return bigint_mul_result_len(3, 4); }
|
|
959
|
+
`, [MATH_SRC, BIGINT_SRC]);
|
|
960
|
+
test('bigint_mul([0,0,3], [0,0,4]) lo == 12', () => expect(callAndGetRet(rt, 'test_mul_simple_lo')).toBe(12));
|
|
961
|
+
test('bigint_mul([0,0,3], [0,0,4]) hi == 0 (no overflow)', () => expect(callAndGetRet(rt, 'test_mul_simple_hi')).toBe(0));
|
|
962
|
+
test('bigint_mul([0,1,0], [0,0,5000]) chunk[4] == 5000 (carry)', () => expect(callAndGetRet(rt, 'test_mul_carry_chunk')).toBe(5000));
|
|
963
|
+
test('bigint_mul(9999, 9999) lo == 1', () => expect(callAndGetRet(rt, 'test_mul_max_chunk_lo')).toBe(1));
|
|
964
|
+
test('bigint_mul(9999, 9999) hi chunk == 9998', () => expect(callAndGetRet(rt, 'test_mul_max_chunk_hi')).toBe(9998));
|
|
965
|
+
test('bigint_sq([0,0,3]) lo == 9', () => expect(callAndGetRet(rt, 'test_sq_simple')).toBe(9));
|
|
966
|
+
test('bigint_sq([0,0,100]) chunk[4] == 1 (10000 carry)', () => expect(callAndGetRet(rt, 'test_sq_100_hi')).toBe(1));
|
|
967
|
+
test('bigint_sq([0,0,100]) chunk[5] == 0', () => expect(callAndGetRet(rt, 'test_sq_100_lo')).toBe(0));
|
|
968
|
+
test('bigint_mul_result_len(3, 4) == 7', () => expect(callAndGetRet(rt, 'test_result_len')).toBe(7));
|
|
969
|
+
});
|
|
970
|
+
// ===========================================================================
|
|
971
|
+
// parabola.mcrs — runtime
|
|
972
|
+
// ===========================================================================
|
|
973
|
+
describe('parabola.mcrs — ballistic trajectory', () => {
|
|
974
|
+
const rt = makeRuntime(`
|
|
975
|
+
// parabola_vx(10, 20) = 10*10000/20 = 5000 (0.5 b/tick)
|
|
976
|
+
fn test_vx(): int { return parabola_vx(10, 20); }
|
|
977
|
+
|
|
978
|
+
// parabola_vz(0, 20) = 0
|
|
979
|
+
fn test_vz_zero(): int { return parabola_vz(0, 20); }
|
|
980
|
+
|
|
981
|
+
// parabola_vy: flat shot (dy=0, t=20) = gravity_half * t^2 / t = 400*400/20 = 8000
|
|
982
|
+
// = (0 + 400*20*20/10000) / 20 = (0 + 1600) / 20 = 80... wait
|
|
983
|
+
// g_term = 400 * 20 * 20 / 10000 = 160000/10000 = 16
|
|
984
|
+
// vy = (0 + 16*10000) / 20... no:
|
|
985
|
+
// g_term = parabola_gravity_half() * ticks * ticks / 10000 = 400*20*20/10000 = 16
|
|
986
|
+
// vy = (dy*10000 + g_term) / ticks = (0 + 16) / 20 = 0 (integer division)
|
|
987
|
+
// Actually: g_term = 400 * 20 * 20 / 10000 = 160000/10000 = 16
|
|
988
|
+
// vy = (0 + 16) / 20 = 0 (floors!)
|
|
989
|
+
// That's correct for integer: very small arc over 20 ticks
|
|
990
|
+
fn test_vy_flat(): int { return parabola_vy(0, 20); }
|
|
991
|
+
|
|
992
|
+
// parabola_vy(10, 20): dy=10 blocks up in 20 ticks
|
|
993
|
+
// g_term = 400*400/10000 = 16 (same)
|
|
994
|
+
// vy = (10*10000 + 16) / 20 = 100016 / 20 = 5000
|
|
995
|
+
fn test_vy_up(): int { return parabola_vy(10, 20); }
|
|
996
|
+
|
|
997
|
+
// parabola_x(5000, 20) = 5000*20/10000 = 10
|
|
998
|
+
fn test_x_at_t(): int { return parabola_x(5000, 20); }
|
|
999
|
+
|
|
1000
|
+
// parabola_y(5000, 20): vy0=5000 (0.5 b/t), at t=20
|
|
1001
|
+
// = 5000*20/10000 - 400*20*20/10000 = 10 - 16 = -6 (landed below)
|
|
1002
|
+
fn test_y_at_t(): int { return parabola_y(5000, 20); }
|
|
1003
|
+
|
|
1004
|
+
// parabola_flight_time(8000): vy0=0.8 b/t
|
|
1005
|
+
// t = 2 * 8000 / 800 = 20
|
|
1006
|
+
fn test_flight_time(): int { return parabola_flight_time(8000); }
|
|
1007
|
+
|
|
1008
|
+
// parabola_max_height(8000): apex at t=8000/800=10
|
|
1009
|
+
// y(10) = 8000*10/10000 - 400*100/10000 = 8 - 4 = 4
|
|
1010
|
+
fn test_max_height(): int { return parabola_max_height(8000); }
|
|
1011
|
+
|
|
1012
|
+
// parabola_in_range(3, 4, 5) = 1 (dist=5, range=5)
|
|
1013
|
+
fn test_in_range(): int { return parabola_in_range(3, 4, 5); }
|
|
1014
|
+
|
|
1015
|
+
// parabola_in_range(3, 4, 4) = 0 (dist=5 > 4)
|
|
1016
|
+
fn test_out_of_range(): int { return parabola_in_range(3, 4, 4); }
|
|
1017
|
+
|
|
1018
|
+
// drag step: step_vx(10000, 9900) = mulfix(10000, 9900) = 10000*9900/1000 = 99000...
|
|
1019
|
+
// mulfix is ×1000 scale: mulfix(a,b) = a*b/1000
|
|
1020
|
+
// 10000 * 9900 / 1000 = 99000
|
|
1021
|
+
fn test_drag_vx(): int { return parabola_step_vx(10000, 9900); }
|
|
1022
|
+
|
|
1023
|
+
// step_vy(10000, 9900) = mulfix(10000 - 800, 9900) = 9200 * 9900 / 1000 = 91080
|
|
1024
|
+
fn test_drag_vy(): int { return parabola_step_vy(10000, 9900); }
|
|
1025
|
+
|
|
1026
|
+
// gravity constant
|
|
1027
|
+
fn test_gravity(): int { return parabola_gravity(); }
|
|
1028
|
+
|
|
1029
|
+
// ticks_for_range(8) = 8*10000/8000 = 10
|
|
1030
|
+
fn test_ticks_range(): int { return parabola_ticks_for_range(8); }
|
|
1031
|
+
`, [MATH_SRC, PARABOLA_SRC]);
|
|
1032
|
+
test('parabola_gravity() == 800', () => expect(callAndGetRet(rt, 'test_gravity')).toBe(800));
|
|
1033
|
+
test('parabola_vx(10, 20) == 5000', () => expect(callAndGetRet(rt, 'test_vx')).toBe(5000));
|
|
1034
|
+
test('parabola_vz(0, 20) == 0', () => expect(callAndGetRet(rt, 'test_vz_zero')).toBe(0));
|
|
1035
|
+
test('parabola_vy(0, 20) == 0 (flat shot integer floor)', () => expect(callAndGetRet(rt, 'test_vy_flat')).toBe(0));
|
|
1036
|
+
test('parabola_vy(10, 20) == 5000 (arc up 10 blocks)', () => expect(callAndGetRet(rt, 'test_vy_up')).toBe(5000));
|
|
1037
|
+
test('parabola_x(5000, 20) == 10 (0.5 b/t × 20t)', () => expect(callAndGetRet(rt, 'test_x_at_t')).toBe(10));
|
|
1038
|
+
test('parabola_y(5000, 20) == -6 (landed below launch)', () => expect(callAndGetRet(rt, 'test_y_at_t')).toBe(-6));
|
|
1039
|
+
test('parabola_flight_time(8000) == 20 ticks', () => expect(callAndGetRet(rt, 'test_flight_time')).toBe(20));
|
|
1040
|
+
test('parabola_max_height(8000) == 4 blocks', () => expect(callAndGetRet(rt, 'test_max_height')).toBe(4));
|
|
1041
|
+
test('parabola_in_range(3,4,5) == 1 (on boundary)', () => expect(callAndGetRet(rt, 'test_in_range')).toBe(1));
|
|
1042
|
+
test('parabola_in_range(3,4,4) == 0 (out of range)', () => expect(callAndGetRet(rt, 'test_out_of_range')).toBe(0));
|
|
1043
|
+
test('parabola_step_vx(10000, 9900) == 99000 (drag)', () => expect(callAndGetRet(rt, 'test_drag_vx')).toBe(99000));
|
|
1044
|
+
test('parabola_step_vy(10000, 9900) == 91080 (gravity+drag)', () => expect(callAndGetRet(rt, 'test_drag_vy')).toBe(91080));
|
|
1045
|
+
test('parabola_ticks_for_range(8) == 10', () => expect(callAndGetRet(rt, 'test_ticks_range')).toBe(10));
|
|
1046
|
+
});
|
|
1047
|
+
// ===========================================================================
|
|
1048
|
+
// quaternion.mcrs — runtime
|
|
1049
|
+
// ===========================================================================
|
|
1050
|
+
describe('quaternion.mcrs — rotation math', () => {
|
|
1051
|
+
// Note: sin_fixed/cos_fixed use NBT lookup tables unavailable in MCRuntime.
|
|
1052
|
+
// Tests use pre-computed values directly instead of axis constructor functions.
|
|
1053
|
+
// quat components ×10000: identity=(0,0,0,10000), 90°Y=(0,7071,0,7071)
|
|
1054
|
+
const rt = makeRuntime(`
|
|
1055
|
+
// Identity quaternion constants
|
|
1056
|
+
fn test_identity_w(): int { return quat_identity_w(); }
|
|
1057
|
+
fn test_identity_x(): int { return quat_identity_x(); }
|
|
1058
|
+
|
|
1059
|
+
// Quaternion multiplication: identity * identity = identity
|
|
1060
|
+
fn test_mul_identity_w(): int {
|
|
1061
|
+
return quat_mul_w(0, 0, 0, 10000, 0, 0, 0, 10000);
|
|
1062
|
+
}
|
|
1063
|
+
fn test_mul_identity_x(): int {
|
|
1064
|
+
return quat_mul_x(0, 0, 0, 10000, 0, 0, 0, 10000);
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
// q * q_inv = identity: q=(0,7071,0,7071), conj=(0,-7071,0,7071)
|
|
1068
|
+
fn test_mul_q_conj_w(): int {
|
|
1069
|
+
return quat_mul_w(0, 7071, 0, 7071, 0, -7071, 0, 7071);
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
// Conjugate
|
|
1073
|
+
fn test_conj_w(): int { return quat_conj_w(0, 0, 0, 10000); }
|
|
1074
|
+
fn test_conj_x(): int { return quat_conj_x(7071, 0, 0, 7071); }
|
|
1075
|
+
|
|
1076
|
+
// Magnitude squared of identity: mulfix(10000,10000) = 10000*10000/1000 = 100000
|
|
1077
|
+
fn test_mag_sq_identity(): int { return quat_mag_sq(0, 0, 0, 10000); }
|
|
1078
|
+
|
|
1079
|
+
// Magnitude squared of precomputed 90°Y: (0, 7071, 0, 7071)
|
|
1080
|
+
// mulfix(7071,7071)*2 = 7071*7071/1000 * 2 = 49998 * 2 = 99996
|
|
1081
|
+
fn test_mag_sq_rot(): int { return quat_mag_sq(0, 7071, 0, 7071); }
|
|
1082
|
+
|
|
1083
|
+
// Dot product of identity with itself: mulfix(10000,10000) = 100000
|
|
1084
|
+
fn test_dot_identity(): int {
|
|
1085
|
+
return quat_dot(0, 0, 0, 10000, 0, 0, 0, 10000);
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
// Dot of two identical 90°Y quats
|
|
1089
|
+
fn test_dot_same(): int {
|
|
1090
|
+
return quat_dot(0, 7071, 0, 7071, 0, 7071, 0, 7071);
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
// SLERP: lerp between identity and 90°Y at t=0 → identity
|
|
1094
|
+
fn test_slerp_t0_w(): int {
|
|
1095
|
+
return quat_slerp_w(0, 0, 0, 10000, 0, 7071, 0, 7071, 0);
|
|
1096
|
+
}
|
|
1097
|
+
fn test_slerp_t0_y(): int {
|
|
1098
|
+
return quat_slerp_y(0, 0, 0, 10000, 0, 7071, 0, 7071, 0);
|
|
1099
|
+
}
|
|
1100
|
+
// SLERP at t=1000 → second quat (normalized)
|
|
1101
|
+
fn test_slerp_t1000_y(): int {
|
|
1102
|
+
return quat_slerp_y(0, 0, 0, 10000, 0, 7071, 0, 7071, 1000);
|
|
1103
|
+
}
|
|
1104
|
+
fn test_slerp_t1000_w(): int {
|
|
1105
|
+
return quat_slerp_w(0, 0, 0, 10000, 0, 7071, 0, 7071, 1000);
|
|
1106
|
+
}
|
|
1107
|
+
// SLERP midpoint t=500: lerp(identity, 90°Y) → normalize([0, 3535, 0, 13535])
|
|
1108
|
+
fn test_slerp_t500_y(): int {
|
|
1109
|
+
return quat_slerp_y(0, 0, 0, 10000, 0, 7071, 0, 7071, 500);
|
|
1110
|
+
}
|
|
1111
|
+
`, [MATH_SRC, QUAT_SRC]);
|
|
1112
|
+
test('quat_identity_w() == 10000', () => expect(callAndGetRet(rt, 'test_identity_w')).toBe(10000));
|
|
1113
|
+
test('quat_identity_x() == 0', () => expect(callAndGetRet(rt, 'test_identity_x')).toBe(0));
|
|
1114
|
+
test('quat_mul(identity, identity).w == 100000 (×10000 scale)', () => expect(callAndGetRet(rt, 'test_mul_identity_w')).toBe(100000));
|
|
1115
|
+
test('quat_mul(identity, identity).x == 0', () => expect(callAndGetRet(rt, 'test_mul_identity_x')).toBe(0));
|
|
1116
|
+
test('quat_mul(q, conj(q)).w ≈ 100000 (≈ identity)', () => {
|
|
1117
|
+
const v = callAndGetRet(rt, 'test_mul_q_conj_w');
|
|
1118
|
+
expect(Math.abs(v - 100000)).toBeLessThanOrEqual(200);
|
|
1119
|
+
});
|
|
1120
|
+
test('quat_conj(identity).w == 10000', () => expect(callAndGetRet(rt, 'test_conj_w')).toBe(10000));
|
|
1121
|
+
test('quat_conj([7071,0,0,7071]).x == -7071', () => expect(callAndGetRet(rt, 'test_conj_x')).toBe(-7071));
|
|
1122
|
+
test('quat_mag_sq(identity) == 100000 (mulfix scale)', () => expect(callAndGetRet(rt, 'test_mag_sq_identity')).toBe(100000));
|
|
1123
|
+
test('quat_mag_sq([0,7071,0,7071]) ≈ 99996 (near unit)', () => {
|
|
1124
|
+
const v = callAndGetRet(rt, 'test_mag_sq_rot');
|
|
1125
|
+
expect(Math.abs(v - 100000)).toBeLessThanOrEqual(10);
|
|
1126
|
+
});
|
|
1127
|
+
test('quat_dot(identity, identity) == 100000', () => expect(callAndGetRet(rt, 'test_dot_identity')).toBe(100000));
|
|
1128
|
+
test('quat_dot(q, q) ≈ 99996 (near unit)', () => {
|
|
1129
|
+
const v = callAndGetRet(rt, 'test_dot_same');
|
|
1130
|
+
expect(Math.abs(v - 100000)).toBeLessThanOrEqual(10);
|
|
1131
|
+
});
|
|
1132
|
+
test('quat_slerp(a,b,0).w == 10000 (= a)', () => expect(callAndGetRet(rt, 'test_slerp_t0_w')).toBe(10000));
|
|
1133
|
+
test('quat_slerp(a,b,0).y == 0 (= a)', () => expect(callAndGetRet(rt, 'test_slerp_t0_y')).toBe(0));
|
|
1134
|
+
test('quat_slerp(a,b,1000).y ≈ 7071 (= b normalized)', () => {
|
|
1135
|
+
const v = callAndGetRet(rt, 'test_slerp_t1000_y');
|
|
1136
|
+
expect(Math.abs(v - 7071)).toBeLessThanOrEqual(20);
|
|
1137
|
+
});
|
|
1138
|
+
test('quat_slerp(a,b,1000).w ≈ 7071 (= b normalized)', () => {
|
|
1139
|
+
const v = callAndGetRet(rt, 'test_slerp_t1000_w');
|
|
1140
|
+
expect(Math.abs(v - 7071)).toBeLessThanOrEqual(20);
|
|
1141
|
+
});
|
|
1142
|
+
test('quat_slerp(a,b,500).y > 0 (moving toward b)', () => {
|
|
1143
|
+
const v = callAndGetRet(rt, 'test_slerp_t500_y');
|
|
1144
|
+
expect(v).toBeGreaterThan(0);
|
|
1145
|
+
expect(v).toBeLessThan(7071);
|
|
1146
|
+
});
|
|
1147
|
+
});
|
|
1148
|
+
// bezier_quartic and bezier_n — N-order Bezier curves
|
|
1149
|
+
describe('advanced.mcrs — bezier_quartic & bezier_n', () => {
|
|
1150
|
+
const rt = makeRuntime(`
|
|
1151
|
+
fn test_quartic_start(): int { return bezier_quartic(0, 250, 500, 750, 1000, 0); }
|
|
1152
|
+
fn test_quartic_end(): int { return bezier_quartic(0, 250, 500, 750, 1000, 1000); }
|
|
1153
|
+
fn test_quartic_mid(): int { return bezier_quartic(0, 250, 500, 750, 1000, 500); }
|
|
1154
|
+
|
|
1155
|
+
fn test_bezier_n_start(): int {
|
|
1156
|
+
let pts: int[] = [0, 333, 667, 1000];
|
|
1157
|
+
return bezier_n(pts, 4, 0);
|
|
1158
|
+
}
|
|
1159
|
+
fn test_bezier_n_end(): int {
|
|
1160
|
+
let pts: int[] = [0, 333, 667, 1000];
|
|
1161
|
+
return bezier_n(pts, 4, 1000);
|
|
1162
|
+
}
|
|
1163
|
+
`, [MATH_SRC, ADVANCED_SRC, BIGINT_SRC]);
|
|
1164
|
+
// bezier_quartic
|
|
1165
|
+
test('bezier_quartic(0,250,500,750,1000, t=0) == 0 (start)', () => expect(callAndGetRet(rt, 'test_quartic_start')).toBe(0));
|
|
1166
|
+
test('bezier_quartic(0,250,500,750,1000, t=1000) == 1000 (end)', () => expect(callAndGetRet(rt, 'test_quartic_end')).toBe(1000));
|
|
1167
|
+
test('bezier_quartic(0,250,500,750,1000, t=500) == 500 (uniform midpoint)', () => expect(callAndGetRet(rt, 'test_quartic_mid')).toBe(500));
|
|
1168
|
+
// bezier_n
|
|
1169
|
+
test('bezier_n([0,333,667,1000], 4, t=0) == 0 (start = pts[0])', () => expect(callAndGetRet(rt, 'test_bezier_n_start')).toBe(0));
|
|
1170
|
+
test('bezier_n([0,333,667,1000], 4, t=1000) == 1000 (end = pts[n-1])', () => expect(callAndGetRet(rt, 'test_bezier_n_end')).toBe(1000));
|
|
1171
|
+
});
|
|
1172
|
+
// ===========================================================================
|
|
1173
|
+
// math_hp.mcrs — ln_hp (Newton-refined high-precision natural log)
|
|
1174
|
+
// ===========================================================================
|
|
1175
|
+
describe('math_hp.mcrs — ln_hp', () => {
|
|
1176
|
+
const rt = makeRuntime(`
|
|
1177
|
+
fn test_ln_hp_one(): int { return ln_hp(10000); }
|
|
1178
|
+
fn test_ln_hp_e(): int { return ln_hp(27183); }
|
|
1179
|
+
fn test_ln_hp_2(): int { return ln_hp(20000); }
|
|
1180
|
+
fn test_ln_hp_10(): int { return ln_hp(100000); }
|
|
1181
|
+
fn test_ln_hp_vs_ln_e(): int {
|
|
1182
|
+
// Compare ln_hp(e) and ln(e): ln_hp should be closer to 10000
|
|
1183
|
+
let a: int = ln_hp(27183);
|
|
1184
|
+
let b: int = ln(27183);
|
|
1185
|
+
let da: int = a - 10000;
|
|
1186
|
+
if (da < 0) { da = 0 - da; }
|
|
1187
|
+
let db: int = b - 10000;
|
|
1188
|
+
if (db < 0) { db = 0 - db; }
|
|
1189
|
+
// Return 1 if ln_hp is at least as precise as ln, 0 otherwise
|
|
1190
|
+
if (da <= db) { return 1; }
|
|
1191
|
+
return 0;
|
|
1192
|
+
}
|
|
1193
|
+
`, [MATH_SRC, MATH_HP_SRC]);
|
|
1194
|
+
test('ln_hp(10000) == 0 (ln(1.0) = 0)', () => expect(callAndGetRet(rt, 'test_ln_hp_one')).toBe(0));
|
|
1195
|
+
test('ln_hp(27183) ≈ 10000 (ln(e) ≈ 1.0)', () => {
|
|
1196
|
+
const v = callAndGetRet(rt, 'test_ln_hp_e');
|
|
1197
|
+
expect(Math.abs(v - 10000)).toBeLessThanOrEqual(5);
|
|
1198
|
+
});
|
|
1199
|
+
test('ln_hp(20000) ≈ 6931 (ln(2) ≈ 0.6931)', () => {
|
|
1200
|
+
const v = callAndGetRet(rt, 'test_ln_hp_2');
|
|
1201
|
+
expect(Math.abs(v - 6931)).toBeLessThanOrEqual(5);
|
|
1202
|
+
});
|
|
1203
|
+
test('ln_hp(100000) ≈ 23026 (ln(10) ≈ 2.3026)', () => {
|
|
1204
|
+
const v = callAndGetRet(rt, 'test_ln_hp_10');
|
|
1205
|
+
expect(Math.abs(v - 23026)).toBeLessThanOrEqual(10);
|
|
1206
|
+
});
|
|
1207
|
+
test('ln_hp is at least as precise as ln for ln(e)', () => {
|
|
1208
|
+
expect(callAndGetRet(rt, 'test_ln_hp_vs_ln_e')).toBe(1);
|
|
1209
|
+
});
|
|
1210
|
+
});
|
|
1211
|
+
// ===========================================================================
|
|
1212
|
+
// expr.mcrs — RPN expression evaluator
|
|
1213
|
+
// ===========================================================================
|
|
1214
|
+
describe('expr.mcrs — expr_eval', () => {
|
|
1215
|
+
const rt = makeRuntime(`
|
|
1216
|
+
// constant 1.0: tokens = [10000], n=1, x=0
|
|
1217
|
+
fn test_expr_constant(): int {
|
|
1218
|
+
let toks: int[] = [10000];
|
|
1219
|
+
return expr_eval(toks, 1, 0);
|
|
1220
|
+
}
|
|
1221
|
+
// identity f(x)=x: tokens = [-10000], n=1, x=20000
|
|
1222
|
+
fn test_expr_identity(): int {
|
|
1223
|
+
let toks: int[] = [0 - 10000];
|
|
1224
|
+
return expr_eval(toks, 1, 20000);
|
|
1225
|
+
}
|
|
1226
|
+
// 2*x + 1 at x=1.5: tokens = [20000, -10000, -3, 10000, -1], n=5, x=15000
|
|
1227
|
+
// Expected: 20000*15000/10000 + 10000 = 30000 + 10000 = 40000
|
|
1228
|
+
// Use element-by-element assignment to avoid compiler bug with mixed-sign arrays
|
|
1229
|
+
fn test_expr_linear(): int {
|
|
1230
|
+
let toks: int[] = [0, 0, 0, 0, 0];
|
|
1231
|
+
toks[0] = 20000;
|
|
1232
|
+
toks[1] = 0 - 10000;
|
|
1233
|
+
toks[2] = 0 - 3;
|
|
1234
|
+
toks[3] = 10000;
|
|
1235
|
+
toks[4] = 0 - 1;
|
|
1236
|
+
return expr_eval(toks, 5, 15000);
|
|
1237
|
+
}
|
|
1238
|
+
// subtraction: 3.0 - 1.0 = 2.0: tokens = [30000, 10000, -2], n=3, x=0
|
|
1239
|
+
fn test_expr_sub(): int {
|
|
1240
|
+
let toks: int[] = [0, 0, 0];
|
|
1241
|
+
toks[0] = 30000;
|
|
1242
|
+
toks[1] = 10000;
|
|
1243
|
+
toks[2] = 0 - 2;
|
|
1244
|
+
return expr_eval(toks, 3, 0);
|
|
1245
|
+
}
|
|
1246
|
+
// division: 10.0 / 4.0 = 2.5: tokens = [100000, 40000, -4], n=3, x=0
|
|
1247
|
+
fn test_expr_div(): int {
|
|
1248
|
+
let toks: int[] = [0, 0, 0];
|
|
1249
|
+
toks[0] = 100000;
|
|
1250
|
+
toks[1] = 40000;
|
|
1251
|
+
toks[2] = 0 - 4;
|
|
1252
|
+
return expr_eval(toks, 3, 0);
|
|
1253
|
+
}
|
|
1254
|
+
// abs(-3.0) = 3.0: tokens = [-30000, -8], n=2, x=0
|
|
1255
|
+
// -30000 is not a recognized opcode so it falls through to the literal branch
|
|
1256
|
+
fn test_expr_abs(): int {
|
|
1257
|
+
let toks: int[] = [0, 0];
|
|
1258
|
+
toks[0] = 0 - 30000;
|
|
1259
|
+
toks[1] = 0 - 8;
|
|
1260
|
+
return expr_eval(toks, 2, 0);
|
|
1261
|
+
}
|
|
1262
|
+
// sqrt(4.0) = 2.0: tokens = [40000, -7], n=2, x=0
|
|
1263
|
+
fn test_expr_sqrt(): int {
|
|
1264
|
+
let toks: int[] = [0, 0];
|
|
1265
|
+
toks[0] = 40000;
|
|
1266
|
+
toks[1] = 0 - 7;
|
|
1267
|
+
return expr_eval(toks, 2, 0);
|
|
1268
|
+
}
|
|
1269
|
+
`, [MATH_SRC, EXPR_SRC]);
|
|
1270
|
+
test('expr_eval([10000], 1, 0) == 10000 (constant 1.0)', () => {
|
|
1271
|
+
expect(callAndGetRet(rt, 'test_expr_constant')).toBe(10000);
|
|
1272
|
+
});
|
|
1273
|
+
test('expr_eval([-10000], 1, 20000) == 20000 (identity f(x)=x at x=2.0)', () => {
|
|
1274
|
+
expect(callAndGetRet(rt, 'test_expr_identity')).toBe(20000);
|
|
1275
|
+
});
|
|
1276
|
+
test('expr_eval([20000,-10000,-3,10000,-1], 5, 15000) == 40000 (2*x+1 at x=1.5)', () => {
|
|
1277
|
+
expect(callAndGetRet(rt, 'test_expr_linear')).toBe(40000);
|
|
1278
|
+
});
|
|
1279
|
+
test('expr_eval([30000,10000,-2], 3, 0) == 20000 (3.0 - 1.0 = 2.0)', () => {
|
|
1280
|
+
expect(callAndGetRet(rt, 'test_expr_sub')).toBe(20000);
|
|
1281
|
+
});
|
|
1282
|
+
test('expr_eval([100000,40000,-4], 3, 0) == 25000 (10.0 / 4.0 = 2.5)', () => {
|
|
1283
|
+
expect(callAndGetRet(rt, 'test_expr_div')).toBe(25000);
|
|
1284
|
+
});
|
|
1285
|
+
test('expr_eval([-30000,-8], 2, 0) == 30000 (abs(-3.0) = 3.0)', () => {
|
|
1286
|
+
expect(callAndGetRet(rt, 'test_expr_abs')).toBe(30000);
|
|
1287
|
+
});
|
|
1288
|
+
test('expr_eval([40000,-7], 2, 0) == 20000 (sqrt(4.0) = 2.0)', () => {
|
|
1289
|
+
expect(callAndGetRet(rt, 'test_expr_sqrt')).toBe(20000);
|
|
1290
|
+
});
|
|
1291
|
+
});
|
|
1292
|
+
// ===========================================================================
|
|
1293
|
+
// geometry.mcrs — selector helpers (cylinder / cone / sector_2d)
|
|
1294
|
+
// ===========================================================================
|
|
1295
|
+
describe('geometry.mcrs — in_cylinder', () => {
|
|
1296
|
+
const rt = makeRuntime(`
|
|
1297
|
+
fn test_cyl_inside(): int {
|
|
1298
|
+
return in_cylinder(0, 0, 0, 0, 0, 20000, 0, 10000);
|
|
1299
|
+
}
|
|
1300
|
+
fn test_cyl_outside_r(): int {
|
|
1301
|
+
return in_cylinder(30000, 0, 0, 0, 0, 20000, 0, 10000);
|
|
1302
|
+
}
|
|
1303
|
+
fn test_cyl_outside_y(): int {
|
|
1304
|
+
return in_cylinder(0, 20000, 0, 0, 0, 20000, 0, 10000);
|
|
1305
|
+
}
|
|
1306
|
+
`, [MATH_SRC, VEC_SRC, GEOM_SRC]);
|
|
1307
|
+
test('in_cylinder(0,0,0, 0,0, 20000, 0,10000) == 1 (inside)', () => expect(callAndGetRet(rt, 'test_cyl_inside')).toBe(1));
|
|
1308
|
+
test('in_cylinder(30000,0,0, 0,0, 20000, 0,10000) == 0 (outside radius)', () => expect(callAndGetRet(rt, 'test_cyl_outside_r')).toBe(0));
|
|
1309
|
+
test('in_cylinder(0,20000,0, 0,0, 20000, 0,10000) == 0 (outside y range)', () => expect(callAndGetRet(rt, 'test_cyl_outside_y')).toBe(0));
|
|
1310
|
+
});
|
|
1311
|
+
describe('geometry.mcrs — in_cone', () => {
|
|
1312
|
+
// dir_y=1 → upward cone; half_angle_tan=10000 (tan 45°=1.0); height=20000
|
|
1313
|
+
// test point directly above apex: dy=10000, horiz=0 → inside
|
|
1314
|
+
const rt = makeRuntime(`
|
|
1315
|
+
fn test_cone_above(): int {
|
|
1316
|
+
return in_cone(0, 10000, 0, 0, 0, 0, 1, 10000, 20000);
|
|
1317
|
+
}
|
|
1318
|
+
`, [MATH_SRC, VEC_SRC, GEOM_SRC]);
|
|
1319
|
+
test('in_cone(0,10000,0, 0,0,0, 1, 10000, 20000) == 1 (directly above apex)', () => expect(callAndGetRet(rt, 'test_cone_above')).toBe(1));
|
|
1320
|
+
});
|
|
1321
|
+
describe('geometry.mcrs — in_sector_2d', () => {
|
|
1322
|
+
// dir_angle=0 (+X axis), half_angle≈π/4 (157079), radius=20000
|
|
1323
|
+
// point (10000,0) is at angle 0 → inside
|
|
1324
|
+
// point (-10000,0) is at angle π → outside
|
|
1325
|
+
const rt = makeRuntime(`
|
|
1326
|
+
fn test_sector_front(): int {
|
|
1327
|
+
return in_sector_2d(10000, 0, 0, 0, 0, 157079, 20000);
|
|
1328
|
+
}
|
|
1329
|
+
fn test_sector_behind(): int {
|
|
1330
|
+
return in_sector_2d(-10000, 0, 0, 0, 0, 157079, 20000);
|
|
1331
|
+
}
|
|
1332
|
+
`, [MATH_SRC, VEC_SRC, GEOM_SRC]);
|
|
1333
|
+
test('in_sector_2d(10000,0, 0,0, 0, 157079, 20000) == 1 (in front, half_angle=π/4)', () => expect(callAndGetRet(rt, 'test_sector_front')).toBe(1));
|
|
1334
|
+
test('in_sector_2d(-10000,0, 0,0, 0, 157079, 20000) == 0 (behind)', () => expect(callAndGetRet(rt, 'test_sector_behind')).toBe(0));
|
|
1335
|
+
});
|
|
1336
|
+
// ===========================================================================
|
|
1337
|
+
// color.mcrs — RGB↔HSL conversion
|
|
1338
|
+
// ===========================================================================
|
|
1339
|
+
describe('color.mcrs — rgb_to_l', () => {
|
|
1340
|
+
const rt = makeRuntime(`
|
|
1341
|
+
fn test_l_white(): int { return rgb_to_l(2550000, 2550000, 2550000); }
|
|
1342
|
+
fn test_l_black(): int { return rgb_to_l(0, 0, 0); }
|
|
1343
|
+
`, [COLOR_SRC]);
|
|
1344
|
+
test('rgb_to_l(2550000, 2550000, 2550000) == 10000 (white L=1.0)', () => expect(callAndGetRet(rt, 'test_l_white')).toBe(10000));
|
|
1345
|
+
test('rgb_to_l(0, 0, 0) == 0 (black L=0)', () => expect(callAndGetRet(rt, 'test_l_black')).toBe(0));
|
|
1346
|
+
});
|
|
1347
|
+
describe('color.mcrs — rgb_to_s', () => {
|
|
1348
|
+
const rt = makeRuntime(`
|
|
1349
|
+
fn test_s_red(): int { return rgb_to_s(2550000, 0, 0); }
|
|
1350
|
+
`, [COLOR_SRC]);
|
|
1351
|
+
test('rgb_to_s(2550000, 0, 0) > 0 (pure red S > 0)', () => expect(callAndGetRet(rt, 'test_s_red')).toBeGreaterThan(0));
|
|
1352
|
+
});
|
|
1353
|
+
describe('color.mcrs — hsl_to_r', () => {
|
|
1354
|
+
const rt = makeRuntime(`
|
|
1355
|
+
fn test_hsl_r_red(): int { return hsl_to_r(0, 10000, 5000); }
|
|
1356
|
+
`, [COLOR_SRC]);
|
|
1357
|
+
test('hsl_to_r(0, 10000, 5000) close to 2550000 (red hue)', () => expect(callAndGetRet(rt, 'test_hsl_r_red')).toBeGreaterThan(2500000));
|
|
1358
|
+
});
|
|
1359
|
+
// ===========================================================================
|
|
1360
|
+
// world.mcrs — sun angle helpers
|
|
1361
|
+
// ===========================================================================
|
|
1362
|
+
describe('world.mcrs — sun_altitude', () => {
|
|
1363
|
+
// sun_altitude uses sin_fixed which requires storage_get_int — not available
|
|
1364
|
+
// in MCRuntime, so we test sun_azimuth only (pure arithmetic).
|
|
1365
|
+
const rt = makeRuntime(`
|
|
1366
|
+
fn test_azimuth_0(): int { return sun_azimuth(0); }
|
|
1367
|
+
fn test_azimuth_noon(): int { return sun_azimuth(6000); }
|
|
1368
|
+
`, [WORLD_SRC, MATH_SRC]);
|
|
1369
|
+
test('sun_azimuth(0) == 0', () => expect(callAndGetRet(rt, 'test_azimuth_0')).toBe(0));
|
|
1370
|
+
test('sun_azimuth(6000) == 900000 (quarter day = 90°)', () => expect(callAndGetRet(rt, 'test_azimuth_noon')).toBe(900000));
|
|
1371
|
+
});
|
|
1372
|
+
// ===========================================================================
|
|
1373
|
+
// ADDITIONAL COMPREHENSIVE TESTS — geometry / expr / DFT / color / world
|
|
1374
|
+
// ===========================================================================
|
|
1375
|
+
// ---------------------------------------------------------------------------
|
|
1376
|
+
// geometry.mcrs — in_cylinder (extended)
|
|
1377
|
+
// ---------------------------------------------------------------------------
|
|
1378
|
+
describe('geometry.mcrs — in_cylinder (extended)', () => {
|
|
1379
|
+
const rt = makeRuntime(`
|
|
1380
|
+
// Point exactly on boundary radius (dx=radius → dx²+dz²=r² → inside)
|
|
1381
|
+
fn test_cyl_boundary(): int {
|
|
1382
|
+
return in_cylinder(20000, 5000, 0, 0, 0, 20000, 0, 10000);
|
|
1383
|
+
}
|
|
1384
|
+
// Point at centre (0,0,0) with y in range → definitely inside
|
|
1385
|
+
fn test_cyl_center(): int {
|
|
1386
|
+
return in_cylinder(0, 5000, 0, 0, 0, 10000, 0, 10000);
|
|
1387
|
+
}
|
|
1388
|
+
// Negative coordinates — point at (-5000, 5000, -5000), centre at (-5000, 0, -5000), r=1000
|
|
1389
|
+
fn test_cyl_neg_coords(): int {
|
|
1390
|
+
return in_cylinder(0 - 5000, 5000, 0 - 5000, 0 - 5000, 0 - 5000, 1000, 0, 10000);
|
|
1391
|
+
}
|
|
1392
|
+
// y exactly at lower boundary y_lo → inside (boundary inclusive)
|
|
1393
|
+
fn test_cyl_y_at_lo(): int {
|
|
1394
|
+
return in_cylinder(0, 0, 0, 0, 0, 10000, 0, 10000);
|
|
1395
|
+
}
|
|
1396
|
+
// y exactly at upper boundary y_hi → inside (boundary inclusive)
|
|
1397
|
+
fn test_cyl_y_at_hi(): int {
|
|
1398
|
+
return in_cylinder(0, 10000, 0, 0, 0, 10000, 0, 10000);
|
|
1399
|
+
}
|
|
1400
|
+
// y just below lower boundary → outside
|
|
1401
|
+
fn test_cyl_y_below_lo(): int {
|
|
1402
|
+
return in_cylinder(0, 0 - 1, 0, 0, 0, 10000, 0, 10000);
|
|
1403
|
+
}
|
|
1404
|
+
// Point offset from non-zero centre
|
|
1405
|
+
fn test_cyl_offset_centre(): int {
|
|
1406
|
+
return in_cylinder(15000, 5000, 15000, 10000, 10000, 10000, 0, 10000);
|
|
1407
|
+
}
|
|
1408
|
+
`, [MATH_SRC, VEC_SRC, GEOM_SRC]);
|
|
1409
|
+
test('in_cylinder: point on exact radius boundary == 1', () => expect(callAndGetRet(rt, 'test_cyl_boundary')).toBe(1));
|
|
1410
|
+
test('in_cylinder: point at centre == 1', () => expect(callAndGetRet(rt, 'test_cyl_center')).toBe(1));
|
|
1411
|
+
test('in_cylinder: negative coordinates, point at centre == 1', () => expect(callAndGetRet(rt, 'test_cyl_neg_coords')).toBe(1));
|
|
1412
|
+
test('in_cylinder: y at lower boundary == 1 (inclusive)', () => expect(callAndGetRet(rt, 'test_cyl_y_at_lo')).toBe(1));
|
|
1413
|
+
test('in_cylinder: y at upper boundary == 1 (inclusive)', () => expect(callAndGetRet(rt, 'test_cyl_y_at_hi')).toBe(1));
|
|
1414
|
+
test('in_cylinder: y just below lower boundary == 0', () => expect(callAndGetRet(rt, 'test_cyl_y_below_lo')).toBe(0));
|
|
1415
|
+
test('in_cylinder: point inside shifted cylinder == 1', () => expect(callAndGetRet(rt, 'test_cyl_offset_centre')).toBe(1));
|
|
1416
|
+
});
|
|
1417
|
+
// ---------------------------------------------------------------------------
|
|
1418
|
+
// geometry.mcrs — in_cone (extended)
|
|
1419
|
+
// ---------------------------------------------------------------------------
|
|
1420
|
+
describe('geometry.mcrs — in_cone (extended)', () => {
|
|
1421
|
+
const rt = makeRuntime(`
|
|
1422
|
+
// Point at apex itself: dy=0 → lhs=0, rhs=0 → 0<=0 → inside
|
|
1423
|
+
fn test_cone_apex(): int {
|
|
1424
|
+
return in_cone(0, 0, 0, 0, 0, 0, 1, 10000, 20000);
|
|
1425
|
+
}
|
|
1426
|
+
// Point outside height (dy > height) → outside
|
|
1427
|
+
fn test_cone_above_height(): int {
|
|
1428
|
+
return in_cone(0, 30000, 0, 0, 0, 0, 1, 10000, 20000);
|
|
1429
|
+
}
|
|
1430
|
+
// Point at exactly height on axis → inside (dy=height, horiz=0)
|
|
1431
|
+
fn test_cone_at_height(): int {
|
|
1432
|
+
return in_cone(0, 20000, 0, 0, 0, 0, 1, 10000, 20000);
|
|
1433
|
+
}
|
|
1434
|
+
// Wide angle (tan=20000 → 63°), point at (10000,10000,0): lhs=100000000, rhs=dy*20000/10000=20000 → rhs²=400000000 ≥ lhs → inside
|
|
1435
|
+
fn test_cone_wide_angle(): int {
|
|
1436
|
+
return in_cone(10000, 10000, 0, 0, 0, 0, 1, 20000, 20000);
|
|
1437
|
+
}
|
|
1438
|
+
// Downward cone (dir_y=-1): point below apex
|
|
1439
|
+
fn test_cone_downward(): int {
|
|
1440
|
+
return in_cone(0, 0 - 5000, 0, 0, 0, 0, 0 - 1, 10000, 20000);
|
|
1441
|
+
}
|
|
1442
|
+
// Narrow angle (tan=5000 → 27°), point just outside: dx=10000,dy=10000 → lhs=100000000, rhs=5000 → rhs²=25000000 < lhs → outside
|
|
1443
|
+
fn test_cone_narrow_outside(): int {
|
|
1444
|
+
return in_cone(10000, 10000, 0, 0, 0, 0, 1, 5000, 20000);
|
|
1445
|
+
}
|
|
1446
|
+
`, [MATH_SRC, VEC_SRC, GEOM_SRC]);
|
|
1447
|
+
test('in_cone: point at apex == 1', () => expect(callAndGetRet(rt, 'test_cone_apex')).toBe(1));
|
|
1448
|
+
test('in_cone: point above height == 0', () => expect(callAndGetRet(rt, 'test_cone_above_height')).toBe(0));
|
|
1449
|
+
test('in_cone: point at exactly height on axis == 1', () => expect(callAndGetRet(rt, 'test_cone_at_height')).toBe(1));
|
|
1450
|
+
test('in_cone: wide angle (45°), point inside == 1', () => expect(callAndGetRet(rt, 'test_cone_wide_angle')).toBe(1));
|
|
1451
|
+
test('in_cone: downward cone, point below apex == 1', () => expect(callAndGetRet(rt, 'test_cone_downward')).toBe(1));
|
|
1452
|
+
test('in_cone: narrow angle, point outside == 0', () => expect(callAndGetRet(rt, 'test_cone_narrow_outside')).toBe(0));
|
|
1453
|
+
});
|
|
1454
|
+
// ---------------------------------------------------------------------------
|
|
1455
|
+
// geometry.mcrs — in_sector_2d (extended)
|
|
1456
|
+
// ---------------------------------------------------------------------------
|
|
1457
|
+
describe('geometry.mcrs — in_sector_2d (extended)', () => {
|
|
1458
|
+
const rt = makeRuntime(`
|
|
1459
|
+
// Point at origin (cx,cz) → should be inside (zero distance)
|
|
1460
|
+
fn test_sector_at_origin(): int {
|
|
1461
|
+
return in_sector_2d(0, 0, 0, 0, 0, 157079, 20000);
|
|
1462
|
+
}
|
|
1463
|
+
// Point at exact radius boundary (still inside, <=)
|
|
1464
|
+
fn test_sector_radius_boundary(): int {
|
|
1465
|
+
return in_sector_2d(20000, 0, 0, 0, 0, 157079, 20000);
|
|
1466
|
+
}
|
|
1467
|
+
// Point just outside radius → outside
|
|
1468
|
+
fn test_sector_outside_radius(): int {
|
|
1469
|
+
return in_sector_2d(21000, 0, 0, 0, 0, 157079, 20000);
|
|
1470
|
+
}
|
|
1471
|
+
// dir_angle = π/2 (157079), point at (0, 10000): angle=90° → inside
|
|
1472
|
+
fn test_sector_dir_90(): int {
|
|
1473
|
+
return in_sector_2d(0, 10000, 0, 0, 157079, 78540, 20000);
|
|
1474
|
+
}
|
|
1475
|
+
// dir_angle = 0, half_angle = full circle (314159≈π): point at (-10000,0) should be inside
|
|
1476
|
+
fn test_sector_full_half(): int {
|
|
1477
|
+
return in_sector_2d(0 - 10000, 0, 0, 0, 0, 314159, 20000);
|
|
1478
|
+
}
|
|
1479
|
+
// Point at 45° angle, dir at 0°, half_angle = π/6 (~52360) — 45° outside half_angle
|
|
1480
|
+
fn test_sector_45_narrow(): int {
|
|
1481
|
+
return in_sector_2d(10000, 10000, 0, 0, 0, 52360, 20000);
|
|
1482
|
+
}
|
|
1483
|
+
`, [MATH_SRC, VEC_SRC, GEOM_SRC]);
|
|
1484
|
+
test('in_sector_2d: point at origin == 1 (always inside)', () => expect(callAndGetRet(rt, 'test_sector_at_origin')).toBe(1));
|
|
1485
|
+
test('in_sector_2d: point at exact radius == 1 (boundary inclusive)', () => expect(callAndGetRet(rt, 'test_sector_radius_boundary')).toBe(1));
|
|
1486
|
+
test('in_sector_2d: point just beyond radius == 0', () => expect(callAndGetRet(rt, 'test_sector_outside_radius')).toBe(0));
|
|
1487
|
+
test('in_sector_2d: dir=π/2, point at 90° == 1', () => expect(callAndGetRet(rt, 'test_sector_dir_90')).toBe(1));
|
|
1488
|
+
test('in_sector_2d: half_angle=π (semicircle), point behind == 1', () => expect(callAndGetRet(rt, 'test_sector_full_half')).toBe(1));
|
|
1489
|
+
test('in_sector_2d: 45° point, narrow half_angle=30° == 0', () => expect(callAndGetRet(rt, 'test_sector_45_narrow')).toBe(0));
|
|
1490
|
+
});
|
|
1491
|
+
// ---------------------------------------------------------------------------
|
|
1492
|
+
// expr.mcrs — expr_eval (extended)
|
|
1493
|
+
// ---------------------------------------------------------------------------
|
|
1494
|
+
describe('expr.mcrs — expr_eval (extended)', () => {
|
|
1495
|
+
const rt = makeRuntime(`
|
|
1496
|
+
// 2*x+1 at x=0 → 0+10000=10000
|
|
1497
|
+
fn test_expr_linear_x0(): int {
|
|
1498
|
+
let toks: int[] = [0, 0, 0, 0, 0];
|
|
1499
|
+
toks[0] = 20000;
|
|
1500
|
+
toks[1] = 0 - 10000;
|
|
1501
|
+
toks[2] = 0 - 3;
|
|
1502
|
+
toks[3] = 10000;
|
|
1503
|
+
toks[4] = 0 - 1;
|
|
1504
|
+
return expr_eval(toks, 5, 0);
|
|
1505
|
+
}
|
|
1506
|
+
// 2*x+1 at x=10000 (1.0) → 20000+10000=30000
|
|
1507
|
+
fn test_expr_linear_x1(): int {
|
|
1508
|
+
let toks: int[] = [0, 0, 0, 0, 0];
|
|
1509
|
+
toks[0] = 20000;
|
|
1510
|
+
toks[1] = 0 - 10000;
|
|
1511
|
+
toks[2] = 0 - 3;
|
|
1512
|
+
toks[3] = 10000;
|
|
1513
|
+
toks[4] = 0 - 1;
|
|
1514
|
+
return expr_eval(toks, 5, 10000);
|
|
1515
|
+
}
|
|
1516
|
+
// 2*x+1 at x=20000 (2.0) → 40000+10000=50000
|
|
1517
|
+
fn test_expr_linear_x2(): int {
|
|
1518
|
+
let toks: int[] = [0, 0, 0, 0, 0];
|
|
1519
|
+
toks[0] = 20000;
|
|
1520
|
+
toks[1] = 0 - 10000;
|
|
1521
|
+
toks[2] = 0 - 3;
|
|
1522
|
+
toks[3] = 10000;
|
|
1523
|
+
toks[4] = 0 - 1;
|
|
1524
|
+
return expr_eval(toks, 5, 20000);
|
|
1525
|
+
}
|
|
1526
|
+
// (x+1)*x at x=20000 (2.0): RPN = [x, 10000, +, x, *] → (2+1)*2=6.0=60000
|
|
1527
|
+
fn test_expr_chain(): int {
|
|
1528
|
+
let toks: int[] = [0, 0, 0, 0, 0];
|
|
1529
|
+
toks[0] = 0 - 10000;
|
|
1530
|
+
toks[1] = 10000;
|
|
1531
|
+
toks[2] = 0 - 1;
|
|
1532
|
+
toks[3] = 0 - 10000;
|
|
1533
|
+
toks[4] = 0 - 3;
|
|
1534
|
+
return expr_eval(toks, 5, 20000);
|
|
1535
|
+
}
|
|
1536
|
+
// n=0: return 0 (empty stack)
|
|
1537
|
+
fn test_expr_n0(): int {
|
|
1538
|
+
let toks: int[] = [10000];
|
|
1539
|
+
return expr_eval(toks, 0, 0);
|
|
1540
|
+
}
|
|
1541
|
+
// Single literal: 42.0 = 420000
|
|
1542
|
+
fn test_expr_literal42(): int {
|
|
1543
|
+
let toks: int[] = [420000];
|
|
1544
|
+
return expr_eval(toks, 1, 0);
|
|
1545
|
+
}
|
|
1546
|
+
// x passthrough: tokens=[-10000], n=1, x=30000 → 30000
|
|
1547
|
+
fn test_expr_x_passthrough(): int {
|
|
1548
|
+
let toks: int[] = [0 - 10000];
|
|
1549
|
+
return expr_eval(toks, 1, 30000);
|
|
1550
|
+
}
|
|
1551
|
+
`, [MATH_SRC, EXPR_SRC]);
|
|
1552
|
+
test('expr_eval: 2*x+1 at x=0 == 10000', () => expect(callAndGetRet(rt, 'test_expr_linear_x0')).toBe(10000));
|
|
1553
|
+
test('expr_eval: 2*x+1 at x=10000 (1.0) == 30000', () => expect(callAndGetRet(rt, 'test_expr_linear_x1')).toBe(30000));
|
|
1554
|
+
test('expr_eval: 2*x+1 at x=20000 (2.0) == 50000', () => expect(callAndGetRet(rt, 'test_expr_linear_x2')).toBe(50000));
|
|
1555
|
+
test('expr_eval: (x+1)*x at x=2.0 == 60000 (chained ops)', () => expect(callAndGetRet(rt, 'test_expr_chain')).toBe(60000));
|
|
1556
|
+
test('expr_eval: n=0 → 0 (empty stack)', () => expect(callAndGetRet(rt, 'test_expr_n0')).toBe(0));
|
|
1557
|
+
test('expr_eval: single literal 420000 → 420000', () => expect(callAndGetRet(rt, 'test_expr_literal42')).toBe(420000));
|
|
1558
|
+
test('expr_eval: x passthrough at x=30000 → 30000', () => expect(callAndGetRet(rt, 'test_expr_x_passthrough')).toBe(30000));
|
|
1559
|
+
});
|
|
1560
|
+
// ---------------------------------------------------------------------------
|
|
1561
|
+
// signal.mcrs — DFT (extended)
|
|
1562
|
+
// ---------------------------------------------------------------------------
|
|
1563
|
+
describe('signal.mcrs — DFT (extended)', () => {
|
|
1564
|
+
const rt = makeRuntime(`
|
|
1565
|
+
// Alternating signal [10000, -10000, 10000, -10000]: DC should be 0
|
|
1566
|
+
fn test_dft_alt_dc(): int {
|
|
1567
|
+
return dft_real(10000, 0 - 10000, 10000, 0 - 10000, 0, 0, 0, 0, 4, 0);
|
|
1568
|
+
}
|
|
1569
|
+
// Alternating signal k=2: should have large real component (signal frequency)
|
|
1570
|
+
fn test_dft_alt_k2(): int {
|
|
1571
|
+
let v: int = dft_real(10000, 0 - 10000, 10000, 0 - 10000, 0, 0, 0, 0, 4, 2);
|
|
1572
|
+
if (v < 0) { v = 0 - v; }
|
|
1573
|
+
if (v >= 5000) { return 1; }
|
|
1574
|
+
return 0;
|
|
1575
|
+
}
|
|
1576
|
+
// dft_imag of alternating signal at k=0 should be 0
|
|
1577
|
+
fn test_dft_alt_imag_dc(): int {
|
|
1578
|
+
return dft_imag(10000, 0 - 10000, 10000, 0 - 10000, 0, 0, 0, 0, 4, 0);
|
|
1579
|
+
}
|
|
1580
|
+
// dft_magnitude of alternating [10000,-10000,10000,-10000] at k=2 should be large
|
|
1581
|
+
fn test_dft_alt_mag_k2(): int {
|
|
1582
|
+
let v: int = dft_magnitude(10000, 0 - 10000, 10000, 0 - 10000, 0, 0, 0, 0, 4, 2);
|
|
1583
|
+
if (v >= 5000) { return 1; }
|
|
1584
|
+
return 0;
|
|
1585
|
+
}
|
|
1586
|
+
// Uniform n=4 k=0: dft_real == mean=10000 (already tested, but verify magnitude==real when imag=0)
|
|
1587
|
+
fn test_dft_uniform_mag_equals_real(): int {
|
|
1588
|
+
let re: int = dft_real(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 0);
|
|
1589
|
+
let mg: int = dft_magnitude(10000, 10000, 10000, 10000, 0, 0, 0, 0, 4, 0);
|
|
1590
|
+
if (re == mg) { return 1; }
|
|
1591
|
+
return 0;
|
|
1592
|
+
}
|
|
1593
|
+
// n=2 signal [20000, 0]: DC = mean = 10000
|
|
1594
|
+
fn test_dft_n2_dc(): int {
|
|
1595
|
+
return dft_real(20000, 0, 0, 0, 0, 0, 0, 0, 2, 0);
|
|
1596
|
+
}
|
|
1597
|
+
// n=2 signal [20000, 0]: k=1 real = (20000 - 0)/2 = 10000
|
|
1598
|
+
fn test_dft_n2_k1(): int {
|
|
1599
|
+
return dft_real(20000, 0, 0, 0, 0, 0, 0, 0, 2, 1);
|
|
1600
|
+
}
|
|
1601
|
+
// Constant signal with n=8, k=4 (Nyquist): real alternates → should be 0 for uniform
|
|
1602
|
+
fn test_dft_n8_k4_uniform(): int {
|
|
1603
|
+
let v: int = dft_real(10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 8, 4);
|
|
1604
|
+
if (v < 0) { v = 0 - v; }
|
|
1605
|
+
if (v <= 500) { return 1; }
|
|
1606
|
+
return 0;
|
|
1607
|
+
}
|
|
1608
|
+
`, [MATH_SRC, SIGNAL_SRC]);
|
|
1609
|
+
test('dft_real(alternating, n=4, k=0) == 0 (DC of alternating = 0)', () => expect(callAndGetRet(rt, 'test_dft_alt_dc')).toBe(0));
|
|
1610
|
+
test('dft_real(alternating, n=4, k=2): large component >= 5000', () => expect(callAndGetRet(rt, 'test_dft_alt_k2')).toBe(1));
|
|
1611
|
+
test('dft_imag(alternating, n=4, k=0) == 0', () => expect(callAndGetRet(rt, 'test_dft_alt_imag_dc')).toBe(0));
|
|
1612
|
+
test('dft_magnitude(alternating, n=4, k=2) >= 5000 (large frequency bin)', () => expect(callAndGetRet(rt, 'test_dft_alt_mag_k2')).toBe(1));
|
|
1613
|
+
test('dft_magnitude == dft_real for uniform DC bin (imag=0)', () => expect(callAndGetRet(rt, 'test_dft_uniform_mag_equals_real')).toBe(1));
|
|
1614
|
+
test('dft_real(n=2, [20000,0], k=0) == 10000 (DC = mean)', () => expect(callAndGetRet(rt, 'test_dft_n2_dc')).toBe(10000));
|
|
1615
|
+
test('dft_real(n=2, [20000,0], k=1) == 10000 (first harmonic)', () => expect(callAndGetRet(rt, 'test_dft_n2_k1')).toBe(10000));
|
|
1616
|
+
test('dft_real(uniform×8, n=8, k=4) ≈ 0 (Nyquist bin near zero)', () => expect(callAndGetRet(rt, 'test_dft_n8_k4_uniform')).toBe(1));
|
|
1617
|
+
});
|
|
1618
|
+
// ---------------------------------------------------------------------------
|
|
1619
|
+
// color.mcrs — RGB↔HSL (extended)
|
|
1620
|
+
// ---------------------------------------------------------------------------
|
|
1621
|
+
describe('color.mcrs — rgb_to_l (extended)', () => {
|
|
1622
|
+
const rt = makeRuntime(`
|
|
1623
|
+
// Gray: R=G=B=1275000 (half of 2550000) → L = (max+min)/510 = (1275000+1275000)/510 = 5000
|
|
1624
|
+
fn test_l_gray(): int { return rgb_to_l(1275000, 1275000, 1275000); }
|
|
1625
|
+
// Red-only: max=2550000, min=0 → L=(2550000+0)/510=5000
|
|
1626
|
+
fn test_l_red(): int { return rgb_to_l(2550000, 0, 0); }
|
|
1627
|
+
// Blue-only: same as red → L=5000
|
|
1628
|
+
fn test_l_blue(): int { return rgb_to_l(0, 0, 2550000); }
|
|
1629
|
+
`, [COLOR_SRC]);
|
|
1630
|
+
test('rgb_to_l(gray) == 5000 (L = 0.5)', () => expect(callAndGetRet(rt, 'test_l_gray')).toBe(5000));
|
|
1631
|
+
test('rgb_to_l(pure red) == 5000 (L = 0.5)', () => expect(callAndGetRet(rt, 'test_l_red')).toBe(5000));
|
|
1632
|
+
test('rgb_to_l(pure blue) == 5000 (L = 0.5)', () => expect(callAndGetRet(rt, 'test_l_blue')).toBe(5000));
|
|
1633
|
+
});
|
|
1634
|
+
describe('color.mcrs — rgb_to_s (extended)', () => {
|
|
1635
|
+
const rt = makeRuntime(`
|
|
1636
|
+
// Gray → S = 0
|
|
1637
|
+
fn test_s_gray(): int { return rgb_to_s(1275000, 1275000, 1275000); }
|
|
1638
|
+
// Black → S = 0
|
|
1639
|
+
fn test_s_black(): int { return rgb_to_s(0, 0, 0); }
|
|
1640
|
+
// Pure green → S = 10000
|
|
1641
|
+
fn test_s_green(): int { return rgb_to_s(0, 2550000, 0); }
|
|
1642
|
+
// Pure blue → S > 0
|
|
1643
|
+
fn test_s_blue(): int { return rgb_to_s(0, 0, 2550000); }
|
|
1644
|
+
`, [COLOR_SRC]);
|
|
1645
|
+
test('rgb_to_s(gray) == 0 (gray has no saturation)', () => expect(callAndGetRet(rt, 'test_s_gray')).toBe(0));
|
|
1646
|
+
test('rgb_to_s(black) == 0', () => expect(callAndGetRet(rt, 'test_s_black')).toBe(0));
|
|
1647
|
+
test('rgb_to_s(pure green) == 10000 (max saturation)', () => expect(callAndGetRet(rt, 'test_s_green')).toBe(10000));
|
|
1648
|
+
test('rgb_to_s(pure blue) > 0', () => expect(callAndGetRet(rt, 'test_s_blue')).toBeGreaterThan(0));
|
|
1649
|
+
});
|
|
1650
|
+
describe('color.mcrs — rgb_to_h (extended)', () => {
|
|
1651
|
+
const rt = makeRuntime(`
|
|
1652
|
+
// Pure red (max=R): h = 600000*(g-b)/d = 0
|
|
1653
|
+
fn test_h_red(): int { return rgb_to_h(2550000, 0, 0); }
|
|
1654
|
+
// Pure green (max=G): h = 1200000 + 600000*(b-r)/d = 1200000
|
|
1655
|
+
fn test_h_green(): int { return rgb_to_h(0, 2550000, 0); }
|
|
1656
|
+
// Pure blue (max=B): h = 2400000 + 600000*(r-g)/d = 2400000
|
|
1657
|
+
fn test_h_blue(): int { return rgb_to_h(0, 0, 2550000); }
|
|
1658
|
+
// Gray → h = 0 (achromatic, d=0)
|
|
1659
|
+
fn test_h_gray(): int { return rgb_to_h(1275000, 1275000, 1275000); }
|
|
1660
|
+
// Black → h = 0
|
|
1661
|
+
fn test_h_black(): int { return rgb_to_h(0, 0, 0); }
|
|
1662
|
+
`, [COLOR_SRC]);
|
|
1663
|
+
test('rgb_to_h(pure red) == 0', () => expect(callAndGetRet(rt, 'test_h_red')).toBe(0));
|
|
1664
|
+
test('rgb_to_h(pure green) == 1200000 (120° × 10000)', () => expect(callAndGetRet(rt, 'test_h_green')).toBe(1200000));
|
|
1665
|
+
test('rgb_to_h(pure blue) == 2400000 (240° × 10000)', () => expect(callAndGetRet(rt, 'test_h_blue')).toBe(2400000));
|
|
1666
|
+
test('rgb_to_h(gray) == 0 (achromatic)', () => expect(callAndGetRet(rt, 'test_h_gray')).toBe(0));
|
|
1667
|
+
test('rgb_to_h(black) == 0', () => expect(callAndGetRet(rt, 'test_h_black')).toBe(0));
|
|
1668
|
+
});
|
|
1669
|
+
describe('color.mcrs — hsl_to_r/g/b (extended)', () => {
|
|
1670
|
+
const rt = makeRuntime(`
|
|
1671
|
+
// hsl_to_r(0, 10000, 5000): red hue, full sat, mid lightness → R≈2550000
|
|
1672
|
+
fn test_hsl_r_red(): int { return hsl_to_r(0, 10000, 5000); }
|
|
1673
|
+
// hsl_to_g(0, 10000, 5000): red hue → G≈0
|
|
1674
|
+
fn test_hsl_g_from_red_hue(): int { return hsl_to_g(0, 10000, 5000); }
|
|
1675
|
+
// hsl_to_b(0, 10000, 5000): red hue → B≈0
|
|
1676
|
+
fn test_hsl_b_from_red_hue(): int { return hsl_to_b(0, 10000, 5000); }
|
|
1677
|
+
// hsl_to_g(1200000, 10000, 5000): green hue → G≈2550000
|
|
1678
|
+
fn test_hsl_g_green(): int { return hsl_to_g(1200000, 10000, 5000); }
|
|
1679
|
+
// hsl_to_r(1200000, 10000, 5000): green hue → R≈0
|
|
1680
|
+
fn test_hsl_r_from_green_hue(): int { return hsl_to_r(1200000, 10000, 5000); }
|
|
1681
|
+
// hsl_to_b(2400000, 10000, 5000): blue hue → B≈2550000
|
|
1682
|
+
fn test_hsl_b_blue(): int { return hsl_to_b(2400000, 10000, 5000); }
|
|
1683
|
+
// Gray: h=0, s=0, l=5000 → R=G=B = m*255 = 5000*255 = 1275000
|
|
1684
|
+
fn test_hsl_r_gray(): int { return hsl_to_r(0, 0, 5000); }
|
|
1685
|
+
fn test_hsl_g_gray(): int { return hsl_to_g(0, 0, 5000); }
|
|
1686
|
+
fn test_hsl_b_gray(): int { return hsl_to_b(0, 0, 5000); }
|
|
1687
|
+
`, [COLOR_SRC]);
|
|
1688
|
+
test('hsl_to_r(0, 10000, 5000) ≈ 2550000 (red)', () => {
|
|
1689
|
+
const v = callAndGetRet(rt, 'test_hsl_r_red');
|
|
1690
|
+
expect(Math.abs(v - 2550000)).toBeLessThanOrEqual(1000);
|
|
1691
|
+
});
|
|
1692
|
+
test('hsl_to_g(0, 10000, 5000) ≈ 0 (red hue → no green)', () => {
|
|
1693
|
+
const v = callAndGetRet(rt, 'test_hsl_g_from_red_hue');
|
|
1694
|
+
expect(v).toBeLessThanOrEqual(1000);
|
|
1695
|
+
});
|
|
1696
|
+
test('hsl_to_b(0, 10000, 5000) ≈ 0 (red hue → no blue)', () => {
|
|
1697
|
+
const v = callAndGetRet(rt, 'test_hsl_b_from_red_hue');
|
|
1698
|
+
expect(v).toBeLessThanOrEqual(1000);
|
|
1699
|
+
});
|
|
1700
|
+
test('hsl_to_g(1200000, 10000, 5000) ≈ 2550000 (green hue → max green)', () => {
|
|
1701
|
+
const v = callAndGetRet(rt, 'test_hsl_g_green');
|
|
1702
|
+
expect(Math.abs(v - 2550000)).toBeLessThanOrEqual(1000);
|
|
1703
|
+
});
|
|
1704
|
+
test('hsl_to_r(1200000, 10000, 5000) ≈ 0 (green hue → no red)', () => {
|
|
1705
|
+
const v = callAndGetRet(rt, 'test_hsl_r_from_green_hue');
|
|
1706
|
+
expect(v).toBeLessThanOrEqual(1000);
|
|
1707
|
+
});
|
|
1708
|
+
test('hsl_to_b(2400000, 10000, 5000) ≈ 2550000 (blue hue → max blue)', () => {
|
|
1709
|
+
const v = callAndGetRet(rt, 'test_hsl_b_blue');
|
|
1710
|
+
expect(Math.abs(v - 2550000)).toBeLessThanOrEqual(1000);
|
|
1711
|
+
});
|
|
1712
|
+
test('hsl_to_r(gray) == hsl_to_g(gray) == hsl_to_b(gray) == 1275000', () => {
|
|
1713
|
+
const r = callAndGetRet(rt, 'test_hsl_r_gray');
|
|
1714
|
+
const g = callAndGetRet(rt, 'test_hsl_g_gray');
|
|
1715
|
+
const b = callAndGetRet(rt, 'test_hsl_b_gray');
|
|
1716
|
+
expect(r).toBe(1275000);
|
|
1717
|
+
expect(g).toBe(1275000);
|
|
1718
|
+
expect(b).toBe(1275000);
|
|
1719
|
+
});
|
|
1720
|
+
});
|
|
1721
|
+
// ---------------------------------------------------------------------------
|
|
1722
|
+
// world.mcrs — sun_azimuth (extended)
|
|
1723
|
+
// ---------------------------------------------------------------------------
|
|
1724
|
+
describe('world.mcrs — sun_azimuth (extended)', () => {
|
|
1725
|
+
const rt = makeRuntime(`
|
|
1726
|
+
fn test_azimuth_half_day(): int { return sun_azimuth(12000); }
|
|
1727
|
+
fn test_azimuth_full_day(): int { return sun_azimuth(24000); }
|
|
1728
|
+
fn test_azimuth_three_quarter(): int { return sun_azimuth(18000); }
|
|
1729
|
+
fn test_azimuth_quarter_plus(): int { return sun_azimuth(8000); }
|
|
1730
|
+
`, [WORLD_SRC, MATH_SRC]);
|
|
1731
|
+
test('sun_azimuth(12000) == 1800000 (half day = 180°)', () => expect(callAndGetRet(rt, 'test_azimuth_half_day')).toBe(1800000));
|
|
1732
|
+
test('sun_azimuth(24000) == 0 (full day wraps to 0)', () => expect(callAndGetRet(rt, 'test_azimuth_full_day')).toBe(0));
|
|
1733
|
+
test('sun_azimuth(18000) == 2700000 (three-quarter day = 270°)', () => expect(callAndGetRet(rt, 'test_azimuth_three_quarter')).toBe(2700000));
|
|
1734
|
+
test('sun_azimuth(8000) == 1200000 (8000/24000 × 360° × 10000)', () => expect(callAndGetRet(rt, 'test_azimuth_quarter_plus')).toBe(1200000));
|
|
1735
|
+
});
|
|
1736
|
+
// ---------------------------------------------------------------------------
|
|
1737
|
+
// graph.mcrs — runtime
|
|
1738
|
+
// ---------------------------------------------------------------------------
|
|
1739
|
+
describe('graph.mcrs — runtime', () => {
|
|
1740
|
+
const GRAPH_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/graph.mcrs'), 'utf-8');
|
|
1741
|
+
const rt = makeRuntime(`
|
|
1742
|
+
fn build_graph(): int[] {
|
|
1743
|
+
let g: int[] = graph_new(5);
|
|
1744
|
+
g = graph_add_edge(g, 0, 1, 1);
|
|
1745
|
+
g = graph_add_edge(g, 0, 2, 4);
|
|
1746
|
+
g = graph_add_edge(g, 1, 3, 2);
|
|
1747
|
+
g = graph_add_edge(g, 2, 4, 3);
|
|
1748
|
+
g = graph_add_edge(g, 1, 2, 2);
|
|
1749
|
+
return g;
|
|
1750
|
+
}
|
|
1751
|
+
|
|
1752
|
+
fn build_weighted_graph(): int[] {
|
|
1753
|
+
let g: int[] = graph_new(5);
|
|
1754
|
+
g = graph_add_edge(g, 0, 1, 1);
|
|
1755
|
+
g = graph_add_edge(g, 0, 2, 4);
|
|
1756
|
+
g = graph_add_edge(g, 1, 2, 2);
|
|
1757
|
+
g = graph_add_edge(g, 1, 3, 5);
|
|
1758
|
+
g = graph_add_edge(g, 2, 3, 1);
|
|
1759
|
+
g = graph_add_edge(g, 3, 4, 3);
|
|
1760
|
+
return g;
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
fn test_graph_counts(): int {
|
|
1764
|
+
let g: int[] = graph_new(4);
|
|
1765
|
+
g = graph_add_undirected(g, 0, 1, 7);
|
|
1766
|
+
g = graph_add_edge(g, 1, 2, 3);
|
|
1767
|
+
return graph_node_count(g) * 100 + graph_edge_count(g);
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1770
|
+
fn test_bfs_order(): int {
|
|
1771
|
+
let g: int[] = build_graph();
|
|
1772
|
+
let vis: int[] = [0, 0, 0, 0, 0];
|
|
1773
|
+
let order: int[] = graph_bfs(g, 0, vis);
|
|
1774
|
+
return order[0] * 10000 + order[1] * 1000 + order[2] * 100 + order[3] * 10 + order[4];
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
fn test_bfs_visited(): int {
|
|
1778
|
+
let g: int[] = build_graph();
|
|
1779
|
+
let vis: int[] = [0, 0, 0, 0, 0];
|
|
1780
|
+
let order: int[] = graph_bfs(g, 0, vis);
|
|
1781
|
+
return vis[0] * 10000 + vis[1] * 1000 + vis[2] * 100 + vis[3] * 10 + vis[4];
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1784
|
+
fn test_dfs_order(): int {
|
|
1785
|
+
let g: int[] = build_graph();
|
|
1786
|
+
let vis: int[] = [0, 0, 0, 0, 0];
|
|
1787
|
+
let order: int[] = graph_dfs(g, 0, vis);
|
|
1788
|
+
return order[0] * 10000 + order[1] * 1000 + order[2] * 100 + order[3] * 10 + order[4];
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
fn test_has_path_yes(): int {
|
|
1792
|
+
let g: int[] = build_graph();
|
|
1793
|
+
return graph_has_path(g, 0, 4);
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
fn test_has_path_no(): int {
|
|
1797
|
+
let g: int[] = build_graph();
|
|
1798
|
+
return graph_has_path(g, 4, 0);
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
fn test_shortest_path(): int {
|
|
1802
|
+
let g: int[] = build_weighted_graph();
|
|
1803
|
+
let dist: int[] = [0, 0, 0, 0, 0];
|
|
1804
|
+
return graph_shortest_path(g, 0, 4, dist);
|
|
1805
|
+
}
|
|
1806
|
+
|
|
1807
|
+
fn test_shortest_path_distances(): int {
|
|
1808
|
+
let g: int[] = build_weighted_graph();
|
|
1809
|
+
let dist: int[] = [0, 0, 0, 0, 0];
|
|
1810
|
+
let best: int = graph_shortest_path(g, 0, 4, dist);
|
|
1811
|
+
return best * 1000 + dist[2] * 100 + dist[3] * 10 + dist[4];
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
fn test_shortest_path_unreachable(): int {
|
|
1815
|
+
let g: int[] = graph_new(3);
|
|
1816
|
+
g = graph_add_edge(g, 0, 1, 2);
|
|
1817
|
+
let dist: int[] = [0, 0, 0];
|
|
1818
|
+
return graph_shortest_path(g, 1, 2, dist);
|
|
1819
|
+
}
|
|
1820
|
+
`, [GRAPH_SRC]);
|
|
1821
|
+
test('graph metadata reports node and edge counts', () => expect(callAndGetRet(rt, 'test_graph_counts')).toBe(403));
|
|
1822
|
+
test('graph_bfs returns discovery order', () => expect(callAndGetRet(rt, 'test_bfs_order')).toBe(1234));
|
|
1823
|
+
test('graph_bfs marks reachable nodes in out_visited', () => expect(callAndGetRet(rt, 'test_bfs_visited')).toBe(11111));
|
|
1824
|
+
test('graph_dfs returns iterative DFS order', () => expect(callAndGetRet(rt, 'test_dfs_order')).toBe(1324));
|
|
1825
|
+
test('graph_has_path returns 1 when reachable', () => expect(callAndGetRet(rt, 'test_has_path_yes')).toBe(1));
|
|
1826
|
+
test('graph_has_path returns 0 when unreachable', () => expect(callAndGetRet(rt, 'test_has_path_no')).toBe(0));
|
|
1827
|
+
test('graph_shortest_path returns weighted shortest distance', () => expect(callAndGetRet(rt, 'test_shortest_path')).toBe(7));
|
|
1828
|
+
test('graph_shortest_path fills out_dist for reachable nodes', () => expect(callAndGetRet(rt, 'test_shortest_path_distances')).toBe(7347));
|
|
1829
|
+
test('graph_shortest_path returns -1 when dst is unreachable', () => expect(callAndGetRet(rt, 'test_shortest_path_unreachable')).toBe(-1));
|
|
1830
|
+
});
|
|
1831
|
+
describe('ode.mcrs — runtime', () => {
|
|
1832
|
+
const rt = makeRuntime(`
|
|
1833
|
+
fn test_decay_y(): int {
|
|
1834
|
+
ode_run(1, 0, 10000, 1000, 10, 10000);
|
|
1835
|
+
return ode_get_y();
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
fn test_growth_y(): int {
|
|
1839
|
+
ode_run(2, 0, 10000, 1000, 5, 10000);
|
|
1840
|
+
return ode_get_y();
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
fn test_final_t(): int {
|
|
1844
|
+
ode_run(1, 2500, 10000, 1000, 10, 10000);
|
|
1845
|
+
return ode_get_t();
|
|
1846
|
+
}
|
|
1847
|
+
`, [MATH_SRC, ODE_SRC]);
|
|
1848
|
+
test('ode_run decay stays near e^-1', () => {
|
|
1849
|
+
const val = callAndGetRet(rt, 'test_decay_y');
|
|
1850
|
+
expect(val).toBeGreaterThanOrEqual(3629);
|
|
1851
|
+
expect(val).toBeLessThanOrEqual(3729);
|
|
1852
|
+
});
|
|
1853
|
+
test('ode_run growth stays near e^0.5', () => {
|
|
1854
|
+
const val = callAndGetRet(rt, 'test_growth_y');
|
|
1855
|
+
expect(val).toBeGreaterThanOrEqual(16287);
|
|
1856
|
+
expect(val).toBeLessThanOrEqual(16687);
|
|
1857
|
+
});
|
|
1858
|
+
test('ode_get_t returns t0 + steps*h', () => expect(callAndGetRet(rt, 'test_final_t')).toBe(12500));
|
|
1859
|
+
});
|
|
1860
|
+
// ---------------------------------------------------------------------------
|
|
1861
|
+
// linalg.mcrs — runtime
|
|
1862
|
+
// NOTE: double arithmetic intrinsics (double_mul, double_add, etc.) rely on
|
|
1863
|
+
// MC entity commands that do not execute in MCRuntime. Only operations whose
|
|
1864
|
+
// result is zero (so the multiply-by-zero path short-circuits correctly) and
|
|
1865
|
+
// the integer zero-length guard are verifiable here.
|
|
1866
|
+
// ---------------------------------------------------------------------------
|
|
1867
|
+
describe('linalg.mcrs — runtime', () => {
|
|
1868
|
+
const LINALG_SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/linalg.mcrs'), 'utf-8');
|
|
1869
|
+
const rt = makeRuntime(`
|
|
1870
|
+
// dot(⊥) = 0
|
|
1871
|
+
fn test_dot2d_perp(): int {
|
|
1872
|
+
let d: double = vec2d_dot(1.0d, 0.0d, 0.0d, 1.0d);
|
|
1873
|
+
return d as int;
|
|
1874
|
+
}
|
|
1875
|
+
fn test_dot3d_perp(): int {
|
|
1876
|
+
let d: double = vec3d_dot(1.0d, 0.0d, 0.0d, 0.0d, 1.0d, 0.0d);
|
|
1877
|
+
return d as int;
|
|
1878
|
+
}
|
|
1879
|
+
// cross of parallel vectors = (0, 0, 0)
|
|
1880
|
+
fn test_cross_parallel_x(): int {
|
|
1881
|
+
let d: double = vec3d_cross_x(2.0d, 0.0d, 0.0d, 3.0d, 0.0d, 0.0d);
|
|
1882
|
+
return d as int;
|
|
1883
|
+
}
|
|
1884
|
+
fn test_cross_parallel_y(): int {
|
|
1885
|
+
let d: double = vec3d_cross_y(2.0d, 0.0d, 0.0d, 3.0d, 0.0d, 0.0d);
|
|
1886
|
+
return d as int;
|
|
1887
|
+
}
|
|
1888
|
+
fn test_cross_parallel_z(): int {
|
|
1889
|
+
let d: double = vec3d_cross_z(2.0d, 0.0d, 0.0d, 3.0d, 0.0d, 0.0d);
|
|
1890
|
+
return d as int;
|
|
1891
|
+
}
|
|
1892
|
+
// normalize zero-length vector returns 0.0
|
|
1893
|
+
fn test_normalize2d_zero_x(): int {
|
|
1894
|
+
let d: double = vec2d_normalize_x(0.0d, 0.0d);
|
|
1895
|
+
return d as int;
|
|
1896
|
+
}
|
|
1897
|
+
fn test_normalize2d_zero_y(): int {
|
|
1898
|
+
let d: double = vec2d_normalize_y(0.0d, 0.0d);
|
|
1899
|
+
return d as int;
|
|
1900
|
+
}
|
|
1901
|
+
fn test_normalize3d_zero_x(): int {
|
|
1902
|
+
let d: double = vec3d_normalize_x(0.0d, 0.0d, 0.0d);
|
|
1903
|
+
return d as int;
|
|
1904
|
+
}
|
|
1905
|
+
fn test_normalize3d_zero_z(): int {
|
|
1906
|
+
let d: double = vec3d_normalize_z(0.0d, 0.0d, 0.0d);
|
|
1907
|
+
return d as int;
|
|
1908
|
+
}
|
|
1909
|
+
// mat2d_vecmul with zero column
|
|
1910
|
+
fn test_matmul_zero_col(): int {
|
|
1911
|
+
let d: double = mat2d_vecmul_x(0.0d, 0.0d, 0.0d, 1.0d, 3.0d, 4.0d);
|
|
1912
|
+
return d as int;
|
|
1913
|
+
}
|
|
1914
|
+
// solve2d: Cramer numerator zero → x = 0
|
|
1915
|
+
// A = [[0, 1], [1, 0]], b = [0, 5] → x = (0*0 - 1*5) / det(0,1,1,0)
|
|
1916
|
+
// det = 0*0 - 1*1 = -1 (but double_mul won't compute 1*1 correctly)
|
|
1917
|
+
// Instead test with b=[0,0] → x = 0
|
|
1918
|
+
fn test_solve2d_x_zero_rhs(): int {
|
|
1919
|
+
let d: double = solve2d_x(1.0d, 0.0d, 0.0d, 1.0d, 0.0d, 0.0d);
|
|
1920
|
+
return d as int;
|
|
1921
|
+
}
|
|
1922
|
+
fn test_solve2d_y_zero_rhs(): int {
|
|
1923
|
+
let d: double = solve2d_y(1.0d, 0.0d, 0.0d, 1.0d, 0.0d, 0.0d);
|
|
1924
|
+
return d as int;
|
|
1925
|
+
}
|
|
1926
|
+
`, [MATH_SRC, MATH_HP_SRC, LINALG_SRC]);
|
|
1927
|
+
test('vec2d_dot of perpendicular unit vectors = 0', () => expect(callAndGetRet(rt, 'test_dot2d_perp')).toBe(0));
|
|
1928
|
+
test('vec3d_dot of perpendicular unit vectors = 0', () => expect(callAndGetRet(rt, 'test_dot3d_perp')).toBe(0));
|
|
1929
|
+
test('vec3d_cross_x of parallel vectors = 0', () => expect(callAndGetRet(rt, 'test_cross_parallel_x')).toBe(0));
|
|
1930
|
+
test('vec3d_cross_y of parallel vectors = 0', () => expect(callAndGetRet(rt, 'test_cross_parallel_y')).toBe(0));
|
|
1931
|
+
test('vec3d_cross_z of parallel vectors = 0', () => expect(callAndGetRet(rt, 'test_cross_parallel_z')).toBe(0));
|
|
1932
|
+
test('vec2d_normalize_x of zero vector = 0', () => expect(callAndGetRet(rt, 'test_normalize2d_zero_x')).toBe(0));
|
|
1933
|
+
test('vec2d_normalize_y of zero vector = 0', () => expect(callAndGetRet(rt, 'test_normalize2d_zero_y')).toBe(0));
|
|
1934
|
+
test('vec3d_normalize_x of zero vector = 0', () => expect(callAndGetRet(rt, 'test_normalize3d_zero_x')).toBe(0));
|
|
1935
|
+
test('vec3d_normalize_z of zero vector = 0', () => expect(callAndGetRet(rt, 'test_normalize3d_zero_z')).toBe(0));
|
|
1936
|
+
test('mat2d_vecmul_x with zero row = 0', () => expect(callAndGetRet(rt, 'test_matmul_zero_col')).toBe(0));
|
|
1937
|
+
test('solve2d_x with zero rhs = 0', () => expect(callAndGetRet(rt, 'test_solve2d_x_zero_rhs')).toBe(0));
|
|
1938
|
+
test('solve2d_y with zero rhs = 0', () => expect(callAndGetRet(rt, 'test_solve2d_y_zero_rhs')).toBe(0));
|
|
1939
|
+
});
|
|
324
1940
|
//# sourceMappingURL=stdlib-e2e.test.js.map
|