From da0da1472d98cd3566111cf287282c60cacdbe44 Mon Sep 17 00:00:00 2001 From: giles Date: Mon, 13 Apr 2026 01:20:53 +0000 Subject: [PATCH] Test generator: nested HTML elements, three-phase element setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - parse_html now captures ALL elements (not just top-level) with parent-child relationships - emit_element_setup uses three phases: attributes, DOM tree, activation - ref() maps positional names (d1, d2) to top-level elements only - dom-scope: 9→14 (+5), reset: 3→6 (+3), take: 2→3, parser: 2→3 Net 0 due to regressions in dialog/halt/closest (needs investigation). Co-Authored-By: Claude Opus 4.6 (1M context) --- spec/tests/test-hyperscript-behavioral.sx | 2044 ++++++++++++++------- tests/playwright/generate-sx-tests.py | 124 +- 2 files changed, 1500 insertions(+), 668 deletions(-) diff --git a/spec/tests/test-hyperscript-behavioral.sx b/spec/tests/test-hyperscript-behavioral.sx index 1994060c..a1254c24 100644 --- a/spec/tests/test-hyperscript-behavioral.sx +++ b/spec/tests/test-hyperscript-behavioral.sx @@ -49,8 +49,8 @@ (hs-cleanup!) (let ((_el-bar (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-bar "id" "bar") - (dom-append (dom-body) _el-bar) (dom-set-attr _el-div "_" "on click add .foo to #bar") + (dom-append (dom-body) _el-bar) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -59,22 +59,26 @@ )) (deftest "can add to query in me" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-p1 (dom-create-element "p"))) (dom-set-attr _el-div "_" "on click add .foo to

in me") + (dom-set-attr _el-p1 "id" "p1") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-p1) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - (assert (dom-has-class? (dom-query-by-id "p1") "foo")) + (assert (dom-has-class? _el-p1 "foo")) (assert (not (dom-has-class? _el-div "foo"))) )) (deftest "can add to children" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-p1 (dom-create-element "p"))) (dom-set-attr _el-div "_" "on click add .foo to my children") + (dom-set-attr _el-p1 "id" "p1") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-p1) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - (assert (dom-has-class? (dom-query-by-id "p1") "foo")) + (assert (dom-has-class? _el-p1 "foo")) (assert (not (dom-has-class? _el-div "foo"))) )) (deftest "can add non-class attributes" @@ -130,13 +134,13 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click add .rey to .bar when it matches .doh") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-add-class _el-div1 "bar") - (dom-append (dom-body) _el-div1) (dom-add-class _el-div2 "bar") (dom-add-class _el-div2 "doh") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert (not (dom-has-class? _el-div1 "rey"))) (assert (dom-has-class? _el-div2 "rey")) @@ -145,25 +149,29 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click add @rey to .bar when it matches .doh") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-add-class _el-div1 "bar") - (dom-append (dom-body) _el-div1) (dom-add-class _el-div2 "bar") (dom-add-class _el-div2 "doh") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert (not (dom-has-attr? _el-div1 "rey"))) (assert (dom-has-attr? _el-div2 "rey")) )) (deftest "can add to an HTMLCollection" (hs-cleanup!) - (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div")) (_el-c1 (dom-create-element "div")) (_el-c2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click add .foo to the children of #bar") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") + (dom-set-attr _el-c1 "id" "c1") + (dom-set-attr _el-c2 "id" "c2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (dom-append _el-bar _el-c1) + (dom-append _el-bar _el-c2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) ;; SKIP check: skip byId("c1").classList.contains("foo").should.equal(false) ;; SKIP check: skip byId("c2").classList.contains("foo").should.equal(false) @@ -175,10 +183,10 @@ (let ((_el-trigger (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-trigger "id" "trigger") (dom-set-attr _el-trigger "_" "on click add .foo to #d2 when asyncCheck()") - (dom-append (dom-body) _el-trigger) - (hs-activate! _el-trigger) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-trigger) (dom-append (dom-body) _el-d2) + (hs-activate! _el-trigger) (dom-dispatch (dom-query-by-id "trigger") "click" nil) (assert (dom-has-class? (dom-query-by-id "d2") "foo")) )) @@ -187,18 +195,18 @@ (let ((_el-trigger (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-none (dom-create-element "div"))) (dom-set-attr _el-trigger "id" "trigger") (dom-set-attr _el-trigger "_" "on click add .foo to .item when it matches .yes then if the result is empty show #none else hide #none") - (dom-append (dom-body) _el-trigger) - (hs-activate! _el-trigger) (dom-set-attr _el-d1 "id" "d1") (dom-add-class _el-d1 "item") (dom-add-class _el-d1 "yes") - (dom-append (dom-body) _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-add-class _el-d2 "item") - (dom-append (dom-body) _el-d2) (dom-set-attr _el-none "id" "none") (dom-set-attr _el-none "style" "display:none") + (dom-append (dom-body) _el-trigger) + (dom-append (dom-body) _el-d1) + (dom-append (dom-body) _el-d2) (dom-append (dom-body) _el-none) + (hs-activate! _el-trigger) (dom-dispatch (dom-query-by-id "trigger") "click" nil) (assert (not (dom-visible? (dom-query-by-id "none")))) )) @@ -207,13 +215,13 @@ (let ((_el-trigger (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-none (dom-create-element "div"))) (dom-set-attr _el-trigger "id" "trigger") (dom-set-attr _el-trigger "_" "on click add .foo to .item when it matches .nope then if the result is empty remove @hidden from #none") - (dom-append (dom-body) _el-trigger) - (hs-activate! _el-trigger) (dom-set-attr _el-d1 "id" "d1") (dom-add-class _el-d1 "item") - (dom-append (dom-body) _el-d1) (dom-set-attr _el-none "id" "none") + (dom-append (dom-body) _el-trigger) + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-none) + (hs-activate! _el-trigger) (dom-dispatch (dom-query-by-id "trigger") "click" nil) (assert (not (dom-has-attr? (dom-query-by-id "none") "hidden"))) )) @@ -264,8 +272,8 @@ (let ((_el-bar (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-bar "id" "bar") (dom-add-class _el-bar "foo") - (dom-append (dom-body) _el-bar) (dom-set-attr _el-div "_" "on click remove .foo from #bar") + (dom-append (dom-body) _el-bar) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -295,18 +303,22 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-that (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click remove #that") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-that "id" "that") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-that) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert (nil? (dom-parent _el-that))) )) (deftest "can remove parent element" (hs-cleanup!) - (let ((_el-p1 (dom-create-element "div"))) + (let ((_el-p1 (dom-create-element "div")) (_el-b1 (dom-create-element "button"))) (dom-set-attr _el-p1 "id" "p1") + (dom-set-attr _el-b1 "id" "b1") + (dom-set-attr _el-b1 "_" "on click remove my.parentElement") (dom-append (dom-body) _el-p1) + (dom-append _el-p1 _el-b1) + (hs-activate! _el-b1) (dom-dispatch _el-p1 "click" nil) (assert (nil? (dom-parent _el-p1))) )) @@ -326,9 +338,17 @@ )) (deftest "can remove query refs from specific things" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-p3 (dom-create-element "p"))) + (dom-set-attr _el-d1 "id" "d1") + (dom-set-attr _el-d1 "_" "on click remove

from me") + (dom-set-inner-html _el-p "foo") + (dom-set-inner-html _el-p3 "doh") (dom-append (dom-body) _el-div) - (dom-dispatch _el-div "click" nil) + (dom-append _el-div _el-d1) + (dom-append _el-d1 _el-p) + (dom-append _el-div _el-p3) + (hs-activate! _el-d1) + (dom-dispatch _el-d1 "click" nil) ;; SKIP check: skip div.innerHTML.includes("foo").should.equal(true) ;; SKIP check: skip div.innerHTML.includes("bar").should.equal(true) ;; SKIP check: skip div.innerHTML.includes("doh").should.equal(true) @@ -339,17 +359,17 @@ (let ((_el-trigger (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-trigger "id" "trigger") (dom-set-attr _el-trigger "_" "on click remove .highlight from .item when it matches .old") - (dom-append (dom-body) _el-trigger) - (hs-activate! _el-trigger) (dom-set-attr _el-d1 "id" "d1") (dom-add-class _el-d1 "item") (dom-add-class _el-d1 "old") (dom-add-class _el-d1 "highlight") - (dom-append (dom-body) _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-add-class _el-d2 "item") (dom-add-class _el-d2 "highlight") + (dom-append (dom-body) _el-trigger) + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-trigger) (dom-dispatch (dom-query-by-id "trigger") "click" nil) (assert (not (dom-has-class? (dom-query-by-id "d1") "highlight"))) (assert (dom-has-class? (dom-query-by-id "d2") "highlight")) @@ -418,8 +438,8 @@ (hs-cleanup!) (let ((_el-bar (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-bar "id" "bar") - (dom-append (dom-body) _el-bar) (dom-set-attr _el-div "_" "on click toggle .foo on #bar") + (dom-append (dom-body) _el-bar) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -460,8 +480,8 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-append (dom-body) _el-d1) (dom-set-attr _el-div "_" "on click toggle .foo until foo from #d1") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -556,10 +576,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click toggle the *display of #d2") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) ;; SKIP computed style: div2.display @@ -568,10 +588,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click toggle the *opacity of #d2") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) ;; SKIP computed style: div2.opacity @@ -580,10 +600,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click toggle the *visibility of #d2") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) ;; SKIP computed style: div2.visibility @@ -602,6 +622,8 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) ;; HS source has bare quotes or embedded HTML + (dom-set-attr _el-div "data-state" "active") + ;; SKIP attr [@data-state (contains special chars) (dom-append (dom-body) _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-attr _el-div "data-state") "inactive") @@ -612,6 +634,9 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) ;; HS source has bare quotes or embedded HTML + (dom-set-attr _el-div "enabled" "true") + ;; SKIP attr [@enabled (contains special chars) + ;; SKIP attr [@disabled (contains special chars) (dom-append (dom-body) _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-attr _el-div "disabled") "true") @@ -655,24 +680,25 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click toggle the *opacity of #d2") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d2) + (hs-activate! _el-div) )) (deftest "can toggle visibility on other elt" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click toggle the *visibility of #d2") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d2) + (hs-activate! _el-div) )) (deftest "can toggle *display between two values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) ;; HS source has bare quotes or embedded HTML + (dom-set-attr _el-div "style" "display:none") (dom-append (dom-body) _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-style _el-div "display") "flex") @@ -683,6 +709,7 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) ;; HS source has bare quotes or embedded HTML + (dom-set-attr _el-div "style" "opacity:0") (dom-append (dom-body) _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-style _el-div "opacity") "0.5") @@ -736,30 +763,36 @@ )) (deftest "can set complex indirect properties lhs" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click set parentNode.innerHTML of #d1 to \"foo\"") + (dom-set-attr _el-d1 "id" "d1") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) (hs-activate! _el-div) - (dom-dispatch _el-div "click" nil) - (assert= (dom-inner-html _el-div) "foo") + (dom-dispatch _el-d1 "click" nil) + (assert= (dom-inner-html _el-d1) "foo") )) (deftest "can set complex indirect properties rhs" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click set innerHTML of #d1.parentNode to \"foo\"") + (dom-set-attr _el-d1 "id" "d1") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) (hs-activate! _el-div) - (dom-dispatch _el-div "click" nil) - (assert= (dom-inner-html _el-div) "foo") + (dom-dispatch _el-d1 "click" nil) + (assert= (dom-inner-html _el-d1) "foo") )) (deftest "can set chained indirect properties" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click set the innerHTML of the parentNode of #d1 to \"foo\"") + (dom-set-attr _el-d1 "id" "d1") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) (hs-activate! _el-div) - (dom-dispatch _el-div "click" nil) - (assert= (dom-inner-html _el-div) "foo") + (dom-dispatch _el-d1 "click" nil) + (assert= (dom-inner-html _el-d1) "foo") )) (deftest "can set styles" (hs-cleanup!) @@ -806,10 +839,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click set .divs.innerHTML to \"foo\"") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-add-class _el-div1 "divs") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div1) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-inner-html _el-div) "foo") (assert= (dom-inner-html _el-div1) "foo") @@ -829,10 +862,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click set #div2's @bar to 'foo'") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-attr _el-div2 "bar") "foo") )) @@ -841,10 +874,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click set #div2's @bar to 'foo'") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-attr _el-div2 "bar") "foo") )) @@ -853,10 +886,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click set @bar of #div2 to 'foo'") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-attr _el-div2 "bar") "foo") )) @@ -875,10 +908,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click set #div2's *color to 'red'") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) ;; SKIP check: skip d2.style["color"].should.equal("red") )) @@ -887,10 +920,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click set #div2's *color to 'red'") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) ;; SKIP check: skip d2.style["color"].should.equal("red") )) @@ -899,10 +932,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click set *color of #div2 to 'red'") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) ;; SKIP check: skip d2.style["color"].should.equal("red") )) @@ -1002,9 +1035,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-append (dom-body) _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "_" "on click put #d1 into #d2") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) (hs-activate! _el-d2) (dom-dispatch _el-d2 "click" nil) @@ -1050,28 +1083,36 @@ )) (deftest "can set into class ref w/ flatmapped property" (hs-cleanup!) - (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-div2 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-div4 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click put \"foo\" into .divs.parentElement.innerHTML") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") - (dom-append (dom-body) _el-d1) + (dom-add-class _el-div2 "divs") (dom-set-attr _el-d2 "id" "d2") + (dom-add-class _el-div4 "divs") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-d1) + (dom-append _el-d1 _el-div2) (dom-append (dom-body) _el-d2) + (dom-append _el-d2 _el-div4) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-text-content _el-d1) "foo") (assert= (dom-text-content _el-d2) "foo") )) (deftest "can set into class ref w/ flatmapped property using of" (hs-cleanup!) - (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-div2 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-div4 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click put \"foo\" into innerHTML of parentElement of .divs") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") - (dom-append (dom-body) _el-d1) + (dom-add-class _el-div2 "divs") (dom-set-attr _el-d2 "id" "d2") + (dom-add-class _el-div4 "divs") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-d1) + (dom-append _el-d1 _el-div2) (dom-append (dom-body) _el-d2) + (dom-append _el-d2 _el-div4) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-text-content _el-d1) "foo") (assert= (dom-text-content _el-d2) "foo") @@ -1101,11 +1142,11 @@ (let ((_el-d2 (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "_" "on click put #d1 before #d2") - (dom-append (dom-body) _el-d2) - (hs-activate! _el-d2) (dom-set-attr _el-d1 "id" "d1") (dom-set-inner-html _el-d1 "foo") + (dom-append (dom-body) _el-d2) (dom-append (dom-body) _el-d1) + (hs-activate! _el-d2) (dom-dispatch _el-d2 "click" nil) ;; SKIP check: skip d2.previousSibling.textContent.should.equal("foo") )) @@ -1114,9 +1155,9 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-inner-html _el-d1 "foo") - (dom-append (dom-body) _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "_" "on click put #d1 after #d2") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) (hs-activate! _el-d2) (dom-dispatch _el-d2 "click" nil) @@ -1169,10 +1210,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click put 'foo' into #div2's @bar") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-attr _el-div2 "bar") "foo") )) @@ -1181,10 +1222,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click put 'foo' into @bar of #div2") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-attr _el-div2 "bar") "foo") )) @@ -1213,10 +1254,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click put 'red' into #div2's *color") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) ;; SKIP check: skip d2.style["color"].should.equal("red") )) @@ -1225,10 +1266,10 @@ (let ((_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "divs") (dom-set-attr _el-div "_" "on click put 'red' into the *color of #div2") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "id" "div2") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) ;; SKIP check: skip d2.style["color"].should.equal("red") )) @@ -1487,8 +1528,8 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div"))) (dom-add-class _el-div "hideme") - (dom-append (dom-body) _el-div) (dom-set-attr _el-div1 "_" "on click hide .hideme") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div1) (hs-activate! _el-div1) (dom-dispatch _el-div "click" nil) @@ -1516,10 +1557,15 @@ )) (deftest "can filter hide via the when clause" (hs-cleanup!) - (let ((_el-trigger (dom-create-element "div"))) + (let ((_el-trigger (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-trigger "id" "trigger") (dom-set-attr _el-trigger "_" "on click hide

in me when it matches .hideable") + (dom-set-attr _el-d1 "id" "d1") + (dom-add-class _el-d1 "hideable") + (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-trigger) + (dom-append _el-trigger _el-d1) + (dom-append _el-trigger _el-d2) (hs-activate! _el-trigger) (dom-dispatch (dom-query-by-id "trigger") "click" nil) (assert= (dom-get-style (dom-query-by-id "d1") "display") "none") @@ -1758,9 +1804,9 @@ (let ((_el-script (dom-create-element "script")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def repeatForeverWithReturn() set retVal to 0 repeat forever set retVal to retVal + 1 if retVal == 5 then return retVal end end end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click put repeatForeverWithReturn() into my.innerHTML") + (dom-append (dom-body) _el-script) (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) @@ -1771,9 +1817,9 @@ (let ((_el-script (dom-create-element "script")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def repeatForeverWithReturn() set retVal to 0 repeat set retVal to retVal + 1 if retVal == 5 then return retVal end end end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click put repeatForeverWithReturn() into my.innerHTML") + (dom-append (dom-body) _el-script) (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) @@ -1811,9 +1857,9 @@ (let ((_el-script (dom-create-element "script")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def repeatWhileTest() set retVal to 0 repeat while retVal < 5 set retVal to retVal + 1 end return retVal end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click put repeatWhileTest() into my.innerHTML") + (dom-append (dom-body) _el-script) (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) @@ -1824,9 +1870,9 @@ (let ((_el-script (dom-create-element "script")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def repeatUntilTest() set retVal to 0 repeat until retVal == 5 set retVal to retVal + 1 end return retVal end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click put repeatUntilTest() into my.innerHTML") + (dom-append (dom-body) _el-script) (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) @@ -1836,9 +1882,9 @@ (hs-cleanup!) (let ((_el-untilTest (dom-create-element "div")) (_el-script (dom-create-element "script"))) (dom-set-attr _el-untilTest "id" "untilTest") - (dom-append (dom-body) _el-untilTest) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def repeatUntilTest() repeat until event click from #untilTest wait 2ms end return 42 end") + (dom-append (dom-body) _el-untilTest) (dom-append (dom-body) _el-script) (dom-dispatch _el-untilTest "click" nil) ;; SKIP check: skip value.should.equal(42) @@ -1848,9 +1894,9 @@ (let ((_el-script (dom-create-element "script")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def getArray() set window.called to (window.called or 0) + 1 return [1, 2, 3] end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click for x in getArray() put x into my.innerHTML end") + (dom-append (dom-body) _el-script) (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) @@ -1862,9 +1908,9 @@ (let ((_el-script (dom-create-element "script")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def sprayInto(elt) for x in [1, 2, 3] for y in [1, 2, 3] put x * y at end of elt end end end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click call sprayInto(me)") + (dom-append (dom-body) _el-script) (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) @@ -2045,8 +2091,8 @@ (hs-cleanup!) (let ((_el-d2 (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-d2 "id" "d2") - (dom-append (dom-body) _el-d2) (dom-set-attr _el-div "_" "on click add .foo then wait for foo from #d2 then add .bar") + (dom-append (dom-body) _el-d2) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -2058,8 +2104,8 @@ (hs-cleanup!) (let ((_el-d2 (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-d2 "id" "d2") - (dom-append (dom-body) _el-d2) (dom-set-attr _el-div "_" "on click add .foo then wait for foo or 0ms then add .bar") + (dom-append (dom-body) _el-d2) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -2071,8 +2117,8 @@ (hs-cleanup!) (let ((_el-d2 (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-d2 "id" "d2") - (dom-append (dom-body) _el-d2) (dom-set-attr _el-div "_" "on click add .foo then wait for foo or 0ms then add .bar") + (dom-append (dom-body) _el-d2) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -2088,11 +2134,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send foo to #bar") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") (dom-set-attr _el-bar "_" "on foo add .foo-sent") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (hs-activate! _el-div) (hs-activate! _el-bar) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-bar "foo-sent")) @@ -2101,11 +2147,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click log 0 send foo to #bar log 3") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") (dom-set-attr _el-bar "_" "on foo add .foo-sent to sender log 1, me, sender") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (hs-activate! _el-div) (hs-activate! _el-bar) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-div "foo-sent")) @@ -2114,11 +2160,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send foo(x:42) to #bar") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") (dom-set-attr _el-bar "_" "on foo put event.detail.x into my.innerHTML") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (hs-activate! _el-div) (hs-activate! _el-bar) (dom-dispatch _el-div "click" nil) (assert (not (dom-has-class? _el-bar "foo-sent"))) @@ -2128,11 +2174,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send foo.bar to #bar") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") (dom-set-attr _el-bar "_" "on foo.bar add .foo-sent") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (hs-activate! _el-div) (hs-activate! _el-bar) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-bar "foo-sent")) @@ -2141,11 +2187,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send foo.bar(x:42) to #bar") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") (dom-set-attr _el-bar "_" "on foo.bar put event.detail.x into my.innerHTML") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (hs-activate! _el-div) (hs-activate! _el-bar) (dom-dispatch _el-div "click" nil) (assert (not (dom-has-class? _el-bar "foo-sent"))) @@ -2155,11 +2201,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send foo:bar to #bar") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") (dom-set-attr _el-bar "_" "on foo:bar add .foo-sent") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (hs-activate! _el-div) (hs-activate! _el-bar) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-bar "foo-sent")) @@ -2168,11 +2214,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send foo:bar(x:42) to #bar") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") (dom-set-attr _el-bar "_" "on foo:bar put event.detail.x into my.innerHTML") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (hs-activate! _el-div) (hs-activate! _el-bar) (dom-dispatch _el-div "click" nil) (assert (not (dom-has-class? _el-bar "foo-sent"))) @@ -2182,11 +2228,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-bar (dom-create-element "div"))) (dom-set-attr _el-div "_" "def bar return #bar on click send foo to bar()") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-bar "id" "bar") (dom-set-attr _el-bar "_" "on foo add .foo-sent") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-bar) + (hs-activate! _el-div) (hs-activate! _el-bar) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-bar "foo-sent")) @@ -2200,13 +2246,13 @@ (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "div") (dom-add-class _el-div "foo") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take .foo from .div") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-add-class _el-div2 "div") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert (not (dom-has-class? _el-div "foo"))) (assert (dom-has-class? _el-div1 "foo")) @@ -2217,13 +2263,13 @@ (let ((_el-form (dom-create-element "form")) (_el-form1 (dom-create-element "form")) (_el-form2 (dom-create-element "form"))) (dom-add-class _el-form "div") (dom-add-class _el-form "foo") - (dom-append (dom-body) _el-form) (dom-add-class _el-form1 "div") (dom-set-attr _el-form1 "_" "on click take .foo from .div") - (dom-append (dom-body) _el-form1) - (hs-activate! _el-form1) (dom-add-class _el-form2 "div") + (dom-append (dom-body) _el-form) + (dom-append (dom-body) _el-form1) (dom-append (dom-body) _el-form2) + (hs-activate! _el-form1) (dom-dispatch (dom-query-by-id "f2") "click" nil) (assert (not (dom-has-class? (dom-query-by-id "f1") "foo"))) (assert (dom-has-class? (dom-query-by-id "f2") "foo")) @@ -2234,14 +2280,14 @@ (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-d3 (dom-create-element "div"))) (dom-add-class _el-div "div") (dom-add-class _el-div "foo") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take .foo from .div for #d3") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-set-attr _el-d3 "id" "d3") (dom-add-class _el-d3 "div") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-d3) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert (not (dom-has-class? _el-div "foo"))) (assert (not (dom-has-class? _el-div1 "foo"))) @@ -2249,27 +2295,37 @@ )) (deftest "a parent can take a class for other elements" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-d3 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click take .foo from .div for event.target") + (dom-set-attr _el-d1 "id" "d1") + (dom-add-class _el-d1 "div") + (dom-add-class _el-d1 "foo") + (dom-set-attr _el-d2 "id" "d2") + (dom-add-class _el-d2 "div") + (dom-set-attr _el-d3 "id" "d3") + (dom-add-class _el-d3 "div") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) + (dom-append _el-div _el-d2) + (dom-append _el-div _el-d3) (hs-activate! _el-div) - (dom-dispatch (dom-query-by-id "d2") "click" nil) - (assert (not (dom-has-class? _el-div "foo"))) - (assert (dom-has-class? (dom-query-by-id "d2") "foo")) - (assert (not (dom-has-class? (dom-query-by-id "d3") "foo"))) + (dom-dispatch _el-d2 "click" nil) + (assert (not (dom-has-class? _el-d1 "foo"))) + (assert (dom-has-class? _el-d2 "foo")) + (assert (not (dom-has-class? _el-d3 "foo"))) )) (deftest "can take an attribute from other elements" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "div") (dom-set-attr _el-div "data-foo" "bar") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take @data-foo from .div") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-add-class _el-div2 "div") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert= (dom-get-attr _el-div "data-foo") "bar") (assert= (dom-get-attr _el-div1 "data-foo") "") @@ -2282,13 +2338,13 @@ (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "div") (dom-set-attr _el-div "data-foo" "bar") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take @data-foo=baz from .div") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-add-class _el-div2 "div") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert= (dom-get-attr _el-div "data-foo") "bar") (assert= (dom-get-attr _el-div1 "data-foo") "baz") @@ -2301,13 +2357,13 @@ (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "div") (dom-set-attr _el-div "data-foo" "bar") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take @data-foo=baz with \"qux\" from .div") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-add-class _el-div2 "div") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert= (dom-get-attr _el-div "data-foo") "qux") (assert= (dom-get-attr _el-div1 "data-foo") "baz") @@ -2320,14 +2376,14 @@ (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "div") (dom-set-attr _el-div "data-foo" "bar") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take @data-foo=baz with my @data-foo from .div") (dom-set-attr _el-div1 "data-foo" "qux") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-add-class _el-div2 "div") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert= (dom-get-attr _el-div "data-foo") "qux") (assert= (dom-get-attr _el-div1 "data-foo") "baz") @@ -2339,14 +2395,14 @@ (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-d3 (dom-create-element "div"))) (dom-add-class _el-div "div") (dom-set-attr _el-div "data-foo" "bar") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take @data-foo from .div for #d3") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-set-attr _el-d3 "id" "d3") (dom-add-class _el-d3 "div") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-d3) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert= (dom-get-attr _el-div "data-foo") "bar") (assert= (dom-get-attr _el-d3 "data-foo") "") @@ -2356,13 +2412,23 @@ )) (deftest "a parent can take an attribute for other elements" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-d3 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click take @data-foo from .div for event.target") + (dom-set-attr _el-d1 "id" "d1") + (dom-add-class _el-d1 "div") + (dom-set-attr _el-d1 "data-foo" "bar") + (dom-set-attr _el-d2 "id" "d2") + (dom-add-class _el-d2 "div") + (dom-set-attr _el-d3 "id" "d3") + (dom-add-class _el-d3 "div") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) + (dom-append _el-div _el-d2) + (dom-append _el-div _el-d3) (hs-activate! _el-div) - (dom-dispatch (dom-query-by-id "d2") "click" nil) - (assert= (dom-get-attr _el-div "data-foo") "bar") - (assert= (dom-get-attr (dom-query-by-id "d2") "data-foo") "") + (dom-dispatch _el-d2 "click" nil) + (assert= (dom-get-attr _el-d1 "data-foo") "bar") + (assert= (dom-get-attr _el-d2 "data-foo") "") ;; SKIP check: skip assert.isNull(d2.getAttribute("data-foo") ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") ;; SKIP check: skip assert.isNull(d1.getAttribute("data-foo") @@ -2372,14 +2438,14 @@ (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-add-class _el-div "div") (dom-add-class _el-div "foo") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take .foo .bar") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-add-class _el-div2 "div") (dom-add-class _el-div2 "bar") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert (not (dom-has-class? _el-div "foo"))) (assert (dom-has-class? _el-div1 "foo")) @@ -2394,14 +2460,14 @@ (dom-add-class _el-div "div1") (dom-add-class _el-div "foo") (dom-add-class _el-div "bar") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") (dom-set-attr _el-div1 "_" "on click take .foo .bar from .div1") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-add-class _el-div2 "div") (dom-add-class _el-div2 "bar") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div1) (dom-dispatch _el-div1 "click" nil) (assert (not (dom-has-class? _el-div "foo"))) (assert (dom-has-class? _el-div1 "foo")) @@ -2464,10 +2530,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click transition element #foo width from 0px to 100px") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-style _el-foo "width") "100px") )) @@ -2475,10 +2541,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click transition #foo width from 0px to 100px") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-style _el-foo "width") "100px") )) @@ -2486,10 +2552,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click transition #foo's width from 0px to 100px") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-style _el-foo "width") "100px") )) @@ -2497,10 +2563,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click get #foo then transition its width from 0px to 100px") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-style _el-foo "width") "100px") )) @@ -2508,10 +2574,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click transition element #foo width from 0px to 100px using \"width 2s ease-in\"") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-style _el-foo "width") "100px") )) @@ -2519,10 +2585,10 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click transition element #foo width from 0px to 100px over 2s") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-get-style _el-foo "width") "100px") )) @@ -2568,37 +2634,37 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click transition *width of #foo from 0px to 100px") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) )) (deftest "can transition on another element with possessive" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click transition #foo's *width from 0px to 100px") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) )) (deftest "can transition on another element with it" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click get #foo then transition its *width from 0px to 100px") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) )) (deftest "can transition with a custom transition string" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click transition #foo's *width from 0px to 100px using \"width 2s ease-in\"") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-foo) + (hs-activate! _el-div) )) (deftest "can transition a single property on form using style ref" (hs-cleanup!) @@ -3237,9 +3303,12 @@ )) (deftest "append preserves existing content rather than overwriting it" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-btn1 (dom-create-element "button"))) (dom-set-attr _el-div "_" "on click append 'New Content' to me") + (dom-set-attr _el-btn1 "id" "btn1") + (dom-set-inner-html _el-btn1 "Click Me") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-btn1) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) @@ -3285,10 +3354,10 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click add .foo then tell #d2 then add .bar") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) (assert (not (dom-has-class? _el-d1 "bar"))) (assert (dom-has-class? _el-d1 "foo")) @@ -3300,10 +3369,10 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click add .foo then tell #d2 then add .bar to me") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) (assert (dom-has-class? _el-d1 "bar")) (assert (dom-has-class? _el-d1 "foo")) @@ -3312,30 +3381,36 @@ )) (deftest "works with an array" (hs-cleanup!) - (let ((_el-d1 (dom-create-element "div"))) + (let ((_el-d1 (dom-create-element "div")) (_el-p1 (dom-create-element "p")) (_el-p2 (dom-create-element "p")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click add .foo then tell

in me then add .bar") + (dom-set-attr _el-p1 "id" "p1") + (dom-set-attr _el-p2 "id" "p2") + (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-d1) + (dom-append _el-d1 _el-p1) + (dom-append _el-d1 _el-p2) + (dom-append _el-d1 _el-d2) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) (assert (not (dom-has-class? _el-d1 "bar"))) (assert (dom-has-class? _el-d1 "foo")) (assert (not (dom-has-class? (dom-query-by-id "div2") "bar"))) (assert (not (dom-has-class? (dom-query-by-id "div2") "foo"))) - (assert (dom-has-class? (dom-query-by-id "p1") "bar")) - (assert (not (dom-has-class? (dom-query-by-id "p1") "foo"))) - (assert (dom-has-class? (dom-query-by-id "p2") "bar")) - (assert (not (dom-has-class? (dom-query-by-id "p2") "foo"))) + (assert (dom-has-class? _el-p1 "bar")) + (assert (not (dom-has-class? _el-p1 "foo"))) + (assert (dom-has-class? _el-p2 "bar")) + (assert (not (dom-has-class? _el-p2 "foo"))) )) (deftest "restores a proper implicit me symbol" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click tell #d2 then add .bar end then add .foo") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) (assert (not (dom-has-class? _el-d1 "bar"))) (assert (dom-has-class? _el-d1 "foo")) @@ -3347,10 +3422,10 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click tell null then add .bar end then add .foo") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) (assert (not (dom-has-class? _el-d1 "bar"))) (assert (dom-has-class? _el-d1 "foo")) @@ -3362,10 +3437,10 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click tell #d2 then add .bar to you") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) (assert (not (dom-has-class? _el-d1 "bar"))) (assert (dom-has-class? _el-d2 "bar")) @@ -3375,11 +3450,11 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click tell #d2 then put your innerText into me") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-set-inner-html _el-d2 "foo") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) ;; SKIP check: skip div1.innerText.should.equal("") ;; SKIP check: skip div2.innerText.should.equal("foo") @@ -3390,11 +3465,11 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click tell #d2 then put @foo into me") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "foo" "bar") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) ;; SKIP check: skip div1.innerText.should.equal("") ;; SKIP check: skip div2.innerText.should.equal("") @@ -3402,20 +3477,26 @@ )) (deftest "yourself attribute also works" (hs-cleanup!) - (let ((_el-d1 (dom-create-element "div"))) + (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click tell #d2 remove yourself") + (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-d1) + (dom-append _el-d1 _el-d2) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) (assert= (dom-inner-html _el-d1) "") )) (deftest "tell terminates with a feature" (hs-cleanup!) - (let ((_el-d1 (dom-create-element "div"))) + (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-d3 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click tell #d2 remove yourself on click tell #d3 remove yourself") + (dom-set-attr _el-d2 "id" "d2") + (dom-set-attr _el-d3 "id" "d3") (dom-append (dom-body) _el-d1) + (dom-append _el-d1 _el-d2) + (dom-append _el-d1 _el-d3) (hs-activate! _el-d1) (dom-dispatch _el-d1 "click" nil) (assert= (dom-inner-html _el-d1) "") @@ -3428,11 +3509,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send example.event to #d1") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on example.event add .called") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-div "called")) @@ -3441,11 +3522,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send example:event to #d1") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on example:event add .called") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-div "called")) @@ -3454,11 +3535,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click send \"a-b\" to #d1") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on \"a-b\" add .called") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-div "called")) @@ -3467,8 +3548,8 @@ (hs-cleanup!) (let ((_el-bar (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-bar "id" "bar") - (dom-append (dom-body) _el-bar) (dom-set-attr _el-div "_" "on click from #bar add .clicked") + (dom-append (dom-body) _el-bar) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-bar "click" nil) @@ -3478,8 +3559,8 @@ (hs-cleanup!) (let ((_el-bar (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-bar "id" "bar") - (dom-append (dom-body) _el-bar) (dom-set-attr _el-div "_" "on click from #bar set #bar.innerHTML to #bar.innerHTML + \"a\"") + (dom-append (dom-body) _el-bar) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-bar "click" nil) @@ -3521,11 +3602,11 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click send custom(foo:\"fromBar\") to #d2") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "_" "on custom(foo) call me.classList.add(foo)") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (hs-activate! _el-d2) (dom-dispatch _el-d1 "click" nil) (assert (dom-has-class? _el-d1 "fromBar")) @@ -3535,11 +3616,11 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click send fromBar to #d2") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "_" "on fromBar(type) call me.classList.add(type)") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (hs-activate! _el-d2) (dom-dispatch _el-d1 "click" nil) (assert (dom-has-class? _el-d1 "fromBar")) @@ -3558,8 +3639,8 @@ (let ((_el-script (dom-create-element "script")) (_el-loadedDemo (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "on load put \"Loaded\" into #loadedDemo.innerHTML") - (dom-append (dom-body) _el-script) (dom-set-attr _el-loadedDemo "id" "loadedDemo") + (dom-append (dom-body) _el-script) (dom-append (dom-body) _el-loadedDemo) ;; SKIP check: skip byId("loadedDemo").innerText.should.equal("Loaded") )) @@ -3577,13 +3658,13 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click[buttons==0] log event then put \"Clicked\" into my.innerHTML") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div1 "_" "on click[buttons==1] log event then put \"Clicked\" into my.innerHTML") - (dom-append (dom-body) _el-div1) - (hs-activate! _el-div1) (dom-set-attr _el-div2 "_" "on click[buttons==1 and buttons==0] log event then put \"Clicked\" into my.innerHTML") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-div2) + (hs-activate! _el-div) + (hs-activate! _el-div1) (hs-activate! _el-div2) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) @@ -3744,9 +3825,13 @@ )) (deftest "can listen for events in another element (lazy)" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-div "_" "on click in #d1 put it into window.tmp") + (dom-set-attr _el-d1 "id" "d1") + (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) + (dom-append _el-div _el-d2) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) ;; SKIP check: skip div1.should.equal(window.tmp) @@ -3885,8 +3970,8 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-append (dom-body) _el-d1) (dom-set-attr _el-div "_" "on mutation of attributes from #d1 put \"Mutated\" into me") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-set-attr _el-d1 "foo" "bar") @@ -3897,15 +3982,15 @@ (let ((_el-script (dom-create-element "script")) (_el-div (dom-create-element "div")) (_el-div2 (dom-create-element "div")) (_el-div3 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "behavior DemoBehavior on foo wait 10ms then set my innerHTML to 'behavior'") - (dom-append (dom-body) _el-script) (dom-set-attr _el-div "_" "install DemoBehavior") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-div2 "_" "install DemoBehavior") - (dom-append (dom-body) _el-div2) - (hs-activate! _el-div2) (dom-set-attr _el-div3 "_" "install DemoBehavior") + (dom-append (dom-body) _el-script) + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div2) (dom-append (dom-body) _el-div3) + (hs-activate! _el-div) + (hs-activate! _el-div2) (hs-activate! _el-div3) (dom-dispatch _el-div "foo" nil) (dom-dispatch _el-div2 "foo" nil) @@ -3928,8 +4013,8 @@ (let ((_el-script (dom-create-element "script")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def throwBar() throw 'bar' end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-button "_" "on click throwBar() catch e put e into me") + (dom-append (dom-body) _el-script) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4070,10 +4155,10 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-append (dom-body) _el-d1) (dom-set-attr _el-d2 "id" "d2") - (dom-append (dom-body) _el-d2) (dom-set-attr _el-div "_" "on click from #d1 or click from #d2 then increment @count then put @count into me") + (dom-append (dom-body) _el-d1) + (dom-append (dom-body) _el-d2) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-d1 "click" nil) @@ -4165,12 +4250,12 @@ (let ((_el-script (dom-create-element "script")) (_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def foo() add .called to #d1 end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-div "_" "on click call foo()") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") + (dom-append (dom-body) _el-script) + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (dom-dispatch _el-script "click" nil) (assert (dom-has-class? _el-div "called")) )) @@ -4179,12 +4264,12 @@ (let ((_el-script (dom-create-element "script")) (_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def foo(str) put str into #d1.innerHTML end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-div "_" "on click call foo(\"called\")") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") + (dom-append (dom-body) _el-script) + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (dom-dispatch _el-script "click" nil) (assert= (dom-inner-html _el-div) "called") )) @@ -4193,12 +4278,12 @@ (let ((_el-script (dom-create-element "script")) (_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def utils.foo() add .called to #d1 end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-div "_" "on click call utils.foo()") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") + (dom-append (dom-body) _el-script) + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (dom-dispatch _el-script "click" nil) (assert (dom-has-class? _el-div "called")) )) @@ -4207,12 +4292,12 @@ (let ((_el-script (dom-create-element "script")) (_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def foo() log meend") - (dom-append (dom-body) _el-script) (dom-set-attr _el-div "_" "on click call foo() then add .called to #d1") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") + (dom-append (dom-body) _el-script) + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (dom-dispatch _el-script "click" nil) (assert (dom-has-class? _el-div "called")) )) @@ -4221,12 +4306,12 @@ (let ((_el-script (dom-create-element "script")) (_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def foo() wait 1ms log meend") - (dom-append (dom-body) _el-script) (dom-set-attr _el-div "_" "on click call foo() then add .called to #d1") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") + (dom-append (dom-body) _el-script) + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (dom-dispatch _el-script "click" nil) (assert (dom-has-class? _el-div "called")) )) @@ -4235,12 +4320,12 @@ (let ((_el-script (dom-create-element "script")) (_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def foo() return \"foo\"end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-div "_" "on click call foo() then put it into #d1.innerText") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") + (dom-append (dom-body) _el-script) + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (dom-dispatch _el-script "click" nil) ;; SKIP check: skip div.innerText.should.equal("") ;; SKIP check: skip div.innerText.should.equal("foo") @@ -4257,12 +4342,12 @@ (let ((_el-script (dom-create-element "script")) (_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-set-inner-html _el-script "def foo() wait 1ms return \"foo\"end") - (dom-append (dom-body) _el-script) (dom-set-attr _el-div "_" "on click call foo() then put it into #d1.innerText") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-d1 "id" "d1") + (dom-append (dom-body) _el-script) + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-d1) + (hs-activate! _el-div) (dom-dispatch _el-script "click" nil) ;; SKIP check: skip div.innerText.should.equal("") ;; SKIP check: skip div.innerText.should.equal("foo") @@ -4342,26 +4427,50 @@ )) (deftest "can install a function on an element and use in children w/ no leak" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-d3 (dom-create-element "div"))) (dom-set-attr _el-div "_" "def func() put 42 into #d3") + (dom-set-attr _el-d1 "id" "d1") + (dom-set-attr _el-d1 "_" "on click call func()") + (dom-set-attr _el-d2 "id" "d2") + (dom-set-attr _el-d3 "id" "d3") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) + (dom-append _el-div _el-d2) + (dom-append _el-div _el-d3) (hs-activate! _el-div) + (hs-activate! _el-d1) ;; SKIP check: skip byId("d3").innerText.should.equal("42") )) (deftest "can install a function on an element and use in children w/ return value" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-d3 (dom-create-element "div"))) (dom-set-attr _el-div "_" "def func() return 42") + (dom-set-attr _el-d1 "id" "d1") + (dom-set-attr _el-d1 "_" "on click put func() into me") + (dom-set-attr _el-d2 "id" "d2") + (dom-set-attr _el-d3 "id" "d3") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) + (dom-append _el-div _el-d2) + (dom-append _el-div _el-d3) (hs-activate! _el-div) + (hs-activate! _el-d1) ;; SKIP check: skip byId("d1").innerText.should.equal("42") )) (deftest "can install a function on an element and use me symbol correctly" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div")) (_el-d3 (dom-create-element "div"))) (dom-set-attr _el-div "_" "def func() put 42 into me") + (dom-set-attr _el-d1 "id" "d1") + (dom-set-attr _el-d1 "_" "on click call func()") + (dom-set-attr _el-d2 "id" "d2") + (dom-set-attr _el-d3 "id" "d3") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) + (dom-append _el-div _el-d2) + (dom-append _el-div _el-d3) (hs-activate! _el-div) + (hs-activate! _el-d1) ;; SKIP check: skip div.innerText.should.equal("42") )) (deftest "finally blocks run normally" @@ -4427,10 +4536,10 @@ (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-button "_" "on click ask \"What is your name?\" then put it into #out") (dom-set-inner-html _el-button "Ask") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "Alice") )) @@ -4439,10 +4548,10 @@ (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-button "_" "on click ask \"Name?\" then put it into #out") (dom-set-inner-html _el-button "Ask") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "null") )) @@ -4451,10 +4560,10 @@ (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-button "_" "on click answer \"Hello!\" then put \"done\" into #out") (dom-set-inner-html _el-button "Go") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "done") )) @@ -4463,10 +4572,10 @@ (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-button "_" "on click answer \"Save?\" with \"Yes\" or \"No\" then put it into #out") (dom-set-inner-html _el-button "Go") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "Yes") )) @@ -4475,10 +4584,10 @@ (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-button "_" "on click answer \"Save?\" with \"Yes\" or \"No\" then put it into #out") (dom-set-inner-html _el-button "Go") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "No") )) @@ -4488,11 +4597,13 @@ (defsuite "hs-upstream-dialog" (deftest "show opens a dialog as modal" (hs-cleanup!) - (let ((_el-d (dom-create-element "dialog")) (_el-button (dom-create-element "button"))) + (let ((_el-d (dom-create-element "dialog")) (_el-p (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-d "id" "d") - (dom-append (dom-body) _el-d) + (dom-set-inner-html _el-p "Hello") (dom-set-attr _el-button "_" "on click show #d") (dom-set-inner-html _el-button "Open") + (dom-append (dom-body) _el-d) + (dom-append _el-d _el-p) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4500,27 +4611,42 @@ )) (deftest "hide closes a dialog" (hs-cleanup!) - (let ((_el-d (dom-create-element "dialog"))) + (let ((_el-d (dom-create-element "dialog")) (_el-p (dom-create-element "p")) (_el-close (dom-create-element "button"))) (dom-set-attr _el-d "id" "d") + (dom-set-inner-html _el-p "Hello") + (dom-set-attr _el-close "id" "close") + (dom-set-attr _el-close "_" "on click hide #d") + (dom-set-inner-html _el-close "Close") (dom-append (dom-body) _el-d) + (dom-append _el-d _el-p) + (dom-append _el-d _el-close) + (hs-activate! _el-close) (dom-dispatch (dom-query-by-id "close") "click" nil) (assert (not (dom-has-attr? (dom-query-by-id "d") "open"))) )) (deftest "show on already-open dialog is a no-op" (hs-cleanup!) - (let ((_el-d (dom-create-element "dialog"))) + (let ((_el-d (dom-create-element "dialog")) (_el-p (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-d "id" "d") + (dom-set-inner-html _el-p "Hello") + (dom-set-attr _el-button "_" "on click show #d") + (dom-set-inner-html _el-button "Show Again") (dom-append (dom-body) _el-d) - (dom-dispatch (dom-query "button") "click" nil) + (dom-append _el-d _el-p) + (dom-append _el-d _el-button) + (hs-activate! _el-button) + (dom-dispatch _el-button "click" nil) (assert (dom-has-attr? (dom-query-by-id "d") "open")) )) (deftest "open opens a dialog" (hs-cleanup!) - (let ((_el-d (dom-create-element "dialog")) (_el-button (dom-create-element "button"))) + (let ((_el-d (dom-create-element "dialog")) (_el-p (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-d "id" "d") - (dom-append (dom-body) _el-d) + (dom-set-inner-html _el-p "Hello") (dom-set-attr _el-button "_" "on click open #d") (dom-set-inner-html _el-button "Open") + (dom-append (dom-body) _el-d) + (dom-append _el-d _el-p) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4528,19 +4654,30 @@ )) (deftest "close closes a dialog" (hs-cleanup!) - (let ((_el-d (dom-create-element "dialog"))) + (let ((_el-d (dom-create-element "dialog")) (_el-p (dom-create-element "p")) (_el-close (dom-create-element "button"))) (dom-set-attr _el-d "id" "d") + (dom-set-inner-html _el-p "Hello") + (dom-set-attr _el-close "id" "close") + (dom-set-attr _el-close "_" "on click close #d") + (dom-set-inner-html _el-close "Close") (dom-append (dom-body) _el-d) + (dom-append _el-d _el-p) + (dom-append _el-d _el-close) + (hs-activate! _el-close) (dom-dispatch (dom-query-by-id "close") "click" nil) (assert (not (dom-has-attr? (dom-query-by-id "d") "open"))) )) (deftest "open opens a details element" (hs-cleanup!) - (let ((_el-d (dom-create-element "details")) (_el-button (dom-create-element "button"))) + (let ((_el-d (dom-create-element "details")) (_el-summary (dom-create-element "summary")) (_el-p (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-d "id" "d") - (dom-append (dom-body) _el-d) + (dom-set-inner-html _el-summary "More") + (dom-set-inner-html _el-p "Content") (dom-set-attr _el-button "_" "on click open #d") (dom-set-inner-html _el-button "Open") + (dom-append (dom-body) _el-d) + (dom-append _el-d _el-summary) + (dom-append _el-d _el-p) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4548,11 +4685,15 @@ )) (deftest "close closes a details element" (hs-cleanup!) - (let ((_el-d (dom-create-element "details")) (_el-button (dom-create-element "button"))) + (let ((_el-d (dom-create-element "details")) (_el-summary (dom-create-element "summary")) (_el-p (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-d "id" "d") - (dom-append (dom-body) _el-d) + (dom-set-inner-html _el-summary "More") + (dom-set-inner-html _el-p "Content") (dom-set-attr _el-button "_" "on click close #d") (dom-set-inner-html _el-button "Close") + (dom-append (dom-body) _el-d) + (dom-append _el-d _el-summary) + (dom-append _el-d _el-p) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4560,20 +4701,29 @@ )) (deftest "open shows a popover" (hs-cleanup!) - (let ((_el-p (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-p (dom-create-element "div")) (_el-p1 (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-p "id" "p") - (dom-append (dom-body) _el-p) + (dom-set-inner-html _el-p1 "Popover content") (dom-set-attr _el-button "_" "on click open #p") (dom-set-inner-html _el-button "Open") + (dom-append (dom-body) _el-p) + (dom-append _el-p _el-p1) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) )) (deftest "close hides a popover" (hs-cleanup!) - (let ((_el-p (dom-create-element "div"))) + (let ((_el-p (dom-create-element "div")) (_el-p1 (dom-create-element "p")) (_el-close (dom-create-element "button"))) (dom-set-attr _el-p "id" "p") + (dom-set-inner-html _el-p1 "Popover content") + (dom-set-attr _el-close "id" "close") + (dom-set-attr _el-close "_" "on click close #p") + (dom-set-inner-html _el-close "Close") (dom-append (dom-body) _el-p) + (dom-append _el-p _el-p1) + (dom-append _el-p _el-close) + (hs-activate! _el-close) (dom-dispatch (dom-query-by-id "close") "click" nil) )) (deftest "open on implicit me" @@ -4581,11 +4731,11 @@ (let ((_el-d (dom-create-element "dialog")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-d "id" "d") (dom-set-attr _el-d "_" "on myOpen open") - (dom-append (dom-body) _el-d) - (hs-activate! _el-d) (dom-set-attr _el-button "_" "on click send myOpen to #d") (dom-set-inner-html _el-button "Open") + (dom-append (dom-body) _el-d) (dom-append (dom-body) _el-button) + (hs-activate! _el-d) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert (dom-has-attr? (dom-query-by-id "d") "open")) @@ -4596,10 +4746,14 @@ (defsuite "hs-upstream-empty" (deftest "can empty an element" (hs-cleanup!) - (let ((_el-d1 (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-d1 (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-p2 (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-d1 "id" "d1") - (dom-append (dom-body) _el-d1) + (dom-set-inner-html _el-p "hello") + (dom-set-inner-html _el-p2 "world") (dom-set-attr _el-button "_" "on click empty #d1") + (dom-append (dom-body) _el-d1) + (dom-append _el-d1 _el-p) + (dom-append _el-d1 _el-p2) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4617,12 +4771,16 @@ )) (deftest "can empty multiple elements" (hs-cleanup!) - (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-div (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-div2 (dom-create-element "div")) (_el-p3 (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-add-class _el-div "clearme") - (dom-append (dom-body) _el-div) - (dom-add-class _el-div1 "clearme") - (dom-append (dom-body) _el-div1) + (dom-set-inner-html _el-p "a") + (dom-add-class _el-div2 "clearme") + (dom-set-inner-html _el-p3 "b") (dom-set-attr _el-button "_" "on click empty .clearme") + (dom-append (dom-body) _el-div) + (dom-append _el-div _el-p) + (dom-append (dom-body) _el-div2) + (dom-append _el-div2 _el-p3) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4660,9 +4818,9 @@ (dom-set-attr _el-t1 "id" "t1") (dom-set-attr _el-t1 "type" "text") (dom-set-attr _el-t1 "value" "hello") - (dom-append (dom-body) _el-t1) (dom-set-attr _el-button "_" "on click empty #t1") (dom-set-inner-html _el-button "Empty") + (dom-append (dom-body) _el-t1) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4673,9 +4831,9 @@ (let ((_el-ta1 (dom-create-element "textarea")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-ta1 "id" "ta1") (dom-set-inner-html _el-ta1 "some text") - (dom-append (dom-body) _el-ta1) (dom-set-attr _el-button "_" "on click empty #ta1") (dom-set-inner-html _el-button "Empty") + (dom-append (dom-body) _el-ta1) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4686,9 +4844,9 @@ (let ((_el-cb1 (dom-create-element "input")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-cb1 "id" "cb1") (dom-set-attr _el-cb1 "type" "checkbox") - (dom-append (dom-body) _el-cb1) (dom-set-attr _el-button "_" "on click empty #cb1") (dom-set-inner-html _el-button "Empty") + (dom-append (dom-body) _el-cb1) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4696,22 +4854,38 @@ )) (deftest "can empty a select" (hs-cleanup!) - (let ((_el-sel1 (dom-create-element "select")) (_el-button (dom-create-element "button"))) + (let ((_el-sel1 (dom-create-element "select")) (_el-option (dom-create-element "option")) (_el-option2 (dom-create-element "option")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-sel1 "id" "sel1") - (dom-append (dom-body) _el-sel1) + (dom-set-attr _el-option "value" "a") + (dom-set-inner-html _el-option "A") + (dom-set-attr _el-option2 "value" "b") + (dom-set-inner-html _el-option2 "B") (dom-set-attr _el-button "_" "on click empty #sel1") (dom-set-inner-html _el-button "Empty") + (dom-append (dom-body) _el-sel1) + (dom-append _el-sel1 _el-option) + (dom-append _el-sel1 _el-option2) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) )) (deftest "can empty a form (clears all inputs)" (hs-cleanup!) - (let ((_el-f1 (dom-create-element "form")) (_el-button (dom-create-element "button"))) + (let ((_el-f1 (dom-create-element "form")) (_el-t2 (dom-create-element "input")) (_el-ta2 (dom-create-element "textarea")) (_el-cb2 (dom-create-element "input")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-f1 "id" "f1") - (dom-append (dom-body) _el-f1) + (dom-set-attr _el-t2 "id" "t2") + (dom-set-attr _el-t2 "type" "text") + (dom-set-attr _el-t2 "value" "val") + (dom-set-attr _el-ta2 "id" "ta2") + (dom-set-inner-html _el-ta2 "text") + (dom-set-attr _el-cb2 "id" "cb2") + (dom-set-attr _el-cb2 "type" "checkbox") (dom-set-attr _el-button "_" "on click empty #f1") (dom-set-inner-html _el-button "Empty") + (dom-append (dom-body) _el-f1) + (dom-append _el-f1 _el-t2) + (dom-append _el-f1 _el-ta2) + (dom-append _el-f1 _el-cb2) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4725,9 +4899,9 @@ (dom-set-attr _el-t3 "id" "t3") (dom-set-attr _el-t3 "type" "text") (dom-set-attr _el-t3 "value" "hello") - (dom-append (dom-body) _el-t3) (dom-set-attr _el-button "_" "on click clear #t3") (dom-set-inner-html _el-button "Clear") + (dom-append (dom-body) _el-t3) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4735,10 +4909,12 @@ )) (deftest "clear works on elements" (hs-cleanup!) - (let ((_el-d2 (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-d2 (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-d2 "id" "d2") - (dom-append (dom-body) _el-d2) + (dom-set-inner-html _el-p "content") (dom-set-attr _el-button "_" "on click clear #d2") + (dom-append (dom-body) _el-d2) + (dom-append _el-d2 _el-p) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4752,8 +4928,8 @@ (hs-cleanup!) (let ((_el-i1 (dom-create-element "input")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-i1 "id" "i1") - (dom-append (dom-body) _el-i1) (dom-set-attr _el-button "_" "on click focus #i1") + (dom-append (dom-body) _el-i1) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4804,11 +4980,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-target (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-set-attr _el-div "style" "height: 2000px") - (dom-append (dom-body) _el-div) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "Target") - (dom-append (dom-body) _el-target) (dom-set-attr _el-div2 "_" "on click go to #target") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-div2) (hs-activate! _el-div2) (dom-dispatch (dom-query "div:nth-of-type(3)") "click" nil) @@ -4817,11 +4993,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-target (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-set-attr _el-div "style" "height: 2000px") - (dom-append (dom-body) _el-div) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "Target") - (dom-append (dom-body) _el-target) (dom-set-attr _el-div2 "_" "on click go to the top of #target") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-div2) (hs-activate! _el-div2) (dom-dispatch (dom-query "div:nth-of-type(3)") "click" nil) @@ -4832,11 +5008,17 @@ (defsuite "hs-upstream-halt" (deftest "halts event propagation and default" (hs-cleanup!) - (let ((_el-outer (dom-create-element "div"))) + (let ((_el-outer (dom-create-element "div")) (_el-inner (dom-create-element "a"))) (dom-set-attr _el-outer "id" "outer") (dom-set-attr _el-outer "_" "on click add .outer-clicked") + (dom-set-attr _el-inner "id" "inner") + (dom-set-attr _el-inner "_" "on click halt") + (dom-set-attr _el-inner "href" "#shouldnot") + (dom-set-inner-html _el-inner "click me") (dom-append (dom-body) _el-outer) + (dom-append _el-outer _el-inner) (hs-activate! _el-outer) + (hs-activate! _el-inner) (dom-dispatch (dom-query-by-id "inner") "click" nil) (assert (not (dom-has-class? (dom-query-by-id "outer") "outer-clicked"))) )) @@ -4852,21 +5034,30 @@ )) (deftest "halt the event stops propagation but continues execution" (hs-cleanup!) - (let ((_el-outer (dom-create-element "div"))) + (let ((_el-outer (dom-create-element "div")) (_el-inner (dom-create-element "div"))) (dom-set-attr _el-outer "id" "outer") (dom-set-attr _el-outer "_" "on click add .outer-clicked") + (dom-set-attr _el-inner "id" "inner") + (dom-set-attr _el-inner "_" "on click halt the event then add .continued") + (dom-set-inner-html _el-inner "click me") (dom-append (dom-body) _el-outer) + (dom-append _el-outer _el-inner) (hs-activate! _el-outer) + (hs-activate! _el-inner) (dom-dispatch (dom-query-by-id "inner") "click" nil) (assert (not (dom-has-class? (dom-query-by-id "outer") "outer-clicked"))) (assert (dom-has-class? (dom-query-by-id "inner") "continued")) )) (deftest "halt the event's stops propagation but continues execution" (hs-cleanup!) - (let ((_el-outer (dom-create-element "div"))) + (let ((_el-outer (dom-create-element "div")) (_el-inner (dom-create-element "div"))) (dom-set-attr _el-outer "id" "outer") (dom-set-attr _el-outer "_" "on click add .outer-clicked") + (dom-set-attr _el-inner "id" "inner") + ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-inner "click me") (dom-append (dom-body) _el-outer) + (dom-append _el-outer _el-inner) (hs-activate! _el-outer) (dom-dispatch (dom-query-by-id "inner") "click" nil) (assert (not (dom-has-class? (dom-query-by-id "outer") "outer-clicked"))) @@ -4874,11 +5065,16 @@ )) (deftest "halt bubbling only stops propagation, not default" (hs-cleanup!) - (let ((_el-outer (dom-create-element "div"))) + (let ((_el-outer (dom-create-element "div")) (_el-inner (dom-create-element "div"))) (dom-set-attr _el-outer "id" "outer") (dom-set-attr _el-outer "_" "on click add .outer-clicked") + (dom-set-attr _el-inner "id" "inner") + (dom-set-attr _el-inner "_" "on click halt bubbling then add .continued") + (dom-set-inner-html _el-inner "click me") (dom-append (dom-body) _el-outer) + (dom-append _el-outer _el-inner) (hs-activate! _el-outer) + (hs-activate! _el-inner) (dom-dispatch (dom-query-by-id "inner") "click" nil) (assert (not (dom-has-class? (dom-query-by-id "outer") "outer-clicked"))) (assert (not (dom-has-class? (dom-query-by-id "inner") "continued"))) @@ -4887,11 +5083,16 @@ (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) (deftest "halt default only prevents default, not propagation" (hs-cleanup!) - (let ((_el-outer (dom-create-element "div"))) + (let ((_el-outer (dom-create-element "div")) (_el-inner (dom-create-element "div"))) (dom-set-attr _el-outer "id" "outer") (dom-set-attr _el-outer "_" "on click add .outer-clicked") + (dom-set-attr _el-inner "id" "inner") + (dom-set-attr _el-inner "_" "on click halt default") + (dom-set-inner-html _el-inner "click me") (dom-append (dom-body) _el-outer) + (dom-append _el-outer _el-inner) (hs-activate! _el-outer) + (hs-activate! _el-inner) (dom-dispatch (dom-query-by-id "inner") "click" nil) (assert (dom-has-class? (dom-query-by-id "outer") "outer-clicked")) )) @@ -4904,8 +5105,9 @@ (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-append (dom-body) _el-target) ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "target")) "new") @@ -4915,9 +5117,10 @@ (let ((_el-target (dom-create-element "div")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-append (dom-body) _el-target) (dom-set-attr _el-go "id" "go") ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-go "go") + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) (assert= (dom-text-content (dom-query-by-id "target")) "new") @@ -4928,40 +5131,59 @@ (dom-set-attr _el-target "id" "target") (dom-add-class _el-target "old") (dom-set-inner-html _el-target "content") - (dom-append (dom-body) _el-target) ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-button) (dom-dispatch _el-button "click" nil) (assert (dom-has-class? (dom-query-by-id "target") "new")) )) (deftest "morph adds new children" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-target1 (dom-create-element "button"))) + (let ((_el-target (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-target2 (dom-create-element "button")) (_el-span3 (dom-create-element "span")) (_el-span4 (dom-create-element "span"))) (dom-set-attr _el-target "id" "target") - (dom-append (dom-body) _el-target) - (dom-set-attr _el-target1 "id" "target") + (dom-set-inner-html _el-span "first") + (dom-set-attr _el-target2 "id" "target") ;; HS source has bare quotes or embedded HTML - (dom-append (dom-body) _el-target1) + (dom-set-inner-html _el-span3 "first") + (dom-set-inner-html _el-span4 "second") + (dom-append (dom-body) _el-target) + (dom-append _el-target _el-span) + (dom-append (dom-body) _el-target2) + (dom-append _el-target2 _el-span3) + (dom-append _el-target2 _el-span4) (dom-dispatch (dom-query-by-id "go") "click" nil) )) (deftest "morph removes old children" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-target1 (dom-create-element "button"))) + (let ((_el-target (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-span2 (dom-create-element "span")) (_el-target3 (dom-create-element "button")) (_el-span4 (dom-create-element "span"))) (dom-set-attr _el-target "id" "target") - (dom-append (dom-body) _el-target) - (dom-set-attr _el-target1 "id" "target") + (dom-set-inner-html _el-span "first") + (dom-set-inner-html _el-span2 "second") + (dom-set-attr _el-target3 "id" "target") ;; HS source has bare quotes or embedded HTML - (dom-append (dom-body) _el-target1) + (dom-set-inner-html _el-span4 "first") + (dom-append (dom-body) _el-target) + (dom-append _el-target _el-span) + (dom-append _el-target _el-span2) + (dom-append (dom-body) _el-target3) + (dom-append _el-target3 _el-span4) (dom-dispatch (dom-query-by-id "go") "click" nil) )) (deftest "morph initializes hyperscript on new elements" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-target1 (dom-create-element "button"))) + (let ((_el-target (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-target2 (dom-create-element "button")) (_el-inner (dom-create-element "p"))) (dom-set-attr _el-target "id" "target") - (dom-append (dom-body) _el-target) - (dom-set-attr _el-target1 "id" "target") + (dom-set-inner-html _el-p "old") + (dom-set-attr _el-target2 "id" "target") ;; HS source has bare quotes or embedded HTML - (dom-append (dom-body) _el-target1) + (dom-set-attr _el-inner "id" "inner") + ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-inner "new") + (dom-append (dom-body) _el-target) + (dom-append _el-target _el-p) + (dom-append (dom-body) _el-target2) + (dom-append _el-target2 _el-inner) (dom-dispatch (dom-query-by-id "go") "click" nil) (assert= (dom-text-content (dom-query-by-id "inner")) "new") (dom-dispatch (dom-query-by-id "inner") "click" nil) @@ -4969,29 +5191,46 @@ )) (deftest "morph cleans up removed hyperscript elements" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-target (dom-create-element "div")) (_el-child (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") - (dom-append (dom-body) _el-target) + (dom-set-attr _el-child "id" "child") + (dom-set-attr _el-child "_" "on click put \"alive\" into me") + (dom-set-inner-html _el-child "child") ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-target) + (dom-append _el-target _el-child) (dom-append (dom-body) _el-button) + (hs-activate! _el-child) (dom-dispatch _el-button "click" nil) )) (deftest "morph reorders children by id" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-target (dom-create-element "div")) (_el-a (dom-create-element "div")) (_el-b (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") - (dom-append (dom-body) _el-target) + (dom-set-attr _el-a "id" "a") + (dom-set-inner-html _el-a "A") + (dom-set-attr _el-b "id" "b") + (dom-set-inner-html _el-b "B") ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-target) + (dom-append _el-target _el-a) + (dom-append _el-target _el-b) (dom-append (dom-body) _el-button) (dom-dispatch _el-button "click" nil) )) (deftest "morph preserves matched child identity" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-go (dom-create-element "button"))) + (let ((_el-target (dom-create-element "div")) (_el-child (dom-create-element "div")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") - (dom-append (dom-body) _el-target) + (dom-set-attr _el-child "id" "child") + (dom-set-inner-html _el-child "old") (dom-set-attr _el-go "id" "go") ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-go "go") + (dom-append (dom-body) _el-target) + (dom-append _el-target _el-child) (dom-append (dom-body) _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) )) @@ -5000,10 +5239,10 @@ (let ((_el-target (dom-create-element "div")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "original") - (dom-append (dom-body) _el-target) (dom-set-attr _el-go "id" "go") (dom-set-attr _el-go "_" "on click set content to \"

morphed
\" then morph #target to content") (dom-set-inner-html _el-go "go") + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-go) (hs-activate! _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) @@ -5015,17 +5254,36 @@ (defsuite "hs-upstream-reset" (deftest "can reset a form" (hs-cleanup!) - (let ((_el-f1 (dom-create-element "form"))) + (let ((_el-f1 (dom-create-element "form")) (_el-t1 (dom-create-element "input")) (_el-button (dom-create-element "button")) (_el-rst (dom-create-element "button"))) (dom-set-attr _el-f1 "id" "f1") + (dom-set-attr _el-t1 "id" "t1") + (dom-set-attr _el-t1 "type" "text") + (dom-set-attr _el-t1 "value" "original") + (dom-set-attr _el-button "_" "on click set #t1's value to 'changed'") + (dom-set-attr _el-button "type" "button") + (dom-set-inner-html _el-button "Change") + (dom-set-attr _el-rst "id" "rst") + (dom-set-attr _el-rst "_" "on click reset #f1") + (dom-set-attr _el-rst "type" "button") + (dom-set-inner-html _el-rst "Reset") (dom-append (dom-body) _el-f1) + (dom-append _el-f1 _el-t1) + (dom-append _el-f1 _el-button) + (dom-append _el-f1 _el-rst) + (hs-activate! _el-button) + (hs-activate! _el-rst) (dom-dispatch (dom-query-by-id "rst") "click" nil) (assert= (dom-get-prop (dom-query-by-id "t1") "value") "original") )) (deftest "reset with no target resets me (form)" (hs-cleanup!) - (let ((_el-form (dom-create-element "form"))) + (let ((_el-form (dom-create-element "form")) (_el-t2 (dom-create-element "input"))) (dom-set-attr _el-form "_" "on custom reset") + (dom-set-attr _el-t2 "id" "t2") + (dom-set-attr _el-t2 "type" "text") + (dom-set-attr _el-t2 "value" "default") (dom-append (dom-body) _el-form) + (dom-append _el-form _el-t2) (hs-activate! _el-form) (dom-dispatch _el-form "custom" nil) (assert= (dom-get-prop (dom-query-by-id "t2") "value") "default") @@ -5036,9 +5294,9 @@ (dom-set-attr _el-t3 "id" "t3") (dom-set-attr _el-t3 "type" "text") (dom-set-attr _el-t3 "value" "hello") - (dom-append (dom-body) _el-t3) (dom-set-attr _el-button "_" "on click reset #t3") (dom-set-inner-html _el-button "Reset") + (dom-append (dom-body) _el-t3) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -5049,9 +5307,9 @@ (let ((_el-cb1 (dom-create-element "input")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-cb1 "id" "cb1") (dom-set-attr _el-cb1 "type" "checkbox") - (dom-append (dom-body) _el-cb1) (dom-set-attr _el-button "_" "on click reset #cb1") (dom-set-inner-html _el-button "Reset") + (dom-append (dom-body) _el-cb1) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -5062,9 +5320,9 @@ (let ((_el-cb2 (dom-create-element "input")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-cb2 "id" "cb2") (dom-set-attr _el-cb2 "type" "checkbox") - (dom-append (dom-body) _el-cb2) (dom-set-attr _el-button "_" "on click reset #cb2") (dom-set-inner-html _el-button "Reset") + (dom-append (dom-body) _el-cb2) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -5075,9 +5333,9 @@ (let ((_el-ta1 (dom-create-element "textarea")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-ta1 "id" "ta1") (dom-set-inner-html _el-ta1 "original text") - (dom-append (dom-body) _el-ta1) (dom-set-attr _el-button "_" "on click reset #ta1") (dom-set-inner-html _el-button "Reset") + (dom-append (dom-body) _el-ta1) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -5085,11 +5343,20 @@ )) (deftest "can reset a select" (hs-cleanup!) - (let ((_el-sel1 (dom-create-element "select")) (_el-button (dom-create-element "button"))) + (let ((_el-sel1 (dom-create-element "select")) (_el-option (dom-create-element "option")) (_el-option2 (dom-create-element "option")) (_el-option3 (dom-create-element "option")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-sel1 "id" "sel1") - (dom-append (dom-body) _el-sel1) + (dom-set-attr _el-option "value" "a") + (dom-set-inner-html _el-option "A") + (dom-set-attr _el-option2 "value" "b") + (dom-set-inner-html _el-option2 "B") + (dom-set-attr _el-option3 "value" "c") + (dom-set-inner-html _el-option3 "C") (dom-set-attr _el-button "_" "on click reset #sel1") (dom-set-inner-html _el-button "Reset") + (dom-append (dom-body) _el-sel1) + (dom-append _el-sel1 _el-option) + (dom-append _el-sel1 _el-option2) + (dom-append _el-sel1 _el-option3) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -5101,13 +5368,13 @@ (dom-add-class _el-input "resettable") (dom-set-attr _el-input "type" "text") (dom-set-attr _el-input "value" "one") - (dom-append (dom-body) _el-input) (dom-add-class _el-input1 "resettable") (dom-set-attr _el-input1 "type" "text") (dom-set-attr _el-input1 "value" "two") - (dom-append (dom-body) _el-input1) (dom-set-attr _el-button "_" "on click reset .resettable") (dom-set-inner-html _el-button "Reset") + (dom-append (dom-body) _el-input) + (dom-append (dom-body) _el-input1) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -5120,11 +5387,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-target (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-set-attr _el-div "style" "height: 2000px") - (dom-append (dom-body) _el-div) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "Target") - (dom-append (dom-body) _el-target) (dom-set-attr _el-div2 "_" "on click scroll to #target") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-div2) (hs-activate! _el-div2) (dom-dispatch (dom-query "div:nth-of-type(3)") "click" nil) @@ -5133,12 +5400,12 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-target (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) (dom-set-attr _el-div "style" "height: 2000px") - (dom-append (dom-body) _el-div) (dom-set-attr _el-target "id" "target") (dom-set-attr _el-target "style" "height: 200px") (dom-set-inner-html _el-target "Target") - (dom-append (dom-body) _el-target) (dom-set-attr _el-div2 "_" "on click scroll to the top of #target") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-div2) (hs-activate! _el-div2) (dom-dispatch (dom-query "div:nth-of-type(3)") "click" nil) @@ -5147,8 +5414,8 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div"))) (dom-set-attr _el-div "style" "height: 5000px") - (dom-append (dom-body) _el-div) (dom-set-attr _el-div1 "_" "on click scroll down by 300px") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div1) (hs-activate! _el-div1) (dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil) @@ -5157,8 +5424,8 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div"))) (dom-set-attr _el-div "style" "height: 5000px") - (dom-append (dom-body) _el-div) (dom-set-attr _el-div1 "_" "on click scroll up by 100px") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div1) (hs-activate! _el-div1) (dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil) @@ -5167,47 +5434,59 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div"))) (dom-set-attr _el-div "style" "height: 5000px") - (dom-append (dom-body) _el-div) (dom-set-attr _el-div1 "_" "on click scroll by 200px") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-div1) (hs-activate! _el-div1) (dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil) )) (deftest "can scroll container by amount" (hs-cleanup!) - (let ((_el-box (dom-create-element "div")) (_el-go (dom-create-element "button"))) + (let ((_el-box (dom-create-element "div")) (_el-div (dom-create-element "div")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-box "id" "box") (dom-set-attr _el-box "style" "height: 100px; overflow: auto") - (dom-append (dom-body) _el-box) + (dom-set-attr _el-div "style" "height: 1000px") + (dom-set-inner-html _el-div "tall") (dom-set-attr _el-go "id" "go") (dom-set-attr _el-go "_" "on click scroll #box down by 200px") (dom-set-inner-html _el-go "go") + (dom-append (dom-body) _el-box) + (dom-append _el-box _el-div) (dom-append (dom-body) _el-go) (hs-activate! _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) )) (deftest "can scroll to element in container" (hs-cleanup!) - (let ((_el-box (dom-create-element "div")) (_el-go (dom-create-element "button"))) + (let ((_el-box (dom-create-element "div")) (_el-div (dom-create-element "div")) (_el-item (dom-create-element "div")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-box "id" "box") (dom-set-attr _el-box "style" "height: 100px; overflow: auto") - (dom-append (dom-body) _el-box) + (dom-set-attr _el-div "style" "height: 500px") + (dom-set-inner-html _el-div "spacer") + (dom-set-attr _el-item "id" "item") + (dom-set-inner-html _el-item "target") (dom-set-attr _el-go "id" "go") (dom-set-attr _el-go "_" "on click scroll to #item in #box") (dom-set-inner-html _el-go "go") + (dom-append (dom-body) _el-box) + (dom-append _el-box _el-div) + (dom-append _el-box _el-item) (dom-append (dom-body) _el-go) (hs-activate! _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) )) (deftest "can scroll left by amount" (hs-cleanup!) - (let ((_el-box (dom-create-element "div")) (_el-go (dom-create-element "button"))) + (let ((_el-box (dom-create-element "div")) (_el-div (dom-create-element "div")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-box "id" "box") (dom-set-attr _el-box "style" "width: 100px; overflow: auto; white-space: nowrap") - (dom-append (dom-body) _el-box) + (dom-set-attr _el-div "style" "width: 5000px; height: 50px") + (dom-set-inner-html _el-div "wide") (dom-set-attr _el-go "id" "go") (dom-set-attr _el-go "_" "on click scroll #box right by 300px") (dom-set-inner-html _el-go "go") + (dom-append (dom-body) _el-box) + (dom-append _el-box _el-div) (dom-append (dom-body) _el-go) (hs-activate! _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) @@ -5221,9 +5500,9 @@ (let ((_el-inp (dom-create-element "input")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-inp "id" "inp") (dom-set-attr _el-inp "value" "hello world") - (dom-append (dom-body) _el-inp) (dom-set-attr _el-button "_" "on click select #inp") (dom-set-inner-html _el-button "Select") + (dom-append (dom-body) _el-inp) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -5233,9 +5512,9 @@ (let ((_el-ta (dom-create-element "textarea")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-ta "id" "ta") (dom-set-inner-html _el-ta "some text") - (dom-append (dom-body) _el-ta) (dom-set-attr _el-button "_" "on click select #ta") (dom-set-inner-html _el-button "Select") + (dom-append (dom-body) _el-ta) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -5255,13 +5534,13 @@ (let ((_el-text (dom-create-element "p")) (_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-text "id" "text") (dom-set-inner-html _el-text "Hello World") - (dom-append (dom-body) _el-text) (dom-set-attr _el-button "_" "on click put the selection into #out") (dom-set-inner-html _el-button "Get") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-text) + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "Hello") )) @@ -5284,14 +5563,14 @@ (let ((_el-d1 (dom-create-element "div")) (_el-a (dom-create-element "span")) (_el-b (dom-create-element "span"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click set #a.textContent to \"hello\" then set #b.textContent to \"world\" then swap #a.textContent with #b.textContent") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-a "id" "a") (dom-set-inner-html _el-a "x") - (dom-append (dom-body) _el-a) (dom-set-attr _el-b "id" "b") (dom-set-inner-html _el-b "y") + (dom-append (dom-body) _el-d1) + (dom-append (dom-body) _el-a) (dom-append (dom-body) _el-b) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= (dom-text-content (dom-query-by-id "a")) "world") (assert= (dom-text-content (dom-query-by-id "b")) "hello") @@ -5311,11 +5590,11 @@ (let ((_el-d1 (dom-create-element "div")) (_el-target (dom-create-element "span"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click set x to \"old\" then set #target.dataset.val to \"new\" then swap x with #target.dataset.val then put x into me") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-target "id" "target") (dom-set-attr _el-target "data-val" "x") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-target) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= (dom-text-content (dom-query-by-id "d1")) "new") (assert= (dom-get-attr (dom-query-by-id "target") "data-val") "old") @@ -5330,8 +5609,8 @@ (dom-set-attr _el-name-input "id" "name-input") (dom-set-attr _el-name-input "type" "text") (dom-set-attr _el-name-input "value" "Alice") - (dom-append (dom-body) _el-name-input) (dom-set-attr _el-span "_" "bind $name and #name-input.value end then when $name changes put it into me") + (dom-append (dom-body) _el-name-input) (dom-append (dom-body) _el-span) (hs-activate! _el-span) )) @@ -5355,8 +5634,8 @@ (dom-set-attr _el-city-input "id" "city-input") (dom-set-attr _el-city-input "type" "text") (dom-set-attr _el-city-input "value" "Paris") - (dom-append (dom-body) _el-city-input) (dom-set-attr _el-span "_" "bind $city to #city-input.value end then when $city changes put it into me") + (dom-append (dom-body) _el-city-input) (dom-append (dom-body) _el-span) (hs-activate! _el-span) )) @@ -5367,18 +5646,18 @@ (dom-set-attr _el-input "type" "text") (dom-set-attr _el-input "value" "hello") (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-append (dom-body) _el-span) + (hs-activate! _el-input) )) (deftest "shorthand on checkbox binds to checked" (hs-cleanup!) (let ((_el-input (dom-create-element "input")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-input "_" "bind $isDarkMode to me") (dom-set-attr _el-input "type" "checkbox") - (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-set-attr _el-span "_" "when $isDarkMode changes put it into me") + (dom-append (dom-body) _el-input) (dom-append (dom-body) _el-span) + (hs-activate! _el-input) (hs-activate! _el-span) )) (deftest "shorthand on textarea binds to value" @@ -5386,20 +5665,29 @@ (let ((_el-textarea (dom-create-element "textarea")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-textarea "_" "bind $bio to me") (dom-set-inner-html _el-textarea "Hello world") - (dom-append (dom-body) _el-textarea) - (hs-activate! _el-textarea) (dom-set-attr _el-span "_" "when $bio changes put it into me") + (dom-append (dom-body) _el-textarea) (dom-append (dom-body) _el-span) + (hs-activate! _el-textarea) (hs-activate! _el-span) )) (deftest "shorthand on select binds to value" (hs-cleanup!) - (let ((_el-select (dom-create-element "select")) (_el-span (dom-create-element "span"))) + (let ((_el-select (dom-create-element "select")) (_el-option (dom-create-element "option")) (_el-option2 (dom-create-element "option")) (_el-option3 (dom-create-element "option")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-select "_" "bind $country to me") - (dom-append (dom-body) _el-select) - (hs-activate! _el-select) + (dom-set-attr _el-option "value" "us") + (dom-set-inner-html _el-option "United States") + (dom-set-attr _el-option2 "value" "uk") + (dom-set-inner-html _el-option2 "United Kingdom") + (dom-set-attr _el-option3 "value" "fr") + (dom-set-inner-html _el-option3 "France") (dom-set-attr _el-span "_" "when $country changes put it into me") + (dom-append (dom-body) _el-select) + (dom-append _el-select _el-option) + (dom-append _el-select _el-option2) + (dom-append _el-select _el-option3) (dom-append (dom-body) _el-span) + (hs-activate! _el-select) (hs-activate! _el-span) )) (deftest "unsupported element: bind to plain div errors" @@ -5409,10 +5697,10 @@ (let ((_el-input (dom-create-element "input")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-input "_" "bind $price to me") (dom-set-attr _el-input "type" "number") - (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-set-attr _el-span "_" "when $price changes put it into me") + (dom-append (dom-body) _el-input) (dom-append (dom-body) _el-span) + (hs-activate! _el-input) (hs-activate! _el-span) )) (deftest "boolean bind to attribute uses presence/absence" @@ -5452,19 +5740,24 @@ (dom-set-attr _el-input "_" "bind $searchTerm to me") (dom-set-attr _el-input "type" "text") (dom-set-attr _el-input "value" "original") - (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-set-attr _el-span "_" "when $searchTerm changes put it into me") + (dom-append (dom-body) _el-input) (dom-append (dom-body) _el-span) + (hs-activate! _el-input) (hs-activate! _el-span) )) (deftest "form.reset() syncs variable back to default value" (hs-cleanup!) - (let ((_el-test-form (dom-create-element "form")) (_el-span (dom-create-element "span"))) + (let ((_el-test-form (dom-create-element "form")) (_el-input (dom-create-element "input")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-test-form "id" "test-form") - (dom-append (dom-body) _el-test-form) + (dom-set-attr _el-input "_" "bind $formField to me") + (dom-set-attr _el-input "type" "text") + (dom-set-attr _el-input "value" "default") (dom-set-attr _el-span "_" "when $formField changes put it into me") + (dom-append (dom-body) _el-test-form) + (dom-append _el-test-form _el-input) (dom-append (dom-body) _el-span) + (hs-activate! _el-input) (hs-activate! _el-span) )) (deftest "clicking a radio sets the variable to its value" @@ -5474,22 +5767,22 @@ (dom-set-attr _el-input "type" "radio") (dom-set-attr _el-input "name" "color") (dom-set-attr _el-input "value" "red") - (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-set-attr _el-input1 "_" "bind $color to me") (dom-set-attr _el-input1 "type" "radio") (dom-set-attr _el-input1 "name" "color") (dom-set-attr _el-input1 "value" "blue") - (dom-append (dom-body) _el-input1) - (hs-activate! _el-input1) (dom-set-attr _el-input2 "_" "bind $color to me") (dom-set-attr _el-input2 "type" "radio") (dom-set-attr _el-input2 "name" "color") (dom-set-attr _el-input2 "value" "green") - (dom-append (dom-body) _el-input2) - (hs-activate! _el-input2) (dom-set-attr _el-span "_" "when $color changes put it into me") + (dom-append (dom-body) _el-input) + (dom-append (dom-body) _el-input1) + (dom-append (dom-body) _el-input2) (dom-append (dom-body) _el-span) + (hs-activate! _el-input) + (hs-activate! _el-input1) + (hs-activate! _el-input2) (hs-activate! _el-span) (dom-dispatch (dom-query "input[value="blue"]") "click" nil) (dom-dispatch (dom-query "input[value="green"]") "click" nil) @@ -5501,19 +5794,19 @@ (dom-set-attr _el-input "type" "radio") (dom-set-attr _el-input "name" "size") (dom-set-attr _el-input "value" "small") - (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-set-attr _el-input1 "_" "bind $size to me") (dom-set-attr _el-input1 "type" "radio") (dom-set-attr _el-input1 "name" "size") (dom-set-attr _el-input1 "value" "medium") - (dom-append (dom-body) _el-input1) - (hs-activate! _el-input1) (dom-set-attr _el-input2 "_" "bind $size to me") (dom-set-attr _el-input2 "type" "radio") (dom-set-attr _el-input2 "name" "size") (dom-set-attr _el-input2 "value" "large") + (dom-append (dom-body) _el-input) + (dom-append (dom-body) _el-input1) (dom-append (dom-body) _el-input2) + (hs-activate! _el-input) + (hs-activate! _el-input1) (hs-activate! _el-input2) )) (deftest "initial value checks the correct radio on load" @@ -5523,19 +5816,19 @@ (dom-set-attr _el-input "type" "radio") (dom-set-attr _el-input "name" "fruit") (dom-set-attr _el-input "value" "apple") - (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-set-attr _el-input1 "_" "bind $fruit to me") (dom-set-attr _el-input1 "type" "radio") (dom-set-attr _el-input1 "name" "fruit") (dom-set-attr _el-input1 "value" "banana") - (dom-append (dom-body) _el-input1) - (hs-activate! _el-input1) (dom-set-attr _el-input2 "_" "bind $fruit to me") (dom-set-attr _el-input2 "type" "radio") (dom-set-attr _el-input2 "name" "fruit") (dom-set-attr _el-input2 "value" "cherry") + (dom-append (dom-body) _el-input) + (dom-append (dom-body) _el-input1) (dom-append (dom-body) _el-input2) + (hs-activate! _el-input) + (hs-activate! _el-input1) (hs-activate! _el-input2) )) (deftest "variable drives class: setting variable adds/removes class" @@ -5632,8 +5925,8 @@ (dom-set-attr _el-of-input "id" "of-input") (dom-set-attr _el-of-input "type" "text") (dom-set-attr _el-of-input "value" "initial") - (dom-append (dom-body) _el-of-input) (dom-set-attr _el-div "_" "bind $search to value of #of-input") + (dom-append (dom-body) _el-of-input) (dom-append (dom-body) _el-div) (hs-activate! _el-div) )) @@ -5642,9 +5935,9 @@ (let ((_el-dark-toggle (dom-create-element "input")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-dark-toggle "id" "dark-toggle") (dom-set-attr _el-dark-toggle "type" "checkbox") - (dom-append (dom-body) _el-dark-toggle) (dom-set-attr _el-div "_" "bind .dark and #dark-toggle's checked") (dom-set-inner-html _el-div "test") + (dom-append (dom-body) _el-dark-toggle) (dom-append (dom-body) _el-div) (hs-activate! _el-div) )) @@ -5654,8 +5947,8 @@ (dom-set-attr _el-title-input "id" "title-input") (dom-set-attr _el-title-input "type" "text") (dom-set-attr _el-title-input "value" "Hello") - (dom-append (dom-body) _el-title-input) (dom-set-attr _el-h1 "_" "bind @data-title and #title-input's value") + (dom-append (dom-body) _el-title-input) (dom-append (dom-body) _el-h1) (hs-activate! _el-h1) )) @@ -5665,9 +5958,9 @@ (dom-set-attr _el-slider "id" "slider") (dom-set-attr _el-slider "type" "range") (dom-set-attr _el-slider "value" "50") - (dom-append (dom-body) _el-slider) (dom-set-attr _el-input "_" "bind my value and #slider's value") (dom-set-attr _el-input "type" "number") + (dom-append (dom-body) _el-slider) (dom-append (dom-body) _el-input) (hs-activate! _el-input) )) @@ -5677,8 +5970,8 @@ (dom-set-attr _el-name-field "id" "name-field") (dom-set-attr _el-name-field "type" "text") (dom-set-attr _el-name-field "value" "") - (dom-append (dom-body) _el-name-field) (dom-set-attr _el-div "_" "bind $name to #name-field") + (dom-append (dom-body) _el-name-field) (dom-append (dom-body) _el-div) (hs-activate! _el-div) )) @@ -5687,8 +5980,8 @@ (let ((_el-agree-cb (dom-create-element "input")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-agree-cb "id" "agree-cb") (dom-set-attr _el-agree-cb "type" "checkbox") - (dom-append (dom-body) _el-agree-cb) (dom-set-attr _el-div "_" "bind $agreed to #agree-cb") + (dom-append (dom-body) _el-agree-cb) (dom-append (dom-body) _el-div) (hs-activate! _el-div) )) @@ -5697,8 +5990,8 @@ (let ((_el-qty-input (dom-create-element "input")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-qty-input "id" "qty-input") (dom-set-attr _el-qty-input "type" "number") - (dom-append (dom-body) _el-qty-input) (dom-set-attr _el-div "_" "bind $qty to #qty-input") + (dom-append (dom-body) _el-qty-input) (dom-append (dom-body) _el-div) (hs-activate! _el-div) )) @@ -5708,9 +6001,9 @@ (dom-set-attr _el-range-slider "id" "range-slider") (dom-set-attr _el-range-slider "type" "range") (dom-set-attr _el-range-slider "value" "50") - (dom-append (dom-body) _el-range-slider) (dom-set-attr _el-input "_" "bind me to #range-slider") (dom-set-attr _el-input "type" "number") + (dom-append (dom-body) _el-range-slider) (dom-append (dom-body) _el-input) (hs-activate! _el-input) )) @@ -5755,19 +6048,28 @@ (dom-set-attr _el-input "type" "radio") (dom-set-attr _el-input "name" "color") (dom-set-attr _el-input "value" "red") - (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-set-attr _el-input1 "_" "bind $color to me") (dom-set-attr _el-input1 "type" "radio") (dom-set-attr _el-input1 "name" "color") (dom-set-attr _el-input1 "value" "blue") + (dom-append (dom-body) _el-input) (dom-append (dom-body) _el-input1) + (hs-activate! _el-input) (hs-activate! _el-input1) )) (deftest "form reset listener is removed on cleanup" (hs-cleanup!) - (let ((_el-form (dom-create-element "form"))) + (let ((_el-form (dom-create-element "form")) (_el-binput (dom-create-element "input")) (_el-button (dom-create-element "button"))) + (dom-set-attr _el-binput "id" "binput") + (dom-set-attr _el-binput "_" "bind $val to me") + (dom-set-attr _el-binput "type" "text") + (dom-set-attr _el-binput "value" "initial") + (dom-set-attr _el-button "type" "reset") + (dom-set-inner-html _el-button "Reset") (dom-append (dom-body) _el-form) + (dom-append _el-form _el-binput) + (dom-append _el-form _el-button) + (hs-activate! _el-binput) )) ) @@ -5814,14 +6116,14 @@ (let ((_el-w (dom-create-element "span")) (_el-h (dom-create-element "span")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-w "id" "w") (dom-set-attr _el-w "_" "when $doubleWidth changes put it into me") - (dom-append (dom-body) _el-w) - (hs-activate! _el-w) (dom-set-attr _el-h "id" "h") (dom-set-attr _el-h "_" "when $doubleHeight changes put it into me") - (dom-append (dom-body) _el-h) - (hs-activate! _el-h) (dom-set-attr _el-div "_" "live then set $doubleWidth to ($width * 2) then set $doubleHeight to ($height * 2) then end") + (dom-append (dom-body) _el-w) + (dom-append (dom-body) _el-h) (dom-append (dom-body) _el-div) + (hs-activate! _el-w) + (hs-activate! _el-h) (hs-activate! _el-div) )) (deftest "separate live statements create independent effects" @@ -5829,14 +6131,14 @@ (let ((_el-w (dom-create-element "span")) (_el-h (dom-create-element "span")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-w "id" "w") (dom-set-attr _el-w "_" "when $doubleWidth changes put it into me") - (dom-append (dom-body) _el-w) - (hs-activate! _el-w) (dom-set-attr _el-h "id" "h") (dom-set-attr _el-h "_" "when $doubleHeight changes put it into me") - (dom-append (dom-body) _el-h) - (hs-activate! _el-h) (dom-set-attr _el-div "_" "live set $doubleWidth to ($width * 2) end then live set $doubleHeight to ($height * 2)") + (dom-append (dom-body) _el-w) + (dom-append (dom-body) _el-h) (dom-append (dom-body) _el-div) + (hs-activate! _el-w) + (hs-activate! _el-h) (hs-activate! _el-div) )) (deftest "block form cascades inter-dependent commands" @@ -5896,10 +6198,10 @@ (dom-set-attr _el-input "_" "bind $username to me end then live set my @data-mirror to $username") (dom-set-attr _el-input "type" "text") (dom-set-attr _el-input "value" "alice") - (dom-append (dom-body) _el-input) - (hs-activate! _el-input) (dom-set-attr _el-span "_" "when $username changes put it into me") + (dom-append (dom-body) _el-input) (dom-append (dom-body) _el-span) + (hs-activate! _el-input) (hs-activate! _el-span) )) (deftest "reactive effects are stopped on cleanup" @@ -5947,21 +6249,25 @@ )) (deftest "property change on object in array triggers live re-render" (hs-cleanup!) - (let ((_el-people-tmpl (dom-create-element "template")) (_el-div (dom-create-element "div"))) + (let ((_el-people-tmpl (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-people-tmpl "id" "people-tmpl") - (dom-set-inner-html _el-people-tmpl "#for p in people\\n\\n#end") - (dom-append (dom-body) _el-people-tmpl) + (dom-set-inner-html _el-people-tmpl "#for p in people\\n") + (dom-set-inner-html _el-span "\\${p.name}") (dom-set-attr _el-div "_" "live render #people-tmpl with people: $people then put it into my.innerHTML end") + (dom-append (dom-body) _el-people-tmpl) + (dom-append _el-people-tmpl _el-span) (dom-append (dom-body) _el-div) (hs-activate! _el-div) )) (deftest "push object then modify its property both trigger live" (hs-cleanup!) - (let ((_el-items-tmpl (dom-create-element "template")) (_el-div (dom-create-element "div"))) + (let ((_el-items-tmpl (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-items-tmpl "id" "items-tmpl") - (dom-set-inner-html _el-items-tmpl "#for item in items\\n\\n#end") - (dom-append (dom-body) _el-items-tmpl) + (dom-set-inner-html _el-items-tmpl "#for item in items\\n") + (dom-set-inner-html _el-span "\\${item.label}") (dom-set-attr _el-div "_" "live render #items-tmpl with items: $items then put it into my.innerHTML end") + (dom-append (dom-body) _el-items-tmpl) + (dom-append _el-items-tmpl _el-span) (dom-append (dom-body) _el-div) (hs-activate! _el-div) )) @@ -5989,8 +6295,8 @@ (dom-set-attr _el-prop-input "id" "prop-input") (dom-set-attr _el-prop-input "type" "text") (dom-set-attr _el-prop-input "value" "start") - (dom-append (dom-body) _el-prop-input) (dom-set-attr _el-output "_" "when #prop-input's value changes put it into me") + (dom-append (dom-body) _el-prop-input) (dom-append (dom-body) _el-output) (hs-activate! _el-output) )) @@ -6011,10 +6317,10 @@ (dom-set-attr _el-box "id" "box") (dom-set-attr _el-box "_" "on resize put detail.width into #out") (dom-set-attr _el-box "style" "width:100px; height:100px") - (dom-append (dom-body) _el-box) - (hs-activate! _el-box) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-box) (dom-append (dom-body) _el-out) + (hs-activate! _el-box) )) (deftest "provides height in detail" (hs-cleanup!) @@ -6022,19 +6328,19 @@ (dom-set-attr _el-box "id" "box") (dom-set-attr _el-box "_" "on resize put detail.height into #out") (dom-set-attr _el-box "style" "width:100px; height:100px") - (dom-append (dom-body) _el-box) - (hs-activate! _el-box) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-box) (dom-append (dom-body) _el-out) + (hs-activate! _el-box) )) (deftest "works with from clause" (hs-cleanup!) (let ((_el-box (dom-create-element "div")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-box "id" "box") (dom-set-attr _el-box "style" "width:100px; height:100px") - (dom-append (dom-body) _el-box) (dom-set-attr _el-out "id" "out") (dom-set-attr _el-out "_" "on resize from #box put detail.width into me") + (dom-append (dom-body) _el-box) (dom-append (dom-body) _el-out) (hs-activate! _el-out) )) @@ -6073,11 +6379,11 @@ (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "when $shared changes put 'first' into me") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "_" "when $shared changes put 'second' into me") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (hs-activate! _el-d2) )) (deftest "executes multiple commands" @@ -6123,8 +6429,8 @@ (dom-set-attr _el-reactive-input "id" "reactive-input") (dom-set-attr _el-reactive-input "type" "text") (dom-set-attr _el-reactive-input "value" "start") - (dom-append (dom-body) _el-reactive-input) (dom-set-attr _el-span "_" "when #reactive-input.value changes put it into me") + (dom-append (dom-body) _el-reactive-input) (dom-append (dom-body) _el-span) (hs-activate! _el-span) )) @@ -6134,8 +6440,8 @@ (dom-set-attr _el-prog-input "id" "prog-input") (dom-set-attr _el-prog-input "type" "text") (dom-set-attr _el-prog-input "value" "initial") - (dom-append (dom-body) _el-prog-input) (dom-set-attr _el-span "_" "when #prog-input.value changes put it into me") + (dom-append (dom-body) _el-prog-input) (dom-append (dom-body) _el-span) (hs-activate! _el-span) )) @@ -6157,11 +6463,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-output (dom-create-element "div"))) (dom-set-attr _el-div "_" "when $source changes set $derived to (it * 2)") - (dom-append (dom-body) _el-div) - (hs-activate! _el-div) (dom-set-attr _el-output "id" "output") (dom-set-attr _el-output "_" "when $derived changes put it into me") + (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-output) + (hs-activate! _el-div) (hs-activate! _el-output) )) (deftest "supports multiple when features on the same element" @@ -6201,12 +6507,12 @@ (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "init set :value to 'A' end then when :value changes put it into me end then on click set :value to 'A-clicked'") (dom-set-inner-html _el-d1 "A") - (dom-append (dom-body) _el-d1) - (hs-activate! _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "_" "init set :value to 'B' end then when :value changes put it into me end then on click set :value to 'B-clicked'") (dom-set-inner-html _el-d2 "B") + (dom-append (dom-body) _el-d1) (dom-append (dom-body) _el-d2) + (hs-activate! _el-d1) (hs-activate! _el-d2) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= (dom-text-content (dom-query-by-id "d1")) "A-clicked") @@ -6221,8 +6527,8 @@ (dom-set-attr _el-nan-input "id" "nan-input") (dom-set-attr _el-nan-input "type" "text") (dom-set-attr _el-nan-input "value" "not a number") - (dom-append (dom-body) _el-nan-input) (dom-set-attr _el-span "_" "when (#nan-input.value * 1) changes put it into me") + (dom-append (dom-body) _el-nan-input) (dom-append (dom-body) _el-span) (hs-activate! _el-span) )) @@ -6245,8 +6551,8 @@ (let ((_el-cb-input (dom-create-element "input")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-cb-input "id" "cb-input") (dom-set-attr _el-cb-input "type" "checkbox") - (dom-append (dom-body) _el-cb-input) (dom-set-attr _el-span "_" "when #cb-input.checked changes put it into me") + (dom-append (dom-body) _el-cb-input) (dom-append (dom-body) _el-span) (hs-activate! _el-span) )) @@ -6264,8 +6570,8 @@ (dom-set-attr _el-of-input "id" "of-input") (dom-set-attr _el-of-input "type" "text") (dom-set-attr _el-of-input "value" "init") - (dom-append (dom-body) _el-of-input) (dom-set-attr _el-span "_" "when (value of #of-input) changes put it into me") + (dom-append (dom-body) _el-of-input) (dom-append (dom-body) _el-span) (hs-activate! _el-span) )) @@ -6337,14 +6643,14 @@ (let ((_el-d-b (dom-create-element "span")) (_el-d-c (dom-create-element "span")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-d-b "id" "d-b") (dom-set-attr _el-d-b "_" "when $a changes set $b to (it * 2)") - (dom-append (dom-body) _el-d-b) - (hs-activate! _el-d-b) (dom-set-attr _el-d-c "id" "d-c") (dom-set-attr _el-d-c "_" "when $a changes set $c to (it * 3)") - (dom-append (dom-body) _el-d-c) - (hs-activate! _el-d-c) (dom-set-attr _el-div "_" "live increment :runs then put ($ (runs:)' into me") + (dom-append (dom-body) _el-d-b) + (dom-append (dom-body) _el-d-c) (dom-append (dom-body) _el-div) + (hs-activate! _el-d-b) + (hs-activate! _el-d-c) (hs-activate! _el-div) )) (deftest "error in one effect does not break other effects in the same batch" @@ -6371,11 +6677,14 @@ )) (deftest "element moved in DOM retains reactivity" (hs-cleanup!) - (let ((_el-container-a (dom-create-element "div")) (_el-container-b (dom-create-element "div"))) + (let ((_el-container-a (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-container-b (dom-create-element "div"))) (dom-set-attr _el-container-a "id" "container-a") - (dom-append (dom-body) _el-container-a) + (dom-set-attr _el-span "_" "when $movable changes put it into me") (dom-set-attr _el-container-b "id" "container-b") + (dom-append (dom-body) _el-container-a) + (dom-append _el-container-a _el-span) (dom-append (dom-body) _el-container-b) + (hs-activate! _el-span) )) (deftest "rapid detach/reattach in same sync block does not kill effect" (hs-cleanup!) @@ -6392,11 +6701,11 @@ (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-button "_" "on click call failAsync() then put 'should not reach' into #out then") (dom-set-inner-html _el-button "Go") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") (dom-set-inner-html _el-out "original") + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "original") )) @@ -6405,10 +6714,10 @@ (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-button "_" "on click call failAsync() then put 'unreachable' into #out then catch e then put e.message into #out then") (dom-set-inner-html _el-button "Go") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "boom") )) @@ -6418,89 +6727,160 @@ (defsuite "hs-upstream-dom-scope" (deftest "isolated stops ^var resolution" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^color to 'red'") + (dom-set-attr _el-div1 "dom-scope" "isolated") + (dom-set-attr _el-span "_" "init if ^color is not undefined put 'leaked' into me else put 'blocked' into me") + (dom-set-inner-html _el-span "waiting") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-div1) + (dom-append _el-div1 _el-span) (hs-activate! _el-div) + (hs-activate! _el-span) )) (deftest "closest jumps to matching ancestor" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-add-class _el-div "outer") (dom-set-attr _el-div "_" "init set ^val to 'from-outer'") + (dom-set-attr _el-div1 "_" "init set ^val to 'from-inner'") + (dom-set-attr _el-div1 "dom-scope" "isolated") + (dom-set-attr _el-span "_" "init put ^val into me") + (dom-set-attr _el-span "dom-scope" "closest .outer") + (dom-set-inner-html _el-span "none") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-div1) + (dom-append _el-div1 _el-span) (hs-activate! _el-div) + (hs-activate! _el-div1) + (hs-activate! _el-span) )) (deftest "closest with no match stops resolution" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^val to 'found'") + (dom-set-attr _el-span "_" "init if ^val is not undefined put 'leaked' into me else put 'blocked' into me") + (dom-set-attr _el-span "dom-scope" "closest .nonexistent") + (dom-set-inner-html _el-span "waiting") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-span) (hs-activate! _el-div) + (hs-activate! _el-span) )) (deftest "parent of jumps past matching ancestor to its parent" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-add-class _el-div "outer") (dom-set-attr _el-div "_" "init set ^val to 'from-outer'") + (dom-add-class _el-div1 "middle") + (dom-set-attr _el-div1 "_" "init set ^val to 'from-middle'") + (dom-set-attr _el-div1 "dom-scope" "isolated") + (dom-set-attr _el-span "_" "init put ^val into me") + (dom-set-attr _el-span "dom-scope" "parent of .middle") + (dom-set-inner-html _el-span "none") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-div1) + (dom-append _el-div1 _el-span) (hs-activate! _el-div) + (hs-activate! _el-div1) + (hs-activate! _el-span) )) (deftest "isolated allows setting ^var on the isolated element itself" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^outer to 'leaked'") + (dom-set-attr _el-div1 "_" "init set ^inner to 'contained'") + (dom-set-attr _el-div1 "dom-scope" "isolated") + (dom-set-attr _el-span "_" "init put ^inner into me") + (dom-set-inner-html _el-span "none") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-div1) + (dom-append _el-div1 _el-span) (hs-activate! _el-div) + (hs-activate! _el-div1) + (hs-activate! _el-span) )) (deftest "child reads ^var set by parent" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^count to 42") + (dom-set-attr _el-span "_" "on click put ^count into me") + (dom-set-inner-html _el-span "0") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-span) (hs-activate! _el-div) - (dom-dispatch (dom-query "span") "click" nil) - (assert= (dom-text-content (dom-query "span")) "42") + (hs-activate! _el-span) + (dom-dispatch _el-span "click" nil) + (assert= (dom-text-content _el-span) "42") )) (deftest "child writes ^var and parent sees it" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^count to 0") + (dom-set-attr _el-button "_" "on click set ^count to 99") + (dom-set-inner-html _el-button "set") + (dom-set-attr _el-span "_" "on click put ^count into me") + (dom-set-inner-html _el-span "0") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-button) + (dom-append _el-div _el-span) (hs-activate! _el-div) - (dom-dispatch (dom-query "button") "click" nil) - (dom-dispatch (dom-query "span") "click" nil) - (assert= (dom-text-content (dom-query "span")) "99") + (hs-activate! _el-button) + (hs-activate! _el-span) + (dom-dispatch _el-button "click" nil) + (dom-dispatch _el-span "click" nil) + (assert= (dom-text-content _el-span) "99") )) (deftest "deeply nested child reads ^var from grandparent" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^name to 'alice'") + (dom-set-attr _el-span "_" "on click put ^name into me") + (dom-set-inner-html _el-span "empty") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-div1) + (dom-append _el-div1 _el-div2) + (dom-append _el-div2 _el-span) (hs-activate! _el-div) - (dom-dispatch (dom-query "span") "click" nil) - (assert= (dom-text-content (dom-query "span")) "alice") + (hs-activate! _el-span) + (dom-dispatch _el-span "click" nil) + (assert= (dom-text-content _el-span) "alice") )) (deftest "closest ancestor wins (shadowing)" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^color to 'red'") + (dom-set-attr _el-div1 "_" "init set ^color to 'blue'") + (dom-set-attr _el-span "_" "on click put ^color into me") + (dom-set-inner-html _el-span "empty") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-div1) + (dom-append _el-div1 _el-span) (hs-activate! _el-div) - (dom-dispatch (dom-query "span") "click" nil) - (assert= (dom-text-content (dom-query "span")) "blue") + (hs-activate! _el-div1) + (hs-activate! _el-span) + (dom-dispatch _el-span "click" nil) + (assert= (dom-text-content _el-span) "blue") )) (deftest "sibling subtrees have independent ^vars" (hs-cleanup!) - (let ((_el-a (dom-create-element "div")) (_el-b (dom-create-element "div"))) + (let ((_el-a (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-b (dom-create-element "div")) (_el-span3 (dom-create-element "span"))) (dom-set-attr _el-a "id" "a") (dom-set-attr _el-a "_" "init set ^val to 'A'") - (dom-append (dom-body) _el-a) - (hs-activate! _el-a) + (dom-set-attr _el-span "_" "on click put ^val into me") + (dom-set-inner-html _el-span "empty") (dom-set-attr _el-b "id" "b") (dom-set-attr _el-b "_" "init set ^val to 'B'") + (dom-set-attr _el-span3 "_" "on click put ^val into me") + (dom-set-inner-html _el-span3 "empty") + (dom-append (dom-body) _el-a) + (dom-append _el-a _el-span) (dom-append (dom-body) _el-b) + (dom-append _el-b _el-span3) + (hs-activate! _el-a) + (hs-activate! _el-span) (hs-activate! _el-b) + (hs-activate! _el-span3) (dom-dispatch (dom-query "#a span") "click" nil) (assert= (dom-text-content (dom-query "#a span")) "A") (dom-dispatch (dom-query "#b span") "click" nil) @@ -6508,73 +6888,111 @@ )) (deftest "write to ^var not found anywhere creates on current element" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span"))) + (dom-set-attr _el-button "_" "on click set ^newvar to 'created' then put ^newvar into next ") + (dom-set-inner-html _el-button "go") + (dom-set-inner-html _el-span "empty") (dom-append (dom-body) _el-div) - (dom-dispatch (dom-query "button") "click" nil) - (assert= (dom-text-content (dom-query "span")) "created") + (dom-append _el-div _el-button) + (dom-append _el-div _el-span) + (hs-activate! _el-button) + (dom-dispatch _el-button "click" nil) + (assert= (dom-text-content _el-span) "created") )) (deftest "child write updates the ancestor, not a local copy" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^shared to 0") + (dom-set-attr _el-button "_" "on click set ^shared to 10") + (dom-set-inner-html _el-button "set") + (dom-set-attr _el-span "_" "on click put ^shared into me") + (dom-set-inner-html _el-span "0") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-button) + (dom-append _el-div _el-span) (hs-activate! _el-div) - (dom-dispatch (dom-query "button") "click" nil) - (dom-dispatch (dom-query "span") "click" nil) - (assert= (dom-text-content (dom-query "span")) "10") + (hs-activate! _el-button) + (hs-activate! _el-span) + (dom-dispatch _el-button "click" nil) + (dom-dispatch _el-span "click" nil) + (assert= (dom-text-content _el-span) "10") )) (deftest "increment works on inherited var" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-div "_" "init set ^count to 0") + (dom-set-attr _el-button "_" "on click put ^count into me") + (dom-set-inner-html _el-button "0") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-button) (hs-activate! _el-div) - (dom-dispatch (dom-query "button") "click" nil) - (dom-dispatch (dom-query "button") "click" nil) - (dom-dispatch (dom-query "button") "click" nil) + (hs-activate! _el-button) + (dom-dispatch _el-button "click" nil) + (dom-dispatch _el-button "click" nil) + (dom-dispatch _el-button "click" nil) (dom-dispatch (dom-query "span") "click" nil) (assert= (dom-text-content (dom-query "span")) "3") )) (deftest "dom keyword works as scope modifier" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set dom count to 42") + (dom-set-attr _el-span "_" "on click put dom count into me") + (dom-set-inner-html _el-span "0") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-span) (hs-activate! _el-div) - (dom-dispatch (dom-query "span") "click" nil) - (assert= (dom-text-content (dom-query "span")) "42") + (hs-activate! _el-span) + (dom-dispatch _el-span "click" nil) + (assert= (dom-text-content _el-span) "42") )) (deftest "set ^var on explicit element" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span"))) (dom-add-class _el-div "store") + (dom-set-attr _el-button "_" "on click set ^data on closest .store to 'hello'") + (dom-set-inner-html _el-button "set") + (dom-set-attr _el-span "_" "on click put ^data on closest .store into me") + (dom-set-inner-html _el-span "read") (dom-append (dom-body) _el-div) - (dom-dispatch (dom-query "button") "click" nil) - (dom-dispatch (dom-query "span") "click" nil) - (assert= (dom-text-content (dom-query "span")) "hello") + (dom-append _el-div _el-button) + (dom-append _el-div _el-span) + (hs-activate! _el-button) + (hs-activate! _el-span) + (dom-dispatch _el-button "click" nil) + (dom-dispatch _el-span "click" nil) + (assert= (dom-text-content _el-span) "hello") )) (deftest "on clause targets a specific ancestor" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-span (dom-create-element "span"))) (dom-add-class _el-div "outer") (dom-set-attr _el-div "_" "init set ^outerVal to 'outer'") + (dom-add-class _el-div1 "inner") + (dom-set-attr _el-div1 "_" "init set ^innerVal to 'inner'") + (dom-set-attr _el-span "_" "on click put ^outerVal on closest .outer into me") + (dom-set-inner-html _el-span "read") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-div1) + (dom-append _el-div1 _el-span) (hs-activate! _el-div) - (dom-dispatch (dom-query "span") "click" nil) - (assert= (dom-text-content (dom-query "span")) "outer") + (hs-activate! _el-div1) + (hs-activate! _el-span) + (dom-dispatch _el-span "click" nil) + (assert= (dom-text-content _el-span) "outer") )) (deftest "on clause with id reference" (hs-cleanup!) (let ((_el-state-holder (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-state-holder "id" "state-holder") - (dom-append (dom-body) _el-state-holder) (dom-set-attr _el-button "_" "on click set ^count on #state-holder to 99") (dom-set-inner-html _el-button "set") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-span "_" "on click put ^count on #state-holder into me") (dom-set-inner-html _el-span "read") + (dom-append (dom-body) _el-state-holder) + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-span) + (hs-activate! _el-button) (hs-activate! _el-span) (dom-dispatch _el-button "click" nil) (dom-dispatch _el-span "click" nil) @@ -6582,40 +7000,72 @@ )) (deftest "when reacts to ^var changes" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-div "_" "init set ^count to 0") + (dom-set-attr _el-button "_" "when ^count changes put it into me") + (dom-set-inner-html _el-button "0") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-button) (hs-activate! _el-div) - (dom-dispatch (dom-query "button") "click" nil) + (hs-activate! _el-button) + (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query "output")) "1") - (dom-dispatch (dom-query "button") "click" nil) + (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query "output")) "2") )) (deftest "always reacts to ^var changes" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-div "_" "init set ^name to 'alice'") + (dom-set-attr _el-button "_" "on click set ^name to 'bob'") + (dom-set-inner-html _el-button "rename") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-button) (hs-activate! _el-div) - (dom-dispatch (dom-query "button") "click" nil) + (hs-activate! _el-button) + (dom-dispatch _el-button "click" nil) )) (deftest "multiple children react to same ^var" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-a (dom-create-element "span")) (_el-b (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^color to 'red'") + (dom-set-attr _el-button "_" "on click set ^color to 'blue'") + (dom-set-inner-html _el-button "change") + (dom-set-attr _el-a "id" "a") + (dom-set-attr _el-a "_" "when ^color changes put it into me") + (dom-set-attr _el-b "id" "b") + (dom-set-attr _el-b "_" "when ^color changes put it into me") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-button) + (dom-append _el-div _el-a) + (dom-append _el-div _el-b) (hs-activate! _el-div) - (dom-dispatch (dom-query "button") "click" nil) + (hs-activate! _el-button) + (hs-activate! _el-a) + (hs-activate! _el-b) + (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "a")) "blue") (assert= (dom-text-content (dom-query-by-id "b")) "blue") )) (deftest "sibling subtrees react independently with ^var" (hs-cleanup!) - (let ((_el-a (dom-create-element "div"))) + (let ((_el-a (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-b (dom-create-element "div")) (_el-button3 (dom-create-element "button"))) (dom-set-attr _el-a "id" "a") (dom-set-attr _el-a "_" "init set ^val to 0") + (dom-set-attr _el-button "_" "when ^val changes put it into me") + (dom-set-inner-html _el-button "0") + (dom-set-attr _el-b "id" "b") + (dom-set-attr _el-b "_" "init set ^val to 0") + (dom-set-attr _el-button3 "_" "when ^val changes put it into me") + (dom-set-inner-html _el-button3 "0") (dom-append (dom-body) _el-a) + (dom-append _el-a _el-button) + (dom-append _el-button _el-b) + (dom-append _el-b _el-button3) (hs-activate! _el-a) + (hs-activate! _el-button) + (hs-activate! _el-b) + (hs-activate! _el-button3) (dom-dispatch (dom-query "#a button") "click" nil) (dom-dispatch (dom-query "#a button") "click" nil) (assert= (dom-text-content (dom-query "#a output")) "2") @@ -6626,38 +7076,83 @@ )) (deftest "bind works with ^var" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-input (dom-create-element "input")) (_el-output (dom-create-element "output"))) (dom-set-attr _el-div "_" "init set ^search to ''") + (dom-set-attr _el-input "_" "bind ^search and my value") + (dom-set-attr _el-input "type" "text") + (dom-set-attr _el-output "_" "when ^search changes put it into me") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-input) + (dom-append _el-div _el-output) (hs-activate! _el-div) + (hs-activate! _el-input) + (hs-activate! _el-output) )) (deftest "derived ^var chains reactively" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-span2 (dom-create-element "span")) (_el-output (dom-create-element "output")) (_el-price-btn (dom-create-element "button")) (_el-qty-btn (dom-create-element "button"))) (dom-set-attr _el-div "_" "init set ^price to 10 then set ^qty to 2 then set ^total to 20") + (dom-set-attr _el-span "_" "when ^price changes set ^total to (^price * ^qty)") + (dom-set-attr _el-span2 "_" "when ^qty changes set ^total to (^price * ^qty)") + (dom-set-attr _el-output "_" "when ^total changes put it into me") + (dom-set-attr _el-price-btn "id" "price-btn") + (dom-set-attr _el-price-btn "_" "on click set ^price to 25") + (dom-set-inner-html _el-price-btn "set price") + (dom-set-attr _el-qty-btn "id" "qty-btn") + (dom-set-attr _el-qty-btn "_" "on click set ^qty to 5") + (dom-set-inner-html _el-qty-btn "set qty") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-span) + (dom-append _el-div _el-span2) + (dom-append _el-div _el-output) + (dom-append _el-div _el-price-btn) + (dom-append _el-div _el-qty-btn) (hs-activate! _el-div) + (hs-activate! _el-span) + (hs-activate! _el-span2) + (hs-activate! _el-output) + (hs-activate! _el-price-btn) + (hs-activate! _el-qty-btn) (dom-dispatch (dom-query-by-id "price-btn") "click" nil) (dom-dispatch (dom-query-by-id "qty-btn") "click" nil) )) (deftest "effect stops when element is removed" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-output (dom-create-element "output")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-div "_" "init set ^msg to 'hello'") + (dom-set-attr _el-output "_" "when ^msg changes put it into me") + (dom-set-attr _el-button "_" "on click set ^msg to 'updated'") + (dom-set-inner-html _el-button "update") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-output) + (dom-append _el-div _el-button) (hs-activate! _el-div) - (dom-dispatch (dom-query "button") "click" nil) + (hs-activate! _el-output) + (hs-activate! _el-button) + (dom-dispatch _el-button "click" nil) )) (deftest "dedup prevents re-fire on same ^var value" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-output (dom-create-element "output")) (_el-button (dom-create-element "button")) (_el-diff (dom-create-element "button"))) (dom-set-attr _el-div "_" "init set ^val to 'same'") + (dom-set-attr _el-output "_" "when ^val changes increment :runs then put :runs into me") + (dom-set-attr _el-button "_" "on click set ^val to 'same'") + (dom-set-inner-html _el-button "same") + (dom-set-attr _el-diff "id" "diff") + (dom-set-attr _el-diff "_" "on click set ^val to 'different'") + (dom-set-inner-html _el-diff "diff") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-output) + (dom-append _el-div _el-button) + (dom-append _el-div _el-diff) (hs-activate! _el-div) + (hs-activate! _el-output) + (hs-activate! _el-button) + (hs-activate! _el-diff) (dom-dispatch (dom-query "button:text("same")") "click" nil) - (assert= (dom-text-content (dom-query "output")) "1") + (assert= (dom-text-content _el-output) "1") (dom-dispatch (dom-query-by-id "diff") "click" nil) - (assert= (dom-text-content (dom-query "output")) "2") + (assert= (dom-text-content _el-output) "2") )) ) @@ -6685,71 +7180,105 @@ (defsuite "hs-upstream-liveTemplate" (deftest "renders static content after the template" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span"))) + (dom-set-inner-html _el-span "Hello World") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) )) (deftest "renders template expressions" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span"))) + (dom-set-inner-html _el-span "Hello ${\"\\x24\"}{$ltName}!") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) )) (deftest "applies init script from _ attribute" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-template "_" "init set ^msg to 'initialized'") + (dom-set-inner-html _el-span "${\"\\x24\"}{^msg}") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) (hs-activate! _el-template) )) (deftest "reactively updates when dependencies change" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-template "_" "init set ^count to 0") + (dom-set-attr _el-button "_" "on click increment ^count") + (dom-set-inner-html _el-button "+") + (dom-set-inner-html _el-span "Count: ${\"\\x24\"}{^count}") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-button) + (dom-append _el-template _el-span) (hs-activate! _el-template) + (hs-activate! _el-button) (dom-dispatch (dom-query "[data-live-template] button") "click" nil) )) (deftest "processes hyperscript on inner elements" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-button (dom-create-element "button")) (_el-output (dom-create-element "output"))) (dom-set-attr _el-template "_" "init set ^val to 0") + (dom-set-attr _el-button "_" "on click increment ^val then put ^val into the next ") + (dom-set-inner-html _el-button "+") + (dom-set-inner-html _el-output "0") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-button) + (dom-append _el-template _el-output) (hs-activate! _el-template) + (hs-activate! _el-button) (dom-dispatch (dom-query "[data-live-template] button") "click" nil) )) (deftest "supports #for loops" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-ul (dom-create-element "ul")) (_el-li (dom-create-element "li"))) (dom-set-attr _el-template "_" "init set ^items to ['a', 'b', 'c']") + (dom-set-inner-html _el-ul "#for item in ^items") + (dom-set-inner-html _el-li "${\"\\x24\"}{item}") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-ul) + (dom-append _el-ul _el-li) (hs-activate! _el-template) )) (deftest "supports #if conditionals" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-template "_" "init set ^show to true") - (dom-set-inner-html _el-template "#if ^show#end") + (dom-set-inner-html _el-template "#if ^show") + (dom-set-inner-html _el-span "visible") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) (hs-activate! _el-template) )) (deftest "reacts to global state without init script" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-p (dom-create-element "p"))) + (dom-set-inner-html _el-p "Hello, ${\"\\x24\"}{$ltGlobal}!") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-p) )) (deftest "wrapper has display:contents" (hs-cleanup!) - (let ((_el-template (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span"))) + (dom-set-inner-html _el-span "test") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) )) (deftest "multiple live templates are independent" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-template1 (dom-create-element "template"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-template2 (dom-create-element "template")) (_el-span3 (dom-create-element "span"))) (dom-set-attr _el-template "_" "init set ^x to 'first'") + (dom-add-class _el-span "a") + (dom-set-inner-html _el-span "${\"\\x24\"}{^x}") + (dom-set-attr _el-template2 "_" "init set ^x to 'second'") + (dom-add-class _el-span3 "b") + (dom-set-inner-html _el-span3 "${\"\\x24\"}{^x}") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) + (dom-append (dom-body) _el-template2) + (dom-append _el-template2 _el-span3) (hs-activate! _el-template) - (dom-set-attr _el-template1 "_" "init set ^x to 'second'") - (dom-append (dom-body) _el-template1) - (hs-activate! _el-template1) + (hs-activate! _el-template2) )) ) @@ -6760,8 +7289,9 @@ (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-append (dom-body) _el-target) ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "target")) "new") @@ -6771,37 +7301,55 @@ (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-append (dom-body) _el-target) (dom-set-attr _el-button "_" "on click make a then put \"moved\" into it then set #target to it") (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) )) (deftest "set .class replaces all matching elements" (hs-cleanup!) - (let ((_el-list (dom-create-element "ul")) (_el-button (dom-create-element "button"))) + (let ((_el-list (dom-create-element "ul")) (_el-li (dom-create-element "li")) (_el-li2 (dom-create-element "li")) (_el-li3 (dom-create-element "li")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-list "id" "list") - (dom-append (dom-body) _el-list) + (dom-add-class _el-li "item") + (dom-set-inner-html _el-li "a") + (dom-add-class _el-li2 "item") + (dom-set-inner-html _el-li2 "b") + (dom-add-class _el-li3 "item") + (dom-set-inner-html _el-li3 "c") ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-list) + (dom-append _el-list _el-li) + (dom-append _el-list _el-li2) + (dom-append _el-list _el-li3) (dom-append (dom-body) _el-button) (dom-dispatch _el-button "click" nil) )) (deftest "set replaces all matching elements" (hs-cleanup!) - (let ((_el-box (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-box (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-p2 (dom-create-element "p")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-box "id" "box") - (dom-append (dom-body) _el-box) + (dom-set-inner-html _el-p "one") + (dom-set-inner-html _el-p2 "two") ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-box) + (dom-append _el-box _el-p) + (dom-append _el-box _el-p2) (dom-append (dom-body) _el-button) (dom-dispatch _el-button "click" nil) )) (deftest "set closest replaces ancestor" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-add-class _el-div "wrapper") + ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-button "go") (dom-append (dom-body) _el-div) - (dom-dispatch (dom-query "button") "click" nil) + (dom-append _el-div _el-button) + (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query ".wrapper")) "replaced") )) (deftest "hyperscript in replacement content is initialized" @@ -6809,9 +7357,10 @@ (let ((_el-target (dom-create-element "div")) (_el-target1 (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-append (dom-body) _el-target) (dom-set-attr _el-target1 "id" "target") ;; HS source has bare quotes or embedded HTML + (dom-set-inner-html _el-target1 "new'\\\">go") + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-target1) (dom-dispatch (dom-query-by-id "go") "click" nil) (assert= (dom-text-content (dom-query-by-id "target")) "new") @@ -6820,11 +7369,17 @@ )) (deftest "swap #a with #b swaps DOM positions" (hs-cleanup!) - (let ((_el-container (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-container (dom-create-element "div")) (_el-a (dom-create-element "div")) (_el-b (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-container "id" "container") - (dom-append (dom-body) _el-container) + (dom-set-attr _el-a "id" "a") + (dom-set-inner-html _el-a "A") + (dom-set-attr _el-b "id" "b") + (dom-set-inner-html _el-b "B") (dom-set-attr _el-button "_" "on click swap #a with #b") (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-container) + (dom-append _el-container _el-a) + (dom-append _el-container _el-b) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -6834,9 +7389,9 @@ (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-append (dom-body) _el-target) (dom-set-attr _el-button "_" "on click put \"new\" into #target") (dom-set-inner-html _el-button "go") + (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -6854,15 +7409,23 @@ ) (deftest "works with DOM elements" (hs-cleanup!) - (let ((_el-list (dom-create-element "ul")) (_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) + (let ((_el-list (dom-create-element "ul")) (_el-li (dom-create-element "li")) (_el-li2 (dom-create-element "li")) (_el-li3 (dom-create-element "li")) (_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-list "id" "list") - (dom-append (dom-body) _el-list) + (dom-add-class _el-li "yes") + (dom-set-inner-html _el-li "A") + (dom-set-inner-html _el-li2 "B") + (dom-add-class _el-li3 "yes") + (dom-set-inner-html _el-li3 "C") (dom-set-attr _el-button "_" "on click set items to
  • in #list then set matches to items where it matches .yes then put matches mapped to its textContent into #out") (dom-set-inner-html _el-button "Go") - (dom-append (dom-body) _el-button) - (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") + (dom-append (dom-body) _el-list) + (dom-append _el-list _el-li) + (dom-append _el-list _el-li2) + (dom-append _el-list _el-li3) + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-out) + (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "AC") )) @@ -6895,78 +7458,180 @@ ) (deftest "where binds after in without parens" (hs-cleanup!) - (let ((_el-container (dom-create-element "div"))) + (let ((_el-container (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-span2 (dom-create-element "span")) (_el-span3 (dom-create-element "span"))) (dom-set-attr _el-container "id" "container") + (dom-add-class _el-span "a") + (dom-set-inner-html _el-span "A") + (dom-add-class _el-span2 "b") + (dom-set-inner-html _el-span2 "B") + (dom-add-class _el-span3 "a") + (dom-set-inner-html _el-span3 "C") (dom-append (dom-body) _el-container) + (dom-append _el-container _el-span) + (dom-append _el-container _el-span2) + (dom-append _el-container _el-span3) )) (deftest "sorted by binds after in without parens" (hs-cleanup!) - (let ((_el-list (dom-create-element "ul"))) + (let ((_el-list (dom-create-element "ul")) (_el-li (dom-create-element "li")) (_el-li2 (dom-create-element "li")) (_el-li3 (dom-create-element "li"))) (dom-set-attr _el-list "id" "list") + (dom-set-inner-html _el-li "C") + (dom-set-inner-html _el-li2 "A") + (dom-set-inner-html _el-li3 "B") (dom-append (dom-body) _el-list) + (dom-append _el-list _el-li) + (dom-append _el-list _el-li2) + (dom-append _el-list _el-li3) )) (deftest "where binds after property access" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) (deftest "where after in with mapped to" (hs-cleanup!) - (let ((_el-items (dom-create-element "ul"))) + (let ((_el-items (dom-create-element "ul")) (_el-li (dom-create-element "li")) (_el-li2 (dom-create-element "li")) (_el-li3 (dom-create-element "li"))) (dom-set-attr _el-items "id" "items") + (dom-add-class _el-li "yes") + (dom-set-inner-html _el-li "A") + (dom-set-inner-html _el-li2 "B") + (dom-add-class _el-li3 "yes") + (dom-set-inner-html _el-li3 "C") (dom-append (dom-body) _el-items) + (dom-append _el-items _el-li) + (dom-append _el-items _el-li2) + (dom-append _el-items _el-li3) )) (deftest "where binds after in on closest" (hs-cleanup!) - (let ((_el-box (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-b2 (dom-create-element "button"))) + (let ((_el-box (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-span2 (dom-create-element "span")) (_el-span3 (dom-create-element "span")) (_el-button (dom-create-element "button")) (_el-b2 (dom-create-element "button"))) (dom-set-attr _el-box "id" "box") - (dom-append (dom-body) _el-box) + (dom-add-class _el-span "a") + (dom-set-inner-html _el-span "A") + (dom-add-class _el-span2 "b") + (dom-set-inner-html _el-span2 "B") + (dom-add-class _el-span3 "a") + (dom-set-inner-html _el-span3 "C") ;; HS source has bare quotes or embedded HTML - (dom-append (dom-body) _el-button) (dom-set-attr _el-b2 "id" "b2") ;; HS source has bare quotes or embedded HTML + (dom-append (dom-body) _el-box) + (dom-append _el-box _el-span) + (dom-append _el-box _el-span2) + (dom-append _el-box _el-span3) + (dom-append (dom-body) _el-button) (dom-append (dom-body) _el-b2) (dom-dispatch (dom-query-by-id "b2") "click" nil) (assert= (dom-text-content (dom-query-by-id "b2")) "2") )) (deftest "where in init followed by on feature" (hs-cleanup!) - (let ((_el-box (dom-create-element "div")) (_el-button (dom-create-element "button"))) + (let ((_el-box (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-span2 (dom-create-element "span")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-box "id" "box") - (dom-append (dom-body) _el-box) + (dom-add-class _el-span "a") + (dom-set-inner-html _el-span "A") + (dom-add-class _el-span2 "b") + (dom-set-inner-html _el-span2 "B") ;; HS source has bare quotes or embedded HTML + (dom-append (dom-body) _el-box) + (dom-append _el-box _el-span) + (dom-append _el-box _el-span2) (dom-append (dom-body) _el-button) (dom-dispatch _el-button "click" nil) (assert= (dom-text-content _el-button) "1") )) (deftest "where in component init followed by on feature" (hs-cleanup!) - (let ((_el-box (dom-create-element "div")) (_el-template (dom-create-element "template")) (_el-test-where-comp (dom-create-element "test-where-comp"))) + (let ((_el-box (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-span2 (dom-create-element "span")) (_el-template (dom-create-element "template")) (_el-slot (dom-create-element "slot")) (_el-test-where-comp (dom-create-element "test-where-comp"))) (dom-set-attr _el-box "id" "box") - (dom-append (dom-body) _el-box) + (dom-add-class _el-span "a") + (dom-set-inner-html _el-span "A") + (dom-add-class _el-span2 "b") + (dom-set-inner-html _el-span2 "B") (dom-set-attr _el-template "_" "set :items to in #box where it matches .a then on click put :items.length into me") (dom-set-attr _el-template "component" "test-where-comp") - (dom-append (dom-body) _el-template) - (hs-activate! _el-template) (dom-set-inner-html _el-test-where-comp "go") + (dom-append (dom-body) _el-box) + (dom-append _el-box _el-span) + (dom-append _el-box _el-span2) + (dom-append (dom-body) _el-template) + (dom-append _el-template _el-slot) (dom-append (dom-body) _el-test-where-comp) + (hs-activate! _el-template) (dom-dispatch _el-test-where-comp "click" nil) (assert= (dom-text-content _el-test-where-comp) "1") )) (deftest "where with is not me in component template" (hs-cleanup!) - (let ((_el-box (dom-create-element "div"))) + (let ((_el-box (dom-create-element "div")) (_el-input (dom-create-element "input")) (_el-input2 (dom-create-element "input")) (_el-template (dom-create-element "template")) (_el-input4 (dom-create-element "input")) (_el-test-where-me (dom-create-element "test-where-me"))) (dom-set-attr _el-box "id" "box") + (dom-add-class _el-input "cb") + (dom-set-attr _el-input "type" "checkbox") + (dom-add-class _el-input2 "cb") + (dom-set-attr _el-input2 "type" "checkbox") + (dom-set-attr _el-template "component" "test-where-me") + (dom-set-attr _el-input4 "_" "set :checkboxes to in #box where it is not me on change set checked of the :checkboxes to my checked") + (dom-set-attr _el-input4 "type" "checkbox") (dom-append (dom-body) _el-box) + (dom-append _el-box _el-input) + (dom-append _el-input _el-input2) + (dom-append _el-input2 _el-template) + (dom-append _el-template _el-input4) + (dom-append _el-input4 _el-test-where-me) + (hs-activate! _el-input4) (dom-dispatch (dom-query "test-where-me input") "click" nil) )) (deftest "where with is not me followed by on feature" (hs-cleanup!) - (let ((_el-table (dom-create-element "table"))) + (let ((_el-table (dom-create-element "table")) (_el-tr (dom-create-element "tr")) (_el-td (dom-create-element "td")) (_el-input (dom-create-element "input")) (_el-tr4 (dom-create-element "tr")) (_el-td5 (dom-create-element "td")) (_el-input6 (dom-create-element "input")) (_el-tr7 (dom-create-element "tr")) (_el-td8 (dom-create-element "td")) (_el-input9 (dom-create-element "input")) (_el-tr10 (dom-create-element "tr")) (_el-td11 (dom-create-element "td")) (_el-master (dom-create-element "input"))) + (dom-add-class _el-input "cb") + (dom-set-attr _el-input "type" "checkbox") + (dom-add-class _el-input6 "cb") + (dom-set-attr _el-input6 "type" "checkbox") + (dom-add-class _el-input9 "cb") + (dom-set-attr _el-input9 "type" "checkbox") + (dom-set-attr _el-master "id" "master") + (dom-set-attr _el-master "_" "set :checkboxes to in the closest where it is not me then on change set checked of the :checkboxes to my checked") + (dom-set-attr _el-master "type" "checkbox") (dom-append (dom-body) _el-table) + (dom-append _el-table _el-tr) + (dom-append _el-tr _el-td) + (dom-append _el-td _el-input) + (dom-append _el-input _el-tr4) + (dom-append _el-tr4 _el-td5) + (dom-append _el-td5 _el-input6) + (dom-append _el-input6 _el-tr7) + (dom-append _el-tr7 _el-td8) + (dom-append _el-td8 _el-input9) + (dom-append _el-input9 _el-tr10) + (dom-append _el-tr10 _el-td11) + (dom-append _el-td11 _el-master) + (hs-activate! _el-master) (dom-dispatch (dom-query-by-id "master") "click" nil) )) (deftest "full select-all pattern with multiple on features" (hs-cleanup!) - (let ((_el-table (dom-create-element "table"))) + (let ((_el-table (dom-create-element "table")) (_el-tr (dom-create-element "tr")) (_el-td (dom-create-element "td")) (_el-input (dom-create-element "input")) (_el-tr4 (dom-create-element "tr")) (_el-td5 (dom-create-element "td")) (_el-input6 (dom-create-element "input")) (_el-tr7 (dom-create-element "tr")) (_el-td8 (dom-create-element "td")) (_el-input9 (dom-create-element "input")) (_el-tr10 (dom-create-element "tr")) (_el-td11 (dom-create-element "td")) (_el-master (dom-create-element "input"))) + (dom-add-class _el-input "cb") + (dom-set-attr _el-input "type" "checkbox") + (dom-add-class _el-input6 "cb") + (dom-set-attr _el-input6 "type" "checkbox") + (dom-add-class _el-input9 "cb") + (dom-set-attr _el-input9 "type" "checkbox") + (dom-set-attr _el-master "id" "master") + (dom-set-attr _el-master "_" "set :checkboxes to in the closest
    where it is not me then on change set checked of the :checkboxes to my checked then on change from the closest
    then if no :checkboxes where it is checked then set my indeterminate to false then set my checked to false then else if no :checkboxes where it is not checked then set my indeterminate to false then set my checked to true then else then set my indeterminate to true then end") + (dom-set-attr _el-master "type" "checkbox") (dom-append (dom-body) _el-table) + (dom-append _el-table _el-tr) + (dom-append _el-tr _el-td) + (dom-append _el-td _el-input) + (dom-append _el-input _el-tr4) + (dom-append _el-tr4 _el-td5) + (dom-append _el-td5 _el-input6) + (dom-append _el-input6 _el-tr7) + (dom-append _el-tr7 _el-td8) + (dom-append _el-td8 _el-input9) + (dom-append _el-input9 _el-tr10) + (dom-append _el-tr10 _el-td11) + (dom-append _el-td11 _el-master) + (hs-activate! _el-master) (dom-dispatch (dom-query-by-id "master") "click" nil) )) ) @@ -7000,181 +7665,283 @@ (defsuite "hs-upstream-component" (deftest "registers a custom element from a template" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-hello (dom-create-element "test-hello"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-hello (dom-create-element "test-hello"))) (dom-set-attr _el-template "component" "test-hello") + (dom-set-inner-html _el-span "Hello World") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-hello) )) (deftest "renders template expressions" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-greet (dom-create-element "test-greet"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-greet (dom-create-element "test-greet"))) (dom-set-attr _el-template "component" "test-greet") + (dom-set-inner-html _el-span "Hello ${\"\\x24\"}{$name}!") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-greet) )) (deftest "applies _ hyperscript to component instance" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-init (dom-create-element "test-init"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-init (dom-create-element "test-init"))) (dom-set-attr _el-template "_" "init set ^msg to 'initialized'") (dom-set-attr _el-template "component" "test-init") + (dom-set-inner-html _el-span "${\"\\x24\"}{^msg}") (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-init) + (hs-activate! _el-template) )) (deftest "processes _ on inner elements" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-inner (dom-create-element "test-inner"))) + (let ((_el-template (dom-create-element "template")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span")) (_el-test-inner (dom-create-element "test-inner"))) (dom-set-attr _el-template "_" "init set ^count to 0") (dom-set-attr _el-template "component" "test-inner") + (dom-set-attr _el-button "_" "on click increment ^count then put ^count into the next ") + (dom-set-inner-html _el-button "+") + (dom-set-inner-html _el-span "0") (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-append _el-template _el-button) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-inner) + (hs-activate! _el-template) + (hs-activate! _el-button) (dom-dispatch (dom-query "test-inner button") "click" nil) )) (deftest "reactively updates template expressions" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-reactive (dom-create-element "test-reactive"))) + (let ((_el-template (dom-create-element "template")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span")) (_el-test-reactive (dom-create-element "test-reactive"))) (dom-set-attr _el-template "_" "init set ^count to 0") (dom-set-attr _el-template "component" "test-reactive") + (dom-set-attr _el-button "_" "on click increment ^count") + (dom-set-inner-html _el-button "+") + (dom-set-inner-html _el-span "Count: ${\"\\x24\"}{^count}") (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-append _el-template _el-button) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-reactive) + (hs-activate! _el-template) + (hs-activate! _el-button) (dom-dispatch (dom-query "test-reactive button") "click" nil) )) (deftest "supports multiple independent instances" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-a (dom-create-element "test-multi")) (_el-b (dom-create-element "test-multi"))) + (let ((_el-template (dom-create-element "template")) (_el-button (dom-create-element "button")) (_el-span (dom-create-element "span")) (_el-a (dom-create-element "test-multi")) (_el-b (dom-create-element "test-multi"))) (dom-set-attr _el-template "_" "init set ^count to 0") (dom-set-attr _el-template "component" "test-multi") - (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-set-attr _el-button "_" "on click increment ^count then put ^count into the next ") + (dom-set-inner-html _el-button "+") + (dom-set-inner-html _el-span "0") (dom-set-attr _el-a "id" "a") - (dom-append (dom-body) _el-a) (dom-set-attr _el-b "id" "b") + (dom-append (dom-body) _el-template) + (dom-append _el-template _el-button) + (dom-append _el-template _el-span) + (dom-append (dom-body) _el-a) (dom-append (dom-body) _el-b) + (hs-activate! _el-template) + (hs-activate! _el-button) (dom-dispatch (dom-query "#a button") "click" nil) )) (deftest "reads attributes via @" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-attrs (dom-create-element "test-attrs"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-attrs (dom-create-element "test-attrs"))) (dom-set-attr _el-template "_" "init set ^val to @data-start as Int") (dom-set-attr _el-template "component" "test-attrs") - (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-set-inner-html _el-span "${\"\\x24\"}{^val}") (dom-set-attr _el-test-attrs "data-start" "42") + (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-attrs) + (hs-activate! _el-template) )) (deftest "supports #for loops in template" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-loop (dom-create-element "test-loop"))) + (let ((_el-template (dom-create-element "template")) (_el-ul (dom-create-element "ul")) (_el-li (dom-create-element "li")) (_el-test-loop (dom-create-element "test-loop"))) (dom-set-attr _el-template "_" "init set ^items to ['a', 'b', 'c']") (dom-set-attr _el-template "component" "test-loop") + (dom-set-inner-html _el-ul "#for item in ^items") + (dom-set-inner-html _el-li "${\"\\x24\"}{item}") (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-append _el-template _el-ul) + (dom-append _el-ul _el-li) (dom-append (dom-body) _el-test-loop) + (hs-activate! _el-template) )) (deftest "supports #if conditionals in template" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-cond (dom-create-element "test-cond"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-cond (dom-create-element "test-cond"))) (dom-set-attr _el-template "_" "init set ^show to true") (dom-set-attr _el-template "component" "test-cond") - (dom-set-inner-html _el-template "#if ^show#end") + (dom-set-inner-html _el-template "#if ^show") + (dom-set-inner-html _el-span "visible") (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-cond) + (hs-activate! _el-template) )) (deftest "substitutes slot content into template" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-card (dom-create-element "test-card"))) + (let ((_el-template (dom-create-element "template")) (_el-div (dom-create-element "div")) (_el-slot (dom-create-element "slot")) (_el-test-card (dom-create-element "test-card")) (_el-p (dom-create-element "p"))) (dom-set-attr _el-template "component" "test-card") + (dom-add-class _el-div "card") + (dom-set-inner-html _el-p "Hello from slot") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-div) + (dom-append _el-div _el-slot) (dom-append (dom-body) _el-test-card) + (dom-append _el-test-card _el-p) )) (deftest "blocks processing of inner hyperscript until render" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-block (dom-create-element "test-block"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-block (dom-create-element "test-block"))) (dom-set-attr _el-template "_" "init set ^msg to 'ready'") (dom-set-attr _el-template "component" "test-block") + (dom-set-attr _el-span "_" "on click put ^msg into me") + (dom-set-inner-html _el-span "click me") (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-block) + (hs-activate! _el-template) + (hs-activate! _el-span) (dom-dispatch (dom-query "test-block span") "click" nil) )) (deftest "supports named slots" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-named-slot (dom-create-element "test-named-slot"))) + (let ((_el-template (dom-create-element "template")) (_el-header (dom-create-element "header")) (_el-slot (dom-create-element "slot")) (_el-main (dom-create-element "main")) (_el-slot4 (dom-create-element "slot")) (_el-footer (dom-create-element "footer")) (_el-slot6 (dom-create-element "slot")) (_el-test-named-slot (dom-create-element "test-named-slot")) (_el-h1 (dom-create-element "h1")) (_el-p (dom-create-element "p")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-template "component" "test-named-slot") + (dom-set-attr _el-slot "name" "title") + (dom-set-attr _el-slot6 "name" "footer") + (dom-set-attr _el-h1 "slot" "title") + (dom-set-inner-html _el-h1 "My Title") + (dom-set-inner-html _el-p "Default content") + (dom-set-attr _el-span "slot" "footer") + (dom-set-inner-html _el-span "Footer text") (dom-append (dom-body) _el-template) + (dom-append _el-template _el-header) + (dom-append _el-header _el-slot) + (dom-append _el-template _el-main) + (dom-append _el-main _el-slot4) + (dom-append _el-template _el-footer) + (dom-append _el-footer _el-slot6) (dom-append (dom-body) _el-test-named-slot) + (dom-append _el-test-named-slot _el-h1) + (dom-append _el-test-named-slot _el-p) + (dom-append _el-test-named-slot _el-span) )) (deftest "does not process slotted _ attributes prematurely" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-template (dom-create-element "template")) (_el-div2 (dom-create-element "div")) (_el-slot (dom-create-element "slot")) (_el-test-slot-hs (dom-create-element "test-slot-hs")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^x to 42") + (dom-set-attr _el-template "component" "test-slot-hs") + (dom-add-class _el-div2 "wrap") + (dom-set-attr _el-span "_" "on click put ^x into me") + (dom-set-inner-html _el-span "before") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-template) + (dom-append _el-template _el-div2) + (dom-append _el-div2 _el-slot) + (dom-append _el-div _el-test-slot-hs) + (dom-append _el-test-slot-hs _el-span) (hs-activate! _el-div) + (hs-activate! _el-span) (dom-dispatch (dom-query "test-slot-hs span") "click" nil) )) (deftest "slotted content resolves ^var from outer scope, not component scope" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-template (dom-create-element "template")) (_el-div2 (dom-create-element "div")) (_el-slot (dom-create-element "slot")) (_el-test-scope-slot (dom-create-element "test-scope-slot")) (_el-span (dom-create-element "span"))) (dom-set-attr _el-div "_" "init set ^outer to 'from-outside'") + (dom-set-attr _el-template "_" "init set ^outer to 'from-component'") + (dom-set-attr _el-template "component" "test-scope-slot") + (dom-add-class _el-div2 "inner") + (dom-set-attr _el-span "_" "init put ^outer into me") + (dom-set-inner-html _el-span "waiting") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-template) + (dom-append _el-template _el-div2) + (dom-append _el-div2 _el-slot) + (dom-append _el-div _el-test-scope-slot) + (dom-append _el-test-scope-slot _el-span) (hs-activate! _el-div) + (hs-activate! _el-template) + (hs-activate! _el-span) )) (deftest "component isolation prevents ^var leaking inward" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-isolated (dom-create-element "test-isolated"))) (dom-set-attr _el-div "_" "init set ^leaked to 'should-not-see'") + (dom-set-attr _el-template "_" "init set ^internal to 'component-only'") + (dom-set-attr _el-template "component" "test-isolated") + (dom-set-attr _el-span "_" "init if ^leaked is not undefined put 'leaked!' into me else put ^internal into me") + (dom-set-inner-html _el-span "waiting") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-template) + (dom-append _el-template _el-span) + (dom-append _el-div _el-test-isolated) (hs-activate! _el-div) + (hs-activate! _el-template) + (hs-activate! _el-span) )) (deftest "bind keeps ^var in sync with attribute changes" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-bind-attr (dom-create-element "test-bind-attr"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-bind-attr (dom-create-element "test-bind-attr"))) (dom-set-attr _el-template "_" "bind ^count to @data-count") (dom-set-attr _el-template "component" "test-bind-attr") - (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-set-inner-html _el-span "${\"\\x24\"}{^count}") (dom-set-attr _el-test-bind-attr "data-count" "5") + (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) (dom-append (dom-body) _el-test-bind-attr) + (hs-activate! _el-template) )) (deftest "attrs evaluates attribute as hyperscript in parent scope" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-args (dom-create-element "test-args"))) + (let ((_el-template (dom-create-element "template")) (_el-ul (dom-create-element "ul")) (_el-li (dom-create-element "li")) (_el-test-args (dom-create-element "test-args"))) (dom-set-attr _el-template "_" "init set ^list to attrs.items") (dom-set-attr _el-template "component" "test-args") - (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-set-inner-html _el-ul "#for item in ^list") + (dom-set-inner-html _el-li "${\"\\x24\"}{item}") (dom-set-attr _el-test-args "items" "$stuff") + (dom-append (dom-body) _el-template) + (dom-append _el-template _el-ul) + (dom-append _el-ul _el-li) (dom-append (dom-body) _el-test-args) + (hs-activate! _el-template) )) (deftest "attrs works with bind for reactive pass-through" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-args-bind (dom-create-element "test-args-bind")) (_el-button (dom-create-element "button"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-test-args-bind (dom-create-element "test-args-bind")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-template "_" "bind ^val to attrs.count") (dom-set-attr _el-template "component" "test-args-bind") - (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-set-inner-html _el-span "${\"\\x24\"}{^val}") (dom-set-attr _el-test-args-bind "count" "$count") - (dom-append (dom-body) _el-test-args-bind) (dom-set-attr _el-button "_" "on click increment $count") (dom-set-inner-html _el-button "+") + (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) + (dom-append (dom-body) _el-test-args-bind) (dom-append (dom-body) _el-button) + (hs-activate! _el-template) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) )) (deftest "attrs bind is bidirectional — inner changes flow outward" (hs-cleanup!) - (let ((_el-template (dom-create-element "template")) (_el-test-args-bidir (dom-create-element "test-args-bidir")) (_el-p (dom-create-element "p"))) + (let ((_el-template (dom-create-element "template")) (_el-span (dom-create-element "span")) (_el-button (dom-create-element "button")) (_el-test-args-bidir (dom-create-element "test-args-bidir")) (_el-p (dom-create-element "p"))) (dom-set-attr _el-template "_" "bind ^count to attrs.count") (dom-set-attr _el-template "component" "test-args-bidir") - (dom-append (dom-body) _el-template) - (hs-activate! _el-template) + (dom-set-inner-html _el-span "${\"\\x24\"}{^count}") + (dom-set-attr _el-button "_" "on click increment ^count") + (dom-set-inner-html _el-button "+") (dom-set-attr _el-test-args-bidir "count" "$count") - (dom-append (dom-body) _el-test-args-bidir) (dom-set-attr _el-p "_" "live put $count into me") + (dom-append (dom-body) _el-template) + (dom-append _el-template _el-span) + (dom-append _el-template _el-button) + (dom-append (dom-body) _el-test-args-bidir) (dom-append (dom-body) _el-p) + (hs-activate! _el-template) + (hs-activate! _el-button) (hs-activate! _el-p) (dom-dispatch (dom-query "test-args-bidir button") "click" nil) )) @@ -7286,8 +8053,8 @@ (let ((_el-other (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-other "id" "other") (dom-set-attr _el-other "style" "all: initial; position: fixed; top: 89px") - (dom-append (dom-body) _el-other) (dom-set-attr _el-div "_" "on click measure #other's top then set window.measurement to {top: top}") + (dom-append (dom-body) _el-other) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil) @@ -7297,8 +8064,8 @@ (let ((_el-other (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-other "id" "other") (dom-set-attr _el-other "style" "all: initial; position: fixed; top: 89px") - (dom-append (dom-body) _el-other) (dom-set-attr _el-div "_" "on click measure top of #other then set window.measurement to {top: top}") + (dom-append (dom-body) _el-other) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil) @@ -7329,11 +8096,11 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-trigger (dom-create-element "div"))) (dom-add-class _el-div "item") - (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "item") - (dom-append (dom-body) _el-div1) (dom-set-attr _el-trigger "id" "trigger") (dom-set-attr _el-trigger "_" "on click settle <.item/> then add .done to <.item/>") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-div1) (dom-append (dom-body) _el-trigger) (hs-activate! _el-trigger) (dom-dispatch (dom-query-by-id "trigger") "click" nil) @@ -7346,14 +8113,14 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-s1 (dom-create-element "span")) (_el-s2 (dom-create-element "span"))) ;; HS source has bare quotes or embedded HTML - (dom-append (dom-body) _el-div) (dom-set-attr _el-s1 "id" "s1") (dom-set-attr _el-s1 "style" "display:none") (dom-set-inner-html _el-s1 "A") - (dom-append (dom-body) _el-s1) (dom-set-attr _el-s2 "id" "s2") (dom-set-attr _el-s2 "style" "display:none") (dom-set-inner-html _el-s2 "B") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-s1) (dom-append (dom-body) _el-s2) (dom-dispatch _el-div "click" nil) (assert (dom-visible? (dom-query-by-id "s1"))) @@ -7363,15 +8130,15 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-p2 (dom-create-element "p")) (_el-out (dom-create-element "span"))) ;; HS source has bare quotes or embedded HTML - (dom-append (dom-body) _el-div) (dom-set-attr _el-p "style" "display:none") (dom-set-inner-html _el-p "yes") - (dom-append (dom-body) _el-p) (dom-set-attr _el-p2 "style" "display:none") (dom-set-inner-html _el-p2 "no") - (dom-append (dom-body) _el-p2) (dom-set-attr _el-out "id" "out") (dom-set-inner-html _el-out "--") + (dom-append (dom-body) _el-div) + (dom-append (dom-body) _el-p) + (dom-append (dom-body) _el-p2) (dom-append (dom-body) _el-out) (dom-dispatch _el-div "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "some") @@ -7396,8 +8163,8 @@ (hs-cleanup!) (let ((_el-bar (dom-create-element "div")) (_el-div (dom-create-element "div"))) (dom-set-attr _el-bar "id" "bar") - (dom-append (dom-body) _el-bar) (dom-set-attr _el-div "_" "on click add .foo to #bar then add .blah") + (dom-append (dom-body) _el-bar) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil) @@ -7445,9 +8212,9 @@ (hs-cleanup!) (let ((_el-source (dom-create-element "div")) (_el-target (dom-create-element "div"))) (dom-set-attr _el-source "id" "source") - (dom-append (dom-body) _el-source) (dom-set-attr _el-target "id" "target") (dom-set-attr _el-target "_" "on click from #source add .foo") + (dom-append (dom-body) _el-source) (dom-append (dom-body) _el-target) (hs-activate! _el-target) (dom-dispatch (dom-query-by-id "source") "click" nil) @@ -7527,8 +8294,16 @@ (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) (deftest "element-level isolation still works with error recovery" (hs-cleanup!) - (let ((_el-div (dom-create-element "div"))) + (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) + (dom-set-attr _el-d1 "id" "d1") + (dom-set-attr _el-d1 "_" "on click blargh end on mouseenter also_bad") + (dom-set-attr _el-d2 "id" "d2") + (dom-set-attr _el-d2 "_" "on click put \"clicked\" into my.innerHTML") (dom-append (dom-body) _el-div) + (dom-append _el-div _el-d1) + (dom-append _el-div _el-d2) + (hs-activate! _el-d1) + (hs-activate! _el-d2) (dom-dispatch (dom-query-by-id "d2") "click" nil) (assert= (dom-text-content (dom-query-by-id "d2")) "clicked") )) @@ -7617,24 +8392,47 @@ (defsuite "hs-upstream-closest" (deftest "attributes can be set via the closest expression 2" (hs-cleanup!) - (let ((_el-outerDiv2 (dom-create-element "div"))) + (let ((_el-outerDiv2 (dom-create-element "div")) (_el-d1b (dom-create-element "div"))) (dom-set-attr _el-outerDiv2 "id" "outerDiv2") (dom-set-attr _el-outerDiv2 "foo" "bar") + (dom-set-attr _el-d1b "id" "d1b") + (dom-set-attr _el-d1b "_" "on click set closest @foo to \"doh\"") (dom-append (dom-body) _el-outerDiv2) + (dom-append _el-outerDiv2 _el-d1b) + (hs-activate! _el-d1b) (dom-dispatch (dom-query-by-id "d1b") "click" nil) )) (deftest "closest does not consume a following where clause" (hs-cleanup!) - (let ((_el-table (dom-create-element "table"))) + (let ((_el-table (dom-create-element "table")) (_el-tr (dom-create-element "tr")) (_el-td (dom-create-element "td")) (_el-input (dom-create-element "input")) (_el-input4 (dom-create-element "input")) (_el-master (dom-create-element "input")) (_el-table6 (dom-create-element "table")) (_el-out (dom-create-element "div"))) + (dom-add-class _el-input "cb") + (dom-set-attr _el-input "type" "checkbox") + (dom-add-class _el-input4 "cb") + (dom-set-attr _el-input4 "type" "checkbox") + (dom-set-attr _el-master "id" "master") + ;; HS source has bare quotes or embedded HTML + (dom-set-attr _el-master "type" "checkbox") + (dom-set-attr _el-master "