45 lines
1.9 KiB
TypeScript
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');
|
|
});
|
|
});
|