Repository: electron/electron
Pull request: test: exercise fuller `globalShortcut` matrix

Backport of #44488

See that PR for details.


Notes: none

Changed files:
filename: spec/api-global-shortcut-spec.ts
patch: @@ -4,24 +4,66 @@ import { expect } from 'chai';
 
 import { ifdescribe } from './lib/spec-helpers';
 
+const modifiers = [
+  'CmdOrCtrl',
+  'Alt',
+  process.platform === 'darwin' ? 'Option' : null,
+  'AltGr',
+  'Shift',
+  'Super',
+  'Meta'
+].filter(Boolean);
+
+const keyCodes = [
+  ...Array.from({ length: 10 }, (_, i) => `${i}`), // 0 to 9
+  ...Array.from({ length: 26 }, (_, i) => String.fromCharCode(65 + i)), // A to Z
+  ...Array.from({ length: 24 }, (_, i) => `F${i + 1}`), // F1 to F24
+  ')', '!', '@', '#', '$', '%', '^', '&', '*', '(', ':', ';', ':', '+', '=',
+  '<', ',', '_', '-', '>', '.', '?', '/', '~', '`', '{', ']', '[', '|', '\\',
+  '}', '"', 'Plus', 'Space', 'Tab', 'Capslock', 'Numlock', 'Scrolllock',
+  'Backspace', 'Delete', 'Insert', 'Return', 'Enter', 'Up', 'Down', 'Left',
+  'Right', 'Home', 'End', 'PageUp', 'PageDown', 'Escape', 'Esc', 'PrintScreen',
+  'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9',
+  'numdec', 'numadd', 'numsub', 'nummult', 'numdiv'
+];
+
 ifdescribe(process.platform !== 'win32')('globalShortcut module', () => {
   beforeEach(() => {
     globalShortcut.unregisterAll();
   });
 
   it('can register and unregister single accelerators', () => {
-    const accelerator = 'CmdOrCtrl+A+B+C';
+    const singleModifierCombinations = modifiers.flatMap(
+      mod => keyCodes.map(key => {
+        return key === '+' ? `${mod}+Plus` : `${mod}+${key}`;
+      })
+    );
 
-    expect(globalShortcut.isRegistered(accelerator)).to.be.false('initially registered');
-    globalShortcut.register(accelerator, () => {});
-    expect(globalShortcut.isRegistered(accelerator)).to.be.true('registration worked');
-    globalShortcut.unregister(accelerator);
-    expect(globalShortcut.isRegistered(accelerator)).to.be.false('unregistration worked');
+    const doubleModifierCombinations = modifiers.flatMap(
+      (mod1, i) => modifiers.slice(i + 1).flatMap(
+        mod2 => keyCodes.map(key => {
+          return key === '+' ? `${mod1}+${mod2}+Plus` : `${mod1}+${mod2}+${key}`;
+        })
+      )
+    );
 
-    globalShortcut.register(accelerator, () => {});
-    expect(globalShortcut.isRegistered(accelerator)).to.be.true('reregistration worked');
-    globalShortcut.unregisterAll();
-    expect(globalShortcut.isRegistered(accelerator)).to.be.false('re-unregistration worked');
+    const combinations = [...singleModifierCombinations, ...doubleModifierCombinations];
+
+    combinations.forEach((accelerator) => {
+      expect(globalShortcut.isRegistered(accelerator)).to.be.false(`Initially registered for ${accelerator}`);
+
+      globalShortcut.register(accelerator, () => { });
+      expect(globalShortcut.isRegistered(accelerator)).to.be.true(`Registration failed for ${accelerator}`);
+
+      globalShortcut.unregister(accelerator);
+      expect(globalShortcut.isRegistered(accelerator)).to.be.false(`Unregistration failed for ${accelerator}`);
+
+      globalShortcut.register(accelerator, () => { });
+      expect(globalShortcut.isRegistered(accelerator)).to.be.true(`Re-registration failed for ${accelerator}`);
+
+      globalShortcut.unregisterAll();
+      expect(globalShortcut.isRegistered(accelerator)).to.be.false(`Re-unregistration failed for ${accelerator}`);
+    });
   });
 
   it('can register and unregister multiple accelerators', () => {