import { describe, expect, it } from "vite-plus/test"; import { clampCodeFontSize, clampInterfaceFontSize, clampPromptFontSize, DEFAULT_CODE_FONT_STACK, DEFAULT_SANS_FONT_STACK, appearanceFontStack, cssFontFamilies, resolveDefaultFamilyLabel, } from "./appearanceFonts"; 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("appearanceFontStack", () => { it("prepends the custom family to the default stack", () => { expect(appearanceFontStack("Fira Code", DEFAULT_CODE_FONT_STACK)).toBe( `"Fira Code", ${DEFAULT_CODE_FONT_STACK}`, ); }); it("falls back to the default stack when unset", () => { expect(appearanceFontStack("", DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK); }); }); 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); }); });