import * as cli from "./cli.ts"; import { Timer } from "./timer.ts"; describe("Timer", () => { beforeEach(() => { vi.spyOn(cli.log, "debug"); // Mock Date.now to have predictable timestamps vi.useFakeTimers(); }); afterEach(() => { vi.restoreAllMocks(); vi.useRealTimers(); }); describe("constructor", () => { it("should initialize with current timestamp", () => { const mockTime = 1000000; vi.setSystemTime(mockTime); const timer = new Timer(); timer.checkpoint("test"); expect(cli.log.debug).toHaveBeenCalledWith(expect.stringContaining("test")); }); }); describe("checkpoint", () => { it("should log duration from initial timestamp on first checkpoint", () => { const startTime = 1000000; vi.setSystemTime(startTime); const timer = new Timer(); const checkpointTime = startTime + 100; vi.setSystemTime(checkpointTime); timer.checkpoint("first"); expect(cli.log.debug).toHaveBeenCalledWith("» first: 100ms"); }); it("should log duration from last checkpoint on subsequent checkpoints", () => { const startTime = 1000000; vi.setSystemTime(startTime); const timer = new Timer(); // First checkpoint const firstCheckpointTime = startTime + 50; vi.setSystemTime(firstCheckpointTime); timer.checkpoint("first"); // Second checkpoint const secondCheckpointTime = firstCheckpointTime + 75; vi.setSystemTime(secondCheckpointTime); timer.checkpoint("second"); expect(cli.log.debug).toHaveBeenCalledTimes(2); expect(cli.log.debug).toHaveBeenNthCalledWith(1, "» first: 50ms"); expect(cli.log.debug).toHaveBeenNthCalledWith(2, "» second: 75ms"); }); it("should handle multiple checkpoints correctly", () => { const startTime = 1000000; vi.setSystemTime(startTime); const timer = new Timer(); // First checkpoint vi.setSystemTime(startTime + 10); timer.checkpoint("step1"); // Second checkpoint vi.setSystemTime(startTime + 25); timer.checkpoint("step2"); // Third checkpoint vi.setSystemTime(startTime + 45); timer.checkpoint("step3"); expect(cli.log.debug).toHaveBeenCalledTimes(3); expect(cli.log.debug).toHaveBeenNthCalledWith(1, "» step1: 10ms"); expect(cli.log.debug).toHaveBeenNthCalledWith(2, "» step2: 15ms"); expect(cli.log.debug).toHaveBeenNthCalledWith(3, "» step3: 20ms"); }); it("should handle zero duration correctly", () => { const startTime = 1000000; vi.setSystemTime(startTime); const timer = new Timer(); // Checkpoint immediately timer.checkpoint("immediate"); expect(cli.log.debug).toHaveBeenCalledWith("» immediate: 0ms"); }); it("should handle custom checkpoint names", () => { const startTime = 1000000; vi.setSystemTime(startTime); const timer = new Timer(); vi.setSystemTime(startTime + 200); timer.checkpoint("Custom Checkpoint Name"); expect(cli.log.debug).toHaveBeenCalledWith("» Custom Checkpoint Name: 200ms"); }); }); });