AsyncTests.Single.cs 80 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290
  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 void SelectMany_Null()
  52. {
  53. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(null, default(Func<int, IAsyncEnumerable<int>>)));
  54. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(null, default(Func<int, int, IAsyncEnumerable<int>>)));
  55. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(AsyncEnumerable.Return(42), default(Func<int, IAsyncEnumerable<int>>)));
  56. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int>(AsyncEnumerable.Return(42), default(Func<int, int, IAsyncEnumerable<int>>)));
  57. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(null, default(Func<int, IAsyncEnumerable<int>>), (x, y) => x));
  58. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(null, default(Func<int, int, IAsyncEnumerable<int>>), (x, y) => x));
  59. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(AsyncEnumerable.Return(42), default(Func<int, IAsyncEnumerable<int>>), (x, y) => x));
  60. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(AsyncEnumerable.Return(42), default(Func<int, int, IAsyncEnumerable<int>>), (x, y) => x));
  61. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(AsyncEnumerable.Return(42), x => null, default(Func<int, int, int>)));
  62. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.SelectMany<int, int, int>(AsyncEnumerable.Return(42), (x, i) => null, default(Func<int, int, int>)));
  63. }
  64. [Fact]
  65. public void SelectMany1()
  66. {
  67. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  68. var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable());
  69. var e = ys.GetAsyncEnumerator();
  70. HasNext(e, 0);
  71. HasNext(e, 0);
  72. HasNext(e, 1);
  73. HasNext(e, 0);
  74. HasNext(e, 1);
  75. HasNext(e, 2);
  76. NoNext(e);
  77. }
  78. [Fact]
  79. public void SelectMany2()
  80. {
  81. var ex = new Exception("Bang");
  82. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  83. var ys = xs.SelectMany(x =>
  84. {
  85. if (x < 3)
  86. return Enumerable.Range(0, x).ToAsyncEnumerable();
  87. else
  88. return AsyncEnumerable.Throw<int>(ex);
  89. });
  90. var e = ys.GetAsyncEnumerator();
  91. HasNext(e, 0);
  92. HasNext(e, 0);
  93. HasNext(e, 1);
  94. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  95. }
  96. [Fact]
  97. public void SelectMany3()
  98. {
  99. var ex = new Exception("Bang");
  100. var xs = AsyncEnumerable.Throw<int>(ex);
  101. var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable());
  102. var e = ys.GetAsyncEnumerator();
  103. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  104. }
  105. [Fact]
  106. public void SelectMany4()
  107. {
  108. var ex = new Exception("Bang");
  109. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  110. var ys = xs.SelectMany(x =>
  111. {
  112. if (x < 3)
  113. return Enumerable.Range(0, x).ToAsyncEnumerable();
  114. else
  115. throw ex;
  116. });
  117. var e = ys.GetAsyncEnumerator();
  118. HasNext(e, 0);
  119. HasNext(e, 0);
  120. HasNext(e, 1);
  121. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  122. }
  123. [Fact]
  124. public void SelectMany5()
  125. {
  126. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  127. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 5, x).ToAsyncEnumerable());
  128. var e = ys.GetAsyncEnumerator();
  129. HasNext(e, 5);
  130. HasNext(e, 6);
  131. HasNext(e, 7);
  132. HasNext(e, 7);
  133. HasNext(e, 8);
  134. HasNext(e, 9);
  135. NoNext(e);
  136. }
  137. [Fact]
  138. public void SelectMany6()
  139. {
  140. var ex = new Exception("Bang");
  141. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  142. var ys = xs.SelectMany((x, i) =>
  143. {
  144. if (i < 2)
  145. return Enumerable.Range(0, x).ToAsyncEnumerable();
  146. else
  147. return AsyncEnumerable.Throw<int>(ex);
  148. });
  149. var e = ys.GetAsyncEnumerator();
  150. HasNext(e, 0);
  151. HasNext(e, 0);
  152. HasNext(e, 1);
  153. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  154. }
  155. [Fact]
  156. public void SelectMany7()
  157. {
  158. var ex = new Exception("Bang");
  159. var xs = AsyncEnumerable.Throw<int>(ex);
  160. var ys = xs.SelectMany((x, i) => Enumerable.Range(0, x).ToAsyncEnumerable());
  161. var e = ys.GetAsyncEnumerator();
  162. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  163. }
  164. [Fact]
  165. public void SelectMany8()
  166. {
  167. var ex = new Exception("Bang");
  168. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  169. var ys = xs.SelectMany((x, i) =>
  170. {
  171. if (i < 2)
  172. return Enumerable.Range(0, x).ToAsyncEnumerable();
  173. else
  174. throw ex;
  175. });
  176. var e = ys.GetAsyncEnumerator();
  177. HasNext(e, 0);
  178. HasNext(e, 0);
  179. HasNext(e, 1);
  180. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  181. }
  182. [Fact]
  183. public void SelectMany9()
  184. {
  185. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  186. var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) => x * y);
  187. var e = ys.GetAsyncEnumerator();
  188. HasNext(e, 3);
  189. HasNext(e, 6);
  190. HasNext(e, 8);
  191. HasNext(e, 9);
  192. HasNext(e, 12);
  193. HasNext(e, 15);
  194. NoNext(e);
  195. }
  196. [Fact]
  197. public void SelectMany10()
  198. {
  199. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  200. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) => x * y);
  201. var e = ys.GetAsyncEnumerator();
  202. HasNext(e, 3);
  203. HasNext(e, 8);
  204. HasNext(e, 10);
  205. HasNext(e, 15);
  206. HasNext(e, 18);
  207. HasNext(e, 21);
  208. NoNext(e);
  209. }
  210. [Fact]
  211. public void SelectMany11()
  212. {
  213. var ex = new Exception("Bang");
  214. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  215. var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) =>
  216. {
  217. if (x * y > 10)
  218. throw ex;
  219. return x * y;
  220. });
  221. var e = ys.GetAsyncEnumerator();
  222. HasNext(e, 3);
  223. HasNext(e, 6);
  224. HasNext(e, 8);
  225. HasNext(e, 9);
  226. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  227. }
  228. [Fact]
  229. public void SelectMany12()
  230. {
  231. var ex = new Exception("Bang");
  232. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  233. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) =>
  234. {
  235. if (x * y > 10)
  236. throw ex;
  237. return x * y;
  238. });
  239. var e = ys.GetAsyncEnumerator();
  240. HasNext(e, 3);
  241. HasNext(e, 8);
  242. HasNext(e, 10);
  243. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  244. }
  245. [Fact]
  246. public async Task SelectMany13()
  247. {
  248. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  249. var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable());
  250. await SequenceIdentity(ys);
  251. }
  252. [Fact]
  253. public async Task SelectMany14()
  254. {
  255. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  256. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 5, x).ToAsyncEnumerable());
  257. await SequenceIdentity(ys);
  258. }
  259. [Fact]
  260. public async Task SelectMany15()
  261. {
  262. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  263. var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) => x * y);
  264. await SequenceIdentity(ys);
  265. }
  266. [Fact]
  267. public async Task SelectMany16()
  268. {
  269. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  270. var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) => x * y);
  271. await SequenceIdentity(ys);
  272. }
  273. [Fact]
  274. public void Do_Null()
  275. {
  276. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(null, x => { }));
  277. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), default(Action<int>)));
  278. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(null, x => { }, () => { }));
  279. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), default(Action<int>), () => { }));
  280. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), x => { }, default(Action)));
  281. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(null, x => { }, ex => { }));
  282. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), default(Action<int>), ex => { }));
  283. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), x => { }, default(Action<Exception>)));
  284. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(null, x => { }, ex => { }, () => { }));
  285. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), default(Action<int>), ex => { }, () => { }));
  286. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), x => { }, default(Action<Exception>), () => { }));
  287. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), x => { }, ex => { }, default(Action)));
  288. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(null, new MyObs()));
  289. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Do<int>(AsyncEnumerable.Return(42), default(IObserver<int>)));
  290. }
  291. class MyObs : IObserver<int>
  292. {
  293. public void OnCompleted()
  294. {
  295. throw new NotImplementedException();
  296. }
  297. public void OnError(Exception error)
  298. {
  299. throw new NotImplementedException();
  300. }
  301. public void OnNext(int value)
  302. {
  303. throw new NotImplementedException();
  304. }
  305. }
  306. [Fact]
  307. public void Do1()
  308. {
  309. var sum = 0;
  310. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  311. var ys = xs.Do(x => sum += x);
  312. var e = ys.GetAsyncEnumerator();
  313. HasNext(e, 1);
  314. Assert.Equal(1, sum);
  315. HasNext(e, 2);
  316. Assert.Equal(3, sum);
  317. HasNext(e, 3);
  318. Assert.Equal(6, sum);
  319. HasNext(e, 4);
  320. Assert.Equal(10, sum);
  321. NoNext(e);
  322. }
  323. [Fact]
  324. public void Do2()
  325. {
  326. var ex = new Exception("Bang");
  327. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  328. var ys = xs.Do(x => { throw ex; });
  329. var e = ys.GetAsyncEnumerator();
  330. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  331. }
  332. [Fact]
  333. public void Do3()
  334. {
  335. var sum = 0;
  336. var fail = false;
  337. var done = false;
  338. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  339. var ys = xs.Do(x => sum += x, ex => { fail = true; }, () => { done = true; });
  340. var e = ys.GetAsyncEnumerator();
  341. HasNext(e, 1);
  342. Assert.Equal(1, sum);
  343. HasNext(e, 2);
  344. Assert.Equal(3, sum);
  345. HasNext(e, 3);
  346. Assert.Equal(6, sum);
  347. HasNext(e, 4);
  348. Assert.Equal(10, sum);
  349. NoNext(e);
  350. Assert.False(fail);
  351. Assert.True(done);
  352. }
  353. [Fact]
  354. public void Do4()
  355. {
  356. var sum = 0;
  357. var done = false;
  358. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  359. var ys = xs.Do(x => sum += x, () => { done = true; });
  360. var e = ys.GetAsyncEnumerator();
  361. HasNext(e, 1);
  362. Assert.Equal(1, sum);
  363. HasNext(e, 2);
  364. Assert.Equal(3, sum);
  365. HasNext(e, 3);
  366. Assert.Equal(6, sum);
  367. HasNext(e, 4);
  368. Assert.Equal(10, sum);
  369. NoNext(e);
  370. Assert.True(done);
  371. }
  372. [Fact]
  373. public void Do5()
  374. {
  375. var ex = new Exception("Bang");
  376. var exa = default(Exception);
  377. var done = false;
  378. var hasv = false;
  379. var xs = AsyncEnumerable.Throw<int>(ex);
  380. var ys = xs.Do(x => { hasv = true; }, exx => { exa = exx; }, () => { done = true; });
  381. var e = ys.GetAsyncEnumerator();
  382. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ex_.InnerException == ex);
  383. Assert.False(hasv);
  384. Assert.False(done);
  385. Assert.Same(exa, ex);
  386. }
  387. [Fact]
  388. public void Do6()
  389. {
  390. var ex = new Exception("Bang");
  391. var exa = default(Exception);
  392. var hasv = false;
  393. var xs = AsyncEnumerable.Throw<int>(ex);
  394. var ys = xs.Do(x => { hasv = true; }, exx => { exa = exx; });
  395. var e = ys.GetAsyncEnumerator();
  396. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ex_.InnerException == ex);
  397. Assert.False(hasv);
  398. Assert.Same(exa, ex);
  399. }
  400. [Fact]
  401. public async Task Do7()
  402. {
  403. var sum = 0;
  404. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  405. var ys = xs.Do(x => sum += x);
  406. await SequenceIdentity(ys);
  407. Assert.Equal(20, sum);
  408. }
  409. [Fact]
  410. public async Task ForEachAsync_Null()
  411. {
  412. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(null, x => { }));
  413. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(AsyncEnumerable.Return(42), default(Action<int>)));
  414. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(null, (x, i) => { }));
  415. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(AsyncEnumerable.Return(42), default(Action<int, int>)));
  416. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(null, x => { }, CancellationToken.None));
  417. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(AsyncEnumerable.Return(42), default(Action<int>), CancellationToken.None));
  418. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(null, (x, i) => { }, CancellationToken.None));
  419. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(AsyncEnumerable.Return(42), default(Action<int, int>), CancellationToken.None));
  420. }
  421. [Fact]
  422. public void ForEachAsync1()
  423. {
  424. var sum = 0;
  425. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  426. xs.ForEachAsync(x => sum += x).Wait(WaitTimeoutMs);
  427. Assert.Equal(10, sum);
  428. }
  429. [Fact]
  430. public void ForEachAsync2()
  431. {
  432. var sum = 0;
  433. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  434. xs.ForEachAsync((x, i) => sum += x * i).Wait(WaitTimeoutMs);
  435. Assert.Equal(1 * 0 + 2 * 1 + 3 * 2 + 4 * 3, sum);
  436. }
  437. [Fact]
  438. public void ForEachAsync3()
  439. {
  440. var ex = new Exception("Bang");
  441. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  442. AssertThrows<Exception>(() => xs.ForEachAsync(x => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  443. }
  444. [Fact]
  445. public void ForEachAsync4()
  446. {
  447. var ex = new Exception("Bang");
  448. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  449. AssertThrows<Exception>(() => xs.ForEachAsync((x, i) => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  450. }
  451. [Fact]
  452. public void ForEachAsync5()
  453. {
  454. var ex = new Exception("Bang");
  455. var xs = AsyncEnumerable.Throw<int>(ex);
  456. AssertThrows<Exception>(() => xs.ForEachAsync(x => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  457. }
  458. [Fact]
  459. public void ForEachAsync6()
  460. {
  461. var ex = new Exception("Bang");
  462. var xs = AsyncEnumerable.Throw<int>(ex);
  463. AssertThrows<Exception>(() => xs.ForEachAsync((x, i) => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  464. }
  465. [Fact]
  466. public void Distinct_Null()
  467. {
  468. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Distinct<int>(null));
  469. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Distinct<int>(null, new Eq()));
  470. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Distinct<int>(AsyncEnumerable.Return(42), null));
  471. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Distinct<int, int>(AsyncEnumerable.Return(42), (Func<int, int>)null));
  472. }
  473. [Fact]
  474. public void Distinct1()
  475. {
  476. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  477. var e = xs.GetAsyncEnumerator();
  478. HasNext(e, 1);
  479. HasNext(e, 2);
  480. HasNext(e, 3);
  481. HasNext(e, 5);
  482. HasNext(e, 4);
  483. NoNext(e);
  484. }
  485. [Fact]
  486. public void Distinct2()
  487. {
  488. var xs = new[] { 1, -2, -1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(new Eq());
  489. var e = xs.GetAsyncEnumerator();
  490. HasNext(e, 1);
  491. HasNext(e, -2);
  492. HasNext(e, 3);
  493. HasNext(e, 5);
  494. HasNext(e, 4);
  495. NoNext(e);
  496. }
  497. [Fact]
  498. public async Task Distinct3()
  499. {
  500. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  501. var res = new[] { 1, 2, 3, 5, 4 };
  502. Assert.True(res.SequenceEqual(await xs.ToArray()));
  503. }
  504. [Fact]
  505. public async Task Distinct4()
  506. {
  507. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  508. var res = new List<int> { 1, 2, 3, 5, 4 };
  509. Assert.True(res.SequenceEqual(await xs.ToList()));
  510. }
  511. [Fact]
  512. public async Task Distinct5()
  513. {
  514. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  515. Assert.Equal(5, await xs.Count());
  516. }
  517. [Fact]
  518. public async Task Distinct6()
  519. {
  520. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(k => k);
  521. var res = new[] { 1, 2, 3, 5, 4 };
  522. Assert.True(res.SequenceEqual(await xs.ToArray()));
  523. }
  524. [Fact]
  525. public async Task Distinct7()
  526. {
  527. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(k => k);
  528. var res = new List<int> { 1, 2, 3, 5, 4 };
  529. Assert.True(res.SequenceEqual(await xs.ToList()));
  530. }
  531. [Fact]
  532. public async Task Distinct8()
  533. {
  534. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(k => k);
  535. Assert.Equal(5, await xs.Count());
  536. }
  537. [Fact]
  538. public async Task Distinct9()
  539. {
  540. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(k => k);
  541. await SequenceIdentity(xs);
  542. }
  543. [Fact]
  544. public async Task Distinct10()
  545. {
  546. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  547. await SequenceIdentity(xs);
  548. }
  549. [Fact]
  550. public void Distinct11()
  551. {
  552. var xs = AsyncEnumerable.Empty<int>().Distinct(k => k);
  553. var e = xs.GetAsyncEnumerator();
  554. NoNext(e);
  555. }
  556. [Fact]
  557. public void Distinct12()
  558. {
  559. var xs = AsyncEnumerable.Empty<int>().Distinct();
  560. var e = xs.GetAsyncEnumerator();
  561. NoNext(e);
  562. }
  563. [Fact]
  564. public void OrderBy_Null()
  565. {
  566. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderBy<int, int>(default(IAsyncEnumerable<int>), x => x));
  567. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderBy<int, int>(AsyncEnumerable.Return(42), default(Func<int, int>)));
  568. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderBy<int, int>(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default));
  569. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderBy<int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), Comparer<int>.Default));
  570. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderBy<int, int>(AsyncEnumerable.Return(42), x => x, default(IComparer<int>)));
  571. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderByDescending<int, int>(default(IAsyncEnumerable<int>), x => x));
  572. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderByDescending<int, int>(AsyncEnumerable.Return(42), default(Func<int, int>)));
  573. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderByDescending<int, int>(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default));
  574. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderByDescending<int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), Comparer<int>.Default));
  575. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.OrderByDescending<int, int>(AsyncEnumerable.Return(42), x => x, default(IComparer<int>)));
  576. var xs = AsyncEnumerable.Return(42).OrderBy(x => x);
  577. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenBy<int, int>(default(IOrderedAsyncEnumerable<int>), x => x));
  578. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenBy<int, int>(xs, default(Func<int, int>)));
  579. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenBy<int, int>(default(IOrderedAsyncEnumerable<int>), x => x, Comparer<int>.Default));
  580. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenBy<int, int>(xs, default(Func<int, int>), Comparer<int>.Default));
  581. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenBy<int, int>(xs, x => x, default(IComparer<int>)));
  582. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenByDescending<int, int>(default(IOrderedAsyncEnumerable<int>), x => x));
  583. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenByDescending<int, int>(xs, default(Func<int, int>)));
  584. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenByDescending<int, int>(default(IOrderedAsyncEnumerable<int>), x => x, Comparer<int>.Default));
  585. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenByDescending<int, int>(xs, default(Func<int, int>), Comparer<int>.Default));
  586. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ThenByDescending<int, int>(xs, x => x, default(IComparer<int>)));
  587. }
  588. [Fact]
  589. public void OrderBy1()
  590. {
  591. var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable();
  592. var ys = xs.OrderBy(x => x);
  593. var e = ys.GetAsyncEnumerator();
  594. for (var i = 0; i < 10; i++)
  595. HasNext(e, i);
  596. NoNext(e);
  597. }
  598. [Fact]
  599. public void OrderBy2()
  600. {
  601. var ex = new Exception("Bang!");
  602. var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable();
  603. var ys = xs.OrderBy<int, int>(new Func<int, int>(x => { throw ex; }));
  604. var e = ys.GetAsyncEnumerator();
  605. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  606. }
  607. [Fact]
  608. public async Task OrderBy3()
  609. {
  610. var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable();
  611. var ys = xs.OrderBy(x => x);
  612. await SequenceIdentity(ys);
  613. }
  614. [Fact]
  615. public void ThenBy2()
  616. {
  617. var ex = new Exception("Bang!");
  618. var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable();
  619. var ys = xs.OrderBy(x => x).ThenBy<int, int>(new Func<int, int>(x => { throw ex; }));
  620. var e = ys.GetAsyncEnumerator();
  621. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  622. }
  623. [Fact]
  624. public void OrderByDescending1()
  625. {
  626. var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable();
  627. var ys = xs.OrderByDescending(x => x);
  628. var e = ys.GetAsyncEnumerator();
  629. for (var i = 9; i >= 0; i--)
  630. HasNext(e, i);
  631. NoNext(e);
  632. }
  633. [Fact]
  634. public void OrderByDescending2()
  635. {
  636. var ex = new Exception("Bang!");
  637. var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable();
  638. var ys = xs.OrderByDescending<int, int>(new Func<int, int>(x => { throw ex; }));
  639. var e = ys.GetAsyncEnumerator();
  640. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  641. }
  642. [Fact]
  643. public async Task OrderByDescending3()
  644. {
  645. var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable();
  646. var ys = xs.OrderByDescending(x => x);
  647. await SequenceIdentity(ys);
  648. }
  649. [Fact]
  650. public void ThenByDescending2()
  651. {
  652. var ex = new Exception("Bang!");
  653. var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable();
  654. var ys = xs.OrderBy<int, int>(x => x).ThenByDescending<int, int>(new Func<int, int>(x => { throw ex; }));
  655. var e = ys.GetAsyncEnumerator();
  656. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  657. }
  658. [Fact]
  659. public void OrderByThenBy1()
  660. {
  661. var xs = new[] {
  662. new { Name = "Bart", Age = 27 },
  663. new { Name = "John", Age = 62 },
  664. new { Name = "Eric", Age = 27 },
  665. new { Name = "Lisa", Age = 14 },
  666. new { Name = "Brad", Age = 27 },
  667. new { Name = "Lisa", Age = 23 },
  668. new { Name = "Eric", Age = 42 },
  669. };
  670. var ys = xs.ToAsyncEnumerable();
  671. var ress = xs.OrderBy(x => x.Name).ThenBy(x => x.Age);
  672. var resa = ys.OrderBy(x => x.Name).ThenBy(x => x.Age);
  673. Assert.True(ress.SequenceEqual(resa.ToEnumerable()));
  674. }
  675. [Fact]
  676. public void OrderByThenBy2()
  677. {
  678. var xs = new[] {
  679. new { Name = "Bart", Age = 27 },
  680. new { Name = "John", Age = 62 },
  681. new { Name = "Eric", Age = 27 },
  682. new { Name = "Lisa", Age = 14 },
  683. new { Name = "Brad", Age = 27 },
  684. new { Name = "Lisa", Age = 23 },
  685. new { Name = "Eric", Age = 42 },
  686. };
  687. var ys = xs.ToAsyncEnumerable();
  688. var ress = xs.OrderBy(x => x.Name).ThenByDescending(x => x.Age);
  689. var resa = ys.OrderBy(x => x.Name).ThenByDescending(x => x.Age);
  690. Assert.True(ress.SequenceEqual(resa.ToEnumerable()));
  691. }
  692. [Fact]
  693. public void OrderByThenBy3()
  694. {
  695. var xs = new[] {
  696. new { Name = "Bart", Age = 27 },
  697. new { Name = "John", Age = 62 },
  698. new { Name = "Eric", Age = 27 },
  699. new { Name = "Lisa", Age = 14 },
  700. new { Name = "Brad", Age = 27 },
  701. new { Name = "Lisa", Age = 23 },
  702. new { Name = "Eric", Age = 42 },
  703. };
  704. var ys = xs.ToAsyncEnumerable();
  705. var ress = xs.OrderByDescending(x => x.Name).ThenBy(x => x.Age);
  706. var resa = ys.OrderByDescending(x => x.Name).ThenBy(x => x.Age);
  707. Assert.True(ress.SequenceEqual(resa.ToEnumerable()));
  708. }
  709. [Fact]
  710. public void OrderByThenBy4()
  711. {
  712. var xs = new[] {
  713. new { Name = "Bart", Age = 27 },
  714. new { Name = "John", Age = 62 },
  715. new { Name = "Eric", Age = 27 },
  716. new { Name = "Lisa", Age = 14 },
  717. new { Name = "Brad", Age = 27 },
  718. new { Name = "Lisa", Age = 23 },
  719. new { Name = "Eric", Age = 42 },
  720. };
  721. var ys = xs.ToAsyncEnumerable();
  722. var ress = xs.OrderByDescending(x => x.Name).ThenByDescending(x => x.Age);
  723. var resa = ys.OrderByDescending(x => x.Name).ThenByDescending(x => x.Age);
  724. Assert.True(ress.SequenceEqual(resa.ToEnumerable()));
  725. }
  726. [Fact]
  727. public void GroupBy_Null()
  728. {
  729. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(null, x => x));
  730. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(AsyncEnumerable.Return(42), default(Func<int, int>)));
  731. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(null, x => x, EqualityComparer<int>.Default));
  732. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), EqualityComparer<int>.Default));
  733. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(AsyncEnumerable.Return(42), x => x, default(IEqualityComparer<int>)));
  734. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(null, x => x, x => x));
  735. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), x => x));
  736. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), x => x, default(Func<int, int>)));
  737. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(null, x => x, x => x, EqualityComparer<int>.Default));
  738. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), x => x, EqualityComparer<int>.Default));
  739. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), x => x, default(Func<int, int>), EqualityComparer<int>.Default));
  740. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), x => x, x => x, default(IEqualityComparer<int>)));
  741. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(null, x => x, (x, ys) => x));
  742. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), (x, ys) => x));
  743. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), x => x, default(Func<int, IAsyncEnumerable<int>, int>)));
  744. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(null, x => x, (x, ys) => x, EqualityComparer<int>.Default));
  745. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), (x, ys) => x, EqualityComparer<int>.Default));
  746. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), x => x, default(Func<int, IAsyncEnumerable<int>, int>), EqualityComparer<int>.Default));
  747. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(AsyncEnumerable.Return(42), x => x, (x, ys) => x, default(IEqualityComparer<int>)));
  748. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(null, x => x, x => x, (x, ys) => x));
  749. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), x => x, (x, ys) => x));
  750. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(AsyncEnumerable.Return(42), x => x, default(Func<int, int>), (x, ys) => x));
  751. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(AsyncEnumerable.Return(42), x => x, x => x, default(Func<int, IAsyncEnumerable<int>, int>)));
  752. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(null, x => x, x => x, (x, ys) => x, EqualityComparer<int>.Default));
  753. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(AsyncEnumerable.Return(42), default(Func<int, int>), x => x, (x, ys) => x, EqualityComparer<int>.Default));
  754. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(AsyncEnumerable.Return(42), x => x, default(Func<int, int>), (x, ys) => x, EqualityComparer<int>.Default));
  755. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(AsyncEnumerable.Return(42), x => x, x => x, default(Func<int, IAsyncEnumerable<int>, int>), EqualityComparer<int>.Default));
  756. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(AsyncEnumerable.Return(42), x => x, x => x, (x, ys) => x, default(IEqualityComparer<int>)));
  757. }
  758. [Fact]
  759. public void GroupBy1()
  760. {
  761. var xs = new[] {
  762. new { Name = "Bart", Age = 27 },
  763. new { Name = "John", Age = 62 },
  764. new { Name = "Eric", Age = 27 },
  765. new { Name = "Lisa", Age = 14 },
  766. new { Name = "Brad", Age = 27 },
  767. new { Name = "Lisa", Age = 23 },
  768. new { Name = "Eric", Age = 42 },
  769. };
  770. var ys = xs.ToAsyncEnumerable();
  771. var res = ys.GroupBy(x => x.Age / 10);
  772. var e = res.GetAsyncEnumerator();
  773. Assert.True(e.MoveNextAsync().Result);
  774. Assert.Equal(2, e.Current.Key);
  775. var g1 = e.Current.GetAsyncEnumerator();
  776. HasNext(g1, xs[0]);
  777. HasNext(g1, xs[2]);
  778. HasNext(g1, xs[4]);
  779. HasNext(g1, xs[5]);
  780. NoNext(g1);
  781. Assert.True(e.MoveNextAsync().Result);
  782. Assert.Equal(6, e.Current.Key);
  783. var g2 = e.Current.GetAsyncEnumerator();
  784. HasNext(g2, xs[1]);
  785. NoNext(g2);
  786. Assert.True(e.MoveNextAsync().Result);
  787. Assert.Equal(1, e.Current.Key);
  788. var g3 = e.Current.GetAsyncEnumerator();
  789. HasNext(g3, xs[3]);
  790. NoNext(g3);
  791. Assert.True(e.MoveNextAsync().Result);
  792. Assert.Equal(4, e.Current.Key);
  793. var g4 = e.Current.GetAsyncEnumerator();
  794. HasNext(g4, xs[6]);
  795. NoNext(g4);
  796. NoNext(e);
  797. }
  798. [Fact]
  799. public void GroupBy2()
  800. {
  801. var xs = new[] {
  802. new { Name = "Bart", Age = 27 },
  803. new { Name = "John", Age = 62 },
  804. new { Name = "Eric", Age = 27 },
  805. new { Name = "Lisa", Age = 14 },
  806. new { Name = "Brad", Age = 27 },
  807. new { Name = "Lisa", Age = 23 },
  808. new { Name = "Eric", Age = 42 },
  809. };
  810. var ys = xs.ToAsyncEnumerable();
  811. var res = ys.GroupBy(x => x.Age / 10);
  812. var e = res.GetAsyncEnumerator();
  813. Assert.True(e.MoveNextAsync().Result);
  814. var g1 = e.Current;
  815. Assert.Equal(2, g1.Key);
  816. Assert.True(e.MoveNextAsync().Result);
  817. var g2 = e.Current;
  818. Assert.Equal(6, g2.Key);
  819. Assert.True(e.MoveNextAsync().Result);
  820. var g3 = e.Current;
  821. Assert.Equal(1, g3.Key);
  822. Assert.True(e.MoveNextAsync().Result);
  823. var g4 = e.Current;
  824. Assert.Equal(4, g4.Key);
  825. NoNext(e);
  826. var g1e = g1.GetAsyncEnumerator();
  827. HasNext(g1e, xs[0]);
  828. HasNext(g1e, xs[2]);
  829. HasNext(g1e, xs[4]);
  830. HasNext(g1e, xs[5]);
  831. NoNext(g1e);
  832. var g2e = g2.GetAsyncEnumerator();
  833. HasNext(g2e, xs[1]);
  834. NoNext(g2e);
  835. var g3e = g3.GetAsyncEnumerator();
  836. HasNext(g3e, xs[3]);
  837. NoNext(g3e);
  838. var g4e = g4.GetAsyncEnumerator();
  839. HasNext(g4e, xs[6]);
  840. NoNext(g4e);
  841. }
  842. [Fact]
  843. public void GroupBy3()
  844. {
  845. var xs = AsyncEnumerable.Empty<int>();
  846. var ys = xs.GroupBy(x => x);
  847. var e = ys.GetAsyncEnumerator();
  848. NoNext(e);
  849. }
  850. [Fact]
  851. public void GroupBy4()
  852. {
  853. var ex = new Exception("Bang!");
  854. var xs = AsyncEnumerable.Throw<int>(ex);
  855. var ys = xs.GroupBy(x => x);
  856. var e = ys.GetAsyncEnumerator();
  857. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  858. }
  859. [Fact]
  860. public void GroupBy5()
  861. {
  862. var xs = GetXs().ToAsyncEnumerable();
  863. var ys = xs.GroupBy(x => x);
  864. var e = ys.GetAsyncEnumerator();
  865. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!");
  866. //Assert.True(e.MoveNext().Result);
  867. //var g1 = e.Current;
  868. //Assert.Equal(g1.Key, 42);
  869. //var g1e = g1.GetEnumerator();
  870. //HasNext(g1e, 42);
  871. //Assert.True(e.MoveNext().Result);
  872. //var g2 = e.Current;
  873. //Assert.Equal(g2.Key, 43);
  874. //var g2e = g2.GetEnumerator();
  875. //HasNext(g2e, 43);
  876. //AssertThrows<Exception>(() => g1e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!");
  877. //AssertThrows<Exception>(() => g2e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!");
  878. }
  879. [Fact]
  880. public void GroupBy6()
  881. {
  882. var xs = GetXs().ToAsyncEnumerable();
  883. var ys = xs.GroupBy(x => x);
  884. var e = ys.GetAsyncEnumerator();
  885. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!");
  886. //Assert.True(e.MoveNext().Result);
  887. //var g1 = e.Current;
  888. //Assert.Equal(g1.Key, 42);
  889. //var g1e = g1.GetEnumerator();
  890. //HasNext(g1e, 42);
  891. //AssertThrows<Exception>(() => g1e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!");
  892. }
  893. static IEnumerable<int> GetXs()
  894. {
  895. yield return 42;
  896. yield return 43;
  897. throw new Exception("Bang!");
  898. }
  899. [Fact]
  900. public void GroupBy7()
  901. {
  902. var ex = new Exception("Bang!");
  903. var xs = AsyncEnumerable.Return(42);
  904. var ys = xs.GroupBy<int, int>(new Func<int, int>(x => { throw ex; }));
  905. var e = ys.GetAsyncEnumerator();
  906. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  907. }
  908. [Fact]
  909. public void GroupBy8()
  910. {
  911. var ex = new Exception("Bang!");
  912. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable();
  913. var ys = xs.GroupBy<int, int>(x => { if (x == 3) throw ex; return x; });
  914. var e = ys.GetAsyncEnumerator();
  915. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  916. //Assert.True(e.MoveNext().Result);
  917. //var g1 = e.Current;
  918. //Assert.Equal(g1.Key, 1);
  919. //var g1e = g1.GetEnumerator();
  920. //HasNext(g1e, 1);
  921. //Assert.True(e.MoveNext().Result);
  922. //var g2 = e.Current;
  923. //Assert.Equal(g2.Key, 2);
  924. //var g2e = g2.GetEnumerator();
  925. //HasNext(g2e, 2);
  926. //AssertThrows<Exception>(() => g1e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  927. //AssertThrows<Exception>(() => g2e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  928. }
  929. [Fact]
  930. public void GroupBy9()
  931. {
  932. var xs = AsyncEnumerable.Range(0, 10);
  933. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x));
  934. var e = ys.GetAsyncEnumerator();
  935. Assert.True(e.MoveNextAsync().Result);
  936. var g1 = e.Current;
  937. Assert.Equal(0, g1.Key);
  938. var g1e = g1.GetAsyncEnumerator();
  939. HasNext(g1e, 'a');
  940. HasNext(g1e, 'd');
  941. HasNext(g1e, 'g');
  942. HasNext(g1e, 'j');
  943. NoNext(g1e);
  944. Assert.True(e.MoveNextAsync().Result);
  945. var g2 = e.Current;
  946. Assert.Equal(1, g2.Key);
  947. var g2e = g2.GetAsyncEnumerator();
  948. HasNext(g2e, 'b');
  949. HasNext(g2e, 'e');
  950. HasNext(g2e, 'h');
  951. NoNext(g2e);
  952. Assert.True(e.MoveNextAsync().Result);
  953. var g3 = e.Current;
  954. Assert.Equal(2, g3.Key);
  955. var g3e = g3.GetAsyncEnumerator();
  956. HasNext(g3e, 'c');
  957. HasNext(g3e, 'f');
  958. HasNext(g3e, 'i');
  959. NoNext(g3e);
  960. NoNext(e);
  961. }
  962. [Fact]
  963. public void GroupBy10()
  964. {
  965. var xs = AsyncEnumerable.Range(0, 10);
  966. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result);
  967. var e = ys.GetAsyncEnumerator();
  968. HasNext(e, "0 - adgj");
  969. HasNext(e, "1 - beh");
  970. HasNext(e, "2 - cfi");
  971. NoNext(e);
  972. }
  973. [Fact]
  974. public void GroupBy11()
  975. {
  976. var xs = AsyncEnumerable.Range(0, 10);
  977. var ys = xs.GroupBy(x => x % 3, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result);
  978. var e = ys.GetAsyncEnumerator();
  979. HasNext(e, "0 - 0369");
  980. HasNext(e, "1 - 147");
  981. HasNext(e, "2 - 258");
  982. NoNext(e);
  983. }
  984. [Fact]
  985. public void GroupBy12()
  986. {
  987. var xs = AsyncEnumerable.Range(0, 10);
  988. var ys = xs.GroupBy(x => x, new EqMod(3));
  989. var e = ys.GetAsyncEnumerator();
  990. Assert.True(e.MoveNextAsync().Result);
  991. var g1 = e.Current;
  992. Assert.Equal(0, g1.Key);
  993. var g1e = g1.GetAsyncEnumerator();
  994. HasNext(g1e, 0);
  995. HasNext(g1e, 3);
  996. HasNext(g1e, 6);
  997. HasNext(g1e, 9);
  998. NoNext(g1e);
  999. Assert.True(e.MoveNextAsync().Result);
  1000. var g2 = e.Current;
  1001. Assert.Equal(1, g2.Key);
  1002. var g2e = g2.GetAsyncEnumerator();
  1003. HasNext(g2e, 1);
  1004. HasNext(g2e, 4);
  1005. HasNext(g2e, 7);
  1006. NoNext(g2e);
  1007. Assert.True(e.MoveNextAsync().Result);
  1008. var g3 = e.Current;
  1009. Assert.Equal(2, g3.Key);
  1010. var g3e = g3.GetAsyncEnumerator();
  1011. HasNext(g3e, 2);
  1012. HasNext(g3e, 5);
  1013. HasNext(g3e, 8);
  1014. NoNext(g3e);
  1015. NoNext(e);
  1016. }
  1017. [Fact]
  1018. public void GroupBy13()
  1019. {
  1020. var xs = AsyncEnumerable.Range(0, 10);
  1021. var ys = xs.GroupBy(x => x, x => (char)('a' + x), new EqMod(3));
  1022. var e = ys.GetAsyncEnumerator();
  1023. Assert.True(e.MoveNextAsync().Result);
  1024. var g1 = e.Current;
  1025. Assert.Equal(0, g1.Key);
  1026. var g1e = g1.GetAsyncEnumerator();
  1027. HasNext(g1e, 'a');
  1028. HasNext(g1e, 'd');
  1029. HasNext(g1e, 'g');
  1030. HasNext(g1e, 'j');
  1031. NoNext(g1e);
  1032. Assert.True(e.MoveNextAsync().Result);
  1033. var g2 = e.Current;
  1034. Assert.Equal(1, g2.Key);
  1035. var g2e = g2.GetAsyncEnumerator();
  1036. HasNext(g2e, 'b');
  1037. HasNext(g2e, 'e');
  1038. HasNext(g2e, 'h');
  1039. NoNext(g2e);
  1040. Assert.True(e.MoveNextAsync().Result);
  1041. var g3 = e.Current;
  1042. Assert.Equal(2, g3.Key);
  1043. var g3e = g3.GetAsyncEnumerator();
  1044. HasNext(g3e, 'c');
  1045. HasNext(g3e, 'f');
  1046. HasNext(g3e, 'i');
  1047. NoNext(g3e);
  1048. NoNext(e);
  1049. }
  1050. [Fact]
  1051. public void GroupBy14()
  1052. {
  1053. var xs = AsyncEnumerable.Range(0, 10);
  1054. var ys = xs.GroupBy(x => x, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3));
  1055. var e = ys.GetAsyncEnumerator();
  1056. HasNext(e, "0 - adgj");
  1057. HasNext(e, "1 - beh");
  1058. HasNext(e, "2 - cfi");
  1059. NoNext(e);
  1060. }
  1061. [Fact]
  1062. public void GroupBy15()
  1063. {
  1064. var xs = AsyncEnumerable.Range(0, 10);
  1065. var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3));
  1066. var e = ys.GetAsyncEnumerator();
  1067. HasNext(e, "0 - 0369");
  1068. HasNext(e, "1 - 147");
  1069. HasNext(e, "2 - 258");
  1070. NoNext(e);
  1071. }
  1072. [Fact]
  1073. public async Task GroupBy16()
  1074. {
  1075. var xs = AsyncEnumerable.Range(0, 10);
  1076. var ys = xs.GroupBy(x => x, x => (char)('a' + x), new EqMod(3));
  1077. var e = ys.GetAsyncEnumerator();
  1078. Assert.True(e.MoveNextAsync().Result);
  1079. var g1 = e.Current;
  1080. Assert.Equal(0, g1.Key);
  1081. var g1e = g1.GetAsyncEnumerator();
  1082. HasNext(g1e, 'a');
  1083. HasNext(g1e, 'd');
  1084. HasNext(g1e, 'g');
  1085. HasNext(g1e, 'j');
  1086. NoNext(g1e);
  1087. await g1e.DisposeAsync();
  1088. Assert.True(e.MoveNextAsync().Result);
  1089. var g2 = e.Current;
  1090. Assert.Equal(1, g2.Key);
  1091. var g2e = g2.GetAsyncEnumerator();
  1092. HasNext(g2e, 'b');
  1093. HasNext(g2e, 'e');
  1094. HasNext(g2e, 'h');
  1095. NoNext(g2e);
  1096. await g2e.DisposeAsync();
  1097. Assert.True(e.MoveNextAsync().Result);
  1098. var g3 = e.Current;
  1099. Assert.Equal(2, g3.Key);
  1100. var g3e = g3.GetAsyncEnumerator();
  1101. HasNext(g3e, 'c');
  1102. HasNext(g3e, 'f');
  1103. HasNext(g3e, 'i');
  1104. NoNext(g3e);
  1105. await g3e.DisposeAsync();
  1106. NoNext(e);
  1107. await e.DisposeAsync();
  1108. }
  1109. [Fact]
  1110. public async Task GroupBy17()
  1111. {
  1112. var xs = AsyncEnumerable.Range(0, 10);
  1113. var ys = xs.GroupBy(x => x, x => (char)('a' + x), new EqMod(3));
  1114. var e = ys.GetAsyncEnumerator();
  1115. await e.DisposeAsync();
  1116. Assert.False(e.MoveNextAsync().Result);
  1117. }
  1118. [Fact]
  1119. public async Task GroupBy18()
  1120. {
  1121. var xs = AsyncEnumerable.Range(0, 10);
  1122. var ys = xs.GroupBy(x => x, x => (char)('a' + x), new EqMod(3));
  1123. var e = ys.GetAsyncEnumerator();
  1124. Assert.True(e.MoveNextAsync().Result);
  1125. var g1 = e.Current;
  1126. Assert.Equal(0, g1.Key);
  1127. var g1e = g1.GetAsyncEnumerator();
  1128. HasNext(g1e, 'a');
  1129. await e.DisposeAsync();
  1130. HasNext(g1e, 'd');
  1131. HasNext(g1e, 'g');
  1132. HasNext(g1e, 'j');
  1133. NoNext(g1e);
  1134. await g1e.DisposeAsync();
  1135. Assert.False(e.MoveNextAsync().Result);
  1136. }
  1137. [Fact]
  1138. public async Task GroupBy19()
  1139. {
  1140. // We're using Kvp here because the types will eval as equal for this test
  1141. var xs = new[]
  1142. {
  1143. new Kvp("Bart", 27),
  1144. new Kvp("John", 62),
  1145. new Kvp("Eric", 27),
  1146. new Kvp("Lisa", 14),
  1147. new Kvp("Brad", 27),
  1148. new Kvp("Lisa", 23),
  1149. new Kvp("Eric", 42)
  1150. };
  1151. var ys = xs.ToAsyncEnumerable();
  1152. var res = ys.GroupBy(x => x.Item / 10);
  1153. await SequenceIdentity(res);
  1154. }
  1155. [Fact]
  1156. public async Task GroupBy20()
  1157. {
  1158. var xs = AsyncEnumerable.Range(0, 10);
  1159. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result);
  1160. var arr = new[] { "0 - adgj", "1 - beh", "2 - cfi" };
  1161. Assert.Equal(arr, await ys.ToArray());
  1162. }
  1163. [Fact]
  1164. public async Task GroupBy21()
  1165. {
  1166. var xs = AsyncEnumerable.Range(0, 10);
  1167. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result);
  1168. var arr = new List<string> { "0 - adgj", "1 - beh", "2 - cfi" };
  1169. Assert.Equal(arr, await ys.ToList());
  1170. }
  1171. [Fact]
  1172. public async Task GroupBy22()
  1173. {
  1174. var xs = AsyncEnumerable.Range(0, 10);
  1175. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result);
  1176. Assert.Equal(3, await ys.Count());
  1177. }
  1178. [Fact]
  1179. public async Task GroupBy23()
  1180. {
  1181. var xs = AsyncEnumerable.Range(0, 10);
  1182. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result);
  1183. await SequenceIdentity(ys);
  1184. }
  1185. [Fact]
  1186. public async Task GroupBy24()
  1187. {
  1188. var xs = AsyncEnumerable.Range(0, 10);
  1189. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x));
  1190. var g1a = new[] { 'a', 'd', 'g', 'j' };
  1191. var g2a = new[] { 'b', 'e', 'h' };
  1192. var g3a = new[] { 'c', 'f', 'i' };
  1193. var gar = await ys.ToArray();
  1194. Assert.Equal(3, gar.Length);
  1195. var gg1 = gar[0];
  1196. var gg1a = await gg1.ToArray();
  1197. Assert.Equal(g1a, gg1a);
  1198. var gg2 = gar[1];
  1199. var gg2a = await gg2.ToArray();
  1200. Assert.Equal(g2a, gg2a);
  1201. var gg3 = gar[2];
  1202. var gg3a = await gg3.ToArray();
  1203. Assert.Equal(g3a, gg3a);
  1204. }
  1205. [Fact]
  1206. public async Task GroupBy25()
  1207. {
  1208. var xs = AsyncEnumerable.Range(0, 10);
  1209. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x));
  1210. var g1a = new List<char> { 'a', 'd', 'g', 'j' };
  1211. var g2a = new List<char> { 'b', 'e', 'h' };
  1212. var g3a = new List<char> { 'c', 'f', 'i' };
  1213. var gar = await ys.ToList();
  1214. Assert.Equal(3, gar.Count);
  1215. var gg1 = gar[0];
  1216. var gg1a = await gg1.ToList();
  1217. Assert.Equal(g1a, gg1a);
  1218. var gg2 = gar[1];
  1219. var gg2a = await gg2.ToList();
  1220. Assert.Equal(g2a, gg2a);
  1221. var gg3 = gar[2];
  1222. var gg3a = await gg3.ToList();
  1223. Assert.Equal(g3a, gg3a);
  1224. }
  1225. [Fact]
  1226. public async Task GroupBy26()
  1227. {
  1228. var xs = AsyncEnumerable.Range(0, 10);
  1229. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x));
  1230. var gar = await ys.ToList();
  1231. Assert.Equal(3, gar.Count);
  1232. var gg1 = gar[0];
  1233. var gg1a = await gg1.Count();
  1234. Assert.Equal(4, gg1a);
  1235. var gg2 = gar[1];
  1236. var gg2a = await gg2.Count();
  1237. Assert.Equal(3, gg2a);
  1238. var gg3 = gar[2];
  1239. var gg3a = await gg3.Count();
  1240. Assert.Equal(3, gg3a);
  1241. }
  1242. [Fact]
  1243. public async Task GroupBy27()
  1244. {
  1245. var xs = AsyncEnumerable.Range(0, 10);
  1246. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x));
  1247. var gar = await ys.Count();
  1248. Assert.Equal(3, gar);
  1249. }
  1250. [Fact]
  1251. public async Task GroupBy28()
  1252. {
  1253. var xs = AsyncEnumerable.Range(0, 10);
  1254. var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x));
  1255. await SequenceIdentity(ys);
  1256. }
  1257. [Fact]
  1258. public async Task GroupBy29()
  1259. {
  1260. var xs = AsyncEnumerable.Range(0, 10);
  1261. var ys = xs.GroupBy(x => x, new EqMod(3));
  1262. var g1a = new List<int> { 0, 3, 6, 9 };
  1263. var g2a = new List<int> { 1, 4, 7 };
  1264. var g3a = new List<int> { 2, 5, 8 };
  1265. var gar = await ys.ToList();
  1266. Assert.Equal(3, gar.Count);
  1267. var gg1 = gar[0];
  1268. var gg1a = await gg1.ToList();
  1269. Assert.Equal(g1a, gg1a);
  1270. var gg2 = gar[1];
  1271. var gg2a = await gg2.ToList();
  1272. Assert.Equal(g2a, gg2a);
  1273. var gg3 = gar[2];
  1274. var gg3a = await gg3.ToList();
  1275. Assert.Equal(g3a, gg3a);
  1276. }
  1277. [Fact]
  1278. public async Task GroupBy30()
  1279. {
  1280. var xs = AsyncEnumerable.Range(0, 10);
  1281. var ys = xs.GroupBy(x => x, new EqMod(3));
  1282. var gar = await ys.ToList();
  1283. Assert.Equal(3, gar.Count);
  1284. var gg1 = gar[0];
  1285. var gg1a = await gg1.Count();
  1286. Assert.Equal(4, gg1a);
  1287. var gg2 = gar[1];
  1288. var gg2a = await gg2.Count();
  1289. Assert.Equal(3, gg2a);
  1290. var gg3 = gar[2];
  1291. var gg3a = await gg3.Count();
  1292. Assert.Equal(3, gg3a);
  1293. }
  1294. [Fact]
  1295. public async Task GroupBy31()
  1296. {
  1297. var xs = AsyncEnumerable.Range(0, 10);
  1298. var ys = xs.GroupBy(x => x, new EqMod(3));
  1299. var g1a = new[] { 0, 3, 6, 9 };
  1300. var g2a = new[] { 1, 4, 7 };
  1301. var g3a = new[] { 2, 5, 8 };
  1302. var gar = await ys.ToArray();
  1303. Assert.Equal(3, gar.Length);
  1304. var gg1 = gar[0];
  1305. var gg1a = await gg1.ToArray();
  1306. Assert.Equal(g1a, gg1a);
  1307. var gg2 = gar[1];
  1308. var gg2a = await gg2.ToArray();
  1309. Assert.Equal(g2a, gg2a);
  1310. var gg3 = gar[2];
  1311. var gg3a = await gg3.ToArray();
  1312. Assert.Equal(g3a, gg3a);
  1313. }
  1314. [Fact]
  1315. public async Task GroupBy32()
  1316. {
  1317. var xs = AsyncEnumerable.Range(0, 10);
  1318. var ys = xs.GroupBy(x => x, new EqMod(3));
  1319. var gar = await ys.Count();
  1320. Assert.Equal(3, gar);
  1321. }
  1322. [Fact]
  1323. public async Task GroupBy33()
  1324. {
  1325. var xs = AsyncEnumerable.Range(0, 10);
  1326. var ys = xs.GroupBy(x => x, new EqMod(3));
  1327. await SequenceIdentity(ys);
  1328. }
  1329. [Fact]
  1330. public async Task GroupBy34()
  1331. {
  1332. var xs = AsyncEnumerable.Range(0, 10);
  1333. var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3));
  1334. var arr = new[] { "0 - 0369", "1 - 147", "2 - 258" };
  1335. Assert.Equal(arr, await ys.ToArray());
  1336. }
  1337. [Fact]
  1338. public async Task GroupBy35()
  1339. {
  1340. var xs = AsyncEnumerable.Range(0, 10);
  1341. var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3));
  1342. var arr = new List<string> { "0 - 0369", "1 - 147", "2 - 258" };
  1343. Assert.Equal(arr, await ys.ToList());
  1344. }
  1345. [Fact]
  1346. public async Task GroupBy36()
  1347. {
  1348. var xs = AsyncEnumerable.Range(0, 10);
  1349. var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3));
  1350. Assert.Equal(3, await ys.Count());
  1351. }
  1352. [Fact]
  1353. public async Task GroupBy37()
  1354. {
  1355. var xs = AsyncEnumerable.Range(0, 10);
  1356. var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3));
  1357. await SequenceIdentity(ys);
  1358. }
  1359. class Kvp : IEquatable<Kvp>
  1360. {
  1361. public bool Equals(Kvp other)
  1362. {
  1363. if (ReferenceEquals(null, other)) return false;
  1364. if (ReferenceEquals(this, other)) return true;
  1365. return string.Equals(Key, other.Key) && Item == other.Item;
  1366. }
  1367. public override bool Equals(object obj)
  1368. {
  1369. if (ReferenceEquals(null, obj)) return false;
  1370. if (ReferenceEquals(this, obj)) return true;
  1371. if (obj.GetType() != GetType()) return false;
  1372. return Equals((Kvp)obj);
  1373. }
  1374. public override int GetHashCode()
  1375. {
  1376. unchecked
  1377. {
  1378. return ((Key != null ? Key.GetHashCode() : 0) * 397) ^ Item;
  1379. }
  1380. }
  1381. public static bool operator ==(Kvp left, Kvp right)
  1382. {
  1383. return Equals(left, right);
  1384. }
  1385. public static bool operator !=(Kvp left, Kvp right)
  1386. {
  1387. return !Equals(left, right);
  1388. }
  1389. public string Key { get; }
  1390. public int Item { get; }
  1391. public Kvp(string key, int item)
  1392. {
  1393. Key = key;
  1394. Item = item;
  1395. }
  1396. }
  1397. class EqMod : IEqualityComparer<int>
  1398. {
  1399. private readonly int _d;
  1400. public EqMod(int d)
  1401. {
  1402. _d = d;
  1403. }
  1404. public bool Equals(int x, int y)
  1405. {
  1406. return EqualityComparer<int>.Default.Equals(x % _d, y % _d);
  1407. }
  1408. public int GetHashCode(int obj)
  1409. {
  1410. return EqualityComparer<int>.Default.GetHashCode(obj % _d);
  1411. }
  1412. }
  1413. [Fact]
  1414. public void AsAsyncEnumerable_Null()
  1415. {
  1416. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.AsAsyncEnumerable<int>((IAsyncEnumerable<int>)null));
  1417. }
  1418. [Fact]
  1419. public void AsAsyncEnumerable1()
  1420. {
  1421. var xs = AsyncEnumerable.Return(42);
  1422. var ys = xs.AsAsyncEnumerable();
  1423. Assert.NotSame(xs, ys);
  1424. var e = xs.GetAsyncEnumerator();
  1425. HasNext(e, 42);
  1426. NoNext(e);
  1427. }
  1428. [Fact]
  1429. public void RepeatSeq_Null()
  1430. {
  1431. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Repeat(default(IAsyncEnumerable<int>)));
  1432. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Repeat(default(IAsyncEnumerable<int>), 3));
  1433. AssertThrows<ArgumentOutOfRangeException>(() => AsyncEnumerableEx.Repeat(AsyncEnumerable.Return(42), -1));
  1434. }
  1435. [Fact]
  1436. public void RepeatSeq1()
  1437. {
  1438. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat();
  1439. var e = xs.GetAsyncEnumerator();
  1440. HasNext(e, 1);
  1441. HasNext(e, 2);
  1442. HasNext(e, 3);
  1443. HasNext(e, 1);
  1444. HasNext(e, 2);
  1445. HasNext(e, 3);
  1446. HasNext(e, 1);
  1447. HasNext(e, 2);
  1448. HasNext(e, 3);
  1449. }
  1450. [Fact]
  1451. public void RepeatSeq2()
  1452. {
  1453. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(3);
  1454. var e = xs.GetAsyncEnumerator();
  1455. HasNext(e, 1);
  1456. HasNext(e, 2);
  1457. HasNext(e, 3);
  1458. HasNext(e, 1);
  1459. HasNext(e, 2);
  1460. HasNext(e, 3);
  1461. HasNext(e, 1);
  1462. HasNext(e, 2);
  1463. HasNext(e, 3);
  1464. NoNext(e);
  1465. }
  1466. [Fact]
  1467. public void RepeatSeq3()
  1468. {
  1469. var i = 0;
  1470. var xs = RepeatXs(() => i++).ToAsyncEnumerable().Repeat(3);
  1471. var e = xs.GetAsyncEnumerator();
  1472. HasNext(e, 1);
  1473. HasNext(e, 2);
  1474. HasNext(e, 1);
  1475. HasNext(e, 2);
  1476. HasNext(e, 1);
  1477. HasNext(e, 2);
  1478. NoNext(e);
  1479. Assert.Equal(3, i);
  1480. }
  1481. [Fact]
  1482. public void RepeatSeq0()
  1483. {
  1484. var i = 0;
  1485. var xs = RepeatXs(() => i++).ToAsyncEnumerable().Repeat(0);
  1486. var e = xs.GetAsyncEnumerator();
  1487. NoNext(e);
  1488. }
  1489. [Fact]
  1490. public async Task RepeatSeq6()
  1491. {
  1492. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(3);
  1493. await SequenceIdentity(xs);
  1494. }
  1495. static IEnumerable<int> RepeatXs(Action started)
  1496. {
  1497. started();
  1498. yield return 1;
  1499. yield return 2;
  1500. }
  1501. [Fact]
  1502. public void RepeatSeq4()
  1503. {
  1504. var xs = new FailRepeat().ToAsyncEnumerable().Repeat();
  1505. var e = xs.GetAsyncEnumerator();
  1506. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException);
  1507. }
  1508. [Fact]
  1509. public void RepeatSeq5()
  1510. {
  1511. var xs = new FailRepeat().ToAsyncEnumerable().Repeat(3);
  1512. var e = xs.GetAsyncEnumerator();
  1513. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException);
  1514. }
  1515. class FailRepeat : IEnumerable<int>
  1516. {
  1517. public IEnumerator<int> GetEnumerator()
  1518. {
  1519. throw new NotImplementedException();
  1520. }
  1521. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  1522. {
  1523. throw new NotImplementedException();
  1524. }
  1525. }
  1526. [Fact]
  1527. public void IgnoreElements_Null()
  1528. {
  1529. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.IgnoreElements(default(IAsyncEnumerable<int>)));
  1530. }
  1531. [Fact]
  1532. public void IgnoreElements1()
  1533. {
  1534. var xs = AsyncEnumerable.Empty<int>().IgnoreElements();
  1535. var e = xs.GetAsyncEnumerator();
  1536. NoNext(e);
  1537. AssertThrows<InvalidOperationException>(() => { var ignored = e.Current; });
  1538. }
  1539. [Fact]
  1540. public void IgnoreElements2()
  1541. {
  1542. var xs = AsyncEnumerable.Return(42).IgnoreElements();
  1543. var e = xs.GetAsyncEnumerator();
  1544. NoNext(e);
  1545. AssertThrows<InvalidOperationException>(() => { var ignored = e.Current; });
  1546. }
  1547. [Fact]
  1548. public void IgnoreElements3()
  1549. {
  1550. var xs = AsyncEnumerable.Range(0, 10).IgnoreElements();
  1551. var e = xs.GetAsyncEnumerator();
  1552. NoNext(e);
  1553. AssertThrows<InvalidOperationException>(() => { var ignored = e.Current; });
  1554. }
  1555. [Fact]
  1556. public void IgnoreElements4()
  1557. {
  1558. var ex = new Exception("Bang!");
  1559. var xs = AsyncEnumerable.Throw<int>(ex).IgnoreElements();
  1560. var e = xs.GetAsyncEnumerator();
  1561. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  1562. }
  1563. [Fact]
  1564. public async Task IgnoreElements5()
  1565. {
  1566. var xs = AsyncEnumerable.Range(0, 10).IgnoreElements();
  1567. await SequenceIdentity(xs);
  1568. }
  1569. [Fact]
  1570. public void StartWith_Null()
  1571. {
  1572. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.StartWith(default(IAsyncEnumerable<int>), new[] { 1 }));
  1573. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.StartWith(AsyncEnumerable.Return(42), null));
  1574. }
  1575. [Fact]
  1576. public void StartWith1()
  1577. {
  1578. var xs = AsyncEnumerable.Empty<int>().StartWith(1, 2);
  1579. var e = xs.GetAsyncEnumerator();
  1580. HasNext(e, 1);
  1581. HasNext(e, 2);
  1582. NoNext(e);
  1583. }
  1584. [Fact]
  1585. public void StartWith2()
  1586. {
  1587. var xs = AsyncEnumerable.Return<int>(0).StartWith(1, 2);
  1588. var e = xs.GetAsyncEnumerator();
  1589. HasNext(e, 1);
  1590. HasNext(e, 2);
  1591. HasNext(e, 0);
  1592. NoNext(e);
  1593. }
  1594. [Fact]
  1595. public void StartWith3()
  1596. {
  1597. var ex = new Exception("Bang!");
  1598. var xs = AsyncEnumerable.Throw<int>(ex).StartWith(1, 2);
  1599. var e = xs.GetAsyncEnumerator();
  1600. HasNext(e, 1);
  1601. HasNext(e, 2);
  1602. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  1603. }
  1604. [Fact]
  1605. public void Buffer_Null()
  1606. {
  1607. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Buffer(default(IAsyncEnumerable<int>), 1));
  1608. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Buffer(default(IAsyncEnumerable<int>), 1, 1));
  1609. AssertThrows<ArgumentOutOfRangeException>(() => AsyncEnumerableEx.Buffer(AsyncEnumerable.Return(42), -1));
  1610. AssertThrows<ArgumentOutOfRangeException>(() => AsyncEnumerableEx.Buffer(AsyncEnumerable.Return(42), -1, 1));
  1611. AssertThrows<ArgumentOutOfRangeException>(() => AsyncEnumerableEx.Buffer(AsyncEnumerable.Return(42), 1, -1));
  1612. }
  1613. [Fact]
  1614. public void Buffer1()
  1615. {
  1616. var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Buffer(2);
  1617. var e = xs.GetAsyncEnumerator();
  1618. Assert.True(e.MoveNextAsync().Result);
  1619. Assert.True(e.Current.SequenceEqual(new[] { 1, 2 }));
  1620. Assert.True(e.MoveNextAsync().Result);
  1621. Assert.True(e.Current.SequenceEqual(new[] { 3, 4 }));
  1622. Assert.True(e.MoveNextAsync().Result);
  1623. Assert.True(e.Current.SequenceEqual(new[] { 5 }));
  1624. Assert.False(e.MoveNextAsync().Result);
  1625. }
  1626. [Fact]
  1627. public void Buffer2()
  1628. {
  1629. var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Buffer(3, 2);
  1630. var e = xs.GetAsyncEnumerator();
  1631. Assert.True(e.MoveNextAsync().Result);
  1632. Assert.True(e.Current.SequenceEqual(new[] { 1, 2, 3 }));
  1633. Assert.True(e.MoveNextAsync().Result);
  1634. Assert.True(e.Current.SequenceEqual(new[] { 3, 4, 5 }));
  1635. Assert.True(e.MoveNextAsync().Result);
  1636. Assert.True(e.Current.SequenceEqual(new[] { 5 }));
  1637. Assert.False(e.MoveNextAsync().Result);
  1638. }
  1639. [Fact]
  1640. public void Buffer3()
  1641. {
  1642. var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Buffer(2, 3);
  1643. var e = xs.GetAsyncEnumerator();
  1644. Assert.True(e.MoveNextAsync().Result);
  1645. Assert.True(e.Current.SequenceEqual(new[] { 1, 2 }));
  1646. Assert.True(e.MoveNextAsync().Result);
  1647. Assert.True(e.Current.SequenceEqual(new[] { 4, 5 }));
  1648. Assert.False(e.MoveNextAsync().Result);
  1649. }
  1650. [Fact]
  1651. public async Task Buffer4()
  1652. {
  1653. var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Buffer(3, 2);
  1654. await SequenceIdentity(xs);
  1655. }
  1656. [Fact]
  1657. public void DistinctUntilChanged_Null()
  1658. {
  1659. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.DistinctUntilChanged(default(IAsyncEnumerable<int>)));
  1660. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.DistinctUntilChanged(default(IAsyncEnumerable<int>), EqualityComparer<int>.Default));
  1661. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.DistinctUntilChanged(AsyncEnumerable.Return(42), default(IEqualityComparer<int>)));
  1662. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.DistinctUntilChanged(default(IAsyncEnumerable<int>), x => x));
  1663. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.DistinctUntilChanged(AsyncEnumerable.Return(42), default(Func<int, int>)));
  1664. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.DistinctUntilChanged(default(IAsyncEnumerable<int>), x => x, EqualityComparer<int>.Default));
  1665. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.DistinctUntilChanged(AsyncEnumerable.Return(42), default(Func<int, int>), EqualityComparer<int>.Default));
  1666. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.DistinctUntilChanged(AsyncEnumerable.Return(42), x => x, default(IEqualityComparer<int>)));
  1667. }
  1668. [Fact]
  1669. public void DistinctUntilChanged1()
  1670. {
  1671. var xs = new[] { 1, 2, 2, 3, 4, 4, 4, 4, 5, 6, 6, 7, 3, 2, 2, 1, 1 }.ToAsyncEnumerable().DistinctUntilChanged();
  1672. var e = xs.GetAsyncEnumerator();
  1673. HasNext(e, 1);
  1674. HasNext(e, 2);
  1675. HasNext(e, 3);
  1676. HasNext(e, 4);
  1677. HasNext(e, 5);
  1678. HasNext(e, 6);
  1679. HasNext(e, 7);
  1680. HasNext(e, 3);
  1681. HasNext(e, 2);
  1682. HasNext(e, 1);
  1683. NoNext(e);
  1684. }
  1685. [Fact]
  1686. public void DistinctUntilChanged2()
  1687. {
  1688. var xs = new[] { 1, 2, 3, 4, 3, 5, 2 }.ToAsyncEnumerable().DistinctUntilChanged(x => (x + 1) / 2);
  1689. var e = xs.GetAsyncEnumerator();
  1690. HasNext(e, 1);
  1691. HasNext(e, 3);
  1692. HasNext(e, 5);
  1693. HasNext(e, 2);
  1694. NoNext(e);
  1695. }
  1696. [Fact]
  1697. public void DistinctUntilChanged3()
  1698. {
  1699. var ex = new Exception("Bang!");
  1700. var xs = new[] { 1, 2, 3, 4, 3, 5, 2 }.ToAsyncEnumerable().DistinctUntilChanged(x => { if (x == 4) throw ex; return x; });
  1701. var e = xs.GetAsyncEnumerator();
  1702. HasNext(e, 1);
  1703. HasNext(e, 2);
  1704. HasNext(e, 3);
  1705. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  1706. }
  1707. [Fact]
  1708. public async Task DistinctUntilChanged4()
  1709. {
  1710. var xs = new[] { 1, 2, 2, 3, 4, 4, 4, 4, 5, 6, 6, 7, 3, 2, 2, 1, 1 }.ToAsyncEnumerable().DistinctUntilChanged();
  1711. await SequenceIdentity(xs);
  1712. }
  1713. [Fact]
  1714. public async Task DistinctUntilChanged5()
  1715. {
  1716. var xs = new[] { 1, 2, 3, 4, 3, 5, 2 }.ToAsyncEnumerable().DistinctUntilChanged(x => (x + 1) / 2);
  1717. await SequenceIdentity(xs);
  1718. }
  1719. [Fact]
  1720. public void Expand_Null()
  1721. {
  1722. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Expand(default(IAsyncEnumerable<int>), x => default(IAsyncEnumerable<int>)));
  1723. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Expand(AsyncEnumerable.Return(42), default(Func<int, IAsyncEnumerable<int>>)));
  1724. }
  1725. [Fact]
  1726. public void Expand1()
  1727. {
  1728. var xs = new[] { 2, 3 }.ToAsyncEnumerable().Expand(x => AsyncEnumerable.Return(x - 1).Repeat(x - 1));
  1729. var e = xs.GetAsyncEnumerator();
  1730. HasNext(e, 2);
  1731. HasNext(e, 3);
  1732. HasNext(e, 1);
  1733. HasNext(e, 2);
  1734. HasNext(e, 2);
  1735. HasNext(e, 1);
  1736. HasNext(e, 1);
  1737. NoNext(e);
  1738. }
  1739. [Fact]
  1740. public void Expand2()
  1741. {
  1742. var ex = new Exception("Bang!");
  1743. var xs = new[] { 2, 3 }.ToAsyncEnumerable().Expand(new Func<int, IAsyncEnumerable<int>>(x => { throw ex; }));
  1744. var e = xs.GetAsyncEnumerator();
  1745. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  1746. }
  1747. [Fact]
  1748. public void Expand3()
  1749. {
  1750. var xs = new[] { 2, 3 }.ToAsyncEnumerable().Expand(x => default(IAsyncEnumerable<int>));
  1751. var e = xs.GetAsyncEnumerator();
  1752. HasNext(e, 2);
  1753. HasNext(e, 3);
  1754. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NullReferenceException);
  1755. }
  1756. [Fact]
  1757. public async Task Expand4()
  1758. {
  1759. var xs = new[] { 2, 3 }.ToAsyncEnumerable().Expand(x => AsyncEnumerable.Return(x - 1).Repeat(x - 1));
  1760. await SequenceIdentity(xs);
  1761. }
  1762. [Fact]
  1763. public void Scan_Null()
  1764. {
  1765. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Scan(default(IAsyncEnumerable<int>), 3, (x, y) => x + y));
  1766. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Scan(AsyncEnumerable.Return(42), 3, default(Func<int, int, int>)));
  1767. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Scan(default(IAsyncEnumerable<int>), (x, y) => x + y));
  1768. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Scan(AsyncEnumerable.Return(42), default(Func<int, int, int>)));
  1769. }
  1770. [Fact]
  1771. public void Scan1()
  1772. {
  1773. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan(8, (x, y) => x + y);
  1774. var e = xs.GetAsyncEnumerator();
  1775. HasNext(e, 9);
  1776. HasNext(e, 11);
  1777. HasNext(e, 14);
  1778. NoNext(e);
  1779. }
  1780. [Fact]
  1781. public void Scan2()
  1782. {
  1783. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan((x, y) => x + y);
  1784. var e = xs.GetAsyncEnumerator();
  1785. HasNext(e, 3);
  1786. HasNext(e, 6);
  1787. NoNext(e);
  1788. }
  1789. [Fact]
  1790. public void Scan3()
  1791. {
  1792. var ex = new Exception("Bang!");
  1793. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan(8, new Func<int, int, int>((x, y) => { throw ex; }));
  1794. var e = xs.GetAsyncEnumerator();
  1795. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  1796. }
  1797. [Fact]
  1798. public void Scan4()
  1799. {
  1800. var ex = new Exception("Bang!");
  1801. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan(new Func<int, int, int>((x, y) => { throw ex; }));
  1802. var e = xs.GetAsyncEnumerator();
  1803. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex);
  1804. }
  1805. [Fact]
  1806. public async Task Scan5()
  1807. {
  1808. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan(8, (x, y) => x + y);
  1809. await SequenceIdentity(xs);
  1810. }
  1811. [Fact]
  1812. public async Task Scan6()
  1813. {
  1814. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan((x, y) => x + y);
  1815. await SequenceIdentity(xs);
  1816. }
  1817. [Fact]
  1818. public void DistinctKey_Null()
  1819. {
  1820. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Distinct(default(IAsyncEnumerable<int>), x => x));
  1821. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Distinct(AsyncEnumerable.Return(42), default(Func<int, int>)));
  1822. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Distinct(default(IAsyncEnumerable<int>), x => x, EqualityComparer<int>.Default));
  1823. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Distinct(AsyncEnumerable.Return(42), default(Func<int, int>), EqualityComparer<int>.Default));
  1824. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Distinct(AsyncEnumerable.Return(42), x => x, null));
  1825. }
  1826. [Fact]
  1827. public void DistinctKey1()
  1828. {
  1829. var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Distinct(x => x / 2);
  1830. var e = xs.GetAsyncEnumerator();
  1831. HasNext(e, 1);
  1832. HasNext(e, 2);
  1833. HasNext(e, 4);
  1834. NoNext(e);
  1835. }
  1836. }
  1837. }