AsyncTests.Multiple.cs 31 KB

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