Files
MyNote/tests/unit/keymap-service.test.ts
T

45 lines
1.9 KiB
TypeScript

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');
});
});