AsyncTests.Single.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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 partial class AsyncTests
  13. {
  14. [Fact]
  15. public void MoveNextExtension_Null()
  16. {
  17. var en = default(IAsyncEnumerator<int>);
  18. Assert.ThrowsAsync<ArgumentNullException>(() => en.MoveNextAsync());
  19. }
  20. [Fact]
  21. public void SelectWhere2()
  22. {
  23. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  24. var ys = xs.Select(i => i + 2).Where(i => i % 2 == 0);
  25. var e = ys.GetAsyncEnumerator();
  26. HasNext(e, 2);
  27. HasNext(e, 4);
  28. NoNext(e);
  29. }
  30. [Fact]
  31. public void WhereSelect2()
  32. {
  33. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  34. var ys = xs.Where(i => i % 2 == 0).Select(i => i + 2);
  35. var e = ys.GetAsyncEnumerator();
  36. HasNext(e, 2);
  37. HasNext(e, 4);
  38. NoNext(e);
  39. }
  40. [Fact]
  41. public void WhereSelect3()
  42. {
  43. var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable();
  44. var ys = xs.Where(i => i % 2 == 0).Select(i => i + 2).Select(i => i + 2);
  45. var e = ys.GetAsyncEnumerator();
  46. HasNext(e, 4);
  47. HasNext(e, 6);
  48. NoNext(e);
  49. }
  50. [Fact]
  51. public void AsAsyncEnumerable_Null()
  52. {
  53. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.AsAsyncEnumerable<int>((IAsyncEnumerable<int>)null));
  54. }
  55. [Fact]
  56. public void AsAsyncEnumerable1()
  57. {
  58. var xs = AsyncEnumerable.Return(42);
  59. var ys = xs.AsAsyncEnumerable();
  60. Assert.NotSame(xs, ys);
  61. var e = xs.GetAsyncEnumerator();
  62. HasNext(e, 42);
  63. NoNext(e);
  64. }
  65. [Fact]
  66. public void RepeatSeq_Null()
  67. {
  68. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Repeat(default(IAsyncEnumerable<int>)));
  69. AssertThrows<ArgumentNullException>(() => AsyncEnumerableEx.Repeat(default(IAsyncEnumerable<int>), 3));
  70. AssertThrows<ArgumentOutOfRangeException>(() => AsyncEnumerableEx.Repeat(AsyncEnumerable.Return(42), -1));
  71. }
  72. [Fact]
  73. public void RepeatSeq1()
  74. {
  75. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat();
  76. var e = xs.GetAsyncEnumerator();
  77. HasNext(e, 1);
  78. HasNext(e, 2);
  79. HasNext(e, 3);
  80. HasNext(e, 1);
  81. HasNext(e, 2);
  82. HasNext(e, 3);
  83. HasNext(e, 1);
  84. HasNext(e, 2);
  85. HasNext(e, 3);
  86. }
  87. [Fact]
  88. public void RepeatSeq2()
  89. {
  90. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(3);
  91. var e = xs.GetAsyncEnumerator();
  92. HasNext(e, 1);
  93. HasNext(e, 2);
  94. HasNext(e, 3);
  95. HasNext(e, 1);
  96. HasNext(e, 2);
  97. HasNext(e, 3);
  98. HasNext(e, 1);
  99. HasNext(e, 2);
  100. HasNext(e, 3);
  101. NoNext(e);
  102. }
  103. [Fact]
  104. public void RepeatSeq3()
  105. {
  106. var i = 0;
  107. var xs = RepeatXs(() => i++).ToAsyncEnumerable().Repeat(3);
  108. var e = xs.GetAsyncEnumerator();
  109. HasNext(e, 1);
  110. HasNext(e, 2);
  111. HasNext(e, 1);
  112. HasNext(e, 2);
  113. HasNext(e, 1);
  114. HasNext(e, 2);
  115. NoNext(e);
  116. Assert.Equal(3, i);
  117. }
  118. [Fact]
  119. public void RepeatSeq0()
  120. {
  121. var i = 0;
  122. var xs = RepeatXs(() => i++).ToAsyncEnumerable().Repeat(0);
  123. var e = xs.GetAsyncEnumerator();
  124. NoNext(e);
  125. }
  126. [Fact]
  127. public async Task RepeatSeq6()
  128. {
  129. var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(3);
  130. await SequenceIdentity(xs);
  131. }
  132. static IEnumerable<int> RepeatXs(Action started)
  133. {
  134. started();
  135. yield return 1;
  136. yield return 2;
  137. }
  138. [Fact]
  139. public void RepeatSeq4()
  140. {
  141. var xs = new FailRepeat().ToAsyncEnumerable().Repeat();
  142. var e = xs.GetAsyncEnumerator();
  143. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException);
  144. }
  145. [Fact]
  146. public void RepeatSeq5()
  147. {
  148. var xs = new FailRepeat().ToAsyncEnumerable().Repeat(3);
  149. var e = xs.GetAsyncEnumerator();
  150. AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException);
  151. }
  152. class FailRepeat : IEnumerable<int>
  153. {
  154. public IEnumerator<int> GetEnumerator()
  155. {
  156. throw new NotImplementedException();
  157. }
  158. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  159. {
  160. throw new NotImplementedException();
  161. }
  162. }
  163. }
  164. }