fix(coding-agent): stabilize edit tool redraw test
This commit is contained in:
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed flaky `edit-tool-no-full-redraw` TUI tests by waiting for asynchronous preview and preflight error rendering instead of relying on fixed render ticks.
|
||||||
|
|
||||||
## [0.67.3] - 2026-04-15
|
## [0.67.3] - 2026-04-15
|
||||||
|
|
||||||
### New Features
|
### New Features
|
||||||
|
|||||||
@@ -37,6 +37,25 @@ async function waitForRender(): Promise<void> {
|
|||||||
await new Promise((resolve) => setTimeout(resolve, 0));
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function waitForRenderedText(
|
||||||
|
getRender: () => string,
|
||||||
|
expectedText: string,
|
||||||
|
onRetry?: () => void,
|
||||||
|
timeoutMs = 2000,
|
||||||
|
): Promise<string> {
|
||||||
|
const deadline = Date.now() + timeoutMs;
|
||||||
|
let lastRender = "";
|
||||||
|
while (Date.now() < deadline) {
|
||||||
|
onRetry?.();
|
||||||
|
await waitForRender();
|
||||||
|
lastRender = getRender();
|
||||||
|
if (lastRender.includes(expectedText)) {
|
||||||
|
return lastRender;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new Error(`Timed out waiting for render to include "${expectedText}". Last render:\n${lastRender}`);
|
||||||
|
}
|
||||||
|
|
||||||
function createLargeEdits(lines: string[]): Edit[] {
|
function createLargeEdits(lines: string[]): Edit[] {
|
||||||
const targets = [50, 150, 250, 350, 450, 550, 650, 750, 850, 950];
|
const targets = [50, 150, 250, 350, 450, 550, 650, 750, 850, 950];
|
||||||
return targets.map((lineNumber) => ({
|
return targets.map((lineNumber) => ({
|
||||||
@@ -99,9 +118,12 @@ describe("edit tool TUI rendering", () => {
|
|||||||
await waitForRender();
|
await waitForRender();
|
||||||
await waitForRender();
|
await waitForRender();
|
||||||
|
|
||||||
const callOnlyRender = component.render(80).join("\n");
|
const callOnlyRender = await waitForRenderedText(
|
||||||
|
() => component.render(80).join("\n"),
|
||||||
|
"line 50 changed",
|
||||||
|
() => tui.requestRender(true),
|
||||||
|
);
|
||||||
expect(callOnlyRender).toContain("edit");
|
expect(callOnlyRender).toContain("edit");
|
||||||
expect(callOnlyRender).toContain("line 50 changed");
|
|
||||||
expect(callOnlyRender).toContain("line 950 changed");
|
expect(callOnlyRender).toContain("line 950 changed");
|
||||||
|
|
||||||
const redrawsBeforeResult = tui.fullRedraws;
|
const redrawsBeforeResult = tui.fullRedraws;
|
||||||
@@ -201,8 +223,11 @@ describe("edit tool TUI rendering", () => {
|
|||||||
await waitForRender();
|
await waitForRender();
|
||||||
await waitForRender();
|
await waitForRender();
|
||||||
|
|
||||||
const rendered = component.render(80).join("\n");
|
const rendered = await waitForRenderedText(
|
||||||
expect(rendered).toContain("Could not find");
|
() => component.render(80).join("\n"),
|
||||||
|
"Could not find",
|
||||||
|
() => tui.requestRender(true),
|
||||||
|
);
|
||||||
expect(rendered).not.toContain("+1 ");
|
expect(rendered).not.toContain("+1 ");
|
||||||
expect(rendered).not.toContain("-1 ");
|
expect(rendered).not.toContain("-1 ");
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user