From 0554c512d9821429c5ccbd029ae49bb36b9cd4c4 Mon Sep 17 00:00:00 2001
From: raythurnvoid <53383860+raythurnvoid@users.noreply.github.com>
Date: Sun, 15 Jun 2025 20:01:47 +0100
Subject: [PATCH] Add tests
---
.../error-boundary-reset-onerror/_config.js | 20 +++++++
.../error-boundary-reset-onerror/main.svelte | 17 ++++++
.../error-boundary-reset-premature/_config.js | 58 +++++++++++++++++++
.../main.svelte | 26 +++++++++
4 files changed, 121 insertions(+)
create mode 100644 packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/_config.js
create mode 100644 packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/main.svelte
create mode 100644 packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/_config.js
create mode 100644 packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/main.svelte
diff --git a/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/_config.js b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/_config.js
new file mode 100644
index 0000000000..2a18790c61
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/_config.js
@@ -0,0 +1,20 @@
+import { flushSync } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ test({ assert, target, warnings }) {
+ const btn = target.querySelector('button');
+
+ btn?.click();
+
+ assert.throws(() => {
+ flushSync();
+ }, 'error on template render');
+
+ // Check that the warning is being showed to the user
+ assert.include(warnings[0], 'reset() was invoked');
+
+ // boundary content empty; only button remains
+ assert.htmlEqual(target.innerHTML, ``);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/main.svelte b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/main.svelte
new file mode 100644
index 0000000000..f91048a9e7
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/main.svelte
@@ -0,0 +1,17 @@
+
+
+ reset()}>
+ {must_throw ? throw_error() : 'normal content'}
+
+ {#snippet failed()}
+ err
+ {/snippet}
+
+
+
diff --git a/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/_config.js b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/_config.js
new file mode 100644
index 0000000000..048413ad7b
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/_config.js
@@ -0,0 +1,58 @@
+import { flushSync } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ html: `
+ normal content
+
+ `,
+
+ expect_unhandled_rejections: true,
+
+ async test({ assert, target, warnings, window }) {
+ // @ts-expect-error
+ const __expected_error = (window.__expected_error = { v: false });
+
+ window.addEventListener('error', (e) => {
+ // @ts-expect-error when in hydrate mode we can't access variables in the scope
+ const __expected_error = window.__expected_error;
+
+ if (__expected_error.v) {
+ assert.include(e.error.message, 'error on template render');
+ } else {
+ assert.fail('Error was not expected: ' + e.error.message);
+ }
+ e.preventDefault();
+ });
+
+ const btn = target.querySelector('button');
+
+ // 1st click — error caught, fallback visible
+ btn?.click();
+ flushSync();
+ assert.htmlEqual(target.innerHTML, `
err
`);
+
+ // 2nd click — reset succeeds, normal render
+ btn?.click();
+ flushSync();
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ normal content
+
+ `
+ );
+
+ // 3rd click — mount-time crash escapes, boundary empty
+ __expected_error.v = true;
+ btn?.click();
+ flushSync();
+ __expected_error.v = false;
+
+ // Check that the warning is being showed to the user
+ assert.include(warnings[0], 'reset() was invoked');
+
+ // boundary content empty; only button remains
+ assert.htmlEqual(target.innerHTML, ``);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/main.svelte b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/main.svelte
new file mode 100644
index 0000000000..c1462eaf09
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/main.svelte
@@ -0,0 +1,26 @@
+
+
+
+ (reset = fn)}>
+ {must_throw ? throw_error() : 'normal content'}
+
+ {#snippet failed()}
+ err
+ {/snippet}
+
+
+
+