import { describe, it, expect, beforeEach } from 'vitest'; import { KeymapService } from '../../apps/desktop/src/renderer/features/keymap/keymap-service'; describe('M9 KeymapService (FR-K4 冲突检测 / K5 恢复默认)', () => { let km: KeymapService; beforeEach(() => { km = new KeymapService(); }); it('注册与读取', () => { km.register({ id: 'bold', scope: 'editor', combo: 'Ctrl+B', defaultCombo: 'Ctrl+B' }); expect(km.getAll().length).toBe(1); }); it('冲突检测:同 combo 不同 id 报冲突', () => { km.register({ id: 'bold', scope: 'editor', combo: 'Ctrl+B', defaultCombo: 'Ctrl+B' }); km.register({ id: 'other', scope: 'editor', combo: 'Ctrl+B', defaultCombo: 'Ctrl+X' }); expect(km.conflictCount()).toBe(1); expect(km.conflicts()['Ctrl+B']).toEqual(['bold', 'other']); }); it('无冲突时 conflictCount=0', () => { km.register({ id: 'bold', scope: 'editor', combo: 'Ctrl+B', defaultCombo: 'Ctrl+B' }); km.register({ id: 'italic', scope: 'editor', combo: 'Ctrl+I', defaultCombo: 'Ctrl+I' }); expect(km.conflictCount()).toBe(0); }); it('setCombo 修改键位', () => { km.register({ id: 'bold', scope: 'editor', combo: 'Ctrl+B', defaultCombo: 'Ctrl+B' }); km.setCombo('bold', 'Ctrl+Shift+B'); expect(km.getAll()[0].combo).toBe('Ctrl+Shift+B'); }); it('resetAll 恢复默认', () => { km.register({ id: 'bold', scope: 'editor', combo: 'Ctrl+Shift+B', defaultCombo: 'Ctrl+B' }); km.resetAll(); expect(km.getAll()[0].combo).toBe('Ctrl+B'); }); it('作用域裁决:编辑器聚焦时 editor 优先', () => { km.register({ id: 'find', scope: 'global', combo: 'Ctrl+F', defaultCombo: 'Ctrl+F' }); km.register({ id: 'efind', scope: 'editor', combo: 'Ctrl+F', defaultCombo: 'Ctrl+F' }); expect(km.resolve('Ctrl+F', true)?.id).toBe('efind'); expect(km.resolve('Ctrl+F', false)?.id).toBe('find'); }); });