import { describe, expect, it } from "vite-plus/test"; import { LRUCache } from "./lruCache"; describe("LRUCache", () => { it("returns null for missing keys", () => { const cache = new LRUCache(2, 100); expect(cache.get("missing")).toBeNull(); }); it("evicts oldest by max entries", () => { const cache = new LRUCache(2, 1_000); cache.set("a", "A", 10); cache.set("b", "B", 10); cache.set("c", "C", 10); expect(cache.get("a")).toBeNull(); expect(cache.get("b")).toBe("B"); expect(cache.get("c")).toBe("C"); }); it("promotes on get and evicts least recently used", () => { const cache = new LRUCache(2, 1_000); cache.set("a", "A", 10); cache.set("b", "B", 10); expect(cache.get("a")).toBe("A"); cache.set("c", "C", 10); expect(cache.get("a")).toBe("A"); expect(cache.get("b")).toBeNull(); expect(cache.get("c")).toBe("C"); }); it("evicts by memory budget", () => { const cache = new LRUCache(10, 25); cache.set("a", "A", 10); cache.set("b", "B", 10); cache.set("c", "C", 10); expect(cache.get("a")).toBeNull(); expect(cache.get("b")).toBe("B"); expect(cache.get("c")).toBe("C"); }); it("does not cache entries larger than the memory budget", () => { const cache = new LRUCache(2, 25); cache.set("a", "A", 10); cache.set("oversized", "X", 30); expect(cache.get("a")).toBe("A"); expect(cache.get("oversized")).toBeNull(); }); it("preserves an existing entry when an oversized replacement is rejected", () => { const cache = new LRUCache(2, 25); cache.set("a", "A", 10); cache.set("a", "oversized", 30); expect(cache.get("a")).toBe("A"); }); });