From 6cf5e71e99c476547ac615fde66a7eb916aaa233 Mon Sep 17 00:00:00 2001 From: AdamMagued Date: Mon, 28 Sep 2026 20:58:44 +0300 Subject: [PATCH 1/2] fix: support `.press()` with `Shift` resulting in capitalisation --- src/Virtual.ts | 14 +++++++++++++- test/int/press.int.test.ts | 10 ++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Virtual.ts b/src/Virtual.ts index 93ba42f..9ace309 100644 --- a/src/Virtual.ts +++ b/src/Virtual.ts @@ -897,9 +897,21 @@ export class Virtual { } }); + const isShiftPressed = modifiers.some( + (modifier) => + MacOSModifiers[modifier] === "shift" || + WindowsModifiers[modifier] === "shift" + ); + const keyboardCommand = [ ...modifiers.map((modifier) => `{${modifier}>}`), - ...keys.map((key) => `{${key}}`), + ...keys.map((key) => { + if (key.length === 1) { + return isShiftPressed ? key.toUpperCase() : key; + } + + return `{${key}}`; + }), ...modifiers.reverse().map((modifier) => `{/${modifier}}`), ].join(""); diff --git a/test/int/press.int.test.ts b/test/int/press.int.test.ts index 44e6b40..cae430f 100644 --- a/test/int/press.int.test.ts +++ b/test/int/press.int.test.ts @@ -35,9 +35,8 @@ describe("press", () => { expect(await virtual.itemText()).toEqual("Input Some Text"); await virtual.press("Shift+a+b+c"); - // TODO: FAIL Testing Library user-event doesn't support modification yet, this should be "ABC" - expect(getByRole(container, "textbox")).toHaveValue("abc"); - expect(await virtual.itemText()).toEqual("Input Some Text, abc"); + expect(getByRole(container, "textbox")).toHaveValue("ABC"); + expect(await virtual.itemText()).toEqual("Input Some Text, ABC"); await virtual.stop(); }); @@ -80,9 +79,8 @@ describe("press", () => { expect(await virtual.itemText()).toEqual("Input Some Text"); await virtual.press("Shift+a+b+c"); - // TODO: FAIL Testing Library user-event doesn't support modification yet, this should be "ABC" - expect(getByRole(container, "textbox")).toHaveValue("abc"); - expect(await virtual.itemText()).toEqual("Input Some Text, abc"); + expect(getByRole(container, "textbox")).toHaveValue("ABC"); + expect(await virtual.itemText()).toEqual("Input Some Text, ABC"); expect(advanceTimers).toHaveBeenCalled(); await virtual.stop(); From b9d4e2cb08f31d6bdf85635f63230c67c5c8b791 Mon Sep 17 00:00:00 2001 From: AdamMagued Date: Tue, 29 Sep 2026 11:57:07 +0300 Subject: [PATCH 2/2] test: add branch coverage for shift key capitalisation --- src/Virtual.ts | 4 +- test/int/press.int.test.ts | 83 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/src/Virtual.ts b/src/Virtual.ts index 9ace309..051de4a 100644 --- a/src/Virtual.ts +++ b/src/Virtual.ts @@ -898,9 +898,7 @@ export class Virtual { }); const isShiftPressed = modifiers.some( - (modifier) => - MacOSModifiers[modifier] === "shift" || - WindowsModifiers[modifier] === "shift" + (modifier) => MacOSModifiers[modifier] === "shift" ); const keyboardCommand = [ diff --git a/test/int/press.int.test.ts b/test/int/press.int.test.ts index cae430f..a9bcb5b 100644 --- a/test/int/press.int.test.ts +++ b/test/int/press.int.test.ts @@ -85,4 +85,87 @@ describe("press", () => { await virtual.stop(); }); + + it("should capitalise single character keys when Shift is pressed", async () => { + const container = document.body; + + await virtual.start({ container }); + + await virtual.next(); + await virtual.next(); + + expect(await virtual.itemText()).toEqual("Input Some Text"); + + await virtual.press("Shift+a"); + expect(getByRole(container, "textbox")).toHaveValue("A"); + expect(await virtual.itemText()).toEqual("Input Some Text, A"); + + await virtual.stop(); + }); + + it("should preserve uppercase for single character keys already uppercase when Shift is pressed", async () => { + const container = document.body; + + await virtual.start({ container }); + + await virtual.next(); + await virtual.next(); + + expect(await virtual.itemText()).toEqual("Input Some Text"); + + await virtual.press("Shift+A"); + expect(getByRole(container, "textbox")).toHaveValue("A"); + expect(await virtual.itemText()).toEqual("Input Some Text, A"); + + await virtual.stop(); + }); + + it("should not capitalise single character keys when Shift is not pressed", async () => { + const container = document.body; + + await virtual.start({ container }); + + await virtual.next(); + await virtual.next(); + + expect(await virtual.itemText()).toEqual("Input Some Text"); + + await virtual.press("a"); + expect(getByRole(container, "textbox")).toHaveValue("a"); + expect(await virtual.itemText()).toEqual("Input Some Text, a"); + + await virtual.stop(); + }); + + it("should handle non-shift modifiers when pressing single character keys", async () => { + const container = document.body; + + await virtual.start({ container }); + + await virtual.next(); + await virtual.next(); + + expect(await virtual.itemText()).toEqual("Input Some Text"); + + await virtual.press("Control+a"); + expect(getByRole(container, "textbox")).toHaveValue(""); + + await virtual.stop(); + }); + + it("should handle multi-character keys when Shift is pressed", async () => { + const container = document.body; + + await virtual.start({ container }); + + await virtual.next(); + await virtual.next(); + + expect(await virtual.itemText()).toEqual("Input Some Text"); + + await virtual.press("Shift+Enter"); + expect(getByRole(container, "textbox")).toHaveValue(""); + + await virtual.stop(); + }); });