| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import { describe, expect, test } from "bun:test"
- import { createScopedCache } from "./scoped-cache"
- describe("createScopedCache", () => {
- test("evicts least-recently-used entry when max is reached", () => {
- const disposed: string[] = []
- const cache = createScopedCache((key) => ({ key }), {
- maxEntries: 2,
- dispose: (value) => disposed.push(value.key),
- })
- const a = cache.get("a")
- const b = cache.get("b")
- expect(a.key).toBe("a")
- expect(b.key).toBe("b")
- cache.get("a")
- const c = cache.get("c")
- expect(c.key).toBe("c")
- expect(cache.peek("a")?.key).toBe("a")
- expect(cache.peek("b")).toBeUndefined()
- expect(cache.peek("c")?.key).toBe("c")
- expect(disposed).toEqual(["b"])
- })
- test("disposes entries on delete and clear", () => {
- const disposed: string[] = []
- const cache = createScopedCache((key) => ({ key }), {
- dispose: (value) => disposed.push(value.key),
- })
- cache.get("a")
- cache.get("b")
- const removed = cache.delete("a")
- expect(removed?.key).toBe("a")
- expect(cache.peek("a")).toBeUndefined()
- cache.clear()
- expect(cache.peek("b")).toBeUndefined()
- expect(disposed).toEqual(["a", "b"])
- })
- test("expires stale entries with ttl and recreates on get", () => {
- let clock = 0
- let count = 0
- const disposed: string[] = []
- const cache = createScopedCache((key) => ({ key, count: ++count }), {
- ttlMs: 10,
- now: () => clock,
- dispose: (value) => disposed.push(`${value.key}:${value.count}`),
- })
- const first = cache.get("a")
- expect(first.count).toBe(1)
- clock = 9
- expect(cache.peek("a")?.count).toBe(1)
- clock = 11
- expect(cache.peek("a")).toBeUndefined()
- expect(disposed).toEqual(["a:1"])
- const second = cache.get("a")
- expect(second.count).toBe(2)
- expect(disposed).toEqual(["a:1"])
- })
- })
|