1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
4+ using StructLinq . Array ;
5+ using StructLinq . IEnumerable ;
6+ using StructLinq . SelectMany ;
7+ using Xunit ;
8+
9+ namespace StructLinq . Tests
10+ {
11+ public class SelectManyTests : AbstractEnumerableTests < int ,
12+ SelectManyEnumerable < int [ ] , IStructEnumerable < int [ ] , ArrayStructEnumerator < int [ ] > > , ArrayStructEnumerator < int [ ] > , int , StructEnumerableFromIEnumerable < int > , GenericEnumerator < int > , FuncEnumerable < int [ ] , int > > ,
13+ SelectManyEnumerator < int [ ] , ArrayStructEnumerator < int [ ] > , int , StructEnumerableFromIEnumerable < int > ,
14+ GenericEnumerator < int > , FuncEnumerable < int [ ] , int > > >
15+ {
16+ protected override SelectManyEnumerable < int [ ] , IStructEnumerable < int [ ] , ArrayStructEnumerator < int [ ] > > , ArrayStructEnumerator < int [ ] > , int , StructEnumerableFromIEnumerable < int > , GenericEnumerator < int > , FuncEnumerable < int [ ] , int > > Build ( int size )
17+ {
18+ var n = 3 ;
19+ var blockSize = size / n ;
20+ var list = new List < int [ ] > ( ) ;
21+ var currentBlockSize = blockSize ;
22+ var currentGlobalSize = 0 ;
23+ for ( int i = 0 ; i < n ; i ++ )
24+ {
25+ if ( currentBlockSize == 0 )
26+ break ;
27+ list . Add ( Enumerable . Range ( 0 , currentBlockSize ) . ToArray ( ) ) ;
28+ currentGlobalSize += currentBlockSize ;
29+ currentBlockSize = Math . Min ( blockSize , size - currentGlobalSize ) ;
30+ }
31+
32+ if ( list . Count == 0 )
33+ list . Add ( Enumerable . Range ( 0 , size ) . ToArray ( ) ) ;
34+ else
35+ {
36+ if ( currentGlobalSize != size )
37+ list . Add ( Enumerable . Range ( 0 , size - currentGlobalSize ) . ToArray ( ) ) ;
38+ }
39+
40+ return list . ToArray ( ) . ToStructEnumerable ( ) . SelectMany ( x => x ) ;
41+ }
42+
43+
44+ [ Theory ]
45+ [ InlineData ( 0 , 0 ) ]
46+ [ InlineData ( 20 , 3 ) ]
47+ [ InlineData ( 10 , 2 ) ]
48+ [ InlineData ( 10 , 11 ) ]
49+ public void ShouldSameAsLinqToArray ( int size , int blockSize )
50+ {
51+ var list = new List < int [ ] > ( ) ;
52+ var currentBlockSize = blockSize ;
53+ var currentGlobalSize = 0 ;
54+ var n = blockSize == 0 ? 0 : size / blockSize ;
55+ for ( int i = 0 ; i < n ; i ++ )
56+ {
57+ if ( currentBlockSize == 0 )
58+ break ;
59+ list . Add ( Enumerable . Range ( 0 , currentBlockSize ) . ToArray ( ) ) ;
60+ currentGlobalSize += currentBlockSize ;
61+ currentBlockSize = Math . Min ( blockSize , size - currentGlobalSize ) ;
62+ }
63+
64+ if ( list . Count == 0 )
65+ list . Add ( Enumerable . Range ( 0 , size ) . ToArray ( ) ) ;
66+
67+ var arrayOfArray = list . ToArray ( ) ;
68+
69+ var expected = arrayOfArray . SelectMany ( x => x ) . ToArray ( ) ;
70+ var values = arrayOfArray . ToStructEnumerable ( ) . SelectMany ( x => x ) . ToArray ( ) ;
71+ Assert . Equal ( expected , values ) ;
72+ }
73+
74+ [ Theory ]
75+ [ InlineData ( 0 , 0 ) ]
76+ [ InlineData ( 20 , 3 ) ]
77+ [ InlineData ( 10 , 2 ) ]
78+ [ InlineData ( 10 , 11 ) ]
79+ public void ShouldSameAsLinq ( int size , int blockSize )
80+ {
81+ var list = new List < int [ ] > ( ) ;
82+ var currentBlockSize = blockSize ;
83+ var currentGlobalSize = 0 ;
84+ var n = blockSize == 0 ? 0 : size / blockSize ;
85+ for ( int i = 0 ; i < n ; i ++ )
86+ {
87+ if ( currentBlockSize == 0 )
88+ break ;
89+ list . Add ( Enumerable . Range ( 0 , currentBlockSize ) . ToArray ( ) ) ;
90+ currentGlobalSize += currentBlockSize ;
91+ currentBlockSize = Math . Min ( blockSize , size - currentGlobalSize ) ;
92+ }
93+
94+ if ( list . Count == 0 )
95+ list . Add ( Enumerable . Range ( 0 , size ) . ToArray ( ) ) ;
96+
97+ var arrayOfArray = list . ToArray ( ) ;
98+ var expected = arrayOfArray . SelectMany ( x => x ) . ToArray ( ) ;
99+ var listValues = new List < int > ( ) ;
100+ foreach ( var i in arrayOfArray . ToStructEnumerable ( ) . SelectMany ( x => x ) )
101+ {
102+ listValues . Add ( i ) ;
103+ }
104+ var values = listValues . ToArray ( ) ;
105+ Assert . Equal ( expected , values ) ;
106+ }
107+
108+ [ Fact ]
109+ public void ShouldIgnoreEmptyArray ( )
110+ {
111+ var list = new List < int [ ] > ( ) ;
112+ list . Add ( Enumerable . Range ( 0 , 10 ) . ToArray ( ) ) ;
113+ list . Add ( Enumerable . Range ( 0 , 0 ) . ToArray ( ) ) ;
114+ list . Add ( Enumerable . Range ( - 1 , 10 ) . ToArray ( ) ) ;
115+
116+ var arrayOfArray = list . ToArray ( ) ;
117+ var expected = arrayOfArray . SelectMany ( x => x ) . ToArray ( ) ;
118+ var listValues = new List < int > ( ) ;
119+ foreach ( var i in arrayOfArray . ToStructEnumerable ( ) . SelectMany ( x => x ) )
120+ {
121+ listValues . Add ( i ) ;
122+ }
123+ var values = listValues . ToArray ( ) ;
124+ Assert . Equal ( expected , values ) ;
125+ }
126+
127+ }
128+ }
0 commit comments