WhenTest.cs 6.1 KB

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