import { describe, expect, it } from "vitest"; import { formatDurationCompact, formatTokenShort, formatTokenUsageDisplay, resolveIoTokens, resolveTotalTokens, truncateLine, } from "./subagents-format.js"; describe("shared/subagents-format", () => { it("formats compact durations across minute, hour, and day buckets", () => { expect(formatDurationCompact()).toBe("n/a"); expect(formatDurationCompact(30_000)).toBe("1m"); expect(formatDurationCompact(60 * 60_000)).toBe("1h"); expect(formatDurationCompact(61 * 60_000)).toBe("1h1m"); expect(formatDurationCompact(24 * 60 * 60_000)).toBe("1d"); expect(formatDurationCompact(25 * 60 * 60_000)).toBe("1d1h"); }); it("formats token counts with integer, kilo, and million branches", () => { expect(formatTokenShort()).toBeUndefined(); expect(formatTokenShort(999.9)).toBe("999"); expect(formatTokenShort(1_500)).toBe("1.5k"); expect(formatTokenShort(10_000)).toBe("10k"); expect(formatTokenShort(15_400)).toBe("15k"); expect(formatTokenShort(1_000_000)).toBe("1m"); expect(formatTokenShort(1_250_000)).toBe("1.3m"); }); it("truncates lines only when needed", () => { expect(truncateLine("short", 10)).toBe("short"); expect(truncateLine("trim me ", 7)).toBe("trim me..."); }); it("resolves token totals and io breakdowns from valid numeric fields only", () => { expect(resolveTotalTokens()).toBeUndefined(); expect(resolveTotalTokens({ totalTokens: 42 })).toBe(42); expect(resolveTotalTokens({ inputTokens: 10, outputTokens: 5 })).toBe(15); expect(resolveTotalTokens({ inputTokens: Number.NaN, outputTokens: 5 })).toBeUndefined(); expect(resolveIoTokens({ inputTokens: 10, outputTokens: 5 })).toEqual({ input: 10, output: 5, total: 15, }); expect(resolveIoTokens({ outputTokens: 5 })).toEqual({ input: 0, output: 5, total: 5, }); expect(resolveIoTokens({ inputTokens: Number.NaN, outputTokens: 0 })).toBeUndefined(); }); it("formats io and prompt-cache usage displays with fallback branches", () => { expect( formatTokenUsageDisplay({ inputTokens: 1_200, outputTokens: 300, totalTokens: 2_100, }), ).toBe("tokens 1.5k (in 1.2k / out 300), prompt/cache 2.1k"); expect(formatTokenUsageDisplay({ totalTokens: 500 })).toBe("tokens 500 prompt/cache"); expect( formatTokenUsageDisplay({ inputTokens: 1_200, outputTokens: 300, totalTokens: 1_500, }), ).toBe("tokens 1.5k (in 1.2k / out 300)"); expect(formatTokenUsageDisplay({ inputTokens: 0, outputTokens: 0, totalTokens: 0 })).toBe(""); }); });