// Console timestamp tests cover timestamp prefixes for console logging. import { afterEach, describe, expect, it, vi } from "vitest"; import { formatConsoleTimestamp } from "./console.js"; describe("formatConsoleTimestamp", () => { afterEach(() => { vi.useRealTimers(); }); function pad2(n: number) { return String(n).padStart(2, "0"); } function pad3(n: number) { return String(n).padStart(3, "0"); } function formatExpectedLocalIsoWithOffset(now: Date) { const year = now.getFullYear(); const month = pad2(now.getMonth() + 1); const day = pad2(now.getDate()); const h = pad2(now.getHours()); const m = pad2(now.getMinutes()); const s = pad2(now.getSeconds()); const ms = pad3(now.getMilliseconds()); const tzOffset = now.getTimezoneOffset(); const tzSign = tzOffset <= 0 ? "+" : "-"; const tzHours = pad2(Math.floor(Math.abs(tzOffset) / 60)); const tzMinutes = pad2(Math.abs(tzOffset) % 60); return `${year}-${month}-${day}T${h}:${m}:${s}.${ms}${tzSign}${tzHours}:${tzMinutes}`; } it("pretty style returns local HH:MM:SS without timezone suffix", () => { vi.useFakeTimers(); vi.setSystemTime(new Date("2026-01-17T18:01:02.345Z")); const result = formatConsoleTimestamp("pretty"); const now = new Date(); const h = pad2(now.getHours()); const m = pad2(now.getMinutes()); const s = pad2(now.getSeconds()); expect(result).toBe(`${h}:${m}:${s}`); }); it.each(["compact", "json"] as const)( "%s style returns local ISO-like timestamp with timezone offset", (style) => { const result = formatConsoleTimestamp(style); expect(result).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{2}:\d{2}$/); vi.useFakeTimers(); vi.setSystemTime(new Date("2026-01-17T18:01:02.345Z")); const now = new Date(); expect(formatConsoleTimestamp(style)).toBe(formatExpectedLocalIsoWithOffset(now)); }, ); });