import { describe, expect, it } from "vitest"; import { hasNonzeroUsage, normalizeUsage } from "./usage.js"; describe("normalizeUsage", () => { it("normalizes Anthropic-style snake_case usage", () => { const usage = normalizeUsage({ input_tokens: 1200, output_tokens: 340, cache_creation_input_tokens: 200, cache_read_input_tokens: 50, total_tokens: 1790, }); expect(usage).toEqual({ input: 1200, output: 340, cacheRead: 50, cacheWrite: 200, total: 1790, }); }); it("normalizes OpenAI-style prompt/completion usage", () => { const usage = normalizeUsage({ prompt_tokens: 987, completion_tokens: 123, total_tokens: 1110, }); expect(usage).toEqual({ input: 987, output: 123, cacheRead: undefined, cacheWrite: undefined, total: 1110, }); }); it("returns undefined for empty usage objects", () => { expect(normalizeUsage({})).toBeUndefined(); }); it("guards against empty/zero usage overwrites", () => { expect(hasNonzeroUsage(undefined)).toBe(false); expect(hasNonzeroUsage(null)).toBe(false); expect(hasNonzeroUsage({})).toBe(false); expect(hasNonzeroUsage({ input: 0, output: 0 })).toBe(false); expect(hasNonzeroUsage({ input: 1 })).toBe(true); expect(hasNonzeroUsage({ total: 1 })).toBe(true); }); });