| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | import { chordEvents, parseChord, parseKeySequence } from "./keys.js"; |
| 4 | |
| 5 | test("chords map DOM key names and modifiers onto Electron key codes", () => { |
| 6 | assert.deepEqual(parseChord("Control+Shift+Enter"), { keyCode: "Return", modifiers: ["control", "shift"], char: null }); |
| 7 | assert.deepEqual(parseChord("Meta+a"), { keyCode: "a", modifiers: ["meta"], char: null }); |
| 8 | assert.deepEqual(parseChord("Escape"), { keyCode: "Escape", modifiers: [], char: null }); |
| 9 | assert.deepEqual(parseChord("ArrowDown"), { keyCode: "Down", modifiers: [], char: null }); |
| 10 | assert.deepEqual(parseChord("Enter"), { keyCode: "Return", modifiers: [], char: "\r" }); |
| 11 | assert.deepEqual(parseChord("Tab"), { keyCode: "Tab", modifiers: [], char: "\t" }); |
| 12 | assert.deepEqual(parseChord("a"), { keyCode: "a", modifiers: [], char: "a" }); |
| 13 | assert.deepEqual(parseChord("Shift+a"), { keyCode: "a", modifiers: ["shift"], char: "A" }); |
| 14 | assert.deepEqual(parseChord("ctrl+alt+Delete"), { keyCode: "Delete", modifiers: ["control", "alt"], char: null }); |
| 15 | assert.deepEqual(parseChord("Shift++"), { keyCode: "Plus", modifiers: ["shift"], char: "+" }); |
| 16 | assert.deepEqual(parseChord("+"), { keyCode: "Plus", modifiers: [], char: "+" }); |
| 17 | assert.deepEqual(parseChord("F5"), { keyCode: "F5", modifiers: [], char: null }); |
| 18 | assert.deepEqual(parseChord("pageDown"), { keyCode: "PageDown", modifiers: [], char: null }); |
| 19 | assert.throws(() => parseChord(""), /empty/); |
| 20 | assert.throws(() => parseChord("Control+"), /malformed/); |
| 21 | assert.throws(() => parseChord("a+b"), /more than one key/); |
| 22 | assert.throws(() => parseChord("Control+Shift"), /no key/); |
| 23 | }); |
| 24 | |
| 25 | test("key sequences are space separated and expand to keyDown/char/keyUp", () => { |
| 26 | const chords = parseKeySequence("Control+a Backspace Enter"); |
| 27 | assert.deepEqual(chords.map((chord) => chord.keyCode), ["a", "Backspace", "Return"]); |
| 28 | assert.deepEqual(chordEvents(chords[0]), [ |
| 29 | { type: "keyDown", keyCode: "a", modifiers: ["control"] }, |
| 30 | { type: "keyUp", keyCode: "a", modifiers: ["control"] }, |
| 31 | ]); |
| 32 | assert.deepEqual(chordEvents(chords[2]), [ |
| 33 | { type: "keyDown", keyCode: "Return", modifiers: undefined }, |
| 34 | { type: "char", keyCode: "\r", modifiers: undefined }, |
| 35 | { type: "keyUp", keyCode: "Return", modifiers: undefined }, |
| 36 | ]); |
| 37 | assert.deepEqual(parseKeySequence(" "), []); |
| 38 | }); |
| 39 |