import { describe, expect, it } from "vite-plus/test"; import { areFontAdvancesMonospace, clampCodeFontSize, clampInterfaceFontSize, clampPromptFontSize, cssFontFamilies, resolveDefaultFamilyLabel, resolveTerminalFontPreference, resolveTerminalFontSizePreference, } from "./appearanceFonts"; describe("areFontAdvancesMonospace", () => { it("accepts a fixed advance and rejects any proportional glyph", () => { expect(areFontAdvancesMonospace([10, 10, 10, 10])).toBe(true); expect(areFontAdvancesMonospace([10, 10, 7, 10])).toBe(false); expect(areFontAdvancesMonospace([10, 10.02])).toBe(false); }); it("fails open when canvas metrics are unavailable", () => { expect(areFontAdvancesMonospace([])).toBe(true); expect(areFontAdvancesMonospace([Number.NaN, Number.NaN])).toBe(true); }); }); describe("cssFontFamilies", () => { it("returns null for effectively empty input", () => { expect(cssFontFamilies("")).toBeNull(); expect(cssFontFamilies(" ")).toBeNull(); expect(cssFontFamilies(" , , ")).toBeNull(); }); it("quotes names with spaces and keeps single idents bare", () => { expect(cssFontFamilies("Fira Code")).toBe('"Fira Code"'); expect(cssFontFamilies("monospace")).toBe("monospace"); expect(cssFontFamilies('"Comic Mono"')).toBe('"Comic Mono"'); }); it("normalizes comma-separated lists and strips embedded quotes", () => { expect(cssFontFamilies(" Fira Code , Menlo ")).toBe('"Fira Code", Menlo'); expect(cssFontFamilies('Bad"Name')).toBe('"BadName"'); }); it("quotes names that are not single CSS idents", () => { expect(cssFontFamilies("3270 Nerd Font")).toBe('"3270 Nerd Font"'); expect(cssFontFamilies("M+ 1m")).toBe('"M+ 1m"'); }); }); describe("resolveDefaultFamilyLabel", () => { it("skips generic keywords and returns null for a stack of only generics", () => { expect(resolveDefaultFamilyLabel("system-ui, sans-serif")).toBeNull(); expect(resolveDefaultFamilyLabel("ui-monospace, monospace")).toBeNull(); }); }); describe("resolveTerminalFontPreference", () => { it("inherits the code font in simple mode", () => { expect( resolveTerminalFontPreference({ advanced: false, code: "Fira Code", terminal: "" }), ).toBe("Fira Code"); expect( resolveTerminalFontPreference({ advanced: false, code: "Fira Code", terminal: "Berkeley Mono", }), ).toBe("Fira Code"); }); it("keeps code and terminal fonts independent in advanced mode", () => { expect(resolveTerminalFontPreference({ advanced: true, code: "Fira Code", terminal: "" })).toBe( "", ); expect( resolveTerminalFontPreference({ advanced: true, code: "Fira Code", terminal: "Berkeley Mono", }), ).toBe("Berkeley Mono"); }); }); describe("resolveTerminalFontSizePreference", () => { it("inherits the code font size in simple mode", () => { expect(resolveTerminalFontSizePreference({ advanced: false, code: 15, terminal: 12 })).toBe(15); }); it("keeps code and terminal font sizes independent in advanced mode", () => { expect(resolveTerminalFontSizePreference({ advanced: true, code: 15, terminal: 12 })).toBe(12); }); }); describe("font size clamping", () => { it("keeps sizes inside the ranges the UI can absorb", () => { expect(clampInterfaceFontSize(16)).toBe(16); expect(clampInterfaceFontSize(2)).toBe(12); expect(clampInterfaceFontSize(96)).toBe(20); expect(clampPromptFontSize(40)).toBe(20); expect(clampCodeFontSize(1)).toBe(10); }); it("rounds fractional values and falls back for unusable input", () => { expect(clampCodeFontSize(13.4)).toBe(13); expect(clampInterfaceFontSize(Number.NaN)).toBe(16); expect(clampPromptFontSize(Number.POSITIVE_INFINITY)).toBe(14); }); });