3
3
// See the LICENSE file in the project root for more information.
4
4
5
5
using System . Buffers ;
6
+ using System . Collections ;
7
+ using System . Collections . Generic ;
6
8
using Xunit ;
7
9
8
10
namespace System . SpanTests
9
11
{
10
12
public static partial class ReadOnlySpanTests
11
13
{
12
14
[ Fact ]
13
- public static void DefaultSpanSplitEnumeratorBehaviour ( )
15
+ public static void SpanSplitEnumerator_Default ( )
14
16
{
15
17
var charSpanEnumerator = new MemoryExtensions . SpanSplitEnumerator < char > ( ) ;
16
18
Assert . Equal ( new Range ( 0 , 0 ) , charSpanEnumerator . Current ) ;
@@ -19,10 +21,34 @@ public static void DefaultSpanSplitEnumeratorBehaviour()
19
21
// Implicit DoesNotThrow assertion
20
22
charSpanEnumerator . GetEnumerator ( ) ;
21
23
24
+ TestGI ( charSpanEnumerator ) ;
25
+ TestI ( charSpanEnumerator ) ;
26
+
22
27
var stringSpanEnumerator = new MemoryExtensions . SpanSplitEnumerator < string > ( ) ;
23
28
Assert . Equal ( new Range ( 0 , 0 ) , stringSpanEnumerator . Current ) ;
24
29
Assert . False ( stringSpanEnumerator . MoveNext ( ) ) ;
25
30
stringSpanEnumerator . GetEnumerator ( ) ;
31
+ TestGI ( stringSpanEnumerator ) ;
32
+ TestI ( stringSpanEnumerator ) ;
33
+
34
+ static void TestGI < TEnumerator > ( TEnumerator enumerator ) where TEnumerator : IEnumerator < Range > , allows ref struct
35
+ {
36
+ Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
37
+ Assert . False ( enumerator . MoveNext ( ) ) ;
38
+ try { enumerator . Reset ( ) ; } catch ( NotSupportedException ) { }
39
+ enumerator . Dispose ( ) ;
40
+ Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
41
+ Assert . False ( enumerator . MoveNext ( ) ) ;
42
+ }
43
+
44
+ static void TestI < TEnumerator > ( TEnumerator enumerator ) where TEnumerator : IEnumerator , allows ref struct
45
+ {
46
+ Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
47
+ Assert . False ( enumerator . MoveNext ( ) ) ;
48
+ try { enumerator . Reset ( ) ; } catch ( NotSupportedException ) { }
49
+ Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
50
+ Assert . False ( enumerator . MoveNext ( ) ) ;
51
+ }
26
52
}
27
53
28
54
[ Fact ]
@@ -132,7 +158,7 @@ static void Test<T>(T[] value, T[] separator, Range[] result) where T : IEquatab
132
158
}
133
159
134
160
[ Fact ]
135
- public static void SplitAnySeparatorData ( )
161
+ public static void SplitAny_SeparatorData ( )
136
162
{
137
163
// Split no separators
138
164
Test ( ( char [ ] ) [ 'a' , ' ' , 'b' ] , ( char [ ] ) [ ] , ( Range [ ] ) [ 0 ..1 , 2 ..3 ] ) ; // an empty span of separators for char is handled as all whitespace being separators
@@ -196,6 +222,9 @@ separator is char[] separators &&
196
222
197
223
private static void AssertEnsureCorrectEnumeration < T > ( MemoryExtensions . SpanSplitEnumerator < T > enumerator , Range [ ] result ) where T : IEquatable < T >
198
224
{
225
+ AssertEnsureCorrectEnumerationGI < T , MemoryExtensions . SpanSplitEnumerator < T > > ( enumerator , result ) ;
226
+ AssertEnsureCorrectEnumerationI < T , MemoryExtensions . SpanSplitEnumerator < T > > ( enumerator , result ) ;
227
+
199
228
Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
200
229
201
230
for ( int i = 0 ; i < result . Length ; i ++ )
@@ -207,6 +236,50 @@ private static void AssertEnsureCorrectEnumeration<T>(MemoryExtensions.SpanSplit
207
236
Assert . False ( enumerator . MoveNext ( ) ) ;
208
237
}
209
238
239
+ private static void AssertEnsureCorrectEnumerationGI < T , TEnumerator > ( TEnumerator enumerator , Range [ ] result )
240
+ where T : IEquatable < T >
241
+ where TEnumerator : IEnumerator < Range > , allows ref struct
242
+ {
243
+ Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
244
+ try { enumerator . Reset ( ) ; } catch ( NotSupportedException ) { }
245
+ enumerator . Dispose ( ) ;
246
+ Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
247
+
248
+ for ( int i = 0 ; i < result . Length ; i ++ )
249
+ {
250
+ enumerator . Dispose ( ) ;
251
+ try { enumerator . Reset ( ) ; } catch ( NotSupportedException ) { }
252
+ Assert . True ( enumerator . MoveNext ( ) ) ;
253
+ Assert . Equal ( result [ i ] , enumerator . Current ) ;
254
+ }
255
+
256
+ Assert . False ( enumerator . MoveNext ( ) ) ;
257
+ try { enumerator . Reset ( ) ; } catch ( NotSupportedException ) { }
258
+ enumerator . Dispose ( ) ;
259
+ Assert . False ( enumerator . MoveNext ( ) ) ;
260
+ }
261
+
262
+ private static void AssertEnsureCorrectEnumerationI < T , TEnumerator > ( TEnumerator enumerator , Range [ ] result )
263
+ where T : IEquatable < T >
264
+ where TEnumerator : IEnumerator , allows ref struct
265
+ {
266
+ Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
267
+
268
+ try { enumerator . Reset ( ) ; } catch ( NotSupportedException ) { }
269
+ Assert . Equal ( new Range ( 0 , 0 ) , enumerator . Current ) ;
270
+
271
+ for ( int i = 0 ; i < result . Length ; i ++ )
272
+ {
273
+ try { enumerator . Reset ( ) ; } catch ( NotSupportedException ) { }
274
+ Assert . True ( enumerator . MoveNext ( ) ) ;
275
+ Assert . Equal ( result [ i ] , enumerator . Current ) ;
276
+ }
277
+
278
+ Assert . False ( enumerator . MoveNext ( ) ) ;
279
+ try { enumerator . Reset ( ) ; } catch ( NotSupportedException ) { }
280
+ Assert . False ( enumerator . MoveNext ( ) ) ;
281
+ }
282
+
210
283
public record struct CustomStruct ( int value ) : IEquatable < CustomStruct > ;
211
284
212
285
public record class CustomClass ( int value ) : IEquatable < CustomClass > ;
0 commit comments