ExpandTest.cs 5.3 KB

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