-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
ElementAtElementAtOrDefaultTests.cs
124 lines (109 loc) · 5.69 KB
/
ElementAtElementAtOrDefaultTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Generic;
using Xunit;
namespace System.Linq.Parallel.Tests
{
public static class ElementAtElementAtOrDefaultTests
{
private static readonly Func<int, IEnumerable<int>> Positions = x => new[] { 0, x / 2, Math.Max(0, x - 1) }.Distinct();
private static readonly Func<int, IEnumerable<int>> InvalidPositions = x => new[] { -1, x, x * 2 }.Distinct();
public static IEnumerable<object[]> ElementAtUnorderedData(int[] counts)
{
// A deliberate decision was made here to test with all types, because this reflects partitioning/indexing
foreach (object[] results in UnorderedSources.Ranges(counts.DefaultIfEmpty(Sources.OuterLoopCount), Positions)) yield return results;
}
public static IEnumerable<object[]> ElementAtData(int[] counts)
{
foreach (object[] results in Sources.Ranges(counts.DefaultIfEmpty(Sources.OuterLoopCount), Positions)) yield return results;
}
public static IEnumerable<object[]> ElementAtOutOfRangeData(int[] counts)
{
foreach (object[] results in UnorderedSources.Ranges(counts.DefaultIfEmpty(Sources.OuterLoopCount), InvalidPositions)) yield return results;
foreach (object[] results in Sources.Ranges(counts.DefaultIfEmpty(Sources.OuterLoopCount), InvalidPositions)) yield return results;
}
//
// ElementAt and ElementAtOrDefault
//
[Theory]
[MemberData(nameof(ElementAtUnorderedData), new[] { 1, 2, 16 })]
[MemberData(nameof(ElementAtData), new[] { 1, 2, 16 })]
public static void ElementAt(Labeled<ParallelQuery<int>> labeled, int count, int position)
{
// For unordered collections, which element is chosen isn't actually guaranteed, but an effect of the implementation.
// If this test starts failing it should be split, and possibly mentioned in release notes.
_ = count;
ParallelQuery<int> query = labeled.Item;
Assert.Equal(position, query.ElementAt(position));
}
[Theory]
[OuterLoop]
[MemberData(nameof(ElementAtUnorderedData), new int[] { /* Sources.OuterLoopCount */ })]
[MemberData(nameof(ElementAtData), new int[] { /* Sources.OuterLoopCount */ })]
public static void ElementAt_Longrunning(Labeled<ParallelQuery<int>> labeled, int count, int position)
{
ElementAt(labeled, count, position);
}
[Theory]
[MemberData(nameof(ElementAtOutOfRangeData), new[] { 0, 1, 2, 16 })]
public static void ElementAt_OutOfRange(Labeled<ParallelQuery<int>> labeled, int count, int position)
{
_ = count;
ParallelQuery<int> query = labeled.Item;
Assert.Throws<ArgumentOutOfRangeException>(() => query.ElementAt(position));
}
[Theory]
[OuterLoop]
[MemberData(nameof(ElementAtOutOfRangeData), new int[] { /* Sources.OuterLoopCount */ })]
public static void ElementAt_OutOfRange_Longrunning(Labeled<ParallelQuery<int>> labeled, int count, int position)
{
ElementAt_OutOfRange(labeled, count, position);
}
[Theory]
[MemberData(nameof(ElementAtUnorderedData), new[] { 0, 1, 2, 16 })]
[MemberData(nameof(ElementAtData), new[] { 0, 1, 2, 16 })]
public static void ElementAtOrDefault(Labeled<ParallelQuery<int>> labeled, int count, int position)
{
// For unordered collections, which element is chosen isn't actually guaranteed, but an effect of the implementation.
// If this test starts failing it should be split, and possibly mentioned in release notes.
_ = count;
ParallelQuery<int> query = labeled.Item;
Assert.Equal(position, query.ElementAtOrDefault(position));
}
[Theory]
[OuterLoop]
[MemberData(nameof(ElementAtUnorderedData), new int[] { /* Sources.OuterLoopCount */ })]
[MemberData(nameof(ElementAtData), new int[] { /* Sources.OuterLoopCount */ })]
public static void ElementAtOrDefault_Longrunning(Labeled<ParallelQuery<int>> labeled, int count, int position)
{
ElementAtOrDefault(labeled, count, position);
}
[Theory]
[MemberData(nameof(ElementAtOutOfRangeData), new[] { 0, 1, 2, 16 })]
public static void ElementAtOrDefault_OutOfRange(Labeled<ParallelQuery<int>> labeled, int count, int position)
{
_ = count;
ParallelQuery<int> query = labeled.Item;
Assert.Equal(default, query.ElementAtOrDefault(position));
}
[Theory]
[OuterLoop]
[MemberData(nameof(ElementAtOutOfRangeData), new int[] { /* Sources.OuterLoopCount */ })]
public static void ElementAtOrDefault_OutOfRange_Longrunning(Labeled<ParallelQuery<int>> labeled, int count, int position)
{
ElementAtOrDefault_OutOfRange(labeled, count, position);
}
[Fact]
public static void ElementAt_OperationCanceledException_PreCanceled()
{
AssertThrows.AlreadyCanceled(source => source.ElementAt(0));
AssertThrows.AlreadyCanceled(source => source.ElementAtOrDefault(0));
}
[Fact]
public static void ElementAt_ArgumentNullException()
{
AssertExtensions.Throws<ArgumentNullException>("source", () => ((ParallelQuery<object>)null).ElementAt(0));
AssertExtensions.Throws<ArgumentNullException>("source", () => ((ParallelQuery<object>)null).ElementAtOrDefault(0));
}
}
}