AsyncTests.Single.cs 86 KB

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