ExpandTest.cs 5.5 KB

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