1import { describe, expect, it } from "vite-plus/test";
2
3import {
4 shortcutModifierStateAfterKeyboardEvent,
5 type ShortcutModifierState,
6} from "./shortcutModifierState";
7
8const emptyState = (): ShortcutModifierState => ({
9 metaKey: false,
10 ctrlKey: false,
11 altKey: false,
12 shiftKey: false,
13});
14
15function keyboardEventLike(type: "keydown" | "keyup", init: Partial<KeyboardEvent>): KeyboardEvent {
16 return {
17 type,
18 key: "",
19 metaKey: false,
20 ctrlKey: false,
21 altKey: false,
22 shiftKey: false,
23 ...init,
24 } as KeyboardEvent;
25}
26
27describe("shortcutModifierState", () => {
28 it("tracks bare modifier keydown and keyup events explicitly", () => {
29 let state = emptyState();
30 state = shortcutModifierStateAfterKeyboardEvent(
31 state,
32 keyboardEventLike("keydown", {
33 key: "Meta",
34 metaKey: false,
35 }),
36 );
37 expect(state).toEqual({
38 metaKey: true,
39 ctrlKey: false,
40 altKey: false,
41 shiftKey: false,
42 });
43
44 state = shortcutModifierStateAfterKeyboardEvent(
45 state,
46 keyboardEventLike("keydown", {
47 key: "Shift",
48 metaKey: true,
49 shiftKey: false,
50 }),
51 );
52 expect(state).toEqual({
53 metaKey: true,
54 ctrlKey: false,
55 altKey: false,
56 shiftKey: true,
57 });
58
59 state = shortcutModifierStateAfterKeyboardEvent(
60 state,
61 keyboardEventLike("keyup", {
62 key: "Meta",
63 metaKey: true,
64 shiftKey: true,
65 }),
66 );
67 expect(state).toEqual({
68 metaKey: false,
69 ctrlKey: false,
70 altKey: false,
71 shiftKey: true,
72 });
73
74 state = shortcutModifierStateAfterKeyboardEvent(
75 state,
76 keyboardEventLike("keyup", {
77 key: "Shift",
78 shiftKey: true,
79 }),
80 );
81 expect(state).toEqual({
82 metaKey: false,
83 ctrlKey: false,
84 altKey: false,
85 shiftKey: false,
86 });
87 });
88
89 it("ignores poisoned modifier flags on non-modifier keys", () => {
90 // Synthetic dictation paste can poison later real key events with metaKey=true.
91 const state = shortcutModifierStateAfterKeyboardEvent(
92 emptyState(),
93 keyboardEventLike("keydown", { key: "Enter", metaKey: true }),
94 );
95 expect(state).toEqual(emptyState());
96 });
97
98 it("clears a held modifier when a non-modifier key reports it released", () => {
99 const heldMeta: ShortcutModifierState = {
100 metaKey: true,
101 ctrlKey: false,
102 altKey: false,
103 shiftKey: false,
104 };
105 const state = shortcutModifierStateAfterKeyboardEvent(
106 heldMeta,
107 keyboardEventLike("keydown", { key: "a", metaKey: false }),
108 );
109 expect(state).toEqual(emptyState());
110 });
111});