;; ========================================================================== ;; test-gate-pins.sx — W14 regression pins for the review's landed fixes ;; ;; The quick-wins batch (commit dc7aa709 + siblings) landed real semantics ;; fixes but shipped WITHOUT pinning tests, so a regression would pass ;; silently. This file pins each confirmed-and-fixed finding with a minimal ;; repro lifted from the review lane files (plans/sx-review/*.md). One suite ;; per finding. ;; ;; TEST-ONLY: no semantics edits. If a pin fails, the fix regressed — do NOT ;; relax the assertion; investigate the evaluator/primitive change. ;; ========================================================================== ;; -------------------------------------------------------------------------- ;; K18 [W7, high] expt silently wrapped at 63-bit int — now promotes to float ;; like +/*. Repro (core.md): (expt 2 62) -> -4611686018427387904 (wrapped); ;; (expt 2 100) -> 0. Fixed: both are positive floats. ;; -------------------------------------------------------------------------- (defsuite "gate-K18-expt-overflow" (deftest "small integer exponents stay exact" (do (assert= (expt 2 0) 1) (assert= (expt 2 10) 1024))) (deftest "expt 2^62 does not wrap to a negative int" (assert (> (expt 2 62) 0))) (deftest "expt 2^100 does not wrap to zero" (assert (> (expt 2 100) 0))) (deftest "expt 2^100 promotes to float" (assert (number? (expt 2 100))))) ;; -------------------------------------------------------------------------- ;; K20 [W7, high] contains? did not support dicts in the real runtime — ;; (contains? {:a 1} :a) threw "contains?: 2 args", contradicting its :doc ;; ("Dicts: key check"). Fixed: dict key membership works; lists/strings ;; unchanged. Repro (core.md). ;; -------------------------------------------------------------------------- (defsuite "gate-K20-contains-dict" (deftest "contains? finds a present dict key" (assert (contains? {:a 1 :b 2} :a))) (deftest "contains? reports a missing dict key as false" (assert (not (contains? {:a 1 :b 2} :zz)))) (deftest "contains? still works on list membership" (do (assert (contains? (list 10 20 30) 20)) (assert (not (contains? (list 10 20 30) 99))))) (deftest "contains? still works on string substrings" (assert (contains? "hello" "ell"))))