mirror of https://github.com/sveltejs/svelte
parent
a360023551
commit
75d1e0aef4
@ -0,0 +1,41 @@
|
|||||||
|
import { tick } from 'svelte';
|
||||||
|
import { test } from '../../test';
|
||||||
|
|
||||||
|
export default test({
|
||||||
|
async test({ assert, target, logs, warnings }) {
|
||||||
|
await tick();
|
||||||
|
const [increment, independent, resolve_sealed, resolve_latest] =
|
||||||
|
target.querySelectorAll('button');
|
||||||
|
|
||||||
|
for (let i = 0; i < 13; i++) {
|
||||||
|
increment.click();
|
||||||
|
await tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.isTrue(warnings.length === 1 && warnings[0].includes('Your app is stuck in a loop'));
|
||||||
|
|
||||||
|
independent.click();
|
||||||
|
await tick();
|
||||||
|
assert.htmlEqual(
|
||||||
|
target.innerHTML,
|
||||||
|
'<p>0:0:0:0</p><button>increment</button><button>independent</button><button>resolve sealed</button><button>resolve latest</button>'
|
||||||
|
);
|
||||||
|
assert.deepEqual(logs, []);
|
||||||
|
|
||||||
|
resolve_sealed.click();
|
||||||
|
await tick();
|
||||||
|
assert.htmlEqual(
|
||||||
|
target.innerHTML,
|
||||||
|
'<p>11:1:22:22</p><button>increment</button><button>independent</button><button>resolve sealed</button><button>resolve latest</button>'
|
||||||
|
);
|
||||||
|
assert.equal(logs.length, 11);
|
||||||
|
|
||||||
|
resolve_latest.click();
|
||||||
|
await tick();
|
||||||
|
assert.htmlEqual(
|
||||||
|
target.innerHTML,
|
||||||
|
'<p>13:1:26:26</p><button>increment</button><button>independent</button><button>resolve sealed</button><button>resolve latest</button>'
|
||||||
|
);
|
||||||
|
assert.equal(logs.length, 13);
|
||||||
|
}
|
||||||
|
});
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
<script>
|
||||||
|
import { settled } from 'svelte';
|
||||||
|
|
||||||
|
let count = $state(0);
|
||||||
|
let independent = $state(0);
|
||||||
|
let doubled = $derived(count * 2);
|
||||||
|
const deferred = new Map();
|
||||||
|
|
||||||
|
function delay(value) {
|
||||||
|
if (value === 0) return value;
|
||||||
|
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
deferred.set(value, () => resolve(value));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function increment() {
|
||||||
|
count += 1;
|
||||||
|
await settled();
|
||||||
|
console.log('settled');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<p>{count}:{independent}:{doubled}:{await delay(doubled)}</p>
|
||||||
|
<button onclick={increment}>increment</button>
|
||||||
|
<button onclick={() => independent++}>independent</button>
|
||||||
|
<button onclick={() => deferred.get(22)?.()}>resolve sealed</button>
|
||||||
|
<button onclick={() => deferred.get(count * 2)?.()}>resolve latest</button>
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
import { tick } from 'svelte';
|
||||||
|
import { test } from '../../test';
|
||||||
|
|
||||||
|
export default test({
|
||||||
|
async test({ assert, target, warnings }) {
|
||||||
|
await tick();
|
||||||
|
const [increment, resolve_sealed, resolve_latest] = target.querySelectorAll('button');
|
||||||
|
|
||||||
|
for (let i = 0; i < 13; i++) {
|
||||||
|
increment.click();
|
||||||
|
await tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.isTrue(warnings.length === 1 && warnings[0].includes('Your app is stuck in a loop'));
|
||||||
|
assert.htmlEqual(
|
||||||
|
target.innerHTML,
|
||||||
|
'<p>0:0</p><button>increment</button><button>resolve sealed</button><button>resolve latest</button>'
|
||||||
|
);
|
||||||
|
|
||||||
|
resolve_sealed.click();
|
||||||
|
await tick();
|
||||||
|
assert.htmlEqual(
|
||||||
|
target.innerHTML,
|
||||||
|
'<p>11:11</p><button>increment</button><button>resolve sealed</button><button>resolve latest</button>'
|
||||||
|
);
|
||||||
|
|
||||||
|
resolve_latest.click();
|
||||||
|
await tick();
|
||||||
|
assert.htmlEqual(
|
||||||
|
target.innerHTML,
|
||||||
|
'<p>13:13</p><button>increment</button><button>resolve sealed</button><button>resolve latest</button>'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
<script>
|
||||||
|
let count = $state(0);
|
||||||
|
const deferred = new Map();
|
||||||
|
|
||||||
|
function delay(value) {
|
||||||
|
if (value === 0) return value;
|
||||||
|
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
deferred.set(value, () => resolve(value));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<p>{count}:{await delay(count)}</p>
|
||||||
|
<button onclick={() => count++}>increment</button>
|
||||||
|
<button onclick={() => deferred.get(11)?.()}>resolve sealed</button>
|
||||||
|
<button onclick={() => deferred.get(count)?.()}>resolve latest</button>
|
||||||
Loading…
Reference in new issue