Skip to content

Commit

Permalink
chore: add derived effect ownership tests (#11538)
Browse files Browse the repository at this point in the history
* chore: add derived effect ownership tests

* chore: add derived effect ownership tests
  • Loading branch information
trueadm committed May 10, 2024
1 parent f219c79 commit 4ea8a5e
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 2 deletions.
1 change: 0 additions & 1 deletion packages/svelte/src/internal/client/reactivity/deriveds.js
Expand Up @@ -121,7 +121,6 @@ export function update_derived(derived, force_schedule) {
*/
export function destroy_derived(signal) {
destroy_derived_children(signal);
destroy_effect_children(signal);
remove_reactions(signal, 0);
set_signal_status(signal, DESTROYED);

Expand Down
49 changes: 48 additions & 1 deletion packages/svelte/tests/signals/test.ts
Expand Up @@ -8,7 +8,7 @@ import {
user_effect
} from '../../src/internal/client/reactivity/effects';
import { source, set } from '../../src/internal/client/reactivity/sources';
import type { Derived } from '../../src/internal/client/types';
import type { Derived, Value } from '../../src/internal/client/types';
import { proxy } from '../../src/internal/client/proxy';
import { derived } from '../../src/internal/client/reactivity/deriveds';

Expand Down Expand Up @@ -376,4 +376,51 @@ describe('signals', () => {
assert.equal(teardown, 1);
};
});

test('creating effects within a derived correctly handles ownership', () => {
const log: Array<number | string> = [];
let a: Value<unknown>;
let inner: Value<string | number>;
let outer: Value<string | number>;

const destroy = effect_root(() => {
inner = source(0);
outer = source(0);

render_effect(() => {
a = derived(() => {
log.push('outer', $.get(outer));
effect(() => {
log.push('inner', $.get(inner));
});
});
});
});

return () => {
flushSync(() => {
$.get(a);
});
assert.deepEqual(log, ['outer', 0, 'inner', 0]);
log.length = 0;
flushSync(() => {
set(inner, 1);
$.get(a);
});
assert.deepEqual(log, ['inner', 1]);
log.length = 0;
flushSync(() => {
set(outer, 1);
$.get(a);
});
assert.deepEqual(log, ['outer', 1, 'inner', 1]);
log.length = 0;
flushSync(() => {
set(inner, 2);
$.get(a);
});
assert.deepEqual(log, ['inner', 2]);
destroy();
};
});
});

0 comments on commit 4ea8a5e

Please sign in to comment.