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