From 8e4bdb721622e6a11a92d01c6a32e0d44e1e4793 Mon Sep 17 00:00:00 2001 From: giles Date: Sat, 25 Apr 2026 18:55:40 +0000 Subject: [PATCH] HS E40: generator removes 7 E40 tests from skip-list; window.addEventListener handler (+1) --- spec/tests/test-hyperscript-behavioral.sx | 66 ++++++++++++++++++++--- tests/playwright/generate-sx-tests.py | 32 ++++++----- 2 files changed, 79 insertions(+), 19 deletions(-) diff --git a/spec/tests/test-hyperscript-behavioral.sx b/spec/tests/test-hyperscript-behavioral.sx index 555e4a31..63974ed0 100644 --- a/spec/tests/test-hyperscript-behavioral.sx +++ b/spec/tests/test-hyperscript-behavioral.sx @@ -7168,7 +7168,14 @@ ;; ── fetch (23 tests) ── (defsuite "hs-upstream-fetch" (deftest "Response can be converted to JSON via as JSON" - (error "SKIP (skip-list): Response can be converted to JSON via as JSON")) + (hs-cleanup!) + (let ((_el-div (dom-create-element "div"))) + (dom-set-attr _el-div "_" "on click fetch /test as Response then put (it as JSON).name into me") + (dom-append (dom-body) _el-div) + (hs-activate! _el-div) + (dom-dispatch _el-div "click" nil) + (assert= (dom-text-content _el-div) "Joe") + )) (deftest "allows the event handler to change the fetch parameters" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) @@ -7179,9 +7186,23 @@ (assert= (dom-text-content _el-div) "yay") )) (deftest "as response does not throw on 404" - (error "SKIP (skip-list): as response does not throw on 404")) + (hs-cleanup!) + (let ((_el-div (dom-create-element "div"))) + (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) + (dom-dispatch _el-div "click" nil) + (assert= (dom-text-content _el-div) "404") + )) (deftest "can catch an error that occurs when using fetch" - (error "SKIP (skip-list): can catch an error that occurs when using fetch")) + (hs-cleanup!) + (let ((_el-div (dom-create-element "div"))) + (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= (dom-text-content _el-div) "yay") + )) (deftest "can do a simple fetch" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) @@ -7302,9 +7323,23 @@ (assert= (dom-text-content _el-div) "yay") )) (deftest "do not throw passes through 404 response" - (error "SKIP (skip-list): do not throw passes through 404 response")) + (hs-cleanup!) + (let ((_el-div (dom-create-element "div"))) + (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) + (dom-dispatch _el-div "click" nil) + (assert= (dom-text-content _el-div) "the body") + )) (deftest "don't throw passes through 404 response" - (error "SKIP (skip-list): don't throw passes through 404 response")) + (hs-cleanup!) + (let ((_el-div (dom-create-element "div"))) + (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) + (dom-dispatch _el-div "click" nil) + (assert= (dom-text-content _el-div) "the body") + )) (deftest "submits the fetch parameters to the event handler" (hs-cleanup!) (host-set! (host-global "window") "headerCheckPassed" false) @@ -7316,9 +7351,26 @@ (assert= (dom-text-content _el-div) "yay") )) (deftest "throws on non-2xx response by default" - (error "SKIP (skip-list): throws on non-2xx response by default")) + (hs-cleanup!) + (let ((_el-div (dom-create-element "div"))) + (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) + (dom-dispatch _el-div "click" nil) + (assert= (dom-text-content _el-div) "caught") + )) (deftest "triggers an event just before fetching" - (error "SKIP (skip-list): triggers an event just before fetching")) + (hs-cleanup!) + (host-call (host-global "window") "addEventListener" "hyperscript:beforeFetch" (fn (_event) (dom-set-attr (host-get _event "target") "class" "foo-set"))) + (let ((_el-div (dom-create-element "div"))) + (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) + (assert (not (dom-has-class? _el-div "foo-set"))) + (dom-dispatch _el-div "click" nil) + (assert (dom-has-class? _el-div "foo-set")) + (assert= (dom-text-content _el-div) "yay") + )) ) ;; ── focus (3 tests) ── diff --git a/tests/playwright/generate-sx-tests.py b/tests/playwright/generate-sx-tests.py index 73c4aa5c..1c284158 100644 --- a/tests/playwright/generate-sx-tests.py +++ b/tests/playwright/generate-sx-tests.py @@ -125,19 +125,9 @@ SKIP_TEST_NAMES = { "can ignore when target doesn't exist", "can ignore when target doesn\\'t exist", "can handle an or after a from clause", - # upstream 'fetch' category — depend on per-test sinon stubs for 404 / thrown errors, - # or on real DocumentFragment semantics (`its childElementCount` after `as html`). - # Our generic test-runner mock returns a fixed 200 response, so these cases - # (non-2xx handling, error path, before-fetch event, real DOM fragment) can't be - # exercised here. + # upstream 'fetch' category — real DocumentFragment semantics (`its childElementCount` + # after `as html`) not exercisable with our DOM mock. "can do a simple fetch w/ html", - "triggers an event just before fetching", - "can catch an error that occurs when using fetch", - "throws on non-2xx response by default", - "do not throw passes through 404 response", - "don't throw passes through 404 response", - "as response does not throw on 404", - "Response can be converted to JSON via as JSON", } @@ -963,6 +953,24 @@ def parse_dev_body(body, elements, var_names): else: pre_setups.append(('__hs_config__', op_expr)) continue + # window.addEventListener(EVT, (param) => { param.target.PROP = 'VAL'; }) + wa = re.search( + r"window\.addEventListener\(\s*(['\"])([^'\"]+)\1\s*,\s*" + r"\((\w+)\)\s*=>\s*\{\s*\3\.target\.(\w+)\s*=\s*['\"]([^'\"]+)['\"]\s*;?\s*\}", + m.group(1), + ) + if wa: + ev_name = wa.group(2) + prop = wa.group(4) + val = wa.group(5) + attr = 'class' if prop == 'className' else prop + sx = (f'(host-call (host-global "window") "addEventListener" "{ev_name}" ' + f'(fn (_event) (dom-set-attr (host-get _event "target") "{attr}" "{val}")))') + if seen_html: + ops.append(sx) + else: + pre_setups.append(('__hs_config__', sx)) + continue # fall through # evaluate(() => _hyperscript.config.X = ...) single-line variant.