mirror of https://github.com/sveltejs/svelte
parent
ab9863cebb
commit
a996f4072b
@ -0,0 +1,29 @@
|
||||
import { tick } from 'svelte';
|
||||
import { test } from '../../test';
|
||||
|
||||
// A block's selection in an earlier batch survives a later batch committing a different
|
||||
// selection first, if the earlier batch's view of what the block reads doesn't change
|
||||
export default test({
|
||||
async test({ assert, target }) {
|
||||
const [flag, a, resolve] = target.querySelectorAll('button');
|
||||
|
||||
resolve.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.querySelector('span')?.outerHTML ?? '', '<span>yes</span>');
|
||||
|
||||
// pending: selects `no` (the block reads `flag` and `b`)
|
||||
flag.click();
|
||||
await tick();
|
||||
|
||||
// selects `yes` (in this batch's view, `flag` is still true, so the block reads `a`) and commits
|
||||
a.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.querySelector('p')?.outerHTML ?? '', '<p>true</p>');
|
||||
assert.htmlEqual(target.querySelector('span')?.outerHTML ?? '', '<span>yes</span>');
|
||||
|
||||
resolve.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.querySelector('p')?.outerHTML ?? '', '<p>false</p>');
|
||||
assert.htmlEqual(target.querySelector('span')?.outerHTML ?? '', '<span>no</span>');
|
||||
}
|
||||
});
|
||||
@ -0,0 +1,26 @@
|
||||
<script>
|
||||
let flag = $state(true);
|
||||
let a = $state(1);
|
||||
let b = $state(0);
|
||||
const pending = [];
|
||||
|
||||
function wait(v) {
|
||||
return new Promise((r) => pending.push(() => r(v)));
|
||||
}
|
||||
</script>
|
||||
|
||||
<button onclick={() => (flag = false)}>flag</button>
|
||||
<button onclick={() => (a = 2)}>a</button>
|
||||
<button onclick={() => pending.shift()?.()}>resolve</button>
|
||||
|
||||
<svelte:boundary>
|
||||
<p>{await wait(flag)}</p>
|
||||
|
||||
{#if flag ? a : b}
|
||||
<span>yes</span>
|
||||
{:else}
|
||||
<span>no</span>
|
||||
{/if}
|
||||
|
||||
{#snippet pending()}<p>loading</p>{/snippet}
|
||||
</svelte:boundary>
|
||||
@ -0,0 +1,32 @@
|
||||
import { tick } from 'svelte';
|
||||
import { test } from '../../test';
|
||||
|
||||
// An earlier batch keeps the result of its own run of an async expression when a later batch,
|
||||
// in whose view the expression read other values, commits first
|
||||
export default test({
|
||||
async test({ assert, target }) {
|
||||
const [flag, d, d1, d2, x10] = target.querySelectorAll('button');
|
||||
|
||||
d1.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.querySelector('p')?.outerHTML ?? '', '<p>d1</p>');
|
||||
|
||||
// pending: the expression reads `flag` and `x`
|
||||
flag.click();
|
||||
await tick();
|
||||
|
||||
// pending: in this batch's view, `flag` is still true, so the expression reads `d`
|
||||
d.click();
|
||||
await tick();
|
||||
|
||||
d2.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.querySelector('p')?.outerHTML ?? '', '<p>d2</p>');
|
||||
assert.htmlEqual(target.querySelector('span')?.outerHTML ?? '', '<span>true 2</span>');
|
||||
|
||||
x10.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.querySelector('p')?.outerHTML ?? '', '<p>x10</p>');
|
||||
assert.htmlEqual(target.querySelector('span')?.outerHTML ?? '', '<span>false 2</span>');
|
||||
}
|
||||
});
|
||||
@ -0,0 +1,27 @@
|
||||
<script>
|
||||
let flag = $state(true);
|
||||
let d = $state(1);
|
||||
let x = $state(10);
|
||||
const pending = [];
|
||||
|
||||
function wait(v) {
|
||||
return new Promise((r) => pending.push({ v, r: () => r(v) }));
|
||||
}
|
||||
|
||||
function resolve(v) {
|
||||
const i = pending.findIndex((p) => p.v === v);
|
||||
if (i !== -1) pending.splice(i, 1)[0].r();
|
||||
}
|
||||
</script>
|
||||
|
||||
<button onclick={() => (flag = false)}>flag</button>
|
||||
<button onclick={() => d++}>d</button>
|
||||
<button onclick={() => resolve('d1')}>d1</button>
|
||||
<button onclick={() => resolve('d2')}>d2</button>
|
||||
<button onclick={() => resolve('x10')}>x10</button>
|
||||
|
||||
<svelte:boundary>
|
||||
<p>{await wait(flag ? 'd' + d : 'x' + x)}</p>
|
||||
<span>{flag} {d}</span>
|
||||
{#snippet pending()}<p>loading</p>{/snippet}
|
||||
</svelte:boundary>
|
||||
Loading…
Reference in new issue