50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
/// <reference types="jest" />
|
|
|
|
import { scoreAndRank } from "../src/utils/scoring";
|
|
|
|
describe("scoreAndRank", () => {
|
|
const results = [
|
|
{ id: "a", score: 0.8, payload: { data: "mem a" } },
|
|
{ id: "b", score: 0.5, payload: { data: "mem b" } },
|
|
];
|
|
|
|
it("omits scoreDetails by default", () => {
|
|
const scored = scoreAndRank(results, {}, {}, 0.1, 10);
|
|
expect(scored[0].scoreDetails).toBeUndefined();
|
|
expect(scored[1].scoreDetails).toBeUndefined();
|
|
});
|
|
|
|
it("omits scoreDetails when explain is false", () => {
|
|
const scored = scoreAndRank(results, {}, {}, 0.1, 10, false);
|
|
expect(scored[0].scoreDetails).toBeUndefined();
|
|
});
|
|
|
|
it("includes scoreDetails when explain is true", () => {
|
|
const bm25 = { a: 0.6 };
|
|
const entity = { a: 0.3 };
|
|
const scored = scoreAndRank(results, bm25, entity, 0.1, 10, true);
|
|
|
|
const details = scored[0].scoreDetails!;
|
|
expect(details).toBeDefined();
|
|
expect(details.semanticScore).toBe(0.8);
|
|
expect(details.bm25Score).toBe(0.6);
|
|
expect(details.entityBoost).toBe(0.3);
|
|
expect(details.rawScore).toBeCloseTo(1.7);
|
|
expect(details.maxPossibleScore).toBe(2.5);
|
|
expect(details.finalScore).toBeCloseTo(0.68);
|
|
expect(details.threshold).toBe(0.1);
|
|
});
|
|
|
|
it("includes scoreDetails for results without bm25/entity signals", () => {
|
|
const scored = scoreAndRank(results, {}, {}, 0.1, 10, true);
|
|
|
|
const details = scored[0].scoreDetails!;
|
|
expect(details.semanticScore).toBe(0.8);
|
|
expect(details.bm25Score).toBe(0);
|
|
expect(details.entityBoost).toBe(0);
|
|
expect(details.rawScore).toBe(0.8);
|
|
expect(details.maxPossibleScore).toBe(1.0);
|
|
expect(details.finalScore).toBe(0.8);
|
|
});
|
|
});
|