From 414f754508c690d85e515e9afc393d4986baf852 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Wed, 1 Apr 2026 18:45:20 -0400 Subject: [PATCH 01/60] Begin adding tests. --- .github/workflows/ci.yml | 2 +- build.ps1 | 2 +- tests/cases/failing/abs-type-bool.pre | 2 + tests/cases/failing/abs-type-str.pre | 2 + tests/cases/failing/add-mixed-types.pre | 1 + tests/cases/failing/all-arity-zero.pre | 1 + tests/cases/failing/and-arity-three.pre | 1 + tests/cases/failing/and-arity-zero.pre | 1 + tests/cases/failing/any-arity-zero.pre | 1 + tests/cases/failing/assert-false.pre | 1 + tests/cases/failing/at-in-ident.pre | 1 + tests/cases/failing/band-radix.pre | 1 + tests/cases/failing/base-func.pre | 1 + tests/cases/failing/base-map.pre | 1 + tests/cases/failing/base-string.pre | 1 + tests/cases/failing/base-thr.pre | 1 + tests/cases/failing/bnot-radix.pre | 1 + tests/cases/failing/bool-lowercase.pre | 1 + tests/cases/failing/bor-radix.pre | 1 + tests/cases/failing/break-no-argument.pre | 3 + tests/cases/failing/break-outside-loop.pre | 1 + tests/cases/failing/break-target-not-int.pre | 3 + tests/cases/failing/break-too-deep.pre | 3 + tests/cases/failing/break-zero.pre | 3 + tests/cases/failing/bxor-radix.pre | 1 + tests/cases/failing/bytes-endian-case.pre | 1 + tests/cases/failing/bytes-first-bool.pre | 1 + tests/cases/failing/bytes-first-flt.pre | 1 + tests/cases/failing/bytes-first-func.pre | 2 + tests/cases/failing/bytes-first-map.pre | 1 + tests/cases/failing/bytes-first-thr.pre | 1 + tests/cases/failing/bytes-first-tns.pre | 1 + tests/cases/failing/bytes-invalid-endian.pre | 1 + tests/cases/failing/bytes-negative.pre | 1 + tests/cases/failing/bytes-second-bool.pre | 1 + tests/cases/failing/bytes-second-flt.pre | 1 + tests/cases/failing/bytes-second-func.pre | 2 + tests/cases/failing/bytes-second-int.pre | 1 + tests/cases/failing/bytes-second-map.pre | 1 + tests/cases/failing/bytes-second-thr.pre | 1 + tests/cases/failing/bytes-second-tns.pre | 1 + tests/cases/failing/bytes-value-type.pre | 1 + tests/cases/failing/catch-no-try.pre | 1 + tests/cases/failing/cdiv-zero-flt.pre | 1 + tests/cases/failing/cdiv-zero-int.pre | 1 + tests/cases/failing/clog-float.pre | 1 + tests/cases/failing/clog-negative.pre | 1 + tests/cases/failing/clog-zero.pre | 1 + .../failing/close-curly-bracket-in-ident.pre | 1 + .../failing/close-parentheses-in-ident.pre | 1 + .../failing/close-square-bracket-in-ident.pre | 1 + tests/cases/failing/comma-in-ident.pre | 1 + tests/cases/failing/continue-no-parens.pre | 3 + tests/cases/failing/continue-outside-loop.pre | 1 + .../cases/failing/continue-with-argument.pre | 3 + .../cases/failing/convert-base-too-large.pre | 1 + .../cases/failing/convert-base-too-small.pre | 1 + .../cases/failing/convert-base-wrong-type.pre | 1 + tests/cases/failing/convert-value-map.pre | 1 + tests/cases/failing/convert-value-string.pre | 1 + .../failing/del-already-deleted-symbol.pre | 3 + .../failing/del-map-intermediate-not-map.pre | 2 + .../cases/failing/del-map-target-not-map.pre | 2 + .../failing/del-never-assigned-symbol.pre | 2 + .../cases/failing/del-nonexistent-symbol.pre | 1 + .../del-type-mismatch-after-delete.pre | 3 + tests/cases/failing/div-zero-flt.pre | 1 + tests/cases/failing/div-zero-int.pre | 1 + tests/cases/failing/else-no-if.pre | 3 + tests/cases/failing/elseif-after-else.pre | 7 + tests/cases/failing/elseif-else-seperated.pre | 9 + .../cases/failing/elseif-elseif-seperated.pre | 9 + tests/cases/failing/elseif-no-if.pre | 3 + tests/cases/failing/empty-identifier.pre | 1 + tests/cases/failing/eq-arity-one.pre | 1 + tests/cases/failing/eq-arity-three.pre | 1 + tests/cases/failing/equals-in-ident.pre | 1 + tests/cases/failing/first-assign-no-type.pre | 1 + tests/cases/failing/first-decl-no-type.pre | 1 + tests/cases/failing/flt-invalid-digit.pre | 1 + tests/cases/failing/flt-negative-nan.pre | 1 + tests/cases/failing/flt-no-fraction.pre | 1 + tests/cases/failing/flt-no-integer.pre | 1 + tests/cases/failing/flt-plus-sign.pre | 1 + tests/cases/failing/for-no-block.pre | 1 + tests/cases/failing/for-no-target.pre | 1 + tests/cases/failing/for-target-not-int.pre | 1 + tests/cases/failing/froot-neg-even.pre | 1 + tests/cases/failing/fsum-str.pre | 1 + .../func-default-before-positional.pre | 3 + .../cases/failing/func-missing-param-type.pre | 3 + .../failing/func-missing-return-type.pre | 3 + .../failing/func-name-conflicts-builtin.pre | 3 + .../failing/func-name-conflicts-symbol.pre | 4 + .../failing/func-positional-after-keyword.pre | 5 + tests/cases/failing/gcd-arity-one.pre | 1 + tests/cases/failing/gcd-arity-three.pre | 1 + .../failing/gcd-mixed-types-reversed.pre | 1 + tests/cases/failing/gcd-mixed-types.pre | 1 + tests/cases/failing/gcd-type-bool.pre | 1 + tests/cases/failing/gcd-type-str.pre | 1 + tests/cases/failing/goto-no-parens.pre | 2 + tests/cases/failing/gotopoint-no-parens.pre | 1 + tests/cases/failing/hash-in-ident.pre | 1 + tests/cases/failing/iadd-coerce-int-inf.pre | 1 + tests/cases/failing/iadd-coerce-int-nan.pre | 1 + tests/cases/failing/iadd-coerce-int-str.pre | 1 + tests/cases/failing/iadd-coerce-str-int.pre | 1 + tests/cases/failing/iadd-coerce-type-bool.pre | 1 + tests/cases/failing/iadd-coerce-type-map.pre | 1 + tests/cases/failing/idiv-zero-int.pre | 3 + tests/cases/failing/if-else-no-block.pre | 1 + tests/cases/failing/if-else-seperated.pre | 7 + tests/cases/failing/if-elseif-no-block.pre | 1 + .../cases/failing/if-elseif-no-condition.pre | 1 + tests/cases/failing/if-elseif-seperated.pre | 7 + tests/cases/failing/if-no-block.pre | 1 + tests/cases/failing/if-no-condition.pre | 1 + tests/cases/failing/ilen-non-int.pre | 1 + tests/cases/failing/int-invalid-digit.pre | 3 + tests/cases/failing/int-missing-digits.pre | 1 + tests/cases/failing/int-plus-sign.pre | 1 + tests/cases/failing/int-r-bad-format.pre | 2 + tests/cases/failing/int-r-base-too-large.pre | 1 + tests/cases/failing/int-r-base-too-small.pre | 1 + tests/cases/failing/int-r-missing-digits.pre | 1 + .../cases/failing/iroot-int-zero-exponent.pre | 1 + tests/cases/failing/join-mixed-sign.pre | 1 + tests/cases/failing/join-mixed-types.pre | 1 + .../lambda-default-before-positional.pre | 3 + .../failing/lambda-missing-param-type.pre | 3 + .../failing/lambda-missing-return-type.pre | 3 + tests/cases/failing/lcm-arity-one.pre | 1 + tests/cases/failing/lcm-arity-three.pre | 1 + .../failing/lcm-mixed-types-reversed.pre | 1 + tests/cases/failing/lcm-mixed-types.pre | 1 + tests/cases/failing/lcm-type-bool.pre | 1 + tests/cases/failing/lcm-type-str.pre | 1 + tests/cases/failing/len-unsupported.pre | 1 + tests/cases/failing/log-negative.pre | 1 + tests/cases/failing/log-non-numeric.pre | 1 + tests/cases/failing/log-zero.pre | 1 + tests/cases/failing/lower-arity-two.pre | 1 + tests/cases/failing/lower-arity-zero.pre | 1 + tests/cases/failing/lower-non-str.pre | 1 + .../failing/map-literal-bad-key-bool.pre | 1 + .../cases/failing/map-literal-bad-key-tns.pre | 1 + .../failing/map-literal-missing-equals.pre | 1 + .../failing/map-literal-self-bad-key.pre | 1 + .../failing/map-literal-self-forward.pre | 1 + .../failing/map-literal-trailing-comma.pre | 1 + tests/cases/failing/max-mixed-types.pre | 2 + .../failing/max-tns-mixed-element-type.pre | 4 + tests/cases/failing/min-mixed-types.pre | 2 + .../failing/min-tns-mixed-element-type.pre | 4 + tests/cases/failing/mod-zero-flt.pre | 1 + tests/cases/failing/mod-zero-int.pre | 1 + tests/cases/failing/neg-type-bool.pre | 2 + tests/cases/failing/neg-type-str.pre | 2 + tests/cases/failing/neq-arity-one.pre | 1 + tests/cases/failing/neq-arity-three.pre | 1 + tests/cases/failing/non-ascii.pre | 1 + tests/cases/failing/not-arity-two.pre | 1 + tests/cases/failing/not-arity-zero.pre | 1 + tests/cases/failing/one-starts-ident.pre | 1 + tests/cases/failing/op-flt-bad-str.pre | 1 + tests/cases/failing/op-flt-func.pre | 5 + tests/cases/failing/op-flt-map.pre | 1 + tests/cases/failing/op-flt-thr.pre | 2 + tests/cases/failing/op-gt-mixed-type.pre | 1 + tests/cases/failing/op-gte-mixed-type.pre | 1 + tests/cases/failing/op-int-func.pre | 5 + tests/cases/failing/op-int-map.pre | 1 + tests/cases/failing/op-int-thr.pre | 2 + tests/cases/failing/op-lt-mixed-type.pre | 1 + tests/cases/failing/op-lte-mixed-type.pre | 1 + tests/cases/failing/op-str-func.pre | 5 + tests/cases/failing/op-str-lambda.pre | 1 + tests/cases/failing/op-str-map.pre | 1 + tests/cases/failing/op-str-thr.pre | 2 + tests/cases/failing/op-str-tns.pre | 1 + tests/cases/failing/op-tns-bad-shape-type.pre | 1 + tests/cases/failing/op-tns-bad-shape.pre | 1 + tests/cases/failing/op-tns-bool.pre | 2 + tests/cases/failing/op-tns-flt.pre | 1 + tests/cases/failing/op-tns-func.pre | 5 + tests/cases/failing/op-tns-int.pre | 1 + tests/cases/failing/op-tns-map.pre | 2 + tests/cases/failing/op-tns-thr.pre | 2 + .../failing/open-curly-bracket-in-ident.pre | 1 + .../failing/open-parentheses-in-ident.pre | 1 + .../failing/open-square-bracket-in-ident.pre | 1 + tests/cases/failing/or-arity-three.pre | 1 + tests/cases/failing/or-arity-zero.pre | 1 + tests/cases/failing/parfor-no-block.pre | 1 + tests/cases/failing/parfor-no-target.pre | 1 + tests/cases/failing/parfor-target-not-int.pre | 1 + tests/cases/failing/pow-mixed-types.pre | 1 + tests/cases/failing/prod-mixed.pre | 1 + .../cases/failing/return-outside-function.pre | 1 + tests/cases/failing/root-arity-one.pre | 1 + tests/cases/failing/root-arity-three.pre | 1 + .../cases/failing/root-flt-negative-even.pre | 1 + .../cases/failing/root-flt-zero-exponent.pre | 1 + .../failing/root-int-invalid-negative.pre | 1 + .../cases/failing/root-int-zero-exponent.pre | 1 + tests/cases/failing/root-type-bool.pre | 1 + tests/cases/failing/root-type-str.pre | 1 + tests/cases/failing/round-invalid-mode.pre | 1 + tests/cases/failing/round-ndigits-not-int.pre | 1 + tests/cases/failing/shl-radix.pre | 1 + tests/cases/failing/shr-radix.pre | 1 + tests/cases/failing/slen-non-str.pre | 1 + tests/cases/failing/slice-non-int-end.pre | 1 + tests/cases/failing/slice-non-int-start.pre | 1 + tests/cases/failing/slice-non-value.pre | 1 + tests/cases/failing/statement-with-caret.pre | 1 + .../failing/statement-with-delimiter.pre | 2 + .../failing/statement-with-semicolon.pre | 1 + .../cases/failing/statements-no-delimiter.pre | 1 + .../string-invalid-U-escape-uppercase.pre | 1 + .../failing/string-invalid-U-short-escape.pre | 1 + tests/cases/failing/string-invalid-escape.pre | 1 + .../cases/failing/string-invalid-u-escape.pre | 1 + .../cases/failing/string-invalid-u-short.pre | 1 + .../cases/failing/string-invalid-x-escape.pre | 1 + .../cases/failing/string-invalid-x-short.pre | 1 + .../cases/failing/string-mismatched-quote.pre | 1 + .../failing/string-unterminated-double.pre | 1 + .../failing/string-unterminated-single.pre | 1 + tests/cases/failing/sum-mixed.pre | 1 + tests/cases/failing/sum-str.pre | 1 + tests/cases/failing/tflt-bad-str.pre | 1 + tests/cases/failing/tflt-map.pre | 2 + tests/cases/failing/tilde-in-ident.pre | 1 + tests/cases/failing/tint-map.pre | 2 + tests/cases/failing/tlen-too-large.pre | 3 + tests/cases/failing/tlen-zero-dim.pre | 3 + tests/cases/failing/tns-empty-index.pre | 2 + tests/cases/failing/tns-empty.pre | 1 + .../cases/failing/tns-mixed-nested-value.pre | 2 + tests/cases/failing/tns-nested-empty.pre | 1 + tests/cases/failing/tns-ragged.pre | 1 + .../failing/try-catch-err-pseudotype.pre | 5 + tests/cases/failing/try-catch-seperated.pre | 6 + tests/cases/failing/try-no-catch.pre | 1 + tests/cases/failing/tstr-map.pre | 2 + tests/cases/failing/unexpected-block.pre | 1 + tests/cases/failing/upper-arity-two.pre | 1 + tests/cases/failing/upper-arity-zero.pre | 1 + tests/cases/failing/upper-non-str.pre | 1 + tests/cases/failing/while-no-block.pre | 1 + tests/cases/failing/while-no-condition.pre | 1 + tests/cases/failing/xor-arity-three.pre | 1 + tests/cases/failing/xor-arity-zero.pre | 1 + tests/cases/failing/zero-starts-ident.pre | 1 + tests/cases/flip-int-basic.pre | 3 + tests/cases/flip-int-trailing-zero.pre | 3 + tests/cases/flip-str.pre | 3 + tests/cases/passing/abs-flt.pre | 10 + tests/cases/passing/abs-int.pre | 13 + tests/cases/passing/all.pre | 4 + tests/cases/passing/and.pre | 2 + tests/cases/passing/any.pre | 4 + tests/cases/passing/assert.pre | 1 + tests/cases/passing/assign.pre | 2 + tests/cases/passing/band.pre | 2 + tests/cases/passing/base-flt.pre | 7 + tests/cases/passing/base-int.pre | 7 + tests/cases/passing/bnot.pre | 2 + tests/cases/passing/bool.pre | 5 + tests/cases/passing/bor.pre | 2 + tests/cases/passing/break-nested.pre | 15 + tests/cases/passing/break.pre | 7 + tests/cases/passing/bxor.pre | 2 + tests/cases/passing/bytes.pre | 18 + tests/cases/passing/caret-before-comment.pre | 2 + tests/cases/passing/cdiv-flt.pre | 9 + tests/cases/passing/cdiv-int.pre | 9 + tests/cases/passing/clog-int.pre | 4 + tests/cases/passing/coerce-fdiv-passing.pre | 0 tests/cases/passing/coerce-flt-pass.pre | 0 tests/cases/passing/coerce-int-pass.pre | 0 tests/cases/passing/comment.pre | 1 + tests/cases/passing/continue-for.pre | 8 + tests/cases/passing/continue-while.pre | 11 + tests/cases/passing/convert-flt.pre | 7 + tests/cases/passing/convert-int.pre | 7 + tests/cases/passing/del-frozen.pre | 27 + tests/cases/passing/del-map.pre | 23 + tests/cases/passing/del-symbol.pre | 18 + tests/cases/passing/div-flt.pre | 9 + tests/cases/passing/div-int.pre | 8 + tests/cases/passing/eq-scalars.pre | 12 + tests/cases/passing/eq-structured.pre | 22 + tests/cases/passing/exist.pre | 25 + tests/cases/passing/fadd.pre | 3 + tests/cases/passing/fdiv.pre | 8 + tests/cases/passing/flt-abs.pre | 0 tests/cases/passing/flt-cdiv.pre | 0 tests/cases/passing/flt-div.pre | 0 tests/cases/passing/flt-gcd.pre | 0 tests/cases/passing/flt-lcm.pre | 0 tests/cases/passing/flt-mod.pre | 0 tests/cases/passing/flt-mul.pre | 0 tests/cases/passing/flt-neg.pre | 0 tests/cases/passing/flt-pow.pre | 0 tests/cases/passing/flt-root.pre | 0 tests/cases/passing/flt-sub.pre | 0 tests/cases/passing/flt.pre | 14 + tests/cases/passing/fmul.pre | 3 + .../passing/for-zero-and-restore-counter.pre | 7 + tests/cases/passing/for.pre | 6 + tests/cases/passing/fpow.pre | 3 + tests/cases/passing/freeze.pre | 36 + tests/cases/passing/froot-neg.pre | 3 + tests/cases/passing/froot.pre | 11 + tests/cases/passing/frozen.pre | 11 + tests/cases/passing/fsub.pre | 3 + tests/cases/passing/fsum-inf.pre | 3 + tests/cases/passing/fsum.pre | 3 + tests/cases/passing/func-arguments.pre | 40 + tests/cases/passing/func-basics.pre | 33 + tests/cases/passing/func-call-errors.pre | 45 + tests/cases/passing/func-closures.pre | 39 + tests/cases/passing/func-containers.pre | 27 + tests/cases/passing/func-pop.pre | 14 + tests/cases/passing/func-return-errors.pre | 48 + tests/cases/passing/gcd-flt.pre | 16 + tests/cases/passing/gcd-int.pre | 16 + tests/cases/passing/goto-backward.pre | 10 + tests/cases/passing/goto-cross-block.pre | 8 + tests/cases/passing/goto-errors.pre | 38 + tests/cases/passing/goto-forward.pre | 6 + tests/cases/passing/iadd.pre | 4 + tests/cases/passing/ident-includes-chars.pre | 68 + tests/cases/passing/idiv.pre | 3 + tests/cases/passing/if-else.pre | 10 + tests/cases/passing/if-elseif-else.pre | 14 + tests/cases/passing/if-elseif-elseif{.pre | 7 + tests/cases/passing/if.pre | 3 + tests/cases/passing/ilen.pre | 7 + tests/cases/passing/imul.pre | 3 + tests/cases/passing/int-literals-extended.pre | 15 + tests/cases/passing/int.pre | 8 + tests/cases/passing/ipow.pre | 3 + tests/cases/passing/iprod.pre | 3 + tests/cases/passing/iroot.pre | 3 + tests/cases/passing/isbool.pre | 23 + tests/cases/passing/isflt.pre | 21 + tests/cases/passing/isint.pre | 21 + tests/cases/passing/isstr.pre | 21 + tests/cases/passing/istns.pre | 21 + tests/cases/passing/isub-int.pre | 3 + tests/cases/passing/isum-trunc.pre | 3 + tests/cases/passing/join-int.pre | 3 + tests/cases/passing/join-str.pre | 3 + tests/cases/passing/later-assign-no-type.pre | 2 + tests/cases/passing/later-decl-no-type.pre | 2 + tests/cases/passing/lcm-int.pre | 16 + tests/cases/passing/lcm.-fltpre | 16 + tests/cases/passing/len.pre | 5 + tests/cases/passing/log-float.pre | 2 + tests/cases/passing/log-int.pre | 4 + tests/cases/passing/lower.pre | 4 + .../passing/map-literals-empty-ordered.pre | 30 + .../map-literals-mixed-keys-nested.pre | 15 + .../passing/map-literals-mixed-values.pre | 15 + tests/cases/passing/map-literals-self.pre | 13 + tests/cases/passing/max-flt.pre | 3 + tests/cases/passing/max-int.pre | 3 + tests/cases/passing/max-str.pre | 3 + tests/cases/passing/max-tns.pre | 5 + tests/cases/passing/min-flt.pre | 3 + tests/cases/passing/min-int.pre | 3 + tests/cases/passing/min-str.pre | 3 + tests/cases/passing/min-tns.pre | 4 + tests/cases/passing/mod-flt.pre | 10 + tests/cases/passing/mod-int.pre | 9 + tests/cases/passing/mul-flt.pre | 9 + tests/cases/passing/mul-int.pre | 9 + tests/cases/passing/multi-assign-type.pre | 2 + tests/cases/passing/multi-decl-type.pre | 2 + tests/cases/passing/neg-flt.pre | 10 + tests/cases/passing/neg-int.pre | 12 + tests/cases/passing/neq-scalars.pre | 12 + tests/cases/passing/neq-structured.pre | 24 + tests/cases/passing/not.pre | 6 + .../passing/op-arithmetic-coerce-flt-pass.pre | 26 + .../passing/op-arithmetic-coerce-int-pass.pre | 19 + tests/cases/passing/op-arithmetic-flt.pre | 6 + tests/cases/passing/op-arithmetic-int.pre | 9 + tests/cases/passing/op-bool-from-bool.pre | 2 + tests/cases/passing/op-bool-from-flt.pre | 6 + tests/cases/passing/op-bool-from-func.pre | 5 + tests/cases/passing/op-bool-from-int.pre | 2 + tests/cases/passing/op-bool-from-map.pre | 2 + tests/cases/passing/op-bool-from-str.pre | 2 + tests/cases/passing/op-bool-from-thr.pre | 11 + tests/cases/passing/op-bool-from-tns.pre | 2 + tests/cases/passing/op-flt-from-bool.pre | 2 + tests/cases/passing/op-flt-from-flt.pre | 1 + tests/cases/passing/op-flt-from-int.pre | 2 + .../cases/passing/op-flt-from-special-str.pre | 3 + tests/cases/passing/op-flt-from-str.pre | 1 + tests/cases/passing/op-gt.pre | 5 + tests/cases/passing/op-gte.pre | 7 + tests/cases/passing/op-int-from-bool.pre | 2 + tests/cases/passing/op-int-from-flt.pre | 2 + tests/cases/passing/op-int-from-int.pre | 1 + tests/cases/passing/op-int-from-str.pre | 3 + tests/cases/passing/op-lt.pre | 5 + tests/cases/passing/op-lte.pre | 7 + tests/cases/passing/op-str-from-bool.pre | 2 + tests/cases/passing/op-str-from-flt.pre | 1 + tests/cases/passing/op-str-from-int.pre | 1 + .../cases/passing/op-str-from-special-flt.pre | 3 + tests/cases/passing/op-str-from-str.pre | 1 + tests/cases/passing/op-tns-from-shape-map.pre | 3 + .../passing/op-tns-from-shape-scalar.pre | 2 + tests/cases/passing/op-tns-from-str.pre | 2 + tests/cases/passing/or.pre | 2 + tests/cases/passing/parfor-break-nested.pre | 13 + tests/cases/passing/parfor-break.pre | 15 + tests/cases/passing/parfor-continue.pre | 9 + tests/cases/passing/parfor-error-join.pre | 17 + tests/cases/passing/parfor-merge-symbol.pre | 8 + tests/cases/passing/parfor-target-once.pre | 14 + .../parfor-zero-and-restore-counter.pre | 7 + tests/cases/passing/parfor.pre | 6 + tests/cases/passing/permafreeze.pre | 40 + tests/cases/passing/permafrozen.pre | 6 + tests/cases/passing/pow-flt.pre | 9 + tests/cases/passing/pow-int.pre | 9 + tests/cases/passing/prod-flt.pre | 3 + tests/cases/passing/prod-int.pre | 3 + tests/cases/passing/root-flt.pre | 18 + tests/cases/passing/root-int.pre | 19 + tests/cases/passing/round.pre | 27 + tests/cases/passing/shl.pre | 2 + tests/cases/passing/shr.pre | 2 + tests/cases/passing/signature.pre | 19 + tests/cases/passing/slen.pre | 6 + tests/cases/passing/slice-int-type.pre | 2 + tests/cases/passing/slice-str-basic.pre | 3 + tests/cases/passing/slice-str-negative.pre | 2 + tests/cases/passing/slice-str-single.pre | 2 + tests/cases/passing/statement-using-caret.pre | 2 + .../statements-semicolon-delimiter.pre | 1 + tests/cases/passing/string-bool-context.pre | 23 + tests/cases/passing/string-escapes-hex.pre | 7 + tests/cases/passing/string-escapes.pre | 16 + tests/cases/passing/string-literals.pre | 12 + .../cases/passing/string-raw-mode-toggle.pre | 3 + tests/cases/passing/string-raw-mode.pre | 3 + tests/cases/passing/sub-flt.pre | 9 + tests/cases/passing/sub-int.pre | 12 + tests/cases/passing/sum-flt.pre | 3 + tests/cases/passing/sum-int.pre | 3 + tests/cases/passing/tflt.pre | 10 + tests/cases/passing/thaw.pre | 20 + tests/cases/passing/tint.pre | 4 + tests/cases/passing/tlen.pre | 6 + tests/cases/passing/tns-indexing.pre | 60 + tests/cases/passing/tns-literals-ifs.pre | 14 + tests/cases/passing/tns-literals-matrices.pre | 7 + tests/cases/passing/tns-literals-mixed.pre | 22 + tests/cases/passing/try-catch-err.pre | 6 + tests/cases/passing/try-catch.pre | 10 + tests/cases/passing/tstr.pre | 4 + tests/cases/passing/type-then-decl-type.pre | 2 + tests/cases/passing/type-then-decl.pre | 2 + tests/cases/passing/type.pre | 21 + tests/cases/passing/upper.pre | 4 + tests/cases/passing/while.pre | 5 + tests/cases/passing/whitespace.pre | 7 + tests/cases/passing/xor.pre | 2 + tests/cases/passing/zero-and-one-in-ident.pre | 2 + tests/ext_import.pre | 9 - tests/mod.pre | 9 - tests/test.ps1 | 113 ++ tests/test2.pre | 1430 ----------------- tests/test_ext.c | 103 -- 483 files changed, 2515 insertions(+), 1553 deletions(-) create mode 100644 tests/cases/failing/abs-type-bool.pre create mode 100644 tests/cases/failing/abs-type-str.pre create mode 100644 tests/cases/failing/add-mixed-types.pre create mode 100644 tests/cases/failing/all-arity-zero.pre create mode 100644 tests/cases/failing/and-arity-three.pre create mode 100644 tests/cases/failing/and-arity-zero.pre create mode 100644 tests/cases/failing/any-arity-zero.pre create mode 100644 tests/cases/failing/assert-false.pre create mode 100644 tests/cases/failing/at-in-ident.pre create mode 100644 tests/cases/failing/band-radix.pre create mode 100644 tests/cases/failing/base-func.pre create mode 100644 tests/cases/failing/base-map.pre create mode 100644 tests/cases/failing/base-string.pre create mode 100644 tests/cases/failing/base-thr.pre create mode 100644 tests/cases/failing/bnot-radix.pre create mode 100644 tests/cases/failing/bool-lowercase.pre create mode 100644 tests/cases/failing/bor-radix.pre create mode 100644 tests/cases/failing/break-no-argument.pre create mode 100644 tests/cases/failing/break-outside-loop.pre create mode 100644 tests/cases/failing/break-target-not-int.pre create mode 100644 tests/cases/failing/break-too-deep.pre create mode 100644 tests/cases/failing/break-zero.pre create mode 100644 tests/cases/failing/bxor-radix.pre create mode 100644 tests/cases/failing/bytes-endian-case.pre create mode 100644 tests/cases/failing/bytes-first-bool.pre create mode 100644 tests/cases/failing/bytes-first-flt.pre create mode 100644 tests/cases/failing/bytes-first-func.pre create mode 100644 tests/cases/failing/bytes-first-map.pre create mode 100644 tests/cases/failing/bytes-first-thr.pre create mode 100644 tests/cases/failing/bytes-first-tns.pre create mode 100644 tests/cases/failing/bytes-invalid-endian.pre create mode 100644 tests/cases/failing/bytes-negative.pre create mode 100644 tests/cases/failing/bytes-second-bool.pre create mode 100644 tests/cases/failing/bytes-second-flt.pre create mode 100644 tests/cases/failing/bytes-second-func.pre create mode 100644 tests/cases/failing/bytes-second-int.pre create mode 100644 tests/cases/failing/bytes-second-map.pre create mode 100644 tests/cases/failing/bytes-second-thr.pre create mode 100644 tests/cases/failing/bytes-second-tns.pre create mode 100644 tests/cases/failing/bytes-value-type.pre create mode 100644 tests/cases/failing/catch-no-try.pre create mode 100644 tests/cases/failing/cdiv-zero-flt.pre create mode 100644 tests/cases/failing/cdiv-zero-int.pre create mode 100644 tests/cases/failing/clog-float.pre create mode 100644 tests/cases/failing/clog-negative.pre create mode 100644 tests/cases/failing/clog-zero.pre create mode 100644 tests/cases/failing/close-curly-bracket-in-ident.pre create mode 100644 tests/cases/failing/close-parentheses-in-ident.pre create mode 100644 tests/cases/failing/close-square-bracket-in-ident.pre create mode 100644 tests/cases/failing/comma-in-ident.pre create mode 100644 tests/cases/failing/continue-no-parens.pre create mode 100644 tests/cases/failing/continue-outside-loop.pre create mode 100644 tests/cases/failing/continue-with-argument.pre create mode 100644 tests/cases/failing/convert-base-too-large.pre create mode 100644 tests/cases/failing/convert-base-too-small.pre create mode 100644 tests/cases/failing/convert-base-wrong-type.pre create mode 100644 tests/cases/failing/convert-value-map.pre create mode 100644 tests/cases/failing/convert-value-string.pre create mode 100644 tests/cases/failing/del-already-deleted-symbol.pre create mode 100644 tests/cases/failing/del-map-intermediate-not-map.pre create mode 100644 tests/cases/failing/del-map-target-not-map.pre create mode 100644 tests/cases/failing/del-never-assigned-symbol.pre create mode 100644 tests/cases/failing/del-nonexistent-symbol.pre create mode 100644 tests/cases/failing/del-type-mismatch-after-delete.pre create mode 100644 tests/cases/failing/div-zero-flt.pre create mode 100644 tests/cases/failing/div-zero-int.pre create mode 100644 tests/cases/failing/else-no-if.pre create mode 100644 tests/cases/failing/elseif-after-else.pre create mode 100644 tests/cases/failing/elseif-else-seperated.pre create mode 100644 tests/cases/failing/elseif-elseif-seperated.pre create mode 100644 tests/cases/failing/elseif-no-if.pre create mode 100644 tests/cases/failing/empty-identifier.pre create mode 100644 tests/cases/failing/eq-arity-one.pre create mode 100644 tests/cases/failing/eq-arity-three.pre create mode 100644 tests/cases/failing/equals-in-ident.pre create mode 100644 tests/cases/failing/first-assign-no-type.pre create mode 100644 tests/cases/failing/first-decl-no-type.pre create mode 100644 tests/cases/failing/flt-invalid-digit.pre create mode 100644 tests/cases/failing/flt-negative-nan.pre create mode 100644 tests/cases/failing/flt-no-fraction.pre create mode 100644 tests/cases/failing/flt-no-integer.pre create mode 100644 tests/cases/failing/flt-plus-sign.pre create mode 100644 tests/cases/failing/for-no-block.pre create mode 100644 tests/cases/failing/for-no-target.pre create mode 100644 tests/cases/failing/for-target-not-int.pre create mode 100644 tests/cases/failing/froot-neg-even.pre create mode 100644 tests/cases/failing/fsum-str.pre create mode 100644 tests/cases/failing/func-default-before-positional.pre create mode 100644 tests/cases/failing/func-missing-param-type.pre create mode 100644 tests/cases/failing/func-missing-return-type.pre create mode 100644 tests/cases/failing/func-name-conflicts-builtin.pre create mode 100644 tests/cases/failing/func-name-conflicts-symbol.pre create mode 100644 tests/cases/failing/func-positional-after-keyword.pre create mode 100644 tests/cases/failing/gcd-arity-one.pre create mode 100644 tests/cases/failing/gcd-arity-three.pre create mode 100644 tests/cases/failing/gcd-mixed-types-reversed.pre create mode 100644 tests/cases/failing/gcd-mixed-types.pre create mode 100644 tests/cases/failing/gcd-type-bool.pre create mode 100644 tests/cases/failing/gcd-type-str.pre create mode 100644 tests/cases/failing/goto-no-parens.pre create mode 100644 tests/cases/failing/gotopoint-no-parens.pre create mode 100644 tests/cases/failing/hash-in-ident.pre create mode 100644 tests/cases/failing/iadd-coerce-int-inf.pre create mode 100644 tests/cases/failing/iadd-coerce-int-nan.pre create mode 100644 tests/cases/failing/iadd-coerce-int-str.pre create mode 100644 tests/cases/failing/iadd-coerce-str-int.pre create mode 100644 tests/cases/failing/iadd-coerce-type-bool.pre create mode 100644 tests/cases/failing/iadd-coerce-type-map.pre create mode 100644 tests/cases/failing/idiv-zero-int.pre create mode 100644 tests/cases/failing/if-else-no-block.pre create mode 100644 tests/cases/failing/if-else-seperated.pre create mode 100644 tests/cases/failing/if-elseif-no-block.pre create mode 100644 tests/cases/failing/if-elseif-no-condition.pre create mode 100644 tests/cases/failing/if-elseif-seperated.pre create mode 100644 tests/cases/failing/if-no-block.pre create mode 100644 tests/cases/failing/if-no-condition.pre create mode 100644 tests/cases/failing/ilen-non-int.pre create mode 100644 tests/cases/failing/int-invalid-digit.pre create mode 100644 tests/cases/failing/int-missing-digits.pre create mode 100644 tests/cases/failing/int-plus-sign.pre create mode 100644 tests/cases/failing/int-r-bad-format.pre create mode 100644 tests/cases/failing/int-r-base-too-large.pre create mode 100644 tests/cases/failing/int-r-base-too-small.pre create mode 100644 tests/cases/failing/int-r-missing-digits.pre create mode 100644 tests/cases/failing/iroot-int-zero-exponent.pre create mode 100644 tests/cases/failing/join-mixed-sign.pre create mode 100644 tests/cases/failing/join-mixed-types.pre create mode 100644 tests/cases/failing/lambda-default-before-positional.pre create mode 100644 tests/cases/failing/lambda-missing-param-type.pre create mode 100644 tests/cases/failing/lambda-missing-return-type.pre create mode 100644 tests/cases/failing/lcm-arity-one.pre create mode 100644 tests/cases/failing/lcm-arity-three.pre create mode 100644 tests/cases/failing/lcm-mixed-types-reversed.pre create mode 100644 tests/cases/failing/lcm-mixed-types.pre create mode 100644 tests/cases/failing/lcm-type-bool.pre create mode 100644 tests/cases/failing/lcm-type-str.pre create mode 100644 tests/cases/failing/len-unsupported.pre create mode 100644 tests/cases/failing/log-negative.pre create mode 100644 tests/cases/failing/log-non-numeric.pre create mode 100644 tests/cases/failing/log-zero.pre create mode 100644 tests/cases/failing/lower-arity-two.pre create mode 100644 tests/cases/failing/lower-arity-zero.pre create mode 100644 tests/cases/failing/lower-non-str.pre create mode 100644 tests/cases/failing/map-literal-bad-key-bool.pre create mode 100644 tests/cases/failing/map-literal-bad-key-tns.pre create mode 100644 tests/cases/failing/map-literal-missing-equals.pre create mode 100644 tests/cases/failing/map-literal-self-bad-key.pre create mode 100644 tests/cases/failing/map-literal-self-forward.pre create mode 100644 tests/cases/failing/map-literal-trailing-comma.pre create mode 100644 tests/cases/failing/max-mixed-types.pre create mode 100644 tests/cases/failing/max-tns-mixed-element-type.pre create mode 100644 tests/cases/failing/min-mixed-types.pre create mode 100644 tests/cases/failing/min-tns-mixed-element-type.pre create mode 100644 tests/cases/failing/mod-zero-flt.pre create mode 100644 tests/cases/failing/mod-zero-int.pre create mode 100644 tests/cases/failing/neg-type-bool.pre create mode 100644 tests/cases/failing/neg-type-str.pre create mode 100644 tests/cases/failing/neq-arity-one.pre create mode 100644 tests/cases/failing/neq-arity-three.pre create mode 100644 tests/cases/failing/non-ascii.pre create mode 100644 tests/cases/failing/not-arity-two.pre create mode 100644 tests/cases/failing/not-arity-zero.pre create mode 100644 tests/cases/failing/one-starts-ident.pre create mode 100644 tests/cases/failing/op-flt-bad-str.pre create mode 100644 tests/cases/failing/op-flt-func.pre create mode 100644 tests/cases/failing/op-flt-map.pre create mode 100644 tests/cases/failing/op-flt-thr.pre create mode 100644 tests/cases/failing/op-gt-mixed-type.pre create mode 100644 tests/cases/failing/op-gte-mixed-type.pre create mode 100644 tests/cases/failing/op-int-func.pre create mode 100644 tests/cases/failing/op-int-map.pre create mode 100644 tests/cases/failing/op-int-thr.pre create mode 100644 tests/cases/failing/op-lt-mixed-type.pre create mode 100644 tests/cases/failing/op-lte-mixed-type.pre create mode 100644 tests/cases/failing/op-str-func.pre create mode 100644 tests/cases/failing/op-str-lambda.pre create mode 100644 tests/cases/failing/op-str-map.pre create mode 100644 tests/cases/failing/op-str-thr.pre create mode 100644 tests/cases/failing/op-str-tns.pre create mode 100644 tests/cases/failing/op-tns-bad-shape-type.pre create mode 100644 tests/cases/failing/op-tns-bad-shape.pre create mode 100644 tests/cases/failing/op-tns-bool.pre create mode 100644 tests/cases/failing/op-tns-flt.pre create mode 100644 tests/cases/failing/op-tns-func.pre create mode 100644 tests/cases/failing/op-tns-int.pre create mode 100644 tests/cases/failing/op-tns-map.pre create mode 100644 tests/cases/failing/op-tns-thr.pre create mode 100644 tests/cases/failing/open-curly-bracket-in-ident.pre create mode 100644 tests/cases/failing/open-parentheses-in-ident.pre create mode 100644 tests/cases/failing/open-square-bracket-in-ident.pre create mode 100644 tests/cases/failing/or-arity-three.pre create mode 100644 tests/cases/failing/or-arity-zero.pre create mode 100644 tests/cases/failing/parfor-no-block.pre create mode 100644 tests/cases/failing/parfor-no-target.pre create mode 100644 tests/cases/failing/parfor-target-not-int.pre create mode 100644 tests/cases/failing/pow-mixed-types.pre create mode 100644 tests/cases/failing/prod-mixed.pre create mode 100644 tests/cases/failing/return-outside-function.pre create mode 100644 tests/cases/failing/root-arity-one.pre create mode 100644 tests/cases/failing/root-arity-three.pre create mode 100644 tests/cases/failing/root-flt-negative-even.pre create mode 100644 tests/cases/failing/root-flt-zero-exponent.pre create mode 100644 tests/cases/failing/root-int-invalid-negative.pre create mode 100644 tests/cases/failing/root-int-zero-exponent.pre create mode 100644 tests/cases/failing/root-type-bool.pre create mode 100644 tests/cases/failing/root-type-str.pre create mode 100644 tests/cases/failing/round-invalid-mode.pre create mode 100644 tests/cases/failing/round-ndigits-not-int.pre create mode 100644 tests/cases/failing/shl-radix.pre create mode 100644 tests/cases/failing/shr-radix.pre create mode 100644 tests/cases/failing/slen-non-str.pre create mode 100644 tests/cases/failing/slice-non-int-end.pre create mode 100644 tests/cases/failing/slice-non-int-start.pre create mode 100644 tests/cases/failing/slice-non-value.pre create mode 100644 tests/cases/failing/statement-with-caret.pre create mode 100644 tests/cases/failing/statement-with-delimiter.pre create mode 100644 tests/cases/failing/statement-with-semicolon.pre create mode 100644 tests/cases/failing/statements-no-delimiter.pre create mode 100644 tests/cases/failing/string-invalid-U-escape-uppercase.pre create mode 100644 tests/cases/failing/string-invalid-U-short-escape.pre create mode 100644 tests/cases/failing/string-invalid-escape.pre create mode 100644 tests/cases/failing/string-invalid-u-escape.pre create mode 100644 tests/cases/failing/string-invalid-u-short.pre create mode 100644 tests/cases/failing/string-invalid-x-escape.pre create mode 100644 tests/cases/failing/string-invalid-x-short.pre create mode 100644 tests/cases/failing/string-mismatched-quote.pre create mode 100644 tests/cases/failing/string-unterminated-double.pre create mode 100644 tests/cases/failing/string-unterminated-single.pre create mode 100644 tests/cases/failing/sum-mixed.pre create mode 100644 tests/cases/failing/sum-str.pre create mode 100644 tests/cases/failing/tflt-bad-str.pre create mode 100644 tests/cases/failing/tflt-map.pre create mode 100644 tests/cases/failing/tilde-in-ident.pre create mode 100644 tests/cases/failing/tint-map.pre create mode 100644 tests/cases/failing/tlen-too-large.pre create mode 100644 tests/cases/failing/tlen-zero-dim.pre create mode 100644 tests/cases/failing/tns-empty-index.pre create mode 100644 tests/cases/failing/tns-empty.pre create mode 100644 tests/cases/failing/tns-mixed-nested-value.pre create mode 100644 tests/cases/failing/tns-nested-empty.pre create mode 100644 tests/cases/failing/tns-ragged.pre create mode 100644 tests/cases/failing/try-catch-err-pseudotype.pre create mode 100644 tests/cases/failing/try-catch-seperated.pre create mode 100644 tests/cases/failing/try-no-catch.pre create mode 100644 tests/cases/failing/tstr-map.pre create mode 100644 tests/cases/failing/unexpected-block.pre create mode 100644 tests/cases/failing/upper-arity-two.pre create mode 100644 tests/cases/failing/upper-arity-zero.pre create mode 100644 tests/cases/failing/upper-non-str.pre create mode 100644 tests/cases/failing/while-no-block.pre create mode 100644 tests/cases/failing/while-no-condition.pre create mode 100644 tests/cases/failing/xor-arity-three.pre create mode 100644 tests/cases/failing/xor-arity-zero.pre create mode 100644 tests/cases/failing/zero-starts-ident.pre create mode 100644 tests/cases/flip-int-basic.pre create mode 100644 tests/cases/flip-int-trailing-zero.pre create mode 100644 tests/cases/flip-str.pre create mode 100644 tests/cases/passing/abs-flt.pre create mode 100644 tests/cases/passing/abs-int.pre create mode 100644 tests/cases/passing/all.pre create mode 100644 tests/cases/passing/and.pre create mode 100644 tests/cases/passing/any.pre create mode 100644 tests/cases/passing/assert.pre create mode 100644 tests/cases/passing/assign.pre create mode 100644 tests/cases/passing/band.pre create mode 100644 tests/cases/passing/base-flt.pre create mode 100644 tests/cases/passing/base-int.pre create mode 100644 tests/cases/passing/bnot.pre create mode 100644 tests/cases/passing/bool.pre create mode 100644 tests/cases/passing/bor.pre create mode 100644 tests/cases/passing/break-nested.pre create mode 100644 tests/cases/passing/break.pre create mode 100644 tests/cases/passing/bxor.pre create mode 100644 tests/cases/passing/bytes.pre create mode 100644 tests/cases/passing/caret-before-comment.pre create mode 100644 tests/cases/passing/cdiv-flt.pre create mode 100644 tests/cases/passing/cdiv-int.pre create mode 100644 tests/cases/passing/clog-int.pre create mode 100644 tests/cases/passing/coerce-fdiv-passing.pre create mode 100644 tests/cases/passing/coerce-flt-pass.pre create mode 100644 tests/cases/passing/coerce-int-pass.pre create mode 100644 tests/cases/passing/comment.pre create mode 100644 tests/cases/passing/continue-for.pre create mode 100644 tests/cases/passing/continue-while.pre create mode 100644 tests/cases/passing/convert-flt.pre create mode 100644 tests/cases/passing/convert-int.pre create mode 100644 tests/cases/passing/del-frozen.pre create mode 100644 tests/cases/passing/del-map.pre create mode 100644 tests/cases/passing/del-symbol.pre create mode 100644 tests/cases/passing/div-flt.pre create mode 100644 tests/cases/passing/div-int.pre create mode 100644 tests/cases/passing/eq-scalars.pre create mode 100644 tests/cases/passing/eq-structured.pre create mode 100644 tests/cases/passing/exist.pre create mode 100644 tests/cases/passing/fadd.pre create mode 100644 tests/cases/passing/fdiv.pre create mode 100644 tests/cases/passing/flt-abs.pre create mode 100644 tests/cases/passing/flt-cdiv.pre create mode 100644 tests/cases/passing/flt-div.pre create mode 100644 tests/cases/passing/flt-gcd.pre create mode 100644 tests/cases/passing/flt-lcm.pre create mode 100644 tests/cases/passing/flt-mod.pre create mode 100644 tests/cases/passing/flt-mul.pre create mode 100644 tests/cases/passing/flt-neg.pre create mode 100644 tests/cases/passing/flt-pow.pre create mode 100644 tests/cases/passing/flt-root.pre create mode 100644 tests/cases/passing/flt-sub.pre create mode 100644 tests/cases/passing/flt.pre create mode 100644 tests/cases/passing/fmul.pre create mode 100644 tests/cases/passing/for-zero-and-restore-counter.pre create mode 100644 tests/cases/passing/for.pre create mode 100644 tests/cases/passing/fpow.pre create mode 100644 tests/cases/passing/freeze.pre create mode 100644 tests/cases/passing/froot-neg.pre create mode 100644 tests/cases/passing/froot.pre create mode 100644 tests/cases/passing/frozen.pre create mode 100644 tests/cases/passing/fsub.pre create mode 100644 tests/cases/passing/fsum-inf.pre create mode 100644 tests/cases/passing/fsum.pre create mode 100644 tests/cases/passing/func-arguments.pre create mode 100644 tests/cases/passing/func-basics.pre create mode 100644 tests/cases/passing/func-call-errors.pre create mode 100644 tests/cases/passing/func-closures.pre create mode 100644 tests/cases/passing/func-containers.pre create mode 100644 tests/cases/passing/func-pop.pre create mode 100644 tests/cases/passing/func-return-errors.pre create mode 100644 tests/cases/passing/gcd-flt.pre create mode 100644 tests/cases/passing/gcd-int.pre create mode 100644 tests/cases/passing/goto-backward.pre create mode 100644 tests/cases/passing/goto-cross-block.pre create mode 100644 tests/cases/passing/goto-errors.pre create mode 100644 tests/cases/passing/goto-forward.pre create mode 100644 tests/cases/passing/iadd.pre create mode 100644 tests/cases/passing/ident-includes-chars.pre create mode 100644 tests/cases/passing/idiv.pre create mode 100644 tests/cases/passing/if-else.pre create mode 100644 tests/cases/passing/if-elseif-else.pre create mode 100644 tests/cases/passing/if-elseif-elseif{.pre create mode 100644 tests/cases/passing/if.pre create mode 100644 tests/cases/passing/ilen.pre create mode 100644 tests/cases/passing/imul.pre create mode 100644 tests/cases/passing/int-literals-extended.pre create mode 100644 tests/cases/passing/int.pre create mode 100644 tests/cases/passing/ipow.pre create mode 100644 tests/cases/passing/iprod.pre create mode 100644 tests/cases/passing/iroot.pre create mode 100644 tests/cases/passing/isbool.pre create mode 100644 tests/cases/passing/isflt.pre create mode 100644 tests/cases/passing/isint.pre create mode 100644 tests/cases/passing/isstr.pre create mode 100644 tests/cases/passing/istns.pre create mode 100644 tests/cases/passing/isub-int.pre create mode 100644 tests/cases/passing/isum-trunc.pre create mode 100644 tests/cases/passing/join-int.pre create mode 100644 tests/cases/passing/join-str.pre create mode 100644 tests/cases/passing/later-assign-no-type.pre create mode 100644 tests/cases/passing/later-decl-no-type.pre create mode 100644 tests/cases/passing/lcm-int.pre create mode 100644 tests/cases/passing/lcm.-fltpre create mode 100644 tests/cases/passing/len.pre create mode 100644 tests/cases/passing/log-float.pre create mode 100644 tests/cases/passing/log-int.pre create mode 100644 tests/cases/passing/lower.pre create mode 100644 tests/cases/passing/map-literals-empty-ordered.pre create mode 100644 tests/cases/passing/map-literals-mixed-keys-nested.pre create mode 100644 tests/cases/passing/map-literals-mixed-values.pre create mode 100644 tests/cases/passing/map-literals-self.pre create mode 100644 tests/cases/passing/max-flt.pre create mode 100644 tests/cases/passing/max-int.pre create mode 100644 tests/cases/passing/max-str.pre create mode 100644 tests/cases/passing/max-tns.pre create mode 100644 tests/cases/passing/min-flt.pre create mode 100644 tests/cases/passing/min-int.pre create mode 100644 tests/cases/passing/min-str.pre create mode 100644 tests/cases/passing/min-tns.pre create mode 100644 tests/cases/passing/mod-flt.pre create mode 100644 tests/cases/passing/mod-int.pre create mode 100644 tests/cases/passing/mul-flt.pre create mode 100644 tests/cases/passing/mul-int.pre create mode 100644 tests/cases/passing/multi-assign-type.pre create mode 100644 tests/cases/passing/multi-decl-type.pre create mode 100644 tests/cases/passing/neg-flt.pre create mode 100644 tests/cases/passing/neg-int.pre create mode 100644 tests/cases/passing/neq-scalars.pre create mode 100644 tests/cases/passing/neq-structured.pre create mode 100644 tests/cases/passing/not.pre create mode 100644 tests/cases/passing/op-arithmetic-coerce-flt-pass.pre create mode 100644 tests/cases/passing/op-arithmetic-coerce-int-pass.pre create mode 100644 tests/cases/passing/op-arithmetic-flt.pre create mode 100644 tests/cases/passing/op-arithmetic-int.pre create mode 100644 tests/cases/passing/op-bool-from-bool.pre create mode 100644 tests/cases/passing/op-bool-from-flt.pre create mode 100644 tests/cases/passing/op-bool-from-func.pre create mode 100644 tests/cases/passing/op-bool-from-int.pre create mode 100644 tests/cases/passing/op-bool-from-map.pre create mode 100644 tests/cases/passing/op-bool-from-str.pre create mode 100644 tests/cases/passing/op-bool-from-thr.pre create mode 100644 tests/cases/passing/op-bool-from-tns.pre create mode 100644 tests/cases/passing/op-flt-from-bool.pre create mode 100644 tests/cases/passing/op-flt-from-flt.pre create mode 100644 tests/cases/passing/op-flt-from-int.pre create mode 100644 tests/cases/passing/op-flt-from-special-str.pre create mode 100644 tests/cases/passing/op-flt-from-str.pre create mode 100644 tests/cases/passing/op-gt.pre create mode 100644 tests/cases/passing/op-gte.pre create mode 100644 tests/cases/passing/op-int-from-bool.pre create mode 100644 tests/cases/passing/op-int-from-flt.pre create mode 100644 tests/cases/passing/op-int-from-int.pre create mode 100644 tests/cases/passing/op-int-from-str.pre create mode 100644 tests/cases/passing/op-lt.pre create mode 100644 tests/cases/passing/op-lte.pre create mode 100644 tests/cases/passing/op-str-from-bool.pre create mode 100644 tests/cases/passing/op-str-from-flt.pre create mode 100644 tests/cases/passing/op-str-from-int.pre create mode 100644 tests/cases/passing/op-str-from-special-flt.pre create mode 100644 tests/cases/passing/op-str-from-str.pre create mode 100644 tests/cases/passing/op-tns-from-shape-map.pre create mode 100644 tests/cases/passing/op-tns-from-shape-scalar.pre create mode 100644 tests/cases/passing/op-tns-from-str.pre create mode 100644 tests/cases/passing/or.pre create mode 100644 tests/cases/passing/parfor-break-nested.pre create mode 100644 tests/cases/passing/parfor-break.pre create mode 100644 tests/cases/passing/parfor-continue.pre create mode 100644 tests/cases/passing/parfor-error-join.pre create mode 100644 tests/cases/passing/parfor-merge-symbol.pre create mode 100644 tests/cases/passing/parfor-target-once.pre create mode 100644 tests/cases/passing/parfor-zero-and-restore-counter.pre create mode 100644 tests/cases/passing/parfor.pre create mode 100644 tests/cases/passing/permafreeze.pre create mode 100644 tests/cases/passing/permafrozen.pre create mode 100644 tests/cases/passing/pow-flt.pre create mode 100644 tests/cases/passing/pow-int.pre create mode 100644 tests/cases/passing/prod-flt.pre create mode 100644 tests/cases/passing/prod-int.pre create mode 100644 tests/cases/passing/root-flt.pre create mode 100644 tests/cases/passing/root-int.pre create mode 100644 tests/cases/passing/round.pre create mode 100644 tests/cases/passing/shl.pre create mode 100644 tests/cases/passing/shr.pre create mode 100644 tests/cases/passing/signature.pre create mode 100644 tests/cases/passing/slen.pre create mode 100644 tests/cases/passing/slice-int-type.pre create mode 100644 tests/cases/passing/slice-str-basic.pre create mode 100644 tests/cases/passing/slice-str-negative.pre create mode 100644 tests/cases/passing/slice-str-single.pre create mode 100644 tests/cases/passing/statement-using-caret.pre create mode 100644 tests/cases/passing/statements-semicolon-delimiter.pre create mode 100644 tests/cases/passing/string-bool-context.pre create mode 100644 tests/cases/passing/string-escapes-hex.pre create mode 100644 tests/cases/passing/string-escapes.pre create mode 100644 tests/cases/passing/string-literals.pre create mode 100644 tests/cases/passing/string-raw-mode-toggle.pre create mode 100644 tests/cases/passing/string-raw-mode.pre create mode 100644 tests/cases/passing/sub-flt.pre create mode 100644 tests/cases/passing/sub-int.pre create mode 100644 tests/cases/passing/sum-flt.pre create mode 100644 tests/cases/passing/sum-int.pre create mode 100644 tests/cases/passing/tflt.pre create mode 100644 tests/cases/passing/thaw.pre create mode 100644 tests/cases/passing/tint.pre create mode 100644 tests/cases/passing/tlen.pre create mode 100644 tests/cases/passing/tns-indexing.pre create mode 100644 tests/cases/passing/tns-literals-ifs.pre create mode 100644 tests/cases/passing/tns-literals-matrices.pre create mode 100644 tests/cases/passing/tns-literals-mixed.pre create mode 100644 tests/cases/passing/try-catch-err.pre create mode 100644 tests/cases/passing/try-catch.pre create mode 100644 tests/cases/passing/tstr.pre create mode 100644 tests/cases/passing/type-then-decl-type.pre create mode 100644 tests/cases/passing/type-then-decl.pre create mode 100644 tests/cases/passing/type.pre create mode 100644 tests/cases/passing/upper.pre create mode 100644 tests/cases/passing/while.pre create mode 100644 tests/cases/passing/whitespace.pre create mode 100644 tests/cases/passing/xor.pre create mode 100644 tests/cases/passing/zero-and-one-in-ident.pre delete mode 100644 tests/ext_import.pre delete mode 100644 tests/mod.pre create mode 100644 tests/test.ps1 delete mode 100644 tests/test2.pre delete mode 100644 tests/test_ext.c diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da62156..a66e26b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,4 +19,4 @@ jobs: run: .\build.ps1 - name: Run tests - run: .\prefix.exe .\tests\test2.pre + run: .\tests\test.ps1 diff --git a/build.ps1 b/build.ps1 index 7c43186..75f579b 100644 --- a/build.ps1 +++ b/build.ps1 @@ -5,7 +5,7 @@ against that DLL's import library, and compiles each discovered extension against the same shared runtime. Requires: run from a Developer Command Prompt for Visual Studio where cl.exe is on PATH. -Usage (from Prefix-C folder): +Usage (from Prefix folder): powershell -ExecutionPolicy Bypass -File .\build.ps1 #> diff --git a/tests/cases/failing/abs-type-bool.pre b/tests/cases/failing/abs-type-bool.pre new file mode 100644 index 0000000..b30a0e5 --- /dev/null +++ b/tests/cases/failing/abs-type-bool.pre @@ -0,0 +1,2 @@ +BOOL: b = TRUE +ABS(b) diff --git a/tests/cases/failing/abs-type-str.pre b/tests/cases/failing/abs-type-str.pre new file mode 100644 index 0000000..c36863a --- /dev/null +++ b/tests/cases/failing/abs-type-str.pre @@ -0,0 +1,2 @@ +STR: s = 'not-a-number' +ABS(s) diff --git a/tests/cases/failing/add-mixed-types.pre b/tests/cases/failing/add-mixed-types.pre new file mode 100644 index 0000000..d3ffa11 --- /dev/null +++ b/tests/cases/failing/add-mixed-types.pre @@ -0,0 +1 @@ +ADD(0d1, 0d1.0) diff --git a/tests/cases/failing/all-arity-zero.pre b/tests/cases/failing/all-arity-zero.pre new file mode 100644 index 0000000..226fac1 --- /dev/null +++ b/tests/cases/failing/all-arity-zero.pre @@ -0,0 +1 @@ +ALL() \ No newline at end of file diff --git a/tests/cases/failing/and-arity-three.pre b/tests/cases/failing/and-arity-three.pre new file mode 100644 index 0000000..cb45167 --- /dev/null +++ b/tests/cases/failing/and-arity-three.pre @@ -0,0 +1 @@ +AND(TRUE, TRUE, TRUE) diff --git a/tests/cases/failing/and-arity-zero.pre b/tests/cases/failing/and-arity-zero.pre new file mode 100644 index 0000000..976cc46 --- /dev/null +++ b/tests/cases/failing/and-arity-zero.pre @@ -0,0 +1 @@ +AND() \ No newline at end of file diff --git a/tests/cases/failing/any-arity-zero.pre b/tests/cases/failing/any-arity-zero.pre new file mode 100644 index 0000000..410c169 --- /dev/null +++ b/tests/cases/failing/any-arity-zero.pre @@ -0,0 +1 @@ +ANY() \ No newline at end of file diff --git a/tests/cases/failing/assert-false.pre b/tests/cases/failing/assert-false.pre new file mode 100644 index 0000000..7a7e525 --- /dev/null +++ b/tests/cases/failing/assert-false.pre @@ -0,0 +1 @@ +ASSERT(FALSE) diff --git a/tests/cases/failing/at-in-ident.pre b/tests/cases/failing/at-in-ident.pre new file mode 100644 index 0000000..de980ae --- /dev/null +++ b/tests/cases/failing/at-in-ident.pre @@ -0,0 +1 @@ +BOOL: x@ = TRUE diff --git a/tests/cases/failing/band-radix.pre b/tests/cases/failing/band-radix.pre new file mode 100644 index 0000000..968ad6c --- /dev/null +++ b/tests/cases/failing/band-radix.pre @@ -0,0 +1 @@ +BAND(0b1, 0d1) \ No newline at end of file diff --git a/tests/cases/failing/base-func.pre b/tests/cases/failing/base-func.pre new file mode 100644 index 0000000..1d687fc --- /dev/null +++ b/tests/cases/failing/base-func.pre @@ -0,0 +1 @@ +BASE(LAMBDA BOOL: sample_func(){}) diff --git a/tests/cases/failing/base-map.pre b/tests/cases/failing/base-map.pre new file mode 100644 index 0000000..81fd203 --- /dev/null +++ b/tests/cases/failing/base-map.pre @@ -0,0 +1 @@ +BASE(<>) diff --git a/tests/cases/failing/base-string.pre b/tests/cases/failing/base-string.pre new file mode 100644 index 0000000..37153a5 --- /dev/null +++ b/tests/cases/failing/base-string.pre @@ -0,0 +1 @@ +BASE("42") diff --git a/tests/cases/failing/base-thr.pre b/tests/cases/failing/base-thr.pre new file mode 100644 index 0000000..4534c4f --- /dev/null +++ b/tests/cases/failing/base-thr.pre @@ -0,0 +1 @@ +BASE(ASYNC{}) diff --git a/tests/cases/failing/bnot-radix.pre b/tests/cases/failing/bnot-radix.pre new file mode 100644 index 0000000..883ab1a --- /dev/null +++ b/tests/cases/failing/bnot-radix.pre @@ -0,0 +1 @@ +BNOT(0o1) \ No newline at end of file diff --git a/tests/cases/failing/bool-lowercase.pre b/tests/cases/failing/bool-lowercase.pre new file mode 100644 index 0000000..fcdfc18 --- /dev/null +++ b/tests/cases/failing/bool-lowercase.pre @@ -0,0 +1 @@ +ASSERT(true) \ No newline at end of file diff --git a/tests/cases/failing/bor-radix.pre b/tests/cases/failing/bor-radix.pre new file mode 100644 index 0000000..3586404 --- /dev/null +++ b/tests/cases/failing/bor-radix.pre @@ -0,0 +1 @@ +BOR(0d1, 0b1) \ No newline at end of file diff --git a/tests/cases/failing/break-no-argument.pre b/tests/cases/failing/break-no-argument.pre new file mode 100644 index 0000000..c228bbd --- /dev/null +++ b/tests/cases/failing/break-no-argument.pre @@ -0,0 +1,3 @@ +WHILE(TRUE){ + BREAK() +} diff --git a/tests/cases/failing/break-outside-loop.pre b/tests/cases/failing/break-outside-loop.pre new file mode 100644 index 0000000..041f66f --- /dev/null +++ b/tests/cases/failing/break-outside-loop.pre @@ -0,0 +1 @@ +BREAK(0d1) diff --git a/tests/cases/failing/break-target-not-int.pre b/tests/cases/failing/break-target-not-int.pre new file mode 100644 index 0000000..d688a05 --- /dev/null +++ b/tests/cases/failing/break-target-not-int.pre @@ -0,0 +1,3 @@ +WHILE(TRUE){ + BREAK(TRUE) +} diff --git a/tests/cases/failing/break-too-deep.pre b/tests/cases/failing/break-too-deep.pre new file mode 100644 index 0000000..7b388fa --- /dev/null +++ b/tests/cases/failing/break-too-deep.pre @@ -0,0 +1,3 @@ +WHILE(TRUE){ + BREAK(0d2) +} diff --git a/tests/cases/failing/break-zero.pre b/tests/cases/failing/break-zero.pre new file mode 100644 index 0000000..bd1eabe --- /dev/null +++ b/tests/cases/failing/break-zero.pre @@ -0,0 +1,3 @@ +WHILE(TRUE){ + BREAK(0d0) +} diff --git a/tests/cases/failing/bxor-radix.pre b/tests/cases/failing/bxor-radix.pre new file mode 100644 index 0000000..b2fcc09 --- /dev/null +++ b/tests/cases/failing/bxor-radix.pre @@ -0,0 +1 @@ +BXOR(0b1, 0x1) \ No newline at end of file diff --git a/tests/cases/failing/bytes-endian-case.pre b/tests/cases/failing/bytes-endian-case.pre new file mode 100644 index 0000000..9be56e0 --- /dev/null +++ b/tests/cases/failing/bytes-endian-case.pre @@ -0,0 +1 @@ +BYTES(0d1, endian = "Big") diff --git a/tests/cases/failing/bytes-first-bool.pre b/tests/cases/failing/bytes-first-bool.pre new file mode 100644 index 0000000..8d51c7e --- /dev/null +++ b/tests/cases/failing/bytes-first-bool.pre @@ -0,0 +1 @@ +BYTES(TRUE) diff --git a/tests/cases/failing/bytes-first-flt.pre b/tests/cases/failing/bytes-first-flt.pre new file mode 100644 index 0000000..720d5c0 --- /dev/null +++ b/tests/cases/failing/bytes-first-flt.pre @@ -0,0 +1 @@ +BYTES(0d1.5) diff --git a/tests/cases/failing/bytes-first-func.pre b/tests/cases/failing/bytes-first-func.pre new file mode 100644 index 0000000..f8a7fa2 --- /dev/null +++ b/tests/cases/failing/bytes-first-func.pre @@ -0,0 +1,2 @@ +FUNC INT: ff(INT: x){ RETURN x } +BYTES(ff) diff --git a/tests/cases/failing/bytes-first-map.pre b/tests/cases/failing/bytes-first-map.pre new file mode 100644 index 0000000..2b1807c --- /dev/null +++ b/tests/cases/failing/bytes-first-map.pre @@ -0,0 +1 @@ +BYTES(<"k" = 0d1>) diff --git a/tests/cases/failing/bytes-first-thr.pre b/tests/cases/failing/bytes-first-thr.pre new file mode 100644 index 0000000..416a1bb --- /dev/null +++ b/tests/cases/failing/bytes-first-thr.pre @@ -0,0 +1 @@ +BYTES(ASYNC{ TRUE }) diff --git a/tests/cases/failing/bytes-first-tns.pre b/tests/cases/failing/bytes-first-tns.pre new file mode 100644 index 0000000..f266c97 --- /dev/null +++ b/tests/cases/failing/bytes-first-tns.pre @@ -0,0 +1 @@ +BYTES([0d1]) diff --git a/tests/cases/failing/bytes-invalid-endian.pre b/tests/cases/failing/bytes-invalid-endian.pre new file mode 100644 index 0000000..5f4c049 --- /dev/null +++ b/tests/cases/failing/bytes-invalid-endian.pre @@ -0,0 +1 @@ +BYTES(0d1, endian = "middle") diff --git a/tests/cases/failing/bytes-negative.pre b/tests/cases/failing/bytes-negative.pre new file mode 100644 index 0000000..65c94f8 --- /dev/null +++ b/tests/cases/failing/bytes-negative.pre @@ -0,0 +1 @@ +BYTES(-0d1) diff --git a/tests/cases/failing/bytes-second-bool.pre b/tests/cases/failing/bytes-second-bool.pre new file mode 100644 index 0000000..cbf94e8 --- /dev/null +++ b/tests/cases/failing/bytes-second-bool.pre @@ -0,0 +1 @@ +BYTES(0d1, endian = TRUE) diff --git a/tests/cases/failing/bytes-second-flt.pre b/tests/cases/failing/bytes-second-flt.pre new file mode 100644 index 0000000..dc586c5 --- /dev/null +++ b/tests/cases/failing/bytes-second-flt.pre @@ -0,0 +1 @@ +BYTES(0d1, endian = 0d1.5) diff --git a/tests/cases/failing/bytes-second-func.pre b/tests/cases/failing/bytes-second-func.pre new file mode 100644 index 0000000..beff874 --- /dev/null +++ b/tests/cases/failing/bytes-second-func.pre @@ -0,0 +1,2 @@ +FUNC INT: ff(INT: x){ RETURN x } +BYTES(0d1, endian = ff) diff --git a/tests/cases/failing/bytes-second-int.pre b/tests/cases/failing/bytes-second-int.pre new file mode 100644 index 0000000..bf593df --- /dev/null +++ b/tests/cases/failing/bytes-second-int.pre @@ -0,0 +1 @@ +BYTES(0d1, 0d1) diff --git a/tests/cases/failing/bytes-second-map.pre b/tests/cases/failing/bytes-second-map.pre new file mode 100644 index 0000000..102d6ee --- /dev/null +++ b/tests/cases/failing/bytes-second-map.pre @@ -0,0 +1 @@ +BYTES(0d1, endian = <"k" = "big">) diff --git a/tests/cases/failing/bytes-second-thr.pre b/tests/cases/failing/bytes-second-thr.pre new file mode 100644 index 0000000..fbe2cc8 --- /dev/null +++ b/tests/cases/failing/bytes-second-thr.pre @@ -0,0 +1 @@ +BYTES(0d1, endian = ASYNC{ TRUE }) diff --git a/tests/cases/failing/bytes-second-tns.pre b/tests/cases/failing/bytes-second-tns.pre new file mode 100644 index 0000000..19a0449 --- /dev/null +++ b/tests/cases/failing/bytes-second-tns.pre @@ -0,0 +1 @@ +BYTES(0d1, endian = ["big"]) diff --git a/tests/cases/failing/bytes-value-type.pre b/tests/cases/failing/bytes-value-type.pre new file mode 100644 index 0000000..99c82a7 --- /dev/null +++ b/tests/cases/failing/bytes-value-type.pre @@ -0,0 +1 @@ +BYTES("1") diff --git a/tests/cases/failing/catch-no-try.pre b/tests/cases/failing/catch-no-try.pre new file mode 100644 index 0000000..62324f2 --- /dev/null +++ b/tests/cases/failing/catch-no-try.pre @@ -0,0 +1 @@ +CATCH{} diff --git a/tests/cases/failing/cdiv-zero-flt.pre b/tests/cases/failing/cdiv-zero-flt.pre new file mode 100644 index 0000000..db99be2 --- /dev/null +++ b/tests/cases/failing/cdiv-zero-flt.pre @@ -0,0 +1 @@ +CDIV(0o1.0, 0x0.0) \ No newline at end of file diff --git a/tests/cases/failing/cdiv-zero-int.pre b/tests/cases/failing/cdiv-zero-int.pre new file mode 100644 index 0000000..bf9201b --- /dev/null +++ b/tests/cases/failing/cdiv-zero-int.pre @@ -0,0 +1 @@ +CDIV(0d1, 0d0) \ No newline at end of file diff --git a/tests/cases/failing/clog-float.pre b/tests/cases/failing/clog-float.pre new file mode 100644 index 0000000..5c7b62c --- /dev/null +++ b/tests/cases/failing/clog-float.pre @@ -0,0 +1 @@ +CLOG(0d3.5) diff --git a/tests/cases/failing/clog-negative.pre b/tests/cases/failing/clog-negative.pre new file mode 100644 index 0000000..c72559e --- /dev/null +++ b/tests/cases/failing/clog-negative.pre @@ -0,0 +1 @@ +CLOG(-0d1) diff --git a/tests/cases/failing/clog-zero.pre b/tests/cases/failing/clog-zero.pre new file mode 100644 index 0000000..cc5d820 --- /dev/null +++ b/tests/cases/failing/clog-zero.pre @@ -0,0 +1 @@ +CLOG(0d0) diff --git a/tests/cases/failing/close-curly-bracket-in-ident.pre b/tests/cases/failing/close-curly-bracket-in-ident.pre new file mode 100644 index 0000000..9e1a957 --- /dev/null +++ b/tests/cases/failing/close-curly-bracket-in-ident.pre @@ -0,0 +1 @@ +BOOL: x} = TRUE diff --git a/tests/cases/failing/close-parentheses-in-ident.pre b/tests/cases/failing/close-parentheses-in-ident.pre new file mode 100644 index 0000000..e6c917e --- /dev/null +++ b/tests/cases/failing/close-parentheses-in-ident.pre @@ -0,0 +1 @@ +BOOL: x) = TRUE diff --git a/tests/cases/failing/close-square-bracket-in-ident.pre b/tests/cases/failing/close-square-bracket-in-ident.pre new file mode 100644 index 0000000..ac42964 --- /dev/null +++ b/tests/cases/failing/close-square-bracket-in-ident.pre @@ -0,0 +1 @@ +BOOL: x] = TRUE diff --git a/tests/cases/failing/comma-in-ident.pre b/tests/cases/failing/comma-in-ident.pre new file mode 100644 index 0000000..e919f40 --- /dev/null +++ b/tests/cases/failing/comma-in-ident.pre @@ -0,0 +1 @@ +BOOL: x, = TRUE diff --git a/tests/cases/failing/continue-no-parens.pre b/tests/cases/failing/continue-no-parens.pre new file mode 100644 index 0000000..5f979d5 --- /dev/null +++ b/tests/cases/failing/continue-no-parens.pre @@ -0,0 +1,3 @@ +WHILE(TRUE){ + CONTINUE +} diff --git a/tests/cases/failing/continue-outside-loop.pre b/tests/cases/failing/continue-outside-loop.pre new file mode 100644 index 0000000..387d2ac --- /dev/null +++ b/tests/cases/failing/continue-outside-loop.pre @@ -0,0 +1 @@ +CONTINUE() diff --git a/tests/cases/failing/continue-with-argument.pre b/tests/cases/failing/continue-with-argument.pre new file mode 100644 index 0000000..bd2593f --- /dev/null +++ b/tests/cases/failing/continue-with-argument.pre @@ -0,0 +1,3 @@ +WHILE(TRUE){ + CONTINUE(0d1) +} diff --git a/tests/cases/failing/convert-base-too-large.pre b/tests/cases/failing/convert-base-too-large.pre new file mode 100644 index 0000000..d451cf9 --- /dev/null +++ b/tests/cases/failing/convert-base-too-large.pre @@ -0,0 +1 @@ +CONVERT(0d42, 0d65) diff --git a/tests/cases/failing/convert-base-too-small.pre b/tests/cases/failing/convert-base-too-small.pre new file mode 100644 index 0000000..80a9fb0 --- /dev/null +++ b/tests/cases/failing/convert-base-too-small.pre @@ -0,0 +1 @@ +CONVERT(0d42, 0d1) diff --git a/tests/cases/failing/convert-base-wrong-type.pre b/tests/cases/failing/convert-base-wrong-type.pre new file mode 100644 index 0000000..696deeb --- /dev/null +++ b/tests/cases/failing/convert-base-wrong-type.pre @@ -0,0 +1 @@ +CONVERT(0d42, TRUE) diff --git a/tests/cases/failing/convert-value-map.pre b/tests/cases/failing/convert-value-map.pre new file mode 100644 index 0000000..7dcdfd0 --- /dev/null +++ b/tests/cases/failing/convert-value-map.pre @@ -0,0 +1 @@ +CONVERT(<>, 0d10) diff --git a/tests/cases/failing/convert-value-string.pre b/tests/cases/failing/convert-value-string.pre new file mode 100644 index 0000000..4237ca2 --- /dev/null +++ b/tests/cases/failing/convert-value-string.pre @@ -0,0 +1 @@ +CONVERT("42", 0d10) diff --git a/tests/cases/failing/del-already-deleted-symbol.pre b/tests/cases/failing/del-already-deleted-symbol.pre new file mode 100644 index 0000000..7bed578 --- /dev/null +++ b/tests/cases/failing/del-already-deleted-symbol.pre @@ -0,0 +1,3 @@ +BOOL: x = TRUE +DEL(x) +DEL(x) diff --git a/tests/cases/failing/del-map-intermediate-not-map.pre b/tests/cases/failing/del-map-intermediate-not-map.pre new file mode 100644 index 0000000..ff369a4 --- /dev/null +++ b/tests/cases/failing/del-map-intermediate-not-map.pre @@ -0,0 +1,2 @@ +MAP: value = <"branch" = 0d1> +DEL(value<"branch", "leaf">) diff --git a/tests/cases/failing/del-map-target-not-map.pre b/tests/cases/failing/del-map-target-not-map.pre new file mode 100644 index 0000000..364d22b --- /dev/null +++ b/tests/cases/failing/del-map-target-not-map.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +DEL(value<"key">) diff --git a/tests/cases/failing/del-never-assigned-symbol.pre b/tests/cases/failing/del-never-assigned-symbol.pre new file mode 100644 index 0000000..27a2a8c --- /dev/null +++ b/tests/cases/failing/del-never-assigned-symbol.pre @@ -0,0 +1,2 @@ +BOOL: x +DEL(x) diff --git a/tests/cases/failing/del-nonexistent-symbol.pre b/tests/cases/failing/del-nonexistent-symbol.pre new file mode 100644 index 0000000..987c6fa --- /dev/null +++ b/tests/cases/failing/del-nonexistent-symbol.pre @@ -0,0 +1 @@ +DEL(x) diff --git a/tests/cases/failing/del-type-mismatch-after-delete.pre b/tests/cases/failing/del-type-mismatch-after-delete.pre new file mode 100644 index 0000000..8986a74 --- /dev/null +++ b/tests/cases/failing/del-type-mismatch-after-delete.pre @@ -0,0 +1,3 @@ +INT: x = 0d1 +DEL(x) +BOOL: x = TRUE diff --git a/tests/cases/failing/div-zero-flt.pre b/tests/cases/failing/div-zero-flt.pre new file mode 100644 index 0000000..ba8c9d0 --- /dev/null +++ b/tests/cases/failing/div-zero-flt.pre @@ -0,0 +1 @@ +DIV(0o1.0, 0x0.0) diff --git a/tests/cases/failing/div-zero-int.pre b/tests/cases/failing/div-zero-int.pre new file mode 100644 index 0000000..c4d6f88 --- /dev/null +++ b/tests/cases/failing/div-zero-int.pre @@ -0,0 +1 @@ +DIV(0d1, 0d0) diff --git a/tests/cases/failing/else-no-if.pre b/tests/cases/failing/else-no-if.pre new file mode 100644 index 0000000..b736387 --- /dev/null +++ b/tests/cases/failing/else-no-if.pre @@ -0,0 +1,3 @@ +ELSE{ + ASSERT(FALSE) +} diff --git a/tests/cases/failing/elseif-after-else.pre b/tests/cases/failing/elseif-after-else.pre new file mode 100644 index 0000000..524bfcf --- /dev/null +++ b/tests/cases/failing/elseif-after-else.pre @@ -0,0 +1,7 @@ +IF(FALSE){ + ASSERT(FALSE) +} ELSE { + ASSERT(FALSE) +} ELSEIF(TRUE) { + ASSERT(TRUE) +} diff --git a/tests/cases/failing/elseif-else-seperated.pre b/tests/cases/failing/elseif-else-seperated.pre new file mode 100644 index 0000000..7229e70 --- /dev/null +++ b/tests/cases/failing/elseif-else-seperated.pre @@ -0,0 +1,9 @@ +IF(FALSE){ + ASSERT(TRUE) +} ELSEIF(FALSE){ + ASSERT(TRUE) +} + +ELSE { + ASSERT(TRUE) +} diff --git a/tests/cases/failing/elseif-elseif-seperated.pre b/tests/cases/failing/elseif-elseif-seperated.pre new file mode 100644 index 0000000..fd0d387 --- /dev/null +++ b/tests/cases/failing/elseif-elseif-seperated.pre @@ -0,0 +1,9 @@ +IF(FALSE){ + ASSERT(FALSE) +} ELSEIF(FALSE){ + ASSERT(FALSE) +} + +ELSEIF(TRUE) { + ASSERT(TRUE) +} diff --git a/tests/cases/failing/elseif-no-if.pre b/tests/cases/failing/elseif-no-if.pre new file mode 100644 index 0000000..e6119ac --- /dev/null +++ b/tests/cases/failing/elseif-no-if.pre @@ -0,0 +1,3 @@ +ELSEIF(TRUE){ + ASSERT(FALSE) +} diff --git a/tests/cases/failing/empty-identifier.pre b/tests/cases/failing/empty-identifier.pre new file mode 100644 index 0000000..9dad21b --- /dev/null +++ b/tests/cases/failing/empty-identifier.pre @@ -0,0 +1 @@ +BOOL = TRUE diff --git a/tests/cases/failing/eq-arity-one.pre b/tests/cases/failing/eq-arity-one.pre new file mode 100644 index 0000000..a07ef77 --- /dev/null +++ b/tests/cases/failing/eq-arity-one.pre @@ -0,0 +1 @@ +EQ(0d1) \ No newline at end of file diff --git a/tests/cases/failing/eq-arity-three.pre b/tests/cases/failing/eq-arity-three.pre new file mode 100644 index 0000000..28634f3 --- /dev/null +++ b/tests/cases/failing/eq-arity-three.pre @@ -0,0 +1 @@ +EQ(0d1, 0d2, 0d3) \ No newline at end of file diff --git a/tests/cases/failing/equals-in-ident.pre b/tests/cases/failing/equals-in-ident.pre new file mode 100644 index 0000000..55d7986 --- /dev/null +++ b/tests/cases/failing/equals-in-ident.pre @@ -0,0 +1 @@ +BOOL: x= = TRUE diff --git a/tests/cases/failing/first-assign-no-type.pre b/tests/cases/failing/first-assign-no-type.pre new file mode 100644 index 0000000..7925133 --- /dev/null +++ b/tests/cases/failing/first-assign-no-type.pre @@ -0,0 +1 @@ +ASSIGN(x, TRUE) diff --git a/tests/cases/failing/first-decl-no-type.pre b/tests/cases/failing/first-decl-no-type.pre new file mode 100644 index 0000000..f214167 --- /dev/null +++ b/tests/cases/failing/first-decl-no-type.pre @@ -0,0 +1 @@ +x = TRUE diff --git a/tests/cases/failing/flt-invalid-digit.pre b/tests/cases/failing/flt-invalid-digit.pre new file mode 100644 index 0000000..eee4aaa --- /dev/null +++ b/tests/cases/failing/flt-invalid-digit.pre @@ -0,0 +1 @@ +FLT: a = 0b2.0 diff --git a/tests/cases/failing/flt-negative-nan.pre b/tests/cases/failing/flt-negative-nan.pre new file mode 100644 index 0000000..c16ad08 --- /dev/null +++ b/tests/cases/failing/flt-negative-nan.pre @@ -0,0 +1 @@ +FLT: bad = -NaN diff --git a/tests/cases/failing/flt-no-fraction.pre b/tests/cases/failing/flt-no-fraction.pre new file mode 100644 index 0000000..22bc75c --- /dev/null +++ b/tests/cases/failing/flt-no-fraction.pre @@ -0,0 +1 @@ +FLT: a = 0d1. diff --git a/tests/cases/failing/flt-no-integer.pre b/tests/cases/failing/flt-no-integer.pre new file mode 100644 index 0000000..7a2edb3 --- /dev/null +++ b/tests/cases/failing/flt-no-integer.pre @@ -0,0 +1 @@ +FLT: a = 0d.5 diff --git a/tests/cases/failing/flt-plus-sign.pre b/tests/cases/failing/flt-plus-sign.pre new file mode 100644 index 0000000..ee5afb7 --- /dev/null +++ b/tests/cases/failing/flt-plus-sign.pre @@ -0,0 +1 @@ +FLT: a = +0d1.0 diff --git a/tests/cases/failing/for-no-block.pre b/tests/cases/failing/for-no-block.pre new file mode 100644 index 0000000..d901dae --- /dev/null +++ b/tests/cases/failing/for-no-block.pre @@ -0,0 +1 @@ +FOR(i, 0d1) diff --git a/tests/cases/failing/for-no-target.pre b/tests/cases/failing/for-no-target.pre new file mode 100644 index 0000000..c2d898d --- /dev/null +++ b/tests/cases/failing/for-no-target.pre @@ -0,0 +1 @@ +FOR(i, ){} diff --git a/tests/cases/failing/for-target-not-int.pre b/tests/cases/failing/for-target-not-int.pre new file mode 100644 index 0000000..b2497f2 --- /dev/null +++ b/tests/cases/failing/for-target-not-int.pre @@ -0,0 +1 @@ +FOR(i, TRUE){} \ No newline at end of file diff --git a/tests/cases/failing/froot-neg-even.pre b/tests/cases/failing/froot-neg-even.pre new file mode 100644 index 0000000..51172d5 --- /dev/null +++ b/tests/cases/failing/froot-neg-even.pre @@ -0,0 +1 @@ +FROOT(-0d1.0, 0d2.0) diff --git a/tests/cases/failing/fsum-str.pre b/tests/cases/failing/fsum-str.pre new file mode 100644 index 0000000..81c9fab --- /dev/null +++ b/tests/cases/failing/fsum-str.pre @@ -0,0 +1 @@ +FSUM('1.0', 0d1) diff --git a/tests/cases/failing/func-default-before-positional.pre b/tests/cases/failing/func-default-before-positional.pre new file mode 100644 index 0000000..ab02dc0 --- /dev/null +++ b/tests/cases/failing/func-default-before-positional.pre @@ -0,0 +1,3 @@ +FUNC INT: sample(INT: first = 0d1, INT: second){ + RETURN(ADD(first, second)) +} diff --git a/tests/cases/failing/func-missing-param-type.pre b/tests/cases/failing/func-missing-param-type.pre new file mode 100644 index 0000000..fbf45d8 --- /dev/null +++ b/tests/cases/failing/func-missing-param-type.pre @@ -0,0 +1,3 @@ +FUNC INT: sample(value){ + RETURN(value) +} \ No newline at end of file diff --git a/tests/cases/failing/func-missing-return-type.pre b/tests/cases/failing/func-missing-return-type.pre new file mode 100644 index 0000000..146423e --- /dev/null +++ b/tests/cases/failing/func-missing-return-type.pre @@ -0,0 +1,3 @@ +FUNC sample(INT: value){ + RETURN(value) +} \ No newline at end of file diff --git a/tests/cases/failing/func-name-conflicts-builtin.pre b/tests/cases/failing/func-name-conflicts-builtin.pre new file mode 100644 index 0000000..9e26e33 --- /dev/null +++ b/tests/cases/failing/func-name-conflicts-builtin.pre @@ -0,0 +1,3 @@ +FUNC INT: ASSERT(){ + RETURN(0d0) +} \ No newline at end of file diff --git a/tests/cases/failing/func-name-conflicts-symbol.pre b/tests/cases/failing/func-name-conflicts-symbol.pre new file mode 100644 index 0000000..5ef9b0c --- /dev/null +++ b/tests/cases/failing/func-name-conflicts-symbol.pre @@ -0,0 +1,4 @@ +INT: sample = 0d1 +FUNC INT: sample(){ + RETURN(0d0) +} \ No newline at end of file diff --git a/tests/cases/failing/func-positional-after-keyword.pre b/tests/cases/failing/func-positional-after-keyword.pre new file mode 100644 index 0000000..e24547e --- /dev/null +++ b/tests/cases/failing/func-positional-after-keyword.pre @@ -0,0 +1,5 @@ +FUNC INT: sample(INT: left, INT: right = 0d0){ + RETURN(ADD(left, right)) +} + +sample(left = 0d1, 0d2) \ No newline at end of file diff --git a/tests/cases/failing/gcd-arity-one.pre b/tests/cases/failing/gcd-arity-one.pre new file mode 100644 index 0000000..487f0a3 --- /dev/null +++ b/tests/cases/failing/gcd-arity-one.pre @@ -0,0 +1 @@ +GCD(0d12) diff --git a/tests/cases/failing/gcd-arity-three.pre b/tests/cases/failing/gcd-arity-three.pre new file mode 100644 index 0000000..83bf925 --- /dev/null +++ b/tests/cases/failing/gcd-arity-three.pre @@ -0,0 +1 @@ +GCD(0d12, 0d6, 0d3) diff --git a/tests/cases/failing/gcd-mixed-types-reversed.pre b/tests/cases/failing/gcd-mixed-types-reversed.pre new file mode 100644 index 0000000..95d19c0 --- /dev/null +++ b/tests/cases/failing/gcd-mixed-types-reversed.pre @@ -0,0 +1 @@ +GCD(0d12.0, 0d6) diff --git a/tests/cases/failing/gcd-mixed-types.pre b/tests/cases/failing/gcd-mixed-types.pre new file mode 100644 index 0000000..7e6d5dd --- /dev/null +++ b/tests/cases/failing/gcd-mixed-types.pre @@ -0,0 +1 @@ +GCD(0d12, 0d6.0) diff --git a/tests/cases/failing/gcd-type-bool.pre b/tests/cases/failing/gcd-type-bool.pre new file mode 100644 index 0000000..7057c28 --- /dev/null +++ b/tests/cases/failing/gcd-type-bool.pre @@ -0,0 +1 @@ +GCD(TRUE, FALSE) diff --git a/tests/cases/failing/gcd-type-str.pre b/tests/cases/failing/gcd-type-str.pre new file mode 100644 index 0000000..2879291 --- /dev/null +++ b/tests/cases/failing/gcd-type-str.pre @@ -0,0 +1 @@ +GCD("12", "6") diff --git a/tests/cases/failing/goto-no-parens.pre b/tests/cases/failing/goto-no-parens.pre new file mode 100644 index 0000000..8b1d18d --- /dev/null +++ b/tests/cases/failing/goto-no-parens.pre @@ -0,0 +1,2 @@ +GOTOPOINT(0d1) +GOTO 0d1 diff --git a/tests/cases/failing/gotopoint-no-parens.pre b/tests/cases/failing/gotopoint-no-parens.pre new file mode 100644 index 0000000..690c74b --- /dev/null +++ b/tests/cases/failing/gotopoint-no-parens.pre @@ -0,0 +1 @@ +GOTOPOINT 0d1 diff --git a/tests/cases/failing/hash-in-ident.pre b/tests/cases/failing/hash-in-ident.pre new file mode 100644 index 0000000..08595b7 --- /dev/null +++ b/tests/cases/failing/hash-in-ident.pre @@ -0,0 +1 @@ +BOOL: x# = TRUE diff --git a/tests/cases/failing/iadd-coerce-int-inf.pre b/tests/cases/failing/iadd-coerce-int-inf.pre new file mode 100644 index 0000000..0f890b9 --- /dev/null +++ b/tests/cases/failing/iadd-coerce-int-inf.pre @@ -0,0 +1 @@ +IADD(0d1, INF) diff --git a/tests/cases/failing/iadd-coerce-int-nan.pre b/tests/cases/failing/iadd-coerce-int-nan.pre new file mode 100644 index 0000000..5605a61 --- /dev/null +++ b/tests/cases/failing/iadd-coerce-int-nan.pre @@ -0,0 +1 @@ +IADD(0d1, NaN) diff --git a/tests/cases/failing/iadd-coerce-int-str.pre b/tests/cases/failing/iadd-coerce-int-str.pre new file mode 100644 index 0000000..99aa0bd --- /dev/null +++ b/tests/cases/failing/iadd-coerce-int-str.pre @@ -0,0 +1 @@ +IADD(0d1, "x") diff --git a/tests/cases/failing/iadd-coerce-str-int.pre b/tests/cases/failing/iadd-coerce-str-int.pre new file mode 100644 index 0000000..fc94bb5 --- /dev/null +++ b/tests/cases/failing/iadd-coerce-str-int.pre @@ -0,0 +1 @@ +IADD("string", 0d5) diff --git a/tests/cases/failing/iadd-coerce-type-bool.pre b/tests/cases/failing/iadd-coerce-type-bool.pre new file mode 100644 index 0000000..5d30795 --- /dev/null +++ b/tests/cases/failing/iadd-coerce-type-bool.pre @@ -0,0 +1 @@ +IADD(0d1, true) diff --git a/tests/cases/failing/iadd-coerce-type-map.pre b/tests/cases/failing/iadd-coerce-type-map.pre new file mode 100644 index 0000000..5a8cdad --- /dev/null +++ b/tests/cases/failing/iadd-coerce-type-map.pre @@ -0,0 +1 @@ +IADD([0d1], 0d2) diff --git a/tests/cases/failing/idiv-zero-int.pre b/tests/cases/failing/idiv-zero-int.pre new file mode 100644 index 0000000..526e25a --- /dev/null +++ b/tests/cases/failing/idiv-zero-int.pre @@ -0,0 +1,3 @@ +INT: a = 0d1 +INT: b = 0d0 +IDIV(a, b) diff --git a/tests/cases/failing/if-else-no-block.pre b/tests/cases/failing/if-else-no-block.pre new file mode 100644 index 0000000..c2a9992 --- /dev/null +++ b/tests/cases/failing/if-else-no-block.pre @@ -0,0 +1 @@ +IF(TRUE){}ELSE diff --git a/tests/cases/failing/if-else-seperated.pre b/tests/cases/failing/if-else-seperated.pre new file mode 100644 index 0000000..a3029b1 --- /dev/null +++ b/tests/cases/failing/if-else-seperated.pre @@ -0,0 +1,7 @@ +IF(FALSE){ + ASSERT(TRUE) +} + +ELSE{ + ASSERT(FALSE) +} diff --git a/tests/cases/failing/if-elseif-no-block.pre b/tests/cases/failing/if-elseif-no-block.pre new file mode 100644 index 0000000..df348bd --- /dev/null +++ b/tests/cases/failing/if-elseif-no-block.pre @@ -0,0 +1 @@ +IF(TRUE){}ELSEIF() diff --git a/tests/cases/failing/if-elseif-no-condition.pre b/tests/cases/failing/if-elseif-no-condition.pre new file mode 100644 index 0000000..a795ada --- /dev/null +++ b/tests/cases/failing/if-elseif-no-condition.pre @@ -0,0 +1 @@ +IF(TRUE){}ELSEIF(){} diff --git a/tests/cases/failing/if-elseif-seperated.pre b/tests/cases/failing/if-elseif-seperated.pre new file mode 100644 index 0000000..165f1d4 --- /dev/null +++ b/tests/cases/failing/if-elseif-seperated.pre @@ -0,0 +1,7 @@ +IF(FALSE){ + ASSERT(TRUE) +} + +ELSEIF(TRUE){ + ASSERT(FALSE) +} diff --git a/tests/cases/failing/if-no-block.pre b/tests/cases/failing/if-no-block.pre new file mode 100644 index 0000000..ee63fe7 --- /dev/null +++ b/tests/cases/failing/if-no-block.pre @@ -0,0 +1 @@ +IF() diff --git a/tests/cases/failing/if-no-condition.pre b/tests/cases/failing/if-no-condition.pre new file mode 100644 index 0000000..83c6cf7 --- /dev/null +++ b/tests/cases/failing/if-no-condition.pre @@ -0,0 +1 @@ +IF{} diff --git a/tests/cases/failing/ilen-non-int.pre b/tests/cases/failing/ilen-non-int.pre new file mode 100644 index 0000000..e25a047 --- /dev/null +++ b/tests/cases/failing/ilen-non-int.pre @@ -0,0 +1 @@ +ILEN("abc") \ No newline at end of file diff --git a/tests/cases/failing/int-invalid-digit.pre b/tests/cases/failing/int-invalid-digit.pre new file mode 100644 index 0000000..ce7f728 --- /dev/null +++ b/tests/cases/failing/int-invalid-digit.pre @@ -0,0 +1,3 @@ +INT: a = 0b2 +INT: b = 0o8 +INT: c = 0xG diff --git a/tests/cases/failing/int-missing-digits.pre b/tests/cases/failing/int-missing-digits.pre new file mode 100644 index 0000000..20fce0c --- /dev/null +++ b/tests/cases/failing/int-missing-digits.pre @@ -0,0 +1 @@ +INT: a = 0d diff --git a/tests/cases/failing/int-plus-sign.pre b/tests/cases/failing/int-plus-sign.pre new file mode 100644 index 0000000..36fa83f --- /dev/null +++ b/tests/cases/failing/int-plus-sign.pre @@ -0,0 +1 @@ +INT: a = +0d1 diff --git a/tests/cases/failing/int-r-bad-format.pre b/tests/cases/failing/int-r-bad-format.pre new file mode 100644 index 0000000..6f83c2b --- /dev/null +++ b/tests/cases/failing/int-r-bad-format.pre @@ -0,0 +1,2 @@ +INT: a = 0r1 +INT: b = 0r1A123 diff --git a/tests/cases/failing/int-r-base-too-large.pre b/tests/cases/failing/int-r-base-too-large.pre new file mode 100644 index 0000000..c7941f4 --- /dev/null +++ b/tests/cases/failing/int-r-base-too-large.pre @@ -0,0 +1 @@ +INT: b = 0r651 diff --git a/tests/cases/failing/int-r-base-too-small.pre b/tests/cases/failing/int-r-base-too-small.pre new file mode 100644 index 0000000..11bcef2 --- /dev/null +++ b/tests/cases/failing/int-r-base-too-small.pre @@ -0,0 +1 @@ +INT: a = 0r011 diff --git a/tests/cases/failing/int-r-missing-digits.pre b/tests/cases/failing/int-r-missing-digits.pre new file mode 100644 index 0000000..99bd7ee --- /dev/null +++ b/tests/cases/failing/int-r-missing-digits.pre @@ -0,0 +1 @@ +INT: a = 0r10 diff --git a/tests/cases/failing/iroot-int-zero-exponent.pre b/tests/cases/failing/iroot-int-zero-exponent.pre new file mode 100644 index 0000000..61683c8 --- /dev/null +++ b/tests/cases/failing/iroot-int-zero-exponent.pre @@ -0,0 +1 @@ +IROOT(0d10, 0d0) diff --git a/tests/cases/failing/join-mixed-sign.pre b/tests/cases/failing/join-mixed-sign.pre new file mode 100644 index 0000000..e670824 --- /dev/null +++ b/tests/cases/failing/join-mixed-sign.pre @@ -0,0 +1 @@ +JOIN(-0b1, 0b1) diff --git a/tests/cases/failing/join-mixed-types.pre b/tests/cases/failing/join-mixed-types.pre new file mode 100644 index 0000000..9861659 --- /dev/null +++ b/tests/cases/failing/join-mixed-types.pre @@ -0,0 +1 @@ +JOIN("1", 0b1) diff --git a/tests/cases/failing/lambda-default-before-positional.pre b/tests/cases/failing/lambda-default-before-positional.pre new file mode 100644 index 0000000..e84fca6 --- /dev/null +++ b/tests/cases/failing/lambda-default-before-positional.pre @@ -0,0 +1,3 @@ +FUNC: sample = LAMBDA INT: (INT: first = 0d1, INT: second){ + RETURN(ADD(first, second)) +} \ No newline at end of file diff --git a/tests/cases/failing/lambda-missing-param-type.pre b/tests/cases/failing/lambda-missing-param-type.pre new file mode 100644 index 0000000..db95a47 --- /dev/null +++ b/tests/cases/failing/lambda-missing-param-type.pre @@ -0,0 +1,3 @@ +FUNC: sample = LAMBDA INT: (value){ + RETURN(value) +} \ No newline at end of file diff --git a/tests/cases/failing/lambda-missing-return-type.pre b/tests/cases/failing/lambda-missing-return-type.pre new file mode 100644 index 0000000..5283b22 --- /dev/null +++ b/tests/cases/failing/lambda-missing-return-type.pre @@ -0,0 +1,3 @@ +FUNC: sample = LAMBDA (INT: value){ + RETURN(value) +} \ No newline at end of file diff --git a/tests/cases/failing/lcm-arity-one.pre b/tests/cases/failing/lcm-arity-one.pre new file mode 100644 index 0000000..acd1a55 --- /dev/null +++ b/tests/cases/failing/lcm-arity-one.pre @@ -0,0 +1 @@ +LCM(0d12) diff --git a/tests/cases/failing/lcm-arity-three.pre b/tests/cases/failing/lcm-arity-three.pre new file mode 100644 index 0000000..68f60d2 --- /dev/null +++ b/tests/cases/failing/lcm-arity-three.pre @@ -0,0 +1 @@ +LCM(0d12, 0d6, 0d3) diff --git a/tests/cases/failing/lcm-mixed-types-reversed.pre b/tests/cases/failing/lcm-mixed-types-reversed.pre new file mode 100644 index 0000000..9a0888c --- /dev/null +++ b/tests/cases/failing/lcm-mixed-types-reversed.pre @@ -0,0 +1 @@ +LCM(0d12.0, 0d6) diff --git a/tests/cases/failing/lcm-mixed-types.pre b/tests/cases/failing/lcm-mixed-types.pre new file mode 100644 index 0000000..b249ecc --- /dev/null +++ b/tests/cases/failing/lcm-mixed-types.pre @@ -0,0 +1 @@ +LCM(0d12, 0d6.0) diff --git a/tests/cases/failing/lcm-type-bool.pre b/tests/cases/failing/lcm-type-bool.pre new file mode 100644 index 0000000..7dce6aa --- /dev/null +++ b/tests/cases/failing/lcm-type-bool.pre @@ -0,0 +1 @@ +LCM(TRUE, FALSE) diff --git a/tests/cases/failing/lcm-type-str.pre b/tests/cases/failing/lcm-type-str.pre new file mode 100644 index 0000000..15e1688 --- /dev/null +++ b/tests/cases/failing/lcm-type-str.pre @@ -0,0 +1 @@ +LCM("12", "6") diff --git a/tests/cases/failing/len-unsupported.pre b/tests/cases/failing/len-unsupported.pre new file mode 100644 index 0000000..16f6ee7 --- /dev/null +++ b/tests/cases/failing/len-unsupported.pre @@ -0,0 +1 @@ +LEN([0d1]) \ No newline at end of file diff --git a/tests/cases/failing/log-negative.pre b/tests/cases/failing/log-negative.pre new file mode 100644 index 0000000..13e602c --- /dev/null +++ b/tests/cases/failing/log-negative.pre @@ -0,0 +1 @@ +LOG(-0d3) diff --git a/tests/cases/failing/log-non-numeric.pre b/tests/cases/failing/log-non-numeric.pre new file mode 100644 index 0000000..f04c87b --- /dev/null +++ b/tests/cases/failing/log-non-numeric.pre @@ -0,0 +1 @@ +LOG("hello") diff --git a/tests/cases/failing/log-zero.pre b/tests/cases/failing/log-zero.pre new file mode 100644 index 0000000..bdd5d86 --- /dev/null +++ b/tests/cases/failing/log-zero.pre @@ -0,0 +1 @@ +LOG(0d0) diff --git a/tests/cases/failing/lower-arity-two.pre b/tests/cases/failing/lower-arity-two.pre new file mode 100644 index 0000000..cbe4a7b --- /dev/null +++ b/tests/cases/failing/lower-arity-two.pre @@ -0,0 +1 @@ +LOWER("a", "b") \ No newline at end of file diff --git a/tests/cases/failing/lower-arity-zero.pre b/tests/cases/failing/lower-arity-zero.pre new file mode 100644 index 0000000..9a47156 --- /dev/null +++ b/tests/cases/failing/lower-arity-zero.pre @@ -0,0 +1 @@ +LOWER() \ No newline at end of file diff --git a/tests/cases/failing/lower-non-str.pre b/tests/cases/failing/lower-non-str.pre new file mode 100644 index 0000000..013a80d --- /dev/null +++ b/tests/cases/failing/lower-non-str.pre @@ -0,0 +1 @@ +LOWER(0d1) \ No newline at end of file diff --git a/tests/cases/failing/map-literal-bad-key-bool.pre b/tests/cases/failing/map-literal-bad-key-bool.pre new file mode 100644 index 0000000..1800db6 --- /dev/null +++ b/tests/cases/failing/map-literal-bad-key-bool.pre @@ -0,0 +1 @@ +MAP: bad = diff --git a/tests/cases/failing/map-literal-bad-key-tns.pre b/tests/cases/failing/map-literal-bad-key-tns.pre new file mode 100644 index 0000000..96ce9aa --- /dev/null +++ b/tests/cases/failing/map-literal-bad-key-tns.pre @@ -0,0 +1 @@ +MAP: bad = <[0d1] = 0d1> diff --git a/tests/cases/failing/map-literal-missing-equals.pre b/tests/cases/failing/map-literal-missing-equals.pre new file mode 100644 index 0000000..dd70b20 --- /dev/null +++ b/tests/cases/failing/map-literal-missing-equals.pre @@ -0,0 +1 @@ +MAP: bad = <"a" 0d1> diff --git a/tests/cases/failing/map-literal-self-bad-key.pre b/tests/cases/failing/map-literal-self-bad-key.pre new file mode 100644 index 0000000..90acefe --- /dev/null +++ b/tests/cases/failing/map-literal-self-bad-key.pre @@ -0,0 +1 @@ +MAP: bad = <"value" = 0d1, "copy" = SELF> diff --git a/tests/cases/failing/map-literal-self-forward.pre b/tests/cases/failing/map-literal-self-forward.pre new file mode 100644 index 0000000..d7f82f8 --- /dev/null +++ b/tests/cases/failing/map-literal-self-forward.pre @@ -0,0 +1 @@ +MAP: bad = <"copy" = SELF<"value">, "value" = 0d1> diff --git a/tests/cases/failing/map-literal-trailing-comma.pre b/tests/cases/failing/map-literal-trailing-comma.pre new file mode 100644 index 0000000..9e46297 --- /dev/null +++ b/tests/cases/failing/map-literal-trailing-comma.pre @@ -0,0 +1 @@ +MAP: bad = <"a" = 0d1,> diff --git a/tests/cases/failing/max-mixed-types.pre b/tests/cases/failing/max-mixed-types.pre new file mode 100644 index 0000000..5ec0097 --- /dev/null +++ b/tests/cases/failing/max-mixed-types.pre @@ -0,0 +1,2 @@ +! Mixing INT and FLT in arguments must raise a runtime error per specification +INT: _ = MAX(0d1, 0d2.0) diff --git a/tests/cases/failing/max-tns-mixed-element-type.pre b/tests/cases/failing/max-tns-mixed-element-type.pre new file mode 100644 index 0000000..7a9511f --- /dev/null +++ b/tests/cases/failing/max-tns-mixed-element-type.pre @@ -0,0 +1,4 @@ +! TNS arguments must share the same scalar element type per specification +TNS: a = [0d1] +TNS: b = ["x"] +INT: _ = MAX(a, b) diff --git a/tests/cases/failing/min-mixed-types.pre b/tests/cases/failing/min-mixed-types.pre new file mode 100644 index 0000000..bb744d5 --- /dev/null +++ b/tests/cases/failing/min-mixed-types.pre @@ -0,0 +1,2 @@ +! Mixing INT and FLT in arguments must raise a runtime error per specification +_ = MIN(0d1, 0d2.0) diff --git a/tests/cases/failing/min-tns-mixed-element-type.pre b/tests/cases/failing/min-tns-mixed-element-type.pre new file mode 100644 index 0000000..df8c2d3 --- /dev/null +++ b/tests/cases/failing/min-tns-mixed-element-type.pre @@ -0,0 +1,4 @@ +! TNS arguments must share the same scalar element type per specification +TNS: a = [0d1] +TNS: b = ["x"] +_ = MIN(a, b) diff --git a/tests/cases/failing/mod-zero-flt.pre b/tests/cases/failing/mod-zero-flt.pre new file mode 100644 index 0000000..a01006a --- /dev/null +++ b/tests/cases/failing/mod-zero-flt.pre @@ -0,0 +1 @@ +MOD(0o1.0, 0x0.0) \ No newline at end of file diff --git a/tests/cases/failing/mod-zero-int.pre b/tests/cases/failing/mod-zero-int.pre new file mode 100644 index 0000000..fda1cb9 --- /dev/null +++ b/tests/cases/failing/mod-zero-int.pre @@ -0,0 +1 @@ +MOD(0d1, 0d0) \ No newline at end of file diff --git a/tests/cases/failing/neg-type-bool.pre b/tests/cases/failing/neg-type-bool.pre new file mode 100644 index 0000000..7ddfe75 --- /dev/null +++ b/tests/cases/failing/neg-type-bool.pre @@ -0,0 +1,2 @@ +BOOL: b = TRUE +NEG(b) diff --git a/tests/cases/failing/neg-type-str.pre b/tests/cases/failing/neg-type-str.pre new file mode 100644 index 0000000..586c1e0 --- /dev/null +++ b/tests/cases/failing/neg-type-str.pre @@ -0,0 +1,2 @@ +STR: s = 'not-a-number' +NEG(s) diff --git a/tests/cases/failing/neq-arity-one.pre b/tests/cases/failing/neq-arity-one.pre new file mode 100644 index 0000000..acc7384 --- /dev/null +++ b/tests/cases/failing/neq-arity-one.pre @@ -0,0 +1 @@ +NEQ(0d1) \ No newline at end of file diff --git a/tests/cases/failing/neq-arity-three.pre b/tests/cases/failing/neq-arity-three.pre new file mode 100644 index 0000000..ba283df --- /dev/null +++ b/tests/cases/failing/neq-arity-three.pre @@ -0,0 +1 @@ +NEQ(0d1, 0d2, 0d3) \ No newline at end of file diff --git a/tests/cases/failing/non-ascii.pre b/tests/cases/failing/non-ascii.pre new file mode 100644 index 0000000..10998cd --- /dev/null +++ b/tests/cases/failing/non-ascii.pre @@ -0,0 +1 @@ +STR: invalid = "Īñvàlïd" diff --git a/tests/cases/failing/not-arity-two.pre b/tests/cases/failing/not-arity-two.pre new file mode 100644 index 0000000..c36990e --- /dev/null +++ b/tests/cases/failing/not-arity-two.pre @@ -0,0 +1 @@ +NOT(TRUE, FALSE) \ No newline at end of file diff --git a/tests/cases/failing/not-arity-zero.pre b/tests/cases/failing/not-arity-zero.pre new file mode 100644 index 0000000..37950ab --- /dev/null +++ b/tests/cases/failing/not-arity-zero.pre @@ -0,0 +1 @@ +NOT() \ No newline at end of file diff --git a/tests/cases/failing/one-starts-ident.pre b/tests/cases/failing/one-starts-ident.pre new file mode 100644 index 0000000..200ef24 --- /dev/null +++ b/tests/cases/failing/one-starts-ident.pre @@ -0,0 +1 @@ +BOOL: 1x = TRUE diff --git a/tests/cases/failing/op-flt-bad-str.pre b/tests/cases/failing/op-flt-bad-str.pre new file mode 100644 index 0000000..dc94728 --- /dev/null +++ b/tests/cases/failing/op-flt-bad-str.pre @@ -0,0 +1 @@ +FLT("prefix") \ No newline at end of file diff --git a/tests/cases/failing/op-flt-func.pre b/tests/cases/failing/op-flt-func.pre new file mode 100644 index 0000000..4142b8a --- /dev/null +++ b/tests/cases/failing/op-flt-func.pre @@ -0,0 +1,5 @@ +FUNC INT: sample_func(){ + RETURN(0d1) +} + +FLT(sample_func) \ No newline at end of file diff --git a/tests/cases/failing/op-flt-map.pre b/tests/cases/failing/op-flt-map.pre new file mode 100644 index 0000000..473a168 --- /dev/null +++ b/tests/cases/failing/op-flt-map.pre @@ -0,0 +1 @@ +FLT(<>) \ No newline at end of file diff --git a/tests/cases/failing/op-flt-thr.pre b/tests/cases/failing/op-flt-thr.pre new file mode 100644 index 0000000..e5c511c --- /dev/null +++ b/tests/cases/failing/op-flt-thr.pre @@ -0,0 +1,2 @@ +THR(sample_thr){} +FLT(sample_thr) \ No newline at end of file diff --git a/tests/cases/failing/op-gt-mixed-type.pre b/tests/cases/failing/op-gt-mixed-type.pre new file mode 100644 index 0000000..7a38a32 --- /dev/null +++ b/tests/cases/failing/op-gt-mixed-type.pre @@ -0,0 +1 @@ +GT(0d2, 0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/op-gte-mixed-type.pre b/tests/cases/failing/op-gte-mixed-type.pre new file mode 100644 index 0000000..e9bdeb5 --- /dev/null +++ b/tests/cases/failing/op-gte-mixed-type.pre @@ -0,0 +1 @@ +GTE(0d2, 0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/op-int-func.pre b/tests/cases/failing/op-int-func.pre new file mode 100644 index 0000000..2e837a4 --- /dev/null +++ b/tests/cases/failing/op-int-func.pre @@ -0,0 +1,5 @@ +FUNC INT: sample_func(){ + RETURN(0d1) +} + +INT(sample_func) \ No newline at end of file diff --git a/tests/cases/failing/op-int-map.pre b/tests/cases/failing/op-int-map.pre new file mode 100644 index 0000000..afb22cb --- /dev/null +++ b/tests/cases/failing/op-int-map.pre @@ -0,0 +1 @@ +INT(<>) \ No newline at end of file diff --git a/tests/cases/failing/op-int-thr.pre b/tests/cases/failing/op-int-thr.pre new file mode 100644 index 0000000..86966e7 --- /dev/null +++ b/tests/cases/failing/op-int-thr.pre @@ -0,0 +1,2 @@ +THR(sample_thr){} +INT(sample_thr) \ No newline at end of file diff --git a/tests/cases/failing/op-lt-mixed-type.pre b/tests/cases/failing/op-lt-mixed-type.pre new file mode 100644 index 0000000..948a79a --- /dev/null +++ b/tests/cases/failing/op-lt-mixed-type.pre @@ -0,0 +1 @@ +LT(0d1.0, 0d2) \ No newline at end of file diff --git a/tests/cases/failing/op-lte-mixed-type.pre b/tests/cases/failing/op-lte-mixed-type.pre new file mode 100644 index 0000000..2b6e9a8 --- /dev/null +++ b/tests/cases/failing/op-lte-mixed-type.pre @@ -0,0 +1 @@ +LTE(0d1.0, 0d2) \ No newline at end of file diff --git a/tests/cases/failing/op-str-func.pre b/tests/cases/failing/op-str-func.pre new file mode 100644 index 0000000..3e53845 --- /dev/null +++ b/tests/cases/failing/op-str-func.pre @@ -0,0 +1,5 @@ +FUNC BOOL: str_func(){ + RETURN(TRUE) +} + +STR(str_func) \ No newline at end of file diff --git a/tests/cases/failing/op-str-lambda.pre b/tests/cases/failing/op-str-lambda.pre new file mode 100644 index 0000000..14eae53 --- /dev/null +++ b/tests/cases/failing/op-str-lambda.pre @@ -0,0 +1 @@ +STR(LAMBDA BOOL: (){ RETURN(TRUE) }) \ No newline at end of file diff --git a/tests/cases/failing/op-str-map.pre b/tests/cases/failing/op-str-map.pre new file mode 100644 index 0000000..c2ebcfb --- /dev/null +++ b/tests/cases/failing/op-str-map.pre @@ -0,0 +1 @@ +STR(<>) \ No newline at end of file diff --git a/tests/cases/failing/op-str-thr.pre b/tests/cases/failing/op-str-thr.pre new file mode 100644 index 0000000..4a9c1d9 --- /dev/null +++ b/tests/cases/failing/op-str-thr.pre @@ -0,0 +1,2 @@ +THR(str_thr){} +STR(str_thr) \ No newline at end of file diff --git a/tests/cases/failing/op-str-tns.pre b/tests/cases/failing/op-str-tns.pre new file mode 100644 index 0000000..4caf8ff --- /dev/null +++ b/tests/cases/failing/op-str-tns.pre @@ -0,0 +1 @@ +STR([TRUE]) \ No newline at end of file diff --git a/tests/cases/failing/op-tns-bad-shape-type.pre b/tests/cases/failing/op-tns-bad-shape-type.pre new file mode 100644 index 0000000..7d9a5ab --- /dev/null +++ b/tests/cases/failing/op-tns-bad-shape-type.pre @@ -0,0 +1 @@ +TNS([[0d1]], 0d1) \ No newline at end of file diff --git a/tests/cases/failing/op-tns-bad-shape.pre b/tests/cases/failing/op-tns-bad-shape.pre new file mode 100644 index 0000000..c7be0a6 --- /dev/null +++ b/tests/cases/failing/op-tns-bad-shape.pre @@ -0,0 +1 @@ +TNS([0d2, 0d0], 0d1) \ No newline at end of file diff --git a/tests/cases/failing/op-tns-bool.pre b/tests/cases/failing/op-tns-bool.pre new file mode 100644 index 0000000..f5bc6eb --- /dev/null +++ b/tests/cases/failing/op-tns-bool.pre @@ -0,0 +1,2 @@ +BOOL: sample_bool = TRUE +TNS(sample_bool) \ No newline at end of file diff --git a/tests/cases/failing/op-tns-flt.pre b/tests/cases/failing/op-tns-flt.pre new file mode 100644 index 0000000..d7752a4 --- /dev/null +++ b/tests/cases/failing/op-tns-flt.pre @@ -0,0 +1 @@ +TNS(0d1.5) \ No newline at end of file diff --git a/tests/cases/failing/op-tns-func.pre b/tests/cases/failing/op-tns-func.pre new file mode 100644 index 0000000..d54aff0 --- /dev/null +++ b/tests/cases/failing/op-tns-func.pre @@ -0,0 +1,5 @@ +FUNC INT: sample_func(){ + RETURN(0d1) +} + +TNS(sample_func) \ No newline at end of file diff --git a/tests/cases/failing/op-tns-int.pre b/tests/cases/failing/op-tns-int.pre new file mode 100644 index 0000000..c8714a4 --- /dev/null +++ b/tests/cases/failing/op-tns-int.pre @@ -0,0 +1 @@ +TNS(0d1) \ No newline at end of file diff --git a/tests/cases/failing/op-tns-map.pre b/tests/cases/failing/op-tns-map.pre new file mode 100644 index 0000000..5c7b8bd --- /dev/null +++ b/tests/cases/failing/op-tns-map.pre @@ -0,0 +1,2 @@ +MAP: fill_map = <"n" = 0d1> +TNS(fill_map) \ No newline at end of file diff --git a/tests/cases/failing/op-tns-thr.pre b/tests/cases/failing/op-tns-thr.pre new file mode 100644 index 0000000..787eb36 --- /dev/null +++ b/tests/cases/failing/op-tns-thr.pre @@ -0,0 +1,2 @@ +THR(sample_thr){} +TNS(sample_thr) \ No newline at end of file diff --git a/tests/cases/failing/open-curly-bracket-in-ident.pre b/tests/cases/failing/open-curly-bracket-in-ident.pre new file mode 100644 index 0000000..00d131b --- /dev/null +++ b/tests/cases/failing/open-curly-bracket-in-ident.pre @@ -0,0 +1 @@ +BOOL: x{ = TRUE diff --git a/tests/cases/failing/open-parentheses-in-ident.pre b/tests/cases/failing/open-parentheses-in-ident.pre new file mode 100644 index 0000000..9a59a76 --- /dev/null +++ b/tests/cases/failing/open-parentheses-in-ident.pre @@ -0,0 +1 @@ +BOOL: x( = TRUE diff --git a/tests/cases/failing/open-square-bracket-in-ident.pre b/tests/cases/failing/open-square-bracket-in-ident.pre new file mode 100644 index 0000000..80f6d17 --- /dev/null +++ b/tests/cases/failing/open-square-bracket-in-ident.pre @@ -0,0 +1 @@ +BOOL: x[ = TRUE diff --git a/tests/cases/failing/or-arity-three.pre b/tests/cases/failing/or-arity-three.pre new file mode 100644 index 0000000..4b8d98a --- /dev/null +++ b/tests/cases/failing/or-arity-three.pre @@ -0,0 +1 @@ +OR(TRUE, TRUE, TRUE) diff --git a/tests/cases/failing/or-arity-zero.pre b/tests/cases/failing/or-arity-zero.pre new file mode 100644 index 0000000..277454f --- /dev/null +++ b/tests/cases/failing/or-arity-zero.pre @@ -0,0 +1 @@ +OR() \ No newline at end of file diff --git a/tests/cases/failing/parfor-no-block.pre b/tests/cases/failing/parfor-no-block.pre new file mode 100644 index 0000000..cd5fa30 --- /dev/null +++ b/tests/cases/failing/parfor-no-block.pre @@ -0,0 +1 @@ +PARFOR(i, 0d1) diff --git a/tests/cases/failing/parfor-no-target.pre b/tests/cases/failing/parfor-no-target.pre new file mode 100644 index 0000000..0576389 --- /dev/null +++ b/tests/cases/failing/parfor-no-target.pre @@ -0,0 +1 @@ +PARFOR(i, ){} diff --git a/tests/cases/failing/parfor-target-not-int.pre b/tests/cases/failing/parfor-target-not-int.pre new file mode 100644 index 0000000..1f55ace --- /dev/null +++ b/tests/cases/failing/parfor-target-not-int.pre @@ -0,0 +1 @@ +PARFOR(i, TRUE){} diff --git a/tests/cases/failing/pow-mixed-types.pre b/tests/cases/failing/pow-mixed-types.pre new file mode 100644 index 0000000..b3d705e --- /dev/null +++ b/tests/cases/failing/pow-mixed-types.pre @@ -0,0 +1 @@ +POW(0d2, 0d3.0) \ No newline at end of file diff --git a/tests/cases/failing/prod-mixed.pre b/tests/cases/failing/prod-mixed.pre new file mode 100644 index 0000000..b358ea8 --- /dev/null +++ b/tests/cases/failing/prod-mixed.pre @@ -0,0 +1 @@ +PROD(0d2, 0d2.0) diff --git a/tests/cases/failing/return-outside-function.pre b/tests/cases/failing/return-outside-function.pre new file mode 100644 index 0000000..3090992 --- /dev/null +++ b/tests/cases/failing/return-outside-function.pre @@ -0,0 +1 @@ +RETURN(0d1) \ No newline at end of file diff --git a/tests/cases/failing/root-arity-one.pre b/tests/cases/failing/root-arity-one.pre new file mode 100644 index 0000000..b593e99 --- /dev/null +++ b/tests/cases/failing/root-arity-one.pre @@ -0,0 +1 @@ +ROOT(0d16) diff --git a/tests/cases/failing/root-arity-three.pre b/tests/cases/failing/root-arity-three.pre new file mode 100644 index 0000000..e8844c5 --- /dev/null +++ b/tests/cases/failing/root-arity-three.pre @@ -0,0 +1 @@ +ROOT(0d16, 0d2, 0d2) diff --git a/tests/cases/failing/root-flt-negative-even.pre b/tests/cases/failing/root-flt-negative-even.pre new file mode 100644 index 0000000..1a60bd1 --- /dev/null +++ b/tests/cases/failing/root-flt-negative-even.pre @@ -0,0 +1 @@ +ROOT(-0d16.0, 0d2.0) diff --git a/tests/cases/failing/root-flt-zero-exponent.pre b/tests/cases/failing/root-flt-zero-exponent.pre new file mode 100644 index 0000000..f050682 --- /dev/null +++ b/tests/cases/failing/root-flt-zero-exponent.pre @@ -0,0 +1 @@ +ROOT(0d16.0, 0d0.0) diff --git a/tests/cases/failing/root-int-invalid-negative.pre b/tests/cases/failing/root-int-invalid-negative.pre new file mode 100644 index 0000000..714c91b --- /dev/null +++ b/tests/cases/failing/root-int-invalid-negative.pre @@ -0,0 +1 @@ +ROOT(0d2, -0d1) diff --git a/tests/cases/failing/root-int-zero-exponent.pre b/tests/cases/failing/root-int-zero-exponent.pre new file mode 100644 index 0000000..f09e247 --- /dev/null +++ b/tests/cases/failing/root-int-zero-exponent.pre @@ -0,0 +1 @@ +ROOT(0d16, 0d0) diff --git a/tests/cases/failing/root-type-bool.pre b/tests/cases/failing/root-type-bool.pre new file mode 100644 index 0000000..63bbb7b --- /dev/null +++ b/tests/cases/failing/root-type-bool.pre @@ -0,0 +1 @@ +ROOT(TRUE, FALSE) diff --git a/tests/cases/failing/root-type-str.pre b/tests/cases/failing/root-type-str.pre new file mode 100644 index 0000000..971f298 --- /dev/null +++ b/tests/cases/failing/root-type-str.pre @@ -0,0 +1 @@ +ROOT("16", "2") diff --git a/tests/cases/failing/round-invalid-mode.pre b/tests/cases/failing/round-invalid-mode.pre new file mode 100644 index 0000000..dc10279 --- /dev/null +++ b/tests/cases/failing/round-invalid-mode.pre @@ -0,0 +1 @@ +ROUND(0b0.101, mode = "nearest", ndigits = 0b10) \ No newline at end of file diff --git a/tests/cases/failing/round-ndigits-not-int.pre b/tests/cases/failing/round-ndigits-not-int.pre new file mode 100644 index 0000000..bf17019 --- /dev/null +++ b/tests/cases/failing/round-ndigits-not-int.pre @@ -0,0 +1 @@ +ROUND(0b0.101, mode = "floor", ndigits = "1") \ No newline at end of file diff --git a/tests/cases/failing/shl-radix.pre b/tests/cases/failing/shl-radix.pre new file mode 100644 index 0000000..f26f271 --- /dev/null +++ b/tests/cases/failing/shl-radix.pre @@ -0,0 +1 @@ +SHL(0b1, 0d1) \ No newline at end of file diff --git a/tests/cases/failing/shr-radix.pre b/tests/cases/failing/shr-radix.pre new file mode 100644 index 0000000..eefcf9e --- /dev/null +++ b/tests/cases/failing/shr-radix.pre @@ -0,0 +1 @@ +SHR(0x1, 0b1) \ No newline at end of file diff --git a/tests/cases/failing/slen-non-str.pre b/tests/cases/failing/slen-non-str.pre new file mode 100644 index 0000000..9c3ca7e --- /dev/null +++ b/tests/cases/failing/slen-non-str.pre @@ -0,0 +1 @@ +SLEN(0d1) \ No newline at end of file diff --git a/tests/cases/failing/slice-non-int-end.pre b/tests/cases/failing/slice-non-int-end.pre new file mode 100644 index 0000000..80067c0 --- /dev/null +++ b/tests/cases/failing/slice-non-int-end.pre @@ -0,0 +1 @@ +SLICE("abc", 0d1, "2") diff --git a/tests/cases/failing/slice-non-int-start.pre b/tests/cases/failing/slice-non-int-start.pre new file mode 100644 index 0000000..9f4abf9 --- /dev/null +++ b/tests/cases/failing/slice-non-int-start.pre @@ -0,0 +1 @@ +SLICE("abc", 0d1.5, 0d2) diff --git a/tests/cases/failing/slice-non-value.pre b/tests/cases/failing/slice-non-value.pre new file mode 100644 index 0000000..109b953 --- /dev/null +++ b/tests/cases/failing/slice-non-value.pre @@ -0,0 +1 @@ +SLICE(0d0.5, 0d1, 0d1) diff --git a/tests/cases/failing/statement-with-caret.pre b/tests/cases/failing/statement-with-caret.pre new file mode 100644 index 0000000..a286491 --- /dev/null +++ b/tests/cases/failing/statement-with-caret.pre @@ -0,0 +1 @@ +BOOL: x ^ = TRUE diff --git a/tests/cases/failing/statement-with-delimiter.pre b/tests/cases/failing/statement-with-delimiter.pre new file mode 100644 index 0000000..60df22a --- /dev/null +++ b/tests/cases/failing/statement-with-delimiter.pre @@ -0,0 +1,2 @@ +BOOL: +x = TRUE diff --git a/tests/cases/failing/statement-with-semicolon.pre b/tests/cases/failing/statement-with-semicolon.pre new file mode 100644 index 0000000..2046fef --- /dev/null +++ b/tests/cases/failing/statement-with-semicolon.pre @@ -0,0 +1 @@ +BOOL: ; x = TRUE diff --git a/tests/cases/failing/statements-no-delimiter.pre b/tests/cases/failing/statements-no-delimiter.pre new file mode 100644 index 0000000..5f88e86 --- /dev/null +++ b/tests/cases/failing/statements-no-delimiter.pre @@ -0,0 +1 @@ +BOOL: x = TRUE BOOL: y = FALSE diff --git a/tests/cases/failing/string-invalid-U-escape-uppercase.pre b/tests/cases/failing/string-invalid-U-escape-uppercase.pre new file mode 100644 index 0000000..5346648 --- /dev/null +++ b/tests/cases/failing/string-invalid-U-escape-uppercase.pre @@ -0,0 +1 @@ +STR: bad = "\U0000G000" diff --git a/tests/cases/failing/string-invalid-U-short-escape.pre b/tests/cases/failing/string-invalid-U-short-escape.pre new file mode 100644 index 0000000..ccd6271 --- /dev/null +++ b/tests/cases/failing/string-invalid-U-short-escape.pre @@ -0,0 +1 @@ +STR: bad = "\U0000123" \ No newline at end of file diff --git a/tests/cases/failing/string-invalid-escape.pre b/tests/cases/failing/string-invalid-escape.pre new file mode 100644 index 0000000..556d5b8 --- /dev/null +++ b/tests/cases/failing/string-invalid-escape.pre @@ -0,0 +1 @@ +STR: bad = "oops\q" diff --git a/tests/cases/failing/string-invalid-u-escape.pre b/tests/cases/failing/string-invalid-u-escape.pre new file mode 100644 index 0000000..a94408d --- /dev/null +++ b/tests/cases/failing/string-invalid-u-escape.pre @@ -0,0 +1 @@ +STR: bad = "\u12G4" diff --git a/tests/cases/failing/string-invalid-u-short.pre b/tests/cases/failing/string-invalid-u-short.pre new file mode 100644 index 0000000..fa1ec0c --- /dev/null +++ b/tests/cases/failing/string-invalid-u-short.pre @@ -0,0 +1 @@ +STR: bad = "\u123" \ No newline at end of file diff --git a/tests/cases/failing/string-invalid-x-escape.pre b/tests/cases/failing/string-invalid-x-escape.pre new file mode 100644 index 0000000..6b6e2c4 --- /dev/null +++ b/tests/cases/failing/string-invalid-x-escape.pre @@ -0,0 +1 @@ +STR: bad = "\xGG" diff --git a/tests/cases/failing/string-invalid-x-short.pre b/tests/cases/failing/string-invalid-x-short.pre new file mode 100644 index 0000000..fb9a58e --- /dev/null +++ b/tests/cases/failing/string-invalid-x-short.pre @@ -0,0 +1 @@ +STR: bad = "\x4" \ No newline at end of file diff --git a/tests/cases/failing/string-mismatched-quote.pre b/tests/cases/failing/string-mismatched-quote.pre new file mode 100644 index 0000000..8f3dce8 --- /dev/null +++ b/tests/cases/failing/string-mismatched-quote.pre @@ -0,0 +1 @@ +STR: bad = "oops' diff --git a/tests/cases/failing/string-unterminated-double.pre b/tests/cases/failing/string-unterminated-double.pre new file mode 100644 index 0000000..9353a68 --- /dev/null +++ b/tests/cases/failing/string-unterminated-double.pre @@ -0,0 +1 @@ +STR: bad = "oops diff --git a/tests/cases/failing/string-unterminated-single.pre b/tests/cases/failing/string-unterminated-single.pre new file mode 100644 index 0000000..f83aac6 --- /dev/null +++ b/tests/cases/failing/string-unterminated-single.pre @@ -0,0 +1 @@ +STR: bad = 'oops diff --git a/tests/cases/failing/sum-mixed.pre b/tests/cases/failing/sum-mixed.pre new file mode 100644 index 0000000..f777876 --- /dev/null +++ b/tests/cases/failing/sum-mixed.pre @@ -0,0 +1 @@ +SUM(0d1, 0d2.0) diff --git a/tests/cases/failing/sum-str.pre b/tests/cases/failing/sum-str.pre new file mode 100644 index 0000000..441d0cd --- /dev/null +++ b/tests/cases/failing/sum-str.pre @@ -0,0 +1 @@ +SUM('1', 0d1) diff --git a/tests/cases/failing/tflt-bad-str.pre b/tests/cases/failing/tflt-bad-str.pre new file mode 100644 index 0000000..774e216 --- /dev/null +++ b/tests/cases/failing/tflt-bad-str.pre @@ -0,0 +1 @@ +TFLT([0d1, "prefix"]) \ No newline at end of file diff --git a/tests/cases/failing/tflt-map.pre b/tests/cases/failing/tflt-map.pre new file mode 100644 index 0000000..7c6228f --- /dev/null +++ b/tests/cases/failing/tflt-map.pre @@ -0,0 +1,2 @@ +MAP: bad = <> +TFLT([0d1, bad]) \ No newline at end of file diff --git a/tests/cases/failing/tilde-in-ident.pre b/tests/cases/failing/tilde-in-ident.pre new file mode 100644 index 0000000..91b31d9 --- /dev/null +++ b/tests/cases/failing/tilde-in-ident.pre @@ -0,0 +1 @@ +BOOL: x~ = TRUE diff --git a/tests/cases/failing/tint-map.pre b/tests/cases/failing/tint-map.pre new file mode 100644 index 0000000..0e5116f --- /dev/null +++ b/tests/cases/failing/tint-map.pre @@ -0,0 +1,2 @@ +MAP: bad = <> +TINT([0d1, bad]) \ No newline at end of file diff --git a/tests/cases/failing/tlen-too-large.pre b/tests/cases/failing/tlen-too-large.pre new file mode 100644 index 0000000..54a7860 --- /dev/null +++ b/tests/cases/failing/tlen-too-large.pre @@ -0,0 +1,3 @@ +TNS: tensor = [[0d1, 0d2], [0d3, 0d4]] + +TLEN(tensor, 0d3) \ No newline at end of file diff --git a/tests/cases/failing/tlen-zero-dim.pre b/tests/cases/failing/tlen-zero-dim.pre new file mode 100644 index 0000000..09be85b --- /dev/null +++ b/tests/cases/failing/tlen-zero-dim.pre @@ -0,0 +1,3 @@ +TNS: tensor = [[0d1, 0d2], [0d3, 0d4]] + +TLEN(tensor, 0d0) \ No newline at end of file diff --git a/tests/cases/failing/tns-empty-index.pre b/tests/cases/failing/tns-empty-index.pre new file mode 100644 index 0000000..6d44519 --- /dev/null +++ b/tests/cases/failing/tns-empty-index.pre @@ -0,0 +1,2 @@ +TNS: vec = [0d1, 0d2] +vec[] diff --git a/tests/cases/failing/tns-empty.pre b/tests/cases/failing/tns-empty.pre new file mode 100644 index 0000000..f82de9a --- /dev/null +++ b/tests/cases/failing/tns-empty.pre @@ -0,0 +1 @@ +TNS: empty = [] diff --git a/tests/cases/failing/tns-mixed-nested-value.pre b/tests/cases/failing/tns-mixed-nested-value.pre new file mode 100644 index 0000000..8eaea8a --- /dev/null +++ b/tests/cases/failing/tns-mixed-nested-value.pre @@ -0,0 +1,2 @@ +TNS: row = [0d1, 0d2] +TNS: bad = [[0d1, 0d2], row] diff --git a/tests/cases/failing/tns-nested-empty.pre b/tests/cases/failing/tns-nested-empty.pre new file mode 100644 index 0000000..f5eeb93 --- /dev/null +++ b/tests/cases/failing/tns-nested-empty.pre @@ -0,0 +1 @@ +TNS: bad = [[]] diff --git a/tests/cases/failing/tns-ragged.pre b/tests/cases/failing/tns-ragged.pre new file mode 100644 index 0000000..4875d45 --- /dev/null +++ b/tests/cases/failing/tns-ragged.pre @@ -0,0 +1 @@ +TNS: bad = [[0d1], [0d2, 0d3]] diff --git a/tests/cases/failing/try-catch-err-pseudotype.pre b/tests/cases/failing/try-catch-err-pseudotype.pre new file mode 100644 index 0000000..370535b --- /dev/null +++ b/tests/cases/failing/try-catch-err-pseudotype.pre @@ -0,0 +1,5 @@ +TRY{ + ASSERT(FALSE) +} CATCH(SYMBOL: err) { + ASSERT(EXIST(err)) +} diff --git a/tests/cases/failing/try-catch-seperated.pre b/tests/cases/failing/try-catch-seperated.pre new file mode 100644 index 0000000..c21cfc4 --- /dev/null +++ b/tests/cases/failing/try-catch-seperated.pre @@ -0,0 +1,6 @@ +TRY{ + ASSERT(FALSE) +} +CATCH { + ASSERT(TRUE) +} diff --git a/tests/cases/failing/try-no-catch.pre b/tests/cases/failing/try-no-catch.pre new file mode 100644 index 0000000..8d85311 --- /dev/null +++ b/tests/cases/failing/try-no-catch.pre @@ -0,0 +1 @@ +TRY{} diff --git a/tests/cases/failing/tstr-map.pre b/tests/cases/failing/tstr-map.pre new file mode 100644 index 0000000..f4cfc5e --- /dev/null +++ b/tests/cases/failing/tstr-map.pre @@ -0,0 +1,2 @@ +MAP: bad = <> +TSTR([TRUE, bad]) \ No newline at end of file diff --git a/tests/cases/failing/unexpected-block.pre b/tests/cases/failing/unexpected-block.pre new file mode 100644 index 0000000..b457ee6 --- /dev/null +++ b/tests/cases/failing/unexpected-block.pre @@ -0,0 +1 @@ +{ BOOL: x = TRUE } diff --git a/tests/cases/failing/upper-arity-two.pre b/tests/cases/failing/upper-arity-two.pre new file mode 100644 index 0000000..29bc9a4 --- /dev/null +++ b/tests/cases/failing/upper-arity-two.pre @@ -0,0 +1 @@ +UPPER("a", "b") \ No newline at end of file diff --git a/tests/cases/failing/upper-arity-zero.pre b/tests/cases/failing/upper-arity-zero.pre new file mode 100644 index 0000000..6358a38 --- /dev/null +++ b/tests/cases/failing/upper-arity-zero.pre @@ -0,0 +1 @@ +UPPER() \ No newline at end of file diff --git a/tests/cases/failing/upper-non-str.pre b/tests/cases/failing/upper-non-str.pre new file mode 100644 index 0000000..7be0e2a --- /dev/null +++ b/tests/cases/failing/upper-non-str.pre @@ -0,0 +1 @@ +UPPER(0d1) \ No newline at end of file diff --git a/tests/cases/failing/while-no-block.pre b/tests/cases/failing/while-no-block.pre new file mode 100644 index 0000000..1e75140 --- /dev/null +++ b/tests/cases/failing/while-no-block.pre @@ -0,0 +1 @@ +WHILE(TRUE) diff --git a/tests/cases/failing/while-no-condition.pre b/tests/cases/failing/while-no-condition.pre new file mode 100644 index 0000000..17bac6c --- /dev/null +++ b/tests/cases/failing/while-no-condition.pre @@ -0,0 +1 @@ +WHILE(){} diff --git a/tests/cases/failing/xor-arity-three.pre b/tests/cases/failing/xor-arity-three.pre new file mode 100644 index 0000000..e831989 --- /dev/null +++ b/tests/cases/failing/xor-arity-three.pre @@ -0,0 +1 @@ +XOR(TRUE, TRUE, TRUE) diff --git a/tests/cases/failing/xor-arity-zero.pre b/tests/cases/failing/xor-arity-zero.pre new file mode 100644 index 0000000..317248b --- /dev/null +++ b/tests/cases/failing/xor-arity-zero.pre @@ -0,0 +1 @@ +XOR() \ No newline at end of file diff --git a/tests/cases/failing/zero-starts-ident.pre b/tests/cases/failing/zero-starts-ident.pre new file mode 100644 index 0000000..44e200b --- /dev/null +++ b/tests/cases/failing/zero-starts-ident.pre @@ -0,0 +1 @@ +BOOL: 0x = TRUE diff --git a/tests/cases/flip-int-basic.pre b/tests/cases/flip-int-basic.pre new file mode 100644 index 0000000..e5afae4 --- /dev/null +++ b/tests/cases/flip-int-basic.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(TYPE(FLIP(0b1101)), "INT")) +ASSERT(EQ(FLIP(0b1101), 0b1011)) +ASSERT(EQ(FLIP(-0b1101), -0b1011)) diff --git a/tests/cases/flip-int-trailing-zero.pre b/tests/cases/flip-int-trailing-zero.pre new file mode 100644 index 0000000..1aa9671 --- /dev/null +++ b/tests/cases/flip-int-trailing-zero.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(FLIP(0b1000), 0b1)) +ASSERT(EQ(FLIP(-0b1000), -0b1)) +ASSERT(EQ(FLIP(0b0), 0b0)) diff --git a/tests/cases/flip-str.pre b/tests/cases/flip-str.pre new file mode 100644 index 0000000..3381100 --- /dev/null +++ b/tests/cases/flip-str.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(TYPE(FLIP("prefix")), "STR")) +ASSERT(EQ(FLIP("prefix"), "xiferp")) +ASSERT(EQ(FLIP(""), "")) diff --git a/tests/cases/passing/abs-flt.pre b/tests/cases/passing/abs-flt.pre new file mode 100644 index 0000000..8e4e94f --- /dev/null +++ b/tests/cases/passing/abs-flt.pre @@ -0,0 +1,10 @@ +FLT: pos_oct = 0o1.4 +FLT: neg_oct = -0o1.4 +FLT: hex_val = 0x1.8 +FLT: zero = 0o0.0 +FLT: neg_zero = -0o0.0 + +ASSERT(EQ(ABS(pos_oct), pos_oct)) +ASSERT(EQ(ABS(neg_oct), 0o1.4)) +ASSERT(EQ(ABS(neg_zero), 0o0.0)) +ASSERT(EQ(BASE(ABS(hex_val)), BASE(hex_val))) diff --git a/tests/cases/passing/abs-int.pre b/tests/cases/passing/abs-int.pre new file mode 100644 index 0000000..fb5722d --- /dev/null +++ b/tests/cases/passing/abs-int.pre @@ -0,0 +1,13 @@ +INT: pos_dec = 0d5 +INT: neg_dec = -0d5 +INT: neg_hex = -0xA +INT: hex_val = 0xA +INT: bin_neg = -0b1010 +INT: zero = 0d0 + +ASSERT(EQ(ABS(pos_dec), pos_dec)) +ASSERT(EQ(ABS(neg_dec), 0d5)) +ASSERT(EQ(ABS(neg_hex), 0xA)) +ASSERT(EQ(BASE(ABS(neg_hex)), BASE(hex_val))) +ASSERT(EQ(ABS(bin_neg), 0b1010)) +ASSERT(EQ(ABS(zero), 0d0)) diff --git a/tests/cases/passing/all.pre b/tests/cases/passing/all.pre new file mode 100644 index 0000000..4e4d3fd --- /dev/null +++ b/tests/cases/passing/all.pre @@ -0,0 +1,4 @@ +ASSERT(ALL(TRUE, TRUE)) +ASSERT(NOT(ALL(TRUE, FALSE))) +ASSERT(ALL(TRUE, TRUE, TRUE)) +ASSERT(NOT(ALL(TRUE, TRUE, FALSE))) diff --git a/tests/cases/passing/and.pre b/tests/cases/passing/and.pre new file mode 100644 index 0000000..8ff5a9f --- /dev/null +++ b/tests/cases/passing/and.pre @@ -0,0 +1,2 @@ +ASSERT(AND(TRUE, TRUE)) +ASSERT(NOT(AND(TRUE, FALSE))) diff --git a/tests/cases/passing/any.pre b/tests/cases/passing/any.pre new file mode 100644 index 0000000..45a03e5 --- /dev/null +++ b/tests/cases/passing/any.pre @@ -0,0 +1,4 @@ +ASSERT(NOT(ANY(FALSE, FALSE))) +ASSERT(ANY(FALSE, TRUE)) +ASSERT(ANY(FALSE, FALSE, TRUE)) +ASSERT(NOT(ANY(FALSE, FALSE, FALSE))) diff --git a/tests/cases/passing/assert.pre b/tests/cases/passing/assert.pre new file mode 100644 index 0000000..faf299e --- /dev/null +++ b/tests/cases/passing/assert.pre @@ -0,0 +1 @@ +ASSERT(TRUE) diff --git a/tests/cases/passing/assign.pre b/tests/cases/passing/assign.pre new file mode 100644 index 0000000..a4974ee --- /dev/null +++ b/tests/cases/passing/assign.pre @@ -0,0 +1,2 @@ +ASSIGN(BOOL: x, TRUE) +ASSERT(EXIST(x)) diff --git a/tests/cases/passing/band.pre b/tests/cases/passing/band.pre new file mode 100644 index 0000000..856e172 --- /dev/null +++ b/tests/cases/passing/band.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(BAND(0b1101, 0b1011), 0b1001)) +ASSERT(EQ(BASE(BAND(0b1101, 0b1011)), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/base-flt.pre b/tests/cases/passing/base-flt.pre new file mode 100644 index 0000000..ad16ecb --- /dev/null +++ b/tests/cases/passing/base-flt.pre @@ -0,0 +1,7 @@ +FLT: flt_decimal = 0d1.5 +FLT: flt_binary = 0b1.1 + +ASSERT(EQ(BASE(flt_decimal), 0d10)) +ASSERT(EQ(BASE(flt_binary), 0d2)) +ASSERT(EQ(CONVERT(flt_binary, BASE(flt_decimal)), flt_decimal)) +ASSERT(EQ(BASE(CONVERT(flt_decimal, 0d64)), 0d64)) diff --git a/tests/cases/passing/base-int.pre b/tests/cases/passing/base-int.pre new file mode 100644 index 0000000..87ea2e5 --- /dev/null +++ b/tests/cases/passing/base-int.pre @@ -0,0 +1,7 @@ +INT: int_binary = 0b101010 +INT: int_hex = 0x2A + +ASSERT(EQ(BASE(int_binary), 0d2)) +ASSERT(EQ(BASE(int_hex), 0d16)) +ASSERT(EQ(CONVERT(int_binary, BASE(int_hex)), int_hex)) +ASSERT(EQ(BASE(CONVERT(int_hex, 0d64)), 0d64)) diff --git a/tests/cases/passing/bnot.pre b/tests/cases/passing/bnot.pre new file mode 100644 index 0000000..dafcb98 --- /dev/null +++ b/tests/cases/passing/bnot.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(BAND(0b1010, BNOT(0b1010)), 0b0)) +ASSERT(EQ(BASE(BNOT(0b1010)), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/bool.pre b/tests/cases/passing/bool.pre new file mode 100644 index 0000000..9e3d05d --- /dev/null +++ b/tests/cases/passing/bool.pre @@ -0,0 +1,5 @@ +BOOL: truthy = TRUE +BOOL: falsy = FALSE + +ASSERT(truthy) +ASSERT(NOT(falsy)) \ No newline at end of file diff --git a/tests/cases/passing/bor.pre b/tests/cases/passing/bor.pre new file mode 100644 index 0000000..838070a --- /dev/null +++ b/tests/cases/passing/bor.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(BOR(0b1100, 0b0011), 0b1111)) +ASSERT(EQ(BASE(BOR(0b1100, 0b0011)), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/break-nested.pre b/tests/cases/passing/break-nested.pre new file mode 100644 index 0000000..fb1e630 --- /dev/null +++ b/tests/cases/passing/break-nested.pre @@ -0,0 +1,15 @@ +INT: outer = 0d0 +INT: inner = 0d0 +FOR(i, 0d3){ + ADD(@outer, 0d1) + FOR(j, 0d3){ + ADD(@inner, 0d1) + BREAK(0d2) + ASSERT(FALSE) + } + ASSERT(FALSE) +} +ASSERT(EQ(outer, 0d1)) +ASSERT(EQ(inner, 0d1)) +ASSERT(NOT(EXIST(i))) +ASSERT(NOT(EXIST(j))) diff --git a/tests/cases/passing/break.pre b/tests/cases/passing/break.pre new file mode 100644 index 0000000..269688e --- /dev/null +++ b/tests/cases/passing/break.pre @@ -0,0 +1,7 @@ +INT: c = 0d0 +WHILE(TRUE){ + ADD(@c, 0d1) + BREAK(0d1) + ASSERT(FALSE) +} +ASSERT(EQ(c, 0d1)) diff --git a/tests/cases/passing/bxor.pre b/tests/cases/passing/bxor.pre new file mode 100644 index 0000000..1c8b928 --- /dev/null +++ b/tests/cases/passing/bxor.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(BXOR(0b1100, 0b1010), 0b0110)) +ASSERT(EQ(BASE(BXOR(0b1100, 0b1010)), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/bytes.pre b/tests/cases/passing/bytes.pre new file mode 100644 index 0000000..76b8f4a --- /dev/null +++ b/tests/cases/passing/bytes.pre @@ -0,0 +1,18 @@ +ASSERT(EQ(TYPE(BYTES(0d0)), "TNS")) +ASSERT(EQ(BYTES(0d0), [0d0])) + +! Default endian is "big" +ASSERT(EQ(BYTES(0x1234), BYTES(0x1234, endian = "big"))) + +! Least-significant-byte placement checks (robust regardless of leading zero bytes) +ASSERT(EQ(MOD(0x123456, 0d256), BYTES(0x123456, endian = "big")[-0d1])) +ASSERT(EQ(MOD(0x123456, 0d256), BYTES(0x123456, endian = "little")[0d1])) + +! All elements must be bytes (0..0xFF) +ASSERT(GTE(MIN(BYTES(0x123456, endian = "big")), 0d0)) +ASSERT(LTE(MAX(BYTES(0x123456, endian = "big")), 0d255)) +ASSERT(GTE(MIN(BYTES(0x123456, endian = "little")), 0d0)) +ASSERT(LTE(MAX(BYTES(0x123456, endian = "little")), 0d255)) + +! Elements must be INT +ASSERT(EQ(TYPE(BYTES(0x1234)[0d1]), "INT")) diff --git a/tests/cases/passing/caret-before-comment.pre b/tests/cases/passing/caret-before-comment.pre new file mode 100644 index 0000000..de5a2cc --- /dev/null +++ b/tests/cases/passing/caret-before-comment.pre @@ -0,0 +1,2 @@ +BOOL: ^! comment +x = TRUE diff --git a/tests/cases/passing/cdiv-flt.pre b/tests/cases/passing/cdiv-flt.pre new file mode 100644 index 0000000..16ea14e --- /dev/null +++ b/tests/cases/passing/cdiv-flt.pre @@ -0,0 +1,9 @@ +FLT: left_oct = 0o1.4 +FLT: right_hex = 0x0.8 +FLT: wide_oct = 0o5.0 + +ASSERT(EQ(CDIV(left_oct, right_hex), 0x3.0)) +ASSERT(EQ(BASE(CDIV(left_oct, right_hex)), 0d16)) + +ASSERT(EQ(CDIV(wide_oct, right_hex), 0xA.0)) +ASSERT(EQ(BASE(CDIV(wide_oct, right_hex)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/cdiv-int.pre b/tests/cases/passing/cdiv-int.pre new file mode 100644 index 0000000..2268f77 --- /dev/null +++ b/tests/cases/passing/cdiv-int.pre @@ -0,0 +1,9 @@ +INT: left_bin = 0b111 +INT: right_hex = 0x2 +INT: wide_dec = 0d9 + +ASSERT(EQ(CDIV(left_bin, right_hex), 0x4)) +ASSERT(EQ(BASE(CDIV(left_bin, right_hex)), 0d16)) + +ASSERT(EQ(CDIV(wide_dec, right_hex), 0x5)) +ASSERT(EQ(BASE(CDIV(wide_dec, right_hex)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/clog-int.pre b/tests/cases/passing/clog-int.pre new file mode 100644 index 0000000..9b4d28e --- /dev/null +++ b/tests/cases/passing/clog-int.pre @@ -0,0 +1,4 @@ +ASSERT(EQ(CLOG(0d8), 0d3)) +ASSERT(EQ(CLOG(0d9), 0d4)) +ASSERT(EQ(CLOG(0d1), 0d0)) +ASSERT(EQ(CLOG(0d5), 0d3)) diff --git a/tests/cases/passing/coerce-fdiv-passing.pre b/tests/cases/passing/coerce-fdiv-passing.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/coerce-flt-pass.pre b/tests/cases/passing/coerce-flt-pass.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/coerce-int-pass.pre b/tests/cases/passing/coerce-int-pass.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/comment.pre b/tests/cases/passing/comment.pre new file mode 100644 index 0000000..ba0ce88 --- /dev/null +++ b/tests/cases/passing/comment.pre @@ -0,0 +1 @@ +BOOL: x = TRUE ! foo diff --git a/tests/cases/passing/continue-for.pre b/tests/cases/passing/continue-for.pre new file mode 100644 index 0000000..48b068c --- /dev/null +++ b/tests/cases/passing/continue-for.pre @@ -0,0 +1,8 @@ +INT: total = 0d0 +FOR(i, 0d4){ + IF(EQ(i, 0d2)){ + CONTINUE() + } + ADD(@total, i) +} +ASSERT(EQ(total, 0d8)) diff --git a/tests/cases/passing/continue-while.pre b/tests/cases/passing/continue-while.pre new file mode 100644 index 0000000..606b3f2 --- /dev/null +++ b/tests/cases/passing/continue-while.pre @@ -0,0 +1,11 @@ +INT: c = 0d0 +INT: seen = 0d0 +WHILE(LT(c, 0d5)){ + ADD(@c, 0d1) + IF(LT(c, 0d5)){ + CONTINUE() + } + ADD(@seen, 0d1) +} +ASSERT(EQ(c, 0d5)) +ASSERT(EQ(seen, 0d1)) diff --git a/tests/cases/passing/convert-flt.pre b/tests/cases/passing/convert-flt.pre new file mode 100644 index 0000000..02dfdaa --- /dev/null +++ b/tests/cases/passing/convert-flt.pre @@ -0,0 +1,7 @@ +FLT: flt_value = 0d1.5 + +ASSERT(EQ(CONVERT(flt_value, 0b10), 0b1.1)) +ASSERT(EQ(BASE(CONVERT(flt_value, 0b10)), 0d2)) +ASSERT(EQ(CONVERT(flt_value, 0x10), 0x1.8)) +ASSERT(EQ(BASE(CONVERT(flt_value, 0x10)), 0d16)) +ASSERT(EQ(BASE(CONVERT(flt_value, 0d64)), 0d64)) diff --git a/tests/cases/passing/convert-int.pre b/tests/cases/passing/convert-int.pre new file mode 100644 index 0000000..4edab76 --- /dev/null +++ b/tests/cases/passing/convert-int.pre @@ -0,0 +1,7 @@ +INT: int_value = 0d42 + +ASSERT(EQ(CONVERT(int_value, 0x10), 0x2A)) +ASSERT(EQ(BASE(CONVERT(int_value, 0x10)), 0d16)) +ASSERT(EQ(CONVERT(int_value, 0d2), 0b101010)) +ASSERT(EQ(BASE(CONVERT(int_value, 0d2)), 0d2)) +ASSERT(EQ(BASE(CONVERT(int_value, 0d64)), 0d64)) diff --git a/tests/cases/passing/del-frozen.pre b/tests/cases/passing/del-frozen.pre new file mode 100644 index 0000000..e621034 --- /dev/null +++ b/tests/cases/passing/del-frozen.pre @@ -0,0 +1,27 @@ +BOOL: frozen_symbol = TRUE +ASSERT(NOT(FREEZE(frozen_symbol))) + +BOOL: frozen_delete_failed = FALSE +TRY{ + DEL(frozen_symbol) +} CATCH { + frozen_delete_failed = TRUE +} +ASSERT(frozen_delete_failed) +ASSERT(EXIST(frozen_symbol)) + +ASSERT(NOT(THAW(frozen_symbol))) +ASSERT(NOT(DEL(frozen_symbol))) +ASSERT(NOT(EXIST(frozen_symbol))) + +BOOL: permafrozen_symbol = TRUE +ASSERT(NOT(PERMAFREEZE(permafrozen_symbol))) + +BOOL: permafrozen_delete_failed = FALSE +TRY{ + DEL(permafrozen_symbol) +} CATCH { + permafrozen_delete_failed = TRUE +} +ASSERT(permafrozen_delete_failed) +ASSERT(EXIST(permafrozen_symbol)) diff --git a/tests/cases/passing/del-map.pre b/tests/cases/passing/del-map.pre new file mode 100644 index 0000000..0c5b4aa --- /dev/null +++ b/tests/cases/passing/del-map.pre @@ -0,0 +1,23 @@ +MAP: top = <"keep" = 0d1, "drop" = 0d2> +ASSERT(NOT(DEL(top<"drop">))) +ASSERT(EQ(top, <"keep" = 0d1>)) + +BOOL: top_missing = FALSE +TRY{ + top<"drop"> +} CATCH { + top_missing = TRUE +} +ASSERT(top_missing) + +MAP: nested = <"outer" = <"keep" = 0d1, "drop" = 0d2>> +ASSERT(NOT(DEL(nested<"outer", "drop">))) +ASSERT(EQ(nested, <"outer" = <"keep" = 0d1>>)) + +MAP: missing_intermediate = <"outer" = <"keep" = 0d1>> +ASSERT(NOT(DEL(missing_intermediate<"absent", "drop">))) +ASSERT(EQ(missing_intermediate, <"outer" = <"keep" = 0d1>>)) + +MAP: missing_final = <"outer" = <"keep" = 0d1>> +ASSERT(NOT(DEL(missing_final<"outer", "drop">))) +ASSERT(EQ(missing_final, <"outer" = <"keep" = 0d1>>)) diff --git a/tests/cases/passing/del-symbol.pre b/tests/cases/passing/del-symbol.pre new file mode 100644 index 0000000..d7adbac --- /dev/null +++ b/tests/cases/passing/del-symbol.pre @@ -0,0 +1,18 @@ +BOOL: symbol = TRUE +ASSERT(EXIST(symbol)) +ASSERT(NOT(DEL(symbol))) +ASSERT(NOT(EXIST(symbol))) + +BOOL: deleted_read_failed = FALSE +TRY{ + symbol +} CATCH { + deleted_read_failed = TRUE +} +ASSERT(deleted_read_failed) + +INT: count = 0d1 +ASSERT(NOT(DEL(count))) +count = 0d2 +ASSERT(EQ(count, 0d2)) +ASSERT(EXIST(count)) diff --git a/tests/cases/passing/div-flt.pre b/tests/cases/passing/div-flt.pre new file mode 100644 index 0000000..c6979c2 --- /dev/null +++ b/tests/cases/passing/div-flt.pre @@ -0,0 +1,9 @@ +FLT: left_oct = 0o1.4 +FLT: right_hex = 0x0.8 +FLT: left_oct_one = 0o1.0 + +ASSERT(EQ(DIV(left_oct, right_hex), 0x3.0)) +ASSERT(EQ(BASE(DIV(left_oct, right_hex)), 0d16)) + +ASSERT(EQ(DIV(left_oct_one, right_hex), 0x2.0)) +ASSERT(EQ(BASE(DIV(left_oct_one, right_hex)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/div-int.pre b/tests/cases/passing/div-int.pre new file mode 100644 index 0000000..66cbe08 --- /dev/null +++ b/tests/cases/passing/div-int.pre @@ -0,0 +1,8 @@ +INT: left_dec = 0d2 +INT: wide_hex = 0x10 + +ASSERT(EQ(DIV(0d6, left_dec), 0d3)) +ASSERT(EQ(BASE(DIV(0d6, left_dec)), 0d10)) + +ASSERT(EQ(DIV(wide_hex, left_dec), 0d8)) +ASSERT(EQ(BASE(DIV(wide_hex, left_dec)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/eq-scalars.pre b/tests/cases/passing/eq-scalars.pre new file mode 100644 index 0000000..2f1bb53 --- /dev/null +++ b/tests/cases/passing/eq-scalars.pre @@ -0,0 +1,12 @@ +ASSERT(ISBOOL(EQ(TRUE, TRUE))) +ASSERT(EQ(TRUE, TRUE)) +ASSERT(NOT(EQ(TRUE, FALSE))) + +ASSERT(EQ(0d42, 0d42)) +ASSERT(NOT(EQ(0d42, 0d43))) + +ASSERT(EQ(0d1.5, 0d1.5)) +ASSERT(NOT(EQ(NaN, NaN))) + +ASSERT(EQ("prefix", "prefix")) +ASSERT(NOT(EQ("prefix", "Prefix"))) \ No newline at end of file diff --git a/tests/cases/passing/eq-structured.pre b/tests/cases/passing/eq-structured.pre new file mode 100644 index 0000000..5bead65 --- /dev/null +++ b/tests/cases/passing/eq-structured.pre @@ -0,0 +1,22 @@ +TNS: tensor = [[0d1, 0d2], [0d3, 0d4]] +TNS: tensor_copy = tensor + +MAP: map_value = <"alpha" = 0d1, "beta" = [0d2, 0d3]> +MAP: map_copy = map_value + +FUNC INT: identity(INT: value){ + RETURN(value) +} +FUNC: identity_alias = identity + +THR(worker){} + +ASSERT(ISBOOL(EQ(tensor_copy, tensor))) +ASSERT(EQ(tensor_copy, tensor)) +ASSERT(NOT(EQ(tensor, [[0d1, 0d2], [0d3, 0d5]]))) + +ASSERT(EQ(map_copy, map_value)) +ASSERT(NOT(EQ(map_value, <"alpha" = 0d1, "beta" = [0d2, 0d4]>))) + +ASSERT(EQ(identity_alias, identity)) +ASSERT(EQ(worker, worker)) \ No newline at end of file diff --git a/tests/cases/passing/exist.pre b/tests/cases/passing/exist.pre new file mode 100644 index 0000000..e090ead --- /dev/null +++ b/tests/cases/passing/exist.pre @@ -0,0 +1,25 @@ +BOOL: outer = TRUE +BOOL: declared_only + +FUNC BOOL: outer_visible(){ + RETURN(EXIST(outer)) +} + +FUNC BOOL: inner_visible(){ + BOOL: inner = TRUE + RETURN(EXIST(inner)) +} + +FUNC BOOL: missing_visible(){ + RETURN(EXIST(missing)) +} + +ASSERT(EXIST(outer)) +ASSERT(NOT(EXIST(declared_only))) +ASSERT(outer_visible()) +ASSERT(inner_visible()) +ASSERT(NOT(missing_visible())) + +DEL(outer) +ASSERT(NOT(EXIST(outer))) +ASSERT(NOT(outer_visible())) diff --git a/tests/cases/passing/fadd.pre b/tests/cases/passing/fadd.pre new file mode 100644 index 0000000..98bef31 --- /dev/null +++ b/tests/cases/passing/fadd.pre @@ -0,0 +1,3 @@ +! Passing float arithmetic, checking coercion and correct logic +FLT: result_add = FADD(0d10.5, 0d5.25) +ASSERT(EQ(result_add, 0d15.75)) diff --git a/tests/cases/passing/fdiv.pre b/tests/cases/passing/fdiv.pre new file mode 100644 index 0000000..d517184 --- /dev/null +++ b/tests/cases/passing/fdiv.pre @@ -0,0 +1,8 @@ +! FDIV(0d1.0, 0d0.0) performing IEEE 754 division by zero DOES NOT return an error, it returns INF +INT: a = IADD(0d1, 0d1.0) +FLT: b = FDIV(0d1.0, 0d0.0) +FLT: x = 0d1.0 +FLT: y = 0d0.0 +FLT: result_div_inf = FDIV(x, y) +ASSERT(EQ(result_div_inf, INF)) +FLT: c = FPOW(-0d1.0, 0d0.5) diff --git a/tests/cases/passing/flt-abs.pre b/tests/cases/passing/flt-abs.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-cdiv.pre b/tests/cases/passing/flt-cdiv.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-div.pre b/tests/cases/passing/flt-div.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-gcd.pre b/tests/cases/passing/flt-gcd.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-lcm.pre b/tests/cases/passing/flt-lcm.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-mod.pre b/tests/cases/passing/flt-mod.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-mul.pre b/tests/cases/passing/flt-mul.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-neg.pre b/tests/cases/passing/flt-neg.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-pow.pre b/tests/cases/passing/flt-pow.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-root.pre b/tests/cases/passing/flt-root.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt-sub.pre b/tests/cases/passing/flt-sub.pre new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/passing/flt.pre b/tests/cases/passing/flt.pre new file mode 100644 index 0000000..e36fee7 --- /dev/null +++ b/tests/cases/passing/flt.pre @@ -0,0 +1,14 @@ +FLT: a = 0d1.5 +FLT: b = -0d0.25 +FLT: c = 0b1.1 +FLT: d = 0xA.F +FLT: e = 0r16F.8 +FLT: f = INF +FLT: g = -INF +FLT: h = NaN + +ASSERT(EQ(a, 0d1.5)) +ASSERT(EQ(b, -0d0.25)) +ASSERT(EQ(c, 0b1.1)) +ASSERT(EQ(d, 0xA.F)) +ASSERT(EQ(e, 0r16F.8)) diff --git a/tests/cases/passing/fmul.pre b/tests/cases/passing/fmul.pre new file mode 100644 index 0000000..50e9cc4 --- /dev/null +++ b/tests/cases/passing/fmul.pre @@ -0,0 +1,3 @@ +! Passing float arithmetic, checking coercion and correct logic +FLT: result_mul = FMUL(0d4.25, 0d2.0) +ASSERT(EQ(result_mul, 0d8.5)) diff --git a/tests/cases/passing/for-zero-and-restore-counter.pre b/tests/cases/passing/for-zero-and-restore-counter.pre new file mode 100644 index 0000000..1811aa5 --- /dev/null +++ b/tests/cases/passing/for-zero-and-restore-counter.pre @@ -0,0 +1,7 @@ +BOOL: i = TRUE +INT: runs = 0d0 +FOR(i, 0d0){ + ADD(@runs, 0d1) +} +ASSERT(EQ(runs, 0d0)) +ASSERT(i) diff --git a/tests/cases/passing/for.pre b/tests/cases/passing/for.pre new file mode 100644 index 0000000..8ad3c07 --- /dev/null +++ b/tests/cases/passing/for.pre @@ -0,0 +1,6 @@ +INT: sum = 0d0 +FOR(i, 0d4){ + ADD(@sum, i) +} +ASSERT(EQ(sum, 0d10)) +ASSERT(NOT(EXIST(i))) diff --git a/tests/cases/passing/fpow.pre b/tests/cases/passing/fpow.pre new file mode 100644 index 0000000..2d2397e --- /dev/null +++ b/tests/cases/passing/fpow.pre @@ -0,0 +1,3 @@ +! Passing float arithmetic, checking coercion and correct logic +FLT: result_pow = FPOW(0d2.5, 0d2.0) +ASSERT(EQ(result_pow, 0d6.25)) diff --git a/tests/cases/passing/freeze.pre b/tests/cases/passing/freeze.pre new file mode 100644 index 0000000..044a757 --- /dev/null +++ b/tests/cases/passing/freeze.pre @@ -0,0 +1,36 @@ +BOOL: frozen_value = TRUE + +ASSERT(NOT(FREEZE(frozen_value))) +ASSERT(FROZEN(frozen_value)) +ASSERT(NOT(PERMAFROZEN(frozen_value))) + +BOOL: freeze_undefined_failed = FALSE +TRY{ + FREEZE(not_declared) +} CATCH { + freeze_undefined_failed = TRUE +} +ASSERT(freeze_undefined_failed) + +BOOL: reassignment_failed = FALSE +TRY{ + frozen_value = FALSE +} CATCH { + reassignment_failed = TRUE +} +ASSERT(reassignment_failed) +ASSERT(EQ(frozen_value, TRUE)) + +BOOL: deletion_failed = FALSE +TRY{ + DEL(frozen_value) +} CATCH { + deletion_failed = TRUE +} +ASSERT(deletion_failed) +ASSERT(EXIST(frozen_value)) + +ASSERT(NOT(THAW(frozen_value))) +ASSERT(NOT(FROZEN(frozen_value))) +frozen_value = FALSE +ASSERT(EQ(frozen_value, FALSE)) diff --git a/tests/cases/passing/froot-neg.pre b/tests/cases/passing/froot-neg.pre new file mode 100644 index 0000000..ade9f07 --- /dev/null +++ b/tests/cases/passing/froot-neg.pre @@ -0,0 +1,3 @@ +! FROOT negative example with odd exponent allowed +FLT: result = FROOT(-0d8.0, 0d3.0) +ASSERT(EQ(result, -0d2.0)) diff --git a/tests/cases/passing/froot.pre b/tests/cases/passing/froot.pre new file mode 100644 index 0000000..bb7bdd6 --- /dev/null +++ b/tests/cases/passing/froot.pre @@ -0,0 +1,11 @@ +! FROOT(x, 0d0.0) computes x^(0d1.0/0d0.0) = x^INF which returns a float (like INF or NaN), DO NOT error +FLT: x2 = 0d2.0 +FLT: result_root_inf = FROOT(x2, 0d0.0) +! Not strictly checking value (INF or NaN), just that it's allowed! + +FLT: result_root_normal = FROOT(0d16.0, 0d2.0) +ASSERT(EQ(result_root_normal, 0d4.0)) + +! FROOT positive example: cube root of 8.0 (merged from froot.pre) +FLT: result = FROOT(0d8.0, 0d3.0) +ASSERT(EQ(result, 0d2.0)) diff --git a/tests/cases/passing/frozen.pre b/tests/cases/passing/frozen.pre new file mode 100644 index 0000000..9badbfe --- /dev/null +++ b/tests/cases/passing/frozen.pre @@ -0,0 +1,11 @@ +BOOL: normal_value = TRUE +ASSERT(NOT(FROZEN(normal_value))) + +ASSERT(NOT(FREEZE(normal_value))) +ASSERT(FROZEN(normal_value)) +ASSERT(NOT(THAW(normal_value))) +ASSERT(NOT(FROZEN(normal_value))) + +ASSERT(NOT(PERMAFREEZE(normal_value))) +ASSERT(FROZEN(normal_value)) +ASSERT(PERMAFROZEN(normal_value)) diff --git a/tests/cases/passing/fsub.pre b/tests/cases/passing/fsub.pre new file mode 100644 index 0000000..6b62891 --- /dev/null +++ b/tests/cases/passing/fsub.pre @@ -0,0 +1,3 @@ +! Passing float arithmetic, checking coercion and correct logic +FLT: result_sub = FSUB(0d10.0, 0d2) +ASSERT(EQ(result_sub, 0d8.0)) diff --git a/tests/cases/passing/fsum-inf.pre b/tests/cases/passing/fsum-inf.pre new file mode 100644 index 0000000..dca6a91 --- /dev/null +++ b/tests/cases/passing/fsum-inf.pre @@ -0,0 +1,3 @@ +! FSUM preserves INF under float arithmetic +FLT: result = FSUM(INF, 0d1.0) +ASSERT(EQ(result, INF)) diff --git a/tests/cases/passing/fsum.pre b/tests/cases/passing/fsum.pre new file mode 100644 index 0000000..ec80d46 --- /dev/null +++ b/tests/cases/passing/fsum.pre @@ -0,0 +1,3 @@ +! FSUM coerces mixed numeric inputs to FLT +FLT: result = FSUM(0d1, 0d2.5, 0d3) +ASSERT(EQ(result, 0d6.5)) diff --git a/tests/cases/passing/func-arguments.pre b/tests/cases/passing/func-arguments.pre new file mode 100644 index 0000000..33ce429 --- /dev/null +++ b/tests/cases/passing/func-arguments.pre @@ -0,0 +1,40 @@ +INT: order_trace = 0d0 + +FUNC INT: mark(INT: step){ + order_trace = ADD(MUL(order_trace, 0d10), step) + RETURN(step) +} + +FUNC INT: place(INT: first, INT: second = 0d0){ + RETURN(ADD(MUL(first, 0d10), second)) +} + +order_trace = 0d0 +ASSERT(EQ(place(mark(0d1), second = mark(0d2)), 0d12)) +ASSERT(EQ(order_trace, 0d12)) + +INT: outer_bonus = 0d1 +FUNC INT: add_bonus(INT: value, INT: bonus = outer_bonus){ + RETURN(ADD(value, bonus)) +} + +ASSERT(EQ(add_bonus(0d2), 0d3)) +outer_bonus = 0d4 +ASSERT(EQ(add_bonus(0d2), 0d6)) + +FUNC INT: double_self(INT: value, INT: second = value){ + RETURN(ADD(value, second)) +} + +ASSERT(EQ(double_self(0d3), 0d6)) +ASSERT(EQ(double_self(0d3, second = 0d1), 0d4)) + +FUNC INT: accept_int(INT: value){ + RETURN(value) +} + +FUNC INT: coerce_int(~INT: value){ + RETURN(value) +} + +ASSERT(EQ(coerce_int("0d11"), 0d11)) diff --git a/tests/cases/passing/func-basics.pre b/tests/cases/passing/func-basics.pre new file mode 100644 index 0000000..435d707 --- /dev/null +++ b/tests/cases/passing/func-basics.pre @@ -0,0 +1,33 @@ +FUNC INT: add(INT: left, INT: right){ + RETURN(ADD(left, right)) +} + +ASSERT(EQ(add(0d2, 0d3), 0d5)) + +FUNC: add_alias = add +ASSERT(EQ(add_alias(0d4, 0d5), 0d9)) + +FUNC BOOL: bool_default(){} +FUNC INT: int_default(){} +FUNC FLT: flt_default(){} +FUNC STR: str_default(){} + +ASSERT(EQ(bool_default(), FALSE)) +ASSERT(EQ(int_default(), 0d0)) +ASSERT(EQ(flt_default(), 0d0.0)) +ASSERT(EQ(str_default(), "")) + +BOOL: func_truthy = FALSE +IF(add_alias){ + func_truthy = TRUE +} +ASSERT(func_truthy) + +INT: stop_flag = 0d0 +FUNC INT: early_return(){ + RETURN(0d7) + stop_flag = 0d1 +} + +ASSERT(EQ(early_return(), 0d7)) +ASSERT(EQ(stop_flag, 0d0)) diff --git a/tests/cases/passing/func-call-errors.pre b/tests/cases/passing/func-call-errors.pre new file mode 100644 index 0000000..6318393 --- /dev/null +++ b/tests/cases/passing/func-call-errors.pre @@ -0,0 +1,45 @@ +INT: runtime_errors = 0d0 + +FUNC INT: accept_int(INT: value){ + RETURN(value) +} + +FUNC INT: coerce_int(~INT: value){ + RETURN(value) +} + +FUNC INT: keyword_only(INT: left, INT: right = 0d0){ + RETURN(ADD(left, right)) +} + +TRY{ + accept_int("0d1") +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +TRY{ + coerce_int("not-an-int") +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +TRY{ + keyword_only("0d1", "0d2", "0d3") +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +TRY{ + keyword_only("0d1", suffix = "!") +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +TRY{ + keyword_only("0d1", right = "0d2", right = "0d3") +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +ASSERT(EQ(runtime_errors, 0d5)) diff --git a/tests/cases/passing/func-closures.pre b/tests/cases/passing/func-closures.pre new file mode 100644 index 0000000..6daa73f --- /dev/null +++ b/tests/cases/passing/func-closures.pre @@ -0,0 +1,39 @@ +INT: captured = 0d2 + +FUNC INT: read_captured(){ + RETURN(captured) +} + +FUNC: add_captured = LAMBDA INT: (INT: delta){ + RETURN(ADD(captured, delta)) +} + +ASSERT(EQ(read_captured(), 0d2)) +ASSERT(EQ(add_captured(0d1), 0d3)) +captured = 0d5 +ASSERT(EQ(read_captured(), 0d5)) +ASSERT(EQ(add_captured(0d1), 0d6)) + +FUNC: greeter = LAMBDA STR: (STR: name, STR: prefix = "Hi"){ + RETURN(JOIN(" ", prefix, name)) +} + +ASSERT(EQ(greeter("Prefix"), "Hi Prefix")) +ASSERT(EQ(greeter("Prefix", prefix = "Hello"), "Hello Prefix")) + +ASSERT(EQ((LAMBDA INT: (INT: x){ RETURN(ADD(x, 0d1)) })(0d2), 0d3)) + +FUNC INT: invoke(FUNC: callable, INT: arg){ + RETURN(callable(arg)) +} + +ASSERT(EQ(invoke(add_captured, 0d2), 0d7)) + +FUNC FUNC: make_reader(INT: seed){ + RETURN(LAMBDA INT: (){ + RETURN(seed) + }) +} + +FUNC: reader = make_reader(0d9) +ASSERT(EQ(reader(), 0d9)) diff --git a/tests/cases/passing/func-containers.pre b/tests/cases/passing/func-containers.pre new file mode 100644 index 0000000..79e3876 --- /dev/null +++ b/tests/cases/passing/func-containers.pre @@ -0,0 +1,27 @@ +TNS: func_slots = [LAMBDA INT: (INT: left, INT: right){ RETURN(ADD(left, right)) }] +ASSERT(EQ(func_slots[0d1](0d2, 0d3), 0d5)) + +MAP: func_map = <"sum" = func_slots[0d1]> +ASSERT(EQ(func_map<"sum">(0d3, 0d4), 0d7)) + +MAP: method_map = < ^ + "install" = LAMBDA FUNC: (){ ^ + SELF<"tag"> = LAMBDA INT: (){ RETURN(0d7) } ^ + RETURN(SELF<"tag">) ^ + }, ^ + "seed" = LAMBDA INT: (){ RETURN(0d1) } ^ +> +MAP: method_copy = method_map +MAP: method_alias = @method_map + +ASSERT(EQ(method_copy<"install">()(), 0d7)) +BOOL: copy_did_not_mutate_source = FALSE +TRY{ + method_map<"tag">() +} CATCH(err){ + copy_did_not_mutate_source = TRUE +} +ASSERT(copy_did_not_mutate_source) + +ASSERT(EQ(method_alias<"install">()(), 0d7)) +ASSERT(EQ(method_map<"tag">(), 0d7)) diff --git a/tests/cases/passing/func-pop.pre b/tests/cases/passing/func-pop.pre new file mode 100644 index 0000000..41dae79 --- /dev/null +++ b/tests/cases/passing/func-pop.pre @@ -0,0 +1,14 @@ +INT: pop_target = 0d8 + +FUNC INT: take_and_delete(){ + POP(pop_target) +} + +ASSERT(EQ(take_and_delete(), 0d8)) +BOOL: pop_deleted = FALSE +TRY{ + pop_target +} CATCH(err){ + pop_deleted = TRUE +} +ASSERT(pop_deleted) diff --git a/tests/cases/passing/func-return-errors.pre b/tests/cases/passing/func-return-errors.pre new file mode 100644 index 0000000..9d868c7 --- /dev/null +++ b/tests/cases/passing/func-return-errors.pre @@ -0,0 +1,48 @@ +INT: runtime_errors = 0d0 + +FUNC INT: wrong_return(){ + RETURN("bad") +} + +TRY{ + wrong_return() +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +FUNC TNS: missing_tns_return(){} +TRY{ + missing_tns_return() +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +FUNC MAP: missing_map_return(){} +TRY{ + missing_map_return() +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +FUNC FUNC: missing_func_return(){} +TRY{ + missing_func_return() +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +FUNC THR: missing_thr_return(){} +TRY{ + missing_thr_return() +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +FUNC: missing_lambda_return = LAMBDA FUNC: (){} +TRY{ + missing_lambda_return() +} CATCH(err){ + runtime_errors = ADD(runtime_errors, 0d1) +} + +ASSERT(EQ(runtime_errors, 0d6)) diff --git a/tests/cases/passing/gcd-flt.pre b/tests/cases/passing/gcd-flt.pre new file mode 100644 index 0000000..76e405b --- /dev/null +++ b/tests/cases/passing/gcd-flt.pre @@ -0,0 +1,16 @@ +FLT: left_dec = 0d54.0 +FLT: right_hex = 0x18.0 +FLT: zero_oct = 0o0.0 +FLT: co_prime_left_oct = 0o17.0 +FLT: co_prime_right_dec = 0d13.0 + +ASSERT(EQ(GCD(left_dec, right_hex), 0x6.0)) +ASSERT(EQ(GCD(right_hex, left_dec), 0x6.0)) +ASSERT(ISFLT(GCD(left_dec, right_hex))) +ASSERT(EQ(BASE(GCD(left_dec, right_hex)), 0d16)) + +ASSERT(EQ(GCD(zero_oct, right_hex), 0x18.0)) +ASSERT(EQ(BASE(GCD(zero_oct, right_hex)), 0d16)) + +ASSERT(EQ(GCD(co_prime_left_oct, co_prime_right_dec), 0d1.0)) +ASSERT(EQ(BASE(GCD(co_prime_left_oct, co_prime_right_dec)), 0d10)) diff --git a/tests/cases/passing/gcd-int.pre b/tests/cases/passing/gcd-int.pre new file mode 100644 index 0000000..c438427 --- /dev/null +++ b/tests/cases/passing/gcd-int.pre @@ -0,0 +1,16 @@ +INT: left_dec = 0d54 +INT: right_hex = 0x18 +INT: zero_bin = 0b0 +INT: co_prime_left_oct = 0o17 +INT: co_prime_right_dec = 0d13 + +ASSERT(EQ(GCD(left_dec, right_hex), 0x6)) +ASSERT(EQ(GCD(right_hex, left_dec), 0x6)) +ASSERT(ISINT(GCD(left_dec, right_hex))) +ASSERT(EQ(BASE(GCD(left_dec, right_hex)), 0d16)) + +ASSERT(EQ(GCD(zero_bin, right_hex), 0x18)) +ASSERT(EQ(BASE(GCD(zero_bin, right_hex)), 0d16)) + +ASSERT(EQ(GCD(co_prime_left_oct, co_prime_right_dec), 0d1)) +ASSERT(EQ(BASE(GCD(co_prime_left_oct, co_prime_right_dec)), 0d10)) diff --git a/tests/cases/passing/goto-backward.pre b/tests/cases/passing/goto-backward.pre new file mode 100644 index 0000000..ff45e8b --- /dev/null +++ b/tests/cases/passing/goto-backward.pre @@ -0,0 +1,10 @@ +INT: i = 0d0 +INT: hits = 0d0 +GOTOPOINT('loop') +ADD(@hits, 0d1) +IF(LT(i, 0d2)){ + ADD(@i, 0d1) + GOTO('loop') +} +ASSERT(EQ(i, 0d2)) +ASSERT(EQ(hits, 0d3)) diff --git a/tests/cases/passing/goto-cross-block.pre b/tests/cases/passing/goto-cross-block.pre new file mode 100644 index 0000000..16af49f --- /dev/null +++ b/tests/cases/passing/goto-cross-block.pre @@ -0,0 +1,8 @@ +INT: test = 0d0 +IF(TRUE){ + GOTO('target') + ASSERT(FALSE) +} +ASSERT(FALSE) +GOTOPOINT('target') +ASSERT(EQ(test, 0d0)) diff --git a/tests/cases/passing/goto-errors.pre b/tests/cases/passing/goto-errors.pre new file mode 100644 index 0000000..40d6b9c --- /dev/null +++ b/tests/cases/passing/goto-errors.pre @@ -0,0 +1,38 @@ +INT: errors_caught = 0d0 + +TRY { + GOTOPOINT(TRUE) +} CATCH(err) { + ASSERT(EQ(err, 'GOTOPOINT requires INT or STR argument')) + ADD(@errors_caught, 0d1) +} + +TRY { + GOTO(TRUE) +} CATCH(err) { + ASSERT(EQ(err, 'GOTO requires INT or STR argument')) + ADD(@errors_caught, 0d1) +} + +TRY { + GOTOPOINT(-0d1) +} CATCH(err) { + ASSERT(EQ(err, 'Negative GOTOPOINT identifier is not allowed')) + ADD(@errors_caught, 0d1) +} + +TRY { + GOTO(-0d1) +} CATCH(err) { + ASSERT(EQ(err, 'Negative GOTO target is not allowed')) + ADD(@errors_caught, 0d1) +} + +TRY { + GOTO('unregistered') +} CATCH(err) { + ASSERT(EQ(err, 'Unregistered GOTO target')) + ADD(@errors_caught, 0d1) +} + +ASSERT(EQ(errors_caught, 0d5)) diff --git a/tests/cases/passing/goto-forward.pre b/tests/cases/passing/goto-forward.pre new file mode 100644 index 0000000..82a8007 --- /dev/null +++ b/tests/cases/passing/goto-forward.pre @@ -0,0 +1,6 @@ +INT: value = 0d0 +GOTO(0d1) +ASSERT(FALSE) +GOTOPOINT(0d1) +ADD(@value, 0d1) +ASSERT(EQ(value, 0d1)) diff --git a/tests/cases/passing/iadd.pre b/tests/cases/passing/iadd.pre new file mode 100644 index 0000000..5c0b748 --- /dev/null +++ b/tests/cases/passing/iadd.pre @@ -0,0 +1,4 @@ +# Passing integer arithmetic, checking coercion and correct logic +INT: result_add_1 = IADD(0d10, 0d5) +INT: result_add_2 = IADD(0d10.5, 0d5.2) # Coerces to integers before/after? +ASSERT(EQ(result_add_1, 0d15)) diff --git a/tests/cases/passing/ident-includes-chars.pre b/tests/cases/passing/ident-includes-chars.pre new file mode 100644 index 0000000..6d1d10f --- /dev/null +++ b/tests/cases/passing/ident-includes-chars.pre @@ -0,0 +1,68 @@ +BOOL: A = TRUE +BOOL: B = TRUE +BOOL: C = TRUE +BOOL: D = TRUE +BOOL: E = TRUE +BOOL: F = TRUE +BOOL: G = TRUE +BOOL: H = TRUE +BOOL: I = TRUE +BOOL: J = TRUE +BOOL: K = TRUE +BOOL: L = TRUE +BOOL: M = TRUE +BOOL: N = TRUE +BOOL: O = TRUE +BOOL: P = TRUE +BOOL: Q = TRUE +BOOL: R = TRUE +BOOL: S = TRUE +BOOL: T = TRUE +BOOL: U = TRUE +BOOL: V = TRUE +BOOL: W = TRUE +BOOL: X = TRUE +BOOL: Y = TRUE +BOOL: Z = TRUE +BOOL: a = TRUE +BOOL: b = TRUE +BOOL: c = TRUE +BOOL: d = TRUE +BOOL: e = TRUE +BOOL: f = TRUE +BOOL: g = TRUE +BOOL: h = TRUE +BOOL: i = TRUE +BOOL: j = TRUE +BOOL: k = TRUE +BOOL: l = TRUE +BOOL: m = TRUE +BOOL: n = TRUE +BOOL: o = TRUE +BOOL: p = TRUE +BOOL: q = TRUE +BOOL: r = TRUE +BOOL: s = TRUE +BOOL: t = TRUE +BOOL: u = TRUE +BOOL: v = TRUE +BOOL: w = TRUE +BOOL: x = TRUE +BOOL: y = TRUE +BOOL: z = TRUE +BOOL: 2 = TRUE +BOOL: 3 = TRUE +BOOL: 4 = TRUE +BOOL: 5 = TRUE +BOOL: 6 = TRUE +BOOL: 7 = TRUE +BOOL: 8 = TRUE +BOOL: 9 = TRUE +BOOL: / = TRUE +BOOL: $ = TRUE +BOOL: % = TRUE +BOOL: & = TRUE +BOOL: _ = TRUE +BOOL: + = TRUE +BOOL: | = TRUE +BOOL: ? = TRUE diff --git a/tests/cases/passing/idiv.pre b/tests/cases/passing/idiv.pre new file mode 100644 index 0000000..73568bb --- /dev/null +++ b/tests/cases/passing/idiv.pre @@ -0,0 +1,3 @@ +# Passing integer arithmetic, checking coercion and correct logic +INT: result_div = IDIV(0d20, 0d4) +ASSERT(EQ(result_div, 0d5)) diff --git a/tests/cases/passing/if-else.pre b/tests/cases/passing/if-else.pre new file mode 100644 index 0000000..8665899 --- /dev/null +++ b/tests/cases/passing/if-else.pre @@ -0,0 +1,10 @@ +IF(FALSE){ + ASSERT(FALSE) +} ELSE { + ASSERT(TRUE) +} +IF(TRUE){ + ASSERT(TRUE) +} ELSE { + ASSERT(FALSE) +} diff --git a/tests/cases/passing/if-elseif-else.pre b/tests/cases/passing/if-elseif-else.pre new file mode 100644 index 0000000..4dfa16a --- /dev/null +++ b/tests/cases/passing/if-elseif-else.pre @@ -0,0 +1,14 @@ +IF(FALSE){ + ASSERT(FALSE) +} ELSEIF(FALSE){ + ASSERT(FALSE) +} ELSE { + ASSERT(TRUE) +} +IF(FALSE){ + ASSERT(FALSE) +} ELSEIF(TRUE){ + ASSERT(TRUE) +} ELSE { + ASSERT(FALSE) +} diff --git a/tests/cases/passing/if-elseif-elseif{.pre b/tests/cases/passing/if-elseif-elseif{.pre new file mode 100644 index 0000000..b68abfd --- /dev/null +++ b/tests/cases/passing/if-elseif-elseif{.pre @@ -0,0 +1,7 @@ +IF(FALSE){ + ASSERT(FALSE) +} ELSEIF(FALSE){ + ASSERT(FALSE) +} ELSEIF(TRUE) { + ASSERT(TRUE) +} diff --git a/tests/cases/passing/if.pre b/tests/cases/passing/if.pre new file mode 100644 index 0000000..894914e --- /dev/null +++ b/tests/cases/passing/if.pre @@ -0,0 +1,3 @@ +IF(FALSE){ + ASSERT(FALSE) +} diff --git a/tests/cases/passing/ilen.pre b/tests/cases/passing/ilen.pre new file mode 100644 index 0000000..1c991d8 --- /dev/null +++ b/tests/cases/passing/ilen.pre @@ -0,0 +1,7 @@ +ASSERT(EQ(ILEN(0d0), 0d1)) +ASSERT(EQ(ILEN(0d1), 0d1)) +ASSERT(EQ(ILEN(0d2), 0d2)) +ASSERT(EQ(ILEN(0d3), 0d2)) +ASSERT(EQ(ILEN(-0d8), 0d4)) +ASSERT(EQ(ILEN(-0xA), 0d4)) +ASSERT(EQ(BASE(ILEN(-0xA)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/imul.pre b/tests/cases/passing/imul.pre new file mode 100644 index 0000000..76cd37e --- /dev/null +++ b/tests/cases/passing/imul.pre @@ -0,0 +1,3 @@ +# Passing integer arithmetic, checking coercion and correct logic +INT: result_mul = IMUL(0d4, 0d5) +ASSERT(EQ(result_mul, 0d20)) diff --git a/tests/cases/passing/int-literals-extended.pre b/tests/cases/passing/int-literals-extended.pre new file mode 100644 index 0000000..c3e6051 --- /dev/null +++ b/tests/cases/passing/int-literals-extended.pre @@ -0,0 +1,15 @@ +INT: a = 0d123 +INT: b = -0d42 +INT: c = 0x1A3 +INT: d = 0b1010 +INT: e = 0o755 +INT: g = 0r16FF +INT: h = -0r16FF + +ASSERT(EQ(a, 0d123)) +ASSERT(EQ(b, -0d42)) +ASSERT(EQ(c, 0x1A3)) +ASSERT(EQ(d, 0b1010)) +ASSERT(EQ(e, 0o755)) +ASSERT(EQ(g, 0xFF)) +ASSERT(EQ(h, -0xFF)) diff --git a/tests/cases/passing/int.pre b/tests/cases/passing/int.pre new file mode 100644 index 0000000..d9b0792 --- /dev/null +++ b/tests/cases/passing/int.pre @@ -0,0 +1,8 @@ +INT: b = 0b1 +INT: o = 0o7 +INT: d = 0d9 +INT: h = 0xF +INT: t = 0tV +INT: c = 0cz +INT: s = 0s_ +INT: r = 0r15E diff --git a/tests/cases/passing/ipow.pre b/tests/cases/passing/ipow.pre new file mode 100644 index 0000000..cf46818 --- /dev/null +++ b/tests/cases/passing/ipow.pre @@ -0,0 +1,3 @@ +# Passing integer arithmetic, checking coercion and correct logic +INT: result_pow = IPOW(0d2, 0d3) +ASSERT(EQ(result_pow, 0d8)) diff --git a/tests/cases/passing/iprod.pre b/tests/cases/passing/iprod.pre new file mode 100644 index 0000000..6516071 --- /dev/null +++ b/tests/cases/passing/iprod.pre @@ -0,0 +1,3 @@ +! IPROD coerces inputs to INT before multiplying +INT: result = IPROD(0d2.9, 0d3.1) +ASSERT(EQ(result, 0d6)) diff --git a/tests/cases/passing/iroot.pre b/tests/cases/passing/iroot.pre new file mode 100644 index 0000000..431e8be --- /dev/null +++ b/tests/cases/passing/iroot.pre @@ -0,0 +1,3 @@ +# Passing integer arithmetic, checking coercion and correct logic +INT: result_root = IROOT(0d16, 0d2) +ASSERT(EQ(result_root, 0d4)) diff --git a/tests/cases/passing/isbool.pre b/tests/cases/passing/isbool.pre new file mode 100644 index 0000000..4a61f13 --- /dev/null +++ b/tests/cases/passing/isbool.pre @@ -0,0 +1,23 @@ +BOOL: sample_bool_true = TRUE +BOOL: sample_bool_false = FALSE +INT: sample_int = -0d7 +FLT: sample_flt = 0d3.5 +STR: sample_str = "prefix" +TNS: sample_tns = [0d1, 0d2] +MAP: sample_map = <"n" = 0d1> + +FUNC INT: sample_func(INT: value){ + RETURN(value) +} + +THR(sample_thr){} + +ASSERT(ISBOOL(sample_bool_true)) +ASSERT(ISBOOL(sample_bool_false)) +ASSERT(NOT(ISBOOL(sample_int))) +ASSERT(NOT(ISBOOL(sample_flt))) +ASSERT(NOT(ISBOOL(sample_str))) +ASSERT(NOT(ISBOOL(sample_tns))) +ASSERT(NOT(ISBOOL(sample_map))) +ASSERT(NOT(ISBOOL(sample_func))) +ASSERT(NOT(ISBOOL(sample_thr))) diff --git a/tests/cases/passing/isflt.pre b/tests/cases/passing/isflt.pre new file mode 100644 index 0000000..9225903 --- /dev/null +++ b/tests/cases/passing/isflt.pre @@ -0,0 +1,21 @@ +BOOL: sample_bool_true = TRUE +INT: sample_int = -0d7 +FLT: sample_flt = 0d3.5 +STR: sample_str = "prefix" +TNS: sample_tns = [0d1, 0d2] +MAP: sample_map = <"n" = 0d1> + +FUNC INT: sample_func(INT: value){ + RETURN(value) +} + +THR(sample_thr){} + +ASSERT(NOT(ISFLT(sample_bool_true))) +ASSERT(NOT(ISFLT(sample_int))) +ASSERT(ISFLT(sample_flt)) +ASSERT(NOT(ISFLT(sample_str))) +ASSERT(NOT(ISFLT(sample_tns))) +ASSERT(NOT(ISFLT(sample_map))) +ASSERT(NOT(ISFLT(sample_func))) +ASSERT(NOT(ISFLT(sample_thr))) diff --git a/tests/cases/passing/isint.pre b/tests/cases/passing/isint.pre new file mode 100644 index 0000000..c9f2eb7 --- /dev/null +++ b/tests/cases/passing/isint.pre @@ -0,0 +1,21 @@ +BOOL: sample_bool_true = TRUE +INT: sample_int = -0d7 +FLT: sample_flt = 0d3.5 +STR: sample_str = "prefix" +TNS: sample_tns = [0d1, 0d2] +MAP: sample_map = <"n" = 0d1> + +FUNC INT: sample_func(INT: value){ + RETURN(value) +} + +THR(sample_thr){} + +ASSERT(NOT(ISINT(sample_bool_true))) +ASSERT(ISINT(sample_int)) +ASSERT(NOT(ISINT(sample_flt))) +ASSERT(NOT(ISINT(sample_str))) +ASSERT(NOT(ISINT(sample_tns))) +ASSERT(NOT(ISINT(sample_map))) +ASSERT(NOT(ISINT(sample_func))) +ASSERT(NOT(ISINT(sample_thr))) diff --git a/tests/cases/passing/isstr.pre b/tests/cases/passing/isstr.pre new file mode 100644 index 0000000..b66126b --- /dev/null +++ b/tests/cases/passing/isstr.pre @@ -0,0 +1,21 @@ +BOOL: sample_bool_true = TRUE +INT: sample_int = -0d7 +FLT: sample_flt = 0d3.5 +STR: sample_str = "prefix" +TNS: sample_tns = [0d1, 0d2] +MAP: sample_map = <"n" = 0d1> + +FUNC INT: sample_func(INT: value){ + RETURN(value) +} + +THR(sample_thr){} + +ASSERT(NOT(ISSTR(sample_bool_true))) +ASSERT(NOT(ISSTR(sample_int))) +ASSERT(NOT(ISSTR(sample_flt))) +ASSERT(ISSTR(sample_str)) +ASSERT(NOT(ISSTR(sample_tns))) +ASSERT(NOT(ISSTR(sample_map))) +ASSERT(NOT(ISSTR(sample_func))) +ASSERT(NOT(ISSTR(sample_thr))) diff --git a/tests/cases/passing/istns.pre b/tests/cases/passing/istns.pre new file mode 100644 index 0000000..ed272f8 --- /dev/null +++ b/tests/cases/passing/istns.pre @@ -0,0 +1,21 @@ +BOOL: sample_bool_true = TRUE +INT: sample_int = -0d7 +FLT: sample_flt = 0d3.5 +STR: sample_str = "prefix" +TNS: sample_tns = [0d1, 0d2] +MAP: sample_map = <"n" = 0d1> + +FUNC INT: sample_func(INT: value){ + RETURN(value) +} + +THR(sample_thr){} + +ASSERT(NOT(ISTNS(sample_bool_true))) +ASSERT(NOT(ISTNS(sample_int))) +ASSERT(NOT(ISTNS(sample_flt))) +ASSERT(NOT(ISTNS(sample_str))) +ASSERT(ISTNS(sample_tns)) +ASSERT(NOT(ISTNS(sample_map))) +ASSERT(NOT(ISTNS(sample_func))) +ASSERT(NOT(ISTNS(sample_thr))) diff --git a/tests/cases/passing/isub-int.pre b/tests/cases/passing/isub-int.pre new file mode 100644 index 0000000..404391b --- /dev/null +++ b/tests/cases/passing/isub-int.pre @@ -0,0 +1,3 @@ +# Passing integer arithmetic, checking coercion and correct logic +INT: result_sub = ISUB(0d10, 0d2.0) +ASSERT(EQ(result_sub, 0d8)) diff --git a/tests/cases/passing/isum-trunc.pre b/tests/cases/passing/isum-trunc.pre new file mode 100644 index 0000000..2dc9993 --- /dev/null +++ b/tests/cases/passing/isum-trunc.pre @@ -0,0 +1,3 @@ +! ISUM truncates floating-point inputs toward zero +INT: result = ISUM(0d1.9, 0d2.1, -0d0.9) +ASSERT(EQ(result, 0d3)) diff --git a/tests/cases/passing/join-int.pre b/tests/cases/passing/join-int.pre new file mode 100644 index 0000000..8fb0843 --- /dev/null +++ b/tests/cases/passing/join-int.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(JOIN(0b1), 0b1)) +ASSERT(EQ(JOIN(0b1, 0b0), 0b10)) +ASSERT(EQ(JOIN(0b1, 0b10, 0b11), 0b11011)) diff --git a/tests/cases/passing/join-str.pre b/tests/cases/passing/join-str.pre new file mode 100644 index 0000000..347be3b --- /dev/null +++ b/tests/cases/passing/join-str.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(JOIN("prefix"), "prefix")) +ASSERT(EQ(JOIN("pre", " ", "fix"), "pre fix")) +ASSERT(EQ(JOIN("", "a", "", "b"), "ab")) diff --git a/tests/cases/passing/later-assign-no-type.pre b/tests/cases/passing/later-assign-no-type.pre new file mode 100644 index 0000000..0297b28 --- /dev/null +++ b/tests/cases/passing/later-assign-no-type.pre @@ -0,0 +1,2 @@ +ASSIGN(BOOL: x, TRUE) +ASSIGN(x, FALSE) diff --git a/tests/cases/passing/later-decl-no-type.pre b/tests/cases/passing/later-decl-no-type.pre new file mode 100644 index 0000000..2ce9b34 --- /dev/null +++ b/tests/cases/passing/later-decl-no-type.pre @@ -0,0 +1,2 @@ +BOOL: x = TRUE +x = FALSE diff --git a/tests/cases/passing/lcm-int.pre b/tests/cases/passing/lcm-int.pre new file mode 100644 index 0000000..ede8138 --- /dev/null +++ b/tests/cases/passing/lcm-int.pre @@ -0,0 +1,16 @@ +INT: left_oct = 0o25 +INT: right_hex = 0x6 +INT: zero_bin = 0b0 +INT: co_prime_left_oct = 0o10 +INT: co_prime_right_dec = 0d9 + +ASSERT(EQ(LCM(left_oct, right_hex), 0x2A)) +ASSERT(EQ(LCM(right_hex, left_oct), 0x2A)) +ASSERT(ISINT(LCM(left_oct, right_hex))) +ASSERT(EQ(BASE(LCM(left_oct, right_hex)), 0d16)) + +ASSERT(EQ(LCM(zero_bin, right_hex), 0x0)) +ASSERT(EQ(BASE(LCM(zero_bin, right_hex)), 0d16)) + +ASSERT(EQ(LCM(co_prime_left_oct, co_prime_right_dec), 0d72)) +ASSERT(EQ(BASE(LCM(co_prime_left_oct, co_prime_right_dec)), 0d10)) diff --git a/tests/cases/passing/lcm.-fltpre b/tests/cases/passing/lcm.-fltpre new file mode 100644 index 0000000..72ea3e8 --- /dev/null +++ b/tests/cases/passing/lcm.-fltpre @@ -0,0 +1,16 @@ +FLT: left_oct = 0o25.0 +FLT: right_hex = 0x6.0 +FLT: zero_bin = 0b0.0 +FLT: co_prime_left_oct = 0o10.0 +FLT: co_prime_right_dec = 0d9.0 + +ASSERT(EQ(LCM(left_oct, right_hex), 0x2A.0)) +ASSERT(EQ(LCM(right_hex, left_oct), 0x2A.0)) +ASSERT(ISFLT(LCM(left_oct, right_hex))) +ASSERT(EQ(BASE(LCM(left_oct, right_hex)), 0d16)) + +ASSERT(EQ(LCM(zero_bin, right_hex), 0x0.0)) +ASSERT(EQ(BASE(LCM(zero_bin, right_hex)), 0d16)) + +ASSERT(EQ(LCM(co_prime_left_oct, co_prime_right_dec), 0d72.0)) +ASSERT(EQ(BASE(LCM(co_prime_left_oct, co_prime_right_dec)), 0d10)) diff --git a/tests/cases/passing/len.pre b/tests/cases/passing/len.pre new file mode 100644 index 0000000..2c2e786 --- /dev/null +++ b/tests/cases/passing/len.pre @@ -0,0 +1,5 @@ +ASSERT(EQ(LEN(0d1), 0d1)) +ASSERT(EQ(LEN("prefix"), 0d1)) +ASSERT(EQ(LEN(0d1, "prefix"), 0d2)) +ASSERT(EQ(LEN(0b1, "prefix", -0xA), 0d3)) +ASSERT(EQ(BASE(LEN(0b1, "prefix", -0xA)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/log-float.pre b/tests/cases/passing/log-float.pre new file mode 100644 index 0000000..cfa8483 --- /dev/null +++ b/tests/cases/passing/log-float.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(LOG(0d3.5), 0d1)) +ASSERT(EQ(LOG(0d16.0), 0d4)) diff --git a/tests/cases/passing/log-int.pre b/tests/cases/passing/log-int.pre new file mode 100644 index 0000000..5f7fb02 --- /dev/null +++ b/tests/cases/passing/log-int.pre @@ -0,0 +1,4 @@ +ASSERT(EQ(LOG(0d8), 0d3)) +ASSERT(EQ(LOG(0d9), 0d3)) +ASSERT(EQ(LOG(0d1), 0d0)) +ASSERT(EQ(LOG(0d2), 0d1)) diff --git a/tests/cases/passing/lower.pre b/tests/cases/passing/lower.pre new file mode 100644 index 0000000..98c4e9e --- /dev/null +++ b/tests/cases/passing/lower.pre @@ -0,0 +1,4 @@ +ASSERT(EQ(TYPE(LOWER("PREFIX")), "STR")) +ASSERT(EQ(LOWER("PREFIX"), "prefix")) +ASSERT(EQ(LOWER("Prefix 123!"), "prefix 123!")) +ASSERT(EQ(LOWER(""), "")) \ No newline at end of file diff --git a/tests/cases/passing/map-literals-empty-ordered.pre b/tests/cases/passing/map-literals-empty-ordered.pre new file mode 100644 index 0000000..f12b01b --- /dev/null +++ b/tests/cases/passing/map-literals-empty-ordered.pre @@ -0,0 +1,30 @@ +FUNC INT: GET_FIVE(){ + RETURN(0d5) +} + +MAP: empty = <> +MAP: ordered = <"alpha" = 0d1, "beta" = 0d2, "gamma" = 0d3> +MAP: duplicate = <"x" = 0d1, "y" = 0d2, "x" = 0d3> + +ASSERT(EQ(empty, <>)) + +IF(empty){ + ASSERT(FALSE) +} ELSE { + ASSERT(TRUE) +} + +IF(<"false_value" = FALSE>){ + ASSERT(TRUE) +} ELSE { + ASSERT(FALSE) +} + +ASSERT(EQ(ordered, <"alpha" = 0d1, "beta" = 0d2, "gamma" = 0d3>)) +ASSERT(EQ(KEYS(ordered), ["alpha", "beta", "gamma"])) +ASSERT(EQ(VALUES(ordered), [0d1, 0d2, 0d3])) + +ASSERT(EQ(duplicate<"x">, 0d3)) +ASSERT(EQ(duplicate<"y">, 0d2)) +ASSERT(EQ(KEYS(duplicate), ["x", "y"])) +ASSERT(EQ(VALUES(duplicate), [0d3, 0d2])) diff --git a/tests/cases/passing/map-literals-mixed-keys-nested.pre b/tests/cases/passing/map-literals-mixed-keys-nested.pre new file mode 100644 index 0000000..0211a54 --- /dev/null +++ b/tests/cases/passing/map-literals-mixed-keys-nested.pre @@ -0,0 +1,15 @@ +MAP: mixed_keys = <0d1 = "int", 0d2.5 = "flt", "three" = "str", ADD(0d2, 0d2) = "expr"> +MAP: nested = <"outer" = <"inner" = 0d9>, "empty_inner" = <>> + +ASSERT(EQ(mixed_keys<0d1>, "int")) +ASSERT(EQ(mixed_keys<0d2.5>, "flt")) +ASSERT(EQ(mixed_keys<"three">, "str")) +ASSERT(EQ(mixed_keys<0d4>, "expr")) + +ASSERT(EQ(nested<"outer", "inner">, 0d9)) +ASSERT(EQ(nested<"empty_inner">, <>)) +IF(nested<"empty_inner">){ + ASSERT(FALSE) +} ELSE { + ASSERT(TRUE) +} diff --git a/tests/cases/passing/map-literals-mixed-values.pre b/tests/cases/passing/map-literals-mixed-values.pre new file mode 100644 index 0000000..d859235 --- /dev/null +++ b/tests/cases/passing/map-literals-mixed-values.pre @@ -0,0 +1,15 @@ +FUNC INT: GET_FIVE(){ + RETURN(0d5) +} + +THR(worker){} +MAP: mixed_values = <"bool" = TRUE, "int" = 0d2, "flt" = 0d3.5, "str" = "four", "tns" = [0d1, 0d2], "map" = <"n" = 0d5>, "func" = GET_FIVE, "thr" = worker> + +ASSERT(EQ(mixed_values<"bool">, TRUE)) +ASSERT(EQ(mixed_values<"int">, 0d2)) +ASSERT(EQ(mixed_values<"flt">, 0d3.5)) +ASSERT(EQ(mixed_values<"str">, "four")) +ASSERT(EQ(mixed_values<"tns">, [0d1, 0d2])) +ASSERT(EQ(mixed_values<"map">, <"n" = 0d5>)) +ASSERT(EQ(mixed_values<"func">(), 0d5)) +ASSERT(EQ(mixed_values<"thr">, worker)) diff --git a/tests/cases/passing/map-literals-self.pre b/tests/cases/passing/map-literals-self.pre new file mode 100644 index 0000000..54eaeba --- /dev/null +++ b/tests/cases/passing/map-literals-self.pre @@ -0,0 +1,13 @@ +MAP: self_alias = <"value" = 0d1, "self" = SELF> +MAP: self_lookup = <"value" = 0d7, "copy" = SELF<"value">, "nested" = <"n" = 0d9>, "copy_nested" = SELF<"nested", "n">> +MAP: inner_self = <"inner" = <"value" = 0d4, "self" = SELF, "copy" = SELF<"value">>> + +ASSERT(EQ(self_alias<"self", "value">, 0d1)) +self_alias<"value"> = 0d2 +ASSERT(EQ(self_alias<"self", "value">, 0d2)) + +ASSERT(EQ(self_lookup<"copy">, 0d7)) +ASSERT(EQ(self_lookup<"copy_nested">, 0d9)) + +ASSERT(EQ(inner_self<"inner", "self", "value">, 0d4)) +ASSERT(EQ(inner_self<"inner", "copy">, 0d4)) diff --git a/tests/cases/passing/max-flt.pre b/tests/cases/passing/max-flt.pre new file mode 100644 index 0000000..746ebc2 --- /dev/null +++ b/tests/cases/passing/max-flt.pre @@ -0,0 +1,3 @@ +! MAX with multiple FLT arguments +FLT: result = MAX(0d1.5, -0d2.25, 0d3.0) +ASSERT(EQ(result, 0d3.0)) diff --git a/tests/cases/passing/max-int.pre b/tests/cases/passing/max-int.pre new file mode 100644 index 0000000..6481f19 --- /dev/null +++ b/tests/cases/passing/max-int.pre @@ -0,0 +1,3 @@ +! MAX with multiple INT arguments +INT: result = MAX(0d1, -0d2, 0d3) +ASSERT(EQ(result, 0d3)) diff --git a/tests/cases/passing/max-str.pre b/tests/cases/passing/max-str.pre new file mode 100644 index 0000000..e0302c9 --- /dev/null +++ b/tests/cases/passing/max-str.pre @@ -0,0 +1,3 @@ +! MAX returns the longest string +STR: result = MAX("a", "", "prefix", "bb") +ASSERT(EQ(result, "prefix")) diff --git a/tests/cases/passing/max-tns.pre b/tests/cases/passing/max-tns.pre new file mode 100644 index 0000000..96bc2e9 --- /dev/null +++ b/tests/cases/passing/max-tns.pre @@ -0,0 +1,5 @@ +! MAX flattens tensors and returns the maximum scalar element +TNS: a = [[0d1, 0d2], [-0d3, 0d0]] +TNS: b = [0d0, 0d4] +INT: result = MAX(a, b) +ASSERT(EQ(result, 0d4)) diff --git a/tests/cases/passing/min-flt.pre b/tests/cases/passing/min-flt.pre new file mode 100644 index 0000000..16e54d7 --- /dev/null +++ b/tests/cases/passing/min-flt.pre @@ -0,0 +1,3 @@ +! MIN with multiple FLT arguments +FLT: result = MIN(0d1.5, -0d2.25, 0d3.0) +ASSERT(EQ(result, -0d2.25)) diff --git a/tests/cases/passing/min-int.pre b/tests/cases/passing/min-int.pre new file mode 100644 index 0000000..c3f88ee --- /dev/null +++ b/tests/cases/passing/min-int.pre @@ -0,0 +1,3 @@ +! MIN with multiple INT arguments +INT: result = MIN(0d1, -0d2, 0d3) +ASSERT(EQ(result, -0d2)) diff --git a/tests/cases/passing/min-str.pre b/tests/cases/passing/min-str.pre new file mode 100644 index 0000000..acd0f78 --- /dev/null +++ b/tests/cases/passing/min-str.pre @@ -0,0 +1,3 @@ +! MIN returns the shortest string +STR: result = MIN("a", "", "prefix", "bb") +ASSERT(EQ(result, "")) diff --git a/tests/cases/passing/min-tns.pre b/tests/cases/passing/min-tns.pre new file mode 100644 index 0000000..8b028e6 --- /dev/null +++ b/tests/cases/passing/min-tns.pre @@ -0,0 +1,4 @@ +! MIN flattens tensors and returns the minimum scalar element (string length for STR) +TNS: a = [["aa", "b"], ["ccc", "dd"]] +STR: result = MIN(a) +ASSERT(EQ(result, "b")) diff --git a/tests/cases/passing/mod-flt.pre b/tests/cases/passing/mod-flt.pre new file mode 100644 index 0000000..92abdd9 --- /dev/null +++ b/tests/cases/passing/mod-flt.pre @@ -0,0 +1,10 @@ +FLT: left_oct = 0o7.0 +FLT: right_hex = 0x2.0 +FLT: wide_oct = 0o5.0 +FLT: right_hex_frac = 0x1.8 + +ASSERT(EQ(MOD(left_oct, right_hex), 0x1.0)) +ASSERT(EQ(BASE(MOD(left_oct, right_hex)), 0d16)) + +ASSERT(EQ(MOD(wide_oct, right_hex_frac), 0x0.8)) +ASSERT(EQ(BASE(MOD(wide_oct, right_hex_frac)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/mod-int.pre b/tests/cases/passing/mod-int.pre new file mode 100644 index 0000000..ad7447a --- /dev/null +++ b/tests/cases/passing/mod-int.pre @@ -0,0 +1,9 @@ +INT: left_dec = 0d7 +INT: right_bin = 0b10 +INT: wide_hex = 0x10 + +ASSERT(EQ(MOD(left_dec, right_bin), 0d1)) +ASSERT(EQ(BASE(MOD(left_dec, right_bin)), 0d10)) + +ASSERT(EQ(MOD(wide_hex, 0d3), 0x1)) +ASSERT(EQ(BASE(MOD(wide_hex, 0d3)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/mul-flt.pre b/tests/cases/passing/mul-flt.pre new file mode 100644 index 0000000..e3585c5 --- /dev/null +++ b/tests/cases/passing/mul-flt.pre @@ -0,0 +1,9 @@ +FLT: left_oct = 0o1.4 +FLT: right_hex = 0x0.8 +FLT: left_oct_one = 0o1.0 + +ASSERT(EQ(MUL(left_oct, right_hex), 0x0.C)) +ASSERT(EQ(BASE(MUL(left_oct, right_hex)), 0d16)) + +ASSERT(EQ(MUL(left_oct_one, right_hex), 0x0.8)) +ASSERT(EQ(BASE(MUL(left_oct_one, right_hex)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/mul-int.pre b/tests/cases/passing/mul-int.pre new file mode 100644 index 0000000..f189bbd --- /dev/null +++ b/tests/cases/passing/mul-int.pre @@ -0,0 +1,9 @@ +INT: left_dec = 0d2 +INT: right_bin = 0b11 +INT: wide_hex = 0x10 + +ASSERT(EQ(MUL(left_dec, right_bin), 0d6)) +ASSERT(EQ(BASE(MUL(left_dec, right_bin)), 0d10)) + +ASSERT(EQ(MUL(wide_hex, left_dec), 0d32)) +ASSERT(EQ(BASE(MUL(wide_hex, left_dec)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/multi-assign-type.pre b/tests/cases/passing/multi-assign-type.pre new file mode 100644 index 0000000..912b8d8 --- /dev/null +++ b/tests/cases/passing/multi-assign-type.pre @@ -0,0 +1,2 @@ +ASSIGN(BOOL: x, TRUE) +ASSIGN(BOOL: x, FALSE) diff --git a/tests/cases/passing/multi-decl-type.pre b/tests/cases/passing/multi-decl-type.pre new file mode 100644 index 0000000..8691f7f --- /dev/null +++ b/tests/cases/passing/multi-decl-type.pre @@ -0,0 +1,2 @@ +BOOL: x = TRUE +BOOL: x = FALSE diff --git a/tests/cases/passing/neg-flt.pre b/tests/cases/passing/neg-flt.pre new file mode 100644 index 0000000..e6c995e --- /dev/null +++ b/tests/cases/passing/neg-flt.pre @@ -0,0 +1,10 @@ +FLT: pos_oct = 0o1.4 +FLT: neg_literal = -0o1.4 +FLT: hex_val = 0x1.8 +FLT: zero = 0o0.0 + +ASSERT(EQ(NEG(pos_oct), -0o1.4)) +ASSERT(EQ(NEG(neg_literal), 0o1.4)) +ASSERT(EQ(NEG(NEG(pos_oct)), pos_oct)) +ASSERT(EQ(NEG(zero), 0o0.0)) +ASSERT(EQ(BASE(NEG(hex_val)), BASE(hex_val))) diff --git a/tests/cases/passing/neg-int.pre b/tests/cases/passing/neg-int.pre new file mode 100644 index 0000000..4903991 --- /dev/null +++ b/tests/cases/passing/neg-int.pre @@ -0,0 +1,12 @@ +INT: pos_dec = 0d3 +INT: neg_literal = -0d3 +INT: hex_val = 0xA +INT: bin_val = 0b1010 +INT: zero = 0d0 + +ASSERT(EQ(NEG(pos_dec), -0d3)) +ASSERT(EQ(NEG(neg_literal), 0d3)) +ASSERT(EQ(NEG(NEG(pos_dec)), pos_dec)) +ASSERT(EQ(NEG(zero), 0d0)) +ASSERT(EQ(BASE(NEG(hex_val)), BASE(hex_val))) +ASSERT(EQ(BASE(NEG(bin_val)), BASE(bin_val))) diff --git a/tests/cases/passing/neq-scalars.pre b/tests/cases/passing/neq-scalars.pre new file mode 100644 index 0000000..6c977c2 --- /dev/null +++ b/tests/cases/passing/neq-scalars.pre @@ -0,0 +1,12 @@ +ASSERT(ISBOOL(NEQ(TRUE, FALSE))) +ASSERT(NEQ(TRUE, FALSE)) +ASSERT(NOT(NEQ(TRUE, TRUE))) + +ASSERT(NEQ(0d42, 0d43)) +ASSERT(NOT(NEQ(0d42, 0d42))) + +ASSERT(NEQ(0d1.5, 0d1.25)) +ASSERT(NEQ(NaN, NaN)) + +ASSERT(NEQ("prefix", "Prefix")) +ASSERT(NOT(NEQ("prefix", "prefix"))) \ No newline at end of file diff --git a/tests/cases/passing/neq-structured.pre b/tests/cases/passing/neq-structured.pre new file mode 100644 index 0000000..6acf3b3 --- /dev/null +++ b/tests/cases/passing/neq-structured.pre @@ -0,0 +1,24 @@ +TNS: tensor = [[0d1, 0d2], [0d3, 0d4]] +TNS: different_tensor = [[0d1, 0d2], [0d3, 0d5]] + +MAP: map_value = <"alpha" = 0d1, "beta" = [0d2, 0d3]> +MAP: different_map = <"alpha" = 0d1, "beta" = [0d2, 0d4]> + +FUNC INT: identity(INT: value){ + RETURN(value) +} +FUNC: identity_alias = identity + +THR(worker){} +THR(other){} + +ASSERT(ISBOOL(NEQ(tensor, different_tensor))) +ASSERT(NEQ(tensor, different_tensor)) +ASSERT(NOT(NEQ(tensor, tensor))) + +ASSERT(NEQ(map_value, different_map)) +ASSERT(NOT(NEQ(map_value, map_value))) + +ASSERT(NOT(NEQ(identity_alias, identity))) +ASSERT(NOT(NEQ(worker, worker))) +ASSERT(NEQ(worker, other)) \ No newline at end of file diff --git a/tests/cases/passing/not.pre b/tests/cases/passing/not.pre new file mode 100644 index 0000000..4a66726 --- /dev/null +++ b/tests/cases/passing/not.pre @@ -0,0 +1,6 @@ +ASSERT(EQ(NOT(FALSE), TRUE)) +ASSERT(EQ(NOT(TRUE), FALSE)) +ASSERT(EQ(NOT(0d0), TRUE)) +ASSERT(EQ(NOT(0d1), FALSE)) +ASSERT(EQ(NOT(""), TRUE)) +ASSERT(EQ(NOT("x"), FALSE)) diff --git a/tests/cases/passing/op-arithmetic-coerce-flt-pass.pre b/tests/cases/passing/op-arithmetic-coerce-flt-pass.pre new file mode 100644 index 0000000..11b6acb --- /dev/null +++ b/tests/cases/passing/op-arithmetic-coerce-flt-pass.pre @@ -0,0 +1,26 @@ +! Passing float arithmetic, checking coercion and correct logic +FLT: result_add = FADD(0d10.5, 0d5.25) +ASSERT(EQ(result_add, 0d15.75)) + +FLT: result_sub = FSUB(0d10.0, 0d2) +ASSERT(EQ(result_sub, 0d8.0)) + +FLT: result_mul = FMUL(0d4.25, 0d2.0) +ASSERT(EQ(result_mul, 0d8.5)) + +! FDIV(0d1.0, 0d0.0) performing IEEE 754 division by zero DOES NOT return an error, it returns INF +FLT: x = 0d1.0 +FLT: y = 0d0.0 +FLT: result_div_inf = FDIV(x, y) +ASSERT(EQ(result_div_inf, INF)) + +FLT: result_pow = FPOW(0d2.5, 0d2.0) +ASSERT(EQ(result_pow, 0d6.25)) + +! FROOT(x, 0d0.0) computes x^(0d1.0/0d0.0) = x^INF which returns a float (like INF or NaN), DO NOT error +FLT: x2 = 0d2.0 +FLT: result_root_inf = FROOT(x2, 0d0.0) +! Not strictly checking value (INF or NaN), just that it's allowed! + +FLT: result_root_normal = FROOT(0d16.0, 0d2.0) +ASSERT(EQ(result_root_normal, 0d4.0)) \ No newline at end of file diff --git a/tests/cases/passing/op-arithmetic-coerce-int-pass.pre b/tests/cases/passing/op-arithmetic-coerce-int-pass.pre new file mode 100644 index 0000000..c0e9c5b --- /dev/null +++ b/tests/cases/passing/op-arithmetic-coerce-int-pass.pre @@ -0,0 +1,19 @@ +# Passing integer arithmetic, checking coercion and correct logic +INT: result_add_1 = IADD(0d10, 0d5) +INT: result_add_2 = IADD(0d10.5, 0d5.2) # Coerces to integers before/after? +ASSERT(EQ(result_add_1, 0d15)) + +INT: result_sub = ISUB(0d10, 0d2.0) +ASSERT(EQ(result_sub, 0d8)) + +INT: result_mul = IMUL(0d4, 0d5) +ASSERT(EQ(result_mul, 0d20)) + +INT: result_div = IDIV(0d20, 0d4) +ASSERT(EQ(result_div, 0d5)) + +INT: result_pow = IPOW(0d2, 0d3) +ASSERT(EQ(result_pow, 0d8)) + +INT: result_root = IROOT(0d16, 0d2) +ASSERT(EQ(result_root, 0d4)) diff --git a/tests/cases/passing/op-arithmetic-flt.pre b/tests/cases/passing/op-arithmetic-flt.pre new file mode 100644 index 0000000..2a92bea --- /dev/null +++ b/tests/cases/passing/op-arithmetic-flt.pre @@ -0,0 +1,6 @@ +FLT: left_oct = 0o1.4 +FLT: right_hex = 0x0.8 +FLT: left_oct_one = 0o1.0 + +ASSERT(EQ(ADD(left_oct_one, right_hex), 0x1.8)) +ASSERT(EQ(BASE(ADD(left_oct_one, right_hex)), 0d16)) diff --git a/tests/cases/passing/op-arithmetic-int.pre b/tests/cases/passing/op-arithmetic-int.pre new file mode 100644 index 0000000..25680f8 --- /dev/null +++ b/tests/cases/passing/op-arithmetic-int.pre @@ -0,0 +1,9 @@ +INT: left_dec = 0d2 +INT: right_bin = 0b11 +INT: wide_hex = 0x10 + +ASSERT(EQ(ADD(left_dec, right_bin), 0d5)) +ASSERT(EQ(BASE(ADD(left_dec, right_bin)), 0d10)) + +ASSERT(EQ(ADD(wide_hex, left_dec), 0d18)) +ASSERT(EQ(BASE(ADD(wide_hex, left_dec)), 0d16)) diff --git a/tests/cases/passing/op-bool-from-bool.pre b/tests/cases/passing/op-bool-from-bool.pre new file mode 100644 index 0000000..6b0dbd7 --- /dev/null +++ b/tests/cases/passing/op-bool-from-bool.pre @@ -0,0 +1,2 @@ +ASSERT(BOOL(TRUE)) +ASSERT(NOT(BOOL(FALSE))) diff --git a/tests/cases/passing/op-bool-from-flt.pre b/tests/cases/passing/op-bool-from-flt.pre new file mode 100644 index 0000000..092ce04 --- /dev/null +++ b/tests/cases/passing/op-bool-from-flt.pre @@ -0,0 +1,6 @@ +ASSERT(NOT(BOOL(0d0.0))) +ASSERT(BOOL(0d0.5)) +ASSERT(BOOL(-0d0.5)) +ASSERT(BOOL(INF)) +ASSERT(BOOL(-INF)) +ASSERT(BOOL(NaN)) diff --git a/tests/cases/passing/op-bool-from-func.pre b/tests/cases/passing/op-bool-from-func.pre new file mode 100644 index 0000000..710ecd5 --- /dev/null +++ b/tests/cases/passing/op-bool-from-func.pre @@ -0,0 +1,5 @@ +FUNC BOOL: sample_func(){ + RETURN(TRUE) +} + +ASSERT(BOOL(sample_func)) diff --git a/tests/cases/passing/op-bool-from-int.pre b/tests/cases/passing/op-bool-from-int.pre new file mode 100644 index 0000000..16b1316 --- /dev/null +++ b/tests/cases/passing/op-bool-from-int.pre @@ -0,0 +1,2 @@ +ASSERT(NOT(BOOL(0d0))) +ASSERT(BOOL(0d1)) diff --git a/tests/cases/passing/op-bool-from-map.pre b/tests/cases/passing/op-bool-from-map.pre new file mode 100644 index 0000000..2b5f7aa --- /dev/null +++ b/tests/cases/passing/op-bool-from-map.pre @@ -0,0 +1,2 @@ +ASSERT(NOT(BOOL(<>))) +ASSERT(BOOL(<"n" = 0d0>)) diff --git a/tests/cases/passing/op-bool-from-str.pre b/tests/cases/passing/op-bool-from-str.pre new file mode 100644 index 0000000..59586b1 --- /dev/null +++ b/tests/cases/passing/op-bool-from-str.pre @@ -0,0 +1,2 @@ +ASSERT(NOT(BOOL(""))) +ASSERT(BOOL("text")) diff --git a/tests/cases/passing/op-bool-from-thr.pre b/tests/cases/passing/op-bool-from-thr.pre new file mode 100644 index 0000000..fad2b01 --- /dev/null +++ b/tests/cases/passing/op-bool-from-thr.pre @@ -0,0 +1,11 @@ +BOOL: thr_release = FALSE +THR(worker){ + WHILE(NOT(thr_release)){ + } +} + +ASSERT(BOOL(worker)) +thr_release = TRUE +WHILE(worker){ +} +ASSERT(NOT(BOOL(worker))) diff --git a/tests/cases/passing/op-bool-from-tns.pre b/tests/cases/passing/op-bool-from-tns.pre new file mode 100644 index 0000000..0cc601a --- /dev/null +++ b/tests/cases/passing/op-bool-from-tns.pre @@ -0,0 +1,2 @@ +ASSERT(NOT(BOOL([FALSE, 0d0, ""]))) +ASSERT(BOOL([FALSE, 0d0, TRUE])) diff --git a/tests/cases/passing/op-flt-from-bool.pre b/tests/cases/passing/op-flt-from-bool.pre new file mode 100644 index 0000000..9c2afee --- /dev/null +++ b/tests/cases/passing/op-flt-from-bool.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(FLT(TRUE), 0d1.0)) +ASSERT(EQ(FLT(FALSE), 0d0.0)) diff --git a/tests/cases/passing/op-flt-from-flt.pre b/tests/cases/passing/op-flt-from-flt.pre new file mode 100644 index 0000000..6bd7b72 --- /dev/null +++ b/tests/cases/passing/op-flt-from-flt.pre @@ -0,0 +1 @@ +ASSERT(EQ(FLT(0d1.5), 0d1.5)) diff --git a/tests/cases/passing/op-flt-from-int.pre b/tests/cases/passing/op-flt-from-int.pre new file mode 100644 index 0000000..e2cf6bd --- /dev/null +++ b/tests/cases/passing/op-flt-from-int.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(FLT(0d7), 0d7.0)) +ASSERT(EQ(FLT(-0d7), -0d7.0)) diff --git a/tests/cases/passing/op-flt-from-special-str.pre b/tests/cases/passing/op-flt-from-special-str.pre new file mode 100644 index 0000000..94ba3c1 --- /dev/null +++ b/tests/cases/passing/op-flt-from-special-str.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(FLT("INF"), INF)) +ASSERT(EQ(FLT("-INF"), -INF)) +ASSERT(NEQ(FLT("NaN"), FLT("NaN"))) diff --git a/tests/cases/passing/op-flt-from-str.pre b/tests/cases/passing/op-flt-from-str.pre new file mode 100644 index 0000000..e57217c --- /dev/null +++ b/tests/cases/passing/op-flt-from-str.pre @@ -0,0 +1 @@ +ASSERT(EQ(FLT("0d1.25"), 0d1.25)) diff --git a/tests/cases/passing/op-gt.pre b/tests/cases/passing/op-gt.pre new file mode 100644 index 0000000..051f2a5 --- /dev/null +++ b/tests/cases/passing/op-gt.pre @@ -0,0 +1,5 @@ +ASSERT(ISBOOL(GT(0d2, 0d1))) +ASSERT(GT(0d2, 0d1)) +ASSERT(NOT(GT(0d1, 0d1))) +ASSERT(GT(0d1.5, 0d1.4)) +ASSERT(NOT(GT(0d1.4, 0d1.5))) \ No newline at end of file diff --git a/tests/cases/passing/op-gte.pre b/tests/cases/passing/op-gte.pre new file mode 100644 index 0000000..e487713 --- /dev/null +++ b/tests/cases/passing/op-gte.pre @@ -0,0 +1,7 @@ +ASSERT(ISBOOL(GTE(0d2, 0d1))) +ASSERT(GTE(0d2, 0d1)) +ASSERT(GTE(0d1, 0d1)) +ASSERT(NOT(GTE(0d1, 0d2))) +ASSERT(GTE(0d1.5, 0d1.4)) +ASSERT(GTE(0d1.4, 0d1.4)) +ASSERT(NOT(GTE(0d1.4, 0d1.5))) \ No newline at end of file diff --git a/tests/cases/passing/op-int-from-bool.pre b/tests/cases/passing/op-int-from-bool.pre new file mode 100644 index 0000000..b85dc8c --- /dev/null +++ b/tests/cases/passing/op-int-from-bool.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(INT(TRUE), 0d1)) +ASSERT(EQ(INT(FALSE), 0d0)) diff --git a/tests/cases/passing/op-int-from-flt.pre b/tests/cases/passing/op-int-from-flt.pre new file mode 100644 index 0000000..541ac6c --- /dev/null +++ b/tests/cases/passing/op-int-from-flt.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(INT(0b1.1), 0d1)) +ASSERT(EQ(INT(-0b1.1), -0d1)) diff --git a/tests/cases/passing/op-int-from-int.pre b/tests/cases/passing/op-int-from-int.pre new file mode 100644 index 0000000..8d262c2 --- /dev/null +++ b/tests/cases/passing/op-int-from-int.pre @@ -0,0 +1 @@ +ASSERT(EQ(INT(0d42), 0d42)) diff --git a/tests/cases/passing/op-int-from-str.pre b/tests/cases/passing/op-int-from-str.pre new file mode 100644 index 0000000..396e30f --- /dev/null +++ b/tests/cases/passing/op-int-from-str.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(INT("0x1A"), 0d26)) +ASSERT(EQ(INT(""), 0d0)) +ASSERT(EQ(INT("prefix"), 0d1)) diff --git a/tests/cases/passing/op-lt.pre b/tests/cases/passing/op-lt.pre new file mode 100644 index 0000000..1e5827f --- /dev/null +++ b/tests/cases/passing/op-lt.pre @@ -0,0 +1,5 @@ +ASSERT(ISBOOL(LT(0d1, 0d2))) +ASSERT(LT(0d1, 0d2)) +ASSERT(NOT(LT(0d1, 0d1))) +ASSERT(LT(0d1.4, 0d1.5)) +ASSERT(NOT(LT(0d1.5, 0d1.4))) \ No newline at end of file diff --git a/tests/cases/passing/op-lte.pre b/tests/cases/passing/op-lte.pre new file mode 100644 index 0000000..e7512a5 --- /dev/null +++ b/tests/cases/passing/op-lte.pre @@ -0,0 +1,7 @@ +ASSERT(ISBOOL(LTE(0d1, 0d2))) +ASSERT(LTE(0d1, 0d2)) +ASSERT(LTE(0d1, 0d1)) +ASSERT(NOT(LTE(0d2, 0d1))) +ASSERT(LTE(0d1.4, 0d1.5)) +ASSERT(LTE(0d1.4, 0d1.4)) +ASSERT(NOT(LTE(0d1.5, 0d1.4))) \ No newline at end of file diff --git a/tests/cases/passing/op-str-from-bool.pre b/tests/cases/passing/op-str-from-bool.pre new file mode 100644 index 0000000..466af23 --- /dev/null +++ b/tests/cases/passing/op-str-from-bool.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(STR(TRUE), "TRUE")) +ASSERT(EQ(STR(FALSE), "FALSE")) diff --git a/tests/cases/passing/op-str-from-flt.pre b/tests/cases/passing/op-str-from-flt.pre new file mode 100644 index 0000000..f9697be --- /dev/null +++ b/tests/cases/passing/op-str-from-flt.pre @@ -0,0 +1 @@ +ASSERT(EQ(STR(-0d1.5), "-0d1.5")) diff --git a/tests/cases/passing/op-str-from-int.pre b/tests/cases/passing/op-str-from-int.pre new file mode 100644 index 0000000..5a4fa57 --- /dev/null +++ b/tests/cases/passing/op-str-from-int.pre @@ -0,0 +1 @@ +ASSERT(EQ(STR(0b101), "0b101")) diff --git a/tests/cases/passing/op-str-from-special-flt.pre b/tests/cases/passing/op-str-from-special-flt.pre new file mode 100644 index 0000000..26549a9 --- /dev/null +++ b/tests/cases/passing/op-str-from-special-flt.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(STR(INF), "INF")) +ASSERT(EQ(STR(-INF), "-INF")) +ASSERT(EQ(STR(NaN), "NaN")) diff --git a/tests/cases/passing/op-str-from-str.pre b/tests/cases/passing/op-str-from-str.pre new file mode 100644 index 0000000..06047dd --- /dev/null +++ b/tests/cases/passing/op-str-from-str.pre @@ -0,0 +1 @@ +ASSERT(EQ(STR("prefix"), "prefix")) diff --git a/tests/cases/passing/op-tns-from-shape-map.pre b/tests/cases/passing/op-tns-from-shape-map.pre new file mode 100644 index 0000000..19cc636 --- /dev/null +++ b/tests/cases/passing/op-tns-from-shape-map.pre @@ -0,0 +1,3 @@ +MAP: fill_map = <"n" = 0d1> +TNS: filled_map = TNS([0d2], fill_map) +ASSERT(EQ(filled_map, [fill_map, fill_map])) diff --git a/tests/cases/passing/op-tns-from-shape-scalar.pre b/tests/cases/passing/op-tns-from-shape-scalar.pre new file mode 100644 index 0000000..258f161 --- /dev/null +++ b/tests/cases/passing/op-tns-from-shape-scalar.pre @@ -0,0 +1,2 @@ +TNS: filled_scalar = TNS([0d2, 0d1], 0d7) +ASSERT(EQ(filled_scalar, [[0d7], [0d7]])) diff --git a/tests/cases/passing/op-tns-from-str.pre b/tests/cases/passing/op-tns-from-str.pre new file mode 100644 index 0000000..2fe35ac --- /dev/null +++ b/tests/cases/passing/op-tns-from-str.pre @@ -0,0 +1,2 @@ +TNS: from_string = TNS("abc") +ASSERT(EQ(from_string, ["a", "b", "c"])) \ No newline at end of file diff --git a/tests/cases/passing/or.pre b/tests/cases/passing/or.pre new file mode 100644 index 0000000..5cd69f4 --- /dev/null +++ b/tests/cases/passing/or.pre @@ -0,0 +1,2 @@ +ASSERT(NOT(OR(FALSE, FALSE))) +ASSERT(OR(FALSE, TRUE)) diff --git a/tests/cases/passing/parfor-break-nested.pre b/tests/cases/passing/parfor-break-nested.pre new file mode 100644 index 0000000..b814b05 --- /dev/null +++ b/tests/cases/passing/parfor-break-nested.pre @@ -0,0 +1,13 @@ +INT: outer = 0d0 + +FOR(j, 0d3){ + ADD(@outer, 0d1) + PARFOR(i, 0d5){ + BREAK(0d2) + } + ASSERT(FALSE) +} + +ASSERT(EQ(outer, 0d1)) +ASSERT(NOT(EXIST(i))) +ASSERT(NOT(EXIST(j))) diff --git a/tests/cases/passing/parfor-break.pre b/tests/cases/passing/parfor-break.pre new file mode 100644 index 0000000..ab3bd1f --- /dev/null +++ b/tests/cases/passing/parfor-break.pre @@ -0,0 +1,15 @@ +INT: outer = 0d0 +INT: after = 0d0 + +FOR(j, 0d3){ + ADD(@outer, 0d1) + PARFOR(i, 0d5){ + BREAK(0d1) + } + ADD(@after, 0d1) +} + +ASSERT(EQ(outer, 0d3)) +ASSERT(EQ(after, 0d3)) +ASSERT(NOT(EXIST(i))) +ASSERT(NOT(EXIST(j))) diff --git a/tests/cases/passing/parfor-continue.pre b/tests/cases/passing/parfor-continue.pre new file mode 100644 index 0000000..21934dc --- /dev/null +++ b/tests/cases/passing/parfor-continue.pre @@ -0,0 +1,9 @@ +TNS: seen = [0d0, 0d0, 0d0, 0d0] +PARFOR(i, 0d4){ + IF(EQ(i, 0d2)){ + CONTINUE() + } + seen[i] = i +} +ASSERT(EQ(seen, [0d1, 0d0, 0d3, 0d4])) +ASSERT(NOT(EXIST(i))) diff --git a/tests/cases/passing/parfor-error-join.pre b/tests/cases/passing/parfor-error-join.pre new file mode 100644 index 0000000..f818374 --- /dev/null +++ b/tests/cases/passing/parfor-error-join.pre @@ -0,0 +1,17 @@ +TNS: seen = [0d0, 0d0, 0d0] +BOOL: caught = FALSE + +TRY{ + PARFOR(i, 0d3){ + seen[i] = i + IF(EQ(i, 0d2)){ + ASSERT(FALSE) + } + } + ASSERT(FALSE) +} CATCH { + caught = TRUE +} + +ASSERT(caught) +ASSERT(EQ(seen, [0d1, 0d2, 0d3])) diff --git a/tests/cases/passing/parfor-merge-symbol.pre b/tests/cases/passing/parfor-merge-symbol.pre new file mode 100644 index 0000000..60662ee --- /dev/null +++ b/tests/cases/passing/parfor-merge-symbol.pre @@ -0,0 +1,8 @@ +PARFOR(i, 0d3){ + IF(EQ(i, 0d2)){ + INT: merged = 0d7 + } +} +ASSERT(EXIST(merged)) +ASSERT(EQ(merged, 0d7)) +ASSERT(NOT(EXIST(i))) diff --git a/tests/cases/passing/parfor-target-once.pre b/tests/cases/passing/parfor-target-once.pre new file mode 100644 index 0000000..38c7f06 --- /dev/null +++ b/tests/cases/passing/parfor-target-once.pre @@ -0,0 +1,14 @@ +INT: target_calls = 0d0 + +FUNC INT: get_target(){ + ADD(@target_calls, 0d1) + RETURN(0d3) +} + +TNS: seen = [0d0, 0d0, 0d0] +PARFOR(i, get_target()){ + seen[i] = i +} +ASSERT(EQ(target_calls, 0d1)) +ASSERT(EQ(seen, [0d1, 0d2, 0d3])) +ASSERT(NOT(EXIST(i))) diff --git a/tests/cases/passing/parfor-zero-and-restore-counter.pre b/tests/cases/passing/parfor-zero-and-restore-counter.pre new file mode 100644 index 0000000..414c998 --- /dev/null +++ b/tests/cases/passing/parfor-zero-and-restore-counter.pre @@ -0,0 +1,7 @@ +BOOL: i = TRUE +INT: runs = 0d0 +PARFOR(i, 0d5){ + ADD(@runs, 0d1) +} +ASSERT(EQ(runs, 0d0)) +ASSERT(i) diff --git a/tests/cases/passing/parfor.pre b/tests/cases/passing/parfor.pre new file mode 100644 index 0000000..cc8d560 --- /dev/null +++ b/tests/cases/passing/parfor.pre @@ -0,0 +1,6 @@ +TNS: seen = [0d0, 0d0, 0d0, 0d0] +PARFOR(i, 0d4){ + seen[i] = i +} +ASSERT(EQ(seen, [0d1, 0d2, 0d3, 0d4])) +ASSERT(NOT(EXIST(i))) diff --git a/tests/cases/passing/permafreeze.pre b/tests/cases/passing/permafreeze.pre new file mode 100644 index 0000000..b4bd9c0 --- /dev/null +++ b/tests/cases/passing/permafreeze.pre @@ -0,0 +1,40 @@ +BOOL: locked_value = TRUE + +ASSERT(NOT(PERMAFREEZE(locked_value))) +ASSERT(FROZEN(locked_value)) +ASSERT(PERMAFROZEN(locked_value)) + +BOOL: permafreeze_undefined_failed = FALSE +TRY{ + PERMAFREEZE(not_declared) +} CATCH { + permafreeze_undefined_failed = TRUE +} +ASSERT(permafreeze_undefined_failed) + +BOOL: reassignment_failed = FALSE +TRY{ + locked_value = FALSE +} CATCH { + reassignment_failed = TRUE +} +ASSERT(reassignment_failed) +ASSERT(EQ(locked_value, TRUE)) + +BOOL: deletion_failed = FALSE +TRY{ + DEL(locked_value) +} CATCH { + deletion_failed = TRUE +} +ASSERT(deletion_failed) +ASSERT(EXIST(locked_value)) + +BOOL: thaw_failed = FALSE +TRY{ + THAW(locked_value) +} CATCH { + thaw_failed = TRUE +} +ASSERT(thaw_failed) +ASSERT(PERMAFROZEN(locked_value)) diff --git a/tests/cases/passing/permafrozen.pre b/tests/cases/passing/permafrozen.pre new file mode 100644 index 0000000..cc4ed0d --- /dev/null +++ b/tests/cases/passing/permafrozen.pre @@ -0,0 +1,6 @@ +BOOL: normal_value = TRUE +ASSERT(NOT(PERMAFROZEN(normal_value))) + +ASSERT(NOT(PERMAFREEZE(normal_value))) +ASSERT(PERMAFROZEN(normal_value)) +ASSERT(FROZEN(normal_value)) diff --git a/tests/cases/passing/pow-flt.pre b/tests/cases/passing/pow-flt.pre new file mode 100644 index 0000000..ba615b4 --- /dev/null +++ b/tests/cases/passing/pow-flt.pre @@ -0,0 +1,9 @@ +FLT: left_oct = 0o1.4 +FLT: right_hex = 0x2.0 +FLT: wide_oct = 0o2.0 + +ASSERT(EQ(POW(left_oct, right_hex), 0x2.4)) +ASSERT(EQ(BASE(POW(left_oct, right_hex)), 0d16)) + +ASSERT(EQ(POW(wide_oct, 0x3.0), 0x8.0)) +ASSERT(EQ(BASE(POW(wide_oct, 0x3.0)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/pow-int.pre b/tests/cases/passing/pow-int.pre new file mode 100644 index 0000000..b8e28a5 --- /dev/null +++ b/tests/cases/passing/pow-int.pre @@ -0,0 +1,9 @@ +INT: two = 0d2 +INT: three = 0b11 +INT: four_hex = 0x4 + +ASSERT(EQ(POW(two, three), 0d8)) +ASSERT(EQ(BASE(POW(two, three)), 0d10)) + +ASSERT(EQ(POW(four_hex, 0d2), 0x10)) +ASSERT(EQ(BASE(POW(four_hex, 0d2)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/prod-flt.pre b/tests/cases/passing/prod-flt.pre new file mode 100644 index 0000000..09c474c --- /dev/null +++ b/tests/cases/passing/prod-flt.pre @@ -0,0 +1,3 @@ +! PROD with two FLT arguments +FLT: result = PROD(0d1.5, 0d2.0) +ASSERT(EQ(result, 0d3.0)) diff --git a/tests/cases/passing/prod-int.pre b/tests/cases/passing/prod-int.pre new file mode 100644 index 0000000..3a00f6a --- /dev/null +++ b/tests/cases/passing/prod-int.pre @@ -0,0 +1,3 @@ +! PROD with three INT arguments +INT: result = PROD(0d2, 0d3, 0d1) +ASSERT(EQ(result, 0d6)) diff --git a/tests/cases/passing/root-flt.pre b/tests/cases/passing/root-flt.pre new file mode 100644 index 0000000..621db0d --- /dev/null +++ b/tests/cases/passing/root-flt.pre @@ -0,0 +1,18 @@ +FLT: exact_hex = 0x64.0 +FLT: exact_dec = 0d64.0 +FLT: zero_hex = 0x0.0 +FLT: negative_odd_dec = -0d27.0 +FLT: root_dec = 0d2.0 +FLT: root_hex = 0x3.0 + +ASSERT(EQ(ROOT(exact_hex, root_dec), 0xA.0)) +ASSERT(ISFLT(ROOT(exact_hex, root_dec))) +ASSERT(EQ(BASE(ROOT(exact_hex, root_dec)), 0d16)) + +ASSERT(EQ(ROOT(exact_dec, root_hex), 0x4.0)) +ASSERT(EQ(BASE(ROOT(exact_dec, root_hex)), 0d16)) + +ASSERT(EQ(ROOT(zero_hex, root_hex), 0x0.0)) +ASSERT(EQ(BASE(ROOT(zero_hex, root_hex)), 0d16)) +ASSERT(EQ(ROOT(negative_odd_dec, root_hex), -0x3.0)) +ASSERT(EQ(BASE(ROOT(negative_odd_dec, root_hex)), 0d16)) diff --git a/tests/cases/passing/root-int.pre b/tests/cases/passing/root-int.pre new file mode 100644 index 0000000..6fc1695 --- /dev/null +++ b/tests/cases/passing/root-int.pre @@ -0,0 +1,19 @@ +INT: exact_hex = 0x64 +INT: floor_dec = 0d17 +INT: zero_hex = 0x0 +INT: unit_hex = 0x1 +INT: root_dec = 0d2 +INT: root_hex = 0x2 +INT: neg_one_dec = -0d1 + +ASSERT(EQ(ROOT(exact_hex, root_dec), 0xA)) +ASSERT(ISINT(ROOT(exact_hex, root_dec))) +ASSERT(EQ(BASE(ROOT(exact_hex, root_dec)), 0d16)) + +ASSERT(EQ(ROOT(floor_dec, root_hex), 0x4)) +ASSERT(EQ(BASE(ROOT(floor_dec, root_hex)), 0d16)) + +ASSERT(EQ(ROOT(zero_hex, 0d5), 0x0)) +ASSERT(EQ(BASE(ROOT(zero_hex, 0d5)), 0d16)) +ASSERT(EQ(ROOT(unit_hex, neg_one_dec), 0x1)) +ASSERT(EQ(BASE(ROOT(unit_hex, neg_one_dec)), 0d16)) diff --git a/tests/cases/passing/round.pre b/tests/cases/passing/round.pre new file mode 100644 index 0000000..3e0d4b8 --- /dev/null +++ b/tests/cases/passing/round.pre @@ -0,0 +1,27 @@ +! ROUND coverage based on the specification + +FLT: r_half = 0b0.101 +ASSERT(EQ(ROUND(r_half), 0b0.0)) +ASSERT(EQ(ROUND(r_half, mode = "floor", ndigits = 0b10), 0b0.10)) +ASSERT(EQ(ROUND(r_half, ndigits = 0b10), 0b0.10)) +ASSERT(EQ(ROUND(r_half, mode = "ceiling", ndigits = 0b10), 0b0.11)) +ASSERT(EQ(ROUND(r_half, mode = "ceil", ndigits = 0b10), 0b0.11)) +ASSERT(EQ(ROUND(r_half, mode = "zero", ndigits = 0b10), 0b0.10)) +ASSERT(EQ(ROUND(r_half, mode = "logical", ndigits = 0b10), 0b0.11)) +ASSERT(EQ(ROUND(r_half, mode = "half-up", ndigits = 0b10), 0b0.11)) +ASSERT(EQ(ROUND(0b0.101, 0b10), 0b0.10)) + +FLT: rn_half = -0b0.101 +ASSERT(EQ(ROUND(rn_half, ndigits = 0b10), -0b0.11)) +ASSERT(EQ(ROUND(rn_half, mode = "zero", ndigits = 0b10), -0b0.10)) +ASSERT(EQ(ROUND(rn_half, mode = "logical", ndigits = 0b10), -0b0.11)) + +FLT: three = 0b11.0 +ASSERT(EQ(ROUND(three, ndigits = -0b1), 0b10.0)) +ASSERT(EQ(ROUND(three, mode = "logical", ndigits = -0b1), 0b100.0)) +ASSERT(EQ(ROUND(three, -0b1), 0b10.0)) + +FLT: neg_three = -0b11.0 +ASSERT(EQ(ROUND(neg_three, ndigits = -0b1), -0b100.0)) +ASSERT(EQ(ROUND(neg_three, mode = "zero", ndigits = -0b1), -0b10.0)) +ASSERT(EQ(ROUND(neg_three, mode = "logical", ndigits = -0b1), -0b100.0)) \ No newline at end of file diff --git a/tests/cases/passing/shl.pre b/tests/cases/passing/shl.pre new file mode 100644 index 0000000..f371adb --- /dev/null +++ b/tests/cases/passing/shl.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(SHL(0b101, 0b10), 0b10100)) +ASSERT(EQ(BASE(SHL(0b101, 0b10)), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/shr.pre b/tests/cases/passing/shr.pre new file mode 100644 index 0000000..8f3c386 --- /dev/null +++ b/tests/cases/passing/shr.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(SHR(0b10100, 0b10), 0b101)) +ASSERT(EQ(BASE(SHR(0b10100, 0b10)), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/signature.pre b/tests/cases/passing/signature.pre new file mode 100644 index 0000000..da0c2f6 --- /dev/null +++ b/tests/cases/passing/signature.pre @@ -0,0 +1,19 @@ +INT: sample_value = 0d5 + +FUNC INT: plain(INT: left, STR: right = "def"){ + RETURN(left) +} + +FUNC INT: coerced(~INT: value, STR: suffix = "x"){ + RETURN(value) +} + +FUNC STR: local_signature(){ + INT: inner_value = 0d1 + RETURN(SIGNATURE(inner_value)) +} + +ASSERT(EQ(SIGNATURE(sample_value), 'INT: sample_value')) +ASSERT(EQ(SIGNATURE(plain), 'INT: plain(INT: left, STR: right = "def")')) +ASSERT(EQ(SIGNATURE(coerced), 'INT: coerced(~INT: value, STR: suffix = "x")')) +ASSERT(EQ(local_signature(), 'INT: inner_value')) diff --git a/tests/cases/passing/slen.pre b/tests/cases/passing/slen.pre new file mode 100644 index 0000000..0e19438 --- /dev/null +++ b/tests/cases/passing/slen.pre @@ -0,0 +1,6 @@ +ASSERT(EQ(SLEN(""), 0d0)) +ASSERT(EQ(SLEN("prefix"), 0d6)) +ASSERT(EQ(SLEN("\u0041"), 0d1)) +ASSERT(EQ(SLEN("\u00E9"), 0d1)) +ASSERT(EQ(SLEN("\U0001F600"), 0d1)) +ASSERT(EQ(SLEN("\u0041\u00E9"), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/slice-int-type.pre b/tests/cases/passing/slice-int-type.pre new file mode 100644 index 0000000..cc57f77 --- /dev/null +++ b/tests/cases/passing/slice-int-type.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(TYPE(SLICE(0d12345, 0d2, 0d4)), "INT")) +ASSERT(EQ(TYPE(SLICE(0b1101, 0d1, 0d2)), "INT")) diff --git a/tests/cases/passing/slice-str-basic.pre b/tests/cases/passing/slice-str-basic.pre new file mode 100644 index 0000000..f300ae8 --- /dev/null +++ b/tests/cases/passing/slice-str-basic.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(TYPE(SLICE("abcdef", 0d1, 0d3)), "STR")) +ASSERT(EQ(SLICE("abcdef", 0d1, 0d3), "abc")) +ASSERT(EQ(SLICE("abcdef", 0d1, 0d6), "abcdef")) diff --git a/tests/cases/passing/slice-str-negative.pre b/tests/cases/passing/slice-str-negative.pre new file mode 100644 index 0000000..5ac4596 --- /dev/null +++ b/tests/cases/passing/slice-str-negative.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(SLICE("abcdef", -0d2, -0d1), "ef")) +ASSERT(EQ(SLICE("abcdef", 0d1, -0d1), "abcdef")) diff --git a/tests/cases/passing/slice-str-single.pre b/tests/cases/passing/slice-str-single.pre new file mode 100644 index 0000000..f1467df --- /dev/null +++ b/tests/cases/passing/slice-str-single.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(SLICE("x", 0d1, 0d1), "x")) +ASSERT(EQ(SLICE("hello", 0d3, 0d3), "l")) diff --git a/tests/cases/passing/statement-using-caret.pre b/tests/cases/passing/statement-using-caret.pre new file mode 100644 index 0000000..8790bde --- /dev/null +++ b/tests/cases/passing/statement-using-caret.pre @@ -0,0 +1,2 @@ +BOOL: ^ +x = TRUE diff --git a/tests/cases/passing/statements-semicolon-delimiter.pre b/tests/cases/passing/statements-semicolon-delimiter.pre new file mode 100644 index 0000000..b2b555d --- /dev/null +++ b/tests/cases/passing/statements-semicolon-delimiter.pre @@ -0,0 +1 @@ +BOOL: x = TRUE ; BOOL: y = FALSE diff --git a/tests/cases/passing/string-bool-context.pre b/tests/cases/passing/string-bool-context.pre new file mode 100644 index 0000000..656e162 --- /dev/null +++ b/tests/cases/passing/string-bool-context.pre @@ -0,0 +1,23 @@ +IF(""){ + ASSERT(FALSE) +} ELSE { + ASSERT(TRUE) +} + +IF(''){ + ASSERT(FALSE) +} ELSE { + ASSERT(TRUE) +} + +IF("x"){ + ASSERT(TRUE) +} ELSE { + ASSERT(FALSE) +} + +IF('x'){ + ASSERT(TRUE) +} ELSE { + ASSERT(FALSE) +} \ No newline at end of file diff --git a/tests/cases/passing/string-escapes-hex.pre b/tests/cases/passing/string-escapes-hex.pre new file mode 100644 index 0000000..588d6c1 --- /dev/null +++ b/tests/cases/passing/string-escapes-hex.pre @@ -0,0 +1,7 @@ +ASSERT(EQ("\x6a", "j")) +ASSERT(EQ("\u00e9", "\U000000E9")) +ASSERT(EQ("\U0000006a", "j")) + +ASSERT(EQ("\x4142", "A42")) +ASSERT(EQ("\u004142", "A42")) +ASSERT(EQ("\U0000004142", "A42")) \ No newline at end of file diff --git a/tests/cases/passing/string-escapes.pre b/tests/cases/passing/string-escapes.pre new file mode 100644 index 0000000..9a92819 --- /dev/null +++ b/tests/cases/passing/string-escapes.pre @@ -0,0 +1,16 @@ +ASSERT(EQ("\\", "\x5C")) +ASSERT(EQ("\"", "\x22")) +ASSERT(EQ("'", "\x27")) +ASSERT(EQ("\a", "\x07")) +ASSERT(EQ("\b", "\x08")) +ASSERT(EQ("\f", "\x0C")) +ASSERT(EQ("\n", "\x0A")) +ASSERT(EQ("\r", "\x0D")) +ASSERT(EQ("\t", "\x09")) +ASSERT(EQ("\v", "\x0B")) +ASSERT(EQ("\e", "\x1B")) +ASSERT(EQ("A", "\x41")) +ASSERT(EQ("A", "\u0041")) +ASSERT(EQ("A", "\U00000041")) +ASSERT(EQ("\u263A", "\U0000263A")) +ASSERT(EQ("\u00E9", "\U000000E9")) \ No newline at end of file diff --git a/tests/cases/passing/string-literals.pre b/tests/cases/passing/string-literals.pre new file mode 100644 index 0000000..5a1f7fa --- /dev/null +++ b/tests/cases/passing/string-literals.pre @@ -0,0 +1,12 @@ +STR: empty_single = '' +STR: empty_double = "" +STR: single = 'alpha' +STR: double = "beta" +STR: mixed_single = 'double "quote"' +STR: mixed_double = "single 'quote'" + +ASSERT(EQ(empty_single, empty_double)) +ASSERT(EQ(single, "alpha")) +ASSERT(EQ(double, 'beta')) +ASSERT(EQ(mixed_single, "double \"quote\"")) +ASSERT(EQ(mixed_double, 'single \'quote\'')) diff --git a/tests/cases/passing/string-raw-mode-toggle.pre b/tests/cases/passing/string-raw-mode-toggle.pre new file mode 100644 index 0000000..4d60d9a --- /dev/null +++ b/tests/cases/passing/string-raw-mode-toggle.pre @@ -0,0 +1,3 @@ +ASSERT(EQ("\R\q", '\\q')) +ASSERT(EQ("\R\\\R", '\\\\')) +ASSERT(EQ("\R\n\R\t", '\\n\t')) \ No newline at end of file diff --git a/tests/cases/passing/string-raw-mode.pre b/tests/cases/passing/string-raw-mode.pre new file mode 100644 index 0000000..8c479e1 --- /dev/null +++ b/tests/cases/passing/string-raw-mode.pre @@ -0,0 +1,3 @@ +ASSERT(EQ("\R\n\t\x41\u0042\U00000043", '\\n\\t\\x41\\u0042\\U00000043')) +ASSERT(EQ("A\R\n\RB", 'A\\nB')) +ASSERT(EQ("\R\n", '\\n')) \ No newline at end of file diff --git a/tests/cases/passing/sub-flt.pre b/tests/cases/passing/sub-flt.pre new file mode 100644 index 0000000..305c135 --- /dev/null +++ b/tests/cases/passing/sub-flt.pre @@ -0,0 +1,9 @@ +FLT: left_oct = 0o1.4 +FLT: right_hex = 0x0.8 +FLT: left_oct_one = 0o1.0 + +ASSERT(EQ(SUB(left_oct_one, right_hex), 0x0.8)) +ASSERT(EQ(BASE(SUB(left_oct_one, right_hex)), 0d16)) + +ASSERT(EQ(SUB(left_oct, right_hex), 0x1.0)) +ASSERT(EQ(BASE(SUB(left_oct, right_hex)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/sub-int.pre b/tests/cases/passing/sub-int.pre new file mode 100644 index 0000000..0165a23 --- /dev/null +++ b/tests/cases/passing/sub-int.pre @@ -0,0 +1,12 @@ +INT: left_dec = 0d2 +INT: right_bin = 0b11 +INT: wide_hex = 0x10 + +ASSERT(EQ(SUB(right_bin, left_dec), 0d1)) +ASSERT(EQ(BASE(SUB(right_bin, left_dec)), 0d10)) + +ASSERT(EQ(SUB(left_dec, right_bin), -0d1)) +ASSERT(EQ(BASE(SUB(left_dec, right_bin)), 0d10)) + +ASSERT(EQ(SUB(wide_hex, left_dec), 0d14)) +ASSERT(EQ(BASE(SUB(wide_hex, left_dec)), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/sum-flt.pre b/tests/cases/passing/sum-flt.pre new file mode 100644 index 0000000..c83e9fb --- /dev/null +++ b/tests/cases/passing/sum-flt.pre @@ -0,0 +1,3 @@ +! SUM with two FLT arguments +FLT: result = SUM(0d1.5, 0d2.5) +ASSERT(EQ(result, 0d4.0)) diff --git a/tests/cases/passing/sum-int.pre b/tests/cases/passing/sum-int.pre new file mode 100644 index 0000000..6d6bcd7 --- /dev/null +++ b/tests/cases/passing/sum-int.pre @@ -0,0 +1,3 @@ +! SUM with three INT arguments +INT: result = SUM(0d1, 0d2, 0d3) +ASSERT(EQ(result, 0d6)) diff --git a/tests/cases/passing/tflt.pre b/tests/cases/passing/tflt.pre new file mode 100644 index 0000000..c562e7f --- /dev/null +++ b/tests/cases/passing/tflt.pre @@ -0,0 +1,10 @@ +TNS: source = [[TRUE, FALSE, 0d7, -0b11, 0d1.75, -0d1.75], ["0d2.5", "-0d3.25", "0d0.5", "INF", "-INF", "NaN"]] +TNS: converted = TFLT(source) +ASSERT(EQ(TYPE(converted), "TNS")) +ASSERT(EQ(converted[0d1], [0d1.0, 0d0.0, 0d7.0, -0d3.0, 0d1.75, -0d1.75])) +ASSERT(EQ(converted[0d2, 0d1], 0d2.5)) +ASSERT(EQ(converted[0d2, 0d2], -0d3.25)) +ASSERT(EQ(converted[0d2, 0d3], 0d0.5)) +ASSERT(EQ(converted[0d2, 0d4], INF)) +ASSERT(EQ(converted[0d2, 0d5], -INF)) +ASSERT(NEQ(converted[0d2, 0d6], converted[0d2, 0d6])) \ No newline at end of file diff --git a/tests/cases/passing/thaw.pre b/tests/cases/passing/thaw.pre new file mode 100644 index 0000000..fa45d0b --- /dev/null +++ b/tests/cases/passing/thaw.pre @@ -0,0 +1,20 @@ +BOOL: thaw_value = TRUE + +ASSERT(NOT(THAW(thaw_value))) +ASSERT(thaw_value) + +ASSERT(NOT(FREEZE(thaw_value))) +ASSERT(FROZEN(thaw_value)) +ASSERT(NOT(THAW(thaw_value))) +ASSERT(NOT(FROZEN(thaw_value))) + +thaw_value = FALSE +ASSERT(EQ(thaw_value, FALSE)) + +BOOL: thaw_undefined_failed = FALSE +TRY{ + THAW(not_declared) +} CATCH { + thaw_undefined_failed = TRUE +} +ASSERT(thaw_undefined_failed) diff --git a/tests/cases/passing/tint.pre b/tests/cases/passing/tint.pre new file mode 100644 index 0000000..ada7abb --- /dev/null +++ b/tests/cases/passing/tint.pre @@ -0,0 +1,4 @@ +TNS: source = [[TRUE, FALSE, 0d7, -0b11, 0d1.75, -0d1.75], ["0x1A", "-0d9", "", "prefix", "0b101", "0d0"]] +TNS: converted = TINT(source) +ASSERT(EQ(TYPE(converted), "TNS")) +ASSERT(EQ(converted, [[0d1, 0d0, 0d7, -0d3, 0d1, -0d1], [0d26, -0d9, 0d0, 0d1, 0d5, 0d0]])) \ No newline at end of file diff --git a/tests/cases/passing/tlen.pre b/tests/cases/passing/tlen.pre new file mode 100644 index 0000000..98af089 --- /dev/null +++ b/tests/cases/passing/tlen.pre @@ -0,0 +1,6 @@ +TNS: tensor = [[[0d1, 0d2, 0d3]], [[0d4, 0d5, 0d6]]] + +ASSERT(EQ(TLEN(tensor, 0b1), 0d2)) +ASSERT(EQ(TLEN(tensor, 0b10), 0d1)) +ASSERT(EQ(TLEN(tensor, 0b11), 0d3)) +ASSERT(EQ(BASE(TLEN(tensor, 0b11)), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/tns-indexing.pre b/tests/cases/passing/tns-indexing.pre new file mode 100644 index 0000000..9a4f41c --- /dev/null +++ b/tests/cases/passing/tns-indexing.pre @@ -0,0 +1,60 @@ +TNS: vec = [0d1, 0d2, 0d3] +TNS: matrix = [[0d1, 0d2], [0d3, 0d4]] +TNS: cube = [[[0d1, 0d2], [0d3, 0d4]], [[0d5, 0d6], [0d7, 0d8]]] + +ASSERT(EQ(vec[0d1], 0d1)) +ASSERT(EQ(vec[0d3], 0d3)) +ASSERT(EQ(vec[-0d1], 0d3)) +ASSERT(EQ(vec[-0d3], 0d1)) + +ASSERT(EQ(matrix[0d1, 0d2], 0d2)) +ASSERT(EQ(matrix[-0d1, -0d1], 0d4)) +ASSERT(EQ(matrix[0d2], [0d3, 0d4])) +ASSERT(EQ(cube[0d2, 0d1], [0d5, 0d6])) +ASSERT(EQ(cube[0d2, 0d2, 0d1], 0d7)) +ASSERT(EQ(cube[0d1], [[0d1, 0d2], [0d3, 0d4]])) +ASSERT(EQ(cube[0d1, *], [[0d1, 0d2], [0d3, 0d4]])) + +ASSERT(EQ(vec[0d1-0d2], [0d1, 0d2])) +ASSERT(EQ(vec[0d2-0d2], 0d2)) +ASSERT(EQ(vec[0d1--0d1], [0d1, 0d2, 0d3])) +ASSERT(EQ(vec[0d0-0d4], [0d1, 0d2, 0d3])) + +ASSERT(EQ(matrix[*, *], matrix)) +ASSERT(EQ(matrix[*, 0d1], [0d1, 0d3])) +ASSERT(EQ(matrix[0d1, *], [0d1, 0d2])) +ASSERT(EQ(matrix[0d1-0d2, 0d1-0d2], matrix)) +ASSERT(EQ(matrix[0d1--0d1, 0d1], [0d1, 0d3])) +ASSERT(EQ(cube[*, 0d2, 0d1], [0d3, 0d7])) + +INT: errors_caught = 0d0 + +TRY { + vec[0d4] +} CATCH(err) { + ASSERT(EQ(err, 'Index out of range')) + ADD(@errors_caught, 0d1) +} + +TRY { + vec[TRUE] +} CATCH(err) { + ASSERT(EQ(err, 'Index expression must evaluate to INT')) + ADD(@errors_caught, 0d1) +} + +TRY { + vec[TRUE-0d1] +} CATCH(err) { + ASSERT(EQ(err, 'Range bounds must be INT')) + ADD(@errors_caught, 0d1) +} + +TRY { + 0d1[0d1] +} CATCH(err) { + ASSERT(EQ(err, "Square-bracket indexing '[...]' is only allowed on TNS values")) + ADD(@errors_caught, 0d1) +} + +ASSERT(EQ(errors_caught, 0d4)) diff --git a/tests/cases/passing/tns-literals-ifs.pre b/tests/cases/passing/tns-literals-ifs.pre new file mode 100644 index 0000000..d9e1faa --- /dev/null +++ b/tests/cases/passing/tns-literals-ifs.pre @@ -0,0 +1,14 @@ +TNS: zero_row = [0d0, 0d0] +TNS: row = [0d1, 0d2] + +IF([FALSE, 0d0, 0d0.0, "", zero_row]){ + ASSERT(FALSE) +} ELSE { + ASSERT(TRUE) +} + +IF([FALSE, 0d0, row]){ + ASSERT(TRUE) +} ELSE { + ASSERT(FALSE) +} diff --git a/tests/cases/passing/tns-literals-matrices.pre b/tests/cases/passing/tns-literals-matrices.pre new file mode 100644 index 0000000..46f5c33 --- /dev/null +++ b/tests/cases/passing/tns-literals-matrices.pre @@ -0,0 +1,7 @@ +TNS: matrix = [[0d1, 0d2], [0d3, 0d4]] +TNS: cube = [[[0d1], [0d2]], [[0d3], [0d4]]] + +ASSERT(EQ(matrix, [[0d1, 0d2], [0d3, 0d4]])) +ASSERT(EQ(matrix[0d1, 0d2], 0d2)) +ASSERT(EQ(matrix[0d2], [0d3, 0d4])) +ASSERT(EQ(cube[0d2, 0d1, 0d1], 0d3)) diff --git a/tests/cases/passing/tns-literals-mixed.pre b/tests/cases/passing/tns-literals-mixed.pre new file mode 100644 index 0000000..7ea5fe2 --- /dev/null +++ b/tests/cases/passing/tns-literals-mixed.pre @@ -0,0 +1,22 @@ +FUNC INT: ID(INT: x){ + RETURN(x) +} + +MAP: sample_map = <"n" = 0d5> +TNS: zero_row = [0d0, 0d0] +TNS: row = [0d1, 0d2] +THR(worker){} + +TNS: mixed = [TRUE, 0d2, 0d3.5, "four", sample_map, ID, worker, row] + +ASSERT(EQ(mixed[0d1], TRUE)) +ASSERT(EQ(mixed[0d2], 0d2)) +ASSERT(EQ(mixed[0d3], 0d3.5)) +ASSERT(EQ(mixed[0d4], "four")) +ASSERT(EQ(mixed[0d5]<"n">, 0d5)) +ASSERT(EQ(mixed[0d6](0d9), 0d9)) +ASSERT(EQ(mixed[0d7], worker)) +ASSERT(EQ(mixed[0d8], row)) + +ASSERT(EQ([row], [row])) +ASSERT(NEQ([row], [[0d1, 0d2]])) diff --git a/tests/cases/passing/try-catch-err.pre b/tests/cases/passing/try-catch-err.pre new file mode 100644 index 0000000..6ca4ca2 --- /dev/null +++ b/tests/cases/passing/try-catch-err.pre @@ -0,0 +1,6 @@ +TRY{ + ASSERT(FALSE) +} CATCH(err) { + ASSERT(EXIST(err)) +} +ASSERT(NOT(EXIST(err))) diff --git a/tests/cases/passing/try-catch.pre b/tests/cases/passing/try-catch.pre new file mode 100644 index 0000000..e13b8d1 --- /dev/null +++ b/tests/cases/passing/try-catch.pre @@ -0,0 +1,10 @@ +TRY{ + ASSERT(TRUE) +} CATCH { + ASSERT(FALSE) +} +TRY{ + ASSERT(FALSE) +} CATCH { + ASSERT(TRUE) +} diff --git a/tests/cases/passing/tstr.pre b/tests/cases/passing/tstr.pre new file mode 100644 index 0000000..d2034d3 --- /dev/null +++ b/tests/cases/passing/tstr.pre @@ -0,0 +1,4 @@ +TNS: source = [[TRUE, FALSE, 0b101, -0d7, 0d1.5, -0d1.5], ["prefix", "", INF, -INF, NaN, 0x1A]] +TNS: converted = TSTR(source) +ASSERT(EQ(TYPE(converted), "TNS")) +ASSERT(EQ(converted, [["TRUE", "FALSE", "0b101", "-0d7", "0d1.5", "-0d1.5"], ["prefix", "", "INF", "-INF", "NaN", "0x1A"]])) \ No newline at end of file diff --git a/tests/cases/passing/type-then-decl-type.pre b/tests/cases/passing/type-then-decl-type.pre new file mode 100644 index 0000000..aa5d2da --- /dev/null +++ b/tests/cases/passing/type-then-decl-type.pre @@ -0,0 +1,2 @@ +BOOL: x +BOOL: x = TRUE diff --git a/tests/cases/passing/type-then-decl.pre b/tests/cases/passing/type-then-decl.pre new file mode 100644 index 0000000..c0f4e53 --- /dev/null +++ b/tests/cases/passing/type-then-decl.pre @@ -0,0 +1,2 @@ +BOOL: x +x = TRUE diff --git a/tests/cases/passing/type.pre b/tests/cases/passing/type.pre new file mode 100644 index 0000000..df11345 --- /dev/null +++ b/tests/cases/passing/type.pre @@ -0,0 +1,21 @@ +BOOL: sample_bool = TRUE +INT: sample_int = 0d1 +FLT: sample_flt = 0d1.5 +STR: sample_str = "prefix" +TNS: sample_tns = [0d1, 0d2] +MAP: sample_map = <"n" = 0d1> + +FUNC INT: sample_func(){ + RETURN(0d1) +} + +THR(sample_thr){} + +ASSERT(EQ(TYPE(sample_bool), "BOOL")) +ASSERT(EQ(TYPE(sample_int), "INT")) +ASSERT(EQ(TYPE(sample_flt), "FLT")) +ASSERT(EQ(TYPE(sample_str), "STR")) +ASSERT(EQ(TYPE(sample_tns), "TNS")) +ASSERT(EQ(TYPE(sample_map), "MAP")) +ASSERT(EQ(TYPE(sample_func), "FUNC")) +ASSERT(EQ(TYPE(sample_thr), "THR")) diff --git a/tests/cases/passing/upper.pre b/tests/cases/passing/upper.pre new file mode 100644 index 0000000..a4d2c49 --- /dev/null +++ b/tests/cases/passing/upper.pre @@ -0,0 +1,4 @@ +ASSERT(EQ(TYPE(UPPER("prefix")), "STR")) +ASSERT(EQ(UPPER("prefix"), "PREFIX")) +ASSERT(EQ(UPPER("Prefix 123!"), "PREFIX 123!")) +ASSERT(EQ(UPPER(""), "")) \ No newline at end of file diff --git a/tests/cases/passing/while.pre b/tests/cases/passing/while.pre new file mode 100644 index 0000000..706c143 --- /dev/null +++ b/tests/cases/passing/while.pre @@ -0,0 +1,5 @@ +INT: c = 0d0 +WHILE(LT(c, 0d10)){ + ADD(@c, 0d1) +} +ASSERT(EQ(c, 0d10)) diff --git a/tests/cases/passing/whitespace.pre b/tests/cases/passing/whitespace.pre new file mode 100644 index 0000000..9e10b3e --- /dev/null +++ b/tests/cases/passing/whitespace.pre @@ -0,0 +1,7 @@ +BOOL : x = TRUE +BOOL: x = TRUE +BOOL :x = TRUE +BOOL:x = TRUE +BOOL: x= TRUE +BOOL: x =TRUE +BOOL: x=TRUE diff --git a/tests/cases/passing/xor.pre b/tests/cases/passing/xor.pre new file mode 100644 index 0000000..94d757d --- /dev/null +++ b/tests/cases/passing/xor.pre @@ -0,0 +1,2 @@ +ASSERT(NOT(XOR(FALSE, FALSE))) +ASSERT(XOR(TRUE, FALSE)) diff --git a/tests/cases/passing/zero-and-one-in-ident.pre b/tests/cases/passing/zero-and-one-in-ident.pre new file mode 100644 index 0000000..fcade79 --- /dev/null +++ b/tests/cases/passing/zero-and-one-in-ident.pre @@ -0,0 +1,2 @@ +BOOL: x0 = TRUE +BOOL: x1 = FALSE diff --git a/tests/ext_import.pre b/tests/ext_import.pre deleted file mode 100644 index ba908e5..0000000 --- a/tests/ext_import.pre +++ /dev/null @@ -1,9 +0,0 @@ -EXTEND(EXTENSION: test_ext) - -FUNC INT: CALL_PING(){ - RETURN(test_ext.PING()) -} - -FUNC INT: CALL_ASMODULE_ONLY_PING(){ - RETURN(ASMODULE_ONLY_PING()) -} diff --git a/tests/mod.pre b/tests/mod.pre deleted file mode 100644 index 93ca031..0000000 --- a/tests/mod.pre +++ /dev/null @@ -1,9 +0,0 @@ -INT: sym = 0b101 - -FUNC INT: FUN(){ - RETURN(0b0) -} - -FUNC INT: SET_ZERO(INT: target){ - target = 0d0 -} diff --git a/tests/test.ps1 b/tests/test.ps1 new file mode 100644 index 0000000..4996bf0 --- /dev/null +++ b/tests/test.ps1 @@ -0,0 +1,113 @@ +$testDir = $PSScriptRoot +$prefixDir = Split-Path -Parent $testDir +$casesDir = Join-Path $testDir 'cases' +$exePath = Join-Path $prefixDir 'prefix.exe' + +function Assert([bool]$Condition, [string]$Message = 'Assertion failed') { + if (-not $Condition) { + throw $Message + } +} + +function Invoke-TestCase([string]$RelativePath) { + $casePath = Join-Path $casesDir $RelativePath + Assert (Test-Path $casePath) "Test case not found: $RelativePath" + + $extension = [IO.Path]::GetExtension($casePath) + $output = @() + + if ($extension -ieq '.ps1') { + $powerShellExe = if ($PSVersionTable.PSEdition -eq 'Core') { + Join-Path $PSHOME 'pwsh.exe' + } else { + Join-Path $PSHOME 'powershell.exe' + } + Assert (Test-Path $powerShellExe) "PowerShell executable not found at: $powerShellExe" + + $powerShellCommand = "& { `$ErrorActionPreference = 'Stop'; & `$args[0] }" + $output = & $powerShellExe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command $powerShellCommand $casePath 2>&1 + } else { + $output = & $exePath $casePath 2>&1 + } + + $exitCode = [int]$LASTEXITCODE + + return [pscustomobject]@{ + ExitCode = $exitCode + Output = (($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine) + } +} + +$passingDir = Join-Path $casesDir 'passing' +$passingCases = @() +if (Test-Path $passingDir) { + $passingCases = Get-ChildItem -Path $passingDir -File | Where-Object { $_.Extension -in '.pre', '.ps1' } | Sort-Object Name | ForEach-Object { Join-Path 'passing' $_.Name } +} else { + Write-Host "Warning: passing cases directory not found: $passingDir" +} + +$failingDir = Join-Path $casesDir 'failing' +$failingCases = @() +if (Test-Path $failingDir) { + $failingCases = Get-ChildItem -Path $failingDir -File | Where-Object { $_.Extension -in '.pre', '.ps1' } | Sort-Object Name | ForEach-Object { Join-Path 'failing' $_.Name } +} else { + Write-Host "Warning: failing cases directory not found: $failingDir" +} + +Assert (Test-Path $exePath) "Interpreter executable not found at: $exePath" +Assert (Test-Path $casesDir) "Test cases directory not found at: $casesDir" + +Write-Host 'Running tests...' + +$failures = @() +$total = 0 + +foreach ($case in $passingCases) { + $total += 1 + $result = Invoke-TestCase $case + Write-Host "==> $($case): " -NoNewline + if ($result.ExitCode -ne 0) { + Write-Host 'fail' -ForegroundColor Red + Write-Host $result.Output -ForegroundColor Red + $failures += [pscustomobject]@{ + Path = $case + Type = 'UnexpectedFailure' + ExitCode = $result.ExitCode + Output = $result.Output + } + } else { + Write-Host 'pass' -ForegroundColor Green + } +} + +foreach ($case in $failingCases) { + $total += 1 + $result = Invoke-TestCase $case + Write-Host "==> $($case): " -NoNewline + if ($result.ExitCode -eq 0) { + Write-Host 'fail' -ForegroundColor Red + $failures += [pscustomobject]@{ + Path = $case + Type = 'UnexpectedSuccess' + ExitCode = $result.ExitCode + Output = $result.Output + } + } else { + Write-Host 'pass' -ForegroundColor Green + } +} + +Write-Host '' +if ($failures.Count -gt 0) { + Write-Host 'FAILURES:' -ForegroundColor Red + foreach ($f in $failures) { + Write-Host " - $($f.Path): $($f.Type) (ExitCode: $($f.ExitCode))" + if ($f.Output) { Write-Host $f.Output -ForegroundColor Red} + } + Write-Host '' + Write-Host "Completed with $($total - $failures.Count)/$($total) tests passing, $($failures.Count)/$($total) tests failing." -ForegroundColor Red + exit 1 +} else { + Write-Host "Completed with $($total)/$($total) tests passing, 0/$($total) tests failing." -ForegroundColor Green + exit 0 +} diff --git a/tests/test2.pre b/tests/test2.pre deleted file mode 100644 index f4287b1..0000000 --- a/tests/test2.pre +++ /dev/null @@ -1,1430 +0,0 @@ -PRINT("=== Testing built-ins... ===\n") - -! --- Literal formats --- -PRINT("Testing literals...") -INT: i0 = 0b0 -INT: i1 = 0b1 -INT: i5 = 0b101 ! 5 -INT: i_neg = -0b101 ! -5 (signed literal) -ASSERT(NOT(i0)) -ASSERT(EQ(i1, 0b1)) -ASSERT(EQ(i5, 0b101)) -ASSERT(EQ(i_neg, -0b101)) -DEL(i0) -DEL(i1) -DEL(i5) -DEL(i_neg) -INT: err = 0b0 -TRY{ - nonex.foo = 0b1 ! should raise an error - INT: err = 0b1 -} CATCH {} -ASSERT(NOT(err)) -ASSERT(EQ(BASE(ADD(0b1, 0x1)), 0d16)) ! mixing bases uses the largest base -ASSERT(NOT(err)) - -PRINT("Literals: PASS\n") - -PRINT("Testing booleans...") -BOOL: b_true = TRUE -BOOL: b_false = FALSE -ASSERT(b_true) -ASSERT(NOT(b_false)) -ASSERT(ISBOOL(b_true)) -ASSERT(NOT(ISBOOL(0d1))) -ASSERT(EQ(TYPE(b_true), "BOOL")) -ASSERT(EQ(STR(b_true), "TRUE")) -ASSERT(EQ(STR(b_false), "FALSE")) -ASSERT(EQ(INT(b_true), 0b1)) -ASSERT(EQ(INT(b_false), 0b0)) -ASSERT(EQ(FLT(b_true), 0b1.0)) -ASSERT(EQ(FLT(b_false), 0b0.0)) -ASSERT(BOOL("non-empty")) -ASSERT(NOT(BOOL(""))) -FUNC BOOL: BOOL_DEFAULT(){ } -ASSERT(NOT(BOOL_DEFAULT())) -DEL(BOOL_DEFAULT) -DEL(b_true) -DEL(b_false) -PRINT("Booleans: PASS\n") - -! Floating-point binary fixed-point forms -PRINT("Testing floats...") -FLT: f_half = 0b0.1 ! 0.5 -FLT: f_quarter = 0b0.01 ! 0.25 -FLT: f_threeq = 0b0.11 ! 0.75 -ASSERT(EQ(ADD(f_half, f_quarter), f_threeq)) -DEL(f_half) -DEL(f_quarter) -DEL(f_threeq) -PRINT("Floats: PASS\n") - -PRINT("Testing INF/NaN literals and conversions...") -FLT: f_inf = INF -FLT: f_ninf = -INF -FLT: f_nan = NaN -ASSERT(ISFLT(f_inf)) -ASSERT(ISFLT(f_ninf)) -ASSERT(ISFLT(f_nan)) - -ASSERT(EQ(f_inf, INF)) -ASSERT(EQ(f_ninf, -INF)) -ASSERT(NEQ(f_nan, NaN)) ! NaN is not equal to itself - -TNS: tflts = TFLT(["INF", "-INF", "NaN"]) -ASSERT(ISFLT(tflts[0d1])) -ASSERT(ISFLT(tflts[0d2])) -ASSERT(ISFLT(tflts[0d3])) -ASSERT(EQ(tflts[0d1], INF)) -ASSERT(EQ(tflts[0d2], -INF)) -ASSERT(NEQ(tflts[0d3], NaN)) -DEL(tflts) -DEL(f_inf) -DEL(f_ninf) -DEL(f_nan) -PRINT("INF/NaN: PASS\n") - -! String literals -PRINT("Testing strings...") -STR: s1 = "Hello, World!" -ASSERT(EQ(SLEN(s1), 0d13)) -STR: s2 = "test" -ASSERT(EQ(UPPER(s2), "TEST")) -ASSERT(EQ(LOWER("TEST"), "test")) -DEL(s1) -DEL(s2) -PRINT("Strings: PASS\n") - -! Tensor literals -PRINT("Testing tensors...") -TNS: t = [[0d1, 0d2], [0d3, 0d4]] -ASSERT(t[0d1, 0d2]) -ASSERT(EQ(t[0d1, 0d1-0d2], [0d1, 0d2])) -ASSERT(EQ(t[*, *], t)) -ASSERT(EQ(t[*, 0d1], [0d1, 0d3])) -ASSERT(EQ(t[0d1-0d2, 0d1-0d2], t[*, *])) -ASSERT(EQ(t[0d1--0d1, 0d1], [0d1, 0d3])) -ASSERT(ISTNS(t)) -ASSERT(NOT(ISTNS(0d5))) -DEL(t) -PRINT("Tensors: PASS\n") - -PRINT("Testing slice indexing...") -TNS: t = [0d1, 0d2, 0d3] -t[0d1-0d2] = [0d4, 0d5] -ASSERT(EQ(t, [0d4, 0d5, 0d3])) -ASSERT(EQ(t[0d1-0d2], [0d4, 0d5])) -ASSERT(EQ(t[0d1--0d1], [0d4, 0d5, 0d3])) -t[*] = [0d6, 0d7, 0d8] -ASSERT(EQ(t, [0d6, 0d7, 0d8])) -ASSERT(EQ(t[*], [0d6, 0d7, 0d8])) -DEL(t) -PRINT("Slice indexing: PASS\n") - -PRINT("Testing PAUSE/RESUME/PAUSED...") -! Use a deterministic handshake: worker sets `pause_started` and -! waits for `pause_go` to be set. Main waits for `pause_started`, then -! PAUSE/RESUME and sets `pause_go` so the worker can finish. This -! removes any timing/race reliance on loop duration. -INT: pause_started = 0d0 -INT: pause_go = 0d0 -THR: pause_thr = ASYNC{ - pause_started = 0d1 - WHILE(EQ(pause_go, 0d0)){ - ! busy-wait; cooperative pause point - } -} - -! wait for the worker to start (with a small timeout) -INT: waited_p = 0d0 -WHILE(NEQ(pause_started, 0d1)){ - waited_p = ADD(waited_p, 0d1) - IF(GT(waited_p, 0d11390)){ BREAK(0d1) } -} - -IF(pause_thr){ - ASSERT(NOT(PAUSED(pause_thr))) - INT: pause_ok = 0d0 - TRY{ - PAUSE(pause_thr) - pause_ok = 0d1 - }CATCH{} - IF(pause_ok){ - ASSERT(PAUSED(pause_thr)) - ! set the flag so the worker can proceed once resumed - pause_go = 0d1 - RESUME(pause_thr) - ASSERT(NOT(PAUSED(pause_thr))) - } - AWAIT(pause_thr) - DEL(pause_ok) -}ELSE{ - ASSERT(NOT(PAUSED(pause_thr))) - TRY{ - PAUSE(pause_thr) - ASSERT(0d0) - }CATCH{} - TRY{ - RESUME(pause_thr) - ASSERT(0d0) - }CATCH{} -} -DEL(pause_started) -DEL(pause_go) -DEL(pause_thr) -DEL(waited_p) -PRINT("PAUSE/RESUME/PAUSED: PASS\n") - -! --- FOR counter scope tests (regression gh-75) --- -FOR(i, 0b1) { } -ASSERT(NOT(EXIST(i))) - -INT: j = 0b101 -FOR(j, 0b10) { } -ASSERT(EQ(j, 0b101)) -DEL(j) - -! Regression test for GH-66: ASYNC argument execution must be deferred -! until STOP/PAUSE call evaluation completes. -PRINT("Testing deferred ASYNC in STOP/PAUSE (regression GH-66)...") - -INT: gh66_stop_flag = 0d0 -THR: gh66_stop_thr = STOP(ASYNC{ - gh66_stop_flag = 0d1 -}) -INT: gh66_wait = 0d0 -WHILE(LT(gh66_wait, 0d11390)){ - IF(EQ(gh66_stop_flag, 0d1)){ BREAK(0d1) } - gh66_wait = ADD(gh66_wait, 0d1) -} -ASSERT(EQ(gh66_stop_flag, 0d0)) -DEL(gh66_stop_thr) -DEL(gh66_stop_flag) -DEL(gh66_wait) - -INT: gh66_pause_flag = 0d0 -INT: gh66_pause_go = 0d0 -THR: gh66_pause_thr = PAUSE(ASYNC{ - gh66_pause_flag = 0d1 - WHILE(EQ(gh66_pause_go, 0d0)){ - ! busy-wait until main resumes and releases this worker - } -}) -INT: gh66_wait2 = 0d0 -WHILE(LT(gh66_wait2, 0d11390)){ - IF(EQ(gh66_pause_flag, 0d1)){ BREAK(0d1) } - gh66_wait2 = ADD(gh66_wait2, 0d1) -} -ASSERT(EQ(gh66_pause_flag, 0d0)) -ASSERT(PAUSED(gh66_pause_thr)) -gh66_pause_go = 0d1 -RESUME(gh66_pause_thr) -AWAIT(gh66_pause_thr) -ASSERT(EQ(gh66_pause_flag, 0d1)) -DEL(gh66_pause_thr) -DEL(gh66_pause_flag) -DEL(gh66_pause_go) -DEL(gh66_wait2) - -PRINT("Deferred ASYNC STOP/PAUSE: PASS\n") - -PRINT("Testing maps...") -! Simple map literal and lookup -MAP: m = <"foo" = 0d5, "bar" = 0d10, "nested" = <"a" = 0d1, "b" = 0d2>> -ASSERT(EQ(m<"foo">, 0d5)) -ASSERT(EQ(m<"bar">, 0d10)) -ASSERT(EQ(m<"nested", "a">, 0d1)) -ASSERT(EQ(m<"nested", "b">, 0d2)) -! Missing key should raise an error -INT: map_missing_err = 0d0 -TRY{ - m<"nope"> -}CATCH{ - map_missing_err = 0d1 -} -ASSERT(EQ(map_missing_err, 0d1)) -PRINT("Maps: PASS\n") - -! Regression test for GH-61: ensure DEL works on map index targets -PRINT("Testing DEL on map indexing (regression GH-61)...") -MAP: reg = <"foo" = 0d1, "bar" = 0d2, "nested" = <"a" = 0d10>> -ASSERT(EQ(reg<"foo">, 0d1)) -DEL(reg<"foo">) -ASSERT(NOT(KEYIN("foo", reg))) -INT: reg_missing_err = 0d0 -TRY{ - reg<"foo"> -}CATCH{ - reg_missing_err = 0d1 -} -ASSERT(EQ(reg_missing_err, 0d1)) -! Deleting nested key -DEL(reg<"nested", "a">) -ASSERT(NOT(KEYIN("a", reg<"nested">))) -DEL(reg) -PRINT("DEL map-index: PASS\n") - -! Additional map builtins tests -ASSERT(KEYIN("foo", m)) -ASSERT(NOT(KEYIN("nope", m))) -ASSERT(VALUEIN(0d5, m)) -ASSERT(NOT(VALUEIN(0d8, m))) - -! uniform map for KEYS/VALUES/INV -MAP: m2 = <"a" = 0d5, "b" = 0d10> -ASSERT(EQ(KEYS(m2), ["a", "b"])) -ASSERT(EQ(VALUES(m2), [0d5, 0d10])) - -MAP: m3 = <"a" = 0d1, "b" = SELF<"a">, "c" = SELF> -ASSERT(EQ(m3<"b">, 0d1)) -ASSERT(EQ(m3, m3<"c">)) -DEL(m3) - -! Regression test for GH-98: SELF in map-indexed calls -MAP: method_map = <"n" = 0d1, "inc" = LAMBDA INT: (){ SELF<"n"> = ADD(SELF<"n">, 0d1); RETURN(SELF<"n">) }> -MAP: method_copy = method_map -MAP: method_alias = @method_map -ASSERT(EQ(method_copy<"inc">(), 0d2)) -ASSERT(EQ(method_copy<"n">, 0d1)) -ASSERT(EQ(method_map<"n">, 0d1)) -ASSERT(EQ(method_alias<"inc">(), 0d2)) -ASSERT(EQ(method_map<"n">, 0d2)) -ASSERT(EQ(method_copy<"n">, 0d1)) -DEL(method_copy) -DEL(method_alias) -DEL(method_map) - -! Pointer tests -PRINT("Testing pointers...") -INT: x = 0d1 -INT: y = @x -ADD(@x, 0d1) -ASSERT(EQ(x, 0d2)) -ASSERT(EQ(y, 0d2)) -INT: z = 0d2 -ADD(0d1, @z) -ASSERT(EQ(z, 0d3)) -ADD(@y, 0d1) -ASSERT(EQ(x, 0d3)) -ASSERT(EQ(y, 0d3)) -TRY{ - INT: x = @y ! circular reference should fail - ASSERT(0d0) -}CATCH{} -FREEZE(x) -FREEZE(y) -TRY{ - y = @x - ASSERT(0d0) -}CATCH{} -THAW(x) -THAW(y) -DEL(x) -DEL(y) -DEL(z) -PRINT("Pointers: PASS\n") - -PRINT("Testing pointer arguments...") -INT: ptr_arg = 0d5 -FUNC INT: SET_ZERO(INT: target){ - target = 0d0 -} -SET_ZERO(@ptr_arg) -ASSERT(EQ(ptr_arg, 0d0)) -DEL(ptr_arg) -PRINT("Pointer arguments: PASS\n") - -PRINT("Testing ASSIGN inline operator...") -! typed first assignment should declare, assign, and return the value -ASSERT(EQ(ASSIGN(STR: as_s, "foo"), "foo")) -ASSERT(EQ(as_s, "foo")) -DEL(as_s) - -! simple identifier assignment (target must already exist) -INT: as_a = 0d0 -ASSIGN(as_a, 0d5) -ASSERT(EQ(as_a, 0d5)) -DEL(as_a) - -! indexed assignment via ASSIGN -TNS: atns = [0d1, 0d2, 0d3] -ASSIGN(atns[0d1], 0d5) -ASSERT(EQ(atns[0d1], 0d5)) -DEL(atns) -PRINT("ASSIGN: PASS\n") - -! MATCH tests -MAP: tpl = <"foo" = 0d5> -ASSERT(MATCH(m, tpl)) -! typing enforcement: wrong type should fail when typing=1 -MAP: tpl2 = <"foo" = "0d101"> -ASSERT(NOT(MATCH(m, tpl2, 0d1))) -! recurse: template nested matches nested map -MAP: tpl3 = <"nested" = <"a" = 0d1>> -ASSERT(MATCH(m, tpl3, 0d0, 0d1)) - -! INV (invert m2) -MAP: invm2 = INV(m2) -ASSERT(EQ(invm2<0d5>, "a")) -ASSERT(EQ(invm2<0d10>, "b")) -DEL(m2) -DEL(tpl) -DEL(tpl2) -DEL(tpl3) -DEL(invm2) - -! --- COPY / DEEPCOPY --- -PRINT("Testing COPY/DEEPCOPY...") -! shallow vs deep copy for nested maps -MAP: inner = <"x" = 0d2> -MAP: outer = <"a" = 0d5, "b" = inner> -MAP: outer_sh = COPY(outer) -MAP: outer_dp = DEEPCOPY(outer) -outer<"b"><"x"> = 0d3 -ASSERT(EQ(outer<"b"><"x">, 0d3)) -ASSERT(EQ(outer_sh<"b"><"x">, 0d3)) -ASSERT(EQ(outer_dp<"b"><"x">, 0d2)) -DEL(outer) -DEL(outer_sh) -DEL(outer_dp) -PRINT("COPY/DEEPCOPY: PASS\n") - - -! --- TNS operator --- -PRINT("Testing TNS operator...") -! string -> 1-D tensor of single-character STRs -ASSERT(EQ(TNS("foo"), ["f","o","o"])) -! shape + value -> filled tensor -TNS: shp = [0d2] ! shape [2] -> length 2 -ASSERT(EQ(TNS(shp, 0d5), [0d5, 0d5])) -DEL(shp) -PRINT("TNS operator: PASS\n") - -! --- TINT / TFLT / TSTR --- -PRINT("Testing TINT/TFLT/TSTR...") -TNS: strnums = ["0b101", "0b0", ""] -TNS: as_ints = TINT(strnums) -ASSERT(EQ(as_ints[0d1], 0d5)) -ASSERT(EQ(as_ints[0d2], 0d0)) -ASSERT(EQ(as_ints[0d3], 0d0)) -TNS: as_flts = TFLT(["0b0.1", "0b1.0", "0b10.0"]) ! 0.5,1.0,2.0 -ASSERT(EQ(as_flts[0d1], 0b0.1)) -ASSERT(EQ(as_flts[0d2], 0b1.0)) -ASSERT(EQ(as_flts[0d3], 0b10.0)) -TNS: as_strs = TSTR([0d1, 0d2, 0d3]) -ASSERT(EQ(as_strs[0d1], "0d1")) -ASSERT(EQ(as_strs[0d2], "0d2")) -ASSERT(EQ(as_strs[0d3], "0d3")) -DEL(strnums) -DEL(as_ints) -DEL(as_flts) -DEL(as_strs) -PRINT("TINT/TFLT/TSTR: PASS\n") - -! --- CONV --- -PRINT("Testing CONV...") -! Simple 1-D identity kernel -TNS: c_in = [0d1, 0d2, 0d3] -TNS: c_k = [0d1] -ASSERT(EQ(CONV(c_in, c_k), c_in)) -DEL(c_in) -DEL(c_k) - -! Simple 2-D identity kernel -TNS: img = [[0d1, 0d2], [0d3, 0d4]] -TNS: k2 = [[0d1]] -ASSERT(EQ(CONV(img, k2), img)) -DEL(img) -DEL(k2) -PRINT("CONV: PASS\n") - -! --- FILL operator --- -PRINT("Testing FILL...") -TNS: base_fill = [0d1, 0d2, 0d3] -TNS: filled = FILL(base_fill, 0d0) -ASSERT(EQ(filled[0d1], 0d0)) -ASSERT(EQ(filled[0d2], 0d0)) -ASSERT(EQ(filled[0d3], 0d0)) -DEL(base_fill) -DEL(filled) -PRINT("FILL: PASS\n") - -! --- SHAPE / TLEN / TFLIP --- -PRINT("Testing SHAPE/TLEN/TFLIP...") -TNS: t2 = [[0d1, 0d2], [0d3, 0d4]] -ASSERT(EQ(SHAPE(t2), [0d2, 0d2])) -ASSERT(EQ(TLEN(t2, 0d1), 0d2)) -ASSERT(EQ(TLEN(t2, 0d2), 0d2)) -ASSERT(EQ(TFLIP(t2, 0d1), [[0d3, 0d4], [0d1, 0d2]])) -ASSERT(EQ(TFLIP(t2, 0d2), [[0d2, 0d1], [0d4, 0d3]])) -DEL(t2) -PRINT("SHAPE/TLEN/TFLIP: PASS\n") - -! --- SCAT --- -PRINT("Testing SCAT...") -TNS: dst_scat = [[0d0,0d0,0d0],[0d0,0d0,0d0]] -TNS: src_scat = [[0d1, 0d2],[0d3, 0d4]] -TNS: ind_scat = [[0d1, 0d2],[0d1, 0d2]] -ASSERT(EQ(SCAT(src_scat, dst_scat, ind_scat), [[0d1, 0d2, 0d0], [0d3, 0d4, 0d0]])) -DEL(dst_scat) -DEL(src_scat) -DEL(ind_scat) -PRINT("SCAT: PASS\n") - -! --- APPEND operator --- -PRINT("Testing APPEND...") -TNS: a_append = [0d1, 0d2] -TNS: b_append = APPEND(0d3, a_append) -ASSERT(EQ(b_append, [0d1, 0d2, 0d3])) -DEL(a_append) -DEL(b_append) - -TNS: t_append = [0d1, 0d2] -APPEND(0d3, @t_append) -ASSERT(EQ(t_append[0d3], 0d3)) -DEL(t_append) - -TNS: s_append = ["a", "b"] -ASSERT(EQ(APPEND("c", s_append), ["a", "b", "c"])) -DEL(s_append) -PRINT("APPEND: PASS\n") - -! --- Tensor-scalar arithmetic operators --- -PRINT("Testing tensor-scalar arithmetic...") -TNS: ta = [0b1, 0b10] -ASSERT(EQ(TADD(ta, 0b1), [0b10, 0b11])) ! [1,2] + 1 -> [2,3] -ASSERT(EQ(TSUB(ta, 0b1), [0b0, 0b1])) ! [1,2] - 1 -> [0,1] -ASSERT(EQ(TMUL(ta, 0b10), [0b10, 0b100])) ! [1,2] * 2 -> [2,4] -ASSERT(EQ(TDIV(ta, 0b10), [0b0, 0b1])) ! [1,2] / 2 -> [0,1] -ASSERT(EQ(TPOW(ta, 0b10), [0b1, 0b100])) ! [1,2]^2 -> [1,4] -! scalar on left for non-commutative -ASSERT(EQ(TSUB(0b10, ta), [0b1, 0b0])) -DEL(ta) -PRINT("Tensor-scalar arithmetic: PASS\n") - -! --- Matrix (elementwise) arithmetic operators --- -PRINT("Testing matrix (elementwise) arithmetic...") -TNS: t1 = [[0b1, 0b10], [0b11, 0b100]] -TNS: t2 = [[0b10, 0b1], [0b100, 0b11]] -ASSERT(EQ(MADD(t1, t2), [[0b11, 0b11], [0b111, 0b111]])) -ASSERT(EQ(MSUB(t1, t2), [[-0b1, 0b1], [-0b1, 0b1]])) -ASSERT(EQ(MMUL(t1, t2), [[0b10, 0b10], [0b1100, 0b1100]])) -ASSERT(EQ(MDIV(t1, t2), [[0b0, 0b10], [0b0, 0b1]])) -DEL(t1) -DEL(t2) -PRINT("Matrix arithmetic: PASS\n") - -! --- MSUM / MPROD --- -PRINT("Testing MSUM/MPROD...") -TNS: t1 = [[0b1, 0b10], [0b11, 0b100]] -TNS: t2 = [[0b10, 0b1], [0b100, 0b11]] -TNS: t3 = [[0b1, 0b1], [0b1, 0b1]] -ASSERT(EQ(MSUM(t1, t2, t3), [[0b100, 0b100], [0b1000, 0b1000]])) -ASSERT(EQ(MSUM(t1, t2), [[0b11, 0b11], [0b111, 0b111]])) -ASSERT(EQ(MPROD(t1, t2, t3), [[0b10, 0b10], [0b1100, 0b1100]])) -DEL(t1) -DEL(t2) -DEL(t3) -PRINT("MSUM/MPROD: PASS\n") - -! --- Arithmetic operators --- -PRINT("Testing arithmetic...") -ASSERT(EQ(ADD(0b10, 0b11), 0b101)) ! 2 + 3 = 5 -ASSERT(EQ(SUB(0b101, 0b10), 0b11)) ! 5 - 2 = 3 -ASSERT(EQ(MUL(0b10, 0b11), 0b110)) ! 2 * 3 = 6 -ASSERT(EQ(DIV(0b110, 0b10), 0b11)) ! 6 / 2 = 3 -ASSERT(EQ(MOD(0b111, 0b10), 0b1)) ! 7 % 2 = 1 -ASSERT(EQ(POW(0b10, 0b11), 0b1000)) ! 2^3 = 8 -ASSERT(EQ(NEG(0b101), -0b101)) ! -5 -ASSERT(EQ(ABS(-0b101), 0b101)) ! 5 -PRINT("Arithmetic: PASS\n") - -! --- Comparison operators --- -PRINT("Testing comparisons...") -ASSERT(EQ(0b10, 0b10)) -ASSERT(NOT(EQ(0b10, 0b11))) -ASSERT(GT(0b11, 0b10)) -ASSERT(LT(0b10, 0b11)) -ASSERT(GTE(0b11, 0b10)) -ASSERT(GTE(0b10, 0b10)) -ASSERT(LTE(0b10, 0b11)) -ASSERT(LTE(0b10, 0b10)) -! NEQ operator tests (GH-49) -ASSERT(NEQ(0b10, 0b11)) ! different integers -> true -ASSERT(NOT(NEQ(0b10, 0b10))) ! equal integers -> false -ASSERT(NEQ("a", "b")) ! different strings -> true -ASSERT(NOT(NEQ("a", "a"))) ! equal strings -> false -ASSERT(NEQ(0b10, "0d10")) ! differing types -> not equal -> true -PRINT("Comparisons: PASS\n") - -! --- Logical operators --- -PRINT("Testing logical ops...") -ASSERT(AND(0b1, 0b1)) -ASSERT(NOT(AND(0b1, 0b0))) -ASSERT(OR(0b1, 0b0)) -ASSERT(OR(0b0, 0b1)) -ASSERT(NOT(OR(0b0, 0b0))) -ASSERT(XOR(0b1, 0b0)) -ASSERT(XOR(0b0, 0b1)) -ASSERT(NOT(XOR(0b1, 0b1))) -ASSERT(NOT(0b0)) -ASSERT(NOT(NOT(0b1))) -PRINT("Logical: PASS\n") - -! --- Bitwise operators --- -PRINT("Testing bitwise ops...") -ASSERT(EQ(BAND(0b111, 0b101), 0b101)) ! 7 & 5 = 5 -ASSERT(EQ(BOR(0b100, 0b10), 0b110)) ! 4 | 2 = 6 -ASSERT(EQ(BXOR(0b111, 0b101), 0b10)) ! 7 ^ 5 = 2 -ASSERT(EQ(SHL(0b1, 0b10), 0b100)) ! 1 << 2 = 4 -ASSERT(EQ(SHR(0b1000, 0b10), 0b10)) ! 8 >> 2 = 2 -PRINT("Bitwise: PASS\n") - -! --- Type conversions --- -PRINT("Testing type conversions...") -ASSERT(EQ(INT(0b0.1), 0b0)) ! FLT->INT truncates -ASSERT(EQ(FLT(0b10), 0b10.0)) ! INT->FLT -ASSERT(EQ(STR(0b101), "0b101")) ! INT->STR -ASSERT(EQ(INT("0b101"), 0b101)) ! STR->INT -ASSERT(EQ(STR(TRUE), "TRUE")) ! BOOL->STR -ASSERT(EQ(INT(FALSE), 0b0)) ! BOOL->INT -ASSERT(EQ(FLT(TRUE), 0b1.0)) ! BOOL->FLT -PRINT("Type conversions: PASS\n") - -! --- BYTES --- -PRINT("Testing BYTES...") -ASSERT(EQ(BYTES(0b0), [0b0])) -ASSERT(EQ(BYTES(0b1), [0b1])) -ASSERT(EQ(BYTES(0b100000000), BYTES(0b100000000, "big"))) -ASSERT(EQ(BYTES(0b100000000), [0b1,0b0])) -ASSERT(EQ(BYTES(0b100000000, "little"), [0b0,0b1])) -PRINT("BYTES: PASS\n") - -! --- Type checking --- -PRINT("Testing type checks...") -BOOL: b1 = TRUE -INT: i1 = 0d5 -FLT: f1 = 0b1.1 -STR: s1 = "test" -ASSERT(ISBOOL(b1)) -ASSERT(NOT(ISBOOL(i1))) -ASSERT(ISINT(i1)) -ASSERT(NOT(ISINT(f1))) -ASSERT(ISFLT(f1)) -ASSERT(NOT(ISFLT(i1))) -ASSERT(ISSTR(s1)) -ASSERT(NOT(ISSTR(i1))) -ASSERT(EQ(TYPE(b1), "BOOL")) -ASSERT(EQ(TYPE(i1), "INT")) -ASSERT(EQ(TYPE(f1), "FLT")) -ASSERT(EQ(TYPE(s1), "STR")) -DEL(b1) -DEL(i1) -DEL(f1) -DEL(s1) -PRINT("Type checks: PASS\n") - -! --- String operations --- -PRINT("Testing string ops...") -STR: s = "Hello, World!" -ASSERT(EQ(SLICE(s, 0d1, 0d5), "Hello")) ! positions 1-5 -ASSERT(EQ(REPLACE(s, "World", "Prefix"), "Hello, Prefix!")) -ASSERT(EQ(STRIP(" test ", " "), "test")) -! FLIP tests (INT and STR) -ASSERT(EQ(FLIP(0b110), 0b11)) ! 6 -> 3 -ASSERT(EQ(FLIP(-0b110), -0b11)) ! -6 -> -3 (sign preserved) -ASSERT(EQ(FLIP(0b0), 0b0)) -ASSERT(EQ(FLIP("abc"), "cba")) -PRINT("String ops: PASS\n") -DEL(s) - -! --- Variadic math --- -PRINT("Testing variadic math...") -ASSERT(EQ(SUM(0b1, 0b10, 0b11), 0b110)) ! 1+2+3 = 6 -ASSERT(EQ(PROD(0b10, 0b11), 0b110)) ! 2*3 = 6 -ASSERT(EQ(MAX(0b1, 0b101, 0b11), 0b101)) ! max(1,5,3) = 5 -ASSERT(EQ(MIN(0b1, 0b101, 0b11), 0b1)) ! min(1,5,3) = 1 -ASSERT(ANY(0b0, 0b0, 0b1)) -ASSERT(NOT(ANY(0b0, 0b0, 0b0))) -ASSERT(ALL(0b1, 0b1, 0b1)) -ASSERT(NOT(ALL(0b1, 0b0, 0b1))) -PRINT("Variadic math: PASS\n") - -! --- MAX/MIN with tensors --- -PRINT("Testing MAX/MIN with tensors...") -TNS: tm1 = [0d1, 0d2, 0d3] -TNS: tm2 = [[0d1, 0d4], [0d3, 0d2]] -ASSERT(EQ(MAX(tm1), 0d3)) -ASSERT(EQ(MIN(tm1), 0d1)) -ASSERT(EQ(MAX(tm2), 0d4)) -ASSERT(EQ(MIN(tm2), 0d1)) - -TNS: ts = ["a", "abcd", "ab"] -ASSERT(EQ(MAX(ts), "abcd")) -ASSERT(EQ(MIN(ts), "a")) -DEL(tm1) -DEL(tm2) -DEL(ts) -PRINT("MAX/MIN with tensors: PASS\n") - -! --- Control flow: IF --- -PRINT("Testing IF...") -INT: result = 0d0 -IF(0d1){ - result = 0d1 -} -ASSERT(EQ(result, 0d1)) - -result = 0d0 -IF(0d0){ - result = 0d1 -}ELSEIF(0d1){ - result = 0d2 -} -ASSERT(EQ(result, 0d2)) - -result = 0d0 -IF(0d0){ - result = 0d1 -}ELSEIF(0d0){ - result = 0d2 -}ELSE{ - result = 0d3 -} -ASSERT(EQ(result, 0d3)) -DEL(result) -PRINT("IF: PASS\n") - -! --- Control flow: WHILE --- -PRINT("Testing WHILE...") -INT: counter = 0d0 -INT: sum = 0d0 -WHILE(LT(counter, 0d5)){ - sum = ADD(sum, counter) - counter = ADD(counter, 0d1) -} -ASSERT(EQ(sum, 0d10)) ! 0+1+2+3+4 = 10 -DEL(counter) -DEL(sum) -PRINT("WHILE: PASS\n") - -! --- Control flow: FOR --- -PRINT("Testing FOR...") -INT: total = 0d0 -FOR(i, 0d4){ ! 4 iterations: 1,2,3,4 - total = ADD(total, i) -} -ASSERT(EQ(total, 0d10)) ! 0+1+2+3+4 = 10 -DEL(total) -PRINT("FOR: PASS\n") - -! --- Control flow: PARFOR --- -PRINT("Testing PARFOR...") -TNS: p = [0d0,0d0,0d0,0d0,0d0] -PARFOR(i, 0d5){ - p[i] = i -} -ASSERT(EQ(p, [0d1,0d2,0d3,0d4,0d5])) -DEL(p) - -INT: caught_pf = 0d0 -TRY{ - PARFOR(j, 0d5){ - IF(EQ(j, 0d2)){ - ASSERT(0d0) ! trigger runtime error in one iteration - } - } -}CATCH(e){ - caught_pf = 0d1 -} -ASSERT(EQ(caught_pf, 0d1)) -DEL(caught_pf) - -TNS: pcont = [0d0,0d0,0d0] -PARFOR(k, 0d3){ - IF(EQ(k, 0d2)){ - CONTINUE() - } - pcont[k] = k -} -ASSERT(EQ(pcont, [0d1,0d0,0d3])) -DEL(pcont) - -INT: pf_outer_hits = 0d0 -FOR(pf_outer, 0d3){ - PARFOR(pf_inner, 0d5){ - BREAK(0d2) - } - pf_outer_hits = ADD(pf_outer_hits, 0d1) -} -ASSERT(EQ(pf_outer_hits, 0d0)) -DEL(pf_outer_hits) -PRINT("PARFOR: PASS\n") - -PRINT("Testing PARFOR indexed assignment serialization (regression GH-91)...") -FOR(pf_rep, 0d16){ - TNS: pf_tns_serial = [0d0,0d0,0d0,0d0,0d0,0d0,0d0,0d0] - PARFOR(pf_idx, 0d8){ - pf_tns_serial[pf_idx] = pf_idx - } - ASSERT(EQ(pf_tns_serial, [0d1,0d2,0d3,0d4,0d5,0d6,0d7,0d8])) - DEL(pf_tns_serial) - - MAP: pf_map_serial = <0d1 = 0d0, 0d2 = 0d0, 0d3 = 0d0, 0d4 = 0d0, 0d5 = 0d0, 0d6 = 0d0, 0d7 = 0d0, 0d8 = 0d0> - PARFOR(pf_key, 0d8){ - pf_map_serial = pf_key - } - ASSERT(EQ(pf_map_serial<0d1>, 0d1)) - ASSERT(EQ(pf_map_serial<0d2>, 0d2)) - ASSERT(EQ(pf_map_serial<0d3>, 0d3)) - ASSERT(EQ(pf_map_serial<0d4>, 0d4)) - ASSERT(EQ(pf_map_serial<0d5>, 0d5)) - ASSERT(EQ(pf_map_serial<0d6>, 0d6)) - ASSERT(EQ(pf_map_serial<0d7>, 0d7)) - ASSERT(EQ(pf_map_serial<0d8>, 0d8)) - DEL(pf_map_serial) -} -PRINT("PARFOR indexed assignment serialization: PASS\n") - -PRINT("Testing PARALLEL...") - -! Simple no-op functions to exercise PARALLEL -FUNC INT: NOOP_A(){ RETURN(0d0) } -FUNC INT: NOOP_B(){ RETURN(0d0) } -FUNC INT: NOOP_C(){ RETURN(0d0) } - -! Variadic form: pass functions as separate args -BOOL: par_res = PARALLEL(NOOP_A, NOOP_B, NOOP_C) -ASSERT(NOT(par_res)) - -! Tensor form: pass a tensor containing functions -TNS: func_tns = [NOOP_A, NOOP_B, NOOP_C] -BOOL: par_res2 = PARALLEL(func_tns) -ASSERT(NOT(par_res2)) - -! Error propagation: a worker that throws should cause PARALLEL to raise -FUNC INT: BAD(){ THROW("boom") } -INT: caught_par = 0d0 -TRY{ - PARALLEL(BAD, NOOP_A) - ASSERT(0d0) -}CATCH(e){ - caught_par = 0d1 -} -ASSERT(EQ(caught_par, 0d1)) - -DEL(par_res) -DEL(par_res2) -DEL(func_tns) -DEL(caught_par) -PRINT("PARALLEL: PASS\n") - -! --- Control flow: BREAK --- -PRINT("Testing BREAK...") -INT: count = 0d0 -WHILE(0d1){ - count = ADD(count, 0d1) - IF(EQ(count, 0d11)){ - BREAK(0d1) - } -} -ASSERT(EQ(count, 0d11)) ! broke at 11 -DEL(count) -PRINT("BREAK: PASS\n") - -! --- Control flow: CONTINUE --- -PRINT("Testing CONTINUE...") -INT: sum2 = 0d0 -FOR(j, 0d4){ ! 4 iterations - IF(EQ(j, 0d2)){ - CONTINUE() - } - sum2 = ADD(sum2, j) -} -ASSERT(EQ(sum2, 0d8)) ! 0+1+3+4 = 8 (skipped 2) -DEL(sum2) -PRINT("CONTINUE: PASS\n") - -! --- Functions --- -PRINT("Testing functions...") -FUNC INT: ADD_TWO(INT: a, INT: b){ - RETURN(ADD(a, b)) -} -ASSERT(EQ(ADD_TWO(0d2, 0d3), 0d5)) ! 2+3=5 - -FUNC INT: FACTORIAL(INT: n){ - IF(LTE(n, 0d1)){ - RETURN(0d1) - } - RETURN(MUL(n, FACTORIAL(SUB(n, 0d1)))) -} -ASSERT(EQ(FACTORIAL(0d5), 0d120)) ! 5! = 120 - -! Function with default argument -FUNC STR: GREET(STR: name, STR: prefix = "Hello"){ - RETURN(JOIN(" ", prefix, name)) -} -ASSERT(EQ(GREET("World"), "Hello World")) -ASSERT(EQ(GREET("World", prefix = "Hi"), "Hi World")) - -INT: base = 0d1 -FUNC: add_base = LAMBDA INT: (INT: x){ RETURN(ADD(x, base)) } -ASSERT(EQ(add_base(0d1), 0d2)) -base = 0d2 -ASSERT(EQ(add_base(0d1), 0d3)) - -FUNC: greet_lambda = LAMBDA STR: (STR: name, STR: prefix = "Hi"){ RETURN(JOIN(" ", prefix, name)) } -ASSERT(EQ(greet_lambda("World"), "Hi World")) -ASSERT(EQ(greet_lambda("World", prefix = "Hello"), "Hello World")) - -FUNC INT: COERCE_INT(~INT: x){ - RETURN(x) -} -ASSERT(EQ(COERCE_INT("0d10"), 0d10)) - -FUNC: lambda_coerce_int = LAMBDA INT: (~INT: x){ RETURN(x) } -ASSERT(EQ(lambda_coerce_int("0d11"), 0d11)) - -FUNC FLT: NEED_FLT(~FLT: x){ - RETURN(x) -} -INT: coerce_failed = 0d0 -TRY{ - NEED_FLT("not-a-number") -}CATCH{ - coerce_failed = 0d1 -} -ASSERT(EQ(coerce_failed, 0d1)) -DEL(coerce_failed) -DEL(NEED_FLT) -DEL(lambda_coerce_int) -DEL(COERCE_INT) - -FUNC FUNC: MAKE_ADDER(INT: seed){ - INT: local = seed - RETURN(LAMBDA INT: (INT: delta){ RETURN(ADD(local, delta)) }) -} -FUNC: escaped_lambda = MAKE_ADDER(0d2) -ASSERT(EQ(escaped_lambda(0d1), 0d3)) - -TNS: func_slots = [add_base] -ASSERT(EQ(func_slots[0d1](0d1), 0d3)) -DEL(func_slots) -DEL(greet_lambda) -DEL(escaped_lambda) -DEL(MAKE_ADDER) -DEL(add_base) -DEL(base) -PRINT("Functions: PASS\n") - -PRINT("Testing SIGNATURE...") -FUNC INT: SIGTEST(INT: a, STR: b = "def"){ - RETURN(0d0) -} -FUNC INT: SIGCOERCE(~INT: a, STR: b = "def"){ - RETURN(a) -} -INT: v = 0d5 -STR: s1 = SIGNATURE(SIGTEST) -ASSERT(ISSTR(s1)) -ASSERT(EQ(s1, "INT: SIGTEST(INT: a, STR: b = \"def\")")) -STR: s3 = SIGNATURE(SIGCOERCE) -ASSERT(EQ(s3, "INT: SIGCOERCE(~INT: a, STR: b = \"def\")")) -STR: s2 = SIGNATURE(v) -ASSERT(EQ(s2, "INT: v")) -DEL(s1) -DEL(s2) -DEL(s3) -DEL(SIGCOERCE) -DEL(v) -PRINT("SIGNATURE: PASS\n") - -! --- POP --- -PRINT("Testing POP...") -INT: tmp = 0d5 -FUNC INT: TEST_POP(){ - POP(tmp) -} -ASSERT(EQ(TEST_POP(), 0d5)) -ASSERT(NOT(EXIST(tmp))) -PRINT("POP: PASS\n") - -! --- TRY/CATCH --- -PRINT("Testing TRY/CATCH...") -INT: caught = 0d0 -TRY{ - THROW("Test error") -}CATCH(e){ - caught = 0d1 -} -ASSERT(EQ(caught, 0d1)) -DEL(caught) -PRINT("TRY/CATCH: PASS\n") - -! --- GCD/LCM --- -PRINT("Testing GCD/LCM...") -ASSERT(EQ(GCD(0b1100, 0b1000), 0b100)) ! gcd(12, 8) = 4 -ASSERT(EQ(LCM(0b100, 0b110), 0b1100)) ! lcm(4, 6) = 12 -PRINT("GCD/LCM: PASS\n") - -! --- LOG --- -PRINT("Testing LOG...") -ASSERT(EQ(LOG(0b1000), 0b11)) ! log2(8) = 3 -ASSERT(EQ(LOG(0b10000), 0b100)) ! log2(16) = 4 -PRINT("LOG: PASS\n") - -! --- EXIST --- -PRINT("Testing EXIST...") -INT: exists_test = 0d1 -ASSERT(EXIST(exists_test)) -DEL(exists_test) -ASSERT(NOT(EXIST(exists_test))) -PRINT("EXIST: PASS\n") - -! --- IN (membership) --- -PRINT("Testing IN...") -! element in tensor -TNS: arr = [0d1, 0d2, 0d3] -ASSERT(IN(0d2, arr)) -ASSERT(NOT(IN(0d4, arr))) -DEL(arr) - -! --- JOIN --- -PRINT("Testing JOIN...") -ASSERT(EQ(JOIN("Hello", " ", "World"), "Hello World")) -ASSERT(EQ(JOIN(0b101, 0b1), 0b1011)) -STR: sep = " " -STR: tail = "World" -JOIN(@sep, "Hello", @tail) -ASSERT(EQ(sep, " ")) -ASSERT(EQ(tail, "Hello World")) -DEL(sep) -DEL(tail) -TRY{ - JOIN("Hello", 0d2) ! mixed types should raise an error - ASSERT(0d0) -}CATCH{} -PRINT("JOIN: PASS\n") - -! --- System --- -PRINT("Testing system...") -ASSERT(MAIN()) -STR: os_name = OS() -ASSERT(ISSTR(os_name)) -DEL(os_name) -PRINT("System: PASS\n") - -PRINT("Testing ROUND...") - -! half-way cases (binary digits) - ndigits = 2 (binary `10`) -FLT: r_half = 0b0.101 -ASSERT(EQ(ROUND(r_half, ndigits = 0b10), 0b0.10)) -ASSERT(EQ(ROUND(r_half, mode = "ceiling", ndigits = 0b10), 0b0.11)) -ASSERT(EQ(ROUND(r_half, mode = "ceil", ndigits = 0b10), 0b0.11)) -ASSERT(EQ(ROUND(r_half, mode = "zero", ndigits = 0b10), 0b0.10)) -ASSERT(EQ(ROUND(r_half, mode = "logical", ndigits = 0b10), 0b0.11)) -ASSERT(EQ(ROUND(r_half, mode = "half-up", ndigits = 0b10), 0b0.11)) -! two-argument form: second arg INT -> ndigits with default "floor" -ASSERT(EQ(ROUND(0b0.101, 0b10), 0b0.10)) - -! negative half-case: sign effects differ for floor/zero/half-up -FLT: rn_half = -0b0.101 -ASSERT(EQ(ROUND(rn_half, ndigits = 0b10), -0b0.11)) -ASSERT(EQ(ROUND(rn_half, mode = "zero", ndigits = 0b10), -0b0.10)) -ASSERT(EQ(ROUND(rn_half, mode = "logical", ndigits = 0b10), -0b0.11)) - -! negative ndigits (round to left of radix point) -FLT: three = 0b11.0 -ASSERT(EQ(ROUND(three, ndigits = -0b1), 0b10.0)) -ASSERT(EQ(ROUND(three, mode = "logical", ndigits = -0b1), 0b100.0)) -ASSERT(EQ(ROUND(three, -0b1), 0b10.0)) - -FLT: neg_three = -0b11.0 -ASSERT(EQ(ROUND(neg_three, ndigits = -0b1), -0b100.0)) -ASSERT(EQ(ROUND(neg_three, mode = "zero", ndigits = -0b1), -0b10.0)) -ASSERT(EQ(ROUND(neg_three, mode = "logical", ndigits = -0b1), -0b100.0)) - -PRINT("ROUND: PASS\n") - -PRINT("Testing CL...") -! Simple cross-platform check: `echo` should succeed and return 0 -ASSERT(EQ(CL("echo hello"), 0d0)) -! Nonexistent command should return non-zero (platform-dependent code) -ASSERT(NEQ(CL("this_command_does_not_exist_12345"), 0d0)) -PRINT("CL: PASS\n") - -PRINT("Testing shushing...") -ASSERT(NOT(SHUSH())) -PRINT("ERROR") ! should be silenced -ASSERT(NOT(UNSHUSH())) -PRINT("Shushing: PASS\n") - -PRINT("Testing ARGV...") -ASSERT(ISSTR(ARGV()[0d1])) -PRINT("ARGV: PASS\n") - -PRINT("Testing RUN...") -! Run a small program string that defines a variable in the current env -RUN("INT: run_val = 0b101") -ASSERT(EQ(run_val, 0d5)) -DEL(run_val) -PRINT("RUN: PASS\n") - -PRINT("Testing File I/O...") -ASSERT(WRITEFILE("hello", "_pre_tmp.txt")) -ASSERT(EXISTFILE("_pre_tmp.txt")) -ASSERT(EQ(READFILE("_pre_tmp.txt"), "hello")) - -ASSERT(WRITEFILE("01000001", "_pre_tmp.bin", "binary")) -ASSERT(EQ(READFILE("_pre_tmp.bin", "binary"), "01000001")) - -ASSERT(WRITEFILE("41", "_pre_tmp.hex", "hex")) -ASSERT(EQ(READFILE("_pre_tmp.hex", "hex"), "41")) - -! Cleanup temp files -DELETEFILE("_pre_tmp.txt") -DELETEFILE("_pre_tmp.bin") -DELETEFILE("_pre_tmp.hex") -ASSERT(NOT(EXISTFILE("_pre_tmp.txt"))) -ASSERT(NOT(EXISTFILE("_pre_tmp.bin"))) -ASSERT(NOT(EXISTFILE("_pre_tmp.hex"))) - -TRY{ - DELETEFILE("_pre_nonexistent_file.txt") - ASSERT(0d0) ! should not reach here -}CATCH{} -PRINT("File I/O: PASS\n") - - -PRINT("Testing freezing...") -INT: f = 0d5 -ASSERT(NOT(FROZEN(f))) -ASSERT(NOT(PERMAFROZEN(f))) -FREEZE(f) -ASSERT(FROZEN(f)) -TRY{ - f = 0d2 - ASSERT(0d0) -}CATCH(e){ - ASSERT(EQ(f, 0d5)) -} -TRY{ - DEL(f) - ASSERT(0d0) -}CATCH{} -THAW(f) -f = 0d2 -ASSERT(EQ(f, 0d2)) -PERMAFREEZE(f) -ASSERT(FROZEN(f)) -ASSERT(PERMAFROZEN(f)) -TRY{ - THAW(f) - ASSERT(0d0) -}CATCH(e){ - ASSERT(EQ(f, 0d2)) -} -TRY{ - DEL(f) - ASSERT(0d0) -}CATCH{} - -TRY{ - FREEZE(nonexistent_sym) - ASSERT(0d0) -}CATCH{} -PRINT("Freezing: PASS\n") - -! --- IMPORT / EXPORT --- -PRINT("Testing IMPORT...") -TRY{ - IMPORT(nonexistent_module) - ASSERT(0d0) -}CATCH{} -IMPORT(mod) -ASSERT(EQ(mod.sym, 0d5)) -DEL(mod.sym) -ASSERT(NOT(EXIST(mod.sym))) -ASSERT(EQ(mod.FUN(), 0d0)) -DEL(mod.FUN) -ASSERT(NOT(EXIST(mod.FUN))) -PRINT("IMPORT: PASS\n") - -PRINT("Testing IMPORT_PATH...") -IMPORT(path) -STR: mod_path = JOIN(path.interpreter_dir, "/tests/mod.pre") -IMPORT_PATH(mod_path, mod2) -ASSERT(EQ(mod2.sym, 0d5)) -DEL(mod2.sym) -ASSERT(NOT(EXIST(mod2.sym))) -ASSERT(EQ(mod2.FUN(), 0d0)) -DEL(mod2.FUN) -ASSERT(NOT(EXIST(mod2.FUN))) -PRINT("IMPORT_PATH: PASS\n") - -PRINT("Testing pointer args with imported functions...") -INT: x = 0d5 -mod.SET_ZERO(@x) -ASSERT(EQ(x, 0d0)) -DEL(x) -PRINT("Imported pointer args: PASS\n") - -PRINT("Testing EXPORT...") -INT: ex_sym = 0d5 -ASSERT(NOT(EXPORT(ex_sym, mod))) -ASSERT(EQ(mod.ex_sym, 0d5)) -DEL(ex_sym) -DEL(mod.ex_sym) -PRINT("EXPORT: PASS\n") - -PRINT("Testing THR (thread-handle) semantics...") - -! --- ASYNC tests --- -PRINT("Testing ASYNC...") - -! Statement form: returned THR ignored, block starts immediately -INT: shared_async_s = 0d0 -! Bind the ASYNC to a thread handle and await it for determinism -THR: thr_async_stmt = ASYNC{ shared_async_s = 0d5 } -ASSERT(EQ(AWAIT(thr_async_stmt), thr_async_stmt)) -ASSERT(NOT(thr_async_stmt)) -ASSERT(EQ(shared_async_s, 0d5)) -DEL(shared_async_s) -DEL(thr_async_stmt) - - -! Additional AWAIT test -INT: shared_await = 0d0 -THR: thr_await = ASYNC{ shared_await = 0d5 } -ASSERT(EQ(AWAIT(thr_await), thr_await)) -ASSERT(NOT(thr_await)) -ASSERT(EQ(shared_await, 0d5)) -DEL(shared_await) -DEL(thr_await) - -INT: shared_async_e = 0d0 -THR: thr_async = ASYNC{ shared_async_e = 0d5 } -ASSERT(EQ(AWAIT(thr_async), thr_async)) -ASSERT(NOT(thr_async)) -ASSERT(EQ(shared_async_e, 0d5)) -DEL(shared_async_e) -DEL(thr_async) - -PRINT("ASYNC: PASS\n") - -! Basic THR: start a thread that sets a shared variable. -INT: shared = 0d0 -THR(th) { - shared = 0d5 -} -! Wait for thread to finish deterministically -AWAIT(th) - -ASSERT(EQ(shared, 0d5)) -ASSERT(NOT(th)) -ASSERT(EQ(TYPE(th), "THR")) -DEL(shared) -DEL(th) - -PRINT("Testing STOP/RESTART...") -INT: stop_shared = 0d0 -THR: stop_thr = ASYNC{ - INT: i = 0d0 - ! Signal immediate start so main thread can detect the worker - stop_shared = ADD(stop_shared, 0d1) - WHILE(LT(i, 0d122)){ - stop_shared = ADD(stop_shared, 0d1) - i = ADD(i, 0d1) - } -} -INT: wait_s = 0d0 -WHILE(NOT(stop_shared)){ - wait_s = ADD(wait_s, 0d1) - IF(GT(wait_s, 0d128)){ BREAK(0d1) } -} -ASSERT(GT(stop_shared, 0d0)) - -STOP(stop_thr) -! Wait for cooperative stop to take effect (avoid immediate race) -INT: wait_stop = 0d0 -WHILE(stop_thr){ - wait_stop = ADD(wait_stop, 0d1) - IF(GT(wait_stop, 0d32)){ BREAK(0d1) } -} -INT: snapshot_stop = stop_shared -DEL(wait_stop) - -RESTART(stop_thr) -ASSERT(stop_thr) -AWAIT(stop_thr) -ASSERT(GT(stop_shared, snapshot_stop)) -DEL(stop_shared) -DEL(stop_thr) -DEL(wait_s) -DEL(snapshot_stop) - -PRINT("THR: PASS\n") - -PRINT("Testing SER/UNSER...") - -BOOL: ba = TRUE -INT: ia = 0d5 -FLT: fa = 0b0.01 -STR: sa = "hello" -TNS: ta = [0d1, 0d2] -MAP: ma = <"x" = 0d5, "y" = [0d1, 0d2]> - -FUNC INT: SIMPLE(){ RETURN(0d5) } - -STR: s_ba = SER(ba) -BOOL: u_ba = UNSER(s_ba) -ASSERT(EQ(u_ba, ba)) - -STR: s_ia = SER(ia) -INT: u_ia = UNSER(s_ia) -ASSERT(EQ(u_ia, ia)) - -STR: s_fa = SER(fa) -FLT: u_fa = UNSER(s_fa) -ASSERT(EQ(u_fa, fa)) - -STR: s_sa = SER(sa) -STR: u_sa = UNSER(s_sa) -ASSERT(EQ(u_sa, sa)) - -STR: s_ta = SER(ta) -TNS: u_ta = UNSER(s_ta) -ASSERT(EQ(u_ta, ta)) - -STR: s_ma = SER(ma) -MAP: u_ma = UNSER(s_ma) -ASSERT(EQ(u_ma, ma)) - -STR: s_fn = SER(SIMPLE) -FUNC: u_fn = UNSER(s_fn) -INT: r1 = SIMPLE() -INT: r2 = u_fn() -ASSERT(EQ(r1, r2)) - -INT: caught_su = 0d0 -TRY{ - UNSER("not a valid serialization") - ASSERT(0d0) -}CATCH{ caught_su = 0d1 } -ASSERT(EQ(caught_su, 0d1)) - -DEL(ia) -DEL(fa) -DEL(sa) -DEL(ta) -DEL(ma) -DEL(SIMPLE) -DEL(s_ia) -DEL(s_fa) -DEL(s_sa) -DEL(s_ta) -DEL(s_ma) -DEL(s_fn) -DEL(u_fn) -DEL(r1) -DEL(r2) -DEL(caught_su) -DEL(ba) -DEL(s_ba) -DEL(u_ba) - -PRINT("SER/UNSER: PASS\n") - -PRINT("Testing BASE...") - -! INT tests -ASSERT(EQ(BASE(0b1), 0d2)) -ASSERT(EQ(BASE(0o1), 0d8)) -ASSERT(EQ(BASE(0d1), 0d10)) -ASSERT(EQ(BASE(0x1), 0d16)) -ASSERT(EQ(BASE(0t1), 0d32)) -ASSERT(EQ(BASE(0c1), 0d58)) -ASSERT(EQ(BASE(0s1), 0d64)) -ASSERT(EQ(BASE(0r031), 0d3)) - -! FLT tests -ASSERT(NOT(err)) -ASSERT(EQ(BASE(0b1.0), 0d2)) -ASSERT(EQ(BASE(0o1.0), 0d8)) -ASSERT(EQ(BASE(0d1.0), 0d10)) -ASSERT(EQ(BASE(0x1.0), 0d16)) -ASSERT(EQ(BASE(0t1.0), 0d32)) -ASSERT(EQ(BASE(0c1.1), 0d58)) -ASSERT(EQ(BASE(0s1.0), 0d64)) -ASSERT(EQ(BASE(0r031.0), 0d3)) - -TRY{ - BASE(INF) - INT: err = 0d1 -} CATCH {} - -PRINT("BASE: PASS\n") - -PRINT("Testing CONVERT...") - -ASSERT(EQ(STR(CONVERT(0b101, 0d10)), "0d5")) - -PRINT("CONVERT: PASS\n") - -PRINT("Testing stdlib prime...") -IMPORT(prime) -ASSERT(prime.IS_PRIME(0d2)) -ASSERT(NOT(prime.IS_PRIME(0d4))) -ASSERT(prime.IS_MERSENNE_PRIME(0d3)) -ASSERT(NOT(prime.IS_MERSENNE_PRIME(0d4))) -ASSERT(EQ(prime.NEXT_PRIME(0d10), 0d11)) -ASSERT(EQ(prime.PREV_PRIME(0d10), 0d7)) -PRINT("Stdlib prime: PASS\n") - -PRINT("Testing extensions...") - -EXTEND(EXTENSION: test_ext) - -ASSERT(EQ(test_ext.PING(), 0d0)) -ASSERT(EQ(test_ext.PING(0d1), 0d1)) -ASSERT(EQ(test_ext.IADD(0d1, 0d2, 0d3), 0d6)) -ASSERT(EQ(test_ext.IADD(0d1, "x"), -0d1)) - -! Test global registration -PRINT("Testing GLOBAL_PING (global operator)...") -ASSERT(EQ(GLOBAL_PING(0d5), 0d1)) - -PRINT("Testing ASMODULE-only registration...") -ASSERT(EQ(ASMODULE_ONLY_PING(0d7), 0d1)) -BOOL: asmodule_only_namespaced = FALSE -TRY{ - test_ext.ASMODULE_ONLY_PING() -} CATCH { - asmodule_only_namespaced = TRUE -} -ASSERT(asmodule_only_namespaced) - -! Test extension state operators (runtime-visible smoke test) -PRINT("Testing extension state operators...") -test_ext.RESET_COUNTER() -ASSERT(EQ(test_ext.GET_COUNTER(), 0d0)) -test_ext.RESET_COUNTER() -ASSERT(EQ(test_ext.GET_COUNTER(), 0d0)) - -PRINT("Extensions: PASS\n") - -PRINT("Testing imported EXTEND module...") -IMPORT(ext_import) -ASSERT(EQ(ext_import.CALL_PING(), 0d0)) -ASSERT(EQ(ext_import.test_ext.CALL_PING(), 0d0)) -ASSERT(EQ(ext_import.CALL_ASMODULE_ONLY_PING(), 0d0)) -BOOL: imported_asmodule_only_namespaced = FALSE -TRY{ - ext_import.test_ext.ASMODULE_ONLY_PING() -} CATCH { - imported_asmodule_only_namespaced = TRUE -} -ASSERT(imported_asmodule_only_namespaced) -PRINT("Imported EXTEND module: PASS\n") - -PRINT("=== Built-in tests passed. ===") diff --git a/tests/test_ext.c b/tests/test_ext.c deleted file mode 100644 index 4e1c350..0000000 --- a/tests/test_ext.c +++ /dev/null @@ -1,103 +0,0 @@ -#include -#include - -#include "../src/prefix_extension.h" - -#ifdef _WIN32 -#define PREFIX_EXT_EXPORT __declspec(dllexport) -#else -#define PREFIX_EXT_EXPORT -#endif - -static Value make_int(int64_t v) { - Value out; - memset(&out, 0, sizeof(out)); - out.type = VAL_INT; - out.as.i = v; - return out; -} - -static int64_t g_counter = 0; - -static Value op_get_counter(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { - (void)interp; (void)args; (void)argc; (void)arg_nodes; (void)env; (void)line; (void)col; - return make_int(g_counter); -} - -static Value op_reset_counter(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { - (void)interp; (void)args; (void)argc; (void)arg_nodes; (void)env; (void)line; (void)col; - g_counter = 0; - return make_int(0); -} - -static Value op_ping(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { - (void)interp; - (void)args; - (void)arg_nodes; - (void)env; - (void)line; - (void)col; - /* increment internal counter so tests can observe extension state - (periodic hooks/event handlers are not implemented in this test runtime) */ - g_counter++; - return make_int((int64_t)argc); -} - -static Value op_iadd(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { - int64_t sum = 0; - int i; - (void)interp; - (void)arg_nodes; - (void)env; - (void)line; - (void)col; - - for (i = 0; i < argc; i++) { - if (args[i].type != VAL_INT) { - return make_int(-1); - } - sum += args[i].as.i; - } - - return make_int(sum); -} - -static void on_event(Interpreter* interp, const char* event_name) { - (void)interp; - /* increment counter when event fires */ - if (strcmp(event_name, "test_event") == 0) { - g_counter++; - } -} - -static void on_periodic(Interpreter* interp, const char* event_name) { - (void)interp; - (void)event_name; - g_counter++; -} - -PREFIX_EXT_EXPORT void prefix_extension_init(prefix_ext_context* ctx) { - if (!ctx) { - return; - } - if (ctx->api_version != PREFIX_EXTENSION_API_VERSION) { - return; - } - - (void)ctx->register_operator("PING", op_ping, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED); - (void)ctx->register_operator("IADD", op_iadd, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED); - (void)ctx->register_operator("GET_COUNTER", op_get_counter, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED); - (void)ctx->register_operator("RESET_COUNTER", op_reset_counter, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED); - (void)ctx->register_operator("ASMODULE_ONLY_PING", op_ping, PREFIX_EXTENSION_ASMODULE); - /* Test global operator registration without module restriction. */ - (void)ctx->register_operator("GLOBAL_PING", op_ping, 0); - - /* Use a custom event that we can trigger manually or via tests if possible, - but here we use "program_start" as before, plus a custom one. */ - (void)ctx->register_event_handler("program_start", on_event); - (void)ctx->register_event_handler("test_event", on_event); - - /* Register periodic hook to run every 10 instructions */ - (void)ctx->register_periodic_hook(10, on_periodic); -} - From 7c338d4813952223a6e7b5740e282675138f24b5 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 4 Apr 2026 22:20:49 -0400 Subject: [PATCH 02/60] Fix IADD tests. --- tests/cases/flip-int-basic.pre | 3 --- tests/cases/flip-int-trailing-zero.pre | 3 --- tests/cases/flip-str.pre | 3 --- tests/cases/passing/iadd.pre | 4 ++-- 4 files changed, 2 insertions(+), 11 deletions(-) delete mode 100644 tests/cases/flip-int-basic.pre delete mode 100644 tests/cases/flip-int-trailing-zero.pre delete mode 100644 tests/cases/flip-str.pre diff --git a/tests/cases/flip-int-basic.pre b/tests/cases/flip-int-basic.pre deleted file mode 100644 index e5afae4..0000000 --- a/tests/cases/flip-int-basic.pre +++ /dev/null @@ -1,3 +0,0 @@ -ASSERT(EQ(TYPE(FLIP(0b1101)), "INT")) -ASSERT(EQ(FLIP(0b1101), 0b1011)) -ASSERT(EQ(FLIP(-0b1101), -0b1011)) diff --git a/tests/cases/flip-int-trailing-zero.pre b/tests/cases/flip-int-trailing-zero.pre deleted file mode 100644 index 1aa9671..0000000 --- a/tests/cases/flip-int-trailing-zero.pre +++ /dev/null @@ -1,3 +0,0 @@ -ASSERT(EQ(FLIP(0b1000), 0b1)) -ASSERT(EQ(FLIP(-0b1000), -0b1)) -ASSERT(EQ(FLIP(0b0), 0b0)) diff --git a/tests/cases/flip-str.pre b/tests/cases/flip-str.pre deleted file mode 100644 index 3381100..0000000 --- a/tests/cases/flip-str.pre +++ /dev/null @@ -1,3 +0,0 @@ -ASSERT(EQ(TYPE(FLIP("prefix")), "STR")) -ASSERT(EQ(FLIP("prefix"), "xiferp")) -ASSERT(EQ(FLIP(""), "")) diff --git a/tests/cases/passing/iadd.pre b/tests/cases/passing/iadd.pre index 5c0b748..f7617da 100644 --- a/tests/cases/passing/iadd.pre +++ b/tests/cases/passing/iadd.pre @@ -1,4 +1,4 @@ -# Passing integer arithmetic, checking coercion and correct logic +! Passing integer arithmetic, checking coercion and correct logic INT: result_add_1 = IADD(0d10, 0d5) -INT: result_add_2 = IADD(0d10.5, 0d5.2) # Coerces to integers before/after? +INT: result_add_2 = IADD(0d10.5, 0d5.2) ! Coerces to integers before/after? ASSERT(EQ(result_add_1, 0d15)) From 1c0c1e8d3dc9c48c99d239b987dcbe0b1004afa9 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 4 Apr 2026 22:27:57 -0400 Subject: [PATCH 03/60] Fix more broken tests. --- tests/cases/passing/froot.pre | 5 ----- tests/cases/passing/idiv.pre | 2 +- tests/cases/passing/imul.pre | 2 +- tests/cases/passing/ipow.pre | 2 +- tests/cases/passing/iroot.pre | 2 +- tests/cases/passing/isub-int.pre | 2 +- tests/cases/passing/op-arithmetic-coerce-flt-pass.pre | 11 ----------- tests/cases/passing/op-arithmetic-coerce-int-pass.pre | 4 ++-- 8 files changed, 7 insertions(+), 23 deletions(-) diff --git a/tests/cases/passing/froot.pre b/tests/cases/passing/froot.pre index bb7bdd6..bf61ec5 100644 --- a/tests/cases/passing/froot.pre +++ b/tests/cases/passing/froot.pre @@ -1,8 +1,3 @@ -! FROOT(x, 0d0.0) computes x^(0d1.0/0d0.0) = x^INF which returns a float (like INF or NaN), DO NOT error -FLT: x2 = 0d2.0 -FLT: result_root_inf = FROOT(x2, 0d0.0) -! Not strictly checking value (INF or NaN), just that it's allowed! - FLT: result_root_normal = FROOT(0d16.0, 0d2.0) ASSERT(EQ(result_root_normal, 0d4.0)) diff --git a/tests/cases/passing/idiv.pre b/tests/cases/passing/idiv.pre index 73568bb..7e284ac 100644 --- a/tests/cases/passing/idiv.pre +++ b/tests/cases/passing/idiv.pre @@ -1,3 +1,3 @@ -# Passing integer arithmetic, checking coercion and correct logic +! Passing integer arithmetic, checking coercion and correct logic INT: result_div = IDIV(0d20, 0d4) ASSERT(EQ(result_div, 0d5)) diff --git a/tests/cases/passing/imul.pre b/tests/cases/passing/imul.pre index 76cd37e..a6ce527 100644 --- a/tests/cases/passing/imul.pre +++ b/tests/cases/passing/imul.pre @@ -1,3 +1,3 @@ -# Passing integer arithmetic, checking coercion and correct logic +! Passing integer arithmetic, checking coercion and correct logic INT: result_mul = IMUL(0d4, 0d5) ASSERT(EQ(result_mul, 0d20)) diff --git a/tests/cases/passing/ipow.pre b/tests/cases/passing/ipow.pre index cf46818..1fe6999 100644 --- a/tests/cases/passing/ipow.pre +++ b/tests/cases/passing/ipow.pre @@ -1,3 +1,3 @@ -# Passing integer arithmetic, checking coercion and correct logic +! Passing integer arithmetic, checking coercion and correct logic INT: result_pow = IPOW(0d2, 0d3) ASSERT(EQ(result_pow, 0d8)) diff --git a/tests/cases/passing/iroot.pre b/tests/cases/passing/iroot.pre index 431e8be..7bd1769 100644 --- a/tests/cases/passing/iroot.pre +++ b/tests/cases/passing/iroot.pre @@ -1,3 +1,3 @@ -# Passing integer arithmetic, checking coercion and correct logic +! Passing integer arithmetic, checking coercion and correct logic INT: result_root = IROOT(0d16, 0d2) ASSERT(EQ(result_root, 0d4)) diff --git a/tests/cases/passing/isub-int.pre b/tests/cases/passing/isub-int.pre index 404391b..3eb5750 100644 --- a/tests/cases/passing/isub-int.pre +++ b/tests/cases/passing/isub-int.pre @@ -1,3 +1,3 @@ -# Passing integer arithmetic, checking coercion and correct logic +! Passing integer arithmetic, checking coercion and correct logic INT: result_sub = ISUB(0d10, 0d2.0) ASSERT(EQ(result_sub, 0d8)) diff --git a/tests/cases/passing/op-arithmetic-coerce-flt-pass.pre b/tests/cases/passing/op-arithmetic-coerce-flt-pass.pre index 11b6acb..ffb5c79 100644 --- a/tests/cases/passing/op-arithmetic-coerce-flt-pass.pre +++ b/tests/cases/passing/op-arithmetic-coerce-flt-pass.pre @@ -8,19 +8,8 @@ ASSERT(EQ(result_sub, 0d8.0)) FLT: result_mul = FMUL(0d4.25, 0d2.0) ASSERT(EQ(result_mul, 0d8.5)) -! FDIV(0d1.0, 0d0.0) performing IEEE 754 division by zero DOES NOT return an error, it returns INF -FLT: x = 0d1.0 -FLT: y = 0d0.0 -FLT: result_div_inf = FDIV(x, y) -ASSERT(EQ(result_div_inf, INF)) - FLT: result_pow = FPOW(0d2.5, 0d2.0) ASSERT(EQ(result_pow, 0d6.25)) -! FROOT(x, 0d0.0) computes x^(0d1.0/0d0.0) = x^INF which returns a float (like INF or NaN), DO NOT error -FLT: x2 = 0d2.0 -FLT: result_root_inf = FROOT(x2, 0d0.0) -! Not strictly checking value (INF or NaN), just that it's allowed! - FLT: result_root_normal = FROOT(0d16.0, 0d2.0) ASSERT(EQ(result_root_normal, 0d4.0)) \ No newline at end of file diff --git a/tests/cases/passing/op-arithmetic-coerce-int-pass.pre b/tests/cases/passing/op-arithmetic-coerce-int-pass.pre index c0e9c5b..70756df 100644 --- a/tests/cases/passing/op-arithmetic-coerce-int-pass.pre +++ b/tests/cases/passing/op-arithmetic-coerce-int-pass.pre @@ -1,6 +1,6 @@ -# Passing integer arithmetic, checking coercion and correct logic +! Passing integer arithmetic, checking coercion and correct logic INT: result_add_1 = IADD(0d10, 0d5) -INT: result_add_2 = IADD(0d10.5, 0d5.2) # Coerces to integers before/after? +INT: result_add_2 = IADD(0d10.5, 0d5.2) ! Coerces to integers before/after? ASSERT(EQ(result_add_1, 0d15)) INT: result_sub = ISUB(0d10, 0d2.0) From 1b8df39f052dd12a874f4099fa73aab3942e5a08 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 4 Apr 2026 22:35:07 -0400 Subject: [PATCH 04/60] Add tests for SPLIT. --- tests/cases/failing/split-arity-three.pre | 1 + tests/cases/failing/split-arity-zero.pre | 1 + tests/cases/failing/split-empty-delimiter.pre | 1 + tests/cases/failing/split-first-non-str.pre | 1 + tests/cases/failing/split-second-non-str.pre | 1 + tests/cases/passing/split-consecutive-and-trailing.pre | 2 ++ tests/cases/passing/split-custom-delimiter.pre | 2 ++ tests/cases/passing/split-default-delimiter.pre | 5 +++++ tests/cases/passing/split-return-element-type.pre | 4 ++++ 9 files changed, 18 insertions(+) create mode 100644 tests/cases/failing/split-arity-three.pre create mode 100644 tests/cases/failing/split-arity-zero.pre create mode 100644 tests/cases/failing/split-empty-delimiter.pre create mode 100644 tests/cases/failing/split-first-non-str.pre create mode 100644 tests/cases/failing/split-second-non-str.pre create mode 100644 tests/cases/passing/split-consecutive-and-trailing.pre create mode 100644 tests/cases/passing/split-custom-delimiter.pre create mode 100644 tests/cases/passing/split-default-delimiter.pre create mode 100644 tests/cases/passing/split-return-element-type.pre diff --git a/tests/cases/failing/split-arity-three.pre b/tests/cases/failing/split-arity-three.pre new file mode 100644 index 0000000..a501043 --- /dev/null +++ b/tests/cases/failing/split-arity-three.pre @@ -0,0 +1 @@ +SPLIT("a,b", ",", ",") diff --git a/tests/cases/failing/split-arity-zero.pre b/tests/cases/failing/split-arity-zero.pre new file mode 100644 index 0000000..c93ee17 --- /dev/null +++ b/tests/cases/failing/split-arity-zero.pre @@ -0,0 +1 @@ +SPLIT() diff --git a/tests/cases/failing/split-empty-delimiter.pre b/tests/cases/failing/split-empty-delimiter.pre new file mode 100644 index 0000000..b0b81f1 --- /dev/null +++ b/tests/cases/failing/split-empty-delimiter.pre @@ -0,0 +1 @@ +SPLIT("a,b", "") diff --git a/tests/cases/failing/split-first-non-str.pre b/tests/cases/failing/split-first-non-str.pre new file mode 100644 index 0000000..5664dbe --- /dev/null +++ b/tests/cases/failing/split-first-non-str.pre @@ -0,0 +1 @@ +SPLIT(0d1, ",") diff --git a/tests/cases/failing/split-second-non-str.pre b/tests/cases/failing/split-second-non-str.pre new file mode 100644 index 0000000..6a94ce1 --- /dev/null +++ b/tests/cases/failing/split-second-non-str.pre @@ -0,0 +1 @@ +SPLIT("a,b", 0d1) diff --git a/tests/cases/passing/split-consecutive-and-trailing.pre b/tests/cases/passing/split-consecutive-and-trailing.pre new file mode 100644 index 0000000..fd07305 --- /dev/null +++ b/tests/cases/passing/split-consecutive-and-trailing.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(SPLIT("a,,b,,,c", ","), ["a", "", "b", "", "", "c"])) +ASSERT(EQ(SPLIT("tail,,", ","), ["tail", "", ""])) diff --git a/tests/cases/passing/split-custom-delimiter.pre b/tests/cases/passing/split-custom-delimiter.pre new file mode 100644 index 0000000..a3bfebd --- /dev/null +++ b/tests/cases/passing/split-custom-delimiter.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(SPLIT("ab--cd--ef", "--"), ["ab", "cd", "ef"])) +ASSERT(EQ(SPLIT("no delimiter here", "--"), ["no delimiter here"])) diff --git a/tests/cases/passing/split-default-delimiter.pre b/tests/cases/passing/split-default-delimiter.pre new file mode 100644 index 0000000..c90c7e3 --- /dev/null +++ b/tests/cases/passing/split-default-delimiter.pre @@ -0,0 +1,5 @@ +TNS: words = SPLIT("foo bar baz") + +ASSERT(EQ(TYPE(words), "TNS")) +ASSERT(EQ(words, ["foo", "bar", "baz"])) +ASSERT(EQ(TLEN(words, 0d1), 0d3)) diff --git a/tests/cases/passing/split-return-element-type.pre b/tests/cases/passing/split-return-element-type.pre new file mode 100644 index 0000000..a822281 --- /dev/null +++ b/tests/cases/passing/split-return-element-type.pre @@ -0,0 +1,4 @@ +TNS: parts = SPLIT("left|right", "|") + +ASSERT(EQ(TYPE(parts[0d1]), "STR")) +ASSERT(EQ(TYPE(parts[0d2]), "STR")) From 9bd7778d7de29be11ac5a42df5fa04883648ebe8 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 4 Apr 2026 22:39:32 -0400 Subject: [PATCH 05/60] Add tests for STRIP. --- tests/cases/failing/strip-arity-one.pre | 1 + tests/cases/failing/strip-arity-three.pre | 1 + tests/cases/failing/strip-arity-zero.pre | 1 + tests/cases/failing/strip-empty-remove.pre | 1 + tests/cases/failing/strip-first-non-str.pre | 1 + tests/cases/failing/strip-second-non-str.pre | 1 + tests/cases/passing/strip-basic.pre | 2 ++ tests/cases/passing/strip-empty-and-whole.pre | 2 ++ tests/cases/passing/strip-every-occurrence.pre | 2 ++ tests/cases/passing/strip-not-found.pre | 1 + tests/cases/passing/strip-substring-exact.pre | 2 ++ 11 files changed, 15 insertions(+) create mode 100644 tests/cases/failing/strip-arity-one.pre create mode 100644 tests/cases/failing/strip-arity-three.pre create mode 100644 tests/cases/failing/strip-arity-zero.pre create mode 100644 tests/cases/failing/strip-empty-remove.pre create mode 100644 tests/cases/failing/strip-first-non-str.pre create mode 100644 tests/cases/failing/strip-second-non-str.pre create mode 100644 tests/cases/passing/strip-basic.pre create mode 100644 tests/cases/passing/strip-empty-and-whole.pre create mode 100644 tests/cases/passing/strip-every-occurrence.pre create mode 100644 tests/cases/passing/strip-not-found.pre create mode 100644 tests/cases/passing/strip-substring-exact.pre diff --git a/tests/cases/failing/strip-arity-one.pre b/tests/cases/failing/strip-arity-one.pre new file mode 100644 index 0000000..54bb36b --- /dev/null +++ b/tests/cases/failing/strip-arity-one.pre @@ -0,0 +1 @@ +STRIP("abc") diff --git a/tests/cases/failing/strip-arity-three.pre b/tests/cases/failing/strip-arity-three.pre new file mode 100644 index 0000000..e399bf5 --- /dev/null +++ b/tests/cases/failing/strip-arity-three.pre @@ -0,0 +1 @@ +STRIP("abc", "a", "b") diff --git a/tests/cases/failing/strip-arity-zero.pre b/tests/cases/failing/strip-arity-zero.pre new file mode 100644 index 0000000..183b072 --- /dev/null +++ b/tests/cases/failing/strip-arity-zero.pre @@ -0,0 +1 @@ +STRIP() diff --git a/tests/cases/failing/strip-empty-remove.pre b/tests/cases/failing/strip-empty-remove.pre new file mode 100644 index 0000000..b57b26d --- /dev/null +++ b/tests/cases/failing/strip-empty-remove.pre @@ -0,0 +1 @@ +STRIP("abc", "") diff --git a/tests/cases/failing/strip-first-non-str.pre b/tests/cases/failing/strip-first-non-str.pre new file mode 100644 index 0000000..c7aca88 --- /dev/null +++ b/tests/cases/failing/strip-first-non-str.pre @@ -0,0 +1 @@ +STRIP(0d1, "a") diff --git a/tests/cases/failing/strip-second-non-str.pre b/tests/cases/failing/strip-second-non-str.pre new file mode 100644 index 0000000..f2f0886 --- /dev/null +++ b/tests/cases/failing/strip-second-non-str.pre @@ -0,0 +1 @@ +STRIP("abc", 0d1) diff --git a/tests/cases/passing/strip-basic.pre b/tests/cases/passing/strip-basic.pre new file mode 100644 index 0000000..fe1a9dd --- /dev/null +++ b/tests/cases/passing/strip-basic.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(TYPE(STRIP("prefix", "fix")), "STR")) +ASSERT(EQ(STRIP("prefix", "fix"), "pre")) diff --git a/tests/cases/passing/strip-empty-and-whole.pre b/tests/cases/passing/strip-empty-and-whole.pre new file mode 100644 index 0000000..f0d0dee --- /dev/null +++ b/tests/cases/passing/strip-empty-and-whole.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(STRIP("", "x"), "")) +ASSERT(EQ(STRIP("whole", "whole"), "")) diff --git a/tests/cases/passing/strip-every-occurrence.pre b/tests/cases/passing/strip-every-occurrence.pre new file mode 100644 index 0000000..f10458e --- /dev/null +++ b/tests/cases/passing/strip-every-occurrence.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(STRIP("banana", "an"), "ba")) +ASSERT(EQ(STRIP("fooXXbarXXXXbazXX", "XX"), "foobarbaz")) diff --git a/tests/cases/passing/strip-not-found.pre b/tests/cases/passing/strip-not-found.pre new file mode 100644 index 0000000..68f9bd0 --- /dev/null +++ b/tests/cases/passing/strip-not-found.pre @@ -0,0 +1 @@ +ASSERT(EQ(STRIP("prefix", "zzz"), "prefix")) diff --git a/tests/cases/passing/strip-substring-exact.pre b/tests/cases/passing/strip-substring-exact.pre new file mode 100644 index 0000000..6b674d5 --- /dev/null +++ b/tests/cases/passing/strip-substring-exact.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(STRIP("abc", "ac"), "abc")) +ASSERT(EQ(STRIP("a b c", " "), "abc")) From 4a7de74f0ceea5c7d32b30be0226a78edffa3a01 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 4 Apr 2026 22:51:05 -0400 Subject: [PATCH 06/60] Add tests for REPLACE. --- tests/cases/failing/replace-arity-four.pre | 1 + tests/cases/failing/replace-arity-one.pre | 1 + tests/cases/failing/replace-arity-two.pre | 1 + tests/cases/failing/replace-arity-zero.pre | 1 + tests/cases/failing/replace-empty.pre | 1 + tests/cases/failing/replace-first-non-str.pre | 1 + tests/cases/failing/replace-second-non-str.pre | 1 + tests/cases/failing/replace-third-non-str.pre | 1 + tests/cases/passing/replace-basic.pre | 2 ++ tests/cases/passing/replace-empty-new.pre | 1 + tests/cases/passing/replace-every-occurrence.pre | 2 ++ tests/cases/passing/replace-not-found.pre | 1 + tests/cases/passing/replace-substring-exact.pre | 2 ++ tests/cases/passing/replace-whole.pre | 1 + 14 files changed, 17 insertions(+) create mode 100644 tests/cases/failing/replace-arity-four.pre create mode 100644 tests/cases/failing/replace-arity-one.pre create mode 100644 tests/cases/failing/replace-arity-two.pre create mode 100644 tests/cases/failing/replace-arity-zero.pre create mode 100644 tests/cases/failing/replace-empty.pre create mode 100644 tests/cases/failing/replace-first-non-str.pre create mode 100644 tests/cases/failing/replace-second-non-str.pre create mode 100644 tests/cases/failing/replace-third-non-str.pre create mode 100644 tests/cases/passing/replace-basic.pre create mode 100644 tests/cases/passing/replace-empty-new.pre create mode 100644 tests/cases/passing/replace-every-occurrence.pre create mode 100644 tests/cases/passing/replace-not-found.pre create mode 100644 tests/cases/passing/replace-substring-exact.pre create mode 100644 tests/cases/passing/replace-whole.pre diff --git a/tests/cases/failing/replace-arity-four.pre b/tests/cases/failing/replace-arity-four.pre new file mode 100644 index 0000000..d7ca98b --- /dev/null +++ b/tests/cases/failing/replace-arity-four.pre @@ -0,0 +1 @@ +REPLACE("abc", "a", "b", "c") diff --git a/tests/cases/failing/replace-arity-one.pre b/tests/cases/failing/replace-arity-one.pre new file mode 100644 index 0000000..3c44bbb --- /dev/null +++ b/tests/cases/failing/replace-arity-one.pre @@ -0,0 +1 @@ +REPLACE("abc") diff --git a/tests/cases/failing/replace-arity-two.pre b/tests/cases/failing/replace-arity-two.pre new file mode 100644 index 0000000..5dcdeeb --- /dev/null +++ b/tests/cases/failing/replace-arity-two.pre @@ -0,0 +1 @@ +REPLACE("abc", "a") diff --git a/tests/cases/failing/replace-arity-zero.pre b/tests/cases/failing/replace-arity-zero.pre new file mode 100644 index 0000000..79b78b1 --- /dev/null +++ b/tests/cases/failing/replace-arity-zero.pre @@ -0,0 +1 @@ +REPLACE() diff --git a/tests/cases/failing/replace-empty.pre b/tests/cases/failing/replace-empty.pre new file mode 100644 index 0000000..315f5a2 --- /dev/null +++ b/tests/cases/failing/replace-empty.pre @@ -0,0 +1 @@ +REPLACE("abc", "", "x") diff --git a/tests/cases/failing/replace-first-non-str.pre b/tests/cases/failing/replace-first-non-str.pre new file mode 100644 index 0000000..794b8d2 --- /dev/null +++ b/tests/cases/failing/replace-first-non-str.pre @@ -0,0 +1 @@ +REPLACE(0d1, "a", "b") diff --git a/tests/cases/failing/replace-second-non-str.pre b/tests/cases/failing/replace-second-non-str.pre new file mode 100644 index 0000000..45e7308 --- /dev/null +++ b/tests/cases/failing/replace-second-non-str.pre @@ -0,0 +1 @@ +REPLACE("abc", 0d1, "b") diff --git a/tests/cases/failing/replace-third-non-str.pre b/tests/cases/failing/replace-third-non-str.pre new file mode 100644 index 0000000..70349b8 --- /dev/null +++ b/tests/cases/failing/replace-third-non-str.pre @@ -0,0 +1 @@ +REPLACE("abc", "a", 0d1) diff --git a/tests/cases/passing/replace-basic.pre b/tests/cases/passing/replace-basic.pre new file mode 100644 index 0000000..28dbd9f --- /dev/null +++ b/tests/cases/passing/replace-basic.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(TYPE(REPLACE("prefix", "fix", "lude")), "STR")) +ASSERT(EQ(REPLACE("prefix", "fix", "lude"), "prelude")) diff --git a/tests/cases/passing/replace-empty-new.pre b/tests/cases/passing/replace-empty-new.pre new file mode 100644 index 0000000..1b407b1 --- /dev/null +++ b/tests/cases/passing/replace-empty-new.pre @@ -0,0 +1 @@ +ASSERT(EQ(REPLACE("one,two,three", ",", ""), "onetwothree")) diff --git a/tests/cases/passing/replace-every-occurrence.pre b/tests/cases/passing/replace-every-occurrence.pre new file mode 100644 index 0000000..0bf1736 --- /dev/null +++ b/tests/cases/passing/replace-every-occurrence.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(REPLACE("abXXcdXXef", "XX", "__"), "ab__cd__ef")) +ASSERT(EQ(REPLACE("fooXXbarXXXXbaz", "XX", "-"), "foo-bar--baz")) diff --git a/tests/cases/passing/replace-not-found.pre b/tests/cases/passing/replace-not-found.pre new file mode 100644 index 0000000..deac08a --- /dev/null +++ b/tests/cases/passing/replace-not-found.pre @@ -0,0 +1 @@ +ASSERT(EQ(REPLACE("prefix", "zzz", "X"), "prefix")) diff --git a/tests/cases/passing/replace-substring-exact.pre b/tests/cases/passing/replace-substring-exact.pre new file mode 100644 index 0000000..d0b3b2c --- /dev/null +++ b/tests/cases/passing/replace-substring-exact.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(REPLACE("abc", "ac", "Z"), "abc")) +ASSERT(EQ(REPLACE("a b c", " ", "-"), "a-b-c")) diff --git a/tests/cases/passing/replace-whole.pre b/tests/cases/passing/replace-whole.pre new file mode 100644 index 0000000..490c1d7 --- /dev/null +++ b/tests/cases/passing/replace-whole.pre @@ -0,0 +1 @@ +ASSERT(EQ(REPLACE("token", "token", "x"), "x")) From 90e63514998ea602b38c58d61cbc0714c72f7f83 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 4 Apr 2026 22:58:33 -0400 Subject: [PATCH 07/60] Add tests for SHAPE. --- tests/cases/failing/shape-arity-two.pre | 1 + tests/cases/failing/shape-arity-zero.pre | 1 + tests/cases/failing/shape-bool.pre | 1 + tests/cases/failing/shape-flt.pre | 1 + tests/cases/failing/shape-func.pre | 1 + tests/cases/failing/shape-int.pre | 1 + tests/cases/failing/shape-map.pre | 1 + tests/cases/failing/shape-str.pre | 1 + tests/cases/failing/shape-thr.pre | 1 + tests/cases/passing/shape-rank-1.pre | 4 ++++ tests/cases/passing/shape-rank-2.pre | 3 +++ tests/cases/passing/shape-rank-3.pre | 3 +++ tests/cases/passing/shape-result-is-1d.pre | 8 ++++++++ 13 files changed, 27 insertions(+) create mode 100644 tests/cases/failing/shape-arity-two.pre create mode 100644 tests/cases/failing/shape-arity-zero.pre create mode 100644 tests/cases/failing/shape-bool.pre create mode 100644 tests/cases/failing/shape-flt.pre create mode 100644 tests/cases/failing/shape-func.pre create mode 100644 tests/cases/failing/shape-int.pre create mode 100644 tests/cases/failing/shape-map.pre create mode 100644 tests/cases/failing/shape-str.pre create mode 100644 tests/cases/failing/shape-thr.pre create mode 100644 tests/cases/passing/shape-rank-1.pre create mode 100644 tests/cases/passing/shape-rank-2.pre create mode 100644 tests/cases/passing/shape-rank-3.pre create mode 100644 tests/cases/passing/shape-result-is-1d.pre diff --git a/tests/cases/failing/shape-arity-two.pre b/tests/cases/failing/shape-arity-two.pre new file mode 100644 index 0000000..ed1c50f --- /dev/null +++ b/tests/cases/failing/shape-arity-two.pre @@ -0,0 +1 @@ +SHAPE([0d1], [0d2]) diff --git a/tests/cases/failing/shape-arity-zero.pre b/tests/cases/failing/shape-arity-zero.pre new file mode 100644 index 0000000..2e4d8cc --- /dev/null +++ b/tests/cases/failing/shape-arity-zero.pre @@ -0,0 +1 @@ +SHAPE() diff --git a/tests/cases/failing/shape-bool.pre b/tests/cases/failing/shape-bool.pre new file mode 100644 index 0000000..c6ccb6a --- /dev/null +++ b/tests/cases/failing/shape-bool.pre @@ -0,0 +1 @@ +SHAPE(TRUE) diff --git a/tests/cases/failing/shape-flt.pre b/tests/cases/failing/shape-flt.pre new file mode 100644 index 0000000..30fcd62 --- /dev/null +++ b/tests/cases/failing/shape-flt.pre @@ -0,0 +1 @@ +SHAPE(0d1.0) diff --git a/tests/cases/failing/shape-func.pre b/tests/cases/failing/shape-func.pre new file mode 100644 index 0000000..c8cffb2 --- /dev/null +++ b/tests/cases/failing/shape-func.pre @@ -0,0 +1 @@ +SHAPE(LAMBDA INT: (){}) diff --git a/tests/cases/failing/shape-int.pre b/tests/cases/failing/shape-int.pre new file mode 100644 index 0000000..1b76348 --- /dev/null +++ b/tests/cases/failing/shape-int.pre @@ -0,0 +1 @@ +SHAPE(0d1) diff --git a/tests/cases/failing/shape-map.pre b/tests/cases/failing/shape-map.pre new file mode 100644 index 0000000..2b7e2bb --- /dev/null +++ b/tests/cases/failing/shape-map.pre @@ -0,0 +1 @@ +SHAPE(<>) diff --git a/tests/cases/failing/shape-str.pre b/tests/cases/failing/shape-str.pre new file mode 100644 index 0000000..a3c79c4 --- /dev/null +++ b/tests/cases/failing/shape-str.pre @@ -0,0 +1 @@ +SHAPE("abc") diff --git a/tests/cases/failing/shape-thr.pre b/tests/cases/failing/shape-thr.pre new file mode 100644 index 0000000..1ba65ad --- /dev/null +++ b/tests/cases/failing/shape-thr.pre @@ -0,0 +1 @@ +SHAPE(ASYNC{}) diff --git a/tests/cases/passing/shape-rank-1.pre b/tests/cases/passing/shape-rank-1.pre new file mode 100644 index 0000000..b6203b3 --- /dev/null +++ b/tests/cases/passing/shape-rank-1.pre @@ -0,0 +1,4 @@ +TNS: v = [0d10, 0d20, 0d30, 0d40] + +ASSERT(EQ(TYPE(SHAPE(v)), "TNS")) +ASSERT(EQ(SHAPE(v), [0d4])) diff --git a/tests/cases/passing/shape-rank-2.pre b/tests/cases/passing/shape-rank-2.pre new file mode 100644 index 0000000..8fb7045 --- /dev/null +++ b/tests/cases/passing/shape-rank-2.pre @@ -0,0 +1,3 @@ +TNS: m = [[0d1, 0d2, 0d3], [0d4, 0d5, 0d6]] + +ASSERT(EQ(SHAPE(m), [0d2, 0d3])) diff --git a/tests/cases/passing/shape-rank-3.pre b/tests/cases/passing/shape-rank-3.pre new file mode 100644 index 0000000..cb7d03d --- /dev/null +++ b/tests/cases/passing/shape-rank-3.pre @@ -0,0 +1,3 @@ +TNS: cube = [[[0d1, 0d2]], [[0d3, 0d4]], [[0d5, 0d6]]] + +ASSERT(EQ(SHAPE(cube), [0d3, 0d1, 0d2])) diff --git a/tests/cases/passing/shape-result-is-1d.pre b/tests/cases/passing/shape-result-is-1d.pre new file mode 100644 index 0000000..bde92a8 --- /dev/null +++ b/tests/cases/passing/shape-result-is-1d.pre @@ -0,0 +1,8 @@ +TNS: t = [[[0d1], [0d2], [0d3]], [[0d4], [0d5], [0d6]]] +TNS: dims = SHAPE(t) + +ASSERT(EQ(TYPE(dims), "TNS")) +ASSERT(EQ(TLEN(dims, 0d1), 0d3)) +ASSERT(EQ(dims[0d1], 0d2)) +ASSERT(EQ(dims[0d2], 0d3)) +ASSERT(EQ(dims[0d3], 0d1)) From 5454aa188ba0e9ffaa8af340b61dc1f2744bc0f0 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 4 Apr 2026 23:03:17 -0400 Subject: [PATCH 08/60] Add tests for TFLIP. --- tests/cases/failing/tflip-arity-one.pre | 1 + tests/cases/failing/tflip-arity-three.pre | 1 + tests/cases/failing/tflip-arity-zero.pre | 1 + tests/cases/failing/tflip-dim-too-large.pre | 1 + tests/cases/failing/tflip-dim-zero.pre | 1 + tests/cases/failing/tflip-first-non-tns.pre | 1 + tests/cases/failing/tflip-second-non-int.pre | 1 + tests/cases/passing/tflip-rank1.pre | 5 +++++ tests/cases/passing/tflip-rank2-dim1.pre | 5 +++++ tests/cases/passing/tflip-rank2-dim2.pre | 3 +++ tests/cases/passing/tflip-rank3-dim3.pre | 3 +++ 11 files changed, 23 insertions(+) create mode 100644 tests/cases/failing/tflip-arity-one.pre create mode 100644 tests/cases/failing/tflip-arity-three.pre create mode 100644 tests/cases/failing/tflip-arity-zero.pre create mode 100644 tests/cases/failing/tflip-dim-too-large.pre create mode 100644 tests/cases/failing/tflip-dim-zero.pre create mode 100644 tests/cases/failing/tflip-first-non-tns.pre create mode 100644 tests/cases/failing/tflip-second-non-int.pre create mode 100644 tests/cases/passing/tflip-rank1.pre create mode 100644 tests/cases/passing/tflip-rank2-dim1.pre create mode 100644 tests/cases/passing/tflip-rank2-dim2.pre create mode 100644 tests/cases/passing/tflip-rank3-dim3.pre diff --git a/tests/cases/failing/tflip-arity-one.pre b/tests/cases/failing/tflip-arity-one.pre new file mode 100644 index 0000000..e82bb8b --- /dev/null +++ b/tests/cases/failing/tflip-arity-one.pre @@ -0,0 +1 @@ +TFLIP([0d1]) diff --git a/tests/cases/failing/tflip-arity-three.pre b/tests/cases/failing/tflip-arity-three.pre new file mode 100644 index 0000000..3497787 --- /dev/null +++ b/tests/cases/failing/tflip-arity-three.pre @@ -0,0 +1 @@ +TFLIP([0d1], 0d1, 0d2) diff --git a/tests/cases/failing/tflip-arity-zero.pre b/tests/cases/failing/tflip-arity-zero.pre new file mode 100644 index 0000000..661f2f6 --- /dev/null +++ b/tests/cases/failing/tflip-arity-zero.pre @@ -0,0 +1 @@ +TFLIP() diff --git a/tests/cases/failing/tflip-dim-too-large.pre b/tests/cases/failing/tflip-dim-too-large.pre new file mode 100644 index 0000000..37b4795 --- /dev/null +++ b/tests/cases/failing/tflip-dim-too-large.pre @@ -0,0 +1 @@ +TFLIP([[0d1, 0d2], [0d3, 0d4]], 0d3) diff --git a/tests/cases/failing/tflip-dim-zero.pre b/tests/cases/failing/tflip-dim-zero.pre new file mode 100644 index 0000000..458dc13 --- /dev/null +++ b/tests/cases/failing/tflip-dim-zero.pre @@ -0,0 +1 @@ +TFLIP([[0d1, 0d2], [0d3, 0d4]], 0d0) diff --git a/tests/cases/failing/tflip-first-non-tns.pre b/tests/cases/failing/tflip-first-non-tns.pre new file mode 100644 index 0000000..5e63b4d --- /dev/null +++ b/tests/cases/failing/tflip-first-non-tns.pre @@ -0,0 +1 @@ +TFLIP(0d1, 0d1) diff --git a/tests/cases/failing/tflip-second-non-int.pre b/tests/cases/failing/tflip-second-non-int.pre new file mode 100644 index 0000000..970056d --- /dev/null +++ b/tests/cases/failing/tflip-second-non-int.pre @@ -0,0 +1 @@ +TFLIP([0d1, 0d2], "1") diff --git a/tests/cases/passing/tflip-rank1.pre b/tests/cases/passing/tflip-rank1.pre new file mode 100644 index 0000000..0e77bce --- /dev/null +++ b/tests/cases/passing/tflip-rank1.pre @@ -0,0 +1,5 @@ +TNS: v = [0d1, 0d2, 0d3, 0d4] + +ASSERT(EQ(TYPE(TFLIP(v, 0d1)), "TNS")) +ASSERT(EQ(TFLIP(v, 0d1), [0d4, 0d3, 0d2, 0d1])) +ASSERT(EQ(v, [0d1, 0d2, 0d3, 0d4])) diff --git a/tests/cases/passing/tflip-rank2-dim1.pre b/tests/cases/passing/tflip-rank2-dim1.pre new file mode 100644 index 0000000..52b1014 --- /dev/null +++ b/tests/cases/passing/tflip-rank2-dim1.pre @@ -0,0 +1,5 @@ +TNS: m = [[0d1, 0d2, 0d3], [0d4, 0d5, 0d6]] +TNS: flipped = TFLIP(m, 0d1) + +ASSERT(EQ(flipped, [[0d4, 0d5, 0d6], [0d1, 0d2, 0d3]])) +ASSERT(EQ(SHAPE(flipped), [0d2, 0d3])) diff --git a/tests/cases/passing/tflip-rank2-dim2.pre b/tests/cases/passing/tflip-rank2-dim2.pre new file mode 100644 index 0000000..85aa0dc --- /dev/null +++ b/tests/cases/passing/tflip-rank2-dim2.pre @@ -0,0 +1,3 @@ +TNS: m = [[0d1, 0d2, 0d3], [0d4, 0d5, 0d6]] + +ASSERT(EQ(TFLIP(m, 0d2), [[0d3, 0d2, 0d1], [0d6, 0d5, 0d4]])) diff --git a/tests/cases/passing/tflip-rank3-dim3.pre b/tests/cases/passing/tflip-rank3-dim3.pre new file mode 100644 index 0000000..702db0a --- /dev/null +++ b/tests/cases/passing/tflip-rank3-dim3.pre @@ -0,0 +1,3 @@ +TNS: cube = [[[0d1, 0d2], [0d3, 0d4]], [[0d5, 0d6], [0d7, 0d8]]] + +ASSERT(EQ(TFLIP(cube, 0d3), [[[0d2, 0d1], [0d4, 0d3]], [[0d6, 0d5], [0d8, 0d7]]])) From 198c54d7bcb6fcd6995ce34df9ec8eef4d851003 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 4 Apr 2026 23:09:24 -0400 Subject: [PATCH 09/60] Add tests for SCAT. --- tests/cases/failing/scat-arity-four.pre | 1 + tests/cases/failing/scat-arity-two.pre | 1 + tests/cases/failing/scat-arity-zero.pre | 1 + tests/cases/failing/scat-first-non-tns.pre | 1 + tests/cases/failing/scat-ind-dim-count-mismatch.pre | 1 + tests/cases/failing/scat-ind-pair-malformed.pre | 1 + tests/cases/failing/scat-out-of-range-high.pre | 1 + tests/cases/failing/scat-out-of-range-low.pre | 1 + tests/cases/failing/scat-second-non-tns.pre | 1 + tests/cases/failing/scat-shape-mismatch.pre | 1 + tests/cases/failing/scat-third-non-tns.pre | 1 + tests/cases/passing/scat-1d-basic.pre | 7 +++++++ tests/cases/passing/scat-2d-rect.pre | 6 ++++++ tests/cases/passing/scat-3d-rect.pre | 5 +++++ tests/cases/passing/scat-inclusive-singleton.pre | 3 +++ 15 files changed, 32 insertions(+) create mode 100644 tests/cases/failing/scat-arity-four.pre create mode 100644 tests/cases/failing/scat-arity-two.pre create mode 100644 tests/cases/failing/scat-arity-zero.pre create mode 100644 tests/cases/failing/scat-first-non-tns.pre create mode 100644 tests/cases/failing/scat-ind-dim-count-mismatch.pre create mode 100644 tests/cases/failing/scat-ind-pair-malformed.pre create mode 100644 tests/cases/failing/scat-out-of-range-high.pre create mode 100644 tests/cases/failing/scat-out-of-range-low.pre create mode 100644 tests/cases/failing/scat-second-non-tns.pre create mode 100644 tests/cases/failing/scat-shape-mismatch.pre create mode 100644 tests/cases/failing/scat-third-non-tns.pre create mode 100644 tests/cases/passing/scat-1d-basic.pre create mode 100644 tests/cases/passing/scat-2d-rect.pre create mode 100644 tests/cases/passing/scat-3d-rect.pre create mode 100644 tests/cases/passing/scat-inclusive-singleton.pre diff --git a/tests/cases/failing/scat-arity-four.pre b/tests/cases/failing/scat-arity-four.pre new file mode 100644 index 0000000..148b701 --- /dev/null +++ b/tests/cases/failing/scat-arity-four.pre @@ -0,0 +1 @@ +SCAT([0d1], [0d2], [[0d1, 0d1]], [0d3]) diff --git a/tests/cases/failing/scat-arity-two.pre b/tests/cases/failing/scat-arity-two.pre new file mode 100644 index 0000000..9867bde --- /dev/null +++ b/tests/cases/failing/scat-arity-two.pre @@ -0,0 +1 @@ +SCAT([0d1], [0d2]) diff --git a/tests/cases/failing/scat-arity-zero.pre b/tests/cases/failing/scat-arity-zero.pre new file mode 100644 index 0000000..4a79fa1 --- /dev/null +++ b/tests/cases/failing/scat-arity-zero.pre @@ -0,0 +1 @@ +SCAT() diff --git a/tests/cases/failing/scat-first-non-tns.pre b/tests/cases/failing/scat-first-non-tns.pre new file mode 100644 index 0000000..494b8b8 --- /dev/null +++ b/tests/cases/failing/scat-first-non-tns.pre @@ -0,0 +1 @@ +SCAT(0d1, [0d1, 0d2], [[0d1, 0d1]]) diff --git a/tests/cases/failing/scat-ind-dim-count-mismatch.pre b/tests/cases/failing/scat-ind-dim-count-mismatch.pre new file mode 100644 index 0000000..efd3bf0 --- /dev/null +++ b/tests/cases/failing/scat-ind-dim-count-mismatch.pre @@ -0,0 +1 @@ +SCAT([[0d9]], [[0d1, 0d2], [0d3, 0d4]], [[0d1, 0d1]]) diff --git a/tests/cases/failing/scat-ind-pair-malformed.pre b/tests/cases/failing/scat-ind-pair-malformed.pre new file mode 100644 index 0000000..99eaf71 --- /dev/null +++ b/tests/cases/failing/scat-ind-pair-malformed.pre @@ -0,0 +1 @@ +SCAT([0d9], [0d1, 0d2], [[0d1]]) diff --git a/tests/cases/failing/scat-out-of-range-high.pre b/tests/cases/failing/scat-out-of-range-high.pre new file mode 100644 index 0000000..d9b230c --- /dev/null +++ b/tests/cases/failing/scat-out-of-range-high.pre @@ -0,0 +1 @@ +SCAT([0d9], [0d1, 0d2, 0d3], [[0d3, 0d4]]) diff --git a/tests/cases/failing/scat-out-of-range-low.pre b/tests/cases/failing/scat-out-of-range-low.pre new file mode 100644 index 0000000..c7ff407 --- /dev/null +++ b/tests/cases/failing/scat-out-of-range-low.pre @@ -0,0 +1 @@ +SCAT([0d9], [0d1, 0d2, 0d3], [[0d0, 0d1]]) diff --git a/tests/cases/failing/scat-second-non-tns.pre b/tests/cases/failing/scat-second-non-tns.pre new file mode 100644 index 0000000..213dfb0 --- /dev/null +++ b/tests/cases/failing/scat-second-non-tns.pre @@ -0,0 +1 @@ +SCAT([0d1], 0d2, [[0d1, 0d1]]) diff --git a/tests/cases/failing/scat-shape-mismatch.pre b/tests/cases/failing/scat-shape-mismatch.pre new file mode 100644 index 0000000..a1103c2 --- /dev/null +++ b/tests/cases/failing/scat-shape-mismatch.pre @@ -0,0 +1 @@ +SCAT([0d9], [0d1, 0d2, 0d3], [[0d1, 0d2]]) diff --git a/tests/cases/failing/scat-third-non-tns.pre b/tests/cases/failing/scat-third-non-tns.pre new file mode 100644 index 0000000..7e6ab14 --- /dev/null +++ b/tests/cases/failing/scat-third-non-tns.pre @@ -0,0 +1 @@ +SCAT([0d1], [0d1, 0d2], 0d1) diff --git a/tests/cases/passing/scat-1d-basic.pre b/tests/cases/passing/scat-1d-basic.pre new file mode 100644 index 0000000..ff1832a --- /dev/null +++ b/tests/cases/passing/scat-1d-basic.pre @@ -0,0 +1,7 @@ +TNS: src = [0d9, 0d8] +TNS: dst = [0d1, 0d2, 0d3, 0d4] +TNS: out = SCAT(src, dst, [[0d2, 0d3]]) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d1, 0d9, 0d8, 0d4])) +ASSERT(EQ(dst, [0d1, 0d2, 0d3, 0d4])) diff --git a/tests/cases/passing/scat-2d-rect.pre b/tests/cases/passing/scat-2d-rect.pre new file mode 100644 index 0000000..32503f1 --- /dev/null +++ b/tests/cases/passing/scat-2d-rect.pre @@ -0,0 +1,6 @@ +TNS: src = [[0d7, 0d8], [0d9, 0d10]] +TNS: dst = [[0d1, 0d2, 0d3], [0d4, 0d5, 0d6], [0d11, 0d12, 0d13]] +TNS: out = SCAT(src, dst, [[0d2, 0d3], [0d1, 0d2]]) + +ASSERT(EQ(out, [[0d1, 0d2, 0d3], [0d7, 0d8, 0d6], [0d9, 0d10, 0d13]])) +ASSERT(EQ(SHAPE(out), [0d3, 0d3])) diff --git a/tests/cases/passing/scat-3d-rect.pre b/tests/cases/passing/scat-3d-rect.pre new file mode 100644 index 0000000..20eaf5e --- /dev/null +++ b/tests/cases/passing/scat-3d-rect.pre @@ -0,0 +1,5 @@ +TNS: src = [[[0d99, 0d98]], [[0d97, 0d96]]] +TNS: dst = [[[0d1, 0d2], [0d3, 0d4]], [[0d5, 0d6], [0d7, 0d8]]] +TNS: out = SCAT(src, dst, [[0d1, 0d2], [0d2, 0d2], [0d1, 0d2]]) + +ASSERT(EQ(out, [[[0d1, 0d2], [0d99, 0d98]], [[0d5, 0d6], [0d97, 0d96]]])) diff --git a/tests/cases/passing/scat-inclusive-singleton.pre b/tests/cases/passing/scat-inclusive-singleton.pre new file mode 100644 index 0000000..eba45be --- /dev/null +++ b/tests/cases/passing/scat-inclusive-singleton.pre @@ -0,0 +1,3 @@ +TNS: out = SCAT([0d55], [0d10, 0d20, 0d30], [[0d3, 0d3]]) + +ASSERT(EQ(out, [0d10, 0d20, 0d55])) From 97c23f0134cc6d3046a3813d3d2774efd1050ec5 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 5 Apr 2026 00:24:39 -0400 Subject: [PATCH 10/60] Add tests for APPEND. --- tests/cases/failing/append-arity-one.pre | 1 + tests/cases/failing/append-arity-three.pre | 1 + tests/cases/failing/append-arity-zero.pre | 1 + tests/cases/failing/append-second-non-tns.pre | 1 + tests/cases/failing/append-second-not-1d.pre | 1 + tests/cases/passing/append-any-element.pre | 5 +++++ tests/cases/passing/append-basic.pre | 5 +++++ tests/cases/passing/append-end-order.pre | 2 ++ tests/cases/passing/append-source-unchanged.pre | 5 +++++ 9 files changed, 22 insertions(+) create mode 100644 tests/cases/failing/append-arity-one.pre create mode 100644 tests/cases/failing/append-arity-three.pre create mode 100644 tests/cases/failing/append-arity-zero.pre create mode 100644 tests/cases/failing/append-second-non-tns.pre create mode 100644 tests/cases/failing/append-second-not-1d.pre create mode 100644 tests/cases/passing/append-any-element.pre create mode 100644 tests/cases/passing/append-basic.pre create mode 100644 tests/cases/passing/append-end-order.pre create mode 100644 tests/cases/passing/append-source-unchanged.pre diff --git a/tests/cases/failing/append-arity-one.pre b/tests/cases/failing/append-arity-one.pre new file mode 100644 index 0000000..fd9c210 --- /dev/null +++ b/tests/cases/failing/append-arity-one.pre @@ -0,0 +1 @@ +APPEND(0d1) diff --git a/tests/cases/failing/append-arity-three.pre b/tests/cases/failing/append-arity-three.pre new file mode 100644 index 0000000..5c4b710 --- /dev/null +++ b/tests/cases/failing/append-arity-three.pre @@ -0,0 +1 @@ +APPEND(0d1, [0d2], 0d3) diff --git a/tests/cases/failing/append-arity-zero.pre b/tests/cases/failing/append-arity-zero.pre new file mode 100644 index 0000000..b77b053 --- /dev/null +++ b/tests/cases/failing/append-arity-zero.pre @@ -0,0 +1 @@ +APPEND() diff --git a/tests/cases/failing/append-second-non-tns.pre b/tests/cases/failing/append-second-non-tns.pre new file mode 100644 index 0000000..4732f57 --- /dev/null +++ b/tests/cases/failing/append-second-non-tns.pre @@ -0,0 +1 @@ +APPEND(0d1, 0d2) diff --git a/tests/cases/failing/append-second-not-1d.pre b/tests/cases/failing/append-second-not-1d.pre new file mode 100644 index 0000000..6f0428a --- /dev/null +++ b/tests/cases/failing/append-second-not-1d.pre @@ -0,0 +1 @@ +APPEND(0d9, [[0d1], [0d2]]) diff --git a/tests/cases/passing/append-any-element.pre b/tests/cases/passing/append-any-element.pre new file mode 100644 index 0000000..0fe4ab4 --- /dev/null +++ b/tests/cases/passing/append-any-element.pre @@ -0,0 +1,5 @@ +MAP: m = <"k" = 0d1> +TNS: nested = [0d5, 0d6] + +ASSERT(EQ(APPEND(m, [0d1]), [0d1, m])) +ASSERT(EQ(APPEND(nested, [0d1]), [0d1, nested])) diff --git a/tests/cases/passing/append-basic.pre b/tests/cases/passing/append-basic.pre new file mode 100644 index 0000000..326d1a6 --- /dev/null +++ b/tests/cases/passing/append-basic.pre @@ -0,0 +1,5 @@ +TNS: base = [0d1, 0d2] +TNS: out = APPEND(0d3, base) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d1, 0d2, 0d3])) diff --git a/tests/cases/passing/append-end-order.pre b/tests/cases/passing/append-end-order.pre new file mode 100644 index 0000000..7708d3e --- /dev/null +++ b/tests/cases/passing/append-end-order.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(APPEND("z", ["a", "b"]), ["a", "b", "z"])) +ASSERT(EQ(APPEND(0d9, [0d7]), [0d7, 0d9])) diff --git a/tests/cases/passing/append-source-unchanged.pre b/tests/cases/passing/append-source-unchanged.pre new file mode 100644 index 0000000..70eb129 --- /dev/null +++ b/tests/cases/passing/append-source-unchanged.pre @@ -0,0 +1,5 @@ +TNS: src = [0d10, 0d20] +TNS: out = APPEND(0d30, src) + +ASSERT(EQ(src, [0d10, 0d20])) +ASSERT(EQ(out, [0d10, 0d20, 0d30])) From c1d3b396f59eaccc136d1fffc15094131a62deeb Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 5 Apr 2026 01:12:00 -0400 Subject: [PATCH 11/60] Add tests for FILL. --- tests/cases/failing/fill-arity-one.pre | 1 + tests/cases/failing/fill-arity-three.pre | 1 + tests/cases/failing/fill-arity-zero.pre | 1 + tests/cases/failing/fill-first-non-tns.pre | 1 + tests/cases/failing/fill-value-type-mismatch-int-tensor.pre | 1 + tests/cases/failing/fill-value-type-mismatch-str-tensor.pre | 1 + tests/cases/passing/fill-basic.pre | 4 ++++ tests/cases/passing/fill-bool-elements.pre | 3 +++ tests/cases/passing/fill-rank2-shape.pre | 5 +++++ tests/cases/passing/fill-source-unchanged.pre | 5 +++++ tests/cases/passing/fill-string-elements.pre | 3 +++ 11 files changed, 26 insertions(+) create mode 100644 tests/cases/failing/fill-arity-one.pre create mode 100644 tests/cases/failing/fill-arity-three.pre create mode 100644 tests/cases/failing/fill-arity-zero.pre create mode 100644 tests/cases/failing/fill-first-non-tns.pre create mode 100644 tests/cases/failing/fill-value-type-mismatch-int-tensor.pre create mode 100644 tests/cases/failing/fill-value-type-mismatch-str-tensor.pre create mode 100644 tests/cases/passing/fill-basic.pre create mode 100644 tests/cases/passing/fill-bool-elements.pre create mode 100644 tests/cases/passing/fill-rank2-shape.pre create mode 100644 tests/cases/passing/fill-source-unchanged.pre create mode 100644 tests/cases/passing/fill-string-elements.pre diff --git a/tests/cases/failing/fill-arity-one.pre b/tests/cases/failing/fill-arity-one.pre new file mode 100644 index 0000000..aafa6cc --- /dev/null +++ b/tests/cases/failing/fill-arity-one.pre @@ -0,0 +1 @@ +FILL([0d1, 0d2]) \ No newline at end of file diff --git a/tests/cases/failing/fill-arity-three.pre b/tests/cases/failing/fill-arity-three.pre new file mode 100644 index 0000000..f8ec722 --- /dev/null +++ b/tests/cases/failing/fill-arity-three.pre @@ -0,0 +1 @@ +FILL([0d1], 0d2, 0d3) \ No newline at end of file diff --git a/tests/cases/failing/fill-arity-zero.pre b/tests/cases/failing/fill-arity-zero.pre new file mode 100644 index 0000000..0312dd8 --- /dev/null +++ b/tests/cases/failing/fill-arity-zero.pre @@ -0,0 +1 @@ +FILL() \ No newline at end of file diff --git a/tests/cases/failing/fill-first-non-tns.pre b/tests/cases/failing/fill-first-non-tns.pre new file mode 100644 index 0000000..2a1b717 --- /dev/null +++ b/tests/cases/failing/fill-first-non-tns.pre @@ -0,0 +1 @@ +FILL(0d1, 0d2) \ No newline at end of file diff --git a/tests/cases/failing/fill-value-type-mismatch-int-tensor.pre b/tests/cases/failing/fill-value-type-mismatch-int-tensor.pre new file mode 100644 index 0000000..8456b47 --- /dev/null +++ b/tests/cases/failing/fill-value-type-mismatch-int-tensor.pre @@ -0,0 +1 @@ +FILL([0d1, 0d2, 0d3], "x") \ No newline at end of file diff --git a/tests/cases/failing/fill-value-type-mismatch-str-tensor.pre b/tests/cases/failing/fill-value-type-mismatch-str-tensor.pre new file mode 100644 index 0000000..ba5dd35 --- /dev/null +++ b/tests/cases/failing/fill-value-type-mismatch-str-tensor.pre @@ -0,0 +1 @@ +FILL(["a", "b"], 0d1) \ No newline at end of file diff --git a/tests/cases/passing/fill-basic.pre b/tests/cases/passing/fill-basic.pre new file mode 100644 index 0000000..ff0bbbf --- /dev/null +++ b/tests/cases/passing/fill-basic.pre @@ -0,0 +1,4 @@ +TNS: src = [0d1, 0d2, 0d3] + +ASSERT(EQ(TYPE(FILL(src, 0d9)), "TNS")) +ASSERT(EQ(FILL(src, 0d9), [0d9, 0d9, 0d9])) \ No newline at end of file diff --git a/tests/cases/passing/fill-bool-elements.pre b/tests/cases/passing/fill-bool-elements.pre new file mode 100644 index 0000000..0990ad0 --- /dev/null +++ b/tests/cases/passing/fill-bool-elements.pre @@ -0,0 +1,3 @@ +TNS: flags = [TRUE, FALSE, TRUE] + +ASSERT(EQ(FILL(flags, FALSE), [FALSE, FALSE, FALSE])) \ No newline at end of file diff --git a/tests/cases/passing/fill-rank2-shape.pre b/tests/cases/passing/fill-rank2-shape.pre new file mode 100644 index 0000000..385232a --- /dev/null +++ b/tests/cases/passing/fill-rank2-shape.pre @@ -0,0 +1,5 @@ +TNS: src = [[0d1, 0d2], [0d3, 0d4]] +TNS: out = FILL(src, 0d0) + +ASSERT(EQ(out, [[0d0, 0d0], [0d0, 0d0]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) \ No newline at end of file diff --git a/tests/cases/passing/fill-source-unchanged.pre b/tests/cases/passing/fill-source-unchanged.pre new file mode 100644 index 0000000..b8ffc20 --- /dev/null +++ b/tests/cases/passing/fill-source-unchanged.pre @@ -0,0 +1,5 @@ +TNS: src = [0d10, 0d20] +TNS: out = FILL(src, 0d99) + +ASSERT(EQ(src, [0d10, 0d20])) +ASSERT(EQ(out, [0d99, 0d99])) \ No newline at end of file diff --git a/tests/cases/passing/fill-string-elements.pre b/tests/cases/passing/fill-string-elements.pre new file mode 100644 index 0000000..bb43da1 --- /dev/null +++ b/tests/cases/passing/fill-string-elements.pre @@ -0,0 +1,3 @@ +TNS: words = ["alpha", "beta", "gamma"] + +ASSERT(EQ(FILL(words, "z"), ["z", "z", "z"])) \ No newline at end of file From 52fa22d06e8a9650974de243caa9821a15b38e10 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 5 Apr 2026 01:14:45 -0400 Subject: [PATCH 12/60] Clean up test.ps1 output. --- tests/test.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test.ps1 b/tests/test.ps1 index 4996bf0..3c9dd4a 100644 --- a/tests/test.ps1 +++ b/tests/test.ps1 @@ -68,7 +68,6 @@ foreach ($case in $passingCases) { Write-Host "==> $($case): " -NoNewline if ($result.ExitCode -ne 0) { Write-Host 'fail' -ForegroundColor Red - Write-Host $result.Output -ForegroundColor Red $failures += [pscustomobject]@{ Path = $case Type = 'UnexpectedFailure' From 62861a95eb1b13587cde1107dcce1fdb746646da Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 5 Apr 2026 01:23:05 -0400 Subject: [PATCH 13/60] Add tests for CONV. --- tests/cases/failing/conv-arity-eight.pre | 1 + tests/cases/failing/conv-arity-one.pre | 1 + tests/cases/failing/conv-arity-zero.pre | 1 + tests/cases/failing/conv-extended-bias-not-tns.pre | 1 + tests/cases/failing/conv-extended-bias-size-mismatch.pre | 1 + tests/cases/failing/conv-extended-kernel-not-rank4.pre | 1 + tests/cases/failing/conv-extended-stride-w-non-int.pre | 1 + tests/cases/failing/conv-extended-x-not-rank3.pre | 1 + tests/cases/failing/conv-first-non-tns.pre | 1 + tests/cases/failing/conv-legacy-even-kernel.pre | 1 + tests/cases/failing/conv-legacy-rank-mismatch.pre | 1 + tests/cases/failing/conv-second-non-tns.pre | 1 + tests/cases/passing/conv-extended-basic.pre | 6 ++++++ tests/cases/passing/conv-extended-bias.pre | 6 ++++++ tests/cases/passing/conv-extended-flt-output-type.pre | 6 ++++++ tests/cases/passing/conv-legacy-1d-clamp.pre | 7 +++++++ tests/cases/passing/conv-legacy-flt-output-type.pre | 4 ++++ tests/cases/passing/conv-legacy-int-output-type.pre | 4 ++++ tests/cases/passing/conv-legacy-rank2-shape.pre | 6 ++++++ 19 files changed, 51 insertions(+) create mode 100644 tests/cases/failing/conv-arity-eight.pre create mode 100644 tests/cases/failing/conv-arity-one.pre create mode 100644 tests/cases/failing/conv-arity-zero.pre create mode 100644 tests/cases/failing/conv-extended-bias-not-tns.pre create mode 100644 tests/cases/failing/conv-extended-bias-size-mismatch.pre create mode 100644 tests/cases/failing/conv-extended-kernel-not-rank4.pre create mode 100644 tests/cases/failing/conv-extended-stride-w-non-int.pre create mode 100644 tests/cases/failing/conv-extended-x-not-rank3.pre create mode 100644 tests/cases/failing/conv-first-non-tns.pre create mode 100644 tests/cases/failing/conv-legacy-even-kernel.pre create mode 100644 tests/cases/failing/conv-legacy-rank-mismatch.pre create mode 100644 tests/cases/failing/conv-second-non-tns.pre create mode 100644 tests/cases/passing/conv-extended-basic.pre create mode 100644 tests/cases/passing/conv-extended-bias.pre create mode 100644 tests/cases/passing/conv-extended-flt-output-type.pre create mode 100644 tests/cases/passing/conv-legacy-1d-clamp.pre create mode 100644 tests/cases/passing/conv-legacy-flt-output-type.pre create mode 100644 tests/cases/passing/conv-legacy-int-output-type.pre create mode 100644 tests/cases/passing/conv-legacy-rank2-shape.pre diff --git a/tests/cases/failing/conv-arity-eight.pre b/tests/cases/failing/conv-arity-eight.pre new file mode 100644 index 0000000..a6cec1d --- /dev/null +++ b/tests/cases/failing/conv-arity-eight.pre @@ -0,0 +1 @@ +CONV([0d1], [0d1], 0d1, 0d1, 0d0, 0d0, [], 0d9) \ No newline at end of file diff --git a/tests/cases/failing/conv-arity-one.pre b/tests/cases/failing/conv-arity-one.pre new file mode 100644 index 0000000..678682c --- /dev/null +++ b/tests/cases/failing/conv-arity-one.pre @@ -0,0 +1 @@ +CONV([0d1]) \ No newline at end of file diff --git a/tests/cases/failing/conv-arity-zero.pre b/tests/cases/failing/conv-arity-zero.pre new file mode 100644 index 0000000..d3d4750 --- /dev/null +++ b/tests/cases/failing/conv-arity-zero.pre @@ -0,0 +1 @@ +CONV() \ No newline at end of file diff --git a/tests/cases/failing/conv-extended-bias-not-tns.pre b/tests/cases/failing/conv-extended-bias-not-tns.pre new file mode 100644 index 0000000..9818369 --- /dev/null +++ b/tests/cases/failing/conv-extended-bias-not-tns.pre @@ -0,0 +1 @@ +CONV([[[0d1]]], [[[[0d1]]]], bias = 0d1) \ No newline at end of file diff --git a/tests/cases/failing/conv-extended-bias-size-mismatch.pre b/tests/cases/failing/conv-extended-bias-size-mismatch.pre new file mode 100644 index 0000000..3c65dd2 --- /dev/null +++ b/tests/cases/failing/conv-extended-bias-size-mismatch.pre @@ -0,0 +1 @@ +CONV([[[0d1]]], [[[[0d1, 0d1]]]], bias = [0d5]) \ No newline at end of file diff --git a/tests/cases/failing/conv-extended-kernel-not-rank4.pre b/tests/cases/failing/conv-extended-kernel-not-rank4.pre new file mode 100644 index 0000000..a76af47 --- /dev/null +++ b/tests/cases/failing/conv-extended-kernel-not-rank4.pre @@ -0,0 +1 @@ +CONV([[[0d1]]], [[[0d1]]], stride_w = 0d1) \ No newline at end of file diff --git a/tests/cases/failing/conv-extended-stride-w-non-int.pre b/tests/cases/failing/conv-extended-stride-w-non-int.pre new file mode 100644 index 0000000..a4c177a --- /dev/null +++ b/tests/cases/failing/conv-extended-stride-w-non-int.pre @@ -0,0 +1 @@ +CONV([[[0d1]]], [[[[0d1]]]], stride_w = "1") \ No newline at end of file diff --git a/tests/cases/failing/conv-extended-x-not-rank3.pre b/tests/cases/failing/conv-extended-x-not-rank3.pre new file mode 100644 index 0000000..ea0da19 --- /dev/null +++ b/tests/cases/failing/conv-extended-x-not-rank3.pre @@ -0,0 +1 @@ +CONV([[0d1]], [[[[0d1]]]], stride_w = 0d1) \ No newline at end of file diff --git a/tests/cases/failing/conv-first-non-tns.pre b/tests/cases/failing/conv-first-non-tns.pre new file mode 100644 index 0000000..54198d3 --- /dev/null +++ b/tests/cases/failing/conv-first-non-tns.pre @@ -0,0 +1 @@ +CONV(0d1, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/conv-legacy-even-kernel.pre b/tests/cases/failing/conv-legacy-even-kernel.pre new file mode 100644 index 0000000..e75e809 --- /dev/null +++ b/tests/cases/failing/conv-legacy-even-kernel.pre @@ -0,0 +1 @@ +CONV([0d1, 0d2, 0d3], [0d1, 0d1]) \ No newline at end of file diff --git a/tests/cases/failing/conv-legacy-rank-mismatch.pre b/tests/cases/failing/conv-legacy-rank-mismatch.pre new file mode 100644 index 0000000..a12a7f6 --- /dev/null +++ b/tests/cases/failing/conv-legacy-rank-mismatch.pre @@ -0,0 +1 @@ +CONV([0d1, 0d2], [[0d1, 0d1, 0d1]]) \ No newline at end of file diff --git a/tests/cases/failing/conv-second-non-tns.pre b/tests/cases/failing/conv-second-non-tns.pre new file mode 100644 index 0000000..39c9410 --- /dev/null +++ b/tests/cases/failing/conv-second-non-tns.pre @@ -0,0 +1 @@ +CONV([0d1], 0d1) \ No newline at end of file diff --git a/tests/cases/passing/conv-extended-basic.pre b/tests/cases/passing/conv-extended-basic.pre new file mode 100644 index 0000000..814e218 --- /dev/null +++ b/tests/cases/passing/conv-extended-basic.pre @@ -0,0 +1,6 @@ +TNS: x = [[[0d1], [0d2], [0d3]], [[0d4], [0d5], [0d6]]] +TNS: kernel = [[[[0d1, 0d2]]]] +TNS: out = CONV(x, kernel, stride_w = 0d1) + +ASSERT(EQ(SHAPE(out), [0d2, 0d3, 0d2])) +ASSERT(EQ(out, [[[0d1, 0d2], [0d2, 0d4], [0d3, 0d6]], [[0d4, 0d8], [0d5, 0d10], [0d6, 0d12]]])) \ No newline at end of file diff --git a/tests/cases/passing/conv-extended-bias.pre b/tests/cases/passing/conv-extended-bias.pre new file mode 100644 index 0000000..334e496 --- /dev/null +++ b/tests/cases/passing/conv-extended-bias.pre @@ -0,0 +1,6 @@ +TNS: x = [[[0d3]]] +TNS: kernel = [[[[0d2, 0d3]]]] +TNS: out = CONV(x, kernel, bias = [0d10, 0d20]) + +ASSERT(EQ(SHAPE(out), [0d1, 0d1, 0d2])) +ASSERT(EQ(out, [[[0d16, 0d29]]])) \ No newline at end of file diff --git a/tests/cases/passing/conv-extended-flt-output-type.pre b/tests/cases/passing/conv-extended-flt-output-type.pre new file mode 100644 index 0000000..4440c89 --- /dev/null +++ b/tests/cases/passing/conv-extended-flt-output-type.pre @@ -0,0 +1,6 @@ +TNS: x = [[[0d2.0]]] +TNS: kernel = [[[[0d1.5]]]] +TNS: out = CONV(x, kernel, stride_w = 0d1) + +ASSERT(EQ(out, [[[0d3.0]]])) +ASSERT(EQ(TYPE(out[0d1, 0d1, 0d1]), "FLT")) \ No newline at end of file diff --git a/tests/cases/passing/conv-legacy-1d-clamp.pre b/tests/cases/passing/conv-legacy-1d-clamp.pre new file mode 100644 index 0000000..e72004e --- /dev/null +++ b/tests/cases/passing/conv-legacy-1d-clamp.pre @@ -0,0 +1,7 @@ +TNS: x = [0d1, 0d2, 0d3] +TNS: k = [0d1, 0d1, 0d1] +TNS: out = CONV(x, k) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(SHAPE(out), [0d3])) +ASSERT(EQ(out, [0d4, 0d6, 0d8])) \ No newline at end of file diff --git a/tests/cases/passing/conv-legacy-flt-output-type.pre b/tests/cases/passing/conv-legacy-flt-output-type.pre new file mode 100644 index 0000000..39109c0 --- /dev/null +++ b/tests/cases/passing/conv-legacy-flt-output-type.pre @@ -0,0 +1,4 @@ +TNS: out = CONV([0d2.0], [0d1.0]) + +ASSERT(EQ(out, [0d2.0])) +ASSERT(EQ(TYPE(out[0d1]), "FLT")) \ No newline at end of file diff --git a/tests/cases/passing/conv-legacy-int-output-type.pre b/tests/cases/passing/conv-legacy-int-output-type.pre new file mode 100644 index 0000000..c861386 --- /dev/null +++ b/tests/cases/passing/conv-legacy-int-output-type.pre @@ -0,0 +1,4 @@ +TNS: out = CONV([0d7], [0d1]) + +ASSERT(EQ(out, [0d7])) +ASSERT(EQ(TYPE(out[0d1]), "INT")) \ No newline at end of file diff --git a/tests/cases/passing/conv-legacy-rank2-shape.pre b/tests/cases/passing/conv-legacy-rank2-shape.pre new file mode 100644 index 0000000..c8b86a4 --- /dev/null +++ b/tests/cases/passing/conv-legacy-rank2-shape.pre @@ -0,0 +1,6 @@ +TNS: x = [[0d1, 0d2], [0d3, 0d4]] +TNS: k = [[0d0, 0d0, 0d0], [0d0, 0d1, 0d0], [0d0, 0d0, 0d0]] +TNS: out = CONV(x, k) + +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) +ASSERT(EQ(out, x)) \ No newline at end of file From 249c9d7ae06fe63935553ebeb31697be1a8f1123 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 5 Apr 2026 01:26:26 -0400 Subject: [PATCH 14/60] Add tests for IN. --- tests/cases/failing/in-arity-one.pre | 1 + tests/cases/failing/in-arity-three.pre | 1 + tests/cases/failing/in-arity-zero.pre | 1 + tests/cases/failing/in-second-non-tns-int.pre | 1 + tests/cases/failing/in-second-non-tns-str.pre | 1 + tests/cases/passing/in-basic-false.pre | 1 + tests/cases/passing/in-basic-true.pre | 1 + tests/cases/passing/in-rank2.pre | 4 ++++ tests/cases/passing/in-return-type.pre | 1 + tests/cases/passing/in-strings-bools.pre | 2 ++ 10 files changed, 14 insertions(+) create mode 100644 tests/cases/failing/in-arity-one.pre create mode 100644 tests/cases/failing/in-arity-three.pre create mode 100644 tests/cases/failing/in-arity-zero.pre create mode 100644 tests/cases/failing/in-second-non-tns-int.pre create mode 100644 tests/cases/failing/in-second-non-tns-str.pre create mode 100644 tests/cases/passing/in-basic-false.pre create mode 100644 tests/cases/passing/in-basic-true.pre create mode 100644 tests/cases/passing/in-rank2.pre create mode 100644 tests/cases/passing/in-return-type.pre create mode 100644 tests/cases/passing/in-strings-bools.pre diff --git a/tests/cases/failing/in-arity-one.pre b/tests/cases/failing/in-arity-one.pre new file mode 100644 index 0000000..3108ec2 --- /dev/null +++ b/tests/cases/failing/in-arity-one.pre @@ -0,0 +1 @@ +IN(0d1) diff --git a/tests/cases/failing/in-arity-three.pre b/tests/cases/failing/in-arity-three.pre new file mode 100644 index 0000000..c660311 --- /dev/null +++ b/tests/cases/failing/in-arity-three.pre @@ -0,0 +1 @@ +IN(0d1, [0d1], 0d2) diff --git a/tests/cases/failing/in-arity-zero.pre b/tests/cases/failing/in-arity-zero.pre new file mode 100644 index 0000000..b786a33 --- /dev/null +++ b/tests/cases/failing/in-arity-zero.pre @@ -0,0 +1 @@ +IN() diff --git a/tests/cases/failing/in-second-non-tns-int.pre b/tests/cases/failing/in-second-non-tns-int.pre new file mode 100644 index 0000000..4300100 --- /dev/null +++ b/tests/cases/failing/in-second-non-tns-int.pre @@ -0,0 +1 @@ +IN(0d1, 0d2) diff --git a/tests/cases/failing/in-second-non-tns-str.pre b/tests/cases/failing/in-second-non-tns-str.pre new file mode 100644 index 0000000..a386b22 --- /dev/null +++ b/tests/cases/failing/in-second-non-tns-str.pre @@ -0,0 +1 @@ +IN(0d1, "not-a-tensor") diff --git a/tests/cases/passing/in-basic-false.pre b/tests/cases/passing/in-basic-false.pre new file mode 100644 index 0000000..f19ccc2 --- /dev/null +++ b/tests/cases/passing/in-basic-false.pre @@ -0,0 +1 @@ +ASSERT(NOT(IN(0d9, [0d1, 0d2, 0d3]))) diff --git a/tests/cases/passing/in-basic-true.pre b/tests/cases/passing/in-basic-true.pre new file mode 100644 index 0000000..ca8d2a4 --- /dev/null +++ b/tests/cases/passing/in-basic-true.pre @@ -0,0 +1 @@ +ASSERT(IN(0d2, [0d1, 0d2, 0d3])) diff --git a/tests/cases/passing/in-rank2.pre b/tests/cases/passing/in-rank2.pre new file mode 100644 index 0000000..a1244f2 --- /dev/null +++ b/tests/cases/passing/in-rank2.pre @@ -0,0 +1,4 @@ +TNS: grid = [[0d1, 0d2], [0d3, 0d4]] + +ASSERT(IN(0d4, grid)) +ASSERT(NOT(IN(0d9, grid))) diff --git a/tests/cases/passing/in-return-type.pre b/tests/cases/passing/in-return-type.pre new file mode 100644 index 0000000..470c80a --- /dev/null +++ b/tests/cases/passing/in-return-type.pre @@ -0,0 +1 @@ +ASSERT(EQ(TYPE(IN(0d1, [0d1])), "BOOL")) diff --git a/tests/cases/passing/in-strings-bools.pre b/tests/cases/passing/in-strings-bools.pre new file mode 100644 index 0000000..c6fa354 --- /dev/null +++ b/tests/cases/passing/in-strings-bools.pre @@ -0,0 +1,2 @@ +ASSERT(IN("beta", ["alpha", "beta", "gamma"])) +ASSERT(IN(FALSE, [TRUE, FALSE])) From 7a3ec940c910c9364ef63a22e55cc2762debaba1 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 5 Apr 2026 01:45:41 -0400 Subject: [PATCH 15/60] Add tests for TNS-TNS arithmetic. --- tests/cases/failing/madd-arity-one.pre | 1 + tests/cases/failing/madd-arity-three.pre | 1 + tests/cases/failing/madd-arity-zero.pre | 1 + tests/cases/failing/madd-first-non-tns.pre | 1 + tests/cases/failing/madd-non-numeric.pre | 1 + tests/cases/failing/madd-second-non-tns.pre | 1 + tests/cases/failing/madd-shape-mismatch.pre | 1 + tests/cases/failing/mdiv-arity-one.pre | 1 + tests/cases/failing/mdiv-arity-three.pre | 1 + tests/cases/failing/mdiv-arity-zero.pre | 1 + tests/cases/failing/mdiv-first-non-tns.pre | 1 + tests/cases/failing/mdiv-non-numeric.pre | 1 + tests/cases/failing/mdiv-second-non-tns.pre | 1 + tests/cases/failing/mdiv-shape-mismatch.pre | 1 + tests/cases/failing/mdiv-zero.pre | 1 + tests/cases/failing/mmul-arity-one.pre | 1 + tests/cases/failing/mmul-arity-three.pre | 1 + tests/cases/failing/mmul-arity-zero.pre | 1 + tests/cases/failing/mmul-first-non-tns.pre | 1 + tests/cases/failing/mmul-non-numeric.pre | 1 + tests/cases/failing/mmul-second-non-tns.pre | 1 + tests/cases/failing/mmul-shape-mismatch.pre | 1 + tests/cases/failing/mprod-arity-zero.pre | 1 + tests/cases/failing/mprod-non-numeric.pre | 1 + tests/cases/failing/mprod-non-tns-arg.pre | 1 + tests/cases/failing/mprod-shape-mismatch.pre | 1 + tests/cases/failing/msum-arity-zero.pre | 1 + tests/cases/failing/msum-non-numeric.pre | 1 + tests/cases/failing/msum-non-tns-arg.pre | 1 + tests/cases/failing/msum-shape-mismatch.pre | 1 + tests/cases/passing/madd-basic.pre | 4 ++++ tests/cases/passing/madd-rank2-shape.pre | 6 ++++++ tests/cases/passing/mdiv-basic.pre | 1 + tests/cases/passing/mdiv-rank2.pre | 4 ++++ tests/cases/passing/mmul-basic.pre | 1 + tests/cases/passing/mmul-rank2-shape.pre | 6 ++++++ tests/cases/passing/mprod-single.pre | 3 +++ tests/cases/passing/mprod-three.pre | 1 + tests/cases/passing/mprod-two.pre | 1 + tests/cases/passing/msum-single.pre | 3 +++ tests/cases/passing/msum-three.pre | 1 + tests/cases/passing/msum-two.pre | 1 + 42 files changed, 62 insertions(+) create mode 100644 tests/cases/failing/madd-arity-one.pre create mode 100644 tests/cases/failing/madd-arity-three.pre create mode 100644 tests/cases/failing/madd-arity-zero.pre create mode 100644 tests/cases/failing/madd-first-non-tns.pre create mode 100644 tests/cases/failing/madd-non-numeric.pre create mode 100644 tests/cases/failing/madd-second-non-tns.pre create mode 100644 tests/cases/failing/madd-shape-mismatch.pre create mode 100644 tests/cases/failing/mdiv-arity-one.pre create mode 100644 tests/cases/failing/mdiv-arity-three.pre create mode 100644 tests/cases/failing/mdiv-arity-zero.pre create mode 100644 tests/cases/failing/mdiv-first-non-tns.pre create mode 100644 tests/cases/failing/mdiv-non-numeric.pre create mode 100644 tests/cases/failing/mdiv-second-non-tns.pre create mode 100644 tests/cases/failing/mdiv-shape-mismatch.pre create mode 100644 tests/cases/failing/mdiv-zero.pre create mode 100644 tests/cases/failing/mmul-arity-one.pre create mode 100644 tests/cases/failing/mmul-arity-three.pre create mode 100644 tests/cases/failing/mmul-arity-zero.pre create mode 100644 tests/cases/failing/mmul-first-non-tns.pre create mode 100644 tests/cases/failing/mmul-non-numeric.pre create mode 100644 tests/cases/failing/mmul-second-non-tns.pre create mode 100644 tests/cases/failing/mmul-shape-mismatch.pre create mode 100644 tests/cases/failing/mprod-arity-zero.pre create mode 100644 tests/cases/failing/mprod-non-numeric.pre create mode 100644 tests/cases/failing/mprod-non-tns-arg.pre create mode 100644 tests/cases/failing/mprod-shape-mismatch.pre create mode 100644 tests/cases/failing/msum-arity-zero.pre create mode 100644 tests/cases/failing/msum-non-numeric.pre create mode 100644 tests/cases/failing/msum-non-tns-arg.pre create mode 100644 tests/cases/failing/msum-shape-mismatch.pre create mode 100644 tests/cases/passing/madd-basic.pre create mode 100644 tests/cases/passing/madd-rank2-shape.pre create mode 100644 tests/cases/passing/mdiv-basic.pre create mode 100644 tests/cases/passing/mdiv-rank2.pre create mode 100644 tests/cases/passing/mmul-basic.pre create mode 100644 tests/cases/passing/mmul-rank2-shape.pre create mode 100644 tests/cases/passing/mprod-single.pre create mode 100644 tests/cases/passing/mprod-three.pre create mode 100644 tests/cases/passing/mprod-two.pre create mode 100644 tests/cases/passing/msum-single.pre create mode 100644 tests/cases/passing/msum-three.pre create mode 100644 tests/cases/passing/msum-two.pre diff --git a/tests/cases/failing/madd-arity-one.pre b/tests/cases/failing/madd-arity-one.pre new file mode 100644 index 0000000..436af8a --- /dev/null +++ b/tests/cases/failing/madd-arity-one.pre @@ -0,0 +1 @@ +MADD([0d1]) diff --git a/tests/cases/failing/madd-arity-three.pre b/tests/cases/failing/madd-arity-three.pre new file mode 100644 index 0000000..8ad6250 --- /dev/null +++ b/tests/cases/failing/madd-arity-three.pre @@ -0,0 +1 @@ +MADD([0d1], [0d2], [0d3]) diff --git a/tests/cases/failing/madd-arity-zero.pre b/tests/cases/failing/madd-arity-zero.pre new file mode 100644 index 0000000..94a77ad --- /dev/null +++ b/tests/cases/failing/madd-arity-zero.pre @@ -0,0 +1 @@ +MADD() diff --git a/tests/cases/failing/madd-first-non-tns.pre b/tests/cases/failing/madd-first-non-tns.pre new file mode 100644 index 0000000..e466f4e --- /dev/null +++ b/tests/cases/failing/madd-first-non-tns.pre @@ -0,0 +1 @@ +MADD(0d1, [0d2]) diff --git a/tests/cases/failing/madd-non-numeric.pre b/tests/cases/failing/madd-non-numeric.pre new file mode 100644 index 0000000..fc0345c --- /dev/null +++ b/tests/cases/failing/madd-non-numeric.pre @@ -0,0 +1 @@ +MADD(["a"], ["b"]) diff --git a/tests/cases/failing/madd-second-non-tns.pre b/tests/cases/failing/madd-second-non-tns.pre new file mode 100644 index 0000000..9997098 --- /dev/null +++ b/tests/cases/failing/madd-second-non-tns.pre @@ -0,0 +1 @@ +MADD([0d1], 0d2) diff --git a/tests/cases/failing/madd-shape-mismatch.pre b/tests/cases/failing/madd-shape-mismatch.pre new file mode 100644 index 0000000..413c81d --- /dev/null +++ b/tests/cases/failing/madd-shape-mismatch.pre @@ -0,0 +1 @@ +MADD([0d1, 0d2], [0d3]) diff --git a/tests/cases/failing/mdiv-arity-one.pre b/tests/cases/failing/mdiv-arity-one.pre new file mode 100644 index 0000000..8110d04 --- /dev/null +++ b/tests/cases/failing/mdiv-arity-one.pre @@ -0,0 +1 @@ +MDIV([0d1]) diff --git a/tests/cases/failing/mdiv-arity-three.pre b/tests/cases/failing/mdiv-arity-three.pre new file mode 100644 index 0000000..f9657c2 --- /dev/null +++ b/tests/cases/failing/mdiv-arity-three.pre @@ -0,0 +1 @@ +MDIV([0d1], [0d2], [0d3]) diff --git a/tests/cases/failing/mdiv-arity-zero.pre b/tests/cases/failing/mdiv-arity-zero.pre new file mode 100644 index 0000000..d385bcf --- /dev/null +++ b/tests/cases/failing/mdiv-arity-zero.pre @@ -0,0 +1 @@ +MDIV() diff --git a/tests/cases/failing/mdiv-first-non-tns.pre b/tests/cases/failing/mdiv-first-non-tns.pre new file mode 100644 index 0000000..10d9f5c --- /dev/null +++ b/tests/cases/failing/mdiv-first-non-tns.pre @@ -0,0 +1 @@ +MDIV(0d1, [0d2]) diff --git a/tests/cases/failing/mdiv-non-numeric.pre b/tests/cases/failing/mdiv-non-numeric.pre new file mode 100644 index 0000000..b8ebc6a --- /dev/null +++ b/tests/cases/failing/mdiv-non-numeric.pre @@ -0,0 +1 @@ +MDIV(["a"], ["b"]) diff --git a/tests/cases/failing/mdiv-second-non-tns.pre b/tests/cases/failing/mdiv-second-non-tns.pre new file mode 100644 index 0000000..03d6bb3 --- /dev/null +++ b/tests/cases/failing/mdiv-second-non-tns.pre @@ -0,0 +1 @@ +MDIV([0d1], 0d2) diff --git a/tests/cases/failing/mdiv-shape-mismatch.pre b/tests/cases/failing/mdiv-shape-mismatch.pre new file mode 100644 index 0000000..8a1bbec --- /dev/null +++ b/tests/cases/failing/mdiv-shape-mismatch.pre @@ -0,0 +1 @@ +MDIV([0d1, 0d2], [0d3]) diff --git a/tests/cases/failing/mdiv-zero.pre b/tests/cases/failing/mdiv-zero.pre new file mode 100644 index 0000000..e8cebaf --- /dev/null +++ b/tests/cases/failing/mdiv-zero.pre @@ -0,0 +1 @@ +MDIV([0d1, 0d2], [0d1, 0d0]) diff --git a/tests/cases/failing/mmul-arity-one.pre b/tests/cases/failing/mmul-arity-one.pre new file mode 100644 index 0000000..6cfb26a --- /dev/null +++ b/tests/cases/failing/mmul-arity-one.pre @@ -0,0 +1 @@ +MMUL([0d1]) diff --git a/tests/cases/failing/mmul-arity-three.pre b/tests/cases/failing/mmul-arity-three.pre new file mode 100644 index 0000000..fd17980 --- /dev/null +++ b/tests/cases/failing/mmul-arity-three.pre @@ -0,0 +1 @@ +MMUL([0d1], [0d2], [0d3]) diff --git a/tests/cases/failing/mmul-arity-zero.pre b/tests/cases/failing/mmul-arity-zero.pre new file mode 100644 index 0000000..64b8da4 --- /dev/null +++ b/tests/cases/failing/mmul-arity-zero.pre @@ -0,0 +1 @@ +MMUL() diff --git a/tests/cases/failing/mmul-first-non-tns.pre b/tests/cases/failing/mmul-first-non-tns.pre new file mode 100644 index 0000000..5c03171 --- /dev/null +++ b/tests/cases/failing/mmul-first-non-tns.pre @@ -0,0 +1 @@ +MMUL(0d1, [0d2]) diff --git a/tests/cases/failing/mmul-non-numeric.pre b/tests/cases/failing/mmul-non-numeric.pre new file mode 100644 index 0000000..bb7e4f5 --- /dev/null +++ b/tests/cases/failing/mmul-non-numeric.pre @@ -0,0 +1 @@ +MMUL(["a"], ["b"]) diff --git a/tests/cases/failing/mmul-second-non-tns.pre b/tests/cases/failing/mmul-second-non-tns.pre new file mode 100644 index 0000000..d569ec7 --- /dev/null +++ b/tests/cases/failing/mmul-second-non-tns.pre @@ -0,0 +1 @@ +MMUL([0d1], 0d2) diff --git a/tests/cases/failing/mmul-shape-mismatch.pre b/tests/cases/failing/mmul-shape-mismatch.pre new file mode 100644 index 0000000..2064b8e --- /dev/null +++ b/tests/cases/failing/mmul-shape-mismatch.pre @@ -0,0 +1 @@ +MMUL([0d1, 0d2], [0d3]) diff --git a/tests/cases/failing/mprod-arity-zero.pre b/tests/cases/failing/mprod-arity-zero.pre new file mode 100644 index 0000000..c2e8362 --- /dev/null +++ b/tests/cases/failing/mprod-arity-zero.pre @@ -0,0 +1 @@ +MPROD() diff --git a/tests/cases/failing/mprod-non-numeric.pre b/tests/cases/failing/mprod-non-numeric.pre new file mode 100644 index 0000000..948a322 --- /dev/null +++ b/tests/cases/failing/mprod-non-numeric.pre @@ -0,0 +1 @@ +MPROD(["a"], ["b"]) diff --git a/tests/cases/failing/mprod-non-tns-arg.pre b/tests/cases/failing/mprod-non-tns-arg.pre new file mode 100644 index 0000000..25e5f85 --- /dev/null +++ b/tests/cases/failing/mprod-non-tns-arg.pre @@ -0,0 +1 @@ +MPROD([0d1], 0d2) diff --git a/tests/cases/failing/mprod-shape-mismatch.pre b/tests/cases/failing/mprod-shape-mismatch.pre new file mode 100644 index 0000000..278a489 --- /dev/null +++ b/tests/cases/failing/mprod-shape-mismatch.pre @@ -0,0 +1 @@ +MPROD([0d1, 0d2], [0d3]) diff --git a/tests/cases/failing/msum-arity-zero.pre b/tests/cases/failing/msum-arity-zero.pre new file mode 100644 index 0000000..a18aa19 --- /dev/null +++ b/tests/cases/failing/msum-arity-zero.pre @@ -0,0 +1 @@ +MSUM() diff --git a/tests/cases/failing/msum-non-numeric.pre b/tests/cases/failing/msum-non-numeric.pre new file mode 100644 index 0000000..94217bc --- /dev/null +++ b/tests/cases/failing/msum-non-numeric.pre @@ -0,0 +1 @@ +MSUM(["a"], ["b"]) diff --git a/tests/cases/failing/msum-non-tns-arg.pre b/tests/cases/failing/msum-non-tns-arg.pre new file mode 100644 index 0000000..0f81d2f --- /dev/null +++ b/tests/cases/failing/msum-non-tns-arg.pre @@ -0,0 +1 @@ +MSUM([0d1], 0d2) diff --git a/tests/cases/failing/msum-shape-mismatch.pre b/tests/cases/failing/msum-shape-mismatch.pre new file mode 100644 index 0000000..1ff2955 --- /dev/null +++ b/tests/cases/failing/msum-shape-mismatch.pre @@ -0,0 +1 @@ +MSUM([0d1, 0d2], [0d3]) diff --git a/tests/cases/passing/madd-basic.pre b/tests/cases/passing/madd-basic.pre new file mode 100644 index 0000000..3813fd6 --- /dev/null +++ b/tests/cases/passing/madd-basic.pre @@ -0,0 +1,4 @@ +TNS: out = MADD([0d1, 0d2, 0d3], [0d4, 0d5, 0d6]) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d5, 0d7, 0d9])) diff --git a/tests/cases/passing/madd-rank2-shape.pre b/tests/cases/passing/madd-rank2-shape.pre new file mode 100644 index 0000000..b778834 --- /dev/null +++ b/tests/cases/passing/madd-rank2-shape.pre @@ -0,0 +1,6 @@ +TNS: a = [[0d1, 0d2], [0d3, 0d4]] +TNS: b = [[0d10, 0d20], [0d30, 0d40]] +TNS: out = MADD(a, b) + +ASSERT(EQ(out, [[0d11, 0d22], [0d33, 0d44]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) diff --git a/tests/cases/passing/mdiv-basic.pre b/tests/cases/passing/mdiv-basic.pre new file mode 100644 index 0000000..0c9b13d --- /dev/null +++ b/tests/cases/passing/mdiv-basic.pre @@ -0,0 +1 @@ +ASSERT(EQ(MDIV([0d8, 0d6, 0d4], [0d2, 0d3, 0d2]), [0d4, 0d2, 0d2])) diff --git a/tests/cases/passing/mdiv-rank2.pre b/tests/cases/passing/mdiv-rank2.pre new file mode 100644 index 0000000..aae6b50 --- /dev/null +++ b/tests/cases/passing/mdiv-rank2.pre @@ -0,0 +1,4 @@ +TNS: out = MDIV([[0d9, 0d8], [0d6, 0d4]], [[0d3, 0d2], [0d3, 0d2]]) + +ASSERT(EQ(out, [[0d3, 0d4], [0d2, 0d2]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) diff --git a/tests/cases/passing/mmul-basic.pre b/tests/cases/passing/mmul-basic.pre new file mode 100644 index 0000000..74cd57e --- /dev/null +++ b/tests/cases/passing/mmul-basic.pre @@ -0,0 +1 @@ +ASSERT(EQ(MMUL([0d1, 0d2, 0d3], [0d4, 0d5, 0d6]), [0d4, 0d10, 0d18])) diff --git a/tests/cases/passing/mmul-rank2-shape.pre b/tests/cases/passing/mmul-rank2-shape.pre new file mode 100644 index 0000000..dfd5eef --- /dev/null +++ b/tests/cases/passing/mmul-rank2-shape.pre @@ -0,0 +1,6 @@ +TNS: a = [[0d1, 0d2], [0d3, 0d4]] +TNS: b = [[0d5, 0d6], [0d7, 0d8]] +TNS: out = MMUL(a, b) + +ASSERT(EQ(out, [[0d5, 0d12], [0d21, 0d32]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) diff --git a/tests/cases/passing/mprod-single.pre b/tests/cases/passing/mprod-single.pre new file mode 100644 index 0000000..1065cb7 --- /dev/null +++ b/tests/cases/passing/mprod-single.pre @@ -0,0 +1,3 @@ +TNS: x = [[0d2, 0d3], [0d4, 0d5]] + +ASSERT(EQ(MPROD(x), x)) diff --git a/tests/cases/passing/mprod-three.pre b/tests/cases/passing/mprod-three.pre new file mode 100644 index 0000000..bb3c5a3 --- /dev/null +++ b/tests/cases/passing/mprod-three.pre @@ -0,0 +1 @@ +ASSERT(EQ(MPROD([0d2, 0d3], [0d4, 0d5], [0d6, 0d7]), [0d48, 0d105])) diff --git a/tests/cases/passing/mprod-two.pre b/tests/cases/passing/mprod-two.pre new file mode 100644 index 0000000..a7b7b1f --- /dev/null +++ b/tests/cases/passing/mprod-two.pre @@ -0,0 +1 @@ +ASSERT(EQ(MPROD([0d2, 0d3], [0d4, 0d5]), [0d8, 0d15])) diff --git a/tests/cases/passing/msum-single.pre b/tests/cases/passing/msum-single.pre new file mode 100644 index 0000000..1ea86d8 --- /dev/null +++ b/tests/cases/passing/msum-single.pre @@ -0,0 +1,3 @@ +TNS: x = [[0d1, 0d2], [0d3, 0d4]] + +ASSERT(EQ(MSUM(x), x)) diff --git a/tests/cases/passing/msum-three.pre b/tests/cases/passing/msum-three.pre new file mode 100644 index 0000000..6b25e59 --- /dev/null +++ b/tests/cases/passing/msum-three.pre @@ -0,0 +1 @@ +ASSERT(EQ(MSUM([0d1, 0d2], [0d3, 0d4], [0d5, 0d6]), [0d9, 0d12])) diff --git a/tests/cases/passing/msum-two.pre b/tests/cases/passing/msum-two.pre new file mode 100644 index 0000000..f584b30 --- /dev/null +++ b/tests/cases/passing/msum-two.pre @@ -0,0 +1 @@ +ASSERT(EQ(MSUM([0d1, 0d2], [0d3, 0d4]), [0d4, 0d6])) From 1ee4be0695e59f86d3833da60d0d1166db3a434b Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 6 Apr 2026 06:10:17 -0400 Subject: [PATCH 16/60] Add tests for TNS-scalar arithmetic. --- tests/cases/failing/tadd-arity-one.pre | 1 + tests/cases/failing/tadd-arity-three.pre | 1 + tests/cases/failing/tadd-arity-zero.pre | 1 + tests/cases/failing/tadd-first-non-tns.pre | 1 + tests/cases/failing/tadd-mixed-numeric-types.pre | 1 + tests/cases/failing/tadd-second-non-numeric.pre | 1 + tests/cases/failing/tadd-tensor-mixed-numeric-elements.pre | 1 + tests/cases/failing/tadd-tensor-non-numeric.pre | 1 + tests/cases/failing/tdiv-arity-one.pre | 1 + tests/cases/failing/tdiv-arity-three.pre | 1 + tests/cases/failing/tdiv-arity-zero.pre | 1 + tests/cases/failing/tdiv-first-non-tns.pre | 1 + tests/cases/failing/tdiv-mixed-numeric-types.pre | 1 + tests/cases/failing/tdiv-second-non-numeric.pre | 1 + tests/cases/failing/tdiv-tensor-mixed-numeric-elements.pre | 1 + tests/cases/failing/tdiv-tensor-non-numeric.pre | 1 + tests/cases/failing/tdiv-zero-float.pre | 1 + tests/cases/failing/tdiv-zero.pre | 1 + tests/cases/failing/tmul-arity-one.pre | 1 + tests/cases/failing/tmul-arity-three.pre | 1 + tests/cases/failing/tmul-arity-zero.pre | 1 + tests/cases/failing/tmul-first-non-tns.pre | 1 + tests/cases/failing/tmul-mixed-numeric-types.pre | 1 + tests/cases/failing/tmul-second-non-numeric.pre | 1 + tests/cases/failing/tmul-tensor-mixed-numeric-elements.pre | 1 + tests/cases/failing/tmul-tensor-non-numeric.pre | 1 + tests/cases/failing/tpow-arity-one.pre | 1 + tests/cases/failing/tpow-arity-three.pre | 1 + tests/cases/failing/tpow-arity-zero.pre | 1 + tests/cases/failing/tpow-first-non-tns.pre | 1 + tests/cases/failing/tpow-mixed-numeric-types.pre | 1 + tests/cases/failing/tpow-second-non-numeric.pre | 1 + tests/cases/failing/tpow-tensor-mixed-numeric-elements.pre | 1 + tests/cases/failing/tpow-tensor-non-numeric.pre | 1 + tests/cases/failing/tsub-arity-one.pre | 1 + tests/cases/failing/tsub-arity-three.pre | 1 + tests/cases/failing/tsub-arity-zero.pre | 1 + tests/cases/failing/tsub-first-non-tns.pre | 1 + tests/cases/failing/tsub-mixed-numeric-types.pre | 1 + tests/cases/failing/tsub-second-non-numeric.pre | 1 + tests/cases/failing/tsub-tensor-mixed-numeric-elements.pre | 1 + tests/cases/failing/tsub-tensor-non-numeric.pre | 1 + tests/cases/passing/tadd-basic.pre | 4 ++++ tests/cases/passing/tadd-float.pre | 1 + tests/cases/passing/tadd-rank2-shape.pre | 5 +++++ tests/cases/passing/tdiv-basic.pre | 4 ++++ tests/cases/passing/tdiv-float.pre | 1 + tests/cases/passing/tdiv-rank2-shape.pre | 5 +++++ tests/cases/passing/tmul-basic.pre | 4 ++++ tests/cases/passing/tmul-float.pre | 1 + tests/cases/passing/tmul-rank2-shape.pre | 5 +++++ tests/cases/passing/tpow-basic.pre | 4 ++++ tests/cases/passing/tpow-float.pre | 1 + tests/cases/passing/tpow-rank2-shape.pre | 5 +++++ tests/cases/passing/tsub-basic.pre | 4 ++++ tests/cases/passing/tsub-float.pre | 1 + tests/cases/passing/tsub-rank2-shape.pre | 5 +++++ 57 files changed, 92 insertions(+) create mode 100644 tests/cases/failing/tadd-arity-one.pre create mode 100644 tests/cases/failing/tadd-arity-three.pre create mode 100644 tests/cases/failing/tadd-arity-zero.pre create mode 100644 tests/cases/failing/tadd-first-non-tns.pre create mode 100644 tests/cases/failing/tadd-mixed-numeric-types.pre create mode 100644 tests/cases/failing/tadd-second-non-numeric.pre create mode 100644 tests/cases/failing/tadd-tensor-mixed-numeric-elements.pre create mode 100644 tests/cases/failing/tadd-tensor-non-numeric.pre create mode 100644 tests/cases/failing/tdiv-arity-one.pre create mode 100644 tests/cases/failing/tdiv-arity-three.pre create mode 100644 tests/cases/failing/tdiv-arity-zero.pre create mode 100644 tests/cases/failing/tdiv-first-non-tns.pre create mode 100644 tests/cases/failing/tdiv-mixed-numeric-types.pre create mode 100644 tests/cases/failing/tdiv-second-non-numeric.pre create mode 100644 tests/cases/failing/tdiv-tensor-mixed-numeric-elements.pre create mode 100644 tests/cases/failing/tdiv-tensor-non-numeric.pre create mode 100644 tests/cases/failing/tdiv-zero-float.pre create mode 100644 tests/cases/failing/tdiv-zero.pre create mode 100644 tests/cases/failing/tmul-arity-one.pre create mode 100644 tests/cases/failing/tmul-arity-three.pre create mode 100644 tests/cases/failing/tmul-arity-zero.pre create mode 100644 tests/cases/failing/tmul-first-non-tns.pre create mode 100644 tests/cases/failing/tmul-mixed-numeric-types.pre create mode 100644 tests/cases/failing/tmul-second-non-numeric.pre create mode 100644 tests/cases/failing/tmul-tensor-mixed-numeric-elements.pre create mode 100644 tests/cases/failing/tmul-tensor-non-numeric.pre create mode 100644 tests/cases/failing/tpow-arity-one.pre create mode 100644 tests/cases/failing/tpow-arity-three.pre create mode 100644 tests/cases/failing/tpow-arity-zero.pre create mode 100644 tests/cases/failing/tpow-first-non-tns.pre create mode 100644 tests/cases/failing/tpow-mixed-numeric-types.pre create mode 100644 tests/cases/failing/tpow-second-non-numeric.pre create mode 100644 tests/cases/failing/tpow-tensor-mixed-numeric-elements.pre create mode 100644 tests/cases/failing/tpow-tensor-non-numeric.pre create mode 100644 tests/cases/failing/tsub-arity-one.pre create mode 100644 tests/cases/failing/tsub-arity-three.pre create mode 100644 tests/cases/failing/tsub-arity-zero.pre create mode 100644 tests/cases/failing/tsub-first-non-tns.pre create mode 100644 tests/cases/failing/tsub-mixed-numeric-types.pre create mode 100644 tests/cases/failing/tsub-second-non-numeric.pre create mode 100644 tests/cases/failing/tsub-tensor-mixed-numeric-elements.pre create mode 100644 tests/cases/failing/tsub-tensor-non-numeric.pre create mode 100644 tests/cases/passing/tadd-basic.pre create mode 100644 tests/cases/passing/tadd-float.pre create mode 100644 tests/cases/passing/tadd-rank2-shape.pre create mode 100644 tests/cases/passing/tdiv-basic.pre create mode 100644 tests/cases/passing/tdiv-float.pre create mode 100644 tests/cases/passing/tdiv-rank2-shape.pre create mode 100644 tests/cases/passing/tmul-basic.pre create mode 100644 tests/cases/passing/tmul-float.pre create mode 100644 tests/cases/passing/tmul-rank2-shape.pre create mode 100644 tests/cases/passing/tpow-basic.pre create mode 100644 tests/cases/passing/tpow-float.pre create mode 100644 tests/cases/passing/tpow-rank2-shape.pre create mode 100644 tests/cases/passing/tsub-basic.pre create mode 100644 tests/cases/passing/tsub-float.pre create mode 100644 tests/cases/passing/tsub-rank2-shape.pre diff --git a/tests/cases/failing/tadd-arity-one.pre b/tests/cases/failing/tadd-arity-one.pre new file mode 100644 index 0000000..1e753ff --- /dev/null +++ b/tests/cases/failing/tadd-arity-one.pre @@ -0,0 +1 @@ +TADD([0d1, 0d2]) diff --git a/tests/cases/failing/tadd-arity-three.pre b/tests/cases/failing/tadd-arity-three.pre new file mode 100644 index 0000000..b633ca1 --- /dev/null +++ b/tests/cases/failing/tadd-arity-three.pre @@ -0,0 +1 @@ +TADD([0d1], 0d2, 0d3) diff --git a/tests/cases/failing/tadd-arity-zero.pre b/tests/cases/failing/tadd-arity-zero.pre new file mode 100644 index 0000000..acc4408 --- /dev/null +++ b/tests/cases/failing/tadd-arity-zero.pre @@ -0,0 +1 @@ +TADD() diff --git a/tests/cases/failing/tadd-first-non-tns.pre b/tests/cases/failing/tadd-first-non-tns.pre new file mode 100644 index 0000000..b97489f --- /dev/null +++ b/tests/cases/failing/tadd-first-non-tns.pre @@ -0,0 +1 @@ +TADD(0d1, 0d2) diff --git a/tests/cases/failing/tadd-mixed-numeric-types.pre b/tests/cases/failing/tadd-mixed-numeric-types.pre new file mode 100644 index 0000000..a7bcf1c --- /dev/null +++ b/tests/cases/failing/tadd-mixed-numeric-types.pre @@ -0,0 +1 @@ +TADD([0d1, 0d2], 0d1.0) diff --git a/tests/cases/failing/tadd-second-non-numeric.pre b/tests/cases/failing/tadd-second-non-numeric.pre new file mode 100644 index 0000000..c711383 --- /dev/null +++ b/tests/cases/failing/tadd-second-non-numeric.pre @@ -0,0 +1 @@ +TADD([0d1], "1") diff --git a/tests/cases/failing/tadd-tensor-mixed-numeric-elements.pre b/tests/cases/failing/tadd-tensor-mixed-numeric-elements.pre new file mode 100644 index 0000000..24de141 --- /dev/null +++ b/tests/cases/failing/tadd-tensor-mixed-numeric-elements.pre @@ -0,0 +1 @@ +TADD([0d1, 0d2.0], 0d1) diff --git a/tests/cases/failing/tadd-tensor-non-numeric.pre b/tests/cases/failing/tadd-tensor-non-numeric.pre new file mode 100644 index 0000000..7c55821 --- /dev/null +++ b/tests/cases/failing/tadd-tensor-non-numeric.pre @@ -0,0 +1 @@ +TADD(["a", "b"], 0d1) diff --git a/tests/cases/failing/tdiv-arity-one.pre b/tests/cases/failing/tdiv-arity-one.pre new file mode 100644 index 0000000..7b6d587 --- /dev/null +++ b/tests/cases/failing/tdiv-arity-one.pre @@ -0,0 +1 @@ +TDIV([0d1, 0d2]) diff --git a/tests/cases/failing/tdiv-arity-three.pre b/tests/cases/failing/tdiv-arity-three.pre new file mode 100644 index 0000000..b76b073 --- /dev/null +++ b/tests/cases/failing/tdiv-arity-three.pre @@ -0,0 +1 @@ +TDIV([0d1], 0d2, 0d3) diff --git a/tests/cases/failing/tdiv-arity-zero.pre b/tests/cases/failing/tdiv-arity-zero.pre new file mode 100644 index 0000000..b7796c8 --- /dev/null +++ b/tests/cases/failing/tdiv-arity-zero.pre @@ -0,0 +1 @@ +TDIV() diff --git a/tests/cases/failing/tdiv-first-non-tns.pre b/tests/cases/failing/tdiv-first-non-tns.pre new file mode 100644 index 0000000..a3a913e --- /dev/null +++ b/tests/cases/failing/tdiv-first-non-tns.pre @@ -0,0 +1 @@ +TDIV(0d1, 0d2) diff --git a/tests/cases/failing/tdiv-mixed-numeric-types.pre b/tests/cases/failing/tdiv-mixed-numeric-types.pre new file mode 100644 index 0000000..a42f03b --- /dev/null +++ b/tests/cases/failing/tdiv-mixed-numeric-types.pre @@ -0,0 +1 @@ +TDIV([0d1, 0d2], 0d2.0) diff --git a/tests/cases/failing/tdiv-second-non-numeric.pre b/tests/cases/failing/tdiv-second-non-numeric.pre new file mode 100644 index 0000000..632c35b --- /dev/null +++ b/tests/cases/failing/tdiv-second-non-numeric.pre @@ -0,0 +1 @@ +TDIV([0d1], "1") diff --git a/tests/cases/failing/tdiv-tensor-mixed-numeric-elements.pre b/tests/cases/failing/tdiv-tensor-mixed-numeric-elements.pre new file mode 100644 index 0000000..3e27b6d --- /dev/null +++ b/tests/cases/failing/tdiv-tensor-mixed-numeric-elements.pre @@ -0,0 +1 @@ +TDIV([0d1, 0d2.0], 0d2) diff --git a/tests/cases/failing/tdiv-tensor-non-numeric.pre b/tests/cases/failing/tdiv-tensor-non-numeric.pre new file mode 100644 index 0000000..8f930d5 --- /dev/null +++ b/tests/cases/failing/tdiv-tensor-non-numeric.pre @@ -0,0 +1 @@ +TDIV(["a", "b"], 0d2) diff --git a/tests/cases/failing/tdiv-zero-float.pre b/tests/cases/failing/tdiv-zero-float.pre new file mode 100644 index 0000000..bb72f45 --- /dev/null +++ b/tests/cases/failing/tdiv-zero-float.pre @@ -0,0 +1 @@ +TDIV([0d1.0, 0d2.5], 0d0.0) diff --git a/tests/cases/failing/tdiv-zero.pre b/tests/cases/failing/tdiv-zero.pre new file mode 100644 index 0000000..a0768b4 --- /dev/null +++ b/tests/cases/failing/tdiv-zero.pre @@ -0,0 +1 @@ +TDIV([0d1, 0d2], 0d0) diff --git a/tests/cases/failing/tmul-arity-one.pre b/tests/cases/failing/tmul-arity-one.pre new file mode 100644 index 0000000..d822223 --- /dev/null +++ b/tests/cases/failing/tmul-arity-one.pre @@ -0,0 +1 @@ +TMUL([0d1, 0d2]) diff --git a/tests/cases/failing/tmul-arity-three.pre b/tests/cases/failing/tmul-arity-three.pre new file mode 100644 index 0000000..7b5b7eb --- /dev/null +++ b/tests/cases/failing/tmul-arity-three.pre @@ -0,0 +1 @@ +TMUL([0d1], 0d2, 0d3) diff --git a/tests/cases/failing/tmul-arity-zero.pre b/tests/cases/failing/tmul-arity-zero.pre new file mode 100644 index 0000000..721e3da --- /dev/null +++ b/tests/cases/failing/tmul-arity-zero.pre @@ -0,0 +1 @@ +TMUL() diff --git a/tests/cases/failing/tmul-first-non-tns.pre b/tests/cases/failing/tmul-first-non-tns.pre new file mode 100644 index 0000000..5f4523e --- /dev/null +++ b/tests/cases/failing/tmul-first-non-tns.pre @@ -0,0 +1 @@ +TMUL(0d1, 0d2) diff --git a/tests/cases/failing/tmul-mixed-numeric-types.pre b/tests/cases/failing/tmul-mixed-numeric-types.pre new file mode 100644 index 0000000..6b112f6 --- /dev/null +++ b/tests/cases/failing/tmul-mixed-numeric-types.pre @@ -0,0 +1 @@ +TMUL([0d1, 0d2], 0d2.0) diff --git a/tests/cases/failing/tmul-second-non-numeric.pre b/tests/cases/failing/tmul-second-non-numeric.pre new file mode 100644 index 0000000..9063cc8 --- /dev/null +++ b/tests/cases/failing/tmul-second-non-numeric.pre @@ -0,0 +1 @@ +TMUL([0d1], "1") diff --git a/tests/cases/failing/tmul-tensor-mixed-numeric-elements.pre b/tests/cases/failing/tmul-tensor-mixed-numeric-elements.pre new file mode 100644 index 0000000..b923bd4 --- /dev/null +++ b/tests/cases/failing/tmul-tensor-mixed-numeric-elements.pre @@ -0,0 +1 @@ +TMUL([0d1, 0d2.0], 0d2) diff --git a/tests/cases/failing/tmul-tensor-non-numeric.pre b/tests/cases/failing/tmul-tensor-non-numeric.pre new file mode 100644 index 0000000..482d7a1 --- /dev/null +++ b/tests/cases/failing/tmul-tensor-non-numeric.pre @@ -0,0 +1 @@ +TMUL(["a", "b"], 0d2) diff --git a/tests/cases/failing/tpow-arity-one.pre b/tests/cases/failing/tpow-arity-one.pre new file mode 100644 index 0000000..da822e0 --- /dev/null +++ b/tests/cases/failing/tpow-arity-one.pre @@ -0,0 +1 @@ +TPOW([0d1, 0d2]) diff --git a/tests/cases/failing/tpow-arity-three.pre b/tests/cases/failing/tpow-arity-three.pre new file mode 100644 index 0000000..4d48237 --- /dev/null +++ b/tests/cases/failing/tpow-arity-three.pre @@ -0,0 +1 @@ +TPOW([0d1], 0d2, 0d3) diff --git a/tests/cases/failing/tpow-arity-zero.pre b/tests/cases/failing/tpow-arity-zero.pre new file mode 100644 index 0000000..962bcf9 --- /dev/null +++ b/tests/cases/failing/tpow-arity-zero.pre @@ -0,0 +1 @@ +TPOW() diff --git a/tests/cases/failing/tpow-first-non-tns.pre b/tests/cases/failing/tpow-first-non-tns.pre new file mode 100644 index 0000000..86d334f --- /dev/null +++ b/tests/cases/failing/tpow-first-non-tns.pre @@ -0,0 +1 @@ +TPOW(0d1, 0d2) diff --git a/tests/cases/failing/tpow-mixed-numeric-types.pre b/tests/cases/failing/tpow-mixed-numeric-types.pre new file mode 100644 index 0000000..2d02adc --- /dev/null +++ b/tests/cases/failing/tpow-mixed-numeric-types.pre @@ -0,0 +1 @@ +TPOW([0d1, 0d2], 0d2.0) diff --git a/tests/cases/failing/tpow-second-non-numeric.pre b/tests/cases/failing/tpow-second-non-numeric.pre new file mode 100644 index 0000000..0a77d08 --- /dev/null +++ b/tests/cases/failing/tpow-second-non-numeric.pre @@ -0,0 +1 @@ +TPOW([0d1], "1") diff --git a/tests/cases/failing/tpow-tensor-mixed-numeric-elements.pre b/tests/cases/failing/tpow-tensor-mixed-numeric-elements.pre new file mode 100644 index 0000000..c89f924 --- /dev/null +++ b/tests/cases/failing/tpow-tensor-mixed-numeric-elements.pre @@ -0,0 +1 @@ +TPOW([0d1, 0d2.0], 0d2) diff --git a/tests/cases/failing/tpow-tensor-non-numeric.pre b/tests/cases/failing/tpow-tensor-non-numeric.pre new file mode 100644 index 0000000..33364ba --- /dev/null +++ b/tests/cases/failing/tpow-tensor-non-numeric.pre @@ -0,0 +1 @@ +TPOW(["a", "b"], 0d2) diff --git a/tests/cases/failing/tsub-arity-one.pre b/tests/cases/failing/tsub-arity-one.pre new file mode 100644 index 0000000..69e906c --- /dev/null +++ b/tests/cases/failing/tsub-arity-one.pre @@ -0,0 +1 @@ +TSUB([0d1, 0d2]) diff --git a/tests/cases/failing/tsub-arity-three.pre b/tests/cases/failing/tsub-arity-three.pre new file mode 100644 index 0000000..3533d42 --- /dev/null +++ b/tests/cases/failing/tsub-arity-three.pre @@ -0,0 +1 @@ +TSUB([0d1], 0d2, 0d3) diff --git a/tests/cases/failing/tsub-arity-zero.pre b/tests/cases/failing/tsub-arity-zero.pre new file mode 100644 index 0000000..1e24907 --- /dev/null +++ b/tests/cases/failing/tsub-arity-zero.pre @@ -0,0 +1 @@ +TSUB() diff --git a/tests/cases/failing/tsub-first-non-tns.pre b/tests/cases/failing/tsub-first-non-tns.pre new file mode 100644 index 0000000..092a7f5 --- /dev/null +++ b/tests/cases/failing/tsub-first-non-tns.pre @@ -0,0 +1 @@ +TSUB(0d1, 0d2) diff --git a/tests/cases/failing/tsub-mixed-numeric-types.pre b/tests/cases/failing/tsub-mixed-numeric-types.pre new file mode 100644 index 0000000..18ec6fe --- /dev/null +++ b/tests/cases/failing/tsub-mixed-numeric-types.pre @@ -0,0 +1 @@ +TSUB([0d1, 0d2], 0d1.0) diff --git a/tests/cases/failing/tsub-second-non-numeric.pre b/tests/cases/failing/tsub-second-non-numeric.pre new file mode 100644 index 0000000..aa890e2 --- /dev/null +++ b/tests/cases/failing/tsub-second-non-numeric.pre @@ -0,0 +1 @@ +TSUB([0d1], "1") diff --git a/tests/cases/failing/tsub-tensor-mixed-numeric-elements.pre b/tests/cases/failing/tsub-tensor-mixed-numeric-elements.pre new file mode 100644 index 0000000..303a7ad --- /dev/null +++ b/tests/cases/failing/tsub-tensor-mixed-numeric-elements.pre @@ -0,0 +1 @@ +TSUB([0d1, 0d2.0], 0d1) diff --git a/tests/cases/failing/tsub-tensor-non-numeric.pre b/tests/cases/failing/tsub-tensor-non-numeric.pre new file mode 100644 index 0000000..54d5195 --- /dev/null +++ b/tests/cases/failing/tsub-tensor-non-numeric.pre @@ -0,0 +1 @@ +TSUB(["a", "b"], 0d1) diff --git a/tests/cases/passing/tadd-basic.pre b/tests/cases/passing/tadd-basic.pre new file mode 100644 index 0000000..4abd90c --- /dev/null +++ b/tests/cases/passing/tadd-basic.pre @@ -0,0 +1,4 @@ +TNS: out = TADD([0d1, 0d2, 0d3], 0d4) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d5, 0d6, 0d7])) diff --git a/tests/cases/passing/tadd-float.pre b/tests/cases/passing/tadd-float.pre new file mode 100644 index 0000000..51378d7 --- /dev/null +++ b/tests/cases/passing/tadd-float.pre @@ -0,0 +1 @@ +ASSERT(EQ(TADD([0d1.5, 0d2.0], 0d0.5), [0d2.0, 0d2.5])) diff --git a/tests/cases/passing/tadd-rank2-shape.pre b/tests/cases/passing/tadd-rank2-shape.pre new file mode 100644 index 0000000..cc02948 --- /dev/null +++ b/tests/cases/passing/tadd-rank2-shape.pre @@ -0,0 +1,5 @@ +TNS: src = [[0d1, 0d2], [0d3, 0d4]] +TNS: out = TADD(src, 0d10) + +ASSERT(EQ(out, [[0d11, 0d12], [0d13, 0d14]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) diff --git a/tests/cases/passing/tdiv-basic.pre b/tests/cases/passing/tdiv-basic.pre new file mode 100644 index 0000000..e0734ad --- /dev/null +++ b/tests/cases/passing/tdiv-basic.pre @@ -0,0 +1,4 @@ +TNS: out = TDIV([0d8, 0d6, 0d4], 0d2) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d4, 0d3, 0d2])) diff --git a/tests/cases/passing/tdiv-float.pre b/tests/cases/passing/tdiv-float.pre new file mode 100644 index 0000000..948b37a --- /dev/null +++ b/tests/cases/passing/tdiv-float.pre @@ -0,0 +1 @@ +ASSERT(EQ(TDIV([0d4.0, 0d1.5], 0d0.5), [0d8.0, 0d3.0])) diff --git a/tests/cases/passing/tdiv-rank2-shape.pre b/tests/cases/passing/tdiv-rank2-shape.pre new file mode 100644 index 0000000..6d45eae --- /dev/null +++ b/tests/cases/passing/tdiv-rank2-shape.pre @@ -0,0 +1,5 @@ +TNS: src = [[0d12, 0d10], [0d8, 0d6]] +TNS: out = TDIV(src, 0d2) + +ASSERT(EQ(out, [[0d6, 0d5], [0d4, 0d3]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) diff --git a/tests/cases/passing/tmul-basic.pre b/tests/cases/passing/tmul-basic.pre new file mode 100644 index 0000000..8f5385c --- /dev/null +++ b/tests/cases/passing/tmul-basic.pre @@ -0,0 +1,4 @@ +TNS: out = TMUL([0d2, 0d3, 0d4], 0d5) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d10, 0d15, 0d20])) diff --git a/tests/cases/passing/tmul-float.pre b/tests/cases/passing/tmul-float.pre new file mode 100644 index 0000000..5f159fc --- /dev/null +++ b/tests/cases/passing/tmul-float.pre @@ -0,0 +1 @@ +ASSERT(EQ(TMUL([0d1.5, 0d2.0], 0d2.0), [0d3.0, 0d4.0])) diff --git a/tests/cases/passing/tmul-rank2-shape.pre b/tests/cases/passing/tmul-rank2-shape.pre new file mode 100644 index 0000000..2d5f55e --- /dev/null +++ b/tests/cases/passing/tmul-rank2-shape.pre @@ -0,0 +1,5 @@ +TNS: src = [[0d1, 0d2], [0d3, 0d4]] +TNS: out = TMUL(src, 0d6) + +ASSERT(EQ(out, [[0d6, 0d12], [0d18, 0d24]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) diff --git a/tests/cases/passing/tpow-basic.pre b/tests/cases/passing/tpow-basic.pre new file mode 100644 index 0000000..8812611 --- /dev/null +++ b/tests/cases/passing/tpow-basic.pre @@ -0,0 +1,4 @@ +TNS: out = TPOW([0d2, 0d3, 0d4], 0d3) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d8, 0d27, 0d64])) diff --git a/tests/cases/passing/tpow-float.pre b/tests/cases/passing/tpow-float.pre new file mode 100644 index 0000000..ff046f9 --- /dev/null +++ b/tests/cases/passing/tpow-float.pre @@ -0,0 +1 @@ +ASSERT(EQ(TPOW([0d1.5, 0d2.0], 0d2.0), [0d2.25, 0d4.0])) diff --git a/tests/cases/passing/tpow-rank2-shape.pre b/tests/cases/passing/tpow-rank2-shape.pre new file mode 100644 index 0000000..20142ac --- /dev/null +++ b/tests/cases/passing/tpow-rank2-shape.pre @@ -0,0 +1,5 @@ +TNS: src = [[0d1, 0d2], [0d3, 0d4]] +TNS: out = TPOW(src, 0d2) + +ASSERT(EQ(out, [[0d1, 0d4], [0d9, 0d16]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) diff --git a/tests/cases/passing/tsub-basic.pre b/tests/cases/passing/tsub-basic.pre new file mode 100644 index 0000000..f69dd44 --- /dev/null +++ b/tests/cases/passing/tsub-basic.pre @@ -0,0 +1,4 @@ +TNS: out = TSUB([0d9, 0d7, 0d5], 0d2) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d7, 0d5, 0d3])) diff --git a/tests/cases/passing/tsub-float.pre b/tests/cases/passing/tsub-float.pre new file mode 100644 index 0000000..a604589 --- /dev/null +++ b/tests/cases/passing/tsub-float.pre @@ -0,0 +1 @@ +ASSERT(EQ(TSUB([0d2.5, 0d1.5], 0d0.5), [0d2.0, 0d1.0])) diff --git a/tests/cases/passing/tsub-rank2-shape.pre b/tests/cases/passing/tsub-rank2-shape.pre new file mode 100644 index 0000000..9d8810b --- /dev/null +++ b/tests/cases/passing/tsub-rank2-shape.pre @@ -0,0 +1,5 @@ +TNS: src = [[0d8, 0d7], [0d6, 0d5]] +TNS: out = TSUB(src, 0d3) + +ASSERT(EQ(out, [[0d5, 0d4], [0d3, 0d2]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) From 81bdd941f460abbbb6bd746bee805366717b84a6 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 6 Apr 2026 06:24:53 -0400 Subject: [PATCH 17/60] Add tests for KEYS, VALUES, KEYIN, and VALUEIN. --- tests/cases/failing/keyin-arity-one.pre | 1 + tests/cases/failing/keyin-arity-three.pre | 1 + tests/cases/failing/keyin-arity-zero.pre | 1 + tests/cases/failing/keyin-first-bool.pre | 1 + tests/cases/failing/keyin-first-func.pre | 1 + tests/cases/failing/keyin-first-map.pre | 1 + tests/cases/failing/keyin-first-thr.pre | 1 + tests/cases/failing/keyin-first-tns.pre | 1 + tests/cases/failing/keyin-second-bool.pre | 1 + tests/cases/failing/keyin-second-flt.pre | 1 + tests/cases/failing/keyin-second-func.pre | 1 + tests/cases/failing/keyin-second-int.pre | 1 + tests/cases/failing/keyin-second-str.pre | 1 + tests/cases/failing/keyin-second-thr.pre | 1 + tests/cases/failing/keyin-second-tns.pre | 1 + tests/cases/failing/keys-arity-two.pre | 1 + tests/cases/failing/keys-arity-zero.pre | 1 + tests/cases/failing/keys-bool.pre | 1 + tests/cases/failing/keys-flt.pre | 1 + tests/cases/failing/keys-func.pre | 1 + tests/cases/failing/keys-int.pre | 1 + tests/cases/failing/keys-str.pre | 1 + tests/cases/failing/keys-thr.pre | 1 + tests/cases/failing/keys-tns.pre | 1 + tests/cases/failing/valuein-arity-one.pre | 1 + tests/cases/failing/valuein-arity-three.pre | 1 + tests/cases/failing/valuein-arity-zero.pre | 1 + tests/cases/failing/valuein-second-bool.pre | 1 + tests/cases/failing/valuein-second-flt.pre | 1 + tests/cases/failing/valuein-second-func.pre | 1 + tests/cases/failing/valuein-second-int.pre | 1 + tests/cases/failing/valuein-second-str.pre | 1 + tests/cases/failing/valuein-second-thr.pre | 1 + tests/cases/failing/valuein-second-tns.pre | 1 + tests/cases/failing/values-arity-two.pre | 1 + tests/cases/failing/values-arity-zero.pre | 1 + tests/cases/failing/values-bool.pre | 1 + tests/cases/failing/values-flt.pre | 1 + tests/cases/failing/values-func.pre | 1 + tests/cases/failing/values-int.pre | 1 + tests/cases/failing/values-str.pre | 1 + tests/cases/failing/values-thr.pre | 1 + tests/cases/failing/values-tns.pre | 1 + tests/cases/passing/keyin-basic.pre | 5 +++++ tests/cases/passing/keyin-key-types.pre | 7 +++++++ tests/cases/passing/keys-insertion-order.pre | 3 +++ tests/cases/passing/keys-mixed-key-types.pre | 3 +++ tests/cases/passing/keys-result-is-1d.pre | 5 +++++ tests/cases/passing/valuein-any-type.pre | 12 ++++++++++++ tests/cases/passing/valuein-basic.pre | 5 +++++ tests/cases/passing/values-insertion-order.pre | 3 +++ tests/cases/passing/values-result-is-1d.pre | 3 +++ 52 files changed, 89 insertions(+) create mode 100644 tests/cases/failing/keyin-arity-one.pre create mode 100644 tests/cases/failing/keyin-arity-three.pre create mode 100644 tests/cases/failing/keyin-arity-zero.pre create mode 100644 tests/cases/failing/keyin-first-bool.pre create mode 100644 tests/cases/failing/keyin-first-func.pre create mode 100644 tests/cases/failing/keyin-first-map.pre create mode 100644 tests/cases/failing/keyin-first-thr.pre create mode 100644 tests/cases/failing/keyin-first-tns.pre create mode 100644 tests/cases/failing/keyin-second-bool.pre create mode 100644 tests/cases/failing/keyin-second-flt.pre create mode 100644 tests/cases/failing/keyin-second-func.pre create mode 100644 tests/cases/failing/keyin-second-int.pre create mode 100644 tests/cases/failing/keyin-second-str.pre create mode 100644 tests/cases/failing/keyin-second-thr.pre create mode 100644 tests/cases/failing/keyin-second-tns.pre create mode 100644 tests/cases/failing/keys-arity-two.pre create mode 100644 tests/cases/failing/keys-arity-zero.pre create mode 100644 tests/cases/failing/keys-bool.pre create mode 100644 tests/cases/failing/keys-flt.pre create mode 100644 tests/cases/failing/keys-func.pre create mode 100644 tests/cases/failing/keys-int.pre create mode 100644 tests/cases/failing/keys-str.pre create mode 100644 tests/cases/failing/keys-thr.pre create mode 100644 tests/cases/failing/keys-tns.pre create mode 100644 tests/cases/failing/valuein-arity-one.pre create mode 100644 tests/cases/failing/valuein-arity-three.pre create mode 100644 tests/cases/failing/valuein-arity-zero.pre create mode 100644 tests/cases/failing/valuein-second-bool.pre create mode 100644 tests/cases/failing/valuein-second-flt.pre create mode 100644 tests/cases/failing/valuein-second-func.pre create mode 100644 tests/cases/failing/valuein-second-int.pre create mode 100644 tests/cases/failing/valuein-second-str.pre create mode 100644 tests/cases/failing/valuein-second-thr.pre create mode 100644 tests/cases/failing/valuein-second-tns.pre create mode 100644 tests/cases/failing/values-arity-two.pre create mode 100644 tests/cases/failing/values-arity-zero.pre create mode 100644 tests/cases/failing/values-bool.pre create mode 100644 tests/cases/failing/values-flt.pre create mode 100644 tests/cases/failing/values-func.pre create mode 100644 tests/cases/failing/values-int.pre create mode 100644 tests/cases/failing/values-str.pre create mode 100644 tests/cases/failing/values-thr.pre create mode 100644 tests/cases/failing/values-tns.pre create mode 100644 tests/cases/passing/keyin-basic.pre create mode 100644 tests/cases/passing/keyin-key-types.pre create mode 100644 tests/cases/passing/keys-insertion-order.pre create mode 100644 tests/cases/passing/keys-mixed-key-types.pre create mode 100644 tests/cases/passing/keys-result-is-1d.pre create mode 100644 tests/cases/passing/valuein-any-type.pre create mode 100644 tests/cases/passing/valuein-basic.pre create mode 100644 tests/cases/passing/values-insertion-order.pre create mode 100644 tests/cases/passing/values-result-is-1d.pre diff --git a/tests/cases/failing/keyin-arity-one.pre b/tests/cases/failing/keyin-arity-one.pre new file mode 100644 index 0000000..eb960d4 --- /dev/null +++ b/tests/cases/failing/keyin-arity-one.pre @@ -0,0 +1 @@ +KEYIN("a") diff --git a/tests/cases/failing/keyin-arity-three.pre b/tests/cases/failing/keyin-arity-three.pre new file mode 100644 index 0000000..1bbf2e2 --- /dev/null +++ b/tests/cases/failing/keyin-arity-three.pre @@ -0,0 +1 @@ +KEYIN("a", <"a" = 0d1>, 0d1) diff --git a/tests/cases/failing/keyin-arity-zero.pre b/tests/cases/failing/keyin-arity-zero.pre new file mode 100644 index 0000000..70d0ee4 --- /dev/null +++ b/tests/cases/failing/keyin-arity-zero.pre @@ -0,0 +1 @@ +KEYIN() diff --git a/tests/cases/failing/keyin-first-bool.pre b/tests/cases/failing/keyin-first-bool.pre new file mode 100644 index 0000000..2641ec1 --- /dev/null +++ b/tests/cases/failing/keyin-first-bool.pre @@ -0,0 +1 @@ +KEYIN(TRUE, <"a" = 0d1>) diff --git a/tests/cases/failing/keyin-first-func.pre b/tests/cases/failing/keyin-first-func.pre new file mode 100644 index 0000000..5069791 --- /dev/null +++ b/tests/cases/failing/keyin-first-func.pre @@ -0,0 +1 @@ +KEYIN(LAMBDA INT: (){}, <"a" = 0d1>) diff --git a/tests/cases/failing/keyin-first-map.pre b/tests/cases/failing/keyin-first-map.pre new file mode 100644 index 0000000..0ad4b05 --- /dev/null +++ b/tests/cases/failing/keyin-first-map.pre @@ -0,0 +1 @@ +KEYIN(<"a" = 0d1>, <"a" = 0d1>) diff --git a/tests/cases/failing/keyin-first-thr.pre b/tests/cases/failing/keyin-first-thr.pre new file mode 100644 index 0000000..36912ad --- /dev/null +++ b/tests/cases/failing/keyin-first-thr.pre @@ -0,0 +1 @@ +KEYIN(ASYNC{}, <"a" = 0d1>) diff --git a/tests/cases/failing/keyin-first-tns.pre b/tests/cases/failing/keyin-first-tns.pre new file mode 100644 index 0000000..289aca8 --- /dev/null +++ b/tests/cases/failing/keyin-first-tns.pre @@ -0,0 +1 @@ +KEYIN([0d1], <"a" = 0d1>) diff --git a/tests/cases/failing/keyin-second-bool.pre b/tests/cases/failing/keyin-second-bool.pre new file mode 100644 index 0000000..430d93e --- /dev/null +++ b/tests/cases/failing/keyin-second-bool.pre @@ -0,0 +1 @@ +KEYIN("a", TRUE) diff --git a/tests/cases/failing/keyin-second-flt.pre b/tests/cases/failing/keyin-second-flt.pre new file mode 100644 index 0000000..ed89c22 --- /dev/null +++ b/tests/cases/failing/keyin-second-flt.pre @@ -0,0 +1 @@ +KEYIN("a", 0d1.5) diff --git a/tests/cases/failing/keyin-second-func.pre b/tests/cases/failing/keyin-second-func.pre new file mode 100644 index 0000000..4cc20ea --- /dev/null +++ b/tests/cases/failing/keyin-second-func.pre @@ -0,0 +1 @@ +KEYIN("a", LAMBDA INT: (){}) diff --git a/tests/cases/failing/keyin-second-int.pre b/tests/cases/failing/keyin-second-int.pre new file mode 100644 index 0000000..bf63641 --- /dev/null +++ b/tests/cases/failing/keyin-second-int.pre @@ -0,0 +1 @@ +KEYIN("a", 0d1) diff --git a/tests/cases/failing/keyin-second-str.pre b/tests/cases/failing/keyin-second-str.pre new file mode 100644 index 0000000..02b435e --- /dev/null +++ b/tests/cases/failing/keyin-second-str.pre @@ -0,0 +1 @@ +KEYIN("a", "map") diff --git a/tests/cases/failing/keyin-second-thr.pre b/tests/cases/failing/keyin-second-thr.pre new file mode 100644 index 0000000..03642bd --- /dev/null +++ b/tests/cases/failing/keyin-second-thr.pre @@ -0,0 +1 @@ +KEYIN("a", ASYNC{}) diff --git a/tests/cases/failing/keyin-second-tns.pre b/tests/cases/failing/keyin-second-tns.pre new file mode 100644 index 0000000..2ade032 --- /dev/null +++ b/tests/cases/failing/keyin-second-tns.pre @@ -0,0 +1 @@ +KEYIN("a", [0d1]) diff --git a/tests/cases/failing/keys-arity-two.pre b/tests/cases/failing/keys-arity-two.pre new file mode 100644 index 0000000..815c773 --- /dev/null +++ b/tests/cases/failing/keys-arity-two.pre @@ -0,0 +1 @@ +KEYS(<"a" = 0d1>, <"b" = 0d2>) diff --git a/tests/cases/failing/keys-arity-zero.pre b/tests/cases/failing/keys-arity-zero.pre new file mode 100644 index 0000000..db2a1c7 --- /dev/null +++ b/tests/cases/failing/keys-arity-zero.pre @@ -0,0 +1 @@ +KEYS() diff --git a/tests/cases/failing/keys-bool.pre b/tests/cases/failing/keys-bool.pre new file mode 100644 index 0000000..e20c8c0 --- /dev/null +++ b/tests/cases/failing/keys-bool.pre @@ -0,0 +1 @@ +KEYS(TRUE) diff --git a/tests/cases/failing/keys-flt.pre b/tests/cases/failing/keys-flt.pre new file mode 100644 index 0000000..3500791 --- /dev/null +++ b/tests/cases/failing/keys-flt.pre @@ -0,0 +1 @@ +KEYS(0d1.5) diff --git a/tests/cases/failing/keys-func.pre b/tests/cases/failing/keys-func.pre new file mode 100644 index 0000000..c567946 --- /dev/null +++ b/tests/cases/failing/keys-func.pre @@ -0,0 +1 @@ +KEYS(LAMBDA INT: (){}) diff --git a/tests/cases/failing/keys-int.pre b/tests/cases/failing/keys-int.pre new file mode 100644 index 0000000..247cdae --- /dev/null +++ b/tests/cases/failing/keys-int.pre @@ -0,0 +1 @@ +KEYS(0d1) diff --git a/tests/cases/failing/keys-str.pre b/tests/cases/failing/keys-str.pre new file mode 100644 index 0000000..c494af5 --- /dev/null +++ b/tests/cases/failing/keys-str.pre @@ -0,0 +1 @@ +KEYS("map") diff --git a/tests/cases/failing/keys-thr.pre b/tests/cases/failing/keys-thr.pre new file mode 100644 index 0000000..e882846 --- /dev/null +++ b/tests/cases/failing/keys-thr.pre @@ -0,0 +1 @@ +KEYS(ASYNC{}) diff --git a/tests/cases/failing/keys-tns.pre b/tests/cases/failing/keys-tns.pre new file mode 100644 index 0000000..0777e9d --- /dev/null +++ b/tests/cases/failing/keys-tns.pre @@ -0,0 +1 @@ +KEYS([0d1]) diff --git a/tests/cases/failing/valuein-arity-one.pre b/tests/cases/failing/valuein-arity-one.pre new file mode 100644 index 0000000..f1fde16 --- /dev/null +++ b/tests/cases/failing/valuein-arity-one.pre @@ -0,0 +1 @@ +VALUEIN("a") diff --git a/tests/cases/failing/valuein-arity-three.pre b/tests/cases/failing/valuein-arity-three.pre new file mode 100644 index 0000000..5a741c0 --- /dev/null +++ b/tests/cases/failing/valuein-arity-three.pre @@ -0,0 +1 @@ +VALUEIN("a", <"a" = "x">, 0d1) diff --git a/tests/cases/failing/valuein-arity-zero.pre b/tests/cases/failing/valuein-arity-zero.pre new file mode 100644 index 0000000..c311579 --- /dev/null +++ b/tests/cases/failing/valuein-arity-zero.pre @@ -0,0 +1 @@ +VALUEIN() diff --git a/tests/cases/failing/valuein-second-bool.pre b/tests/cases/failing/valuein-second-bool.pre new file mode 100644 index 0000000..3376a40 --- /dev/null +++ b/tests/cases/failing/valuein-second-bool.pre @@ -0,0 +1 @@ +VALUEIN("a", TRUE) diff --git a/tests/cases/failing/valuein-second-flt.pre b/tests/cases/failing/valuein-second-flt.pre new file mode 100644 index 0000000..87d5520 --- /dev/null +++ b/tests/cases/failing/valuein-second-flt.pre @@ -0,0 +1 @@ +VALUEIN("a", 0d1.5) diff --git a/tests/cases/failing/valuein-second-func.pre b/tests/cases/failing/valuein-second-func.pre new file mode 100644 index 0000000..3f427ce --- /dev/null +++ b/tests/cases/failing/valuein-second-func.pre @@ -0,0 +1 @@ +VALUEIN("a", LAMBDA INT: (){}) diff --git a/tests/cases/failing/valuein-second-int.pre b/tests/cases/failing/valuein-second-int.pre new file mode 100644 index 0000000..a601f3e --- /dev/null +++ b/tests/cases/failing/valuein-second-int.pre @@ -0,0 +1 @@ +VALUEIN("a", 0d1) diff --git a/tests/cases/failing/valuein-second-str.pre b/tests/cases/failing/valuein-second-str.pre new file mode 100644 index 0000000..098d995 --- /dev/null +++ b/tests/cases/failing/valuein-second-str.pre @@ -0,0 +1 @@ +VALUEIN("a", "map") diff --git a/tests/cases/failing/valuein-second-thr.pre b/tests/cases/failing/valuein-second-thr.pre new file mode 100644 index 0000000..52acfe1 --- /dev/null +++ b/tests/cases/failing/valuein-second-thr.pre @@ -0,0 +1 @@ +VALUEIN("a", ASYNC{}) diff --git a/tests/cases/failing/valuein-second-tns.pre b/tests/cases/failing/valuein-second-tns.pre new file mode 100644 index 0000000..6916e1c --- /dev/null +++ b/tests/cases/failing/valuein-second-tns.pre @@ -0,0 +1 @@ +VALUEIN("a", [0d1]) diff --git a/tests/cases/failing/values-arity-two.pre b/tests/cases/failing/values-arity-two.pre new file mode 100644 index 0000000..34e355d --- /dev/null +++ b/tests/cases/failing/values-arity-two.pre @@ -0,0 +1 @@ +VALUES(<"a" = 0d1>, <"b" = 0d2>) diff --git a/tests/cases/failing/values-arity-zero.pre b/tests/cases/failing/values-arity-zero.pre new file mode 100644 index 0000000..32a6048 --- /dev/null +++ b/tests/cases/failing/values-arity-zero.pre @@ -0,0 +1 @@ +VALUES() diff --git a/tests/cases/failing/values-bool.pre b/tests/cases/failing/values-bool.pre new file mode 100644 index 0000000..ef51649 --- /dev/null +++ b/tests/cases/failing/values-bool.pre @@ -0,0 +1 @@ +VALUES(TRUE) diff --git a/tests/cases/failing/values-flt.pre b/tests/cases/failing/values-flt.pre new file mode 100644 index 0000000..907b336 --- /dev/null +++ b/tests/cases/failing/values-flt.pre @@ -0,0 +1 @@ +VALUES(0d1.5) diff --git a/tests/cases/failing/values-func.pre b/tests/cases/failing/values-func.pre new file mode 100644 index 0000000..1d7ea99 --- /dev/null +++ b/tests/cases/failing/values-func.pre @@ -0,0 +1 @@ +VALUES(LAMBDA INT: (){}) diff --git a/tests/cases/failing/values-int.pre b/tests/cases/failing/values-int.pre new file mode 100644 index 0000000..6be0282 --- /dev/null +++ b/tests/cases/failing/values-int.pre @@ -0,0 +1 @@ +VALUES(0d1) diff --git a/tests/cases/failing/values-str.pre b/tests/cases/failing/values-str.pre new file mode 100644 index 0000000..7c74784 --- /dev/null +++ b/tests/cases/failing/values-str.pre @@ -0,0 +1 @@ +VALUES("map") diff --git a/tests/cases/failing/values-thr.pre b/tests/cases/failing/values-thr.pre new file mode 100644 index 0000000..eddc0c7 --- /dev/null +++ b/tests/cases/failing/values-thr.pre @@ -0,0 +1 @@ +VALUES(ASYNC{}) diff --git a/tests/cases/failing/values-tns.pre b/tests/cases/failing/values-tns.pre new file mode 100644 index 0000000..cc333cc --- /dev/null +++ b/tests/cases/failing/values-tns.pre @@ -0,0 +1 @@ +VALUES([0d1]) diff --git a/tests/cases/passing/keyin-basic.pre b/tests/cases/passing/keyin-basic.pre new file mode 100644 index 0000000..a4135f5 --- /dev/null +++ b/tests/cases/passing/keyin-basic.pre @@ -0,0 +1,5 @@ +MAP: m = <"a" = 0d1, "b" = 0d2> + +ASSERT(KEYIN("a", m)) +ASSERT(NOT(KEYIN("missing", m))) +ASSERT(EQ(TYPE(KEYIN("a", m)), "BOOL")) diff --git a/tests/cases/passing/keyin-key-types.pre b/tests/cases/passing/keyin-key-types.pre new file mode 100644 index 0000000..6a8692d --- /dev/null +++ b/tests/cases/passing/keyin-key-types.pre @@ -0,0 +1,7 @@ +MAP: m = <0d1 = "int", 0d2.5 = "flt", "three" = "str"> + +ASSERT(KEYIN(0d1, m)) +ASSERT(KEYIN(0d2.5, m)) +ASSERT(KEYIN("three", m)) +ASSERT(NOT(KEYIN(0d1.0, m))) +ASSERT(NOT(KEYIN("0d1", m))) diff --git a/tests/cases/passing/keys-insertion-order.pre b/tests/cases/passing/keys-insertion-order.pre new file mode 100644 index 0000000..255b9ff --- /dev/null +++ b/tests/cases/passing/keys-insertion-order.pre @@ -0,0 +1,3 @@ +MAP: m = <"alpha" = 0d1, "beta" = 0d2, "gamma" = 0d3> + +ASSERT(EQ(KEYS(m), ["alpha", "beta", "gamma"])) diff --git a/tests/cases/passing/keys-mixed-key-types.pre b/tests/cases/passing/keys-mixed-key-types.pre new file mode 100644 index 0000000..72af5e0 --- /dev/null +++ b/tests/cases/passing/keys-mixed-key-types.pre @@ -0,0 +1,3 @@ +MAP: m = <0d1 = "one", 0d2.5 = "two_point_five", "three" = "three"> + +ASSERT(EQ(KEYS(m), [0d1, 0d2.5, "three"])) diff --git a/tests/cases/passing/keys-result-is-1d.pre b/tests/cases/passing/keys-result-is-1d.pre new file mode 100644 index 0000000..0fc426a --- /dev/null +++ b/tests/cases/passing/keys-result-is-1d.pre @@ -0,0 +1,5 @@ +MAP: m = <"x" = 0d1, "y" = 0d2> + +TNS: k = KEYS(m) +ASSERT(EQ(TYPE(k), "TNS")) +ASSERT(EQ(SHAPE(k), [0d2])) diff --git a/tests/cases/passing/valuein-any-type.pre b/tests/cases/passing/valuein-any-type.pre new file mode 100644 index 0000000..1f5baa4 --- /dev/null +++ b/tests/cases/passing/valuein-any-type.pre @@ -0,0 +1,12 @@ +MAP: bool_map = <"t" = TRUE, "f" = FALSE> +MAP: int_map = <"i" = 0d7> +MAP: flt_map = <"p" = 0d2.5> +MAP: str_map = <"s" = "text"> +MAP: tns_map = <"vec" = [0d1, 0d2]> + +ASSERT(VALUEIN(TRUE, bool_map)) +ASSERT(VALUEIN(0d7, int_map)) +ASSERT(VALUEIN(0d2.5, flt_map)) +ASSERT(VALUEIN("text", str_map)) +ASSERT(VALUEIN([0d1, 0d2], tns_map)) +ASSERT(NOT(VALUEIN([0d2, 0d1], tns_map))) diff --git a/tests/cases/passing/valuein-basic.pre b/tests/cases/passing/valuein-basic.pre new file mode 100644 index 0000000..4fb44e8 --- /dev/null +++ b/tests/cases/passing/valuein-basic.pre @@ -0,0 +1,5 @@ +MAP: m = <"x" = "cat", "y" = "dog"> + +ASSERT(VALUEIN("cat", m)) +ASSERT(NOT(VALUEIN("bird", m))) +ASSERT(EQ(TYPE(VALUEIN("cat", m)), "BOOL")) diff --git a/tests/cases/passing/values-insertion-order.pre b/tests/cases/passing/values-insertion-order.pre new file mode 100644 index 0000000..bf89e82 --- /dev/null +++ b/tests/cases/passing/values-insertion-order.pre @@ -0,0 +1,3 @@ +MAP: m = <"alpha" = "first", "beta" = "second", "gamma" = "third"> + +ASSERT(EQ(VALUES(m), ["first", "second", "third"])) diff --git a/tests/cases/passing/values-result-is-1d.pre b/tests/cases/passing/values-result-is-1d.pre new file mode 100644 index 0000000..4c36cb7 --- /dev/null +++ b/tests/cases/passing/values-result-is-1d.pre @@ -0,0 +1,3 @@ +MAP: m = <0d1 = 0d10, 0d2 = 0d20, 0d3 = 0d30> + +ASSERT(EQ(VALUES(m), [0d10, 0d20, 0d30])) From 90905605271ce37439e6cef90a9bf4e63c2eacb4 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Tue, 7 Apr 2026 08:18:39 -0400 Subject: [PATCH 18/60] Add tests for MATCH. --- tests/cases/failing/match-arity-one.pre | 1 + tests/cases/failing/match-arity-six.pre | 1 + tests/cases/failing/match-arity-zero.pre | 1 + tests/cases/failing/match-first-bool.pre | 1 + tests/cases/failing/match-first-flt.pre | 1 + tests/cases/failing/match-first-func.pre | 1 + tests/cases/failing/match-first-int.pre | 1 + tests/cases/failing/match-first-str.pre | 1 + tests/cases/failing/match-first-thr.pre | 1 + tests/cases/failing/match-first-tns.pre | 1 + tests/cases/failing/match-recurse-not-int.pre | 1 + tests/cases/failing/match-second-bool.pre | 1 + tests/cases/failing/match-second-flt.pre | 1 + tests/cases/failing/match-second-func.pre | 1 + tests/cases/failing/match-second-int.pre | 1 + tests/cases/failing/match-second-str.pre | 1 + tests/cases/failing/match-second-thr.pre | 1 + tests/cases/failing/match-second-tns.pre | 1 + tests/cases/failing/match-shape-not-int.pre | 1 + tests/cases/failing/match-typing-not-int.pre | 1 + tests/cases/passing/match-basic.pre | 7 +++++++ tests/cases/passing/match-recurse.pre | 19 +++++++++++++++++++ tests/cases/passing/match-shape.pre | 6 ++++++ tests/cases/passing/match-typing.pre | 6 ++++++ 24 files changed, 58 insertions(+) create mode 100644 tests/cases/failing/match-arity-one.pre create mode 100644 tests/cases/failing/match-arity-six.pre create mode 100644 tests/cases/failing/match-arity-zero.pre create mode 100644 tests/cases/failing/match-first-bool.pre create mode 100644 tests/cases/failing/match-first-flt.pre create mode 100644 tests/cases/failing/match-first-func.pre create mode 100644 tests/cases/failing/match-first-int.pre create mode 100644 tests/cases/failing/match-first-str.pre create mode 100644 tests/cases/failing/match-first-thr.pre create mode 100644 tests/cases/failing/match-first-tns.pre create mode 100644 tests/cases/failing/match-recurse-not-int.pre create mode 100644 tests/cases/failing/match-second-bool.pre create mode 100644 tests/cases/failing/match-second-flt.pre create mode 100644 tests/cases/failing/match-second-func.pre create mode 100644 tests/cases/failing/match-second-int.pre create mode 100644 tests/cases/failing/match-second-str.pre create mode 100644 tests/cases/failing/match-second-thr.pre create mode 100644 tests/cases/failing/match-second-tns.pre create mode 100644 tests/cases/failing/match-shape-not-int.pre create mode 100644 tests/cases/failing/match-typing-not-int.pre create mode 100644 tests/cases/passing/match-basic.pre create mode 100644 tests/cases/passing/match-recurse.pre create mode 100644 tests/cases/passing/match-shape.pre create mode 100644 tests/cases/passing/match-typing.pre diff --git a/tests/cases/failing/match-arity-one.pre b/tests/cases/failing/match-arity-one.pre new file mode 100644 index 0000000..f3b6edf --- /dev/null +++ b/tests/cases/failing/match-arity-one.pre @@ -0,0 +1 @@ +MATCH(<>) diff --git a/tests/cases/failing/match-arity-six.pre b/tests/cases/failing/match-arity-six.pre new file mode 100644 index 0000000..3f1c742 --- /dev/null +++ b/tests/cases/failing/match-arity-six.pre @@ -0,0 +1 @@ +MATCH(<>, <>, 0d1, 0d1, 0d1, 0d1) diff --git a/tests/cases/failing/match-arity-zero.pre b/tests/cases/failing/match-arity-zero.pre new file mode 100644 index 0000000..78a20ff --- /dev/null +++ b/tests/cases/failing/match-arity-zero.pre @@ -0,0 +1 @@ +MATCH() diff --git a/tests/cases/failing/match-first-bool.pre b/tests/cases/failing/match-first-bool.pre new file mode 100644 index 0000000..03d59bd --- /dev/null +++ b/tests/cases/failing/match-first-bool.pre @@ -0,0 +1 @@ +MATCH(TRUE, <>) diff --git a/tests/cases/failing/match-first-flt.pre b/tests/cases/failing/match-first-flt.pre new file mode 100644 index 0000000..8cc3b9c --- /dev/null +++ b/tests/cases/failing/match-first-flt.pre @@ -0,0 +1 @@ +MATCH(0d1.5, <>) diff --git a/tests/cases/failing/match-first-func.pre b/tests/cases/failing/match-first-func.pre new file mode 100644 index 0000000..5eb3104 --- /dev/null +++ b/tests/cases/failing/match-first-func.pre @@ -0,0 +1 @@ +MATCH(LAMBDA INT: (){}, <>) diff --git a/tests/cases/failing/match-first-int.pre b/tests/cases/failing/match-first-int.pre new file mode 100644 index 0000000..3de03fe --- /dev/null +++ b/tests/cases/failing/match-first-int.pre @@ -0,0 +1 @@ +MATCH(0d1, <>) diff --git a/tests/cases/failing/match-first-str.pre b/tests/cases/failing/match-first-str.pre new file mode 100644 index 0000000..758262f --- /dev/null +++ b/tests/cases/failing/match-first-str.pre @@ -0,0 +1 @@ +MATCH("map", <>) diff --git a/tests/cases/failing/match-first-thr.pre b/tests/cases/failing/match-first-thr.pre new file mode 100644 index 0000000..7d31abb --- /dev/null +++ b/tests/cases/failing/match-first-thr.pre @@ -0,0 +1 @@ +MATCH(ASYNC{}, <>) diff --git a/tests/cases/failing/match-first-tns.pre b/tests/cases/failing/match-first-tns.pre new file mode 100644 index 0000000..9e308b7 --- /dev/null +++ b/tests/cases/failing/match-first-tns.pre @@ -0,0 +1 @@ +MATCH([0d1], <>) diff --git a/tests/cases/failing/match-recurse-not-int.pre b/tests/cases/failing/match-recurse-not-int.pre new file mode 100644 index 0000000..e598376 --- /dev/null +++ b/tests/cases/failing/match-recurse-not-int.pre @@ -0,0 +1 @@ +MATCH(<>, <>, recurse = "1") diff --git a/tests/cases/failing/match-second-bool.pre b/tests/cases/failing/match-second-bool.pre new file mode 100644 index 0000000..e91aba3 --- /dev/null +++ b/tests/cases/failing/match-second-bool.pre @@ -0,0 +1 @@ +MATCH(<>, TRUE) diff --git a/tests/cases/failing/match-second-flt.pre b/tests/cases/failing/match-second-flt.pre new file mode 100644 index 0000000..6d7473a --- /dev/null +++ b/tests/cases/failing/match-second-flt.pre @@ -0,0 +1 @@ +MATCH(<>, 0d1.5) diff --git a/tests/cases/failing/match-second-func.pre b/tests/cases/failing/match-second-func.pre new file mode 100644 index 0000000..8237e98 --- /dev/null +++ b/tests/cases/failing/match-second-func.pre @@ -0,0 +1 @@ +MATCH(<>, LAMBDA INT: (){}) diff --git a/tests/cases/failing/match-second-int.pre b/tests/cases/failing/match-second-int.pre new file mode 100644 index 0000000..1adfcd3 --- /dev/null +++ b/tests/cases/failing/match-second-int.pre @@ -0,0 +1 @@ +MATCH(<>, 0d1) diff --git a/tests/cases/failing/match-second-str.pre b/tests/cases/failing/match-second-str.pre new file mode 100644 index 0000000..ecb7257 --- /dev/null +++ b/tests/cases/failing/match-second-str.pre @@ -0,0 +1 @@ +MATCH(<>, "map") diff --git a/tests/cases/failing/match-second-thr.pre b/tests/cases/failing/match-second-thr.pre new file mode 100644 index 0000000..376bad1 --- /dev/null +++ b/tests/cases/failing/match-second-thr.pre @@ -0,0 +1 @@ +MATCH(<>, ASYNC{}) diff --git a/tests/cases/failing/match-second-tns.pre b/tests/cases/failing/match-second-tns.pre new file mode 100644 index 0000000..52f9101 --- /dev/null +++ b/tests/cases/failing/match-second-tns.pre @@ -0,0 +1 @@ +MATCH(<>, [0d1]) diff --git a/tests/cases/failing/match-shape-not-int.pre b/tests/cases/failing/match-shape-not-int.pre new file mode 100644 index 0000000..2691a2c --- /dev/null +++ b/tests/cases/failing/match-shape-not-int.pre @@ -0,0 +1 @@ +MATCH(<>, <>, shape = "1") diff --git a/tests/cases/failing/match-typing-not-int.pre b/tests/cases/failing/match-typing-not-int.pre new file mode 100644 index 0000000..1f124bd --- /dev/null +++ b/tests/cases/failing/match-typing-not-int.pre @@ -0,0 +1 @@ +MATCH(<>, <>, typing = "1") diff --git a/tests/cases/passing/match-basic.pre b/tests/cases/passing/match-basic.pre new file mode 100644 index 0000000..53379c0 --- /dev/null +++ b/tests/cases/passing/match-basic.pre @@ -0,0 +1,7 @@ +MAP: candidate = <"alpha" = 0d1, "beta" = "dog"> + +ASSERT(MATCH(candidate, <>)) +ASSERT(MATCH(candidate, <"alpha" = 0d99>)) +ASSERT(MATCH(candidate, <"alpha" = "ignored", "beta" = 0d0>)) +ASSERT(NOT(MATCH(candidate, <"gamma" = 0d0>))) +ASSERT(EQ(TYPE(MATCH(candidate, <"alpha" = 0d0>)), "BOOL")) diff --git a/tests/cases/passing/match-recurse.pre b/tests/cases/passing/match-recurse.pre new file mode 100644 index 0000000..4931626 --- /dev/null +++ b/tests/cases/passing/match-recurse.pre @@ -0,0 +1,19 @@ +MAP: missing_candidate = <"outer" = <"present" = 0d1>> +MAP: missing_template = <"outer" = <"missing" = 0d1>> + +MAP: type_candidate = <"outer" = <"value" = 0d1>> +MAP: type_template = <"outer" = <"value" = "x">> + +MAP: shape_candidate = <"outer" = <"tensor" = [[0d1, 0d2], [0d3, 0d4]]>> +MAP: shape_template = <"outer" = <"tensor" = [0d9, 0d8, 0d7, 0d6]>> + +ASSERT(MATCH(missing_candidate, missing_template)) +ASSERT(NOT(MATCH(missing_candidate, missing_template, recurse = 0d1))) + +ASSERT(MATCH(type_candidate, type_template, typing = 0d1)) +ASSERT(MATCH(type_candidate, type_template, recurse = 0d1)) +ASSERT(NOT(MATCH(type_candidate, type_template, typing = 0d1, recurse = -0d1))) + +ASSERT(MATCH(shape_candidate, shape_template, shape = 0d1)) +ASSERT(MATCH(shape_candidate, shape_template, recurse = 0d1)) +ASSERT(NOT(MATCH(shape_candidate, shape_template, shape = 0d1, recurse = 0d1))) diff --git a/tests/cases/passing/match-shape.pre b/tests/cases/passing/match-shape.pre new file mode 100644 index 0000000..0bfaffa --- /dev/null +++ b/tests/cases/passing/match-shape.pre @@ -0,0 +1,6 @@ +MAP: candidate = <"tensor" = [[0d1, 0d2], [0d3, 0d4]], "scalar" = 0d1> + +ASSERT(MATCH(candidate, <"tensor" = [0d9, 0d8, 0d7, 0d6]>)) +ASSERT(MATCH(candidate, <"tensor" = [[0d9, 0d8], [0d7, 0d6]]>, shape = 0d1)) +ASSERT(NOT(MATCH(candidate, <"tensor" = [0d9, 0d8, 0d7, 0d6]>, shape = -0d1))) +ASSERT(MATCH(candidate, <"scalar" = "different type">, shape = 0d1)) diff --git a/tests/cases/passing/match-typing.pre b/tests/cases/passing/match-typing.pre new file mode 100644 index 0000000..66d9c7e --- /dev/null +++ b/tests/cases/passing/match-typing.pre @@ -0,0 +1,6 @@ +MAP: candidate = <"value" = 0d1, "other" = "text"> + +ASSERT(MATCH(candidate, <"value" = "1">)) +ASSERT(MATCH(candidate, <"value" = 0d99>, typing = 0d1)) +ASSERT(MATCH(candidate, <"other" = "different">, typing = 0d7)) +ASSERT(NOT(MATCH(candidate, <"value" = "1">, typing = -0d1))) From 1d1c63faa285a2b3ed1e1d1635dbf4ff1d008dec Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Tue, 7 Apr 2026 09:06:57 -0400 Subject: [PATCH 19/60] Add tests for INV. --- tests/cases/failing/inv-arity-two.pre | 1 + tests/cases/failing/inv-arity-zero.pre | 1 + tests/cases/failing/inv-bool.pre | 1 + tests/cases/failing/inv-duplicate-values.pre | 1 + tests/cases/failing/inv-flt.pre | 1 + tests/cases/failing/inv-func.pre | 1 + tests/cases/failing/inv-int.pre | 1 + tests/cases/failing/inv-str.pre | 1 + tests/cases/failing/inv-thr.pre | 1 + tests/cases/failing/inv-tns.pre | 1 + tests/cases/failing/inv-value-bool.pre | 1 + tests/cases/failing/inv-value-func.pre | 1 + tests/cases/failing/inv-value-map.pre | 1 + tests/cases/failing/inv-value-thr.pre | 1 + tests/cases/failing/inv-value-tns.pre | 1 + tests/cases/passing/inv-basic.pre | 1 + tests/cases/passing/inv-empty.pre | 1 + tests/cases/passing/inv-pointer-writeback.pre | 5 +++++ tests/cases/passing/inv-return-type.pre | 3 +++ tests/cases/passing/inv-source-unchanged.pre | 5 +++++ tests/cases/passing/inv-value-flt.pre | 1 + tests/cases/passing/inv-value-int.pre | 1 + tests/cases/passing/inv-value-str.pre | 1 + 23 files changed, 33 insertions(+) create mode 100644 tests/cases/failing/inv-arity-two.pre create mode 100644 tests/cases/failing/inv-arity-zero.pre create mode 100644 tests/cases/failing/inv-bool.pre create mode 100644 tests/cases/failing/inv-duplicate-values.pre create mode 100644 tests/cases/failing/inv-flt.pre create mode 100644 tests/cases/failing/inv-func.pre create mode 100644 tests/cases/failing/inv-int.pre create mode 100644 tests/cases/failing/inv-str.pre create mode 100644 tests/cases/failing/inv-thr.pre create mode 100644 tests/cases/failing/inv-tns.pre create mode 100644 tests/cases/failing/inv-value-bool.pre create mode 100644 tests/cases/failing/inv-value-func.pre create mode 100644 tests/cases/failing/inv-value-map.pre create mode 100644 tests/cases/failing/inv-value-thr.pre create mode 100644 tests/cases/failing/inv-value-tns.pre create mode 100644 tests/cases/passing/inv-basic.pre create mode 100644 tests/cases/passing/inv-empty.pre create mode 100644 tests/cases/passing/inv-pointer-writeback.pre create mode 100644 tests/cases/passing/inv-return-type.pre create mode 100644 tests/cases/passing/inv-source-unchanged.pre create mode 100644 tests/cases/passing/inv-value-flt.pre create mode 100644 tests/cases/passing/inv-value-int.pre create mode 100644 tests/cases/passing/inv-value-str.pre diff --git a/tests/cases/failing/inv-arity-two.pre b/tests/cases/failing/inv-arity-two.pre new file mode 100644 index 0000000..dae0632 --- /dev/null +++ b/tests/cases/failing/inv-arity-two.pre @@ -0,0 +1 @@ +INV(<"a" = "x">, <"b" = "y">) \ No newline at end of file diff --git a/tests/cases/failing/inv-arity-zero.pre b/tests/cases/failing/inv-arity-zero.pre new file mode 100644 index 0000000..0bb656d --- /dev/null +++ b/tests/cases/failing/inv-arity-zero.pre @@ -0,0 +1 @@ +INV() \ No newline at end of file diff --git a/tests/cases/failing/inv-bool.pre b/tests/cases/failing/inv-bool.pre new file mode 100644 index 0000000..9d18787 --- /dev/null +++ b/tests/cases/failing/inv-bool.pre @@ -0,0 +1 @@ +INV(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/inv-duplicate-values.pre b/tests/cases/failing/inv-duplicate-values.pre new file mode 100644 index 0000000..b9eb78a --- /dev/null +++ b/tests/cases/failing/inv-duplicate-values.pre @@ -0,0 +1 @@ +INV(<"a" = "dup", "b" = "dup">) \ No newline at end of file diff --git a/tests/cases/failing/inv-flt.pre b/tests/cases/failing/inv-flt.pre new file mode 100644 index 0000000..885fa5a --- /dev/null +++ b/tests/cases/failing/inv-flt.pre @@ -0,0 +1 @@ +INV(0d1.5) \ No newline at end of file diff --git a/tests/cases/failing/inv-func.pre b/tests/cases/failing/inv-func.pre new file mode 100644 index 0000000..ad07fba --- /dev/null +++ b/tests/cases/failing/inv-func.pre @@ -0,0 +1 @@ +INV(LAMBDA INT: (){}) \ No newline at end of file diff --git a/tests/cases/failing/inv-int.pre b/tests/cases/failing/inv-int.pre new file mode 100644 index 0000000..ac1f38e --- /dev/null +++ b/tests/cases/failing/inv-int.pre @@ -0,0 +1 @@ +INV(0d1) \ No newline at end of file diff --git a/tests/cases/failing/inv-str.pre b/tests/cases/failing/inv-str.pre new file mode 100644 index 0000000..13a9e8e --- /dev/null +++ b/tests/cases/failing/inv-str.pre @@ -0,0 +1 @@ +INV("map") \ No newline at end of file diff --git a/tests/cases/failing/inv-thr.pre b/tests/cases/failing/inv-thr.pre new file mode 100644 index 0000000..bcbd660 --- /dev/null +++ b/tests/cases/failing/inv-thr.pre @@ -0,0 +1 @@ +INV(ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/inv-tns.pre b/tests/cases/failing/inv-tns.pre new file mode 100644 index 0000000..99c3b4a --- /dev/null +++ b/tests/cases/failing/inv-tns.pre @@ -0,0 +1 @@ +INV([0d1]) \ No newline at end of file diff --git a/tests/cases/failing/inv-value-bool.pre b/tests/cases/failing/inv-value-bool.pre new file mode 100644 index 0000000..0b36414 --- /dev/null +++ b/tests/cases/failing/inv-value-bool.pre @@ -0,0 +1 @@ +INV(<"a" = TRUE>) \ No newline at end of file diff --git a/tests/cases/failing/inv-value-func.pre b/tests/cases/failing/inv-value-func.pre new file mode 100644 index 0000000..afc7ddd --- /dev/null +++ b/tests/cases/failing/inv-value-func.pre @@ -0,0 +1 @@ +INV(<"a" = LAMBDA INT: (){}>) \ No newline at end of file diff --git a/tests/cases/failing/inv-value-map.pre b/tests/cases/failing/inv-value-map.pre new file mode 100644 index 0000000..6879d04 --- /dev/null +++ b/tests/cases/failing/inv-value-map.pre @@ -0,0 +1 @@ +INV(<"a" = <"x" = 0d1>>) \ No newline at end of file diff --git a/tests/cases/failing/inv-value-thr.pre b/tests/cases/failing/inv-value-thr.pre new file mode 100644 index 0000000..33548e9 --- /dev/null +++ b/tests/cases/failing/inv-value-thr.pre @@ -0,0 +1 @@ +INV(<"a" = ASYNC{}>) \ No newline at end of file diff --git a/tests/cases/failing/inv-value-tns.pre b/tests/cases/failing/inv-value-tns.pre new file mode 100644 index 0000000..b21f0bd --- /dev/null +++ b/tests/cases/failing/inv-value-tns.pre @@ -0,0 +1 @@ +INV(<"a" = [0d1]>) \ No newline at end of file diff --git a/tests/cases/passing/inv-basic.pre b/tests/cases/passing/inv-basic.pre new file mode 100644 index 0000000..a5d7c61 --- /dev/null +++ b/tests/cases/passing/inv-basic.pre @@ -0,0 +1 @@ +ASSERT(EQ(INV(<"alpha" = "x", "beta" = "y">), <"x" = "alpha", "y" = "beta">)) \ No newline at end of file diff --git a/tests/cases/passing/inv-empty.pre b/tests/cases/passing/inv-empty.pre new file mode 100644 index 0000000..64b40d9 --- /dev/null +++ b/tests/cases/passing/inv-empty.pre @@ -0,0 +1 @@ +ASSERT(EQ(INV(<>), <>)) \ No newline at end of file diff --git a/tests/cases/passing/inv-pointer-writeback.pre b/tests/cases/passing/inv-pointer-writeback.pre new file mode 100644 index 0000000..78b3594 --- /dev/null +++ b/tests/cases/passing/inv-pointer-writeback.pre @@ -0,0 +1,5 @@ +MAP: src = <"left" = "x", "right" = "y"> + +INV(@src) + +ASSERT(EQ(src, <"x" = "left", "y" = "right">)) \ No newline at end of file diff --git a/tests/cases/passing/inv-return-type.pre b/tests/cases/passing/inv-return-type.pre new file mode 100644 index 0000000..962f980 --- /dev/null +++ b/tests/cases/passing/inv-return-type.pre @@ -0,0 +1,3 @@ +ASSERT(EQ(TYPE(INV(<"one" = 0d1>)), "MAP"))MAP: m = <"a" = "x"> + +ASSERT(EQ(TYPE(INV(m)), "MAP")) \ No newline at end of file diff --git a/tests/cases/passing/inv-source-unchanged.pre b/tests/cases/passing/inv-source-unchanged.pre new file mode 100644 index 0000000..ba2ae8c --- /dev/null +++ b/tests/cases/passing/inv-source-unchanged.pre @@ -0,0 +1,5 @@ +MAP: src = <"left" = "x", "right" = "y"> + +INV(src) + +ASSERT(EQ(src, <"left" = "x", "right" = "y">)) \ No newline at end of file diff --git a/tests/cases/passing/inv-value-flt.pre b/tests/cases/passing/inv-value-flt.pre new file mode 100644 index 0000000..a04ae72 --- /dev/null +++ b/tests/cases/passing/inv-value-flt.pre @@ -0,0 +1 @@ +ASSERT(EQ(INV(<"pi" = 0d3.5>), <0d3.5 = "pi">)) \ No newline at end of file diff --git a/tests/cases/passing/inv-value-int.pre b/tests/cases/passing/inv-value-int.pre new file mode 100644 index 0000000..66abf6a --- /dev/null +++ b/tests/cases/passing/inv-value-int.pre @@ -0,0 +1 @@ +ASSERT(EQ(INV(<"one" = 0d1>), <0d1 = "one">)) \ No newline at end of file diff --git a/tests/cases/passing/inv-value-str.pre b/tests/cases/passing/inv-value-str.pre new file mode 100644 index 0000000..65dfee0 --- /dev/null +++ b/tests/cases/passing/inv-value-str.pre @@ -0,0 +1 @@ +ASSERT(EQ(INV(<"left" = "x">), <"x" = "left">)) \ No newline at end of file From 45118100fcbd055ef0abd06a84cf3cce2e840e9e Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Tue, 7 Apr 2026 09:30:06 -0400 Subject: [PATCH 20/60] Add tests for RUN. --- tests/cases/failing/run-arity-two.pre | 1 + tests/cases/failing/run-arity-zero.pre | 1 + tests/cases/failing/run-non-str.pre | 1 + tests/cases/passing/run-empty-source.pre | 3 +++ tests/cases/passing/run-parse-error.pre | 12 ++++++++++++ tests/cases/passing/run-runtime-error.pre | 12 ++++++++++++ tests/cases/passing/run-top-level-env.pre | 7 +++++++ 7 files changed, 37 insertions(+) create mode 100644 tests/cases/failing/run-arity-two.pre create mode 100644 tests/cases/failing/run-arity-zero.pre create mode 100644 tests/cases/failing/run-non-str.pre create mode 100644 tests/cases/passing/run-empty-source.pre create mode 100644 tests/cases/passing/run-parse-error.pre create mode 100644 tests/cases/passing/run-runtime-error.pre create mode 100644 tests/cases/passing/run-top-level-env.pre diff --git a/tests/cases/failing/run-arity-two.pre b/tests/cases/failing/run-arity-two.pre new file mode 100644 index 0000000..ba4e45f --- /dev/null +++ b/tests/cases/failing/run-arity-two.pre @@ -0,0 +1 @@ +RUN("", "") \ No newline at end of file diff --git a/tests/cases/failing/run-arity-zero.pre b/tests/cases/failing/run-arity-zero.pre new file mode 100644 index 0000000..8aeec48 --- /dev/null +++ b/tests/cases/failing/run-arity-zero.pre @@ -0,0 +1 @@ +RUN() \ No newline at end of file diff --git a/tests/cases/failing/run-non-str.pre b/tests/cases/failing/run-non-str.pre new file mode 100644 index 0000000..2f5bb83 --- /dev/null +++ b/tests/cases/failing/run-non-str.pre @@ -0,0 +1 @@ +RUN(0d1) \ No newline at end of file diff --git a/tests/cases/passing/run-empty-source.pre b/tests/cases/passing/run-empty-source.pre new file mode 100644 index 0000000..85afdc9 --- /dev/null +++ b/tests/cases/passing/run-empty-source.pre @@ -0,0 +1,3 @@ +INT: marker = 0d1 +RUN("") +ASSERT(EQ(marker, 0d1)) \ No newline at end of file diff --git a/tests/cases/passing/run-parse-error.pre b/tests/cases/passing/run-parse-error.pre new file mode 100644 index 0000000..09bb4e6 --- /dev/null +++ b/tests/cases/passing/run-parse-error.pre @@ -0,0 +1,12 @@ +INT: step = 0d0 +BOOL: caught = FALSE + +TRY{ + RUN("step = 0d1; IF(TRUE){") + ASSERT(FALSE) +} CATCH { + caught = TRUE +} + +ASSERT(caught) +ASSERT(EQ(step, 0d0)) \ No newline at end of file diff --git a/tests/cases/passing/run-runtime-error.pre b/tests/cases/passing/run-runtime-error.pre new file mode 100644 index 0000000..2dc3df6 --- /dev/null +++ b/tests/cases/passing/run-runtime-error.pre @@ -0,0 +1,12 @@ +INT: step = 0d0 +BOOL: caught = FALSE + +TRY{ + RUN("step = 0d1; ASSERT(FALSE); step = 0d2") + ASSERT(FALSE) +} CATCH { + caught = TRUE +} + +ASSERT(caught) +ASSERT(EQ(step, 0d1)) \ No newline at end of file diff --git a/tests/cases/passing/run-top-level-env.pre b/tests/cases/passing/run-top-level-env.pre new file mode 100644 index 0000000..39a98d4 --- /dev/null +++ b/tests/cases/passing/run-top-level-env.pre @@ -0,0 +1,7 @@ +INT: counter = 0d2 + +RUN("ASSERT(EQ(counter, 0d2)); counter = ADD(counter, 0d3)") +ASSERT(EQ(counter, 0d5)) + +RUN("INT: created = SUB(counter, 0d1)") +ASSERT(EQ(created, 0d4)) \ No newline at end of file From c6c7ddd2aff9fedeb6fce41a4639359ab861e313 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Tue, 7 Apr 2026 09:46:19 -0400 Subject: [PATCH 21/60] Add tests for THROW. --- tests/cases/failing/throw-uncaught-default.pre | 1 + tests/cases/failing/throw-uncaught-message.pre | 1 + tests/cases/passing/throw-concat-message.pre | 11 +++++++++++ tests/cases/passing/throw-control-transfer.pre | 11 +++++++++++ tests/cases/passing/throw-default-message.pre | 10 ++++++++++ tests/cases/passing/throw-empty-message.pre | 11 +++++++++++ tests/cases/passing/throw-string-message.pre | 10 ++++++++++ 7 files changed, 55 insertions(+) create mode 100644 tests/cases/failing/throw-uncaught-default.pre create mode 100644 tests/cases/failing/throw-uncaught-message.pre create mode 100644 tests/cases/passing/throw-concat-message.pre create mode 100644 tests/cases/passing/throw-control-transfer.pre create mode 100644 tests/cases/passing/throw-default-message.pre create mode 100644 tests/cases/passing/throw-empty-message.pre create mode 100644 tests/cases/passing/throw-string-message.pre diff --git a/tests/cases/failing/throw-uncaught-default.pre b/tests/cases/failing/throw-uncaught-default.pre new file mode 100644 index 0000000..6e4cb5f --- /dev/null +++ b/tests/cases/failing/throw-uncaught-default.pre @@ -0,0 +1 @@ +THROW() \ No newline at end of file diff --git a/tests/cases/failing/throw-uncaught-message.pre b/tests/cases/failing/throw-uncaught-message.pre new file mode 100644 index 0000000..ba0f409 --- /dev/null +++ b/tests/cases/failing/throw-uncaught-message.pre @@ -0,0 +1 @@ +THROW('prefix', 0d42) \ No newline at end of file diff --git a/tests/cases/passing/throw-concat-message.pre b/tests/cases/passing/throw-concat-message.pre new file mode 100644 index 0000000..d07b352 --- /dev/null +++ b/tests/cases/passing/throw-concat-message.pre @@ -0,0 +1,11 @@ +BOOL: caught = FALSE + +TRY{ + THROW("left=", 0d42, ",right=", -0b10) +} CATCH(err) { + caught = TRUE + PRINT(err) ! debug + ASSERT(EQ(err, "left=0d42,right=-0b10")) +} + +ASSERT(caught) \ No newline at end of file diff --git a/tests/cases/passing/throw-control-transfer.pre b/tests/cases/passing/throw-control-transfer.pre new file mode 100644 index 0000000..935f5e7 --- /dev/null +++ b/tests/cases/passing/throw-control-transfer.pre @@ -0,0 +1,11 @@ +INT: step = 0d0 + +TRY{ + step = 0d1 + THROW('stop') + step = ADD(step, 0d1) +} CATCH { + step = ADD(step, 0d10) +} + +ASSERT(EQ(step, 0d11)) \ No newline at end of file diff --git a/tests/cases/passing/throw-default-message.pre b/tests/cases/passing/throw-default-message.pre new file mode 100644 index 0000000..513f237 --- /dev/null +++ b/tests/cases/passing/throw-default-message.pre @@ -0,0 +1,10 @@ +BOOL: caught = FALSE + +TRY{ + THROW() +} CATCH(err) { + caught = TRUE + ASSERT(EQ(err, 'Exception thrown')) +} + +ASSERT(caught) \ No newline at end of file diff --git a/tests/cases/passing/throw-empty-message.pre b/tests/cases/passing/throw-empty-message.pre new file mode 100644 index 0000000..3721e40 --- /dev/null +++ b/tests/cases/passing/throw-empty-message.pre @@ -0,0 +1,11 @@ +BOOL: caught = FALSE + +TRY{ + THROW('') +} CATCH(err) { + caught = TRUE + ASSERT(EQ(err, '')) + ASSERT(EQ(SLEN(err), 0d0)) +} + +ASSERT(caught) \ No newline at end of file diff --git a/tests/cases/passing/throw-string-message.pre b/tests/cases/passing/throw-string-message.pre new file mode 100644 index 0000000..b66a840 --- /dev/null +++ b/tests/cases/passing/throw-string-message.pre @@ -0,0 +1,10 @@ +BOOL: caught = FALSE + +TRY{ + THROW('prefix') +} CATCH(err) { + caught = TRUE + ASSERT(EQ(err, 'prefix')) +} + +ASSERT(caught) \ No newline at end of file From 24da68898874acbbc36e106f07c9b6410a95d846 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Thu, 9 Apr 2026 23:54:17 -0400 Subject: [PATCH 22/60] Add tests for MAIN. --- tests/cases/failing/main-arity-one.pre | 1 + .../cases/passing/main-imported-function.ps1 | 37 ++++++++++++++ .../cases/passing/main-imported-top-level.ps1 | 40 +++++++++++++++ tests/cases/passing/main-in-condition.pre | 9 ++++ tests/cases/passing/main-primary-function.pre | 5 ++ tests/cases/passing/main-return-type.pre | 1 + tests/cases/passing/main-source-location.ps1 | 50 +++++++++++++++++++ tests/cases/passing/main-top-level.pre | 1 + 8 files changed, 144 insertions(+) create mode 100644 tests/cases/failing/main-arity-one.pre create mode 100644 tests/cases/passing/main-imported-function.ps1 create mode 100644 tests/cases/passing/main-imported-top-level.ps1 create mode 100644 tests/cases/passing/main-in-condition.pre create mode 100644 tests/cases/passing/main-primary-function.pre create mode 100644 tests/cases/passing/main-return-type.pre create mode 100644 tests/cases/passing/main-source-location.ps1 create mode 100644 tests/cases/passing/main-top-level.pre diff --git a/tests/cases/failing/main-arity-one.pre b/tests/cases/failing/main-arity-one.pre new file mode 100644 index 0000000..04e8596 --- /dev/null +++ b/tests/cases/failing/main-arity-one.pre @@ -0,0 +1 @@ +MAIN(0d1) \ No newline at end of file diff --git a/tests/cases/passing/main-imported-function.ps1 b/tests/cases/passing/main-imported-function.ps1 new file mode 100644 index 0000000..3c77376 --- /dev/null +++ b/tests/cases/passing/main-imported-function.ps1 @@ -0,0 +1,37 @@ +$prefixDir = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) +$exePath = Join-Path $prefixDir 'prefix.exe' + +if (-not (Test-Path $exePath)) { + throw "Interpreter executable not found at: $exePath" +} + +$tempDir = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) +New-Item -ItemType Directory -Path $tempDir | Out-Null + +try { + $modulePath = Join-Path $tempDir 'main_func_wrapper.pre' + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +FUNC BOOL: imported_main(){ + RETURN(MAIN()) +} +'@ + + $moduleLiteral = $modulePath.Replace('\', '\\') + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT_PATH("$moduleLiteral", helper) + +ASSERT(NOT(helper.imported_main())) +"@ + + $output = & $exePath $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/main-imported-top-level.ps1 b/tests/cases/passing/main-imported-top-level.ps1 new file mode 100644 index 0000000..7b4456a --- /dev/null +++ b/tests/cases/passing/main-imported-top-level.ps1 @@ -0,0 +1,40 @@ +$prefixDir = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) +$exePath = Join-Path $prefixDir 'prefix.exe' + +if (-not (Test-Path $exePath)) { + throw "Interpreter executable not found at: $exePath" +} + +$tempDir = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) +New-Item -ItemType Directory -Path $tempDir | Out-Null + +try { + $modulePath = Join-Path $tempDir 'main_top_result.pre' + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +BOOL: top_result = MAIN() + +FUNC BOOL: read_top_result(){ + RETURN(top_result) +} +'@ + + $moduleLiteral = $modulePath.Replace('\', '\\') + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT_PATH("$moduleLiteral", helper) + +ASSERT(NOT(helper.read_top_result())) +ASSERT(EQ(TYPE(helper.read_top_result()), "BOOL")) +"@ + + $output = & $exePath $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/main-in-condition.pre b/tests/cases/passing/main-in-condition.pre new file mode 100644 index 0000000..f24dd80 --- /dev/null +++ b/tests/cases/passing/main-in-condition.pre @@ -0,0 +1,9 @@ +BOOL: branch_taken = FALSE + +IF(MAIN()){ + branch_taken = TRUE +} ELSE { + ASSERT(FALSE) +} + +ASSERT(branch_taken) \ No newline at end of file diff --git a/tests/cases/passing/main-primary-function.pre b/tests/cases/passing/main-primary-function.pre new file mode 100644 index 0000000..10de07c --- /dev/null +++ b/tests/cases/passing/main-primary-function.pre @@ -0,0 +1,5 @@ +FUNC BOOL: from_primary_function(){ + RETURN(MAIN()) +} + +ASSERT(from_primary_function()) \ No newline at end of file diff --git a/tests/cases/passing/main-return-type.pre b/tests/cases/passing/main-return-type.pre new file mode 100644 index 0000000..62a1b1a --- /dev/null +++ b/tests/cases/passing/main-return-type.pre @@ -0,0 +1 @@ +ASSERT(EQ(TYPE(MAIN()), "BOOL")) \ No newline at end of file diff --git a/tests/cases/passing/main-source-location.ps1 b/tests/cases/passing/main-source-location.ps1 new file mode 100644 index 0000000..e7be916 --- /dev/null +++ b/tests/cases/passing/main-source-location.ps1 @@ -0,0 +1,50 @@ +$prefixDir = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) +$exePath = Join-Path $prefixDir 'prefix.exe' + +if (-not (Test-Path $exePath)) { + throw "Interpreter executable not found at: $exePath" +} + +$tempDir = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) +New-Item -ItemType Directory -Path $tempDir | Out-Null + +try { + $modulePath = Join-Path $tempDir 'main_func_wrapper.pre' + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +FUNC BOOL: imported_main(){ + RETURN(MAIN()) +} + +FUNC BOOL: call_callback(FUNC: callback){ + RETURN(callback()) +} + +FUNC BOOL: call_imported_main(){ + RETURN(imported_main()) +} +'@ + + $moduleLiteral = $modulePath.Replace('\', '\\') + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT_PATH("$moduleLiteral", helper) + +FUNC BOOL: local_main(){ + RETURN(MAIN()) +} + +ASSERT(helper.call_callback(local_main)) +ASSERT(NOT(helper.call_imported_main())) +"@ + + $output = & $exePath $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/main-top-level.pre b/tests/cases/passing/main-top-level.pre new file mode 100644 index 0000000..c231566 --- /dev/null +++ b/tests/cases/passing/main-top-level.pre @@ -0,0 +1 @@ +ASSERT(MAIN()) \ No newline at end of file From a3abf5ef60358ad5b8ee8a5b7e15520a115fc1be Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Fri, 10 Apr 2026 00:38:31 -0400 Subject: [PATCH 23/60] Add tests for PARALLEL. --- tests/cases/failing/parallel-arity-zero.pre | 1 + tests/cases/failing/parallel-non-func-arg.pre | 1 + .../failing/parallel-tensor-non-func.pre | 3 +++ .../cases/failing/parallel-worker-failure.pre | 5 +++++ .../cases/failing/parallel-worker-no-args.pre | 5 +++++ .../passing/parallel-tensor-func-values.pre | 16 ++++++++++++++ .../cases/passing/parallel-tensor-literal.pre | 14 ++++++++++++ tests/cases/passing/parallel-variadic.pre | 22 +++++++++++++++++++ 8 files changed, 67 insertions(+) create mode 100644 tests/cases/failing/parallel-arity-zero.pre create mode 100644 tests/cases/failing/parallel-non-func-arg.pre create mode 100644 tests/cases/failing/parallel-tensor-non-func.pre create mode 100644 tests/cases/failing/parallel-worker-failure.pre create mode 100644 tests/cases/failing/parallel-worker-no-args.pre create mode 100644 tests/cases/passing/parallel-tensor-func-values.pre create mode 100644 tests/cases/passing/parallel-tensor-literal.pre create mode 100644 tests/cases/passing/parallel-variadic.pre diff --git a/tests/cases/failing/parallel-arity-zero.pre b/tests/cases/failing/parallel-arity-zero.pre new file mode 100644 index 0000000..503f684 --- /dev/null +++ b/tests/cases/failing/parallel-arity-zero.pre @@ -0,0 +1 @@ +PARALLEL() \ No newline at end of file diff --git a/tests/cases/failing/parallel-non-func-arg.pre b/tests/cases/failing/parallel-non-func-arg.pre new file mode 100644 index 0000000..b2ef802 --- /dev/null +++ b/tests/cases/failing/parallel-non-func-arg.pre @@ -0,0 +1 @@ +PARALLEL(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/parallel-tensor-non-func.pre b/tests/cases/failing/parallel-tensor-non-func.pre new file mode 100644 index 0000000..4edb7c6 --- /dev/null +++ b/tests/cases/failing/parallel-tensor-non-func.pre @@ -0,0 +1,3 @@ +FUNC BOOL: worker(){} + +PARALLEL([worker, 0d1]) \ No newline at end of file diff --git a/tests/cases/failing/parallel-worker-failure.pre b/tests/cases/failing/parallel-worker-failure.pre new file mode 100644 index 0000000..d381b8a --- /dev/null +++ b/tests/cases/failing/parallel-worker-failure.pre @@ -0,0 +1,5 @@ +FUNC BOOL: explode(){ + THROW("boom") +} + +PARALLEL(explode) \ No newline at end of file diff --git a/tests/cases/failing/parallel-worker-no-args.pre b/tests/cases/failing/parallel-worker-no-args.pre new file mode 100644 index 0000000..9862366 --- /dev/null +++ b/tests/cases/failing/parallel-worker-no-args.pre @@ -0,0 +1,5 @@ +FUNC BOOL: requires_arg(INT: value){ + RETURN(TRUE) +} + +PARALLEL(requires_arg) \ No newline at end of file diff --git a/tests/cases/passing/parallel-tensor-func-values.pre b/tests/cases/passing/parallel-tensor-func-values.pre new file mode 100644 index 0000000..ce36376 --- /dev/null +++ b/tests/cases/passing/parallel-tensor-func-values.pre @@ -0,0 +1,16 @@ +TNS: seen = [FALSE, FALSE] + +FUNC: first = LAMBDA BOOL: (){ + FOR(i, 0d500){} + seen[0d1] = TRUE +} + +FUNC: second = LAMBDA BOOL: (){ + FOR(i, 0d500){} + seen[0d2] = TRUE +} + +TNS: workers = [first, second] + +ASSERT(EQ(PARALLEL(workers), FALSE)) +ASSERT(EQ(seen, [TRUE, TRUE])) \ No newline at end of file diff --git a/tests/cases/passing/parallel-tensor-literal.pre b/tests/cases/passing/parallel-tensor-literal.pre new file mode 100644 index 0000000..5cd05e5 --- /dev/null +++ b/tests/cases/passing/parallel-tensor-literal.pre @@ -0,0 +1,14 @@ +TNS: seen = [FALSE, FALSE] + +FUNC BOOL: first(){ + FOR(i, 0d500){} + seen[0d1] = TRUE +} + +FUNC BOOL: second(){ + FOR(i, 0d500){} + seen[0d2] = TRUE +} + +ASSERT(EQ(PARALLEL([first, second]), FALSE)) +ASSERT(EQ(seen, [TRUE, TRUE])) \ No newline at end of file diff --git a/tests/cases/passing/parallel-variadic.pre b/tests/cases/passing/parallel-variadic.pre new file mode 100644 index 0000000..629d00f --- /dev/null +++ b/tests/cases/passing/parallel-variadic.pre @@ -0,0 +1,22 @@ +TNS: seen = [FALSE, FALSE, FALSE] + +FUNC BOOL: first(){ + FOR(i, 0d500){ + } + seen[0d1] = TRUE +} + +FUNC BOOL: second(){ + FOR(i, 0d500){ + } + seen[0d2] = TRUE +} + +FUNC BOOL: third(){ + FOR(i, 0d500){ + } + seen[0d3] = TRUE +} + +ASSERT(EQ(PARALLEL(first, second, third), FALSE)) +ASSERT(EQ(seen, [TRUE, TRUE, TRUE])) \ No newline at end of file From 86cd577ed46eae51fa2fc4d80c83e295f4c4010f Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Fri, 10 Apr 2026 14:19:18 -0400 Subject: [PATCH 24/60] Add tests for AWAIT. --- tests/cases/failing/await-arity-two.pre | 2 ++ tests/cases/failing/await-arity-zero.pre | 1 + tests/cases/failing/await-type-bool.pre | 1 + tests/cases/failing/await-type-flt.pre | 1 + tests/cases/failing/await-type-func.pre | 1 + tests/cases/failing/await-type-int.pre | 1 + tests/cases/failing/await-type-map.pre | 1 + tests/cases/failing/await-type-str.pre | 1 + tests/cases/failing/await-type-tns.pre | 1 + tests/cases/passing/await-expression-handle.pre | 6 ++++++ tests/cases/passing/await-finished-thread.pre | 6 ++++++ tests/cases/passing/await-shared-mutation.pre | 13 +++++++++++++ 12 files changed, 35 insertions(+) create mode 100644 tests/cases/failing/await-arity-two.pre create mode 100644 tests/cases/failing/await-arity-zero.pre create mode 100644 tests/cases/failing/await-type-bool.pre create mode 100644 tests/cases/failing/await-type-flt.pre create mode 100644 tests/cases/failing/await-type-func.pre create mode 100644 tests/cases/failing/await-type-int.pre create mode 100644 tests/cases/failing/await-type-map.pre create mode 100644 tests/cases/failing/await-type-str.pre create mode 100644 tests/cases/failing/await-type-tns.pre create mode 100644 tests/cases/passing/await-expression-handle.pre create mode 100644 tests/cases/passing/await-finished-thread.pre create mode 100644 tests/cases/passing/await-shared-mutation.pre diff --git a/tests/cases/failing/await-arity-two.pre b/tests/cases/failing/await-arity-two.pre new file mode 100644 index 0000000..0e02ce5 --- /dev/null +++ b/tests/cases/failing/await-arity-two.pre @@ -0,0 +1,2 @@ +THR(worker){} +AWAIT(worker, worker) \ No newline at end of file diff --git a/tests/cases/failing/await-arity-zero.pre b/tests/cases/failing/await-arity-zero.pre new file mode 100644 index 0000000..7f5ff8b --- /dev/null +++ b/tests/cases/failing/await-arity-zero.pre @@ -0,0 +1 @@ +AWAIT() \ No newline at end of file diff --git a/tests/cases/failing/await-type-bool.pre b/tests/cases/failing/await-type-bool.pre new file mode 100644 index 0000000..3987f9f --- /dev/null +++ b/tests/cases/failing/await-type-bool.pre @@ -0,0 +1 @@ +AWAIT(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/await-type-flt.pre b/tests/cases/failing/await-type-flt.pre new file mode 100644 index 0000000..99a2c79 --- /dev/null +++ b/tests/cases/failing/await-type-flt.pre @@ -0,0 +1 @@ +AWAIT(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/await-type-func.pre b/tests/cases/failing/await-type-func.pre new file mode 100644 index 0000000..79f05e2 --- /dev/null +++ b/tests/cases/failing/await-type-func.pre @@ -0,0 +1 @@ +AWAIT(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/await-type-int.pre b/tests/cases/failing/await-type-int.pre new file mode 100644 index 0000000..a9c07d2 --- /dev/null +++ b/tests/cases/failing/await-type-int.pre @@ -0,0 +1 @@ +AWAIT(0d1) \ No newline at end of file diff --git a/tests/cases/failing/await-type-map.pre b/tests/cases/failing/await-type-map.pre new file mode 100644 index 0000000..00d65b7 --- /dev/null +++ b/tests/cases/failing/await-type-map.pre @@ -0,0 +1 @@ +AWAIT(<>) \ No newline at end of file diff --git a/tests/cases/failing/await-type-str.pre b/tests/cases/failing/await-type-str.pre new file mode 100644 index 0000000..1604378 --- /dev/null +++ b/tests/cases/failing/await-type-str.pre @@ -0,0 +1 @@ +AWAIT("thread") \ No newline at end of file diff --git a/tests/cases/failing/await-type-tns.pre b/tests/cases/failing/await-type-tns.pre new file mode 100644 index 0000000..bdd4230 --- /dev/null +++ b/tests/cases/failing/await-type-tns.pre @@ -0,0 +1 @@ +AWAIT([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/await-expression-handle.pre b/tests/cases/passing/await-expression-handle.pre new file mode 100644 index 0000000..3e81d59 --- /dev/null +++ b/tests/cases/passing/await-expression-handle.pre @@ -0,0 +1,6 @@ +THR: worker = ASYNC{} +THR: awaited = AWAIT(worker) + +ASSERT(EQ(TYPE(awaited), "THR")) +ASSERT(EQ(awaited, worker)) +ASSERT(NOT(BOOL(awaited))) \ No newline at end of file diff --git a/tests/cases/passing/await-finished-thread.pre b/tests/cases/passing/await-finished-thread.pre new file mode 100644 index 0000000..f749fd7 --- /dev/null +++ b/tests/cases/passing/await-finished-thread.pre @@ -0,0 +1,6 @@ +THR(worker){} + +AWAIT(worker) + +ASSERT(EQ(AWAIT(worker), worker)) +ASSERT(NOT(BOOL(worker))) \ No newline at end of file diff --git a/tests/cases/passing/await-shared-mutation.pre b/tests/cases/passing/await-shared-mutation.pre new file mode 100644 index 0000000..08d8b69 --- /dev/null +++ b/tests/cases/passing/await-shared-mutation.pre @@ -0,0 +1,13 @@ +INT: shared = 0d0 + +THR(worker){ + FOR(i, 0d256){ + } + shared = 0d1 +} + +THR: awaited = AWAIT(worker) + +ASSERT(EQ(awaited, worker)) +ASSERT(EQ(shared, 0d1)) +ASSERT(NOT(BOOL(worker))) \ No newline at end of file From 5a9faba1c8adf7b5e9a3d71168ef624c642f3060 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Fri, 10 Apr 2026 14:29:17 -0400 Subject: [PATCH 25/60] Add tests for STOP. --- tests/cases/failing/stop-arity-two.pre | 3 +++ tests/cases/failing/stop-arity-zero.pre | 1 + tests/cases/failing/stop-type-bool.pre | 1 + tests/cases/failing/stop-type-flt.pre | 1 + tests/cases/failing/stop-type-func.pre | 1 + tests/cases/failing/stop-type-int.pre | 1 + tests/cases/failing/stop-type-map.pre | 1 + tests/cases/failing/stop-type-str.pre | 1 + tests/cases/failing/stop-type-tns.pre | 1 + tests/cases/passing/stop-async-handle.pre | 16 ++++++++++++++++ tests/cases/passing/stop-thread-handle.pre | 17 +++++++++++++++++ 11 files changed, 44 insertions(+) create mode 100644 tests/cases/failing/stop-arity-two.pre create mode 100644 tests/cases/failing/stop-arity-zero.pre create mode 100644 tests/cases/failing/stop-type-bool.pre create mode 100644 tests/cases/failing/stop-type-flt.pre create mode 100644 tests/cases/failing/stop-type-func.pre create mode 100644 tests/cases/failing/stop-type-int.pre create mode 100644 tests/cases/failing/stop-type-map.pre create mode 100644 tests/cases/failing/stop-type-str.pre create mode 100644 tests/cases/failing/stop-type-tns.pre create mode 100644 tests/cases/passing/stop-async-handle.pre create mode 100644 tests/cases/passing/stop-thread-handle.pre diff --git a/tests/cases/failing/stop-arity-two.pre b/tests/cases/failing/stop-arity-two.pre new file mode 100644 index 0000000..d6b1de3 --- /dev/null +++ b/tests/cases/failing/stop-arity-two.pre @@ -0,0 +1,3 @@ +THR(worker){} + +STOP(worker, worker) \ No newline at end of file diff --git a/tests/cases/failing/stop-arity-zero.pre b/tests/cases/failing/stop-arity-zero.pre new file mode 100644 index 0000000..837ec28 --- /dev/null +++ b/tests/cases/failing/stop-arity-zero.pre @@ -0,0 +1 @@ +STOP() \ No newline at end of file diff --git a/tests/cases/failing/stop-type-bool.pre b/tests/cases/failing/stop-type-bool.pre new file mode 100644 index 0000000..0837bc7 --- /dev/null +++ b/tests/cases/failing/stop-type-bool.pre @@ -0,0 +1 @@ +STOP(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/stop-type-flt.pre b/tests/cases/failing/stop-type-flt.pre new file mode 100644 index 0000000..57ce015 --- /dev/null +++ b/tests/cases/failing/stop-type-flt.pre @@ -0,0 +1 @@ +STOP(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/stop-type-func.pre b/tests/cases/failing/stop-type-func.pre new file mode 100644 index 0000000..a946daa --- /dev/null +++ b/tests/cases/failing/stop-type-func.pre @@ -0,0 +1 @@ +STOP(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/stop-type-int.pre b/tests/cases/failing/stop-type-int.pre new file mode 100644 index 0000000..8baf9ba --- /dev/null +++ b/tests/cases/failing/stop-type-int.pre @@ -0,0 +1 @@ +STOP(0d1) \ No newline at end of file diff --git a/tests/cases/failing/stop-type-map.pre b/tests/cases/failing/stop-type-map.pre new file mode 100644 index 0000000..61f07b5 --- /dev/null +++ b/tests/cases/failing/stop-type-map.pre @@ -0,0 +1 @@ +STOP(<>) \ No newline at end of file diff --git a/tests/cases/failing/stop-type-str.pre b/tests/cases/failing/stop-type-str.pre new file mode 100644 index 0000000..0cbc1b1 --- /dev/null +++ b/tests/cases/failing/stop-type-str.pre @@ -0,0 +1 @@ +STOP("thread") \ No newline at end of file diff --git a/tests/cases/failing/stop-type-tns.pre b/tests/cases/failing/stop-type-tns.pre new file mode 100644 index 0000000..2f6d77c --- /dev/null +++ b/tests/cases/failing/stop-type-tns.pre @@ -0,0 +1 @@ +STOP([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/stop-async-handle.pre b/tests/cases/passing/stop-async-handle.pre new file mode 100644 index 0000000..1c423db --- /dev/null +++ b/tests/cases/passing/stop-async-handle.pre @@ -0,0 +1,16 @@ +BOOL: reached_end = FALSE + +THR: worker = ASYNC{ + FOR(i, 0d100000){} + reached_end = TRUE +} + +ASSERT(BOOL(worker)) + +THR: stopped = STOP(worker) + +ASSERT(EQ(TYPE(stopped), "THR")) +ASSERT(EQ(stopped, worker)) +ASSERT(NOT(BOOL(worker))) +ASSERT(NOT(BOOL(stopped))) +ASSERT(EQ(reached_end, FALSE)) \ No newline at end of file diff --git a/tests/cases/passing/stop-thread-handle.pre b/tests/cases/passing/stop-thread-handle.pre new file mode 100644 index 0000000..15c921d --- /dev/null +++ b/tests/cases/passing/stop-thread-handle.pre @@ -0,0 +1,17 @@ +BOOL: reached_end = FALSE + +THR(worker){ + FOR(i, 0d1000000){ + } + reached_end = TRUE +} + +ASSERT(BOOL(worker)) + +THR: stopped = STOP(worker) + +ASSERT(EQ(TYPE(stopped), "THR")) +ASSERT(EQ(stopped, worker)) +ASSERT(NOT(BOOL(worker))) +ASSERT(NOT(BOOL(stopped))) +ASSERT(EQ(reached_end, FALSE)) \ No newline at end of file From 497489f0b79429a9d6fb08b2dc5f65711382cb44 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 11 Apr 2026 22:47:21 -0400 Subject: [PATCH 26/60] Add tests for READFILE. --- tests/cases/failing/readfile-missing-file.pre | 5 +++++ tests/cases/failing/readfile-unsupported-coding.pre | 5 +++++ tests/cases/passing/plain.txt | 1 + tests/cases/passing/readfile-ansi.pre | 5 +++++ tests/cases/passing/readfile-binary-hex.pre | 6 ++++++ tests/cases/passing/readfile-plain.pre | 6 ++++++ 6 files changed, 28 insertions(+) create mode 100644 tests/cases/failing/readfile-missing-file.pre create mode 100644 tests/cases/failing/readfile-unsupported-coding.pre create mode 100644 tests/cases/passing/plain.txt create mode 100644 tests/cases/passing/readfile-ansi.pre create mode 100644 tests/cases/passing/readfile-binary-hex.pre create mode 100644 tests/cases/passing/readfile-plain.pre diff --git a/tests/cases/failing/readfile-missing-file.pre b/tests/cases/failing/readfile-missing-file.pre new file mode 100644 index 0000000..dcb8b4c --- /dev/null +++ b/tests/cases/failing/readfile-missing-file.pre @@ -0,0 +1,5 @@ +IMPORT(path) + +STR: missing = path.TEMPFILE("prefix-readfile-missing.txt") +TRY{ DELETEFILE(missing) } CATCH { } +READFILE(missing) diff --git a/tests/cases/failing/readfile-unsupported-coding.pre b/tests/cases/failing/readfile-unsupported-coding.pre new file mode 100644 index 0000000..c7ed9f5 --- /dev/null +++ b/tests/cases/failing/readfile-unsupported-coding.pre @@ -0,0 +1,5 @@ +IMPORT(path) + +STR: p = JOIN(path.script_dir, "/plain.txt") + +READFILE(p, coding = "UTF-7") diff --git a/tests/cases/passing/plain.txt b/tests/cases/passing/plain.txt new file mode 100644 index 0000000..a4cc882 --- /dev/null +++ b/tests/cases/passing/plain.txt @@ -0,0 +1 @@ +Prefix \ No newline at end of file diff --git a/tests/cases/passing/readfile-ansi.pre b/tests/cases/passing/readfile-ansi.pre new file mode 100644 index 0000000..f584dd3 --- /dev/null +++ b/tests/cases/passing/readfile-ansi.pre @@ -0,0 +1,5 @@ +IMPORT(path) + +STR: p = JOIN(path.script_dir, "/plain.txt") + +ASSERT(EQ(READFILE(p, coding = "ANSI"), "Prefix")) diff --git a/tests/cases/passing/readfile-binary-hex.pre b/tests/cases/passing/readfile-binary-hex.pre new file mode 100644 index 0000000..0378a59 --- /dev/null +++ b/tests/cases/passing/readfile-binary-hex.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: p = JOIN(path.script_dir, "/plain.txt") + +ASSERT(EQ(READFILE(p, coding = "binary"), "010100000111001001100101011001100110100101111000")) +ASSERT(EQ(READFILE(p, coding = "hex"), "507265666978")) diff --git a/tests/cases/passing/readfile-plain.pre b/tests/cases/passing/readfile-plain.pre new file mode 100644 index 0000000..5098b6e --- /dev/null +++ b/tests/cases/passing/readfile-plain.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: p = JOIN(path.script_dir, "/plain.txt") + +ASSERT(EQ(READFILE(p), "Prefix")) +ASSERT(EQ(READFILE(p, coding = "uTf-8"), "Prefix")) From acabdf6408ba71e11f6a3d8edf210df85a430e0a Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 11 Apr 2026 22:54:30 -0400 Subject: [PATCH 27/60] Add tests for WRITEFILE. --- tests/cases/failing/writefile-binary-badchars.pre | 5 +++++ tests/cases/failing/writefile-binary-badlen.pre | 5 +++++ tests/cases/failing/writefile-hex-badlen.pre | 5 +++++ tests/cases/failing/writefile-unsupported-coding.pre | 5 +++++ tests/cases/passing/writefile-ansi.pre | 6 ++++++ tests/cases/passing/writefile-binary.pre | 7 +++++++ tests/cases/passing/writefile-hex.pre | 7 +++++++ tests/cases/passing/writefile-utf8-bom.pre | 7 +++++++ tests/cases/passing/writefile-utf8.pre | 7 +++++++ 9 files changed, 54 insertions(+) create mode 100644 tests/cases/failing/writefile-binary-badchars.pre create mode 100644 tests/cases/failing/writefile-binary-badlen.pre create mode 100644 tests/cases/failing/writefile-hex-badlen.pre create mode 100644 tests/cases/failing/writefile-unsupported-coding.pre create mode 100644 tests/cases/passing/writefile-ansi.pre create mode 100644 tests/cases/passing/writefile-binary.pre create mode 100644 tests/cases/passing/writefile-hex.pre create mode 100644 tests/cases/passing/writefile-utf8-bom.pre create mode 100644 tests/cases/passing/writefile-utf8.pre diff --git a/tests/cases/failing/writefile-binary-badchars.pre b/tests/cases/failing/writefile-binary-badchars.pre new file mode 100644 index 0000000..49e0adf --- /dev/null +++ b/tests/cases/failing/writefile-binary-badchars.pre @@ -0,0 +1,5 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-bad-binary2.txt") + +WRITEFILE("010a0101", p, coding = "binary") diff --git a/tests/cases/failing/writefile-binary-badlen.pre b/tests/cases/failing/writefile-binary-badlen.pre new file mode 100644 index 0000000..52a0e57 --- /dev/null +++ b/tests/cases/failing/writefile-binary-badlen.pre @@ -0,0 +1,5 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-bad-binary.txt") + +WRITEFILE("101", p, coding = "binary") diff --git a/tests/cases/failing/writefile-hex-badlen.pre b/tests/cases/failing/writefile-hex-badlen.pre new file mode 100644 index 0000000..99525ed --- /dev/null +++ b/tests/cases/failing/writefile-hex-badlen.pre @@ -0,0 +1,5 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-bad-hex.txt") + +WRITEFILE("abc", p, coding = "hex") diff --git a/tests/cases/failing/writefile-unsupported-coding.pre b/tests/cases/failing/writefile-unsupported-coding.pre new file mode 100644 index 0000000..d0bb225 --- /dev/null +++ b/tests/cases/failing/writefile-unsupported-coding.pre @@ -0,0 +1,5 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-unsupported.txt") + +WRITEFILE("Prefix", p, coding = "UTF-7") diff --git a/tests/cases/passing/writefile-ansi.pre b/tests/cases/passing/writefile-ansi.pre new file mode 100644 index 0000000..0b605d8 --- /dev/null +++ b/tests/cases/passing/writefile-ansi.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-ansi.txt") + +ASSERT(WRITEFILE("Prefix", p, coding = "ANSI")) +ASSERT(EQ(READFILE(p, coding = "ANSI"), "Prefix")) diff --git a/tests/cases/passing/writefile-binary.pre b/tests/cases/passing/writefile-binary.pre new file mode 100644 index 0000000..c283550 --- /dev/null +++ b/tests/cases/passing/writefile-binary.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-binary.bin") + +ASSERT(WRITEFILE("0100000101111010", p, coding = "binary")) +ASSERT(EQ(READFILE(p, coding = "binary"), "0100000101111010")) +ASSERT(EQ(READFILE(p), "Az")) diff --git a/tests/cases/passing/writefile-hex.pre b/tests/cases/passing/writefile-hex.pre new file mode 100644 index 0000000..093483e --- /dev/null +++ b/tests/cases/passing/writefile-hex.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-hex.bin") + +ASSERT(WRITEFILE("507265666978", p, coding = "hex")) +ASSERT(EQ(READFILE(p), "Prefix")) +ASSERT(EQ(READFILE(p, coding = "hexadecimal"), "507265666978")) diff --git a/tests/cases/passing/writefile-utf8-bom.pre b/tests/cases/passing/writefile-utf8-bom.pre new file mode 100644 index 0000000..75495dc --- /dev/null +++ b/tests/cases/passing/writefile-utf8-bom.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-utf8-bom.txt") + +ASSERT(WRITEFILE("Prefix", p, coding = "UTF-8 BOM")) +ASSERT(EQ(READFILE(p), "Prefix")) +ASSERT(EQ(READFILE(p, coding = "utf-8-bom"), "Prefix")) diff --git a/tests/cases/passing/writefile-utf8.pre b/tests/cases/passing/writefile-utf8.pre new file mode 100644 index 0000000..41d7e68 --- /dev/null +++ b/tests/cases/passing/writefile-utf8.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-utf8.txt") + +ASSERT(WRITEFILE("Prefix", p)) +ASSERT(EQ(READFILE(p), "Prefix")) +ASSERT(EQ(READFILE(p, coding = "UTF-8"), "Prefix")) From 3a0cd763f126244ed7e7630e4b98927e0a0c5f27 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 12 Apr 2026 17:09:51 -0400 Subject: [PATCH 28/60] Fix LCM test file extension. Rename tests/cases/passing/lcm.-fltpre to tests/cases/passing/lcm-flt.pre. --- tests/cases/passing/{lcm.-fltpre => lcm-flt.pre} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/cases/passing/{lcm.-fltpre => lcm-flt.pre} (100%) diff --git a/tests/cases/passing/lcm.-fltpre b/tests/cases/passing/lcm-flt.pre similarity index 100% rename from tests/cases/passing/lcm.-fltpre rename to tests/cases/passing/lcm-flt.pre From 7bd42e9735bdd76c225ad46e043f90985b0933ec Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 12 Apr 2026 17:22:51 -0400 Subject: [PATCH 29/60] Add tests for EXISTFILE.pre --- tests/cases/failing/existfile-arity-two.pre | 3 +++ tests/cases/failing/existfile-arity-zero.pre | 1 + tests/cases/failing/existfile-bool.pre | 1 + tests/cases/failing/existfile-flt.pre | 1 + tests/cases/failing/existfile-func.pre | 1 + tests/cases/failing/existfile-int.pre | 1 + tests/cases/failing/existfile-map.pre | 1 + tests/cases/failing/existfile-thr.pre | 1 + tests/cases/failing/existfile-tns.pre | 1 + tests/cases/passing/existfile.pre | 4 ++++ 10 files changed, 15 insertions(+) create mode 100644 tests/cases/failing/existfile-arity-two.pre create mode 100644 tests/cases/failing/existfile-arity-zero.pre create mode 100644 tests/cases/failing/existfile-bool.pre create mode 100644 tests/cases/failing/existfile-flt.pre create mode 100644 tests/cases/failing/existfile-func.pre create mode 100644 tests/cases/failing/existfile-int.pre create mode 100644 tests/cases/failing/existfile-map.pre create mode 100644 tests/cases/failing/existfile-thr.pre create mode 100644 tests/cases/failing/existfile-tns.pre create mode 100644 tests/cases/passing/existfile.pre diff --git a/tests/cases/failing/existfile-arity-two.pre b/tests/cases/failing/existfile-arity-two.pre new file mode 100644 index 0000000..c0e0ee5 --- /dev/null +++ b/tests/cases/failing/existfile-arity-two.pre @@ -0,0 +1,3 @@ +IMPORT(path) + +EXISTFILE(path.script_dir, "/plain.txt") \ No newline at end of file diff --git a/tests/cases/failing/existfile-arity-zero.pre b/tests/cases/failing/existfile-arity-zero.pre new file mode 100644 index 0000000..91fd391 --- /dev/null +++ b/tests/cases/failing/existfile-arity-zero.pre @@ -0,0 +1 @@ +EXISTFILE() \ No newline at end of file diff --git a/tests/cases/failing/existfile-bool.pre b/tests/cases/failing/existfile-bool.pre new file mode 100644 index 0000000..49b6381 --- /dev/null +++ b/tests/cases/failing/existfile-bool.pre @@ -0,0 +1 @@ +EXISTFILE(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/existfile-flt.pre b/tests/cases/failing/existfile-flt.pre new file mode 100644 index 0000000..5211137 --- /dev/null +++ b/tests/cases/failing/existfile-flt.pre @@ -0,0 +1 @@ +EXISTFILE(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/existfile-func.pre b/tests/cases/failing/existfile-func.pre new file mode 100644 index 0000000..5e5b628 --- /dev/null +++ b/tests/cases/failing/existfile-func.pre @@ -0,0 +1 @@ +EXISTFILE(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/existfile-int.pre b/tests/cases/failing/existfile-int.pre new file mode 100644 index 0000000..0b68789 --- /dev/null +++ b/tests/cases/failing/existfile-int.pre @@ -0,0 +1 @@ +EXISTFILE(0d1) \ No newline at end of file diff --git a/tests/cases/failing/existfile-map.pre b/tests/cases/failing/existfile-map.pre new file mode 100644 index 0000000..57b01c0 --- /dev/null +++ b/tests/cases/failing/existfile-map.pre @@ -0,0 +1 @@ +EXISTFILE(<>) \ No newline at end of file diff --git a/tests/cases/failing/existfile-thr.pre b/tests/cases/failing/existfile-thr.pre new file mode 100644 index 0000000..79df3f3 --- /dev/null +++ b/tests/cases/failing/existfile-thr.pre @@ -0,0 +1 @@ +EXISTFILE(ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/existfile-tns.pre b/tests/cases/failing/existfile-tns.pre new file mode 100644 index 0000000..bfde154 --- /dev/null +++ b/tests/cases/failing/existfile-tns.pre @@ -0,0 +1 @@ +EXISTFILE([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/existfile.pre b/tests/cases/passing/existfile.pre new file mode 100644 index 0000000..a1692a3 --- /dev/null +++ b/tests/cases/passing/existfile.pre @@ -0,0 +1,4 @@ +IMPORT(path) + +ASSERT(EXISTFILE(JOIN(path.script_dir, "/plain.txt"))) +ASSERT(NOT(EXISTFILE(JOIN(path.script_dir, "/nonexistent.txt")))) \ No newline at end of file From 3b937f2419a624965c976e4a89e4a706d4f5e834 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 12 Apr 2026 17:39:23 -0400 Subject: [PATCH 30/60] Add tests for DELETEFILE. --- tests/cases/failing/deletefile-arity-two.pre | 6 ++++++ tests/cases/failing/deletefile-arity-zero.pre | 1 + tests/cases/failing/deletefile-bool.pre | 1 + tests/cases/failing/deletefile-flt.pre | 1 + tests/cases/failing/deletefile-func.pre | 1 + tests/cases/failing/deletefile-int.pre | 1 + tests/cases/failing/deletefile-map.pre | 1 + tests/cases/failing/deletefile-nonexistent.pre | 3 +++ tests/cases/failing/deletefile-thr.pre | 1 + tests/cases/failing/deletefile-tns.pre | 1 + tests/cases/passing/deletefile.pre | 7 +++++++ 11 files changed, 24 insertions(+) create mode 100644 tests/cases/failing/deletefile-arity-two.pre create mode 100644 tests/cases/failing/deletefile-arity-zero.pre create mode 100644 tests/cases/failing/deletefile-bool.pre create mode 100644 tests/cases/failing/deletefile-flt.pre create mode 100644 tests/cases/failing/deletefile-func.pre create mode 100644 tests/cases/failing/deletefile-int.pre create mode 100644 tests/cases/failing/deletefile-map.pre create mode 100644 tests/cases/failing/deletefile-nonexistent.pre create mode 100644 tests/cases/failing/deletefile-thr.pre create mode 100644 tests/cases/failing/deletefile-tns.pre create mode 100644 tests/cases/passing/deletefile.pre diff --git a/tests/cases/failing/deletefile-arity-two.pre b/tests/cases/failing/deletefile-arity-two.pre new file mode 100644 index 0000000..e55f467 --- /dev/null +++ b/tests/cases/failing/deletefile-arity-two.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("temp.txt") +WRITEFILE("Prefix", p) +ASSERT(EXISTFILE(p)) +ASSERT(DELETEFILE(p, "Prefix")) \ No newline at end of file diff --git a/tests/cases/failing/deletefile-arity-zero.pre b/tests/cases/failing/deletefile-arity-zero.pre new file mode 100644 index 0000000..36bd105 --- /dev/null +++ b/tests/cases/failing/deletefile-arity-zero.pre @@ -0,0 +1 @@ +DELETEFILE() \ No newline at end of file diff --git a/tests/cases/failing/deletefile-bool.pre b/tests/cases/failing/deletefile-bool.pre new file mode 100644 index 0000000..cab3da2 --- /dev/null +++ b/tests/cases/failing/deletefile-bool.pre @@ -0,0 +1 @@ +DELETEFILE(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/deletefile-flt.pre b/tests/cases/failing/deletefile-flt.pre new file mode 100644 index 0000000..19d9dce --- /dev/null +++ b/tests/cases/failing/deletefile-flt.pre @@ -0,0 +1 @@ +DELETEFILE(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/deletefile-func.pre b/tests/cases/failing/deletefile-func.pre new file mode 100644 index 0000000..159bc3e --- /dev/null +++ b/tests/cases/failing/deletefile-func.pre @@ -0,0 +1 @@ +DELETEFILE(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/deletefile-int.pre b/tests/cases/failing/deletefile-int.pre new file mode 100644 index 0000000..3e72100 --- /dev/null +++ b/tests/cases/failing/deletefile-int.pre @@ -0,0 +1 @@ +DELETEFILE(0d1) \ No newline at end of file diff --git a/tests/cases/failing/deletefile-map.pre b/tests/cases/failing/deletefile-map.pre new file mode 100644 index 0000000..d5e9bb7 --- /dev/null +++ b/tests/cases/failing/deletefile-map.pre @@ -0,0 +1 @@ +DELETEFILE(<>) \ No newline at end of file diff --git a/tests/cases/failing/deletefile-nonexistent.pre b/tests/cases/failing/deletefile-nonexistent.pre new file mode 100644 index 0000000..eb5b613 --- /dev/null +++ b/tests/cases/failing/deletefile-nonexistent.pre @@ -0,0 +1,3 @@ +IMPORT(path) + +DELETEFILE(JOIN(path.script_dir, "/nonexistent.txt")) \ No newline at end of file diff --git a/tests/cases/failing/deletefile-thr.pre b/tests/cases/failing/deletefile-thr.pre new file mode 100644 index 0000000..5d70374 --- /dev/null +++ b/tests/cases/failing/deletefile-thr.pre @@ -0,0 +1 @@ +DELETEFILE(ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/deletefile-tns.pre b/tests/cases/failing/deletefile-tns.pre new file mode 100644 index 0000000..1c47729 --- /dev/null +++ b/tests/cases/failing/deletefile-tns.pre @@ -0,0 +1 @@ +DELETEFILE([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/deletefile.pre b/tests/cases/passing/deletefile.pre new file mode 100644 index 0000000..0ed5443 --- /dev/null +++ b/tests/cases/passing/deletefile.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("temp.txt") +WRITEFILE("Prefix", p) +ASSERT(EXISTFILE(p)) +ASSERT(DELETEFILE(p)) +ASSERT(NOT(EXISTFILE(p))) \ No newline at end of file From bf13748f3005afe9629c2b8aa13acacab3359d13 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 12 Apr 2026 17:51:10 -0400 Subject: [PATCH 31/60] Add tests for OS. --- tests/cases/failing/os-arity-one.pre | 1 + tests/cases/passing/os-lowercase.pre | 1 + tests/cases/passing/os-nonempty.pre | 1 + tests/cases/passing/os-return-type.pre | 1 + tests/cases/passing/os.pre | 1 + 5 files changed, 5 insertions(+) create mode 100644 tests/cases/failing/os-arity-one.pre create mode 100644 tests/cases/passing/os-lowercase.pre create mode 100644 tests/cases/passing/os-nonempty.pre create mode 100644 tests/cases/passing/os-return-type.pre create mode 100644 tests/cases/passing/os.pre diff --git a/tests/cases/failing/os-arity-one.pre b/tests/cases/failing/os-arity-one.pre new file mode 100644 index 0000000..a3813a9 --- /dev/null +++ b/tests/cases/failing/os-arity-one.pre @@ -0,0 +1 @@ +OS("win") \ No newline at end of file diff --git a/tests/cases/passing/os-lowercase.pre b/tests/cases/passing/os-lowercase.pre new file mode 100644 index 0000000..eb646cf --- /dev/null +++ b/tests/cases/passing/os-lowercase.pre @@ -0,0 +1 @@ +ASSERT(EQ(OS(), LOWER(OS()))) \ No newline at end of file diff --git a/tests/cases/passing/os-nonempty.pre b/tests/cases/passing/os-nonempty.pre new file mode 100644 index 0000000..6228051 --- /dev/null +++ b/tests/cases/passing/os-nonempty.pre @@ -0,0 +1 @@ +ASSERT(GT(SLEN(OS()), 0d0)) \ No newline at end of file diff --git a/tests/cases/passing/os-return-type.pre b/tests/cases/passing/os-return-type.pre new file mode 100644 index 0000000..1ac272a --- /dev/null +++ b/tests/cases/passing/os-return-type.pre @@ -0,0 +1 @@ +ASSERT(EQ(TYPE(OS()), "STR")) \ No newline at end of file diff --git a/tests/cases/passing/os.pre b/tests/cases/passing/os.pre new file mode 100644 index 0000000..216e334 --- /dev/null +++ b/tests/cases/passing/os.pre @@ -0,0 +1 @@ +ASSERT(IN(OS(), ["win", "linux", "macos", "unix"])) \ No newline at end of file From fe67584eccf264c1b46be1669d53b30a4fa00f7b Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 12 Apr 2026 18:06:39 -0400 Subject: [PATCH 32/60] Add tests for ARGV. --- tests/cases/failing/argv-arity-one.pre | 1 + tests/cases/passing/argv-elements-str.pre | 5 +++++ tests/cases/passing/argv-order-program-arg-last.pre | 4 ++++ tests/cases/passing/argv-rank-1.pre | 2 ++ tests/cases/passing/argv-return-type.pre | 1 + 5 files changed, 13 insertions(+) create mode 100644 tests/cases/failing/argv-arity-one.pre create mode 100644 tests/cases/passing/argv-elements-str.pre create mode 100644 tests/cases/passing/argv-order-program-arg-last.pre create mode 100644 tests/cases/passing/argv-rank-1.pre create mode 100644 tests/cases/passing/argv-return-type.pre diff --git a/tests/cases/failing/argv-arity-one.pre b/tests/cases/failing/argv-arity-one.pre new file mode 100644 index 0000000..91918bc --- /dev/null +++ b/tests/cases/failing/argv-arity-one.pre @@ -0,0 +1 @@ +ARGV("extra") \ No newline at end of file diff --git a/tests/cases/passing/argv-elements-str.pre b/tests/cases/passing/argv-elements-str.pre new file mode 100644 index 0000000..86aaea3 --- /dev/null +++ b/tests/cases/passing/argv-elements-str.pre @@ -0,0 +1,5 @@ +TNS: args = ARGV() + +FOR(i, TLEN(args, 0d1)){ + ASSERT(ISSTR(args[i])) +} \ No newline at end of file diff --git a/tests/cases/passing/argv-order-program-arg-last.pre b/tests/cases/passing/argv-order-program-arg-last.pre new file mode 100644 index 0000000..f157dcf --- /dev/null +++ b/tests/cases/passing/argv-order-program-arg-last.pre @@ -0,0 +1,4 @@ +! ARGV_LAST_ARG_SELF_FILE_MARKER +STR: source = REPLACE(READFILE(ARGV()[-0d1]), "\r", "") + +ASSERT(IN("! ARGV_LAST_ARG_SELF_FILE_MARKER", SPLIT(source, "\n"))) \ No newline at end of file diff --git a/tests/cases/passing/argv-rank-1.pre b/tests/cases/passing/argv-rank-1.pre new file mode 100644 index 0000000..f532bb7 --- /dev/null +++ b/tests/cases/passing/argv-rank-1.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(TYPE(SHAPE(ARGV())), "TNS")) +ASSERT(EQ(TLEN(SHAPE(ARGV()), 0d1), 0d1)) \ No newline at end of file diff --git a/tests/cases/passing/argv-return-type.pre b/tests/cases/passing/argv-return-type.pre new file mode 100644 index 0000000..bc43235 --- /dev/null +++ b/tests/cases/passing/argv-return-type.pre @@ -0,0 +1 @@ +ASSERT(EQ(TYPE(ARGV()), "TNS")) \ No newline at end of file From 7f857dbfb55b41b646b06dd01adfee18f9542ab1 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 13 Apr 2026 12:11:14 -0400 Subject: [PATCH 33/60] Add tests for PRINT. --- tests/cases/failing/print-arity-zero.pre | 1 + tests/cases/failing/print-first-func.pre | 1 + tests/cases/failing/print-first-map.pre | 1 + tests/cases/failing/print-first-thr.pre | 1 + tests/cases/failing/print-first-tns.pre | 1 + tests/cases/passing/print-coerce-scalars.pre | 3 ++ .../passing/print-output-concat-newline.ps1 | 48 +++++++++++++++++++ tests/cases/passing/print-return-type.pre | 1 + 8 files changed, 57 insertions(+) create mode 100644 tests/cases/failing/print-arity-zero.pre create mode 100644 tests/cases/failing/print-first-func.pre create mode 100644 tests/cases/failing/print-first-map.pre create mode 100644 tests/cases/failing/print-first-thr.pre create mode 100644 tests/cases/failing/print-first-tns.pre create mode 100644 tests/cases/passing/print-coerce-scalars.pre create mode 100644 tests/cases/passing/print-output-concat-newline.ps1 create mode 100644 tests/cases/passing/print-return-type.pre diff --git a/tests/cases/failing/print-arity-zero.pre b/tests/cases/failing/print-arity-zero.pre new file mode 100644 index 0000000..b87259b --- /dev/null +++ b/tests/cases/failing/print-arity-zero.pre @@ -0,0 +1 @@ +PRINT() \ No newline at end of file diff --git a/tests/cases/failing/print-first-func.pre b/tests/cases/failing/print-first-func.pre new file mode 100644 index 0000000..9d297bd --- /dev/null +++ b/tests/cases/failing/print-first-func.pre @@ -0,0 +1 @@ +PRINT(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/print-first-map.pre b/tests/cases/failing/print-first-map.pre new file mode 100644 index 0000000..d92d2d4 --- /dev/null +++ b/tests/cases/failing/print-first-map.pre @@ -0,0 +1 @@ +PRINT(<"key" = 0d1>) \ No newline at end of file diff --git a/tests/cases/failing/print-first-thr.pre b/tests/cases/failing/print-first-thr.pre new file mode 100644 index 0000000..47b771d --- /dev/null +++ b/tests/cases/failing/print-first-thr.pre @@ -0,0 +1 @@ +PRINT(ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/print-first-tns.pre b/tests/cases/failing/print-first-tns.pre new file mode 100644 index 0000000..d5dc5a7 --- /dev/null +++ b/tests/cases/failing/print-first-tns.pre @@ -0,0 +1 @@ +PRINT([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/print-coerce-scalars.pre b/tests/cases/passing/print-coerce-scalars.pre new file mode 100644 index 0000000..24ce22e --- /dev/null +++ b/tests/cases/passing/print-coerce-scalars.pre @@ -0,0 +1,3 @@ +ASSERT(NOT(PRINT(TRUE))) +ASSERT(NOT(PRINT(0d42))) +ASSERT(NOT(PRINT(0d1.5))) \ No newline at end of file diff --git a/tests/cases/passing/print-output-concat-newline.ps1 b/tests/cases/passing/print-output-concat-newline.ps1 new file mode 100644 index 0000000..aee60b2 --- /dev/null +++ b/tests/cases/passing/print-output-concat-newline.ps1 @@ -0,0 +1,48 @@ +$prefixDir = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) +$exePath = Join-Path $prefixDir 'prefix.exe' + +if (-not (Test-Path $exePath)) { + throw "Interpreter executable not found at: $exePath" +} + +$tempDir = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) +New-Item -ItemType Directory -Path $tempDir | Out-Null + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +PRINT("left=", TRUE, ",right=", 0d42, ",flt=", INF) +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = $exePath + $startInfo.Arguments = ('"{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + $exitCode = $process.ExitCode + $process.Dispose() + + if ($exitCode -ne 0) { + throw "Prefix exited with code $exitCode`nSTDOUT:`n$stdout`nSTDERR:`n$stderr" + } + + if ($stderr.Length -ne 0) { + throw "Expected no stderr output, got:`n$stderr" + } + + if (-not [regex]::IsMatch($stdout, '\Aleft=TRUE,right=0d42,flt=INF(?:\r\n|\n)\z')) { + $escapedStdout = $stdout.Replace("`r", '\r').Replace("`n", '\n') + throw "Unexpected stdout: $escapedStdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/print-return-type.pre b/tests/cases/passing/print-return-type.pre new file mode 100644 index 0000000..b965161 --- /dev/null +++ b/tests/cases/passing/print-return-type.pre @@ -0,0 +1 @@ +ASSERT(EQ(PRINT("value"), FALSE)) \ No newline at end of file From 1556b963e28ce1270d3aff74f9789f05c2894c9e Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 13 Apr 2026 12:26:09 -0400 Subject: [PATCH 34/60] Add tests for INPUT. --- tests/cases/failing/input-arity-two.pre | 1 + tests/cases/failing/input-type-bool.pre | 1 + tests/cases/failing/input-type-flt.pre | 1 + tests/cases/failing/input-type-func.pre | 1 + tests/cases/failing/input-type-int.pre | 1 + tests/cases/failing/input-type-map.pre | 1 + tests/cases/failing/input-type-thr.pre | 1 + tests/cases/failing/input-type-tns.pre | 1 + tests/cases/passing/input-empty-line.ps1 | 27 ++++++ tests/cases/passing/input-prompt-output.ps1 | 27 ++++++ tests/cases/passing/input-return-type.ps1 | 27 ++++++ .../cases/passing/input-sequential-lines.ps1 | 26 ++++++ tests/helpers/prefix-input.ps1 | 87 +++++++++++++++++++ 13 files changed, 202 insertions(+) create mode 100644 tests/cases/failing/input-arity-two.pre create mode 100644 tests/cases/failing/input-type-bool.pre create mode 100644 tests/cases/failing/input-type-flt.pre create mode 100644 tests/cases/failing/input-type-func.pre create mode 100644 tests/cases/failing/input-type-int.pre create mode 100644 tests/cases/failing/input-type-map.pre create mode 100644 tests/cases/failing/input-type-thr.pre create mode 100644 tests/cases/failing/input-type-tns.pre create mode 100644 tests/cases/passing/input-empty-line.ps1 create mode 100644 tests/cases/passing/input-prompt-output.ps1 create mode 100644 tests/cases/passing/input-return-type.ps1 create mode 100644 tests/cases/passing/input-sequential-lines.ps1 create mode 100644 tests/helpers/prefix-input.ps1 diff --git a/tests/cases/failing/input-arity-two.pre b/tests/cases/failing/input-arity-two.pre new file mode 100644 index 0000000..bc6b6eb --- /dev/null +++ b/tests/cases/failing/input-arity-two.pre @@ -0,0 +1 @@ +INPUT("left", "right") diff --git a/tests/cases/failing/input-type-bool.pre b/tests/cases/failing/input-type-bool.pre new file mode 100644 index 0000000..ff4aba2 --- /dev/null +++ b/tests/cases/failing/input-type-bool.pre @@ -0,0 +1 @@ +INPUT(TRUE) diff --git a/tests/cases/failing/input-type-flt.pre b/tests/cases/failing/input-type-flt.pre new file mode 100644 index 0000000..3654e51 --- /dev/null +++ b/tests/cases/failing/input-type-flt.pre @@ -0,0 +1 @@ +INPUT(0d1.0) diff --git a/tests/cases/failing/input-type-func.pre b/tests/cases/failing/input-type-func.pre new file mode 100644 index 0000000..20d4661 --- /dev/null +++ b/tests/cases/failing/input-type-func.pre @@ -0,0 +1 @@ +INPUT(LAMBDA BOOL: (){}) diff --git a/tests/cases/failing/input-type-int.pre b/tests/cases/failing/input-type-int.pre new file mode 100644 index 0000000..574fa8b --- /dev/null +++ b/tests/cases/failing/input-type-int.pre @@ -0,0 +1 @@ +INPUT(0d1) diff --git a/tests/cases/failing/input-type-map.pre b/tests/cases/failing/input-type-map.pre new file mode 100644 index 0000000..d4c7c36 --- /dev/null +++ b/tests/cases/failing/input-type-map.pre @@ -0,0 +1 @@ +INPUT(<>) diff --git a/tests/cases/failing/input-type-thr.pre b/tests/cases/failing/input-type-thr.pre new file mode 100644 index 0000000..cd0847d --- /dev/null +++ b/tests/cases/failing/input-type-thr.pre @@ -0,0 +1 @@ +INPUT(ASYNC{}) diff --git a/tests/cases/failing/input-type-tns.pre b/tests/cases/failing/input-type-tns.pre new file mode 100644 index 0000000..da03075 --- /dev/null +++ b/tests/cases/failing/input-type-tns.pre @@ -0,0 +1 @@ +INPUT([0d1]) diff --git a/tests/cases/passing/input-empty-line.ps1 b/tests/cases/passing/input-empty-line.ps1 new file mode 100644 index 0000000..b09cf91 --- /dev/null +++ b/tests/cases/passing/input-empty-line.ps1 @@ -0,0 +1,27 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +STR: line = INPUT() +ASSERT(ISSTR(line)) +ASSERT(EQ(line, "")) +'@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText "`r`ntrailing`r`n" + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if ($result.Stdout.Length -ne 0) { + $stdout = Format-VisibleText $result.Stdout + throw "Expected no stdout output, got: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/input-prompt-output.ps1 b/tests/cases/passing/input-prompt-output.ps1 new file mode 100644 index 0000000..732f397 --- /dev/null +++ b/tests/cases/passing/input-prompt-output.ps1 @@ -0,0 +1,27 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +STR: line = INPUT("PROMPT>") +ASSERT(EQ(line, "alpha")) +PRINT("DONE=", line) +'@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText "alpha`r`n" + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not [regex]::IsMatch($result.Stdout, '\APROMPT>DONE=alpha(?:\r\n|\n)\z')) { + $stdout = Format-VisibleText $result.Stdout + throw "Unexpected stdout: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/input-return-type.ps1 b/tests/cases/passing/input-return-type.ps1 new file mode 100644 index 0000000..5a1f3a1 --- /dev/null +++ b/tests/cases/passing/input-return-type.ps1 @@ -0,0 +1,27 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +STR: line = INPUT() +ASSERT(ISSTR(line)) +ASSERT(EQ(line, "Alpha beta 42")) +'@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText "Alpha beta 42`r`nignored`r`n" + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if ($result.Stdout.Length -ne 0) { + $stdout = Format-VisibleText $result.Stdout + throw "Expected no stdout output, got: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/input-sequential-lines.ps1 b/tests/cases/passing/input-sequential-lines.ps1 new file mode 100644 index 0000000..f7d0aec --- /dev/null +++ b/tests/cases/passing/input-sequential-lines.ps1 @@ -0,0 +1,26 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +ASSERT(EQ(INPUT(), "alpha")) +ASSERT(EQ(INPUT(), "beta")) +'@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText "alpha`r`nbeta`r`ngamma`r`n" + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if ($result.Stdout.Length -ne 0) { + $stdout = Format-VisibleText $result.Stdout + throw "Expected no stdout output, got: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/helpers/prefix-input.ps1 b/tests/helpers/prefix-input.ps1 new file mode 100644 index 0000000..8aabb50 --- /dev/null +++ b/tests/helpers/prefix-input.ps1 @@ -0,0 +1,87 @@ +function Get-PrefixExePath { + $testsDir = Split-Path -Parent $PSScriptRoot + $prefixDir = Split-Path -Parent $testsDir + $exePath = Join-Path $prefixDir 'prefix.exe' + + if (-not (Test-Path $exePath)) { + throw "Interpreter executable not found at: $exePath" + } + + return $exePath +} + +function New-PrefixTempDir { + $tempDir = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) + New-Item -ItemType Directory -Path $tempDir | Out-Null + return $tempDir +} + +function Start-PrefixProcess { + param( + [Parameter(Mandatory = $true)] + [string]$ProgramPath + ) + + if (-not (Test-Path $ProgramPath)) { + throw "Program not found at: $ProgramPath" + } + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('"{0}"' -f $ProgramPath) + $startInfo.RedirectStandardInput = $true + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + return [System.Diagnostics.Process]::Start($startInfo) +} + +function Invoke-PrefixProgramWithInput { + param( + [Parameter(Mandatory = $true)] + [string]$ProgramPath, + + [Parameter(Mandatory = $true)] + [string]$InputText + ) + + $process = Start-PrefixProcess -ProgramPath $ProgramPath + try { + $process.StandardInput.Write($InputText) + $process.StandardInput.Close() + + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + return [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } +} + +function Format-VisibleText([string]$Text) { + return $Text.Replace("`r", '\r').Replace("`n", '\n') +} + +function Assert-PrefixSuccess($Result) { + if ($Result.ExitCode -ne 0) { + $stdout = Format-VisibleText $Result.Stdout + $stderr = Format-VisibleText $Result.Stderr + throw "Prefix exited with code $($Result.ExitCode)`nSTDOUT: $stdout`nSTDERR: $stderr" + } +} + +function Assert-NoErrorOutput($Result) { + if ($Result.Stderr.Length -ne 0) { + $stderr = Format-VisibleText $Result.Stderr + throw "Expected no stderr output, got: $stderr" + } +} From 464c57388014840f45a85486da80fe05f7b8284a Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 13 Apr 2026 15:36:40 -0400 Subject: [PATCH 35/60] Add tests for WARN. --- tests/cases/failing/warn-arity-zero.pre | 1 + tests/cases/failing/warn-first-func.pre | 1 + tests/cases/failing/warn-first-map.pre | 1 + tests/cases/failing/warn-first-thr.pre | 1 + tests/cases/failing/warn-first-tns.pre | 1 + tests/cases/failing/warn-second-map.pre | 1 + tests/cases/passing/warn-coerce-scalars.pre | 4 ++ .../passing/warn-nonverbose-no-output.ps1 | 47 +++++++++++++++++++ .../passing/warn-verbose-output-prefix.ps1 | 47 +++++++++++++++++++ 9 files changed, 104 insertions(+) create mode 100644 tests/cases/failing/warn-arity-zero.pre create mode 100644 tests/cases/failing/warn-first-func.pre create mode 100644 tests/cases/failing/warn-first-map.pre create mode 100644 tests/cases/failing/warn-first-thr.pre create mode 100644 tests/cases/failing/warn-first-tns.pre create mode 100644 tests/cases/failing/warn-second-map.pre create mode 100644 tests/cases/passing/warn-coerce-scalars.pre create mode 100644 tests/cases/passing/warn-nonverbose-no-output.ps1 create mode 100644 tests/cases/passing/warn-verbose-output-prefix.ps1 diff --git a/tests/cases/failing/warn-arity-zero.pre b/tests/cases/failing/warn-arity-zero.pre new file mode 100644 index 0000000..e55c804 --- /dev/null +++ b/tests/cases/failing/warn-arity-zero.pre @@ -0,0 +1 @@ +WARN() \ No newline at end of file diff --git a/tests/cases/failing/warn-first-func.pre b/tests/cases/failing/warn-first-func.pre new file mode 100644 index 0000000..be2d7cc --- /dev/null +++ b/tests/cases/failing/warn-first-func.pre @@ -0,0 +1 @@ +WARN(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/warn-first-map.pre b/tests/cases/failing/warn-first-map.pre new file mode 100644 index 0000000..9771332 --- /dev/null +++ b/tests/cases/failing/warn-first-map.pre @@ -0,0 +1 @@ +WARN(<"key" = 0d1>) \ No newline at end of file diff --git a/tests/cases/failing/warn-first-thr.pre b/tests/cases/failing/warn-first-thr.pre new file mode 100644 index 0000000..a7c8aa5 --- /dev/null +++ b/tests/cases/failing/warn-first-thr.pre @@ -0,0 +1 @@ +WARN(ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/warn-first-tns.pre b/tests/cases/failing/warn-first-tns.pre new file mode 100644 index 0000000..c609496 --- /dev/null +++ b/tests/cases/failing/warn-first-tns.pre @@ -0,0 +1 @@ +WARN([0d1]) \ No newline at end of file diff --git a/tests/cases/failing/warn-second-map.pre b/tests/cases/failing/warn-second-map.pre new file mode 100644 index 0000000..c206afc --- /dev/null +++ b/tests/cases/failing/warn-second-map.pre @@ -0,0 +1 @@ +WARN("ok", <"key" = 0d1>) \ No newline at end of file diff --git a/tests/cases/passing/warn-coerce-scalars.pre b/tests/cases/passing/warn-coerce-scalars.pre new file mode 100644 index 0000000..d1066ed --- /dev/null +++ b/tests/cases/passing/warn-coerce-scalars.pre @@ -0,0 +1,4 @@ +ASSERT(EQ(WARN(TRUE), FALSE)) +ASSERT(EQ(WARN(0d42), FALSE)) +ASSERT(EQ(WARN(0d1.5), FALSE)) +ASSERT(EQ(WARN("value"), FALSE)) \ No newline at end of file diff --git a/tests/cases/passing/warn-nonverbose-no-output.ps1 b/tests/cases/passing/warn-nonverbose-no-output.ps1 new file mode 100644 index 0000000..139e76a --- /dev/null +++ b/tests/cases/passing/warn-nonverbose-no-output.ps1 @@ -0,0 +1,47 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +ASSERT(EQ(WARN("bool=", TRUE, ",int=", 0d42, ",flt=", INF, ",str=", "ok"), FALSE)) +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('"{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if ($result.Stdout.Length -ne 0) { + $stdout = Format-VisibleText $result.Stdout + throw "Expected no stdout output, got: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/warn-verbose-output-prefix.ps1 b/tests/cases/passing/warn-verbose-output-prefix.ps1 new file mode 100644 index 0000000..8b1d6f6 --- /dev/null +++ b/tests/cases/passing/warn-verbose-output-prefix.ps1 @@ -0,0 +1,47 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +ASSERT(EQ(WARN("bool=", TRUE, ",int=", 0d42, ",flt=", INF, ",str=", "ok"), TRUE)) +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('-verbose "{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not [regex]::IsMatch($result.Stdout, '\AWARNING: bool=TRUE,int=0d42,flt=INF,str=ok(?:\r\n|\n)\z')) { + $stdout = Format-VisibleText $result.Stdout + throw "Unexpected stdout: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file From 1dacbe2255e6181c007def5695ce3e77332878c8 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 13 Apr 2026 15:46:36 -0400 Subject: [PATCH 36/60] Add tests for CL. --- tests/cases/failing/cl-arity-two.pre | 1 + tests/cases/failing/cl-arity-zero.pre | 1 + tests/cases/failing/cl-type-bool.pre | 1 + tests/cases/failing/cl-type-flt.pre | 1 + tests/cases/failing/cl-type-func.pre | 1 + tests/cases/failing/cl-type-int.pre | 1 + tests/cases/failing/cl-type-map.pre | 1 + tests/cases/failing/cl-type-thr.pre | 1 + tests/cases/failing/cl-type-tns.pre | 1 + tests/cases/passing/cl-exit-nonzero.pre | 1 + tests/cases/passing/cl-exit-zero.pre | 1 + tests/cases/passing/cl-output-forwarding.ps1 | 47 ++++++++++++++++++++ 12 files changed, 58 insertions(+) create mode 100644 tests/cases/failing/cl-arity-two.pre create mode 100644 tests/cases/failing/cl-arity-zero.pre create mode 100644 tests/cases/failing/cl-type-bool.pre create mode 100644 tests/cases/failing/cl-type-flt.pre create mode 100644 tests/cases/failing/cl-type-func.pre create mode 100644 tests/cases/failing/cl-type-int.pre create mode 100644 tests/cases/failing/cl-type-map.pre create mode 100644 tests/cases/failing/cl-type-thr.pre create mode 100644 tests/cases/failing/cl-type-tns.pre create mode 100644 tests/cases/passing/cl-exit-nonzero.pre create mode 100644 tests/cases/passing/cl-exit-zero.pre create mode 100644 tests/cases/passing/cl-output-forwarding.ps1 diff --git a/tests/cases/failing/cl-arity-two.pre b/tests/cases/failing/cl-arity-two.pre new file mode 100644 index 0000000..7494499 --- /dev/null +++ b/tests/cases/failing/cl-arity-two.pre @@ -0,0 +1 @@ +CL("exit 0", "extra") \ No newline at end of file diff --git a/tests/cases/failing/cl-arity-zero.pre b/tests/cases/failing/cl-arity-zero.pre new file mode 100644 index 0000000..25b324e --- /dev/null +++ b/tests/cases/failing/cl-arity-zero.pre @@ -0,0 +1 @@ +CL() \ No newline at end of file diff --git a/tests/cases/failing/cl-type-bool.pre b/tests/cases/failing/cl-type-bool.pre new file mode 100644 index 0000000..31293f0 --- /dev/null +++ b/tests/cases/failing/cl-type-bool.pre @@ -0,0 +1 @@ +CL(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/cl-type-flt.pre b/tests/cases/failing/cl-type-flt.pre new file mode 100644 index 0000000..6f74250 --- /dev/null +++ b/tests/cases/failing/cl-type-flt.pre @@ -0,0 +1 @@ +CL(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/cl-type-func.pre b/tests/cases/failing/cl-type-func.pre new file mode 100644 index 0000000..48f2aa7 --- /dev/null +++ b/tests/cases/failing/cl-type-func.pre @@ -0,0 +1 @@ +CL(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/cl-type-int.pre b/tests/cases/failing/cl-type-int.pre new file mode 100644 index 0000000..05cb655 --- /dev/null +++ b/tests/cases/failing/cl-type-int.pre @@ -0,0 +1 @@ +CL(0d1) \ No newline at end of file diff --git a/tests/cases/failing/cl-type-map.pre b/tests/cases/failing/cl-type-map.pre new file mode 100644 index 0000000..d944885 --- /dev/null +++ b/tests/cases/failing/cl-type-map.pre @@ -0,0 +1 @@ +CL(<>) \ No newline at end of file diff --git a/tests/cases/failing/cl-type-thr.pre b/tests/cases/failing/cl-type-thr.pre new file mode 100644 index 0000000..3ff1723 --- /dev/null +++ b/tests/cases/failing/cl-type-thr.pre @@ -0,0 +1 @@ +CL(ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/cl-type-tns.pre b/tests/cases/failing/cl-type-tns.pre new file mode 100644 index 0000000..dab96a9 --- /dev/null +++ b/tests/cases/failing/cl-type-tns.pre @@ -0,0 +1 @@ +CL([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/cl-exit-nonzero.pre b/tests/cases/passing/cl-exit-nonzero.pre new file mode 100644 index 0000000..4111892 --- /dev/null +++ b/tests/cases/passing/cl-exit-nonzero.pre @@ -0,0 +1 @@ +ASSERT(EQ(CL("exit 7"), 0d7)) \ No newline at end of file diff --git a/tests/cases/passing/cl-exit-zero.pre b/tests/cases/passing/cl-exit-zero.pre new file mode 100644 index 0000000..e500fa2 --- /dev/null +++ b/tests/cases/passing/cl-exit-zero.pre @@ -0,0 +1 @@ +ASSERT(EQ(CL("exit 0"), 0d0)) \ No newline at end of file diff --git a/tests/cases/passing/cl-output-forwarding.ps1 b/tests/cases/passing/cl-output-forwarding.ps1 new file mode 100644 index 0000000..32a7c68 --- /dev/null +++ b/tests/cases/passing/cl-output-forwarding.ps1 @@ -0,0 +1,47 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +ASSERT(EQ(CL("echo prefix-cl-output"), 0d0)) +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('"{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not [regex]::IsMatch($result.Stdout, '\Aprefix-cl-output(?:\r\n|\n)\z')) { + $stdout = Format-VisibleText $result.Stdout + throw "Unexpected stdout: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file From 110091619e7ce77420648b6c5c2516e835116041 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 13 Apr 2026 15:56:49 -0400 Subject: [PATCH 37/60] Add tests for EXIT. --- tests/cases/failing/exit-arity-two.pre | 1 + tests/cases/failing/exit-type-bool.pre | 1 + tests/cases/failing/exit-type-flt.pre | 1 + tests/cases/failing/exit-type-func.pre | 1 + tests/cases/failing/exit-type-map.pre | 1 + tests/cases/failing/exit-type-str.pre | 1 + tests/cases/failing/exit-type-thr.pre | 1 + tests/cases/failing/exit-type-tns.pre | 1 + tests/cases/passing/exit-default.pre | 2 + tests/cases/passing/exit-explicit-nonzero.ps1 | 54 +++++++++++++++++++ tests/cases/passing/exit-explicit-zero.ps1 | 49 +++++++++++++++++ 11 files changed, 113 insertions(+) create mode 100644 tests/cases/failing/exit-arity-two.pre create mode 100644 tests/cases/failing/exit-type-bool.pre create mode 100644 tests/cases/failing/exit-type-flt.pre create mode 100644 tests/cases/failing/exit-type-func.pre create mode 100644 tests/cases/failing/exit-type-map.pre create mode 100644 tests/cases/failing/exit-type-str.pre create mode 100644 tests/cases/failing/exit-type-thr.pre create mode 100644 tests/cases/failing/exit-type-tns.pre create mode 100644 tests/cases/passing/exit-default.pre create mode 100644 tests/cases/passing/exit-explicit-nonzero.ps1 create mode 100644 tests/cases/passing/exit-explicit-zero.ps1 diff --git a/tests/cases/failing/exit-arity-two.pre b/tests/cases/failing/exit-arity-two.pre new file mode 100644 index 0000000..2122d0b --- /dev/null +++ b/tests/cases/failing/exit-arity-two.pre @@ -0,0 +1 @@ +EXIT(0d0, 0d1) diff --git a/tests/cases/failing/exit-type-bool.pre b/tests/cases/failing/exit-type-bool.pre new file mode 100644 index 0000000..7cccffe --- /dev/null +++ b/tests/cases/failing/exit-type-bool.pre @@ -0,0 +1 @@ +EXIT(TRUE) diff --git a/tests/cases/failing/exit-type-flt.pre b/tests/cases/failing/exit-type-flt.pre new file mode 100644 index 0000000..dadab99 --- /dev/null +++ b/tests/cases/failing/exit-type-flt.pre @@ -0,0 +1 @@ +EXIT(0d1.0) diff --git a/tests/cases/failing/exit-type-func.pre b/tests/cases/failing/exit-type-func.pre new file mode 100644 index 0000000..77ad939 --- /dev/null +++ b/tests/cases/failing/exit-type-func.pre @@ -0,0 +1 @@ +EXIT(LAMBDA BOOL: (){}) diff --git a/tests/cases/failing/exit-type-map.pre b/tests/cases/failing/exit-type-map.pre new file mode 100644 index 0000000..e972a8f --- /dev/null +++ b/tests/cases/failing/exit-type-map.pre @@ -0,0 +1 @@ +EXIT(<>) diff --git a/tests/cases/failing/exit-type-str.pre b/tests/cases/failing/exit-type-str.pre new file mode 100644 index 0000000..f901009 --- /dev/null +++ b/tests/cases/failing/exit-type-str.pre @@ -0,0 +1 @@ +EXIT("0d1") diff --git a/tests/cases/failing/exit-type-thr.pre b/tests/cases/failing/exit-type-thr.pre new file mode 100644 index 0000000..a168a67 --- /dev/null +++ b/tests/cases/failing/exit-type-thr.pre @@ -0,0 +1 @@ +EXIT(ASYNC{}) diff --git a/tests/cases/failing/exit-type-tns.pre b/tests/cases/failing/exit-type-tns.pre new file mode 100644 index 0000000..32905d8 --- /dev/null +++ b/tests/cases/failing/exit-type-tns.pre @@ -0,0 +1 @@ +EXIT([0d1]) diff --git a/tests/cases/passing/exit-default.pre b/tests/cases/passing/exit-default.pre new file mode 100644 index 0000000..a292379 --- /dev/null +++ b/tests/cases/passing/exit-default.pre @@ -0,0 +1,2 @@ +EXIT() +THROW("unreachable") diff --git a/tests/cases/passing/exit-explicit-nonzero.ps1 b/tests/cases/passing/exit-explicit-nonzero.ps1 new file mode 100644 index 0000000..d1893da --- /dev/null +++ b/tests/cases/passing/exit-explicit-nonzero.ps1 @@ -0,0 +1,54 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +PRINT("custom") +EXIT(0d23) +PRINT("after") +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('"{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + if ($result.ExitCode -ne 23) { + $stdout = Format-VisibleText $result.Stdout + $stderr = Format-VisibleText $result.Stderr + throw "Expected Prefix to exit with code 23, got $($result.ExitCode)`nSTDOUT: $stdout`nSTDERR: $stderr" + } + + Assert-NoErrorOutput $result + + if (-not [regex]::IsMatch($result.Stdout, '\Acustom(?:\r\n|\n)\z')) { + $stdout = Format-VisibleText $result.Stdout + throw "Unexpected stdout: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/exit-explicit-zero.ps1 b/tests/cases/passing/exit-explicit-zero.ps1 new file mode 100644 index 0000000..ed2c0ba --- /dev/null +++ b/tests/cases/passing/exit-explicit-zero.ps1 @@ -0,0 +1,49 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +PRINT("before") +EXIT(0d0) +PRINT("after") +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('"{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not [regex]::IsMatch($result.Stdout, '\Abefore(?:\r\n|\n)\z')) { + $stdout = Format-VisibleText $result.Stdout + throw "Unexpected stdout: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} From 2f97d377f97f1ede7eb2043d85f2d537f7e1bca0 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Tue, 14 Apr 2026 16:35:49 -0400 Subject: [PATCH 38/60] Add tests for SHUSH and UNSHUSH. --- tests/cases/failing/shush-arity-one.pre | 1 + tests/cases/failing/unshush-arity-one.pre | 1 + .../shush-cl-suppresses-forwarding.ps1 | 48 ++++++++++++++++++ .../passing/shush-input-prompt-forwarded.ps1 | 28 +++++++++++ .../shush-print-suppresses-forwarding.ps1 | 48 ++++++++++++++++++ tests/cases/passing/shush-return-false.pre | 1 + .../shush-warn-suppresses-forwarding.ps1 | 48 ++++++++++++++++++ tests/cases/passing/unshush-no-op.pre | 1 + .../passing/unshush-restores-forwarding.ps1 | 50 +++++++++++++++++++ tests/cases/passing/unshush-return-false.pre | 2 + 10 files changed, 228 insertions(+) create mode 100644 tests/cases/failing/shush-arity-one.pre create mode 100644 tests/cases/failing/unshush-arity-one.pre create mode 100644 tests/cases/passing/shush-cl-suppresses-forwarding.ps1 create mode 100644 tests/cases/passing/shush-input-prompt-forwarded.ps1 create mode 100644 tests/cases/passing/shush-print-suppresses-forwarding.ps1 create mode 100644 tests/cases/passing/shush-return-false.pre create mode 100644 tests/cases/passing/shush-warn-suppresses-forwarding.ps1 create mode 100644 tests/cases/passing/unshush-no-op.pre create mode 100644 tests/cases/passing/unshush-restores-forwarding.ps1 create mode 100644 tests/cases/passing/unshush-return-false.pre diff --git a/tests/cases/failing/shush-arity-one.pre b/tests/cases/failing/shush-arity-one.pre new file mode 100644 index 0000000..913ab99 --- /dev/null +++ b/tests/cases/failing/shush-arity-one.pre @@ -0,0 +1 @@ +SHUSH(0d1) diff --git a/tests/cases/failing/unshush-arity-one.pre b/tests/cases/failing/unshush-arity-one.pre new file mode 100644 index 0000000..e23dc65 --- /dev/null +++ b/tests/cases/failing/unshush-arity-one.pre @@ -0,0 +1 @@ +UNSHUSH(0d1) diff --git a/tests/cases/passing/shush-cl-suppresses-forwarding.ps1 b/tests/cases/passing/shush-cl-suppresses-forwarding.ps1 new file mode 100644 index 0000000..f50aa59 --- /dev/null +++ b/tests/cases/passing/shush-cl-suppresses-forwarding.ps1 @@ -0,0 +1,48 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +SHUSH() +ASSERT(EQ(CL("echo prefix-shush-cl"), 0d0)) +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('"{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if ($result.Stdout.Length -ne 0) { + $stdout = Format-VisibleText $result.Stdout + throw "Expected no stdout output, got: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/shush-input-prompt-forwarded.ps1 b/tests/cases/passing/shush-input-prompt-forwarded.ps1 new file mode 100644 index 0000000..5d281a9 --- /dev/null +++ b/tests/cases/passing/shush-input-prompt-forwarded.ps1 @@ -0,0 +1,28 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +SHUSH() +STR: line = INPUT("PROMPT>") +ASSERT(EQ(line, "alpha")) +PRINT("hidden") +'@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText "alpha`r`n" + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not [regex]::IsMatch($result.Stdout, '\APROMPT>\z')) { + $stdout = Format-VisibleText $result.Stdout + throw "Unexpected stdout: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/shush-print-suppresses-forwarding.ps1 b/tests/cases/passing/shush-print-suppresses-forwarding.ps1 new file mode 100644 index 0000000..5a9d5d5 --- /dev/null +++ b/tests/cases/passing/shush-print-suppresses-forwarding.ps1 @@ -0,0 +1,48 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +SHUSH() +PRINT("hidden") +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('"{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if ($result.Stdout.Length -ne 0) { + $stdout = Format-VisibleText $result.Stdout + throw "Expected no stdout output, got: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/shush-return-false.pre b/tests/cases/passing/shush-return-false.pre new file mode 100644 index 0000000..e516ab8 --- /dev/null +++ b/tests/cases/passing/shush-return-false.pre @@ -0,0 +1 @@ +ASSERT(EQ(SHUSH(), FALSE)) diff --git a/tests/cases/passing/shush-warn-suppresses-forwarding.ps1 b/tests/cases/passing/shush-warn-suppresses-forwarding.ps1 new file mode 100644 index 0000000..567d229 --- /dev/null +++ b/tests/cases/passing/shush-warn-suppresses-forwarding.ps1 @@ -0,0 +1,48 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +SHUSH() +WARN("hidden") +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('-verbose "{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if ($result.Stdout.Length -ne 0) { + $stdout = Format-VisibleText $result.Stdout + throw "Expected no stdout output, got: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/unshush-no-op.pre b/tests/cases/passing/unshush-no-op.pre new file mode 100644 index 0000000..fc8955a --- /dev/null +++ b/tests/cases/passing/unshush-no-op.pre @@ -0,0 +1 @@ +ASSERT(EQ(UNSHUSH(), FALSE)) diff --git a/tests/cases/passing/unshush-restores-forwarding.ps1 b/tests/cases/passing/unshush-restores-forwarding.ps1 new file mode 100644 index 0000000..95f8487 --- /dev/null +++ b/tests/cases/passing/unshush-restores-forwarding.ps1 @@ -0,0 +1,50 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +SHUSH() +PRINT("hidden") +ASSERT(EQ(UNSHUSH(), FALSE)) +PRINT("shown") +'@ + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = Get-PrefixExePath + $startInfo.Arguments = ('"{0}"' -f $programPath) + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + + $process = [System.Diagnostics.Process]::Start($startInfo) + try { + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + + $result = [pscustomobject]@{ + ExitCode = $process.ExitCode + Stdout = $stdout + Stderr = $stderr + } + } + finally { + $process.Dispose() + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not [regex]::IsMatch($result.Stdout, '\Ashown(?:\r\n|\n)\z')) { + $stdout = Format-VisibleText $result.Stdout + throw "Unexpected stdout: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/unshush-return-false.pre b/tests/cases/passing/unshush-return-false.pre new file mode 100644 index 0000000..cb3b06e --- /dev/null +++ b/tests/cases/passing/unshush-return-false.pre @@ -0,0 +1,2 @@ +SHUSH() +ASSERT(EQ(UNSHUSH(), FALSE)) From e53d153aa711447cfefaaa17a708498387292d92 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Tue, 14 Apr 2026 18:12:35 -0400 Subject: [PATCH 39/60] Add tests for IMPORT. --- .../cases/failing/import-alias-type-bool.pre | 1 + tests/cases/failing/import-alias-type-flt.pre | 1 + .../cases/failing/import-alias-type-func.pre | 1 + tests/cases/failing/import-alias-type-int.pre | 1 + tests/cases/failing/import-alias-type-map.pre | 1 + tests/cases/failing/import-alias-type-str.pre | 1 + tests/cases/failing/import-alias-type-thr.pre | 1 + tests/cases/failing/import-alias-type-tns.pre | 1 + tests/cases/failing/import-arity-three.pre | 1 + tests/cases/failing/import-arity-zero.pre | 1 + tests/cases/failing/import-missing-module.pre | 1 + tests/cases/failing/import-type-bool.pre | 1 + tests/cases/failing/import-type-flt.pre | 1 + tests/cases/failing/import-type-func.pre | 1 + tests/cases/failing/import-type-int.pre | 1 + tests/cases/failing/import-type-map.pre | 1 + tests/cases/failing/import-type-str.pre | 1 + tests/cases/failing/import-type-thr.pre | 1 + tests/cases/failing/import-type-tns.pre | 1 + .../import-alias-qualified-namespace.pre | 3 ++ tests/cases/passing/import-cached-alias.ps1 | 43 +++++++++++++++++++ .../passing/import-isolated-top-level.ps1 | 36 ++++++++++++++++ .../passing/import-local-before-stdlib.ps1 | 40 +++++++++++++++++ .../passing/import-no-companion-prex.ps1 | 34 +++++++++++++++ tests/cases/passing/import-package-init.ps1 | 34 +++++++++++++++ .../import-package-missing-init-errors.ps1 | 32 ++++++++++++++ .../passing/import-package-precedence.ps1 | 41 ++++++++++++++++++ .../passing/import-qualified-namespace.pre | 3 ++ tests/cases/passing/import-qualified-only.ps1 | 29 +++++++++++++ tests/cases/passing/import-return-false.pre | 2 + .../passing/import-stdlib-before-userlib.ps1 | 41 ++++++++++++++++++ tests/helpers/prefix-input.ps1 | 1 + 32 files changed, 358 insertions(+) create mode 100644 tests/cases/failing/import-alias-type-bool.pre create mode 100644 tests/cases/failing/import-alias-type-flt.pre create mode 100644 tests/cases/failing/import-alias-type-func.pre create mode 100644 tests/cases/failing/import-alias-type-int.pre create mode 100644 tests/cases/failing/import-alias-type-map.pre create mode 100644 tests/cases/failing/import-alias-type-str.pre create mode 100644 tests/cases/failing/import-alias-type-thr.pre create mode 100644 tests/cases/failing/import-alias-type-tns.pre create mode 100644 tests/cases/failing/import-arity-three.pre create mode 100644 tests/cases/failing/import-arity-zero.pre create mode 100644 tests/cases/failing/import-missing-module.pre create mode 100644 tests/cases/failing/import-type-bool.pre create mode 100644 tests/cases/failing/import-type-flt.pre create mode 100644 tests/cases/failing/import-type-func.pre create mode 100644 tests/cases/failing/import-type-int.pre create mode 100644 tests/cases/failing/import-type-map.pre create mode 100644 tests/cases/failing/import-type-str.pre create mode 100644 tests/cases/failing/import-type-thr.pre create mode 100644 tests/cases/failing/import-type-tns.pre create mode 100644 tests/cases/passing/import-alias-qualified-namespace.pre create mode 100644 tests/cases/passing/import-cached-alias.ps1 create mode 100644 tests/cases/passing/import-isolated-top-level.ps1 create mode 100644 tests/cases/passing/import-local-before-stdlib.ps1 create mode 100644 tests/cases/passing/import-no-companion-prex.ps1 create mode 100644 tests/cases/passing/import-package-init.ps1 create mode 100644 tests/cases/passing/import-package-missing-init-errors.ps1 create mode 100644 tests/cases/passing/import-package-precedence.ps1 create mode 100644 tests/cases/passing/import-qualified-namespace.pre create mode 100644 tests/cases/passing/import-qualified-only.ps1 create mode 100644 tests/cases/passing/import-return-false.pre create mode 100644 tests/cases/passing/import-stdlib-before-userlib.ps1 diff --git a/tests/cases/failing/import-alias-type-bool.pre b/tests/cases/failing/import-alias-type-bool.pre new file mode 100644 index 0000000..22b0c48 --- /dev/null +++ b/tests/cases/failing/import-alias-type-bool.pre @@ -0,0 +1 @@ +IMPORT(path, TRUE) \ No newline at end of file diff --git a/tests/cases/failing/import-alias-type-flt.pre b/tests/cases/failing/import-alias-type-flt.pre new file mode 100644 index 0000000..972ed9e --- /dev/null +++ b/tests/cases/failing/import-alias-type-flt.pre @@ -0,0 +1 @@ +IMPORT(path, 0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/import-alias-type-func.pre b/tests/cases/failing/import-alias-type-func.pre new file mode 100644 index 0000000..f413a77 --- /dev/null +++ b/tests/cases/failing/import-alias-type-func.pre @@ -0,0 +1 @@ +IMPORT(path, LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/import-alias-type-int.pre b/tests/cases/failing/import-alias-type-int.pre new file mode 100644 index 0000000..2fb8f5f --- /dev/null +++ b/tests/cases/failing/import-alias-type-int.pre @@ -0,0 +1 @@ +IMPORT(path, 0d1) \ No newline at end of file diff --git a/tests/cases/failing/import-alias-type-map.pre b/tests/cases/failing/import-alias-type-map.pre new file mode 100644 index 0000000..4af7fce --- /dev/null +++ b/tests/cases/failing/import-alias-type-map.pre @@ -0,0 +1 @@ +IMPORT(path, <>) \ No newline at end of file diff --git a/tests/cases/failing/import-alias-type-str.pre b/tests/cases/failing/import-alias-type-str.pre new file mode 100644 index 0000000..ba47cb8 --- /dev/null +++ b/tests/cases/failing/import-alias-type-str.pre @@ -0,0 +1 @@ +IMPORT(path, "helper") \ No newline at end of file diff --git a/tests/cases/failing/import-alias-type-thr.pre b/tests/cases/failing/import-alias-type-thr.pre new file mode 100644 index 0000000..270ba1b --- /dev/null +++ b/tests/cases/failing/import-alias-type-thr.pre @@ -0,0 +1 @@ +IMPORT(path, ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/import-alias-type-tns.pre b/tests/cases/failing/import-alias-type-tns.pre new file mode 100644 index 0000000..a58e493 --- /dev/null +++ b/tests/cases/failing/import-alias-type-tns.pre @@ -0,0 +1 @@ +IMPORT(path, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/import-arity-three.pre b/tests/cases/failing/import-arity-three.pre new file mode 100644 index 0000000..c4d1e84 --- /dev/null +++ b/tests/cases/failing/import-arity-three.pre @@ -0,0 +1 @@ +IMPORT(path, helper, extra) \ No newline at end of file diff --git a/tests/cases/failing/import-arity-zero.pre b/tests/cases/failing/import-arity-zero.pre new file mode 100644 index 0000000..4675b42 --- /dev/null +++ b/tests/cases/failing/import-arity-zero.pre @@ -0,0 +1 @@ +IMPORT() \ No newline at end of file diff --git a/tests/cases/failing/import-missing-module.pre b/tests/cases/failing/import-missing-module.pre new file mode 100644 index 0000000..1674970 --- /dev/null +++ b/tests/cases/failing/import-missing-module.pre @@ -0,0 +1 @@ +IMPORT(prefiximportmissingmoduletest) \ No newline at end of file diff --git a/tests/cases/failing/import-type-bool.pre b/tests/cases/failing/import-type-bool.pre new file mode 100644 index 0000000..9fc56a7 --- /dev/null +++ b/tests/cases/failing/import-type-bool.pre @@ -0,0 +1 @@ +IMPORT(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/import-type-flt.pre b/tests/cases/failing/import-type-flt.pre new file mode 100644 index 0000000..668be15 --- /dev/null +++ b/tests/cases/failing/import-type-flt.pre @@ -0,0 +1 @@ +IMPORT(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/import-type-func.pre b/tests/cases/failing/import-type-func.pre new file mode 100644 index 0000000..12a7804 --- /dev/null +++ b/tests/cases/failing/import-type-func.pre @@ -0,0 +1 @@ +IMPORT(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/import-type-int.pre b/tests/cases/failing/import-type-int.pre new file mode 100644 index 0000000..06bff34 --- /dev/null +++ b/tests/cases/failing/import-type-int.pre @@ -0,0 +1 @@ +IMPORT(0d1) \ No newline at end of file diff --git a/tests/cases/failing/import-type-map.pre b/tests/cases/failing/import-type-map.pre new file mode 100644 index 0000000..abb644b --- /dev/null +++ b/tests/cases/failing/import-type-map.pre @@ -0,0 +1 @@ +IMPORT(<>) \ No newline at end of file diff --git a/tests/cases/failing/import-type-str.pre b/tests/cases/failing/import-type-str.pre new file mode 100644 index 0000000..29d995d --- /dev/null +++ b/tests/cases/failing/import-type-str.pre @@ -0,0 +1 @@ +IMPORT("path") \ No newline at end of file diff --git a/tests/cases/failing/import-type-thr.pre b/tests/cases/failing/import-type-thr.pre new file mode 100644 index 0000000..b7288bf --- /dev/null +++ b/tests/cases/failing/import-type-thr.pre @@ -0,0 +1 @@ +IMPORT(ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/import-type-tns.pre b/tests/cases/failing/import-type-tns.pre new file mode 100644 index 0000000..76ed027 --- /dev/null +++ b/tests/cases/failing/import-type-tns.pre @@ -0,0 +1 @@ +IMPORT([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/import-alias-qualified-namespace.pre b/tests/cases/passing/import-alias-qualified-namespace.pre new file mode 100644 index 0000000..71fa7bc --- /dev/null +++ b/tests/cases/passing/import-alias-qualified-namespace.pre @@ -0,0 +1,3 @@ +IMPORT(path, helper) + +ASSERT(EQ(TYPE(helper.TEMPFILE("import-alias-qualified-namespace.txt")), "STR")) \ No newline at end of file diff --git a/tests/cases/passing/import-cached-alias.ps1 b/tests/cases/passing/import-cached-alias.ps1 new file mode 100644 index 0000000..5ed918f --- /dev/null +++ b/tests/cases/passing/import-cached-alias.ps1 @@ -0,0 +1,43 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$moduleName = 'prefiximport' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $markerPath = Join-Path $tempDir 'marker.txt' + $markerLiteral = $markerPath.Replace('\', '/') + $programPath = Join-Path $tempDir 'program.pre' + $modulePath = Join-Path $tempDir "$moduleName.pre" + + Set-Content -Path $modulePath -Encoding Ascii -Value @" +STR: marker = "$markerLiteral" + +IF(EXISTFILE(marker)){ + WRITEFILE("reloaded", marker) +} ELSE { + WRITEFILE("loaded", marker) +} + +FUNC STR: marker_text(){ + RETURN(READFILE(marker)) +} +"@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT($moduleName) +IMPORT($moduleName, again) + +ASSERT(EQ($moduleName.marker_text(), "loaded")) +ASSERT(EQ(again.marker_text(), "loaded")) +"@ + + $output = & (Get-PrefixExePath) $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import-isolated-top-level.ps1 b/tests/cases/passing/import-isolated-top-level.ps1 new file mode 100644 index 0000000..203f94a --- /dev/null +++ b/tests/cases/passing/import-isolated-top-level.ps1 @@ -0,0 +1,36 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$moduleName = 'prefiximport' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $programPath = Join-Path $tempDir 'program.pre' + $modulePath = Join-Path $tempDir "$moduleName.pre" + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +INT: shared = 0d7 + +FUNC INT: read_shared(){ + RETURN(shared) +} +'@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +INT: shared = 0d11 + +IMPORT($moduleName, helper) + +ASSERT(EQ(helper.read_shared(), 0d7)) +ASSERT(EQ(shared, 0d11)) +"@ + + $output = & (Get-PrefixExePath) $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import-local-before-stdlib.ps1 b/tests/cases/passing/import-local-before-stdlib.ps1 new file mode 100644 index 0000000..3ff7d0b --- /dev/null +++ b/tests/cases/passing/import-local-before-stdlib.ps1 @@ -0,0 +1,40 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$prefixDir = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) +$tempDir = New-PrefixTempDir +$moduleName = 'prefiximport' + ([IO.Path]::GetRandomFileName().Replace('.', '')) +$stdlibPath = Join-Path $prefixDir "lib\std\$moduleName.pre" + +try { + $programPath = Join-Path $tempDir 'program.pre' + $localModulePath = Join-Path $tempDir "$moduleName.pre" + + Set-Content -Path $localModulePath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("local") +} +'@ + + Set-Content -Path $stdlibPath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("stdlib") +} +'@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT($moduleName) + +ASSERT(EQ($moduleName.identify(), "local")) +"@ + + $output = & (Get-PrefixExePath) $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + Remove-Item -Path $stdlibPath -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import-no-companion-prex.ps1 b/tests/cases/passing/import-no-companion-prex.ps1 new file mode 100644 index 0000000..e8ea87e --- /dev/null +++ b/tests/cases/passing/import-no-companion-prex.ps1 @@ -0,0 +1,34 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$moduleName = 'prefiximport' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $programPath = Join-Path $tempDir 'program.pre' + $modulePath = Join-Path $tempDir "$moduleName.pre" + $pointerPath = Join-Path $tempDir "$moduleName.prex" + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("source") +} +'@ + + Set-Content -Path $pointerPath -Encoding Ascii -Value 'this companion pointer file must be ignored by IMPORT' + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT($moduleName) + +ASSERT(EQ($moduleName.identify(), "source")) +"@ + + $output = & (Get-PrefixExePath) $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import-package-init.ps1 b/tests/cases/passing/import-package-init.ps1 new file mode 100644 index 0000000..78206c3 --- /dev/null +++ b/tests/cases/passing/import-package-init.ps1 @@ -0,0 +1,34 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$packageName = 'prefixpkg' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $programPath = Join-Path $tempDir 'program.pre' + $packageDir = Join-Path $tempDir $packageName + $initPath = Join-Path $packageDir 'init.pre' + + New-Item -ItemType Directory -Path $packageDir | Out-Null + + Set-Content -Path $initPath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("package") +} +'@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT($packageName) + +ASSERT(EQ($packageName.identify(), "package")) +"@ + + $output = & (Get-PrefixExePath) $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import-package-missing-init-errors.ps1 b/tests/cases/passing/import-package-missing-init-errors.ps1 new file mode 100644 index 0000000..5bf8709 --- /dev/null +++ b/tests/cases/passing/import-package-missing-init-errors.ps1 @@ -0,0 +1,32 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$packageName = 'prefixpkg' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $programPath = Join-Path $tempDir 'program.pre' + $modulePath = Join-Path $tempDir "$packageName.pre" + $packageDir = Join-Path $tempDir $packageName + + New-Item -ItemType Directory -Path $packageDir | Out-Null + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("module") +} +'@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT($packageName) +"@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText '' + if ($result.ExitCode -eq 0) { + $outputText = "STDOUT: $(Format-VisibleText $result.Stdout)`nSTDERR: $(Format-VisibleText $result.Stderr)" + throw "Expected IMPORT($packageName) to fail when the package directory has no init.pre`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import-package-precedence.ps1 b/tests/cases/passing/import-package-precedence.ps1 new file mode 100644 index 0000000..102f192 --- /dev/null +++ b/tests/cases/passing/import-package-precedence.ps1 @@ -0,0 +1,41 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$packageName = 'prefixpkg' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $programPath = Join-Path $tempDir 'program.pre' + $modulePath = Join-Path $tempDir "$packageName.pre" + $packageDir = Join-Path $tempDir $packageName + $initPath = Join-Path $packageDir 'init.pre' + + New-Item -ItemType Directory -Path $packageDir | Out-Null + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("module") +} +'@ + + Set-Content -Path $initPath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("package") +} +'@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT($packageName) + +ASSERT(EQ($packageName.identify(), "package")) +"@ + + $output = & (Get-PrefixExePath) $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import-qualified-namespace.pre b/tests/cases/passing/import-qualified-namespace.pre new file mode 100644 index 0000000..d6f1e86 --- /dev/null +++ b/tests/cases/passing/import-qualified-namespace.pre @@ -0,0 +1,3 @@ +IMPORT(path) + +ASSERT(EQ(TYPE(path.TEMPFILE("import-qualified-namespace.txt")), "STR")) \ No newline at end of file diff --git a/tests/cases/passing/import-qualified-only.ps1 b/tests/cases/passing/import-qualified-only.ps1 new file mode 100644 index 0000000..f833979 --- /dev/null +++ b/tests/cases/passing/import-qualified-only.ps1 @@ -0,0 +1,29 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$moduleName = 'prefiximport' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $programPath = Join-Path $tempDir 'program.pre' + $modulePath = Join-Path $tempDir "$moduleName.pre" + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +INT: hidden = 0d7 +'@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT($moduleName) + +ASSERT(EQ(hidden, 0d7)) +"@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText '' + if ($result.ExitCode -eq 0) { + $outputText = "STDOUT: $(Format-VisibleText $result.Stdout)`nSTDERR: $(Format-VisibleText $result.Stderr)" + throw "Expected unqualified module binding access to fail after IMPORT($moduleName)`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import-return-false.pre b/tests/cases/passing/import-return-false.pre new file mode 100644 index 0000000..0a14f9c --- /dev/null +++ b/tests/cases/passing/import-return-false.pre @@ -0,0 +1,2 @@ +ASSERT(EQ(TYPE(IMPORT(path)), "BOOL")) +ASSERT(NOT(IMPORT(path))) \ No newline at end of file diff --git a/tests/cases/passing/import-stdlib-before-userlib.ps1 b/tests/cases/passing/import-stdlib-before-userlib.ps1 new file mode 100644 index 0000000..bb0dbef --- /dev/null +++ b/tests/cases/passing/import-stdlib-before-userlib.ps1 @@ -0,0 +1,41 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$prefixDir = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) +$tempDir = New-PrefixTempDir +$moduleName = 'prefiximport' + ([IO.Path]::GetRandomFileName().Replace('.', '')) +$stdlibPath = Join-Path $prefixDir "lib\std\$moduleName.pre" +$userlibPath = Join-Path $prefixDir "lib\usr\$moduleName.pre" + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $stdlibPath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("stdlib") +} +'@ + + Set-Content -Path $userlibPath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("userlib") +} +'@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT($moduleName) + +ASSERT(EQ($moduleName.identify(), "stdlib")) +"@ + + $output = & (Get-PrefixExePath) $programPath 2>&1 + if ($LASTEXITCODE -ne 0) { + $outputText = ($output | ForEach-Object { $_.ToString() }) -join [Environment]::NewLine + throw "Prefix exited with code $LASTEXITCODE`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + Remove-Item -Path $stdlibPath -Force -ErrorAction SilentlyContinue + Remove-Item -Path $userlibPath -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/helpers/prefix-input.ps1 b/tests/helpers/prefix-input.ps1 index 8aabb50..de0c019 100644 --- a/tests/helpers/prefix-input.ps1 +++ b/tests/helpers/prefix-input.ps1 @@ -44,6 +44,7 @@ function Invoke-PrefixProgramWithInput { [string]$ProgramPath, [Parameter(Mandatory = $true)] + [AllowEmptyString()] [string]$InputText ) From 63d850141d0ccde800d5c159542d1064e542a2be Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Wed, 15 Apr 2026 16:17:33 -0400 Subject: [PATCH 40/60] Add tests for IMPORT_PATH. --- .../failing/import_path-alias-type-bool.pre | 6 +++ .../failing/import_path-alias-type-flt.pre | 6 +++ .../failing/import_path-alias-type-func.pre | 6 +++ .../failing/import_path-alias-type-int.pre | 6 +++ .../failing/import_path-alias-type-map.pre | 6 +++ .../failing/import_path-alias-type-str.pre | 6 +++ .../failing/import_path-alias-type-thr.pre | 6 +++ .../failing/import_path-alias-type-tns.pre | 6 +++ .../cases/failing/import_path-arity-three.pre | 1 + .../cases/failing/import_path-arity-zero.pre | 1 + .../failing/import_path-missing-file.pre | 6 +++ .../failing/import_path-qualified-only.pre | 8 ++++ tests/cases/failing/import_path-type-bool.pre | 1 + tests/cases/failing/import_path-type-flt.pre | 1 + tests/cases/failing/import_path-type-func.pre | 1 + tests/cases/failing/import_path-type-int.pre | 1 + tests/cases/failing/import_path-type-map.pre | 1 + tests/cases/failing/import_path-type-thr.pre | 1 + tests/cases/failing/import_path-type-tns.pre | 1 + .../import_path-alias-qualified-namespace.pre | 7 +++ .../passing/import_path-cached-alias.pre | 19 ++++++++ .../passing/import_path-default-basename.pre | 7 +++ .../import_path-equivalent-path-cache.ps1 | 45 +++++++++++++++++++ .../import_path-isolated-top-level.pre | 10 +++++ .../passing/import_path-no-companion-prex.pre | 7 +++ .../passing/import_path-package-init.ps1 | 34 ++++++++++++++ ...mport_path-package-missing-init-errors.ps1 | 34 ++++++++++++++ .../passing/import_path-return-false.pre | 7 +++ tests/helpers/import_path_basic_target.pre | 3 ++ tests/helpers/import_path_cache_target.pre | 13 ++++++ tests/helpers/import_path_hidden_target.pre | 1 + tests/helpers/import_path_isolated_target.pre | 5 +++ tests/helpers/import_path_prex_target.pre | 3 ++ tests/helpers/import_path_prex_target.prex | 1 + 34 files changed, 267 insertions(+) create mode 100644 tests/cases/failing/import_path-alias-type-bool.pre create mode 100644 tests/cases/failing/import_path-alias-type-flt.pre create mode 100644 tests/cases/failing/import_path-alias-type-func.pre create mode 100644 tests/cases/failing/import_path-alias-type-int.pre create mode 100644 tests/cases/failing/import_path-alias-type-map.pre create mode 100644 tests/cases/failing/import_path-alias-type-str.pre create mode 100644 tests/cases/failing/import_path-alias-type-thr.pre create mode 100644 tests/cases/failing/import_path-alias-type-tns.pre create mode 100644 tests/cases/failing/import_path-arity-three.pre create mode 100644 tests/cases/failing/import_path-arity-zero.pre create mode 100644 tests/cases/failing/import_path-missing-file.pre create mode 100644 tests/cases/failing/import_path-qualified-only.pre create mode 100644 tests/cases/failing/import_path-type-bool.pre create mode 100644 tests/cases/failing/import_path-type-flt.pre create mode 100644 tests/cases/failing/import_path-type-func.pre create mode 100644 tests/cases/failing/import_path-type-int.pre create mode 100644 tests/cases/failing/import_path-type-map.pre create mode 100644 tests/cases/failing/import_path-type-thr.pre create mode 100644 tests/cases/failing/import_path-type-tns.pre create mode 100644 tests/cases/passing/import_path-alias-qualified-namespace.pre create mode 100644 tests/cases/passing/import_path-cached-alias.pre create mode 100644 tests/cases/passing/import_path-default-basename.pre create mode 100644 tests/cases/passing/import_path-equivalent-path-cache.ps1 create mode 100644 tests/cases/passing/import_path-isolated-top-level.pre create mode 100644 tests/cases/passing/import_path-no-companion-prex.pre create mode 100644 tests/cases/passing/import_path-package-init.ps1 create mode 100644 tests/cases/passing/import_path-package-missing-init-errors.ps1 create mode 100644 tests/cases/passing/import_path-return-false.pre create mode 100644 tests/helpers/import_path_basic_target.pre create mode 100644 tests/helpers/import_path_cache_target.pre create mode 100644 tests/helpers/import_path_hidden_target.pre create mode 100644 tests/helpers/import_path_isolated_target.pre create mode 100644 tests/helpers/import_path_prex_target.pre create mode 100644 tests/helpers/import_path_prex_target.prex diff --git a/tests/cases/failing/import_path-alias-type-bool.pre b/tests/cases/failing/import_path-alias-type-bool.pre new file mode 100644 index 0000000..3df4102 --- /dev/null +++ b/tests/cases/failing/import_path-alias-type-bool.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +IMPORT_PATH(helper_path, TRUE) \ No newline at end of file diff --git a/tests/cases/failing/import_path-alias-type-flt.pre b/tests/cases/failing/import_path-alias-type-flt.pre new file mode 100644 index 0000000..503fe57 --- /dev/null +++ b/tests/cases/failing/import_path-alias-type-flt.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +IMPORT_PATH(helper_path, 0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/import_path-alias-type-func.pre b/tests/cases/failing/import_path-alias-type-func.pre new file mode 100644 index 0000000..c0e4731 --- /dev/null +++ b/tests/cases/failing/import_path-alias-type-func.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +IMPORT_PATH(helper_path, LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/import_path-alias-type-int.pre b/tests/cases/failing/import_path-alias-type-int.pre new file mode 100644 index 0000000..7c7f623 --- /dev/null +++ b/tests/cases/failing/import_path-alias-type-int.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +IMPORT_PATH(helper_path, 0d1) \ No newline at end of file diff --git a/tests/cases/failing/import_path-alias-type-map.pre b/tests/cases/failing/import_path-alias-type-map.pre new file mode 100644 index 0000000..e563932 --- /dev/null +++ b/tests/cases/failing/import_path-alias-type-map.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +IMPORT_PATH(helper_path, <>) \ No newline at end of file diff --git a/tests/cases/failing/import_path-alias-type-str.pre b/tests/cases/failing/import_path-alias-type-str.pre new file mode 100644 index 0000000..3444593 --- /dev/null +++ b/tests/cases/failing/import_path-alias-type-str.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +IMPORT_PATH(helper_path, "helper") \ No newline at end of file diff --git a/tests/cases/failing/import_path-alias-type-thr.pre b/tests/cases/failing/import_path-alias-type-thr.pre new file mode 100644 index 0000000..e8abaf7 --- /dev/null +++ b/tests/cases/failing/import_path-alias-type-thr.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +IMPORT_PATH(helper_path, ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/import_path-alias-type-tns.pre b/tests/cases/failing/import_path-alias-type-tns.pre new file mode 100644 index 0000000..2057c9f --- /dev/null +++ b/tests/cases/failing/import_path-alias-type-tns.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +IMPORT_PATH(helper_path, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/import_path-arity-three.pre b/tests/cases/failing/import_path-arity-three.pre new file mode 100644 index 0000000..a854538 --- /dev/null +++ b/tests/cases/failing/import_path-arity-three.pre @@ -0,0 +1 @@ +IMPORT_PATH("g:/missing.pre", helper, extra) \ No newline at end of file diff --git a/tests/cases/failing/import_path-arity-zero.pre b/tests/cases/failing/import_path-arity-zero.pre new file mode 100644 index 0000000..1549c29 --- /dev/null +++ b/tests/cases/failing/import_path-arity-zero.pre @@ -0,0 +1 @@ +IMPORT_PATH() \ No newline at end of file diff --git a/tests/cases/failing/import_path-missing-file.pre b/tests/cases/failing/import_path-missing-file.pre new file mode 100644 index 0000000..bb3ce5d --- /dev/null +++ b/tests/cases/failing/import_path-missing-file.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: missing_path = JOIN(tests_dir, "/helpers/import_path_missing_target.pre") + +IMPORT_PATH(missing_path) \ No newline at end of file diff --git a/tests/cases/failing/import_path-qualified-only.pre b/tests/cases/failing/import_path-qualified-only.pre new file mode 100644 index 0000000..b590bf5 --- /dev/null +++ b/tests/cases/failing/import_path-qualified-only.pre @@ -0,0 +1,8 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_hidden_target.pre") + +IMPORT_PATH(helper_path) + +ASSERT(EQ(hidden, 0d7)) \ No newline at end of file diff --git a/tests/cases/failing/import_path-type-bool.pre b/tests/cases/failing/import_path-type-bool.pre new file mode 100644 index 0000000..3ea3375 --- /dev/null +++ b/tests/cases/failing/import_path-type-bool.pre @@ -0,0 +1 @@ +IMPORT_PATH(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/import_path-type-flt.pre b/tests/cases/failing/import_path-type-flt.pre new file mode 100644 index 0000000..b162c2f --- /dev/null +++ b/tests/cases/failing/import_path-type-flt.pre @@ -0,0 +1 @@ +IMPORT_PATH(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/import_path-type-func.pre b/tests/cases/failing/import_path-type-func.pre new file mode 100644 index 0000000..a32a4d8 --- /dev/null +++ b/tests/cases/failing/import_path-type-func.pre @@ -0,0 +1 @@ +IMPORT_PATH(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/import_path-type-int.pre b/tests/cases/failing/import_path-type-int.pre new file mode 100644 index 0000000..2b9c5ed --- /dev/null +++ b/tests/cases/failing/import_path-type-int.pre @@ -0,0 +1 @@ +IMPORT_PATH(0d1) \ No newline at end of file diff --git a/tests/cases/failing/import_path-type-map.pre b/tests/cases/failing/import_path-type-map.pre new file mode 100644 index 0000000..db06cc2 --- /dev/null +++ b/tests/cases/failing/import_path-type-map.pre @@ -0,0 +1 @@ +IMPORT_PATH(<>) \ No newline at end of file diff --git a/tests/cases/failing/import_path-type-thr.pre b/tests/cases/failing/import_path-type-thr.pre new file mode 100644 index 0000000..02511a6 --- /dev/null +++ b/tests/cases/failing/import_path-type-thr.pre @@ -0,0 +1 @@ +IMPORT_PATH(ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/import_path-type-tns.pre b/tests/cases/failing/import_path-type-tns.pre new file mode 100644 index 0000000..3b13e1d --- /dev/null +++ b/tests/cases/failing/import_path-type-tns.pre @@ -0,0 +1 @@ +IMPORT_PATH([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/import_path-alias-qualified-namespace.pre b/tests/cases/passing/import_path-alias-qualified-namespace.pre new file mode 100644 index 0000000..18a1179 --- /dev/null +++ b/tests/cases/passing/import_path-alias-qualified-namespace.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +ASSERT(EQ(helper.identify(), "basic")) \ No newline at end of file diff --git a/tests/cases/passing/import_path-cached-alias.pre b/tests/cases/passing/import_path-cached-alias.pre new file mode 100644 index 0000000..e148d65 --- /dev/null +++ b/tests/cases/passing/import_path-cached-alias.pre @@ -0,0 +1,19 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_cache_target.pre") +STR: marker_path = path.TEMPFILE("prefix-import-path-cache-target.txt") + +IF(EXISTFILE(marker_path)){ + ASSERT(DELETEFILE(marker_path)) +} + +ASSERT(NOT(IMPORT_PATH(helper_path))) +ASSERT(NOT(IMPORT_PATH(helper_path, again))) + +STR: default_view = import_path_cache_target.marker_text() +STR: alias_view = again.marker_text() + +ASSERT(DELETEFILE(marker_path)) +ASSERT(EQ(default_view, "loaded")) +ASSERT(EQ(alias_view, "loaded")) \ No newline at end of file diff --git a/tests/cases/passing/import_path-default-basename.pre b/tests/cases/passing/import_path-default-basename.pre new file mode 100644 index 0000000..9ce4d65 --- /dev/null +++ b/tests/cases/passing/import_path-default-basename.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path))) +ASSERT(EQ(import_path_basic_target.identify(), "basic")) \ No newline at end of file diff --git a/tests/cases/passing/import_path-equivalent-path-cache.ps1 b/tests/cases/passing/import_path-equivalent-path-cache.ps1 new file mode 100644 index 0000000..8cbe4bc --- /dev/null +++ b/tests/cases/passing/import_path-equivalent-path-cache.ps1 @@ -0,0 +1,45 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$moduleName = 'prefiximportpath' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $markerPath = Join-Path $tempDir 'marker.txt' + $programPath = Join-Path $tempDir 'program.pre' + $modulePath = Join-Path $tempDir "$moduleName.pre" + $extensionlessPath = Join-Path $tempDir $moduleName + + $markerLiteral = $markerPath.Replace('\', '/') + $moduleLiteral = $modulePath.Replace('\', '\\') + $extensionlessLiteral = $extensionlessPath.Replace('\', '\\') + + Set-Content -Path $modulePath -Encoding Ascii -Value @" +STR: marker = "$markerLiteral" + +IF(EXISTFILE(marker)){ + WRITEFILE("reloaded", marker) +} ELSE { + WRITEFILE("loaded", marker) +} + +FUNC STR: marker_text(){ + RETURN(READFILE(marker)) +} +"@ + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT_PATH("$extensionlessLiteral") +IMPORT_PATH("$moduleLiteral", again) + +ASSERT(EQ($moduleName.marker_text(), "loaded")) +ASSERT(EQ(again.marker_text(), "loaded")) +"@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText '' + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import_path-isolated-top-level.pre b/tests/cases/passing/import_path-isolated-top-level.pre new file mode 100644 index 0000000..eaeecb9 --- /dev/null +++ b/tests/cases/passing/import_path-isolated-top-level.pre @@ -0,0 +1,10 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_isolated_target.pre") + +INT: shared = 0d11 + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +ASSERT(EQ(helper.read_shared(), 0d7)) +ASSERT(EQ(shared, 0d11)) \ No newline at end of file diff --git a/tests/cases/passing/import_path-no-companion-prex.pre b/tests/cases/passing/import_path-no-companion-prex.pre new file mode 100644 index 0000000..f2f26da --- /dev/null +++ b/tests/cases/passing/import_path-no-companion-prex.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_prex_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path))) +ASSERT(EQ(import_path_prex_target.identify(), "source")) \ No newline at end of file diff --git a/tests/cases/passing/import_path-package-init.ps1 b/tests/cases/passing/import_path-package-init.ps1 new file mode 100644 index 0000000..78af43e --- /dev/null +++ b/tests/cases/passing/import_path-package-init.ps1 @@ -0,0 +1,34 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$packageName = 'prefixpkg' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $programPath = Join-Path $tempDir 'program.pre' + $packageDir = Join-Path $tempDir $packageName + $initPath = Join-Path $packageDir 'init.pre' + + New-Item -ItemType Directory -Path $packageDir | Out-Null + + Set-Content -Path $initPath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("package") +} +'@ + + $packageLiteral = $packageDir.Replace('\', '\\') + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT_PATH("$packageLiteral") + +ASSERT(EQ($packageName.identify(), "package")) +"@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText '' + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import_path-package-missing-init-errors.ps1 b/tests/cases/passing/import_path-package-missing-init-errors.ps1 new file mode 100644 index 0000000..4195263 --- /dev/null +++ b/tests/cases/passing/import_path-package-missing-init-errors.ps1 @@ -0,0 +1,34 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$packageName = 'prefixpkg' + ([IO.Path]::GetRandomFileName().Replace('.', '')) + +try { + $programPath = Join-Path $tempDir 'program.pre' + $modulePath = Join-Path $tempDir "$packageName.pre" + $packageDir = Join-Path $tempDir $packageName + + New-Item -ItemType Directory -Path $packageDir | Out-Null + + Set-Content -Path $modulePath -Encoding Ascii -Value @' +FUNC STR: identify(){ + RETURN("module") +} +'@ + + $packageLiteral = $packageDir.Replace('\', '\\') + + Set-Content -Path $programPath -Encoding Ascii -Value @" +IMPORT_PATH("$packageLiteral") +"@ + + $result = Invoke-PrefixProgramWithInput -ProgramPath $programPath -InputText '' + if ($result.ExitCode -eq 0) { + $outputText = "STDOUT: $(Format-VisibleText $result.Stdout)`nSTDERR: $(Format-VisibleText $result.Stderr)" + throw "Expected IMPORT_PATH($packageLiteral) to fail when the package directory has no init.pre`n$outputText" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/import_path-return-false.pre b/tests/cases/passing/import_path-return-false.pre new file mode 100644 index 0000000..e4da408 --- /dev/null +++ b/tests/cases/passing/import_path-return-false.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/import_path_basic_target.pre") + +ASSERT(EQ(TYPE(IMPORT_PATH(helper_path)), "BOOL")) +ASSERT(NOT(IMPORT_PATH(helper_path))) \ No newline at end of file diff --git a/tests/helpers/import_path_basic_target.pre b/tests/helpers/import_path_basic_target.pre new file mode 100644 index 0000000..a88cda3 --- /dev/null +++ b/tests/helpers/import_path_basic_target.pre @@ -0,0 +1,3 @@ +FUNC STR: identify(){ + RETURN("basic") +} \ No newline at end of file diff --git a/tests/helpers/import_path_cache_target.pre b/tests/helpers/import_path_cache_target.pre new file mode 100644 index 0000000..f03c671 --- /dev/null +++ b/tests/helpers/import_path_cache_target.pre @@ -0,0 +1,13 @@ +IMPORT(path) + +STR: marker = path.TEMPFILE("prefix-import-path-cache-target.txt") + +IF(EXISTFILE(marker)){ + WRITEFILE("reloaded", marker) +} ELSE { + WRITEFILE("loaded", marker) +} + +FUNC STR: marker_text(){ + RETURN(READFILE(marker)) +} \ No newline at end of file diff --git a/tests/helpers/import_path_hidden_target.pre b/tests/helpers/import_path_hidden_target.pre new file mode 100644 index 0000000..7f46931 --- /dev/null +++ b/tests/helpers/import_path_hidden_target.pre @@ -0,0 +1 @@ +INT: hidden = 0d7 \ No newline at end of file diff --git a/tests/helpers/import_path_isolated_target.pre b/tests/helpers/import_path_isolated_target.pre new file mode 100644 index 0000000..32ca2d4 --- /dev/null +++ b/tests/helpers/import_path_isolated_target.pre @@ -0,0 +1,5 @@ +INT: shared = 0d7 + +FUNC INT: read_shared(){ + RETURN(shared) +} \ No newline at end of file diff --git a/tests/helpers/import_path_prex_target.pre b/tests/helpers/import_path_prex_target.pre new file mode 100644 index 0000000..9512936 --- /dev/null +++ b/tests/helpers/import_path_prex_target.pre @@ -0,0 +1,3 @@ +FUNC STR: identify(){ + RETURN("source") +} \ No newline at end of file diff --git a/tests/helpers/import_path_prex_target.prex b/tests/helpers/import_path_prex_target.prex new file mode 100644 index 0000000..046a4c4 --- /dev/null +++ b/tests/helpers/import_path_prex_target.prex @@ -0,0 +1 @@ +ignored companion pointer file \ No newline at end of file From 6cea7c0bde11e0d1865b6a6efc7bde36536c76c5 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Thu, 16 Apr 2026 17:45:50 -0400 Subject: [PATCH 41/60] Add tests for EXTEND. --- .../failing/extend-asmodule-not-qualified.pre | 8 ++ tests/cases/failing/extend-missing-file.pre | 1 + .../failing/extend-missing-init-symbol.pre | 6 + .../failing/extend-package-missing-init.pre | 6 + tests/cases/failing/extend-prex-rejected.pre | 6 + .../failing/extend-restricted-not-global.pre | 8 ++ .../extend-alias-qualified-namespace.pre | 10 ++ .../cases/passing/extend-asmodule-global.pre | 7 + tests/cases/passing/extend-cli-multiple.ps1 | 27 ++++ .../passing/extend-cli-prex-rejected.ps1 | 23 +++ .../cases/passing/extend-cli-repl-handler.ps1 | 28 ++++ tests/cases/passing/extend-event-handlers.ps1 | 40 ++++++ tests/cases/passing/extend-event-on-error.ps1 | 34 +++++ .../extend-explicit-suffix-rejected.ps1 | 29 ++++ tests/cases/passing/extend-idempotent.pre | 9 ++ tests/cases/passing/extend-package-init.pre | 8 ++ .../passing/extend-package-submodule.pre | 8 ++ tests/cases/passing/extend-periodic-hook.ps1 | 39 +++++ .../passing/extend-qualified-namespace.pre | 7 + tests/cases/passing/extend-return-false.pre | 9 ++ .../extend-search-cwd-before-roots.ps1 | 48 +++++++ .../extend-search-ext-std-before-ext-usr.ps1 | 49 +++++++ .../extend-search-lib-std-before-lib-usr.ps1 | 45 ++++++ .../extend-search-program-dir-first.ps1 | 58 ++++++++ tests/helpers/extend_core.c | 93 ++++++++++++ tests/helpers/extend_core_once.pre | 1 + tests/helpers/extend_core_twice.pre | 2 + tests/helpers/extend_hooks.c | 135 ++++++++++++++++++ tests/helpers/extend_missing_init.c | 3 + tests/helpers/extend_missing_init_loader.pre | 1 + .../helpers/extend_missing_package_loader.pre | 1 + tests/helpers/extend_package/init.c | 48 +++++++ tests/helpers/extend_package_loader.pre | 1 + tests/helpers/extend_prex_loader.pre | 1 + tests/helpers/extend_prex_only.prex | 1 + tests/helpers/extend_submodule_loader.pre | 1 + tests/helpers/extpackage/submod.c | 48 +++++++ tests/helpers/prefix-input.ps1 | 112 +++++++++++++-- tests/helpers/search_probe.c | 96 +++++++++++++ 39 files changed, 1048 insertions(+), 9 deletions(-) create mode 100644 tests/cases/failing/extend-asmodule-not-qualified.pre create mode 100644 tests/cases/failing/extend-missing-file.pre create mode 100644 tests/cases/failing/extend-missing-init-symbol.pre create mode 100644 tests/cases/failing/extend-package-missing-init.pre create mode 100644 tests/cases/failing/extend-prex-rejected.pre create mode 100644 tests/cases/failing/extend-restricted-not-global.pre create mode 100644 tests/cases/passing/extend-alias-qualified-namespace.pre create mode 100644 tests/cases/passing/extend-asmodule-global.pre create mode 100644 tests/cases/passing/extend-cli-multiple.ps1 create mode 100644 tests/cases/passing/extend-cli-prex-rejected.ps1 create mode 100644 tests/cases/passing/extend-cli-repl-handler.ps1 create mode 100644 tests/cases/passing/extend-event-handlers.ps1 create mode 100644 tests/cases/passing/extend-event-on-error.ps1 create mode 100644 tests/cases/passing/extend-explicit-suffix-rejected.ps1 create mode 100644 tests/cases/passing/extend-idempotent.pre create mode 100644 tests/cases/passing/extend-package-init.pre create mode 100644 tests/cases/passing/extend-package-submodule.pre create mode 100644 tests/cases/passing/extend-periodic-hook.ps1 create mode 100644 tests/cases/passing/extend-qualified-namespace.pre create mode 100644 tests/cases/passing/extend-return-false.pre create mode 100644 tests/cases/passing/extend-search-cwd-before-roots.ps1 create mode 100644 tests/cases/passing/extend-search-ext-std-before-ext-usr.ps1 create mode 100644 tests/cases/passing/extend-search-lib-std-before-lib-usr.ps1 create mode 100644 tests/cases/passing/extend-search-program-dir-first.ps1 create mode 100644 tests/helpers/extend_core.c create mode 100644 tests/helpers/extend_core_once.pre create mode 100644 tests/helpers/extend_core_twice.pre create mode 100644 tests/helpers/extend_hooks.c create mode 100644 tests/helpers/extend_missing_init.c create mode 100644 tests/helpers/extend_missing_init_loader.pre create mode 100644 tests/helpers/extend_missing_package_loader.pre create mode 100644 tests/helpers/extend_package/init.c create mode 100644 tests/helpers/extend_package_loader.pre create mode 100644 tests/helpers/extend_prex_loader.pre create mode 100644 tests/helpers/extend_prex_only.prex create mode 100644 tests/helpers/extend_submodule_loader.pre create mode 100644 tests/helpers/extpackage/submod.c create mode 100644 tests/helpers/search_probe.c diff --git a/tests/cases/failing/extend-asmodule-not-qualified.pre b/tests/cases/failing/extend-asmodule-not-qualified.pre new file mode 100644 index 0000000..860dea1 --- /dev/null +++ b/tests/cases/failing/extend-asmodule-not-qualified.pre @@ -0,0 +1,8 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_core_once.pre") + +IMPORT_PATH(helper_path, helper) + +helper.extend_core.TST_EXT_ASMODULE_ONLY() \ No newline at end of file diff --git a/tests/cases/failing/extend-missing-file.pre b/tests/cases/failing/extend-missing-file.pre new file mode 100644 index 0000000..f25fb75 --- /dev/null +++ b/tests/cases/failing/extend-missing-file.pre @@ -0,0 +1 @@ +EXTEND(prefix_missing_extension_target) \ No newline at end of file diff --git a/tests/cases/failing/extend-missing-init-symbol.pre b/tests/cases/failing/extend-missing-init-symbol.pre new file mode 100644 index 0000000..3756d3e --- /dev/null +++ b/tests/cases/failing/extend-missing-init-symbol.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_missing_init_loader.pre") + +IMPORT_PATH(helper_path) \ No newline at end of file diff --git a/tests/cases/failing/extend-package-missing-init.pre b/tests/cases/failing/extend-package-missing-init.pre new file mode 100644 index 0000000..f9cbc7b --- /dev/null +++ b/tests/cases/failing/extend-package-missing-init.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_missing_package_loader.pre") + +IMPORT_PATH(helper_path) \ No newline at end of file diff --git a/tests/cases/failing/extend-prex-rejected.pre b/tests/cases/failing/extend-prex-rejected.pre new file mode 100644 index 0000000..7603249 --- /dev/null +++ b/tests/cases/failing/extend-prex-rejected.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_prex_loader.pre") + +IMPORT_PATH(helper_path) \ No newline at end of file diff --git a/tests/cases/failing/extend-restricted-not-global.pre b/tests/cases/failing/extend-restricted-not-global.pre new file mode 100644 index 0000000..d539bdd --- /dev/null +++ b/tests/cases/failing/extend-restricted-not-global.pre @@ -0,0 +1,8 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_core_once.pre") + +IMPORT_PATH(helper_path, helper) + +TST_EXT_RESTRICTED() \ No newline at end of file diff --git a/tests/cases/passing/extend-alias-qualified-namespace.pre b/tests/cases/passing/extend-alias-qualified-namespace.pre new file mode 100644 index 0000000..9524ec3 --- /dev/null +++ b/tests/cases/passing/extend-alias-qualified-namespace.pre @@ -0,0 +1,10 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_core_once.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, first))) +ASSERT(NOT(IMPORT_PATH(helper_path, second))) +ASSERT(EQ(first.extend_core.TST_EXT_RESTRICTED(), "core-restricted")) +ASSERT(EQ(second.extend_core.TST_EXT_RESTRICTED(), "core-restricted")) +ASSERT(EQ(TST_EXT_INIT_COUNT(), 0d1)) \ No newline at end of file diff --git a/tests/cases/passing/extend-asmodule-global.pre b/tests/cases/passing/extend-asmodule-global.pre new file mode 100644 index 0000000..d9723ea --- /dev/null +++ b/tests/cases/passing/extend-asmodule-global.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_core_once.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +ASSERT(EQ(TST_EXT_ASMODULE_ONLY(), "asmodule-global")) \ No newline at end of file diff --git a/tests/cases/passing/extend-cli-multiple.ps1 b/tests/cases/passing/extend-cli-multiple.ps1 new file mode 100644 index 0000000..6da9bc6 --- /dev/null +++ b/tests/cases/passing/extend-cli-multiple.ps1 @@ -0,0 +1,27 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$coreExtension = Get-PrefixHelperExtensionPath 'extend_core' +$packageExtension = Get-PrefixHelperExtensionPath 'extend_package\init' + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +ASSERT(EQ(TST_EXT_GLOBAL(), "core-global")) +ASSERT(EQ(TST_EXT_PACKAGE_INIT(), "package-init")) +'@ + + $result = Invoke-PrefixWithArguments -Arguments @($coreExtension, $packageExtension, $programPath) + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if ($result.Stdout.Length -ne 0) { + $stdout = Format-VisibleText $result.Stdout + throw "Expected no stdout output, got: $stdout" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-cli-prex-rejected.ps1 b/tests/cases/passing/extend-cli-prex-rejected.ps1 new file mode 100644 index 0000000..0980bd0 --- /dev/null +++ b/tests/cases/passing/extend-cli-prex-rejected.ps1 @@ -0,0 +1,23 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$prexPath = Join-Path (Split-Path -Parent $helperPath) 'extend_prex_only.prex' + +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +ASSERT(TRUE) +'@ + + $result = Invoke-PrefixWithArguments -Arguments @($prexPath, $programPath) + if ($result.ExitCode -eq 0) { + $stdout = Format-VisibleText $result.Stdout + $stderr = Format-VisibleText $result.Stderr + throw "Expected the interpreter to reject a .prex CLI extension input`nSTDOUT: $stdout`nSTDERR: $stderr" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-cli-repl-handler.ps1 b/tests/cases/passing/extend-cli-repl-handler.ps1 new file mode 100644 index 0000000..4cefb6e --- /dev/null +++ b/tests/cases/passing/extend-cli-repl-handler.ps1 @@ -0,0 +1,28 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$hooksExtension = Get-PrefixHelperExtensionPath 'extend_hooks' + +try { + $replLogPath = Join-Path $tempDir 'repl.log' + + $result = Invoke-PrefixWithArguments -Arguments @($hooksExtension) -InputText ".exit`n" -EnvironmentVariables @{ + PREFIX_TEST_REPL_LOG = $replLogPath + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not (Test-Path $replLogPath)) { + throw 'Expected the replacement REPL handler to create its marker file' + } + + $marker = Get-Content -Path $replLogPath -Raw + if ($marker -ne 'repl-handler') { + throw "Unexpected REPL marker text: $marker" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-event-handlers.ps1 b/tests/cases/passing/extend-event-handlers.ps1 new file mode 100644 index 0000000..00f5b30 --- /dev/null +++ b/tests/cases/passing/extend-event-handlers.ps1 @@ -0,0 +1,40 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$hooksExtension = Get-PrefixHelperExtensionPath 'extend_hooks' + +try { + $eventLogPath = Join-Path $tempDir 'events.log' + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +FUNC INT: ping(){ + RETURN(0d1) +} + +ASSERT(EQ(TST_HOOKS_READY(), "hooks-ready")) +ASSERT(EQ(ping(), 0d1)) +'@ + + $result = Invoke-PrefixWithArguments -Arguments @($hooksExtension, $programPath) -EnvironmentVariables @{ + PREFIX_TEST_EVENT_LOG = $eventLogPath + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not (Test-Path $eventLogPath)) { + throw 'Expected the event-hook extension to create its log file' + } + + $events = Get-Content -Path $eventLogPath | Where-Object { $_.Length -gt 0 } + foreach ($expectedEvent in @('program_start', 'before_statement', 'after_statement', 'before_call', 'after_call', 'program_end')) { + if ($events -notcontains $expectedEvent) { + throw "Expected event '$expectedEvent' to appear in the hook log. Got: $($events -join ', ')" + } + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-event-on-error.ps1 b/tests/cases/passing/extend-event-on-error.ps1 new file mode 100644 index 0000000..297b571 --- /dev/null +++ b/tests/cases/passing/extend-event-on-error.ps1 @@ -0,0 +1,34 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$hooksExtension = Get-PrefixHelperExtensionPath 'extend_hooks' + +try { + $eventLogPath = Join-Path $tempDir 'events.log' + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +THROW("boom") +'@ + + $result = Invoke-PrefixWithArguments -Arguments @($hooksExtension, $programPath) -EnvironmentVariables @{ + PREFIX_TEST_EVENT_LOG = $eventLogPath + } + + if ($result.ExitCode -eq 0) { + throw 'Expected the program to fail so the on_error hook can run' + } + + if (-not (Test-Path $eventLogPath)) { + throw 'Expected the event-hook extension to create its log file' + } + + $events = Get-Content -Path $eventLogPath | Where-Object { $_.Length -gt 0 } + if ($events -notcontains 'on_error') { + throw "Expected event 'on_error' to appear in the hook log. Got: $($events -join ', ')" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-explicit-suffix-rejected.ps1 b/tests/cases/passing/extend-explicit-suffix-rejected.ps1 new file mode 100644 index 0000000..47a3156 --- /dev/null +++ b/tests/cases/passing/extend-explicit-suffix-rejected.ps1 @@ -0,0 +1,29 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$suffix = Get-PrefixExtensionSuffix +$coreExtension = Get-PrefixHelperExtensionPath 'extend_core' + +try { + $programPath = Join-Path $tempDir 'program.pre' + $stagedExtension = Join-Path $tempDir ("extend_core{0}" -f $suffix) + $extensionSpecifier = "extend_core{0}" -f $suffix + + Copy-Item -Path $coreExtension -Destination $stagedExtension -Force + + Set-Content -Path $programPath -Encoding Ascii -Value @" +BOOL: loaded = EXTEND($extensionSpecifier) +ASSERT(NOT(loaded)) +"@ + + $result = Invoke-PrefixWithArguments -Arguments @($programPath) + if ($result.ExitCode -eq 0) { + $stdout = Format-VisibleText $result.Stdout + $stderr = Format-VisibleText $result.Stderr + throw "Expected EXTEND to reject a suffix-qualified specifier`nSTDOUT: $stdout`nSTDERR: $stderr" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-idempotent.pre b/tests/cases/passing/extend-idempotent.pre new file mode 100644 index 0000000..7674951 --- /dev/null +++ b/tests/cases/passing/extend-idempotent.pre @@ -0,0 +1,9 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_core_twice.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +ASSERT(NOT(helper.first_result)) +ASSERT(NOT(helper.second_result)) +ASSERT(EQ(TST_EXT_INIT_COUNT(), 0d1)) \ No newline at end of file diff --git a/tests/cases/passing/extend-package-init.pre b/tests/cases/passing/extend-package-init.pre new file mode 100644 index 0000000..d676faf --- /dev/null +++ b/tests/cases/passing/extend-package-init.pre @@ -0,0 +1,8 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_package_loader.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +ASSERT(NOT(helper.extend_result)) +ASSERT(EQ(TST_EXT_PACKAGE_INIT(), "package-init")) \ No newline at end of file diff --git a/tests/cases/passing/extend-package-submodule.pre b/tests/cases/passing/extend-package-submodule.pre new file mode 100644 index 0000000..db893fd --- /dev/null +++ b/tests/cases/passing/extend-package-submodule.pre @@ -0,0 +1,8 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_submodule_loader.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +ASSERT(NOT(helper.extend_result)) +ASSERT(EQ(TST_EXT_PACKAGE_SUBMOD(), "package-submod")) \ No newline at end of file diff --git a/tests/cases/passing/extend-periodic-hook.ps1 b/tests/cases/passing/extend-periodic-hook.ps1 new file mode 100644 index 0000000..97cb820 --- /dev/null +++ b/tests/cases/passing/extend-periodic-hook.ps1 @@ -0,0 +1,39 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +$hooksExtension = Get-PrefixHelperExtensionPath 'extend_hooks' + +try { + $periodicLogPath = Join-Path $tempDir 'periodic.log' + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +INT: total = 0d0 + +FOR(i, 0d40){ + total = ADD(total, i) +} + +ASSERT(GT(total, 0d0)) +'@ + + $result = Invoke-PrefixWithArguments -Arguments @($hooksExtension, $programPath) -EnvironmentVariables @{ + PREFIX_TEST_PERIODIC_LOG = $periodicLogPath + } + + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + if (-not (Test-Path $periodicLogPath)) { + throw 'Expected the periodic-hook extension to create its log file' + } + + $ticks = Get-Content -Path $periodicLogPath | Where-Object { $_ -eq 'periodic' } + if ($ticks.Count -lt 2) { + throw "Expected at least two periodic hook executions, got $($ticks.Count)" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-qualified-namespace.pre b/tests/cases/passing/extend-qualified-namespace.pre new file mode 100644 index 0000000..20f1ba8 --- /dev/null +++ b/tests/cases/passing/extend-qualified-namespace.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_core_once.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +ASSERT(EQ(helper.extend_core.TST_EXT_RESTRICTED(), "core-restricted")) \ No newline at end of file diff --git a/tests/cases/passing/extend-return-false.pre b/tests/cases/passing/extend-return-false.pre new file mode 100644 index 0000000..5c7a1d8 --- /dev/null +++ b/tests/cases/passing/extend-return-false.pre @@ -0,0 +1,9 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/extend_core_once.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +ASSERT(EQ(TYPE(helper.extend_result), "BOOL")) +ASSERT(NOT(helper.extend_result)) +ASSERT(EQ(TST_EXT_GLOBAL(), "core-global")) \ No newline at end of file diff --git a/tests/cases/passing/extend-search-cwd-before-roots.ps1 b/tests/cases/passing/extend-search-cwd-before-roots.ps1 new file mode 100644 index 0000000..f9bee21 --- /dev/null +++ b/tests/cases/passing/extend-search-cwd-before-roots.ps1 @@ -0,0 +1,48 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$prefixDir = Get-PrefixRootPath +$tempDir = New-PrefixTempDir +$cwdDir = Join-Path $tempDir 'cwd' +$suffix = Get-PrefixExtensionSuffix +$probeSource = Get-PrefixHelperExtensionPath 'search_probe' +$stagedPaths = @() + +function Add-StagedProbe([string]$Destination) { + Copy-Item -Path $probeSource -Destination $Destination -Force + $script:stagedPaths += $Destination +} + +try { + New-Item -ItemType Directory -Path $cwdDir | Out-Null + + $cwdProbe = Join-Path $cwdDir ("search_probe{0}" -f $suffix) + $extStdProbe = Join-Path (Join-Path $prefixDir 'ext\std') ("search_probe{0}" -f $suffix) + $extUsrProbe = Join-Path (Join-Path $prefixDir 'ext\usr') ("search_probe{0}" -f $suffix) + $libStdProbe = Join-Path (Join-Path $prefixDir 'lib\std') ("search_probe{0}" -f $suffix) + $libUsrProbe = Join-Path (Join-Path $prefixDir 'lib\usr') ("search_probe{0}" -f $suffix) + + Add-StagedProbe $cwdProbe + Add-StagedProbe $extStdProbe + Add-StagedProbe $extUsrProbe + Add-StagedProbe $libStdProbe + Add-StagedProbe $libUsrProbe + + $sourceText = 'BOOL:loaded=EXTEND(search_probe);ASSERT(NOT(loaded));PRINT(TST_SEARCH_PROBE_PATH())' + $result = Invoke-PrefixWithArguments -Arguments @('-source', $sourceText) -WorkingDirectory $cwdDir + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + $actualPath = $result.Stdout.Trim() + $expectedPath = [IO.Path]::GetFullPath($cwdProbe) + if ([IO.Path]::GetFullPath($actualPath).ToLowerInvariant() -ne $expectedPath.ToLowerInvariant()) { + throw "Expected EXTEND to resolve from the current working directory in -source mode`nExpected: $expectedPath`nActual: $actualPath" + } +} +finally { + foreach ($stagedPath in $stagedPaths) { + Remove-Item -Path $stagedPath -Force -ErrorAction SilentlyContinue + } + + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-search-ext-std-before-ext-usr.ps1 b/tests/cases/passing/extend-search-ext-std-before-ext-usr.ps1 new file mode 100644 index 0000000..7646353 --- /dev/null +++ b/tests/cases/passing/extend-search-ext-std-before-ext-usr.ps1 @@ -0,0 +1,49 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$prefixDir = Get-PrefixRootPath +$tempDir = New-PrefixTempDir +$suffix = Get-PrefixExtensionSuffix +$probeSource = Get-PrefixHelperExtensionPath 'search_probe' +$stagedPaths = @() + +function Add-StagedProbe([string]$Destination) { + Copy-Item -Path $probeSource -Destination $Destination -Force + $script:stagedPaths += $Destination +} + +try { + $programPath = Join-Path $tempDir 'program.pre' + $extStdProbe = Join-Path (Join-Path $prefixDir 'ext\std') ("search_probe{0}" -f $suffix) + $extUsrProbe = Join-Path (Join-Path $prefixDir 'ext\usr') ("search_probe{0}" -f $suffix) + $libStdProbe = Join-Path (Join-Path $prefixDir 'lib\std') ("search_probe{0}" -f $suffix) + $libUsrProbe = Join-Path (Join-Path $prefixDir 'lib\usr') ("search_probe{0}" -f $suffix) + + Add-StagedProbe $extStdProbe + Add-StagedProbe $extUsrProbe + Add-StagedProbe $libStdProbe + Add-StagedProbe $libUsrProbe + + Set-Content -Path $programPath -Encoding Ascii -Value @' +BOOL: loaded = EXTEND(search_probe) +ASSERT(NOT(loaded)) +PRINT(TST_SEARCH_PROBE_PATH()) +'@ + + $result = Invoke-PrefixWithArguments -Arguments @($programPath) + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + $actualPath = $result.Stdout.Trim() + $expectedPath = [IO.Path]::GetFullPath($extStdProbe) + if ([IO.Path]::GetFullPath($actualPath).ToLowerInvariant() -ne $expectedPath.ToLowerInvariant()) { + throw "Expected EXTEND to prefer ext/std over later roots`nExpected: $expectedPath`nActual: $actualPath" + } +} +finally { + foreach ($stagedPath in $stagedPaths) { + Remove-Item -Path $stagedPath -Force -ErrorAction SilentlyContinue + } + + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-search-lib-std-before-lib-usr.ps1 b/tests/cases/passing/extend-search-lib-std-before-lib-usr.ps1 new file mode 100644 index 0000000..8be19ba --- /dev/null +++ b/tests/cases/passing/extend-search-lib-std-before-lib-usr.ps1 @@ -0,0 +1,45 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$prefixDir = Get-PrefixRootPath +$tempDir = New-PrefixTempDir +$suffix = Get-PrefixExtensionSuffix +$probeSource = Get-PrefixHelperExtensionPath 'search_probe' +$stagedPaths = @() + +function Add-StagedProbe([string]$Destination) { + Copy-Item -Path $probeSource -Destination $Destination -Force + $script:stagedPaths += $Destination +} + +try { + $programPath = Join-Path $tempDir 'program.pre' + $libStdProbe = Join-Path (Join-Path $prefixDir 'lib\std') ("search_probe{0}" -f $suffix) + $libUsrProbe = Join-Path (Join-Path $prefixDir 'lib\usr') ("search_probe{0}" -f $suffix) + + Add-StagedProbe $libStdProbe + Add-StagedProbe $libUsrProbe + + Set-Content -Path $programPath -Encoding Ascii -Value @' +BOOL: loaded = EXTEND(search_probe) +ASSERT(NOT(loaded)) +PRINT(TST_SEARCH_PROBE_PATH()) +'@ + + $result = Invoke-PrefixWithArguments -Arguments @($programPath) + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + $actualPath = $result.Stdout.Trim() + $expectedPath = [IO.Path]::GetFullPath($libStdProbe) + if ([IO.Path]::GetFullPath($actualPath).ToLowerInvariant() -ne $expectedPath.ToLowerInvariant()) { + throw "Expected EXTEND to prefer lib/std over lib/usr when ext roots are absent`nExpected: $expectedPath`nActual: $actualPath" + } +} +finally { + foreach ($stagedPath in $stagedPaths) { + Remove-Item -Path $stagedPath -Force -ErrorAction SilentlyContinue + } + + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/cases/passing/extend-search-program-dir-first.ps1 b/tests/cases/passing/extend-search-program-dir-first.ps1 new file mode 100644 index 0000000..0b99c14 --- /dev/null +++ b/tests/cases/passing/extend-search-program-dir-first.ps1 @@ -0,0 +1,58 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$prefixDir = Get-PrefixRootPath +$tempDir = New-PrefixTempDir +$programDir = Join-Path $tempDir 'program' +$cwdDir = Join-Path $tempDir 'cwd' +$suffix = Get-PrefixExtensionSuffix +$probeSource = Get-PrefixHelperExtensionPath 'search_probe' +$stagedPaths = @() + +function Add-StagedProbe([string]$Destination) { + Copy-Item -Path $probeSource -Destination $Destination -Force + $script:stagedPaths += $Destination +} + +try { + New-Item -ItemType Directory -Path $programDir | Out-Null + New-Item -ItemType Directory -Path $cwdDir | Out-Null + + $programPath = Join-Path $programDir 'program.pre' + $programProbe = Join-Path $programDir ("search_probe{0}" -f $suffix) + $cwdProbe = Join-Path $cwdDir ("search_probe{0}" -f $suffix) + $extStdProbe = Join-Path (Join-Path $prefixDir 'ext\std') ("search_probe{0}" -f $suffix) + $extUsrProbe = Join-Path (Join-Path $prefixDir 'ext\usr') ("search_probe{0}" -f $suffix) + $libStdProbe = Join-Path (Join-Path $prefixDir 'lib\std') ("search_probe{0}" -f $suffix) + $libUsrProbe = Join-Path (Join-Path $prefixDir 'lib\usr') ("search_probe{0}" -f $suffix) + + Add-StagedProbe $programProbe + Add-StagedProbe $cwdProbe + Add-StagedProbe $extStdProbe + Add-StagedProbe $extUsrProbe + Add-StagedProbe $libStdProbe + Add-StagedProbe $libUsrProbe + + Set-Content -Path $programPath -Encoding Ascii -Value @' +BOOL: loaded = EXTEND(search_probe) +ASSERT(NOT(loaded)) +PRINT(TST_SEARCH_PROBE_PATH()) +'@ + + $result = Invoke-PrefixWithArguments -Arguments @($programPath) -WorkingDirectory $cwdDir + Assert-PrefixSuccess $result + Assert-NoErrorOutput $result + + $actualPath = $result.Stdout.Trim() + $expectedPath = [IO.Path]::GetFullPath($programProbe) + if ([IO.Path]::GetFullPath($actualPath).ToLowerInvariant() -ne $expectedPath.ToLowerInvariant()) { + throw "Expected EXTEND to resolve from the program directory`nExpected: $expectedPath`nActual: $actualPath" + } +} +finally { + foreach ($stagedPath in $stagedPaths) { + Remove-Item -Path $stagedPath -Force -ErrorAction SilentlyContinue + } + + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/tests/helpers/extend_core.c b/tests/helpers/extend_core.c new file mode 100644 index 0000000..af68120 --- /dev/null +++ b/tests/helpers/extend_core.c @@ -0,0 +1,93 @@ +#include "../../src/prefix_extension.h" +#include "../../src/interpreter.h" + +#include +#include +#include + +#ifdef _MSC_VER +#define strdup _strdup +#endif + +static void set_runtime_error(Interpreter* interp, const char* msg, int line, int col) { + if (!interp) return; + if (interp->error) free(interp->error); + interp->error = msg ? strdup(msg) : NULL; + interp->error_line = line; + interp->error_col = col; +} + +static int expect_argc_eq(Interpreter* interp, + int argc, + int expected, + const char* opname, + int line, + int col) { + if (argc == expected) return 1; + + char buf[160]; + snprintf(buf, sizeof(buf), "%s expects %d argument%s", opname, expected, expected == 1 ? "" : "s"); + set_runtime_error(interp, buf, line, col); + return 0; +} + +static int g_init_count = 0; +static int g_api_version = -1; + +static Value op_tst_ext_global(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_EXT_GLOBAL", line, col)) return value_null(); + return value_str("core-global"); +} + +static Value op_tst_ext_init_count(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_EXT_INIT_COUNT", line, col)) return value_null(); + return value_int(g_init_count); +} + +static Value op_tst_ext_api_version(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_EXT_API_VERSION", line, col)) return value_null(); + return value_int(g_api_version); +} + +static Value op_tst_ext_restricted(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_EXT_RESTRICTED", line, col)) return value_null(); + return value_str("core-restricted"); +} + +static Value op_tst_ext_asmodule_only(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_EXT_ASMODULE_ONLY", line, col)) return value_null(); + return value_str("asmodule-global"); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void prefix_extension_init(prefix_ext_context* ctx) { + if (!ctx) return; + + g_init_count += 1; + g_api_version = ctx->api_version; + + ctx->register_operator("TST_EXT_GLOBAL", op_tst_ext_global, 0); + ctx->register_operator("TST_EXT_INIT_COUNT", op_tst_ext_init_count, 0); + ctx->register_operator("TST_EXT_API_VERSION", op_tst_ext_api_version, 0); + ctx->register_operator("TST_EXT_RESTRICTED", op_tst_ext_restricted, + PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED); + ctx->register_operator("TST_EXT_ASMODULE_ONLY", op_tst_ext_asmodule_only, + PREFIX_EXTENSION_ASMODULE); +} \ No newline at end of file diff --git a/tests/helpers/extend_core_once.pre b/tests/helpers/extend_core_once.pre new file mode 100644 index 0000000..fffe700 --- /dev/null +++ b/tests/helpers/extend_core_once.pre @@ -0,0 +1 @@ +BOOL: extend_result = EXTEND(extend_core) \ No newline at end of file diff --git a/tests/helpers/extend_core_twice.pre b/tests/helpers/extend_core_twice.pre new file mode 100644 index 0000000..616c739 --- /dev/null +++ b/tests/helpers/extend_core_twice.pre @@ -0,0 +1,2 @@ +BOOL: first_result = EXTEND(extend_core) +BOOL: second_result = EXTEND(extend_core) \ No newline at end of file diff --git a/tests/helpers/extend_hooks.c b/tests/helpers/extend_hooks.c new file mode 100644 index 0000000..29e0ede --- /dev/null +++ b/tests/helpers/extend_hooks.c @@ -0,0 +1,135 @@ +#include "../../src/prefix_extension.h" +#include "../../src/interpreter.h" + +#include +#include +#include + +#ifdef _MSC_VER +#define strdup _strdup +#endif + +static void set_runtime_error(Interpreter* interp, const char* msg, int line, int col) { + if (!interp) return; + if (interp->error) free(interp->error); + interp->error = msg ? strdup(msg) : NULL; + interp->error_line = line; + interp->error_col = col; +} + +static int expect_argc_eq(Interpreter* interp, + int argc, + int expected, + const char* opname, + int line, + int col) { + if (argc == expected) return 1; + + char buf[160]; + snprintf(buf, sizeof(buf), "%s expects %d argument%s", opname, expected, expected == 1 ? "" : "s"); + set_runtime_error(interp, buf, line, col); + return 0; +} + +static char* dup_env(const char* name) { + const char* value = getenv(name); + return value ? strdup(value) : NULL; +} + +static FILE* open_file(const char* path, const char* mode) { + if (!path || !mode) return NULL; + +#ifdef _MSC_VER + FILE* file = NULL; + if (fopen_s(&file, path, mode) != 0) { + return NULL; + } + return file; +#else + return fopen(path, mode); +#endif +} + +static void write_text(const char* path, const char* text) { + FILE* file; + + if (!path) return; + file = open_file(path, "wb"); + if (!file) return; + + if (text && text[0] != '\0') { + fwrite(text, 1, strlen(text), file); + } + fclose(file); +} + +static void append_text(const char* path, const char* text) { + FILE* file; + + if (!path || !text) return; + file = open_file(path, "ab"); + if (!file) return; + + fwrite(text, 1, strlen(text), file); + fclose(file); +} + +static void append_line(const char* path, const char* text) { + if (!path || !text) return; + append_text(path, text); + append_text(path, "\n"); +} + +static char* g_event_log_path = NULL; +static char* g_periodic_log_path = NULL; +static char* g_repl_log_path = NULL; + +static void hook_log_event(Interpreter* interp, const char* event_name) { + (void)interp; + if (!g_event_log_path || !event_name || event_name[0] == '\0') return; + append_line(g_event_log_path, event_name); +} + +static void hook_log_periodic(Interpreter* interp, const char* event_name) { + (void)interp; + (void)event_name; + if (!g_periodic_log_path) return; + append_line(g_periodic_log_path, "periodic"); +} + +static int hook_run_repl(void) { + if (g_repl_log_path) { + write_text(g_repl_log_path, "repl-handler"); + } + return 0; +} + +static Value op_tst_hooks_ready(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_HOOKS_READY", line, col)) return value_null(); + return value_str("hooks-ready"); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void prefix_extension_init(prefix_ext_context* ctx) { + if (!ctx) return; + + if (!g_event_log_path) g_event_log_path = dup_env("PREFIX_TEST_EVENT_LOG"); + if (!g_periodic_log_path) g_periodic_log_path = dup_env("PREFIX_TEST_PERIODIC_LOG"); + if (!g_repl_log_path) g_repl_log_path = dup_env("PREFIX_TEST_REPL_LOG"); + + ctx->register_operator("TST_HOOKS_READY", op_tst_hooks_ready, 0); + ctx->register_event_handler("program_start", hook_log_event); + ctx->register_event_handler("program_end", hook_log_event); + ctx->register_event_handler("on_error", hook_log_event); + ctx->register_event_handler("before_statement", hook_log_event); + ctx->register_event_handler("after_statement", hook_log_event); + ctx->register_event_handler("before_call", hook_log_event); + ctx->register_event_handler("after_call", hook_log_event); + ctx->register_periodic_hook(3, hook_log_periodic); + ctx->register_repl_handler(hook_run_repl); +} \ No newline at end of file diff --git a/tests/helpers/extend_missing_init.c b/tests/helpers/extend_missing_init.c new file mode 100644 index 0000000..ed92070 --- /dev/null +++ b/tests/helpers/extend_missing_init.c @@ -0,0 +1,3 @@ +int extend_missing_init_dummy(void) { + return 7; +} \ No newline at end of file diff --git a/tests/helpers/extend_missing_init_loader.pre b/tests/helpers/extend_missing_init_loader.pre new file mode 100644 index 0000000..8774708 --- /dev/null +++ b/tests/helpers/extend_missing_init_loader.pre @@ -0,0 +1 @@ +BOOL: extend_result = EXTEND(extend_missing_init) \ No newline at end of file diff --git a/tests/helpers/extend_missing_package_loader.pre b/tests/helpers/extend_missing_package_loader.pre new file mode 100644 index 0000000..bc9d572 --- /dev/null +++ b/tests/helpers/extend_missing_package_loader.pre @@ -0,0 +1 @@ +BOOL: extend_result = EXTEND(exttree) \ No newline at end of file diff --git a/tests/helpers/extend_package/init.c b/tests/helpers/extend_package/init.c new file mode 100644 index 0000000..68ced2a --- /dev/null +++ b/tests/helpers/extend_package/init.c @@ -0,0 +1,48 @@ +#include "../../../src/prefix_extension.h" +#include "../../../src/interpreter.h" + +#include +#include +#include + +#ifdef _MSC_VER +#define strdup _strdup +#endif + +static void set_runtime_error(Interpreter* interp, const char* msg, int line, int col) { + if (!interp) return; + if (interp->error) free(interp->error); + interp->error = msg ? strdup(msg) : NULL; + interp->error_line = line; + interp->error_col = col; +} + +static int expect_argc_eq(Interpreter* interp, + int argc, + int expected, + const char* opname, + int line, + int col) { + if (argc == expected) return 1; + + char buf[160]; + snprintf(buf, sizeof(buf), "%s expects %d argument%s", opname, expected, expected == 1 ? "" : "s"); + set_runtime_error(interp, buf, line, col); + return 0; +} + +static Value op_tst_ext_package_init(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_EXT_PACKAGE_INIT", line, col)) return value_null(); + return value_str("package-init"); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void prefix_extension_init(prefix_ext_context* ctx) { + if (!ctx) return; + ctx->register_operator("TST_EXT_PACKAGE_INIT", op_tst_ext_package_init, 0); +} \ No newline at end of file diff --git a/tests/helpers/extend_package_loader.pre b/tests/helpers/extend_package_loader.pre new file mode 100644 index 0000000..077132b --- /dev/null +++ b/tests/helpers/extend_package_loader.pre @@ -0,0 +1 @@ +BOOL: extend_result = EXTEND(extend_package) \ No newline at end of file diff --git a/tests/helpers/extend_prex_loader.pre b/tests/helpers/extend_prex_loader.pre new file mode 100644 index 0000000..5a468cc --- /dev/null +++ b/tests/helpers/extend_prex_loader.pre @@ -0,0 +1 @@ +BOOL: extend_result = EXTEND(extend_prex_only) \ No newline at end of file diff --git a/tests/helpers/extend_prex_only.prex b/tests/helpers/extend_prex_only.prex new file mode 100644 index 0000000..1141c16 --- /dev/null +++ b/tests/helpers/extend_prex_only.prex @@ -0,0 +1 @@ +this pointer file must never be loaded by EXTEND \ No newline at end of file diff --git a/tests/helpers/extend_submodule_loader.pre b/tests/helpers/extend_submodule_loader.pre new file mode 100644 index 0000000..d43794a --- /dev/null +++ b/tests/helpers/extend_submodule_loader.pre @@ -0,0 +1 @@ +BOOL: extend_result = EXTEND(extpackage..submod) \ No newline at end of file diff --git a/tests/helpers/extpackage/submod.c b/tests/helpers/extpackage/submod.c new file mode 100644 index 0000000..c24325d --- /dev/null +++ b/tests/helpers/extpackage/submod.c @@ -0,0 +1,48 @@ +#include "../../../src/prefix_extension.h" +#include "../../../src/interpreter.h" + +#include +#include +#include + +#ifdef _MSC_VER +#define strdup _strdup +#endif + +static void set_runtime_error(Interpreter* interp, const char* msg, int line, int col) { + if (!interp) return; + if (interp->error) free(interp->error); + interp->error = msg ? strdup(msg) : NULL; + interp->error_line = line; + interp->error_col = col; +} + +static int expect_argc_eq(Interpreter* interp, + int argc, + int expected, + const char* opname, + int line, + int col) { + if (argc == expected) return 1; + + char buf[160]; + snprintf(buf, sizeof(buf), "%s expects %d argument%s", opname, expected, expected == 1 ? "" : "s"); + set_runtime_error(interp, buf, line, col); + return 0; +} + +static Value op_tst_ext_package_submod(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_EXT_PACKAGE_SUBMOD", line, col)) return value_null(); + return value_str("package-submod"); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void prefix_extension_init(prefix_ext_context* ctx) { + if (!ctx) return; + ctx->register_operator("TST_EXT_PACKAGE_SUBMOD", op_tst_ext_package_submod, 0); +} \ No newline at end of file diff --git a/tests/helpers/prefix-input.ps1 b/tests/helpers/prefix-input.ps1 index de0c019..ae92f0a 100644 --- a/tests/helpers/prefix-input.ps1 +++ b/tests/helpers/prefix-input.ps1 @@ -10,45 +10,126 @@ function Get-PrefixExePath { return $exePath } +function Get-PrefixRootPath { + $testsDir = Split-Path -Parent $PSScriptRoot + return (Split-Path -Parent $testsDir) +} + +function Get-PrefixExtensionSuffix { + $platform = [System.Runtime.InteropServices.RuntimeInformation] + + if ($platform::IsOSPlatform([System.Runtime.InteropServices.OSPlatform]::Linux)) { + return '.so' + } + + if ($platform::IsOSPlatform([System.Runtime.InteropServices.OSPlatform]::OSX)) { + return '.dylib' + } + + return '.dll' +} + +function Get-PrefixHelperExtensionPath { + param( + [Parameter(Mandatory = $true)] + [string]$RelativePath + ) + + $artifactPath = Join-Path $PSScriptRoot ($RelativePath + (Get-PrefixExtensionSuffix)) + if (-not (Test-Path $artifactPath)) { + throw "Helper extension artifact not found at: $artifactPath" + } + + return $artifactPath +} + function New-PrefixTempDir { $tempDir = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) New-Item -ItemType Directory -Path $tempDir | Out-Null return $tempDir } -function Start-PrefixProcess { +function ConvertTo-PrefixArgumentString { param( [Parameter(Mandatory = $true)] - [string]$ProgramPath + [string[]]$Arguments ) - if (-not (Test-Path $ProgramPath)) { - throw "Program not found at: $ProgramPath" + $escaped = foreach ($argument in $Arguments) { + if ($null -eq $argument) { + '""' + continue + } + + '"{0}"' -f ($argument.Replace('"', '\"')) } + return ($escaped -join ' ') +} + +function Start-PrefixProcessWithArguments { + param( + [Parameter(Mandatory = $true)] + [string[]]$Arguments, + + [string]$WorkingDirectory, + + [hashtable]$EnvironmentVariables + ) + $startInfo = New-Object System.Diagnostics.ProcessStartInfo $startInfo.FileName = Get-PrefixExePath - $startInfo.Arguments = ('"{0}"' -f $ProgramPath) + $startInfo.Arguments = ConvertTo-PrefixArgumentString -Arguments $Arguments $startInfo.RedirectStandardInput = $true $startInfo.RedirectStandardOutput = $true $startInfo.RedirectStandardError = $true $startInfo.UseShellExecute = $false $startInfo.CreateNoWindow = $true + if ($WorkingDirectory) { + $startInfo.WorkingDirectory = $WorkingDirectory + } + + if ($EnvironmentVariables) { + foreach ($entry in $EnvironmentVariables.GetEnumerator()) { + if ($null -eq $entry.Value) { + [void]$startInfo.EnvironmentVariables.Remove($entry.Key) + } else { + $startInfo.EnvironmentVariables[$entry.Key] = [string]$entry.Value + } + } + } + return [System.Diagnostics.Process]::Start($startInfo) } -function Invoke-PrefixProgramWithInput { +function Start-PrefixProcess { param( [Parameter(Mandatory = $true)] - [string]$ProgramPath, + [string]$ProgramPath + ) + + if (-not (Test-Path $ProgramPath)) { + throw "Program not found at: $ProgramPath" + } + + return Start-PrefixProcessWithArguments -Arguments @($ProgramPath) +} +function Invoke-PrefixWithArguments { + param( [Parameter(Mandatory = $true)] + [string[]]$Arguments, + [AllowEmptyString()] - [string]$InputText + [string]$InputText = '', + + [string]$WorkingDirectory, + + [hashtable]$EnvironmentVariables ) - $process = Start-PrefixProcess -ProgramPath $ProgramPath + $process = Start-PrefixProcessWithArguments -Arguments $Arguments -WorkingDirectory $WorkingDirectory -EnvironmentVariables $EnvironmentVariables try { $process.StandardInput.Write($InputText) $process.StandardInput.Close() @@ -68,6 +149,19 @@ function Invoke-PrefixProgramWithInput { } } +function Invoke-PrefixProgramWithInput { + param( + [Parameter(Mandatory = $true)] + [string]$ProgramPath, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [string]$InputText + ) + + return Invoke-PrefixWithArguments -Arguments @($ProgramPath) -InputText $InputText +} + function Format-VisibleText([string]$Text) { return $Text.Replace("`r", '\r').Replace("`n", '\n') } diff --git a/tests/helpers/search_probe.c b/tests/helpers/search_probe.c new file mode 100644 index 0000000..683f70d --- /dev/null +++ b/tests/helpers/search_probe.c @@ -0,0 +1,96 @@ +#include "../../src/prefix_extension.h" +#include "../../src/interpreter.h" + +#include +#include +#include + +#ifdef _MSC_VER +#define strdup _strdup +#endif + +#ifdef _WIN32 +#define PREFIX_TEST_EXPORT __declspec(dllexport) +#else +#define PREFIX_TEST_EXPORT +#endif + +#ifdef _WIN32 +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#include +#endif + +static char* g_library_path = NULL; + +PREFIX_TEST_EXPORT void prefix_extension_init(prefix_ext_context* ctx); + +static void set_runtime_error(Interpreter* interp, const char* msg, int line, int col) { + if (!interp) return; + if (interp->error) free(interp->error); + interp->error = msg ? strdup(msg) : NULL; + interp->error_line = line; + interp->error_col = col; +} + +static int expect_argc_eq(Interpreter* interp, + int argc, + int expected, + const char* opname, + int line, + int col) { + if (argc == expected) return 1; + + char buf[160]; + snprintf(buf, sizeof(buf), "%s expects %d argument%s", opname, expected, expected == 1 ? "" : "s"); + set_runtime_error(interp, buf, line, col); + return 0; +} + +static char* capture_library_path(void) { +#ifdef _WIN32 + HMODULE module = NULL; + char buffer[4096]; + DWORD length = 0; + + if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + (LPCSTR)(const void*)&prefix_extension_init, + &module)) { + return NULL; + } + + length = GetModuleFileNameA(module, buffer, (DWORD)sizeof(buffer)); + if (length == 0 || length >= (DWORD)sizeof(buffer)) { + return NULL; + } + + return strdup(buffer); +#else + Dl_info info; + if (dladdr((void*)&prefix_extension_init, &info) == 0 || !info.dli_fname) { + return NULL; + } + return strdup(info.dli_fname); +#endif +} + +static Value op_tst_search_probe_path(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) { + (void)args; + (void)arg_nodes; + (void)env; + if (!expect_argc_eq(interp, argc, 0, "TST_SEARCH_PROBE_PATH", line, col)) return value_null(); + return value_str(g_library_path ? g_library_path : ""); +} + +PREFIX_TEST_EXPORT void prefix_extension_init(prefix_ext_context* ctx) { + if (!ctx) return; + + if (!g_library_path) { + g_library_path = capture_library_path(); + } + + ctx->register_operator("TST_SEARCH_PROBE_PATH", op_tst_search_probe_path, 0); +} \ No newline at end of file From 9114f6a56b394180b6a5ab25de69540d63438720 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Fri, 17 Apr 2026 00:14:32 -0400 Subject: [PATCH 42/60] Add tests for EXPORT. --- tests/cases/failing/export-arity-one.pre | 2 ++ tests/cases/failing/export-arity-three.pre | 2 ++ tests/cases/failing/export-arity-zero.pre | 1 + .../failing/export-declared-only-symbol.pre | 9 +++++++++ tests/cases/failing/export-deleted-symbol.pre | 10 ++++++++++ tests/cases/failing/export-module-type-bool.pre | 2 ++ tests/cases/failing/export-module-type-flt.pre | 2 ++ tests/cases/failing/export-module-type-func.pre | 2 ++ tests/cases/failing/export-module-type-int.pre | 2 ++ tests/cases/failing/export-module-type-map.pre | 2 ++ tests/cases/failing/export-module-type-str.pre | 2 ++ tests/cases/failing/export-module-type-thr.pre | 2 ++ tests/cases/failing/export-module-type-tns.pre | 2 ++ tests/cases/failing/export-symbol-type-bool.pre | 7 +++++++ tests/cases/failing/export-symbol-type-flt.pre | 7 +++++++ tests/cases/failing/export-symbol-type-func.pre | 7 +++++++ tests/cases/failing/export-symbol-type-int.pre | 7 +++++++ tests/cases/failing/export-symbol-type-map.pre | 7 +++++++ tests/cases/failing/export-symbol-type-str.pre | 7 +++++++ tests/cases/failing/export-symbol-type-thr.pre | 7 +++++++ tests/cases/failing/export-symbol-type-tns.pre | 7 +++++++ tests/cases/failing/export-undeclared-symbol.pre | 7 +++++++ tests/cases/failing/export-unimported-module.pre | 2 ++ .../cases/passing/export-alias-shared-module.pre | 15 +++++++++++++++ tests/cases/passing/export-copy-map.pre | 16 ++++++++++++++++ tests/cases/passing/export-copy-tensor.pre | 16 ++++++++++++++++ tests/cases/passing/export-qualified-call.pre | 8 ++++++++ tests/cases/passing/export-return-false.pre | 13 +++++++++++++ tests/helpers/export_target.pre | 15 +++++++++++++++ 29 files changed, 188 insertions(+) create mode 100644 tests/cases/failing/export-arity-one.pre create mode 100644 tests/cases/failing/export-arity-three.pre create mode 100644 tests/cases/failing/export-arity-zero.pre create mode 100644 tests/cases/failing/export-declared-only-symbol.pre create mode 100644 tests/cases/failing/export-deleted-symbol.pre create mode 100644 tests/cases/failing/export-module-type-bool.pre create mode 100644 tests/cases/failing/export-module-type-flt.pre create mode 100644 tests/cases/failing/export-module-type-func.pre create mode 100644 tests/cases/failing/export-module-type-int.pre create mode 100644 tests/cases/failing/export-module-type-map.pre create mode 100644 tests/cases/failing/export-module-type-str.pre create mode 100644 tests/cases/failing/export-module-type-thr.pre create mode 100644 tests/cases/failing/export-module-type-tns.pre create mode 100644 tests/cases/failing/export-symbol-type-bool.pre create mode 100644 tests/cases/failing/export-symbol-type-flt.pre create mode 100644 tests/cases/failing/export-symbol-type-func.pre create mode 100644 tests/cases/failing/export-symbol-type-int.pre create mode 100644 tests/cases/failing/export-symbol-type-map.pre create mode 100644 tests/cases/failing/export-symbol-type-str.pre create mode 100644 tests/cases/failing/export-symbol-type-thr.pre create mode 100644 tests/cases/failing/export-symbol-type-tns.pre create mode 100644 tests/cases/failing/export-undeclared-symbol.pre create mode 100644 tests/cases/failing/export-unimported-module.pre create mode 100644 tests/cases/passing/export-alias-shared-module.pre create mode 100644 tests/cases/passing/export-copy-map.pre create mode 100644 tests/cases/passing/export-copy-tensor.pre create mode 100644 tests/cases/passing/export-qualified-call.pre create mode 100644 tests/cases/passing/export-return-false.pre create mode 100644 tests/helpers/export_target.pre diff --git a/tests/cases/failing/export-arity-one.pre b/tests/cases/failing/export-arity-one.pre new file mode 100644 index 0000000..5bd2aa4 --- /dev/null +++ b/tests/cases/failing/export-arity-one.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value) \ No newline at end of file diff --git a/tests/cases/failing/export-arity-three.pre b/tests/cases/failing/export-arity-three.pre new file mode 100644 index 0000000..407f96e --- /dev/null +++ b/tests/cases/failing/export-arity-three.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, helper, extra) \ No newline at end of file diff --git a/tests/cases/failing/export-arity-zero.pre b/tests/cases/failing/export-arity-zero.pre new file mode 100644 index 0000000..81b9419 --- /dev/null +++ b/tests/cases/failing/export-arity-zero.pre @@ -0,0 +1 @@ +EXPORT() \ No newline at end of file diff --git a/tests/cases/failing/export-declared-only-symbol.pre b/tests/cases/failing/export-declared-only-symbol.pre new file mode 100644 index 0000000..b6bb91a --- /dev/null +++ b/tests/cases/failing/export-declared-only-symbol.pre @@ -0,0 +1,9 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) + +INT: value +EXPORT(value, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-deleted-symbol.pre b/tests/cases/failing/export-deleted-symbol.pre new file mode 100644 index 0000000..7bb3d61 --- /dev/null +++ b/tests/cases/failing/export-deleted-symbol.pre @@ -0,0 +1,10 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) + +INT: value = 0d1 +DEL(value) +EXPORT(value, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-module-type-bool.pre b/tests/cases/failing/export-module-type-bool.pre new file mode 100644 index 0000000..9f18ae6 --- /dev/null +++ b/tests/cases/failing/export-module-type-bool.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, TRUE) \ No newline at end of file diff --git a/tests/cases/failing/export-module-type-flt.pre b/tests/cases/failing/export-module-type-flt.pre new file mode 100644 index 0000000..835d784 --- /dev/null +++ b/tests/cases/failing/export-module-type-flt.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, 0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/export-module-type-func.pre b/tests/cases/failing/export-module-type-func.pre new file mode 100644 index 0000000..a5ed819 --- /dev/null +++ b/tests/cases/failing/export-module-type-func.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/export-module-type-int.pre b/tests/cases/failing/export-module-type-int.pre new file mode 100644 index 0000000..c6b86f9 --- /dev/null +++ b/tests/cases/failing/export-module-type-int.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, 0d1) \ No newline at end of file diff --git a/tests/cases/failing/export-module-type-map.pre b/tests/cases/failing/export-module-type-map.pre new file mode 100644 index 0000000..2c23fc2 --- /dev/null +++ b/tests/cases/failing/export-module-type-map.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, <>) \ No newline at end of file diff --git a/tests/cases/failing/export-module-type-str.pre b/tests/cases/failing/export-module-type-str.pre new file mode 100644 index 0000000..a7f260f --- /dev/null +++ b/tests/cases/failing/export-module-type-str.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, "helper") \ No newline at end of file diff --git a/tests/cases/failing/export-module-type-thr.pre b/tests/cases/failing/export-module-type-thr.pre new file mode 100644 index 0000000..d515d1b --- /dev/null +++ b/tests/cases/failing/export-module-type-thr.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/export-module-type-tns.pre b/tests/cases/failing/export-module-type-tns.pre new file mode 100644 index 0000000..9a3d2b1 --- /dev/null +++ b/tests/cases/failing/export-module-type-tns.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/export-symbol-type-bool.pre b/tests/cases/failing/export-symbol-type-bool.pre new file mode 100644 index 0000000..0b3ba3d --- /dev/null +++ b/tests/cases/failing/export-symbol-type-bool.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT(TRUE, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-symbol-type-flt.pre b/tests/cases/failing/export-symbol-type-flt.pre new file mode 100644 index 0000000..bb1521f --- /dev/null +++ b/tests/cases/failing/export-symbol-type-flt.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT(0d1.0, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-symbol-type-func.pre b/tests/cases/failing/export-symbol-type-func.pre new file mode 100644 index 0000000..937a494 --- /dev/null +++ b/tests/cases/failing/export-symbol-type-func.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT(LAMBDA BOOL: (){}, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-symbol-type-int.pre b/tests/cases/failing/export-symbol-type-int.pre new file mode 100644 index 0000000..d0527cd --- /dev/null +++ b/tests/cases/failing/export-symbol-type-int.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT(0d1, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-symbol-type-map.pre b/tests/cases/failing/export-symbol-type-map.pre new file mode 100644 index 0000000..42f6eaf --- /dev/null +++ b/tests/cases/failing/export-symbol-type-map.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT(<>, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-symbol-type-str.pre b/tests/cases/failing/export-symbol-type-str.pre new file mode 100644 index 0000000..e9fcf59 --- /dev/null +++ b/tests/cases/failing/export-symbol-type-str.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT("value", helper) \ No newline at end of file diff --git a/tests/cases/failing/export-symbol-type-thr.pre b/tests/cases/failing/export-symbol-type-thr.pre new file mode 100644 index 0000000..5dd2eaa --- /dev/null +++ b/tests/cases/failing/export-symbol-type-thr.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT(ASYNC{}, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-symbol-type-tns.pre b/tests/cases/failing/export-symbol-type-tns.pre new file mode 100644 index 0000000..57f23a5 --- /dev/null +++ b/tests/cases/failing/export-symbol-type-tns.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT([0d1], helper) \ No newline at end of file diff --git a/tests/cases/failing/export-undeclared-symbol.pre b/tests/cases/failing/export-undeclared-symbol.pre new file mode 100644 index 0000000..6023d15 --- /dev/null +++ b/tests/cases/failing/export-undeclared-symbol.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) +EXPORT(value, helper) \ No newline at end of file diff --git a/tests/cases/failing/export-unimported-module.pre b/tests/cases/failing/export-unimported-module.pre new file mode 100644 index 0000000..dfde911 --- /dev/null +++ b/tests/cases/failing/export-unimported-module.pre @@ -0,0 +1,2 @@ +INT: value = 0d1 +EXPORT(value, helper) \ No newline at end of file diff --git a/tests/cases/passing/export-alias-shared-module.pre b/tests/cases/passing/export-alias-shared-module.pre new file mode 100644 index 0000000..aaa2382 --- /dev/null +++ b/tests/cases/passing/export-alias-shared-module.pre @@ -0,0 +1,15 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +IMPORT_PATH(helper_path) +IMPORT_PATH(helper_path, again) + +INT: via_name = 0d7 +ASSERT(NOT(EXPORT(via_name, export_target))) +ASSERT(EQ(again.via_name, 0d7)) + +INT: via_alias = 0d8 +ASSERT(NOT(EXPORT(via_alias, again))) +ASSERT(EQ(export_target.via_alias, 0d8)) \ No newline at end of file diff --git a/tests/cases/passing/export-copy-map.pre b/tests/cases/passing/export-copy-map.pre new file mode 100644 index 0000000..63bb256 --- /dev/null +++ b/tests/cases/passing/export-copy-map.pre @@ -0,0 +1,16 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) + +MAP: box = <"value" = 0d5> +ASSERT(NOT(EXPORT(box, helper))) + +box<"value"> = 0d6 + +ASSERT(EQ(helper.read_box_value(), 0d5)) +ASSERT(NOT(helper.set_box_value(0d7))) +ASSERT(EQ(box<"value">, 0d6)) +ASSERT(EQ(helper.read_box_value(), 0d7)) \ No newline at end of file diff --git a/tests/cases/passing/export-copy-tensor.pre b/tests/cases/passing/export-copy-tensor.pre new file mode 100644 index 0000000..764c4b6 --- /dev/null +++ b/tests/cases/passing/export-copy-tensor.pre @@ -0,0 +1,16 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) + +TNS: tensor = [0d5, 0d6] +ASSERT(NOT(EXPORT(tensor, helper))) + +tensor[0d1] = 0d8 + +ASSERT(EQ(helper.read_tensor_first(), 0d5)) +ASSERT(NOT(helper.set_tensor_first(0d9))) +ASSERT(EQ(tensor[0d1], 0d8)) +ASSERT(EQ(helper.read_tensor_first(), 0d9)) \ No newline at end of file diff --git a/tests/cases/passing/export-qualified-call.pre b/tests/cases/passing/export-qualified-call.pre new file mode 100644 index 0000000..05b63bd --- /dev/null +++ b/tests/cases/passing/export-qualified-call.pre @@ -0,0 +1,8 @@ +IMPORT(path, helper) + +FUNC STR: describe(){ + RETURN("exported") +} + +ASSERT(NOT(EXPORT(describe, helper))) +ASSERT(EQ(helper.describe(), "exported")) \ No newline at end of file diff --git a/tests/cases/passing/export-return-false.pre b/tests/cases/passing/export-return-false.pre new file mode 100644 index 0000000..a7c0629 --- /dev/null +++ b/tests/cases/passing/export-return-false.pre @@ -0,0 +1,13 @@ +IMPORT(path) + +STR: tests_dir = path.BASEPATH(path.BASEPATH(path.script_dir)) +STR: helper_path = JOIN(tests_dir, "/helpers/export_target.pre") + +ASSERT(NOT(IMPORT_PATH(helper_path, helper))) + +INT: value = 0d42 +BOOL: result = EXPORT(value, helper) + +ASSERT(EQ(TYPE(result), "BOOL")) +ASSERT(NOT(result)) +ASSERT(EQ(helper.value, 0d42)) \ No newline at end of file diff --git a/tests/helpers/export_target.pre b/tests/helpers/export_target.pre new file mode 100644 index 0000000..747ce4a --- /dev/null +++ b/tests/helpers/export_target.pre @@ -0,0 +1,15 @@ +FUNC INT: read_box_value(){ + RETURN(box<"value">) +} + +FUNC BOOL: set_box_value(INT: value){ + box<"value"> = value +} + +FUNC INT: read_tensor_first(){ + RETURN(tensor[0d1]) +} + +FUNC BOOL: set_tensor_first(INT: value){ + tensor[0d1] = value +} \ No newline at end of file From 50e7b11f3a556ef887e88cf94e9bad6afd2f9a9d Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Fri, 17 Apr 2026 00:29:42 -0400 Subject: [PATCH 43/60] Add tests for MSUB. --- tests/cases/failing/msub-arity-one.pre | 1 + tests/cases/failing/msub-arity-three.pre | 1 + tests/cases/failing/msub-arity-zero.pre | 1 + tests/cases/failing/msub-first-bool.pre | 1 + tests/cases/failing/msub-first-flt.pre | 1 + tests/cases/failing/msub-first-func.pre | 1 + tests/cases/failing/msub-first-int.pre | 1 + tests/cases/failing/msub-first-map.pre | 1 + tests/cases/failing/msub-first-str.pre | 1 + tests/cases/failing/msub-first-thr.pre | 1 + tests/cases/failing/msub-mixed-numeric-types.pre | 1 + tests/cases/failing/msub-non-numeric-bool.pre | 1 + tests/cases/failing/msub-non-numeric-func.pre | 1 + tests/cases/failing/msub-non-numeric-map.pre | 1 + tests/cases/failing/msub-non-numeric-str.pre | 1 + tests/cases/failing/msub-non-numeric-thr.pre | 1 + tests/cases/failing/msub-non-numeric-tns.pre | 2 ++ tests/cases/failing/msub-second-bool.pre | 1 + tests/cases/failing/msub-second-flt.pre | 1 + tests/cases/failing/msub-second-func.pre | 1 + tests/cases/failing/msub-second-int.pre | 1 + tests/cases/failing/msub-second-map.pre | 1 + tests/cases/failing/msub-second-str.pre | 1 + tests/cases/failing/msub-second-thr.pre | 1 + tests/cases/failing/msub-shape-mismatch.pre | 1 + tests/cases/failing/msub-tensor-mixed-numeric-elements.pre | 1 + tests/cases/passing/msub-basic.pre | 4 ++++ tests/cases/passing/msub-float.pre | 1 + tests/cases/passing/msub-rank2-shape.pre | 6 ++++++ 29 files changed, 38 insertions(+) create mode 100644 tests/cases/failing/msub-arity-one.pre create mode 100644 tests/cases/failing/msub-arity-three.pre create mode 100644 tests/cases/failing/msub-arity-zero.pre create mode 100644 tests/cases/failing/msub-first-bool.pre create mode 100644 tests/cases/failing/msub-first-flt.pre create mode 100644 tests/cases/failing/msub-first-func.pre create mode 100644 tests/cases/failing/msub-first-int.pre create mode 100644 tests/cases/failing/msub-first-map.pre create mode 100644 tests/cases/failing/msub-first-str.pre create mode 100644 tests/cases/failing/msub-first-thr.pre create mode 100644 tests/cases/failing/msub-mixed-numeric-types.pre create mode 100644 tests/cases/failing/msub-non-numeric-bool.pre create mode 100644 tests/cases/failing/msub-non-numeric-func.pre create mode 100644 tests/cases/failing/msub-non-numeric-map.pre create mode 100644 tests/cases/failing/msub-non-numeric-str.pre create mode 100644 tests/cases/failing/msub-non-numeric-thr.pre create mode 100644 tests/cases/failing/msub-non-numeric-tns.pre create mode 100644 tests/cases/failing/msub-second-bool.pre create mode 100644 tests/cases/failing/msub-second-flt.pre create mode 100644 tests/cases/failing/msub-second-func.pre create mode 100644 tests/cases/failing/msub-second-int.pre create mode 100644 tests/cases/failing/msub-second-map.pre create mode 100644 tests/cases/failing/msub-second-str.pre create mode 100644 tests/cases/failing/msub-second-thr.pre create mode 100644 tests/cases/failing/msub-shape-mismatch.pre create mode 100644 tests/cases/failing/msub-tensor-mixed-numeric-elements.pre create mode 100644 tests/cases/passing/msub-basic.pre create mode 100644 tests/cases/passing/msub-float.pre create mode 100644 tests/cases/passing/msub-rank2-shape.pre diff --git a/tests/cases/failing/msub-arity-one.pre b/tests/cases/failing/msub-arity-one.pre new file mode 100644 index 0000000..7390069 --- /dev/null +++ b/tests/cases/failing/msub-arity-one.pre @@ -0,0 +1 @@ +MSUB([0d1]) \ No newline at end of file diff --git a/tests/cases/failing/msub-arity-three.pre b/tests/cases/failing/msub-arity-three.pre new file mode 100644 index 0000000..7c8894c --- /dev/null +++ b/tests/cases/failing/msub-arity-three.pre @@ -0,0 +1 @@ +MSUB([0d1], [0d2], [0d3]) \ No newline at end of file diff --git a/tests/cases/failing/msub-arity-zero.pre b/tests/cases/failing/msub-arity-zero.pre new file mode 100644 index 0000000..4352c7a --- /dev/null +++ b/tests/cases/failing/msub-arity-zero.pre @@ -0,0 +1 @@ +MSUB() \ No newline at end of file diff --git a/tests/cases/failing/msub-first-bool.pre b/tests/cases/failing/msub-first-bool.pre new file mode 100644 index 0000000..81a9aa2 --- /dev/null +++ b/tests/cases/failing/msub-first-bool.pre @@ -0,0 +1 @@ +MSUB(TRUE, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/msub-first-flt.pre b/tests/cases/failing/msub-first-flt.pre new file mode 100644 index 0000000..c9cf9be --- /dev/null +++ b/tests/cases/failing/msub-first-flt.pre @@ -0,0 +1 @@ +MSUB(0d1.0, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/msub-first-func.pre b/tests/cases/failing/msub-first-func.pre new file mode 100644 index 0000000..820e895 --- /dev/null +++ b/tests/cases/failing/msub-first-func.pre @@ -0,0 +1 @@ +MSUB(LAMBDA BOOL: (){}, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/msub-first-int.pre b/tests/cases/failing/msub-first-int.pre new file mode 100644 index 0000000..2f12612 --- /dev/null +++ b/tests/cases/failing/msub-first-int.pre @@ -0,0 +1 @@ +MSUB(0d1, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/msub-first-map.pre b/tests/cases/failing/msub-first-map.pre new file mode 100644 index 0000000..e74cd65 --- /dev/null +++ b/tests/cases/failing/msub-first-map.pre @@ -0,0 +1 @@ +MSUB(<>, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/msub-first-str.pre b/tests/cases/failing/msub-first-str.pre new file mode 100644 index 0000000..1c3aa93 --- /dev/null +++ b/tests/cases/failing/msub-first-str.pre @@ -0,0 +1 @@ +MSUB("a", [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/msub-first-thr.pre b/tests/cases/failing/msub-first-thr.pre new file mode 100644 index 0000000..4fe4721 --- /dev/null +++ b/tests/cases/failing/msub-first-thr.pre @@ -0,0 +1 @@ +MSUB(ASYNC{}, [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/msub-mixed-numeric-types.pre b/tests/cases/failing/msub-mixed-numeric-types.pre new file mode 100644 index 0000000..003c424 --- /dev/null +++ b/tests/cases/failing/msub-mixed-numeric-types.pre @@ -0,0 +1 @@ +MSUB([0d1, 0d2], [0d1.0, 0d2.0]) \ No newline at end of file diff --git a/tests/cases/failing/msub-non-numeric-bool.pre b/tests/cases/failing/msub-non-numeric-bool.pre new file mode 100644 index 0000000..64ca624 --- /dev/null +++ b/tests/cases/failing/msub-non-numeric-bool.pre @@ -0,0 +1 @@ +MSUB([TRUE], [TRUE]) \ No newline at end of file diff --git a/tests/cases/failing/msub-non-numeric-func.pre b/tests/cases/failing/msub-non-numeric-func.pre new file mode 100644 index 0000000..d350f01 --- /dev/null +++ b/tests/cases/failing/msub-non-numeric-func.pre @@ -0,0 +1 @@ +MSUB([LAMBDA BOOL: (){}], [LAMBDA BOOL: (){}]) \ No newline at end of file diff --git a/tests/cases/failing/msub-non-numeric-map.pre b/tests/cases/failing/msub-non-numeric-map.pre new file mode 100644 index 0000000..42c037f --- /dev/null +++ b/tests/cases/failing/msub-non-numeric-map.pre @@ -0,0 +1 @@ +MSUB([<>], [<>]) \ No newline at end of file diff --git a/tests/cases/failing/msub-non-numeric-str.pre b/tests/cases/failing/msub-non-numeric-str.pre new file mode 100644 index 0000000..6fbcce2 --- /dev/null +++ b/tests/cases/failing/msub-non-numeric-str.pre @@ -0,0 +1 @@ +MSUB(["a"], ["b"]) \ No newline at end of file diff --git a/tests/cases/failing/msub-non-numeric-thr.pre b/tests/cases/failing/msub-non-numeric-thr.pre new file mode 100644 index 0000000..bba1e41 --- /dev/null +++ b/tests/cases/failing/msub-non-numeric-thr.pre @@ -0,0 +1 @@ +MSUB([ASYNC{}], [ASYNC{}]) \ No newline at end of file diff --git a/tests/cases/failing/msub-non-numeric-tns.pre b/tests/cases/failing/msub-non-numeric-tns.pre new file mode 100644 index 0000000..fa602be --- /dev/null +++ b/tests/cases/failing/msub-non-numeric-tns.pre @@ -0,0 +1,2 @@ +TNS: inner = [0d1] +MSUB([inner], [inner]) \ No newline at end of file diff --git a/tests/cases/failing/msub-second-bool.pre b/tests/cases/failing/msub-second-bool.pre new file mode 100644 index 0000000..4dc6d98 --- /dev/null +++ b/tests/cases/failing/msub-second-bool.pre @@ -0,0 +1 @@ +MSUB([0d1], TRUE) \ No newline at end of file diff --git a/tests/cases/failing/msub-second-flt.pre b/tests/cases/failing/msub-second-flt.pre new file mode 100644 index 0000000..f2a9ecc --- /dev/null +++ b/tests/cases/failing/msub-second-flt.pre @@ -0,0 +1 @@ +MSUB([0d1], 0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/msub-second-func.pre b/tests/cases/failing/msub-second-func.pre new file mode 100644 index 0000000..74ef8b3 --- /dev/null +++ b/tests/cases/failing/msub-second-func.pre @@ -0,0 +1 @@ +MSUB([0d1], LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/msub-second-int.pre b/tests/cases/failing/msub-second-int.pre new file mode 100644 index 0000000..a2485dd --- /dev/null +++ b/tests/cases/failing/msub-second-int.pre @@ -0,0 +1 @@ +MSUB([0d1], 0d1) \ No newline at end of file diff --git a/tests/cases/failing/msub-second-map.pre b/tests/cases/failing/msub-second-map.pre new file mode 100644 index 0000000..43dfc47 --- /dev/null +++ b/tests/cases/failing/msub-second-map.pre @@ -0,0 +1 @@ +MSUB([0d1], <>) \ No newline at end of file diff --git a/tests/cases/failing/msub-second-str.pre b/tests/cases/failing/msub-second-str.pre new file mode 100644 index 0000000..2f14fbe --- /dev/null +++ b/tests/cases/failing/msub-second-str.pre @@ -0,0 +1 @@ +MSUB([0d1], "a") \ No newline at end of file diff --git a/tests/cases/failing/msub-second-thr.pre b/tests/cases/failing/msub-second-thr.pre new file mode 100644 index 0000000..1b9d718 --- /dev/null +++ b/tests/cases/failing/msub-second-thr.pre @@ -0,0 +1 @@ +MSUB([0d1], ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/msub-shape-mismatch.pre b/tests/cases/failing/msub-shape-mismatch.pre new file mode 100644 index 0000000..c3e5b7e --- /dev/null +++ b/tests/cases/failing/msub-shape-mismatch.pre @@ -0,0 +1 @@ +MSUB([0d1, 0d2], [0d3]) \ No newline at end of file diff --git a/tests/cases/failing/msub-tensor-mixed-numeric-elements.pre b/tests/cases/failing/msub-tensor-mixed-numeric-elements.pre new file mode 100644 index 0000000..013d6c3 --- /dev/null +++ b/tests/cases/failing/msub-tensor-mixed-numeric-elements.pre @@ -0,0 +1 @@ +MSUB([0d1, 0d2.0], [0d1, 0d1]) \ No newline at end of file diff --git a/tests/cases/passing/msub-basic.pre b/tests/cases/passing/msub-basic.pre new file mode 100644 index 0000000..7efc283 --- /dev/null +++ b/tests/cases/passing/msub-basic.pre @@ -0,0 +1,4 @@ +TNS: out = MSUB([0d9, 0d7, 0d5], [0d4, 0d5, 0d6]) + +ASSERT(EQ(TYPE(out), "TNS")) +ASSERT(EQ(out, [0d5, 0d2, -0d1])) \ No newline at end of file diff --git a/tests/cases/passing/msub-float.pre b/tests/cases/passing/msub-float.pre new file mode 100644 index 0000000..c71cb89 --- /dev/null +++ b/tests/cases/passing/msub-float.pre @@ -0,0 +1 @@ +ASSERT(EQ(MSUB([0d5.5, 0d3.0], [0d1.0, 0d0.5]), [0d4.5, 0d2.5])) \ No newline at end of file diff --git a/tests/cases/passing/msub-rank2-shape.pre b/tests/cases/passing/msub-rank2-shape.pre new file mode 100644 index 0000000..72f2938 --- /dev/null +++ b/tests/cases/passing/msub-rank2-shape.pre @@ -0,0 +1,6 @@ +TNS: a = [[0d9, 0d8], [0d7, 0d6]] +TNS: b = [[0d1, 0d2], [0d3, 0d4]] +TNS: out = MSUB(a, b) + +ASSERT(EQ(out, [[0d8, 0d6], [0d4, 0d2]])) +ASSERT(EQ(SHAPE(out), [0d2, 0d2])) \ No newline at end of file From 08b9618aa601a5698fcdc66d409694fdcee199a5 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Fri, 17 Apr 2026 00:36:33 -0400 Subject: [PATCH 44/60] Add tests for FPROD. --- tests/cases/failing/fprod-arity-zero.pre | 1 + tests/cases/failing/fprod-bool.pre | 1 + tests/cases/failing/fprod-str.pre | 1 + tests/cases/passing/fprod-base.pre | 5 +++++ tests/cases/passing/fprod-inf.pre | 3 +++ tests/cases/passing/fprod-mixed.pre | 3 +++ tests/cases/passing/fprod-single-int.pre | 3 +++ 7 files changed, 17 insertions(+) create mode 100644 tests/cases/failing/fprod-arity-zero.pre create mode 100644 tests/cases/failing/fprod-bool.pre create mode 100644 tests/cases/failing/fprod-str.pre create mode 100644 tests/cases/passing/fprod-base.pre create mode 100644 tests/cases/passing/fprod-inf.pre create mode 100644 tests/cases/passing/fprod-mixed.pre create mode 100644 tests/cases/passing/fprod-single-int.pre diff --git a/tests/cases/failing/fprod-arity-zero.pre b/tests/cases/failing/fprod-arity-zero.pre new file mode 100644 index 0000000..d6a6bb3 --- /dev/null +++ b/tests/cases/failing/fprod-arity-zero.pre @@ -0,0 +1 @@ +FPROD() \ No newline at end of file diff --git a/tests/cases/failing/fprod-bool.pre b/tests/cases/failing/fprod-bool.pre new file mode 100644 index 0000000..bbd8574 --- /dev/null +++ b/tests/cases/failing/fprod-bool.pre @@ -0,0 +1 @@ +FPROD(TRUE, 0d1) \ No newline at end of file diff --git a/tests/cases/failing/fprod-str.pre b/tests/cases/failing/fprod-str.pre new file mode 100644 index 0000000..fe75ec6 --- /dev/null +++ b/tests/cases/failing/fprod-str.pre @@ -0,0 +1 @@ +FPROD("1.0", 0d1) \ No newline at end of file diff --git a/tests/cases/passing/fprod-base.pre b/tests/cases/passing/fprod-base.pre new file mode 100644 index 0000000..226976c --- /dev/null +++ b/tests/cases/passing/fprod-base.pre @@ -0,0 +1,5 @@ +! FPROD result uses the highest numeric base present among operands +FLT: result = FPROD(0d2, 0x3.0) + +ASSERT(EQ(result, 0x6.0)) +ASSERT(EQ(BASE(result), 0d16)) \ No newline at end of file diff --git a/tests/cases/passing/fprod-inf.pre b/tests/cases/passing/fprod-inf.pre new file mode 100644 index 0000000..8052fcd --- /dev/null +++ b/tests/cases/passing/fprod-inf.pre @@ -0,0 +1,3 @@ +! FPROD preserves INF under float arithmetic +FLT: result = FPROD(INF, 0d2.0) +ASSERT(EQ(result, INF)) \ No newline at end of file diff --git a/tests/cases/passing/fprod-mixed.pre b/tests/cases/passing/fprod-mixed.pre new file mode 100644 index 0000000..a36b2f9 --- /dev/null +++ b/tests/cases/passing/fprod-mixed.pre @@ -0,0 +1,3 @@ +! FPROD coerces mixed numeric inputs to FLT before multiplying +FLT: result = FPROD(0d2, 0d3.5, 0d4) +ASSERT(EQ(result, 0d28.0)) \ No newline at end of file diff --git a/tests/cases/passing/fprod-single-int.pre b/tests/cases/passing/fprod-single-int.pre new file mode 100644 index 0000000..2b602fb --- /dev/null +++ b/tests/cases/passing/fprod-single-int.pre @@ -0,0 +1,3 @@ +! FPROD coerces a single INT argument to FLT +FLT: result = FPROD(0d3) +ASSERT(EQ(result, 0d3.0)) \ No newline at end of file From e76ad8e080da08f766df5dbede3c6295046786e0 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Fri, 17 Apr 2026 00:52:13 -0400 Subject: [PATCH 45/60] Add tests for PAUSE. --- tests/cases/failing/pause-already-paused.pre | 7 ++++++ tests/cases/failing/pause-arity-three.pre | 2 ++ tests/cases/failing/pause-arity-zero.pre | 1 + tests/cases/failing/pause-second-bool.pre | 2 ++ tests/cases/failing/pause-second-func.pre | 2 ++ tests/cases/failing/pause-second-int.pre | 2 ++ tests/cases/failing/pause-second-map.pre | 2 ++ .../cases/failing/pause-second-positional.pre | 2 ++ tests/cases/failing/pause-second-str.pre | 2 ++ tests/cases/failing/pause-second-thr.pre | 3 +++ tests/cases/failing/pause-second-tns.pre | 2 ++ tests/cases/failing/pause-type-bool.pre | 1 + tests/cases/failing/pause-type-flt.pre | 1 + tests/cases/failing/pause-type-func.pre | 1 + tests/cases/failing/pause-type-int.pre | 1 + tests/cases/failing/pause-type-map.pre | 1 + tests/cases/failing/pause-type-str.pre | 1 + tests/cases/failing/pause-type-tns.pre | 1 + .../passing/pause-async-handle-autoresume.pre | 19 +++++++++++++++ .../pause-explicit-negative-duration.pre | 19 +++++++++++++++ tests/cases/passing/pause-thread-handle.pre | 23 +++++++++++++++++++ 21 files changed, 95 insertions(+) create mode 100644 tests/cases/failing/pause-already-paused.pre create mode 100644 tests/cases/failing/pause-arity-three.pre create mode 100644 tests/cases/failing/pause-arity-zero.pre create mode 100644 tests/cases/failing/pause-second-bool.pre create mode 100644 tests/cases/failing/pause-second-func.pre create mode 100644 tests/cases/failing/pause-second-int.pre create mode 100644 tests/cases/failing/pause-second-map.pre create mode 100644 tests/cases/failing/pause-second-positional.pre create mode 100644 tests/cases/failing/pause-second-str.pre create mode 100644 tests/cases/failing/pause-second-thr.pre create mode 100644 tests/cases/failing/pause-second-tns.pre create mode 100644 tests/cases/failing/pause-type-bool.pre create mode 100644 tests/cases/failing/pause-type-flt.pre create mode 100644 tests/cases/failing/pause-type-func.pre create mode 100644 tests/cases/failing/pause-type-int.pre create mode 100644 tests/cases/failing/pause-type-map.pre create mode 100644 tests/cases/failing/pause-type-str.pre create mode 100644 tests/cases/failing/pause-type-tns.pre create mode 100644 tests/cases/passing/pause-async-handle-autoresume.pre create mode 100644 tests/cases/passing/pause-explicit-negative-duration.pre create mode 100644 tests/cases/passing/pause-thread-handle.pre diff --git a/tests/cases/failing/pause-already-paused.pre b/tests/cases/failing/pause-already-paused.pre new file mode 100644 index 0000000..f1f6886 --- /dev/null +++ b/tests/cases/failing/pause-already-paused.pre @@ -0,0 +1,7 @@ +THR(worker){ + WHILE(TRUE){} +} + +PAUSE(worker) +PAUSE(worker) +STOP(worker) \ No newline at end of file diff --git a/tests/cases/failing/pause-arity-three.pre b/tests/cases/failing/pause-arity-three.pre new file mode 100644 index 0000000..c55b429 --- /dev/null +++ b/tests/cases/failing/pause-arity-three.pre @@ -0,0 +1,2 @@ +THR(worker){} +PAUSE(worker, 0d0.0, 0d0.0) \ No newline at end of file diff --git a/tests/cases/failing/pause-arity-zero.pre b/tests/cases/failing/pause-arity-zero.pre new file mode 100644 index 0000000..412f5aa --- /dev/null +++ b/tests/cases/failing/pause-arity-zero.pre @@ -0,0 +1 @@ +PAUSE() \ No newline at end of file diff --git a/tests/cases/failing/pause-second-bool.pre b/tests/cases/failing/pause-second-bool.pre new file mode 100644 index 0000000..6abfc85 --- /dev/null +++ b/tests/cases/failing/pause-second-bool.pre @@ -0,0 +1,2 @@ +THR(worker){} +PAUSE(worker, seconds = TRUE) \ No newline at end of file diff --git a/tests/cases/failing/pause-second-func.pre b/tests/cases/failing/pause-second-func.pre new file mode 100644 index 0000000..01298f7 --- /dev/null +++ b/tests/cases/failing/pause-second-func.pre @@ -0,0 +1,2 @@ +THR(worker){} +PAUSE(worker, seconds = LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/pause-second-int.pre b/tests/cases/failing/pause-second-int.pre new file mode 100644 index 0000000..5482311 --- /dev/null +++ b/tests/cases/failing/pause-second-int.pre @@ -0,0 +1,2 @@ +THR(worker){} +PAUSE(worker, seconds = 0d1) \ No newline at end of file diff --git a/tests/cases/failing/pause-second-map.pre b/tests/cases/failing/pause-second-map.pre new file mode 100644 index 0000000..466ad50 --- /dev/null +++ b/tests/cases/failing/pause-second-map.pre @@ -0,0 +1,2 @@ +THR(worker){} +PAUSE(worker, seconds = <>) \ No newline at end of file diff --git a/tests/cases/failing/pause-second-positional.pre b/tests/cases/failing/pause-second-positional.pre new file mode 100644 index 0000000..2fe4dc7 --- /dev/null +++ b/tests/cases/failing/pause-second-positional.pre @@ -0,0 +1,2 @@ +THR(worker){} +PAUSE(worker, 0d0.0) \ No newline at end of file diff --git a/tests/cases/failing/pause-second-str.pre b/tests/cases/failing/pause-second-str.pre new file mode 100644 index 0000000..c60aac3 --- /dev/null +++ b/tests/cases/failing/pause-second-str.pre @@ -0,0 +1,2 @@ +THR(worker){} +PAUSE(worker, seconds = "seconds") \ No newline at end of file diff --git a/tests/cases/failing/pause-second-thr.pre b/tests/cases/failing/pause-second-thr.pre new file mode 100644 index 0000000..0446038 --- /dev/null +++ b/tests/cases/failing/pause-second-thr.pre @@ -0,0 +1,3 @@ +THR(worker){} +THR(delay){} +PAUSE(worker, seconds = delay) \ No newline at end of file diff --git a/tests/cases/failing/pause-second-tns.pre b/tests/cases/failing/pause-second-tns.pre new file mode 100644 index 0000000..d3d87a3 --- /dev/null +++ b/tests/cases/failing/pause-second-tns.pre @@ -0,0 +1,2 @@ +THR(worker){} +PAUSE(worker, seconds = [0d1]) \ No newline at end of file diff --git a/tests/cases/failing/pause-type-bool.pre b/tests/cases/failing/pause-type-bool.pre new file mode 100644 index 0000000..967e6fe --- /dev/null +++ b/tests/cases/failing/pause-type-bool.pre @@ -0,0 +1 @@ +PAUSE(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/pause-type-flt.pre b/tests/cases/failing/pause-type-flt.pre new file mode 100644 index 0000000..f2cccbd --- /dev/null +++ b/tests/cases/failing/pause-type-flt.pre @@ -0,0 +1 @@ +PAUSE(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/pause-type-func.pre b/tests/cases/failing/pause-type-func.pre new file mode 100644 index 0000000..e7d5305 --- /dev/null +++ b/tests/cases/failing/pause-type-func.pre @@ -0,0 +1 @@ +PAUSE(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/pause-type-int.pre b/tests/cases/failing/pause-type-int.pre new file mode 100644 index 0000000..e2b06c4 --- /dev/null +++ b/tests/cases/failing/pause-type-int.pre @@ -0,0 +1 @@ +PAUSE(0d1) \ No newline at end of file diff --git a/tests/cases/failing/pause-type-map.pre b/tests/cases/failing/pause-type-map.pre new file mode 100644 index 0000000..cf034b2 --- /dev/null +++ b/tests/cases/failing/pause-type-map.pre @@ -0,0 +1 @@ +PAUSE(<>) \ No newline at end of file diff --git a/tests/cases/failing/pause-type-str.pre b/tests/cases/failing/pause-type-str.pre new file mode 100644 index 0000000..4be8b9d --- /dev/null +++ b/tests/cases/failing/pause-type-str.pre @@ -0,0 +1 @@ +PAUSE("thread") \ No newline at end of file diff --git a/tests/cases/failing/pause-type-tns.pre b/tests/cases/failing/pause-type-tns.pre new file mode 100644 index 0000000..a6c7ca1 --- /dev/null +++ b/tests/cases/failing/pause-type-tns.pre @@ -0,0 +1 @@ +PAUSE([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/pause-async-handle-autoresume.pre b/tests/cases/passing/pause-async-handle-autoresume.pre new file mode 100644 index 0000000..bb5e9c3 --- /dev/null +++ b/tests/cases/passing/pause-async-handle-autoresume.pre @@ -0,0 +1,19 @@ +BOOL: released = FALSE + +THR: worker = ASYNC{ + WHILE(NOT(released)){} +} + +THR: paused = PAUSE(worker, seconds = 0d0.05) + +ASSERT(EQ(TYPE(paused), "THR")) +ASSERT(EQ(paused, worker)) +ASSERT(BOOL(worker)) +ASSERT(PAUSED(worker)) + +released = TRUE + +AWAIT(worker) + +ASSERT(NOT(BOOL(worker))) +ASSERT(NOT(PAUSED(worker))) \ No newline at end of file diff --git a/tests/cases/passing/pause-explicit-negative-duration.pre b/tests/cases/passing/pause-explicit-negative-duration.pre new file mode 100644 index 0000000..5dfd350 --- /dev/null +++ b/tests/cases/passing/pause-explicit-negative-duration.pre @@ -0,0 +1,19 @@ +BOOL: released = FALSE + +THR(worker){ + WHILE(NOT(released)){} +} + +THR: paused = PAUSE(worker, seconds = -0d1.0) + +ASSERT(EQ(paused, worker)) +ASSERT(PAUSED(worker)) + +released = TRUE + +ASSERT(PAUSED(worker)) + +AWAIT(RESUME(worker)) + +ASSERT(NOT(BOOL(worker))) +ASSERT(NOT(PAUSED(worker))) \ No newline at end of file diff --git a/tests/cases/passing/pause-thread-handle.pre b/tests/cases/passing/pause-thread-handle.pre new file mode 100644 index 0000000..560bf89 --- /dev/null +++ b/tests/cases/passing/pause-thread-handle.pre @@ -0,0 +1,23 @@ +BOOL: released = FALSE + +THR(worker){ + WHILE(NOT(released)){} +} + +ASSERT(BOOL(worker)) + +THR: paused = PAUSE(worker) + +ASSERT(EQ(TYPE(paused), "THR")) +ASSERT(EQ(paused, worker)) +ASSERT(BOOL(worker)) +ASSERT(PAUSED(worker)) + +released = TRUE + +ASSERT(PAUSED(worker)) + +AWAIT(RESUME(worker)) + +ASSERT(NOT(BOOL(worker))) +ASSERT(NOT(PAUSED(worker))) \ No newline at end of file From 4a1a227d9a7f5e16b9971d9620e69e2640e7efd6 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Fri, 17 Apr 2026 01:26:59 -0400 Subject: [PATCH 46/60] Add tests for COPY and DEEPCOPY. --- tests/cases/failing/copy-arity-two.pre | 1 + tests/cases/failing/copy-arity-zero.pre | 1 + tests/cases/failing/deepcopy-arity-two.pre | 1 + tests/cases/failing/deepcopy-arity-zero.pre | 1 + tests/cases/passing/copy-bool.pre | 1 + tests/cases/passing/copy-flt.pre | 1 + tests/cases/passing/copy-from-pointer.pre | 8 ++++++++ tests/cases/passing/copy-func.pre | 8 ++++++++ tests/cases/passing/copy-int.pre | 1 + tests/cases/passing/copy-map.pre | 3 +++ tests/cases/passing/copy-str.pre | 1 + tests/cases/passing/copy-thr.pre | 5 +++++ tests/cases/passing/copy-tns.pre | 3 +++ tests/cases/passing/deepcopy-bool.pre | 1 + tests/cases/passing/deepcopy-flt.pre | 1 + tests/cases/passing/deepcopy-from-pointer.pre | 8 ++++++++ tests/cases/passing/deepcopy-func.pre | 8 ++++++++ tests/cases/passing/deepcopy-int.pre | 1 + tests/cases/passing/deepcopy-map.pre | 3 +++ tests/cases/passing/deepcopy-str.pre | 1 + tests/cases/passing/deepcopy-thr.pre | 5 +++++ tests/cases/passing/deepcopy-tns.pre | 3 +++ 22 files changed, 66 insertions(+) create mode 100644 tests/cases/failing/copy-arity-two.pre create mode 100644 tests/cases/failing/copy-arity-zero.pre create mode 100644 tests/cases/failing/deepcopy-arity-two.pre create mode 100644 tests/cases/failing/deepcopy-arity-zero.pre create mode 100644 tests/cases/passing/copy-bool.pre create mode 100644 tests/cases/passing/copy-flt.pre create mode 100644 tests/cases/passing/copy-from-pointer.pre create mode 100644 tests/cases/passing/copy-func.pre create mode 100644 tests/cases/passing/copy-int.pre create mode 100644 tests/cases/passing/copy-map.pre create mode 100644 tests/cases/passing/copy-str.pre create mode 100644 tests/cases/passing/copy-thr.pre create mode 100644 tests/cases/passing/copy-tns.pre create mode 100644 tests/cases/passing/deepcopy-bool.pre create mode 100644 tests/cases/passing/deepcopy-flt.pre create mode 100644 tests/cases/passing/deepcopy-from-pointer.pre create mode 100644 tests/cases/passing/deepcopy-func.pre create mode 100644 tests/cases/passing/deepcopy-int.pre create mode 100644 tests/cases/passing/deepcopy-map.pre create mode 100644 tests/cases/passing/deepcopy-str.pre create mode 100644 tests/cases/passing/deepcopy-thr.pre create mode 100644 tests/cases/passing/deepcopy-tns.pre diff --git a/tests/cases/failing/copy-arity-two.pre b/tests/cases/failing/copy-arity-two.pre new file mode 100644 index 0000000..0ec9f3e --- /dev/null +++ b/tests/cases/failing/copy-arity-two.pre @@ -0,0 +1 @@ +COPY(0d1, 0d2) \ No newline at end of file diff --git a/tests/cases/failing/copy-arity-zero.pre b/tests/cases/failing/copy-arity-zero.pre new file mode 100644 index 0000000..08acf97 --- /dev/null +++ b/tests/cases/failing/copy-arity-zero.pre @@ -0,0 +1 @@ +COPY() \ No newline at end of file diff --git a/tests/cases/failing/deepcopy-arity-two.pre b/tests/cases/failing/deepcopy-arity-two.pre new file mode 100644 index 0000000..dee83f0 --- /dev/null +++ b/tests/cases/failing/deepcopy-arity-two.pre @@ -0,0 +1 @@ +DEEPCOPY(0d1, 0d2) \ No newline at end of file diff --git a/tests/cases/failing/deepcopy-arity-zero.pre b/tests/cases/failing/deepcopy-arity-zero.pre new file mode 100644 index 0000000..56fc861 --- /dev/null +++ b/tests/cases/failing/deepcopy-arity-zero.pre @@ -0,0 +1 @@ +DEEPCOPY() \ No newline at end of file diff --git a/tests/cases/passing/copy-bool.pre b/tests/cases/passing/copy-bool.pre new file mode 100644 index 0000000..e9f3746 --- /dev/null +++ b/tests/cases/passing/copy-bool.pre @@ -0,0 +1 @@ +ASSERT(EQ(COPY(TRUE), TRUE)) \ No newline at end of file diff --git a/tests/cases/passing/copy-flt.pre b/tests/cases/passing/copy-flt.pre new file mode 100644 index 0000000..81dcb43 --- /dev/null +++ b/tests/cases/passing/copy-flt.pre @@ -0,0 +1 @@ +ASSERT(EQ(COPY(0d1.5), 0d1.5)) \ No newline at end of file diff --git a/tests/cases/passing/copy-from-pointer.pre b/tests/cases/passing/copy-from-pointer.pre new file mode 100644 index 0000000..4da455a --- /dev/null +++ b/tests/cases/passing/copy-from-pointer.pre @@ -0,0 +1,8 @@ +MAP: source = <"plain" = 0d2, "nested" = <"value" = 0d3>> +MAP: copied = COPY(@source) + +copied<"plain"> = 0d9 +ASSERT(EQ(source<"plain">, 0d2)) + +copied<"nested", "value"> = 0d8 +ASSERT(EQ(source<"nested", "value">, 0d8)) \ No newline at end of file diff --git a/tests/cases/passing/copy-func.pre b/tests/cases/passing/copy-func.pre new file mode 100644 index 0000000..6d402e9 --- /dev/null +++ b/tests/cases/passing/copy-func.pre @@ -0,0 +1,8 @@ +FUNC INT: identity(INT: value){ + RETURN(value) +} + +FUNC: func_copy = COPY(identity) + +ASSERT(EQ(func_copy, identity)) +ASSERT(EQ(func_copy(0d7), 0d7)) \ No newline at end of file diff --git a/tests/cases/passing/copy-int.pre b/tests/cases/passing/copy-int.pre new file mode 100644 index 0000000..91df25c --- /dev/null +++ b/tests/cases/passing/copy-int.pre @@ -0,0 +1 @@ +ASSERT(EQ(COPY(0xA), 0xA)) \ No newline at end of file diff --git a/tests/cases/passing/copy-map.pre b/tests/cases/passing/copy-map.pre new file mode 100644 index 0000000..5078a74 --- /dev/null +++ b/tests/cases/passing/copy-map.pre @@ -0,0 +1,3 @@ +MAP: map_value = <"n" = 0d3> + +ASSERT(EQ(COPY(map_value), map_value)) \ No newline at end of file diff --git a/tests/cases/passing/copy-str.pre b/tests/cases/passing/copy-str.pre new file mode 100644 index 0000000..c07b2ce --- /dev/null +++ b/tests/cases/passing/copy-str.pre @@ -0,0 +1 @@ +ASSERT(EQ(COPY("prefix"), "prefix")) \ No newline at end of file diff --git a/tests/cases/passing/copy-thr.pre b/tests/cases/passing/copy-thr.pre new file mode 100644 index 0000000..e460b63 --- /dev/null +++ b/tests/cases/passing/copy-thr.pre @@ -0,0 +1,5 @@ +THR(worker){} + +THR: thread_copy = COPY(worker) + +ASSERT(EQ(thread_copy, worker)) \ No newline at end of file diff --git a/tests/cases/passing/copy-tns.pre b/tests/cases/passing/copy-tns.pre new file mode 100644 index 0000000..5f756f9 --- /dev/null +++ b/tests/cases/passing/copy-tns.pre @@ -0,0 +1,3 @@ +TNS: tensor = [0d1, 0d2] + +ASSERT(EQ(COPY(tensor), tensor)) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-bool.pre b/tests/cases/passing/deepcopy-bool.pre new file mode 100644 index 0000000..399d714 --- /dev/null +++ b/tests/cases/passing/deepcopy-bool.pre @@ -0,0 +1 @@ +ASSERT(EQ(DEEPCOPY(TRUE), TRUE)) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-flt.pre b/tests/cases/passing/deepcopy-flt.pre new file mode 100644 index 0000000..6bd3630 --- /dev/null +++ b/tests/cases/passing/deepcopy-flt.pre @@ -0,0 +1 @@ +ASSERT(EQ(DEEPCOPY(0d1.5), 0d1.5)) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-from-pointer.pre b/tests/cases/passing/deepcopy-from-pointer.pre new file mode 100644 index 0000000..2ddec8c --- /dev/null +++ b/tests/cases/passing/deepcopy-from-pointer.pre @@ -0,0 +1,8 @@ +MAP: source = <"plain" = 0d2, "nested" = <"value" = 0d3>> +MAP: copied = DEEPCOPY(@source) + +copied<"plain"> = 0d9 +copied<"nested", "value"> = 0d8 + +ASSERT(EQ(source<"plain">, 0d2)) +ASSERT(EQ(source<"nested", "value">, 0d3)) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-func.pre b/tests/cases/passing/deepcopy-func.pre new file mode 100644 index 0000000..e1b45da --- /dev/null +++ b/tests/cases/passing/deepcopy-func.pre @@ -0,0 +1,8 @@ +FUNC INT: identity(INT: value){ + RETURN(value) +} + +FUNC: func_copy = DEEPCOPY(identity) + +ASSERT(EQ(func_copy, identity)) +ASSERT(EQ(func_copy(0d7), 0d7)) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-int.pre b/tests/cases/passing/deepcopy-int.pre new file mode 100644 index 0000000..e89fa0c --- /dev/null +++ b/tests/cases/passing/deepcopy-int.pre @@ -0,0 +1 @@ +ASSERT(EQ(DEEPCOPY(0xA), 0xA)) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-map.pre b/tests/cases/passing/deepcopy-map.pre new file mode 100644 index 0000000..ebf1c0c --- /dev/null +++ b/tests/cases/passing/deepcopy-map.pre @@ -0,0 +1,3 @@ +MAP: map_value = <"n" = 0d3> + +ASSERT(EQ(DEEPCOPY(map_value), map_value)) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-str.pre b/tests/cases/passing/deepcopy-str.pre new file mode 100644 index 0000000..f8635a9 --- /dev/null +++ b/tests/cases/passing/deepcopy-str.pre @@ -0,0 +1 @@ +ASSERT(EQ(DEEPCOPY("prefix"), "prefix")) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-thr.pre b/tests/cases/passing/deepcopy-thr.pre new file mode 100644 index 0000000..a11f3ee --- /dev/null +++ b/tests/cases/passing/deepcopy-thr.pre @@ -0,0 +1,5 @@ +THR(worker){} + +THR: thread_copy = DEEPCOPY(worker) + +ASSERT(EQ(thread_copy, worker)) \ No newline at end of file diff --git a/tests/cases/passing/deepcopy-tns.pre b/tests/cases/passing/deepcopy-tns.pre new file mode 100644 index 0000000..11111c0 --- /dev/null +++ b/tests/cases/passing/deepcopy-tns.pre @@ -0,0 +1,3 @@ +TNS: tensor = [0d1, 0d2] + +ASSERT(EQ(DEEPCOPY(tensor), tensor)) \ No newline at end of file From b933af57d98b77dd74776c544ca867373d372cd2 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sat, 18 Apr 2026 23:20:17 -0400 Subject: [PATCH 47/60] Add tests for SER and UNSER. --- tests/cases/failing/ser-arity-two.pre | 1 + tests/cases/failing/ser-arity-zero.pre | 1 + tests/cases/failing/unser-arity-two.pre | 1 + tests/cases/failing/unser-arity-zero.pre | 1 + tests/cases/failing/unser-type-bool.pre | 1 + tests/cases/failing/unser-type-flt.pre | 1 + tests/cases/failing/unser-type-func.pre | 5 +++ tests/cases/failing/unser-type-int.pre | 1 + tests/cases/failing/unser-type-map.pre | 1 + tests/cases/failing/unser-type-thr.pre | 3 ++ tests/cases/failing/unser-type-tns.pre | 1 + tests/cases/passing/ser-func-ref.pre | 23 ++++++++++++ tests/cases/passing/ser-func.pre | 24 ++++++++++++ tests/cases/passing/ser-map.pre | 7 ++++ tests/cases/passing/ser-scalars.pre | 12 ++++++ tests/cases/passing/ser-strings.pre | 10 +++++ tests/cases/passing/ser-tensor.pre | 5 +++ tests/cases/passing/ser-thr.pre | 25 +++++++++++++ tests/cases/passing/unser-errors-json.pre | 27 ++++++++++++++ tests/cases/passing/unser-errors-numeric.pre | 21 +++++++++++ .../cases/passing/unser-errors-structure.pre | 27 ++++++++++++++ tests/cases/passing/unser-func-closure.pre | 15 ++++++++ tests/cases/passing/unser-func-params.pre | 37 +++++++++++++++++++ tests/cases/passing/unser-func-ref.pre | 22 +++++++++++ tests/cases/passing/unser-func.pre | 21 +++++++++++ tests/cases/passing/unser-map.pre | 6 +++ tests/cases/passing/unser-scalars.pre | 10 +++++ tests/cases/passing/unser-tensor.pre | 7 ++++ tests/cases/passing/unser-thr-ref.pre | 13 +++++++ tests/cases/passing/unser-thr.pre | 9 +++++ 30 files changed, 338 insertions(+) create mode 100644 tests/cases/failing/ser-arity-two.pre create mode 100644 tests/cases/failing/ser-arity-zero.pre create mode 100644 tests/cases/failing/unser-arity-two.pre create mode 100644 tests/cases/failing/unser-arity-zero.pre create mode 100644 tests/cases/failing/unser-type-bool.pre create mode 100644 tests/cases/failing/unser-type-flt.pre create mode 100644 tests/cases/failing/unser-type-func.pre create mode 100644 tests/cases/failing/unser-type-int.pre create mode 100644 tests/cases/failing/unser-type-map.pre create mode 100644 tests/cases/failing/unser-type-thr.pre create mode 100644 tests/cases/failing/unser-type-tns.pre create mode 100644 tests/cases/passing/ser-func-ref.pre create mode 100644 tests/cases/passing/ser-func.pre create mode 100644 tests/cases/passing/ser-map.pre create mode 100644 tests/cases/passing/ser-scalars.pre create mode 100644 tests/cases/passing/ser-strings.pre create mode 100644 tests/cases/passing/ser-tensor.pre create mode 100644 tests/cases/passing/ser-thr.pre create mode 100644 tests/cases/passing/unser-errors-json.pre create mode 100644 tests/cases/passing/unser-errors-numeric.pre create mode 100644 tests/cases/passing/unser-errors-structure.pre create mode 100644 tests/cases/passing/unser-func-closure.pre create mode 100644 tests/cases/passing/unser-func-params.pre create mode 100644 tests/cases/passing/unser-func-ref.pre create mode 100644 tests/cases/passing/unser-func.pre create mode 100644 tests/cases/passing/unser-map.pre create mode 100644 tests/cases/passing/unser-scalars.pre create mode 100644 tests/cases/passing/unser-tensor.pre create mode 100644 tests/cases/passing/unser-thr-ref.pre create mode 100644 tests/cases/passing/unser-thr.pre diff --git a/tests/cases/failing/ser-arity-two.pre b/tests/cases/failing/ser-arity-two.pre new file mode 100644 index 0000000..9a38fc3 --- /dev/null +++ b/tests/cases/failing/ser-arity-two.pre @@ -0,0 +1 @@ +SER(TRUE, FALSE) \ No newline at end of file diff --git a/tests/cases/failing/ser-arity-zero.pre b/tests/cases/failing/ser-arity-zero.pre new file mode 100644 index 0000000..7cd35c3 --- /dev/null +++ b/tests/cases/failing/ser-arity-zero.pre @@ -0,0 +1 @@ +SER() \ No newline at end of file diff --git a/tests/cases/failing/unser-arity-two.pre b/tests/cases/failing/unser-arity-two.pre new file mode 100644 index 0000000..2f72309 --- /dev/null +++ b/tests/cases/failing/unser-arity-two.pre @@ -0,0 +1 @@ +UNSER("{}", "{}") \ No newline at end of file diff --git a/tests/cases/failing/unser-arity-zero.pre b/tests/cases/failing/unser-arity-zero.pre new file mode 100644 index 0000000..ac3d000 --- /dev/null +++ b/tests/cases/failing/unser-arity-zero.pre @@ -0,0 +1 @@ +UNSER() \ No newline at end of file diff --git a/tests/cases/failing/unser-type-bool.pre b/tests/cases/failing/unser-type-bool.pre new file mode 100644 index 0000000..b2687b8 --- /dev/null +++ b/tests/cases/failing/unser-type-bool.pre @@ -0,0 +1 @@ +UNSER(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/unser-type-flt.pre b/tests/cases/failing/unser-type-flt.pre new file mode 100644 index 0000000..1848563 --- /dev/null +++ b/tests/cases/failing/unser-type-flt.pre @@ -0,0 +1 @@ +UNSER(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/unser-type-func.pre b/tests/cases/failing/unser-type-func.pre new file mode 100644 index 0000000..6620127 --- /dev/null +++ b/tests/cases/failing/unser-type-func.pre @@ -0,0 +1,5 @@ +FUNC INT: identity(INT: value){ + RETURN(value) +} + +UNSER(identity) \ No newline at end of file diff --git a/tests/cases/failing/unser-type-int.pre b/tests/cases/failing/unser-type-int.pre new file mode 100644 index 0000000..fd21c87 --- /dev/null +++ b/tests/cases/failing/unser-type-int.pre @@ -0,0 +1 @@ +UNSER(0d1) \ No newline at end of file diff --git a/tests/cases/failing/unser-type-map.pre b/tests/cases/failing/unser-type-map.pre new file mode 100644 index 0000000..29f97bb --- /dev/null +++ b/tests/cases/failing/unser-type-map.pre @@ -0,0 +1 @@ +UNSER(<"n" = 0d1>) \ No newline at end of file diff --git a/tests/cases/failing/unser-type-thr.pre b/tests/cases/failing/unser-type-thr.pre new file mode 100644 index 0000000..e643be8 --- /dev/null +++ b/tests/cases/failing/unser-type-thr.pre @@ -0,0 +1,3 @@ +THR(worker){} + +UNSER(worker) \ No newline at end of file diff --git a/tests/cases/failing/unser-type-tns.pre b/tests/cases/failing/unser-type-tns.pre new file mode 100644 index 0000000..de0d26e --- /dev/null +++ b/tests/cases/failing/unser-type-tns.pre @@ -0,0 +1 @@ +UNSER([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/ser-func-ref.pre b/tests/cases/passing/ser-func-ref.pre new file mode 100644 index 0000000..8567e75 --- /dev/null +++ b/tests/cases/passing/ser-func-ref.pre @@ -0,0 +1,23 @@ +FUNC BOOL: contains(STR: haystack, STR: needle){ + RETURN(GT(TLEN(SPLIT(haystack, needle), 0d1), 0d1)) +} + +FUNC INT: occurrences(STR: haystack, STR: needle){ + RETURN(SUB(TLEN(SPLIT(haystack, needle), 0d1), 0d1)) +} + +FUNC INT: identity(INT: value){ + RETURN(value) +} + +MAP: shared = <"first" = identity, "second" = identity> +STR: json = SER(shared) + +ASSERT(contains(json, '\R"t":"FUNC"')) +ASSERT(contains(json, '\R"name":"identity"')) +ASSERT(GT(occurrences(json, '\R"def":{'), 0d0)) +ASSERT(contains(json, '\R"ref":true')) + +MAP: roundtrip = UNSER(SER(shared)) +ASSERT(EQ(roundtrip<"first">(0d4), 0d4)) +ASSERT(EQ(roundtrip<"second">(0d5), 0d5)) \ No newline at end of file diff --git a/tests/cases/passing/ser-func.pre b/tests/cases/passing/ser-func.pre new file mode 100644 index 0000000..4832c25 --- /dev/null +++ b/tests/cases/passing/ser-func.pre @@ -0,0 +1,24 @@ +FUNC BOOL: contains(STR: haystack, STR: needle){ + RETURN(GT(TLEN(SPLIT(haystack, needle), 0d1), 0d1)) +} + +INT: seed = 0d9 +INT: alias = @seed + +FUNC INT: add_seed(~INT: count, INT: step = 0d1){ + RETURN(ADD(alias, ADD(count, step))) +} + +STR: json = SER(add_seed) + +ASSERT(contains(json, '\R"t":"FUNC"')) +ASSERT(contains(json, '\R"name":"add_seed"')) +ASSERT(contains(json, '\R"return":"INT"')) +ASSERT(contains(json, '\R"coerced":true')) +ASSERT(contains(json, '\R"default":{"n":"Literal"')) +ASSERT(contains(json, '\R"closure":{"t":"ENV"')) +ASSERT(contains(json, '\R"t":"PTR"')) +ASSERT(contains(json, '\R"name":"seed"')) +ASSERT(contains(json, '\R"value_type":"INT"')) +ASSERT(contains(json, '\R"n":"ReturnStatement"')) +ASSERT(contains(json, '\R"n":"CallExpression"')) \ No newline at end of file diff --git a/tests/cases/passing/ser-map.pre b/tests/cases/passing/ser-map.pre new file mode 100644 index 0000000..b782ff8 --- /dev/null +++ b/tests/cases/passing/ser-map.pre @@ -0,0 +1,7 @@ +MAP: ordered = <"alpha" = 0d1, 0d2 = "two", 0d3.5 = TRUE> + +ASSERT(EQ(SER(ordered), '\R{"t":"MAP","v":[{"k":{"t":"STR","v":"alpha"},"v":{"t":"INT","v":"0d1"}},{"k":{"t":"INT","v":"0d2"},"v":{"t":"STR","v":"two"}},{"k":{"t":"FLT","v":"0d3.5"},"v":{"t":"BOOL","v":true}}]}')) + +MAP: nested = <"outer" = <"inner" = [0d1, 0d2]>> +ASSERT(EQ(UNSER(SER(nested)), nested)) +ASSERT(EQ(KEYS(UNSER(SER(ordered))), ["alpha", 0d2, 0d3.5])) \ No newline at end of file diff --git a/tests/cases/passing/ser-scalars.pre b/tests/cases/passing/ser-scalars.pre new file mode 100644 index 0000000..54b372e --- /dev/null +++ b/tests/cases/passing/ser-scalars.pre @@ -0,0 +1,12 @@ +ASSERT(EQ(SER(TRUE), '{"t":"BOOL","v":true}')) +ASSERT(EQ(SER(FALSE), '{"t":"BOOL","v":false}')) + +ASSERT(EQ(SER(0d42), '{"t":"INT","v":"0d42"}')) +ASSERT(EQ(SER(-0xA), '{"t":"INT","v":"-0xA"}')) + +ASSERT(EQ(SER(0d3.5), '{"t":"FLT","v":"0d3.5"}')) +ASSERT(EQ(SER(-INF), '{"t":"FLT","v":"-INF"}')) +ASSERT(EQ(SER(NaN), '{"t":"FLT","v":"NaN"}')) + +ASSERT(EQ(UNSER(SER(0x2A)), 0x2A)) +ASSERT(EQ(STR(UNSER(SER(NaN))), "NaN")) \ No newline at end of file diff --git a/tests/cases/passing/ser-strings.pre b/tests/cases/passing/ser-strings.pre new file mode 100644 index 0000000..c336c88 --- /dev/null +++ b/tests/cases/passing/ser-strings.pre @@ -0,0 +1,10 @@ +ASSERT(EQ(SER("Prefix"), '{"t":"STR","v":"Prefix"}')) + +STR: escaped = "\"\\\b\f\n\r\t" +ASSERT(EQ(SER(escaped), '\R{"t":"STR","v":"\"\\\b\f\n\r\t"}')) + +ASSERT(EQ(SER("\x01"), '\R{"t":"STR","v":"\u0001"}')) + +STR: unicode_json = SER("\u00E9") +ASSERT(OR(EQ(unicode_json, '\R{"t":"STR","v":"\u00E9"}'), EQ(unicode_json, '\R{"t":"STR","v":"\u00e9"}'))) +ASSERT(EQ(UNSER(unicode_json), "\u00E9")) \ No newline at end of file diff --git a/tests/cases/passing/ser-tensor.pre b/tests/cases/passing/ser-tensor.pre new file mode 100644 index 0000000..78de26e --- /dev/null +++ b/tests/cases/passing/ser-tensor.pre @@ -0,0 +1,5 @@ +ASSERT(EQ(SER([0d1, 0d2]), '\R{"t":"TNS","shape":[2],"v":[{"t":"INT","v":"0d1"},{"t":"INT","v":"0d2"}]}')) + +TNS: square = [[0d1, 0d2], [0d3, 0d4]] +ASSERT(EQ(SER(square), '\R{"t":"TNS","shape":[2,2],"v":[{"t":"INT","v":"0d1"},{"t":"INT","v":"0d2"},{"t":"INT","v":"0d3"},{"t":"INT","v":"0d4"}]}')) +ASSERT(EQ(UNSER(SER(square)), square)) \ No newline at end of file diff --git a/tests/cases/passing/ser-thr.pre b/tests/cases/passing/ser-thr.pre new file mode 100644 index 0000000..e81029e --- /dev/null +++ b/tests/cases/passing/ser-thr.pre @@ -0,0 +1,25 @@ +FUNC BOOL: contains(STR: haystack, STR: needle){ + RETURN(GT(TLEN(SPLIT(haystack, needle), 0d1), 0d1)) +} + +FUNC INT: occurrences(STR: haystack, STR: needle){ + RETURN(SUB(TLEN(SPLIT(haystack, needle), 0d1), 0d1)) +} + +THR(worker){} +AWAIT(worker) + +STR: json = SER(worker) + +ASSERT(contains(json, '\R"t":"THR"')) +ASSERT(contains(json, '\R"id":"t1"')) +ASSERT(contains(json, '\R"state":"finished"')) +ASSERT(contains(json, '\R"paused":false')) +ASSERT(contains(json, '\R"finished":true')) +ASSERT(contains(json, '\R"stop":false')) +ASSERT(contains(json, '\R"env":')) +ASSERT(contains(json, '\R"block":{"n":"Block"')) + +MAP: shared = <"first" = worker, "second" = worker> +STR: shared_json = SER(shared) +ASSERT(EQ(occurrences(shared_json, '\R"id":"t1"'), 0d2)) \ No newline at end of file diff --git a/tests/cases/passing/unser-errors-json.pre b/tests/cases/passing/unser-errors-json.pre new file mode 100644 index 0000000..f23a895 --- /dev/null +++ b/tests/cases/passing/unser-errors-json.pre @@ -0,0 +1,27 @@ +INT: errors = 0d0 + +TRY{ + UNSER("{") +} CATCH(err){ + ADD(@errors, 0d1) +} + +TRY{ + UNSER('\R{"v":true}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +TRY{ + UNSER('\R{"t":"BOOL"}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +TRY{ + UNSER('\R{"t":"NOPE","v":0}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +ASSERT(EQ(errors, 0d4)) \ No newline at end of file diff --git a/tests/cases/passing/unser-errors-numeric.pre b/tests/cases/passing/unser-errors-numeric.pre new file mode 100644 index 0000000..39c5c3d --- /dev/null +++ b/tests/cases/passing/unser-errors-numeric.pre @@ -0,0 +1,21 @@ +INT: errors = 0d0 + +TRY{ + UNSER('\R{"t":"INT","v":"12"}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +TRY{ + UNSER('\R{"t":"FLT","v":"0d1"}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +TRY{ + UNSER('\R{"t":"FLT","v":"-NaN"}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +ASSERT(EQ(errors, 0d3)) \ No newline at end of file diff --git a/tests/cases/passing/unser-errors-structure.pre b/tests/cases/passing/unser-errors-structure.pre new file mode 100644 index 0000000..64cb3cb --- /dev/null +++ b/tests/cases/passing/unser-errors-structure.pre @@ -0,0 +1,27 @@ +INT: errors = 0d0 + +TRY{ + UNSER('\R{"t":"TNS","shape":[0],"v":[]}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +TRY{ + UNSER('\R{"t":"TNS","shape":[2,2],"v":[{"t":"INT","v":"0d1"},{"t":"INT","v":"0d2"},{"t":"INT","v":"0d3"}]}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +TRY{ + UNSER('\R{"t":"MAP","v":[{"k":{"t":"TNS","shape":[1],"v":[{"t":"INT","v":"0d1"}]},"v":{"t":"INT","v":"0d2"}}]}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +TRY{ + UNSER('\R{"t":"MAP","v":[{"k":{"t":"STR","v":"x"}}]}') +} CATCH(err){ + ADD(@errors, 0d1) +} + +ASSERT(EQ(errors, 0d4)) \ No newline at end of file diff --git a/tests/cases/passing/unser-func-closure.pre b/tests/cases/passing/unser-func-closure.pre new file mode 100644 index 0000000..1851356 --- /dev/null +++ b/tests/cases/passing/unser-func-closure.pre @@ -0,0 +1,15 @@ +STR: loc = '\R{"file":"","line":1,"column":1,"statement":""}' + +STR: json = JOIN( ^ + '\R{"t":"FUNC","id":"f1","name":"read_alias","return":"INT","params":[],"def":{"name":"read_alias","return":"INT","params":[],"body":{"n":"Block","loc":', ^ + loc, ^ + '\R,"statements":[{"n":"ReturnStatement","loc":', ^ + loc, ^ + '\R,"expression":{"n":"Identifier","loc":', ^ + loc, ^ + '\R,"name":"alias"}}]},"closure":{"t":"ENV","id":"e1","def":{"values":{"seed":{"t":"INT","v":"0d9"},"alias":{"t":"PTR","name":"seed","env":{"t":"ENV","id":"e1","ref":true},"value_type":"INT"}},"declared":{"seed":"INT","alias":"INT"},"frozen":[],"permafrozen":[],"parent":null}}}}' ^ +) + +FUNC: reader = UNSER(json) +ASSERT(EQ(TYPE(reader), "FUNC")) +ASSERT(EQ(reader(), 0d9)) \ No newline at end of file diff --git a/tests/cases/passing/unser-func-params.pre b/tests/cases/passing/unser-func-params.pre new file mode 100644 index 0000000..ff729a1 --- /dev/null +++ b/tests/cases/passing/unser-func-params.pre @@ -0,0 +1,37 @@ +STR: loc = '\R{"file":"","line":1,"column":1,"statement":""}' + +STR: step_default = JOIN( ^ + '\R{"n":"Literal","loc":', ^ + loc, ^ + '\R,"value":2,"base":10,"literal_type":"INT"}' ^ +) + +STR: params = JOIN( ^ + '\R[{"name":"value","type":"INT","coerced":true,"default":null},{"name":"step","type":"INT","coerced":false,"default":', ^ + step_default, ^ + '\R}]' ^ +) + +STR: json = JOIN( ^ + '\R{"t":"FUNC","id":"f1","name":"add_default","return":"INT","params":', ^ + params, ^ + '\R,"def":{"name":"add_default","return":"INT","params":', ^ + params, ^ + '\R,"body":{"n":"Block","loc":', ^ + loc, ^ + '\R,"statements":[{"n":"ReturnStatement","loc":', ^ + loc, ^ + '\R,"expression":{"n":"CallExpression","loc":', ^ + loc, ^ + '\R,"callee":{"n":"Identifier","loc":', ^ + loc, ^ + '\R,"name":"ADD"},"args":[{"n":"CallArgument","name":null,"expression":{"n":"Identifier","loc":', ^ + loc, ^ + '\R,"name":"value"}},{"n":"CallArgument","name":null,"expression":{"n":"Identifier","loc":', ^ + loc, ^ + '\R,"name":"step"}}]}}]},"closure":null}}' ^ +) + +FUNC: add_default = UNSER(json) +ASSERT(EQ(add_default("0d3"), 0d5)) +ASSERT(EQ(add_default("0d3", step = 0d4), 0d7)) \ No newline at end of file diff --git a/tests/cases/passing/unser-func-ref.pre b/tests/cases/passing/unser-func-ref.pre new file mode 100644 index 0000000..79fd368 --- /dev/null +++ b/tests/cases/passing/unser-func-ref.pre @@ -0,0 +1,22 @@ +STR: loc = '\R{"file":"","line":1,"column":1,"statement":""}' + +STR: full = JOIN( ^ + '\R{"t":"FUNC","id":"f1","name":"five","return":"INT","params":[],"def":{"name":"five","return":"INT","params":[],"body":{"n":"Block","loc":', ^ + loc, ^ + '\R,"statements":[{"n":"ReturnStatement","loc":', ^ + loc, ^ + '\R,"expression":{"n":"Literal","loc":', ^ + loc, ^ + '\R,"value":5,"base":10,"literal_type":"INT"}}]},"closure":null}}' ^ +) + +STR: json = JOIN( ^ + '\R{"t":"MAP","v":[{"k":{"t":"STR","v":"first"},"v":', ^ + full, ^ + '\R},{"k":{"t":"STR","v":"second"},"v":{"t":"FUNC","id":"f1","ref":true}}]}' ^ +) + +MAP: funcs = UNSER(json) +ASSERT(EQ(funcs<"first">, funcs<"second">)) +ASSERT(EQ(funcs<"first">(), 0d5)) +ASSERT(EQ(funcs<"second">(), 0d5)) \ No newline at end of file diff --git a/tests/cases/passing/unser-func.pre b/tests/cases/passing/unser-func.pre new file mode 100644 index 0000000..70174ce --- /dev/null +++ b/tests/cases/passing/unser-func.pre @@ -0,0 +1,21 @@ +STR: loc = '\R{"file":"","line":1,"column":1,"statement":""}' + +STR: json = JOIN( ^ + '\R{"t":"FUNC","id":"f1","name":"double","return":"INT","params":[{"name":"value","type":"INT","coerced":false,"default":null}],"def":{"name":"double","return":"INT","params":[{"name":"value","type":"INT","coerced":false,"default":null}],"body":{"n":"Block","loc":', ^ + loc, ^ + '\R,"statements":[{"n":"ReturnStatement","loc":', ^ + loc, ^ + '\R,"expression":{"n":"CallExpression","loc":', ^ + loc, ^ + '\R,"callee":{"n":"Identifier","loc":', ^ + loc, ^ + '\R,"name":"ADD"},"args":[{"n":"CallArgument","name":null,"expression":{"n":"Identifier","loc":', ^ + loc, ^ + '\R,"name":"value"}},{"n":"CallArgument","name":null,"expression":{"n":"Identifier","loc":', ^ + loc, ^ + '\R,"name":"value"}}]}}]},"closure":null}}' ^ +) + +FUNC: double = UNSER(json) +ASSERT(EQ(TYPE(double), "FUNC")) +ASSERT(EQ(double(0d3), 0d6)) \ No newline at end of file diff --git a/tests/cases/passing/unser-map.pre b/tests/cases/passing/unser-map.pre new file mode 100644 index 0000000..3f5ff24 --- /dev/null +++ b/tests/cases/passing/unser-map.pre @@ -0,0 +1,6 @@ +MAP: value = UNSER('\R{"t":"MAP","v":[{"k":{"t":"STR","v":"alpha"},"v":{"t":"INT","v":"0d1"}},{"k":{"t":"INT","v":"0d2"},"v":{"t":"STR","v":"two"}},{"k":{"t":"FLT","v":"0d3.5"},"v":{"t":"MAP","v":[{"k":{"t":"STR","v":"nested"},"v":{"t":"BOOL","v":true}}]}}]}') + +ASSERT(EQ(value<"alpha">, 0d1)) +ASSERT(EQ(value<0d2>, "two")) +ASSERT(EQ(value<0d3.5, "nested">, TRUE)) +ASSERT(EQ(KEYS(value), ["alpha", 0d2, 0d3.5])) \ No newline at end of file diff --git a/tests/cases/passing/unser-scalars.pre b/tests/cases/passing/unser-scalars.pre new file mode 100644 index 0000000..155bd59 --- /dev/null +++ b/tests/cases/passing/unser-scalars.pre @@ -0,0 +1,10 @@ +ASSERT(EQ(UNSER('\R{"t":"BOOL","v":true}'), TRUE)) + +STR: spaced_false = JOIN("\n ", '\R{"t":"BOOL","v":false}', "\r\t") +ASSERT(EQ(UNSER(spaced_false), FALSE)) + +ASSERT(EQ(UNSER('\R{"t":"INT","v":"-0xA"}'), -0xA)) +ASSERT(EQ(UNSER('\R{"t":"FLT","v":"0d3.5"}'), 0d3.5)) +ASSERT(EQ(STR(UNSER('\R{"t":"FLT","v":"NaN"}')), "NaN")) +ASSERT(EQ(UNSER('\R{"t":"STR","v":"Prefix\n"}'), "Prefix\n")) +ASSERT(EQ(UNSER('\R{"t":"STR","v":"\u00E9"}'), "\u00E9")) \ No newline at end of file diff --git a/tests/cases/passing/unser-tensor.pre b/tests/cases/passing/unser-tensor.pre new file mode 100644 index 0000000..b6fa4b4 --- /dev/null +++ b/tests/cases/passing/unser-tensor.pre @@ -0,0 +1,7 @@ +TNS: tensor = UNSER('\R{"t":"TNS","shape":[2,2],"v":[{"t":"INT","v":"0d1"},{"t":"INT","v":"0d2"},{"t":"INT","v":"0d3"},{"t":"INT","v":"0d4"}]}') + +ASSERT(EQ(tensor, [[0d1, 0d2], [0d3, 0d4]])) +ASSERT(EQ(SHAPE(tensor), [0d2, 0d2])) + +TNS: mixed = UNSER('\R{"t":"TNS","shape":[3],"v":[{"t":"BOOL","v":true},{"t":"STR","v":"two"},{"t":"FLT","v":"0d3.5"}]}') +ASSERT(EQ(mixed, [TRUE, "two", 0d3.5])) \ No newline at end of file diff --git a/tests/cases/passing/unser-thr-ref.pre b/tests/cases/passing/unser-thr-ref.pre new file mode 100644 index 0000000..a293822 --- /dev/null +++ b/tests/cases/passing/unser-thr-ref.pre @@ -0,0 +1,13 @@ +STR: thread_json = '\R{"t":"THR","id":"t1","state":"finished","paused":false,"finished":true,"stop":false,"env":null,"block":null}' + +STR: json = JOIN( ^ + '\R{"t":"MAP","v":[{"k":{"t":"STR","v":"first"},"v":', ^ + thread_json, ^ + '\R},{"k":{"t":"STR","v":"second"},"v":', ^ + thread_json, ^ + '\R}]}' ^ +) + +MAP: threads = UNSER(json) +ASSERT(EQ(threads<"first">, threads<"second">)) +ASSERT(NOT(BOOL(threads<"first">))) \ No newline at end of file diff --git a/tests/cases/passing/unser-thr.pre b/tests/cases/passing/unser-thr.pre new file mode 100644 index 0000000..8ca7397 --- /dev/null +++ b/tests/cases/passing/unser-thr.pre @@ -0,0 +1,9 @@ +THR: finished = UNSER('\R{"t":"THR","id":"t1","state":"finished","paused":false,"finished":true,"stop":false,"env":null,"block":null}') + +ASSERT(EQ(TYPE(finished), "THR")) +ASSERT(NOT(BOOL(finished))) +ASSERT(EQ(AWAIT(finished), finished)) + +THR: paused = UNSER('\R{"t":"THR","id":"t2","state":"paused","paused":true,"finished":false,"stop":false,"env":null,"block":null}') +ASSERT(PAUSED(paused)) +ASSERT(BOOL(paused)) \ No newline at end of file From 1efd600d89390d206da06e6ef1edaaacd6255bb8 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 19 Apr 2026 00:09:26 -0400 Subject: [PATCH 48/60] Add tests for ASSIGN on an index. --- tests/cases/failing/assign-map-index-on-bool.pre | 2 ++ tests/cases/failing/assign-map-index-on-flt.pre | 2 ++ tests/cases/failing/assign-map-index-on-func.pre | 2 ++ tests/cases/failing/assign-map-index-on-int.pre | 2 ++ tests/cases/failing/assign-map-index-on-str.pre | 2 ++ tests/cases/failing/assign-map-index-on-thr.pre | 2 ++ tests/cases/failing/assign-map-index-on-tns.pre | 2 ++ tests/cases/failing/assign-tns-index-on-bool.pre | 2 ++ tests/cases/failing/assign-tns-index-on-flt.pre | 2 ++ tests/cases/failing/assign-tns-index-on-func.pre | 2 ++ tests/cases/failing/assign-tns-index-on-int.pre | 2 ++ tests/cases/failing/assign-tns-index-on-map.pre | 2 ++ tests/cases/failing/assign-tns-index-on-str.pre | 2 ++ tests/cases/failing/assign-tns-index-on-thr.pre | 2 ++ tests/cases/passing/assign-map-index.pre | 3 +++ tests/cases/passing/assign-tns-index.pre | 3 +++ 16 files changed, 34 insertions(+) create mode 100644 tests/cases/failing/assign-map-index-on-bool.pre create mode 100644 tests/cases/failing/assign-map-index-on-flt.pre create mode 100644 tests/cases/failing/assign-map-index-on-func.pre create mode 100644 tests/cases/failing/assign-map-index-on-int.pre create mode 100644 tests/cases/failing/assign-map-index-on-str.pre create mode 100644 tests/cases/failing/assign-map-index-on-thr.pre create mode 100644 tests/cases/failing/assign-map-index-on-tns.pre create mode 100644 tests/cases/failing/assign-tns-index-on-bool.pre create mode 100644 tests/cases/failing/assign-tns-index-on-flt.pre create mode 100644 tests/cases/failing/assign-tns-index-on-func.pre create mode 100644 tests/cases/failing/assign-tns-index-on-int.pre create mode 100644 tests/cases/failing/assign-tns-index-on-map.pre create mode 100644 tests/cases/failing/assign-tns-index-on-str.pre create mode 100644 tests/cases/failing/assign-tns-index-on-thr.pre create mode 100644 tests/cases/passing/assign-map-index.pre create mode 100644 tests/cases/passing/assign-tns-index.pre diff --git a/tests/cases/failing/assign-map-index-on-bool.pre b/tests/cases/failing/assign-map-index-on-bool.pre new file mode 100644 index 0000000..46a77a3 --- /dev/null +++ b/tests/cases/failing/assign-map-index-on-bool.pre @@ -0,0 +1,2 @@ +BOOL: b = TRUE +ASSIGN(b<"k">, 0d1) diff --git a/tests/cases/failing/assign-map-index-on-flt.pre b/tests/cases/failing/assign-map-index-on-flt.pre new file mode 100644 index 0000000..5bd4263 --- /dev/null +++ b/tests/cases/failing/assign-map-index-on-flt.pre @@ -0,0 +1,2 @@ +FLT: f = 0d1.5 +ASSIGN(f<0d1>, 0d1) diff --git a/tests/cases/failing/assign-map-index-on-func.pre b/tests/cases/failing/assign-map-index-on-func.pre new file mode 100644 index 0000000..0f34bc1 --- /dev/null +++ b/tests/cases/failing/assign-map-index-on-func.pre @@ -0,0 +1,2 @@ +FUNC: fn = GET_FIVE +ASSIGN(fn<"k">, 0d1) diff --git a/tests/cases/failing/assign-map-index-on-int.pre b/tests/cases/failing/assign-map-index-on-int.pre new file mode 100644 index 0000000..c6536a2 --- /dev/null +++ b/tests/cases/failing/assign-map-index-on-int.pre @@ -0,0 +1,2 @@ +INT: i = 0d1 +ASSIGN(i<0d1>, 0d1) diff --git a/tests/cases/failing/assign-map-index-on-str.pre b/tests/cases/failing/assign-map-index-on-str.pre new file mode 100644 index 0000000..f316a8c --- /dev/null +++ b/tests/cases/failing/assign-map-index-on-str.pre @@ -0,0 +1,2 @@ +STR: s = "x" +ASSIGN(s<"k">, 0d1) diff --git a/tests/cases/failing/assign-map-index-on-thr.pre b/tests/cases/failing/assign-map-index-on-thr.pre new file mode 100644 index 0000000..274f076 --- /dev/null +++ b/tests/cases/failing/assign-map-index-on-thr.pre @@ -0,0 +1,2 @@ +THR: t = ASYNC{} +ASSIGN(t<"k">, 0d1) diff --git a/tests/cases/failing/assign-map-index-on-tns.pre b/tests/cases/failing/assign-map-index-on-tns.pre new file mode 100644 index 0000000..68c816c --- /dev/null +++ b/tests/cases/failing/assign-map-index-on-tns.pre @@ -0,0 +1,2 @@ +TNS: vec = [0d1, 0d2] +ASSIGN(vec<"a">, 0d1) diff --git a/tests/cases/failing/assign-tns-index-on-bool.pre b/tests/cases/failing/assign-tns-index-on-bool.pre new file mode 100644 index 0000000..e4f3a56 --- /dev/null +++ b/tests/cases/failing/assign-tns-index-on-bool.pre @@ -0,0 +1,2 @@ +BOOL: b = TRUE +ASSIGN(b[0d1], 0d1) diff --git a/tests/cases/failing/assign-tns-index-on-flt.pre b/tests/cases/failing/assign-tns-index-on-flt.pre new file mode 100644 index 0000000..3054806 --- /dev/null +++ b/tests/cases/failing/assign-tns-index-on-flt.pre @@ -0,0 +1,2 @@ +FLT: f = 0d1.5 +ASSIGN(f[0d1], 0d1) diff --git a/tests/cases/failing/assign-tns-index-on-func.pre b/tests/cases/failing/assign-tns-index-on-func.pre new file mode 100644 index 0000000..cc7a007 --- /dev/null +++ b/tests/cases/failing/assign-tns-index-on-func.pre @@ -0,0 +1,2 @@ +FUNC: fn = GET_FIVE +ASSIGN(fn[0d1], 0d1) diff --git a/tests/cases/failing/assign-tns-index-on-int.pre b/tests/cases/failing/assign-tns-index-on-int.pre new file mode 100644 index 0000000..9d30756 --- /dev/null +++ b/tests/cases/failing/assign-tns-index-on-int.pre @@ -0,0 +1,2 @@ +INT: i = 0d1 +ASSIGN(i[0d1], 0d2) diff --git a/tests/cases/failing/assign-tns-index-on-map.pre b/tests/cases/failing/assign-tns-index-on-map.pre new file mode 100644 index 0000000..f2a9f6c --- /dev/null +++ b/tests/cases/failing/assign-tns-index-on-map.pre @@ -0,0 +1,2 @@ +MAP: m = <"a" = 0d1> +ASSIGN(m[0d1], 0d2) diff --git a/tests/cases/failing/assign-tns-index-on-str.pre b/tests/cases/failing/assign-tns-index-on-str.pre new file mode 100644 index 0000000..032db74 --- /dev/null +++ b/tests/cases/failing/assign-tns-index-on-str.pre @@ -0,0 +1,2 @@ +STR: s = "x" +ASSIGN(s[0d1], 0d1) diff --git a/tests/cases/failing/assign-tns-index-on-thr.pre b/tests/cases/failing/assign-tns-index-on-thr.pre new file mode 100644 index 0000000..478c8ba --- /dev/null +++ b/tests/cases/failing/assign-tns-index-on-thr.pre @@ -0,0 +1,2 @@ +THR: t = ASYNC{} +ASSIGN(t[0d1], 0d1) diff --git a/tests/cases/passing/assign-map-index.pre b/tests/cases/passing/assign-map-index.pre new file mode 100644 index 0000000..aaf9126 --- /dev/null +++ b/tests/cases/passing/assign-map-index.pre @@ -0,0 +1,3 @@ +MAP: m = <"a" = 0d1> +ASSERT(EQ(ASSIGN(m<"b">, 0d2), 0d2)) +ASSERT(EQ(m<"b">, 0d2)) diff --git a/tests/cases/passing/assign-tns-index.pre b/tests/cases/passing/assign-tns-index.pre new file mode 100644 index 0000000..2779dcc --- /dev/null +++ b/tests/cases/passing/assign-tns-index.pre @@ -0,0 +1,3 @@ +TNS: vec = [0d1, 0d2, 0d3] +ASSERT(EQ(ASSIGN(vec[0d2], 0d9), 0d9)) +ASSERT(EQ(vec[0d2], 0d9)) From d55d1576d352434d18bd5c94a0f70df5a00cdbc5 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 19 Apr 2026 00:26:45 -0400 Subject: [PATCH 49/60] Add tests for TNS slice assignment. --- tests/cases/failing/tns-slice-dim-mismatch.pre | 2 ++ tests/cases/failing/tns-slice-element-type-mismatch.pre | 2 ++ tests/cases/failing/tns-slice-rhs-not-tns.pre | 2 ++ tests/cases/failing/tns-slice-shape-mismatch.pre | 2 ++ tests/cases/passing/tns-slice-assign-1d.pre | 4 ++++ tests/cases/passing/tns-slice-assign-2d.pre | 4 ++++ 6 files changed, 16 insertions(+) create mode 100644 tests/cases/failing/tns-slice-dim-mismatch.pre create mode 100644 tests/cases/failing/tns-slice-element-type-mismatch.pre create mode 100644 tests/cases/failing/tns-slice-rhs-not-tns.pre create mode 100644 tests/cases/failing/tns-slice-shape-mismatch.pre create mode 100644 tests/cases/passing/tns-slice-assign-1d.pre create mode 100644 tests/cases/passing/tns-slice-assign-2d.pre diff --git a/tests/cases/failing/tns-slice-dim-mismatch.pre b/tests/cases/failing/tns-slice-dim-mismatch.pre new file mode 100644 index 0000000..0d8eb21 --- /dev/null +++ b/tests/cases/failing/tns-slice-dim-mismatch.pre @@ -0,0 +1,2 @@ +TNS: matrix = [[0d1, 0d2], [0d3, 0d4]] +ASSIGN(matrix[*, 0d2], [[0d9], [0d10]]) diff --git a/tests/cases/failing/tns-slice-element-type-mismatch.pre b/tests/cases/failing/tns-slice-element-type-mismatch.pre new file mode 100644 index 0000000..6269095 --- /dev/null +++ b/tests/cases/failing/tns-slice-element-type-mismatch.pre @@ -0,0 +1,2 @@ +TNS: vec = [0d1, 0d2] +ASSIGN(vec[0d1-0d2], [0d1.5, 0d2.5]) diff --git a/tests/cases/failing/tns-slice-rhs-not-tns.pre b/tests/cases/failing/tns-slice-rhs-not-tns.pre new file mode 100644 index 0000000..c8a8c59 --- /dev/null +++ b/tests/cases/failing/tns-slice-rhs-not-tns.pre @@ -0,0 +1,2 @@ +TNS: vec = [0d1, 0d2] +ASSIGN(vec[0d1-0d2], 0d9) diff --git a/tests/cases/failing/tns-slice-shape-mismatch.pre b/tests/cases/failing/tns-slice-shape-mismatch.pre new file mode 100644 index 0000000..5f007cd --- /dev/null +++ b/tests/cases/failing/tns-slice-shape-mismatch.pre @@ -0,0 +1,2 @@ +TNS: matrix = [[0d1, 0d2], [0d3, 0d4]] +ASSIGN(matrix[*, *], [[0d9, 0d10, 0d11], [0d12, 0d13, 0d14]]) diff --git a/tests/cases/passing/tns-slice-assign-1d.pre b/tests/cases/passing/tns-slice-assign-1d.pre new file mode 100644 index 0000000..2a3f549 --- /dev/null +++ b/tests/cases/passing/tns-slice-assign-1d.pre @@ -0,0 +1,4 @@ +TNS: vec = [0d1, 0d2, 0d3] + +ASSERT(EQ(ASSIGN(vec[0d1-0d2], [0d9, 0d10]), [0d9, 0d10])) +ASSERT(EQ(vec, [0d9, 0d10, 0d3])) diff --git a/tests/cases/passing/tns-slice-assign-2d.pre b/tests/cases/passing/tns-slice-assign-2d.pre new file mode 100644 index 0000000..60b3e60 --- /dev/null +++ b/tests/cases/passing/tns-slice-assign-2d.pre @@ -0,0 +1,4 @@ +TNS: matrix = [[0d1, 0d2], [0d3, 0d4]] + +ASSERT(EQ(ASSIGN(matrix[*, 0d2], [0d9, 0d10]), [0d9, 0d10])) +ASSERT(EQ(matrix, [[0d1, 0d9], [0d3, 0d10]])) From 9ca9be2d771112d2e26862ad1793c3df6f7b3754 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 19 Apr 2026 04:45:41 -0400 Subject: [PATCH 50/60] Add tests for nested-MAP auto-creation. --- tests/cases/passing/assign-nested-map-auto-create.pre | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 tests/cases/passing/assign-nested-map-auto-create.pre diff --git a/tests/cases/passing/assign-nested-map-auto-create.pre b/tests/cases/passing/assign-nested-map-auto-create.pre new file mode 100644 index 0000000..d43c0ed --- /dev/null +++ b/tests/cases/passing/assign-nested-map-auto-create.pre @@ -0,0 +1,5 @@ +MAP: m + +ASSERT(EQ(ASSIGN(m<"a", "b">, 0d5), 0d5)) +ASSERT(EQ(m<"a", "b">, 0d5)) +ASSERT(EQ(m, <"a" = <"b" = 0d5>>)) From 0e3eaac41e94015e352835ec6eddec3b41e7a0b3 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 19 Apr 2026 22:54:25 -0400 Subject: [PATCH 51/60] Add test for circular pointers and frozen pointers. --- tests/cases/failing/alias-cycle.pre | 4 ++++ tests/cases/failing/alias-to-frozen.pre | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 tests/cases/failing/alias-cycle.pre create mode 100644 tests/cases/failing/alias-to-frozen.pre diff --git a/tests/cases/failing/alias-cycle.pre b/tests/cases/failing/alias-cycle.pre new file mode 100644 index 0000000..4000ead --- /dev/null +++ b/tests/cases/failing/alias-cycle.pre @@ -0,0 +1,4 @@ +MAP: x = <"v" = 0d1> +MAP: a = @x + +MAP: x = @a diff --git a/tests/cases/failing/alias-to-frozen.pre b/tests/cases/failing/alias-to-frozen.pre new file mode 100644 index 0000000..6560061 --- /dev/null +++ b/tests/cases/failing/alias-to-frozen.pre @@ -0,0 +1,4 @@ +INT: t = 0d1 +FREEZE(t) + +INT: p = @t From b26b38c24fab67e093ecd297ae823795c5b04747 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 19 Apr 2026 23:15:29 -0400 Subject: [PATCH 52/60] Add tests for ASYNC deferral. --- tests/cases/passing/pause-async-deferred-arg.pre | 16 ++++++++++++++++ tests/cases/passing/stop-async-deferred-arg.pre | 10 ++++++++++ 2 files changed, 26 insertions(+) create mode 100644 tests/cases/passing/pause-async-deferred-arg.pre create mode 100644 tests/cases/passing/stop-async-deferred-arg.pre diff --git a/tests/cases/passing/pause-async-deferred-arg.pre b/tests/cases/passing/pause-async-deferred-arg.pre new file mode 100644 index 0000000..205f15e --- /dev/null +++ b/tests/cases/passing/pause-async-deferred-arg.pre @@ -0,0 +1,16 @@ +BOOL: released = FALSE + +THR: paused = PAUSE(ASYNC{ + WHILE(NOT(released)){} +}, seconds = 0d0.05) + +ASSERT(EQ(TYPE(paused), "THR")) +ASSERT(BOOL(paused)) +ASSERT(PAUSED(paused)) + +released = TRUE + +AWAIT(paused) + +ASSERT(NOT(BOOL(paused))) +ASSERT(NOT(PAUSED(paused))) diff --git a/tests/cases/passing/stop-async-deferred-arg.pre b/tests/cases/passing/stop-async-deferred-arg.pre new file mode 100644 index 0000000..b70cd8b --- /dev/null +++ b/tests/cases/passing/stop-async-deferred-arg.pre @@ -0,0 +1,10 @@ +BOOL: reached_end = FALSE + +THR: stopped = STOP(ASYNC{ + FOR(i, 0d100000){} + reached_end = TRUE +}) + +ASSERT(EQ(TYPE(stopped), "THR")) +ASSERT(NOT(BOOL(stopped))) +ASSERT(EQ(reached_end, FALSE)) From fa57616ee5baea1144cb68e0e224b23cb0116fc9 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Sun, 19 Apr 2026 23:34:06 -0400 Subject: [PATCH 53/60] Add tests for ASYNC escaping CATCH. --- .../cases/passing/async-error-not-caught.pre | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/cases/passing/async-error-not-caught.pre diff --git a/tests/cases/passing/async-error-not-caught.pre b/tests/cases/passing/async-error-not-caught.pre new file mode 100644 index 0000000..0414779 --- /dev/null +++ b/tests/cases/passing/async-error-not-caught.pre @@ -0,0 +1,27 @@ +BOOL: caught = FALSE + +TRY{ + THR: worker = ASYNC{ + FREEZE(not_declared) + } +} CATCH { + caught = TRUE +} + +ASSERT(NOT(caught)) + + +! Also ensure awaiting the failed thread does not synchronously raise +BOOL: caught_await = FALSE + +THR: worker2 = ASYNC{ + FREEZE(not_declared) +} + +TRY{ + AWAIT(worker2) +} CATCH { + caught_await = TRUE +} + +ASSERT(NOT(caught_await)) From bb0678878835cccef494920e2301789d17b235f1 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 20 Apr 2026 00:09:38 -0400 Subject: [PATCH 54/60] Add tests for RESTART. --- tests/cases/failing/restart-arity-two.pre | 1 + tests/cases/failing/restart-arity-zero.pre | 1 + tests/cases/failing/restart-bool.pre | 1 + tests/cases/failing/restart-flt.pre | 1 + tests/cases/failing/restart-func.pre | 1 + tests/cases/failing/restart-int.pre | 1 + tests/cases/failing/restart-map.pre | 1 + tests/cases/failing/restart-running.pre | 5 +++++ tests/cases/failing/restart-str.pre | 1 + tests/cases/failing/restart-tns.pre | 1 + tests/cases/passing/restart-basic.pre | 20 ++++++++++++++++++++ 11 files changed, 34 insertions(+) create mode 100644 tests/cases/failing/restart-arity-two.pre create mode 100644 tests/cases/failing/restart-arity-zero.pre create mode 100644 tests/cases/failing/restart-bool.pre create mode 100644 tests/cases/failing/restart-flt.pre create mode 100644 tests/cases/failing/restart-func.pre create mode 100644 tests/cases/failing/restart-int.pre create mode 100644 tests/cases/failing/restart-map.pre create mode 100644 tests/cases/failing/restart-running.pre create mode 100644 tests/cases/failing/restart-str.pre create mode 100644 tests/cases/failing/restart-tns.pre create mode 100644 tests/cases/passing/restart-basic.pre diff --git a/tests/cases/failing/restart-arity-two.pre b/tests/cases/failing/restart-arity-two.pre new file mode 100644 index 0000000..8ec025e --- /dev/null +++ b/tests/cases/failing/restart-arity-two.pre @@ -0,0 +1 @@ +RESTART(ASYNC{}, ASYNC{}) \ No newline at end of file diff --git a/tests/cases/failing/restart-arity-zero.pre b/tests/cases/failing/restart-arity-zero.pre new file mode 100644 index 0000000..3dd6c41 --- /dev/null +++ b/tests/cases/failing/restart-arity-zero.pre @@ -0,0 +1 @@ +RESTART() \ No newline at end of file diff --git a/tests/cases/failing/restart-bool.pre b/tests/cases/failing/restart-bool.pre new file mode 100644 index 0000000..72822d2 --- /dev/null +++ b/tests/cases/failing/restart-bool.pre @@ -0,0 +1 @@ +RESTART(TRUE) \ No newline at end of file diff --git a/tests/cases/failing/restart-flt.pre b/tests/cases/failing/restart-flt.pre new file mode 100644 index 0000000..295da6b --- /dev/null +++ b/tests/cases/failing/restart-flt.pre @@ -0,0 +1 @@ +RESTART(0d1.0) \ No newline at end of file diff --git a/tests/cases/failing/restart-func.pre b/tests/cases/failing/restart-func.pre new file mode 100644 index 0000000..6005b39 --- /dev/null +++ b/tests/cases/failing/restart-func.pre @@ -0,0 +1 @@ +RESTART(LAMBDA BOOL: (){}) \ No newline at end of file diff --git a/tests/cases/failing/restart-int.pre b/tests/cases/failing/restart-int.pre new file mode 100644 index 0000000..0c6198b --- /dev/null +++ b/tests/cases/failing/restart-int.pre @@ -0,0 +1 @@ +RESTART(0d1) \ No newline at end of file diff --git a/tests/cases/failing/restart-map.pre b/tests/cases/failing/restart-map.pre new file mode 100644 index 0000000..d76c2a5 --- /dev/null +++ b/tests/cases/failing/restart-map.pre @@ -0,0 +1 @@ +RESTART(<>) \ No newline at end of file diff --git a/tests/cases/failing/restart-running.pre b/tests/cases/failing/restart-running.pre new file mode 100644 index 0000000..ff77bdb --- /dev/null +++ b/tests/cases/failing/restart-running.pre @@ -0,0 +1,5 @@ +THR: worker = ASYNC{ + FOR(i, 0d100000){} +} + +RESTART(worker) diff --git a/tests/cases/failing/restart-str.pre b/tests/cases/failing/restart-str.pre new file mode 100644 index 0000000..8ad9a32 --- /dev/null +++ b/tests/cases/failing/restart-str.pre @@ -0,0 +1 @@ +RESTART("thread") \ No newline at end of file diff --git a/tests/cases/failing/restart-tns.pre b/tests/cases/failing/restart-tns.pre new file mode 100644 index 0000000..74b83d3 --- /dev/null +++ b/tests/cases/failing/restart-tns.pre @@ -0,0 +1 @@ +RESTART([0d1]) \ No newline at end of file diff --git a/tests/cases/passing/restart-basic.pre b/tests/cases/passing/restart-basic.pre new file mode 100644 index 0000000..884d790 --- /dev/null +++ b/tests/cases/passing/restart-basic.pre @@ -0,0 +1,20 @@ +BOOL: finished = FALSE + +THR: worker = ASYNC{ + FOR(i, 0d2){} + finished = TRUE +} + +! Wait for worker to finish +AWAIT(worker) +ASSERT(EQ(finished, TRUE)) + +! Restart the finished thread +THR: r = RESTART(worker) +ASSERT(EQ(TYPE(r), "THR")) +ASSERT(EQ(r, worker)) +ASSERT(BOOL(r)) + +! After restart, the thread should run again and set finished +AWAIT(r) +ASSERT(EQ(finished, TRUE)) From 943679990ae6c4b9fd87c80b5302a03423f9d43e Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 20 Apr 2026 00:14:12 -0400 Subject: [PATCH 55/60] Add test for RESUME on non-paused thread. --- tests/cases/failing/resume-not-paused.pre | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 tests/cases/failing/resume-not-paused.pre diff --git a/tests/cases/failing/resume-not-paused.pre b/tests/cases/failing/resume-not-paused.pre new file mode 100644 index 0000000..8508ac8 --- /dev/null +++ b/tests/cases/failing/resume-not-paused.pre @@ -0,0 +1,5 @@ +THR: worker = ASYNC{ + FOR(i, 0d100000){} +} + +RESUME(worker) From 7ff826b844c618b88c6caac411eefc717126844e Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 20 Apr 2026 01:11:03 -0400 Subject: [PATCH 56/60] Add tests for -private mode. --- .../traceback-private-overrides-verbose.ps1 | 38 +++++++++++++++++ ...traceback-private-suppresses-snapshots.ps1 | 42 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 tests/cases/passing/traceback-private-overrides-verbose.ps1 create mode 100644 tests/cases/passing/traceback-private-suppresses-snapshots.ps1 diff --git a/tests/cases/passing/traceback-private-overrides-verbose.ps1 b/tests/cases/passing/traceback-private-overrides-verbose.ps1 new file mode 100644 index 0000000..79f9ab0 --- /dev/null +++ b/tests/cases/passing/traceback-private-overrides-verbose.ps1 @@ -0,0 +1,38 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +FREEZE(not_declared) +'@ + + # Pass both -verbose and -private; private should suppress snapshots + $result = Invoke-PrefixWithArguments -Arguments @('-verbose', '-private', $programPath) + + if ($result.ExitCode -eq 0) { + $stdout = Format-VisibleText $result.Stdout + $stderr = Format-VisibleText $result.Stderr + throw "Expected interpreter to exit nonzero; got 0. STDOUT: $stdout STDERR: $stderr" + } + + if (-not ($result.Stderr -match 'Traceback')) { + $stderr = Format-VisibleText $result.Stderr + throw "Expected 'Traceback' in stderr: $stderr" + } + + if ($result.Stderr -match 'State log index') { + $stderr = Format-VisibleText $result.Stderr + throw "Unexpected state log when -private present: $stderr" + } + + if ($result.Stderr -match 'Env snapshot') { + $stderr = Format-VisibleText $result.Stderr + throw "Unexpected env snapshot when -private present: $stderr" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/tests/cases/passing/traceback-private-suppresses-snapshots.ps1 b/tests/cases/passing/traceback-private-suppresses-snapshots.ps1 new file mode 100644 index 0000000..8564454 --- /dev/null +++ b/tests/cases/passing/traceback-private-suppresses-snapshots.ps1 @@ -0,0 +1,42 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$tempDir = New-PrefixTempDir +try { + $programPath = Join-Path $tempDir 'program.pre' + + Set-Content -Path $programPath -Encoding Ascii -Value @' +FREEZE(not_declared) +'@ + + $result = Invoke-PrefixWithArguments -Arguments @('-private', $programPath) + + if ($result.ExitCode -eq 0) { + $stdout = Format-VisibleText $result.Stdout + $stderr = Format-VisibleText $result.Stderr + throw "Expected interpreter to exit nonzero; got 0. STDOUT: $stdout STDERR: $stderr" + } + + if (-not ($result.Stderr -match 'Traceback')) { + $stderr = Format-VisibleText $result.Stderr + throw "Expected 'Traceback' in stderr: $stderr" + } + + if (-not ($result.Stderr -match 'RuntimeError')) { + $stderr = Format-VisibleText $result.Stderr + throw "Expected 'RuntimeError' in stderr: $stderr" + } + + if ($result.Stderr -match 'State log index') { + $stderr = Format-VisibleText $result.Stderr + throw "Unexpected state log in private mode: $stderr" + } + + if ($result.Stderr -match 'Env snapshot') { + $stderr = Format-VisibleText $result.Stderr + throw "Unexpected env snapshot in private mode: $stderr" + } +} +finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue +} From f7ab1e12684b4765f3349376d5b3b7629d89ae57 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 20 Apr 2026 05:06:32 -0400 Subject: [PATCH 57/60] Add test for the REPL. --- .../passing/readfile-utf16-replacement.pre | 6 ++++++ tests/cases/passing/repl-basic.ps1 | 12 +++++++++++ tests/cases/passing/repl-eof.ps1 | 13 ++++++++++++ tests/cases/passing/repl-multiline.ps1 | 20 +++++++++++++++++++ tests/cases/passing/repl-persistence.ps1 | 19 ++++++++++++++++++ tests/cases/passing/writefile-bin-alias.pre | 7 +++++++ tests/cases/passing/writefile-fail-dir.pre | 11 ++++++++++ tests/cases/passing/writefile-utf16-be.pre | 6 ++++++ tests/cases/passing/writefile-utf16-le.pre | 6 ++++++ tests/helpers/prefix-input.ps1 | 13 ++++++------ 10 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 tests/cases/passing/readfile-utf16-replacement.pre create mode 100644 tests/cases/passing/repl-basic.ps1 create mode 100644 tests/cases/passing/repl-eof.ps1 create mode 100644 tests/cases/passing/repl-multiline.ps1 create mode 100644 tests/cases/passing/repl-persistence.ps1 create mode 100644 tests/cases/passing/writefile-bin-alias.pre create mode 100644 tests/cases/passing/writefile-fail-dir.pre create mode 100644 tests/cases/passing/writefile-utf16-be.pre create mode 100644 tests/cases/passing/writefile-utf16-le.pre diff --git a/tests/cases/passing/readfile-utf16-replacement.pre b/tests/cases/passing/readfile-utf16-replacement.pre new file mode 100644 index 0000000..428e914 --- /dev/null +++ b/tests/cases/passing/readfile-utf16-replacement.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-readfile-utf16-replacement.bin") + +ASSERT(WRITEFILE("00D8", p, coding = "hex")) +ASSERT(EQ(READFILE(p, coding = "UTF-16 LE"), "\uFFFD")) diff --git a/tests/cases/passing/repl-basic.ps1 b/tests/cases/passing/repl-basic.ps1 new file mode 100644 index 0000000..faa9a3f --- /dev/null +++ b/tests/cases/passing/repl-basic.ps1 @@ -0,0 +1,12 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$result = Invoke-PrefixWithArguments -Arguments @() -InputText "PRINT('repl-basic')`n.exit`n" + +Assert-PrefixSuccess $result +Assert-NoErrorOutput $result + +$stdout = Format-VisibleText $result.Stdout +if (-not ($stdout -match 'repl-basic')) { + throw "Unexpected stdout: $stdout" +} diff --git a/tests/cases/passing/repl-eof.ps1 b/tests/cases/passing/repl-eof.ps1 new file mode 100644 index 0000000..38f9283 --- /dev/null +++ b/tests/cases/passing/repl-eof.ps1 @@ -0,0 +1,13 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +# Send a single command and EOF (no explicit .exit) +$result = Invoke-PrefixWithArguments -Arguments @() -InputText "PRINT('bye')`n" + +Assert-PrefixSuccess $result +Assert-NoErrorOutput $result + +$stdout = Format-VisibleText $result.Stdout +if (-not ($stdout -match 'bye')) { + throw "Unexpected stdout: $stdout" +} diff --git a/tests/cases/passing/repl-multiline.ps1 b/tests/cases/passing/repl-multiline.ps1 new file mode 100644 index 0000000..0cbc3e3 --- /dev/null +++ b/tests/cases/passing/repl-multiline.ps1 @@ -0,0 +1,20 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$input = @' +FUNC STR: hello(){ +RETURN("hi") +} +PRINT(hello()) +.exit +'@ + +$result = Invoke-PrefixWithArguments -Arguments @() -InputText $input + +Assert-PrefixSuccess $result +Assert-NoErrorOutput $result + +$stdout = Format-VisibleText $result.Stdout +if (-not ($stdout -match 'hi')) { + throw "Unexpected stdout: $stdout" +} diff --git a/tests/cases/passing/repl-persistence.ps1 b/tests/cases/passing/repl-persistence.ps1 new file mode 100644 index 0000000..7d73ab8 --- /dev/null +++ b/tests/cases/passing/repl-persistence.ps1 @@ -0,0 +1,19 @@ +$helperPath = Join-Path (Split-Path -Parent (Split-Path -Parent $PSScriptRoot)) 'helpers\prefix-input.ps1' +. $helperPath + +$input = @' +BOOL: persisted = TRUE + +PRINT(persisted) +.exit +'@ + +$result = Invoke-PrefixWithArguments -Arguments @() -InputText $input + +Assert-PrefixSuccess $result +Assert-NoErrorOutput $result + +$stdout = Format-VisibleText $result.Stdout +if (-not ($stdout -match 'TRUE')) { + throw "Unexpected stdout: $stdout" +} diff --git a/tests/cases/passing/writefile-bin-alias.pre b/tests/cases/passing/writefile-bin-alias.pre new file mode 100644 index 0000000..876445b --- /dev/null +++ b/tests/cases/passing/writefile-bin-alias.pre @@ -0,0 +1,7 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-bin.bin") + +ASSERT(WRITEFILE("0100000101111010", p, coding = "bin")) +ASSERT(EQ(READFILE(p, coding = "bin"), "0100000101111010")) +ASSERT(EQ(READFILE(p), "Az")) diff --git a/tests/cases/passing/writefile-fail-dir.pre b/tests/cases/passing/writefile-fail-dir.pre new file mode 100644 index 0000000..973e2cf --- /dev/null +++ b/tests/cases/passing/writefile-fail-dir.pre @@ -0,0 +1,11 @@ +IMPORT(path) + +STR: d = path.TEMPFILE("prefix-writefile-fail-dir") + +IF(EQ(OS(),"win")){ + ASSERT(EQ(CL(JOIN("md ", WINPATH(d))), 0d0)) +} ELSE { + ASSERT(EQ(CL(JOIN("mkdir -p ", d)), 0d0)) +} + +ASSERT(NOT(WRITEFILE("x", d))) diff --git a/tests/cases/passing/writefile-utf16-be.pre b/tests/cases/passing/writefile-utf16-be.pre new file mode 100644 index 0000000..4ad5526 --- /dev/null +++ b/tests/cases/passing/writefile-utf16-be.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-utf16-be.txt") + +ASSERT(WRITEFILE("Prefix", p, coding = "UTF-16 BE")) +ASSERT(EQ(READFILE(p, coding = "UTF-16 BE"), "Prefix")) diff --git a/tests/cases/passing/writefile-utf16-le.pre b/tests/cases/passing/writefile-utf16-le.pre new file mode 100644 index 0000000..935a967 --- /dev/null +++ b/tests/cases/passing/writefile-utf16-le.pre @@ -0,0 +1,6 @@ +IMPORT(path) + +STR: p = path.TEMPFILE("prefix-writefile-utf16-le.txt") + +ASSERT(WRITEFILE("Prefix", p, coding = "UTF-16 LE")) +ASSERT(EQ(READFILE(p, coding = "UTF-16 LE"), "Prefix")) diff --git a/tests/helpers/prefix-input.ps1 b/tests/helpers/prefix-input.ps1 index ae92f0a..7990132 100644 --- a/tests/helpers/prefix-input.ps1 +++ b/tests/helpers/prefix-input.ps1 @@ -51,9 +51,10 @@ function New-PrefixTempDir { function ConvertTo-PrefixArgumentString { param( - [Parameter(Mandatory = $true)] - [string[]]$Arguments + [Parameter(Mandatory = $false)] + [string[]]$Arguments = @() ) + if (-not $Arguments) { return '' } $escaped = foreach ($argument in $Arguments) { if ($null -eq $argument) { @@ -69,8 +70,8 @@ function ConvertTo-PrefixArgumentString { function Start-PrefixProcessWithArguments { param( - [Parameter(Mandatory = $true)] - [string[]]$Arguments, + [Parameter(Mandatory = $false)] + [string[]]$Arguments = @(), [string]$WorkingDirectory, @@ -118,8 +119,8 @@ function Start-PrefixProcess { function Invoke-PrefixWithArguments { param( - [Parameter(Mandatory = $true)] - [string[]]$Arguments, + [Parameter(Mandatory = $false)] + [string[]]$Arguments = @(), [AllowEmptyString()] [string]$InputText = '', From fa7fdb86298b562119f14d611e03b77801f80c12 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 20 Apr 2026 05:40:54 -0400 Subject: [PATCH 58/60] Fix FDIV test. --- tests/cases/passing/fdiv.pre | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/cases/passing/fdiv.pre b/tests/cases/passing/fdiv.pre index d517184..04ff243 100644 --- a/tests/cases/passing/fdiv.pre +++ b/tests/cases/passing/fdiv.pre @@ -1,4 +1,3 @@ -! FDIV(0d1.0, 0d0.0) performing IEEE 754 division by zero DOES NOT return an error, it returns INF INT: a = IADD(0d1, 0d1.0) FLT: b = FDIV(0d1.0, 0d0.0) FLT: x = 0d1.0 From 0e82da0b058723b5ad498bb3de52decc4f4a88ab Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 20 Apr 2026 05:45:52 -0400 Subject: [PATCH 59/60] Fix FUNC test. --- tests/cases/passing/func-call-errors.pre | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/cases/passing/func-call-errors.pre b/tests/cases/passing/func-call-errors.pre index 6318393..58fb71c 100644 --- a/tests/cases/passing/func-call-errors.pre +++ b/tests/cases/passing/func-call-errors.pre @@ -18,12 +18,6 @@ TRY{ runtime_errors = ADD(runtime_errors, 0d1) } -TRY{ - coerce_int("not-an-int") -} CATCH(err){ - runtime_errors = ADD(runtime_errors, 0d1) -} - TRY{ keyword_only("0d1", "0d2", "0d3") } CATCH(err){ @@ -42,4 +36,4 @@ TRY{ runtime_errors = ADD(runtime_errors, 0d1) } -ASSERT(EQ(runtime_errors, 0d5)) +ASSERT(EQ(runtime_errors, 0d4)) From 1095b2457e8aa24a2d33e6e598a0e195224e0d44 Mon Sep 17 00:00:00 2001 From: python-processing-unit Date: Mon, 20 Apr 2026 05:48:30 -0400 Subject: [PATCH 60/60] Fix WRITEFILE test. --- tests/cases/passing/writefile-fail-dir.pre | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cases/passing/writefile-fail-dir.pre b/tests/cases/passing/writefile-fail-dir.pre index 973e2cf..e3b8e54 100644 --- a/tests/cases/passing/writefile-fail-dir.pre +++ b/tests/cases/passing/writefile-fail-dir.pre @@ -3,7 +3,7 @@ IMPORT(path) STR: d = path.TEMPFILE("prefix-writefile-fail-dir") IF(EQ(OS(),"win")){ - ASSERT(EQ(CL(JOIN("md ", WINPATH(d))), 0d0)) + ASSERT(EQ(CL(JOIN("md ", path.WINPATH(d))), 0d0)) } ELSE { ASSERT(EQ(CL(JOIN("mkdir -p ", d)), 0d0)) }