Average.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using Xunit;
  10. namespace Tests
  11. {
  12. public class Average : AsyncEnumerableTests
  13. {
  14. [Fact]
  15. public async Task Average_Null()
  16. {
  17. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<int>)));
  18. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<int?>)));
  19. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<long>)));
  20. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<long?>)));
  21. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<double>)));
  22. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<double?>)));
  23. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<float>)));
  24. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<float?>)));
  25. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<decimal>)));
  26. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<decimal?>)));
  27. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<int>), x => x));
  28. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<int?>), x => x));
  29. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<long>), x => x));
  30. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<long?>), x => x));
  31. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<double>), x => x));
  32. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<double?>), x => x));
  33. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<float>), x => x));
  34. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<float?>), x => x));
  35. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<decimal>), x => x));
  36. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<decimal?>), x => x));
  37. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, int>)));
  38. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, int?>)));
  39. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, long>)));
  40. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, long?>)));
  41. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, double>)));
  42. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, double?>)));
  43. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, float>)));
  44. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, float?>)));
  45. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, decimal>)));
  46. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, decimal?>)));
  47. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<int>), CancellationToken.None));
  48. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<int?>), CancellationToken.None));
  49. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<long>), CancellationToken.None));
  50. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<long?>), CancellationToken.None));
  51. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<double>), CancellationToken.None));
  52. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<double?>), CancellationToken.None));
  53. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<float>), CancellationToken.None));
  54. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<float?>), CancellationToken.None));
  55. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<decimal>), CancellationToken.None));
  56. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<decimal?>), CancellationToken.None));
  57. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<int>), x => x, CancellationToken.None));
  58. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<int?>), x => x, CancellationToken.None));
  59. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<long>), x => x, CancellationToken.None));
  60. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<long?>), x => x, CancellationToken.None));
  61. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<double>), x => x, CancellationToken.None));
  62. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<double?>), x => x, CancellationToken.None));
  63. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<float>), x => x, CancellationToken.None));
  64. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<float?>), x => x, CancellationToken.None));
  65. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<decimal>), x => x, CancellationToken.None));
  66. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(default(IAsyncEnumerable<decimal?>), x => x, CancellationToken.None));
  67. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, int>), CancellationToken.None));
  68. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, int?>), CancellationToken.None));
  69. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, long>), CancellationToken.None));
  70. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, long?>), CancellationToken.None));
  71. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, double>), CancellationToken.None));
  72. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, double?>), CancellationToken.None));
  73. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, float>), CancellationToken.None));
  74. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, float?>), CancellationToken.None));
  75. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, decimal>), CancellationToken.None));
  76. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.AverageAsync(AsyncEnumerable.Empty<int>(), default(Func<int, decimal?>), CancellationToken.None));
  77. }
  78. [Fact]
  79. public async Task Average1()
  80. {
  81. var xs = new[] { 1, 2, 3 };
  82. var ys = xs.ToAsyncEnumerable();
  83. Assert.Equal(xs.Average(), await ys.AverageAsync());
  84. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  85. }
  86. [Fact]
  87. public async Task Average2()
  88. {
  89. var xs = new[] { 1, default(int?), 3 };
  90. var ys = xs.ToAsyncEnumerable();
  91. Assert.Equal(xs.Average(), await ys.AverageAsync());
  92. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  93. }
  94. [Fact]
  95. public async Task Average3()
  96. {
  97. var xs = new[] { 1L, 2L, 3L };
  98. var ys = xs.ToAsyncEnumerable();
  99. Assert.Equal(xs.Average(), await ys.AverageAsync());
  100. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  101. }
  102. [Fact]
  103. public async Task Average4()
  104. {
  105. var xs = new[] { 1L, default(long?), 3L };
  106. var ys = xs.ToAsyncEnumerable();
  107. Assert.Equal(xs.Average(), await ys.AverageAsync());
  108. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  109. }
  110. [Fact]
  111. public async Task Average5()
  112. {
  113. var xs = new[] { 1.0, 2.0, 3.0 };
  114. var ys = xs.ToAsyncEnumerable();
  115. Assert.Equal(xs.Average(), await ys.AverageAsync());
  116. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  117. }
  118. [Fact]
  119. public async Task Average6()
  120. {
  121. var xs = new[] { 1.0, default(double?), 3.0 };
  122. var ys = xs.ToAsyncEnumerable();
  123. Assert.Equal(xs.Average(), await ys.AverageAsync());
  124. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  125. }
  126. [Fact]
  127. public async Task Average7()
  128. {
  129. var xs = new[] { 1.0f, 2.0f, 3.0f };
  130. var ys = xs.ToAsyncEnumerable();
  131. Assert.Equal(xs.Average(), await ys.AverageAsync());
  132. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  133. }
  134. [Fact]
  135. public async Task Average8()
  136. {
  137. var xs = new[] { 1.0f, default(float?), 3.0f };
  138. var ys = xs.ToAsyncEnumerable();
  139. Assert.Equal(xs.Average(), await ys.AverageAsync());
  140. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  141. }
  142. [Fact]
  143. public async Task Average9()
  144. {
  145. var xs = new[] { 1.0m, 2.0m, 3.0m };
  146. var ys = xs.ToAsyncEnumerable();
  147. Assert.Equal(xs.Average(), await ys.AverageAsync());
  148. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  149. }
  150. [Fact]
  151. public async Task Average10()
  152. {
  153. var xs = new[] { 1.0m, default(decimal?), 3.0m };
  154. var ys = xs.ToAsyncEnumerable();
  155. Assert.Equal(xs.Average(), await ys.AverageAsync());
  156. Assert.Equal(xs.Average(), await ys.AverageAsync(x => x));
  157. }
  158. [Fact]
  159. public async Task Average11()
  160. {
  161. var xs = new int[0];
  162. var ys = xs.ToAsyncEnumerable();
  163. await Assert.ThrowsAsync<InvalidOperationException>(() => ys.AverageAsync());
  164. }
  165. [Fact]
  166. public async Task Average12()
  167. {
  168. var xs = new int?[0];
  169. var ys = xs.ToAsyncEnumerable();
  170. Assert.Null(await ys.AverageAsync());
  171. }
  172. [Fact]
  173. public async Task Average13()
  174. {
  175. var xs = new long[0];
  176. var ys = xs.ToAsyncEnumerable();
  177. await Assert.ThrowsAsync<InvalidOperationException>(() => ys.AverageAsync());
  178. }
  179. [Fact]
  180. public async Task Average14()
  181. {
  182. var xs = new long?[0];
  183. var ys = xs.ToAsyncEnumerable();
  184. Assert.Null(await ys.AverageAsync());
  185. }
  186. [Fact]
  187. public async Task Average15()
  188. {
  189. var xs = new double[0];
  190. var ys = xs.ToAsyncEnumerable();
  191. await Assert.ThrowsAsync<InvalidOperationException>(() => ys.AverageAsync());
  192. }
  193. [Fact]
  194. public async Task Average16()
  195. {
  196. var xs = new double?[0];
  197. var ys = xs.ToAsyncEnumerable();
  198. Assert.Null(await ys.AverageAsync());
  199. }
  200. [Fact]
  201. public async Task Average17()
  202. {
  203. var xs = new float[0];
  204. var ys = xs.ToAsyncEnumerable();
  205. await Assert.ThrowsAsync<InvalidOperationException>(() => ys.AverageAsync());
  206. }
  207. [Fact]
  208. public async Task Average18()
  209. {
  210. var xs = new float?[0];
  211. var ys = xs.ToAsyncEnumerable();
  212. Assert.Null(await ys.AverageAsync());
  213. }
  214. [Fact]
  215. public async Task Average19()
  216. {
  217. var xs = new decimal[0];
  218. var ys = xs.ToAsyncEnumerable();
  219. await Assert.ThrowsAsync<InvalidOperationException>(() => ys.AverageAsync());
  220. }
  221. [Fact]
  222. public async Task Average20()
  223. {
  224. var xs = new decimal?[0];
  225. var ys = xs.ToAsyncEnumerable();
  226. Assert.Null(await ys.AverageAsync());
  227. }
  228. }
  229. }