import { act, renderHook } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; import { EGG_VERSES, pickEggVerse, useEasterEgg } from "./useEasterEgg"; describe("useEasterEgg", () => { it("连点 5 次触发 onReveal", () => { const onReveal = vi.fn(); const { result } = renderHook(() => useEasterEgg({ onReveal })); for (let i = 0; i < 5; i++) act(() => result.current.onClick()); expect(onReveal).toHaveBeenCalledTimes(1); }); it("不足 5 次不触发 onReveal", () => { const onReveal = vi.fn(); const { result } = renderHook(() => useEasterEgg({ onReveal })); for (let i = 0; i < 4; i++) act(() => result.current.onClick()); expect(onReveal).not.toHaveBeenCalled(); }); it("连点 9 次触发 onAscend(九枢升格)", () => { const onAscend = vi.fn(); const { result } = renderHook(() => useEasterEgg({ onAscend })); for (let i = 0; i < 9; i++) act(() => result.current.onClick()); expect(onAscend).toHaveBeenCalledTimes(1); }); it("双层彩蛋:5 次弹谶语、9 次升格,各触发一次", () => { const onReveal = vi.fn(); const onAscend = vi.fn(); const { result } = renderHook(() => useEasterEgg({ onReveal, onAscend })); for (let i = 0; i < 9; i++) act(() => result.current.onClick()); expect(onReveal).toHaveBeenCalledTimes(1); expect(onAscend).toHaveBeenCalledTimes(1); }); it("升格后归零,可再次触发双层", () => { const onReveal = vi.fn(); const onAscend = vi.fn(); const { result } = renderHook(() => useEasterEgg({ onReveal, onAscend })); for (let i = 0; i < 9; i++) act(() => result.current.onClick()); for (let i = 0; i < 9; i++) act(() => result.current.onClick()); expect(onReveal).toHaveBeenCalledTimes(2); expect(onAscend).toHaveBeenCalledTimes(2); }); it("pickEggVerse 返回谶语池中一条", () => { expect(EGG_VERSES).toContain(pickEggVerse()); }); it("未传回调时达阈值不抛错", () => { const { result } = renderHook(() => useEasterEgg()); expect(() => { for (let i = 0; i < 9; i++) act(() => result.current.onClick()); }).not.toThrow(); }); });