Browse Source

Merge pull request #171 from RyotaMurohoshi/fix_catch

Fix Ix Catch method invalid behaviour with Array.
Bart J.F. De Smet 9 years ago
parent
commit
184b5c081f

+ 6 - 10
Ix.NET/Source/System.Interactive/EnumerableEx.Exceptions.cs

@@ -37,12 +37,13 @@ namespace System.Linq
             {
                 while (true)
                 {
-                    var b = default(bool);
                     var c = default(TSource);
 
                     try
                     {
-                        b = e.MoveNext();
+                        if (!e.MoveNext())
+                            break;
+
                         c = e.Current;
                     }
                     catch (TException ex)
@@ -51,9 +52,6 @@ namespace System.Linq
                         break;
                     }
 
-                    if (!b)
-                        break;
-
                     yield return c;
                 }
             }
@@ -122,12 +120,13 @@ namespace System.Linq
 
                     while (true)
                     {
-                        var b = default(bool);
                         var c = default(TSource);
 
                         try
                         {
-                            b = e.MoveNext();
+                            if (!e.MoveNext())
+                                break;
+
                             c = e.Current;
                         }
                         catch (Exception ex)
@@ -136,9 +135,6 @@ namespace System.Linq
                             break;
                         }
 
-                        if (!b)
-                            break;
-
                         yield return c;
                     }
 

+ 79 - 0
Ix.NET/Source/Tests/Tests.Exceptions.cs

@@ -127,6 +127,85 @@ namespace Tests
             AssertThrows<MyException>(() => e.MoveNext(), ex => ex == e3);
         }
 
+        [Fact]
+        public void Catch4_Array()
+        {
+            var xs = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+            var res = xs.Catch<int, MyException>(e => { Assert.Fail(); return new[] { 42 }; });
+            Assert.True(xs.SequenceEqual(res));
+        }
+
+        [Fact]
+        public void Catch5_Array()
+        {
+            var xss = new[] { new[] { 0, 1, 2, 3, 4 }, new[] { 5, 6, 7, 8, 9 } };
+            var res = EnumerableEx.Catch(xss);
+            Assert.True(res.SequenceEqual(Enumerable.Range(0, 5)));
+        }
+
+        [Fact]
+        public void Catch6_Array()
+        {
+            var xss = new[] { new[] { 0, 1, 2, 3, 4 }, new[] { 5, 6, 7, 8, 9 } };
+            var res = xss.Catch();
+            Assert.True(res.SequenceEqual(Enumerable.Range(0, 5)));
+        }
+
+        [Fact]
+        public void Catch7_Array()
+        {
+            var xss = new[] { new[] { 0, 1, 2, 3, 4 }, new[] { 5, 6, 7, 8, 9 } };
+            var res = xss[0].Catch(xss[1]);
+            Assert.True(res.SequenceEqual(Enumerable.Range(0, 5)));
+        }
+
+        [Fact]
+        public void Catch8_Array()
+        {
+            var xss = new[] { new[] { 0, 1, 2, 3, 4 }.Concat(EnumerableEx.Throw<int>(new MyException())), new[] { 5, 6, 7, 8, 9 } };
+            var res = EnumerableEx.Catch(xss);
+            Assert.True(res.SequenceEqual(Enumerable.Range(0, 10)));
+        }
+
+        [Fact]
+        public void Catch9_Array()
+        {
+            var xss = new[] { new[] { 0, 1, 2, 3, 4 }.Concat(EnumerableEx.Throw<int>(new MyException())), new[] { 5, 6, 7, 8, 9 } };
+            var res = xss.Catch();
+            Assert.True(res.SequenceEqual(Enumerable.Range(0, 10)));
+        }
+
+        [Fact]
+        public void Catch10_Array()
+        {
+            var xss = new[] { new[] { 0, 1, 2, 3, 4 }.Concat(EnumerableEx.Throw<int>(new MyException())), new[] { 5, 6, 7, 8, 9 } };
+            var res = xss[0].Catch(xss[1]);
+            Assert.True(res.SequenceEqual(Enumerable.Range(0, 10)));
+        }
+
+        [Fact]
+        public void Catch11_Array()
+        {
+            var e1 = new MyException();
+            var ex1 = EnumerableEx.Throw<int>(e1);
+
+            var e2 = new MyException();
+            var ex2 = EnumerableEx.Throw<int>(e2);
+
+            var e3 = new MyException();
+            var ex3 = EnumerableEx.Throw<int>(e3);
+
+            var xss = new[] { new[] { 0, 1 }.Concat(ex1), new[] { 2, 3 }.Concat(ex2), ex3 };
+            var res = xss.Catch();
+
+            var e = res.GetEnumerator();
+            HasNext(e, 0);
+            HasNext(e, 1);
+            HasNext(e, 2);
+            HasNext(e, 3);
+            AssertThrows<MyException>(() => e.MoveNext(), ex => ex == e3);
+        }
+
         [Fact]
         public void Finally_Arguments()
         {