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 AsEnumerableTests 11 { 12 [Theory] 13 [MemberData(nameof(UnorderedSources.Ranges), new[] { 0, 1, 2, 16 }, MemberType = typeof(UnorderedSources))] AsEnumerable_Unordered(Labeled<ParallelQuery<int>> labeled, int count)14 public static void AsEnumerable_Unordered(Labeled<ParallelQuery<int>> labeled, int count) 15 { 16 IntegerRangeSet seen = new IntegerRangeSet(0, count); 17 IEnumerable<int> enumerable = labeled.Item.AsEnumerable(); 18 Assert.All(enumerable, x => seen.Add(x)); 19 seen.AssertComplete(); 20 } 21 22 [Theory] 23 [OuterLoop] 24 [MemberData(nameof(UnorderedSources.OuterLoopRanges), MemberType = typeof(UnorderedSources))] AsEnumerable_Unordered_Longrunning(Labeled<ParallelQuery<int>> labeled, int count)25 public static void AsEnumerable_Unordered_Longrunning(Labeled<ParallelQuery<int>> labeled, int count) 26 { 27 AsEnumerable_Unordered(labeled, count); 28 } 29 30 [Theory] 31 [MemberData(nameof(Sources.Ranges), new[] { 0, 1, 2, 16 }, MemberType = typeof(Sources))] AsEnumerable(Labeled<ParallelQuery<int>> labeled, int count)32 public static void AsEnumerable(Labeled<ParallelQuery<int>> labeled, int count) 33 { 34 int seen = 0; 35 IEnumerable<int> enumerable = labeled.Item.AsEnumerable(); 36 Assert.All(enumerable, x => Assert.Equal(seen++, x)); 37 Assert.Equal(count, seen); 38 } 39 40 [Theory] 41 [OuterLoop] 42 [MemberData(nameof(Sources.OuterLoopRanges), MemberType = typeof(Sources))] AsEnumerable_Longrunning(Labeled<ParallelQuery<int>> labeled, int count)43 public static void AsEnumerable_Longrunning(Labeled<ParallelQuery<int>> labeled, int count) 44 { 45 AsEnumerable(labeled, count); 46 } 47 48 [Theory] 49 [MemberData(nameof(Sources.Ranges), new[] { 0, 16 }, MemberType = typeof(Sources))] AsEnumerable_LinqBinding(Labeled<ParallelQuery<int>> labeled, int count)50 public static void AsEnumerable_LinqBinding(Labeled<ParallelQuery<int>> labeled, int count) 51 { 52 IEnumerable<int> enumerable = labeled.Item.AsEnumerable(); 53 54 // The LINQ Cast<T>() retains origin type for ParallelEnumerable and Partitioner when unordered, 55 // (and all when ordered, due to the extra wrapper) 56 // although aliased as IEnumerable<T>, so further LINQ calls work as expected. 57 // If this test starts failing, update this test, and maybe mention it in release notes. 58 Assert.IsNotType<ParallelQuery<int>>(enumerable.Cast<int>()); 59 Assert.True(enumerable.Cast<int>() is ParallelQuery<int>); 60 61 Assert.False(enumerable.Concat(Enumerable.Range(0, count)) is ParallelQuery<int>); 62 Assert.False(enumerable.DefaultIfEmpty() is ParallelQuery<int>); 63 Assert.False(enumerable.Distinct() is ParallelQuery<int>); 64 Assert.False(enumerable.Except(Enumerable.Range(0, count)) is ParallelQuery<int>); 65 Assert.False(enumerable.GroupBy(x => x) is ParallelQuery<int>); 66 Assert.False(enumerable.GroupJoin(Enumerable.Range(0, count), x => x, y => y, (x, g) => x) is ParallelQuery<int>); 67 Assert.False(enumerable.Intersect(Enumerable.Range(0, count)) is ParallelQuery<int>); 68 Assert.False(enumerable.Join(Enumerable.Range(0, count), x => x, y => y, (x, y) => x) is ParallelQuery<int>); 69 Assert.False(enumerable.OfType<int>() is ParallelQuery<int>); 70 Assert.False(enumerable.OrderBy(x => x) is ParallelQuery<int>); 71 Assert.False(enumerable.OrderByDescending(x => x) is ParallelQuery<int>); 72 Assert.False(enumerable.Reverse() is ParallelQuery<int>); 73 Assert.False(enumerable.Select(x => x) is ParallelQuery<int>); 74 Assert.False(enumerable.SelectMany(x => new[] { x }) is ParallelQuery<int>); 75 Assert.False(enumerable.Skip(count / 2) is ParallelQuery<int>); 76 Assert.False(enumerable.SkipWhile(x => true) is ParallelQuery<int>); 77 Assert.False(enumerable.Take(count / 2) is ParallelQuery<int>); 78 Assert.False(enumerable.TakeWhile(x => true) is ParallelQuery<int>); 79 Assert.False(enumerable.Union(Enumerable.Range(0, count)) is ParallelQuery<int>); 80 Assert.False(enumerable.Where(x => true) is ParallelQuery<int>); 81 Assert.False(enumerable.Zip(Enumerable.Range(0, count), (x, y) => x) is ParallelQuery<int>); 82 } 83 84 [Fact] AsEnumerable_ArgumentNullException()85 public static void AsEnumerable_ArgumentNullException() 86 { 87 AssertExtensions.Throws<ArgumentNullException>("source", () => ((ParallelQuery<int>)null).AsEnumerable()); 88 } 89 } 90 } 91