HS: Group 11 misc — toggle-var-cycle, closest-to, tailwind class, toggle timing (+3 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 6m13s

- parser: `toggle $var between v1 and v2 ...` → `(toggle-var-cycle $var (v1 v2 ...))`
- compiler: emit `(hs-toggle-var-cycle! win var-name values)` for new AST node
- runtime: `hs-toggle-var-cycle!` cycles through a list of values on a variable
- parser: `closest .sel to .target` / `closest #id to .target` / `closest sel to .target`
  now consumes the `to` keyword and parses the target expr instead of defaulting to beingTold
- tokenizer: `read-class-name` handles backslash escapes and allows `(`, `)`, `&`
  chars so Tailwind classes like `group-[:nth-of-type(3)_&]:block` tokenize correctly
- platform.py: `domListen` drives async result via `_driveAsync` after `cekCall`
- test: fixed-time toggle asserts `.foo` IS present after click (toggle started, 10ms window open)
- generate-sx-tests.py: aligned MANUAL_TEST_BODIES for timed toggle with corrected assertion

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-04 17:03:52 +00:00
parent d47db58cde
commit d9b7e1e392
12 changed files with 569 additions and 306 deletions

View File

@@ -12986,10 +12986,14 @@ end")
)
;; ── toggle (25 tests) ──
(defsuite "hs-upstream-toggle"
(deftest "can target another div for class ref toggle"
(defsuite
"hs-upstream-toggle"
(deftest
"can target another div for class ref toggle"
(hs-cleanup!)
(let ((_el-bar (dom-create-element "div")) (_el-div (dom-create-element "div")))
(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 toggle .foo on #bar")
(dom-append (dom-body) _el-bar)
@@ -12999,12 +13003,16 @@ end")
(dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil)
(assert (dom-has-class? (dom-query-by-id "bar") "foo"))
(dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil)
(assert (not (dom-has-class? (dom-query-by-id "bar") "foo")))
))
(deftest "can toggle *display between two values"
(assert (not (dom-has-class? (dom-query-by-id "bar") "foo")))))
(deftest
"can toggle *display between two values"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle *display of me between 'none' and 'flex'")
(let
((_el-div (dom-create-element "div")))
(dom-set-attr
_el-div
"_"
"on click toggle *display of me between 'none' and 'flex'")
(dom-set-attr _el-div "style" "display:none")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13012,12 +13020,16 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "display") "flex")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "display") "none")
))
(deftest "can toggle *opacity between three values"
(assert= (dom-get-style _el-div "display") "none")))
(deftest
"can toggle *opacity between three values"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle *opacity of me between '0', '0.5' and '1'")
(let
((_el-div (dom-create-element "div")))
(dom-set-attr
_el-div
"_"
"on click toggle *opacity of me between '0', '0.5' and '1'")
(dom-set-attr _el-div "style" "opacity:0")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13027,33 +13039,45 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "opacity") "1")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "opacity") "0")
))
(deftest "can toggle a global variable between three values"
(assert= (dom-get-style _el-div "opacity") "0")))
(deftest
"can toggle a global variable between three values"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle $state between 'a', 'b' and 'c'")
(let
((_el-div (dom-create-element "div")))
(dom-set-attr
_el-div
"_"
"on click toggle $state between 'a', 'b' and 'c'")
(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)
(dom-dispatch _el-div "click" nil)
))
(deftest "can toggle a global variable between two values"
(dom-dispatch _el-div "click" nil)))
(deftest
"can toggle a global variable between two values"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle $mode between 'edit' and 'preview'")
(let
((_el-div (dom-create-element "div")))
(dom-set-attr
_el-div
"_"
"on click toggle $mode between 'edit' and 'preview'")
(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)
))
(deftest "can toggle between different attributes"
(dom-dispatch _el-div "click" nil)))
(deftest
"can toggle between different attributes"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle between [@enabled='true'] and [@disabled='true']")
(let
((_el-div (dom-create-element "div")))
(dom-set-attr
_el-div
"_"
"on click toggle between [@enabled='true'] and [@disabled='true']")
(dom-set-attr _el-div "enabled" "true")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13061,12 +13085,16 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-attr _el-div "disabled") "true")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-attr _el-div "enabled") "true")
))
(deftest "can toggle between two attribute values"
(assert= (dom-get-attr _el-div "enabled") "true")))
(deftest
"can toggle between two attribute values"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle between [@data-state='active'] and [@data-state='inactive']")
(let
((_el-div (dom-create-element "div")))
(dom-set-attr
_el-div
"_"
"on click toggle between [@data-state='active'] and [@data-state='inactive']")
(dom-set-attr _el-div "data-state" "active")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13074,11 +13102,12 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-attr _el-div "data-state") "inactive")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-attr _el-div "data-state") "active")
))
(deftest "can toggle between two classes"
(assert= (dom-get-attr _el-div "data-state") "active")))
(deftest
"can toggle between two classes"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-add-class _el-div "foo")
(dom-set-attr _el-div "_" "on click toggle between .foo and .bar")
(dom-append (dom-body) _el-div)
@@ -13090,11 +13119,12 @@ end")
(assert (dom-has-class? _el-div "bar"))
(dom-dispatch _el-div "click" nil)
(assert (dom-has-class? _el-div "foo"))
(assert (not (dom-has-class? _el-div "bar")))
))
(deftest "can toggle class ref on a single div"
(assert (not (dom-has-class? _el-div "bar")))))
(deftest
"can toggle class ref on a single div"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle .foo")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13102,11 +13132,12 @@ end")
(dom-dispatch _el-div "click" nil)
(assert (dom-has-class? _el-div "foo"))
(dom-dispatch _el-div "click" nil)
(assert (not (dom-has-class? _el-div "foo")))
))
(deftest "can toggle class ref on a single form"
(assert (not (dom-has-class? _el-div "foo")))))
(deftest
"can toggle class ref on a single form"
(hs-cleanup!)
(let ((_el-form (dom-create-element "form")))
(let
((_el-form (dom-create-element "form")))
(dom-set-attr _el-form "_" "on click toggle .foo")
(dom-append (dom-body) _el-form)
(hs-activate! _el-form)
@@ -13114,20 +13145,25 @@ end")
(dom-dispatch _el-form "click" nil)
(assert (dom-has-class? _el-form "foo"))
(dom-dispatch _el-form "click" nil)
(assert (not (dom-has-class? _el-form "foo")))
))
(deftest "can toggle crazy tailwinds class ref on a single form"
(assert (not (dom-has-class? _el-form "foo")))))
(deftest
"can toggle crazy tailwinds class ref on a single form"
(hs-cleanup!)
(let ((_el-form (dom-create-element "form")))
(dom-set-attr _el-form "_" "on click toggle .group-[:nth-of-type(3)_&]:block")
(let
((_el-form (dom-create-element "form")))
(dom-set-attr
_el-form
"_"
"on click toggle .group-[:nth-of-type(3)_&]:block")
(dom-append (dom-body) _el-form)
(hs-activate! _el-form)
(dom-dispatch _el-form "click" nil)
(dom-dispatch _el-form "click" nil)
))
(deftest "can toggle display"
(dom-dispatch _el-form "click" nil)))
(deftest
"can toggle display"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle *display")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13135,11 +13171,13 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "display") "none")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "display") "block")
))
(deftest "can toggle display on other elt"
(assert= (dom-get-style _el-div "display") "block")))
(deftest
"can toggle display on other elt"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")) (_el-d2 (dom-create-element "div")))
(let
((_el-div (dom-create-element "div"))
(_el-d2 (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle the *display of #d2")
(dom-set-attr _el-d2 "id" "d2")
(dom-append (dom-body) _el-div)
@@ -13149,11 +13187,12 @@ end")
(dom-dispatch (nth (dom-query-all (dom-body) "div") 0) "click" nil)
(assert= (dom-get-style (dom-query-by-id "d2") "display") "none")
(dom-dispatch (nth (dom-query-all (dom-body) "div") 0) "click" nil)
(assert= (dom-get-style (dom-query-by-id "d2") "display") "block")
))
(deftest "can toggle display w/ my"
(assert= (dom-get-style (dom-query-by-id "d2") "display") "block")))
(deftest
"can toggle display w/ my"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle my *display")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13161,22 +13200,23 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "display") "none")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "display") "block")
))
(deftest "can toggle for a fixed amount of time"
(assert= (dom-get-style _el-div "display") "block")))
(deftest
"can toggle for a fixed amount of time"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle .foo for 10ms")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
(assert (not (dom-has-class? _el-div "foo")))
(dom-dispatch _el-div "click" nil)
(assert (dom-has-class? _el-div "foo"))
(assert (not (dom-has-class? _el-div "foo")))
))
(deftest "can toggle multiple class refs"
(let
((_el (dom-create-element "div")))
(dom-set-attr _el "_" "on click toggle .foo for 10ms")
(dom-append (dom-body) _el)
(hs-activate! _el)
(assert (not (dom-has-class? _el "foo")))
(dom-dispatch _el "click" nil)
(assert (dom-has-class? _el "foo"))))
(deftest
"can toggle multiple class refs"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-add-class _el-div "bar")
(dom-set-attr _el-div "_" "on click toggle .foo .bar")
(dom-append (dom-body) _el-div)
@@ -13188,11 +13228,12 @@ end")
(assert (not (dom-has-class? _el-div "bar")))
(dom-dispatch _el-div "click" nil)
(assert (not (dom-has-class? _el-div "foo")))
(assert (dom-has-class? _el-div "bar"))
))
(deftest "can toggle non-class attributes"
(assert (dom-has-class? _el-div "bar"))))
(deftest
"can toggle non-class attributes"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle [@foo=\"bar\"]")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13200,11 +13241,12 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-attr _el-div "foo") "bar")
(dom-dispatch _el-div "click" nil)
(assert (not (dom-has-attr? _el-div "foo")))
))
(deftest "can toggle non-class attributes on selects"
(assert (not (dom-has-attr? _el-div "foo")))))
(deftest
"can toggle non-class attributes on selects"
(hs-cleanup!)
(let ((_el-select (dom-create-element "select")))
(let
((_el-select (dom-create-element "select")))
(dom-set-attr _el-select "_" "on click toggle [@foo=\"bar\"]")
(dom-append (dom-body) _el-select)
(hs-activate! _el-select)
@@ -13212,11 +13254,12 @@ end")
(dom-dispatch _el-select "click" nil)
(assert= (dom-get-attr _el-select "foo") "bar")
(dom-dispatch _el-select "click" nil)
(assert (not (dom-has-attr? _el-select "foo")))
))
(deftest "can toggle opacity"
(assert (not (dom-has-attr? _el-select "foo")))))
(deftest
"can toggle opacity"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle *opacity")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13224,11 +13267,13 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "opacity") "0")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "opacity") "1")
))
(deftest "can toggle opacity on other elt"
(assert= (dom-get-style _el-div "opacity") "1")))
(deftest
"can toggle opacity on other elt"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")) (_el-d2 (dom-create-element "div")))
(let
((_el-div (dom-create-element "div"))
(_el-d2 (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle the *opacity of #d2")
(dom-set-attr _el-d2 "id" "d2")
(dom-append (dom-body) _el-div)
@@ -13238,11 +13283,12 @@ end")
(dom-dispatch (nth (dom-query-all (dom-body) "div") 0) "click" nil)
(assert= (dom-get-style (dom-query-by-id "d2") "opacity") "0")
(dom-dispatch (nth (dom-query-all (dom-body) "div") 0) "click" nil)
(assert= (dom-get-style (dom-query-by-id "d2") "opacity") "1")
))
(deftest "can toggle opacity w/ my"
(assert= (dom-get-style (dom-query-by-id "d2") "opacity") "1")))
(deftest
"can toggle opacity w/ my"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle my *opacity")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13250,11 +13296,13 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "opacity") "0")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "opacity") "1")
))
(deftest "can toggle until an event on another element"
(assert= (dom-get-style _el-div "opacity") "1")))
(deftest
"can toggle until an event on another element"
(hs-cleanup!)
(let ((_el-d1 (dom-create-element "div")) (_el-div (dom-create-element "div")))
(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 click toggle .foo until foo from #d1")
(dom-append (dom-body) _el-d1)
@@ -13264,11 +13312,12 @@ end")
(dom-dispatch (dom-query "div:nth-of-type(2)") "click" nil)
(assert (dom-has-class? (dom-query "div:nth-of-type(2)") "foo"))
(dom-dispatch (dom-query-by-id "d1") "foo" nil)
(assert (not (dom-has-class? (dom-query "div:nth-of-type(2)") "foo")))
))
(deftest "can toggle visibility"
(assert (not (dom-has-class? (dom-query "div:nth-of-type(2)") "foo")))))
(deftest
"can toggle visibility"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle *visibility")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13276,11 +13325,13 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "visibility") "hidden")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "visibility") "visible")
))
(deftest "can toggle visibility on other elt"
(assert= (dom-get-style _el-div "visibility") "visible")))
(deftest
"can toggle visibility on other elt"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")) (_el-d2 (dom-create-element "div")))
(let
((_el-div (dom-create-element "div"))
(_el-d2 (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle the *visibility of #d2")
(dom-set-attr _el-d2 "id" "d2")
(dom-append (dom-body) _el-div)
@@ -13290,11 +13341,12 @@ end")
(dom-dispatch (nth (dom-query-all (dom-body) "div") 0) "click" nil)
(assert= (dom-get-style (dom-query-by-id "d2") "visibility") "hidden")
(dom-dispatch (nth (dom-query-all (dom-body) "div") 0) "click" nil)
(assert= (dom-get-style (dom-query-by-id "d2") "visibility") "visible")
))
(deftest "can toggle visibility w/ my"
(assert= (dom-get-style (dom-query-by-id "d2") "visibility") "visible")))
(deftest
"can toggle visibility w/ my"
(hs-cleanup!)
(let ((_el-div (dom-create-element "div")))
(let
((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click toggle my *visibility")
(dom-append (dom-body) _el-div)
(hs-activate! _el-div)
@@ -13302,9 +13354,7 @@ end")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "visibility") "hidden")
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-style _el-div "visibility") "visible")
))
)
(assert= (dom-get-style _el-div "visibility") "visible"))))
;; ── transition (17 tests) ──
(defsuite "hs-upstream-transition"