1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {checkHotkey, formatHotkey, Hotkey, parseHotkey} from './hotkeys'; 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Workertest('parseHotkey', () => { 18*6dbdd20aSAndroid Build Coastguard Worker expect(parseHotkey('A')).toEqual({ 19*6dbdd20aSAndroid Build Coastguard Worker key: 'A', 20*6dbdd20aSAndroid Build Coastguard Worker allowInEditable: false, 21*6dbdd20aSAndroid Build Coastguard Worker modifier: '', 22*6dbdd20aSAndroid Build Coastguard Worker }); 23*6dbdd20aSAndroid Build Coastguard Worker expect(parseHotkey('!A')).toEqual({ 24*6dbdd20aSAndroid Build Coastguard Worker key: 'A', 25*6dbdd20aSAndroid Build Coastguard Worker allowInEditable: true, 26*6dbdd20aSAndroid Build Coastguard Worker modifier: '', 27*6dbdd20aSAndroid Build Coastguard Worker }); 28*6dbdd20aSAndroid Build Coastguard Worker expect(parseHotkey('Shift+A')).toEqual({ 29*6dbdd20aSAndroid Build Coastguard Worker key: 'A', 30*6dbdd20aSAndroid Build Coastguard Worker allowInEditable: false, 31*6dbdd20aSAndroid Build Coastguard Worker modifier: 'Shift+', 32*6dbdd20aSAndroid Build Coastguard Worker }); 33*6dbdd20aSAndroid Build Coastguard Worker expect(parseHotkey('Mod+Shift+A')).toEqual({ 34*6dbdd20aSAndroid Build Coastguard Worker key: 'A', 35*6dbdd20aSAndroid Build Coastguard Worker allowInEditable: false, 36*6dbdd20aSAndroid Build Coastguard Worker modifier: 'Mod+Shift+', 37*6dbdd20aSAndroid Build Coastguard Worker }); 38*6dbdd20aSAndroid Build Coastguard Worker expect(parseHotkey('!Mod+Shift+A')).toEqual({ 39*6dbdd20aSAndroid Build Coastguard Worker key: 'A', 40*6dbdd20aSAndroid Build Coastguard Worker allowInEditable: true, 41*6dbdd20aSAndroid Build Coastguard Worker modifier: 'Mod+Shift+', 42*6dbdd20aSAndroid Build Coastguard Worker }); 43*6dbdd20aSAndroid Build Coastguard Worker}); 44*6dbdd20aSAndroid Build Coastguard Worker 45*6dbdd20aSAndroid Build Coastguard Workerdescribe('checkHotkey', () => { 46*6dbdd20aSAndroid Build Coastguard Worker test('A', () => { 47*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('A', {key: 'a'})).toBe(true); 48*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('A', {key: 'A', shiftKey: true})).toBe(false); 49*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('A', {key: 'a', ctrlKey: true})).toBe(false); 50*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('A', {key: 'a', altKey: true})).toBe(false); 51*6dbdd20aSAndroid Build Coastguard Worker }); 52*6dbdd20aSAndroid Build Coastguard Worker 53*6dbdd20aSAndroid Build Coastguard Worker test('Special', () => { 54*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('Enter', {key: 'Enter'})).toBe(true); 55*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('Escape', {key: 'Escape'})).toBe(true); 56*6dbdd20aSAndroid Build Coastguard Worker }); 57*6dbdd20aSAndroid Build Coastguard Worker 58*6dbdd20aSAndroid Build Coastguard Worker test('Shift+A', () => { 59*6dbdd20aSAndroid Build Coastguard Worker const hotkey: Hotkey = 'Shift+A'; 60*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a'})).toBe(false); 61*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'A', shiftKey: true})).toBe(true); 62*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a', ctrlKey: true})).toBe(false); 63*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a', altKey: true})).toBe(false); 64*6dbdd20aSAndroid Build Coastguard Worker }); 65*6dbdd20aSAndroid Build Coastguard Worker 66*6dbdd20aSAndroid Build Coastguard Worker test('Mod+A on PC', () => { 67*6dbdd20aSAndroid Build Coastguard Worker const hotkey: Hotkey = 'Mod+A'; 68*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a'}, 'PC')).toBe(false); 69*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'A', shiftKey: true}, 'PC')).toBe(false); 70*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a', ctrlKey: true}, 'PC')).toBe(true); 71*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a', metaKey: true}, 'PC')).toBe(false); 72*6dbdd20aSAndroid Build Coastguard Worker }); 73*6dbdd20aSAndroid Build Coastguard Worker 74*6dbdd20aSAndroid Build Coastguard Worker test('Mod+A on Mac', () => { 75*6dbdd20aSAndroid Build Coastguard Worker const hotkey: Hotkey = 'Mod+A'; 76*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a'}, 'Mac')).toBe(false); 77*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'A', shiftKey: true}, 'Mac')).toBe(false); 78*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a', ctrlKey: true}, 'Mac')).toBe(false); 79*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey(hotkey, {key: 'a', metaKey: true}, 'Mac')).toBe(true); 80*6dbdd20aSAndroid Build Coastguard Worker }); 81*6dbdd20aSAndroid Build Coastguard Worker 82*6dbdd20aSAndroid Build Coastguard Worker test('allow in editable', () => { 83*6dbdd20aSAndroid Build Coastguard Worker const el = document.createElement('input'); 84*6dbdd20aSAndroid Build Coastguard Worker el.setAttribute('type', 'text'); 85*6dbdd20aSAndroid Build Coastguard Worker 86*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('X', {key: 'x'})).toBe(true); 87*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('!X', {key: 'x'})).toBe(true); 88*6dbdd20aSAndroid Build Coastguard Worker 89*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('X', {key: 'x', target: el})).toBe(false); 90*6dbdd20aSAndroid Build Coastguard Worker expect(checkHotkey('!X', {key: 'x', target: el})).toBe(true); 91*6dbdd20aSAndroid Build Coastguard Worker }); 92*6dbdd20aSAndroid Build Coastguard Worker}); 93*6dbdd20aSAndroid Build Coastguard Worker 94*6dbdd20aSAndroid Build Coastguard Workertest('formatHotkey', () => { 95*6dbdd20aSAndroid Build Coastguard Worker expect(formatHotkey('Mod+X', 'Mac')).toEqual('⌘X'); 96*6dbdd20aSAndroid Build Coastguard Worker expect(formatHotkey('Mod+Shift+X', 'Mac')).toEqual('⌘⇧X'); 97*6dbdd20aSAndroid Build Coastguard Worker 98*6dbdd20aSAndroid Build Coastguard Worker expect(formatHotkey('Mod+X', 'PC')).toEqual('Ctrl+X'); 99*6dbdd20aSAndroid Build Coastguard Worker expect(formatHotkey('Mod+Shift+X', 'PC')).toEqual('Ctrl+Shift+X'); 100*6dbdd20aSAndroid Build Coastguard Worker}); 101