HS test generator: fix toHaveCSS, locals, and \"-escapes — +28 tests
Generator changes (tests/playwright/generate-sx-tests.py):
- toHaveCSS regex: balance parens so `'rgb(255, 0, 0)'` is captured intact
(was truncating at first `)`)
- Map browser-computed colors `rgb(R,G,B)` back to CSS keywords
(red/green/blue/black/white) — our DOM mock returns the inline value
- js_val_to_sx now handles object literals `{a: 1, b: {c: 2}}` → `{:a 1 :b {:c 2}}`
- Pattern 2 (`var x = await run(...)`) now captures locals via balanced-brace
scan and emits `eval-hs-locals` instead of `eval-hs`
- Pattern 1 with locals: emit `eval-hs-locals` (was wrapping in `let`, which
doesn't reach the inner HS env)
- Stop collapsing `\"` → `"` in raw HTML (line 218): the backslash escapes
are legitimate in single-quoted `_='...'` HS attribute values containing
nested HS scripts
Test-framework changes (regenerated into spec/tests/test-hyperscript-behavioral.sx):
- `_hs-wrap-body`: returns expression value if non-nil, else `it`. Lets bare
expressions (`foo.foo`) and `it`-mutating scripts (`pick first 3 of arr;
set $test to it`) both round-trip through the same wrapper
- `eval-hs-locals` now injects locals via `(let ((name (quote val)) ...) sx)`
rather than `apply handler (cons nil vals)` — works around a JIT loop on
some compiled forms (e.g. `bar.doh of foo` with undefined `bar`)
Also synced lib/hyperscript/*.sx → shared/static/wasm/sx/hs-*.sx (the WASM
test runner reads from the wasm/sx/ copies).
Net per-cluster pass counts (vs prior baseline):
- put: 23 → 29 (+6)
- set: 21 → 28 (+7)
- show: 7 → 15 (+8)
- expressions/propertyAccess: 3 → 9 (+6)
- expressions/possessiveExpression: 17 → 18 (+1)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -94,7 +94,7 @@
|
||||
((or (= prop "display") (= prop "opacity"))
|
||||
(if
|
||||
(or (= cur "none") (= cur "0"))
|
||||
(dom-set-style target prop (if (= prop "opacity") "1" ""))
|
||||
(dom-set-style target prop (if (= prop "opacity") "1" "block"))
|
||||
(dom-set-style target prop (if (= prop "display") "none" "0"))))
|
||||
(true
|
||||
(if
|
||||
@@ -821,11 +821,26 @@
|
||||
((nil? suffix) false)
|
||||
(true (ends-with? (str s) (str suffix))))))
|
||||
|
||||
(define
|
||||
hs-scoped-set!
|
||||
(fn (el name val) (dom-set-data el (str "hs-local-" name) val)))
|
||||
|
||||
(define
|
||||
hs-scoped-get
|
||||
(fn (el name) (dom-get-data el (str "hs-local-" name))))
|
||||
|
||||
(define
|
||||
hs-precedes?
|
||||
(fn
|
||||
(a b)
|
||||
(cond ((nil? a) false) ((nil? b) false) (true (< (str a) (str b))))))
|
||||
(cond
|
||||
((nil? a) false)
|
||||
((nil? b) false)
|
||||
((and (dict? a) (dict? b))
|
||||
(let
|
||||
((pos (host-call a "compareDocumentPosition" b)))
|
||||
(if (number? pos) (not (= 0 (mod (/ pos 4) 2))) false)))
|
||||
(true (< (str a) (str b))))))
|
||||
|
||||
(define
|
||||
hs-follows?
|
||||
@@ -916,7 +931,18 @@
|
||||
(= obj (nth r 1))
|
||||
(= obj nil)))))))
|
||||
|
||||
(define precedes? (fn (a b) (< (str a) (str b))))
|
||||
(define
|
||||
precedes?
|
||||
(fn
|
||||
(a b)
|
||||
(cond
|
||||
((nil? a) false)
|
||||
((nil? b) false)
|
||||
((and (dict? a) (dict? b))
|
||||
(let
|
||||
((pos (host-call a "compareDocumentPosition" b)))
|
||||
(if (number? pos) (not (= 0 (mod (/ pos 4) 2))) false)))
|
||||
(true (< (str a) (str b))))))
|
||||
|
||||
(define
|
||||
hs-empty?
|
||||
@@ -1206,15 +1232,23 @@
|
||||
(fn
|
||||
(el strategy)
|
||||
(let
|
||||
((tag (dom-get-prop el "tagName")))
|
||||
(cond
|
||||
((= tag "DIALOG")
|
||||
(when (dom-has-attr? el "open") (host-call el "close")))
|
||||
((= tag "DETAILS") (dom-set-prop el "open" false))
|
||||
((= strategy "opacity") (dom-set-style el "opacity" "0"))
|
||||
((= strategy "visibility")
|
||||
(dom-set-style el "visibility" "hidden"))
|
||||
(true (dom-set-style el "display" "none"))))))
|
||||
((parts (split strategy ":")) (tag (dom-get-prop el "tagName")))
|
||||
(let
|
||||
((prop (first parts))
|
||||
(val (if (> (len parts) 1) (nth parts 1) nil)))
|
||||
(cond
|
||||
((= tag "DIALOG")
|
||||
(when (dom-has-attr? el "open") (host-call el "close")))
|
||||
((= tag "DETAILS") (dom-set-prop el "open" false))
|
||||
((= prop "opacity")
|
||||
(dom-set-style el "opacity" (if val val "0")))
|
||||
((= prop "visibility")
|
||||
(dom-set-style el "visibility" (if val val "hidden")))
|
||||
((= prop "hidden") (dom-set-attr el "hidden" ""))
|
||||
((= prop "twDisplay") (dom-add-class el "hidden"))
|
||||
((= prop "twVisibility") (dom-add-class el "invisible"))
|
||||
((= prop "twOpacity") (dom-add-class el "opacity-0"))
|
||||
(true (dom-set-style el "display" (if val val "none"))))))))
|
||||
(define
|
||||
hs-hide!
|
||||
(fn
|
||||
@@ -1230,17 +1264,25 @@
|
||||
(fn
|
||||
(el strategy)
|
||||
(let
|
||||
((tag (dom-get-prop el "tagName")))
|
||||
(cond
|
||||
((= tag "DIALOG")
|
||||
(when
|
||||
(not (dom-has-attr? el "open"))
|
||||
(host-call el "showModal")))
|
||||
((= tag "DETAILS") (dom-set-prop el "open" true))
|
||||
((= strategy "opacity") (dom-set-style el "opacity" "1"))
|
||||
((= strategy "visibility")
|
||||
(dom-set-style el "visibility" "visible"))
|
||||
(true (dom-set-style el "display" ""))))))
|
||||
((parts (split strategy ":")) (tag (dom-get-prop el "tagName")))
|
||||
(let
|
||||
((prop (first parts))
|
||||
(val (if (> (len parts) 1) (nth parts 1) nil)))
|
||||
(cond
|
||||
((= tag "DIALOG")
|
||||
(when
|
||||
(not (dom-has-attr? el "open"))
|
||||
(host-call el "showModal")))
|
||||
((= tag "DETAILS") (dom-set-prop el "open" true))
|
||||
((= prop "opacity")
|
||||
(dom-set-style el "opacity" (if val val "1")))
|
||||
((= prop "visibility")
|
||||
(dom-set-style el "visibility" (if val val "visible")))
|
||||
((= prop "hidden") (dom-remove-attr el "hidden"))
|
||||
((= prop "twDisplay") (dom-remove-class el "hidden"))
|
||||
((= prop "twVisibility") (dom-remove-class el "invisible"))
|
||||
((= prop "twOpacity") (dom-remove-class el "opacity-0"))
|
||||
(true (dom-set-style el "display" (if val val "block"))))))))
|
||||
(define
|
||||
hs-show!
|
||||
(fn
|
||||
|
||||
Reference in New Issue
Block a user