Files
rose-ash/sx/sx/applications/hyperscript/gallery-events-on/index.sx
giles 1a9c8d61b5 Hyperscript gallery: one-per-file page migration (76 pages)
Migrates hyperscript demo/reference pages from grouped index files into
one-per-page directory layout. Each gallery-<topic>/index.sx is a single
defpage with its own demo, matching the one-per-file convention used
elsewhere in sx/sx/applications/.

Covers: control (call/go/if/log/repeat/settle), dom (add/append/empty/
focus/hide/measure/morph/put/remove/reset/scroll/set/show/swap/take/
toggle), events (asyncError/bootstrap/dialog/fetch/halt/init/on/pick/
send/socket/tell/wait/when), expressions (asExpression/attributeRef/
closest/collectionExpressions/comparisonOperator/default/in/increment/
logicalOperator/mathOperator/no/objectLiteral/queryRef/select/splitJoin),
language (askAnswer/assignableElements/component/cookies/def/dom-scope/
evalStatically/js/parser/relativePositionalExpression/scoping), and
reactivity (bind/live/liveTemplate/reactive-properties/resize/transition).

Adds _islands/hs-test-card.sx — a shared island for hyperscript demos.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 09:08:30 +00:00

898 lines
47 KiB
Plaintext

;; AUTO-GENERATED from spec/tests/hyperscript-upstream-tests.json
;; DO NOT EDIT — regenerate with:
;; python3 tests/playwright/generate-sx-tests.py --emit-pages
(defcomp ()
(~docs/page :title "Hyperscript: on (63 tests — 54 runnable)"
(p :style "color:#57534e;margin-bottom:1rem" "Live cards for the upstream on tests. 54 of 63 are reproducible in-browser; the remainder show their source for reference.")
(p :style "color:#78716c;font-size:0.875rem;margin-bottom:1rem"
"Theme: " (a :href "/sx/(applications.(hyperscript.gallery-events))"
:style "color:#7c3aed" "events"))
(div :style "display:flex;flex-direction:column"
(~hyperscript/hs-test-card
:name "can respond to events with dots in names"
:html "<div _='on click send example.event to #d1'></div> | <div id='d1' _='on example.event add .called'></div>"
:action "bar.click()"
:check "div.classList.contains(\"called\").should.equal(false) && div.classList.contains(\"called\").should.equal(true)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")) (_el-d1 (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click send example.event to #d1\")
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-d1 \"_\" \"on example.event add .called\")
(dom-append sandbox _el-div)
(dom-append sandbox _el-d1)
(hs-activate! _el-div)
(hs-activate! _el-d1)
(dom-dispatch _el-div \"click\" nil)
(assert (dom-has-class? _el-div \"called\"))
))")
(~hyperscript/hs-test-card
:name "can respond to events with colons in names"
:html "<div _='on click send example:event to #d1'></div> | <div id='d1' _='on example:event add .called'></div>"
:action "bar.click()"
:check "div.classList.contains(\"called\").should.equal(false) && div.classList.contains(\"called\").should.equal(true)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")) (_el-d1 (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click send example:event to #d1\")
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-d1 \"_\" \"on example:event add .called\")
(dom-append sandbox _el-div)
(dom-append sandbox _el-d1)
(hs-activate! _el-div)
(hs-activate! _el-d1)
(dom-dispatch _el-div \"click\" nil)
(assert (dom-has-class? _el-div \"called\"))
))")
(~hyperscript/hs-test-card
:name "can respond to events with minus in names"
:html "<div _='on click send \"a-b\" to #d1'></div> | <div id='d1' _='on \"a-b\" add .called'></div>"
:action "bar.click()"
:check "div.classList.contains(\"called\").should.equal(false) && div.classList.contains(\"called\").should.equal(true)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")) (_el-d1 (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click send \\\"a-b\\\" to #d1\")
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-d1 \"_\" \"on \\\"a-b\\\" add .called\")
(dom-append sandbox _el-div)
(dom-append sandbox _el-d1)
(hs-activate! _el-div)
(hs-activate! _el-d1)
(dom-dispatch _el-div \"click\" nil)
(assert (dom-has-class? _el-div \"called\"))
))")
(~hyperscript/hs-test-card
:name "can respond to events on other elements"
:html "<div id='bar'></div> | <div _='on click from #bar add .clicked'></div>"
:action "bar.click()"
:check "div.classList.contains(\"clicked\").should.equal(false) && div.classList.contains(\"clicked\").should.equal(true)"
:run-src "(fn (sandbox)
(let ((_el-bar (dom-create-element \"div\")) (_el-div (dom-create-element \"div\")))
(dom-set-attr _el-bar \"id\" \"bar\")
(dom-set-attr _el-div \"_\" \"on click from #bar add .clicked\")
(dom-append sandbox _el-bar)
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-bar \"click\" nil)
(assert (dom-has-class? _el-div \"clicked\"))
))")
(~hyperscript/hs-test-card
:name "listeners on other elements are removed when the registering element is removed"
:html "<div id='bar'></div> | <div _='on click from #bar set #bar.innerHTML to #bar.innerHTML + \"a\"'></div>"
:action "bar.click(); bar.click()"
:check "bar.innerHTML.should.equal(\"\") && bar.innerHTML.should.equal(\"a\") && bar.innerHTML.should.equal(\"a\")"
:run-src "(fn (sandbox)
(let ((_el-bar (dom-create-element \"div\")) (_el-div (dom-create-element \"div\")))
(dom-set-attr _el-bar \"id\" \"bar\")
(dom-set-attr _el-div \"_\" \"on click from #bar set #bar.innerHTML to #bar.innerHTML + \\\"a\\\"\")
(dom-append sandbox _el-bar)
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-bar \"click\" nil)
(dom-dispatch _el-bar \"click\" nil)
(assert= (dom-inner-html _el-bar) \"a\")
))")
(~hyperscript/hs-test-card
:name "listeners on self are not removed when the element is removed"
:html "<div _='on someCustomEvent put 1 into me'></div>"
:action "div.remove(); div.dispatchEvent(new Event(\"someCustomEvent\")"
:check "div.innerHTML.should.equal(\"1\")"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))")
(~hyperscript/hs-test-card
:name "supports \"elsewhere\" modifier"
:html "<div _='on click elsewhere add .clicked'></div>"
:action "div.click(); body.click()"
:check "div.classList.contains(\"clicked\").should.equal(false) && div.classList.contains(\"clicked\").should.equal(false) && div.classList.contains(\"clicked\").should.equal(true)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click elsewhere add .clicked\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(assert (dom-has-class? _el-div \"clicked\"))
))")
(~hyperscript/hs-test-card
:name "supports \"from elsewhere\" modifier"
:html "<div _='on click from elsewhere add .clicked'></div>"
:action "div.click(); body.click()"
:check "div.classList.contains(\"clicked\").should.equal(false) && div.classList.contains(\"clicked\").should.equal(false) && div.classList.contains(\"clicked\").should.equal(true)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click from elsewhere add .clicked\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(assert (dom-has-class? _el-div \"clicked\"))
))")
(~hyperscript/hs-test-card
:name "can pick detail fields out by name"
:html "<div id='d1' _='on click send custom(foo:\"fromBar\") to #d2'></div> | <div id='d2' _='on custom(foo) call me.classList.add(foo)'></div>"
:action "bar.click()"
:check "div.classList.contains(\"fromBar\").should.equal(false) && div.classList.contains(\"fromBar\").should.equal(true)"
:run-src "(fn (sandbox)
(let ((_el-d1 (dom-create-element \"div\")) (_el-d2 (dom-create-element \"div\")))
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-d1 \"_\" \"on click send custom(foo:\\\"fromBar\\\") to #d2\")
(dom-set-attr _el-d2 \"id\" \"d2\")
(dom-set-attr _el-d2 \"_\" \"on custom(foo) call me.classList.add(foo)\")
(dom-append sandbox _el-d1)
(dom-append sandbox _el-d2)
(hs-activate! _el-d1)
(hs-activate! _el-d2)
(dom-dispatch _el-d1 \"click\" nil)
(assert (dom-has-class? _el-d1 \"fromBar\"))
))")
(~hyperscript/hs-test-card
:name "can pick event properties out by name"
:html "<div id='d1' _='on click send fromBar to #d2'></div> | <div id='d2' _='on fromBar(type) call me.classList.add(type)'></div>"
:action "bar.click()"
:check "div.classList.contains(\"fromBar\").should.equal(false) && div.classList.contains(\"fromBar\").should.equal(true)"
:run-src "(fn (sandbox)
(let ((_el-d1 (dom-create-element \"div\")) (_el-d2 (dom-create-element \"div\")))
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-d1 \"_\" \"on click send fromBar to #d2\")
(dom-set-attr _el-d2 \"id\" \"d2\")
(dom-set-attr _el-d2 \"_\" \"on fromBar(type) call me.classList.add(type)\")
(dom-append sandbox _el-d1)
(dom-append sandbox _el-d2)
(hs-activate! _el-d1)
(hs-activate! _el-d2)
(dom-dispatch _el-d1 \"click\" nil)
(assert (dom-has-class? _el-d1 \"fromBar\"))
))")
(~hyperscript/hs-test-card
:name "can fire an event on load"
:html "<div id='d1' _='on load put \"Loaded\" into my.innerHTML'></div>"
:action "(see body)"
:check "div.innerText.should.equal(\"Loaded\")"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))")
(~hyperscript/hs-test-card
:name "can be in a top level script tag"
:html "<script type='text/hyperscript'>on load put \"Loaded\" into #loadedDemo.innerHTML</script><div id='loadedDemo'></div>"
:action "(see body)"
:check "byId(\"loadedDemo\").innerText.should.equal(\"Loaded\")"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))")
(~hyperscript/hs-test-card
:name "can have a simple event filter"
:html "<div id='d1' _='on click[false] log event then put \"Clicked\" into my.innerHTML'></div>"
:action "div.click()"
:check "byId(\"d1\").innerText.should.equal(\"\")"
:run-src "(fn (sandbox)
(let ((_el-d1 (dom-create-element \"div\")))
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-d1 \"_\" \"on click[false] log event then put \\\"Clicked\\\" into my.innerHTML\")
(dom-append sandbox _el-d1)
(hs-activate! _el-d1)
(dom-dispatch _el-d1 \"click\" nil)
;; SKIP check: skip byId(\"d1\").innerText.should.equal(\"\")
))")
(~hyperscript/hs-test-card
:name "can refer to event properties directly in filter"
:html "<div _='on click[buttons==0] log event then put \"Clicked\" into my.innerHTML'></div> | <div _='on click[buttons==1] log event then put \"Clicked\" into my.innerHTML'></div> | <div _='on click[buttons==1 and buttons==0] log event then put \"Clicked\" into my.innerHTML'></div>"
:action "div.click(); div.click(); div.click()"
:check "div.innerText.should.equal(\"Clicked\") && div.innerText.should.equal(\"\") && div.innerText.should.equal(\"\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")) (_el-div1 (dom-create-element \"div\")) (_el-div2 (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click[buttons==0] log event then put \\\"Clicked\\\" into my.innerHTML\")
(dom-set-attr _el-div1 \"_\" \"on click[buttons==1] log event then put \\\"Clicked\\\" into my.innerHTML\")
(dom-set-attr _el-div2 \"_\" \"on click[buttons==1 and buttons==0] log event then put \\\"Clicked\\\" into my.innerHTML\")
(dom-append sandbox _el-div)
(dom-append sandbox _el-div1)
(dom-append sandbox _el-div2)
(hs-activate! _el-div)
(hs-activate! _el-div1)
(hs-activate! _el-div2)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
;; SKIP check: skip div.innerText.should.equal(\"Clicked\")
;; SKIP check: skip div.innerText.should.equal(\"\")
))")
(~hyperscript/hs-test-card
:name "can refer to event detail properties directly in filter"
:html "<div _='on example[foo] increment @count then put it into me'></div>"
:action "div.dispatchEvent(event); div.dispatchEvent(event); div.dispatchEvent(event)"
:check "div.innerText.should.equal(\"1\") && div.innerText.should.equal(\"1\") && div.innerText.should.equal(\"2\")"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))")
(~hyperscript/hs-test-card
:name "can click after a positive event filter"
:html "<div _='on foo(bar)[bar] put \"triggered\" into my.innerHTML'></div>"
:action "div.dispatchEvent(new CustomEvent(\"foo\", { detail: { bar: false } }); div.dispatchEvent(new CustomEvent(\"foo\", { detail: { bar: true } })"
:check "div.innerText.should.equal(\"\") && div.innerText.should.equal(\"triggered\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on foo(bar)[bar] put \\\"triggered\\\" into my.innerHTML\")
(dom-append sandbox _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(\"\")
;; SKIP check: skip div.innerText.should.equal(\"triggered\")
))")
(~hyperscript/hs-test-card
:name "multiple event handlers at a time are allowed to execute with the every keyword"
:html "<div _='on every click put increment() into my.innerHTML then wait for a customEvent'></div>"
:action "div.click(); div.click(); div.click()"
:check "div.innerText.should.equal(\"1\") && div.innerText.should.equal(\"2\") && div.innerText.should.equal(\"3\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on every click put increment() into my.innerHTML then wait for a customEvent\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(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\")
;; SKIP check: skip div.innerText.should.equal(\"2\")
;; SKIP check: skip div.innerText.should.equal(\"3\")
))")
(~hyperscript/hs-test-card
:name "can have multiple event handlers"
:html "<div _='on foo put increment() into my.innerHTML end on bar put increment() into my.innerHTML'></div>"
:action "div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"foo\")"
:check "div.innerText.should.equal(\"1\") && div.innerText.should.equal(\"2\") && div.innerText.should.equal(\"3\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on foo put increment() into my.innerHTML end on bar put increment() into my.innerHTML\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(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\")
;; SKIP check: skip div.innerText.should.equal(\"2\")
;; SKIP check: skip div.innerText.should.equal(\"3\")
))")
(~hyperscript/hs-test-card
:name "can have multiple event handlers, no end"
:html "<div _='on foo put increment() into my.innerHTML on bar put increment() into my.innerHTML'></div>"
:action "div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"foo\")"
:check "div.innerText.should.equal(\"1\") && div.innerText.should.equal(\"2\") && div.innerText.should.equal(\"3\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on foo put increment() into my.innerHTML on bar put increment() into my.innerHTML\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(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\")
;; SKIP check: skip div.innerText.should.equal(\"2\")
;; SKIP check: skip div.innerText.should.equal(\"3\")
))")
(~hyperscript/hs-test-card
:name "can queue events"
:html "<div _='on foo wait for bar then call increment()'></div>"
:action "div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"bar\")"
:check "i.should.equal(0) && i.should.equal(0) && i.should.equal(0) && i.should.equal(1) && i.should.equal(2) && i.should.equal(2)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on foo wait for bar then call increment()\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div \"foo\" nil)
(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)
;; SKIP check: skip i.should.equal(1)
;; SKIP check: skip i.should.equal(2)
))")
(~hyperscript/hs-test-card
:name "can queue first event"
:html "<div _='on foo queue first wait for bar then call increment()'></div>"
:action "div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"bar\")"
:check "i.should.equal(0) && i.should.equal(0) && i.should.equal(0) && i.should.equal(1) && i.should.equal(2) && i.should.equal(2)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on foo queue first wait for bar then call increment()\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div \"foo\" nil)
(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)
;; SKIP check: skip i.should.equal(1)
;; SKIP check: skip i.should.equal(2)
))")
(~hyperscript/hs-test-card
:name "can queue last event"
:html "<div _='on foo queue last wait for bar then call increment()'></div>"
:action "div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"bar\")"
:check "i.should.equal(0) && i.should.equal(0) && i.should.equal(0) && i.should.equal(1) && i.should.equal(2) && i.should.equal(2)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on foo queue last wait for bar then call increment()\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div \"foo\" nil)
(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)
;; SKIP check: skip i.should.equal(1)
;; SKIP check: skip i.should.equal(2)
))")
(~hyperscript/hs-test-card
:name "can queue all events"
:html "<div _='on foo queue all wait for bar then call increment()'></div>"
:action "div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"foo\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"bar\"); div.dispatchEvent(new CustomEvent(\"bar\")"
:check "i.should.equal(0) && i.should.equal(0) && i.should.equal(0) && i.should.equal(1) && i.should.equal(2) && i.should.equal(3)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on foo queue all wait for bar then call increment()\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div \"foo\" nil)
(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)
;; SKIP check: skip i.should.equal(1)
;; SKIP check: skip i.should.equal(2)
;; SKIP check: skip i.should.equal(3)
))")
(~hyperscript/hs-test-card
:name "queue none does not allow future queued events"
:html "<div _='on click queue none put increment() into my.innerHTML then wait for a customEvent'></div>"
:action "div.click(); div.click(); div.dispatchEvent(new CustomEvent(\"customEvent\"); div.click()"
:check "div.innerText.should.equal(\"1\") && div.innerText.should.equal(\"1\") && div.innerText.should.equal(\"1\") && div.innerText.should.equal(\"2\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click queue none put increment() into my.innerHTML then wait for a customEvent\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
(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\")
;; SKIP check: skip div.innerText.should.equal(\"2\")
))")
(~hyperscript/hs-test-card
:name "can invoke on multiple events"
:html "<div _='on click or foo call increment()'></div>"
:action "div.click(); div.dispatchEvent(new CustomEvent(\"foo\")"
:check "i.should.equal(1) && i.should.equal(2)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click or foo call increment()\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"foo\" nil)
;; SKIP check: skip i.should.equal(1)
;; SKIP check: skip i.should.equal(2)
))")
(~hyperscript/hs-test-card
:name "can listen for events in another element (lazy)"
:html "<div _='on click in #d1 put it into window.tmp'> <div id='d1'></div> <div id='d2'></div> </div>"
:action "div1.click()"
:check "div1.should.equal(window.tmp)"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")) (_el-d1 (dom-create-element \"div\")) (_el-d2 (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click in #d1 put it into window.tmp\")
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-d2 \"id\" \"d2\")
(dom-append sandbox _el-div)
(dom-append _el-div _el-d1)
(dom-append _el-div _el-d2)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
;; SKIP check: skip div1.should.equal(window.tmp)
))")
(~hyperscript/hs-test-card
:name "can filter events based on count"
:html "<div _='on click 1 put 1 + my.innerHTML as Int into my.innerHTML'>0</div>"
:action "div.click(); div.click(); div.click()"
:check "div.innerHTML.should.equal(\"1\") && div.innerHTML.should.equal(\"1\") && div.innerHTML.should.equal(\"1\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click 1 put 1 + my.innerHTML as Int into my.innerHTML\")
(dom-set-inner-html _el-div \"0\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(assert= (dom-inner-html _el-div) \"1\")
))")
(~hyperscript/hs-test-card
:name "can filter events based on count range"
:html "<div _='on click 1 to 2 put 1 + my.innerHTML as Int into my.innerHTML'>0</div>"
:action "div.click(); div.click(); div.click()"
:check "div.innerHTML.should.equal(\"1\") && div.innerHTML.should.equal(\"2\") && div.innerHTML.should.equal(\"2\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click 1 to 2 put 1 + my.innerHTML as Int into my.innerHTML\")
(dom-set-inner-html _el-div \"0\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(assert= (dom-inner-html _el-div) \"2\")
))")
(~hyperscript/hs-test-card
:name "can filter events based on unbounded count range"
:html "<div _='on click 2 and on put 1 + my.innerHTML as Int into my.innerHTML'>0</div>"
:action "div.click(); div.click(); div.click()"
:check "div.innerHTML.should.equal(\"0\") && div.innerHTML.should.equal(\"1\") && div.innerHTML.should.equal(\"2\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on click 2 and on put 1 + my.innerHTML as Int into my.innerHTML\")
(dom-set-inner-html _el-div \"0\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(assert= (dom-inner-html _el-div) \"2\")
))")
(~hyperscript/hs-test-card
:name "can mix ranges"
:html "<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 '>0</div>"
:action "div.click(); div.click(); div.click(); div.click()"
:check "div.innerHTML.should.equal(\"one\") && div.innerHTML.should.equal(\"two\") && div.innerHTML.should.equal(\"three\") && div.innerHTML.should.equal(\"three\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(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-set-inner-html _el-div \"0\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(dom-dispatch _el-div \"click\" nil)
(assert= (dom-inner-html _el-div) \"three\")
))")
(~hyperscript/hs-test-card
:name "can listen for general mutations"
:html "<div _='on mutation put \"Mutated\" into me then wait for hyperscript:mutation'></div>"
:action "div.setAttribute(\"foo\", \"bar\")"
:check "div.innerHTML.should.equal(\"Mutated\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation put \\\"Mutated\\\" into me then wait for hyperscript:mutation\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-div \"foo\" \"bar\")
(assert= (dom-inner-html _el-div) \"Mutated\")
))")
(~hyperscript/hs-test-card
:name "can listen for attribute mutations"
:html "<div _='on mutation of attributes put \"Mutated\" into me'></div>"
:action "div.setAttribute(\"foo\", \"bar\")"
:check "div.innerHTML.should.equal(\"Mutated\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation of attributes put \\\"Mutated\\\" into me\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-div \"foo\" \"bar\")
(assert= (dom-inner-html _el-div) \"Mutated\")
))")
(~hyperscript/hs-test-card
:name "can listen for specific attribute mutations"
:html "<div _='on mutation of @foo put \"Mutated\" into me'></div>"
:action "div.setAttribute(\"foo\", \"bar\")"
:check "div.innerHTML.should.equal(\"Mutated\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation of @foo put \\\"Mutated\\\" into me\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-div \"foo\" \"bar\")
(assert= (dom-inner-html _el-div) \"Mutated\")
))")
(~hyperscript/hs-test-card
:name "can listen for specific attribute mutations and filter out other attribute mutations"
:html "<div _='on mutation of @bar put \"Mutated\" into me'></div>"
:action "div.setAttribute(\"foo\", \"bar\")"
:check "div.innerHTML.should.equal(\"\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation of @bar put \\\"Mutated\\\" into me\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-div \"foo\" \"bar\")
(assert= (dom-inner-html _el-div) \"\")
))")
(~hyperscript/hs-test-card
:name "can listen for childList mutations"
:html "<div _='on mutation of childList put \"Mutated\" into me then wait for hyperscript:mutation'></div>"
:action "div.appendChild(document.createElement(\"P\")"
:check "div.innerHTML.should.equal(\"Mutated\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation of childList put \\\"Mutated\\\" into me then wait for hyperscript:mutation\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-append _el-div (dom-create-element \"P\"))
(assert= (dom-inner-html _el-div) \"Mutated\")
))")
(~hyperscript/hs-test-card
:name "can listen for childList mutation filter out other mutations"
:html "<div _='on mutation of childList put \"Mutated\" into me'></div>"
:action "div.setAttribute(\"foo\", \"bar\")"
:check "div.innerHTML.should.equal(\"\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation of childList put \\\"Mutated\\\" into me\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-div \"foo\" \"bar\")
(assert= (dom-inner-html _el-div) \"\")
))")
(~hyperscript/hs-test-card
:name "can listen for characterData mutation filter out other mutations"
:html "<div _='on mutation of characterData put \"Mutated\" into me'></div>"
:action "div.setAttribute(\"foo\", \"bar\")"
:check "div.innerHTML.should.equal(\"\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation of characterData put \\\"Mutated\\\" into me\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-div \"foo\" \"bar\")
(assert= (dom-inner-html _el-div) \"\")
))")
(~hyperscript/hs-test-card
:name "can listen for multiple mutations"
:html "<div _='on mutation of @foo or @bar put \"Mutated\" into me'></div>"
:action "div.setAttribute(\"foo\", \"bar\")"
:check "div.innerHTML.should.equal(\"Mutated\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation of @foo or @bar put \\\"Mutated\\\" into me\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-div \"foo\" \"bar\")
(assert= (dom-inner-html _el-div) \"Mutated\")
))")
(~hyperscript/hs-test-card
:name "can listen for multiple mutations 2"
:html "<div _='on mutation of @foo or @bar put \"Mutated\" into me'></div>"
:action "div.setAttribute(\"bar\", \"bar\")"
:check "div.innerHTML.should.equal(\"Mutated\")"
:run-src "(fn (sandbox)
(let ((_el-div (dom-create-element \"div\")))
(dom-set-attr _el-div \"_\" \"on mutation of @foo or @bar put \\\"Mutated\\\" into me\")
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-div \"bar\" \"bar\")
(assert= (dom-inner-html _el-div) \"Mutated\")
))")
(~hyperscript/hs-test-card
:name "can listen for attribute mutations on other elements"
:html "<div id='d1'></div> | <div _='on mutation of attributes from #d1 put \"Mutated\" into me'></div>"
:action "div1.setAttribute(\"foo\", \"bar\")"
:check "div2.innerHTML.should.equal(\"Mutated\")"
:run-src "(fn (sandbox)
(let ((_el-d1 (dom-create-element \"div\")) (_el-div (dom-create-element \"div\")))
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-div \"_\" \"on mutation of attributes from #d1 put \\\"Mutated\\\" into me\")
(dom-append sandbox _el-d1)
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-set-attr _el-d1 \"foo\" \"bar\")
(assert= (dom-inner-html _el-div) \"Mutated\")
))")
(~hyperscript/hs-test-card
:name "each behavior installation has its own event queue"
:html "<script type=text/hyperscript>behavior DemoBehavior on foo wait 10ms then set my innerHTML to 'behavior'</script> | <div _='install DemoBehavior'></div> | <div _='install DemoBehavior'></div> | <div _='install DemoBehavior'></div>"
:action "div.dispatchEvent(new CustomEvent(\"foo\"); div2.dispatchEvent(new CustomEvent(\"foo\"); div3.dispatchEvent(new CustomEvent(\"foo\")"
:check "div.innerHTML.should.equal(\"behavior\") && div2.innerHTML.should.equal(\"behavior\") && div3.innerHTML.should.equal(\"behavior\")"
:run-src "(fn (sandbox)
(let ((_el-script (dom-create-element \"script\")) (_el-div (dom-create-element \"div\")) (_el-div2 (dom-create-element \"div\")) (_el-div3 (dom-create-element \"div\")))
(dom-set-attr _el-script \"type\" \"text/hyperscript\")
(dom-set-inner-html _el-script \"behavior DemoBehavior on foo wait 10ms then set my innerHTML to 'behavior'\")
(dom-set-attr _el-div \"_\" \"install DemoBehavior\")
(dom-set-attr _el-div2 \"_\" \"install DemoBehavior\")
(dom-set-attr _el-div3 \"_\" \"install DemoBehavior\")
(dom-append sandbox _el-script)
(dom-append sandbox _el-div)
(dom-append sandbox _el-div2)
(dom-append sandbox _el-div3)
(hs-activate! _el-div)
(hs-activate! _el-div2)
(hs-activate! _el-div3)
(dom-dispatch _el-div \"foo\" nil)
(dom-dispatch _el-div2 \"foo\" nil)
(dom-dispatch _el-div3 \"foo\" nil)
(assert= (dom-inner-html _el-div) \"behavior\")
(assert= (dom-inner-html _el-div2) \"behavior\")
(assert= (dom-inner-html _el-div3) \"behavior\")
))")
(~hyperscript/hs-test-card
:name "can catch exceptions thrown in js functions"
:html "<button _='on click throwBar() catch e put e into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click throwBar() catch e put e into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "can catch exceptions thrown in hyperscript functions"
:html "<script type='text/hyperscript'> def throwBar() throw 'bar' end</script>s | <button _='on click throwBar() catch e put e into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click throwBar() catch e put e into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "can catch top-level exceptions"
:html "<button _='on click throw \"bar\" catch e put e into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click throw \\\"bar\\\" catch e put e into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "can catch async top-level exceptions"
:html "<button _='on click wait 1ms then throw \"bar\" catch e put e into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click wait 1ms then throw \\\"bar\\\" catch e put e into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "async exceptions don't kill the event queue"
:html "<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'></button>"
:action "btn.click(); btn.click()"
:check "btn.innerHTML.should.equal(\"success\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click increment :x then if :x is 1 then wait 1ms then throw \\\"bar\\\" otherwise then put \\\"success\\\" into me end catch e then put e into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"success\")
))")
(~hyperscript/hs-test-card
:name "exceptions in catch block don't kill the event queue"
:html "<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'></button>"
:action "btn.click(); btn.click()"
:check "btn.innerHTML.should.equal(\"success\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click increment :x then if :x is 1 then throw \\\"bar\\\" otherwise then put \\\"success\\\" into me end catch e then put e into me then throw e\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"success\")
))")
(~hyperscript/hs-test-card
:name "uncaught exceptions trigger 'exception' event"
:html "<button _='on click put \"foo\" into me then throw \"bar\" on exception(error) put error into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click put \\\"foo\\\" into me then throw \\\"bar\\\" on exception(error) put error into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "caught exceptions do not trigger 'exception' event"
:html "<button _='on click put \"foo\" into me then throw \"bar\" catch e log e on exception(error) put error into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"foo\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(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 sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"foo\")
))")
(~hyperscript/hs-test-card
:name "rethrown exceptions trigger 'exception' event"
:html "<button _='on click put \"foo\" into me then throw \"bar\" catch e throw e on exception(error) put error into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(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 sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "basic finally blocks work"
:html "<button _='on click throw \"bar\" finally put \"bar\" into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click throw \\\"bar\\\" finally put \\\"bar\\\" into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "finally blocks work when exception thrown in catch"
:html "<button _='on click throw \"bar\" catch e throw e finally put \"bar\" into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click throw \\\"bar\\\" catch e throw e finally put \\\"bar\\\" into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "async basic finally blocks work"
:html "<button _='on click wait a tick then throw \"bar\" finally put \"bar\" into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"bar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click wait a tick then throw \\\"bar\\\" finally put \\\"bar\\\" into me\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"bar\")
))")
(~hyperscript/hs-test-card
:name "async finally blocks work when exception thrown in catch"
:html "<button _='on click wait a tick then throw \"bar\" catch e set :foo to \"foo\" then throw e finally put :foo + \"bar\" into me'></button>"
:action "btn.click()"
:check "btn.innerHTML.should.equal(\"foobar\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(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 sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"foobar\")
))")
(~hyperscript/hs-test-card
:name "async exceptions in finally block don't kill the event queue"
:html "<button _='on click increment :x finally if :x is 1 wait 1ms then throw \"bar\" otherwise put \"success\" into me end '></button>"
:action "btn.click(); btn.click()"
:check "btn.innerHTML.should.equal(\"success\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click increment :x finally then if :x is 1 then wait 1ms then throw \\\"bar\\\" otherwise then put \\\"success\\\" into me end\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"success\")
))")
(~hyperscript/hs-test-card
:name "exceptions in finally block don't kill the event queue"
:html "<button _='on click increment :x finally if :x is 1 throw \"bar\" otherwise put \"success\" into me end '></button>"
:action "btn.click(); btn.click()"
:check "btn.innerHTML.should.equal(\"success\")"
:run-src "(fn (sandbox)
(let ((_el-button (dom-create-element \"button\")))
(dom-set-attr _el-button \"_\" \"on click increment :x finally then if :x is 1 then throw \\\"bar\\\" otherwise then put \\\"success\\\" into me end\")
(dom-append sandbox _el-button)
(hs-activate! _el-button)
(dom-dispatch _el-button \"click\" nil)
(dom-dispatch _el-button \"click\" nil)
(assert= (dom-inner-html _el-button) \"success\")
))")
(~hyperscript/hs-test-card
:name "can ignore when target doesn't exist"
:html "<div id='#d1' _=' on click from #doesntExist throw \"bar\" on click put \"clicked\" into me '></div>"
:action "div.click()"
:check "div.innerHTML.should.equal(\"clicked\")"
:run-src "(fn (sandbox)
(let ((_el-#d1 (dom-create-element \"div\")))
(dom-set-attr _el-#d1 \"id\" \"#d1\")
(dom-set-attr _el-#d1 \"_\" \"on click from #doesntExist then throw \\\"bar\\\" on click put \\\"clicked\\\" into me\")
(dom-append sandbox _el-#d1)
(hs-activate! _el-#d1)
(dom-dispatch _el-#d1 \"click\" nil)
(assert= (dom-inner-html _el-#d1) \"clicked\")
))")
(~hyperscript/hs-test-card
:name "can handle an or after a from clause"
:html "<div id='d1'></div> | <div id='d2'></div> | <div _=' on click from #d1 or click from #d2 increment @count then put @count into me '></div>"
:action "d1.click(); d2.click()"
:check "div.innerHTML.should.equal(\"1\") && div.innerHTML.should.equal(\"2\")"
:run-src "(fn (sandbox)
(let ((_el-d1 (dom-create-element \"div\")) (_el-d2 (dom-create-element \"div\")) (_el-div (dom-create-element \"div\")))
(dom-set-attr _el-d1 \"id\" \"d1\")
(dom-set-attr _el-d2 \"id\" \"d2\")
(dom-set-attr _el-div \"_\" \"on click from #d1 or click from #d2 then increment @count then put @count into me\")
(dom-append sandbox _el-d1)
(dom-append sandbox _el-d2)
(dom-append sandbox _el-div)
(hs-activate! _el-div)
(dom-dispatch _el-d1 \"click\" nil)
(dom-dispatch _el-d2 \"click\" nil)
(assert= (dom-inner-html _el-div) \"2\")
))")
(~hyperscript/hs-test-card
:name "handles custom events with null detail"
:html "<div id='d1' _='on myEvent(foo) if foo put foo into me else put \\\"no-detail\\\" into me'></div>"
:action "evaluate({...})"
:check "toHaveText('no-detail')"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))")
(~hyperscript/hs-test-card
:name "on first click fires only once"
:html "<div _='on first click put 1 + my.innerHTML as Int into my.innerHTML'>0</div>"
:action "find('div').dispatchEvent('click'); find('div').dispatchEvent('click')"
:check "toHaveText('1'); toHaveText('1')"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))")
(~hyperscript/hs-test-card
:name "caught exceptions do not trigger 'exception' event"
:html "<button _='on click put \\\"foo\\\" into me then throw \\\"bar\\\" catch e log e on exception(error) put error into me'></button>"
:action "find('button').dispatchEvent('click')"
:check "toHaveText('foo')"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))")
(~hyperscript/hs-test-card
:name "rethrown exceptions trigger 'exception' event"
:html "<button _='on click put \\\"foo\\\" into me then throw \\\"bar\\\" catch e throw e on exception(error) put error into me'></button>"
:action "find('button').dispatchEvent('click')"
:check "toHaveText('bar')"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))")
(~hyperscript/hs-test-card
:name "can ignore when target doesn\\'t exist"
:html "<div _=' on click from #doesntExist throw \\\"bar\\\" on click put \\\"clicked\\\" into me '></div>"
:action "find('div').dispatchEvent('click')"
:check "toHaveText('clicked')"
:run-src "(fn (sandbox) (error \"not yet runnable in gallery — see test suite\"))"))))