jolt/test/spec/protocols-spec.janet
Yogthos bcd0e42b33 test: fold phase ports into spec; promote compile-mode test
Mine the phase* port batteries into the spec layer and delete them (their
behavior is now covered by spec): phase5 (hierarchies), phase6 (tagged
literals/reader-conditionals), phase7 (lazy/sets), phase8+phase12 (protocols;
phase12 was a duplicate of phase8), phase10 (strings/set), phase13
(reify/walk). Unique cases mined into spec: reader #inst/#uuid/#?@ splice,
(Type. args) dot constructor, lazy-seq body-runs-once, keywordize-keys/
stringify-keys, custom :default key and explicit :hierarchy dispatch.

phase6-final tested the COMPILE-MODE path ({:compile? true}), distinct from the
interpreter-based spec — kept and renamed integration/compile-mode-test.

jpm test green, conformance 218/218.
2026-06-05 01:07:09 -04:00

50 lines
2.4 KiB
Text

# Specification: protocols, types and records.
(use ../support/harness)
(defspec "protocols / defprotocol & dispatch"
["protocol on record" "16"
"(do (defprotocol Shape (area [s])) (defrecord Sq [side] Shape (area [_] (* side side))) (area (->Sq 4)))"]
["protocol on deftype" "16"
"(do (defprotocol Shape (area [s])) (deftype Sq [side] Shape (area [_] (* side side))) (area (->Sq 4)))"]
["multiple methods" "[1 2]"
"(do (defprotocol P (m [s]) (n [s])) (defrecord R [a b] P (m [_] a) (n [_] b)) [(m (->R 1 2)) (n (->R 1 2))])"]
["multiple protocols" "[:a :b]"
"(do (defprotocol P1 (p1 [s])) (defprotocol P2 (p2 [s])) (deftype T [] P1 (p1 [_] :a) P2 (p2 [_] :b)) [(p1 (->T)) (p2 (->T))])"]
["method args" "7"
"(do (defprotocol P (add [s x])) (defrecord R [n] P (add [_ x] (+ n x))) (add (->R 5) 2))"]
["extend-type" "10"
"(do (defprotocol P (twice [s])) (extend-type Number P (twice [n] (* n 2))) (twice 5))"]
["extend-protocol" "[2 4]"
"(do (defprotocol P (dbl [s])) (extend-protocol P Number (dbl [n] (* n 2))) [(dbl 1) (dbl 2)])"])
(defspec "protocols / records"
["record field access" "1"
"(do (defrecord R [a b]) (:a (->R 1 2)))"]
["record map access" "2"
"(do (defrecord R [a b]) (get (->R 1 2) :b))"]
["record equality" "true"
"(do (defrecord R [a b]) (= (->R 1 2) (->R 1 2)))"]
["record inequality" "false"
"(do (defrecord R [a b]) (= (->R 1 2) (->R 3 4)))"]
["map-> factory" "1"
"(do (defrecord R [a b]) (:a (map->R {:a 1 :b 2})))"]
["record? true" "true"
"(do (defrecord R [a]) (record? (->R 1)))"]
["assoc on record" "9"
"(do (defrecord R [a]) (:a (assoc (->R 1) :a 9)))"])
(defspec "protocols / reify & satisfies"
["reify dispatch" "42"
"(do (defprotocol P (m [_])) (m (reify P (m [_] 42))))"]
["reify multi-method" "[1 2]"
"(do (defprotocol P (a [_]) (b [_])) (let [r (reify P (a [_] 1) (b [_] 2))] [(a r) (b r)]))"]
["satisfies? true" "true"
"(do (defprotocol P (m [_])) (defrecord R [] P (m [_] 1)) (satisfies? P (->R)))"]
["satisfies? false" "false"
"(do (defprotocol P (m [_])) (defrecord R []) (satisfies? P (->R)))"]
["instance? record" "true"
"(do (defrecord R [a]) (instance? R (->R 1)))"]
["dot constructor" "5"
"(do (deftype P [n]) (.-n (P. 5)))"]
["dot ctor + method" "5"
"(do (defprotocol G (val-of [_])) (deftype P [n] G (val-of [_] n)) (val-of (P. 5)))"])