DefaultIfEmpty.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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.Tasks;
  8. using Xunit;
  9. namespace Tests
  10. {
  11. public class DefaultIfEmpty : AsyncEnumerableTests
  12. {
  13. [Fact]
  14. public void DefaultIfEmpty_Null()
  15. {
  16. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.DefaultIfEmpty<int>(default));
  17. Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.DefaultIfEmpty(default, 42));
  18. }
  19. [Fact]
  20. public async Task DefaultIfEmpty_Empty()
  21. {
  22. var xs = AsyncEnumerable.Empty<int>().DefaultIfEmpty();
  23. var e = xs.GetAsyncEnumerator();
  24. await HasNextAsync(e, 0);
  25. await NoNextAsync(e);
  26. }
  27. [Fact]
  28. public async Task DefaultIfEmpty_Value_Empty()
  29. {
  30. var xs = AsyncEnumerable.Empty<int>().DefaultIfEmpty(42);
  31. var e = xs.GetAsyncEnumerator();
  32. await HasNextAsync(e, 42);
  33. await NoNextAsync(e);
  34. }
  35. [Fact]
  36. public async Task DefaultIfEmpty_Single()
  37. {
  38. var xs = Return42.DefaultIfEmpty();
  39. var e = xs.GetAsyncEnumerator();
  40. await HasNextAsync(e, 42);
  41. await NoNextAsync(e);
  42. }
  43. [Fact]
  44. public async Task DefaultIfEmpty_Value_Single()
  45. {
  46. var xs = Return42.DefaultIfEmpty(24);
  47. var e = xs.GetAsyncEnumerator();
  48. await HasNextAsync(e, 42);
  49. await NoNextAsync(e);
  50. }
  51. [Fact]
  52. public async Task DefaultIfEmpty_Many()
  53. {
  54. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().Select(x => x).DefaultIfEmpty();
  55. var e = xs.GetAsyncEnumerator();
  56. await HasNextAsync(e, 1);
  57. await HasNextAsync(e, 2);
  58. await HasNextAsync(e, 3);
  59. await HasNextAsync(e, 4);
  60. await NoNextAsync(e);
  61. }
  62. [Fact]
  63. public async Task DefaultIfEmpty_Many_IList()
  64. {
  65. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty();
  66. var e = xs.GetAsyncEnumerator();
  67. await HasNextAsync(e, 1);
  68. await HasNextAsync(e, 2);
  69. await HasNextAsync(e, 3);
  70. await HasNextAsync(e, 4);
  71. await NoNextAsync(e);
  72. }
  73. [Fact]
  74. public async Task DefaultIfEmpty_Value_IList()
  75. {
  76. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().Select(x => x).DefaultIfEmpty(24);
  77. var e = xs.GetAsyncEnumerator();
  78. await HasNextAsync(e, 1);
  79. await HasNextAsync(e, 2);
  80. await HasNextAsync(e, 3);
  81. await HasNextAsync(e, 4);
  82. await NoNextAsync(e);
  83. }
  84. [Fact]
  85. public async Task DefaultIfEmpty_Value_Many_IList()
  86. {
  87. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24);
  88. var e = xs.GetAsyncEnumerator();
  89. await HasNextAsync(e, 1);
  90. await HasNextAsync(e, 2);
  91. await HasNextAsync(e, 3);
  92. await HasNextAsync(e, 4);
  93. await NoNextAsync(e);
  94. }
  95. [Fact]
  96. public async Task DefaultIfEmpty_Throws_Source()
  97. {
  98. var ex = new Exception("Bang!");
  99. var xs = Throw<int>(ex).DefaultIfEmpty();
  100. var e = xs.GetAsyncEnumerator();
  101. await AssertThrowsAsync(e.MoveNextAsync(), ex);
  102. }
  103. [Fact]
  104. public async Task DefaultIfEmpty_Value_Throws_Source()
  105. {
  106. var ex = new Exception("Bang!");
  107. var xs = Throw<int>(ex).DefaultIfEmpty(24);
  108. var e = xs.GetAsyncEnumerator();
  109. await AssertThrowsAsync(e.MoveNextAsync(), ex);
  110. }
  111. [Fact]
  112. public async Task DefaultIfEmpty_IAsyncIListProvider_ToArray_Empty()
  113. {
  114. var xs = AsyncEnumerable.Empty<int>().DefaultIfEmpty(42);
  115. var res = new[] { 42 };
  116. Assert.True(res.SequenceEqual(await xs.ToArrayAsync()));
  117. }
  118. [Fact]
  119. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_ToArray_Empty()
  120. {
  121. var xs = AsyncEnumerable.Empty<int>().DefaultIfEmpty(42);
  122. var res = new List<int> { 42 };
  123. Assert.True(res.SequenceEqual(await xs.ToListAsync()));
  124. }
  125. [Fact]
  126. public async Task DefaultIfEmpty_IAsyncIListProvider_ToList()
  127. {
  128. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty();
  129. var res = new[] { 1, 2, 3, 4 };
  130. Assert.True(res.SequenceEqual(await xs.ToArrayAsync()));
  131. }
  132. [Fact]
  133. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_ToList()
  134. {
  135. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24);
  136. var res = new List<int> { 1, 2, 3, 4 };
  137. Assert.True(res.SequenceEqual(await xs.ToListAsync()));
  138. }
  139. [Fact]
  140. public async Task DefaultIfEmpty_IAsyncIListProvider_Count_Empty()
  141. {
  142. var xs = AsyncEnumerable.Empty<int>().DefaultIfEmpty(42);
  143. Assert.Equal(1, await xs.CountAsync());
  144. }
  145. [Fact]
  146. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_Count()
  147. {
  148. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().Where(x => x > 0).DefaultIfEmpty(24);
  149. Assert.Equal(4, await xs.CountAsync());
  150. }
  151. [Fact]
  152. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_Count_IAsyncIListProvider()
  153. {
  154. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().Select(x => x).DefaultIfEmpty(24);
  155. Assert.Equal(4, await xs.CountAsync());
  156. }
  157. [Fact]
  158. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_Count_IList()
  159. {
  160. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24);
  161. Assert.Equal(4, await xs.CountAsync());
  162. }
  163. [Fact]
  164. public async Task DefaultIfEmpty_SequenceIdentity()
  165. {
  166. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24);
  167. await SequenceIdentity(xs);
  168. }
  169. }
  170. }