Files
rose-ash/spec/tests/test-reactive-islands.sx
giles 28273eb740 Fix component-source SSR override, add SX island tests
component-source from data/helpers.sx was overriding the native
OCaml version. The SX version calls env-get with wrong arity (1 arg
vs required 2), producing empty source. Re-bind the native version
in SSR overrides after file loading.

Note: source code still not visible because highlight function
returns empty — separate issue in the aser rendering pipeline.

Also adds:
- spec/tests/test-reactive-islands.sx — 22 SX-native tests for all
  14 reactive island demos (render + signal logic + DOM)
- tests/node/run-sx-tests.js — Node runner for SX test files
- tests/node/test-reactive-islands.js — 39 Node/happy-dom tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 17:44:11 +00:00

226 lines
5.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(define _island-tests (list))
(define
register-test
(fn
(name test-fn)
(append! _island-tests (dict "name" name "fn" test-fn))))
(register-test
"counter-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-counter :initial 0))))
(assert (contains? html "") "has minus button")
(assert (contains? html "+") "has plus button")
(assert (contains? html ">0<") "shows initial 0")
(assert (contains? html "doubled") "has doubled label"))))
(register-test
"counter-initial-42"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-counter :initial 42))))
(assert (contains? html ">42<") "shows 42")
(assert (contains? html ">84<") "doubled shows 84"))))
(register-test
"counter-signals"
(fn
()
(let
((count (signal 0))
(doubled (computed (fn () (* 2 (deref count))))))
(assert= (deref count) 0 "initial count")
(assert= (deref doubled) 0 "initial doubled")
(swap! count inc)
(assert= (deref count) 1 "after inc")
(assert= (deref doubled) 2 "doubled reacts")
(swap! count dec)
(assert= (deref count) 0 "after dec"))))
(register-test
"temperature-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-temperature :celsius 20))))
(assert (contains? html "°C") "shows celsius")
(assert (contains? html "°F") "shows fahrenheit")
(assert (contains? html "20") "shows 20")
(assert (contains? html "68") "shows 68F"))))
(register-test
"temperature-conversion"
(fn
()
(let
((c (signal 100))
(f (computed (fn () (+ (* (deref c) 9/5) 32)))))
(assert= (deref f) 212 "100C = 212F")
(reset! c 0)
(assert= (deref f) 32 "0C = 32F"))))
(register-test
"stopwatch-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-stopwatch))))
(assert (contains? html "0") "shows 0"))))
(register-test
"input-binding-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-input-binding))))
(assert (contains? html "<input") "has input"))))
(register-test
"dynamic-class-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-dynamic-class))))
(assert (contains? html "Toggle") "has toggle button"))))
(register-test
"dynamic-class-signal"
(fn
()
(let
((active (signal false)))
(assert= (deref active) false "initial off")
(swap! active not)
(assert= (deref active) true "toggled on"))))
(register-test
"reactive-list-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-reactive-list))))
(assert (contains? html "Add") "has add button"))))
(register-test
"reactive-list-signal"
(fn
()
(let
((items (signal (list "a" "b"))))
(assert= (len (deref items)) 2 "initial count")
(swap! items (fn (xs) (append xs (list "c"))))
(assert= (len (deref items)) 3 "after add"))))
(register-test
"store-writer-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-store-writer))))
(assert (contains? html "Writer") "has writer label")
(assert (contains? html "<select") "has select"))))
(register-test
"store-reader-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-store-reader))))
(assert (contains? html "Reader") "has reader label"))))
(register-test
"refs-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-refs))))
(assert (contains? html "<input") "has input")
(assert (contains? html "Focus") "has focus button"))))
(register-test
"portal-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-portal))))
(assert
(or (contains? html "Open") (contains? html "button"))
"has toggle"))))
(register-test
"error-boundary-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-error-boundary))))
(assert (> (len html) 10) "renders content"))))
(register-test
"resource-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-resource))))
(assert (> (len html) 10) "renders content"))))
(register-test
"transition-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-transition))))
(assert (> (len html) 10) "renders content"))))
(register-test
"event-bridge-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-event-bridge))))
(assert (contains? html "Send") "has send button"))))
(register-test
"imperative-renders"
(fn
()
(let
((html (render-to-html (~reactive-islands/index/demo-imperative))))
(assert (contains? html "button") "has button"))))
(register-test
"counter-dom"
(fn
()
(let
((container (dom-create-element "div" nil))
(rendered
(render-to-dom
(~reactive-islands/index/demo-counter :initial 5)
nil
nil)))
(dom-append container rendered)
(assert= (len (dom-query-all container "button")) 2 "2 buttons")
(assert (contains? (dom-text-content container) "5") "shows 5")
(assert
(contains? (dom-text-content container) "10")
"doubled shows 10"))))
(register-test
"temperature-dom"
(fn
()
(let
((container (dom-create-element "div" nil))
(rendered
(render-to-dom
(~reactive-islands/index/demo-temperature :celsius 25)
nil
nil)))
(dom-append container rendered)
(assert (contains? (dom-text-content container) "25") "shows 25")
(assert (contains? (dom-text-content container) "77") "shows 77F"))))