MinMax.Generated.tt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  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#>_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#>_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#>_AsyncSelector_Empty_<#=t.Name#>()
  62. {
  63. await AssertThrowsAsync<InvalidOperationException>(new object[0].ToAsyncEnumerable().<#=op#>Async(_ => default(ValueTask<<#=cs#>>), CancellationToken.None).AsTask());
  64. }
  65. #if !NO_DEEP_CANCELLATION
  66. [Fact]
  67. public async Task <#=op#>_AsyncSelectorWithCancellation_Empty_<#=t.Name#>()
  68. {
  69. await AssertThrowsAsync<InvalidOperationException>(new object[0].ToAsyncEnumerable().<#=op#>Async((x, ct) => default(ValueTask<<#=cs#>>), CancellationToken.None).AsTask());
  70. }
  71. #endif
  72. [Fact]
  73. public async Task <#=op#>_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#>_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#>_AsyncSelector_Empty_Nullable_<#=t.Name#>()
  84. {
  85. Assert.Null(await new object[0].ToAsyncEnumerable().<#=op#>Async(_ => default(ValueTask<<#=cs#>?>), CancellationToken.None));
  86. }
  87. #if !NO_DEEP_CANCELLATION
  88. [Fact]
  89. public async Task <#=op#>_AsyncSelectorWithCancellation_Empty_Nullable_<#=t.Name#>()
  90. {
  91. Assert.Null(await new object[0].ToAsyncEnumerable().<#=op#>Async((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#>_<#=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#>_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#>_AsyncSelector_<#=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#>Async(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#>_AsyncSelectorWithCancellation_<#=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#>Async((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#>_<#=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#>_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#>_AsyncSelector_<#=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#>Async(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#>_AsyncSelectorWithCancellation_<#=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#>Async((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#>_<#=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#>_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#>_AsyncSelector_<#=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#>Async(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#>_AsyncSelectorWithCancellation_<#=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#>Async((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  231. Assert.Equal(expected, actual);
  232. }
  233. #endif
  234. [Fact]
  235. public async Task <#=op#>_<#=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#>_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#>_AsyncSelector_<#=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#>Async(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#>_AsyncSelectorWithCancellation_<#=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#>Async((x, ct) => new ValueTask<<#=cs#>?>(x), CancellationToken.None);
  279. Assert.Equal(expected, actual);
  280. input = Shuffle(input);
  281. }
  282. }
  283. #endif
  284. <#
  285. }
  286. foreach (var n in new[] { 1, 4, 8, 16 })
  287. {
  288. var values = string.Join(", ", getRandom(n * 42, n, -100, 100));
  289. #>
  290. <#
  291. }
  292. }
  293. }
  294. #>
  295. private static IEnumerable<T> Shuffle<T>(IEnumerable<T> source)
  296. {
  297. var rand = new Random(42);
  298. return source.OrderBy(x => rand.Next());
  299. }
  300. }
  301. }