Skip to content
Source
Sign inSign up

collectStreamText.test.ts

42 lines1.3 KB

1import { assert, describe, it } from "@effect/vitest";
2import * as Effect from "effect/Effect";
3import * as Stream from "effect/Stream";
4​
5import { collectUint8StreamText } from "./collectStreamText.ts";
6​
7const encoder = new TextEncoder();
8​
9describe("collectUint8StreamText", () => {
10 it.effect("truncates by bytes and appends an optional marker once", () =>
11 Effect.gen(function* () {
12 const result = yield* collectUint8StreamText({
13 stream: Stream.make(encoder.encode("abcdef"), encoder.encode("ghij")),
14 maxBytes: 5,
15 truncatedMarker: "[truncated]",
16 });
17​
18 assert.deepStrictEqual(result, {
19 text: "abcde[truncated]",
20 bytes: 5,
21 truncated: true,
22 invalidUtf8: false,
23 });
24 }),
25 );
26​
27 it.effect("reports invalid UTF-8 separately from a literal replacement character", () =>
28 Effect.gen(function* () {
29 const invalid = yield* collectUint8StreamText({
30 stream: Stream.make(new Uint8Array([0x66, 0x80, 0x6f])),
31 });
32 const literal = yield* collectUint8StreamText({
33 stream: Stream.make(encoder.encode("before\uFFFDafter")),
34 });
35​
36 assert.strictEqual(invalid.invalidUtf8, true);
37 assert.strictEqual(invalid.text, "f\uFFFDo");
38 assert.strictEqual(literal.invalidUtf8, false);
39 assert.strictEqual(literal.text, "before\uFFFDafter");
40 }),
41 );
42});