From 4696b49313f70064b59e42174939900a0817c6ac Mon Sep 17 00:00:00 2001 From: Yunfei He Date: Thu, 28 May 2026 16:26:01 +0800 Subject: [PATCH] test: pin absolute-non-edge ZWJ parity with Ink (closes #21 final class) --- .../integration/layout/grapheme-clip.test.tsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/runtime-tests/integration/layout/grapheme-clip.test.tsx b/packages/runtime-tests/integration/layout/grapheme-clip.test.tsx index ea6fae9..82aa9d1 100644 --- a/packages/runtime-tests/integration/layout/grapheme-clip.test.tsx +++ b/packages/runtime-tests/integration/layout/grapheme-clip.test.tsx @@ -40,4 +40,24 @@ describe("grapheme-aware clipping (issue #21)", () => { const frame = stripAnsi(lastFrame({ trimLines: true })!); expect(frame.startsWith(" x")).toBe(true); }); + + // absolute-non-edge class (R2-000045): an absolutely-positioned ZWJ emoji is + // kept whole, matching Ink (verified via ink-testing-library: + // ["coabc", "ct๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"]). + test("absolutely-positioned ZWJ emoji is not split", async () => { + const { lastFrame } = await render( + defineComponent(() => () => ( + + coabc + + ct๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ + + + )), + { columns: 100 }, + ); + const lines = stripAnsi(lastFrame({ trimLines: true })!).split("\n"); + expect(lines[0]).toBe("coabc"); + expect(lines[1]).toBe("ct๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"); + }); });