import { describe, expect, it } from "vitest"; import { DEFAULT_THEME_MODE, isThemeMode, nextThemeMode, normalizeThemeMode, themeBootstrapScript, themeModeLabel, themeToggleLabel, } from "./theme"; describe("theme mode", () => { it("accepts only supported theme modes", () => { expect(isThemeMode("paper")).toBe(true); expect(isThemeMode("night")).toBe(true); expect(isThemeMode("dark")).toBe(false); expect(isThemeMode(null)).toBe(false); }); it("falls back to paper for unknown stored values", () => { expect(normalizeThemeMode("night")).toBe("night"); expect(normalizeThemeMode("")).toBe(DEFAULT_THEME_MODE); expect(normalizeThemeMode("auto")).toBe(DEFAULT_THEME_MODE); }); it("toggles between paper and night", () => { expect(nextThemeMode("paper")).toBe("night"); expect(nextThemeMode("night")).toBe("paper"); }); it("returns labels for the current mode and the next action", () => { expect(themeModeLabel("paper")).toBe("纸感模式"); expect(themeModeLabel("night")).toBe("夜读模式"); expect(themeToggleLabel("paper")).toBe("切换到夜读模式"); expect(themeToggleLabel("night")).toBe("切换到纸感模式"); }); it("builds a bootstrap script that applies the stored mode before hydration", () => { const script = themeBootstrapScript(); expect(script).toContain("localStorage.getItem(\"ww.theme_mode\")"); expect(script).toContain("document.documentElement.dataset.theme"); expect(script).toContain("mode !== \"paper\" && mode !== \"night\""); }); });