Skip to content

Commit 6a1768e

Browse files
committed
test(json-crdt): 💍 add fanout tests
1 parent 36a2062 commit 6a1768e

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import {MapFanOut, MergeFanOut, MicrotaskBufferFanOut, OnNewFanOut} from '../fanout';
2+
import {FanOut} from 'thingies/es2020/fanout';
3+
4+
describe('MergeFanOut', () => {
5+
test('merges data from multiple fanouts', () => {
6+
const fanout1 = new FanOut<number>();
7+
const fanout2 = new FanOut<number>();
8+
const fanout3 = new FanOut<number>();
9+
const merged = new MergeFanOut<number>([fanout1, fanout2, fanout3]);
10+
const data: number[] = [];
11+
const unsub = merged.listen((d) => data.push(d));
12+
fanout1.emit(1);
13+
fanout2.emit(2);
14+
fanout3.emit(3);
15+
expect(data).toEqual([1, 2, 3]);
16+
unsub();
17+
fanout1.emit(1);
18+
fanout2.emit(2);
19+
fanout3.emit(3);
20+
expect(data).toEqual([1, 2, 3]);
21+
merged.listen((d) => data.push(d));
22+
fanout3.emit(3);
23+
fanout2.emit(2);
24+
fanout1.emit(1);
25+
expect(data).toEqual([1, 2, 3, 3, 2, 1]);
26+
});
27+
});
28+
29+
describe('MicrotaskBufferFanOut', () => {
30+
test('buffers multiple emissions by microtask', async () => {
31+
const source = new FanOut<number>();
32+
const merged = new MicrotaskBufferFanOut<number>(source);
33+
const data: number[][] = [];
34+
const unsub = merged.listen((d) => data.push(d));
35+
expect(data.length).toBe(0);
36+
source.emit(1);
37+
source.emit(2);
38+
source.emit(3);
39+
expect(data.length).toBe(0);
40+
await Promise.resolve();
41+
expect(data).toEqual([[1, 2, 3]]);
42+
source.emit(1);
43+
source.emit(2);
44+
source.emit(3);
45+
unsub();
46+
source.emit(1);
47+
source.emit(2);
48+
source.emit(3);
49+
await Promise.resolve();
50+
expect(data).toEqual([[1, 2, 3]]);
51+
merged.listen((d) => data.push(d));
52+
source.emit(1);
53+
source.emit(2);
54+
source.emit(3);
55+
await Promise.resolve();
56+
expect(data).toEqual([
57+
[1, 2, 3],
58+
[1, 2, 3],
59+
]);
60+
});
61+
});
62+
63+
describe('MapFanOut', () => {
64+
test('can multiply all values by 2x', () => {
65+
const source = new FanOut<number>();
66+
const merged = new MapFanOut<number, number>(source, (x) => x * 2);
67+
const data: number[] = [];
68+
const unsub = merged.listen((d) => data.push(d));
69+
expect(data.length).toBe(0);
70+
source.emit(1);
71+
source.emit(2);
72+
source.emit(3);
73+
expect(data.length).toBe(3);
74+
expect(data).toEqual([2, 4, 6]);
75+
unsub();
76+
source.emit(1);
77+
source.emit(2);
78+
source.emit(3);
79+
expect(data.length).toBe(3);
80+
merged.listen((d) => data.push(d));
81+
source.emit(4);
82+
expect(data).toEqual([2, 4, 6, 8]);
83+
});
84+
});
85+
86+
describe('OnNewFanOut', () => {
87+
test('emits only new value changes', () => {
88+
const obj1 = {};
89+
const obj2 = {};
90+
const source = new FanOut<any>();
91+
const merged = new OnNewFanOut<any>(source);
92+
const data: any[] = [];
93+
const unsub = merged.listen((d) => data.push(d));
94+
expect(data.length).toBe(0);
95+
source.emit(obj1);
96+
expect(data.length).toBe(1);
97+
expect(data).toEqual([obj1]);
98+
source.emit(obj1);
99+
expect(data.length).toBe(1);
100+
source.emit(obj2);
101+
source.emit(obj2);
102+
expect(data.length).toBe(2);
103+
expect(data).toEqual([obj1, obj2]);
104+
unsub();
105+
source.emit(obj1);
106+
source.emit(obj2);
107+
expect(data.length).toBe(2);
108+
expect(data).toEqual([obj1, obj2]);
109+
merged.listen((d) => data.push(d));
110+
source.emit(obj2);
111+
expect(data.length).toBe(3);
112+
expect(data).toEqual([obj1, obj2, obj2]);
113+
});
114+
});

0 commit comments

Comments
 (0)