MostRecentTest.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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;
  6. using System.Collections.Generic;
  7. using System.Reactive.Concurrency;
  8. using System.Reactive.Linq;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using Microsoft.Reactive.Testing;
  12. using Microsoft.VisualStudio.TestTools.UnitTesting;
  13. using Assert = Xunit.Assert;
  14. namespace ReactiveTests.Tests
  15. {
  16. [TestClass]
  17. public class MostRecentTest : ReactiveTest
  18. {
  19. [TestMethod]
  20. public void MostRecent_ArgumentChecking()
  21. {
  22. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MostRecent(default, 1));
  23. }
  24. [TestMethod]
  25. public void MostRecent1()
  26. {
  27. var evt = new AutoResetEvent(false);
  28. var nxt = new AutoResetEvent(false);
  29. var src = Observable.Create<int>(obs =>
  30. {
  31. Task.Run(() =>
  32. {
  33. evt.WaitOne();
  34. obs.OnNext(1);
  35. nxt.Set();
  36. evt.WaitOne();
  37. obs.OnNext(2);
  38. nxt.Set();
  39. evt.WaitOne();
  40. obs.OnCompleted();
  41. nxt.Set();
  42. });
  43. return () => { };
  44. });
  45. var res = src.MostRecent(42).GetEnumerator();
  46. Assert.True(res.MoveNext());
  47. Assert.Equal(42, res.Current);
  48. Assert.True(res.MoveNext());
  49. Assert.Equal(42, res.Current);
  50. for (var i = 1; i <= 2; i++)
  51. {
  52. evt.Set();
  53. nxt.WaitOne();
  54. Assert.True(res.MoveNext());
  55. Assert.Equal(i, res.Current);
  56. Assert.True(res.MoveNext());
  57. Assert.Equal(i, res.Current);
  58. }
  59. evt.Set();
  60. nxt.WaitOne();
  61. Assert.False(res.MoveNext());
  62. }
  63. [TestMethod]
  64. public void MostRecent2()
  65. {
  66. var scheduler = new TestScheduler();
  67. var xs = scheduler.CreateHotObservable(
  68. OnNext(210, 1),
  69. OnNext(220, 2),
  70. OnNext(230, 3),
  71. OnNext(240, 4),
  72. OnNext(250, 5),
  73. OnNext(260, 6),
  74. OnNext(270, 7),
  75. OnNext(280, 8),
  76. OnNext(290, 9),
  77. OnCompleted<int>(300)
  78. );
  79. var res = xs.MostRecent(0);
  80. var e1 = default(IEnumerator<int>);
  81. scheduler.ScheduleAbsolute(200, () =>
  82. {
  83. e1 = res.GetEnumerator();
  84. });
  85. var o1 = new List<int>();
  86. scheduler.ScheduleAbsolute(205, () =>
  87. {
  88. Assert.True(e1.MoveNext());
  89. o1.Add(e1.Current);
  90. });
  91. scheduler.ScheduleAbsolute(232, () =>
  92. {
  93. Assert.True(e1.MoveNext());
  94. o1.Add(e1.Current);
  95. });
  96. scheduler.ScheduleAbsolute(234, () =>
  97. {
  98. Assert.True(e1.MoveNext());
  99. o1.Add(e1.Current);
  100. });
  101. scheduler.ScheduleAbsolute(265, () =>
  102. {
  103. Assert.True(e1.MoveNext());
  104. o1.Add(e1.Current);
  105. });
  106. scheduler.ScheduleAbsolute(285, () => e1.Dispose());
  107. var e2 = default(IEnumerator);
  108. scheduler.ScheduleAbsolute(255, () =>
  109. {
  110. e2 = ((IEnumerable)res).GetEnumerator();
  111. });
  112. var o2 = new List<int>();
  113. scheduler.ScheduleAbsolute(258, () =>
  114. {
  115. Assert.True(e2.MoveNext());
  116. o2.Add((int)e2.Current);
  117. });
  118. scheduler.ScheduleAbsolute(262, () =>
  119. {
  120. Assert.True(e2.MoveNext());
  121. o2.Add((int)e2.Current);
  122. });
  123. scheduler.ScheduleAbsolute(264, () =>
  124. {
  125. Assert.True(e2.MoveNext());
  126. o2.Add((int)e2.Current);
  127. });
  128. scheduler.ScheduleAbsolute(275, () =>
  129. {
  130. Assert.True(e2.MoveNext());
  131. o2.Add((int)e2.Current);
  132. });
  133. scheduler.Start();
  134. xs.Subscriptions.AssertEqual(
  135. Subscribe(200, 285),
  136. Subscribe(255, 300)
  137. );
  138. o1.AssertEqual(0, 3, 3, 6);
  139. o2.AssertEqual(0, 6, 6, 7);
  140. }
  141. [TestMethod]
  142. public void MostRecent_Error()
  143. {
  144. var ex = new Exception();
  145. var evt = new AutoResetEvent(false);
  146. var nxt = new AutoResetEvent(false);
  147. var src = Observable.Create<int>(obs =>
  148. {
  149. Task.Run(() =>
  150. {
  151. evt.WaitOne();
  152. obs.OnNext(1);
  153. nxt.Set();
  154. evt.WaitOne();
  155. obs.OnError(ex);
  156. nxt.Set();
  157. });
  158. return () => { };
  159. });
  160. var res = src.MostRecent(42).GetEnumerator();
  161. Assert.True(res.MoveNext());
  162. Assert.Equal(42, res.Current);
  163. Assert.True(res.MoveNext());
  164. Assert.Equal(42, res.Current);
  165. evt.Set();
  166. nxt.WaitOne();
  167. Assert.True(res.MoveNext());
  168. Assert.Equal(1, res.Current);
  169. Assert.True(res.MoveNext());
  170. Assert.Equal(1, res.Current);
  171. evt.Set();
  172. nxt.WaitOne();
  173. ReactiveAssert.Throws(ex, () => res.MoveNext());
  174. }
  175. }
  176. }