Files
rose-ash/spec/tests/test-let-match.sx
giles 107c1b8b97 let-match test suite (8 tests)
Covers: dict destructuring, nested let-match, missing keys → nil,
multi-expression body, compiled function path (bytecode desugaring),
computed expressions, nested destructuring.

2709/2709 tests pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 00:19:21 +00:00

48 lines
1.5 KiB
Plaintext

;; Tests for let-match — CEK special form and bytecode compiler desugaring
;; let-match destructures a dict: (let-match {:key var} expr body...)
(deftest "let-match destructures dict"
(let-match {:name n :age a} (dict :name "alice" :age 30)
(assert= n "alice")
(assert= a 30)))
(deftest "let-match inside let"
(let ((data (dict :status "ok" :value 42)))
(let-match {:status s :value v} data
(assert= s "ok")
(assert= v 42))))
(deftest "let-match missing key gives nil"
(let-match {:present p :missing m} (dict :present "yes")
(assert= p "yes")
(assert= m nil)))
(deftest "let-match body evaluates all expressions"
(let ((result nil))
(let-match {:a a} (dict :a 1)
(set! result a)
(assert= result 1))))
;; In function body — tests bytecode compiler desugaring path
(define lm-add (fn (d) (let-match {:x x :y y} d (+ x y))))
(deftest "let-match in compiled function"
(assert= (lm-add (dict :x 3 :y 7)) 10))
(define lm-format (fn (input) (let-match {:type t :value v} input (str t ":" v))))
(deftest "let-match variant 2 in compiled function"
(assert= (lm-format (dict :type "num" :value 5)) "num:5"))
;; Nested let-match
(deftest "nested let-match"
(let-match {:outer o} (dict :outer (dict :inner 99))
(let-match {:inner i} o
(assert= i 99))))
;; let-match with computed expression
(deftest "let-match with function call as expr"
(let-match {:a a :b b} (dict :a (+ 1 2) :b (* 3 4))
(assert= a 3)
(assert= b 12)))