57 lines · 1.7 KB · TypeScript
RawDownload
import { assert, describe, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as Stream from "effect/Stream"; import { collectUint8StreamText } from "./collectUint8StreamText.ts"; const encoder = new TextEncoder(); describe("collectUint8StreamText", () => {  it.effect("collects Uint8Array chunks into decoded text", () =>    Effect.gen(function* () {      const result = yield* collectUint8StreamText({        stream: Stream.make(encoder.encode("hello "), encoder.encode("world")),      });       assert.deepStrictEqual(result, {        text: "hello world",        bytes: 11,        truncated: false,        invalidUtf8: false,      });    }),  );   it.effect("truncates by bytes and appends an optional marker once", () =>    Effect.gen(function* () {      const result = yield* collectUint8StreamText({        stream: Stream.make(encoder.encode("abcdef"), encoder.encode("ghij")),        maxBytes: 5,        truncatedMarker: "[truncated]",      });       assert.deepStrictEqual(result, {        text: "abcde[truncated]",        bytes: 5,        truncated: true,        invalidUtf8: false,      });    }),  );   it.effect("reports invalid UTF-8 separately from a literal replacement character", () =>    Effect.gen(function* () {      const invalid = yield* collectUint8StreamText({        stream: Stream.make(new Uint8Array([0x66, 0x80, 0x6f])),      });      const literal = yield* collectUint8StreamText({        stream: Stream.make(encoder.encode("before\uFFFDafter")),      });       assert.strictEqual(invalid.invalidUtf8, true);      assert.strictEqual(invalid.text, "f\uFFFDo");      assert.strictEqual(literal.invalidUtf8, false);      assert.strictEqual(literal.text, "before\uFFFDafter");    }),  );});