mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-04-22 02:54:31 -07:00
refactor(ui): unify keybinding infrastructure and support string initialization (#21776)
This commit is contained in:
committed by
GitHub
parent
b89944c3a3
commit
215f8f3f15
@@ -0,0 +1,142 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2025 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { formatKeyBinding, formatCommand } from './keybindingUtils.js';
|
||||
import { Command, KeyBinding } from './keyBindings.js';
|
||||
|
||||
describe('keybindingUtils', () => {
|
||||
describe('formatKeyBinding', () => {
|
||||
const testCases: Array<{
|
||||
name: string;
|
||||
binding: KeyBinding;
|
||||
expected: {
|
||||
darwin: string;
|
||||
win32: string;
|
||||
linux: string;
|
||||
default: string;
|
||||
};
|
||||
}> = [
|
||||
{
|
||||
name: 'simple key',
|
||||
binding: new KeyBinding('a'),
|
||||
expected: { darwin: 'A', win32: 'A', linux: 'A', default: 'A' },
|
||||
},
|
||||
{
|
||||
name: 'named key (return)',
|
||||
binding: new KeyBinding('return'),
|
||||
expected: {
|
||||
darwin: 'Enter',
|
||||
win32: 'Enter',
|
||||
linux: 'Enter',
|
||||
default: 'Enter',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'named key (escape)',
|
||||
binding: new KeyBinding('escape'),
|
||||
expected: { darwin: 'Esc', win32: 'Esc', linux: 'Esc', default: 'Esc' },
|
||||
},
|
||||
{
|
||||
name: 'ctrl modifier',
|
||||
binding: new KeyBinding('ctrl+c'),
|
||||
expected: {
|
||||
darwin: 'Ctrl+C',
|
||||
win32: 'Ctrl+C',
|
||||
linux: 'Ctrl+C',
|
||||
default: 'Ctrl+C',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'cmd modifier',
|
||||
binding: new KeyBinding('cmd+z'),
|
||||
expected: {
|
||||
darwin: 'Cmd+Z',
|
||||
win32: 'Win+Z',
|
||||
linux: 'Super+Z',
|
||||
default: 'Cmd/Win+Z',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'alt/option modifier',
|
||||
binding: new KeyBinding('alt+left'),
|
||||
expected: {
|
||||
darwin: 'Option+Left',
|
||||
win32: 'Alt+Left',
|
||||
linux: 'Alt+Left',
|
||||
default: 'Alt+Left',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'shift modifier',
|
||||
binding: new KeyBinding('shift+up'),
|
||||
expected: {
|
||||
darwin: 'Shift+Up',
|
||||
win32: 'Shift+Up',
|
||||
linux: 'Shift+Up',
|
||||
default: 'Shift+Up',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'multiple modifiers (ctrl+shift)',
|
||||
binding: new KeyBinding('ctrl+shift+z'),
|
||||
expected: {
|
||||
darwin: 'Ctrl+Shift+Z',
|
||||
win32: 'Ctrl+Shift+Z',
|
||||
linux: 'Ctrl+Shift+Z',
|
||||
default: 'Ctrl+Shift+Z',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'all modifiers',
|
||||
binding: new KeyBinding('ctrl+alt+shift+cmd+a'),
|
||||
expected: {
|
||||
darwin: 'Ctrl+Option+Shift+Cmd+A',
|
||||
win32: 'Ctrl+Alt+Shift+Win+A',
|
||||
linux: 'Ctrl+Alt+Shift+Super+A',
|
||||
default: 'Ctrl+Alt+Shift+Cmd/Win+A',
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
testCases.forEach(({ name, binding, expected }) => {
|
||||
describe(`${name}`, () => {
|
||||
it('formats correctly for darwin', () => {
|
||||
expect(formatKeyBinding(binding, 'darwin')).toBe(expected.darwin);
|
||||
});
|
||||
it('formats correctly for win32', () => {
|
||||
expect(formatKeyBinding(binding, 'win32')).toBe(expected.win32);
|
||||
});
|
||||
it('formats correctly for linux', () => {
|
||||
expect(formatKeyBinding(binding, 'linux')).toBe(expected.linux);
|
||||
});
|
||||
it('formats correctly for default', () => {
|
||||
expect(formatKeyBinding(binding, 'default')).toBe(expected.default);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('formatCommand', () => {
|
||||
it('formats default commands (using default platform behavior)', () => {
|
||||
expect(formatCommand(Command.QUIT, undefined, 'default')).toBe('Ctrl+C');
|
||||
expect(formatCommand(Command.SUBMIT, undefined, 'default')).toBe('Enter');
|
||||
expect(
|
||||
formatCommand(Command.TOGGLE_BACKGROUND_SHELL, undefined, 'default'),
|
||||
).toBe('Ctrl+B');
|
||||
});
|
||||
|
||||
it('returns empty string for unknown commands', () => {
|
||||
expect(
|
||||
formatCommand(
|
||||
'unknown.command' as unknown as Command,
|
||||
undefined,
|
||||
'default',
|
||||
),
|
||||
).toBe('');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user