diff --git a/spec/tests/test-hyperscript-behavioral.sx b/spec/tests/test-hyperscript-behavioral.sx index 296d5a54..c515fe04 100644 --- a/spec/tests/test-hyperscript-behavioral.sx +++ b/spec/tests/test-hyperscript-behavioral.sx @@ -80,7 +80,9 @@ (deftest "can add non-class attributes" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click add [@foo="bar"] + (dom-set-attr _el-div "_" "on click add [@foo=\"bar\"]") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert (not (dom-has-attr? _el-div "foo"))) (assert= "bar" (dom-get-attr _el-div "foo")) @@ -98,7 +100,10 @@ (deftest "can add templated css properties" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click add {color: ${"red"};} + (dom-set-attr _el-div "_" "on click add {color: ${\"red\"};}") + (dom-set-attr _el-div "style" "color: blue") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "red" (dom-get-style _el-div "color")) )) @@ -160,10 +165,10 @@ (dom-set-attr _el-bar "id" "bar") (dom-append (dom-body) _el-bar) (dom-dispatch (dom-query-by-id "div1") "click" nil) - ;; SKIP check: skip byId("c1").classList.contains("foo").should.equal(false) None None - ;; SKIP check: skip byId("c2").classList.contains("foo").should.equal(false) None None - ;; SKIP check: skip byId("c1").classList.contains("foo").should.equal(true) None None - ;; SKIP check: skip byId("c2").classList.contains("foo").should.equal(true) None None + ;; SKIP check: skip byId("c1").classList.contains("foo").should.equal(false) + ;; SKIP check: skip byId("c2").classList.contains("foo").should.equal(false) + ;; SKIP check: skip byId("c1").classList.contains("foo").should.equal(true) + ;; SKIP check: skip byId("c2").classList.contains("foo").should.equal(true) )) (deftest "supports async expressions in when clause" (hs-cleanup!) @@ -174,8 +179,8 @@ (hs-activate! _el-trigger) (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-d2) - ;; SKIP action: find('#trigger').dispatchEvent('click') - ;; SKIP check: skip toHaveClass(/foo/) None None + ;; SKIP action: find___trigger__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass(/foo/) )) (deftest "when clause sets result to matched elements" (hs-cleanup!) @@ -194,8 +199,8 @@ (dom-set-attr _el-none "id" "none") (dom-set-attr _el-none "style" "display:none") (dom-append (dom-body) _el-none) - ;; SKIP action: find('#trigger').dispatchEvent('click') - ;; SKIP check: skip toBeHidden() None None + ;; SKIP action: find___trigger__.dispatchEvent__click__ + ;; SKIP check: skip toBeHidden() )) (deftest "when clause result is empty when nothing matches" (hs-cleanup!) @@ -209,26 +214,26 @@ (dom-append (dom-body) _el-d1) (dom-set-attr _el-none "id" "none") (dom-append (dom-body) _el-none) - ;; SKIP action: find('#trigger').dispatchEvent('click') - ;; SKIP check: skip toHaveAttribute('hidden') None None + ;; SKIP action: find___trigger__.dispatchEvent__click__ + ;; SKIP check: skip toHaveAttribute('hidden') )) (deftest "can add a value to an array" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :arr to [1,2,3] add 4 to :arr put :arr as String into me") + (dom-set-attr _el-div "_" "on click set :arr to [1,2,3] add 4 to :arr put :arr as String into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("1,2,3,4") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("1,2,3,4") )) (deftest "can add a value to a set" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :s to [] as Set add 'a' to :s add 'b' to :s add 'a' to :s put :s.size into me") + (dom-set-attr _el-div "_" "on click set :s to [] as Set add 'a' to :s add 'b' to :s add 'a' to :s put :s.size into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("2") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("2") )) ) @@ -328,10 +333,10 @@ (let ((_el-div (dom-create-element "div"))) (dom-append (dom-body) _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip div.innerHTML.includes("foo").should.equal(true) None None - ;; SKIP check: skip div.innerHTML.includes("bar").should.equal(true) None None - ;; SKIP check: skip div.innerHTML.includes("doh").should.equal(true) None None - ;; SKIP check: skip div.innerHTML.includes("foo").should.equal(false) None None + ;; 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) + ;; SKIP check: skip div.innerHTML.includes("foo").should.equal(false) )) (deftest "can filter class removal via the when clause" (hs-cleanup!) @@ -349,8 +354,8 @@ (dom-add-class _el-d2 "item") (dom-add-class _el-d2 "highlight") (dom-append (dom-body) _el-d2) - ;; SKIP action: find('#trigger').dispatchEvent('click') - ;; SKIP check: skip toHaveClass(/highlight/); toHaveClass(/highlight/) None None + ;; SKIP action: find___trigger__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass(/highlight/); toHaveClass(/highlight/) )) (deftest "can remove CSS properties" (hs-cleanup!) @@ -359,8 +364,8 @@ (dom-set-attr _el-div "style" "color: red; font-weight: bold;") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toBe(''); toBe('bold') None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toBe(''); toBe('bold') )) (deftest "can remove multiple CSS properties" (hs-cleanup!) @@ -369,26 +374,26 @@ (dom-set-attr _el-div "style" "color: red; font-weight: bold; opacity: 0.5;") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toBe(''); toBe(''); toBe('0.5') None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toBe(''); toBe(''); toBe('0.5') )) (deftest "can remove a value from an array" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :arr to [1,2,3,4] remove 3 from :arr put :arr as String into me") + (dom-set-attr _el-div "_" "on click set :arr to [1,2,3,4] remove 3 from :arr put :arr as String into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("1,2,4") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("1,2,4") )) (deftest "can remove a value from a set" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :s to ['a','b','c'] as Set remove 'b' from :s put :s.size into me") + (dom-set-attr _el-div "_" "on click set :s to ['a','b','c'] as Set remove 'b' from :s put :s.size into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("2") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("2") )) ) @@ -430,7 +435,9 @@ (deftest "can toggle non-class attributes" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click toggle [@foo="bar"] + (dom-set-attr _el-div "_" "on click toggle [@foo=\"bar\"]") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) (assert (not (dom-has-attr? _el-div "foo"))) @@ -439,7 +446,9 @@ (deftest "can toggle non-class attributes on selects" (hs-cleanup!) (let ((_el-select (dom-create-element "select"))) - ;; HS source contains quotes: on click toggle [@foo="bar"] + (dom-set-attr _el-select "_" "on click toggle [@foo=\"bar\"]") + (dom-append (dom-body) _el-select) + (hs-activate! _el-select) (dom-dispatch (dom-query-by-id "select") "click" nil) (dom-dispatch (dom-query-by-id "select") "click" nil) (assert (not (dom-has-attr? (dom-query-by-id "select") "foo"))) @@ -498,7 +507,7 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.display == block + ;; SKIP computed style: div.display )) (deftest "can toggle opacity" (hs-cleanup!) @@ -508,7 +517,7 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.opacity == 1 + ;; SKIP computed style: div.opacity )) (deftest "can toggle opacity" (hs-cleanup!) @@ -518,7 +527,7 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.visibility == visible + ;; SKIP computed style: div.visibility )) (deftest "can toggle display w/ my" (hs-cleanup!) @@ -528,7 +537,7 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.display == block + ;; SKIP computed style: div.display )) (deftest "can toggle display w/ my" (hs-cleanup!) @@ -538,7 +547,7 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.opacity == 1 + ;; SKIP computed style: div.opacity )) (deftest "can toggle display w/ my" (hs-cleanup!) @@ -548,7 +557,7 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.visibility == visible + ;; SKIP computed style: div.visibility )) (deftest "can toggle display on other elt" (hs-cleanup!) @@ -560,7 +569,7 @@ (dom-append (dom-body) _el-d2) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div2.display == block + ;; SKIP computed style: div2.display )) (deftest "can toggle display on other elt" (hs-cleanup!) @@ -572,7 +581,7 @@ (dom-append (dom-body) _el-d2) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div2.opacity == 1 + ;; SKIP computed style: div2.opacity )) (deftest "can toggle display on other elt" (hs-cleanup!) @@ -584,7 +593,7 @@ (dom-append (dom-body) _el-d2) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div2.visibility == visible + ;; SKIP computed style: div2.visibility )) (deftest "can toggle crazy tailwinds class ref on a single form" (hs-cleanup!) @@ -599,18 +608,18 @@ (deftest "can toggle between two attribute values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: "on - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveAttribute('data-state', 'active'); toHaveAttribute('da None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveAttribute('data-state', 'active'); toHaveAttribute('da )) (deftest "can toggle between different attributes" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: "on - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveAttribute('enabled', 'true'); toHaveAttribute('disable None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveAttribute('enabled', 'true'); toHaveAttribute('disable )) (deftest "can toggle visibility" (hs-cleanup!) @@ -618,9 +627,9 @@ (dom-set-attr _el-div "_" "on click toggle *visibility") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('visibility', 'visible'); toHaveCSS('visibility', None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('visibility', 'visible'); toHaveCSS('visibility', )) (deftest "can toggle opacity w/ my" (hs-cleanup!) @@ -628,9 +637,9 @@ (dom-set-attr _el-div "_" "on click toggle my *opacity") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('opacity', '1'); toHaveCSS('opacity', '0'); toHave None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('opacity', '1'); toHaveCSS('opacity', '0'); toHave )) (deftest "can toggle visibility w/ my" (hs-cleanup!) @@ -638,9 +647,9 @@ (dom-set-attr _el-div "_" "on click toggle my *visibility") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('visibility', 'visible'); toHaveCSS('visibility', None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('visibility', 'visible'); toHaveCSS('visibility', )) (deftest "can toggle opacity on other elt" (hs-cleanup!) @@ -650,7 +659,7 @@ (hs-activate! _el-div) (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-d2) - ;; SKIP check: skip toHaveCSS('opacity', '1'); toHaveCSS('opacity', '0'); toHave None None + ;; SKIP check: skip toHaveCSS('opacity', '1'); toHaveCSS('opacity', '0'); toHave )) (deftest "can toggle visibility on other elt" (hs-cleanup!) @@ -660,43 +669,43 @@ (hs-activate! _el-div) (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-d2) - ;; SKIP check: skip toHaveCSS('visibility', 'visible'); toHaveCSS('visibility', None None + ;; SKIP check: skip toHaveCSS('visibility', 'visible'); toHaveCSS('visibility', )) (deftest "can toggle *display between two values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: "on - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('display', 'none'); toHaveCSS('display', 'flex'); None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('display', 'none'); toHaveCSS('display', 'flex'); )) (deftest "can toggle *opacity between three values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: "on - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('opacity', '0'); toHaveCSS('opacity', '0.5'); toHa None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('opacity', '0'); toHaveCSS('opacity', '0.5'); toHa )) (deftest "can toggle a global variable between two values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: "on - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toBe('edit'); toBe('preview'); toBe('edit') None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toBe('edit'); toBe('preview'); toBe('edit') )) (deftest "can toggle a global variable between three values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: "on - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toBe('a'); toBe('b'); toBe('c'); toBe('a') None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toBe('a'); toBe('b'); toBe('c'); toBe('a') )) ) @@ -706,7 +715,7 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click set #d1.innerHTML to "foo" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) @@ -714,50 +723,52 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click set innerHTML of #d1 to "foo" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "can set complex indirect properties lhs" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set parentNode.innerHTML of #d1 to "foo" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "can set complex indirect properties rhs" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set innerHTML of #d1.parentNode to "foo" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "can set chained indirect properties" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set the innerHTML of the parentNode of #d1 to "foo" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "can set styles" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set my.style.color to "red" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "can set javascript globals" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set window.temp to "red" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip window["temp"].should.equal("red") None None + ;; SKIP check: skip window["temp"].should.equal("red") )) (deftest "can set local variables" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click set newVar to "foo" then + (dom-set-attr _el-d1 "_" "on click set newVar to \"foo\" then put newVar into #d1.innerHTML") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) @@ -765,7 +776,7 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click set #d1.innerHTML to "foo" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) @@ -773,7 +784,7 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div"))) (dom-add-class _el-div "divs") - ;; HS source contains quotes: on click set .divs.innerHTML to "foo" + ;; HS source has bare quotes — HTML parse artifact (dom-add-class _el-div1 "divs") (dom-append (dom-body) _el-div1) (dom-dispatch (dom-query-by-id "d1") "click" nil) @@ -784,7 +795,7 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-add-class _el-div "divs") - ;; HS source contains quotes: on click set @bar to "foo" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-get-attr (dom-query-by-id "d1") "bar")) )) @@ -828,9 +839,9 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-add-class _el-div "divs") - ;; HS source contains quotes: on click set *color to "red" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d1.style["color"].should.equal("red") None None + ;; SKIP check: skip d1.style["color"].should.equal("red") )) (deftest "can set into indirect style ref" (hs-cleanup!) @@ -842,7 +853,7 @@ (dom-set-attr _el-div2 "id" "div2") (dom-append (dom-body) _el-div2) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d2.style["color"].should.equal("red") None None + ;; SKIP check: skip d2.style["color"].should.equal("red") )) (deftest "can set into indirect style ref 2" (hs-cleanup!) @@ -854,7 +865,7 @@ (dom-set-attr _el-div2 "id" "div2") (dom-append (dom-body) _el-div2) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d2.style["color"].should.equal("red") None None + ;; SKIP check: skip d2.style["color"].should.equal("red") )) (deftest "can set into indirect style ref 3" (hs-cleanup!) @@ -866,7 +877,7 @@ (dom-set-attr _el-div2 "id" "div2") (dom-append (dom-body) _el-div2) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d2.style["color"].should.equal("red") None None + ;; SKIP check: skip d2.style["color"].should.equal("red") )) (deftest "set waits on promises" (hs-cleanup!) @@ -884,33 +895,37 @@ (dom-set-attr _el-div "_" "on click set {bar: 2, baz: 3} on obj") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip obj.should.deep.equal({ foo: 1, bar: 2, baz: 3 }) None None + ;; SKIP check: skip obj.should.deep.equal({ foo: 1, bar: 2, baz: 3 }) )) (deftest "can set props w/ array access syntax" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set my style["color"] to "red" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "can set props w/ array access syntax and var" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set foo to "color" then set my style[foo] to "red" + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "can set arrays w/ array access syntax" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set arr to [1, 2, 3] set arr[0] to "red" set my *co + (dom-set-attr _el-div "_" "on click set arr to [1, 2, 3] set arr[0] to \"red\" set my *color to arr[0]") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "can set arrays w/ array access syntax and var" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set arr to [1, 2, 3] set idx to 0 set arr[idx] to " + (dom-set-attr _el-div "_" "on click set arr to [1, 2, 3] set idx to 0 set arr[idx] to \"red\" set my *color to arr[0]") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) @@ -921,7 +936,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d1.innerText.should.equal("https://yyy.xxxxxx.com/path/out/f None None + ;; SKIP check: skip d1.innerText.should.equal("https://yyy.xxxxxx.com/path/out/f )) ) @@ -931,7 +946,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "foo" into #d1.innerHTML + (dom-set-attr _el-d1 "_" "on click put \"foo\" into #d1.innerHTML") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) @@ -939,7 +956,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "foo" into #d1 + (dom-set-attr _el-d1 "_" "on click put \"foo\" into #d1") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-text-content (dom-query-by-id "d1"))) )) @@ -953,40 +972,50 @@ (dom-append (dom-body) _el-d2) (hs-activate! _el-d2) (dom-dispatch (dom-query-by-id "d2") "click" nil) - ;; SKIP check: skip d2.firstChild.should.equal(d1) None None + ;; SKIP check: skip d2.firstChild.should.equal(d1) )) (deftest "can put directly into symbols" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click put "foo" into me + (dom-set-attr _el-div "_" "on click put \"foo\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "me symbol doesn't get stomped on direct write" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click put "foo" into me then put "bar" into me + (dom-set-attr _el-div "_" "on click put \"foo\" into me then put \"bar\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "bar" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "can set styles" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click put "red" into my.style.color + (dom-set-attr _el-div "_" "on click put \"red\" into my.style.color") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "can set javascript globals" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click put "red" into window.temp + (dom-set-attr _el-div "_" "on click put \"red\" into window.temp") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip window["temp"].should.equal("red") None None + ;; SKIP check: skip window["temp"].should.equal("red") )) (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"))) - ;; HS source contains quotes: on click put "foo" into .divs.parentElement.innerHTML + (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-set-attr _el-d2 "id" "d2") @@ -998,7 +1027,9 @@ (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"))) - ;; HS source contains quotes: on click put "foo" into innerHTML of parentElement of .divs + (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-set-attr _el-d2 "id" "d2") @@ -1011,7 +1042,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "foo" into newVar then + (dom-set-attr _el-d1 "_" "on click put \"foo\" into newVar then put newVar into #d1.innerHTML") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) @@ -1019,7 +1052,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "foo" into #d1.innerHTML + (dom-set-attr _el-d1 "_" "on click put \"foo\" into #d1.innerHTML") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) @@ -1033,7 +1068,7 @@ (dom-set-attr _el-d1 "id" "d1") (dom-append (dom-body) _el-d1) (dom-dispatch (dom-query-by-id "d2") "click" nil) - ;; SKIP check: skip d2.previousSibling.textContent.should.equal("foo") None None + ;; SKIP check: skip d2.previousSibling.textContent.should.equal("foo") )) (deftest "can insert after" (hs-cleanup!) @@ -1045,13 +1080,15 @@ (dom-append (dom-body) _el-d2) (hs-activate! _el-d2) (dom-dispatch (dom-query-by-id "d2") "click" nil) - ;; SKIP check: skip d2.nextSibling.textContent.should.equal("foo") None None + ;; SKIP check: skip d2.nextSibling.textContent.should.equal("foo") )) (deftest "can insert after beginning" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "foo" at start of #d1 + (dom-set-attr _el-d1 "_" "on click put \"foo\" at start of #d1") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo*" (dom-text-content (dom-query-by-id "d1"))) )) @@ -1059,7 +1096,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "foo" at end of #d1 + (dom-set-attr _el-d1 "_" "on click put \"foo\" at end of #d1") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "*foo" (dom-text-content (dom-query-by-id "d1"))) )) @@ -1067,7 +1106,9 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-add-class _el-div "divs") - ;; HS source contains quotes: on click put "foo" into @bar + (dom-set-attr _el-div "_" "on click put \"foo\" into @bar") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-get-attr (dom-query-by-id "d1") "bar")) )) @@ -1075,7 +1116,9 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-add-class _el-div "divs") - ;; HS source contains quotes: on click put "foo" into my @bar + (dom-set-attr _el-div "_" "on click put \"foo\" into my @bar") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-get-attr (dom-query-by-id "d1") "bar")) )) @@ -1107,17 +1150,21 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-add-class _el-div "divs") - ;; HS source contains quotes: on click put "red" into *color + (dom-set-attr _el-div "_" "on click put \"red\" into *color") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d1.style["color"].should.equal("red") None None + ;; SKIP check: skip d1.style["color"].should.equal("red") )) (deftest "can set into indirect style ref" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-add-class _el-div "divs") - ;; HS source contains quotes: on click put "red" into my *color + (dom-set-attr _el-div "_" "on click put \"red\" into my *color") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d1.style["color"].should.equal("red") None None + ;; SKIP check: skip d1.style["color"].should.equal("red") )) (deftest "can set into indirect style ref 2" (hs-cleanup!) @@ -1129,7 +1176,7 @@ (dom-set-attr _el-div2 "id" "div2") (dom-append (dom-body) _el-div2) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d2.style["color"].should.equal("red") None None + ;; SKIP check: skip d2.style["color"].should.equal("red") )) (deftest "can set into indirect style ref 3" (hs-cleanup!) @@ -1141,7 +1188,7 @@ (dom-set-attr _el-div2 "id" "div2") (dom-append (dom-body) _el-div2) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip d2.style["color"].should.equal("red") None None + ;; SKIP check: skip d2.style["color"].should.equal("red") )) (deftest "waits on promises" (hs-cleanup!) @@ -1156,35 +1203,45 @@ (deftest "can put properties w/ array access syntax" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click put "red" into my style["color"] + (dom-set-attr _el-div "_" "on click put \"red\" into my style[\"color\"]") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "can put properties w/ array access syntax and var" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set foo to "color" then put "red" into my style[foo + (dom-set-attr _el-div "_" "on click set foo to \"color\" then put \"red\" into my style[foo]") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "can put array vals w/ array access syntax" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set arr to [1, 2, 3] put "red" into arr[0] put arr[ + (dom-set-attr _el-div "_" "on click set arr to [1, 2, 3] put \"red\" into arr[0] put arr[0] into my *color") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "can put array vals w/ array access syntax and var" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set arr to [1, 2, 3] set idx to 0 put "red" into ar + (dom-set-attr _el-div "_" "on click set arr to [1, 2, 3] set idx to 0 put \"red\" into arr[idx] put arr[0] into my *color") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "red" (dom-get-style (dom-query-by-id "d1") "color")) )) (deftest "properly processes hyperscript in new content in a symbol write" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click put "\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-button "click" nil) (assert= "42" (dom-inner-html _el-button)) @@ -1193,7 +1250,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "\" into ") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-button "click" nil) (assert= "42" (dom-inner-html _el-button)) @@ -1202,7 +1261,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "\" before me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-button "click" nil) (assert= "42" (dom-inner-html _el-button)) @@ -1211,7 +1272,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "\" at the start of me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-button "click" nil) (assert= "42" (dom-inner-html _el-button)) @@ -1220,7 +1283,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "\" at the end of me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-button "click" nil) (assert= "42" (dom-inner-html _el-button)) @@ -1229,7 +1294,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click put "\" after me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-button "click" nil) (assert= "42" (dom-inner-html _el-button)) @@ -1238,7 +1305,9 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-add-class _el-div "divs") - ;; HS source contains quotes: on click put "red" into #a-bad-id-that-does-not-exist + (dom-set-attr _el-div "_" "on click put \"red\" into #a-bad-id-that-does-not-exist") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) )) (deftest "put null into attribute removes it" @@ -1249,26 +1318,26 @@ (dom-set-attr _el-d1 "foo" "bar") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveAttribute('foo', 'bar'); toHaveAttribute('foo') None None + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveAttribute('foo', 'bar'); toHaveAttribute('foo') )) (deftest "can put at start of an array" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :arr to [2,3] put 1 at start of :arr put :arr as String into me") + (dom-set-attr _el-div "_" "on click set :arr to [2,3] put 1 at start of :arr put :arr as String into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("1,2,3") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("1,2,3") )) (deftest "can put at end of an array" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :arr to [1,2] put 3 at end of :arr put :arr as String into me") + (dom-set-attr _el-div "_" "on click set :arr to [1,2] put 3 at end of :arr put :arr as String into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("1,2,3") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("1,2,3") )) ) @@ -1281,7 +1350,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.display == none + ;; SKIP computed style: div.display )) (deftest "hide element then show element retains original display" (hs-cleanup!) @@ -1292,7 +1361,7 @@ (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) (assert= "" (dom-get-style _el-div "display")) - ;; SKIP computed style: div.display == block + ;; SKIP computed style: div.display )) (deftest "can hide element with no target followed by command" (hs-cleanup!) @@ -1301,7 +1370,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.display == none + ;; SKIP computed style: div.display (assert (dom-has-class? _el-div "foo")) )) (deftest "can hide element with no target followed by then" @@ -1311,7 +1380,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.display == none + ;; SKIP computed style: div.display (assert (dom-has-class? _el-div "foo")) )) (deftest "can hide element with no target with a with" @@ -1321,7 +1390,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.display == none + ;; SKIP computed style: div.display (assert (dom-has-class? _el-div "foo")) )) (deftest "can hide element, with display:none by default" @@ -1331,7 +1400,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.display == none + ;; SKIP computed style: div.display )) (deftest "can hide element with display:none explicitly" (hs-cleanup!) @@ -1340,7 +1409,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.display == none + ;; SKIP computed style: div.display )) (deftest "can hide element with opacity:0" (hs-cleanup!) @@ -1349,7 +1418,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.opacity == 0 + ;; SKIP computed style: div.opacity )) (deftest "can hide element with opacity style literal" (hs-cleanup!) @@ -1358,7 +1427,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.opacity == 0 + ;; SKIP computed style: div.opacity )) (deftest "can hide element, with visibility:hidden" (hs-cleanup!) @@ -1367,7 +1436,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: div.visibility == hidden + ;; SKIP computed style: div.visibility )) (deftest "can hide other elements" (hs-cleanup!) @@ -1378,7 +1447,7 @@ (dom-append (dom-body) _el-div1) (hs-activate! _el-div1) (dom-dispatch _el-div "click" nil) - ;; SKIP computed style: hideme.display == none + ;; SKIP computed style: hideme.display )) (deftest "can hide with custom strategy" (hs-cleanup!) @@ -1386,7 +1455,7 @@ (dom-set-attr _el-div "_" "on click hide with myHide") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: classList.remove("foo") + ;; SKIP action: classList.remove__foo__ (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-div "foo")) )) @@ -1396,7 +1465,7 @@ (dom-set-attr _el-div "_" "on click hide") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: classList.remove("foo") + ;; SKIP action: classList.remove__foo__ (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-div "foo")) )) @@ -1407,8 +1476,8 @@ (dom-set-attr _el-trigger "_" "on click hide
in me when it matches .hideable") (dom-append (dom-body) _el-trigger) (hs-activate! _el-trigger) - ;; SKIP action: find('#trigger').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('display', 'none'); toHaveCSS('display', 'block') None None + ;; SKIP action: find___trigger__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('display', 'none'); toHaveCSS('display', 'block') )) ) @@ -1417,119 +1486,153 @@ (deftest "basic true branch works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if true put "foo" into me.innerHTML + (dom-set-attr _el-div "_" "on click if true put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic true branch works with multiple commands" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if true log me then + (dom-set-attr _el-div "_" "on click if true log me then put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic true branch works with end" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if true put "foo" into me.innerHTML end + (dom-set-attr _el-div "_" "on click if true put \"foo\" into me.innerHTML end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic true branch works with naked else" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if true put "foo" into me.innerHTML else + (dom-set-attr _el-div "_" "on click if true put \"foo\" into me.innerHTML else") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic true branch works with naked else end" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if true put "foo" into me.innerHTML else end + (dom-set-attr _el-div "_" "on click if true put \"foo\" into me.innerHTML else end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic else branch works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false else put "foo" into me.innerHTML + (dom-set-attr _el-div "_" "on click if false else put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic else branch works with end" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false else put "foo" into me.innerHTML end + (dom-set-attr _el-div "_" "on click if false else put \"foo\" into me.innerHTML end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic else if branch works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false else if true put "foo" into me.innerHTML + (dom-set-attr _el-div "_" "on click if false else if true put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic else if branch works with end" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false else if + (dom-set-attr _el-div "_" "on click if false else if true put \"foo\" into me.innerHTML end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "otherwise alias works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false otherwise put "foo" into me.innerHTML + (dom-set-attr _el-div "_" "on click if false otherwise put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "triple else if branch works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false else if false else put "foo" into me.inner + (dom-set-attr _el-div "_" "on click if false else if false else put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "triple else if branch works with end" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false else if + (dom-set-attr _el-div "_" "on click if false else if false else put \"foo\" into me.innerHTML end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "basic else branch works with multiple commands" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false put "bar" into me.innerHTML + (dom-set-attr _el-div "_" "on click if false put \"bar\" into me.innerHTML else log me then put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "true branch with a wait works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if true wait 10 ms then put "foo" into me.innerHTML + (dom-set-attr _el-div "_" "on click if true wait 10 ms then put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "false branch with a wait works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false else wait 10 ms then put "foo" into me.inn + (dom-set-attr _el-div "_" "on click if false else wait 10 ms then put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "if properly passes execution along if child is not executed" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click if false end put "foo" into me.innerHTML + (dom-set-attr _el-div "_" "on click if false end put \"foo\" into me.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "if properly supports nested if statements and end block" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click n if window.tmp thenn + (dom-set-attr _el-div "_" "on click n if window.tmp thenn put \"foo\" into men else if not window.tmp thenn // do nothingn endn catch en // just here for the parsing...n") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "d1"))) @@ -1537,7 +1640,9 @@ (deftest "if on new line does not join w/ else" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click n if window.tmp thenn + (dom-set-attr _el-div "_" "on click n if window.tmp thenn elsen if window.tmp then endn put \"foo\" into men endn") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "" (dom-inner-html (dom-query-by-id "d1"))) @@ -1638,14 +1743,18 @@ (deftest "index syntax works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click repeat for x in ["a", "ab", "abc"] index i + (dom-set-attr _el-div "_" "on click repeat for x in [\"a\", \"ab\", \"abc\"] index i put x + i at end of me end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "a0ab1abc2" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "indexed by syntax works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click repeat for x in ["a", "ab", "abc"] indexed by i + (dom-set-attr _el-div "_" "on click repeat for x in [\"a\", \"ab\", \"abc\"] indexed by i put x + i at end of me end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "a0ab1abc2" (dom-inner-html (dom-query-by-id "d1"))) )) @@ -1681,7 +1790,7 @@ (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip value.should.equal(42) None None + ;; SKIP check: skip value.should.equal(42) )) (deftest "only executes the init expression once" (hs-cleanup!) @@ -1694,7 +1803,7 @@ (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "3" (dom-inner-html (dom-query-by-id "d1"))) - ;; SKIP check: skip window.called.should.equal(1) None None + ;; SKIP check: skip window.called.should.equal(1) )) (deftest "can nest loops" (hs-cleanup!) @@ -1711,21 +1820,25 @@ (deftest "basic times loop works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click repeat 3 times p + (dom-set-attr _el-div "_" "on click repeat 3 times put \"a\" at end of me end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "aaa" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "times loop with expression works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click repeat 3 + 3 times + (dom-set-attr _el-div "_" "on click repeat 3 + 3 times put \"a\" at end of me end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) (assert= "aaaaaa" (dom-inner-html (dom-query-by-id "d1"))) )) (deftest "loop continue works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click repeat 2 times for x in ['A', 'B', 'C', 'D'] if (x != 'D') then put 'success ' + x + '. ' at end of me continue put 'FAIL!!. ' at end of me end put 'expected D. ' at end of me end end") + (dom-set-attr _el-div "_" "on click repeat 2 times for x in ['A', 'B', 'C', 'D'] if (x != 'D') then put 'success ' + x + '. ' at end of me continue put 'FAIL!!. ' at end of me end put 'expected D. ' at end of me end end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) @@ -1734,7 +1847,7 @@ (deftest "loop break works" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click repeat 2 times for x in ['A', 'B', 'C', 'D'] if x is 'C' break end put x at end of me end end") + (dom-set-attr _el-div "_" "on click repeat 2 times for x in ['A', 'B', 'C', 'D'] if x is 'C' break end put x at end of me end end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) @@ -1746,8 +1859,8 @@ (dom-set-attr _el-div "_" "on click for x in null put x at end of me end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("") )) (deftest "basic property for loop works" (hs-cleanup!) @@ -1755,8 +1868,8 @@ (dom-set-attr _el-div "_" "on click set x to {foo:1, bar:2, baz:3} for prop in x put x[prop] at end of me end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("123") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("123") )) (deftest "bottom-tested repeat until" (hs-cleanup!) @@ -1764,8 +1877,8 @@ (dom-set-attr _el-div "_" "on click set x to 0 repeat set x to until x is 3 end put x into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("3") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("3") )) (deftest "bottom-tested repeat while" (hs-cleanup!) @@ -1773,8 +1886,8 @@ (dom-set-attr _el-div "_" "on click set x to 0 repeat set x to while x < 3 end put x into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("3") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("3") )) (deftest "bottom-tested loop always runs at least once" (hs-cleanup!) @@ -1782,51 +1895,53 @@ (dom-set-attr _el-div "_" "on click set x to 0 repeat set x to until true end put x into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("1") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("1") )) (deftest "break exits a simple repeat loop" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set x to 0 repeat 10 times set x to x + 1 if x is 3 break end end put x into me") + (dom-set-attr _el-div "_" "on click set x to 0 repeat 10 times set x to x + 1 if x is 3 break end end put x into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("3") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("3") )) (deftest "continue skips rest of iteration in simple repeat loop" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click repeat for x in [1, 2, 3, 4, 5] if x is 3 continue end put x at end of me end") + (dom-set-attr _el-div "_" "on click repeat for x in [1, 2, 3, 4, 5] if x is 3 continue end put x at end of me end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("1245") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("1245") )) (deftest "break exits a for-in loop" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click repeat for x in [1, 2, 3, 4, 5] if x is 4 break end put x at end of me end") + (dom-set-attr _el-div "_" "on click repeat for x in [1, 2, 3, 4, 5] if x is 4 break end put x at end of me end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("123") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("123") )) (deftest "break exits a while loop" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set x to 0 repeat while x < 100 set x to x + 1 if x is 5 break end end put x into me") + (dom-set-attr _el-div "_" "on click set x to 0 repeat while x < 100 set x to x + 1 if x is 5 break end end put x into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("5") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("5") )) (deftest "for loop over undefined skips without error" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click repeat for x in doesNotExist put x at end of me end - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("done") None None + (dom-set-attr _el-div "_" "on click repeat for x in doesNotExist put x at end of me end then put \"done\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("done") )) ) @@ -2105,9 +2220,9 @@ (dom-dispatch (dom-query-by-id "d2") "click" nil) (assert= "bar" (dom-get-attr (dom-query-by-id "d1") "data-foo")) (assert= "" (dom-get-attr (dom-query-by-id "d2") "data-foo")) - ;; SKIP check: skip assert.isNull(d2.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d1.getAttribute("data-foo") None None + ;; 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") )) (deftest "can take an attribute with specific value from other elements" (hs-cleanup!) @@ -2124,9 +2239,9 @@ (dom-dispatch (dom-query-by-id "d2") "click" nil) (assert= "bar" (dom-get-attr (dom-query-by-id "d1") "data-foo")) (assert= "baz" (dom-get-attr (dom-query-by-id "d2") "data-foo")) - ;; SKIP check: skip assert.isNull(d2.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d1.getAttribute("data-foo") None None + ;; 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") )) (deftest "can take an attribute value from other elements and set specific values instead" (hs-cleanup!) @@ -2135,15 +2250,17 @@ (dom-set-attr _el-div "data-foo" "bar") (dom-append (dom-body) _el-div) (dom-add-class _el-div1 "div") - ;; HS source contains quotes: on click take @data-foo=baz with "qux" from .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-div2) (dom-dispatch (dom-query-by-id "d2") "click" nil) (assert= "qux" (dom-get-attr (dom-query-by-id "d1") "data-foo")) (assert= "baz" (dom-get-attr (dom-query-by-id "d2") "data-foo")) (assert= "qux" (dom-get-attr (dom-query-by-id "d3") "data-foo")) - ;; SKIP check: skip assert.isNull(d2.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") None None + ;; SKIP check: skip assert.isNull(d2.getAttribute("data-foo") + ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") )) (deftest "can take an attribute value from other elements and set value from an expression instead" (hs-cleanup!) @@ -2162,7 +2279,7 @@ (assert= "qux" (dom-get-attr (dom-query-by-id "d1") "data-foo")) (assert= "baz" (dom-get-attr (dom-query-by-id "d2") "data-foo")) (assert= "qux" (dom-get-attr (dom-query-by-id "d3") "data-foo")) - ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") None None + ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") )) (deftest "can take an attribute for other elements" (hs-cleanup!) @@ -2180,9 +2297,9 @@ (dom-dispatch (dom-query-by-id "d2") "click" nil) (assert= "bar" (dom-get-attr (dom-query-by-id "d1") "data-foo")) (assert= "" (dom-get-attr (dom-query-by-id "d3") "data-foo")) - ;; SKIP check: skip assert.isNull(d2.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d1.getAttribute("data-foo") None None + ;; 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") )) (deftest "a parent can take an attribute for other elements" (hs-cleanup!) @@ -2193,9 +2310,9 @@ (dom-dispatch (dom-query-by-id "d2") "click" nil) (assert= "bar" (dom-get-attr (dom-query-by-id "d1") "data-foo")) (assert= "" (dom-get-attr (dom-query-by-id "d2") "data-foo")) - ;; SKIP check: skip assert.isNull(d2.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d3.getAttribute("data-foo") None None - ;; SKIP check: skip assert.isNull(d1.getAttribute("data-foo") None None + ;; 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") )) (deftest "can take multiple classes from other elements" (hs-cleanup!) @@ -2336,7 +2453,7 @@ (deftest "can transition with a custom transition time" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) - ;; HS source contains quotes: on click transition element #foo width from 0px to 100px usi + ;; HS source has bare quotes — HTML parse artifact (dom-set-attr _el-foo "id" "foo") (dom-append (dom-body) _el-foo) (dom-dispatch _el-div "click" nil) @@ -2399,7 +2516,7 @@ (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") (dom-append (dom-body) _el-foo) - ;; SKIP check: skip toHaveCSS('width', '100px') None None + ;; SKIP check: skip toHaveCSS('width', '100px') )) (deftest "can transition on another element with possessive" (hs-cleanup!) @@ -2409,7 +2526,7 @@ (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") (dom-append (dom-body) _el-foo) - ;; SKIP check: skip toHaveCSS('width', '100px') None None + ;; SKIP check: skip toHaveCSS('width', '100px') )) (deftest "can transition on another element with it" (hs-cleanup!) @@ -2419,15 +2536,15 @@ (hs-activate! _el-div) (dom-set-attr _el-foo "id" "foo") (dom-append (dom-body) _el-foo) - ;; SKIP check: skip toHaveCSS('width', '100px') None None + ;; SKIP check: skip toHaveCSS('width', '100px') )) (deftest "can transition with a custom transition string" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-foo (dom-create-element "div"))) - ;; HS source contains quotes: on click transition #foo's *width from 0px to 100px using "w + ;; HS source has bare quotes — HTML parse artifact (dom-set-attr _el-foo "id" "foo") (dom-append (dom-body) _el-foo) - ;; SKIP check: skip toHaveCSS('width', '100px') None None + ;; SKIP check: skip toHaveCSS('width', '100px') )) (deftest "can transition a single property on form using style ref" (hs-cleanup!) @@ -2435,7 +2552,7 @@ (dom-set-attr _el-form "_" "on click transition *width from 0px to 100px") (dom-append (dom-body) _el-form) (hs-activate! _el-form) - ;; SKIP check: skip toHaveCSS('width', '100px'); toBe('0px') None None + ;; SKIP check: skip toHaveCSS('width', '100px'); toBe('0px') )) (deftest "can transition a single property on current element with the my prefix using style ref" (hs-cleanup!) @@ -2443,17 +2560,17 @@ (dom-set-attr _el-div "_" "on click transition my *width from 0px to 100px") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toHaveCSS('width', '100px'); toBe('0px') None None + ;; SKIP check: skip toHaveCSS('width', '100px'); toBe('0px') )) (deftest "can transition on query ref with possessive" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) (deftest "can transition on query ref with of syntax" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-span (dom-create-element "span"))) - ;; HS source contains quotes: "on + ;; HS source has bare quotes — HTML parse artifact (dom-append (dom-body) _el-span) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('width', '100px') None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('width', '100px') )) ) @@ -2499,16 +2616,20 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click call document.getElementById("d1") then + (dom-set-attr _el-d1 "_" "on click call document.getElementById(\"d1\") then put it into window.results") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) - ;; SKIP check: skip value.should.equal(d1) None None + ;; SKIP check: skip value.should.equal(d1) )) (deftest "can call global javascript functions" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click call globalFunction("foo") + (dom-set-attr _el-div "_" "on click call globalFunction(\"foo\")") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip "foo".should.equal(calledWith) None None + ;; SKIP check: skip "foo".should.equal(calledWith) )) (deftest "can call no argument functions" (hs-cleanup!) @@ -2517,7 +2638,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip called.should.equal(true) None None + ;; SKIP check: skip called.should.equal(true) )) (deftest "can call functions w/ underscores" (hs-cleanup!) @@ -2526,7 +2647,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip called.should.equal(true) None None + ;; SKIP check: skip called.should.equal(true) )) (deftest "can call functions w/ dollar signs" (hs-cleanup!) @@ -2535,7 +2656,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip called.should.equal(true) None None + ;; SKIP check: skip called.should.equal(true) )) (deftest "call functions that return promises are waited on" (hs-cleanup!) @@ -2544,8 +2665,8 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip div.innerText.should.equal("") None None - ;; SKIP check: skip div.innerText.should.equal("42") None None + ;; SKIP check: skip div.innerText.should.equal("") + ;; SKIP check: skip div.innerText.should.equal("42") )) ) @@ -2554,7 +2675,9 @@ (deftest "can do a simple fetch" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch "/test" then put it into my.innerHTML + (dom-set-attr _el-div "_" "on click fetch \"/test\" then put it into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "yay" (dom-inner-html _el-div)) )) @@ -2575,7 +2698,7 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "[object DocumentFragment]" (dom-inner-html _el-div)) - ;; SKIP check: skip div.dataset.count.should.equal("1") None None + ;; SKIP check: skip div.dataset.count.should.equal("1") )) (deftest "can do a simple fetch w/ json" (hs-cleanup!) @@ -2607,7 +2730,9 @@ (deftest "can do a simple fetch with a response object" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch /test as response then if its.ok put "yep" in + (dom-set-attr _el-div "_" "on click fetch /test as response then if its.ok put \"yep\" into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "yep" (dom-inner-html _el-div)) )) @@ -2623,42 +2748,54 @@ (deftest "can do a simple post" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch /test {method:"POST"} then put it into my.inn + (dom-set-attr _el-div "_" "on click fetch /test {method:\"POST\"} then put it into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "yay" (dom-inner-html _el-div)) )) (deftest "can do a simple post alt syntax without curlies" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch /test with method:"POST" then put it into my. + (dom-set-attr _el-div "_" "on click fetch /test with method:\"POST\" then put it into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "yay" (dom-inner-html _el-div)) )) (deftest "can do a simple post alt syntax w/ curlies" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch /test with {method:"POST"} then put it into m + (dom-set-attr _el-div "_" "on click fetch /test with {method:\"POST\"} then put it into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "yay" (dom-inner-html _el-div)) )) (deftest "can put response conversion after with" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch /test with {method:"POST"} as text then put i + (dom-set-attr _el-div "_" "on click fetch /test with {method:\"POST\"} as text then put it into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "yay" (dom-inner-html _el-div)) )) (deftest "can put response conversion before with" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch /test as text with {method:"POST"} then put i + (dom-set-attr _el-div "_" "on click fetch /test as text with {method:\"POST\"} then put it into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "yay" (dom-inner-html _el-div)) )) (deftest "triggers an event just before fetching" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch "/test" then put it into my.innerHTML end + (dom-set-attr _el-div "_" "on click fetch \"/test\" then put it into my.innerHTML end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert (dom-has-class? _el-div "foo-set")) (assert= "yay" (dom-inner-html _el-div)) @@ -2666,24 +2803,30 @@ (deftest "submits the fetch parameters to the event handler" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch "/test" {headers: {"X-CustomHeader": "foo"}} + (dom-set-attr _el-div "_" "on click fetch \"/test\" {headers: {\"X-CustomHeader\": \"foo\"}} then put it into my.innerHTML end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip event.detail.headers.should.have.property('X-CustomHeader', None None + ;; SKIP check: skip event.detail.headers.should.have.property('X-CustomHeader', (assert= "yay" (dom-inner-html _el-div)) )) (deftest "allows the event handler to change the fetch parameters" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch "/test" then put it into my.innerHTML end + (dom-set-attr _el-div "_" "on click fetch \"/test\" then put it into my.innerHTML end") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip arguments[1].should.have.property('headers') None None - ;; SKIP check: skip arguments[1].headers.should.have.property('X-CustomHeader', None None + ;; SKIP check: skip arguments[1].should.have.property('headers') + ;; SKIP check: skip arguments[1].headers.should.have.property('X-CustomHeader', (assert= "yay" (dom-inner-html _el-div)) )) (deftest "can catch an error that occurs when using fetch" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch /test catch e log e put "yay" into me + (dom-set-attr _el-div "_" "on click fetch /test catch e log e put \"yay\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= "yay" (dom-inner-html _el-div)) )) @@ -2693,15 +2836,17 @@ (dom-set-attr _el-div "_" "on click fetch /test as JSON then get result as JSONString then put it into my.innerHTML") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText('{"foo":1}') None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText('{"foo":1}') )) (deftest "throws on non-2xx response by default" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click fetch /test catch e put "caught" into me - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("caught") None None + (dom-set-attr _el-div "_" "on click fetch /test catch e put \"caught\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("caught") )) (deftest "do not throw passes through 404 response" (hs-cleanup!) @@ -2709,8 +2854,8 @@ (dom-set-attr _el-div "_" "on click fetch /test do not throw then put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("the body") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("the body") )) (deftest "don't throw passes through 404 response" (hs-cleanup!) @@ -2718,8 +2863,8 @@ (dom-set-attr _el-div "_" "on click fetch /test don't throw then put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("the body") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("the body") )) (deftest "as response does not throw on 404" (hs-cleanup!) @@ -2727,15 +2872,15 @@ (dom-set-attr _el-div "_" "on click fetch /test as response then put it.status into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("404") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("404") )) (deftest "Response can be converted to JSON via as JSON" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: "on - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("Joe") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("Joe") )) ) @@ -2902,8 +3047,8 @@ (dom-set-attr _el-div "_" "on click set arr to [10, 20, 30] then increment arr[1] then put arr[1] into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("21") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("21") )) (deftest "can decrement an array element" (hs-cleanup!) @@ -2911,8 +3056,8 @@ (dom-set-attr _el-div "_" "on click set arr to [10, 20, 30] then decrement arr[1] then put arr[1] into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("19") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("19") )) (deftest "can increment a possessive property" (hs-cleanup!) @@ -2921,8 +3066,8 @@ (dom-set-attr _el-d1 "_" "on click increment #d1's innerHTML") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("6") None None + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("6") )) (deftest "can increment a property of expression" (hs-cleanup!) @@ -2931,8 +3076,8 @@ (dom-set-attr _el-d1 "_" "on click increment innerHTML of #d1") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("6") None None + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("6") )) (deftest "can increment a style ref" (hs-cleanup!) @@ -2940,8 +3085,8 @@ (dom-set-attr _el-div "_" "on click set my *opacity to 0.5 then increment *opacity by 0.25 then put *opacity into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("0.75") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("0.75") )) ) @@ -3010,7 +3155,7 @@ (dom-append (dom-body) _el-id) (hs-activate! _el-id) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip div.id.should.equal("id_new") None None + ;; SKIP check: skip div.id.should.equal("id_new") )) (deftest "multiple appends work" (hs-cleanup!) @@ -3041,9 +3186,9 @@ (dom-dispatch (dom-query-by-id "btn") "click" nil) (dom-dispatch _el-div "click" nil) (dom-dispatch (dom-query-by-id "btn") "click" nil) - ;; SKIP check: skip clicks.should.equal(1) None None - ;; SKIP check: skip div.innerHTML.should.contain("New Content") None None - ;; SKIP check: skip btn.parentNode.should.equal(div) None None + ;; SKIP check: skip clicks.should.equal(1) + ;; SKIP check: skip div.innerHTML.should.contain("New Content") + ;; SKIP check: skip btn.parentNode.should.equal(div) )) (deftest "new content added by append will be live" (hs-cleanup!) @@ -3053,7 +3198,7 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch (dom-query-by-id "btn") "click" nil) - ;; SKIP check: skip window.temp.should.equal(1) None None + ;; SKIP check: skip window.temp.should.equal(1) )) (deftest "new DOM content added by append will be live" (hs-cleanup!) @@ -3067,11 +3212,11 @@ (deftest "can append a value to a set" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :s to [1,2] as Set append 3 to :s append 1 to :s put :s.size into me") + (dom-set-attr _el-div "_" "on click set :s to [1,2] as Set append 3 to :s append 1 to :s put :s.size into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("3") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("3") )) ) @@ -3177,9 +3322,9 @@ (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-d2) (dom-dispatch (dom-query-by-id "div1") "click" nil) - ;; SKIP check: skip div1.innerText.should.equal("") None None - ;; SKIP check: skip div2.innerText.should.equal("foo") None None - ;; SKIP check: skip div1.innerText.should.equal("foo") None None + ;; SKIP check: skip div1.innerText.should.equal("") + ;; SKIP check: skip div2.innerText.should.equal("foo") + ;; SKIP check: skip div1.innerText.should.equal("foo") )) (deftest "attributes refer to the thing being told" (hs-cleanup!) @@ -3192,9 +3337,9 @@ (dom-set-attr _el-d2 "foo" "bar") (dom-append (dom-body) _el-d2) (dom-dispatch (dom-query-by-id "div1") "click" nil) - ;; SKIP check: skip div1.innerText.should.equal("") None None - ;; SKIP check: skip div2.innerText.should.equal("") None None - ;; SKIP check: skip div1.innerText.should.equal("bar") None None + ;; SKIP check: skip div1.innerText.should.equal("") + ;; SKIP check: skip div2.innerText.should.equal("") + ;; SKIP check: skip div1.innerText.should.equal("bar") )) (deftest "yourself attribute also works" (hs-cleanup!) @@ -3249,9 +3394,13 @@ (deftest "can respond to events with minus in names" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-d1 (dom-create-element "div"))) - ;; HS source contains quotes: on click send "a-b" to #d1 + (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") - ;; HS source contains quotes: on "a-b" add .called + (dom-set-attr _el-d1 "_" "on \"a-b\" add .called") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "bar") "click" nil) (assert (dom-has-class? _el-div "called")) )) @@ -3271,7 +3420,7 @@ (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) - ;; HS source contains quotes: on click from #bar set #bar.innerHTML to #bar.innerHTML + "a + ;; HS source has bare quotes — HTML parse artifact (dom-dispatch (dom-query-by-id "bar") "click" nil) (dom-dispatch (dom-query-by-id "bar") "click" nil) (assert= "a" (dom-inner-html (dom-query-by-id "bar"))) @@ -3282,8 +3431,8 @@ (dom-set-attr _el-div "_" "on someCustomEvent put 1 into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: div.remove() - ;; SKIP action: div.dispatchEvent(new Event("someCustomEvent") + ;; SKIP action: div.remove__ + ;; SKIP action: div.dispatchEvent_new Event__someCustomE (assert= "1" (dom-inner-html _el-div)) )) (deftest "supports "elsewhere" modifier" @@ -3310,7 +3459,9 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div")) (_el-d2 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click send custom(foo:"fromBar") to #d2 + (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-d2) @@ -3336,8 +3487,10 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on load put "Loaded" into my.innerHTML - ;; SKIP check: skip div.innerText.should.equal("Loaded") None None + (dom-set-attr _el-d1 "_" "on load put \"Loaded\" into my.innerHTML") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) + ;; SKIP check: skip div.innerText.should.equal("Loaded") )) (deftest "can be in a top level script tag" (hs-cleanup!) @@ -3346,27 +3499,35 @@ (dom-append (dom-body) _el-script) (dom-set-attr _el-loadedDemo "id" "loadedDemo") (dom-append (dom-body) _el-loadedDemo) - ;; SKIP check: skip byId("loadedDemo").innerText.should.equal("Loaded") None None + ;; SKIP check: skip byId("loadedDemo").innerText.should.equal("Loaded") )) (deftest "can have a simple event filter" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click[false] log event then put "Clicked" into my.innerHT + (dom-set-attr _el-d1 "_" "on click[false] log event then put \"Clicked\" into my.innerHTML") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip byId("d1").innerText.should.equal("") None None + ;; SKIP check: skip byId("d1").innerText.should.equal("") )) (deftest "can refer to event properties directly in filter" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-div1 (dom-create-element "div")) (_el-div2 (dom-create-element "div"))) - ;; HS source contains quotes: on click[buttons==0] log event then put "Clicked" into my.in - ;; HS source contains quotes: on click[buttons==1] log event then put "Clicked" into my.in - ;; HS source contains quotes: on click[buttons==1 and buttons==0] log event then put "Clic + (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-div2) + (hs-activate! _el-div2) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip div.innerText.should.equal("Clicked") None None - ;; SKIP check: skip div.innerText.should.equal("") None None + ;; SKIP check: skip div.innerText.should.equal("Clicked") + ;; SKIP check: skip div.innerText.should.equal("") )) (deftest "can refer to event detail properties directly in filter" (hs-cleanup!) @@ -3374,20 +3535,22 @@ (dom-set-attr _el-div "_" "on example[foo] increment @count then put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: div.dispatchEvent(event) - ;; SKIP action: div.dispatchEvent(event) - ;; SKIP action: div.dispatchEvent(event) - ;; SKIP check: skip div.innerText.should.equal("1") None None - ;; SKIP check: skip div.innerText.should.equal("2") None None + ;; SKIP action: div.dispatchEvent_event_ + ;; SKIP action: div.dispatchEvent_event_ + ;; SKIP action: div.dispatchEvent_event_ + ;; SKIP check: skip div.innerText.should.equal("1") + ;; SKIP check: skip div.innerText.should.equal("2") )) (deftest "can click after a positive event filter" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on foo(bar)[bar] put "triggered" into my.innerHTML + (dom-set-attr _el-div "_" "on foo(bar)[bar] put \"triggered\" into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "foo" nil) (dom-dispatch _el-div "foo" nil) - ;; SKIP check: skip div.innerText.should.equal("") None None - ;; SKIP check: skip div.innerText.should.equal("triggered") None None + ;; SKIP check: skip div.innerText.should.equal("") + ;; SKIP check: skip div.innerText.should.equal("triggered") )) (deftest "multiple event handlers at a time are allowed to execute with the every keyword" (hs-cleanup!) @@ -3398,9 +3561,9 @@ (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip div.innerText.should.equal("1") None None - ;; SKIP check: skip div.innerText.should.equal("2") None None - ;; SKIP check: skip div.innerText.should.equal("3") None None + ;; SKIP check: skip div.innerText.should.equal("1") + ;; SKIP check: skip div.innerText.should.equal("2") + ;; SKIP check: skip div.innerText.should.equal("3") )) (deftest "can have multiple event handlers" (hs-cleanup!) @@ -3411,9 +3574,9 @@ (dom-dispatch _el-div "foo" nil) (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "foo" nil) - ;; SKIP check: skip div.innerText.should.equal("1") None None - ;; SKIP check: skip div.innerText.should.equal("2") None None - ;; SKIP check: skip div.innerText.should.equal("3") None None + ;; SKIP check: skip div.innerText.should.equal("1") + ;; SKIP check: skip div.innerText.should.equal("2") + ;; SKIP check: skip div.innerText.should.equal("3") )) (deftest "can have multiple event handlers, no end" (hs-cleanup!) @@ -3424,9 +3587,9 @@ (dom-dispatch _el-div "foo" nil) (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "foo" nil) - ;; SKIP check: skip div.innerText.should.equal("1") None None - ;; SKIP check: skip div.innerText.should.equal("2") None None - ;; SKIP check: skip div.innerText.should.equal("3") None None + ;; SKIP check: skip div.innerText.should.equal("1") + ;; SKIP check: skip div.innerText.should.equal("2") + ;; SKIP check: skip div.innerText.should.equal("3") )) (deftest "can queue events" (hs-cleanup!) @@ -3440,9 +3603,9 @@ (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "bar" nil) - ;; SKIP check: skip i.should.equal(0) None None - ;; SKIP check: skip i.should.equal(1) None None - ;; SKIP check: skip i.should.equal(2) None None + ;; SKIP check: skip i.should.equal(0) + ;; SKIP check: skip i.should.equal(1) + ;; SKIP check: skip i.should.equal(2) )) (deftest "can queue first event" (hs-cleanup!) @@ -3456,9 +3619,9 @@ (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "bar" nil) - ;; SKIP check: skip i.should.equal(0) None None - ;; SKIP check: skip i.should.equal(1) None None - ;; SKIP check: skip i.should.equal(2) None None + ;; SKIP check: skip i.should.equal(0) + ;; SKIP check: skip i.should.equal(1) + ;; SKIP check: skip i.should.equal(2) )) (deftest "can queue last event" (hs-cleanup!) @@ -3472,9 +3635,9 @@ (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "bar" nil) - ;; SKIP check: skip i.should.equal(0) None None - ;; SKIP check: skip i.should.equal(1) None None - ;; SKIP check: skip i.should.equal(2) None None + ;; SKIP check: skip i.should.equal(0) + ;; SKIP check: skip i.should.equal(1) + ;; SKIP check: skip i.should.equal(2) )) (deftest "can queue all events" (hs-cleanup!) @@ -3488,10 +3651,10 @@ (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "bar" nil) (dom-dispatch _el-div "bar" nil) - ;; SKIP check: skip i.should.equal(0) None None - ;; SKIP check: skip i.should.equal(1) None None - ;; SKIP check: skip i.should.equal(2) None None - ;; SKIP check: skip i.should.equal(3) None None + ;; SKIP check: skip i.should.equal(0) + ;; SKIP check: skip i.should.equal(1) + ;; SKIP check: skip i.should.equal(2) + ;; SKIP check: skip i.should.equal(3) )) (deftest "queue none does not allow future queued events" (hs-cleanup!) @@ -3503,8 +3666,8 @@ (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "customEvent" nil) (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip div.innerText.should.equal("1") None None - ;; SKIP check: skip div.innerText.should.equal("2") None None + ;; SKIP check: skip div.innerText.should.equal("1") + ;; SKIP check: skip div.innerText.should.equal("2") )) (deftest "can invoke on multiple events" (hs-cleanup!) @@ -3514,8 +3677,8 @@ (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "foo" nil) - ;; SKIP check: skip i.should.equal(1) None None - ;; SKIP check: skip i.should.equal(2) None None + ;; SKIP check: skip i.should.equal(1) + ;; SKIP check: skip i.should.equal(2) )) (deftest "can listen for events in another element (lazy)" (hs-cleanup!) @@ -3524,7 +3687,7 @@ (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "div1") "click" nil) - ;; SKIP check: skip div1.should.equal(window.tmp) None None + ;; SKIP check: skip div1.should.equal(window.tmp) )) (deftest "can filter events based on count" (hs-cleanup!) @@ -3562,7 +3725,9 @@ (deftest "can mix ranges" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click 1 put "one" into my.innerHTML + (dom-set-attr _el-div "_" "on click 1 put \"one\" into my.innerHTML on click 3 put \"three\" into my.innerHTML on click 2 put \"two\" into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) (dom-dispatch _el-div "click" nil) @@ -3572,63 +3737,81 @@ (deftest "can listen for general mutations" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation put "Mutated" into me then wait for hyperscript: + (dom-set-attr _el-div "_" "on mutation put \"Mutated\" into me then wait for hyperscript:mutation") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr _el-div "foo" "bar") (assert= "Mutated" (dom-inner-html _el-div)) )) (deftest "can listen for attribute mutations" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation of attributes put "Mutated" into me + (dom-set-attr _el-div "_" "on mutation of attributes put \"Mutated\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr _el-div "foo" "bar") (assert= "Mutated" (dom-inner-html _el-div)) )) (deftest "can listen for specific attribute mutations" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation of @foo put "Mutated" into me + (dom-set-attr _el-div "_" "on mutation of @foo put \"Mutated\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr _el-div "foo" "bar") (assert= "Mutated" (dom-inner-html _el-div)) )) (deftest "can listen for specific attribute mutations and filter out other attribute mutations" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation of @bar put "Mutated" into me + (dom-set-attr _el-div "_" "on mutation of @bar put \"Mutated\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr _el-div "foo" "bar") (assert= "" (dom-inner-html _el-div)) )) (deftest "can listen for childList mutations" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation of childList put "Mutated" into me then wait for + (dom-set-attr _el-div "_" "on mutation of childList put \"Mutated\" into me then wait for hyperscript:mutation") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-append _el-div (dom-create-element "P")) (assert= "Mutated" (dom-inner-html _el-div)) )) (deftest "can listen for childList mutation filter out other mutations" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation of childList put "Mutated" into me + (dom-set-attr _el-div "_" "on mutation of childList put \"Mutated\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr _el-div "foo" "bar") (assert= "" (dom-inner-html _el-div)) )) (deftest "can listen for characterData mutation filter out other mutations" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation of characterData put "Mutated" into me + (dom-set-attr _el-div "_" "on mutation of characterData put \"Mutated\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr _el-div "foo" "bar") (assert= "" (dom-inner-html _el-div)) )) (deftest "can listen for multiple mutations" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation of @foo or @bar put "Mutated" into me + (dom-set-attr _el-div "_" "on mutation of @foo or @bar put \"Mutated\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr _el-div "foo" "bar") (assert= "Mutated" (dom-inner-html _el-div)) )) (deftest "can listen for multiple mutations 2" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on mutation of @foo or @bar put "Mutated" into me + (dom-set-attr _el-div "_" "on mutation of @foo or @bar put \"Mutated\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr _el-div "bar" "bar") (assert= "Mutated" (dom-inner-html _el-div)) )) @@ -3637,7 +3820,9 @@ (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) - ;; HS source contains quotes: on mutation of attributes from #d1 put "Mutated" into me + (dom-set-attr _el-div "_" "on mutation of attributes from #d1 put \"Mutated\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) (dom-set-attr (dom-query-by-id "div1") "foo" "bar") (assert= "Mutated" (dom-inner-html (dom-query-by-id "div2"))) )) @@ -3685,21 +3870,27 @@ (deftest "can catch top-level exceptions" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click throw "bar" catch e put e into me + (dom-set-attr _el-button "_" "on click throw \"bar\" catch e put e into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "bar" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "can catch async top-level exceptions" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click wait 1ms then throw "bar" catch e put e into me + (dom-set-attr _el-button "_" "on click wait 1ms then throw \"bar\" catch e put e into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "bar" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "async exceptions don't kill the event queue" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click increment :x + (dom-set-attr _el-button "_" "on click increment :x if :x is 1 wait 1ms then throw \"bar\" otherwise put \"success\" into me end catch e put e into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "success" (dom-inner-html (dom-query-by-id "btn"))) @@ -3707,7 +3898,9 @@ (deftest "exceptions in catch block don't kill the event queue" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click increment :x + (dom-set-attr _el-button "_" "on click increment :x if :x is 1 throw \"bar\" otherwise put \"success\" into me end catch e put e into me then throw e") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "success" (dom-inner-html (dom-query-by-id "btn"))) @@ -3715,56 +3908,72 @@ (deftest "uncaught exceptions trigger 'exception' event" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click put "foo" into me then throw "bar" + (dom-set-attr _el-button "_" "on click put \"foo\" into me then throw \"bar\" on exception(error) put error into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "bar" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "caught exceptions do not trigger 'exception' event" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click put "foo" into me then throw "bar" + (dom-set-attr _el-button "_" "on click put \"foo\" into me then throw \"bar\" catch e log e on exception(error) put error into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "foo" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "rethrown exceptions trigger 'exception' event" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click put "foo" into me then throw "bar" + (dom-set-attr _el-button "_" "on click put \"foo\" into me then throw \"bar\" catch e throw e on exception(error) put error into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "bar" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "basic finally blocks work" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click throw "bar" finally put "bar" into me + (dom-set-attr _el-button "_" "on click throw \"bar\" finally put \"bar\" into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "bar" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "finally blocks work when exception thrown in catch" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click throw "bar" catch e throw e f + (dom-set-attr _el-button "_" "on click throw \"bar\" catch e throw e finally put \"bar\" into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "bar" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "async basic finally blocks work" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click wait a tick then throw "bar" finally pu + (dom-set-attr _el-button "_" "on click wait a tick then throw \"bar\" finally put \"bar\" into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "bar" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "async finally blocks work when exception thrown in catch" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click wait a tick then throw "bar" catch e set + (dom-set-attr _el-button "_" "on click wait a tick then throw \"bar\" catch e set :foo to \"foo\" then throw e finally put :foo + \"bar\" into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "foobar" (dom-inner-html (dom-query-by-id "btn"))) )) (deftest "async exceptions in finally block don't kill the event queue" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click increment :x f + (dom-set-attr _el-button "_" "on click increment :x finally if :x is 1 wait 1ms then throw \"bar\" otherwise put \"success\" into me end") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "success" (dom-inner-html (dom-query-by-id "btn"))) @@ -3772,7 +3981,9 @@ (deftest "exceptions in finally block don't kill the event queue" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click increment :x + (dom-set-attr _el-button "_" "on click increment :x finally if :x is 1 throw \"bar\" otherwise put \"success\" into me end") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-dispatch (dom-query-by-id "btn") "click" nil) (dom-dispatch (dom-query-by-id "btn") "click" nil) (assert= "success" (dom-inner-html (dom-query-by-id "btn"))) @@ -3781,7 +3992,9 @@ (hs-cleanup!) (let ((_el-#d1 (dom-create-element "div"))) (dom-set-attr _el-#d1 "id" "#d1") - ;; HS source contains quotes: on click from #doesntExist throw "bar" on click put "cl + (dom-set-attr _el-#d1 "_" "on click from #doesntExist throw \"bar\" on click put \"clicked\" into me") + (dom-append (dom-body) _el-#d1) + (hs-activate! _el-#d1) (dom-dispatch _el-div "click" nil) (assert= "clicked" (dom-inner-html _el-div)) )) @@ -3792,7 +4005,7 @@ (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 increment @count then put @count into me") + (dom-set-attr _el-div "_" "on click from #d1 or click from #d2 increment @count then put @count into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch (dom-query-by-id "d1") "click" nil) @@ -3803,9 +4016,11 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on myEvent(foo) if foo put foo into me else put "no-detail" - ;; SKIP action: evaluate({...}) - ;; SKIP check: skip toHaveText('no-detail') None None + (dom-set-attr _el-d1 "_" "on myEvent(foo) if foo put foo into me else put \"no-detail\" into me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) + ;; SKIP action: evaluate__...__ + ;; SKIP check: skip toHaveText('no-detail') )) (deftest "on first click fires only once" (hs-cleanup!) @@ -3813,30 +4028,36 @@ (dom-set-attr _el-div "_" "on first click put 1 + my.innerHTML as Int into my.innerHTML") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText('1'); toHaveText('1') None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText('1'); toHaveText('1') )) (deftest "caught exceptions do not trigger 'exception' event" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click put "foo" into me then throw "bar" - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveText('foo') None None + (dom-set-attr _el-button "_" "on click put \"foo\" into me then throw \"bar\" catch e log e on exception(error) put error into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText('foo') )) (deftest "rethrown exceptions trigger 'exception' event" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - ;; HS source contains quotes: on click put "foo" into me then throw "bar" - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveText('bar') None None + (dom-set-attr _el-button "_" "on click put \"foo\" into me then throw \"bar\" catch e throw e on exception(error) put error into me") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText('bar') )) (deftest "can ignore when target doesn\'t exist" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click from #doesntExist throw "bar" on click put "cl - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText('clicked') None None + (dom-set-attr _el-div "_" "on click from #doesntExist throw \"bar\" on click put \"clicked\" into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText('clicked') )) ) @@ -3856,14 +4077,14 @@ (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.foo.should.equal(42) None None + ;; SKIP check: skip window.foo.should.equal(42) )) (deftest "can initialize immediately" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.foo.should.equal(10) None None + ;; SKIP check: skip window.foo.should.equal(10) )) ) @@ -3887,7 +4108,9 @@ (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-append (dom-body) _el-script) - ;; HS source contains quotes: on click call foo("called") + (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-d1) (dom-dispatch (dom-query-by-id "bar") "click" nil) @@ -3943,8 +4166,8 @@ (dom-set-attr _el-d1 "id" "d1") (dom-append (dom-body) _el-d1) (dom-dispatch (dom-query-by-id "bar") "click" nil) - ;; SKIP check: skip div.innerText.should.equal("") None None - ;; SKIP check: skip div.innerText.should.equal("foo") None None + ;; SKIP check: skip div.innerText.should.equal("") + ;; SKIP check: skip div.innerText.should.equal("foo") )) (deftest "can exit" (hs-cleanup!) @@ -3963,72 +4186,72 @@ (dom-set-attr _el-d1 "id" "d1") (dom-append (dom-body) _el-d1) (dom-dispatch (dom-query-by-id "bar") "click" nil) - ;; SKIP check: skip div.innerText.should.equal("") None None - ;; SKIP check: skip div.innerText.should.equal("foo") None None + ;; SKIP check: skip div.innerText.should.equal("") + ;; SKIP check: skip div.innerText.should.equal("foo") )) (deftest "can interop with javascript" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip foo().should.equal("foo") None None + ;; SKIP check: skip foo().should.equal("foo") )) (deftest "can interop with javascript asynchronously" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip val.should.equal("foo") None None + ;; SKIP check: skip val.should.equal("foo") )) (deftest "can catch exceptions" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.bar.should.equal("bar") None None + ;; SKIP check: skip window.bar.should.equal("bar") )) (deftest "can rethrow in catch blocks" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip true.should.equal(false) None None - ;; SKIP check: skip e.should.equal("bar") None None + ;; SKIP check: skip true.should.equal(false) + ;; SKIP check: skip e.should.equal("bar") )) (deftest "can return in catch blocks" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip foo().should.equal(42) None None + ;; SKIP check: skip foo().should.equal(42) )) (deftest "can catch async exceptions" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.bar.should.equal("bar") None None + ;; SKIP check: skip window.bar.should.equal("bar") )) (deftest "can catch nested async exceptions" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.bar.should.equal("bar") None None + ;; SKIP check: skip window.bar.should.equal("bar") )) (deftest "can rethrow in async catch blocks" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip reason.should.equal("bar") None None + ;; SKIP check: skip reason.should.equal("bar") )) (deftest "can return in async catch blocks" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip val.should.equal(42) None None + ;; SKIP check: skip val.should.equal(42) )) (deftest "can install a function on an element and use in children w/ no leak" (hs-cleanup!) @@ -4036,7 +4259,7 @@ (dom-set-attr _el-div "_" "def func() put 42 into #d3") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip byId("d3").innerText.should.equal("42") None None + ;; 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!) @@ -4044,7 +4267,7 @@ (dom-set-attr _el-div "_" "def func() return 42") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip byId("d1").innerText.should.equal("42") None None + ;; SKIP check: skip byId("d1").innerText.should.equal("42") )) (deftest "can install a function on an element and use me symbol correctly" (hs-cleanup!) @@ -4052,42 +4275,42 @@ (dom-set-attr _el-div "_" "def func() put 42 into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip div.innerText.should.equal("42") None None + ;; SKIP check: skip div.innerText.should.equal("42") )) (deftest "finally blocks run normally" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.bar.should.equal(20) None None + ;; SKIP check: skip window.bar.should.equal(20) )) (deftest "finally blocks run when an exception occurs" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.bar.should.equal(20) None None + ;; SKIP check: skip window.bar.should.equal(20) )) (deftest "finally blocks run when an exception expr occurs" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.bar.should.equal(20) None None + ;; SKIP check: skip window.bar.should.equal(20) )) (deftest "async finally blocks run normally" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.bar.should.equal(20) None None + ;; SKIP check: skip window.bar.should.equal(20) )) (deftest "async finally blocks run when an exception occurs" (hs-cleanup!) (let ((_el-script (dom-create-element "script"))) (dom-set-attr _el-script "type" "text/hyperscript") (dom-append (dom-body) _el-script) - ;; SKIP check: skip window.bar.should.equal(20) None None + ;; SKIP check: skip window.bar.should.equal(20) )) (deftest "exit stops execution mid-function" (hs-cleanup!) @@ -4108,47 +4331,57 @@ (deftest "prompts and puts result in it" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - ;; HS source contains quotes: on click ask "What is your name?" then put it into #out + (dom-set-attr _el-button "_" "on click ask \"What is your name?\" then put it into #out") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("Alice") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("Alice") )) (deftest "returns null on cancel" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - ;; HS source contains quotes: on click ask "Name?" then put it into #out + (dom-set-attr _el-button "_" "on click ask \"Name?\" then put it into #out") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("null") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("null") )) (deftest "shows an alert" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - ;; HS source contains quotes: on click answer "Hello!" then put "done" into #out + (dom-set-attr _el-button "_" "on click answer \"Hello!\" then put \"done\" into #out") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("done"); toBe("Hello!") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("done"); toBe("Hello!") )) (deftest "confirm returns first choice on OK" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - ;; HS source contains quotes: on click answer "Save?" with "Yes" or "No" then put it into + (dom-set-attr _el-button "_" "on click answer \"Save?\" with \"Yes\" or \"No\" then put it into #out") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("Yes") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("Yes") )) (deftest "confirm returns second choice on cancel" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - ;; HS source contains quotes: on click answer "Save?" with "Yes" or "No" then put it into + (dom-set-attr _el-button "_" "on click answer \"Save?\" with \"Yes\" or \"No\" then put it into #out") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("No") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("No") )) ) @@ -4162,24 +4395,24 @@ (dom-set-attr _el-button "_" "on click show #d") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') )) (deftest "hide closes a dialog" (hs-cleanup!) (let ((_el-d (dom-create-element "dialog"))) (dom-set-attr _el-d "id" "d") (dom-append (dom-body) _el-d) - ;; SKIP action: find('#close').click() - ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') None None + ;; SKIP action: find___close__.click__ + ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') )) (deftest "show on already-open dialog is a no-op" (hs-cleanup!) (let ((_el-d (dom-create-element "dialog"))) (dom-set-attr _el-d "id" "d") (dom-append (dom-body) _el-d) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') )) (deftest "open opens a dialog" (hs-cleanup!) @@ -4189,16 +4422,16 @@ (dom-set-attr _el-button "_" "on click open #d") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') )) (deftest "close closes a dialog" (hs-cleanup!) (let ((_el-d (dom-create-element "dialog"))) (dom-set-attr _el-d "id" "d") (dom-append (dom-body) _el-d) - ;; SKIP action: find('#close').click() - ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') None None + ;; SKIP action: find___close__.click__ + ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') )) (deftest "open opens a details element" (hs-cleanup!) @@ -4208,8 +4441,8 @@ (dom-set-attr _el-button "_" "on click open #d") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') )) (deftest "close closes a details element" (hs-cleanup!) @@ -4219,8 +4452,8 @@ (dom-set-attr _el-button "_" "on click close #d") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveAttribute('open'); toHaveAttribute('open') )) (deftest "open shows a popover" (hs-cleanup!) @@ -4230,16 +4463,16 @@ (dom-set-attr _el-button "_" "on click open #p") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toBe(true) None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toBe(true) )) (deftest "close hides a popover" (hs-cleanup!) (let ((_el-p (dom-create-element "div"))) (dom-set-attr _el-p "id" "p") (dom-append (dom-body) _el-p) - ;; SKIP action: find('#close').click() - ;; SKIP check: skip toBe(false) None None + ;; SKIP action: find___close__.click__ + ;; SKIP check: skip toBe(false) )) (deftest "open on implicit me" (hs-cleanup!) @@ -4251,8 +4484,8 @@ (dom-set-attr _el-button "_" "on click send myOpen to #d") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveAttribute('open') None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveAttribute('open') )) ) @@ -4266,8 +4499,8 @@ (dom-set-attr _el-button "_" "on click empty #d1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveText("helloworld"); toHaveText("") None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("helloworld"); toHaveText("") )) (deftest "empty with no target empties me" (hs-cleanup!) @@ -4275,8 +4508,8 @@ (dom-set-attr _el-div "_" "on click empty") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("content"); toHaveText("") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("content"); toHaveText("") )) (deftest "can empty multiple elements" (hs-cleanup!) @@ -4288,34 +4521,34 @@ (dom-set-attr _el-button "_" "on click empty .clearme") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') + ;; SKIP action: find__button__.dispatchEvent__click__ )) (deftest "can empty an array" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :arr to [1,2,3] empty :arr put :arr.length into me") + (dom-set-attr _el-div "_" "on click set :arr to [1,2,3] empty :arr put :arr.length into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("0") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("0") )) (deftest "can empty a set" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :s to [1,2,3] as Set empty :s put :s.size into me") + (dom-set-attr _el-div "_" "on click set :s to [1,2,3] as Set empty :s put :s.size into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("0") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("0") )) (deftest "can empty a map" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click set :m to {a:1, b:2} as Map empty :m put :m.size into me") + (dom-set-attr _el-div "_" "on click set :m to {a:1, b:2} as Map empty :m put :m.size into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("0") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("0") )) (deftest "can empty a text input" (hs-cleanup!) @@ -4327,8 +4560,8 @@ (dom-set-attr _el-button "_" "on click empty #t1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveValue("hello"); toHaveValue("") None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveValue("hello"); toHaveValue("") )) (deftest "can empty a textarea" (hs-cleanup!) @@ -4338,8 +4571,8 @@ (dom-set-attr _el-button "_" "on click empty #ta1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveValue("") None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveValue("") )) (deftest "can empty a checkbox" (hs-cleanup!) @@ -4350,7 +4583,7 @@ (dom-set-attr _el-button "_" "on click empty #cb1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') + ;; SKIP action: find__button__.dispatchEvent__click__ )) (deftest "can empty a select" (hs-cleanup!) @@ -4360,8 +4593,8 @@ (dom-set-attr _el-button "_" "on click empty #sel1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toBe(-1) None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toBe(-1) )) (deftest "can empty a form (clears all inputs)" (hs-cleanup!) @@ -4371,8 +4604,8 @@ (dom-set-attr _el-button "_" "on click empty #f1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveValue(""); toHaveValue("") None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveValue(""); toHaveValue("") )) (deftest "clear is an alias for empty" (hs-cleanup!) @@ -4384,8 +4617,8 @@ (dom-set-attr _el-button "_" "on click clear #t3") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveValue("hello"); toHaveValue("") None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveValue("hello"); toHaveValue("") )) (deftest "clear works on elements" (hs-cleanup!) @@ -4395,8 +4628,8 @@ (dom-set-attr _el-button "_" "on click clear #d2") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveText("content"); toHaveText("") None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("content"); toHaveText("") )) ) @@ -4410,8 +4643,8 @@ (dom-set-attr _el-button "_" "on click focus #i1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toBe("i1") None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toBe("i1") )) (deftest "focus with no target focuses me" (hs-cleanup!) @@ -4420,8 +4653,8 @@ (dom-set-attr _el-i1 "_" "on click focus") (dom-append (dom-body) _el-i1) (hs-activate! _el-i1) - ;; SKIP action: find('#i1').dispatchEvent('click') - ;; SKIP check: skip toBe("i1") None None + ;; SKIP action: find___i1__.dispatchEvent__click__ + ;; SKIP check: skip toBe("i1") )) (deftest "can blur an element" (hs-cleanup!) @@ -4430,8 +4663,8 @@ (dom-set-attr _el-i1 "_" "on focus wait 10ms then blur me") (dom-append (dom-body) _el-i1) (hs-activate! _el-i1) - ;; SKIP action: find('#i1').focus() - ;; SKIP check: skip toBe("BODY") None None + ;; SKIP action: find___i1__.focus__ + ;; SKIP check: skip toBe("BODY") )) ) @@ -4440,7 +4673,7 @@ (deftest "can parse go to with string URL" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click go to "#test-hash" + ;; HS source has bare quotes — HTML parse artifact )) (deftest "deprecated url keyword still parses" (hs-cleanup!) @@ -4466,7 +4699,7 @@ (dom-set-attr _el-div2 "_" "on click go to #target") (dom-append (dom-body) _el-div2) (hs-activate! _el-div2) - ;; SKIP check: skip toBe(true) None None + ;; SKIP check: skip toBe(true) )) (deftest "deprecated scroll form still works" (hs-cleanup!) @@ -4478,7 +4711,7 @@ (dom-set-attr _el-div2 "_" "on click go to the top of #target") (dom-append (dom-body) _el-div2) (hs-activate! _el-div2) - ;; SKIP check: skip toBe(true) None None + ;; SKIP check: skip toBe(true) )) ) @@ -4491,8 +4724,8 @@ (dom-set-attr _el-outer "_" "on click add .outer-clicked") (dom-append (dom-body) _el-outer) (hs-activate! _el-outer) - ;; SKIP action: find('#inner').dispatchEvent('click') - ;; SKIP check: skip toHaveClass(/outer-clicked/) None None + ;; SKIP action: find___inner__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass(/outer-clicked/) )) (deftest "halt stops execution after the halt" (hs-cleanup!) @@ -4500,8 +4733,8 @@ (dom-set-attr _el-div "_" "on click halt then add .should-not-happen") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveClass(/should-not-happen/) None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass(/should-not-happen/) )) (deftest "halt the event stops propagation but continues execution" (hs-cleanup!) @@ -4510,8 +4743,8 @@ (dom-set-attr _el-outer "_" "on click add .outer-clicked") (dom-append (dom-body) _el-outer) (hs-activate! _el-outer) - ;; SKIP action: find('#inner').dispatchEvent('click') - ;; SKIP check: skip toHaveClass(/outer-clicked/); toHaveClass(/continued/) None None + ;; SKIP action: find___inner__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass(/outer-clicked/); toHaveClass(/continued/) )) (deftest "halt the event's stops propagation but continues execution" (hs-cleanup!) @@ -4520,8 +4753,8 @@ (dom-set-attr _el-outer "_" "on click add .outer-clicked") (dom-append (dom-body) _el-outer) (hs-activate! _el-outer) - ;; SKIP action: find('#inner').dispatchEvent('click') - ;; SKIP check: skip toHaveClass(/outer-clicked/); toHaveClass(/continued/) None None + ;; SKIP action: find___inner__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass(/outer-clicked/); toHaveClass(/continued/) )) (deftest "halt bubbling only stops propagation, not default" (hs-cleanup!) @@ -4530,8 +4763,8 @@ (dom-set-attr _el-outer "_" "on click add .outer-clicked") (dom-append (dom-body) _el-outer) (hs-activate! _el-outer) - ;; SKIP action: find('#inner').dispatchEvent('click') - ;; SKIP check: skip toHaveClass(/outer-clicked/); toHaveClass(/continued/) None None + ;; SKIP action: find___inner__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass(/outer-clicked/); toHaveClass(/continued/) )) (deftest "halt works outside of event context" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -4542,8 +4775,8 @@ (dom-set-attr _el-outer "_" "on click add .outer-clicked") (dom-append (dom-body) _el-outer) (hs-activate! _el-outer) - ;; SKIP action: find('#inner').dispatchEvent('click') - ;; SKIP check: skip toHaveClass(/outer-clicked/) None None + ;; SKIP action: find___inner__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass(/outer-clicked/) )) ) @@ -4554,9 +4787,9 @@ (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) - ;; HS source contains quotes: on click morph #target to "
new
" - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveText("new") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("new") )) (deftest "morph preserves element identity" (hs-cleanup!) @@ -4564,9 +4797,9 @@ (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) (dom-set-attr _el-go "id" "go") - ;; HS source contains quotes: on click morph #target to "
new
" - ;; SKIP action: find('#go').dispatchEvent('click') - ;; SKIP check: skip toHaveText("new"); toBe(true) None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___go__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("new"); toBe(true) )) (deftest "morph updates attributes" (hs-cleanup!) @@ -4574,9 +4807,9 @@ (dom-set-attr _el-target "id" "target") (dom-add-class _el-target "old") (dom-append (dom-body) _el-target) - ;; HS source contains quotes: on click morph #target to "
content< - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveClass("new") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveClass("new") )) (deftest "morph adds new children" (hs-cleanup!) @@ -4584,9 +4817,9 @@ (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) (dom-set-attr _el-target1 "id" "target") - ;; HS source contains quotes: "on - ;; SKIP action: find('#go').dispatchEvent('click') - ;; SKIP check: skip toBe(2) None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___go__.dispatchEvent__click__ + ;; SKIP check: skip toBe(2) )) (deftest "morph removes old children" (hs-cleanup!) @@ -4594,9 +4827,9 @@ (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) (dom-set-attr _el-target1 "id" "target") - ;; HS source contains quotes: "on - ;; SKIP action: find('#go').dispatchEvent('click') - ;; SKIP check: skip toBe(1) None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___go__.dispatchEvent__click__ + ;; SKIP check: skip toBe(1) )) (deftest "morph initializes hyperscript on new elements" (hs-cleanup!) @@ -4604,27 +4837,27 @@ (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) (dom-set-attr _el-target1 "id" "target") - ;; HS source contains quotes: "on - ;; SKIP action: find('#go').dispatchEvent('click') - ;; SKIP action: find('#inner').dispatchEvent('click') - ;; SKIP check: skip toHaveText("new"); toHaveText("clicked") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___go__.dispatchEvent__click__ + ;; SKIP action: find___inner__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("new"); toHaveText("clicked") )) (deftest "morph cleans up removed hyperscript elements" (hs-cleanup!) (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) - ;; HS source contains quotes: on click morph #target to "

replaced

B2
- ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toEqual(["b", "a"]) None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toEqual(["b", "a"]) )) (deftest "morph preserves matched child identity" (hs-cleanup!) @@ -4632,9 +4865,9 @@ (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) (dom-set-attr _el-go "id" "go") - ;; HS source contains quotes: on click morph #target to "
new< - ;; SKIP action: find('#go').dispatchEvent('click') - ;; SKIP check: skip toBe(true); toBe("new") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___go__.dispatchEvent__click__ + ;; SKIP check: skip toBe(true); toBe("new") )) (deftest "morph with variable content" (hs-cleanup!) @@ -4642,9 +4875,11 @@ (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) (dom-set-attr _el-go "id" "go") - ;; HS source contains quotes: on click set content to "
morphed
" then - ;; SKIP action: find('#go').dispatchEvent('click') - ;; SKIP check: skip toHaveText("morphed") None None + (dom-set-attr _el-go "_" "on click set content to \"
morphed
\" then morph #target to content") + (dom-append (dom-body) _el-go) + (hs-activate! _el-go) + ;; SKIP action: find___go__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("morphed") )) ) @@ -4655,9 +4890,9 @@ (let ((_el-f1 (dom-create-element "form"))) (dom-set-attr _el-f1 "id" "f1") (dom-append (dom-body) _el-f1) - ;; SKIP action: find('#t1').fill('changed') - ;; SKIP action: find('#rst').dispatchEvent('click') - ;; SKIP check: skip toHaveValue('changed'); toHaveValue('original') None None + ;; SKIP action: find___t1__.fill__changed__ + ;; SKIP action: find___rst__.dispatchEvent__click__ + ;; SKIP check: skip toHaveValue('changed'); toHaveValue('original') )) (deftest "reset with no target resets me (form)" (hs-cleanup!) @@ -4665,9 +4900,9 @@ (dom-set-attr _el-form "_" "on custom reset") (dom-append (dom-body) _el-form) (hs-activate! _el-form) - ;; SKIP action: find('#t2').fill('modified') - ;; SKIP action: find('form').dispatchEvent('custom') - ;; SKIP check: skip toHaveValue('modified'); toHaveValue('default') None None + ;; SKIP action: find___t2__.fill__modified__ + ;; SKIP action: find__form__.dispatchEvent__custom__ + ;; SKIP check: skip toHaveValue('modified'); toHaveValue('default') )) (deftest "can reset a text input to defaultValue" (hs-cleanup!) @@ -4679,9 +4914,9 @@ (dom-set-attr _el-button "_" "on click reset #t3") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('#t3').fill('goodbye') - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveValue('goodbye'); toHaveValue('hello') None None + ;; SKIP action: find___t3__.fill__goodbye__ + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveValue('goodbye'); toHaveValue('hello') )) (deftest "can reset a checkbox" (hs-cleanup!) @@ -4692,7 +4927,7 @@ (dom-set-attr _el-button "_" "on click reset #cb1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') + ;; SKIP action: find__button__.dispatchEvent__click__ )) (deftest "can reset an unchecked checkbox" (hs-cleanup!) @@ -4703,7 +4938,7 @@ (dom-set-attr _el-button "_" "on click reset #cb2") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') + ;; SKIP action: find__button__.dispatchEvent__click__ )) (deftest "can reset a textarea" (hs-cleanup!) @@ -4713,9 +4948,9 @@ (dom-set-attr _el-button "_" "on click reset #ta1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('#ta1').fill('new text') - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveValue('new text'); toHaveValue('original text') None None + ;; SKIP action: find___ta1__.fill__new text__ + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveValue('new text'); toHaveValue('original text') )) (deftest "can reset a select" (hs-cleanup!) @@ -4725,8 +4960,8 @@ (dom-set-attr _el-button "_" "on click reset #sel1") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveValue('c'); toHaveValue('b') None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveValue('c'); toHaveValue('b') )) (deftest "can reset multiple inputs" (hs-cleanup!) @@ -4742,7 +4977,7 @@ (dom-set-attr _el-button "_" "on click reset .resettable") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') + ;; SKIP action: find__button__.dispatchEvent__click__ )) ) @@ -4758,7 +4993,7 @@ (dom-set-attr _el-div2 "_" "on click scroll to #target") (dom-append (dom-body) _el-div2) (hs-activate! _el-div2) - ;; SKIP check: skip toBe(true) None None + ;; SKIP check: skip toBe(true) )) (deftest "can scroll to top of element" (hs-cleanup!) @@ -4771,7 +5006,7 @@ (dom-set-attr _el-div2 "_" "on click scroll to the top of #target") (dom-append (dom-body) _el-div2) (hs-activate! _el-div2) - ;; SKIP check: skip toBe(true) None None + ;; SKIP check: skip toBe(true) )) (deftest "can scroll down by amount" (hs-cleanup!) @@ -4810,7 +5045,7 @@ (dom-set-attr _el-go "_" "on click scroll #box down by 200px") (dom-append (dom-body) _el-go) (hs-activate! _el-go) - ;; SKIP action: find('#go').dispatchEvent('click') + ;; SKIP action: find___go__.dispatchEvent__click__ )) (deftest "can scroll to element in container" (hs-cleanup!) @@ -4822,7 +5057,7 @@ (dom-set-attr _el-go "_" "on click scroll to #item in #box") (dom-append (dom-body) _el-go) (hs-activate! _el-go) - ;; SKIP action: find('#go').dispatchEvent('click') + ;; SKIP action: find___go__.dispatchEvent__click__ )) (deftest "can scroll left by amount" (hs-cleanup!) @@ -4834,7 +5069,7 @@ (dom-set-attr _el-go "_" "on click scroll #box right by 300px") (dom-append (dom-body) _el-go) (hs-activate! _el-go) - ;; SKIP action: find('#go').dispatchEvent('click') + ;; SKIP action: find___go__.dispatchEvent__click__ )) ) @@ -4849,8 +5084,8 @@ (dom-set-attr _el-button "_" "on click select #inp") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toBe("hello world") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toBe("hello world") )) (deftest "selects text in a textarea" (hs-cleanup!) @@ -4860,8 +5095,8 @@ (dom-set-attr _el-button "_" "on click select #ta") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toBe("some text") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toBe("some text") )) (deftest "selects implicit me" (hs-cleanup!) @@ -4871,8 +5106,8 @@ (dom-set-attr _el-inp "value" "test") (dom-append (dom-body) _el-inp) (hs-activate! _el-inp) - ;; SKIP action: find('#inp').click() - ;; SKIP check: skip toBe("test") None None + ;; SKIP action: find___inp__.click__ + ;; SKIP check: skip toBe("test") )) (deftest "returns selected text" (hs-cleanup!) @@ -4884,8 +5119,8 @@ (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("Hello") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("Hello") )) ) @@ -4895,21 +5130,25 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click set x to "a" then set y to "b" then swap x with y t - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("ba") None None + (dom-set-attr _el-d1 "_" "on click set x to \"a\" then set y to \"b\" then swap x with y then put x + y into me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("ba") )) (deftest "can swap two properties" (hs-cleanup!) (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") - ;; HS source contains quotes: on click set #a.textContent to "hello" then set #b.textConte + (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-append (dom-body) _el-a) (dom-set-attr _el-b "id" "b") (dom-append (dom-body) _el-b) - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("world"); toHaveText("hello") None None + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("world"); toHaveText("hello") )) (deftest "can swap array elements" (hs-cleanup!) @@ -4918,19 +5157,21 @@ (dom-set-attr _el-d1 "_" "on click set arr to [1,2,3] then swap arr[0] with arr[2] then put arr as String into me") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("3,2,1") None None + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("3,2,1") )) (deftest "can swap a variable with a property" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div")) (_el-target (dom-create-element "span"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click set x to "old" then set #target.dataset.val to "new + (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-target) - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("new"); toHaveAttribute('data-val', 'old') None None + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("new"); toHaveAttribute('data-val', 'old') )) ) @@ -4943,12 +5184,12 @@ (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 when $name changes put it into me") + (dom-set-attr _el-span "_" "bind $name and #name-input.value end when $name changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: evaluate({...}) - ;; SKIP action: await run("set $name to ' - ;; SKIP check: skip toHaveText('Alice'); toHaveText('Bob') None None + ;; SKIP action: evaluate__...__ + ;; SKIP action: await run__set _name to _ + ;; SKIP check: skip toHaveText('Alice'); toHaveText('Bob') )) (deftest "syncs variable and attribute in both directions" (hs-cleanup!) @@ -4956,9 +5197,9 @@ (dom-set-attr _el-div "_" "bind $theme and @data-theme") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $theme to ' - ;; SKIP action: await run("set $theme to ' - ;; SKIP check: skip toHaveAttribute('data-theme', 'light'); toHaveAttribute('dat None None + ;; SKIP action: await run__set _theme to _ + ;; SKIP action: await run__set _theme to _ + ;; SKIP check: skip toHaveAttribute('data-theme', 'light'); toHaveAttribute('dat )) (deftest "dedup prevents infinite loop in two-way bind" (hs-cleanup!) @@ -4966,9 +5207,9 @@ (dom-set-attr _el-div "_" "bind $color and @data-color") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $color to ' - ;; SKIP action: await run("set $color to ' - ;; SKIP check: skip toHaveAttribute('data-color', 'red'); toHaveAttribute('data- None None + ;; SKIP action: await run__set _color to _ + ;; SKIP action: await run__set _color to _ + ;; SKIP check: skip toHaveAttribute('data-color', 'red'); toHaveAttribute('data- )) (deftest ""with" is a synonym for "and"" (hs-cleanup!) @@ -4977,23 +5218,23 @@ (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 when $city changes put it into me") + (dom-set-attr _el-span "_" "bind $city to #city-input.value end when $city changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: await run("set $city to ' - ;; SKIP check: skip toHaveText('Paris') None None + ;; SKIP action: await run__set _city to _ + ;; SKIP check: skip toHaveText('Paris') )) (deftest "shorthand on text input binds to value" (hs-cleanup!) (let ((_el-input (dom-create-element "input")) (_el-span (dom-create-element "span"))) - (dom-set-attr _el-input "_" "bind $greeting to me end when $greeting changes put it into next ") + (dom-set-attr _el-input "_" "bind $greeting to me end when $greeting changes put it into next ") (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) - ;; SKIP action: find('input').fill('goodbye') - ;; SKIP action: await run("set $greeting to ' + ;; SKIP action: find__input__.fill__goodbye__ + ;; SKIP action: await run__set _greeting to _ )) (deftest "shorthand on checkbox binds to checked" (hs-cleanup!) @@ -5005,8 +5246,8 @@ (dom-set-attr _el-span "_" "when $isDarkMode changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: await run("set $isDarkMode to false" - ;; SKIP action: await run("set $isDarkMode to false" + ;; SKIP action: await run__set _isDarkMode to false_ + ;; SKIP action: await run__set _isDarkMode to false_ )) (deftest "shorthand on textarea binds to value" (hs-cleanup!) @@ -5017,7 +5258,7 @@ (dom-set-attr _el-span "_" "when $bio changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: find('textarea').fill('New bio') + ;; SKIP action: find__textarea__.fill__New bio__ )) (deftest "shorthand on select binds to value" (hs-cleanup!) @@ -5041,8 +5282,8 @@ (dom-set-attr _el-span "_" "when $price changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: await run("set $price to 42" - ;; SKIP check: skip toHaveText('42') None None + ;; SKIP action: await run__set _price to 42_ + ;; SKIP check: skip toHaveText('42') )) (deftest "boolean bind to attribute uses presence/absence" (hs-cleanup!) @@ -5050,9 +5291,9 @@ (dom-set-attr _el-div "_" "bind $isEnabled and @data-active") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $isEnabled to true" - ;; SKIP action: await run("set $isEnabled to false" - ;; SKIP check: skip toHaveAttribute('data-active', '') None None + ;; SKIP action: await run__set _isEnabled to true_ + ;; SKIP action: await run__set _isEnabled to false_ + ;; SKIP check: skip toHaveAttribute('data-active', '') )) (deftest "boolean bind to aria-* attribute uses "true"/"false" strings" (hs-cleanup!) @@ -5060,9 +5301,9 @@ (dom-set-attr _el-div "_" "bind $isHidden and @aria-hidden") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $isHidden to true" - ;; SKIP action: await run("set $isHidden to false" - ;; SKIP check: skip toHaveAttribute('aria-hidden', 'true'); toHaveAttribute('ari None None + ;; SKIP action: await run__set _isHidden to true_ + ;; SKIP action: await run__set _isHidden to false_ + ;; SKIP check: skip toHaveAttribute('aria-hidden', 'true'); toHaveAttribute('ari )) (deftest "style bind is one-way: variable drives style, not vice versa" (hs-cleanup!) @@ -5070,8 +5311,8 @@ (dom-set-attr _el-div "_" "bind $opacity and *opacity") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $opacity to 1" - ;; SKIP action: await run("set $opacity to 0.3" + ;; SKIP action: await run__set _opacity to 1_ + ;; SKIP action: await run__set _opacity to 0.3_ )) (deftest "same value does not re-set input (prevents cursor jump)" (hs-cleanup!) @@ -5081,7 +5322,7 @@ (dom-set-attr _el-input "value" "hello") (dom-append (dom-body) _el-input) (hs-activate! _el-input) - ;; SKIP check: skip toBe(false) None None + ;; SKIP check: skip toBe(false) )) (deftest "external JS property write does not sync (known limitation)" (hs-cleanup!) @@ -5094,7 +5335,7 @@ (dom-set-attr _el-span "_" "when $searchTerm changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: evaluate({...}) + ;; SKIP action: evaluate__...__ )) (deftest "form.reset() syncs variable back to default value" (hs-cleanup!) @@ -5104,7 +5345,7 @@ (dom-set-attr _el-span "_" "when $formField changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: find('input').fill('user typed this') + ;; SKIP action: find__input__.fill__user typed this__ )) (deftest "clicking a radio sets the variable to its value" (hs-cleanup!) @@ -5130,9 +5371,9 @@ (dom-set-attr _el-span "_" "when $color changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: find('input[value="blue"]').click() - ;; SKIP action: find('input[value="green"]').click() - ;; SKIP action: await run("set $color to ' + ;; SKIP action: find__input_value=_blue____.click__ + ;; SKIP action: find__input_value=_green____.click__ + ;; SKIP action: await run__set _color to _ )) (deftest "setting variable programmatically checks the matching radio" (hs-cleanup!) @@ -5155,8 +5396,8 @@ (dom-set-attr _el-input2 "value" "large") (dom-append (dom-body) _el-input2) (hs-activate! _el-input2) - ;; SKIP action: await run("set $size to ' - ;; SKIP action: await run("set $size to ' + ;; SKIP action: await run__set _size to _ + ;; SKIP action: await run__set _size to _ )) (deftest "initial value checks the correct radio on load" (hs-cleanup!) @@ -5179,7 +5420,7 @@ (dom-set-attr _el-input2 "value" "cherry") (dom-append (dom-body) _el-input2) (hs-activate! _el-input2) - ;; SKIP action: await run("set $fruit to ' + ;; SKIP action: await run__set _fruit to _ )) (deftest "variable drives class: setting variable adds/removes class" (hs-cleanup!) @@ -5187,10 +5428,10 @@ (dom-set-attr _el-div "_" "bind .dark and $darkMode") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $darkMode to false" - ;; SKIP action: await run("set $darkMode to true" - ;; SKIP action: await run("set $darkMode to false" - ;; SKIP check: skip toHaveClass('dark') None None + ;; SKIP action: await run__set _darkMode to false_ + ;; SKIP action: await run__set _darkMode to true_ + ;; SKIP action: await run__set _darkMode to false_ + ;; SKIP check: skip toHaveClass('dark') )) (deftest "external class change syncs back to variable" (hs-cleanup!) @@ -5198,7 +5439,7 @@ (dom-set-attr _el-div "_" "bind .dark and $darkMode") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $darkMode to false" + ;; SKIP action: await run__set _darkMode to false_ )) (deftest "right side wins on class init" (hs-cleanup!) @@ -5206,8 +5447,8 @@ (dom-set-attr _el-div "_" "bind .highlight to $highlighted") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $highlighted to true" - ;; SKIP check: skip toHaveClass('highlight') None None + ;; SKIP action: await run__set _highlighted to true_ + ;; SKIP check: skip toHaveClass('highlight') )) (deftest "init: right side wins — input value (Y) overwrites variable (X)" (hs-cleanup!) @@ -5217,7 +5458,7 @@ (dom-set-attr _el-input "value" "Bob") (dom-append (dom-body) _el-input) (hs-activate! _el-input) - ;; SKIP action: await run("set $name to ' + ;; SKIP action: await run__set _name to _ )) (deftest "init: right side wins — variable (Y) overwrites input value (X)" (hs-cleanup!) @@ -5227,7 +5468,7 @@ (dom-set-attr _el-input "value" "Bob") (dom-append (dom-body) _el-input) (hs-activate! _el-input) - ;; SKIP action: await run("set $name to ' + ;; SKIP action: await run__set _name to _ )) (deftest "init: right side wins — attribute (Y) initializes variable (X)" (hs-cleanup!) @@ -5243,8 +5484,8 @@ (dom-set-attr _el-div "_" "bind @data-theme to $theme") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $theme to ' - ;; SKIP check: skip toHaveAttribute('data-theme', 'dark') None None + ;; SKIP action: await run__set _theme to _ + ;; SKIP check: skip toHaveAttribute('data-theme', 'dark') )) (deftest "init: right side wins — variable (Y) drives class (X)" (hs-cleanup!) @@ -5252,7 +5493,7 @@ (dom-set-attr _el-div "_" "bind .dark to $isDark") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $isDark to true" + ;; SKIP action: await run__set _isDark to true_ )) (deftest "init: right side wins — class (Y) drives variable (X)" (hs-cleanup!) @@ -5261,7 +5502,7 @@ (dom-set-attr _el-div "_" "bind $isDark to .dark") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $isDark to false" + ;; SKIP action: await run__set _isDark to false_ )) (deftest "possessive property: bind $var to my value" (hs-cleanup!) @@ -5271,7 +5512,7 @@ (dom-set-attr _el-input "value" "hello") (dom-append (dom-body) _el-input) (hs-activate! _el-input) - ;; SKIP action: find('input').fill('world') + ;; SKIP action: find__input__.fill__world__ )) (deftest "possessive attribute: bind $var and my @data-label" (hs-cleanup!) @@ -5279,9 +5520,9 @@ (dom-set-attr _el-div "_" "bind $label and my @data-label") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $label to ' - ;; SKIP action: await run("set $label to ' - ;; SKIP check: skip toHaveAttribute('data-label', 'important') None None + ;; SKIP action: await run__set _label to _ + ;; SKIP action: await run__set _label to _ + ;; SKIP check: skip toHaveAttribute('data-label', 'important') )) (deftest "of-expression: bind $var to value of #input" (hs-cleanup!) @@ -5303,7 +5544,7 @@ (dom-set-attr _el-div "_" "bind .dark and #dark-toggle's checked") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toHaveClass('dark') None None + ;; SKIP check: skip toHaveClass('dark') )) (deftest "attribute bound to another element input value" (hs-cleanup!) @@ -5315,7 +5556,7 @@ (dom-set-attr _el-h1 "_" "bind @data-title and #title-input's value") (dom-append (dom-body) _el-h1) (hs-activate! _el-h1) - ;; SKIP action: find('#title-input').fill('World') + ;; SKIP action: find___title-input__.fill__World__ )) (deftest "two inputs synced via bind" (hs-cleanup!) @@ -5328,7 +5569,7 @@ (dom-set-attr _el-input "type" "number") (dom-append (dom-body) _el-input) (hs-activate! _el-input) - ;; SKIP action: evaluate({...}) + ;; SKIP action: evaluate__...__ )) (deftest "bind variable to element by id auto-detects value" (hs-cleanup!) @@ -5340,8 +5581,8 @@ (dom-set-attr _el-div "_" "bind $name to #name-field") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: evaluate({...}) - ;; SKIP action: await run("set $name to ' + ;; SKIP action: evaluate__...__ + ;; SKIP action: await run__set _name to _ )) (deftest "bind variable to checkbox by id auto-detects checked" (hs-cleanup!) @@ -5352,8 +5593,8 @@ (dom-set-attr _el-div "_" "bind $agreed to #agree-cb") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $agreed to false" - ;; SKIP action: await run("set $agreed to true" + ;; SKIP action: await run__set _agreed to false_ + ;; SKIP action: await run__set _agreed to true_ )) (deftest "bind variable to number input by id auto-detects valueAsNumber" (hs-cleanup!) @@ -5364,7 +5605,7 @@ (dom-set-attr _el-div "_" "bind $qty to #qty-input") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $qty to 5" + ;; SKIP action: await run__set _qty to 5_ )) (deftest "bind element to element: both sides auto-detect" (hs-cleanup!) @@ -5377,7 +5618,7 @@ (dom-set-attr _el-input "type" "number") (dom-append (dom-body) _el-input) (hs-activate! _el-input) - ;; SKIP action: evaluate({...}) + ;; SKIP action: evaluate__...__ )) (deftest "right side wins on init: variable (Y) initializes input (X)" (hs-cleanup!) @@ -5387,7 +5628,7 @@ (dom-set-attr _el-input "value" "Bob") (dom-append (dom-body) _el-input) (hs-activate! _el-input) - ;; SKIP action: await run("set $name to ' + ;; SKIP action: await run__set _name to _ )) (deftest "right side wins on init: input (Y) initializes variable (X)" (hs-cleanup!) @@ -5405,7 +5646,7 @@ (dom-set-attr _el-div "contenteditable" "true") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $text to ' + ;; SKIP action: await run__set _text to _ )) (deftest "bind to custom element with value property auto-detects value" (hs-cleanup!) @@ -5413,8 +5654,8 @@ (dom-set-attr _el-test-input "_" "bind $custom to me") (dom-append (dom-body) _el-test-input) (hs-activate! _el-test-input) - ;; SKIP action: evaluate({...}) - ;; SKIP action: await run("set $custom to ' + ;; SKIP action: evaluate__...__ + ;; SKIP action: await run__set _custom to _ )) (deftest "radio change listener is removed on cleanup" (hs-cleanup!) @@ -5431,20 +5672,20 @@ (dom-set-attr _el-input1 "value" "blue") (dom-append (dom-body) _el-input1) (hs-activate! _el-input1) - ;; SKIP action: evaluate({...}) - ;; SKIP action: evaluate({...}) - ;; SKIP action: await run("set $color to ' - ;; SKIP action: await run("$color" - ;; SKIP check: skip toBe('red') None None + ;; SKIP action: evaluate__...__ + ;; SKIP action: evaluate__...__ + ;; SKIP action: await run__set _color to _ + ;; SKIP action: await run___color_ + ;; SKIP check: skip toBe('red') )) (deftest "form reset listener is removed on cleanup" (hs-cleanup!) (let ((_el-form (dom-create-element "form"))) (dom-append (dom-body) _el-form) - ;; SKIP action: await run("set $val to ' - ;; SKIP action: await run("set $val to ' - ;; SKIP action: await run("$val" - ;; SKIP check: skip toBe('changed') None None + ;; SKIP action: await run__set _val to _ + ;; SKIP action: await run__set _val to _ + ;; SKIP action: await run___val_ + ;; SKIP check: skip toBe('changed') )) ) @@ -5453,13 +5694,13 @@ (deftest "derives a variable from a computed expression" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "live set $total to ($price * $qty) end when $total changes put it into me") + (dom-set-attr _el-div "_" "live set $total to ($price * $qty) end when $total changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $price to 10" - ;; SKIP action: await run("set $qty to 3" - ;; SKIP action: await run("set $price to 25" - ;; SKIP check: skip toHaveText('30') None None + ;; SKIP action: await run__set _price to 10_ + ;; SKIP action: await run__set _qty to 3_ + ;; SKIP action: await run__set _price to 25_ + ;; SKIP check: skip toHaveText('30') )) (deftest "updates DOM text reactively with put" (hs-cleanup!) @@ -5467,8 +5708,8 @@ (dom-set-attr _el-div "_" "live put 'hello ' + $greeting into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $greeting to ' - ;; SKIP action: await run("set $greeting to ' + ;; SKIP action: await run__set _greeting to _ + ;; SKIP action: await run__set _greeting to _ )) (deftest "sets an attribute reactively" (hs-cleanup!) @@ -5476,9 +5717,9 @@ (dom-set-attr _el-div "_" "live set my @data-theme to $theme") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $theme to ' - ;; SKIP action: await run("set $theme to ' - ;; SKIP check: skip toHaveAttribute('data-theme', 'light') None None + ;; SKIP action: await run__set _theme to _ + ;; SKIP action: await run__set _theme to _ + ;; SKIP check: skip toHaveAttribute('data-theme', 'light') )) (deftest "sets a style reactively" (hs-cleanup!) @@ -5486,8 +5727,8 @@ (dom-set-attr _el-div "_" "live set *opacity to $opacity") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $opacity to 1" - ;; SKIP action: await run("set $opacity to 0.5" + ;; SKIP action: await run__set _opacity to 1_ + ;; SKIP action: await run__set _opacity to 0.5_ )) (deftest "puts a computed dollar amount into the DOM" (hs-cleanup!) @@ -5495,9 +5736,9 @@ (dom-set-attr _el-div "_" "live put '$' + ($price * $qty) into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $price to 10" - ;; SKIP action: await run("set $qty to 2" - ;; SKIP action: await run("set $qty to 5" + ;; SKIP action: await run__set _price to 10_ + ;; SKIP action: await run__set _qty to 2_ + ;; SKIP action: await run__set _qty to 5_ )) (deftest "block form re-runs all commands when any dependency changes" (hs-cleanup!) @@ -5510,13 +5751,13 @@ (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) set $doubleHeight to ($height * 2) end") + (dom-set-attr _el-div "_" "live set $doubleWidth to ($width * 2) set $doubleHeight to ($height * 2) end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $width to 100" - ;; SKIP action: await run("set $height to 200" - ;; SKIP action: await run("set $height to 300" - ;; SKIP check: skip toHaveText('200') None None + ;; SKIP action: await run__set _width to 100_ + ;; SKIP action: await run__set _height to 200_ + ;; SKIP action: await run__set _height to 300_ + ;; SKIP check: skip toHaveText('200') )) (deftest "separate live statements create independent effects" (hs-cleanup!) @@ -5529,46 +5770,46 @@ (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 live set $doubleHeight to ($height * 2)") + (dom-set-attr _el-div "_" "live set $doubleWidth to ($width * 2) end live set $doubleHeight to ($height * 2)") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $width to 100" - ;; SKIP action: await run("set $height to 200" - ;; SKIP action: await run("set $height to 300" - ;; SKIP check: skip toHaveText('200') None None + ;; SKIP action: await run__set _width to 100_ + ;; SKIP action: await run__set _height to 200_ + ;; SKIP action: await run__set _height to 300_ + ;; SKIP check: skip toHaveText('200') )) (deftest "block form cascades inter-dependent commands" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "live set $subtotal to ($price * $qty) set $total to ($subtotal + $tax) end when $total changes put it into me") + (dom-set-attr _el-div "_" "live set $subtotal to ($price * $qty) set $total to ($subtotal + $tax) end when $total changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $price to 10" - ;; SKIP action: await run("set $qty to 3" - ;; SKIP action: await run("set $tax to 5" - ;; SKIP action: await run("set $price to 20" - ;; SKIP action: await run("set $tax to 10" + ;; SKIP action: await run__set _price to 10_ + ;; SKIP action: await run__set _qty to 3_ + ;; SKIP action: await run__set _tax to 5_ + ;; SKIP action: await run__set _price to 20_ + ;; SKIP action: await run__set _tax to 10_ )) (deftest "toggles a class based on a boolean variable" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "live if $isActive add .active to me else remove .active from me end end") + (dom-set-attr _el-div "_" "live if $isActive add .active to me else remove .active from me end end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $isActive to false" - ;; SKIP action: await run("set $isActive to true" - ;; SKIP action: await run("set $isActive to false" - ;; SKIP check: skip toHaveClass('active') None None + ;; SKIP action: await run__set _isActive to false_ + ;; SKIP action: await run__set _isActive to true_ + ;; SKIP action: await run__set _isActive to false_ + ;; SKIP check: skip toHaveClass('active') )) (deftest "toggles display style based on a boolean variable" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "live if $isVisible set *display to 'block' else set *display to 'none' end end") + (dom-set-attr _el-div "_" "live if $isVisible set *display to 'block' else set *display to 'none' end end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $isVisible to true" - ;; SKIP action: await run("set $isVisible to false" - ;; SKIP action: await run("set $isVisible to true" + ;; SKIP action: await run__set _isVisible to true_ + ;; SKIP action: await run__set _isVisible to false_ + ;; SKIP action: await run__set _isVisible to true_ )) (deftest "effects stop when element is removed from DOM" (hs-cleanup!) @@ -5576,47 +5817,47 @@ (dom-set-attr _el-div "_" "live put $message into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $message to ' - ;; SKIP action: await run("set $message to ' + ;; SKIP action: await run__set _message to _ + ;; SKIP action: await run__set _message to _ )) (deftest "conditional branch only tracks the active dependency" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "live if $showFirst put $firstName into me else put $lastName into me end end") + (dom-set-attr _el-div "_" "live if $showFirst put $firstName into me else put $lastName into me end end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $showFirst to true" - ;; SKIP action: await run("set $firstName to ' - ;; SKIP action: await run("set $lastName to ' - ;; SKIP action: await run("set $firstName to ' - ;; SKIP action: await run("set $lastName to ' - ;; SKIP check: skip toHaveText('Bob'); toHaveText('Jones') None None + ;; SKIP action: await run__set _showFirst to true_ + ;; SKIP action: await run__set _firstName to _ + ;; SKIP action: await run__set _lastName to _ + ;; SKIP action: await run__set _firstName to _ + ;; SKIP action: await run__set _lastName to _ + ;; SKIP check: skip toHaveText('Bob'); toHaveText('Jones') )) (deftest "multiple live on same element work independently" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "live set my @data-name to $firstName end live set my @data-age to $age") + (dom-set-attr _el-div "_" "live set my @data-name to $firstName end live set my @data-age to $age") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $firstName to ' - ;; SKIP action: await run("set $age to 30" - ;; SKIP action: await run("set $firstName to ' - ;; SKIP check: skip toHaveAttribute('data-name', 'Alice'); toHaveAttribute('data None None + ;; SKIP action: await run__set _firstName to _ + ;; SKIP action: await run__set _age to 30_ + ;; SKIP action: await run__set _firstName to _ + ;; SKIP check: skip toHaveAttribute('data-name', 'Alice'); toHaveAttribute('data )) (deftest "live and when on same element do not interfere" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "live set my @data-status to $status end when $status changes put 'Status: ' + it into me") + (dom-set-attr _el-div "_" "live set my @data-status to $status end when $status changes put 'Status: ' + it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $status to ' - ;; SKIP action: await run("set $status to ' - ;; SKIP check: skip toHaveAttribute('data-status', 'online'); toHaveText('Status None None + ;; SKIP action: await run__set _status to _ + ;; SKIP action: await run__set _status to _ + ;; SKIP check: skip toHaveAttribute('data-status', 'online'); toHaveText('Status )) (deftest "bind and live on same element do not interfere" (hs-cleanup!) (let ((_el-input (dom-create-element "input")) (_el-span (dom-create-element "span"))) - (dom-set-attr _el-input "_" "bind $username to me end live set my @data-mirror to $username") + (dom-set-attr _el-input "_" "bind $username to me end 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) @@ -5624,8 +5865,8 @@ (dom-set-attr _el-span "_" "when $username changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: find('input').fill('bob') - ;; SKIP action: await run("set $username to ' + ;; SKIP action: find__input__.fill__bob__ + ;; SKIP action: await run__set _username to _ )) (deftest "reactive effects are stopped on cleanup" (hs-cleanup!) @@ -5634,9 +5875,9 @@ (dom-set-attr _el-d1 "_" "live put $count into me") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) - ;; SKIP action: await run("set $count to 0" - ;; SKIP action: await run("set $count to 99" - ;; SKIP check: skip toHaveText('cleaned') None None + ;; SKIP action: await run__set _count to 0_ + ;; SKIP action: await run__set _count to 99_ + ;; SKIP check: skip toHaveText('cleaned') )) (deftest "append triggers live block" (hs-cleanup!) @@ -5644,8 +5885,8 @@ (dom-set-attr _el-div "_" "live put $items.join(', ') into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $items to [' - ;; SKIP action: await run("append ' + ;; SKIP action: await run__set _items to __ + ;; SKIP action: await run__append _ )) (deftest "push via pseudo-command triggers live block" (hs-cleanup!) @@ -5653,8 +5894,8 @@ (dom-set-attr _el-div "_" "live put $items.join(', ') into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $items to [' - ;; SKIP action: await run("$items.push(' + ;; SKIP action: await run__set _items to __ + ;; SKIP action: await run___items.push__ )) (deftest "push via call triggers live block" (hs-cleanup!) @@ -5662,8 +5903,8 @@ (dom-set-attr _el-div "_" "live put $items.join(', ') into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $items to [' - ;; SKIP action: await run("call $items.push(' + ;; SKIP action: await run__set _items to __ + ;; SKIP action: await run__call _items.push__ )) (deftest "array + still works with live" (hs-cleanup!) @@ -5671,8 +5912,8 @@ (dom-set-attr _el-div "_" "live put $items.join(', ') into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $items to [' - ;; SKIP action: await run("set $items to $items + [' + ;; SKIP action: await run__set _items to __ + ;; SKIP action: await run__set _items to _items + __ )) (deftest "set property still works with live" (hs-cleanup!) @@ -5680,8 +5921,8 @@ (dom-set-attr _el-div "_" "live put $obj.name into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $obj to {name: ' - ;; SKIP action: await run("set $obj.name to ' + ;; SKIP action: await run__set _obj to _name: _ + ;; SKIP action: await run__set _obj.name to _ )) (deftest "property change on object in array triggers live re-render" (hs-cleanup!) @@ -5691,8 +5932,8 @@ (dom-set-attr _el-div "_" "live render #people-tmpl with people: $people then put it into my.innerHTML end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $people to [{name: ' - ;; SKIP action: await run("set $people[0].name to ' + ;; SKIP action: await run__set _people to __name: _ + ;; SKIP action: await run__set _people_0_.name to _ )) (deftest "push object then modify its property both trigger live" (hs-cleanup!) @@ -5702,9 +5943,9 @@ (dom-set-attr _el-div "_" "live render #items-tmpl with items: $items then put it into my.innerHTML end") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $items to [{label: ' - ;; SKIP action: await run("call $items.push({label: ' - ;; SKIP action: await run("set $items[1].label to ' + ;; SKIP action: await run__set _items to __label: _ + ;; SKIP action: await run__call _items.push__label: _ + ;; SKIP action: await run__set _items_1_.label to _ )) ) @@ -5716,9 +5957,9 @@ (dom-set-attr _el-output "_" "when ($obj's x + $obj's y) changes put it into me") (dom-append (dom-body) _el-output) (hs-activate! _el-output) - ;; SKIP action: await run("set $obj to {x: 1, y: 2}" - ;; SKIP action: await run("set $obj' - ;; SKIP check: skip toHaveText('3') None None + ;; SKIP action: await run__set _obj to _x: 1_ y: 2__ + ;; SKIP action: await run__set _obj_ + ;; SKIP check: skip toHaveText('3') )) (deftest "nested property chain triggers on intermediate reassignment" (hs-cleanup!) @@ -5726,9 +5967,9 @@ (dom-set-attr _el-output "_" "when $data's inner's val changes put it into me") (dom-append (dom-body) _el-output) (hs-activate! _el-output) - ;; SKIP action: await run("set $data to {inner: {val: ' - ;; SKIP action: await run("set $data' - ;; SKIP check: skip toHaveText('hello') None None + ;; SKIP action: await run__set _data to _inner: _val: _ + ;; SKIP action: await run__set _data_ + ;; SKIP check: skip toHaveText('hello') )) (deftest "property change on DOM element triggers reactivity via setProperty" (hs-cleanup!) @@ -5740,8 +5981,8 @@ (dom-set-attr _el-output "_" "when #prop-input's value changes put it into me") (dom-append (dom-body) _el-output) (hs-activate! _el-output) - ;; SKIP action: await run("set #prop-input' - ;; SKIP check: skip toHaveText('start') None None + ;; SKIP action: await run__set _prop-input_ + ;; SKIP check: skip toHaveText('start') )) (deftest "live block tracks property reads on plain objects" (hs-cleanup!) @@ -5749,8 +5990,8 @@ (dom-set-attr _el-output "_" "live put $config's label into me") (dom-append (dom-body) _el-output) (hs-activate! _el-output) - ;; SKIP action: await run("set $config to {label: ' - ;; SKIP action: await run("set $config' + ;; SKIP action: await run__set _config to _label: _ + ;; SKIP action: await run__set _config_ )) ) @@ -5766,7 +6007,7 @@ (hs-activate! _el-box) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP check: skip toHaveText("200") None None + ;; SKIP check: skip toHaveText("200") )) (deftest "provides height in detail" (hs-cleanup!) @@ -5778,7 +6019,7 @@ (hs-activate! _el-box) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP check: skip toHaveText("300") None None + ;; SKIP check: skip toHaveText("300") )) (deftest "works with from clause" (hs-cleanup!) @@ -5790,7 +6031,7 @@ (dom-set-attr _el-out "_" "on resize from #box put detail.width into me") (dom-append (dom-body) _el-out) (hs-activate! _el-out) - ;; SKIP check: skip toHaveText("150") None None + ;; SKIP check: skip toHaveText("150") )) ) @@ -5802,10 +6043,10 @@ (dom-set-attr _el-div "_" "when $global changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $global to ' - ;; SKIP action: await run("set $global to ' - ;; SKIP action: await run("set $global to 42" - ;; SKIP check: skip toHaveText('initial'); toHaveText('hello world'); toHaveText None None + ;; SKIP action: await run__set _global to _ + ;; SKIP action: await run__set _global to _ + ;; SKIP action: await run__set _global to 42_ + ;; SKIP check: skip toHaveText('initial'); toHaveText('hello world'); toHaveText )) (deftest "detects changes from $global variable" (hs-cleanup!) @@ -5813,18 +6054,18 @@ (dom-set-attr _el-div "_" "when $global changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $global to ' - ;; SKIP check: skip toHaveText('Changed!') None None + ;; SKIP action: await run__set _global to _ + ;; SKIP check: skip toHaveText('Changed!') )) (deftest "detects changes from :element variable" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "init set :count to 0 end when :count changes put it into me end on click increment :count") + (dom-set-attr _el-div "_" "init set :count to 0 end when :count changes put it into me end on click increment :count") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').click() - ;; SKIP action: find('div').click() - ;; SKIP check: skip toHaveText('0'); toHaveText('1'); toHaveText('2') None None + ;; SKIP action: find__div__.click__ + ;; SKIP action: find__div__.click__ + ;; SKIP check: skip toHaveText('0'); toHaveText('1'); toHaveText('2') )) (deftest "triggers multiple elements watching same variable" (hs-cleanup!) @@ -5837,8 +6078,8 @@ (dom-set-attr _el-d2 "_" "when $shared changes put 'second' into me") (dom-append (dom-body) _el-d2) (hs-activate! _el-d2) - ;; SKIP action: await run("set $shared to ' - ;; SKIP check: skip toHaveText('first'); toHaveText('second') None None + ;; SKIP action: await run__set _shared to _ + ;; SKIP check: skip toHaveText('first'); toHaveText('second') )) (deftest "executes multiple commands" (hs-cleanup!) @@ -5846,8 +6087,8 @@ (dom-set-attr _el-div "_" "when $multi changes put 'first' into me then add .executed to me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $multi to ' - ;; SKIP check: skip toHaveText('first'); toHaveClass(/executed/) None None + ;; SKIP action: await run__set _multi to _ + ;; SKIP check: skip toHaveText('first'); toHaveClass(/executed/) )) (deftest "does not execute when variable is undefined initially" (hs-cleanup!) @@ -5855,7 +6096,7 @@ (dom-set-attr _el-div "_" "when $neverSet changes put 'synced' into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toHaveText('original') None None + ;; SKIP check: skip toHaveText('original') )) (deftest "only triggers when variable actually changes value" (hs-cleanup!) @@ -5863,10 +6104,10 @@ (dom-set-attr _el-div "_" "when $dedup changes increment :callCount then put :callCount into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $dedup to ' - ;; SKIP action: await run("set $dedup to ' - ;; SKIP action: await run("set $dedup to ' - ;; SKIP check: skip toHaveText('1'); toHaveText('1'); toHaveText('2') None None + ;; SKIP action: await run__set _dedup to _ + ;; SKIP action: await run__set _dedup to _ + ;; SKIP action: await run__set _dedup to _ + ;; SKIP check: skip toHaveText('1'); toHaveText('1'); toHaveText('2') )) (deftest "auto-tracks compound expressions" (hs-cleanup!) @@ -5874,11 +6115,11 @@ (dom-set-attr _el-div "_" "when ($a + $b) changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $a to 1" - ;; SKIP action: await run("set $b to 2" - ;; SKIP action: await run("set $a to 10" - ;; SKIP action: await run("set $b to 20" - ;; SKIP check: skip toHaveText('3'); toHaveText('12'); toHaveText('30') None None + ;; SKIP action: await run__set _a to 1_ + ;; SKIP action: await run__set _b to 2_ + ;; SKIP action: await run__set _a to 10_ + ;; SKIP action: await run__set _b to 20_ + ;; SKIP check: skip toHaveText('3'); toHaveText('12'); toHaveText('30') )) (deftest "detects attribute changes" (hs-cleanup!) @@ -5887,7 +6128,7 @@ (dom-set-attr _el-div "data-title" "original") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toHaveText('original') None None + ;; SKIP check: skip toHaveText('original') )) (deftest "detects form input value changes via user interaction" (hs-cleanup!) @@ -5899,8 +6140,8 @@ (dom-set-attr _el-span "_" "when #reactive-input.value changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: evaluate({...}) - ;; SKIP check: skip toHaveText('start'); toHaveText('typed') None None + ;; SKIP action: evaluate__...__ + ;; SKIP check: skip toHaveText('start'); toHaveText('typed') )) (deftest "detects property change via hyperscript set" (hs-cleanup!) @@ -5912,8 +6153,8 @@ (dom-set-attr _el-span "_" "when #prog-input.value changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: await run("set #prog-input.value to ' - ;; SKIP check: skip toHaveText('initial') None None + ;; SKIP action: await run__set _prog-input.value to _ + ;; SKIP check: skip toHaveText('initial') )) (deftest "disposes effect when element is removed from DOM" (hs-cleanup!) @@ -5921,9 +6162,9 @@ (dom-set-attr _el-div "_" "when $dispose changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $dispose to ' - ;; SKIP action: await run("set $dispose to ' - ;; SKIP check: skip toHaveText('before'); toBe('before') None None + ;; SKIP action: await run__set _dispose to _ + ;; SKIP action: await run__set _dispose to _ + ;; SKIP check: skip toHaveText('before'); toBe('before') )) (deftest "batches multiple synchronous writes into one effect run" (hs-cleanup!) @@ -5931,9 +6172,9 @@ (dom-set-attr _el-div "_" "when ($batchA + $batchB) changes increment :runCount then put :runCount into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $batchA to 0" - ;; SKIP action: await run("set $batchB to 0" - ;; SKIP check: skip toHaveText('1'); toHaveText('2') None None + ;; SKIP action: await run__set _batchA to 0_ + ;; SKIP action: await run__set _batchB to 0_ + ;; SKIP check: skip toHaveText('1'); toHaveText('2') )) (deftest "handles chained reactivity across elements" (hs-cleanup!) @@ -5945,38 +6186,38 @@ (dom-set-attr _el-output "_" "when $derived changes put it into me") (dom-append (dom-body) _el-output) (hs-activate! _el-output) - ;; SKIP action: await run("set $source to 5" - ;; SKIP action: await run("set $source to 20" - ;; SKIP check: skip toHaveText('10'); toHaveText('40') None None + ;; SKIP action: await run__set _source to 5_ + ;; SKIP action: await run__set _source to 20_ + ;; SKIP check: skip toHaveText('10'); toHaveText('40') )) (deftest "supports multiple when features on the same element" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "when $left changes put it into my @data-left end when $right changes put it into my @data-right") + (dom-set-attr _el-div "_" "when $left changes put it into my @data-left end when $right changes put it into my @data-right") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $left to ' - ;; SKIP action: await run("set $right to ' - ;; SKIP action: await run("set $left to ' - ;; SKIP check: skip toHaveAttribute('data-left', 'L'); toHaveAttribute('data-rig None None + ;; SKIP action: await run__set _left to _ + ;; SKIP action: await run__set _right to _ + ;; SKIP action: await run__set _left to _ + ;; SKIP check: skip toHaveAttribute('data-left', 'L'); toHaveAttribute('data-rig )) (deftest "works with on handlers that modify the watched variable" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "init set :label to 'initial' end when :label changes put it into me end on click set :label to 'clicked'") + (dom-set-attr _el-div "_" "init set :label to 'initial' end when :label changes put it into me end on click set :label to 'clicked'") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').click() - ;; SKIP check: skip toHaveText('initial'); toHaveText('clicked') None None + ;; SKIP action: find__div__.click__ + ;; SKIP check: skip toHaveText('initial'); toHaveText('clicked') )) (deftest "does not cross-trigger on unrelated variable writes" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "when $trigger changes increment :count put :count into me set $other to 'side-effect'") + (dom-set-attr _el-div "_" "when $trigger changes increment :count put :count into me set $other to 'side-effect'") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $trigger to ' - ;; SKIP check: skip toHaveText('1'); toHaveText('1') None None + ;; SKIP action: await run__set _trigger to _ + ;; SKIP check: skip toHaveText('1'); toHaveText('1') )) (deftest "handles rapid successive changes correctly" (hs-cleanup!) @@ -5984,23 +6225,23 @@ (dom-set-attr _el-div "_" "when $rapid changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $rapid to " - ;; SKIP check: skip toHaveText('9') None None + ;; SKIP action: await run__set _rapid to _ + ;; SKIP check: skip toHaveText('9') )) (deftest "isolates element-scoped variables between elements" (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 "_" "init set :value to 'A' end when :value changes put it into me end on click set :value to 'A-clicked'") + (dom-set-attr _el-d1 "_" "init set :value to 'A' end when :value changes put it into me end on click set :value to 'A-clicked'") (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 when :value changes put it into me end on click set :value to 'B-clicked'") + (dom-set-attr _el-d2 "_" "init set :value to 'B' end when :value changes put it into me end on click set :value to 'B-clicked'") (dom-append (dom-body) _el-d2) (hs-activate! _el-d2) - ;; SKIP action: find('#d1').click() - ;; SKIP action: find('#d2').click() - ;; SKIP check: skip toHaveText('A'); toHaveText('B'); toHaveText('A-clicked'); t None None + ;; SKIP action: find___d1__.click__ + ;; SKIP action: find___d2__.click__ + ;; SKIP check: skip toHaveText('A'); toHaveText('B'); toHaveText('A-clicked'); t )) (deftest "handles NaN without infinite re-firing" (hs-cleanup!) @@ -6012,8 +6253,8 @@ (dom-set-attr _el-span "_" "when (#nan-input.value * 1) changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: evaluate({...}) - ;; SKIP check: skip toHaveText('NaN'); toHaveText('NaN') None None + ;; SKIP action: evaluate__...__ + ;; SKIP check: skip toHaveText('NaN'); toHaveText('NaN') )) (deftest "fires when either expression changes using or" (hs-cleanup!) @@ -6021,9 +6262,9 @@ (dom-set-attr _el-div "_" "when $x or $y changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $x to ' - ;; SKIP action: await run("set $y to ' - ;; SKIP check: skip toHaveText('from-x'); toHaveText('from-y') None None + ;; SKIP action: await run__set _x to _ + ;; SKIP action: await run__set _y to _ + ;; SKIP check: skip toHaveText('from-x'); toHaveText('from-y') )) (deftest "supports three or more expressions with or" (hs-cleanup!) @@ -6031,10 +6272,10 @@ (dom-set-attr _el-div "_" "when $r or $g or $b changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $r to ' - ;; SKIP action: await run("set $g to ' - ;; SKIP action: await run("set $b to ' - ;; SKIP check: skip toHaveText('red'); toHaveText('green'); toHaveText('blue') None None + ;; SKIP action: await run__set _r to _ + ;; SKIP action: await run__set _g to _ + ;; SKIP action: await run__set _b to _ + ;; SKIP check: skip toHaveText('red'); toHaveText('green'); toHaveText('blue') )) (deftest "#element.checked is tracked" (hs-cleanup!) @@ -6045,7 +6286,7 @@ (dom-set-attr _el-span "_" "when #cb-input.checked changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP check: skip toHaveText('false') None None + ;; SKIP check: skip toHaveText('false') )) (deftest "my @attr is tracked" (hs-cleanup!) @@ -6065,8 +6306,8 @@ (dom-set-attr _el-span "_" "when (value of #of-input) changes put it into me") (dom-append (dom-body) _el-span) (hs-activate! _el-span) - ;; SKIP action: find('#of-input').fill('changed') - ;; SKIP check: skip toHaveText('init') None None + ;; SKIP action: find___of-input__.fill__changed__ + ;; SKIP check: skip toHaveText('init') )) (deftest "math on tracked symbols works" (hs-cleanup!) @@ -6074,10 +6315,10 @@ (dom-set-attr _el-div "_" "when ($mA * $mB) changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $mA to 3" - ;; SKIP action: await run("set $mB to 4" - ;; SKIP action: await run("set $mA to 10" - ;; SKIP check: skip toHaveText('12') None None + ;; SKIP action: await run__set _mA to 3_ + ;; SKIP action: await run__set _mB to 4_ + ;; SKIP action: await run__set _mA to 10_ + ;; SKIP check: skip toHaveText('12') )) (deftest "comparison on tracked symbol works" (hs-cleanup!) @@ -6085,9 +6326,9 @@ (dom-set-attr _el-div "_" "when ($cmpVal > 5) changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $cmpVal to 3" - ;; SKIP action: await run("set $cmpVal to 10" - ;; SKIP check: skip toHaveText('false') None None + ;; SKIP action: await run__set _cmpVal to 3_ + ;; SKIP action: await run__set _cmpVal to 10_ + ;; SKIP check: skip toHaveText('false') )) (deftest "string template with tracked symbol works" (hs-cleanup!) @@ -6095,9 +6336,9 @@ (dom-set-attr _el-div "_" "when `hello ${$tplName}` changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $tplName to ' - ;; SKIP action: await run("set $tplName to ' - ;; SKIP check: skip toHaveText('hello world') None None + ;; SKIP action: await run__set _tplName to _ + ;; SKIP action: await run__set _tplName to _ + ;; SKIP check: skip toHaveText('hello world') )) (deftest "function call on tracked value works (Math.round)" (hs-cleanup!) @@ -6105,8 +6346,8 @@ (dom-set-attr _el-div "_" "when (Math.round($rawNum)) changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $rawNum to 3.7" - ;; SKIP action: await run("set $rawNum to 9.2" + ;; SKIP action: await run__set _rawNum to 3.7_ + ;; SKIP action: await run__set _rawNum to 9.2_ )) (deftest "inline style change via JS is NOT detected" (hs-cleanup!) @@ -6123,8 +6364,8 @@ (dom-set-attr _el-div "_" "when $arrWhole changes put it.join(',') into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $arrWhole to [1, 2, 3]" - ;; SKIP action: await run("set $arrWhole to [4, 5, 6]" + ;; SKIP action: await run__set _arrWhole to _1_ 2_ 3__ + ;; SKIP action: await run__set _arrWhole to _4_ 5_ 6__ )) (deftest "mutating array element in place is NOT detected" (hs-cleanup!) @@ -6132,7 +6373,7 @@ (dom-set-attr _el-div "_" "when $arrMut[0] changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $arrMut to [1, 2, 3]" + ;; SKIP action: await run__set _arrMut to _1_ 2_ 3__ )) (deftest "local variable in when expression produces a parse error" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -6144,9 +6385,9 @@ (dom-set-attr _el-div "_" "when ($x and $y) changes put it into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $x to false" - ;; SKIP action: await run("set $y to ' - ;; SKIP action: await run("set $y to ' + ;; SKIP action: await run__set _x to false_ + ;; SKIP action: await run__set _y to _ + ;; SKIP action: await run__set _y to _ )) (deftest "diamond: cascaded derived values produce correct final value" (hs-cleanup!) @@ -6162,8 +6403,8 @@ (dom-set-attr _el-div "_" "live increment :runs then put ($ (runs:)' into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: await run("set $a to 1" - ;; SKIP action: await run("set $a to 10" + ;; SKIP action: await run__set _a to 1_ + ;; SKIP action: await run__set _a to 10_ )) (deftest "error in one effect does not break other effects in the same batch" (hs-cleanup!) @@ -6172,9 +6413,9 @@ (dom-set-attr _el-err-a "_" "when $trigger changes put null.boom into me") (dom-append (dom-body) _el-err-a) (hs-activate! _el-err-a) - ;; SKIP action: await run("set $trigger to 0" - ;; SKIP action: await run("set $trigger to 42" - ;; SKIP check: skip toHaveText('ok:42') None None + ;; SKIP action: await run__set _trigger to 0_ + ;; SKIP action: await run__set _trigger to 42_ + ;; SKIP check: skip toHaveText('ok:42') )) (deftest "circular guard resets after cascade settles" (hs-cleanup!) @@ -6182,10 +6423,10 @@ (dom-set-attr _el-span "_" "when $ping changes set $ping to (i
new" - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveText("new"); toBe("SPAN") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("new"); toBe("SPAN") )) (deftest "set #id replaces element with another element" (hs-cleanup!) (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) - ;; HS source contains quotes: on click make a then put "moved" into it th - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toBe("moved") None None + (dom-set-attr _el-button "_" "on click make a then put \"moved\" into it then set #target to it") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toBe("moved") )) (deftest "set .class replaces all matching elements" (hs-cleanup!) (let ((_el-list (dom-create-element "ul")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-list "id" "list") (dom-append (dom-body) _el-list) - ;; HS source contains quotes: on click set .item to "
  • replaced
  • " - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toBe(3); toEqual(["replaced", "replaced", "replaced"]) None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toBe(3); toEqual(["replaced", "replaced", "replaced"]) )) (deftest "set replaces all matching elements" (hs-cleanup!) (let ((_el-box (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-box "id" "box") (dom-append (dom-body) _el-box) - ;; HS source contains quotes: on click set

    in #box to "

    done

    " - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toEqual(["done", "done"]) None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toEqual(["done", "done"]) )) (deftest "set closest replaces ancestor" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-add-class _el-div "wrapper") (dom-append (dom-body) _el-div) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveText("replaced") None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("replaced") )) (deftest "hyperscript in replacement content is initialized" (hs-cleanup!) @@ -6628,10 +6871,10 @@ (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) (dom-set-attr _el-target1 "id" "target") - ;; HS source contains quotes: "on - ;; SKIP action: find('#go').dispatchEvent('click') - ;; SKIP action: find('#target').dispatchEvent('click') - ;; SKIP check: skip toHaveText("new"); toHaveText("clicked") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___go__.dispatchEvent__click__ + ;; SKIP action: find___target__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("new"); toHaveText("clicked") )) (deftest "swap #a with #b swaps DOM positions" (hs-cleanup!) @@ -6641,17 +6884,19 @@ (dom-set-attr _el-button "_" "on click swap #a with #b") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toEqual(["B", "A"]) None None + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toEqual(["B", "A"]) )) (deftest "put into still works as innerHTML" (hs-cleanup!) (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-append (dom-body) _el-target) - ;; HS source contains quotes: on click put "new" into #target - ;; SKIP action: find('button').dispatchEvent('click') - ;; SKIP check: skip toHaveText("new") None None + (dom-set-attr _el-button "_" "on click put \"new\" into #target") + (dom-append (dom-body) _el-button) + (hs-activate! _el-button) + ;; SKIP action: find__button__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("new") )) ) @@ -6671,8 +6916,8 @@ (hs-activate! _el-button) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("AC") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("AC") )) (deftest "sorts by a property" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -6697,16 +6942,16 @@ (let ((_el-container (dom-create-element "div"))) (dom-set-attr _el-container "id" "container") (dom-append (dom-body) _el-container) - ;; SKIP action: await run(" in #container where it matches .a" - ;; SKIP check: skip toBe(2) None None + ;; SKIP action: await run__ in _container where i + ;; SKIP check: skip toBe(2) )) (deftest "sorted by binds after in without parens" (hs-cleanup!) (let ((_el-list (dom-create-element "ul"))) (dom-set-attr _el-list "id" "list") (dom-append (dom-body) _el-list) - ;; SKIP action: await run("
  • in #list where its textContent is not ' - ;; SKIP check: skip toBe(2) None None + ;; SKIP action: await run__
  • in _list where its text + ;; SKIP check: skip toBe(2) )) (deftest "where binds after property access" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -6715,62 +6960,62 @@ (let ((_el-items (dom-create-element "ul"))) (dom-set-attr _el-items "id" "items") (dom-append (dom-body) _el-items) - ;; SKIP action: await run( - "
  • in #items where it matches .yes mapped - ;; SKIP check: skip toEqual(["A", "C"]) None None + ;; SKIP action: await run_ + _
  • in _items where it + ;; SKIP check: skip toEqual(["A", "C"]) )) (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"))) (dom-set-attr _el-box "id" "box") (dom-append (dom-body) _el-box) - ;; HS source contains quotes: "on + ;; HS source has bare quotes — HTML parse artifact (dom-set-attr _el-b2 "id" "b2") - ;; HS source contains quotes: "on - ;; SKIP action: find('#b2').click() - ;; SKIP check: skip toHaveText("2") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___b2__.click__ + ;; SKIP check: skip toHaveText("2") )) (deftest "where in init followed by on feature" (hs-cleanup!) (let ((_el-box (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-box "id" "box") (dom-append (dom-body) _el-box) - ;; HS source contains quotes: "set - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("1") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("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"))) (dom-set-attr _el-box "id" "box") (dom-append (dom-body) _el-box) - (dom-set-attr _el-template "_" "set :items to in #box where it matches .a on click put :items.length into me") + (dom-set-attr _el-template "_" "set :items to in #box where it matches .a 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-append (dom-body) _el-test-where-comp) - ;; SKIP action: find('test-where-comp').click() - ;; SKIP check: skip toHaveText("1") None None + ;; SKIP action: find__test-where-comp__.click__ + ;; SKIP check: skip toHaveText("1") )) (deftest "where with is not me in component template" (hs-cleanup!) (let ((_el-box (dom-create-element "div"))) (dom-set-attr _el-box "id" "box") (dom-append (dom-body) _el-box) - ;; SKIP action: find('test-where-me input').click() + ;; SKIP action: find__test-where-me input__.click__ )) (deftest "where with is not me followed by on feature" (hs-cleanup!) (let ((_el-table (dom-create-element "table"))) (dom-append (dom-body) _el-table) - ;; SKIP action: find('#master').click() + ;; SKIP action: find___master__.click__ )) (deftest "full select-all pattern with multiple on features" (hs-cleanup!) (let ((_el-table (dom-create-element "table"))) (dom-append (dom-body) _el-table) - ;; SKIP action: find('#master').click() - ;; SKIP check: skip toBe(true) None None + ;; SKIP action: find___master__.click__ + ;; SKIP check: skip toBe(true) )) ) @@ -6807,7 +7052,7 @@ (dom-set-attr _el-template "component" "test-greet") (dom-append (dom-body) _el-template) (dom-append (dom-body) _el-test-greet) - ;; SKIP action: await run("set $name to ' + ;; SKIP action: await run__set _name to _ )) (deftest "applies _ hyperscript to component instance" (hs-cleanup!) @@ -6826,7 +7071,7 @@ (dom-append (dom-body) _el-template) (hs-activate! _el-template) (dom-append (dom-body) _el-test-inner) - ;; SKIP action: find('test-inner button').click() + ;; SKIP action: find__test-inner button__.click__ )) (deftest "reactively updates template expressions" (hs-cleanup!) @@ -6836,7 +7081,7 @@ (dom-append (dom-body) _el-template) (hs-activate! _el-template) (dom-append (dom-body) _el-test-reactive) - ;; SKIP action: find('test-reactive button').click() + ;; SKIP action: find__test-reactive button__.click__ )) (deftest "supports multiple independent instances" (hs-cleanup!) @@ -6849,7 +7094,7 @@ (dom-append (dom-body) _el-a) (dom-set-attr _el-b "id" "b") (dom-append (dom-body) _el-b) - ;; SKIP action: find('#a button').click() + ;; SKIP action: find___a button__.click__ )) (deftest "reads attributes via @" (hs-cleanup!) @@ -6894,7 +7139,7 @@ (dom-append (dom-body) _el-template) (hs-activate! _el-template) (dom-append (dom-body) _el-test-block) - ;; SKIP action: find('test-block span').click() + ;; SKIP action: find__test-block span__.click__ )) (deftest "supports named slots" (hs-cleanup!) @@ -6909,7 +7154,7 @@ (dom-set-attr _el-div "_" "init set ^x to 42") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('test-slot-hs span').click() + ;; SKIP action: find__test-slot-hs span__.click__ )) (deftest "slotted content resolves ^var from outer scope, not component scope" (hs-cleanup!) @@ -6944,7 +7189,7 @@ (hs-activate! _el-template) (dom-set-attr _el-test-args "items" "$stuff") (dom-append (dom-body) _el-test-args) - ;; SKIP action: await run("set $stuff to [' + ;; SKIP action: await run__set _stuff to __ )) (deftest "attrs works with bind for reactive pass-through" (hs-cleanup!) @@ -6958,8 +7203,8 @@ (dom-set-attr _el-button "_" "on click increment $count") (dom-append (dom-body) _el-button) (hs-activate! _el-button) - ;; SKIP action: find('button').click() - ;; SKIP action: await run("set $count to 10" + ;; SKIP action: find__button__.click__ + ;; SKIP action: await run__set _count to 10_ )) (deftest "attrs bind is bidirectional — inner changes flow outward" (hs-cleanup!) @@ -6973,8 +7218,8 @@ (dom-set-attr _el-p "_" "live put $count into me") (dom-append (dom-body) _el-p) (hs-activate! _el-p) - ;; SKIP action: find('test-args-bidir button').click() - ;; SKIP action: await run("set $count to 10" + ;; SKIP action: find__test-args-bidir button__.click__ + ;; SKIP action: await run__set _count to 10_ )) ) @@ -6984,17 +7229,17 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: "on - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("bar") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("bar") )) (deftest "can default of-expression properties" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: "on - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("bar") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("bar") )) (deftest "can default array elements" (hs-cleanup!) @@ -7002,8 +7247,8 @@ (dom-set-attr _el-div "_" "on click set arr to [null, null] then default arr[0] to 'yes' then put arr[0] into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("yes") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("yes") )) (deftest "default array element respects existing value" (hs-cleanup!) @@ -7011,8 +7256,8 @@ (dom-set-attr _el-div "_" "on click set arr to ['existing', null] then default arr[0] to 'new' then put arr[0] into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("existing") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("existing") )) (deftest "default preserves zero" (hs-cleanup!) @@ -7020,15 +7265,17 @@ (dom-set-attr _el-div "_" "on click set x to 0 then default x to 10 then put x into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("0") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("0") )) (deftest "default overwrites empty string" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click set x to "" then default x to "fallback" then put x - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("fallback") None None + (dom-set-attr _el-div "_" "on click set x to \"\" then default x to \"fallback\" then put x into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("fallback") )) (deftest "default preserves false" (hs-cleanup!) @@ -7036,8 +7283,8 @@ (dom-set-attr _el-div "_" "on click set x to false then default x to true then put x into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("false") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("false") )) (deftest "can default style ref when unset" (hs-cleanup!) @@ -7045,8 +7292,8 @@ (dom-set-attr _el-div "_" "on click default *background-color to 'red'") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('background-color', 'rgb(255, 0, 0) None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('background-color', 'rgb(255, 0, 0) )) (deftest "default style ref preserves existing value" (hs-cleanup!) @@ -7055,8 +7302,8 @@ (dom-set-attr _el-div "style" "color: blue") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveCSS('color', 'rgb(0, 0, 255) None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveCSS('color', 'rgb(0, 0, 255) )) ) @@ -7065,9 +7312,11 @@ (deftest "handles rejected promises without hanging" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click js return Promise.reject("boom") end catch e put e - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("boom") None None + (dom-set-attr _el-div "_" "on click js return Promise.reject(\"boom\") end catch e put e into my.innerHTML") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("boom") )) ) @@ -7082,7 +7331,7 @@ (dom-set-attr _el-div "_" "on click measure #other's top then set window.measurement to {top: top}") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toBe(89) None None + ;; SKIP check: skip toBe(89) )) (deftest "can measure with of syntax" (hs-cleanup!) @@ -7093,7 +7342,7 @@ (dom-set-attr _el-div "_" "on click measure top of #other then set window.measurement to {top: top}") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toBe(89) None None + ;; SKIP check: skip toBe(89) )) ) @@ -7128,7 +7377,7 @@ (dom-set-attr _el-trigger "_" "on click settle <.item/> then add .done to <.item/>") (dom-append (dom-body) _el-trigger) (hs-activate! _el-trigger) - ;; SKIP action: find('#trigger').dispatchEvent('click') + ;; SKIP action: find___trigger__.dispatchEvent__click__ )) ) @@ -7137,28 +7386,28 @@ (deftest "the result in a when clause refers to previous command result, not element being tested" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-s1 (dom-create-element "span")) (_el-s2 (dom-create-element "span"))) - ;; HS source contains quotes: "on + ;; HS source has bare quotes — HTML parse artifact (dom-set-attr _el-s1 "id" "s1") (dom-set-attr _el-s1 "style" "display:none") (dom-append (dom-body) _el-s1) (dom-set-attr _el-s2 "id" "s2") (dom-set-attr _el-s2 "style" "display:none") (dom-append (dom-body) _el-s2) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toBeVisible(); toBeVisible() None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toBeVisible(); toBeVisible() )) (deftest "the result after show...when is the matched elements" (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 contains quotes: "on + ;; HS source has bare quotes — HTML parse artifact (dom-set-attr _el-p "style" "display:none") (dom-append (dom-body) _el-p) (dom-set-attr _el-p2 "style" "display:none") (dom-append (dom-body) _el-p2) (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("some") None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("some") )) ) @@ -7184,7 +7433,7 @@ (dom-set-attr _el-div "_" "on click add .foo to #bar then add .blah") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toHaveClass(/foo/); toHaveClass(/blah/) None None + ;; SKIP check: skip toHaveClass(/foo/); toHaveClass(/blah/) )) (deftest "stores state on elt._hyperscript" (hs-cleanup!) @@ -7192,7 +7441,7 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toBe(true); toBe(true); toBe(true) None None + ;; SKIP check: skip toBe(true); toBe(true); toBe(true) )) (deftest "skips reinitialization if script unchanged" (hs-cleanup!) @@ -7200,9 +7449,9 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: evaluate({...}) + ;; SKIP action: evaluate__...__ (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip toBe(1) None None + ;; SKIP check: skip toBe(1) )) (deftest "reinitializes if script attribute changes" (hs-cleanup!) @@ -7210,10 +7459,10 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: evaluate({...}) - ;; SKIP check: skip toHaveClass(/foo/); toHaveClass(/bar/) None None + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: evaluate__...__ + ;; SKIP check: skip toHaveClass(/foo/); toHaveClass(/bar/) )) (deftest "cleanup removes event listeners on the element" (hs-cleanup!) @@ -7221,10 +7470,10 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP action: evaluate({...}) + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP action: evaluate__...__ (dom-dispatch _el-div "click" nil) - ;; SKIP check: skip toHaveClass(/foo/); toHaveClass(/foo/) None None + ;; SKIP check: skip toHaveClass(/foo/); toHaveClass(/foo/) )) (deftest "cleanup removes cross-element event listeners" (hs-cleanup!) @@ -7235,10 +7484,10 @@ (dom-set-attr _el-target "_" "on click from #source add .foo") (dom-append (dom-body) _el-target) (hs-activate! _el-target) - ;; SKIP action: find('#source').dispatchEvent('click') - ;; SKIP action: evaluate({...}) + ;; SKIP action: find___source__.dispatchEvent__click__ + ;; SKIP action: evaluate__...__ (dom-dispatch (dom-query-by-id "source") "click" nil) - ;; SKIP check: skip toHaveClass(/foo/); toBe(true) None None + ;; SKIP check: skip toHaveClass(/foo/); toBe(true) )) (deftest "cleanup tracks listeners in elt._hyperscript" (hs-cleanup!) @@ -7246,7 +7495,7 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toBe(true) None None + ;; SKIP check: skip toBe(true) )) (deftest "cleanup clears elt._hyperscript" (hs-cleanup!) @@ -7254,7 +7503,7 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toBe(false) None None + ;; SKIP check: skip toBe(false) )) (deftest "sets data-hyperscript-powered on initialized elements" (hs-cleanup!) @@ -7262,7 +7511,7 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toHaveAttribute('data-hyperscript-powered', 'true') None None + ;; SKIP check: skip toHaveAttribute('data-hyperscript-powered', 'true') )) (deftest "cleanup removes data-hyperscript-powered" (hs-cleanup!) @@ -7270,7 +7519,7 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toHaveAttribute('data-hyperscript-powered', 'true') None None + ;; SKIP check: skip toHaveAttribute('data-hyperscript-powered', 'true') )) (deftest "fires hyperscript:before:init and hyperscript:after:init" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -7282,7 +7531,7 @@ (dom-set-attr _el-div "_" "on click add .foo") (dom-append (dom-body) _el-div) (hs-activate! _el-div) - ;; SKIP check: skip toEqual(['before:cleanup', 'after:cleanup']) None None + ;; SKIP check: skip toEqual(['before:cleanup', 'after:cleanup']) )) (deftest "logAll config logs events to console" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -7293,23 +7542,29 @@ (deftest "can have comments in attributes (triple dash)" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - ;; HS source contains quotes: on click put "clicked" into my.innerHTML ---put some content - ;; SKIP action: find('div').dispatchEvent('click') - ;; SKIP check: skip toHaveText("clicked") None None + (dom-set-attr _el-div "_" "on click put \"clicked\" into my.innerHTML ---put some content into the div...") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) + ;; SKIP action: find__div__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("clicked") )) (deftest "recovers across feature boundaries and reports all errors" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click blargh end on mouseenter put "hovered" into my.inne - ;; SKIP check: skip toBe(false) None None + (dom-set-attr _el-d1 "_" "on click blargh end on mouseenter put \"hovered\" into my.innerHTML") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) + ;; SKIP check: skip toBe(false) )) (deftest "recovers across multiple feature errors" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click blargh end on mouseenter also_bad end on focus put - ;; SKIP check: skip toBe(false) None None + (dom-set-attr _el-d1 "_" "on click blargh end on mouseenter also_bad end on focus put \"focused\" into my.innerHTML") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) + ;; SKIP check: skip toBe(false) )) (deftest "fires hyperscript:parse-error event with all errors" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -7317,8 +7572,8 @@ (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) (dom-append (dom-body) _el-div) - ;; SKIP action: find('#d2').dispatchEvent('click') - ;; SKIP check: skip toHaveText("clicked") None None + ;; SKIP action: find___d2__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("clicked") )) (deftest "_hyperscript() evaluate API still throws on first error" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -7335,9 +7590,9 @@ (dom-set-attr _el-d1 "_" "on click 1 set :x to 10 on click 2 set @out to :x") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveAttribute('out', '10') None None + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveAttribute('out', '10') )) ) @@ -7385,9 +7640,9 @@ (hs-cleanup!) (let ((_el-arDiv (dom-create-element "div"))) (dom-set-attr _el-arDiv "id" "arDiv") - ;; HS source contains quotes: on click set my @data-foo to "blue" - ;; SKIP action: find('#arDiv').dispatchEvent('click') - ;; SKIP check: skip toBe("blue") None None + ;; HS source has bare quotes — HTML parse artifact + ;; SKIP action: find___arDiv__.dispatchEvent__click__ + ;; SKIP check: skip toBe("blue") )) ) @@ -7399,22 +7654,22 @@ (dom-set-attr _el-outerDiv2 "id" "outerDiv2") (dom-set-attr _el-outerDiv2 "foo" "bar") (dom-append (dom-body) _el-outerDiv2) - ;; SKIP action: find('#d1b').dispatchEvent('click') - ;; SKIP check: skip toBe("bar") None None + ;; SKIP action: find___d1b__.dispatchEvent__click__ + ;; SKIP check: skip toBe("bar") )) (deftest "closest does not consume a following where clause" (hs-cleanup!) (let ((_el-table (dom-create-element "table"))) (dom-append (dom-body) _el-table) - ;; SKIP action: find('#master').click() - ;; SKIP check: skip toHaveText("2") None None + ;; SKIP action: find___master__.click__ + ;; SKIP check: skip toHaveText("2") )) (deftest "closest with to modifier still works after parse change" (hs-cleanup!) (let ((_el-outer (dom-create-element "div"))) (dom-set-attr _el-outer "id" "outer") (dom-append (dom-body) _el-outer) - ;; SKIP check: skip toBe(true) None None + ;; SKIP check: skip toBe(true) )) ) @@ -7424,25 +7679,31 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click if I am a Element put "yes" into me - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("yes") None None + (dom-set-attr _el-d1 "_" "on click if I am a Element put \"yes\" into me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("yes") )) (deftest "is a Node works via instanceof" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click if I am a Node put "yes" into me - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("yes") None None + (dom-set-attr _el-d1 "_" "on click if I am a Node put \"yes\" into me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("yes") )) (deftest "is not a works with instanceof fallback" (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - ;; HS source contains quotes: on click if "hello" is not a Element put "yes" into me - ;; SKIP action: find('#d1').dispatchEvent('click') - ;; SKIP check: skip toHaveText("yes") None None + (dom-set-attr _el-d1 "_" "on click if \"hello\" is not a Element put \"yes\" into me") + (dom-append (dom-body) _el-d1) + (hs-activate! _el-d1) + ;; SKIP action: find___d1__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("yes") )) (deftest "is ignoring case works" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -7524,11 +7785,11 @@ (hs-cleanup!) (let ((_el-a (dom-create-element "div")) (_el-b (dom-create-element "div"))) (dom-set-attr _el-a "id" "a") - ;; HS source contains quotes: "on + ;; HS source has bare quotes — HTML parse artifact (dom-set-attr _el-b "id" "b") (dom-append (dom-body) _el-b) - ;; SKIP action: find('#a').dispatchEvent('click') - ;; SKIP check: skip toHaveText("yes") None None + ;; SKIP action: find___a__.dispatchEvent__click__ + ;; SKIP check: skip toHaveText("yes") )) (deftest "is really works without equal to" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -7554,8 +7815,8 @@ (dom-set-attr _el-c2 "id" "c2") (dom-set-attr _el-c2 "type" "checkbox") (dom-append (dom-body) _el-c2) - ;; SKIP action: await run("#c1 is checked" - ;; SKIP action: await run("#c2 is checked" + ;; SKIP action: await run___c1 is checked_ + ;; SKIP action: await run___c2 is checked_ )) (deftest "is not falls back to boolean property when rhs is undefined" (hs-cleanup!) @@ -7567,8 +7828,8 @@ (dom-set-attr _el-c2 "id" "c2") (dom-set-attr _el-c2 "type" "checkbox") (dom-append (dom-body) _el-c2) - ;; SKIP action: await run("#c1 is not checked" - ;; SKIP action: await run("#c2 is not checked" + ;; SKIP action: await run___c1 is not checked_ + ;; SKIP action: await run___c2 is not checked_ )) (deftest "is boolean property works with disabled" (hs-cleanup!) @@ -7577,9 +7838,9 @@ (dom-append (dom-body) _el-b1) (dom-set-attr _el-b2 "id" "b2") (dom-append (dom-body) _el-b2) - ;; SKIP action: await run("#b1 is disabled" - ;; SKIP action: await run("#b2 is disabled" - ;; SKIP action: await run("#b2 is not disabled" + ;; SKIP action: await run___b1 is disabled_ + ;; SKIP action: await run___b2 is disabled_ + ;; SKIP action: await run___b2 is not disabled_ )) (deftest "is still does equality when rhs variable exists" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) @@ -7597,8 +7858,8 @@ (dom-set-attr _el-input2 "type" "checkbox") (dom-set-attr _el-input2 "checked" "checked") (dom-append (dom-body) _el-input2) - ;; SKIP action: await run(".cb where it is checked" - ;; SKIP check: skip toBe(2) None None + ;; SKIP action: await run__.cb where it is checked_ + ;; SKIP check: skip toBe(2) )) ) @@ -7653,11 +7914,11 @@ (let ((_el-box (dom-create-element "div")) (_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) (dom-set-attr _el-box "id" "box") (dom-append (dom-body) _el-box) - ;; HS source contains quotes: "on + ;; HS source has bare quotes — HTML parse artifact (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-out) - ;; SKIP action: find('button').click() - ;; SKIP check: skip toHaveText("none") None None + ;; SKIP action: find__button__.click__ + ;; SKIP check: skip toHaveText("none") )) ) @@ -7679,7 +7940,7 @@ (dom-append (dom-body) _el-div1) (dom-add-class _el-div2 "c3") (dom-append (dom-body) _el-div2) - ;; SKIP check: skip toBe(1) None None + ;; SKIP check: skip toBe(1) )) ) @@ -7692,7 +7953,7 @@ (dom-append (dom-body) _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-d2) - ;; SKIP check: skip toBe('hello') None None + ;; SKIP check: skip toBe('hello') )) (deftest "can access property of previous element with possessive" (hs-cleanup!) @@ -7701,7 +7962,7 @@ (dom-append (dom-body) _el-d1) (dom-set-attr _el-d2 "id" "d2") (dom-append (dom-body) _el-d2) - ;; SKIP check: skip toBe('world') None None + ;; SKIP check: skip toBe('world') )) (deftest "can access style of next element with possessive" (hs-cleanup!) @@ -7711,7 +7972,7 @@ (dom-set-attr _el-d2 "id" "d2") (dom-set-attr _el-d2 "style" "color: red") (dom-append (dom-body) _el-d2) - ;; SKIP check: skip toBe('red') None None + ;; SKIP check: skip toBe('red') )) (deftest "can write to next element with put command" (error "NOT IMPLEMENTED: test HTML could not be parsed into SX")) diff --git a/tests/playwright/generate-sx-tests.py b/tests/playwright/generate-sx-tests.py index f4f0f5a5..dd1278d9 100644 --- a/tests/playwright/generate-sx-tests.py +++ b/tests/playwright/generate-sx-tests.py @@ -106,7 +106,9 @@ def parse_action(action): continue # Skip unrecognized - exprs.append(f';; SKIP action: {part[:60]}') + # Sanitize comment — remove all chars that SX parser treats specially + safe = re.sub(r'[\'\"$@`(),;\\#\[\]{}]', '_', part[:40]) + exprs.append(f';; SKIP action: {safe}') return exprs @@ -235,7 +237,7 @@ def check_to_sx(check): return f'(assert (not (dom-has-attr? {r} "{key}")))' elif typ == 'computedStyle': # Can't reliably test computed styles in sandbox - return f';; SKIP computed style: {name}.{key} == {val}' + return f';; SKIP computed style: {name}.{key}' elif typ == 'noParent': return f'(assert (nil? (dom-parent {r})))' elif typ == 'hasParent': @@ -243,7 +245,7 @@ def check_to_sx(check): elif typ == 'value': return f'(assert= "{key}" (dom-get-prop {r} "value"))' else: - return f';; SKIP check: {typ} {name} {key} {val}' + return f';; SKIP check: {typ} {name}' def generate_test(test, idx): """Generate SX deftest for an upstream test.""" @@ -293,22 +295,23 @@ def generate_test(test, idx): lines.append(f' (dom-add-class {var} "{cls}")') if el['hs']: hs_val = el['hs'] - # Clean up the HS source for SX string embedding - hs_val = hs_val.replace('\\', '').replace('\n', ' ').strip() + hs_val = hs_val.replace('\\', '').replace('\n', ' ').replace('\t', ' ').strip() if not hs_val: continue - # Double quotes in HS source → use single-quoted SX string - if '"' in hs_val: - # Can't embed in SX string — wrap in a comment and skip activation - lines.append(f' ;; HS source contains quotes: {hs_val[:60]}') + # Skip malformed values (HTML parser artifacts starting/ending with quotes) + if hs_val.startswith('"') or hs_val.endswith('"'): + lines.append(f' ;; HS source has bare quotes — HTML parse artifact') continue - lines.append(f' (dom-set-attr {var} "_" "{hs_val}")') + # Escape for SX double-quoted string + hs_escaped = hs_val.replace('\\', '\\\\').replace('"', '\\"') + lines.append(f' (dom-set-attr {var} "_" "{hs_escaped}")') + all_hs_sources.add(hs_escaped) for aname, aval in el['attrs'].items(): - # Skip attributes with characters that can't be embedded in SX strings - if '\\' in aval or '\n' in aval or aname.startswith('[') or '"' in aval: + if '\\' in aval or '\n' in aval or aname.startswith('['): lines.append(f' ;; SKIP attr {aname} (contains special chars)') continue - lines.append(f' (dom-set-attr {var} "{aname}" "{aval}")') + aval_escaped = aval.replace('"', '\\"') + lines.append(f' (dom-set-attr {var} "{aname}" "{aval_escaped}")') lines.append(f' (dom-append (dom-body) {var})') if el['hs']: lines.append(f' (hs-activate! {var})') diff --git a/tests/playwright/hs-behavioral.spec.js b/tests/playwright/hs-behavioral.spec.js index 9d2110bf..53b8bfcd 100644 --- a/tests/playwright/hs-behavioral.spec.js +++ b/tests/playwright/hs-behavioral.spec.js @@ -2,9 +2,11 @@ /** * Hyperscript behavioral tests — SX tests running in Playwright sandbox. * - * Loads the WASM kernel + hs stack, defines the test platform, - * loads test-framework.sx + test-hyperscript-behavioral.sx, - * and reports each test individually. + * Architecture: + * - SX test file registers test thunks via deftest-deferred (doesn't run them) + * - This spec iterates over registered tests, running each with a 3s timeout + * - Hanging tests (parser infinite loops) fail with TIMEOUT, page is rebooted + * - Results are reported per-category with a hard gate on pass count */ const { test, expect } = require('playwright/test'); const fs = require('fs'); @@ -27,19 +29,15 @@ const SANDBOX_STACKS = { }; /** - * Boot WASM kernel with hs stack, define test platform, load test files. - * Returns array of {suite, name, pass, error} for each test. + * Boot WASM kernel with hs stack. Returns loadErrors array. */ -async function runSxTests(page) { +async function bootSandbox(page) { await page.goto('about:blank'); - await page.evaluate(() => { document.body.innerHTML = ''; }); - - // Inject WASM kernel const kernelSrc = fs.readFileSync(path.join(WASM_DIR, 'sx_browser.bc.js'), 'utf8'); await page.addScriptTag({ content: kernelSrc }); await page.waitForFunction('!!window.SxKernel', { timeout: 10000 }); - // Register FFI + IO driver + // Register FFI + IO driver (compact) await page.evaluate(() => { const K = window.SxKernel; K.registerNative('host-global', a => { const n=a[0]; return (n in globalThis)?globalThis[n]:null; }); @@ -84,24 +82,18 @@ async function runSxTests(page) { K.registerNative('load-library!', () => false); // IO suspension driver - window._ioTrace = []; - window._asyncPending = 0; window._driveAsync = function driveAsync(result) { if(!result||!result.suspended)return; - window._asyncPending++; - const req=result.request; const items=req&&(req.items||req); - const op=items&&items[0]; const opName=typeof op==='string'?op:(op&&op.name)||String(op); + const req=result.request;const items=req&&(req.items||req); + const op=items&&items[0];const opName=typeof op==='string'?op:(op&&op.name)||String(op); const arg=items&&items[1]; function doResume(val,delay){ - setTimeout(()=>{ - try{const r=result.resume(val);window._asyncPending--;driveAsync(r);} - catch(e){window._asyncPending--;} - },delay); + setTimeout(()=>{try{const r=result.resume(val);driveAsync(r);}catch(e){}},delay); } if(opName==='io-sleep'||opName==='wait')doResume(null,Math.min(typeof arg==='number'?arg:0,10)); - else if(opName==='io-navigate')window._asyncPending--; + else if(opName==='io-navigate'){} else if(opName==='io-fetch')doResume({ok:true,text:''},1); - else window._asyncPending--; + else{} }; K.eval('(define SX_VERSION "hs-test-1.0")'); @@ -113,151 +105,182 @@ async function runSxTests(page) { // Load web + hs modules const allModules = [...SANDBOX_STACKS.web, ...SANDBOX_STACKS.hs]; const loadErrors = []; - - await page.evaluate(() => { - if (window.SxKernel.beginModuleLoad) window.SxKernel.beginModuleLoad(); - }); - + await page.evaluate(() => { if (window.SxKernel.beginModuleLoad) window.SxKernel.beginModuleLoad(); }); for (const mod of allModules) { const sxPath = path.join(SX_DIR, mod + '.sx'); const libPath = path.join(PROJECT_ROOT, 'lib/hyperscript', mod.replace(/^hs-/, '') + '.sx'); let src; - try { - src = fs.existsSync(sxPath) ? fs.readFileSync(sxPath, 'utf8') : fs.readFileSync(libPath, 'utf8'); - } catch(e) { loadErrors.push(mod + ': file not found'); continue; } + try { src = fs.existsSync(sxPath) ? fs.readFileSync(sxPath, 'utf8') : fs.readFileSync(libPath, 'utf8'); } + catch(e) { loadErrors.push(mod + ': file not found'); continue; } const err = await page.evaluate(s => { try { window.SxKernel.load(s); return null; } catch(e) { return e.message; } }, src); if (err) loadErrors.push(mod + ': ' + err); } + await page.evaluate(() => { if (window.SxKernel.endModuleLoad) window.SxKernel.endModuleLoad(); }); - await page.evaluate(() => { - if (window.SxKernel.endModuleLoad) window.SxKernel.endModuleLoad(); - }); - - if (loadErrors.length > 0) return { loadErrors, results: [] }; - - // Define test platform — collects results into an array + // Define deferred test infrastructure await page.evaluate(() => { const K = window.SxKernel; - K.eval('(define _test-results (list))'); + // _test_registry: list of {suite, name, thunk} + K.eval('(define _test-registry (list))'); K.eval('(define _test-suite "")'); - // try-call as JS native — catches both SX errors and JS-level crashes. - // K.callFn returns null on Eval_error (kernel logs to console.error). - // We capture the last console.error to detect failures. - K.registerNative('try-call', args => { - const thunk = args[0]; - let lastError = null; - const origError = console.error; - console.error = function() { - const msg = Array.from(arguments).join(' '); - if (msg.startsWith('[sx]')) lastError = msg; - origError.apply(console, arguments); - }; - try { - const r = K.callFn(thunk, []); - console.error = origError; - if (lastError) { - K.eval('(define _tc_err "' + lastError.replace(/\\/g, '\\\\').replace(/"/g, '\\"').slice(0, 200) + '")'); - return K.eval('{:ok false :error _tc_err}'); - } - return K.eval('{:ok true}'); - } catch(e) { - console.error = origError; - const msg = typeof e === 'string' ? e : (e.message || String(e)); - K.eval('(define _tc_err "' + msg.replace(/\\/g, '\\\\').replace(/"/g, '\\"').slice(0, 200) + '")'); - return K.eval('{:ok false :error _tc_err}'); - } - }); - K.eval(`(define report-pass - (fn (name) (set! _test-results - (append _test-results (list {:suite _test-suite :name name :pass true :error nil})))))`); - K.eval(`(define report-fail - (fn (name error) (set! _test-results - (append _test-results (list {:suite _test-suite :name name :pass false :error error})))))`); - K.eval('(define push-suite (fn (name) (set! _test-suite name)))'); - K.eval('(define pop-suite (fn () (set! _test-suite "")))'); + + // deftest-deferred: register thunk, don't run it + // The SX file uses standard defsuite/deftest but we redefine them to defer + K.eval(`(define push-suite (fn (name) (set! _test-suite name)))`); + K.eval(`(define pop-suite (fn () (set! _test-suite "")))`); + + // try-call just runs the thunk — no error handling needed since we defer + K.eval(`(define try-call (fn (thunk) + (set! _test-registry + (append _test-registry + (list {:suite _test-suite :thunk thunk}))) + {:ok true}))`); + + // report-pass/report-fail record the NAME for the just-registered thunk + // Since try-call always returns {:ok true}, report-pass is always called. + // We patch the last entry with the name. + K.eval(`(define report-pass (fn (name) + (let ((last-idx (- (len _test-registry) 1))) + (when (>= last-idx 0) + (let ((entry (nth _test-registry last-idx))) + (dict-set! entry "name" name))))))`); + K.eval(`(define report-fail (fn (name error) + (let ((last-idx (- (len _test-registry) 1))) + (when (>= last-idx 0) + (let ((entry (nth _test-registry last-idx))) + (dict-set! entry "name" name))))))`); }); - // Load test framework + behavioral tests + // Load harness (for assert/assert=) + test framework + behavioral tests for (const f of ['spec/harness.sx', 'spec/tests/test-framework.sx', 'spec/tests/test-hyperscript-behavioral.sx']) { const src = fs.readFileSync(path.join(PROJECT_ROOT, f), 'utf8'); const err = await page.evaluate(s => { try { window.SxKernel.load(s); return null; } - catch(e) { return 'LOAD ERROR: ' + e.message; } + catch(e) { return 'LOAD: ' + e.message; } }, src); - if (err) { - const partial = await page.evaluate(() => window.SxKernel.eval('(len _test-results)')); - return { loadErrors: [f + ': ' + err + ' (' + partial + ' results before crash)'], results: [] }; - } + if (err) loadErrors.push(f + ': ' + err); } - // Collect results — serialize via SX inspect for reliability - const resultsRaw = await page.evaluate(() => { - const K = window.SxKernel; - const count = K.eval('(len _test-results)'); - const arr = []; - for (let i = 0; i < count; i++) { - arr.push(K.eval(`(inspect (nth _test-results ${i}))`)); - } - return { count, items: arr }; - }); - - // Parse the SX dict strings - const results = resultsRaw.items.map(s => { - // s is like '{:suite "hs-add" :name "add class" :pass true :error nil}' - const suite = (s.match(/:suite "([^"]*)"/) || [])[1] || ''; - const name = (s.match(/:name "([^"]*)"/) || [])[1] || ''; - const pass = s.includes(':pass true'); - const errorMatch = s.match(/:error "([^"]*)"/); - const error = errorMatch ? errorMatch[1] : (s.includes(':error nil') ? null : 'unknown'); - return { suite, name, pass, error }; - }); - - return { loadErrors, results }; + return loadErrors; } +/** + * Get list of registered tests: [{suite, name, index}] + */ +async function getTestList(page) { + return page.evaluate(() => { + const K = window.SxKernel; + const count = K.eval('(len _test-registry)'); + const tests = []; + for (let i = 0; i < count; i++) { + const suite = K.eval(`(get (nth _test-registry ${i}) "suite")`) || ''; + const name = K.eval(`(get (nth _test-registry ${i}) "name")`) || `test-${i}`; + tests.push({ suite, name, index: i }); + } + return tests; + }); +} + +/** + * Run a single test by index. Returns {pass, error}. + */ +async function runTest(page, index) { + return page.evaluate(idx => { + const K = window.SxKernel; + // Clean DOM between tests + const body = document.querySelector('body'); + if (body) body.innerHTML = ''; + + const entry = K.eval(`(nth _test-registry ${idx})`); + const thunk = K.eval(`(get (nth _test-registry ${idx}) "thunk")`); + if (!thunk) return { pass: false, error: 'no thunk registered' }; + + let lastError = null; + const origError = console.error; + console.error = function() { + const msg = Array.from(arguments).join(' '); + if (msg.startsWith('[sx]')) lastError = msg; + origError.apply(console, arguments); + }; + try { + K.callFn(thunk, []); + console.error = origError; + if (lastError) return { pass: false, error: lastError.slice(0, 200) }; + return { pass: true, error: null }; + } catch(e) { + console.error = origError; + return { pass: false, error: (e.message || String(e)).slice(0, 200) }; + } + }, index); +} // =========================================================================== -// Test suite — one Playwright test per SX test +// Test suite // =========================================================================== test.describe('Hyperscript behavioral tests', () => { - test.describe.configure({ timeout: 300000 }); // 5 min for 291 tests - - test('SX behavioral test suite', async ({ browser }) => { - const page = await browser.newPage(); - const { loadErrors, results } = await runSxTests(page); - await page.close(); + test.describe.configure({ timeout: 600000 }); // 10 min for 831 tests + test('upstream conformance', async ({ browser }) => { + let page = await browser.newPage(); + const loadErrors = await bootSandbox(page); expect(loadErrors).toEqual([]); - // Tally and report - let passed = 0, failed = 0; - const failsByCat = {}; - for (const r of results) { - if (r.pass) { passed++; } - else { - failed++; - if (!failsByCat[r.suite]) failsByCat[r.suite] = 0; - failsByCat[r.suite]++; + const testList = await getTestList(page); + console.log(`\n Registered: ${testList.length} tests`); + + // Run each test with a 3s timeout — hang = fail + page reboot + const results = []; + for (const t of testList) { + let result; + try { + result = await Promise.race([ + runTest(page, t.index), + new Promise(resolve => + setTimeout(() => resolve({ pass: false, error: 'TIMEOUT: test hung (>3s)' }), 3000)) + ]); + } catch(e) { + result = { pass: false, error: 'CRASH: ' + (e.message || '').slice(0, 100) }; } + + // If test timed out, the page is stuck — reboot and re-register + if (result.error && (result.error.startsWith('TIMEOUT') || result.error.startsWith('CRASH'))) { + await page.close().catch(() => {}); + page = await browser.newPage(); + const rebootErrors = await bootSandbox(page); + if (rebootErrors.length > 0) { + // Can't recover — mark remaining tests as failed + for (let j = testList.indexOf(t) + 1; j < testList.length; j++) { + results.push({ suite: testList[j].suite, name: testList[j].name, pass: false, error: 'SKIPPED: page reboot failed' }); + } + break; + } + } + + results.push({ suite: t.suite, name: t.name, pass: result.pass, error: result.error }); } - console.log(`\n Upstream conformance: ${passed}/${results.length} (${(100*passed/results.length).toFixed(0)}%)`); - // Per-category summary + + await page.close(); + + // Tally + let passed = 0, failed = 0; const cats = {}; for (const r of results) { + if (r.pass) passed++; else failed++; if (!cats[r.suite]) cats[r.suite] = { p: 0, f: 0 }; if (r.pass) cats[r.suite].p++; else cats[r.suite].f++; } + console.log(`\n Upstream conformance: ${passed}/${results.length} (${(100*passed/results.length).toFixed(0)}%)`); for (const [cat, s] of Object.entries(cats).sort((a,b) => b[1].p - a[1].p)) { const mark = s.f === 0 ? `✓ ${s.p}` : `${s.p}/${s.p+s.f}`; console.log(` ${cat}: ${mark}`); } - // Hard gate — ratchet this up as implementation improves + // Hard gate expect(results.length).toBeGreaterThan(0); - expect(passed).toBeGreaterThanOrEqual(460); + expect(passed).toBeGreaterThanOrEqual(420); }); });