fix: resolve remaining PTY test failures, remove stale todos
- rapid arrows: fixture's 6s setTimeout wasn't cleared on exit(), causing a throw after successful completion. Added clearTimeout before exit(). - 2 erase clearTerminal tests removed: Vue renders a single frame for static content, clearTerminal requires 2+ frames (React-specific behavior). The erase-with-state-change test already covers clearTerminal with rerender. - 2 React concurrent mode todos removed (N/A for Vue). 80/80 PTY tests pass, 482/482 in-process tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -138,9 +138,3 @@ test("does not crash when focusing previous on unmounted children", async () =>
|
||||
// Nothing rendered
|
||||
expect(lastFrame()?.trim() ?? "").toBe("");
|
||||
});
|
||||
|
||||
// Concurrent-mode tests from Ink are React-specific and do not apply to vue-tui.
|
||||
test.todo("focus component renders in concurrent mode — React-specific, N/A in vue-tui");
|
||||
test.todo(
|
||||
"focus component with autoFocus renders in concurrent mode — React-specific, N/A in vue-tui",
|
||||
);
|
||||
|
||||
@@ -9,17 +9,15 @@ const UserInput = defineComponent({
|
||||
setup(props) {
|
||||
const exit = useExit();
|
||||
let rapidDownArrowCount = 0;
|
||||
let rapidTimeout: ReturnType<typeof setTimeout> | undefined;
|
||||
|
||||
onMounted(() => {
|
||||
if (props.test === "rapidArrowsEnter") {
|
||||
const timeout = setTimeout(() => {
|
||||
rapidTimeout = setTimeout(() => {
|
||||
throw new Error(
|
||||
`Expected 3 down arrows and enter, received ${rapidDownArrowCount} down arrow events`,
|
||||
);
|
||||
}, 6000);
|
||||
|
||||
// Clear on unmount would go here, but this fixture exits before that matters
|
||||
void timeout;
|
||||
}
|
||||
|
||||
process.stdout.write("__READY__");
|
||||
@@ -34,6 +32,7 @@ const UserInput = defineComponent({
|
||||
|
||||
if (key.return) {
|
||||
if (rapidDownArrowCount === 3) {
|
||||
clearTimeout(rapidTimeout);
|
||||
exit();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -153,9 +153,12 @@ it("useInput - handle right arrow", async () => {
|
||||
expect(ps.output).toContain("exited");
|
||||
});
|
||||
|
||||
// PTY splits rapid escape sequences across data events; the input parser's
|
||||
// 20ms pending-escape timer delays processing, causing the fixture to time out.
|
||||
it.todo("useInput - handles rapid arrows and enter in one chunk");
|
||||
it("useInput - handles rapid arrows and enter in one chunk", async () => {
|
||||
const ps = term("use-input", ["rapidArrowsEnter"]);
|
||||
ps.write("[B[B[B\r");
|
||||
await ps.waitForExit();
|
||||
expect(ps.output).toContain("exited");
|
||||
});
|
||||
|
||||
it("useInput - handle meta + up arrow", async () => {
|
||||
const ps = term("use-input", ["upArrowMeta"]);
|
||||
|
||||
@@ -51,13 +51,6 @@ it("do not erase screen where <Static> is taller than viewport", async () => {
|
||||
}
|
||||
});
|
||||
|
||||
// Vue produces a single frame for static content; clearTerminal only triggers
|
||||
// when previousOutputHeight > viewportRows (requires 2+ frames). Ink's React
|
||||
// reconciler may produce multiple initial frames, triggering the clear.
|
||||
it.todo("erase screen (content overflows viewport)");
|
||||
|
||||
it.todo("erase screen where <Static> exists but interactive part is taller than viewport");
|
||||
|
||||
it("erase screen where state changes", async () => {
|
||||
const ps = term("erase-with-state-change", ["4"]);
|
||||
await ps.waitForExit();
|
||||
|
||||
Reference in New Issue
Block a user