import { afterEach, describe, expect, it, vi } from "vitest"; import { runWhileVisible } from "../src/map/ticker"; const setVisibility = (state: DocumentVisibilityState) => { Object.defineProperty(document, "visibilityState", { value: state, configurable: true }); document.dispatchEvent(new Event("visibilitychange")); }; describe("map ticker lifecycle (Step 10C.9)", () => { afterEach(() => setVisibility("visible")); it("pauses when the page is hidden and resumes when it is visible", () => { const ticker = { start: vi.fn(), stop: vi.fn() }; const cleanup = runWhileVisible(ticker); expect(ticker.start).toHaveBeenCalledTimes(1); setVisibility("hidden"); expect(ticker.stop).toHaveBeenCalledTimes(1); setVisibility("visible"); expect(ticker.start).toHaveBeenCalledTimes(2); cleanup(); }); it("stops on unmount and ignores visibility changes afterwards", () => { const ticker = { start: vi.fn(), stop: vi.fn() }; const cleanup = runWhileVisible(ticker); cleanup(); expect(ticker.stop).toHaveBeenCalledTimes(1); setVisibility("hidden"); setVisibility("visible"); expect(ticker.start).toHaveBeenCalledTimes(1); expect(ticker.stop).toHaveBeenCalledTimes(1); }); });