diff --git a/src/Virtual.ts b/src/Virtual.ts index 93ba42f..051de4a 100644 --- a/src/Virtual.ts +++ b/src/Virtual.ts @@ -897,9 +897,19 @@ export class Virtual { } }); + const isShiftPressed = modifiers.some( + (modifier) => MacOSModifiers[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..a9bcb5b 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,11 +79,93 @@ 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(); }); + + 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(); + }); });