mirror of
https://github.com/earendil-works/pi.git
synced 2026-06-18 15:54:04 +08:00
82 lines
2.3 KiB
TypeScript
82 lines
2.3 KiB
TypeScript
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<T>(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();
|
|
});
|
|
});
|
|
});
|