ExpandTest.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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.Linq;
  6. using System.Reactive.Linq;
  7. using Microsoft.Reactive.Testing;
  8. using ReactiveTests.Dummies;
  9. using Microsoft.VisualStudio.TestTools.UnitTesting;
  10. using Assert = Xunit.Assert;
  11. namespace ReactiveTests.Tests
  12. {
  13. [TestClass]
  14. public class ExpandTest : ReactiveTest
  15. {
  16. [TestMethod]
  17. public void Expand_ArgumentChecking()
  18. {
  19. ReactiveAssert.Throws<ArgumentNullException>(() => ObservableEx.Expand(null, DummyFunc<int, IObservable<int>>.Instance, DummyScheduler.Instance));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => ObservableEx.Expand(DummyObservable<int>.Instance, null, DummyScheduler.Instance));
  21. ReactiveAssert.Throws<ArgumentNullException>(() => ObservableEx.Expand(DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, null));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => ObservableEx.Expand(null, DummyFunc<int, IObservable<int>>.Instance));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => ObservableEx.Expand(DummyObservable<int>.Instance, null));
  24. }
  25. [TestMethod]
  26. public void Expand_Default()
  27. {
  28. var b = Observable.Return(1).Expand(x => x < 10 ? Observable.Return(x + 1) : Observable.Empty<int>())
  29. .SequenceEqual(Observable.Range(1, 10)).First();
  30. Assert.True(b);
  31. }
  32. [TestMethod]
  33. public void Expand_Empty()
  34. {
  35. var scheduler = new TestScheduler();
  36. var xs = scheduler.CreateHotObservable(
  37. OnCompleted<int>(300)
  38. );
  39. var res = scheduler.Start(() =>
  40. xs.Expand(x => scheduler.CreateColdObservable(
  41. OnNext(100, 1),
  42. OnNext(200, 2),
  43. OnCompleted<int>(300)
  44. ), scheduler)
  45. );
  46. res.Messages.AssertEqual(
  47. OnCompleted<int>(300)
  48. );
  49. xs.Subscriptions.AssertEqual(
  50. Subscribe(201, 300)
  51. );
  52. }
  53. [TestMethod]
  54. public void Expand_Error()
  55. {
  56. var scheduler = new TestScheduler();
  57. var ex = new Exception();
  58. var xs = scheduler.CreateHotObservable(
  59. OnError<int>(300, ex)
  60. );
  61. var res = scheduler.Start(() =>
  62. xs.Expand(x => scheduler.CreateColdObservable(
  63. OnNext(100 + x, 2 * x),
  64. OnNext(200 + x, 3 * x),
  65. OnCompleted<int>(300 + x)
  66. ), scheduler)
  67. );
  68. res.Messages.AssertEqual(
  69. OnError<int>(300, ex)
  70. );
  71. xs.Subscriptions.AssertEqual(
  72. Subscribe(201, 300)
  73. );
  74. }
  75. [TestMethod]
  76. public void Expand_Never()
  77. {
  78. var scheduler = new TestScheduler();
  79. var xs = scheduler.CreateHotObservable<int>(
  80. );
  81. var res = scheduler.Start(() =>
  82. xs.Expand(x => scheduler.CreateColdObservable(
  83. OnNext(100 + x, 2 * x),
  84. OnNext(200 + x, 3 * x),
  85. OnCompleted<int>(300 + x)
  86. ), scheduler)
  87. );
  88. res.Messages.AssertEqual(
  89. );
  90. xs.Subscriptions.AssertEqual(
  91. Subscribe(201, 1000)
  92. );
  93. }
  94. [TestMethod]
  95. public void Expand_Basic()
  96. {
  97. var scheduler = new TestScheduler();
  98. var xs = scheduler.CreateHotObservable(
  99. OnNext(550, 1),
  100. OnNext(850, 2),
  101. OnCompleted<int>(950)
  102. );
  103. var res = scheduler.Start(() =>
  104. xs.Expand(x => scheduler.CreateColdObservable(
  105. OnNext(100, 2 * x),
  106. OnNext(200, 3 * x),
  107. OnCompleted<int>(300)
  108. ), scheduler)
  109. );
  110. res.Messages.AssertEqual(
  111. OnNext(550, 1),
  112. OnNext(651, 2),
  113. OnNext(751, 3),
  114. OnNext(752, 4),
  115. OnNext(850, 2),
  116. OnNext(852, 6),
  117. OnNext(852, 6),
  118. OnNext(853, 8),
  119. OnNext(951, 4),
  120. OnNext(952, 9),
  121. OnNext(952, 12),
  122. OnNext(953, 12),
  123. OnNext(953, 12),
  124. OnNext(954, 16)
  125. );
  126. xs.Subscriptions.AssertEqual(
  127. Subscribe(201, 950)
  128. );
  129. }
  130. [TestMethod]
  131. public void Expand_Throw()
  132. {
  133. var scheduler = new TestScheduler();
  134. var xs = scheduler.CreateHotObservable(
  135. OnNext(550, 1),
  136. OnNext(850, 2),
  137. OnCompleted<int>(950)
  138. );
  139. var ex = new Exception();
  140. var res = scheduler.Start(() =>
  141. xs.Expand(x => { throw ex; }, scheduler)
  142. );
  143. res.Messages.AssertEqual(
  144. OnNext(550, 1),
  145. OnError<int>(550, ex)
  146. );
  147. xs.Subscriptions.AssertEqual(
  148. Subscribe(201, 550)
  149. );
  150. }
  151. }
  152. }