diff --git a/packages/protocol/src/terminal-modified-enter-repro.test.ts b/packages/protocol/src/terminal-modified-enter-repro.test.ts new file mode 100644 index 0000000000..a88b277208 --- /dev/null +++ b/packages/protocol/src/terminal-modified-enter-repro.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, it } from "vitest"; +import { TerminalInputModeTracker } from "./terminal-input-mode"; +import { encodeTerminalKeyInput } from "./terminal-key-input"; + +describe("Modified Enter negotiation", () => { + it("answers a keyboard query split immediately after ESC", () => { + const tracker = new TerminalInputModeTracker(); + tracker.feed("\x1b"); + expect(tracker.feed("[?u").responses).toEqual(["\x1b[?0u"]); + }); + + it("recognizes modified Enter after a program enables modifyOtherKeys level 2", () => { + const tracker = new TerminalInputModeTracker(); + tracker.feed("\x1b[>4;2m"); + expect(tracker.supportsModifiedEnter()).toBe(true); + }); + + it("distinguishes Shift+Enter from Enter after modifyOtherKeys negotiation", () => { + const tracker = new TerminalInputModeTracker(); + tracker.feed("\x1b[>4;2m"); + const options = { inputMode: tracker.getState() }; + expect(encodeTerminalKeyInput({ key: "Enter", shift: true }, options)).toBe("\x1b[27;2;13~"); + expect(encodeTerminalKeyInput({ key: "Enter" }, options)).toBe("\r"); + }); +});