import { describe, expect, it } from "vitest";
import { parseLine, toInput } from "../server/context";
import { groundedFact } from "../server/guards";
import type { Fact } from "../src/types";
describe("personal factor facts", () => {
it("parses labelled weight, sex, pregnancy and potassium", () => {
expect(parseLine("Weight: 46 kg")).toMatchObject({
kind: "weight",
label: "46 kg",
problem: null,
});
expect(parseLine("Weight: 101 lb")?.problem).toMatch(/kg/);
expect(parseLine("Sex: Female")).toMatchObject({ label: "female", problem: null });
expect(parseLine("Sex: unknown")?.problem).toBeTruthy();
expect(parseLine("Pregnancy: breastfeeding")?.problem).toBeNull();
expect(parseLine("Pregnancy: maybe")?.problem).toBeTruthy();
expect(
parseLine("Lab: Potassium; value: 5.8; unit: mmol/L; date: 2026-10-20")?.problem
).toBeNull();
expect(
parseLine("Lab: Potassium; value: 5.8; unit: mEq/L; date: 2026-10-20")?.problem
).toMatch(/unit/);
});
it("passes them to the engine", () => {
const facts = [
"Weight: 46 kg",
"Sex: female",
"Pregnancy: pregnant",
].map((line, i) => ({
...parseLine(line)!,
id: `s:${i}`,
sourceId: "s",
quote: line,
line: i + 1,
})) as Fact[];
const input = toInput(facts);
expect(input.subject).toMatchObject({ weightKg: 46, sex: "female" });
expect(input.reproductive).toBe("pregnant");
});
it("accepts model facts only when the line states them", () => {
expect(groundedFact("Weight: 46 kg", "She weighed 46 kg at the visit.")?.problem).toBeNull();
expect(() => groundedFact("Weight: 46 kg", "She is small and frail.")).toThrow();
expect(() => groundedFact("Weight: 46 kg", "She weighed 146 kg.")).toThrow();
expect(groundedFact("Sex: female", "A 78-year-old woman.")?.problem).toBeNull();
expect(() => groundedFact("Sex: female", "She takes lisinopril.")).toThrow();
expect(
groundedFact("Weight: 60 kg", "Her mother weighs 60 kg.")?.problem
).toBeTruthy();
expect(
groundedFact("Pregnancy: pregnant", "She is possibly pregnant.")?.problem
).toBeTruthy();
expect(groundedFact("Pregnancy: breastfeeding", "She is breastfeeding her son.")).toBeTruthy();
});
});