contains? did not support dict key membership in the real runtime —
(contains? {:a 1} :a) threw "contains?: 2 args", contradicting its own :doc.
The fix landed (primitives.sx + sx_primitives.ml) but had no pinning test.
Add suite gate-K20-contains-dict to spec/tests/test-gate-pins.sx (4 tests,
repro from plans/sx-review/core.md): present key true, missing key false,
list membership + string substring unchanged. 8/8 green under OCaml run_tests.
Test-only: no semantics edits, no push.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
59 lines
2.4 KiB
Plaintext
59 lines
2.4 KiB
Plaintext
;; ==========================================================================
|
|
;; 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"))))
|