Files
oh-my-pi/packages/coding-agent/test/truncate-to-width.test.ts
T
can1357 d9a3291641 feat(deps): replaced external JSON/JSONL and text utilities with Bun built-in APIs
- Replaced external JSON/JSONL parsing libraries with Bun's built-in JSON5 and JSONL APIs across all packages.
- Removed dependencies: json5, ndjson, get-east-asian-width, json-stringify-safe, split2, through2, and @types/ndjson.
- Replaced custom text width and ANSI wrapping implementations with Bun.stringWidth() and Bun.wrapAnsi() APIs.
- Updated Bun type definitions from ^1.2.17 to ^1.2.18 and bun-types from ^1.3.5 to ^1.3.7.
- Refactored JSONL parsing throughout codebase to use Bun.JSONL.parse() and Bun.JSONL.parseChunk() with improved buffer management and error handling.
- Updated test assertions to use Bun.stringWidth() for dynamic width calculations instead of hardcoded values.
2026-01-27 19:18:58 +01:00

79 lines
2.9 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 { describe, expect, it } from "bun:test";
import { truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
/**
* Tests for truncateToWidth behavior with Unicode characters.
*
* These tests verify that truncateToWidth properly handles text with
* Unicode characters that have different byte vs display widths.
*/
describe("truncateToWidth", () => {
it("should truncate messages with Unicode characters correctly", () => {
// This message contains a checkmark (✔) which may have display width > 1 byte
const message = '✔ script to run › dev $ concurrently "vite" "node --import tsx ./';
const maxMsgWidth = Bun.stringWidth(message) - 1;
const truncated = truncateToWidth(message, maxMsgWidth);
const truncatedWidth = visibleWidth(truncated);
expect(truncatedWidth).toBeLessThanOrEqual(maxMsgWidth);
});
it("should handle emoji characters", () => {
const message = "🎉 Celebration! 🚀 Launch 📦 Package ready for deployment now";
const maxMsgWidth = Bun.stringWidth(message) - 2;
const truncated = truncateToWidth(message, maxMsgWidth);
const truncatedWidth = visibleWidth(truncated);
expect(truncatedWidth).toBeLessThanOrEqual(maxMsgWidth);
});
it("should handle mixed ASCII and wide characters", () => {
const message = "Hello 世界 Test 你好 More text here that is long";
const maxMsgWidth = Bun.stringWidth(message) - 2;
const truncated = truncateToWidth(message, maxMsgWidth);
const truncatedWidth = visibleWidth(truncated);
expect(truncatedWidth).toBeLessThanOrEqual(maxMsgWidth);
});
it("should not truncate messages that fit", () => {
const message = "Short message";
const width = 50;
const maxMsgWidth = width - 2;
const truncated = truncateToWidth(message, maxMsgWidth);
expect(truncated).toBe(message);
expect(visibleWidth(truncated)).toBeLessThanOrEqual(maxMsgWidth);
});
it("should add ellipsis when truncating", () => {
const message = "This is a very long message that needs to be truncated";
const width = 30;
const maxMsgWidth = width - 2;
const truncated = truncateToWidth(message, maxMsgWidth);
expect(truncated).toContain("…");
expect(visibleWidth(truncated)).toBeLessThanOrEqual(maxMsgWidth);
});
it("should handle the exact crash case from issue report", () => {
// Terminal width is set to one column less than the full line
// The problematic text contained "✔" and "›" characters
const message = '✔ script to run › dev $ concurrently "vite" "node --import tsx ./server.ts"';
const cursorWidth = 2; // "› " or " "
const terminalWidth = Bun.stringWidth(message) + cursorWidth - 1;
const maxMsgWidth = terminalWidth - cursorWidth;
const truncated = truncateToWidth(message, maxMsgWidth);
const finalWidth = visibleWidth(truncated);
// The final line (cursor + message) must not exceed terminal width
expect(finalWidth + cursorWidth).toBeLessThanOrEqual(terminalWidth);
});
});