import { describe, expect, it } from "vite-plus/test"; import { buildModelPickerSearchText, scoreModelPickerSearch } from "./modelPickerSearch"; describe("buildModelPickerSearchText", () => { it("builds provider-agnostic search text from generic fields", () => { expect( buildModelPickerSearchText({ driverKind: "opencode", providerDisplayName: "opencode", name: "Claude Opus 4.7", subProvider: "GitHub Copilot", }), ).toBe("claude opus 4.7 github copilot opencode opencode"); }); }); describe("scoreModelPickerSearch", () => { it("matches typo-tolerant multi-token queries", () => { expect( scoreModelPickerSearch( { driverKind: "opencode", providerDisplayName: "opencode", name: "Claude Opus 4.7", subProvider: "GitHub Copilot", }, "coplt op", ), ).not.toBeNull(); }); it("rejects results when any query token does not match", () => { expect( scoreModelPickerSearch( { driverKind: "codex", providerDisplayName: "codex", name: "GPT-5 Codex", }, "coplt op", ), ).toBeNull(); }); it("ranks exact token matches ahead of fuzzier matches", () => { const exactScore = scoreModelPickerSearch( { driverKind: "opencode", providerDisplayName: "opencode", name: "Claude Opus 4.7", subProvider: "GitHub Copilot", }, "copilot opus", ); const fuzzyScore = scoreModelPickerSearch( { driverKind: "opencode", providerDisplayName: "opencode", name: "Claude Opus 4.7", subProvider: "GitHub Copilot", }, "coplt op", ); expect(exactScore).not.toBeNull(); expect(fuzzyScore).not.toBeNull(); expect(exactScore!).toBeLessThan(fuzzyScore!); }); it("gives favorite models a strong enough ranking boost for partial queries", () => { const favoriteScore = scoreModelPickerSearch( { driverKind: "claudeAgent", providerDisplayName: "Claude", name: "Claude Opus 4.7", isFavorite: true, }, "opu", ); const nonFavoriteScore = scoreModelPickerSearch( { driverKind: "cursor", providerDisplayName: "Cursor", name: "Opus 4.5", }, "opu", ); expect(favoriteScore).not.toBeNull(); expect(nonFavoriteScore).not.toBeNull(); expect(favoriteScore!).toBeLessThan(nonFavoriteScore!); }); it("does not let the favorite boost outrank clearly better textual matches", () => { const favoriteScore = scoreModelPickerSearch( { driverKind: "claudeAgent", providerDisplayName: "Claude", name: "Claude Opus 4.7", isFavorite: true, }, "opus 4.7", ); const nonFavoriteExactScore = scoreModelPickerSearch( { driverKind: "cursor", providerDisplayName: "Cursor", name: "Opus 4.7", }, "opus 4.7", ); expect(favoriteScore).not.toBeNull(); expect(nonFavoriteExactScore).not.toBeNull(); expect(nonFavoriteExactScore!).toBeLessThan(favoriteScore!); }); it("matches a custom instance's display name against its models", () => { expect( scoreModelPickerSearch( { driverKind: "codex", providerDisplayName: "Codex Personal", name: "GPT-5 Codex", }, "personal", ), ).not.toBeNull(); }); });