102 lines
3.0 KiB
TypeScript
102 lines
3.0 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
|
|
import { TerminalOutputPump } from "./terminal-output-pump";
|
|
|
|
describe("terminal-output-pump", () => {
|
|
it("batches selected-terminal chunk bursts into ordered flushes", () => {
|
|
vi.useFakeTimers();
|
|
const chunks: Array<{ sequence: number; text: string }> = [];
|
|
const pump = new TerminalOutputPump({
|
|
maxOutputChars: 100,
|
|
onSelectedOutputChunk: (chunk) => {
|
|
chunks.push(chunk);
|
|
},
|
|
});
|
|
|
|
pump.setSelectedTerminal({ terminalId: "term-1" });
|
|
pump.append({ terminalId: "term-1", text: "a" });
|
|
pump.append({ terminalId: "term-1", text: "b" });
|
|
pump.append({ terminalId: "term-1", text: "c" });
|
|
|
|
expect(chunks).toEqual([]);
|
|
|
|
vi.runOnlyPendingTimers();
|
|
|
|
expect(chunks).toEqual([
|
|
{ sequence: 1, text: "abc" },
|
|
]);
|
|
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("keeps per-terminal snapshots and switches selected stream deterministically", () => {
|
|
vi.useFakeTimers();
|
|
const chunks: Array<{ sequence: number; text: string }> = [];
|
|
const pump = new TerminalOutputPump({
|
|
maxOutputChars: 10,
|
|
onSelectedOutputChunk: (chunk) => {
|
|
chunks.push(chunk);
|
|
},
|
|
});
|
|
|
|
pump.setSelectedTerminal({ terminalId: "term-1" });
|
|
pump.append({ terminalId: "term-1", text: "hello" });
|
|
vi.runOnlyPendingTimers();
|
|
expect(pump.readSnapshot({ terminalId: "term-1" })).toBe("hello");
|
|
|
|
pump.append({ terminalId: "term-2", text: "world" });
|
|
vi.runOnlyPendingTimers();
|
|
expect(pump.readSnapshot({ terminalId: "term-2" })).toBe("world");
|
|
|
|
pump.setSelectedTerminal({ terminalId: "term-2" });
|
|
pump.append({ terminalId: "term-2", text: "!" });
|
|
vi.runOnlyPendingTimers();
|
|
|
|
expect(chunks).toEqual([
|
|
{ sequence: 1, text: "hello" },
|
|
{ sequence: 2, text: "!" },
|
|
]);
|
|
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("resets selected output when clearing selected terminal", () => {
|
|
vi.useFakeTimers();
|
|
const chunks: Array<{ sequence: number; text: string }> = [];
|
|
const pump = new TerminalOutputPump({
|
|
maxOutputChars: 10,
|
|
onSelectedOutputChunk: (chunk) => {
|
|
chunks.push(chunk);
|
|
},
|
|
});
|
|
|
|
pump.setSelectedTerminal({ terminalId: "term-1" });
|
|
pump.append({ terminalId: "term-1", text: "abc" });
|
|
vi.runOnlyPendingTimers();
|
|
|
|
pump.clearTerminal({ terminalId: "term-1" });
|
|
|
|
expect(pump.readSnapshot({ terminalId: "term-1" })).toBe("");
|
|
expect(chunks).toEqual([
|
|
{ sequence: 1, text: "abc" },
|
|
{ sequence: 2, text: "" },
|
|
]);
|
|
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("prunes orphaned terminal buffers", () => {
|
|
const pump = new TerminalOutputPump({
|
|
maxOutputChars: 100,
|
|
onSelectedOutputChunk: () => {},
|
|
});
|
|
|
|
pump.append({ terminalId: "a", text: "one" });
|
|
pump.append({ terminalId: "b", text: "two" });
|
|
pump.prune({ terminalIds: ["b"] });
|
|
|
|
expect(pump.readSnapshot({ terminalId: "a" })).toBe("");
|
|
expect(pump.readSnapshot({ terminalId: "b" })).toBe("two");
|
|
});
|
|
});
|