diff --git a/packages/svelte/tests/runtime-runes/samples/async-branch-commit-order/_config.js b/packages/svelte/tests/runtime-runes/samples/async-branch-commit-order/_config.js new file mode 100644 index 0000000000..a006f88c29 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-branch-commit-order/_config.js @@ -0,0 +1,31 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +const buttons = + ''; + +export default test({ + async test({ assert, target }) { + await tick(); + const [a, b, resolve_a1, resolve_b1] = target.querySelectorAll('button'); + + assert.htmlEqual(target.innerHTML, `

0

0

${buttons}`); + + // batch A waits on its key; batch B registers its key right away + a.click(); + await tick(); + b.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `

0

0

${buttons}`); + + // the older batch commits first + resolve_a1.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `

0

1

${buttons}`); + + // the newer batch commits with its own branch + resolve_b1.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `

1

B

${buttons}`); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-branch-commit-order/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-branch-commit-order/main.svelte new file mode 100644 index 0000000000..c232f535a9 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-branch-commit-order/main.svelte @@ -0,0 +1,30 @@ + + +

{await delay(`b${b}`, b)}

+ +{#key k} +

{k}

+{/key} + + + + + diff --git a/packages/svelte/tests/runtime-runes/samples/async-merge-blocking-pending/_config.js b/packages/svelte/tests/runtime-runes/samples/async-merge-blocking-pending/_config.js new file mode 100644 index 0000000000..be95f3a159 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-merge-blocking-pending/_config.js @@ -0,0 +1,38 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +const buttons = + ''; + +export default test({ + async test({ assert, target, logs }) { + await tick(); + const [X, Y, Z, W, resolve_e, resolve_x1] = target.querySelectorAll('button'); + + assert.htmlEqual(target.innerHTML, `

n = 0

x = 0

${buttons}`); + + // X is deferred on its own await + X.click(); + await tick(); + // Y is deferred on the await inside the new branch + Y.click(); + await tick(); + // Z hides that branch again, merges into Y, which merges into X + Z.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `

n = 0

x = 0

${buttons}`); + assert.deepEqual(logs, ['delay x0', 'delay x1', 'delay e']); + + // the branch's await resolves while it is hidden + resolve_e.click(); + await tick(); + // W shows the branch again and merges into X + W.click(); + await tick(); + + // nothing is pending any more, so X commits + resolve_x1.click(); + await tick(); + assert.htmlEqual(target.innerHTML, `

n = 4

x = 1

cond: e

${buttons}`); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-merge-blocking-pending/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-merge-blocking-pending/main.svelte new file mode 100644 index 0000000000..d4d03aa6eb --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-merge-blocking-pending/main.svelte @@ -0,0 +1,38 @@ + + + +

n = {n}

+

x = {await delay(`x${x}`, x)}

+ {#if cond} +

cond: {await delay('e', 'e')}

+ {/if} + + {#snippet pending()} +

loading

+ {/snippet} +
+ + + + + + +