Path: blob/main/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { KeyChord, KeyCode, KeyMod, ScanCode, ScanCodeUtils } from '../../../../../base/common/keyCodes.js';7import { KeyCodeChord, decodeKeybinding, createSimpleKeybinding, ScanCodeChord, Keybinding } from '../../../../../base/common/keybindings.js';8import { UserSettingsLabelProvider } from '../../../../../base/common/keybindingLabels.js';9import { OperatingSystem } from '../../../../../base/common/platform.js';10import { USLayoutResolvedKeybinding } from '../../../../../platform/keybinding/common/usLayoutResolvedKeybinding.js';11import { MacLinuxKeyboardMapper } from '../../common/macLinuxKeyboardMapper.js';12import { IResolvedKeybinding, assertMapping, assertResolveKeyboardEvent, assertResolveKeybinding, readRawMapping } from './keyboardMapperTestUtils.js';13import { IMacLinuxKeyboardMapping } from '../../../../../platform/keyboardLayout/common/keyboardLayout.js';14import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';1516const WRITE_FILE_IF_DIFFERENT = false;1718async function createKeyboardMapper(isUSStandard: boolean, file: string, mapAltGrToCtrlAlt: boolean, OS: OperatingSystem): Promise<MacLinuxKeyboardMapper> {19const rawMappings = await readRawMapping<IMacLinuxKeyboardMapping>(file);20return new MacLinuxKeyboardMapper(isUSStandard, rawMappings, mapAltGrToCtrlAlt, OS);21}2223suite('keyboardMapper - MAC de_ch', () => {2425ensureNoDisposablesAreLeakedInTestSuite();2627let mapper: MacLinuxKeyboardMapper;2829suiteSetup(async () => {30const _mapper = await createKeyboardMapper(false, 'mac_de_ch', false, OperatingSystem.Macintosh);31mapper = _mapper;32});3334test('mapping', () => {35return assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'mac_de_ch.txt');36});3738function assertKeybindingTranslation(kb: number, expected: string | string[]): void {39_assertKeybindingTranslation(mapper, OperatingSystem.Macintosh, kb, expected);40}4142function _assertResolveKeybinding(k: number, expected: IResolvedKeybinding[]): void {43assertResolveKeybinding(mapper, decodeKeybinding(k, OperatingSystem.Macintosh)!, expected);44}4546test('kb => hw', () => {47// unchanged48assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.Digit1, 'cmd+Digit1');49assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.KeyB, 'cmd+KeyB');50assertKeybindingTranslation(KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyB, 'shift+cmd+KeyB');51assertKeybindingTranslation(KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KeyB, 'ctrl+shift+alt+cmd+KeyB');5253// flips Y and Z54assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.KeyZ, 'cmd+KeyY');55assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.KeyY, 'cmd+KeyZ');5657// Ctrl+/58assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.Slash, 'shift+cmd+Digit7');59});6061test('resolveKeybinding Cmd+A', () => {62_assertResolveKeybinding(63KeyMod.CtrlCmd | KeyCode.KeyA,64[{65label: '⌘A',66ariaLabel: 'Command+A',67electronAccelerator: 'Cmd+A',68userSettingsLabel: 'cmd+a',69isWYSIWYG: true,70isMultiChord: false,71dispatchParts: ['meta+[KeyA]'],72singleModifierDispatchParts: [null],73}]74);75});7677test('resolveKeybinding Cmd+B', () => {78_assertResolveKeybinding(79KeyMod.CtrlCmd | KeyCode.KeyB,80[{81label: '⌘B',82ariaLabel: 'Command+B',83electronAccelerator: 'Cmd+B',84userSettingsLabel: 'cmd+b',85isWYSIWYG: true,86isMultiChord: false,87dispatchParts: ['meta+[KeyB]'],88singleModifierDispatchParts: [null],89}]90);91});9293test('resolveKeybinding Cmd+Z', () => {94_assertResolveKeybinding(95KeyMod.CtrlCmd | KeyCode.KeyZ,96[{97label: '⌘Z',98ariaLabel: 'Command+Z',99electronAccelerator: 'Cmd+Z',100userSettingsLabel: 'cmd+z',101isWYSIWYG: true,102isMultiChord: false,103dispatchParts: ['meta+[KeyY]'],104singleModifierDispatchParts: [null],105}]106);107});108109test('resolveKeyboardEvent Cmd+[KeyY]', () => {110assertResolveKeyboardEvent(111mapper,112{113_standardKeyboardEventBrand: true,114ctrlKey: false,115shiftKey: false,116altKey: false,117metaKey: true,118altGraphKey: false,119keyCode: -1,120code: 'KeyY'121},122{123label: '⌘Z',124ariaLabel: 'Command+Z',125electronAccelerator: 'Cmd+Z',126userSettingsLabel: 'cmd+z',127isWYSIWYG: true,128isMultiChord: false,129dispatchParts: ['meta+[KeyY]'],130singleModifierDispatchParts: [null],131}132);133});134135test('resolveKeybinding Cmd+]', () => {136_assertResolveKeybinding(137KeyMod.CtrlCmd | KeyCode.BracketRight,138[{139label: '⌃⌥⌘6',140ariaLabel: 'Control+Option+Command+6',141electronAccelerator: 'Ctrl+Alt+Cmd+6',142userSettingsLabel: 'ctrl+alt+cmd+6',143isWYSIWYG: true,144isMultiChord: false,145dispatchParts: ['ctrl+alt+meta+[Digit6]'],146singleModifierDispatchParts: [null],147}]148);149});150151test('resolveKeyboardEvent Cmd+[BracketRight]', () => {152assertResolveKeyboardEvent(153mapper,154{155_standardKeyboardEventBrand: true,156ctrlKey: false,157shiftKey: false,158altKey: false,159metaKey: true,160altGraphKey: false,161keyCode: -1,162code: 'BracketRight'163},164{165label: '⌘¨',166ariaLabel: 'Command+¨',167electronAccelerator: null,168userSettingsLabel: 'cmd+[BracketRight]',169isWYSIWYG: false,170isMultiChord: false,171dispatchParts: ['meta+[BracketRight]'],172singleModifierDispatchParts: [null],173}174);175});176177test('resolveKeybinding Shift+]', () => {178_assertResolveKeybinding(179KeyMod.Shift | KeyCode.BracketRight,180[{181label: '⌃⌥9',182ariaLabel: 'Control+Option+9',183electronAccelerator: 'Ctrl+Alt+9',184userSettingsLabel: 'ctrl+alt+9',185isWYSIWYG: true,186isMultiChord: false,187dispatchParts: ['ctrl+alt+[Digit9]'],188singleModifierDispatchParts: [null],189}]190);191});192193test('resolveKeybinding Cmd+/', () => {194_assertResolveKeybinding(195KeyMod.CtrlCmd | KeyCode.Slash,196[{197label: '⇧⌘7',198ariaLabel: 'Shift+Command+7',199electronAccelerator: 'Shift+Cmd+7',200userSettingsLabel: 'shift+cmd+7',201isWYSIWYG: true,202isMultiChord: false,203dispatchParts: ['shift+meta+[Digit7]'],204singleModifierDispatchParts: [null],205}]206);207});208209test('resolveKeybinding Cmd+Shift+/', () => {210_assertResolveKeybinding(211KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Slash,212[{213label: '⇧⌘\'',214ariaLabel: 'Shift+Command+\'',215electronAccelerator: null,216userSettingsLabel: 'shift+cmd+[Minus]',217isWYSIWYG: false,218isMultiChord: false,219dispatchParts: ['shift+meta+[Minus]'],220singleModifierDispatchParts: [null],221}]222);223});224225test('resolveKeybinding Cmd+K Cmd+\\', () => {226_assertResolveKeybinding(227KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.Backslash),228[{229label: '⌘K ⌃⇧⌥⌘7',230ariaLabel: 'Command+K Control+Shift+Option+Command+7',231electronAccelerator: null,232userSettingsLabel: 'cmd+k ctrl+shift+alt+cmd+7',233isWYSIWYG: true,234isMultiChord: true,235dispatchParts: ['meta+[KeyK]', 'ctrl+shift+alt+meta+[Digit7]'],236singleModifierDispatchParts: [null, null],237}]238);239});240241test('resolveKeybinding Cmd+K Cmd+=', () => {242_assertResolveKeybinding(243KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.Equal),244[{245label: '⌘K ⇧⌘0',246ariaLabel: 'Command+K Shift+Command+0',247electronAccelerator: null,248userSettingsLabel: 'cmd+k shift+cmd+0',249isWYSIWYG: true,250isMultiChord: true,251dispatchParts: ['meta+[KeyK]', 'shift+meta+[Digit0]'],252singleModifierDispatchParts: [null, null],253}]254);255});256257test('resolveKeybinding Cmd+DownArrow', () => {258_assertResolveKeybinding(259KeyMod.CtrlCmd | KeyCode.DownArrow,260[{261label: '⌘↓',262ariaLabel: 'Command+DownArrow',263electronAccelerator: 'Cmd+Down',264userSettingsLabel: 'cmd+down',265isWYSIWYG: true,266isMultiChord: false,267dispatchParts: ['meta+[ArrowDown]'],268singleModifierDispatchParts: [null],269}]270);271});272273test('resolveKeybinding Cmd+NUMPAD_0', () => {274_assertResolveKeybinding(275KeyMod.CtrlCmd | KeyCode.Numpad0,276[{277label: '⌘NumPad0',278ariaLabel: 'Command+NumPad0',279electronAccelerator: null,280userSettingsLabel: 'cmd+numpad0',281isWYSIWYG: true,282isMultiChord: false,283dispatchParts: ['meta+[Numpad0]'],284singleModifierDispatchParts: [null],285}]286);287});288289test('resolveKeybinding Ctrl+Home', () => {290_assertResolveKeybinding(291KeyMod.CtrlCmd | KeyCode.Home,292[{293label: '⌘Home',294ariaLabel: 'Command+Home',295electronAccelerator: 'Cmd+Home',296userSettingsLabel: 'cmd+home',297isWYSIWYG: true,298isMultiChord: false,299dispatchParts: ['meta+[Home]'],300singleModifierDispatchParts: [null],301}]302);303});304305test('resolveKeyboardEvent Ctrl+[Home]', () => {306assertResolveKeyboardEvent(307mapper,308{309_standardKeyboardEventBrand: true,310ctrlKey: false,311shiftKey: false,312altKey: false,313metaKey: true,314altGraphKey: false,315keyCode: -1,316code: 'Home'317},318{319label: '⌘Home',320ariaLabel: 'Command+Home',321electronAccelerator: 'Cmd+Home',322userSettingsLabel: 'cmd+home',323isWYSIWYG: true,324isMultiChord: false,325dispatchParts: ['meta+[Home]'],326singleModifierDispatchParts: [null],327}328);329});330331test('resolveUserBinding Cmd+[Comma] Cmd+/', () => {332assertResolveKeybinding(333mapper,334new Keybinding([335new ScanCodeChord(false, false, false, true, ScanCode.Comma),336new KeyCodeChord(false, false, false, true, KeyCode.Slash),337]),338[{339label: '⌘, ⇧⌘7',340ariaLabel: 'Command+, Shift+Command+7',341electronAccelerator: null,342userSettingsLabel: 'cmd+[Comma] shift+cmd+7',343isWYSIWYG: false,344isMultiChord: true,345dispatchParts: ['meta+[Comma]', 'shift+meta+[Digit7]'],346singleModifierDispatchParts: [null, null],347}]348);349});350351test('resolveKeyboardEvent Single Modifier MetaLeft+', () => {352assertResolveKeyboardEvent(353mapper,354{355_standardKeyboardEventBrand: true,356ctrlKey: false,357shiftKey: false,358altKey: false,359metaKey: true,360altGraphKey: false,361keyCode: -1,362code: 'MetaLeft'363},364{365label: '⌘',366ariaLabel: 'Command',367electronAccelerator: null,368userSettingsLabel: 'cmd',369isWYSIWYG: true,370isMultiChord: false,371dispatchParts: [null],372singleModifierDispatchParts: ['meta'],373}374);375});376377test('resolveKeyboardEvent Single Modifier MetaRight+', () => {378assertResolveKeyboardEvent(379mapper,380{381_standardKeyboardEventBrand: true,382ctrlKey: false,383shiftKey: false,384altKey: false,385metaKey: true,386altGraphKey: false,387keyCode: -1,388code: 'MetaRight'389},390{391label: '⌘',392ariaLabel: 'Command',393electronAccelerator: null,394userSettingsLabel: 'cmd',395isWYSIWYG: true,396isMultiChord: false,397dispatchParts: [null],398singleModifierDispatchParts: ['meta'],399}400);401});402});403404suite('keyboardMapper - MAC en_us', () => {405406ensureNoDisposablesAreLeakedInTestSuite();407408let mapper: MacLinuxKeyboardMapper;409410suiteSetup(async () => {411const _mapper = await createKeyboardMapper(true, 'mac_en_us', false, OperatingSystem.Macintosh);412mapper = _mapper;413});414415test('mapping', () => {416return assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'mac_en_us.txt');417});418419test('resolveUserBinding Cmd+[Comma] Cmd+/', () => {420assertResolveKeybinding(421mapper,422new Keybinding([423new ScanCodeChord(false, false, false, true, ScanCode.Comma),424new KeyCodeChord(false, false, false, true, KeyCode.Slash),425]),426[{427label: '⌘, ⌘/',428ariaLabel: 'Command+, Command+/',429electronAccelerator: null,430userSettingsLabel: 'cmd+, cmd+/',431isWYSIWYG: true,432isMultiChord: true,433dispatchParts: ['meta+[Comma]', 'meta+[Slash]'],434singleModifierDispatchParts: [null, null],435}]436);437});438439test('resolveKeyboardEvent Single Modifier MetaLeft+', () => {440assertResolveKeyboardEvent(441mapper,442{443_standardKeyboardEventBrand: true,444ctrlKey: false,445shiftKey: false,446altKey: false,447metaKey: true,448altGraphKey: false,449keyCode: -1,450code: 'MetaLeft'451},452{453label: '⌘',454ariaLabel: 'Command',455electronAccelerator: null,456userSettingsLabel: 'cmd',457isWYSIWYG: true,458isMultiChord: false,459dispatchParts: [null],460singleModifierDispatchParts: ['meta'],461}462);463});464465test('resolveKeyboardEvent Single Modifier MetaRight+', () => {466assertResolveKeyboardEvent(467mapper,468{469_standardKeyboardEventBrand: true,470ctrlKey: false,471shiftKey: false,472altKey: false,473metaKey: true,474altGraphKey: false,475keyCode: -1,476code: 'MetaRight'477},478{479label: '⌘',480ariaLabel: 'Command',481electronAccelerator: null,482userSettingsLabel: 'cmd',483isWYSIWYG: true,484isMultiChord: false,485dispatchParts: [null],486singleModifierDispatchParts: ['meta'],487}488);489});490491test('resolveKeyboardEvent mapAltGrToCtrlAlt AltGr+Z', async () => {492const mapper = await createKeyboardMapper(true, 'mac_en_us', true, OperatingSystem.Macintosh);493494assertResolveKeyboardEvent(495mapper,496{497_standardKeyboardEventBrand: true,498ctrlKey: false,499shiftKey: false,500altKey: false,501metaKey: false,502altGraphKey: true,503keyCode: -1,504code: 'KeyZ'505},506{507label: '⌃⌥Z',508ariaLabel: 'Control+Option+Z',509electronAccelerator: 'Ctrl+Alt+Z',510userSettingsLabel: 'ctrl+alt+z',511isWYSIWYG: true,512isMultiChord: false,513dispatchParts: ['ctrl+alt+[KeyZ]'],514singleModifierDispatchParts: [null],515}516);517});518});519520suite('keyboardMapper - LINUX de_ch', () => {521522ensureNoDisposablesAreLeakedInTestSuite();523524let mapper: MacLinuxKeyboardMapper;525526suiteSetup(async () => {527const _mapper = await createKeyboardMapper(false, 'linux_de_ch', false, OperatingSystem.Linux);528mapper = _mapper;529});530531test('mapping', () => {532return assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'linux_de_ch.txt');533});534535function assertKeybindingTranslation(kb: number, expected: string | string[]): void {536_assertKeybindingTranslation(mapper, OperatingSystem.Linux, kb, expected);537}538539function _assertResolveKeybinding(k: number, expected: IResolvedKeybinding[]): void {540assertResolveKeybinding(mapper, decodeKeybinding(k, OperatingSystem.Linux)!, expected);541}542543test('kb => hw', () => {544// unchanged545assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.Digit1, 'ctrl+Digit1');546assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.KeyB, 'ctrl+KeyB');547assertKeybindingTranslation(KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyB, 'ctrl+shift+KeyB');548assertKeybindingTranslation(KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KeyB, 'ctrl+shift+alt+meta+KeyB');549550// flips Y and Z551assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.KeyZ, 'ctrl+KeyY');552assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.KeyY, 'ctrl+KeyZ');553554// Ctrl+/555assertKeybindingTranslation(KeyMod.CtrlCmd | KeyCode.Slash, 'ctrl+shift+Digit7');556});557558test('resolveKeybinding Ctrl+A', () => {559_assertResolveKeybinding(560KeyMod.CtrlCmd | KeyCode.KeyA,561[{562label: 'Ctrl+A',563ariaLabel: 'Control+A',564electronAccelerator: 'Ctrl+A',565userSettingsLabel: 'ctrl+a',566isWYSIWYG: true,567isMultiChord: false,568dispatchParts: ['ctrl+[KeyA]'],569singleModifierDispatchParts: [null],570}]571);572});573574test('resolveKeybinding Ctrl+Z', () => {575_assertResolveKeybinding(576KeyMod.CtrlCmd | KeyCode.KeyZ,577[{578label: 'Ctrl+Z',579ariaLabel: 'Control+Z',580electronAccelerator: 'Ctrl+Z',581userSettingsLabel: 'ctrl+z',582isWYSIWYG: true,583isMultiChord: false,584dispatchParts: ['ctrl+[KeyY]'],585singleModifierDispatchParts: [null],586}]587);588});589590test('resolveKeyboardEvent Ctrl+[KeyY]', () => {591assertResolveKeyboardEvent(592mapper,593{594_standardKeyboardEventBrand: true,595ctrlKey: true,596shiftKey: false,597altKey: false,598metaKey: false,599altGraphKey: false,600keyCode: -1,601code: 'KeyY'602},603{604label: 'Ctrl+Z',605ariaLabel: 'Control+Z',606electronAccelerator: 'Ctrl+Z',607userSettingsLabel: 'ctrl+z',608isWYSIWYG: true,609isMultiChord: false,610dispatchParts: ['ctrl+[KeyY]'],611singleModifierDispatchParts: [null],612}613);614});615616test('resolveKeybinding Ctrl+]', () => {617_assertResolveKeybinding(618KeyMod.CtrlCmd | KeyCode.BracketRight,619[]620);621});622623test('resolveKeyboardEvent Ctrl+[BracketRight]', () => {624assertResolveKeyboardEvent(625mapper,626{627_standardKeyboardEventBrand: true,628ctrlKey: true,629shiftKey: false,630altKey: false,631metaKey: false,632altGraphKey: false,633keyCode: -1,634code: 'BracketRight'635},636{637label: 'Ctrl+¨',638ariaLabel: 'Control+¨',639electronAccelerator: null,640userSettingsLabel: 'ctrl+[BracketRight]',641isWYSIWYG: false,642isMultiChord: false,643dispatchParts: ['ctrl+[BracketRight]'],644singleModifierDispatchParts: [null],645}646);647});648649test('resolveKeybinding Shift+]', () => {650_assertResolveKeybinding(651KeyMod.Shift | KeyCode.BracketRight,652[{653label: 'Ctrl+Alt+0',654ariaLabel: 'Control+Alt+0',655electronAccelerator: 'Ctrl+Alt+0',656userSettingsLabel: 'ctrl+alt+0',657isWYSIWYG: true,658isMultiChord: false,659dispatchParts: ['ctrl+alt+[Digit0]'],660singleModifierDispatchParts: [null],661}, {662label: 'Ctrl+Alt+$',663ariaLabel: 'Control+Alt+$',664electronAccelerator: null,665userSettingsLabel: 'ctrl+alt+[Backslash]',666isWYSIWYG: false,667isMultiChord: false,668dispatchParts: ['ctrl+alt+[Backslash]'],669singleModifierDispatchParts: [null],670}]671);672});673674test('resolveKeybinding Ctrl+/', () => {675_assertResolveKeybinding(676KeyMod.CtrlCmd | KeyCode.Slash,677[{678label: 'Ctrl+Shift+7',679ariaLabel: 'Control+Shift+7',680electronAccelerator: 'Ctrl+Shift+7',681userSettingsLabel: 'ctrl+shift+7',682isWYSIWYG: true,683isMultiChord: false,684dispatchParts: ['ctrl+shift+[Digit7]'],685singleModifierDispatchParts: [null],686}]687);688});689690test('resolveKeybinding Ctrl+Shift+/', () => {691_assertResolveKeybinding(692KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Slash,693[{694label: 'Ctrl+Shift+\'',695ariaLabel: 'Control+Shift+\'',696electronAccelerator: null,697userSettingsLabel: 'ctrl+shift+[Minus]',698isWYSIWYG: false,699isMultiChord: false,700dispatchParts: ['ctrl+shift+[Minus]'],701singleModifierDispatchParts: [null],702}]703);704});705706test('resolveKeybinding Ctrl+K Ctrl+\\', () => {707_assertResolveKeybinding(708KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.Backslash),709[]710);711});712713test('resolveKeybinding Ctrl+K Ctrl+=', () => {714_assertResolveKeybinding(715KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.Equal),716[{717label: 'Ctrl+K Ctrl+Shift+0',718ariaLabel: 'Control+K Control+Shift+0',719electronAccelerator: null,720userSettingsLabel: 'ctrl+k ctrl+shift+0',721isWYSIWYG: true,722isMultiChord: true,723dispatchParts: ['ctrl+[KeyK]', 'ctrl+shift+[Digit0]'],724singleModifierDispatchParts: [null, null],725}]726);727});728729test('resolveKeybinding Ctrl+DownArrow', () => {730_assertResolveKeybinding(731KeyMod.CtrlCmd | KeyCode.DownArrow,732[{733label: 'Ctrl+DownArrow',734ariaLabel: 'Control+DownArrow',735electronAccelerator: 'Ctrl+Down',736userSettingsLabel: 'ctrl+down',737isWYSIWYG: true,738isMultiChord: false,739dispatchParts: ['ctrl+[ArrowDown]'],740singleModifierDispatchParts: [null],741}]742);743});744745test('resolveKeybinding Ctrl+NUMPAD_0', () => {746_assertResolveKeybinding(747KeyMod.CtrlCmd | KeyCode.Numpad0,748[{749label: 'Ctrl+NumPad0',750ariaLabel: 'Control+NumPad0',751electronAccelerator: null,752userSettingsLabel: 'ctrl+numpad0',753isWYSIWYG: true,754isMultiChord: false,755dispatchParts: ['ctrl+[Numpad0]'],756singleModifierDispatchParts: [null],757}]758);759});760761test('resolveKeybinding Ctrl+Home', () => {762_assertResolveKeybinding(763KeyMod.CtrlCmd | KeyCode.Home,764[{765label: 'Ctrl+Home',766ariaLabel: 'Control+Home',767electronAccelerator: 'Ctrl+Home',768userSettingsLabel: 'ctrl+home',769isWYSIWYG: true,770isMultiChord: false,771dispatchParts: ['ctrl+[Home]'],772singleModifierDispatchParts: [null],773}]774);775});776777test('resolveKeyboardEvent Ctrl+[Home]', () => {778assertResolveKeyboardEvent(779mapper,780{781_standardKeyboardEventBrand: true,782ctrlKey: true,783shiftKey: false,784altKey: false,785metaKey: false,786altGraphKey: false,787keyCode: -1,788code: 'Home'789},790{791label: 'Ctrl+Home',792ariaLabel: 'Control+Home',793electronAccelerator: 'Ctrl+Home',794userSettingsLabel: 'ctrl+home',795isWYSIWYG: true,796isMultiChord: false,797dispatchParts: ['ctrl+[Home]'],798singleModifierDispatchParts: [null],799}800);801});802803test('resolveKeyboardEvent Ctrl+[KeyX]', () => {804assertResolveKeyboardEvent(805mapper,806{807_standardKeyboardEventBrand: true,808ctrlKey: true,809shiftKey: false,810altKey: false,811metaKey: false,812altGraphKey: false,813keyCode: -1,814code: 'KeyX'815},816{817label: 'Ctrl+X',818ariaLabel: 'Control+X',819electronAccelerator: 'Ctrl+X',820userSettingsLabel: 'ctrl+x',821isWYSIWYG: true,822isMultiChord: false,823dispatchParts: ['ctrl+[KeyX]'],824singleModifierDispatchParts: [null],825}826);827});828829test('resolveUserBinding Ctrl+[Comma] Ctrl+/', () => {830assertResolveKeybinding(831mapper, new Keybinding([832new ScanCodeChord(true, false, false, false, ScanCode.Comma),833new KeyCodeChord(true, false, false, false, KeyCode.Slash),834]),835[{836label: 'Ctrl+, Ctrl+Shift+7',837ariaLabel: 'Control+, Control+Shift+7',838electronAccelerator: null,839userSettingsLabel: 'ctrl+[Comma] ctrl+shift+7',840isWYSIWYG: false,841isMultiChord: true,842dispatchParts: ['ctrl+[Comma]', 'ctrl+shift+[Digit7]'],843singleModifierDispatchParts: [null, null],844}]845);846});847848test('resolveKeyboardEvent Single Modifier ControlLeft+', () => {849assertResolveKeyboardEvent(850mapper,851{852_standardKeyboardEventBrand: true,853ctrlKey: true,854shiftKey: false,855altKey: false,856metaKey: false,857altGraphKey: false,858keyCode: -1,859code: 'ControlLeft'860},861{862label: 'Ctrl',863ariaLabel: 'Control',864electronAccelerator: null,865userSettingsLabel: 'ctrl',866isWYSIWYG: true,867isMultiChord: false,868dispatchParts: [null],869singleModifierDispatchParts: ['ctrl'],870}871);872});873874test('resolveKeyboardEvent Single Modifier ControlRight+', () => {875assertResolveKeyboardEvent(876mapper,877{878_standardKeyboardEventBrand: true,879ctrlKey: true,880shiftKey: false,881altKey: false,882metaKey: false,883altGraphKey: false,884keyCode: -1,885code: 'ControlRight'886},887{888label: 'Ctrl',889ariaLabel: 'Control',890electronAccelerator: null,891userSettingsLabel: 'ctrl',892isWYSIWYG: true,893isMultiChord: false,894dispatchParts: [null],895singleModifierDispatchParts: ['ctrl'],896}897);898});899});900901suite('keyboardMapper - LINUX en_us', () => {902903ensureNoDisposablesAreLeakedInTestSuite();904905let mapper: MacLinuxKeyboardMapper;906907suiteSetup(async () => {908const _mapper = await createKeyboardMapper(true, 'linux_en_us', false, OperatingSystem.Linux);909mapper = _mapper;910});911912test('mapping', () => {913return assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'linux_en_us.txt');914});915916function _assertResolveKeybinding(k: number, expected: IResolvedKeybinding[]): void {917assertResolveKeybinding(mapper, decodeKeybinding(k, OperatingSystem.Linux)!, expected);918}919920test('resolveKeybinding Ctrl+A', () => {921_assertResolveKeybinding(922KeyMod.CtrlCmd | KeyCode.KeyA,923[{924label: 'Ctrl+A',925ariaLabel: 'Control+A',926electronAccelerator: 'Ctrl+A',927userSettingsLabel: 'ctrl+a',928isWYSIWYG: true,929isMultiChord: false,930dispatchParts: ['ctrl+[KeyA]'],931singleModifierDispatchParts: [null],932}]933);934});935936test('resolveKeybinding Ctrl+Z', () => {937_assertResolveKeybinding(938KeyMod.CtrlCmd | KeyCode.KeyZ,939[{940label: 'Ctrl+Z',941ariaLabel: 'Control+Z',942electronAccelerator: 'Ctrl+Z',943userSettingsLabel: 'ctrl+z',944isWYSIWYG: true,945isMultiChord: false,946dispatchParts: ['ctrl+[KeyZ]'],947singleModifierDispatchParts: [null],948}]949);950});951952test('resolveKeyboardEvent Ctrl+[KeyZ]', () => {953assertResolveKeyboardEvent(954mapper,955{956_standardKeyboardEventBrand: true,957ctrlKey: true,958shiftKey: false,959altKey: false,960metaKey: false,961altGraphKey: false,962keyCode: -1,963code: 'KeyZ'964},965{966label: 'Ctrl+Z',967ariaLabel: 'Control+Z',968electronAccelerator: 'Ctrl+Z',969userSettingsLabel: 'ctrl+z',970isWYSIWYG: true,971isMultiChord: false,972dispatchParts: ['ctrl+[KeyZ]'],973singleModifierDispatchParts: [null],974}975);976});977978test('resolveKeybinding Ctrl+]', () => {979_assertResolveKeybinding(980KeyMod.CtrlCmd | KeyCode.BracketRight,981[{982label: 'Ctrl+]',983ariaLabel: 'Control+]',984electronAccelerator: 'Ctrl+]',985userSettingsLabel: 'ctrl+]',986isWYSIWYG: true,987isMultiChord: false,988dispatchParts: ['ctrl+[BracketRight]'],989singleModifierDispatchParts: [null],990}]991);992});993994test('resolveKeyboardEvent Ctrl+[BracketRight]', () => {995assertResolveKeyboardEvent(996mapper,997{998_standardKeyboardEventBrand: true,999ctrlKey: true,1000shiftKey: false,1001altKey: false,1002metaKey: false,1003altGraphKey: false,1004keyCode: -1,1005code: 'BracketRight'1006},1007{1008label: 'Ctrl+]',1009ariaLabel: 'Control+]',1010electronAccelerator: 'Ctrl+]',1011userSettingsLabel: 'ctrl+]',1012isWYSIWYG: true,1013isMultiChord: false,1014dispatchParts: ['ctrl+[BracketRight]'],1015singleModifierDispatchParts: [null],1016}1017);1018});10191020test('resolveKeybinding Shift+]', () => {1021_assertResolveKeybinding(1022KeyMod.Shift | KeyCode.BracketRight,1023[{1024label: 'Shift+]',1025ariaLabel: 'Shift+]',1026electronAccelerator: 'Shift+]',1027userSettingsLabel: 'shift+]',1028isWYSIWYG: true,1029isMultiChord: false,1030dispatchParts: ['shift+[BracketRight]'],1031singleModifierDispatchParts: [null],1032}]1033);1034});10351036test('resolveKeybinding Ctrl+/', () => {1037_assertResolveKeybinding(1038KeyMod.CtrlCmd | KeyCode.Slash,1039[{1040label: 'Ctrl+/',1041ariaLabel: 'Control+/',1042electronAccelerator: 'Ctrl+/',1043userSettingsLabel: 'ctrl+/',1044isWYSIWYG: true,1045isMultiChord: false,1046dispatchParts: ['ctrl+[Slash]'],1047singleModifierDispatchParts: [null],1048}]1049);1050});10511052test('resolveKeybinding Ctrl+Shift+/', () => {1053_assertResolveKeybinding(1054KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Slash,1055[{1056label: 'Ctrl+Shift+/',1057ariaLabel: 'Control+Shift+/',1058electronAccelerator: 'Ctrl+Shift+/',1059userSettingsLabel: 'ctrl+shift+/',1060isWYSIWYG: true,1061isMultiChord: false,1062dispatchParts: ['ctrl+shift+[Slash]'],1063singleModifierDispatchParts: [null],1064}]1065);1066});10671068test('resolveKeybinding Ctrl+K Ctrl+\\', () => {1069_assertResolveKeybinding(1070KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.Backslash),1071[{1072label: 'Ctrl+K Ctrl+\\',1073ariaLabel: 'Control+K Control+\\',1074electronAccelerator: null,1075userSettingsLabel: 'ctrl+k ctrl+\\',1076isWYSIWYG: true,1077isMultiChord: true,1078dispatchParts: ['ctrl+[KeyK]', 'ctrl+[Backslash]'],1079singleModifierDispatchParts: [null, null],1080}]1081);1082});10831084test('resolveKeybinding Ctrl+K Ctrl+=', () => {1085_assertResolveKeybinding(1086KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.Equal),1087[{1088label: 'Ctrl+K Ctrl+=',1089ariaLabel: 'Control+K Control+=',1090electronAccelerator: null,1091userSettingsLabel: 'ctrl+k ctrl+=',1092isWYSIWYG: true,1093isMultiChord: true,1094dispatchParts: ['ctrl+[KeyK]', 'ctrl+[Equal]'],1095singleModifierDispatchParts: [null, null],1096}]1097);1098});10991100test('resolveKeybinding Ctrl+DownArrow', () => {1101_assertResolveKeybinding(1102KeyMod.CtrlCmd | KeyCode.DownArrow,1103[{1104label: 'Ctrl+DownArrow',1105ariaLabel: 'Control+DownArrow',1106electronAccelerator: 'Ctrl+Down',1107userSettingsLabel: 'ctrl+down',1108isWYSIWYG: true,1109isMultiChord: false,1110dispatchParts: ['ctrl+[ArrowDown]'],1111singleModifierDispatchParts: [null],1112}]1113);1114});11151116test('resolveKeybinding Ctrl+NUMPAD_0', () => {1117_assertResolveKeybinding(1118KeyMod.CtrlCmd | KeyCode.Numpad0,1119[{1120label: 'Ctrl+NumPad0',1121ariaLabel: 'Control+NumPad0',1122electronAccelerator: null,1123userSettingsLabel: 'ctrl+numpad0',1124isWYSIWYG: true,1125isMultiChord: false,1126dispatchParts: ['ctrl+[Numpad0]'],1127singleModifierDispatchParts: [null],1128}]1129);1130});11311132test('resolveKeybinding Ctrl+Home', () => {1133_assertResolveKeybinding(1134KeyMod.CtrlCmd | KeyCode.Home,1135[{1136label: 'Ctrl+Home',1137ariaLabel: 'Control+Home',1138electronAccelerator: 'Ctrl+Home',1139userSettingsLabel: 'ctrl+home',1140isWYSIWYG: true,1141isMultiChord: false,1142dispatchParts: ['ctrl+[Home]'],1143singleModifierDispatchParts: [null],1144}]1145);1146});11471148test('resolveKeyboardEvent Ctrl+[Home]', () => {1149assertResolveKeyboardEvent(1150mapper,1151{1152_standardKeyboardEventBrand: true,1153ctrlKey: true,1154shiftKey: false,1155altKey: false,1156metaKey: false,1157altGraphKey: false,1158keyCode: -1,1159code: 'Home'1160},1161{1162label: 'Ctrl+Home',1163ariaLabel: 'Control+Home',1164electronAccelerator: 'Ctrl+Home',1165userSettingsLabel: 'ctrl+home',1166isWYSIWYG: true,1167isMultiChord: false,1168dispatchParts: ['ctrl+[Home]'],1169singleModifierDispatchParts: [null],1170}1171);1172});11731174test('resolveKeybinding Ctrl+Shift+,', () => {1175_assertResolveKeybinding(1176KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Comma,1177[{1178label: 'Ctrl+Shift+,',1179ariaLabel: 'Control+Shift+,',1180electronAccelerator: 'Ctrl+Shift+,',1181userSettingsLabel: 'ctrl+shift+,',1182isWYSIWYG: true,1183isMultiChord: false,1184dispatchParts: ['ctrl+shift+[Comma]'],1185singleModifierDispatchParts: [null],1186}, {1187label: 'Ctrl+<',1188ariaLabel: 'Control+<',1189electronAccelerator: null,1190userSettingsLabel: 'ctrl+[IntlBackslash]',1191isWYSIWYG: false,1192isMultiChord: false,1193dispatchParts: ['ctrl+[IntlBackslash]'],1194singleModifierDispatchParts: [null],1195}]1196);1197});11981199test('issue #23393: resolveKeybinding Ctrl+Enter', () => {1200_assertResolveKeybinding(1201KeyMod.CtrlCmd | KeyCode.Enter,1202[{1203label: 'Ctrl+Enter',1204ariaLabel: 'Control+Enter',1205electronAccelerator: 'Ctrl+Enter',1206userSettingsLabel: 'ctrl+enter',1207isWYSIWYG: true,1208isMultiChord: false,1209dispatchParts: ['ctrl+[Enter]'],1210singleModifierDispatchParts: [null],1211}]1212);1213});12141215test('issue #23393: resolveKeyboardEvent Ctrl+[NumpadEnter]', () => {1216assertResolveKeyboardEvent(1217mapper,1218{1219_standardKeyboardEventBrand: true,1220ctrlKey: true,1221shiftKey: false,1222altKey: false,1223metaKey: false,1224altGraphKey: false,1225keyCode: -1,1226code: 'NumpadEnter'1227},1228{1229label: 'Ctrl+Enter',1230ariaLabel: 'Control+Enter',1231electronAccelerator: 'Ctrl+Enter',1232userSettingsLabel: 'ctrl+enter',1233isWYSIWYG: true,1234isMultiChord: false,1235dispatchParts: ['ctrl+[Enter]'],1236singleModifierDispatchParts: [null],1237}1238);1239});12401241test('resolveUserBinding Ctrl+[Comma] Ctrl+/', () => {1242assertResolveKeybinding(1243mapper, new Keybinding([1244new ScanCodeChord(true, false, false, false, ScanCode.Comma),1245new KeyCodeChord(true, false, false, false, KeyCode.Slash),1246]),1247[{1248label: 'Ctrl+, Ctrl+/',1249ariaLabel: 'Control+, Control+/',1250electronAccelerator: null,1251userSettingsLabel: 'ctrl+, ctrl+/',1252isWYSIWYG: true,1253isMultiChord: true,1254dispatchParts: ['ctrl+[Comma]', 'ctrl+[Slash]'],1255singleModifierDispatchParts: [null, null],1256}]1257);1258});12591260test('resolveUserBinding Ctrl+[Comma]', () => {1261assertResolveKeybinding(1262mapper, new Keybinding([1263new ScanCodeChord(true, false, false, false, ScanCode.Comma)1264]),1265[{1266label: 'Ctrl+,',1267ariaLabel: 'Control+,',1268electronAccelerator: 'Ctrl+,',1269userSettingsLabel: 'ctrl+,',1270isWYSIWYG: true,1271isMultiChord: false,1272dispatchParts: ['ctrl+[Comma]'],1273singleModifierDispatchParts: [null],1274}]1275);1276});12771278test('resolveKeyboardEvent Single Modifier ControlLeft+', () => {1279assertResolveKeyboardEvent(1280mapper,1281{1282_standardKeyboardEventBrand: true,1283ctrlKey: true,1284shiftKey: false,1285altKey: false,1286metaKey: false,1287altGraphKey: false,1288keyCode: -1,1289code: 'ControlLeft'1290},1291{1292label: 'Ctrl',1293ariaLabel: 'Control',1294electronAccelerator: null,1295userSettingsLabel: 'ctrl',1296isWYSIWYG: true,1297isMultiChord: false,1298dispatchParts: [null],1299singleModifierDispatchParts: ['ctrl'],1300}1301);1302});13031304test('resolveKeyboardEvent Single Modifier ControlRight+', () => {1305assertResolveKeyboardEvent(1306mapper,1307{1308_standardKeyboardEventBrand: true,1309ctrlKey: true,1310shiftKey: false,1311altKey: false,1312metaKey: false,1313altGraphKey: false,1314keyCode: -1,1315code: 'ControlRight'1316},1317{1318label: 'Ctrl',1319ariaLabel: 'Control',1320electronAccelerator: null,1321userSettingsLabel: 'ctrl',1322isWYSIWYG: true,1323isMultiChord: false,1324dispatchParts: [null],1325singleModifierDispatchParts: ['ctrl'],1326}1327);1328});13291330test('resolveKeyboardEvent Single Modifier ShiftLeft+', () => {1331assertResolveKeyboardEvent(1332mapper,1333{1334_standardKeyboardEventBrand: true,1335ctrlKey: false,1336shiftKey: true,1337altKey: false,1338metaKey: false,1339altGraphKey: false,1340keyCode: -1,1341code: 'ShiftLeft'1342},1343{1344label: 'Shift',1345ariaLabel: 'Shift',1346electronAccelerator: null,1347userSettingsLabel: 'shift',1348isWYSIWYG: true,1349isMultiChord: false,1350dispatchParts: [null],1351singleModifierDispatchParts: ['shift'],1352}1353);1354});13551356test('resolveKeyboardEvent Single Modifier ShiftRight+', () => {1357assertResolveKeyboardEvent(1358mapper,1359{1360_standardKeyboardEventBrand: true,1361ctrlKey: false,1362shiftKey: true,1363altKey: false,1364metaKey: false,1365altGraphKey: false,1366keyCode: -1,1367code: 'ShiftRight'1368},1369{1370label: 'Shift',1371ariaLabel: 'Shift',1372electronAccelerator: null,1373userSettingsLabel: 'shift',1374isWYSIWYG: true,1375isMultiChord: false,1376dispatchParts: [null],1377singleModifierDispatchParts: ['shift'],1378}1379);1380});13811382test('resolveKeyboardEvent Single Modifier AltLeft+', () => {1383assertResolveKeyboardEvent(1384mapper,1385{1386_standardKeyboardEventBrand: true,1387ctrlKey: false,1388shiftKey: false,1389altKey: true,1390metaKey: false,1391altGraphKey: false,1392keyCode: -1,1393code: 'AltLeft'1394},1395{1396label: 'Alt',1397ariaLabel: 'Alt',1398electronAccelerator: null,1399userSettingsLabel: 'alt',1400isWYSIWYG: true,1401isMultiChord: false,1402dispatchParts: [null],1403singleModifierDispatchParts: ['alt'],1404}1405);1406});14071408test('resolveKeyboardEvent Single Modifier AltRight+', () => {1409assertResolveKeyboardEvent(1410mapper,1411{1412_standardKeyboardEventBrand: true,1413ctrlKey: false,1414shiftKey: false,1415altKey: true,1416metaKey: false,1417altGraphKey: false,1418keyCode: -1,1419code: 'AltRight'1420},1421{1422label: 'Alt',1423ariaLabel: 'Alt',1424electronAccelerator: null,1425userSettingsLabel: 'alt',1426isWYSIWYG: true,1427isMultiChord: false,1428dispatchParts: [null],1429singleModifierDispatchParts: ['alt'],1430}1431);1432});14331434test('resolveKeyboardEvent Single Modifier MetaLeft+', () => {1435assertResolveKeyboardEvent(1436mapper,1437{1438_standardKeyboardEventBrand: true,1439ctrlKey: false,1440shiftKey: false,1441altKey: false,1442metaKey: true,1443altGraphKey: false,1444keyCode: -1,1445code: 'MetaLeft'1446},1447{1448label: 'Super',1449ariaLabel: 'Super',1450electronAccelerator: null,1451userSettingsLabel: 'meta',1452isWYSIWYG: true,1453isMultiChord: false,1454dispatchParts: [null],1455singleModifierDispatchParts: ['meta'],1456}1457);1458});14591460test('resolveKeyboardEvent Single Modifier MetaRight+', () => {1461assertResolveKeyboardEvent(1462mapper,1463{1464_standardKeyboardEventBrand: true,1465ctrlKey: false,1466shiftKey: false,1467altKey: false,1468metaKey: true,1469altGraphKey: false,1470keyCode: -1,1471code: 'MetaRight'1472},1473{1474label: 'Super',1475ariaLabel: 'Super',1476electronAccelerator: null,1477userSettingsLabel: 'meta',1478isWYSIWYG: true,1479isMultiChord: false,1480dispatchParts: [null],1481singleModifierDispatchParts: ['meta'],1482}1483);1484});14851486test('resolveKeyboardEvent Only Modifiers Ctrl+Shift+', () => {1487assertResolveKeyboardEvent(1488mapper,1489{1490_standardKeyboardEventBrand: true,1491ctrlKey: true,1492shiftKey: true,1493altKey: false,1494metaKey: false,1495altGraphKey: false,1496keyCode: -1,1497code: 'ShiftLeft'1498},1499{1500label: 'Ctrl+Shift',1501ariaLabel: 'Control+Shift',1502electronAccelerator: null,1503userSettingsLabel: 'ctrl+shift',1504isWYSIWYG: true,1505isMultiChord: false,1506dispatchParts: [null],1507singleModifierDispatchParts: [null],1508}1509);1510});15111512test('resolveKeyboardEvent mapAltGrToCtrlAlt AltGr+Z', async () => {1513const mapper = await createKeyboardMapper(true, 'linux_en_us', true, OperatingSystem.Linux);15141515assertResolveKeyboardEvent(1516mapper,1517{1518_standardKeyboardEventBrand: true,1519ctrlKey: false,1520shiftKey: false,1521altKey: false,1522metaKey: false,1523altGraphKey: true,1524keyCode: -1,1525code: 'KeyZ'1526},1527{1528label: 'Ctrl+Alt+Z',1529ariaLabel: 'Control+Alt+Z',1530electronAccelerator: 'Ctrl+Alt+Z',1531userSettingsLabel: 'ctrl+alt+z',1532isWYSIWYG: true,1533isMultiChord: false,1534dispatchParts: ['ctrl+alt+[KeyZ]'],1535singleModifierDispatchParts: [null],1536}1537);1538});1539});15401541suite('keyboardMapper', () => {15421543ensureNoDisposablesAreLeakedInTestSuite();15441545test('issue #23706: Linux UK layout: Ctrl + Apostrophe also toggles terminal', () => {1546const mapper = new MacLinuxKeyboardMapper(false, {1547'Backquote': {1548'value': '`',1549'withShift': '¬',1550'withAltGr': '|',1551'withShiftAltGr': '|'1552}1553}, false, OperatingSystem.Linux);15541555assertResolveKeyboardEvent(1556mapper,1557{1558_standardKeyboardEventBrand: true,1559ctrlKey: true,1560shiftKey: false,1561altKey: false,1562metaKey: false,1563altGraphKey: false,1564keyCode: -1,1565code: 'Backquote'1566},1567{1568label: 'Ctrl+`',1569ariaLabel: 'Control+`',1570electronAccelerator: null,1571userSettingsLabel: 'ctrl+`',1572isWYSIWYG: true,1573isMultiChord: false,1574dispatchParts: ['ctrl+[Backquote]'],1575singleModifierDispatchParts: [null],1576}1577);1578});15791580test('issue #24064: NumLock/NumPad keys stopped working in 1.11 on Linux', () => {1581const mapper = new MacLinuxKeyboardMapper(false, {}, false, OperatingSystem.Linux);15821583function assertNumpadKeyboardEvent(keyCode: KeyCode, code: string, label: string, electronAccelerator: string | null, userSettingsLabel: string, dispatch: string): void {1584assertResolveKeyboardEvent(1585mapper,1586{1587_standardKeyboardEventBrand: true,1588ctrlKey: false,1589shiftKey: false,1590altKey: false,1591metaKey: false,1592altGraphKey: false,1593keyCode: keyCode,1594code: code1595},1596{1597label: label,1598ariaLabel: label,1599electronAccelerator: electronAccelerator,1600userSettingsLabel: userSettingsLabel,1601isWYSIWYG: true,1602isMultiChord: false,1603dispatchParts: [dispatch],1604singleModifierDispatchParts: [null],1605}1606);1607}16081609assertNumpadKeyboardEvent(KeyCode.End, 'Numpad1', 'End', 'End', 'end', '[End]');1610assertNumpadKeyboardEvent(KeyCode.DownArrow, 'Numpad2', 'DownArrow', 'Down', 'down', '[ArrowDown]');1611assertNumpadKeyboardEvent(KeyCode.PageDown, 'Numpad3', 'PageDown', 'PageDown', 'pagedown', '[PageDown]');1612assertNumpadKeyboardEvent(KeyCode.LeftArrow, 'Numpad4', 'LeftArrow', 'Left', 'left', '[ArrowLeft]');1613assertNumpadKeyboardEvent(KeyCode.Unknown, 'Numpad5', 'NumPad5', null, 'numpad5', '[Numpad5]');1614assertNumpadKeyboardEvent(KeyCode.RightArrow, 'Numpad6', 'RightArrow', 'Right', 'right', '[ArrowRight]');1615assertNumpadKeyboardEvent(KeyCode.Home, 'Numpad7', 'Home', 'Home', 'home', '[Home]');1616assertNumpadKeyboardEvent(KeyCode.UpArrow, 'Numpad8', 'UpArrow', 'Up', 'up', '[ArrowUp]');1617assertNumpadKeyboardEvent(KeyCode.PageUp, 'Numpad9', 'PageUp', 'PageUp', 'pageup', '[PageUp]');1618assertNumpadKeyboardEvent(KeyCode.Insert, 'Numpad0', 'Insert', 'Insert', 'insert', '[Insert]');1619assertNumpadKeyboardEvent(KeyCode.Delete, 'NumpadDecimal', 'Delete', 'Delete', 'delete', '[Delete]');1620});16211622test('issue #24107: Delete, Insert, Home, End, PgUp, PgDn, and arrow keys no longer work editor in 1.11', () => {1623const mapper = new MacLinuxKeyboardMapper(false, {}, false, OperatingSystem.Linux);16241625function assertKeyboardEvent(keyCode: KeyCode, code: string, label: string, electronAccelerator: string, userSettingsLabel: string, dispatch: string): void {1626assertResolveKeyboardEvent(1627mapper,1628{1629_standardKeyboardEventBrand: true,1630ctrlKey: false,1631shiftKey: false,1632altKey: false,1633metaKey: false,1634altGraphKey: false,1635keyCode: keyCode,1636code: code1637},1638{1639label: label,1640ariaLabel: label,1641electronAccelerator: electronAccelerator,1642userSettingsLabel: userSettingsLabel,1643isWYSIWYG: true,1644isMultiChord: false,1645dispatchParts: [dispatch],1646singleModifierDispatchParts: [null],1647}1648);1649}16501651// https://github.com/microsoft/vscode/issues/24107#issuecomment-2923184971652assertKeyboardEvent(KeyCode.UpArrow, 'Lang3', 'UpArrow', 'Up', 'up', '[ArrowUp]');1653assertKeyboardEvent(KeyCode.DownArrow, 'NumpadEnter', 'DownArrow', 'Down', 'down', '[ArrowDown]');1654assertKeyboardEvent(KeyCode.LeftArrow, 'Convert', 'LeftArrow', 'Left', 'left', '[ArrowLeft]');1655assertKeyboardEvent(KeyCode.RightArrow, 'NonConvert', 'RightArrow', 'Right', 'right', '[ArrowRight]');1656assertKeyboardEvent(KeyCode.Delete, 'PrintScreen', 'Delete', 'Delete', 'delete', '[Delete]');1657assertKeyboardEvent(KeyCode.Insert, 'NumpadDivide', 'Insert', 'Insert', 'insert', '[Insert]');1658assertKeyboardEvent(KeyCode.End, 'Unknown', 'End', 'End', 'end', '[End]');1659assertKeyboardEvent(KeyCode.Home, 'IntlRo', 'Home', 'Home', 'home', '[Home]');1660assertKeyboardEvent(KeyCode.PageDown, 'ControlRight', 'PageDown', 'PageDown', 'pagedown', '[PageDown]');1661assertKeyboardEvent(KeyCode.PageUp, 'Lang4', 'PageUp', 'PageUp', 'pageup', '[PageUp]');16621663// https://github.com/microsoft/vscode/issues/24107#issuecomment-2923239241664assertKeyboardEvent(KeyCode.PageDown, 'ControlRight', 'PageDown', 'PageDown', 'pagedown', '[PageDown]');1665assertKeyboardEvent(KeyCode.PageUp, 'Lang4', 'PageUp', 'PageUp', 'pageup', '[PageUp]');1666assertKeyboardEvent(KeyCode.End, '', 'End', 'End', 'end', '[End]');1667assertKeyboardEvent(KeyCode.Home, 'IntlRo', 'Home', 'Home', 'home', '[Home]');1668assertKeyboardEvent(KeyCode.Delete, 'PrintScreen', 'Delete', 'Delete', 'delete', '[Delete]');1669assertKeyboardEvent(KeyCode.Insert, 'NumpadDivide', 'Insert', 'Insert', 'insert', '[Insert]');1670assertKeyboardEvent(KeyCode.RightArrow, 'NonConvert', 'RightArrow', 'Right', 'right', '[ArrowRight]');1671assertKeyboardEvent(KeyCode.LeftArrow, 'Convert', 'LeftArrow', 'Left', 'left', '[ArrowLeft]');1672assertKeyboardEvent(KeyCode.DownArrow, 'NumpadEnter', 'DownArrow', 'Down', 'down', '[ArrowDown]');1673assertKeyboardEvent(KeyCode.UpArrow, 'Lang3', 'UpArrow', 'Up', 'up', '[ArrowUp]');1674});1675});16761677suite('keyboardMapper - LINUX ru', () => {16781679ensureNoDisposablesAreLeakedInTestSuite();16801681let mapper: MacLinuxKeyboardMapper;16821683suiteSetup(async () => {1684const _mapper = await createKeyboardMapper(false, 'linux_ru', false, OperatingSystem.Linux);1685mapper = _mapper;1686});16871688test('mapping', () => {1689return assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'linux_ru.txt');1690});16911692function _assertResolveKeybinding(k: number, expected: IResolvedKeybinding[]): void {1693assertResolveKeybinding(mapper, decodeKeybinding(k, OperatingSystem.Linux)!, expected);1694}16951696test('resolveKeybinding Ctrl+S', () => {1697_assertResolveKeybinding(1698KeyMod.CtrlCmd | KeyCode.KeyS,1699[{1700label: 'Ctrl+S',1701ariaLabel: 'Control+S',1702electronAccelerator: 'Ctrl+S',1703userSettingsLabel: 'ctrl+s',1704isWYSIWYG: true,1705isMultiChord: false,1706dispatchParts: ['ctrl+[KeyS]'],1707singleModifierDispatchParts: [null],1708}]1709);1710});1711});17121713suite('keyboardMapper - LINUX en_uk', () => {17141715ensureNoDisposablesAreLeakedInTestSuite();17161717let mapper: MacLinuxKeyboardMapper;17181719suiteSetup(async () => {1720const _mapper = await createKeyboardMapper(false, 'linux_en_uk', false, OperatingSystem.Linux);1721mapper = _mapper;1722});17231724test('mapping', () => {1725return assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'linux_en_uk.txt');1726});17271728test('issue #24522: resolveKeyboardEvent Ctrl+Alt+[Minus]', () => {1729assertResolveKeyboardEvent(1730mapper,1731{1732_standardKeyboardEventBrand: true,1733ctrlKey: true,1734shiftKey: false,1735altKey: true,1736metaKey: false,1737altGraphKey: false,1738keyCode: -1,1739code: 'Minus'1740},1741{1742label: 'Ctrl+Alt+-',1743ariaLabel: 'Control+Alt+-',1744electronAccelerator: null,1745userSettingsLabel: 'ctrl+alt+[Minus]',1746isWYSIWYG: false,1747isMultiChord: false,1748dispatchParts: ['ctrl+alt+[Minus]'],1749singleModifierDispatchParts: [null],1750}1751);1752});1753});17541755suite('keyboardMapper - MAC zh_hant', () => {17561757ensureNoDisposablesAreLeakedInTestSuite();17581759let mapper: MacLinuxKeyboardMapper;17601761suiteSetup(async () => {1762const _mapper = await createKeyboardMapper(false, 'mac_zh_hant', false, OperatingSystem.Macintosh);1763mapper = _mapper;1764});17651766test('mapping', () => {1767return assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'mac_zh_hant.txt');1768});17691770function _assertResolveKeybinding(k: number, expected: IResolvedKeybinding[]): void {1771assertResolveKeybinding(mapper, decodeKeybinding(k, OperatingSystem.Macintosh)!, expected);1772}17731774test('issue #28237 resolveKeybinding Cmd+C', () => {1775_assertResolveKeybinding(1776KeyMod.CtrlCmd | KeyCode.KeyC,1777[{1778label: '⌘C',1779ariaLabel: 'Command+C',1780electronAccelerator: 'Cmd+C',1781userSettingsLabel: 'cmd+c',1782isWYSIWYG: true,1783isMultiChord: false,1784dispatchParts: ['meta+[KeyC]'],1785singleModifierDispatchParts: [null],1786}]1787);1788});1789});17901791suite('keyboardMapper - MAC zh_hant2', () => {17921793ensureNoDisposablesAreLeakedInTestSuite();17941795let mapper: MacLinuxKeyboardMapper;17961797suiteSetup(async () => {1798const _mapper = await createKeyboardMapper(false, 'mac_zh_hant2', false, OperatingSystem.Macintosh);1799mapper = _mapper;1800});18011802test('mapping', () => {1803return assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'mac_zh_hant2.txt');1804});1805});18061807function _assertKeybindingTranslation(mapper: MacLinuxKeyboardMapper, OS: OperatingSystem, kb: number, _expected: string | string[]): void {1808let expected: string[];1809if (typeof _expected === 'string') {1810expected = [_expected];1811} else if (Array.isArray(_expected)) {1812expected = _expected;1813} else {1814expected = [];1815}18161817const runtimeKeybinding = createSimpleKeybinding(kb, OS);18181819const keybindingLabel = new USLayoutResolvedKeybinding([runtimeKeybinding], OS).getUserSettingsLabel();18201821const actualHardwareKeypresses = mapper.keyCodeChordToScanCodeChord(runtimeKeybinding);1822if (actualHardwareKeypresses.length === 0) {1823assert.deepStrictEqual([], expected, `simpleKeybindingToHardwareKeypress -- "${keybindingLabel}" -- actual: "[]" -- expected: "${expected}"`);1824return;1825}18261827const actual = actualHardwareKeypresses1828.map(k => UserSettingsLabelProvider.toLabel(OS, [k], (keybinding) => ScanCodeUtils.toString(keybinding.scanCode)));1829assert.deepStrictEqual(actual, expected, `simpleKeybindingToHardwareKeypress -- "${keybindingLabel}" -- actual: "${actual}" -- expected: "${expected}"`);1830}183118321833