pull/15844/head
Rich Harris 2 months ago
parent 68f59c0cce
commit 2f227b1218

@ -1,24 +1,19 @@
import { flushSync, tick } from 'svelte'; import { flushSync, tick } from 'svelte';
import { deferred } from '../../../../src/internal/shared/utils.js';
import { test } from '../../test'; import { test } from '../../test';
/** @type {ReturnType<typeof deferred>} */
let d;
export default test({ export default test({
html: `<p>pending</p>`, html: `
<button>reset</button>
get props() { <button>a</button>
d = deferred(); <button>b</button>
<button>increment</button>
<p>pending</p>
`,
return { async test({ assert, target, logs }) {
promise: d.promise, const [reset, a, b, increment] = target.querySelectorAll('button');
num: 1
};
},
async test({ assert, target, component, logs }) { a.click();
d.resolve(42);
// TODO why is this necessary? why isn't `await tick()` enough? // TODO why is this necessary? why isn't `await tick()` enough?
await Promise.resolve(); await Promise.resolve();
@ -31,20 +26,55 @@ export default test({
await Promise.resolve(); await Promise.resolve();
flushSync(); flushSync();
await tick(); await tick();
assert.htmlEqual(target.innerHTML, '<p>42</p>'); assert.htmlEqual(
target.innerHTML,
`
<button>reset</button>
<button>a</button>
<button>b</button>
<button>increment</button>
<p>42</p>
`
);
component.num = 2; increment.click();
await tick(); await tick();
assert.htmlEqual(target.innerHTML, '<p>84</p>'); assert.htmlEqual(
target.innerHTML,
`
<button>reset</button>
<button>a</button>
<button>b</button>
<button>increment</button>
<p>84</p>
`
);
d = deferred(); reset.click();
component.promise = d.promise;
await tick(); await tick();
assert.htmlEqual(target.innerHTML, '<p>84</p>'); assert.htmlEqual(
target.innerHTML,
`
<button>reset</button>
<button>a</button>
<button>b</button>
<button>increment</button>
<p>84</p>
`
);
d.resolve(43); b.click();
await tick(); await tick();
assert.htmlEqual(target.innerHTML, '<p>86</p>'); assert.htmlEqual(
target.innerHTML,
`
<button>reset</button>
<button>a</button>
<button>b</button>
<button>increment</button>
<p>86</p>
`
);
assert.deepEqual(logs, [ assert.deepEqual(logs, [
'outside boundary 1', 'outside boundary 1',

@ -1,11 +1,17 @@
<script> <script>
import Child from './Child.svelte'; import Child from './Child.svelte';
let { promise, num } = $props(); let num = $state(1);
let deferred = $state(Promise.withResolvers());
</script> </script>
<button onclick={() => deferred = Promise.withResolvers()}>reset</button>
<button onclick={() => deferred.resolve(42)}>a</button>
<button onclick={() => deferred.resolve(43)}>b</button>
<button onclick={() => num += 1}>increment</button>
<svelte:boundary> <svelte:boundary>
<Child {promise} {num} /> <Child promise={deferred.promise} {num} />
{#snippet pending()} {#snippet pending()}
<p>pending</p> <p>pending</p>

Loading…
Cancel
Save