60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import {describe, expect, it, vi} from 'vitest';
|
|
import {Signal} from '../../src/wrapper.js';
|
|
|
|
describe('liveness', () => {
|
|
it('only changes on first and last descendant', () => {
|
|
const watchedSpy = vi.fn();
|
|
const unwatchedSpy = vi.fn();
|
|
const state = new Signal.State(1, {
|
|
[Signal.subtle.watched]: watchedSpy,
|
|
[Signal.subtle.unwatched]: unwatchedSpy,
|
|
});
|
|
const computed = new Signal.Computed(() => state.get());
|
|
computed.get();
|
|
expect(watchedSpy).not.toBeCalled();
|
|
expect(unwatchedSpy).not.toBeCalled();
|
|
|
|
const w = new Signal.subtle.Watcher(() => {});
|
|
const w2 = new Signal.subtle.Watcher(() => {});
|
|
|
|
w.watch(computed);
|
|
expect(watchedSpy).toBeCalledTimes(1);
|
|
expect(unwatchedSpy).not.toBeCalled();
|
|
|
|
w2.watch(computed);
|
|
expect(watchedSpy).toBeCalledTimes(1);
|
|
expect(unwatchedSpy).not.toBeCalled();
|
|
|
|
w2.unwatch(computed);
|
|
expect(watchedSpy).toBeCalledTimes(1);
|
|
expect(unwatchedSpy).not.toBeCalled();
|
|
|
|
w.unwatch(computed);
|
|
expect(watchedSpy).toBeCalledTimes(1);
|
|
expect(unwatchedSpy).toBeCalledTimes(1);
|
|
});
|
|
|
|
it('is tracked well on computed signals', () => {
|
|
const watchedSpy = vi.fn();
|
|
const unwatchedSpy = vi.fn();
|
|
const s = new Signal.State(1);
|
|
const c = new Signal.Computed(() => s.get(), {
|
|
[Signal.subtle.watched]: watchedSpy,
|
|
[Signal.subtle.unwatched]: unwatchedSpy,
|
|
});
|
|
|
|
c.get();
|
|
expect(watchedSpy).not.toBeCalled();
|
|
expect(unwatchedSpy).not.toBeCalled();
|
|
|
|
const w = new Signal.subtle.Watcher(() => {});
|
|
w.watch(c);
|
|
expect(watchedSpy).toBeCalledTimes(1);
|
|
expect(unwatchedSpy).not.toBeCalled();
|
|
|
|
w.unwatch(c);
|
|
expect(watchedSpy).toBeCalledTimes(1);
|
|
expect(unwatchedSpy).toBeCalledTimes(1);
|
|
});
|
|
});
|