'use strict'; const assert = require('node:assert'); const { test } = require('node:test'); const configMod = require('../config'); test('DEFAULTS 包含 theme/accent/followSystem', () => { assert.strictEqual(configMod.DEFAULTS.theme, 'linear'); assert.strictEqual(configMod.DEFAULTS.accent, 'purple'); assert.strictEqual(configMod.DEFAULTS.followSystem, false); }); test('sanitize 接受合法 theme', () => { assert.strictEqual(configMod.sanitize({ theme: 'midnight' }).theme, 'midnight'); assert.strictEqual(configMod.sanitize({ theme: 'github' }).theme, 'github'); }); test('sanitize 拒绝未知 theme 回落 linear', () => { assert.strictEqual(configMod.sanitize({ theme: 'foo' }).theme, 'linear'); assert.strictEqual(configMod.sanitize({ theme: null }).theme, 'linear'); assert.strictEqual(configMod.sanitize({}).theme, 'linear'); }); test('sanitize 接受 5 种 accent', () => { for (const a of ['purple', 'blue', 'green', 'orange', 'red']) { assert.strictEqual(configMod.sanitize({ accent: a }).accent, a); } }); test('sanitize 拒绝未知 accent 回落 purple', () => { assert.strictEqual(configMod.sanitize({ accent: 'cyan' }).accent, 'purple'); }); test('sanitize 接受 followSystem=true', () => { assert.strictEqual(configMod.sanitize({ followSystem: true }).followSystem, true); assert.strictEqual(configMod.sanitize({ followSystem: false }).followSystem, false); assert.strictEqual(configMod.sanitize({ followSystem: 'yes' }).followSystem, false); }); // ---------- effectiveTheme:跟随系统开关与系统明暗组合 ---------- // 旧版把这段逻辑内联在 main.js 的 broadcastTheme / IPC 处理器里, // 跟「跟随系统」开关的 IPC 顺序竞争出过显示主题不一致的问题。把判断 // 收到 config.effectiveTheme 后这里能直接单测,确保 4 个组合都正确。 test('effectiveTheme:followSystem=false 时用 raw theme', () => { const cfg = { theme: 'midnight', followSystem: false }; assert.strictEqual(configMod.effectiveTheme(cfg, true), 'midnight'); assert.strictEqual(configMod.effectiveTheme(cfg, false), 'midnight'); }); test('effectiveTheme:followSystem=true + 深色系统 = linear', () => { const cfg = { theme: 'midnight', followSystem: true }; assert.strictEqual(configMod.effectiveTheme(cfg, true), 'linear'); }); test('effectiveTheme:followSystem=true + 浅色系统 = light', () => { const cfg = { theme: 'midnight', followSystem: true }; assert.strictEqual(configMod.effectiveTheme(cfg, false), 'light'); }); test('effectiveTheme:raw theme 缺失时回落到默认 linear', () => { // 极端防御:cfg 为 null/undefined 时不让应用崩。 // followSystem 也没有 → 视同关闭,回到 DEFAULTS.theme(linear)。 // 关键是不抛异常 + 返回合法值,不让调用方去 switch-case 'linear' 之类。 assert.strictEqual(configMod.effectiveTheme(null, true), 'linear'); assert.strictEqual(configMod.effectiveTheme(undefined, false), 'linear'); assert.strictEqual(configMod.effectiveTheme({ followSystem: false }, false), 'linear'); });