import { expect, test } from "vitest" import { computed, effect, effectScope, reactiveSystem, signal } from "#Source/reactor/index.ts" /** * @description 这个测试文件应该与 https://github.com/stackblitz/alien-signals/blob/master/tests/untrack.spec.ts 保持同步。 */ test("should pause tracking in computed", () => { const src = signal(() => 0) let computedRunTimes = 0 const c = computed(() => { computedRunTimes = computedRunTimes + 1 reactiveSystem.setNoActiveNodeAsSub() const value = src.get() reactiveSystem.resetActiveNodeAsSub() return value }) expect(c.get()).toBe(0) expect(computedRunTimes).toBe(1) src.set(1) src.set(2) src.set(3) expect(c.get()).toBe(0) expect(computedRunTimes).toBe(1) }) test("should pause tracking in effect", () => { const src = signal(() => 0) const is = signal(() => 0) let effectRunTimes = 0 effect(() => { effectRunTimes = effectRunTimes + 1 if (is.get() !== 0) { reactiveSystem.setNoActiveNodeAsSub() src.get() reactiveSystem.resetActiveNodeAsSub() } }) expect(effectRunTimes).toBe(1) is.set(1) expect(effectRunTimes).toBe(2) src.set(1) src.set(2) src.set(3) expect(effectRunTimes).toBe(2) is.set(2) expect(effectRunTimes).toBe(3) src.set(4) src.set(5) src.set(6) expect(effectRunTimes).toBe(3) is.set(0) expect(effectRunTimes).toBe(4) src.set(7) src.set(8) src.set(9) expect(effectRunTimes).toBe(4) }) test("should pause tracking in effect scope", () => { const src = signal(() => 0) let effectRunTimes = 0 effectScope(() => { effect(() => { effectRunTimes = effectRunTimes + 1 reactiveSystem.setNoActiveNodeAsSub() src.get() reactiveSystem.resetActiveNodeAsSub() }) }) expect(effectRunTimes).toBe(1) src.set(1) src.set(2) src.set(3) expect(effectRunTimes).toBe(1) })