Skip to content

Commit bc3182e

Browse files
Merge pull request #239 from RtlZeroMemory/fix/232-text-wrap-newlines
test(core): lock newline wrap rendering behavior
2 parents 0dce821 + c3b65fc commit bc3182e

File tree

1 file changed

+43
-1
lines changed

1 file changed

+43
-1
lines changed

packages/core/src/renderer/__tests__/renderer.text.test.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ import {
1111
parseCommandHeaders,
1212
parseInternedStrings,
1313
} from "../../__tests__/drawlistDecode.js";
14-
import { type VNode, createDrawlistBuilder } from "../../index.js";
14+
import { type VNode, createDrawlistBuilder, ui } from "../../index.js";
1515
import { layout } from "../../layout/layout.js";
1616
import { commitVNodeTree } from "../../runtime/commit.js";
1717
import { createInstanceIdAllocator } from "../../runtime/instance.js";
18+
import { createTestRenderer } from "../../testing/renderer.js";
1819
import { renderToDrawlist } from "../renderToDrawlist.js";
1920

2021
const decoder = new TextDecoder();
@@ -296,6 +297,47 @@ function expectBlob(frame: ParsedFrame, blobIndex: number): TextRunBlob {
296297
return blob;
297298
}
298299

300+
describe("renderer text - wrap newline handling", () => {
301+
test("wrap=true renders explicit newline lines on separate rows", () => {
302+
const renderer = createTestRenderer({ viewport: { cols: 20, rows: 4 } });
303+
const frame = renderer.render(
304+
ui.text("First line\nSecond line", {
305+
id: "wrapped",
306+
wrap: true,
307+
}),
308+
);
309+
const lines = frame.toText().split("\n");
310+
311+
assert.equal(lines[0]?.includes("First line"), true);
312+
assert.equal(lines[1]?.includes("Second line"), true);
313+
314+
const wrapped = frame.findById("wrapped");
315+
assert.notEqual(wrapped, null);
316+
assert.equal(wrapped?.rect.y, 0);
317+
assert.ok((wrapped?.rect.h ?? 0) >= 2);
318+
});
319+
320+
test("wrap=true preserves blank lines from double newlines", () => {
321+
const renderer = createTestRenderer({ viewport: { cols: 20, rows: 6 } });
322+
const frame = renderer.render(
323+
ui.text("Alpha\n\nOmega", {
324+
id: "wrapped-blank",
325+
wrap: true,
326+
}),
327+
);
328+
const lines = frame.toText().split("\n");
329+
330+
assert.equal(lines[0]?.includes("Alpha"), true);
331+
assert.equal((lines[1] ?? "").trim(), "");
332+
assert.equal(lines[2]?.includes("Omega"), true);
333+
334+
const wrapped = frame.findById("wrapped-blank");
335+
assert.notEqual(wrapped, null);
336+
assert.equal(wrapped?.rect.y, 0);
337+
assert.ok((wrapped?.rect.h ?? 0) >= 3);
338+
});
339+
});
340+
299341
describe("renderer text - transform ANSI styling", () => {
300342
const gradientTransform = (): string => "\u001b[31mA\u001b[32mB\u001b[0m";
301343

0 commit comments

Comments
 (0)