1+ namespace Open . ChannelExtensions . Tests ;
2+
3+ public static class MergeTests
4+ {
5+ const int Total = 3000000 ;
6+ const int Bounds = 100 ;
7+ const int Count = 5 ;
8+
9+ private static Channel < int > [ ] GetChannels ( )
10+ => Enumerable . Range ( 0 , Count ) . Select ( _ => Channel . CreateBounded < int > ( Bounds ) ) . ToArray ( ) ;
11+
12+ private static async Task BasicMergeTestCore ( ChannelWriter < int > [ ] writers , ValueTask < List < int > > merging )
13+ {
14+ // Act
15+ await Parallel . ForAsync ( 0 , Total ,
16+ ( i , token ) => writers [ i % Count ] . WriteAsync ( i , token ) ) ;
17+
18+ foreach ( var writer in writers )
19+ writer . Complete ( ) ;
20+
21+ var merged = await merging ;
22+ merged . Sort ( ) ;
23+
24+ // Assert
25+ Assert . Equal ( Total , merged . Count ) ;
26+ Assert . True ( Enumerable . Range ( 0 , Total ) . SequenceEqual ( merged ) ) ;
27+ }
28+
29+ [ Fact ( ) ]
30+ public static async Task BasicMergeTest ( )
31+ {
32+ // 3 channels
33+ var c = GetChannels ( ) ;
34+
35+ // 3 writers
36+ var writers = c . Select ( e => e . Writer ) . ToArray ( ) ;
37+
38+ // 3 readers
39+ var merging = c . Select ( e => e . Reader ) . Merge ( ) . ToListAsync ( Total ) ;
40+
41+ await BasicMergeTestCore ( writers , merging ) ;
42+ }
43+
44+ [ Fact ( ) ]
45+ public static async Task MergeChainTest ( )
46+ {
47+ // 3 channels
48+ var c = GetChannels ( ) ;
49+
50+ // 3 writers
51+ var writers = c . Select ( e => e . Writer ) . ToArray ( ) ;
52+
53+ var reader = c [ 0 ] . Reader ;
54+ for ( int i = 1 ; i < c . Length ; i ++ )
55+ reader = reader . Merge ( c [ i ] . Reader ) ;
56+
57+ // 3 readers
58+ var merging = reader . ToListAsync ( Total ) ;
59+
60+ await BasicMergeTestCore ( writers , merging ) ;
61+ }
62+
63+ [ Fact ( ) ]
64+ public static async Task MergeChainTest2 ( )
65+ {
66+ // 3 channels
67+ var c = GetChannels ( ) ;
68+
69+ // 3 writers
70+ var writers = c . Select ( e => e . Writer ) . ToArray ( ) ;
71+
72+ var reader = c [ 0 ] . Reader . Merge ( c [ 1 ] . Reader , c . Skip ( 2 ) . Select ( e => e . Reader ) . ToArray ( ) ) ;
73+ for ( int i = 1 ; i < c . Length ; i ++ )
74+ reader = reader . Merge ( c [ i ] . Reader ) ;
75+
76+ // 3 readers
77+ var merging = reader . ToListAsync ( Total ) ;
78+
79+ await BasicMergeTestCore ( writers , merging ) ;
80+ }
81+
82+ [ Fact ( ) ]
83+ public static async Task ExceptionPropagationTest ( )
84+ {
85+ // 3 channels
86+ var c = GetChannels ( ) ;
87+
88+ // 3 writers
89+ var writers = c . Select ( e => e . Writer ) . ToArray ( ) ;
90+
91+ // 3 readers
92+ var merging = c . Select ( e => e . Reader ) . Merge ( ) ;
93+ var list = merging . ToListAsync ( Total ) ;
94+
95+ // Act
96+ await Assert . ThrowsAsync < ChannelClosedException > ( ( ) => Parallel . ForAsync ( 0 , Total ,
97+ async ( i , token ) =>
98+ {
99+ var w = writers [ i % 3 ] ;
100+ if ( i == Total / 2 )
101+ w . Complete ( new Exception ( "Test" ) ) ;
102+ else
103+ await w . WriteAsync ( i , token ) . ConfigureAwait ( false ) ;
104+ } ) ) ;
105+
106+ // Assert
107+ await Assert . ThrowsAsync < Exception > ( list . AsTask ) ;
108+ await Assert . ThrowsAsync < Exception > ( ( ) => merging . Completion ) ;
109+ }
110+ }
0 commit comments