AsyncTests.Single.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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 partial class AsyncTests
  13. {
  14. [Fact]
  15. public void MoveNextExtension_Null()
  16. {
  17. var en = default(IAsyncEnumerator<int>);
  18. Assert.ThrowsAsync<ArgumentNullException>(() => en.MoveNextAsync());
  19. }
  20. [Fact]
  21. public void SelectWhere2()
  22. {
  23. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  24. var ys = xs.Select(i => i + 2).Where(i => i % 2 == 0);
  25. var e = ys.GetAsyncEnumerator();
  26. HasNext(e, 2);
  27. HasNext(e, 4);
  28. NoNext(e);
  29. }
  30. [Fact]
  31. public void WhereSelect2()
  32. {
  33. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  34. var ys = xs.Where(i => i % 2 == 0).Select(i => i + 2);
  35. var e = ys.GetAsyncEnumerator();
  36. HasNext(e, 2);
  37. HasNext(e, 4);
  38. NoNext(e);
  39. }
  40. [Fact]
  41. public void WhereSelect3()
  42. {
  43. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  44. var ys = xs.Where(i => i % 2 == 0).Select(i => i + 2).Select(i => i + 2);
  45. var e = ys.GetAsyncEnumerator();
  46. HasNext(e, 4);
  47. HasNext(e, 6);
  48. NoNext(e);
  49. }
  50. [Fact]
  51. public async Task ForEachAsync_Null()
  52. {
  53. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(null, x => { }));
  54. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(AsyncEnumerable.Return(42), default(Action<int>)));
  55. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(null, (x, i) => { }));
  56. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(AsyncEnumerable.Return(42), default(Action<int, int>)));
  57. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(null, x => { }, CancellationToken.None));
  58. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(AsyncEnumerable.Return(42), default(Action<int>), CancellationToken.None));
  59. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(null, (x, i) => { }, CancellationToken.None));
  60. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(AsyncEnumerable.Return(42), default(Action<int, int>), CancellationToken.None));
  61. }
  62. [Fact]
  63. public void ForEachAsync1()
  64. {
  65. var sum = 0;
  66. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  67. xs.ForEachAsync(x => sum += x).Wait(WaitTimeoutMs);
  68. Assert.Equal(10, sum);
  69. }
  70. [Fact]
  71. public void ForEachAsync2()
  72. {
  73. var sum = 0;
  74. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  75. xs.ForEachAsync((x, i) => sum += x * i).Wait(WaitTimeoutMs);
  76. Assert.Equal(1 * 0 + 2 * 1 + 3 * 2 + 4 * 3, sum);
  77. }
  78. [Fact]
  79. public void ForEachAsync3()
  80. {
  81. var ex = new Exception("Bang");
  82. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  83. AssertThrows<Exception>(() => xs.ForEachAsync(x => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  84. }
  85. [Fact]
  86. public void ForEachAsync4()
  87. {
  88. var ex = new Exception("Bang");
  89. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  90. AssertThrows<Exception>(() => xs.ForEachAsync((x, i) => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  91. }
  92. [Fact]
  93. public void ForEachAsync5()
  94. {
  95. var ex = new Exception("Bang");
  96. var xs = AsyncEnumerable.Throw<int>(ex);
  97. AssertThrows<Exception>(() => xs.ForEachAsync(x => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  98. }
  99. [Fact]
  100. public void ForEachAsync6()
  101. {
  102. var ex = new Exception("Bang");
  103. var xs = AsyncEnumerable.Throw<int>(ex);
  104. AssertThrows<Exception>(() => xs.ForEachAsync((x, i) => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  105. }
  106. [Fact]
  107. public void AsAsyncEnumerable_Null()
  108. {
  109. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.AsAsyncEnumerable<int>((IAsyncEnumerable<int>)null));
  110. }
  111. [Fact]
  112. public void AsAsyncEnumerable1()
  113. {
  114. var xs = AsyncEnumerable.Return(42);
  115. var ys = xs.AsAsyncEnumerable();
  116. Assert.NotSame(xs, ys);
  117. var e = xs.GetAsyncEnumerator();
  118. HasNext(e, 42);
  119. NoNext(e);
  120. }
  121. [Fact]
  122. public void RepeatSeq_Null()
  123. {
  124. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Repeat(default(IAsyncEnumerable<int>)));
  125. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Repeat(default(IAsyncEnumerable<int>), 3));
  126. AssertThrows<ArgumentOutOfRangeException>(() => AsyncEnumerableEx.Repeat(AsyncEnumerable.Return(42), -1));
  127. }
  128. [Fact]
  129. public void RepeatSeq1()
  130. {
  131. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat();
  132. var e = xs.GetAsyncEnumerator();
  133. HasNext(e, 1);
  134. HasNext(e, 2);
  135. HasNext(e, 3);
  136. HasNext(e, 1);
  137. HasNext(e, 2);
  138. HasNext(e, 3);
  139. HasNext(e, 1);
  140. HasNext(e, 2);
  141. HasNext(e, 3);
  142. }
  143. [Fact]
  144. public void RepeatSeq2()
  145. {
  146. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(3);
  147. var e = xs.GetAsyncEnumerator();
  148. HasNext(e, 1);
  149. HasNext(e, 2);
  150. HasNext(e, 3);
  151. HasNext(e, 1);
  152. HasNext(e, 2);
  153. HasNext(e, 3);
  154. HasNext(e, 1);
  155. HasNext(e, 2);
  156. HasNext(e, 3);
  157. NoNext(e);
  158. }
  159. [Fact]
  160. public void RepeatSeq3()
  161. {
  162. var i = 0;
  163. var xs = RepeatXs(() => i++).ToAsyncEnumerable().Repeat(3);
  164. var e = xs.GetAsyncEnumerator();
  165. HasNext(e, 1);
  166. HasNext(e, 2);
  167. HasNext(e, 1);
  168. HasNext(e, 2);
  169. HasNext(e, 1);
  170. HasNext(e, 2);
  171. NoNext(e);
  172. Assert.Equal(3, i);
  173. }
  174. [Fact]
  175. public void RepeatSeq0()
  176. {
  177. var i = 0;
  178. var xs = RepeatXs(() => i++).ToAsyncEnumerable().Repeat(0);
  179. var e = xs.GetAsyncEnumerator();
  180. NoNext(e);
  181. }
  182. [Fact]
  183. public async Task RepeatSeq6()
  184. {
  185. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(3);
  186. await SequenceIdentity(xs);
  187. }
  188. static IEnumerable<int> RepeatXs(Action started)
  189. {
  190. started();
  191. yield return 1;
  192. yield return 2;
  193. }
  194. [Fact]
  195. public void RepeatSeq4()
  196. {
  197. var xs = new FailRepeat().ToAsyncEnumerable().Repeat();
  198. var e = xs.GetAsyncEnumerator();
  199. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException);
  200. }
  201. [Fact]
  202. public void RepeatSeq5()
  203. {
  204. var xs = new FailRepeat().ToAsyncEnumerable().Repeat(3);
  205. var e = xs.GetAsyncEnumerator();
  206. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException);
  207. }
  208. class FailRepeat : IEnumerable<int>
  209. {
  210. public IEnumerator<int> GetEnumerator()
  211. {
  212. throw new NotImplementedException();
  213. }
  214. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  215. {
  216. throw new NotImplementedException();
  217. }
  218. }
  219. }
  220. }