SelectMany.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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.Tasks;
  8. using Xunit;
  9. namespace Tests
  10. {
  11. public class SelectMany : AsyncEnumerableTests
  12. {
  13. [Fact]
  14. public void SelectMany_Null()
  15. {
  16. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(default, default(Func<int, IAsyncEnumerable<int>>)));
  17. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(default, default(Func<int, int, IAsyncEnumerable<int>>)));
  18. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(Return42, default(Func<int, IAsyncEnumerable<int>>)));
  19. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(Return42, default(Func<int, int, IAsyncEnumerable<int>>)));
  20. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(default, default(Func<int, IAsyncEnumerable<int>>), (x, y) => x));
  21. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(default, default(Func<int, int, IAsyncEnumerable<int>>), (x, y) => x));
  22. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(Return42, default(Func<int, IAsyncEnumerable<int>>), (x, y) => x));
  23. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(Return42, default(Func<int, int, IAsyncEnumerable<int>>), (x, y) => x));
  24. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(Return42, x => default, default(Func<int, int, int>)));
  25. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(Return42, (x, i) => default, default(Func<int, int, int>)));
  26. }
  27. [Fact]
  28. public void SelectMany1()
  29. {
  30. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  31. var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable());
  32. var e = ys.GetAsyncEnumerator();
  33. HasNext(e, 0);
  34. HasNext(e, 0);
  35. HasNext(e, 1);
  36. HasNext(e, 0);
  37. HasNext(e, 1);
  38. HasNext(e, 2);
  39. NoNext(e);
  40. }
  41. [Fact]
  42. public void SelectMany2()
  43. {
  44. var ex = new Exception("Bang");
  45. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  46. var ys = xs.SelectMany(x =>
  47. {
  48. if (x < 3)
  49. return Enumerable.Range(0, x).ToAsyncEnumerable();
  50. else
  51. return Throw<int>(ex);
  52. });
  53. var e = ys.GetAsyncEnumerator();
  54. HasNext(e, 0);
  55. HasNext(e, 0);
  56. HasNext(e, 1);
  57. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), SingleInnerExceptionMatches(ex));
  58. }
  59. [Fact]
  60. public void SelectMany3()
  61. {
  62. var ex = new Exception("Bang");
  63. var xs = Throw<int>(ex);
  64. var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable());
  65. var e = ys.GetAsyncEnumerator();
  66. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), SingleInnerExceptionMatches(ex));
  67. }
  68. [Fact]
  69. public void SelectMany4()
  70. {
  71. var ex = new Exception("Bang");
  72. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  73. var ys = xs.SelectMany(x =>
  74. {
  75. if (x < 3)
  76. return Enumerable.Range(0, x).ToAsyncEnumerable();
  77. else
  78. throw ex;
  79. });
  80. var e = ys.GetAsyncEnumerator();
  81. HasNext(e, 0);
  82. HasNext(e, 0);
  83. HasNext(e, 1);
  84. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), SingleInnerExceptionMatches(ex));
  85. }
  86. [Fact]
  87. public void SelectMany5()
  88. {
  89. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  90. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 5, x).ToAsyncEnumerable());
  91. var e = ys.GetAsyncEnumerator();
  92. HasNext(e, 5);
  93. HasNext(e, 6);
  94. HasNext(e, 7);
  95. HasNext(e, 7);
  96. HasNext(e, 8);
  97. HasNext(e, 9);
  98. NoNext(e);
  99. }
  100. [Fact]
  101. public void SelectMany6()
  102. {
  103. var ex = new Exception("Bang");
  104. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  105. var ys = xs.SelectMany((x, i) =>
  106. {
  107. if (i < 2)
  108. return Enumerable.Range(0, x).ToAsyncEnumerable();
  109. else
  110. return Throw<int>(ex);
  111. });
  112. var e = ys.GetAsyncEnumerator();
  113. HasNext(e, 0);
  114. HasNext(e, 0);
  115. HasNext(e, 1);
  116. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), SingleInnerExceptionMatches(ex));
  117. }
  118. [Fact]
  119. public void SelectMany7()
  120. {
  121. var ex = new Exception("Bang");
  122. var xs = Throw<int>(ex);
  123. var ys = xs.SelectMany((x, i) => Enumerable.Range(0, x).ToAsyncEnumerable());
  124. var e = ys.GetAsyncEnumerator();
  125. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), SingleInnerExceptionMatches(ex));
  126. }
  127. [Fact]
  128. public void SelectMany8()
  129. {
  130. var ex = new Exception("Bang");
  131. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  132. var ys = xs.SelectMany((x, i) =>
  133. {
  134. if (i < 2)
  135. return Enumerable.Range(0, x).ToAsyncEnumerable();
  136. else
  137. throw ex;
  138. });
  139. var e = ys.GetAsyncEnumerator();
  140. HasNext(e, 0);
  141. HasNext(e, 0);
  142. HasNext(e, 1);
  143. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), SingleInnerExceptionMatches(ex));
  144. }
  145. [Fact]
  146. public void SelectMany9()
  147. {
  148. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  149. var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) => x * y);
  150. var e = ys.GetAsyncEnumerator();
  151. HasNext(e, 3);
  152. HasNext(e, 6);
  153. HasNext(e, 8);
  154. HasNext(e, 9);
  155. HasNext(e, 12);
  156. HasNext(e, 15);
  157. NoNext(e);
  158. }
  159. [Fact]
  160. public void SelectMany10()
  161. {
  162. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  163. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) => x * y);
  164. var e = ys.GetAsyncEnumerator();
  165. HasNext(e, 3);
  166. HasNext(e, 8);
  167. HasNext(e, 10);
  168. HasNext(e, 15);
  169. HasNext(e, 18);
  170. HasNext(e, 21);
  171. NoNext(e);
  172. }
  173. [Fact]
  174. public void SelectMany11()
  175. {
  176. var ex = new Exception("Bang");
  177. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  178. var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) =>
  179. {
  180. if (x * y > 10)
  181. throw ex;
  182. return x * y;
  183. });
  184. var e = ys.GetAsyncEnumerator();
  185. HasNext(e, 3);
  186. HasNext(e, 6);
  187. HasNext(e, 8);
  188. HasNext(e, 9);
  189. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), SingleInnerExceptionMatches(ex));
  190. }
  191. [Fact]
  192. public void SelectMany12()
  193. {
  194. var ex = new Exception("Bang");
  195. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  196. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) =>
  197. {
  198. if (x * y > 10)
  199. throw ex;
  200. return x * y;
  201. });
  202. var e = ys.GetAsyncEnumerator();
  203. HasNext(e, 3);
  204. HasNext(e, 8);
  205. HasNext(e, 10);
  206. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), SingleInnerExceptionMatches(ex));
  207. }
  208. [Fact]
  209. public async Task SelectMany13()
  210. {
  211. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  212. var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable());
  213. await SequenceIdentity(ys);
  214. }
  215. [Fact]
  216. public async Task SelectMany14()
  217. {
  218. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  219. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 5, x).ToAsyncEnumerable());
  220. await SequenceIdentity(ys);
  221. }
  222. [Fact]
  223. public async Task SelectMany15()
  224. {
  225. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  226. var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) => x * y);
  227. await SequenceIdentity(ys);
  228. }
  229. [Fact]
  230. public async Task SelectMany16()
  231. {
  232. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  233. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) => x * y);
  234. await SequenceIdentity(ys);
  235. }
  236. }
  237. }