1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Collections.Generic;
6 using Xunit;
7 
8 namespace System.Linq.Parallel.Tests
9 {
10     public static class ContainsTests
11     {
OnlyOneData(int[] counts)12         public static IEnumerable<object[]> OnlyOneData(int[] counts)
13         {
14             foreach (int count in counts.DefaultIfEmpty(Sources.OuterLoopCount))
15             {
16                 foreach (int position in new[] { 0, count / 2, Math.Max(0, count - 1) }.Distinct())
17                 {
18                     yield return new object[] { count, position };
19                 }
20             }
21         }
22 
23         //
24         // Contains
25         //
26         [Theory]
27         [InlineData(0)]
28         [InlineData(1)]
29         [InlineData(2)]
30         [InlineData(16)]
Contains_NoMatching(int count)31         public static void Contains_NoMatching(int count)
32         {
33             Assert.False(ParallelEnumerable.Range(0, count).Contains(count));
34             Assert.False(ParallelEnumerable.Range(0, count).Contains(count, null));
35             Assert.False(ParallelEnumerable.Range(0, count).Contains(count, DelegatingComparer.Create<int>((l, r) => false, i => 0)));
36         }
37 
38         [Fact]
39         [OuterLoop]
Contains_NoMatching_Longrunning()40         public static void Contains_NoMatching_Longrunning()
41         {
42             Contains_NoMatching(Sources.OuterLoopCount);
43         }
44 
45         [Theory]
46         [InlineData(16)]
Contains_MultipleMatching(int count)47         public static void Contains_MultipleMatching(int count)
48         {
49             Assert.True(ParallelEnumerable.Range(0, count).Contains(count, DelegatingComparer.Create<int>((l, r) => (l % 2) == (r % 2), i => i % 2)));
50         }
51 
52         [Fact]
53         [OuterLoop]
Contains_MultipleMatching_Longrunning()54         public static void Contains_MultipleMatching_Longrunning()
55         {
56             Contains_MultipleMatching(Sources.OuterLoopCount);
57         }
58 
59         [Theory]
60         [MemberData(nameof(OnlyOneData), new[] { 2, 16 })]
Contains_OneMatching(int count, int position)61         public static void Contains_OneMatching(int count, int position)
62         {
63             Assert.True(ParallelEnumerable.Range(0, count).Contains(position));
64             Assert.True(ParallelEnumerable.Range(0, count).Contains(position, null));
65             Assert.True(ParallelEnumerable.Range(0, count).Contains(position, DelegatingComparer.Create<int>((l, r) => l == position && r == position, i => i.GetHashCode())));
66         }
67 
68         [Theory]
69         [OuterLoop]
70         [MemberData(nameof(OnlyOneData), new int[] { /* Sources.OuterLoopCount */ })]
Contains_OneMatching_Longrunning(int count, int position)71         public static void Contains_OneMatching_Longrunning(int count, int position)
72         {
73             Contains_OneMatching(count, position);
74         }
75 
76         [Fact]
Contains_OperationCanceledException()77         public static void Contains_OperationCanceledException()
78         {
79             AssertThrows.EventuallyCanceled((source, canceler) => source.Contains(-1, new CancelingEqualityComparer<int>(canceler)));
80         }
81 
82         [Fact]
Contains_AggregateException_Wraps_OperationCanceledException()83         public static void Contains_AggregateException_Wraps_OperationCanceledException()
84         {
85             AssertThrows.OtherTokenCanceled((source, canceler) => source.Contains(-1, new CancelingEqualityComparer<int>(canceler)));
86             AssertThrows.SameTokenNotCanceled((source, canceler) => source.Contains(-1, new CancelingEqualityComparer<int>(canceler)));
87         }
88 
89         [Fact]
Contains_OperationCanceledException_PreCanceled()90         public static void Contains_OperationCanceledException_PreCanceled()
91         {
92             AssertThrows.AlreadyCanceled(source => source.Contains(0));
93             AssertThrows.AlreadyCanceled(source => source.Contains(0, EqualityComparer<int>.Default));
94         }
95 
96         [Fact]
Contains_AggregateException()97         public static void Contains_AggregateException()
98         {
99             AssertThrows.Wrapped<DeliberateTestException>(() => ParallelEnumerable.Range(0, 1).Contains(1, new FailingEqualityComparer<int>()));
100         }
101 
102         [Fact]
Contains_ArgumentNullException()103         public static void Contains_ArgumentNullException()
104         {
105             AssertExtensions.Throws<ArgumentNullException>("source", () => ((ParallelQuery<bool>)null).Contains(false));
106             AssertExtensions.Throws<ArgumentNullException>("source", () => ((ParallelQuery<bool>)null).Contains(false, EqualityComparer<bool>.Default));
107         }
108     }
109 }
110