xref: /aosp_15_r20/external/perfetto/ui/src/base/hotkeys_unittest.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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