SingleAsyncTest.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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.Reactive.Linq;
  6. using Microsoft.Reactive.Testing;
  7. using ReactiveTests.Dummies;
  8. using Xunit;
  9. namespace ReactiveTests.Tests
  10. {
  11. public class SingleAsyncTest : ReactiveTest
  12. {
  13. [Fact]
  14. public void SingleAsync_ArgumentChecking()
  15. {
  16. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(default(IObservable<int>)));
  17. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(default(IObservable<int>), _ => true));
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(DummyObservable<int>.Instance, default));
  19. }
  20. [Fact]
  21. public void SingleAsync_Empty()
  22. {
  23. var scheduler = new TestScheduler();
  24. var xs = scheduler.CreateHotObservable(
  25. OnNext(150, 1),
  26. OnCompleted<int>(250)
  27. );
  28. var res = scheduler.Start(() =>
  29. xs.SingleAsync()
  30. );
  31. res.Messages.AssertEqual(
  32. OnError<int>(250, e => e is InvalidOperationException)
  33. );
  34. xs.Subscriptions.AssertEqual(
  35. Subscribe(200, 250)
  36. );
  37. }
  38. [Fact]
  39. public void SingleAsync_One()
  40. {
  41. var scheduler = new TestScheduler();
  42. var xs = scheduler.CreateHotObservable(
  43. OnNext(150, 1),
  44. OnNext(210, 2),
  45. OnCompleted<int>(250)
  46. );
  47. var res = scheduler.Start(() =>
  48. xs.SingleAsync()
  49. );
  50. res.Messages.AssertEqual(
  51. OnNext(250, 2),
  52. OnCompleted<int>(250)
  53. );
  54. xs.Subscriptions.AssertEqual(
  55. Subscribe(200, 250)
  56. );
  57. }
  58. [Fact]
  59. public void SingleAsync_Many()
  60. {
  61. var scheduler = new TestScheduler();
  62. var xs = scheduler.CreateHotObservable(
  63. OnNext(150, 1),
  64. OnNext(210, 2),
  65. OnNext(220, 3),
  66. OnCompleted<int>(250)
  67. );
  68. var res = scheduler.Start(() =>
  69. xs.SingleAsync()
  70. );
  71. res.Messages.AssertEqual(
  72. OnError<int>(220, e => e is InvalidOperationException)
  73. );
  74. xs.Subscriptions.AssertEqual(
  75. Subscribe(200, 220)
  76. );
  77. }
  78. [Fact]
  79. public void SingleAsync_Error()
  80. {
  81. var scheduler = new TestScheduler();
  82. var ex = new Exception();
  83. var xs = scheduler.CreateHotObservable(
  84. OnNext(150, 1),
  85. OnError<int>(210, ex)
  86. );
  87. var res = scheduler.Start(() =>
  88. xs.SingleAsync()
  89. );
  90. res.Messages.AssertEqual(
  91. OnError<int>(210, ex)
  92. );
  93. xs.Subscriptions.AssertEqual(
  94. Subscribe(200, 210)
  95. );
  96. }
  97. [Fact]
  98. public void SingleAsync_Predicate()
  99. {
  100. var scheduler = new TestScheduler();
  101. var xs = scheduler.CreateHotObservable(
  102. OnNext(150, 1),
  103. OnNext(210, 2),
  104. OnNext(220, 3),
  105. OnNext(230, 4),
  106. OnNext(240, 5),
  107. OnCompleted<int>(250)
  108. );
  109. var res = scheduler.Start(() =>
  110. xs.SingleAsync(x => x % 2 == 1)
  111. );
  112. res.Messages.AssertEqual(
  113. OnError<int>(240, e => e is InvalidOperationException)
  114. );
  115. xs.Subscriptions.AssertEqual(
  116. Subscribe(200, 240)
  117. );
  118. }
  119. [Fact]
  120. public void SingleAsync_Predicate_Empty()
  121. {
  122. var scheduler = new TestScheduler();
  123. var ex = new Exception();
  124. var xs = scheduler.CreateHotObservable(
  125. OnNext(150, 1),
  126. OnCompleted<int>(250)
  127. );
  128. var res = scheduler.Start(() =>
  129. xs.SingleAsync(x => x % 2 == 1)
  130. );
  131. res.Messages.AssertEqual(
  132. OnError<int>(250, e => e is InvalidOperationException)
  133. );
  134. xs.Subscriptions.AssertEqual(
  135. Subscribe(200, 250)
  136. );
  137. }
  138. [Fact]
  139. public void SingleAsync_Predicate_One()
  140. {
  141. var scheduler = new TestScheduler();
  142. var xs = scheduler.CreateHotObservable(
  143. OnNext(150, 1),
  144. OnNext(210, 2),
  145. OnNext(220, 3),
  146. OnNext(230, 4),
  147. OnNext(240, 5),
  148. OnCompleted<int>(250)
  149. );
  150. var res = scheduler.Start(() =>
  151. xs.SingleAsync(x => x == 4)
  152. );
  153. res.Messages.AssertEqual(
  154. OnNext(250, 4),
  155. OnCompleted<int>(250)
  156. );
  157. xs.Subscriptions.AssertEqual(
  158. Subscribe(200, 250)
  159. );
  160. }
  161. [Fact]
  162. public void SingleAsync_Predicate_Throw()
  163. {
  164. var scheduler = new TestScheduler();
  165. var ex = new Exception();
  166. var xs = scheduler.CreateHotObservable(
  167. OnNext(150, 1),
  168. OnError<int>(210, ex)
  169. );
  170. var res = scheduler.Start(() =>
  171. xs.SingleAsync(x => x > 10)
  172. );
  173. res.Messages.AssertEqual(
  174. OnError<int>(210, ex)
  175. );
  176. xs.Subscriptions.AssertEqual(
  177. Subscribe(200, 210)
  178. );
  179. }
  180. [Fact]
  181. public void SingleAsync_PredicateThrows()
  182. {
  183. var scheduler = new TestScheduler();
  184. var ex = new Exception();
  185. var xs = scheduler.CreateHotObservable(
  186. OnNext(150, 1),
  187. OnNext(210, 2),
  188. OnNext(220, 3),
  189. OnNext(230, 4),
  190. OnNext(240, 5),
  191. OnCompleted<int>(250)
  192. );
  193. var res = scheduler.Start(() =>
  194. xs.SingleAsync(x => { if (x < 4) { return false; } throw ex; })
  195. );
  196. res.Messages.AssertEqual(
  197. OnError<int>(230, ex)
  198. );
  199. xs.Subscriptions.AssertEqual(
  200. Subscribe(200, 230)
  201. );
  202. }
  203. }
  204. }