Merge pull request #1586 from vkargov/master
[mono.git] / mcs / class / System.Core / Test / System.Linq / ParallelEnumerableTests.cs
index a11a2d2d1de9ea37083df63429f97802fce1d0e3..d9fac1818d3704bc36d573df94e71dbab5d698f5 100644 (file)
@@ -55,40 +55,10 @@ namespace MonoTests.System.Linq
                {
                        baseEnumerable = Enumerable.Range(1, 1000);
                }
-               
-               void AreEquivalent (IEnumerable<int> syncEnumerable, IEnumerable<int> async_resEnumerable, int count)
-               {
-                       int[] sync  = Enumerable.ToArray(syncEnumerable);
-                       int[] async_res = Enumerable.ToArray(async_resEnumerable);
-                       
-                       // This is not AreEquals because ParallelQuery is non-deterministic (IParallelOrderedEnumerable is)
-                       // thus the order of the initial Enumerable might not be preserved
-                       string error = "";
-
-                       if (sync.Length != async_res.Length)
-                               error = string.Format ("Expected size {0} but got {1} #{2}", sync.Length, async_res.Length, count);
-
-                       Array.Sort (sync);
-                       Array.Sort (async_res);
-                       int i, j;
-                       for (i = j = 0; i < sync.Length && j < async_res.Length; ++i) {
-                               if (sync [i] != async_res [j])
-                                       error += "missing "  + sync [i] + "";
-                               else
-                                       ++j;
-                       }
-                       if (error != "")
-                               Assert.Fail (error);
-               }
-               
-               void AreEquivalent<T> (IEnumerable<T> syncEnumerable, IEnumerable<T> async_resEnumerable, int count)
+
+               static void AreEquivalent (IEnumerable syncEnumerable, IEnumerable async_resEnumerable)
                {
-                       T[] sync  = Enumerable.ToArray(syncEnumerable);
-                       T[] async_res = Enumerable.ToArray(async_resEnumerable);
-                       
-                       // This is not AreEquals because ParallelQuery is non-deterministic (IParallelOrderedEnumerable is)
-                       // thus the order of the initial Enumerable might not be preserved
-                       CollectionAssert.AreEquivalent(sync, async_res, "#" + count);
+                       Assert.That (async_resEnumerable, new NUnit.Framework.Constraints.CollectionEquivalentConstraint (syncEnumerable));
                }
                
                static void AssertAreSame<T> (IEnumerable<T> expected, IEnumerable<T> actual)
@@ -218,7 +188,7 @@ namespace MonoTests.System.Linq
                                IEnumerable<int> sync  = baseEnumerable.Select (i => i * i);
                                IEnumerable<int> async_res = baseEnumerable.AsParallel ().Select (i => i * i);
                                
-                               AreEquivalent(sync, async_res, 1);
+                               AreEquivalent(sync, async_res);
                        });
                }
                        
@@ -229,7 +199,7 @@ namespace MonoTests.System.Linq
                                IEnumerable<int> sync  = baseEnumerable.Where(i => i % 2 == 0);
                                IEnumerable<int> async_res = baseEnumerable.AsParallel().Where(i => i % 2 == 0);
                                
-                               AreEquivalent(sync, async_res, 1);
+                               AreEquivalent(sync, async_res);
                        });
                }
                
@@ -266,7 +236,7 @@ namespace MonoTests.System.Linq
                                int [] second = {2, 4, 6};
                                int [] result = {0, 1, 3, 5};
        
-                               AreEquivalent (result, first.AsReallyParallel ().Except (second.AsParallel ()), 1);
+                               AreEquivalent (result, first.AsReallyParallel ().Except (second.AsParallel ()));
                        });
                }
 
@@ -278,7 +248,7 @@ namespace MonoTests.System.Linq
                                int [] second = {2, 4, 6};
                                int [] result = {2, 4};
        
-                               AreEquivalent (result, first.AsReallyParallel ().Intersect (second.AsParallel ()), 1);
+                               AreEquivalent (result, first.AsReallyParallel ().Intersect (second.AsParallel ()));
                        });
                }
 
@@ -290,7 +260,7 @@ namespace MonoTests.System.Linq
                                int [] second = {2, 4, 6};
                                int [] result = {0, 1, 2, 3, 4, 5, 6};
                                
-                               AreEquivalent (result, first.AsReallyParallel ().Union (second.AsParallel ()), 1);
+                               AreEquivalent (result, first.AsReallyParallel ().Union (second.AsParallel ()));
                        });
                }
 
@@ -301,8 +271,13 @@ namespace MonoTests.System.Linq
                                int [] first = Enumerable.Range (1, 10000).ToArray ();
                                int [] second = Enumerable.Range (323, 757).ToArray ();
 
-                               AreEquivalent (first, first.AsReallyParallel ().Union (second.AsParallel ()), 1);
-                       }, 10);
+                               var expected = first;
+                               var actual = first.AsReallyParallel ().Union (second.AsParallel ()).ToArray ();
+                               // Work around quadratic behavior in NUnitLite's CollectionTally class
+                               Array.Sort (expected);
+                               Array.Sort (actual);
+                               AreEquivalent (expected, actual);
+                       });
                }
 
                [Test]
@@ -312,8 +287,8 @@ namespace MonoTests.System.Linq
                                int [] first = Enumerable.Range (1, 10000).ToArray ();
                                int [] second = Enumerable.Range (323, 757).ToArray ();
 
-                               AreEquivalent (second, first.AsReallyParallel ().Intersect (second.AsParallel ()), 1);
-                       }, 10);
+                               AreEquivalent (second, first.AsReallyParallel ().Intersect (second.AsParallel ()));
+                       });
                }
                
                class Foo {}
@@ -329,7 +304,7 @@ namespace MonoTests.System.Linq
                        Foo [] foos = new Foo [] {a, b, c};
                        Bar [] result = new Bar [] {a, b, c};
 
-                       AreEquivalent (result, foos.AsReallyParallel ().Cast<Bar> (), 1);
+                       AreEquivalent (result, foos.AsReallyParallel ().Cast<Bar> ());
                }
                
                [Test]
@@ -338,7 +313,7 @@ namespace MonoTests.System.Linq
                        int [] data = {0, 1, 2, 3, 4, 5};
                        int [] result = {3, 4, 5};
 
-                       AssertAreSame (result, data.AsReallyParallel ().AsOrdered ().Skip (3).ToArray ());
+                       AssertAreSame (result, data.AsParallel ().AsOrdered ().Skip (3).ToArray ());
                }
                
                [Test]
@@ -347,7 +322,7 @@ namespace MonoTests.System.Linq
                        int [] data = {0, 1, 2, 3, 4, 5};
                        int [] result = {3, 4, 5};
 
-                       AssertAreSame (result, data.AsReallyParallel ().AsOrdered ().Skip (3));
+                       AssertAreSame (result, data.AsParallel ().AsOrdered ().Skip (3));
                }
 
                [Test]
@@ -356,7 +331,7 @@ namespace MonoTests.System.Linq
                        int [] data = {0, 1, 2, 3, 4, 5};
                        int [] result = {3, 4, 5};
 
-                       AssertAreSame (result, data.AsReallyParallel ().AsOrdered ().SkipWhile (i => i < 3));
+                       AssertAreSame (result, data.AsParallel ().AsOrdered ().SkipWhile (i => i < 3));
                }
 
                [Test]
@@ -365,7 +340,7 @@ namespace MonoTests.System.Linq
                        int [] data = {0, 1, 2, 3, 4, 5};
                        int [] result = {0, 1, 2};
 
-                       AssertAreSame (result, data.AsReallyParallel ().AsOrdered ().Take (3));
+                       AssertAreSame (result, data.AsParallel ().AsOrdered ().Take (3));
                }
 
                [Test]
@@ -374,7 +349,7 @@ namespace MonoTests.System.Linq
                        int [] data = {0, 1, 2, 3, 4, 5};
                        int [] result = {0, 1, 2};
 
-                       AssertAreSame (result, data.AsReallyParallel ().AsOrdered ().TakeWhile (i => i < 3));
+                       AssertAreSame (result, data.AsParallel ().AsOrdered ().TakeWhile (i => i < 3));
                }
 
                [Test]
@@ -385,7 +360,7 @@ namespace MonoTests.System.Linq
 
                        ParallelTestHelper.Repeat (() => {
                                        var actual = initial.AsReallyParallel ().SelectMany ((i) => Enumerable.Range (1, i));
-                                       AreEquivalent (expected, actual, 1);
+                                       AreEquivalent (expected, actual);
                                });
                }
 
@@ -396,7 +371,7 @@ namespace MonoTests.System.Linq
                        IEnumerable<int> expected = initial.SelectMany ((i) => Enumerable.Range (1, i));
 
                        ParallelTestHelper.Repeat (() => {
-                                       var actual = initial.AsReallyParallel ().AsOrdered ().SelectMany ((i) => Enumerable.Range (1, i));
+                                       var actual = initial.AsParallel ().AsOrdered ().SelectMany ((i) => Enumerable.Range (1, i));
                                        AssertAreSame (expected, actual);
                                });
                }
@@ -406,7 +381,7 @@ namespace MonoTests.System.Linq
                {
                        int [] data = {1, 2, 3};
 
-                       Assert.AreEqual (3, data.AsReallyParallel ().AsOrdered ().Last ());
+                       Assert.AreEqual (3, data.AsParallel ().AsOrdered ().Last ());
                }
 
                [Test]
@@ -414,7 +389,7 @@ namespace MonoTests.System.Linq
                {
                        int [] data = {};
 
-                       Assert.AreEqual (default (int), data.AsReallyParallel ().AsOrdered ().LastOrDefault ());
+                       Assert.AreEqual (default (int), data.AsParallel ().AsOrdered ().LastOrDefault ());
                }
 
                [Test]
@@ -422,7 +397,7 @@ namespace MonoTests.System.Linq
                {
                        int [] data = {1, 2, 3};
 
-                       Assert.AreEqual (1, data.AsReallyParallel ().AsOrdered ().First ());
+                       Assert.AreEqual (1, data.AsParallel ().AsOrdered ().First ());
                }
 
                [Test]
@@ -430,7 +405,7 @@ namespace MonoTests.System.Linq
                {
                        int [] data = {};
 
-                       Assert.AreEqual (default (int), data.AsReallyParallel ().AsOrdered ().FirstOrDefault ());
+                       Assert.AreEqual (default (int), data.AsParallel ().AsOrdered ().FirstOrDefault ());
                }
                
                [Test]
@@ -439,8 +414,8 @@ namespace MonoTests.System.Linq
                        int [] data = {0, 1, 2, 3, 4};
                        int [] result = {4, 3, 2, 1, 0};
 
-                       AssertAreSame (result, ((IEnumerable<int>)data).Select ((i) => i).AsReallyParallel ().AsOrdered ().Reverse ());
-                       AssertAreSame (result, ParallelEnumerable.Range (0, 5).AsReallyParallel ().AsOrdered ().Reverse ());
+                       AssertAreSame (result, ((IEnumerable<int>)data).Select ((i) => i).AsParallel ().AsOrdered ().Reverse ());
+                       AssertAreSame (result, ParallelEnumerable.Range (0, 5).AsParallel ().AsOrdered ().Reverse ());
                }
                
                [Test]
@@ -586,9 +561,9 @@ namespace MonoTests.System.Linq
                public void ElementAtTestCase()
                {
                        //ParallelTestHelper.Repeat (() => {
-                                       Assert.AreEqual(1, baseEnumerable.AsReallyParallel ().AsOrdered ().ElementAt(0), "#1");
-                                       Assert.AreEqual(51, baseEnumerable.AsReallyParallel ().AsOrdered ().ElementAt(50), "#2");
-                                       Assert.AreEqual(489, baseEnumerable.AsReallyParallel ().AsOrdered ().ElementAt(488), "#3");
+                                       Assert.AreEqual(1, baseEnumerable.AsParallel ().AsOrdered ().ElementAt(0), "#1");
+                                       Assert.AreEqual(51, baseEnumerable.AsParallel ().AsOrdered ().ElementAt(50), "#2");
+                                       Assert.AreEqual(489, baseEnumerable.AsParallel ().AsOrdered ().ElementAt(488), "#3");
                        //});
                }
 
@@ -607,7 +582,7 @@ namespace MonoTests.System.Linq
                                                                                            (e) => e.Item1,
                                                                                            (e1, e2) => e1.Item2 + e2.Item2,
                                                                                            EqualityComparer<int>.Default);
-                               AreEquivalent (expected, actual, 1);
+                               AreEquivalent (expected, actual);
                        });
                }
 
@@ -616,12 +591,11 @@ namespace MonoTests.System.Linq
                {
                        var items = new [] { 1, 2, 3 };
                        var items2 = new [] { 1, 2, 3, 4 };
-                       var actual = items.AsReallyParallel ().Join (items2.AsReallyParallel (), i => i, i => i, (e1, e2) => e1 + e2);
-                       AreEquivalent (new[] { 2, 4, 6 }, actual, 1);
+                       var actual = items.AsReallyParallel ().Join (items2.AsParallel (), i => i, i => i, (e1, e2) => e1 + e2);
+                       AreEquivalent (new[] { 2, 4, 6 }, actual);
                }
 
                [Test]
-               [Category ("NotWorking")] // Deadlocks randomly
                public void TestGroupBy ()
                {
                        int num = 100;
@@ -630,14 +604,14 @@ namespace MonoTests.System.Linq
                        ParallelTestHelper.Repeat (() => {
                                ParallelQuery<IGrouping<int, int>> actual = source.AsReallyParallel ().GroupBy ((e) => e.Item1, (e) => e.Item2, EqualityComparer<int>.Default);
                                foreach (var group in actual) {
-                                       Assert.GreaterOrEqual (group.Key, 0);
-                                       Assert.Less (group.Key, num / 10);
+                                       Assert.IsTrue (group.Key >= 0);
+                                       Assert.IsTrue (group.Key < num / 10);
 
                                        int count = 0;
                                        foreach (var e in group) {
                                                count++;
-                                               Assert.GreaterOrEqual (e, group.Key * 10);
-                                               Assert.Less (e, (group.Key + 1) * 10);
+                                               Assert.IsTrue (e >= group.Key * 10);
+                                               Assert.IsTrue (e <  (group.Key + 1) * 10);
                                        }
 
                                        Assert.AreEqual (10, count, "count");
@@ -649,15 +623,15 @@ namespace MonoTests.System.Linq
                public void TakeTestCase()
                {
                        ParallelTestHelper.Repeat (() => {
-                               ParallelQuery<int> async_res = baseEnumerable.AsReallyParallel ().AsOrdered ().Take(800);
+                               ParallelQuery<int> async_res = baseEnumerable.AsParallel ().AsOrdered ().Take(800);
                                IEnumerable<int> sync = baseEnumerable.Take(800);
 
-                               AreEquivalent(sync, async_res, 1);
+                               AreEquivalent(sync, async_res);
 
-                               async_res = baseEnumerable.AsReallyParallel ().AsOrdered ().Take(100);
+                               async_res = baseEnumerable.AsParallel ().AsOrdered ().Take(100);
                                sync = baseEnumerable.Take(100);
 
-                               AreEquivalent(sync, async_res, 2);
+                               AreEquivalent(sync, async_res);
                        });
                }
 
@@ -681,10 +655,10 @@ namespace MonoTests.System.Linq
                public void SkipTestCase()
                {
                        ParallelTestHelper.Repeat (() => {
-                               ParallelQuery<int> async_res = baseEnumerable.AsReallyParallel ().AsOrdered().Skip (800);
+                               ParallelQuery<int> async_res = baseEnumerable.AsParallel ().AsOrdered().Skip (800);
                                IEnumerable<int> sync = baseEnumerable.Skip (800);
                                
-                               AreEquivalent (sync, async_res, 1);
+                               AreEquivalent (sync, async_res);
                        });
                }
 
@@ -696,7 +670,7 @@ namespace MonoTests.System.Linq
                                var sync = baseEnumerable.Skip(100);
                                
                                Assert.AreEqual (sync.Count (), async_res.Count ());
-                       }, 20);
+                       });
                }
 
                [Test]
@@ -705,23 +679,38 @@ namespace MonoTests.System.Linq
                        ParallelTestHelper.Repeat (() => {
                                ParallelQuery<int> async_res1 = ParallelEnumerable.Range(0, 10000);
                                ParallelQuery<int> async_res2 = ParallelEnumerable.Repeat(1, 10000).Zip(async_res1, (e1, e2) => e1 + e2);
-                               
+
                                int[] expected = Enumerable.Range (1, 10000).ToArray ();
-                               CollectionAssert.AreEquivalent(expected, Enumerable.ToArray (async_res2), "#1");
+                               var actual = Enumerable.ToArray (async_res2);
+                               // Work around quadratic behavior in NUnitLite's CollectionTally class
+                               Array.Sort (expected);
+                               Array.Sort (actual);
+                               AreEquivalent(expected, actual);
                        });
                }
                
                [Test]
-               public void RangeTestCase ()
+               public void Range ()
                {
                        ParallelTestHelper.Repeat (() => {
                                IEnumerable<int> sync  = Enumerable.Range(1, 1000);
                                IEnumerable<int> async_res = ParallelEnumerable.Range(1, 1000);
                                
-                               AreEquivalent (sync, async_res, 1);
+                               AreEquivalent (sync, async_res);
                        });
                }
-               
+       
+               [Test]
+               public void Range_StartOffset ()
+               {
+                       ParallelTestHelper.Repeat (() => {
+                               IEnumerable<int> sync  = Enumerable.Range (30, 10);
+                               IEnumerable<int> async_res = ParallelEnumerable.Range (30, 10);
+                               
+                               AreEquivalent (sync, async_res);
+                       });
+               }
+
                [Test]
                public void RepeatTestCase ()
                {
@@ -729,7 +718,7 @@ namespace MonoTests.System.Linq
                                IEnumerable<int> sync  = Enumerable.Repeat(1, 1000);
                                IEnumerable<int> async_res = ParallelEnumerable.Repeat(1, 1000);
                                
-                               AreEquivalent (sync, async_res, 1);
+                               AreEquivalent (sync, async_res);
                        });
                }
                
@@ -788,14 +777,14 @@ namespace MonoTests.System.Linq
 
                        int [] result = {0, 1, 2};
 
-                       var array = coll.AsReallyParallel ().AsOrdered().ToArray ();
+                       var array = coll.AsParallel ().AsOrdered().ToArray ();
 
                        AssertAreSame (result, array);
                        AssertIsOrdered (array, result.Length);
 
                        Assert.AreEqual (typeof (int []), array.GetType ());
 
-                       array = Enumerable.Range (1, 100).Select ((i) => i).AsReallyParallel ().AsOrdered().ToArray ();
+                       array = Enumerable.Range (1, 100).Select ((i) => i).AsParallel ().AsOrdered().ToArray ();
                        result = Enumerable.Range (1, 100).ToArray ();
 
                        AssertAreSame (result, array);
@@ -812,7 +801,7 @@ namespace MonoTests.System.Linq
 
                        var list = data.AsReallyParallel ().ToList ();
 
-                       CollectionAssert.AreEquivalent (data, list);
+                       AreEquivalent (data, list);
 
                        Assert.AreEqual (typeof (List<int>), list.GetType ());
                }
@@ -829,7 +818,7 @@ namespace MonoTests.System.Linq
 
                        var array = coll.AsReallyParallel ().ToArray ();
 
-                       CollectionAssert.AreEquivalent (result, array);
+                       AreEquivalent (result, array);
 
                        Assert.AreEqual (typeof (int []), array.GetType ());
                }
@@ -907,12 +896,12 @@ namespace MonoTests.System.Linq
                        var data2 = new int[] { 1, 2, 4 };
                        var data3 = new int[] { 1, 2, 3, 4 };
 
-                       Assert.IsTrue (data1.AsReallyParallel ().SequenceEqual (data1.AsReallyParallel ()));
-                       Assert.IsTrue (data2.AsReallyParallel ().SequenceEqual (data2.AsReallyParallel ()));
-                       Assert.IsTrue (data3.AsReallyParallel ().SequenceEqual (data3.AsReallyParallel ()));
-                       Assert.IsFalse (data1.AsReallyParallel ().SequenceEqual (data2.AsReallyParallel ()));
-                       Assert.IsFalse (data1.AsReallyParallel ().SequenceEqual (data3.AsReallyParallel ()));
-                       Assert.IsFalse (data2.AsReallyParallel ().SequenceEqual (data3.AsReallyParallel ()));
+                       Assert.IsTrue (data1.AsParallel ().SequenceEqual (data1.AsParallel ()));
+                       Assert.IsTrue (data2.AsParallel ().SequenceEqual (data2.AsParallel ()));
+                       Assert.IsTrue (data3.AsParallel ().SequenceEqual (data3.AsParallel ()));
+                       Assert.IsFalse (data1.AsParallel ().SequenceEqual (data2.AsParallel ()));
+                       Assert.IsFalse (data1.AsParallel ().SequenceEqual (data3.AsParallel ()));
+                       Assert.IsFalse (data2.AsParallel ().SequenceEqual (data3.AsParallel ()));
                }
 
                [Test]