Bug 15572. Lookup KnownTypeCollection element types in MSSimpleNamespace
[mono.git] / mcs / class / System.Core / Test / System.Linq / ParallelEnumerableTests.cs
index dd6179d32372a9edd292c1c537f553e2fea8fdd6..f48deafc490cefbc6a70907fb7e0690af404acfa 100644 (file)
@@ -53,27 +53,12 @@ namespace MonoTests.System.Linq
                [SetUpAttribute]
                public void Setup ()
                {
-                       baseEnumerable = Enumerable.Range(1, 10000);
+                       baseEnumerable = Enumerable.Range(1, 1000);
                }
-               
-               void AreEquivalent (IEnumerable<int> syncEnumerable, IEnumerable<int> asyncEnumerable, int count)
-               {
-                       int[] sync  = Enumerable.ToArray(syncEnumerable);
-                       int[] async = Enumerable.ToArray(asyncEnumerable);
-                       
-                       // 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, "#" + count);
-               }
-               
-               void AreEquivalent<T> (IEnumerable<T> syncEnumerable, IEnumerable<T> asyncEnumerable, int count)
+
+               static void AreEquivalent (IEnumerable syncEnumerable, IEnumerable async_resEnumerable)
                {
-                       T[] sync  = Enumerable.ToArray(syncEnumerable);
-                       T[] async = Enumerable.ToArray(asyncEnumerable);
-                       
-                       // 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, "#" + count);
+                       Assert.That (async_resEnumerable, new NUnit.Framework.Constraints.CollectionEquivalentConstraint (syncEnumerable));
                }
                
                static void AssertAreSame<T> (IEnumerable<T> expected, IEnumerable<T> actual)
@@ -201,9 +186,9 @@ namespace MonoTests.System.Linq
                {
                        ParallelTestHelper.Repeat (() => {
                                IEnumerable<int> sync  = baseEnumerable.Select (i => i * i);
-                               IEnumerable<int> async = baseEnumerable.AsParallel ().Select (i => i * i);
+                               IEnumerable<int> async_res = baseEnumerable.AsParallel ().Select (i => i * i);
                                
-                               AreEquivalent(sync, async, 1);
+                               AreEquivalent(sync, async_res);
                        });
                }
                        
@@ -212,9 +197,9 @@ namespace MonoTests.System.Linq
                {
                        ParallelTestHelper.Repeat (() => {
                                IEnumerable<int> sync  = baseEnumerable.Where(i => i % 2 == 0);
-                               IEnumerable<int> async = baseEnumerable.AsParallel().Where(i => i % 2 == 0);
+                               IEnumerable<int> async_res = baseEnumerable.AsParallel().Where(i => i % 2 == 0);
                                
-                               AreEquivalent(sync, async, 1);
+                               AreEquivalent(sync, async_res);
                        });
                }
                
@@ -223,9 +208,9 @@ namespace MonoTests.System.Linq
                {
                        ParallelTestHelper.Repeat (() => {
                                int sync  = baseEnumerable.Count();
-                               int async = baseEnumerable.AsParallel().Count();
+                               int async_res = baseEnumerable.AsParallel().Count();
                                
-                               Assert.AreEqual(sync, async, "#1");
+                               Assert.AreEqual(sync, async_res, "#1");
                        });
                }
                
@@ -251,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 ()));
                        });
                }
 
@@ -263,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 ()));
                        });
                }
 
@@ -275,7 +260,29 @@ 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 ()));
+                       });
+               }
+
+               [Test]
+               public void TestBigUnion ()
+               {
+                       ParallelTestHelper.Repeat (() => {
+                               int [] first = Enumerable.Range (1, 10000).ToArray ();
+                               int [] second = Enumerable.Range (323, 757).ToArray ();
+
+                               AreEquivalent (first, first.AsReallyParallel ().Union (second.AsParallel ()));
+                       });
+               }
+
+               [Test]
+               public void TestBigIntersect ()
+               {
+                       ParallelTestHelper.Repeat (() => {
+                               int [] first = Enumerable.Range (1, 10000).ToArray ();
+                               int [] second = Enumerable.Range (323, 757).ToArray ();
+
+                               AreEquivalent (second, first.AsReallyParallel ().Intersect (second.AsParallel ()));
                        });
                }
                
@@ -292,7 +299,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]
@@ -348,7 +355,7 @@ namespace MonoTests.System.Linq
 
                        ParallelTestHelper.Repeat (() => {
                                        var actual = initial.AsReallyParallel ().SelectMany ((i) => Enumerable.Range (1, i));
-                                       AreEquivalent (expected, actual, 1);
+                                       AreEquivalent (expected, actual);
                                });
                }
 
@@ -361,7 +368,7 @@ namespace MonoTests.System.Linq
                        ParallelTestHelper.Repeat (() => {
                                        var actual = initial.AsReallyParallel ().AsOrdered ().SelectMany ((i) => Enumerable.Range (1, i));
                                        AssertAreSame (expected, actual);
-                               }, 5);
+                               });
                }
                
                [Test]
@@ -403,7 +410,7 @@ namespace MonoTests.System.Linq
                        int [] result = {4, 3, 2, 1, 0};
 
                        AssertAreSame (result, ((IEnumerable<int>)data).Select ((i) => i).AsReallyParallel ().AsOrdered ().Reverse ());
-                       AssertAreSame (result, ParallelEnumerable.Range (0, 5).WithExecutionMode (ParallelExecutionMode.ForceParallelism).AsOrdered ().Reverse ());
+                       AssertAreSame (result, ParallelEnumerable.Range (0, 5).AsReallyParallel ().AsOrdered ().Reverse ());
                }
                
                [Test]
@@ -545,7 +552,7 @@ namespace MonoTests.System.Linq
                }
                
                
-               [TestAttribute]
+               [Test]
                public void ElementAtTestCase()
                {
                        //ParallelTestHelper.Repeat (() => {
@@ -565,122 +572,145 @@ namespace MonoTests.System.Linq
                        IEnumerable<int> expected = outer.Join (inner, (e) => e.Item1, (e) => e.Item1, (e1, e2) => e1.Item2 + e2.Item2, EqualityComparer<int>.Default);
 
                        ParallelTestHelper.Repeat (() => {
-                                       ParallelQuery<int> actual = outer.AsReallyParallel ().Join (inner.AsParallel (), (e) => e.Item1, (e) => e.Item1, (e1, e2) => e1.Item2 + e2.Item2, EqualityComparer<int>.Default);
+                               ParallelQuery<int> actual = outer.AsReallyParallel ().Join (inner.AsParallel (),
+                                                                                           (e) => e.Item1,
+                                                                                           (e) => e.Item1,
+                                                                                           (e1, e2) => e1.Item2 + e2.Item2,
+                                                                                           EqualityComparer<int>.Default);
+                               AreEquivalent (expected, actual);
+                       });
+               }
 
-                                       AreEquivalent (expected, actual, 1);
-                               });
+               [Test]
+               public void SmallJoinTest ()
+               {
+                       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);
                }
 
                [Test]
+               [Category ("NotWorking")] // Deadlocks randomly
                public void TestGroupBy ()
                {
                        int num = 100;
                        Tuple<int, int>[] source = Enumerable.Range (0, num).Select ((i) => Tuple.Create (i / 10, i)).ToArray ();
 
                        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);
-
-                                               int count = 0;
-                                               foreach (var e in group) {
-                                                       count++;
-                                                       Assert.GreaterOrEqual (e, group.Key * 10);
-                                                       Assert.Less (e, (group.Key + 1) * 10);
-                                               }
-
-                                               Assert.AreEqual (10, count, "count");
+                               ParallelQuery<IGrouping<int, int>> actual = source.AsReallyParallel ().GroupBy ((e) => e.Item1, (e) => e.Item2, EqualityComparer<int>.Default);
+                               foreach (var group in actual) {
+                                       Assert.IsTrue (group.Key >= 0);
+                                       Assert.IsTrue (group.Key < num / 10);
+
+                                       int count = 0;
+                                       foreach (var e in group) {
+                                               count++;
+                                               Assert.IsTrue (e >= group.Key * 10);
+                                               Assert.IsTrue (e <  (group.Key + 1) * 10);
                                        }
-                               });
+
+                                       Assert.AreEqual (10, count, "count");
+                               }
+                       });
                }
                
-               [TestAttribute]
+               [Test]
                public void TakeTestCase()
                {
                        ParallelTestHelper.Repeat (() => {
-                                       ParallelQuery<int> async = baseEnumerable.AsReallyParallel ().AsOrdered ().Take(2000);
-                                       IEnumerable<int> sync = baseEnumerable.Take(2000);
+                               ParallelQuery<int> async_res = baseEnumerable.AsReallyParallel ().AsOrdered ().Take(800);
+                               IEnumerable<int> sync = baseEnumerable.Take(800);
 
-                                       AreEquivalent(sync, async, 1);
+                               AreEquivalent(sync, async_res);
 
-                                       async = baseEnumerable.AsReallyParallel ().AsOrdered ().Take(100);
-                                       sync = baseEnumerable.Take(100);
+                               async_res = baseEnumerable.AsReallyParallel ().AsOrdered ().Take(100);
+                               sync = baseEnumerable.Take(100);
 
-                                       AreEquivalent(sync, async, 2);
-                               }, 20);
+                               AreEquivalent(sync, async_res);
+                       });
                }
 
                [TestAttribute]
                public void UnorderedTakeTestCase()
                {
                        ParallelTestHelper.Repeat (() => {
-                                       ParallelQuery<int> async = baseEnumerable.AsReallyParallel ().Take(2000);
-                                       IEnumerable<int> sync = baseEnumerable.Take (2000);
+                               ParallelQuery<int> async_res = baseEnumerable.AsReallyParallel ().Take(800);
+                               IEnumerable<int> sync = baseEnumerable.Take (800);
 
-                                       Assert.AreEqual (sync.Count (), async.Count (), "#1");
+                               Assert.AreEqual (sync.Count (), async_res.Count (), "#1");
 
-                                       async = baseEnumerable.AsReallyParallel ().Take(100);
-                                       sync = baseEnumerable.Take(100);
+                               async_res = baseEnumerable.AsReallyParallel ().Take(100);
+                               sync = baseEnumerable.Take(100);
 
-                                       Assert.AreEqual (sync.Count (), async.Count (), "#2");
-                               }, 20);
+                               Assert.AreEqual (sync.Count (), async_res.Count (), "#2");
+                       });
                }
                
                [Test]
                public void SkipTestCase()
                {
                        ParallelTestHelper.Repeat (() => {
-                               ParallelQuery<int> async = baseEnumerable.AsReallyParallel ().AsOrdered().Skip(2000);
-                               IEnumerable<int> sync = baseEnumerable.Skip(2000);
+                               ParallelQuery<int> async_res = baseEnumerable.AsReallyParallel ().AsOrdered().Skip (800);
+                               IEnumerable<int> sync = baseEnumerable.Skip (800);
                                
-                               AreEquivalent(sync, async, 1);
-                       }, 20);
+                               AreEquivalent (sync, async_res);
+                       });
                }
 
                [Test]
                public void SkipTestCaseSmall ()
                {
                        ParallelTestHelper.Repeat (() => {
-                               var async = baseEnumerable.AsReallyParallel ().Skip(100);
+                               var async_res = baseEnumerable.AsReallyParallel ().Skip(100);
                                var sync = baseEnumerable.Skip(100);
                                
-                               Assert.AreEqual (sync.Count (), async.Count ());
-                       }, 20);
+                               Assert.AreEqual (sync.Count (), async_res.Count ());
+                       });
                }
 
                [Test]
                public void ZipTestCase()
                {
                        ParallelTestHelper.Repeat (() => {
-                               ParallelQuery<int> async1 = ParallelEnumerable.Range(0, 10000);
-                               ParallelQuery<int> async2 = ParallelEnumerable.Repeat(1, 10000).Zip(async1, (e1, e2) => e1 + e2);
+                               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 (async2), "#1");
+                               AreEquivalent(expected, Enumerable.ToArray (async_res2));
                        });
                }
                
                [Test]
-               public void RangeTestCase ()
+               public void Range ()
                {
                        ParallelTestHelper.Repeat (() => {
                                IEnumerable<int> sync  = Enumerable.Range(1, 1000);
-                               IEnumerable<int> async = ParallelEnumerable.Range(1, 1000);
+                               IEnumerable<int> async_res = ParallelEnumerable.Range(1, 1000);
                                
-                               AreEquivalent (sync, async, 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 ()
                {
                        ParallelTestHelper.Repeat (() => {
                                IEnumerable<int> sync  = Enumerable.Repeat(1, 1000);
-                               IEnumerable<int> async = ParallelEnumerable.Repeat(1, 1000);
+                               IEnumerable<int> async_res = ParallelEnumerable.Repeat(1, 1000);
                                
-                               AreEquivalent (sync, async, 1);
+                               AreEquivalent (sync, async_res);
                        });
                }
                
@@ -763,7 +793,7 @@ namespace MonoTests.System.Linq
 
                        var list = data.AsReallyParallel ().ToList ();
 
-                       CollectionAssert.AreEquivalent (data, list);
+                       AreEquivalent (data, list);
 
                        Assert.AreEqual (typeof (List<int>), list.GetType ());
                }
@@ -780,7 +810,7 @@ namespace MonoTests.System.Linq
 
                        var array = coll.AsReallyParallel ().ToArray ();
 
-                       CollectionAssert.AreEquivalent (result, array);
+                       AreEquivalent (result, array);
 
                        Assert.AreEqual (typeof (int []), array.GetType ());
                }
@@ -850,6 +880,35 @@ namespace MonoTests.System.Linq
                        Assert.IsFalse (data.AsReallyParallel ().All (x => x != 1));
                        Assert.IsTrue (empty.AsReallyParallel ().All (x => false));
                }
+
+               [Test]
+               public void SequenceEqualsTest ()
+               {
+                       var data1 = new int[] { 1, 2, 3 };
+                       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 ()));
+               }
+
+               [Test]
+               public void ContainsTest ()
+               {
+                       var data1 = new int[] { 1, 2, 3 };
+                       var data2 = new int[] { 1, 2, 4 };
+                       var data3 = new int[] { 1, 2, 3, 4 };
+
+                       Assert.IsTrue (data1.AsReallyParallel ().Contains (3));
+                       Assert.IsFalse (data2.AsReallyParallel ().Contains (3));
+                       Assert.IsTrue (data3.AsReallyParallel ().Contains (3));
+                       Assert.IsFalse (data3.AsReallyParallel ().Contains (5));
+                       Assert.IsTrue (data2.AsReallyParallel ().Contains (2));
+               }
        }
 }