PageRenderTime 80ms CodeModel.GetById 43ms RepoModel.GetById 9ms app.codeStats 0ms

/System.Reactive.Tests/System.Reactive.Linq/ObservableConnectableTest.cs

https://github.com/gshackles/mono-reactive
C# | 148 lines | 132 code | 14 blank | 2 comment | 0 complexity | 07aa7ead6268803ae01149460bbe21e6 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Reactive;
  6. using System.Reactive.Concurrency;
  7. using System.Reactive.Disposables;
  8. using System.Reactive.Linq;
  9. using System.Threading;
  10. using NUnit.Framework;
  11. namespace System.Reactive.Linq.Tests
  12. {
  13. [TestFixture]
  14. public class ObservableConnectableTest
  15. {
  16. [Test]
  17. public void Publish ()
  18. {
  19. var source = Observable.Range (2, 3, Scheduler.Immediate);
  20. int result = 1;
  21. bool started = false;
  22. var published = source.Publish ();
  23. var pdis1 = published.Subscribe (i => { started = true; result *= i; });
  24. Assert.IsFalse (started, "#1");
  25. var cdis = published.Connect ();
  26. Assert.IsTrue (started, "#2");
  27. Assert.AreEqual (24, result, "#3");
  28. var pdis2 = published.Subscribe (i => { started = true; result *= i; });
  29. Assert.AreEqual (24, result, "#3"); // but it should not happen.
  30. cdis.Dispose (); // disconnect
  31. pdis1.Dispose ();
  32. pdis2.Dispose ();
  33. }
  34. [Test]
  35. public void PublishConnectTwice ()
  36. {
  37. var source = Observable.Range (2, 3, Scheduler.Immediate);
  38. int result = 1;
  39. bool started = false;
  40. var published = source.Publish ();
  41. var pdis1 = published.Subscribe (i => { started = true; result *= i; });
  42. Assert.IsFalse (started, "#1");
  43. var cdis1 = published.Connect ();
  44. var cdis2 = published.Connect (); // no error
  45. Assert.AreEqual (cdis1, cdis2, "#2");
  46. pdis1.Dispose ();
  47. cdis1.Dispose ();
  48. }
  49. [Test]
  50. public void PublishReconnect ()
  51. {
  52. var scheduler = new HistoricalScheduler ();
  53. var source = Observable.Interval (TimeSpan.FromMilliseconds (50), scheduler);
  54. int result = 0;
  55. var published = source.Publish ();
  56. var pdis1 = published.Subscribe (i => result++);
  57. Assert.AreEqual (0, result, "#0");
  58. var cdis1 = published.Connect ();
  59. scheduler.AdvanceBy (TimeSpan.FromMilliseconds (200)); // should be enough to receive some events
  60. Assert.AreEqual (4, result, "#1");
  61. pdis1.Dispose ();
  62. cdis1.Dispose (); // disconnect
  63. scheduler.AdvanceBy (TimeSpan.FromMilliseconds (200)); // should be enough to raise interval event if it were active (which should *not*)
  64. Assert.AreEqual (4, result, "#2");
  65. // Step 2: Without any *new* subscription, it does not result in events.
  66. var cdis2 = published.Connect ();
  67. scheduler.AdvanceBy (TimeSpan.FromMilliseconds (200)); // should be enough to receive some events
  68. Assert.AreEqual (4, result , "#3");
  69. cdis2.Dispose ();
  70. // Step 3: with new subscription, it should result in events again.
  71. var pdis3 = published.Subscribe (i => result++);
  72. var cdis3 = published.Connect (); // without any *new* subscription, it does not result in events.
  73. scheduler.AdvanceBy (TimeSpan.FromMilliseconds (200)); // should be enough to receive some events
  74. Assert.AreEqual (8, result , "#3");
  75. cdis3.Dispose ();
  76. pdis3.Dispose (); // This should not result in NRE (possibly because of the internal cleanup). Note that this is in reverse order to pdis1
  77. }
  78. [Test]
  79. public void PublishLast ()
  80. {
  81. var scheduler = new HistoricalScheduler ();
  82. var hot = Observable.Interval (TimeSpan.FromMilliseconds (20), scheduler).Skip (4).Take (2).PublishLast ();
  83. hot.Connect ();
  84. var observable = hot.Replay ();
  85. observable.Connect ();
  86. long result = 0;
  87. var dis = observable.Subscribe (i => result += i);
  88. scheduler.AdvanceBy (TimeSpan.FromSeconds (1));
  89. Assert.AreEqual (5, result, "#1");
  90. dis.Dispose ();
  91. var dis2 = observable.Subscribe (i => result += i);
  92. Assert.AreEqual (10, result, "#2");
  93. dis2.Dispose ();
  94. }
  95. [Test]
  96. public void RefCount ()
  97. {
  98. int side = 0;
  99. var scheduler = new HistoricalScheduler ();
  100. var source = Observable.Interval (TimeSpan.FromMilliseconds (50), scheduler).Do (i => side++);
  101. int result = 0;
  102. var published = source.Publish ();
  103. var connected = published.RefCount ();
  104. var cdis1 = connected.Subscribe (i => result++);
  105. scheduler.AdvanceBy (TimeSpan.FromMilliseconds (400));
  106. Assert.IsTrue (result > 0, "#1");
  107. cdis1.Dispose (); // also disconnects.
  108. int oldSide = side;
  109. scheduler.AdvanceBy (TimeSpan.FromMilliseconds (400));
  110. Assert.AreEqual (oldSide, side, "#2"); // no advance in sequence
  111. var cdis2 = connected.Subscribe (i => result++);
  112. scheduler.AdvanceBy (TimeSpan.FromSeconds (1));
  113. Assert.IsTrue (side > oldSide, "#3");
  114. cdis2.Dispose ();
  115. }
  116. [Test]
  117. public void Replay ()
  118. {
  119. var scheduler = new HistoricalScheduler ();
  120. var hot = Observable.Interval (TimeSpan.FromMilliseconds (20), scheduler).Take (5).Publish ();
  121. hot.Connect ();
  122. var observable = hot.Replay ();
  123. observable.Connect ();
  124. int result = 0;
  125. var dis1 = observable.Subscribe (i => result++);
  126. scheduler.AdvanceBy (TimeSpan.FromSeconds (1));
  127. Assert.AreEqual (5, result, "#1");
  128. var dis2 = observable.Subscribe (i => result++);
  129. Assert.AreEqual (10, result, "#1");
  130. dis1.Dispose ();
  131. dis2.Dispose ();
  132. }
  133. }
  134. }