jolt/test/spec/host-interop-spec.janet
Yogthos bfac1fc444 core: Phase 4 — move ns-name and the array reads/aset to the overlay
ns-name is pure over get + symbol. aget/alength read jolt's mutable backing
arrays (nth/count), and aset writes a slot through jolt.host/ref-put!; both
handle the multi-dimensional form by walking. The array constructors
(object-array/make-array/to-array/...) stay native — they build the mutable
backing. Added array spec cases; ns-name already covered.
2026-06-07 21:52:13 -04:00

40 lines
2.5 KiB
Text

# Specification: host (Janet) interop — the `.` forms and jolt.interop.
(use ../support/harness)
(defspec "interop / dot forms"
["method call" "\"v=41\""
"(. {:value 41 :describe (fn [self] (str \"v=\" (:value self)))} describe)"]
["method with args" "\"Hello Alice\""
"(. {:greet (fn [self n] (str \"Hello \" n))} greet \"Alice\")"]
["field access .-" "41" "(.-value {:value 41})"]
["dot field keyword" "41" "(. {:value 41} :value)"])
# The `janet` namespace segment is the explicit Janet-stdlib bridge added for
# the networking layer (and used by jolt.nrepl). `janet/<name>` resolves a Janet
# root binding; `janet.<module>/<name>` resolves a module binding. The boundary
# is explicit so it's visible where host semantics take over.
(defspec "interop / janet bridge"
["root builtin janet/<name>" "\"123\"" "(janet/string 1 2 3)"]
["root builtin janet/type" ":string" "(janet/type \"x\")"]
["module fn janet.<mod>/<name>" "4" "(janet.math/sqrt 16)"]
["janet.string module fn" "\"HI\"" "(janet.string/ascii-upper \"hi\")"]
["janet.os/clock is a number" "true" "(number? (janet.os/clock))"]
# crossing the boundary uses Janet representations: a Jolt vector is a table
["jolt vector crosses as a janet table" ":table" "(janet/type [1 2])"]
# interop is explicit-only: an unprefixed Janet module is not auto-exposed
["unprefixed janet module not exposed" :throws "net/server"]
["unknown janet symbol throws" :throws "(janet.os/definitely-not-a-real-fn)"])
(defspec "interop / jolt.interop"
["janet-type quoted list" ":array" "(do (require (quote [jolt.interop :as j])) (j/janet-type (quote (1 2))))"]
["janet-type list" ":array" "(do (require (quote [jolt.interop :as j])) (j/janet-type (list 1 2)))"]
["janet-type string" ":string" "(do (require (quote [jolt.interop :as j])) (j/janet-type \"x\"))"]
["janet-type number" ":number" "(do (require (quote [jolt.interop :as j])) (j/janet-type 1))"]
["janet-type keyword" ":keyword" "(do (require (quote [jolt.interop :as j])) (j/janet-type :a))"])
(defspec "interop / arrays (aget/aset/alength)"
["alength" "3" "(alength (object-array [1 2 3]))"]
["aget" "20" "(aget (object-array [10 20 30]) 1)"]
["aset returns val" "9" "(aset (object-array [1 2 3]) 1 9)"]
["aset mutates" "[7 2 3]" "(let [a (object-array [1 2 3])] (aset a 0 7) (vec a))"]
["aget 2d" "4" "(aget (to-array-2d [[1 2] [3 4]]) 1 1)"])