AppendPrependTest.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  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.Reactive.Concurrency;
  6. using System.Reactive.Linq;
  7. using Microsoft.Reactive.Testing;
  8. using Microsoft.VisualStudio.TestTools.UnitTesting;
  9. using Assert = Xunit.Assert;
  10. namespace ReactiveTests.Tests
  11. {
  12. [TestClass]
  13. public class AppendPrependTest : ReactiveTest
  14. {
  15. [TestMethod]
  16. public void AppendPrepend()
  17. {
  18. var scheduler = new TestScheduler();
  19. var xs = scheduler.CreateHotObservable(
  20. OnNext(150, 1),
  21. OnNext(220, 2),
  22. OnCompleted<int>(250)
  23. );
  24. var res = scheduler.Start(() =>
  25. xs.Append(3).Prepend(4)
  26. );
  27. res.Messages.AssertEqual(
  28. OnNext(200, 4),
  29. OnNext(220, 2),
  30. OnNext(250, 3),
  31. OnCompleted<int>(250)
  32. );
  33. }
  34. [TestMethod]
  35. public void PrependAppend()
  36. {
  37. var scheduler = new TestScheduler();
  38. var xs = scheduler.CreateHotObservable(
  39. OnNext(150, 1),
  40. OnNext(220, 2),
  41. OnCompleted<int>(250)
  42. );
  43. var res = scheduler.Start(() =>
  44. xs.Prepend(4).Append(3)
  45. );
  46. res.Messages.AssertEqual(
  47. OnNext(200, 4),
  48. OnNext(220, 2),
  49. OnNext(250, 3),
  50. OnCompleted<int>(250)
  51. );
  52. }
  53. [TestMethod]
  54. public void AppendPrepend_Scheduler()
  55. {
  56. var scheduler = new TestScheduler();
  57. var xs = scheduler.CreateHotObservable(
  58. OnNext(150, 1),
  59. OnNext(220, 2),
  60. OnCompleted<int>(250)
  61. );
  62. var res = scheduler.Start(() =>
  63. xs.Append(3, scheduler).Prepend(4, scheduler)
  64. );
  65. res.Messages.AssertEqual(
  66. OnNext(201, 4),
  67. OnNext(220, 2),
  68. OnNext(251, 3),
  69. OnCompleted<int>(251)
  70. );
  71. }
  72. [TestMethod]
  73. public void PrependAppend_Scheduler()
  74. {
  75. var scheduler = new TestScheduler();
  76. var xs = scheduler.CreateHotObservable(
  77. OnNext(150, 1),
  78. OnNext(220, 2),
  79. OnCompleted<int>(250)
  80. );
  81. var res = scheduler.Start(() =>
  82. xs.Prepend(4, scheduler).Append(3, scheduler)
  83. );
  84. res.Messages.AssertEqual(
  85. OnNext(201, 4),
  86. OnNext(220, 2),
  87. OnNext(251, 3),
  88. OnCompleted<int>(251)
  89. );
  90. }
  91. [TestMethod]
  92. public void AppendPrepend_Many()
  93. {
  94. var scheduler = new TestScheduler();
  95. var xs = scheduler.CreateHotObservable(
  96. OnNext(150, 1),
  97. OnNext(220, 2),
  98. OnCompleted<int>(250)
  99. );
  100. var res = scheduler.Start(() =>
  101. xs.Append(3).Append(4).Append(5).Prepend(6).Prepend(7).Prepend(8)
  102. );
  103. res.Messages.AssertEqual(
  104. OnNext(200, 8),
  105. OnNext(200, 7),
  106. OnNext(200, 6),
  107. OnNext(220, 2),
  108. OnNext(250, 3),
  109. OnNext(250, 4),
  110. OnNext(250, 5),
  111. OnCompleted<int>(250)
  112. );
  113. }
  114. [TestMethod]
  115. public void PrependAppend_Many()
  116. {
  117. var scheduler = new TestScheduler();
  118. var xs = scheduler.CreateHotObservable(
  119. OnNext(150, 1),
  120. OnNext(220, 2),
  121. OnCompleted<int>(250)
  122. );
  123. var res = scheduler.Start(() =>
  124. xs.Prepend(6).Prepend(7).Prepend(8).Append(3).Append(4).Append(5)
  125. );
  126. res.Messages.AssertEqual(
  127. OnNext(200, 8),
  128. OnNext(200, 7),
  129. OnNext(200, 6),
  130. OnNext(220, 2),
  131. OnNext(250, 3),
  132. OnNext(250, 4),
  133. OnNext(250, 5),
  134. OnCompleted<int>(250)
  135. );
  136. }
  137. [TestMethod]
  138. public void AppendPrepend_Many_Scheduler()
  139. {
  140. var scheduler = new TestScheduler();
  141. var xs = scheduler.CreateHotObservable(
  142. OnNext(150, 1),
  143. OnNext(220, 2),
  144. OnCompleted<int>(250)
  145. );
  146. var res = scheduler.Start(() =>
  147. xs.Append(3, scheduler)
  148. .Append(4, scheduler)
  149. .Append(5, scheduler)
  150. .Prepend(6, scheduler)
  151. .Prepend(7, scheduler)
  152. .Prepend(8, scheduler)
  153. );
  154. res.Messages.AssertEqual(
  155. OnNext(201, 8),
  156. OnNext(202, 7),
  157. OnNext(203, 6),
  158. OnNext(220, 2),
  159. OnNext(251, 3),
  160. OnNext(252, 4),
  161. OnNext(253, 5),
  162. OnCompleted<int>(253)
  163. );
  164. }
  165. [TestMethod]
  166. public void PrependAppend_Many_Scheduler()
  167. {
  168. var scheduler = new TestScheduler();
  169. var xs = scheduler.CreateHotObservable(
  170. OnNext(150, 1),
  171. OnNext(220, 2),
  172. OnCompleted<int>(250)
  173. );
  174. var res = scheduler.Start(() =>
  175. xs.Prepend(6, scheduler)
  176. .Prepend(7, scheduler)
  177. .Prepend(8, scheduler)
  178. .Append(3, scheduler)
  179. .Append(4, scheduler)
  180. .Append(5, scheduler)
  181. );
  182. res.Messages.AssertEqual(
  183. OnNext(201, 8),
  184. OnNext(202, 7),
  185. OnNext(203, 6),
  186. OnNext(220, 2),
  187. OnNext(251, 3),
  188. OnNext(252, 4),
  189. OnNext(253, 5),
  190. OnCompleted<int>(253)
  191. );
  192. }
  193. [TestMethod]
  194. public void AppendPrepend_Mixed()
  195. {
  196. var scheduler = new TestScheduler();
  197. var xs = scheduler.CreateHotObservable(
  198. OnNext(150, 1),
  199. OnNext(220, 2),
  200. OnCompleted<int>(250)
  201. );
  202. var res = scheduler.Start(() =>
  203. xs.Append(3).Prepend(6).Append(4).Prepend(7).Prepend(8).Append(5)
  204. );
  205. res.Messages.AssertEqual(
  206. OnNext(200, 8),
  207. OnNext(200, 7),
  208. OnNext(200, 6),
  209. OnNext(220, 2),
  210. OnNext(250, 3),
  211. OnNext(250, 4),
  212. OnNext(250, 5),
  213. OnCompleted<int>(250)
  214. );
  215. }
  216. [TestMethod]
  217. public void AppendPrepend_Mixed_Scheduler()
  218. {
  219. var scheduler = new TestScheduler();
  220. var xs = scheduler.CreateHotObservable(
  221. OnNext(150, 1),
  222. OnNext(220, 2),
  223. OnCompleted<int>(250)
  224. );
  225. var res = scheduler.Start(() =>
  226. xs.Append(3, scheduler)
  227. .Prepend(6, scheduler)
  228. .Append(4, scheduler)
  229. .Prepend(7, scheduler)
  230. .Prepend(8, scheduler)
  231. .Append(5, scheduler)
  232. );
  233. res.Messages.AssertEqual(
  234. OnNext(201, 8),
  235. OnNext(202, 7),
  236. OnNext(203, 6),
  237. OnNext(220, 2),
  238. OnNext(251, 3),
  239. OnNext(252, 4),
  240. OnNext(253, 5),
  241. OnCompleted<int>(253)
  242. );
  243. }
  244. [TestMethod]
  245. public void AppendPrepend_MixedSchedulers()
  246. {
  247. var scheduler = new TestScheduler();
  248. var xs = scheduler.CreateHotObservable(
  249. OnNext(150, 1),
  250. OnNext(220, 2),
  251. OnCompleted<int>(250)
  252. );
  253. var res = scheduler.Start(() =>
  254. xs.Append(3, scheduler)
  255. .Prepend(6)
  256. .Append(4, scheduler)
  257. .Prepend(7)
  258. .Prepend(8, scheduler)
  259. .Append(5)
  260. );
  261. res.Messages.AssertEqual(
  262. OnNext(201, 8),
  263. OnNext(201, 7),
  264. OnNext(201, 6),
  265. OnNext(220, 2),
  266. OnNext(251, 3),
  267. OnNext(252, 4),
  268. OnNext(252, 5),
  269. OnCompleted<int>(252)
  270. );
  271. }
  272. [TestMethod]
  273. public void AppendPrepend_SchedulerRecursive()
  274. {
  275. using var scheduler = new EventLoopScheduler();
  276. var source = Observable.Range(1, 1000).DelaySubscription(TimeSpan.FromMilliseconds(100), ThreadPoolScheduler.Instance);
  277. var result = source.Prepend(0, scheduler).Prepend(-1, scheduler)
  278. .Timeout(TimeSpan.FromSeconds(5))
  279. .ToList().First();
  280. Assert.Equal(1002, result.Count);
  281. var j = 0;
  282. for (var i = -1; i <= 1000; i++)
  283. {
  284. Assert.Equal(i, result[j++]);
  285. }
  286. }
  287. [TestMethod]
  288. public void AppendPrepend_SchedulerLongRunning()
  289. {
  290. var scheduler = NewThreadScheduler.Default;
  291. Assert.True(scheduler is ISchedulerLongRunning, "Not a long-running scheduler!");
  292. var source = Observable.Range(1, 1000).DelaySubscription(TimeSpan.FromMilliseconds(100), ThreadPoolScheduler.Instance);
  293. var result = source.Prepend(0, scheduler).Prepend(-1, scheduler)
  294. .Timeout(TimeSpan.FromSeconds(5))
  295. .ToList().First();
  296. Assert.Equal(1002, result.Count);
  297. var j = 0;
  298. for (var i = -1; i <= 1000; i++)
  299. {
  300. Assert.Equal(i, result[j++]);
  301. }
  302. }
  303. }
  304. }