Skip to content

Commit 8edbf77

Browse files
committed
Add tests
1 parent ae5fdf9 commit 8edbf77

File tree

4 files changed

+171
-0
lines changed

4 files changed

+171
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { test } from '../../test';
2+
import { tick } from 'svelte';
3+
4+
export default test({
5+
html: `
6+
<select>
7+
<option value="1">1</option>
8+
<option value="US">US</option>
9+
<option value="FR">FR</option>
10+
</select>
11+
<button id="btn-us">US</button>
12+
<button id="btn-reset">Reset</button>
13+
<button id="btn-fr">FR</button>
14+
`,
15+
16+
async test({ assert, component, window, logs }) {
17+
// Primary assertion: No infinite loop error
18+
assert.notInclude(logs, 'Infinite loop detected');
19+
20+
// Verify component state
21+
const select = window.document.querySelector('select');
22+
if (!select) {
23+
assert.fail('Select element not found');
24+
return;
25+
}
26+
27+
// With default_details fallback nothing is selected
28+
assert.equal(select.value, '');
29+
assert.equal(select.disabled, false);
30+
31+
window.document.getElementById('btn-us')?.click();
32+
await tick();
33+
assert.equal(select.disabled, true);
34+
assert.equal(select.value, 'US');
35+
36+
window.document.getElementById('btn-reset')?.click();
37+
await tick();
38+
assert.equal(select.value, '');
39+
assert.equal(select.disabled, false);
40+
41+
window.document.getElementById('btn-fr')?.click();
42+
await tick();
43+
assert.equal(select.value, 'FR');
44+
assert.equal(select.disabled, true);
45+
}
46+
});
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<script>
2+
const default_details = { country: '' };
3+
4+
$: data = { locked: false, details: null };
5+
6+
let details;
7+
$: {
8+
details = guard_infinite_loop() ?? data.details ?? default_details;
9+
}
10+
11+
// Guard: if this reactive block runs too often we assume an infinite loop
12+
let guard_infinite_loop_counter = 0;
13+
function guard_infinite_loop() {
14+
guard_infinite_loop_counter++;
15+
if (guard_infinite_loop_counter > 20) {
16+
throw new Error('Infinite loop detected');
17+
}
18+
}
19+
20+
function setUS() {
21+
data = { locked: true, details: { country: 'US' } };
22+
}
23+
24+
function resetData() {
25+
data = { locked: false, details: null };
26+
}
27+
28+
function setFR() {
29+
data = { locked: true, details: { country: 'FR' } };
30+
}
31+
</script>
32+
33+
<select bind:value={details.country} disabled={data.locked}>
34+
<option value="1">1</option>
35+
<option value="US">US</option>
36+
<option value="FR">FR</option>
37+
</select>
38+
39+
<button id="btn-us" on:click={setUS}>US</button>
40+
<button id="btn-reset" on:click={resetData}>Reset</button>
41+
<button id="btn-fr" on:click={setFR}>FR</button>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { tick } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
html: `
6+
<select>
7+
<option value="1">1</option>
8+
<option value="US">US</option>
9+
<option value="FR">FR</option>
10+
</select>
11+
<button id="btn-us">US</button>
12+
<button id="btn-reset">Reset</button>
13+
<button id="btn-fr">FR</button>
14+
`,
15+
16+
async test({ assert, component, window, logs }) {
17+
// Primary assertion: No infinite loop error
18+
assert.notInclude(logs, 'Infinite loop detected');
19+
20+
// Verify component state
21+
const select = window.document.querySelector('select');
22+
if (!select) {
23+
assert.fail('Select element not found');
24+
return;
25+
}
26+
27+
// With default_details fallback nothing is selected
28+
assert.equal(select.value, '');
29+
assert.equal(select.disabled, false);
30+
31+
window.document.getElementById('btn-us')?.click();
32+
await tick();
33+
assert.equal(select.disabled, true);
34+
assert.equal(select.value, 'US');
35+
36+
window.document.getElementById('btn-reset')?.click();
37+
await tick();
38+
assert.equal(select.value, '');
39+
assert.equal(select.disabled, false);
40+
41+
window.document.getElementById('btn-fr')?.click();
42+
await tick();
43+
assert.equal(select.value, 'FR');
44+
assert.equal(select.disabled, true);
45+
}
46+
});
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<script>
2+
const default_details = { country: '' };
3+
4+
$: data = { locked: false, details: null };
5+
6+
$: details = guard_infinite_loop() ?? data.details ?? default_details;
7+
8+
// Guard: if this reactive block runs too often we assume an infinite loop
9+
let guard_infinite_loop_counter = 0;
10+
function guard_infinite_loop() {
11+
guard_infinite_loop_counter++;
12+
if (guard_infinite_loop_counter > 20) {
13+
throw new Error('Infinite loop detected');
14+
}
15+
}
16+
17+
function setUS() {
18+
data = { locked: true, details: { country: 'US' } };
19+
}
20+
21+
function resetData() {
22+
data = { locked: false, details: null };
23+
}
24+
25+
function setFR() {
26+
data = { locked: true, details: { country: 'FR' } };
27+
}
28+
</script>
29+
30+
<select bind:value={details.country} disabled={data.locked}>
31+
<option value="1">1</option>
32+
<option value="US">US</option>
33+
<option value="FR">FR</option>
34+
</select>
35+
36+
<button id="btn-us" on:click={setUS}>US</button>
37+
<button id="btn-reset" on:click={resetData}>Reset</button>
38+
<button id="btn-fr" on:click={setFR}>FR</button>

0 commit comments

Comments
 (0)