From 06f7ec0e8a6f83e3d579b88e9cac5ed5dbe27b19 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Sat, 17 Oct 2026 00:33:21 +0200 Subject: [PATCH] bring over tests that pass unchanged --- .../_config.js | 39 +++++++++++++++++ .../main.svelte | 42 +++++++++++++++++++ .../_config.js | 28 +++++++++++++ .../main.svelte | 24 +++++++++++ .../async-fork-commit-empty/_config.js | 22 ++++++++++ .../async-fork-commit-empty/main.svelte | 14 +++++++ 6 files changed, 169 insertions(+) create mode 100644 packages/svelte/tests/runtime-runes/samples/async-derived-assign-keeps-maybe-dirty/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/async-derived-assign-keeps-maybe-dirty/main.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/async-eager-read-new-dependency/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/async-eager-read-new-dependency/main.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/async-fork-commit-empty/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/async-fork-commit-empty/main.svelte diff --git a/packages/svelte/tests/runtime-runes/samples/async-derived-assign-keeps-maybe-dirty/_config.js b/packages/svelte/tests/runtime-runes/samples/async-derived-assign-keeps-maybe-dirty/_config.js new file mode 100644 index 0000000000..ae9ef996f6 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-derived-assign-keeps-maybe-dirty/_config.js @@ -0,0 +1,39 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +const buttons = + ''; + +export default test({ + mode: ['client'], + async test({ assert, target, logs }) { + await tick(); + const [s, u, d, resolve_a, resolve_b, resolve_c] = target.querySelectorAll('button'); + + // batch A: `d` becomes 10, but is not evaluated yet (the `` is deferred) + s.click(); + await tick(); + + // batch B + u.click(); + await tick(); + + // batch C overrides `d` while A and B are pending. This must not mark `d` as + // clean, because the other batches haven't seen its new value (10) yet + d.click(); + await tick(); + + // B sees A's change (but not C's), so `d` is 10 in its world + resolve_b.click(); + await tick(); + assert.equal(logs[0], 'probe 10'); + + resolve_a.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `${buttons}

1

0

1010`); + + resolve_c.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `${buttons}

1

1

9999`); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-derived-assign-keeps-maybe-dirty/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-derived-assign-keeps-maybe-dirty/main.svelte new file mode 100644 index 0000000000..08c00a4911 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-derived-assign-keeps-maybe-dirty/main.svelte @@ -0,0 +1,42 @@ + + + + + + + + + +

{await delay('a', s)}

+

{await delay('c', w)}

+ +{#if show} + {d} +{/if} + +{#if await delay('b', u)} + {await probe(d)} +{/if} diff --git a/packages/svelte/tests/runtime-runes/samples/async-eager-read-new-dependency/_config.js b/packages/svelte/tests/runtime-runes/samples/async-eager-read-new-dependency/_config.js new file mode 100644 index 0000000000..29eec8f6ff --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-eager-read-new-dependency/_config.js @@ -0,0 +1,28 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +const buttons = ` + + + +`; + +// Same as `async-state-read-new-dependency`, but the branch is selected by an eager expression +// Earlier we said the reader inside it must still see the latest value of `value` rather than `undefined`, +// but that decision was adjusted, so this test now verifies the updated behavior. +export default test({ + mode: ['client'], + async test({ assert, target }) { + await tick(); + const [update, show, resolve] = target.querySelectorAll('button'); + + update.click(); // pending batch writes `value` + await tick(); + + show.click(); // eager flush creates the branch, which reads `value` for the first time and crashes + await tick(); + assert.htmlEqual(target.innerHTML, `${buttons}

crash

`); + + resolve.click(); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-eager-read-new-dependency/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-eager-read-new-dependency/main.svelte new file mode 100644 index 0000000000..7a833346fb --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-eager-read-new-dependency/main.svelte @@ -0,0 +1,24 @@ + + + + + + +{await wait(value)} + +{#if $state.eager(show)} + +

{value.x}

+ {#snippet failed()} +

crash

+ {/snippet} +
+{/if} diff --git a/packages/svelte/tests/runtime-runes/samples/async-fork-commit-empty/_config.js b/packages/svelte/tests/runtime-runes/samples/async-fork-commit-empty/_config.js new file mode 100644 index 0000000000..9e17498d26 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-fork-commit-empty/_config.js @@ -0,0 +1,22 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +const buttons = ``; + +// If a fork is auto-discarded it should not throw on user-commit. +export default test({ + mode: ['client'], + async test({ assert, target }) { + const [preload, other, commit] = target.querySelectorAll('button'); + + preload.click(); + await tick(); + other.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `${buttons}

true 1

`); + + commit.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `${buttons}

true 1

`); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-fork-commit-empty/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-fork-commit-empty/main.svelte new file mode 100644 index 0000000000..b4e35f29a7 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-fork-commit-empty/main.svelte @@ -0,0 +1,14 @@ + + + + + + +

{open} {other} {error}