AsyncTests.Multiple.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  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.Text;
  8. using Xunit;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. namespace Tests
  12. {
  13. public partial class AsyncTests
  14. {
  15. [Fact]
  16. public void Concat_Null()
  17. {
  18. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Concat<int>(null, AsyncEnumerable.Return(42)));
  19. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Concat<int>(AsyncEnumerable.Return(42), null));
  20. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Concat<int>(default(IAsyncEnumerable<int>[])));
  21. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Concat<int>(default(IEnumerable<IAsyncEnumerable<int>>)));
  22. }
  23. [Fact]
  24. public void Concat1()
  25. {
  26. var ys = new[] { 1, 2, 3 }.ToAsyncEnumerable().Concat(new[] { 4, 5, 6 }.ToAsyncEnumerable());
  27. var e = ys.GetEnumerator();
  28. HasNext(e, 1);
  29. HasNext(e, 2);
  30. HasNext(e, 3);
  31. HasNext(e, 4);
  32. HasNext(e, 5);
  33. HasNext(e, 6);
  34. NoNext(e);
  35. }
  36. [Fact]
  37. public void Concat2()
  38. {
  39. var ex = new Exception("Bang");
  40. var ys = new[] { 1, 2, 3 }.ToAsyncEnumerable().Concat(AsyncEnumerable.Throw<int>(ex));
  41. var e = ys.GetEnumerator();
  42. HasNext(e, 1);
  43. HasNext(e, 2);
  44. HasNext(e, 3);
  45. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  46. }
  47. [Fact]
  48. public void Concat3()
  49. {
  50. var ex = new Exception("Bang");
  51. var ys = AsyncEnumerable.Throw<int>(ex).Concat(new[] { 4, 5, 6 }.ToAsyncEnumerable());
  52. var e = ys.GetEnumerator();
  53. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  54. }
  55. [Fact]
  56. public void Concat4()
  57. {
  58. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  59. var ys = new[] { 4, 5 }.ToAsyncEnumerable();
  60. var zs = new[] { 6, 7, 8 }.ToAsyncEnumerable();
  61. var res = AsyncEnumerable.Concat(xs, ys, zs);
  62. var e = res.GetEnumerator();
  63. HasNext(e, 1);
  64. HasNext(e, 2);
  65. HasNext(e, 3);
  66. HasNext(e, 4);
  67. HasNext(e, 5);
  68. HasNext(e, 6);
  69. HasNext(e, 7);
  70. HasNext(e, 8);
  71. NoNext(e);
  72. }
  73. [Fact]
  74. public void Concat5()
  75. {
  76. var ex = new Exception("Bang");
  77. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  78. var ys = new[] { 4, 5 }.ToAsyncEnumerable();
  79. var zs = AsyncEnumerable.Throw<int>(ex);
  80. var res = AsyncEnumerable.Concat(xs, ys, zs);
  81. var e = res.GetEnumerator();
  82. HasNext(e, 1);
  83. HasNext(e, 2);
  84. HasNext(e, 3);
  85. HasNext(e, 4);
  86. HasNext(e, 5);
  87. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  88. }
  89. [Fact]
  90. public void Concat6()
  91. {
  92. var res = AsyncEnumerable.Concat(ConcatXss());
  93. var e = res.GetEnumerator();
  94. HasNext(e, 1);
  95. HasNext(e, 2);
  96. HasNext(e, 3);
  97. HasNext(e, 4);
  98. HasNext(e, 5);
  99. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!");
  100. }
  101. [Fact]
  102. public void Concat7()
  103. {
  104. var ws = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  105. var xs = new[] { 4, 5 }.ToAsyncEnumerable();
  106. var ys = new[] { 6, 7, 8 }.ToAsyncEnumerable();
  107. var zs = new[] { 9, 10, 11 }.ToAsyncEnumerable();
  108. var res = ws.Concat(xs).Concat(ys).Concat(zs);
  109. var e = res.GetEnumerator();
  110. HasNext(e, 1);
  111. HasNext(e, 2);
  112. HasNext(e, 3);
  113. HasNext(e, 4);
  114. HasNext(e, 5);
  115. HasNext(e, 6);
  116. HasNext(e, 7);
  117. HasNext(e, 8);
  118. HasNext(e, 9);
  119. HasNext(e, 10);
  120. HasNext(e, 11);
  121. NoNext(e);
  122. }
  123. [Fact]
  124. public async Task Concat8()
  125. {
  126. var ws = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  127. var xs = new[] { 4, 5 }.ToAsyncEnumerable();
  128. var ys = new[] { 6, 7, 8 }.ToAsyncEnumerable();
  129. var zs = new[] { 9, 10, 11 }.ToAsyncEnumerable();
  130. var res = ws.Concat(xs).Concat(ys).Concat(zs);
  131. await SequenceIdentity(res);
  132. }
  133. [Fact]
  134. public async Task Concat9()
  135. {
  136. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  137. var ys = new[] { 4, 5 }.ToAsyncEnumerable();
  138. var zs = new[] { 6, 7, 8 }.ToAsyncEnumerable();
  139. var res = AsyncEnumerable.Concat(xs, ys, zs);
  140. await SequenceIdentity(res);
  141. }
  142. [Fact]
  143. public async Task Concat10()
  144. {
  145. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  146. var ys = new[] { 4, 5 }.ToAsyncEnumerable();
  147. var zs = new[] { 6, 7, 8 }.ToAsyncEnumerable();
  148. var c = xs.Concat(ys).Concat(zs);
  149. var res = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
  150. Assert.True(res.SequenceEqual(await c.ToArray()));
  151. }
  152. [Fact]
  153. public async Task Concat11()
  154. {
  155. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  156. var ys = new[] { 4, 5 }.ToAsyncEnumerable();
  157. var zs = new[] { 6, 7, 8 }.ToAsyncEnumerable();
  158. var c = xs.Concat(ys).Concat(zs);
  159. var res = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
  160. Assert.True(res.SequenceEqual(await c.ToList()));
  161. }
  162. [Fact]
  163. public async Task Concat12()
  164. {
  165. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  166. var ys = new[] { 4, 5 }.ToAsyncEnumerable();
  167. var zs = new[] { 6, 7, 8 }.ToAsyncEnumerable();
  168. var c = xs.Concat(ys).Concat(zs);
  169. Assert.Equal(8, await c.Count());
  170. }
  171. static IEnumerable<IAsyncEnumerable<int>> ConcatXss()
  172. {
  173. yield return new[] { 1, 2, 3 }.ToAsyncEnumerable();
  174. yield return new[] { 4, 5 }.ToAsyncEnumerable();
  175. throw new Exception("Bang!");
  176. }
  177. [Fact]
  178. public void Zip_Null()
  179. {
  180. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Zip<int, int, int>(null, AsyncEnumerable.Return(42), (x, y) => x + y));
  181. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Zip<int, int, int>(AsyncEnumerable.Return(42), null, (x, y) => x + y));
  182. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Zip<int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null));
  183. }
  184. [Fact]
  185. public void Zip1()
  186. {
  187. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  188. var ys = new[] { 4, 5, 6 }.ToAsyncEnumerable();
  189. var res = xs.Zip(ys, (x, y) => x * y);
  190. var e = res.GetEnumerator();
  191. HasNext(e, 1 * 4);
  192. HasNext(e, 2 * 5);
  193. HasNext(e, 3 * 6);
  194. NoNext(e);
  195. }
  196. [Fact]
  197. public void Zip2()
  198. {
  199. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  200. var ys = new[] { 4, 5, 6, 7 }.ToAsyncEnumerable();
  201. var res = xs.Zip(ys, (x, y) => x * y);
  202. var e = res.GetEnumerator();
  203. HasNext(e, 1 * 4);
  204. HasNext(e, 2 * 5);
  205. HasNext(e, 3 * 6);
  206. NoNext(e);
  207. }
  208. [Fact]
  209. public void Zip3()
  210. {
  211. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  212. var ys = new[] { 4, 5, 6 }.ToAsyncEnumerable();
  213. var res = xs.Zip(ys, (x, y) => x * y);
  214. var e = res.GetEnumerator();
  215. HasNext(e, 1 * 4);
  216. HasNext(e, 2 * 5);
  217. HasNext(e, 3 * 6);
  218. NoNext(e);
  219. }
  220. [Fact]
  221. public void Zip4()
  222. {
  223. var ex = new Exception("Bang!");
  224. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  225. var ys = AsyncEnumerable.Throw<int>(ex);
  226. var res = xs.Zip(ys, (x, y) => x * y);
  227. var e = res.GetEnumerator();
  228. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  229. }
  230. [Fact]
  231. public void Zip5()
  232. {
  233. var ex = new Exception("Bang!");
  234. var xs = AsyncEnumerable.Throw<int>(ex);
  235. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  236. var res = xs.Zip(ys, (x, y) => x * y);
  237. var e = res.GetEnumerator();
  238. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  239. }
  240. [Fact]
  241. public void Zip6()
  242. {
  243. var ex = new Exception("Bang!");
  244. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  245. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  246. var res = xs.Zip(ys, (x, y) => { if (x > 0) throw ex; return x * y; });
  247. var e = res.GetEnumerator();
  248. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  249. }
  250. [Fact]
  251. public void Union_Null()
  252. {
  253. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Union<int>(null, AsyncEnumerable.Return(42)));
  254. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Union<int>(AsyncEnumerable.Return(42), null));
  255. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Union<int>(null, AsyncEnumerable.Return(42), new Eq()));
  256. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Union<int>(AsyncEnumerable.Return(42), null, new Eq()));
  257. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Union<int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null));
  258. }
  259. [Fact]
  260. public void Union1()
  261. {
  262. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  263. var ys = new[] { 3, 5, 1, 4 }.ToAsyncEnumerable();
  264. var res = xs.Union(ys);
  265. var e = res.GetEnumerator();
  266. HasNext(e, 1);
  267. HasNext(e, 2);
  268. HasNext(e, 3);
  269. HasNext(e, 5);
  270. HasNext(e, 4);
  271. NoNext(e);
  272. }
  273. [Fact]
  274. public void Union2()
  275. {
  276. var xs = new[] { 1, 2, -3 }.ToAsyncEnumerable();
  277. var ys = new[] { 3, 5, -1, 4 }.ToAsyncEnumerable();
  278. var res = xs.Union(ys, new Eq());
  279. var e = res.GetEnumerator();
  280. HasNext(e, 1);
  281. HasNext(e, 2);
  282. HasNext(e, -3);
  283. HasNext(e, 5);
  284. HasNext(e, 4);
  285. NoNext(e);
  286. }
  287. [Fact]
  288. public void Intersect_Null()
  289. {
  290. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Intersect<int>(null, AsyncEnumerable.Return(42)));
  291. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Intersect<int>(AsyncEnumerable.Return(42), null));
  292. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Intersect<int>(null, AsyncEnumerable.Return(42), new Eq()));
  293. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Intersect<int>(AsyncEnumerable.Return(42), null, new Eq()));
  294. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Intersect<int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null));
  295. }
  296. [Fact]
  297. public void Intersect1()
  298. {
  299. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  300. var ys = new[] { 3, 5, 1, 4 }.ToAsyncEnumerable();
  301. var res = xs.Intersect(ys);
  302. var e = res.GetEnumerator();
  303. HasNext(e, 1);
  304. HasNext(e, 3);
  305. NoNext(e);
  306. }
  307. [Fact]
  308. public void Intersect2()
  309. {
  310. var xs = new[] { 1, 2, -3 }.ToAsyncEnumerable();
  311. var ys = new[] { 3, 5, -1, 4 }.ToAsyncEnumerable();
  312. var res = xs.Intersect(ys, new Eq());
  313. var e = res.GetEnumerator();
  314. HasNext(e, 1);
  315. HasNext(e, -3);
  316. NoNext(e);
  317. }
  318. [Fact]
  319. public void Except_Null()
  320. {
  321. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Except<int>(null, AsyncEnumerable.Return(42)));
  322. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Except<int>(AsyncEnumerable.Return(42), null));
  323. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Except<int>(null, AsyncEnumerable.Return(42), new Eq()));
  324. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Except<int>(AsyncEnumerable.Return(42), null, new Eq()));
  325. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Except<int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null));
  326. }
  327. [Fact]
  328. public void Except1()
  329. {
  330. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  331. var ys = new[] { 3, 5, 1, 4 }.ToAsyncEnumerable();
  332. var res = xs.Except(ys);
  333. var e = res.GetEnumerator();
  334. HasNext(e, 2);
  335. NoNext(e);
  336. }
  337. [Fact]
  338. public void Except2()
  339. {
  340. var xs = new[] { 1, 2, -3 }.ToAsyncEnumerable();
  341. var ys = new[] { 3, 5, -1, 4 }.ToAsyncEnumerable();
  342. var res = xs.Except(ys, new Eq());
  343. var e = res.GetEnumerator();
  344. HasNext(e, 2);
  345. NoNext(e);
  346. }
  347. [Fact]
  348. public async Task SequenceEqual_Null()
  349. {
  350. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(null, AsyncEnumerable.Return(42)));
  351. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(AsyncEnumerable.Return(42), null));
  352. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(null, AsyncEnumerable.Return(42), new Eq()));
  353. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(AsyncEnumerable.Return(42), null, new Eq()));
  354. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null));
  355. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(null, AsyncEnumerable.Return(42), CancellationToken.None));
  356. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(AsyncEnumerable.Return(42), null, CancellationToken.None));
  357. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(null, AsyncEnumerable.Return(42), new Eq(), CancellationToken.None));
  358. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(AsyncEnumerable.Return(42), null, new Eq(), CancellationToken.None));
  359. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.SequenceEqual<int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null, CancellationToken.None));
  360. }
  361. [Fact]
  362. public void SequenceEqual1()
  363. {
  364. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  365. var res = xs.SequenceEqual(xs);
  366. Assert.True(res.Result);
  367. }
  368. [Fact]
  369. public void SequenceEqual2()
  370. {
  371. var xs = AsyncEnumerable.Empty<int>();
  372. var res = xs.SequenceEqual(xs);
  373. Assert.True(res.Result);
  374. }
  375. [Fact]
  376. public void SequenceEqual3()
  377. {
  378. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  379. var ys = new[] { 1, 3, 2 }.ToAsyncEnumerable();
  380. var res = xs.SequenceEqual(ys);
  381. Assert.False(res.Result);
  382. }
  383. [Fact]
  384. public void SequenceEqual4()
  385. {
  386. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  387. var ys = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  388. var res = xs.SequenceEqual(ys);
  389. Assert.False(res.Result);
  390. }
  391. [Fact]
  392. public void SequenceEqual5()
  393. {
  394. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  395. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  396. var res = xs.SequenceEqual(ys);
  397. Assert.False(res.Result);
  398. }
  399. [Fact]
  400. public void SequenceEqual6()
  401. {
  402. var ex = new Exception("Bang!");
  403. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  404. var ys = AsyncEnumerable.Throw<int>(ex);
  405. var res = xs.SequenceEqual(ys);
  406. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  407. }
  408. [Fact]
  409. public void SequenceEqual7()
  410. {
  411. var ex = new Exception("Bang!");
  412. var xs = AsyncEnumerable.Throw<int>(ex);
  413. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  414. var res = xs.SequenceEqual(ys);
  415. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  416. }
  417. [Fact]
  418. public void SequenceEqual8()
  419. {
  420. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  421. var res = xs.SequenceEqual(xs, new Eq());
  422. Assert.True(res.Result);
  423. }
  424. [Fact]
  425. public void SequenceEqual9()
  426. {
  427. var xs = AsyncEnumerable.Empty<int>();
  428. var res = xs.SequenceEqual(xs, new Eq());
  429. Assert.True(res.Result);
  430. }
  431. [Fact]
  432. public void SequenceEqual10()
  433. {
  434. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  435. var ys = new[] { 1, 3, 2 }.ToAsyncEnumerable();
  436. var res = xs.SequenceEqual(ys, new Eq());
  437. Assert.False(res.Result);
  438. }
  439. [Fact]
  440. public void SequenceEqual11()
  441. {
  442. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  443. var ys = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  444. var res = xs.SequenceEqual(ys, new Eq());
  445. Assert.False(res.Result);
  446. }
  447. [Fact]
  448. public void SequenceEqual12()
  449. {
  450. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  451. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  452. var res = xs.SequenceEqual(ys, new Eq());
  453. Assert.False(res.Result);
  454. }
  455. [Fact]
  456. public void SequenceEqual13()
  457. {
  458. var ex = new Exception("Bang!");
  459. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  460. var ys = AsyncEnumerable.Throw<int>(ex);
  461. var res = xs.SequenceEqual(ys, new Eq());
  462. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  463. }
  464. [Fact]
  465. public void SequenceEqual14()
  466. {
  467. var ex = new Exception("Bang!");
  468. var xs = AsyncEnumerable.Throw<int>(ex);
  469. var ys = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  470. var res = xs.SequenceEqual(ys, new Eq());
  471. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  472. }
  473. [Fact]
  474. public void SequenceEqual15()
  475. {
  476. var xs = new[] { 1, 2, -3, 4 }.ToAsyncEnumerable();
  477. var ys = new[] { 1, -2, 3, 4 }.ToAsyncEnumerable();
  478. var res = xs.SequenceEqual(ys, new Eq());
  479. Assert.True(res.Result);
  480. }
  481. [Fact]
  482. public void SequenceEqual16()
  483. {
  484. var xs = new[] { 1, 2, -3, 4 }.ToAsyncEnumerable();
  485. var ys = new[] { 1, -2, 3, 4 }.ToAsyncEnumerable();
  486. var res = xs.SequenceEqual(ys, new EqEx());
  487. AssertThrows<Exception>(() => res.Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException);
  488. }
  489. class EqEx : IEqualityComparer<int>
  490. {
  491. public bool Equals(int x, int y)
  492. {
  493. throw new NotImplementedException();
  494. }
  495. public int GetHashCode(int obj)
  496. {
  497. throw new NotImplementedException();
  498. }
  499. }
  500. [Fact]
  501. public void GroupJoin_Null()
  502. {
  503. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(null, AsyncEnumerable.Return(42), x => x, x => x, (x, y) => x));
  504. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), null, x => x, x => x, (x, y) => x));
  505. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null, x => x, (x, y) => x));
  506. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, null, (x, y) => x));
  507. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, x => x, null));
  508. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(null, AsyncEnumerable.Return(42), x => x, x => x, (x, y) => x, EqualityComparer<int>.Default));
  509. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), null, x => x, x => x, (x, y) => x, EqualityComparer<int>.Default));
  510. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null, x => x, (x, y) => x, EqualityComparer<int>.Default));
  511. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, null, (x, y) => x, EqualityComparer<int>.Default));
  512. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, x => x, null, EqualityComparer<int>.Default));
  513. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupJoin<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, x => x, (x, y) => x, default(IEqualityComparer<int>)));
  514. }
  515. [Fact]
  516. public void GroupJoin1()
  517. {
  518. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  519. var ys = new[] { 4, 7, 6, 2, 3, 4, 8, 9 }.ToAsyncEnumerable();
  520. var res = xs.GroupJoin(ys, x => x % 3, y => y % 3, (x, i) => x + " - " + i.Aggregate("", (s, j) => s + j).Result);
  521. var e = res.GetEnumerator();
  522. HasNext(e, "0 - 639");
  523. HasNext(e, "1 - 474");
  524. HasNext(e, "2 - 28");
  525. NoNext(e);
  526. }
  527. [Fact]
  528. public void GroupJoin2()
  529. {
  530. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  531. var ys = new[] { 3, 6, 4 }.ToAsyncEnumerable();
  532. var res = xs.GroupJoin(ys, x => x % 3, y => y % 3, (x, i) => x + " - " + i.Aggregate("", (s, j) => s + j).Result);
  533. var e = res.GetEnumerator();
  534. HasNext(e, "0 - 36");
  535. HasNext(e, "1 - 4");
  536. HasNext(e, "2 - ");
  537. NoNext(e);
  538. }
  539. [Fact]
  540. public void GroupJoin3()
  541. {
  542. var ex = new Exception("Bang!");
  543. var xs = AsyncEnumerable.Throw<int>(ex);
  544. var ys = new[] { 3, 6, 4 }.ToAsyncEnumerable();
  545. var res = xs.GroupJoin(ys, x => x % 3, y => y % 3, (x, i) => x + " - " + i.Aggregate("", (s, j) => s + j).Result);
  546. var e = res.GetEnumerator();
  547. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  548. }
  549. [Fact]
  550. public void GroupJoin4()
  551. {
  552. var ex = new Exception("Bang!");
  553. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  554. var ys = AsyncEnumerable.Throw<int>(ex);
  555. var res = xs.GroupJoin(ys, x => x % 3, y => y % 3, (x, i) => x + " - " + i.Aggregate("", (s, j) => s + j).Result);
  556. var e = res.GetEnumerator();
  557. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  558. }
  559. [Fact]
  560. public void GroupJoin5()
  561. {
  562. var ex = new Exception("Bang!");
  563. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  564. var ys = new[] { 3, 6, 4 }.ToAsyncEnumerable();
  565. var res = xs.GroupJoin(ys, x => { throw ex; }, y => y % 3, (x, i) => x + " - " + i.Aggregate("", (s, j) => s + j).Result);
  566. var e = res.GetEnumerator();
  567. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  568. }
  569. [Fact]
  570. public void GroupJoin6()
  571. {
  572. var ex = new Exception("Bang!");
  573. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  574. var ys = new[] { 3, 6, 4 }.ToAsyncEnumerable();
  575. var res = xs.GroupJoin(ys, x => x % 3, y => { throw ex; }, (x, i) => x + " - " + i.Aggregate("", (s, j) => s + j).Result);
  576. var e = res.GetEnumerator();
  577. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  578. }
  579. [Fact]
  580. public void GroupJoin7()
  581. {
  582. var ex = new Exception("Bang!");
  583. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  584. var ys = new[] { 3, 6, 4 }.ToAsyncEnumerable();
  585. var res = xs.GroupJoin(ys, x => x % 3, y => y % 3, (x, i) => {
  586. if (x == 1)
  587. throw ex;
  588. return x + " - " + i.Aggregate("", (s, j) => s + j).Result;
  589. });
  590. var e = res.GetEnumerator();
  591. HasNext(e, "0 - 36");
  592. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  593. }
  594. [Fact]
  595. public void Join_Null()
  596. {
  597. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(null, AsyncEnumerable.Return(42), x => x, x => x, (x, y) => x));
  598. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), null, x => x, x => x, (x, y) => x));
  599. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null, x => x, (x, y) => x));
  600. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, null, (x, y) => x));
  601. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, x => x, null));
  602. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(null, AsyncEnumerable.Return(42), x => x, x => x, (x, y) => x, EqualityComparer<int>.Default));
  603. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), null, x => x, x => x, (x, y) => x, EqualityComparer<int>.Default));
  604. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), null, x => x, (x, y) => x, EqualityComparer<int>.Default));
  605. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, null, (x, y) => x, EqualityComparer<int>.Default));
  606. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, x => x, null, EqualityComparer<int>.Default));
  607. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Join<int, int, int, int>(AsyncEnumerable.Return(42), AsyncEnumerable.Return(42), x => x, x => x, (x, y) => x, default(IEqualityComparer<int>)));
  608. }
  609. [Fact]
  610. public void Join1()
  611. {
  612. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  613. var ys = new[] { 3, 6, 4 }.ToAsyncEnumerable();
  614. var res = xs.Join(ys, x => x % 3, y => y % 3, (x, y) => x + y);
  615. var e = res.GetEnumerator();
  616. HasNext(e, 0 + 3);
  617. HasNext(e, 0 + 6);
  618. HasNext(e, 1 + 4);
  619. NoNext(e);
  620. }
  621. [Fact]
  622. public void Join2()
  623. {
  624. var xs = new[] { 3, 6, 4 }.ToAsyncEnumerable();
  625. var ys = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  626. var res = xs.Join(ys, x => x % 3, y => y % 3, (x, y) => x + y);
  627. var e = res.GetEnumerator();
  628. HasNext(e, 3 + 0);
  629. HasNext(e, 6 + 0);
  630. HasNext(e, 4 + 1);
  631. NoNext(e);
  632. }
  633. [Fact]
  634. public void Join3()
  635. {
  636. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  637. var ys = new[] { 3, 6 }.ToAsyncEnumerable();
  638. var res = xs.Join(ys, x => x % 3, y => y % 3, (x, y) => x + y);
  639. var e = res.GetEnumerator();
  640. HasNext(e, 0 + 3);
  641. HasNext(e, 0 + 6);
  642. NoNext(e);
  643. }
  644. [Fact]
  645. public void Join4()
  646. {
  647. var xs = new[] { 3, 6 }.ToAsyncEnumerable();
  648. var ys = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  649. var res = xs.Join(ys, x => x % 3, y => y % 3, (x, y) => x + y);
  650. var e = res.GetEnumerator();
  651. HasNext(e, 3 + 0);
  652. HasNext(e, 6 + 0);
  653. NoNext(e);
  654. }
  655. [Fact]
  656. public void Join5()
  657. {
  658. var ex = new Exception("Bang!");
  659. var xs = AsyncEnumerable.Throw<int>(ex);
  660. var ys = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  661. var res = xs.Join(ys, x => x % 3, y => y % 3, (x, y) => x + y);
  662. var e = res.GetEnumerator();
  663. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  664. }
  665. [Fact]
  666. public void Join6()
  667. {
  668. var ex = new Exception("Bang!");
  669. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  670. var ys = AsyncEnumerable.Throw<int>(ex);
  671. var res = xs.Join(ys, x => x % 3, y => y % 3, (x, y) => x + y);
  672. var e = res.GetEnumerator();
  673. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  674. }
  675. [Fact]
  676. public void Join7()
  677. {
  678. var ex = new Exception("Bang!");
  679. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  680. var ys = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  681. var res = xs.Join(ys, x => { throw ex; }, y => y, (x, y) => x + y);
  682. var e = res.GetEnumerator();
  683. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  684. }
  685. [Fact]
  686. public void Join8()
  687. {
  688. var ex = new Exception("Bang!");
  689. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  690. var ys = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  691. var res = xs.Join(ys, x => x, y => { throw ex; }, (x, y) => x + y);
  692. var e = res.GetEnumerator();
  693. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  694. }
  695. [Fact]
  696. public void Join9()
  697. {
  698. var ex = new Exception("Bang!");
  699. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  700. var ys = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  701. var res = xs.Join<int, int, int, int>(ys, x => x, y => y, (x, y) => { throw ex; });
  702. var e = res.GetEnumerator();
  703. AssertThrows<Exception>(() => e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  704. }
  705. [Fact]
  706. public void SelectManyMultiple_Null()
  707. {
  708. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(default(IAsyncEnumerable<int>), AsyncEnumerable.Return(42)));
  709. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(AsyncEnumerable.Return(42), default(IAsyncEnumerable<int>)));
  710. }
  711. [Fact]
  712. public void SelectManyMultiple1()
  713. {
  714. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  715. var ys = new[] { 3, 4 }.ToAsyncEnumerable();
  716. var res = xs.SelectMany(ys);
  717. var e = res.GetEnumerator();
  718. HasNext(e, 3);
  719. HasNext(e, 4);
  720. HasNext(e, 3);
  721. HasNext(e, 4);
  722. HasNext(e, 3);
  723. HasNext(e, 4);
  724. NoNext(e);
  725. }
  726. }
  727. }