HS: deferred-reraise in catch + exception event tests (+5)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 20s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 20s
- compiler: wrap catch body in nested guard so (raise e) inside a catch handler defers the re-raise until after the guard exits, avoiding the handler-stays-active infinite loop - generator: MANUAL_TEST_BODIES for rethrown/uncaught exception events, can-pick-detail/event-property, bootstrap bootstraps; remove from skip-list; regenerate behavioral spec Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -106,16 +106,11 @@ SKIP_TEST_NAMES = {
|
||||
# upstream 'on' category — missing runtime features
|
||||
"listeners on other elements are removed when the registering element is removed",
|
||||
"listeners on self are not removed when the element is removed",
|
||||
"can pick detail fields out by name",
|
||||
"can pick event properties out by name",
|
||||
"can be in a top level script tag",
|
||||
"multiple event handlers at a time are allowed to execute with the every keyword",
|
||||
"each behavior installation has its own event queue",
|
||||
"can catch exceptions thrown in js functions",
|
||||
"can catch exceptions thrown in hyperscript functions",
|
||||
"uncaught exceptions trigger 'exception' event",
|
||||
"rethrown exceptions trigger 'exception' event",
|
||||
"rethrown exceptions trigger 'exception' event",
|
||||
"basic finally blocks work",
|
||||
"finally blocks work when exception thrown in catch",
|
||||
"async basic finally blocks work",
|
||||
@@ -167,6 +162,94 @@ MANUAL_TEST_BODIES = {
|
||||
"can map an array": [
|
||||
' (assert= (map (eval-expr-cek (hs-to-sx (hs-compile "\\\\ s -> s.length"))) (list "a" "ab" "abc")) (list 1 2 3))',
|
||||
],
|
||||
# bootstrap: restore correct bodies that auto-regen gets wrong
|
||||
"can call functions": [
|
||||
' (hs-cleanup!)',
|
||||
' (host-set! (host-global "window") "calledWith" nil)',
|
||||
' (let ((_el-div (dom-create-element "div")))',
|
||||
' (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)',
|
||||
' )',
|
||||
],
|
||||
"cleanup removes event listeners on the element": [
|
||||
' (hs-cleanup!)',
|
||||
' (let ((_el-div (dom-create-element "div")))',
|
||||
' (dom-set-attr _el-div "_" "on click add .foo")',
|
||||
' (dom-append (dom-body) _el-div)',
|
||||
' (hs-activate! _el-div)',
|
||||
' (dom-dispatch _el-div "click" nil)',
|
||||
' (assert (dom-has-class? _el-div "foo"))',
|
||||
' (hs-deactivate! _el-div)',
|
||||
' (dom-remove-class _el-div "foo")',
|
||||
' (dom-dispatch _el-div "click" nil)',
|
||||
' (assert (not (dom-has-class? _el-div "foo"))))',
|
||||
],
|
||||
"reinitializes if script attribute changes": [
|
||||
' (hs-cleanup!)',
|
||||
' (let ((_el-div (dom-create-element "div")))',
|
||||
' (dom-set-attr _el-div "_" "on click add .foo")',
|
||||
' (dom-append (dom-body) _el-div)',
|
||||
' (hs-activate! _el-div)',
|
||||
' (dom-dispatch _el-div "click" nil)',
|
||||
' (assert (dom-has-class? _el-div "foo"))',
|
||||
' (dom-set-attr _el-div "_" "on click add .bar")',
|
||||
' (hs-activate! _el-div)',
|
||||
' (dom-dispatch _el-div "click" nil)',
|
||||
' (assert (dom-has-class? _el-div "bar")))',
|
||||
],
|
||||
# on: event destructuring — on EVENT(prop) extracts from detail then event
|
||||
"can pick detail fields out by name": [
|
||||
' (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 "_" "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 (dom-body) _el-d1)',
|
||||
' (dom-append (dom-body) _el-d2)',
|
||||
' (hs-activate! _el-d1)',
|
||||
' (hs-activate! _el-d2)',
|
||||
' (assert (not (dom-has-class? _el-d2 "fromBar")))',
|
||||
' (dom-dispatch _el-d1 "click" nil)',
|
||||
' (assert (dom-has-class? _el-d2 "fromBar")))',
|
||||
],
|
||||
"can pick event properties out by name": [
|
||||
' (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 "_" "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 (dom-body) _el-d1)',
|
||||
' (dom-append (dom-body) _el-d2)',
|
||||
' (hs-activate! _el-d1)',
|
||||
' (hs-activate! _el-d2)',
|
||||
' (assert (not (dom-has-class? _el-d2 "fromBar")))',
|
||||
' (dom-dispatch _el-d1 "click" nil)',
|
||||
' (assert (dom-has-class? _el-d2 "fromBar")))',
|
||||
],
|
||||
"rethrown exceptions trigger 'exception' event": [
|
||||
' (hs-cleanup!)',
|
||||
' (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 (dom-body) _el-button)',
|
||||
' (hs-activate! _el-button)',
|
||||
' (dom-dispatch _el-button "click" nil)',
|
||||
' (assert= (dom-text-content _el-button) "bar"))',
|
||||
],
|
||||
"uncaught exceptions trigger 'exception' event": [
|
||||
' (hs-cleanup!)',
|
||||
' (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 (dom-body) _el-button)',
|
||||
' (hs-activate! _el-button)',
|
||||
' (dom-dispatch _el-button "click" nil)',
|
||||
' (assert= (dom-text-content _el-button) "bar"))',
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user