WhenTest.cs 6.3 KB

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