Files
claude-code/src/utils/__tests__/bufferedWriter.test.ts
2026-04-02 16:03:20 +08:00

118 lines
3.5 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { createBufferedWriter } from "../bufferedWriter";
describe("createBufferedWriter", () => {
test("immediateMode calls writeFn directly", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
immediateMode: true,
});
writer.write("a");
writer.write("b");
expect(written).toEqual(["a", "b"]);
});
test("buffered mode accumulates until flush", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
});
writer.write("hello ");
writer.write("world");
expect(written).toEqual([]);
writer.flush();
expect(written).toEqual(["hello world"]);
});
test("flush with empty buffer does not call writeFn", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
});
writer.flush();
expect(written).toEqual([]);
});
test("flush clears the buffer", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
});
writer.write("data");
writer.flush();
writer.flush(); // second flush should be no-op
expect(written).toEqual(["data"]);
});
test("overflow triggers deferred flush when maxBufferSize reached", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
maxBufferSize: 2,
});
writer.write("a");
writer.write("b");
// 2 writes = maxBufferSize, triggers flushDeferred via setImmediate
expect(written).toEqual([]);
});
test("overflow triggers deferred flush when maxBufferBytes reached", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
maxBufferBytes: 5,
});
writer.write("abc");
writer.write("def");
// total 6 bytes > 5, triggers flushDeferred
expect(written).toEqual([]);
});
test("dispose flushes remaining buffer", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
});
writer.write("final");
writer.dispose();
expect(written).toEqual(["final"]);
});
test("dispose flushes pending overflow", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
maxBufferSize: 1,
});
writer.write("overflow-data");
// overflow triggered but deferred; dispose should flush it synchronously
writer.dispose();
expect(written).toEqual(["overflow-data"]);
});
test("coalesced overflow — multiple overflows merge before write", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
maxBufferSize: 1,
});
writer.write("a"); // triggers first overflow (deferred)
writer.write("b"); // pendingOverflow exists, coalesces
writer.dispose(); // flushes coalesced overflow
expect(written).toEqual(["ab"]);
});
test("multiple flushes produce concatenated writes", () => {
const written: string[] = [];
const writer = createBufferedWriter({
writeFn: (c) => written.push(c),
});
writer.write("batch1");
writer.flush();
writer.write("batch2");
writer.flush();
expect(written).toEqual(["batch1", "batch2"]);
});
});