Skip to content

Commit 2dd56f8

Browse files
committedFeb 13, 2025
Adding a test: it is possible to update a signal in the watched callback
1 parent cc29d0b commit 2dd56f8

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed
 

‎tests/behaviors/liveness.test.ts

+46
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,50 @@ describe('liveness', () => {
5656
expect(watchedSpy).toBeCalledTimes(1);
5757
expect(unwatchedSpy).toBeCalledTimes(1);
5858
});
59+
60+
it('is possible to update a signal in the watch callback', () => {
61+
const logs: string[] = [];
62+
let indent = '';
63+
const logFn = (msg: string) => () => {
64+
logs.push(`${indent}${msg}`);
65+
};
66+
const wrapFn =
67+
<T>(logMsg: string, fn: () => T) =>
68+
(): T => {
69+
logs.push(`${indent}start ${logMsg}`);
70+
const prevIndent = indent;
71+
indent += ' ';
72+
const res = fn();
73+
indent = prevIndent;
74+
logs.push(`${indent}end ${logMsg} returning ${res}`);
75+
return res;
76+
};
77+
const wrapComputed = <T>(logMsg: string, fn: () => T) =>
78+
new Signal.Computed(wrapFn(`${logMsg} computing`, fn), {
79+
[Signal.subtle.watched]: logFn(`${logMsg} watched`),
80+
[Signal.subtle.unwatched]: logFn(`${logMsg} unwatched`),
81+
});
82+
const signal = new Signal.State(0, {
83+
[Signal.subtle.watched]: wrapFn('signal watched', () => {
84+
const value = signal.get() + 1;
85+
logs.push(`${indent}signal.set(${value})`);
86+
signal.set(value);
87+
}),
88+
[Signal.subtle.unwatched]: logFn('signal unwatched'),
89+
});
90+
const dep1 = wrapComputed('dep1', () => `${signal.get()},${signal.get()}`);
91+
const dep2 = wrapComputed('dep2', () => `${signal.get()},${signal.get()}`);
92+
const dep3 = wrapComputed('result', () => `${dep1.get()},${dep2.get()}`);
93+
94+
expect(wrapFn('signal.get 1', () => signal.get())()).toBe(1);
95+
expect(wrapFn('signal.get 2', () => signal.get())()).toBe(2);
96+
expect(wrapFn('dep1.get', () => dep1.get())()).toBe('3,3');
97+
expect(wrapFn('dep1.get', () => dep1.get())()).toBe('4,4');
98+
expect(wrapFn('dep2.get', () => dep2.get())()).toBe('5,5');
99+
expect(wrapFn('dep2.get', () => dep2.get())()).toBe('6,6');
100+
expect(wrapFn('dep3.get', () => dep3.get())()).toBe('7,7,7,7');
101+
expect(wrapFn('dep3.get', () => dep3.get())()).toBe('8,8,8,8');
102+
console.log(logs);
103+
// expect(logs).toMatchInlineSnapshot();
104+
});
59105
});

0 commit comments

Comments
 (0)