/*** IMPORT ------------------------------------------- ***/ import { expect, test } from "vitest"; /*** UTILITY ------------------------------------------ ***/ import { evict } from "../source/library/state/history-logic.ts"; type Entry = { favorite: boolean; id: string; timestamp: number; }; function entry(id: string, timestamp: number, favorite = false): Entry { return { favorite, id, timestamp }; } /*** TESTS -------------------------------------------- ***/ test("evict keeps everything when under cap", () => { const entries = [entry("a", 3), entry("b", 2), entry("c", 1)]; expect(evict(entries, 5)).toEqual(entries); }); test("evict drops the oldest non-favorites above cap", () => { const entries = [ entry("a", 5), entry("b", 4), entry("c", 3), entry("d", 2), entry("e", 1) ]; const kept = evict(entries, 3); expect(kept.map((e) => e.id)).toEqual(["a", "b", "c"]); }); test("evict never drops favorites", () => { const entries = [ entry("a", 10), entry("b", 9), entry("fav-old", 1, true), entry("c", 8), entry("d", 7) ]; const kept = evict(entries, 3); expect(kept.some((e) => e.id === "fav-old")).toEqual(true); expect(kept.length).toEqual(3); }); test("evict can exceed cap when favorites alone do so", () => { const entries = [ entry("fav-1", 5, true), entry("fav-2", 4, true), entry("fav-3", 3, true), entry("regular", 2) ]; const kept = evict(entries, 2); expect(kept.length).toEqual(3); expect(kept.every((e) => e.favorite)).toEqual(true); }); test("evict sorts by timestamp descending", () => { const entries = [ entry("c", 1), entry("a", 3), entry("b", 2), entry("d", 0) ]; const kept = evict(entries, 3); expect(kept.map((e) => e.id)).toEqual(["a", "b", "c"]); });