/** * WorthDoing.ai * Author: Simon-Pierre Boucher * Contact: contact@spboucher.ai * File: tests/scoring.test.ts * Description: Worth Score computation tests — weighting, renormalization, separate evidence confidence. */ import { describe, it, expect } from "vitest"; import { computeWorthScore, type DimensionScore } from "@/lib/agent/scoring"; const dim = ( dimension: DimensionScore["dimension"], score: number, confidence: number, ): DimensionScore => ({ dimension, score, confidence }); describe("computeWorthScore", () => { it("returns the score itself when all dimensions are equal", () => { const { worthScore } = computeWorthScore([ dim("demand", 80, 0.9), dim("neglectedness", 80, 0.9), dim("feasibility", 80, 0.9), dim("why_now", 80, 0.9), dim("impact", 80, 0.9), ]); expect(worthScore).toBe(80); }); it("keeps evidence confidence separate from the score", () => { const strong = computeWorthScore([dim("demand", 90, 0.95), dim("impact", 90, 0.95)]); const weak = computeWorthScore([dim("demand", 90, 0.3), dim("impact", 90, 0.3)]); expect(strong.worthScore).toBe(weak.worthScore); // same score... expect(strong.evidenceConfidence).toBeGreaterThan(weak.evidenceConfidence); // ...different confidence }); it("weights demand and impact more than risk", () => { const demandHeavy = computeWorthScore([dim("demand", 100, 1), dim("risk", 0, 1)]); const riskHeavy = computeWorthScore([dim("demand", 0, 1), dim("risk", 100, 1)]); expect(demandHeavy.worthScore).toBeGreaterThan(riskHeavy.worthScore); }); it("renormalizes weights over provided dimensions", () => { const { worthScore } = computeWorthScore([dim("demand", 60, 0.8)]); expect(worthScore).toBe(60); }); it("handles the empty case defensively", () => { expect(computeWorthScore([])).toEqual({ worthScore: 0, evidenceConfidence: 0 }); }); });