Files
llmx/codex-cli/tests/multiline-newline.test.tsx
Ilan Bigio 59a180ddec Initial commit
Signed-off-by: Ilan Bigio <ilan@openai.com>
2025-04-16 12:56:08 -04:00

57 lines
1.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { renderTui } from "./ui-test-helpers.js";
import MultilineTextEditor from "../src/components/chat/multiline-editor.js";
import * as React from "react";
import { describe, it, expect } from "vitest";
// Helper to send keystrokes and wait for Ink's async timing so that the frame
// reflects the input.
async function type(
stdin: NodeJS.WritableStream,
text: string,
flush: () => Promise<void>,
) {
stdin.write(text);
await flush();
}
describe("MultilineTextEditor inserting new lines", () => {
// Same as above the React wrapper still differs from the Rust reference
// when handling <Enter>. Keep the test around but mark it as expected to
// fail.
it("splits the line and renders the new row when <Enter> is pressed", async () => {
const { stdin, lastFrameStripped, flush, cleanup } = renderTui(
React.createElement(MultilineTextEditor, {
height: 5,
width: 20,
initialText: "",
}),
);
// Wait for first render
await flush();
// Type "hello", press Enter, then type "world"
await type(stdin, "hello", flush);
await type(stdin, "\n", flush); // Enter / Return
await type(stdin, "world", flush);
const frame = lastFrameStripped();
const lines = frame.split("\n");
// eslint-disable-next-line no-console
console.log(
"\n--- RENDERED FRAME ---\n" + frame + "\n---------------------",
);
// We expect at least two rendered lines and the texts to appear on their
// own respective rows.
expect(lines.length).toBeGreaterThanOrEqual(2);
// First rendered (inside border) line should contain 'hello'
expect(lines.some((l: string) => l.includes("hello"))).toBe(true);
// Another line should contain 'world'
expect(lines.some((l: string) => l.includes("world"))).toBe(true);
cleanup();
});
});