GroupBy.Generated.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  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. partial class GroupBy
  13. {
  14. [Fact]
  15. public void KeySelector_Sync_Null()
  16. {
  17. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(default(IAsyncEnumerable<int>), (int x) => x));
  18. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(Return42, default(Func<int, int>)));
  19. }
  20. [Fact]
  21. public async Task KeySelector_Sync_All()
  22. {
  23. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  24. var methodsA = methodsS.ToAsyncEnumerable();
  25. var resS = methodsS.GroupBy(m => m.Name);
  26. var resA = methodsA.GroupBy(m => m.Name);
  27. await Groups_AssertCore(resS, resA);
  28. }
  29. [Fact]
  30. public void KeySelector_Sync_Comparer_Null()
  31. {
  32. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(default(IAsyncEnumerable<int>), (int x) => x, EqualityComparer<int>.Default));
  33. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int>(Return42, default(Func<int, int>), EqualityComparer<int>.Default));
  34. }
  35. [Fact]
  36. public async Task KeySelector_Sync_Comparer_All()
  37. {
  38. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  39. var methodsA = methodsS.ToAsyncEnumerable();
  40. var eq = new StringPrefixEqualityComparer(1);
  41. var resS = methodsS.GroupBy(m => m.Name, eq);
  42. var resA = methodsA.GroupBy(m => m.Name, eq);
  43. await Groups_AssertCore(resS, resA);
  44. }
  45. [Fact]
  46. public void KeySelector_ElementSelector_Sync_Null()
  47. {
  48. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, (int x) => x));
  49. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(Return42, default(Func<int, int>), (int x) => x));
  50. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(Return42, (int x) => x, default(Func<int, int>)));
  51. }
  52. [Fact]
  53. public async Task KeySelector_ElementSelector_Sync_All()
  54. {
  55. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  56. var methodsA = methodsS.ToAsyncEnumerable();
  57. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper());
  58. var resA = methodsA.GroupBy(m => m.Name, m => m.Name.ToUpper());
  59. await Groups_AssertCore(resS, resA);
  60. }
  61. [Fact]
  62. public void KeySelector_ElementSelector_Sync_Comparer_Null()
  63. {
  64. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, (int x) => x, EqualityComparer<int>.Default));
  65. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(Return42, default(Func<int, int>), (int x) => x, EqualityComparer<int>.Default));
  66. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, default(Func<int, int>), EqualityComparer<int>.Default));
  67. }
  68. [Fact]
  69. public async Task KeySelector_ElementSelector_Sync_Comparer_All()
  70. {
  71. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  72. var methodsA = methodsS.ToAsyncEnumerable();
  73. var eq = new StringPrefixEqualityComparer(1);
  74. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), eq);
  75. var resA = methodsA.GroupBy(m => m.Name, m => m.Name.ToUpper(), eq);
  76. await Groups_AssertCore(resS, resA);
  77. }
  78. [Fact]
  79. public void KeySelector_ResultSelector_Sync_Null()
  80. {
  81. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, (k, g) => 0));
  82. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(Return42, default(Func<int, int>), (k, g) => 0));
  83. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(Return42, (int x) => x, default(Func<int, IAsyncEnumerable<int>, int>)));
  84. }
  85. [Fact]
  86. public async Task KeySelector_ResultSelector_Sync_All()
  87. {
  88. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  89. var methodsA = methodsS.ToAsyncEnumerable();
  90. var resS = methodsS.GroupBy(m => m.Name, (k, g) => k + " - " + g.Count());
  91. var resA = methodsA.GroupBy(m => m.Name, (k, g) => k + " - " + g.CountAsync().Result);
  92. await Group_Result_AssertCore(resS, resA);
  93. }
  94. [Fact]
  95. public void KeySelector_ResultSelector_Sync_Comparer_Null()
  96. {
  97. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, (k, g) => 0, EqualityComparer<int>.Default));
  98. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(Return42, default(Func<int, int>), (k, g) => 0, EqualityComparer<int>.Default));
  99. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, default(Func<int, IAsyncEnumerable<int>, int>), EqualityComparer<int>.Default));
  100. }
  101. [Fact]
  102. public async Task KeySelector_ResultSelector_Sync_Comparer_All()
  103. {
  104. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  105. var methodsA = methodsS.ToAsyncEnumerable();
  106. var eq = new StringPrefixEqualityComparer(1);
  107. var resS = methodsS.GroupBy(m => m.Name, (k, g) => k + " - " + g.Count(), eq);
  108. var resA = methodsA.GroupBy(m => m.Name, (k, g) => k + " - " + g.CountAsync().Result, eq);
  109. await Group_Result_AssertCore(resS, resA);
  110. }
  111. [Fact]
  112. public void KeySelector_ElementSelector_ResultSelector_Sync_Null()
  113. {
  114. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, (int x) => x, (k, g) => 0));
  115. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(Return42, default(Func<int, int>), (int x) => x, (k, g) => 0));
  116. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(Return42, (int x) => x, default(Func<int, int>), (k, g) => 0));
  117. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(Return42, (int x) => x, (int x) => x, default(Func<int, IAsyncEnumerable<int>, int>)));
  118. }
  119. [Fact]
  120. public async Task KeySelector_ElementSelector_ResultSelector_Sync_All()
  121. {
  122. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  123. var methodsA = methodsS.ToAsyncEnumerable();
  124. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.Count());
  125. var resA = methodsA.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.CountAsync().Result);
  126. await Group_Result_AssertCore(resS, resA);
  127. }
  128. [Fact]
  129. public void KeySelector_ElementSelector_ResultSelector_Sync_Comparer_Null()
  130. {
  131. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, (int x) => x, (k, g) => 0, EqualityComparer<int>.Default));
  132. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(Return42, default(Func<int, int>), (int x) => x, (k, g) => 0, EqualityComparer<int>.Default));
  133. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, default(Func<int, int>), (k, g) => 0, EqualityComparer<int>.Default));
  134. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<int, int, int, int>(default(IAsyncEnumerable<int>), (int x) => x, (int x) => x, default(Func<int, IAsyncEnumerable<int>, int>), EqualityComparer<int>.Default));
  135. }
  136. [Fact]
  137. public async Task KeySelector_ElementSelector_ResultSelector_Sync_Comparer_All()
  138. {
  139. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  140. var methodsA = methodsS.ToAsyncEnumerable();
  141. var eq = new StringPrefixEqualityComparer(1);
  142. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.Count(), eq);
  143. var resA = methodsA.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.CountAsync().Result, eq);
  144. await Group_Result_AssertCore(resS, resA);
  145. }
  146. [Fact]
  147. public void KeySelector_Async_Null()
  148. {
  149. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x)));
  150. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int>(Return42, default(Func<int, ValueTask<int>>)));
  151. }
  152. [Fact]
  153. public async Task KeySelector_Async_All()
  154. {
  155. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  156. var methodsA = methodsS.ToAsyncEnumerable();
  157. var resS = methodsS.GroupBy(m => m.Name);
  158. var resA = methodsA.GroupByAwait(m => new ValueTask<string>(m.Name));
  159. await Groups_AssertCore(resS, resA);
  160. }
  161. [Fact]
  162. public void KeySelector_Async_Comparer_Null()
  163. {
  164. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), EqualityComparer<int>.Default));
  165. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int>(Return42, default(Func<int, ValueTask<int>>), EqualityComparer<int>.Default));
  166. }
  167. [Fact]
  168. public async Task KeySelector_Async_Comparer_All()
  169. {
  170. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  171. var methodsA = methodsS.ToAsyncEnumerable();
  172. var eq = new StringPrefixEqualityComparer(1);
  173. var resS = methodsS.GroupBy(m => m.Name, eq);
  174. var resA = methodsA.GroupByAwait(m => new ValueTask<string>(m.Name), eq);
  175. await Groups_AssertCore(resS, resA);
  176. }
  177. [Fact]
  178. public void KeySelector_ElementSelector_Async_Null()
  179. {
  180. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), (int x) => new ValueTask<int>(x)));
  181. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(Return42, default(Func<int, ValueTask<int>>), (int x) => new ValueTask<int>(x)));
  182. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(Return42, (int x) => new ValueTask<int>(x), default(Func<int, ValueTask<int>>)));
  183. }
  184. [Fact]
  185. public async Task KeySelector_ElementSelector_Async_All()
  186. {
  187. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  188. var methodsA = methodsS.ToAsyncEnumerable();
  189. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper());
  190. var resA = methodsA.GroupByAwait(m => new ValueTask<string>(m.Name), m => new ValueTask<string>(m.Name.ToUpper()));
  191. await Groups_AssertCore(resS, resA);
  192. }
  193. [Fact]
  194. public void KeySelector_ElementSelector_Async_Comparer_Null()
  195. {
  196. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), (int x) => new ValueTask<int>(x), EqualityComparer<int>.Default));
  197. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(Return42, default(Func<int, ValueTask<int>>), (int x) => new ValueTask<int>(x), EqualityComparer<int>.Default));
  198. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), default(Func<int, ValueTask<int>>), EqualityComparer<int>.Default));
  199. }
  200. [Fact]
  201. public async Task KeySelector_ElementSelector_Async_Comparer_All()
  202. {
  203. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  204. var methodsA = methodsS.ToAsyncEnumerable();
  205. var eq = new StringPrefixEqualityComparer(1);
  206. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), eq);
  207. var resA = methodsA.GroupByAwait(m => new ValueTask<string>(m.Name), m => new ValueTask<string>(m.Name.ToUpper()), eq);
  208. await Groups_AssertCore(resS, resA);
  209. }
  210. [Fact]
  211. public void KeySelector_ResultSelector_Async_Null()
  212. {
  213. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), (k, g) => new ValueTask<int>(0)));
  214. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(Return42, default(Func<int, ValueTask<int>>), (k, g) => new ValueTask<int>(0)));
  215. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(Return42, (int x) => new ValueTask<int>(x), default(Func<int, IAsyncEnumerable<int>, ValueTask<int>>)));
  216. }
  217. [Fact]
  218. public async Task KeySelector_ResultSelector_Async_All()
  219. {
  220. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  221. var methodsA = methodsS.ToAsyncEnumerable();
  222. var resS = methodsS.GroupBy(m => m.Name, (k, g) => k + " - " + g.Count());
  223. var resA = methodsA.GroupByAwait(m => new ValueTask<string>(m.Name), async (k, g) => k + " - " + await g.CountAsync());
  224. await Group_Result_AssertCore(resS, resA);
  225. }
  226. [Fact]
  227. public void KeySelector_ResultSelector_Async_Comparer_Null()
  228. {
  229. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), (k, g) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  230. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(Return42, default(Func<int, ValueTask<int>>), (k, g) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  231. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), default(Func<int, IAsyncEnumerable<int>, ValueTask<int>>), EqualityComparer<int>.Default));
  232. }
  233. [Fact]
  234. public async Task KeySelector_ResultSelector_Async_Comparer_All()
  235. {
  236. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  237. var methodsA = methodsS.ToAsyncEnumerable();
  238. var eq = new StringPrefixEqualityComparer(1);
  239. var resS = methodsS.GroupBy(m => m.Name, (k, g) => k + " - " + g.Count(), eq);
  240. var resA = methodsA.GroupByAwait(m => new ValueTask<string>(m.Name), async (k, g) => k + " - " + await g.CountAsync(), eq);
  241. await Group_Result_AssertCore(resS, resA);
  242. }
  243. [Fact]
  244. public void KeySelector_ElementSelector_ResultSelector_Async_Null()
  245. {
  246. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), (int x) => new ValueTask<int>(x), (k, g) => new ValueTask<int>(0)));
  247. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int, int>(Return42, default(Func<int, ValueTask<int>>), (int x) => new ValueTask<int>(x), (k, g) => new ValueTask<int>(0)));
  248. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int, int>(Return42, (int x) => new ValueTask<int>(x), default(Func<int, ValueTask<int>>), (k, g) => new ValueTask<int>(0)));
  249. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int, int>(Return42, (int x) => new ValueTask<int>(x), (int x) => new ValueTask<int>(x), default(Func<int, IAsyncEnumerable<int>, ValueTask<int>>)));
  250. }
  251. [Fact]
  252. public async Task KeySelector_ElementSelector_ResultSelector_Async_All()
  253. {
  254. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  255. var methodsA = methodsS.ToAsyncEnumerable();
  256. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.Count());
  257. var resA = methodsA.GroupByAwait(m => new ValueTask<string>(m.Name), m => new ValueTask<string>(m.Name.ToUpper()), async (k, g) => k + " - " + await g.CountAsync());
  258. await Group_Result_AssertCore(resS, resA);
  259. }
  260. [Fact]
  261. public void KeySelector_ElementSelector_ResultSelector_Async_Comparer_Null()
  262. {
  263. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), (int x) => new ValueTask<int>(x), (k, g) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  264. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int, int>(Return42, default(Func<int, ValueTask<int>>), (int x) => new ValueTask<int>(x), (k, g) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  265. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), default(Func<int, ValueTask<int>>), (k, g) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  266. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwait<int, int, int, int>(default(IAsyncEnumerable<int>), (int x) => new ValueTask<int>(x), (int x) => new ValueTask<int>(x), default(Func<int, IAsyncEnumerable<int>, ValueTask<int>>), EqualityComparer<int>.Default));
  267. }
  268. [Fact]
  269. public async Task KeySelector_ElementSelector_ResultSelector_Async_Comparer_All()
  270. {
  271. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  272. var methodsA = methodsS.ToAsyncEnumerable();
  273. var eq = new StringPrefixEqualityComparer(1);
  274. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.Count(), eq);
  275. var resA = methodsA.GroupByAwait(m => new ValueTask<string>(m.Name), m => new ValueTask<string>(m.Name.ToUpper()), async (k, g) => k + " - " + await g.CountAsync(), eq);
  276. await Group_Result_AssertCore(resS, resA);
  277. }
  278. #if !NO_DEEP_CANCELLATION
  279. [Fact]
  280. public void KeySelector_Async_Cancel_Null()
  281. {
  282. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x)));
  283. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int>(Return42, default(Func<int, CancellationToken, ValueTask<int>>)));
  284. }
  285. [Fact]
  286. public async Task KeySelector_Async_Cancel_All()
  287. {
  288. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  289. var methodsA = methodsS.ToAsyncEnumerable();
  290. var resS = methodsS.GroupBy(m => m.Name);
  291. var resA = methodsA.GroupByAwaitWithCancellation((m, ct) => new ValueTask<string>(m.Name));
  292. await Groups_AssertCore(resS, resA);
  293. }
  294. [Fact]
  295. public void KeySelector_Async_Cancel_Comparer_Null()
  296. {
  297. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), EqualityComparer<int>.Default));
  298. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int>(Return42, default(Func<int, CancellationToken, ValueTask<int>>), EqualityComparer<int>.Default));
  299. }
  300. [Fact]
  301. public async Task KeySelector_Async_Cancel_Comparer_All()
  302. {
  303. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  304. var methodsA = methodsS.ToAsyncEnumerable();
  305. var eq = new StringPrefixEqualityComparer(1);
  306. var resS = methodsS.GroupBy(m => m.Name, eq);
  307. var resA = methodsA.GroupByAwaitWithCancellation((m, ct) => new ValueTask<string>(m.Name), eq);
  308. await Groups_AssertCore(resS, resA);
  309. }
  310. [Fact]
  311. public void KeySelector_ElementSelector_Async_Cancel_Null()
  312. {
  313. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), (int x, CancellationToken ct) => new ValueTask<int>(x)));
  314. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(Return42, default(Func<int, CancellationToken, ValueTask<int>>), (int x, CancellationToken ct) => new ValueTask<int>(x)));
  315. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(Return42, (int x, CancellationToken ct) => new ValueTask<int>(x), default(Func<int, CancellationToken, ValueTask<int>>)));
  316. }
  317. [Fact]
  318. public async Task KeySelector_ElementSelector_Async_Cancel_All()
  319. {
  320. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  321. var methodsA = methodsS.ToAsyncEnumerable();
  322. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper());
  323. var resA = methodsA.GroupByAwaitWithCancellation((m, ct) => new ValueTask<string>(m.Name), (m, ct) => new ValueTask<string>(m.Name.ToUpper()));
  324. await Groups_AssertCore(resS, resA);
  325. }
  326. [Fact]
  327. public void KeySelector_ElementSelector_Async_Cancel_Comparer_Null()
  328. {
  329. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), (int x, CancellationToken ct) => new ValueTask<int>(x), EqualityComparer<int>.Default));
  330. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(Return42, default(Func<int, CancellationToken, ValueTask<int>>), (int x, CancellationToken ct) => new ValueTask<int>(x), EqualityComparer<int>.Default));
  331. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), default(Func<int, CancellationToken, ValueTask<int>>), EqualityComparer<int>.Default));
  332. }
  333. [Fact]
  334. public async Task KeySelector_ElementSelector_Async_Cancel_Comparer_All()
  335. {
  336. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  337. var methodsA = methodsS.ToAsyncEnumerable();
  338. var eq = new StringPrefixEqualityComparer(1);
  339. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), eq);
  340. var resA = methodsA.GroupByAwaitWithCancellation((m, ct) => new ValueTask<string>(m.Name), (m, ct) => new ValueTask<string>(m.Name.ToUpper()), eq);
  341. await Groups_AssertCore(resS, resA);
  342. }
  343. [Fact]
  344. public void KeySelector_ResultSelector_Async_Cancel_Null()
  345. {
  346. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), (k, g, ct) => new ValueTask<int>(0)));
  347. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(Return42, default(Func<int, CancellationToken, ValueTask<int>>), (k, g, ct) => new ValueTask<int>(0)));
  348. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(Return42, (int x, CancellationToken ct) => new ValueTask<int>(x), default(Func<int, IAsyncEnumerable<int>, CancellationToken, ValueTask<int>>)));
  349. }
  350. [Fact]
  351. public async Task KeySelector_ResultSelector_Async_Cancel_All()
  352. {
  353. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  354. var methodsA = methodsS.ToAsyncEnumerable();
  355. var resS = methodsS.GroupBy(m => m.Name, (k, g) => k + " - " + g.Count());
  356. var resA = methodsA.GroupByAwaitWithCancellation((m, ct) => new ValueTask<string>(m.Name), async (k, g, ct) => k + " - " + await g.CountAsync(ct));
  357. await Group_Result_AssertCore(resS, resA);
  358. }
  359. [Fact]
  360. public void KeySelector_ResultSelector_Async_Cancel_Comparer_Null()
  361. {
  362. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), (k, g, ct) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  363. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(Return42, default(Func<int, CancellationToken, ValueTask<int>>), (k, g, ct) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  364. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), default(Func<int, IAsyncEnumerable<int>, CancellationToken, ValueTask<int>>), EqualityComparer<int>.Default));
  365. }
  366. [Fact]
  367. public async Task KeySelector_ResultSelector_Async_Cancel_Comparer_All()
  368. {
  369. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  370. var methodsA = methodsS.ToAsyncEnumerable();
  371. var eq = new StringPrefixEqualityComparer(1);
  372. var resS = methodsS.GroupBy(m => m.Name, (k, g) => k + " - " + g.Count(), eq);
  373. var resA = methodsA.GroupByAwaitWithCancellation((m, ct) => new ValueTask<string>(m.Name), async (k, g, ct) => k + " - " + await g.CountAsync(ct), eq);
  374. await Group_Result_AssertCore(resS, resA);
  375. }
  376. [Fact]
  377. public void KeySelector_ElementSelector_ResultSelector_Async_Cancel_Null()
  378. {
  379. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), (int x, CancellationToken ct) => new ValueTask<int>(x), (k, g, ct) => new ValueTask<int>(0)));
  380. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int, int>(Return42, default(Func<int, CancellationToken, ValueTask<int>>), (int x, CancellationToken ct) => new ValueTask<int>(x), (k, g, ct) => new ValueTask<int>(0)));
  381. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int, int>(Return42, (int x, CancellationToken ct) => new ValueTask<int>(x), default(Func<int, CancellationToken, ValueTask<int>>), (k, g, ct) => new ValueTask<int>(0)));
  382. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int, int>(Return42, (int x, CancellationToken ct) => new ValueTask<int>(x), (int x, CancellationToken ct) => new ValueTask<int>(x), default(Func<int, IAsyncEnumerable<int>, CancellationToken, ValueTask<int>>)));
  383. }
  384. [Fact]
  385. public async Task KeySelector_ElementSelector_ResultSelector_Async_Cancel_All()
  386. {
  387. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  388. var methodsA = methodsS.ToAsyncEnumerable();
  389. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.Count());
  390. var resA = methodsA.GroupByAwaitWithCancellation((m, ct) => new ValueTask<string>(m.Name), (m, ct) => new ValueTask<string>(m.Name.ToUpper()), async (k, g, ct) => k + " - " + await g.CountAsync(ct));
  391. await Group_Result_AssertCore(resS, resA);
  392. }
  393. [Fact]
  394. public void KeySelector_ElementSelector_ResultSelector_Async_Cancel_Comparer_Null()
  395. {
  396. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), (int x, CancellationToken ct) => new ValueTask<int>(x), (k, g, ct) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  397. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int, int>(Return42, default(Func<int, CancellationToken, ValueTask<int>>), (int x, CancellationToken ct) => new ValueTask<int>(x), (k, g, ct) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  398. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), default(Func<int, CancellationToken, ValueTask<int>>), (k, g, ct) => new ValueTask<int>(0), EqualityComparer<int>.Default));
  399. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupByAwaitWithCancellation<int, int, int, int>(default(IAsyncEnumerable<int>), (int x, CancellationToken ct) => new ValueTask<int>(x), (int x, CancellationToken ct) => new ValueTask<int>(x), default(Func<int, IAsyncEnumerable<int>, CancellationToken, ValueTask<int>>), EqualityComparer<int>.Default));
  400. }
  401. [Fact]
  402. public async Task KeySelector_ElementSelector_ResultSelector_Async_Cancel_Comparer_All()
  403. {
  404. var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
  405. var methodsA = methodsS.ToAsyncEnumerable();
  406. var eq = new StringPrefixEqualityComparer(1);
  407. var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.Count(), eq);
  408. var resA = methodsA.GroupByAwaitWithCancellation((m, ct) => new ValueTask<string>(m.Name), (m, ct) => new ValueTask<string>(m.Name.ToUpper()), async (k, g, ct) => k + " - " + await g.CountAsync(ct), eq);
  409. await Group_Result_AssertCore(resS, resA);
  410. }
  411. #endif
  412. private async Task Groups_AssertCore<T, K>(IEnumerable<IGrouping<K, T>> resS, IAsyncEnumerable<IAsyncGrouping<K, T>> resA)
  413. {
  414. Assert.True(await AsyncEnumerable.SequenceEqualAsync(
  415. resS.Select(g => g.Key).ToAsyncEnumerable(),
  416. resA.Select(g => g.Key)
  417. ));
  418. // CountAsync
  419. Assert.Equal(resS.Count(), await resA.CountAsync());
  420. // ToArrayAsync
  421. var resArrS = resS.ToArray();
  422. var resArrA = await resA.ToArrayAsync();
  423. Assert.Equal(
  424. resArrS.Select(g => g.Key),
  425. resArrA.Select(g => g.Key)
  426. );
  427. // ToListAsync
  428. var resLstS = resS.ToList();
  429. var resLstA = await resA.ToListAsync();
  430. Assert.Equal(
  431. resLstS.Select(g => g.Key),
  432. resLstA.Select(g => g.Key)
  433. );
  434. }
  435. private async Task Group_Result_AssertCore<T>(IEnumerable<T> resS, IAsyncEnumerable<T> resA)
  436. {
  437. Assert.True(await AsyncEnumerable.SequenceEqualAsync(
  438. resS.ToAsyncEnumerable(),
  439. resA
  440. ));
  441. // CountAsync
  442. Assert.Equal(resS.Count(), await resA.CountAsync());
  443. // ToArrayAsync
  444. var resArrS = resS.ToArray();
  445. var resArrA = await resA.ToArrayAsync();
  446. Assert.Equal(resArrS, resArrA);
  447. // ToListAsync
  448. var resLstS = resS.ToList();
  449. var resLstA = await resA.ToListAsync();
  450. Assert.Equal(resLstS, resLstA);
  451. }
  452. private sealed class StringPrefixEqualityComparer : IEqualityComparer<string>
  453. {
  454. private readonly int _n;
  455. public StringPrefixEqualityComparer(int n) => _n = n;
  456. public bool Equals(string s1, string s2) => s1.Substring(0, _n) == s2.Substring(0, _n);
  457. public int GetHashCode(string s) => s.Substring(0, _n).GetHashCode();
  458. }
  459. }
  460. }