WhenTest.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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.Reactive.Joins;
  8. using System.Reactive.Linq;
  9. using Microsoft.Reactive.Testing;
  10. using Xunit;
  11. namespace ReactiveTests.Tests
  12. {
  13. public class WhenTest : ReactiveTest
  14. {
  15. [Fact]
  16. public void When_ArgumentChecking()
  17. {
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.When<int>(null));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.When((IEnumerable<Plan<int>>)null));
  20. }
  21. [Fact]
  22. public void WhenMultipleDataSymmetric()
  23. {
  24. var scheduler = new TestScheduler();
  25. var xs = scheduler.CreateHotObservable(
  26. OnNext(210, 1),
  27. OnNext(220, 2),
  28. OnNext(230, 3),
  29. OnCompleted<int>(240)
  30. );
  31. var ys = scheduler.CreateHotObservable(
  32. OnNext(240, 4),
  33. OnNext(250, 5),
  34. OnNext(260, 6),
  35. OnCompleted<int>(270)
  36. );
  37. var res = scheduler.Start(() =>
  38. Observable.When(
  39. xs.And(ys).Then((x, y) => x + y)
  40. )
  41. );
  42. res.Messages.AssertEqual(
  43. OnNext(240, 1 + 4),
  44. OnNext(250, 2 + 5),
  45. OnNext(260, 3 + 6),
  46. OnCompleted<int>(270)
  47. );
  48. }
  49. [Fact]
  50. public void WhenMultipleDataAsymmetric()
  51. {
  52. var scheduler = new TestScheduler();
  53. var xs = scheduler.CreateHotObservable(
  54. OnNext(210, 1),
  55. OnNext(220, 2),
  56. OnNext(230, 3),
  57. OnCompleted<int>(240)
  58. );
  59. var ys = scheduler.CreateHotObservable(
  60. OnNext(240, 4),
  61. OnNext(250, 5),
  62. OnCompleted<int>(270)
  63. );
  64. var res = scheduler.Start(() =>
  65. Observable.When(
  66. xs.And(ys).Then((x, y) => x + y)
  67. )
  68. );
  69. res.Messages.AssertEqual(
  70. OnNext(240, 1 + 4),
  71. OnNext(250, 2 + 5),
  72. OnCompleted<int>(270)
  73. );
  74. }
  75. [Fact]
  76. public void WhenEmptyEmpty()
  77. {
  78. var scheduler = new TestScheduler();
  79. var xs = scheduler.CreateHotObservable(
  80. OnCompleted<int>(240)
  81. );
  82. var ys = scheduler.CreateHotObservable(
  83. OnCompleted<int>(270)
  84. );
  85. var res = scheduler.Start(() =>
  86. Observable.When(
  87. xs.And(ys).Then((x, y) => x + y)
  88. )
  89. );
  90. res.Messages.AssertEqual(
  91. OnCompleted<int>(270)
  92. );
  93. }
  94. [Fact]
  95. public void WhenNeverNever()
  96. {
  97. var scheduler = new TestScheduler();
  98. var xs = Observable.Never<int>();
  99. var ys = Observable.Never<int>().AsObservable();
  100. var res = scheduler.Start(() =>
  101. Observable.When(
  102. xs.And(ys).Then((x, y) => x + y)
  103. )
  104. );
  105. res.Messages.AssertEqual(
  106. );
  107. }
  108. [Fact]
  109. public void WhenThrowNonEmpty()
  110. {
  111. var ex = new Exception();
  112. var scheduler = new TestScheduler();
  113. var xs = scheduler.CreateHotObservable(
  114. OnError<int>(240, ex)
  115. );
  116. var ys = scheduler.CreateHotObservable(
  117. OnCompleted<int>(270)
  118. );
  119. var res = scheduler.Start(() =>
  120. Observable.When(
  121. xs.And(ys).Then((x, y) => x + y)
  122. )
  123. );
  124. res.Messages.AssertEqual(
  125. OnError<int>(240, ex)
  126. );
  127. }
  128. [Fact]
  129. public void ComplicatedWhen()
  130. {
  131. var scheduler = new TestScheduler();
  132. var xs = scheduler.CreateHotObservable(
  133. OnNext(210, 1),
  134. OnNext(220, 2),
  135. OnNext(230, 3),
  136. OnCompleted<int>(240)
  137. );
  138. var ys = scheduler.CreateHotObservable(
  139. OnNext(240, 4),
  140. OnNext(250, 5),
  141. OnNext(260, 6),
  142. OnCompleted<int>(270)
  143. );
  144. var zs = scheduler.CreateHotObservable(
  145. OnNext(220, 7),
  146. OnNext(230, 8),
  147. OnNext(240, 9),
  148. OnCompleted<int>(300)
  149. );
  150. var res = scheduler.Start(() =>
  151. Observable.When(
  152. xs.And(ys).Then((x, y) => x + y),
  153. xs.And(zs).Then((x, z) => x * z),
  154. ys.And(zs).Then((y, z) => y - z)
  155. )
  156. );
  157. res.Messages.AssertEqual(
  158. OnNext(220, 1 * 7),
  159. OnNext(230, 2 * 8),
  160. OnNext(240, 3 + 4),
  161. OnNext(250, 5 - 9),
  162. OnCompleted<int>(300)
  163. );
  164. }
  165. [Fact]
  166. public void When_PlansIteratorThrows()
  167. {
  168. var ex = new Exception();
  169. var _e = default(Exception);
  170. GetPlans(ex).When().Subscribe(_ => { }, e => { _e = e; });
  171. Assert.Same(_e, ex);
  172. }
  173. private IEnumerable<Plan<int>> GetPlans(Exception ex)
  174. {
  175. if (ex != null)
  176. {
  177. throw ex;
  178. }
  179. yield break;
  180. }
  181. [Fact]
  182. public void SameSource()
  183. {
  184. var source = Observable.Range(1, 5);
  185. var list = Observable.When(source.And(source).Then((a, b) => a + b))
  186. .ToList().First();
  187. Assert.Equal(new List<int>() { 2, 4, 6, 8, 10 }, list);
  188. }
  189. }
  190. }