MinMax.Generated.tt 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  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. <#@ template debug="false" hostspecific="false" language="C#" #>
  5. <#@ assembly name="System.Core" #>
  6. <#@ import namespace="System.Linq" #>
  7. <#@ import namespace="System.Text" #>
  8. <#@ import namespace="System.Collections.Generic" #>
  9. <#@ output extension=".cs" #>
  10. <#
  11. int ShuffleCount = 4;
  12. var types = new[] { typeof(int), typeof(long), typeof(float), typeof(double), typeof(decimal) };
  13. Func<Type, string> toCSharp = t =>
  14. {
  15. if (t == typeof(int))
  16. return "int";
  17. else if (t == typeof(long))
  18. return "long";
  19. else if (t == typeof(float))
  20. return "float";
  21. else if (t == typeof(double))
  22. return "double";
  23. else if (t == typeof(decimal))
  24. return "decimal";
  25. throw new Exception();
  26. };
  27. Func<int, int, int, int, int[]> getRandom = (seed, N, min, max) =>
  28. {
  29. var rand = new Random(seed);
  30. return Enumerable.Range(0, N).Select(i => rand.Next(min, max)).ToArray();
  31. };
  32. #>
  33. using System;
  34. using System.Collections.Generic;
  35. using System.Linq;
  36. using System.Threading;
  37. using System.Threading.Tasks;
  38. using Xunit;
  39. namespace Tests
  40. {
  41. public class MinMax : AsyncEnumerableTests
  42. {
  43. <#
  44. foreach (var op in new[] { "Min", "Max" })
  45. {
  46. foreach (var t in types)
  47. {
  48. var cs = toCSharp(t);
  49. #>
  50. [Fact]
  51. public async Task <#=op#>Async_Empty_<#=t.Name#>()
  52. {
  53. await AssertThrowsAsync<InvalidOperationException>(new <#=cs#>[0].ToAsyncEnumerable().<#=op#>Async(CancellationToken.None).AsTask());
  54. }
  55. [Fact]
  56. public async Task <#=op#>Async_Selector_Empty_<#=t.Name#>()
  57. {
  58. await AssertThrowsAsync<InvalidOperationException>(new object[0].ToAsyncEnumerable().<#=op#>Async(_ => default(<#=cs#>), CancellationToken.None).AsTask());
  59. }
  60. [Fact]
  61. public async Task <#=op#>AwaitAsync_Selector_Empty_<#=t.Name#>()
  62. {
  63. await AssertThrowsAsync<InvalidOperationException>(new object[0].ToAsyncEnumerable().<#=op#>AwaitAsync(_ => default(ValueTask<<#=cs#>>), CancellationToken.None).AsTask());
  64. }
  65. #if !NO_DEEP_CANCELLATION
  66. [Fact]
  67. public async Task <#=op#>AwaitWithCancellationAsync_Selector_Empty_<#=t.Name#>()
  68. {
  69. await AssertThrowsAsync<InvalidOperationException>(new object[0].ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => default(ValueTask<<#=cs#>>), CancellationToken.None).AsTask());
  70. }
  71. #endif
  72. [Fact]
  73. public async Task <#=op#>Async_Empty_Nullable_<#=t.Name#>()
  74. {
  75. Assert.Null(await new <#=cs#>?[0].ToAsyncEnumerable().<#=op#>Async(CancellationToken.None));
  76. }
  77. [Fact]
  78. public async Task <#=op#>Async_Selector_Empty_Nullable_<#=t.Name#>()
  79. {
  80. Assert.Null(await new object[0].ToAsyncEnumerable().<#=op#>Async(_ => default(<#=cs#>?), CancellationToken.None));
  81. }
  82. [Fact]
  83. public async Task <#=op#>AwaitAsync_Selector_Empty_Nullable_<#=t.Name#>()
  84. {
  85. Assert.Null(await new object[0].ToAsyncEnumerable().<#=op#>AwaitAsync(_ => default(ValueTask<<#=cs#>?>), CancellationToken.None));
  86. }
  87. #if !NO_DEEP_CANCELLATION
  88. [Fact]
  89. public async Task <#=op#>AwaitWithCancellationAsync_Selector_Empty_Nullable_<#=t.Name#>()
  90. {
  91. Assert.Null(await new object[0].ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => default(ValueTask<<#=cs#>?>), CancellationToken.None));
  92. }
  93. #endif
  94. <#
  95. foreach (var n in new[] { 1, 4, 8, 16 })
  96. {
  97. var values = string.Join(", ", getRandom(n * 42, n, -100, 100));
  98. var valuesWithNull = string.Join(", ", getRandom(n * 42, n, -100, 100).Select((x, i) => i % 2 == 0 ? x.ToString() : "null"));
  99. #>
  100. [Fact]
  101. public async Task <#=op#>Async_<#=t.Name#>_<#=n#>()
  102. {
  103. var input = new <#=cs#>[] { <#=values#> }.AsEnumerable();
  104. for (var i = 0; i < <#=ShuffleCount#>; i++)
  105. {
  106. var expected = input.<#=op#>();
  107. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  108. Assert.Equal(expected, actual);
  109. input = Shuffle(input);
  110. }
  111. }
  112. [Fact]
  113. public async Task <#=op#>Async_Selector_<#=t.Name#>_<#=n#>()
  114. {
  115. var input = new <#=cs#>[] { <#=values#> }.AsEnumerable();
  116. for (var i = 0; i < <#=ShuffleCount#>; i++)
  117. {
  118. var expected = input.<#=op#>();
  119. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  120. Assert.Equal(expected, actual);
  121. input = Shuffle(input);
  122. }
  123. }
  124. [Fact]
  125. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_<#=n#>()
  126. {
  127. var input = new <#=cs#>[] { <#=values#> }.AsEnumerable();
  128. for (var i = 0; i < <#=ShuffleCount#>; i++)
  129. {
  130. var expected = input.<#=op#>();
  131. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>>(x), CancellationToken.None);
  132. Assert.Equal(expected, actual);
  133. input = Shuffle(input);
  134. }
  135. }
  136. #if !NO_DEEP_CANCELLATION
  137. [Fact]
  138. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_<#=n#>()
  139. {
  140. var input = new <#=cs#>[] { <#=values#> }.AsEnumerable();
  141. for (var i = 0; i < <#=ShuffleCount#>; i++)
  142. {
  143. var expected = input.<#=op#>();
  144. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>>(x), CancellationToken.None);
  145. Assert.Equal(expected, actual);
  146. input = Shuffle(input);
  147. }
  148. }
  149. #endif
  150. [Fact]
  151. public async Task <#=op#>Async_<#=t.Name#>_Nullable_<#=n#>_NoNull()
  152. {
  153. var input = new <#=cs#>?[] { <#=values#> }.AsEnumerable();
  154. for (var i = 0; i < <#=ShuffleCount#>; i++)
  155. {
  156. var expected = input.<#=op#>();
  157. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  158. Assert.Equal(expected, actual);
  159. input = Shuffle(input);
  160. }
  161. }
  162. [Fact]
  163. public async Task <#=op#>Async_Selector_<#=t.Name#>_Nullable_<#=n#>_NoNull()
  164. {
  165. var input = new <#=cs#>?[] { <#=values#> }.AsEnumerable();
  166. for (var i = 0; i < <#=ShuffleCount#>; i++)
  167. {
  168. var expected = input.<#=op#>();
  169. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  170. Assert.Equal(expected, actual);
  171. input = Shuffle(input);
  172. }
  173. }
  174. [Fact]
  175. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_Nullable_<#=n#>_NoNull()
  176. {
  177. var input = new <#=cs#>?[] { <#=values#> }.AsEnumerable();
  178. for (var i = 0; i < <#=ShuffleCount#>; i++)
  179. {
  180. var expected = input.<#=op#>();
  181. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  182. Assert.Equal(expected, actual);
  183. input = Shuffle(input);
  184. }
  185. }
  186. #if !NO_DEEP_CANCELLATION
  187. [Fact]
  188. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_Nullable_<#=n#>_NoNull()
  189. {
  190. var input = new <#=cs#>?[] { <#=values#> }.AsEnumerable();
  191. for (var i = 0; i < <#=ShuffleCount#>; i++)
  192. {
  193. var expected = input.<#=op#>();
  194. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  195. Assert.Equal(expected, actual);
  196. input = Shuffle(input);
  197. }
  198. }
  199. #endif
  200. [Fact]
  201. public async Task <#=op#>Async_<#=t.Name#>_Nullable_<#=n#>_AllNull()
  202. {
  203. var input = Enumerable.Repeat(default(<#=cs#>?), <#=n#>);
  204. var expected = input.<#=op#>();
  205. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  206. Assert.Equal(expected, actual);
  207. }
  208. [Fact]
  209. public async Task <#=op#>Async_Selector_<#=t.Name#>_Nullable_<#=n#>_AllNull()
  210. {
  211. var input = Enumerable.Repeat(default(<#=cs#>?), <#=n#>);
  212. var expected = input.<#=op#>();
  213. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  214. Assert.Equal(expected, actual);
  215. }
  216. [Fact]
  217. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_Nullable_<#=n#>_AllNull()
  218. {
  219. var input = Enumerable.Repeat(default(<#=cs#>?), <#=n#>);
  220. var expected = input.<#=op#>();
  221. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  222. Assert.Equal(expected, actual);
  223. }
  224. #if !NO_DEEP_CANCELLATION
  225. [Fact]
  226. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_Nullable_<#=n#>_AllNull()
  227. {
  228. var input = Enumerable.Repeat(default(<#=cs#>?), <#=n#>);
  229. var expected = input.<#=op#>();
  230. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  231. Assert.Equal(expected, actual);
  232. }
  233. #endif
  234. [Fact]
  235. public async Task <#=op#>Async_<#=t.Name#>_Nullable_<#=n#>_SomeNull()
  236. {
  237. var input = new <#=cs#>?[] { <#=valuesWithNull#> }.AsEnumerable();
  238. for (var i = 0; i < <#=ShuffleCount#>; i++)
  239. {
  240. var expected = input.<#=op#>();
  241. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  242. Assert.Equal(expected, actual);
  243. input = Shuffle(input);
  244. }
  245. }
  246. [Fact]
  247. public async Task <#=op#>Async_Selector_<#=t.Name#>_Nullable_<#=n#>_SomeNull()
  248. {
  249. var input = new <#=cs#>?[] { <#=valuesWithNull#> }.AsEnumerable();
  250. for (var i = 0; i < <#=ShuffleCount#>; i++)
  251. {
  252. var expected = input.<#=op#>();
  253. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  254. Assert.Equal(expected, actual);
  255. input = Shuffle(input);
  256. }
  257. }
  258. [Fact]
  259. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_Nullable_<#=n#>_SomeNull()
  260. {
  261. var input = new <#=cs#>?[] { <#=valuesWithNull#> }.AsEnumerable();
  262. for (var i = 0; i < <#=ShuffleCount#>; i++)
  263. {
  264. var expected = input.<#=op#>();
  265. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  266. Assert.Equal(expected, actual);
  267. input = Shuffle(input);
  268. }
  269. }
  270. #if !NO_DEEP_CANCELLATION
  271. [Fact]
  272. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_Nullable_<#=n#>_SomeNull()
  273. {
  274. var input = new <#=cs#>?[] { <#=valuesWithNull#> }.AsEnumerable();
  275. for (var i = 0; i < <#=ShuffleCount#>; i++)
  276. {
  277. var expected = input.<#=op#>();
  278. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  279. Assert.Equal(expected, actual);
  280. input = Shuffle(input);
  281. }
  282. }
  283. #endif
  284. <#
  285. }
  286. if (t == typeof(float) || t == typeof(double))
  287. {
  288. foreach (var n in new[] { 1, 4, 8, 16 })
  289. {
  290. var values = string.Join(", ", getRandom(n * 42, n, -100, 100).Select((x, i) => i % 2 == 0 ? toCSharp(t) + ".NaN" : x.ToString()));
  291. var valuesWithNull = string.Join(", ", getRandom(n * 42, n, -100, 100).Select((x, i) => i % 3 == 0 ? x.ToString() : (i % 3 == 1 ? "null" : toCSharp(t) + ".NaN")));
  292. #>
  293. [Fact]
  294. public async Task <#=op#>Async_<#=t.Name#>_WithNaN_<#=n#>()
  295. {
  296. var input = new <#=cs#>[] { <#=values#> }.AsEnumerable();
  297. for (var i = 0; i < <#=ShuffleCount#>; i++)
  298. {
  299. var expected = input.<#=op#>();
  300. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  301. Assert.Equal(expected, actual);
  302. input = Shuffle(input);
  303. }
  304. }
  305. [Fact]
  306. public async Task <#=op#>Async_Selector_<#=t.Name#>_WithNaN_<#=n#>()
  307. {
  308. var input = new <#=cs#>[] { <#=values#> }.AsEnumerable();
  309. for (var i = 0; i < <#=ShuffleCount#>; i++)
  310. {
  311. var expected = input.<#=op#>();
  312. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  313. Assert.Equal(expected, actual);
  314. input = Shuffle(input);
  315. }
  316. }
  317. [Fact]
  318. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_WithNaN_<#=n#>()
  319. {
  320. var input = new <#=cs#>[] { <#=values#> }.AsEnumerable();
  321. for (var i = 0; i < <#=ShuffleCount#>; i++)
  322. {
  323. var expected = input.<#=op#>();
  324. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>>(x), CancellationToken.None);
  325. Assert.Equal(expected, actual);
  326. input = Shuffle(input);
  327. }
  328. }
  329. #if !NO_DEEP_CANCELLATION
  330. [Fact]
  331. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_WithNaN_<#=n#>()
  332. {
  333. var input = new <#=cs#>[] { <#=values#> }.AsEnumerable();
  334. for (var i = 0; i < <#=ShuffleCount#>; i++)
  335. {
  336. var expected = input.<#=op#>();
  337. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>>(x), CancellationToken.None);
  338. Assert.Equal(expected, actual);
  339. input = Shuffle(input);
  340. }
  341. }
  342. #endif
  343. [Fact]
  344. public async Task <#=op#>Async_<#=t.Name#>_WithNaN_<#=n#>_AllNaN()
  345. {
  346. var input = Enumerable.Repeat(<#=toCSharp(t)#>.NaN, <#=n#>);
  347. var expected = input.<#=op#>();
  348. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  349. Assert.Equal(expected, actual);
  350. }
  351. [Fact]
  352. public async Task <#=op#>Async_Selector_<#=t.Name#>_WithNaN_<#=n#>_AllNaN()
  353. {
  354. var input = Enumerable.Repeat(<#=toCSharp(t)#>.NaN, <#=n#>);
  355. var expected = input.<#=op#>();
  356. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  357. Assert.Equal(expected, actual);
  358. }
  359. [Fact]
  360. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_WithNaN_<#=n#>_AllNaN()
  361. {
  362. var input = Enumerable.Repeat(<#=toCSharp(t)#>.NaN, <#=n#>);
  363. var expected = input.<#=op#>();
  364. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  365. Assert.Equal(expected, actual);
  366. }
  367. #if !NO_DEEP_CANCELLATION
  368. [Fact]
  369. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_WithNaN_<#=n#>_AllNaN()
  370. {
  371. var input = Enumerable.Repeat(<#=toCSharp(t)#>.NaN, <#=n#>);
  372. var expected = input.<#=op#>();
  373. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  374. Assert.Equal(expected, actual);
  375. }
  376. #endif
  377. [Fact]
  378. public async Task <#=op#>Async_<#=t.Name#>_WithNaN_Nullable_<#=n#>_NoNull()
  379. {
  380. var input = new <#=cs#>?[] { <#=values#> }.AsEnumerable();
  381. for (var i = 0; i < <#=ShuffleCount#>; i++)
  382. {
  383. var expected = input.<#=op#>();
  384. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  385. Assert.Equal(expected, actual);
  386. input = Shuffle(input);
  387. }
  388. }
  389. [Fact]
  390. public async Task <#=op#>Async_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_NoNull()
  391. {
  392. var input = new <#=cs#>?[] { <#=values#> }.AsEnumerable();
  393. for (var i = 0; i < <#=ShuffleCount#>; i++)
  394. {
  395. var expected = input.<#=op#>();
  396. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  397. Assert.Equal(expected, actual);
  398. input = Shuffle(input);
  399. }
  400. }
  401. [Fact]
  402. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_NoNull()
  403. {
  404. var input = new <#=cs#>?[] { <#=values#> }.AsEnumerable();
  405. for (var i = 0; i < <#=ShuffleCount#>; i++)
  406. {
  407. var expected = input.<#=op#>();
  408. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  409. Assert.Equal(expected, actual);
  410. input = Shuffle(input);
  411. }
  412. }
  413. #if !NO_DEEP_CANCELLATION
  414. [Fact]
  415. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_NoNull()
  416. {
  417. var input = new <#=cs#>?[] { <#=values#> }.AsEnumerable();
  418. for (var i = 0; i < <#=ShuffleCount#>; i++)
  419. {
  420. var expected = input.<#=op#>();
  421. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  422. Assert.Equal(expected, actual);
  423. input = Shuffle(input);
  424. }
  425. }
  426. #endif
  427. [Fact]
  428. public async Task <#=op#>Async_<#=t.Name#>_WithNaN_Nullable_<#=n#>_AllNull()
  429. {
  430. var input = Enumerable.Repeat(default(<#=cs#>?), <#=n#>);
  431. var expected = input.<#=op#>();
  432. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  433. Assert.Equal(expected, actual);
  434. }
  435. [Fact]
  436. public async Task <#=op#>Async_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_AllNull()
  437. {
  438. var input = Enumerable.Repeat(default(<#=cs#>?), <#=n#>);
  439. var expected = input.<#=op#>();
  440. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  441. Assert.Equal(expected, actual);
  442. }
  443. [Fact]
  444. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_AllNull()
  445. {
  446. var input = Enumerable.Repeat(default(<#=cs#>?), <#=n#>);
  447. var expected = input.<#=op#>();
  448. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  449. Assert.Equal(expected, actual);
  450. }
  451. #if !NO_DEEP_CANCELLATION
  452. [Fact]
  453. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_AllNull()
  454. {
  455. var input = Enumerable.Repeat(default(<#=cs#>?), <#=n#>);
  456. var expected = input.<#=op#>();
  457. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  458. Assert.Equal(expected, actual);
  459. }
  460. #endif
  461. [Fact]
  462. public async Task <#=op#>Async_<#=t.Name#>_WithNaN_Nullable_<#=n#>_AllNaN()
  463. {
  464. var input = Enumerable.Repeat<<#=toCSharp(t)#>?>(<#=toCSharp(t)#>.NaN, <#=n#>);
  465. var expected = input.<#=op#>();
  466. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  467. Assert.Equal(expected, actual);
  468. }
  469. [Fact]
  470. public async Task <#=op#>Async_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_AllNaN()
  471. {
  472. var input = Enumerable.Repeat<<#=toCSharp(t)#>?>(<#=toCSharp(t)#>.NaN, <#=n#>);
  473. var expected = input.<#=op#>();
  474. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  475. Assert.Equal(expected, actual);
  476. }
  477. [Fact]
  478. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_AllNaN()
  479. {
  480. var input = Enumerable.Repeat<<#=toCSharp(t)#>?>(<#=toCSharp(t)#>.NaN, <#=n#>);
  481. var expected = input.<#=op#>();
  482. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  483. Assert.Equal(expected, actual);
  484. }
  485. #if !NO_DEEP_CANCELLATION
  486. [Fact]
  487. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_AllNaN()
  488. {
  489. var input = Enumerable.Repeat<<#=toCSharp(t)#>?>(<#=toCSharp(t)#>.NaN, <#=n#>);
  490. var expected = input.<#=op#>();
  491. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  492. Assert.Equal(expected, actual);
  493. }
  494. #endif
  495. [Fact]
  496. public async Task <#=op#>Async_<#=t.Name#>_WithNaN_Nullable_<#=n#>_SomeNull()
  497. {
  498. var input = new <#=cs#>?[] { <#=valuesWithNull#> }.AsEnumerable();
  499. for (var i = 0; i < <#=ShuffleCount#>; i++)
  500. {
  501. var expected = input.<#=op#>();
  502. var actual = await input.ToAsyncEnumerable().<#=op#>Async(CancellationToken.None);
  503. Assert.Equal(expected, actual);
  504. input = Shuffle(input);
  505. }
  506. }
  507. [Fact]
  508. public async Task <#=op#>Async_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_SomeNull()
  509. {
  510. var input = new <#=cs#>?[] { <#=valuesWithNull#> }.AsEnumerable();
  511. for (var i = 0; i < <#=ShuffleCount#>; i++)
  512. {
  513. var expected = input.<#=op#>();
  514. var actual = await input.ToAsyncEnumerable().<#=op#>Async(x => x, CancellationToken.None);
  515. Assert.Equal(expected, actual);
  516. input = Shuffle(input);
  517. }
  518. }
  519. [Fact]
  520. public async Task <#=op#>AwaitAsync_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_SomeNull()
  521. {
  522. var input = new <#=cs#>?[] { <#=valuesWithNull#> }.AsEnumerable();
  523. for (var i = 0; i < <#=ShuffleCount#>; i++)
  524. {
  525. var expected = input.<#=op#>();
  526. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitAsync(x => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  527. Assert.Equal(expected, actual);
  528. input = Shuffle(input);
  529. }
  530. }
  531. #if !NO_DEEP_CANCELLATION
  532. [Fact]
  533. public async Task <#=op#>AwaitWithCancellationAsync_Selector_<#=t.Name#>_WithNaN_Nullable_<#=n#>_SomeNull()
  534. {
  535. var input = new <#=cs#>?[] { <#=valuesWithNull#> }.AsEnumerable();
  536. for (var i = 0; i < <#=ShuffleCount#>; i++)
  537. {
  538. var expected = input.<#=op#>();
  539. var actual = await input.ToAsyncEnumerable().<#=op#>AwaitWithCancellationAsync((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  540. Assert.Equal(expected, actual);
  541. input = Shuffle(input);
  542. }
  543. }
  544. #endif
  545. <#
  546. }
  547. }
  548. }
  549. }
  550. #>
  551. private static IEnumerable<T> Shuffle<T>(IEnumerable<T> source)
  552. {
  553. var rand = new Random(42);
  554. return source.OrderBy(x => rand.Next());
  555. }
  556. }
  557. }