Something went wrong. Try again.
fork of prime agent with changes i want but are not upstreamable probqbly (and some fixes)
Something went wrong. Try again.
3.0 kB · 90 lines
TypeScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091import { visibleWidth } from "@earendil-works/pi-tui";import { beforeAll, describe, expect, it } from "vitest";import { BashExecutionComponent } from "../src/modes/interactive/components/bash-execution.js";import { initTheme } from "../src/modes/interactive/theme/theme.js";
/** Minimal TUI stub that only exposes terminal.columns */function createTuiStub(columns: number): { columns: number; stub: any } { const state = { columns }; const stub = { terminal: { get columns() { return state.columns; }, get rows() { return 24; }, }, // Loader calls ui.addInterval / ui.removeInterval addInterval: (_cb: () => void, _ms: number) => ({ dispose: () => {} }), removeInterval: () => {}, requestRender: () => {}, }; return { columns: state.columns, stub };}
/** Collapsed output must wrap at render-time width after a resize or split. */describe("BashExecutionComponent width handling (#2569)", () => { beforeAll(() => { initTheme(undefined, false); });
it("collapsed preview lines respect render-time width, not construction-time width", () => { const wideWidth = 200; const narrowWidth = 80;
const { stub } = createTuiStub(wideWidth); const component = new BashExecutionComponent("pwd", stub);
// Add output with long lines that will wrap differently at different widths const longLine = "x".repeat(150); component.appendOutput(`${longLine}\n${longLine}\n`);
component.setComplete(0, false);
// Render at the narrow width (simulating a resize or split pane) const lines = component.render(narrowWidth);
// Every rendered line must fit within the narrow width for (let i = 0; i < lines.length; i++) { const w = visibleWidth(lines[i]); expect(w, `Line ${i} visibleWidth=${w} > ${narrowWidth}`).toBeLessThanOrEqual(narrowWidth); } });
it("re-computes lines when width changes between renders", () => { const { stub } = createTuiStub(200); const component = new BashExecutionComponent("echo hello", stub);
const longLine = "abcdefghij".repeat(20); // 200 chars component.appendOutput(`${longLine}\n`); component.setComplete(0, false);
// First render at width 200 const lines200 = component.render(200); for (const line of lines200) { expect(visibleWidth(line)).toBeLessThanOrEqual(200); }
// Second render at width 60 (split pane scenario) const lines60 = component.render(60); for (let i = 0; i < lines60.length; i++) { const w = visibleWidth(lines60[i]); expect(w, `Line ${i} visibleWidth=${w} > 60`).toBeLessThanOrEqual(60); } });
it("renders an inline failure state via setFailed", () => { const { stub } = createTuiStub(120); const component = new BashExecutionComponent("boom", stub);
component.setFailed("spawn failure");
const rendered = component .render(120) .map((line) => line.replace(/\[[0-9;]*m/g, "")) .join("\n"); expect(rendered).toContain("failed: spawn failure"); expect(rendered).not.toContain("Running..."); });});