DefaultIfEmpty.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT 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 expected = new[] { 42 };
  116. var actual = await xs.ToArrayAsync();
  117. Assert.True(expected.SequenceEqual(actual));
  118. }
  119. [Fact]
  120. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_ToArray_Empty()
  121. {
  122. var xs = AsyncEnumerable.Empty<int>().DefaultIfEmpty(42);
  123. var res = new List<int> { 42 };
  124. Assert.True(res.SequenceEqual(await xs.ToListAsync()));
  125. }
  126. [Fact]
  127. public async Task DefaultIfEmpty_IAsyncIListProvider_ToList()
  128. {
  129. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty();
  130. var expected = new[] { 1, 2, 3, 4 };
  131. var actual = await xs.ToArrayAsync();
  132. Assert.True(expected.SequenceEqual(actual));
  133. }
  134. [Fact]
  135. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_ToList()
  136. {
  137. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24);
  138. var res = new List<int> { 1, 2, 3, 4 };
  139. Assert.True(res.SequenceEqual(await xs.ToListAsync()));
  140. }
  141. [Fact]
  142. public async Task DefaultIfEmpty_IAsyncIListProvider_Count_Empty()
  143. {
  144. var xs = AsyncEnumerable.Empty<int>().DefaultIfEmpty(42);
  145. Assert.Equal(1, await xs.CountAsync());
  146. }
  147. [Fact]
  148. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_Count()
  149. {
  150. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().Where(x => x > 0).DefaultIfEmpty(24);
  151. Assert.Equal(4, await xs.CountAsync());
  152. }
  153. [Fact]
  154. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_Count_IAsyncIListProvider()
  155. {
  156. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().Select(x => x).DefaultIfEmpty(24);
  157. Assert.Equal(4, await xs.CountAsync());
  158. }
  159. [Fact]
  160. public async Task DefaultIfEmpty_Value_IAsyncIListProvider_Count_IList()
  161. {
  162. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24);
  163. Assert.Equal(4, await xs.CountAsync());
  164. }
  165. [Fact]
  166. public async Task DefaultIfEmpty_SequenceIdentity()
  167. {
  168. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24);
  169. await SequenceIdentity(xs);
  170. }
  171. }
  172. }