-
Notifications
You must be signed in to change notification settings - Fork 0
/
concats.spec.ts
131 lines (111 loc) · 3.56 KB
/
concats.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import { concatStream } from "./concats";
import { sf } from "./index";
describe("concats", () => {
const createStream = <T>(chunks: T[]): ReadableStream<T> => {
return new ReadableStream({
start(controller) {
chunks.forEach((chunk) => controller.enqueue(chunk));
controller.close();
},
});
};
it("should concatenate multiple streams correctly", async () => {
const source1 = createStream([1, 2, 3]);
const source2 = createStream([4, 5]);
const source3 = createStream([6, 7, 8, 9]);
const readable = concatStream([source1, source2, source3]);
const reader = readable.getReader();
const result: number[] = [];
let done = false;
while (!done) {
const { value, done: readerDone } = await reader.read();
if (!readerDone && value !== undefined) {
result.push(value);
}
done = readerDone;
}
expect(result).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);
});
it("should concatenate multiple streams in correctly order", async () => {
const f = jest.fn();
const source1 = sf([1, 2, 3]).forEach((e) => f(e));
const source2 = sf([4, 5]).forEach((e) => f(e));
const source3 = sf([6, 7, 8, 9]).forEach((e) => f(e));
const readable = concatStream([source1, source2, source3]);
const reader = readable.getReader();
const result: number[] = [];
const readOne = async () => {
const { value, done } = await reader.read();
if (done) return;
result.push(value);
return value;
};
expect(f).not.toHaveBeenCalled();
await readOne();
expect(f).toHaveBeenLastCalledWith(1);
await readOne();
expect(f).toHaveBeenLastCalledWith(2);
await readOne();
expect(f).toHaveBeenLastCalledWith(3);
await readOne();
expect(f).toHaveBeenLastCalledWith(4);
await readOne();
await readOne();
await readOne();
await readOne();
await readOne();
await readOne();
await readOne();
await readOne();
await readOne();
await readOne();
await readOne();
expect(result).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);
});
it("should handle no streams", async () => {
const readable = concatStream();
const reader = readable.getReader();
const result: any[] = [];
let done = false;
while (!done) {
const { value, done: readerDone } = await reader.read();
if (!readerDone && value !== undefined) {
result.push(value);
}
done = readerDone;
}
expect(result).toEqual([]);
});
it("should handle a single stream", async () => {
const source1 = createStream([1, 2, 3]);
const readable = concatStream([source1]);
const reader = readable.getReader();
const result: number[] = [];
let done = false;
while (!done) {
const { value, done: readerDone } = await reader.read();
if (!readerDone && value !== undefined) {
result.push(value);
}
done = readerDone;
}
expect(result).toEqual([1, 2, 3]);
});
it("should support empty streams within the concatenation", async () => {
const source1 = createStream([1, 2, 3]);
const source2 = createStream([]);
const source3 = createStream([4, 5]);
const readable = concatStream([source1, source2, source3]);
const reader = readable.getReader();
const result: number[] = [];
let done = false;
while (!done) {
const { value, done: readerDone } = await reader.read();
if (!readerDone && value !== undefined) {
result.push(value);
}
done = readerDone;
}
expect(result).toEqual([1, 2, 3, 4, 5]);
});
});