import { describe, expect, it } from "vitest";
import { ResultCache } from "../src/inference/cache";
import type { InferenceResult } from "../src/shared/types";

const result = (id: string): InferenceResult => ({
  requestId: id,
  id,
  textHash: id,
  label: "toxic",
  probability: .9,
  navigationId: "nav"
});

describe("ResultCache", () => {
  it("evicts the oldest entry when the cache reaches its limit", () => {
    const cache = new ResultCache(2);

    cache.set("first", result("first"));
    cache.set("second", result("second"));
    cache.set("third", result("third"));

    expect(cache.size).toBe(2);
    expect(cache.get("first")).toBeUndefined();
    expect(cache.get("second")?.id).toBe("second");
    expect(cache.get("third")?.id).toBe("third");
  });

  it("uses normalized text for bounded cache entries", () => {
    const cache = new ResultCache(1);

    cache.set("  Same   text ", result("same"));

    expect(cache.get("same text")?.id).toBe("same");
    expect(cache.size).toBe(1);
  });

  it("rejects invalid cache sizes", () => {
    expect(() => new ResultCache(0)).toThrow();
    expect(() => new ResultCache(1.5)).toThrow();
  });
});
