ForEachAsync.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. #if !HAS_AWAIT_FOREACH
  5. using System;
  6. using System.Linq;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using Xunit;
  10. namespace Tests
  11. {
  12. public class ForEachAsync : AsyncEnumerableTests
  13. {
  14. [Fact]
  15. public async Task ForEachAsync_Null()
  16. {
  17. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(default, x => { }));
  18. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync(Return42, default(Action<int>)));
  19. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(default, (x, i) => { }));
  20. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync(Return42, default(Action<int, int>)));
  21. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(default, x => { }, CancellationToken.None));
  22. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync(Return42, default(Action<int>), CancellationToken.None));
  23. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync<int>(default, (x, i) => { }, CancellationToken.None));
  24. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAsync(Return42, default(Action<int, int>), CancellationToken.None));
  25. }
  26. [Fact]
  27. public async Task ForEachAsync_Simple()
  28. {
  29. var sum = 0;
  30. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  31. await xs.ForEachAsync(x => sum += x);
  32. Assert.Equal(10, sum);
  33. }
  34. [Fact]
  35. public async Task ForEachAsync_Indexed()
  36. {
  37. var sum = 0;
  38. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  39. await xs.ForEachAsync((x, i) => sum += x * i);
  40. Assert.Equal(1 * 0 + 2 * 1 + 3 * 2 + 4 * 3, sum);
  41. }
  42. [Fact]
  43. public async Task ForEachAsync_Throws_Action()
  44. {
  45. var ex = new Exception("Bang");
  46. var xs = Throw<int>(ex);
  47. await AssertThrowsAsync(xs.ForEachAsync(x => { throw ex; }), ex);
  48. }
  49. [Fact]
  50. public async Task ForEachAsync_Indexed_Throws_Action()
  51. {
  52. var ex = new Exception("Bang");
  53. var xs = Throw<int>(ex);
  54. await AssertThrowsAsync(xs.ForEachAsync((int x, int i) => { throw ex; }), ex);
  55. }
  56. [Fact]
  57. public async Task ForEachAwaitAsync_Null()
  58. {
  59. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitAsync<int>(default, x => Task.CompletedTask));
  60. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitAsync(Return42, default(Func<int, Task>)));
  61. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitAsync<int>(default, (x, i) => Task.CompletedTask));
  62. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitAsync(Return42, default(Func<int, int, Task>)));
  63. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitAsync<int>(default, x => Task.CompletedTask, CancellationToken.None));
  64. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitAsync(Return42, default(Func<int, Task>), CancellationToken.None));
  65. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitAsync(default, (int x, int i) => Task.CompletedTask, CancellationToken.None));
  66. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitAsync(Return42, default(Func<int, int, Task>), CancellationToken.None));
  67. }
  68. [Fact]
  69. public async Task ForEachAwaitAsync_Simple()
  70. {
  71. var sum = 0;
  72. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  73. await xs.ForEachAwaitAsync(x => { sum += x; return Task.CompletedTask; });
  74. Assert.Equal(10, sum);
  75. }
  76. [Fact]
  77. public async Task ForEachAwaitAsync_Indexed()
  78. {
  79. var sum = 0;
  80. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  81. await xs.ForEachAwaitAsync((x, i) => { sum += x * i; return Task.CompletedTask; });
  82. Assert.Equal(1 * 0 + 2 * 1 + 3 * 2 + 4 * 3, sum);
  83. }
  84. [Fact]
  85. public async Task ForEachAwaitAsync_Throws_Action()
  86. {
  87. var ex = new Exception("Bang");
  88. var xs = Throw<int>(ex);
  89. await AssertThrowsAsync(xs.ForEachAsync(x => Task.FromException(ex)), ex);
  90. }
  91. [Fact]
  92. public async Task ForEachAwaitAsync_Indexed_Throws_Action()
  93. {
  94. var ex = new Exception("Bang");
  95. var xs = Throw<int>(ex);
  96. await AssertThrowsAsync(xs.ForEachAsync((int x, int i) => Task.FromException(ex)), ex);
  97. }
  98. [Fact]
  99. public async Task ForEachAwaitWithCancellationAsync_Null()
  100. {
  101. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitWithCancellationAsync(default, (int x, CancellationToken ct) => Task.CompletedTask, CancellationToken.None));
  102. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitWithCancellationAsync(Return42, default(Func<int, CancellationToken, Task>), CancellationToken.None));
  103. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitWithCancellationAsync<int>(default, (x, i, ct) => Task.CompletedTask, CancellationToken.None));
  104. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ForEachAwaitWithCancellationAsync(Return42, default(Func<int, int, CancellationToken, Task>), CancellationToken.None));
  105. }
  106. [Fact]
  107. public async Task ForEachAwaitWithCancellationAsync_Simple()
  108. {
  109. var sum = 0;
  110. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  111. await xs.ForEachAwaitWithCancellationAsync((int x, CancellationToken ct) => { sum += x; return Task.CompletedTask; }, CancellationToken.None);
  112. Assert.Equal(10, sum);
  113. }
  114. [Fact]
  115. public async Task ForEachAwaitWithCancellationAsync_Indexed()
  116. {
  117. var sum = 0;
  118. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  119. await xs.ForEachAwaitWithCancellationAsync((x, i, ct) => { sum += x * i; return Task.CompletedTask; }, CancellationToken.None);
  120. Assert.Equal(1 * 0 + 2 * 1 + 3 * 2 + 4 * 3, sum);
  121. }
  122. [Fact]
  123. public async Task ForEachAwaitWithCancellationAsync_Throws_Action()
  124. {
  125. var ex = new Exception("Bang");
  126. var xs = Throw<int>(ex);
  127. await AssertThrowsAsync(xs.ForEachAwaitWithCancellationAsync((int x, CancellationToken ct) => Task.FromException(ex), CancellationToken.None), ex);
  128. }
  129. [Fact]
  130. public async Task ForEachAwaitWithCancellationAsync_Indexed_Throws_Action()
  131. {
  132. var ex = new Exception("Bang");
  133. var xs = Throw<int>(ex);
  134. await AssertThrowsAsync(xs.ForEachAwaitWithCancellationAsync((x, i, ct) => Task.FromException(ex), CancellationToken.None), ex);
  135. }
  136. }
  137. }
  138. #endif