Skip to content

Commit 006da37

Browse files
committed
add back tests for flattenAsyncIterable
this was not restored when we restored subscription support (conditioned on an argument)
1 parent 9a70c08 commit 006da37

1 file changed

Lines changed: 146 additions & 0 deletions

File tree

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
import { flattenAsyncIterable } from '../flattenAsyncIterable.js';
2+
3+
describe('flattenAsyncIterable', () => {
4+
it('flatten nested async generators', async () => {
5+
async function* source() {
6+
yield await Promise.resolve(
7+
(async function* nested(): AsyncGenerator<number, void, void> {
8+
yield await Promise.resolve(1.1);
9+
yield await Promise.resolve(1.2);
10+
})(),
11+
);
12+
yield await Promise.resolve(
13+
(async function* nested(): AsyncGenerator<number, void, void> {
14+
yield await Promise.resolve(2.1);
15+
yield await Promise.resolve(2.2);
16+
})(),
17+
);
18+
}
19+
20+
const doubles = flattenAsyncIterable(source());
21+
22+
const result = [];
23+
for await (const x of doubles) {
24+
result.push(x);
25+
}
26+
expect(result).toEqual([1.1, 1.2, 2.1, 2.2]);
27+
});
28+
29+
it('allows returning early from a nested async generator', async () => {
30+
async function* source() {
31+
yield await Promise.resolve(
32+
(async function* nested(): AsyncGenerator<number, void, void> {
33+
yield await Promise.resolve(1.1);
34+
yield await Promise.resolve(1.2);
35+
})(),
36+
);
37+
yield await Promise.resolve(
38+
(async function* nested(): AsyncGenerator<number, void, void> {
39+
yield await Promise.resolve(2.1); /* c8 ignore start */
40+
// Not reachable, early return
41+
yield await Promise.resolve(2.2);
42+
})(),
43+
);
44+
// Not reachable, early return
45+
yield await Promise.resolve(
46+
(async function* nested(): AsyncGenerator<number, void, void> {
47+
yield await Promise.resolve(3.1);
48+
yield await Promise.resolve(3.2);
49+
})(),
50+
);
51+
}
52+
/* c8 ignore stop */
53+
54+
const doubles = flattenAsyncIterable(source());
55+
56+
expect(await doubles.next()).toEqual({ value: 1.1, done: false });
57+
expect(await doubles.next()).toEqual({ value: 1.2, done: false });
58+
expect(await doubles.next()).toEqual({ value: 2.1, done: false });
59+
60+
// Early return
61+
expect(await doubles.return()).toEqual({
62+
value: undefined,
63+
done: true,
64+
});
65+
66+
// Subsequent next calls
67+
expect(await doubles.next()).toEqual({
68+
value: undefined,
69+
done: true,
70+
});
71+
expect(await doubles.next()).toEqual({
72+
value: undefined,
73+
done: true,
74+
});
75+
});
76+
77+
it('allows throwing errors from a nested async generator', async () => {
78+
async function* source() {
79+
yield await Promise.resolve(
80+
(async function* nested(): AsyncGenerator<number, void, void> {
81+
yield await Promise.resolve(1.1);
82+
yield await Promise.resolve(1.2);
83+
})(),
84+
);
85+
yield await Promise.resolve(
86+
(async function* nested(): AsyncGenerator<number, void, void> {
87+
yield await Promise.resolve(2.1); /* c8 ignore start */
88+
// Not reachable, early return
89+
yield await Promise.resolve(2.2);
90+
})(),
91+
);
92+
// Not reachable, early return
93+
yield await Promise.resolve(
94+
(async function* nested(): AsyncGenerator<number, void, void> {
95+
yield await Promise.resolve(3.1);
96+
yield await Promise.resolve(3.2);
97+
})(),
98+
);
99+
}
100+
/* c8 ignore stop */
101+
102+
const doubles = flattenAsyncIterable(source());
103+
104+
expect(await doubles.next()).toEqual({ value: 1.1, done: false });
105+
expect(await doubles.next()).toEqual({ value: 1.2, done: false });
106+
expect(await doubles.next()).toEqual({ value: 2.1, done: false });
107+
108+
// Throw error
109+
let caughtError;
110+
try {
111+
await doubles.throw('ouch'); /* c8 ignore start */
112+
} catch (e) {
113+
caughtError = e;
114+
}
115+
expect(caughtError).toEqual('ouch');
116+
});
117+
it('completely yields sub-iterables even when next() called in parallel', async () => {
118+
async function* source() {
119+
yield await Promise.resolve(
120+
(async function* nested(): AsyncGenerator<number, void, void> {
121+
yield await Promise.resolve(1.1);
122+
yield await Promise.resolve(1.2);
123+
})(),
124+
);
125+
yield await Promise.resolve(
126+
(async function* nested(): AsyncGenerator<number, void, void> {
127+
yield await Promise.resolve(2.1);
128+
yield await Promise.resolve(2.2);
129+
})(),
130+
);
131+
}
132+
133+
const result = flattenAsyncIterable(source());
134+
135+
const promise1 = result.next();
136+
const promise2 = result.next();
137+
expect(await promise1).toEqual({ value: 1.1, done: false });
138+
expect(await promise2).toEqual({ value: 1.2, done: false });
139+
expect(await result.next()).toEqual({ value: 2.1, done: false });
140+
expect(await result.next()).toEqual({ value: 2.2, done: false });
141+
expect(await result.next()).toEqual({
142+
value: undefined,
143+
done: true,
144+
});
145+
});
146+
});

0 commit comments

Comments
 (0)