test: cover the janet interop bridge and nREPL var rendering
- host-interop-spec: add an 'interop / janet bridge' suite — janet/<name> and janet.<module>/<name> resolution, the value-representation boundary (a Jolt vector crosses as a Janet table), explicit-only (unprefixed module not exposed), and unknown-symbol errors. - nrepl-test: assert a def's value renders as #'ns/name (pr-str loops on a var's cyclic ns refs, so jolt.nrepl renders vars itself).
This commit is contained in:
parent
dd96b1900a
commit
5b66cfaa97
2 changed files with 20 additions and 1 deletions
|
|
@ -49,8 +49,11 @@
|
||||||
# eval returns a value
|
# eval returns a value
|
||||||
(check "eval (+ 1 2)" "(some #(get % \"value\") (jolt.nrepl/client-eval c \"(+ 1 2)\" s))" "3")
|
(check "eval (+ 1 2)" "(some #(get % \"value\") (jolt.nrepl/client-eval c \"(+ 1 2)\" s))" "3")
|
||||||
|
|
||||||
|
# a def's value renders as #'ns/name (pr-str loops on a var's cyclic ns refs)
|
||||||
|
(check "def renders as #'ns/name"
|
||||||
|
"(some #(get % \"value\") (jolt.nrepl/client-eval c \"(def yy 21)\" s))" "#'user/yy")
|
||||||
|
|
||||||
# defs persist across evals in the session
|
# defs persist across evals in the session
|
||||||
(ev "(jolt.nrepl/client-eval c \"(def yy 21)\" s)")
|
|
||||||
(check "def then use" "(some #(get % \"value\") (jolt.nrepl/client-eval c \"(* yy 2)\" s))" "42")
|
(check "def then use" "(some #(get % \"value\") (jolt.nrepl/client-eval c \"(* yy 2)\" s))" "42")
|
||||||
|
|
||||||
# stdout is captured and streamed as an out message
|
# stdout is captured and streamed as an out message
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,22 @@
|
||||||
["field access .-" "41" "(.-value {:value 41})"]
|
["field access .-" "41" "(.-value {:value 41})"]
|
||||||
["dot field keyword" "41" "(. {:value 41} :value)"])
|
["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"
|
(defspec "interop / jolt.interop"
|
||||||
["janet-type quoted list" ":array" "(do (require (quote [jolt.interop :as j])) (j/janet-type (quote (1 2))))"]
|
["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 list" ":array" "(do (require (quote [jolt.interop :as j])) (j/janet-type (list 1 2)))"]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue