SequenceEqual.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using Xunit;
  10. namespace Tests
  11. {
  12. public class SequenceEqual : AsyncEnumerableTests
  13. {
  14. [Fact]
  15. public async Task SequenceEqual_Null()
  16. {
  17. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(default, Return42));
  18. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(Return42, default));
  19. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(default, Return42, new Eq()));
  20. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(Return42, default, new Eq()));
  21. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(Return42, Return42, default(IEqualityComparer<int>)));
  22. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(default, Return42, CancellationToken.None));
  23. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(Return42, default, CancellationToken.None));
  24. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(default, Return42, new Eq(), CancellationToken.None));
  25. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(Return42, default, new Eq(), CancellationToken.None));
  26. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(Return42, Return42, default, CancellationToken.None));
  27. }
  28. [Fact]
  29. public void SequenceEqual1()
  30. {
  31. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  32. var res = xs.SequenceEqual(xs);
  33. Assert.True(res.Result);
  34. }
  35. [Fact]
  36. public void SequenceEqual2()
  37. {
  38. var xs = AsyncEnumerable.Empty<int>();
  39. var res = xs.SequenceEqual(xs);
  40. Assert.True(res.Result);
  41. }
  42. [Fact]
  43. public void SequenceEqual3()
  44. {
  45. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  46. var ys = new[] { 1, 3, 2 }.ToAsyncEnumerable();
  47. var res = xs.SequenceEqual(ys);
  48. Assert.False(res.Result);
  49. }
  50. [Fact]
  51. public void SequenceEqual4()
  52. {
  53. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  54. var ys = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  55. var res = xs.SequenceEqual(ys);
  56. Assert.False(res.Result);
  57. }
  58. [Fact]
  59. public void SequenceEqual5()
  60. {
  61. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  62. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  63. var res = xs.SequenceEqual(ys);
  64. Assert.False(res.Result);
  65. }
  66. [Fact]
  67. public void SequenceEqual6()
  68. {
  69. var ex = new Exception("Bang!");
  70. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  71. var ys = Throw<int>(ex);
  72. var res = xs.SequenceEqual(ys);
  73. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  74. }
  75. [Fact]
  76. public void SequenceEqual7()
  77. {
  78. var ex = new Exception("Bang!");
  79. var xs = Throw<int>(ex);
  80. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  81. var res = xs.SequenceEqual(ys);
  82. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  83. }
  84. [Fact]
  85. public void SequenceEqual8()
  86. {
  87. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  88. var res = xs.SequenceEqual(xs, new Eq());
  89. Assert.True(res.Result);
  90. }
  91. [Fact]
  92. public void SequenceEqual9()
  93. {
  94. var xs = AsyncEnumerable.Empty<int>();
  95. var res = xs.SequenceEqual(xs, new Eq());
  96. Assert.True(res.Result);
  97. }
  98. [Fact]
  99. public void SequenceEqual10()
  100. {
  101. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  102. var ys = new[] { 1, 3, 2 }.ToAsyncEnumerable();
  103. var res = xs.SequenceEqual(ys, new Eq());
  104. Assert.False(res.Result);
  105. }
  106. [Fact]
  107. public void SequenceEqual11()
  108. {
  109. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  110. var ys = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  111. var res = xs.SequenceEqual(ys, new Eq());
  112. Assert.False(res.Result);
  113. }
  114. [Fact]
  115. public void SequenceEqual12()
  116. {
  117. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  118. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  119. var res = xs.SequenceEqual(ys, new Eq());
  120. Assert.False(res.Result);
  121. }
  122. [Fact]
  123. public void SequenceEqual13()
  124. {
  125. var ex = new Exception("Bang!");
  126. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  127. var ys = Throw<int>(ex);
  128. var res = xs.SequenceEqual(ys, new Eq());
  129. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  130. }
  131. [Fact]
  132. public void SequenceEqual14()
  133. {
  134. var ex = new Exception("Bang!");
  135. var xs = Throw<int>(ex);
  136. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  137. var res = xs.SequenceEqual(ys, new Eq());
  138. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  139. }
  140. [Fact]
  141. public void SequenceEqual15()
  142. {
  143. var xs = new[] { 1, 2, -3, 4 }.ToAsyncEnumerable();
  144. var ys = new[] { 1, -2, 3, 4 }.ToAsyncEnumerable();
  145. var res = xs.SequenceEqual(ys, new Eq());
  146. Assert.True(res.Result);
  147. }
  148. [Fact]
  149. public void SequenceEqual16()
  150. {
  151. var xs = new[] { 1, 2, -3, 4 }.ToAsyncEnumerable();
  152. var ys = new[] { 1, -2, 3, 4 }.ToAsyncEnumerable();
  153. var res = xs.SequenceEqual(ys, new EqEx());
  154. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException);
  155. }
  156. private sealed class EqEx : IEqualityComparer<int>
  157. {
  158. public bool Equals(int x, int y)
  159. {
  160. throw new NotImplementedException();
  161. }
  162. public int GetHashCode(int obj)
  163. {
  164. throw new NotImplementedException();
  165. }
  166. }
  167. private sealed class Eq : IEqualityComparer<int>
  168. {
  169. public bool Equals(int x, int y)
  170. {
  171. return EqualityComparer<int>.Default.Equals(Math.Abs(x), Math.Abs(y));
  172. }
  173. public int GetHashCode(int obj)
  174. {
  175. return EqualityComparer<int>.Default.GetHashCode(Math.Abs(obj));
  176. }
  177. }
  178. }
  179. }