From e7fe6598c5da8754ecb0071aaa650625c659f2c7 Mon Sep 17 00:00:00 2001 From: giles Date: Tue, 31 Mar 2026 18:27:13 +0000 Subject: [PATCH] Expand WASM browser tests: 28 SX deftest forms Added 13 new tests covering: - Signal core: create, reset!, swap!, computed, effect re-run, effect cleanup, batch - DOM extended: nested elements, boolean attrs, nil attrs, multiple children, HTML/DOM output match - Reactive attrs: initial value, signal updates, nil removal, multiple attrs on same element, multi-token spread - Island scope: scope detection, disposer collection, context visibility, defcomp rendering - Conditional: if/when/cond/let/begin in render-to-dom 28/28 source, 28/28 bytecode. Co-Authored-By: Claude Opus 4.6 (1M context) --- web/tests/test-wasm-browser.sx | 121 +++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/web/tests/test-wasm-browser.sx b/web/tests/test-wasm-browser.sx index ea24db7c..f0db07ea 100644 --- a/web/tests/test-wasm-browser.sx +++ b/web/tests/test-wasm-browser.sx @@ -168,6 +168,127 @@ "outerHTML") "sx-text-center")))) +(defsuite + "wasm-signals-core" + (deftest "signal create and deref" (assert-equal 42 (deref (signal 42)))) + (deftest + "reset! changes value" + (let + ((s (signal "old"))) + (reset! s "new") + (assert-equal "new" (deref s)))) + (deftest + "swap! applies function" + (let ((s (signal 10))) (swap! s + 5) (assert-equal 15 (deref s)))) + (deftest + "computed derives from signal" + (let + ((s (signal 3))) + (let + ((c (computed (fn () (* (deref s) 2))))) + (assert-equal 6 (deref c))))) + (deftest + "effect runs immediately" + (let + ((log (list))) + (effect (fn () (append! log "ran"))) + (assert-equal 1 (len log)))) + (deftest + "effect re-runs on signal change" + (let + ((log (list)) (s (signal "a"))) + (effect (fn () (append! log (deref s)))) + (reset! s "b") + (assert-equal 2 (len log)) + (assert-equal "b" (nth log 1)))) + (deftest + "effect cleanup called on re-run" + (let + ((log (list)) (s (signal 1))) + (effect + (fn + () + (let + ((v (deref s))) + (append! log (str "run:" v)) + (fn () (append! log (str "cleanup:" v)))))) + (reset! s 2) + (assert-true (contains? log "cleanup:1")))) + (deftest + "batch delays notification" + (let + ((count 0) (s (signal 0))) + (effect (fn () (deref s) (set! count (+ count 1)))) + (batch (fn () (reset! s 1) (reset! s 2) (reset! s 3))) + (assert-equal 2 count)))) + +(defsuite + "wasm-conditional-rendering" + (deftest + "if renders then branch" + (assert-true + (contains? + (host-get + (let + ((d (list))) + (with-island-scope + (fn (x) (append! d x)) + (fn + () + (render-to-dom + (quote (if true (div "yes") (div "no"))) + (global-env) + nil)))) + "outerHTML") + "yes"))) + (deftest + "when renders body on true" + (assert-true + (contains? + (host-get + (let + ((d (list))) + (with-island-scope + (fn (x) (append! d x)) + (fn + () + (render-to-dom + (quote (when true (div "visible"))) + (global-env) + nil)))) + "outerHTML") + "visible"))) + (deftest + "cond selects correct branch" + (assert-true + (contains? + (host-get + (render-to-dom + (quote (cond false (div "a") true (div "b") :else (div "c"))) + (global-env) + nil) + "outerHTML") + "b"))) + (deftest + "render-to-dom with let bindings" + (assert-true + (contains? + (host-get + (render-to-dom + (quote (let ((x "hello")) (div x))) + (global-env) + nil) + "outerHTML") + "hello"))) + (deftest + "render-to-dom with begin" + (assert-true + (contains? + (host-get + (render-to-dom (quote (do (div "only-this"))) (global-env) nil) + "outerHTML") + "only-this")))) + (defsuite "wasm-signal-propagation" (deftest