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