{"version":3,"file":"policy.test.d.ts","sourceRoot":"","sources":["../../../src/cache/__tests__/policy.test.ts"],"names":[],"mappings":"","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { defaultPolicy, resolveRetention, totalInputTokens, usageToCacheReport, validateLayers } from \"../policy.js\";\n\ndescribe(\"usageToCacheReport\", () => {\n\tit(\"converts Usage to CacheUsageReport\", () => {\n\t\tconst report = usageToCacheReport({\n\t\t\tinput: 500,\n\t\t\toutput: 200,\n\t\t\tcacheRead: 300,\n\t\t\tcacheWrite: 100,\n\t\t\ttotalTokens: 1100,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t});\n\t\texpect(report.cachedInputTokens).toBe(300);\n\t\texpect(report.cacheWriteTokens).toBe(100);\n\t\texpect(report.uncachedInputTokens).toBe(500);\n\t\texpect(totalInputTokens(report)).toBe(800);\n\t});\n\n\tit(\"clamps negative input to zero\", () => {\n\t\tconst report = usageToCacheReport({\n\t\t\tinput: -10,\n\t\t\toutput: 50,\n\t\t\tcacheRead: 100,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 140,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t});\n\t\texpect(report.uncachedInputTokens).toBe(0);\n\t});\n\n\tit(\"handles zero-cache usage (e.g. Mistral)\", () => {\n\t\tconst report = usageToCacheReport({\n\t\t\tinput: 1000,\n\t\t\toutput: 200,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 1200,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t});\n\t\texpect(report.cachedInputTokens).toBe(0);\n\t\texpect(report.cacheWriteTokens).toBe(0);\n\t\texpect(report.uncachedInputTokens).toBe(1000);\n\t\texpect(totalInputTokens(report)).toBe(1000);\n\t});\n});\n\ndescribe(\"resolveRetention\", () => {\n\tit(\"returns cliFlag when present\", () => {\n\t\texpect(resolveRetention({ roleDefault: \"short\", cliFlag: \"long\" })).toBe(\"long\");\n\t});\n\n\tit(\"returns roleDefault as fallback\", () => {\n\t\texpect(resolveRetention({ roleDefault: \"long\" })).toBe(\"long\");\n\t});\n});\n\ndescribe(\"validateLayers\", () => {\n\tit(\"accepts valid layers in canonical order\", () => {\n\t\texpect(() =>\n\t\t\tvalidateLayers([\n\t\t\t\t{ layer: \"tools\", bytes: \"t\" },\n\t\t\t\t{ layer: \"system\", bytes: \"s\" },\n\t\t\t]),\n\t\t).not.toThrow();\n\t});\n\n\tit(\"rejects duplicate layers\", () => {\n\t\texpect(() =>\n\t\t\tvalidateLayers([\n\t\t\t\t{ layer: \"tools\", bytes: \"a\" },\n\t\t\t\t{ layer: \"tools\", bytes: \"b\" },\n\t\t\t]),\n\t\t).toThrow(/duplicate layer/);\n\t});\n\n\tit(\"rejects out-of-order layers\", () => {\n\t\texpect(() =>\n\t\t\tvalidateLayers([\n\t\t\t\t{ layer: \"system\", bytes: \"s\" },\n\t\t\t\t{ layer: \"tools\", bytes: \"t\" },\n\t\t\t]),\n\t\t).toThrow(/out of canonical order/);\n\t});\n});\n\ndescribe(\"defaultPolicy\", () => {\n\tit(\"returns short retention with no breakpoints\", () => {\n\t\tconst p = defaultPolicy();\n\t\texpect(p.retention).toBe(\"short\");\n\t\texpect(p.supportsBreakpoints).toBe(false);\n\t});\n});\n"]}