Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/Virtual.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

General note that this will handle alpha capitalisation but isn’t a general solution for shift behaviour, which is would require keyboard map logic to handle US/UK/other layouts and so on - but as a starter for 10 feels adequate!

}

return `{${key}}`;
}),
...modifiers.reverse().map((modifier) => `{/${modifier}}`),
].join("");

Expand Down
93 changes: 87 additions & 6 deletions test/int/press.int.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});
Expand Down Expand Up @@ -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();
});
});
Loading