import assert from "node:assert"; import { describe, it } from "node:test"; import { getCellDimensions, resetCapabilitiesCache, setCellDimensions } from "../src/terminal-image.js"; import { type Component, TUI } from "../src/tui.js"; import { VirtualTerminal } from "./virtual-terminal.js"; class InputRecorder implements Component { readonly inputs: string[] = []; render(): string[] { return [""]; } handleInput(data: string): void { this.inputs.push(data); } invalidate(): void {} } function withImageTerminal(fn: () => T): T { const prevTermProgram = process.env.TERM_PROGRAM; const prevTerm = process.env.TERM; const prevGhosttyResourcesDir = process.env.GHOSTTY_RESOURCES_DIR; process.env.TERM_PROGRAM = "ghostty"; delete process.env.TERM; delete process.env.GHOSTTY_RESOURCES_DIR; resetCapabilitiesCache(); try { return fn(); } finally { if (prevTermProgram === undefined) delete process.env.TERM_PROGRAM; else process.env.TERM_PROGRAM = prevTermProgram; if (prevTerm === undefined) delete process.env.TERM; else process.env.TERM = prevTerm; if (prevGhosttyResourcesDir === undefined) delete process.env.GHOSTTY_RESOURCES_DIR; else process.env.GHOSTTY_RESOURCES_DIR = prevGhosttyResourcesDir; resetCapabilitiesCache(); } } describe("TUI cell size responses", () => { it("forwards bare escape even when a cell size query was sent at startup", () => { withImageTerminal(() => { const terminal = new VirtualTerminal(80, 24); const tui = new TUI(terminal); const recorder = new InputRecorder(); tui.setFocus(recorder); tui.start(); terminal.sendInput("\x1b"); assert.deepStrictEqual(recorder.inputs, ["\x1b"]); tui.stop(); }); }); it("consumes cell size responses and still forwards later user input", () => { withImageTerminal(() => { setCellDimensions({ widthPx: 9, heightPx: 18 }); const terminal = new VirtualTerminal(80, 24); const tui = new TUI(terminal); const recorder = new InputRecorder(); tui.setFocus(recorder); tui.start(); terminal.sendInput("\x1b[6;20;10t"); assert.deepStrictEqual(recorder.inputs, []); assert.deepStrictEqual(getCellDimensions(), { widthPx: 10, heightPx: 20 }); terminal.sendInput("q"); assert.deepStrictEqual(recorder.inputs, ["q"]); tui.stop(); }); }); });