import { batch, computed, effect, untracked, } from "@preact-signals/unified-signals"; import React from "react"; import { describe, expect, it, vi } from "vitest"; import { $ } from "../../lib"; import { Store, deepSignal } from "../../lib/store"; import { itRenderer, sleep } from "../utils"; describe("store", () => { it("should correctly batch events", () => { const store = Store.deepReactive({ count: 0, }); const fn = vi.fn(() => { store.count; }); effect(fn); expect(fn).toHaveBeenCalledTimes(1); store.count++; store.count++; expect(fn).toHaveBeenCalledTimes(3); batch(() => { store.count++; store.count++; }); expect(fn).toHaveBeenCalledTimes(4); }); itRenderer( "should work with react", async ({ expect, reactRoot, root, act }) => { const store = Store.deepReactive({ count: 0, }); await reactRoot().render(
{$(() => store.count)}
); expect(root.innerHTML).toBe("
0
"); await act(() => store.count++); expect(root.innerHTML).toBe("
1
"); }, ); it("custom class tracking", () => { class CustomClass { constructor(public value: number) {} } const store = Store.deepReactive({ count: new CustomClass(0), }); const fn = vi.fn(() => { store.count.value; }); effect(fn); expect(fn).toHaveBeenCalledTimes(1); store.count.value++; store.count.value++; expect(fn).toHaveBeenCalledTimes(3); batch(() => { store.count.value++; store.count.value++; }); expect(fn).toHaveBeenCalledTimes(4); }); it("shouldn't go into infinite loop on set", () => { const state = Store.deepReactive({ count: 0, }); effect(() => { if (state.count < 10) { state.count++; } }); expect(state.count).toBe(10); effect(() => { untracked(() => { state.count++; }); }); expect(state.count).toBe(11); }); }); describe("deepSignal", () => { it("should work", () => { const sig = deepSignal({ a: 1, b: { c: 2 } }); const aComputed = computed(() => sig.value.a); const nestedComputed = computed(() => sig.value.b.c); expect(sig.value.a).toBe(1); expect(aComputed.value).toBe(1); sig.value.a = 2; expect(sig.value.a).toBe(2); expect(aComputed.value).toBe(2); expect(nestedComputed.value).toBe(2); sig.value.b.c = 3; expect(sig.value.b.c).toBe(3); expect(nestedComputed.value).toBe(3); }); });