1
0

SkipLastTest.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  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.Generic;
  6. using System.Linq;
  7. using System.Reactive.Concurrency;
  8. using System.Reactive.Linq;
  9. using System.Threading;
  10. using Microsoft.Reactive.Testing;
  11. using ReactiveTests.Dummies;
  12. using Microsoft.VisualStudio.TestTools.UnitTesting;
  13. using Assert = Xunit.Assert;
  14. namespace ReactiveTests.Tests
  15. {
  16. #region + Count +
  17. [TestClass]
  18. public class SkipLastTest : ReactiveTest
  19. {
  20. [TestMethod]
  21. public void SkipLast_ArgumentChecking()
  22. {
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SkipLast<int>(null, 0));
  24. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.SkipLast(DummyObservable<int>.Instance, -1));
  25. }
  26. [TestMethod]
  27. public void SkipLast_Zero_Completed()
  28. {
  29. var scheduler = new TestScheduler();
  30. var xs = scheduler.CreateHotObservable(
  31. OnNext(180, 1),
  32. OnNext(210, 2),
  33. OnNext(250, 3),
  34. OnNext(270, 4),
  35. OnNext(310, 5),
  36. OnNext(360, 6),
  37. OnNext(380, 7),
  38. OnNext(410, 8),
  39. OnNext(590, 9),
  40. OnCompleted<int>(650)
  41. );
  42. var res = scheduler.Start(() =>
  43. xs.SkipLast(0)
  44. );
  45. res.Messages.AssertEqual(
  46. OnNext(210, 2),
  47. OnNext(250, 3),
  48. OnNext(270, 4),
  49. OnNext(310, 5),
  50. OnNext(360, 6),
  51. OnNext(380, 7),
  52. OnNext(410, 8),
  53. OnNext(590, 9),
  54. OnCompleted<int>(650)
  55. );
  56. xs.Subscriptions.AssertEqual(
  57. Subscribe(200, 650)
  58. );
  59. }
  60. [TestMethod]
  61. public void SkipLast_Zero_Error()
  62. {
  63. var scheduler = new TestScheduler();
  64. var ex = new Exception();
  65. var xs = scheduler.CreateHotObservable(
  66. OnNext(180, 1),
  67. OnNext(210, 2),
  68. OnNext(250, 3),
  69. OnNext(270, 4),
  70. OnNext(310, 5),
  71. OnNext(360, 6),
  72. OnNext(380, 7),
  73. OnNext(410, 8),
  74. OnNext(590, 9),
  75. OnError<int>(650, ex)
  76. );
  77. var res = scheduler.Start(() =>
  78. xs.SkipLast(0)
  79. );
  80. res.Messages.AssertEqual(
  81. OnNext(210, 2),
  82. OnNext(250, 3),
  83. OnNext(270, 4),
  84. OnNext(310, 5),
  85. OnNext(360, 6),
  86. OnNext(380, 7),
  87. OnNext(410, 8),
  88. OnNext(590, 9),
  89. OnError<int>(650, ex)
  90. );
  91. xs.Subscriptions.AssertEqual(
  92. Subscribe(200, 650)
  93. );
  94. }
  95. [TestMethod]
  96. public void SkipLast_Zero_Disposed()
  97. {
  98. var scheduler = new TestScheduler();
  99. var xs = scheduler.CreateHotObservable(
  100. OnNext(180, 1),
  101. OnNext(210, 2),
  102. OnNext(250, 3),
  103. OnNext(270, 4),
  104. OnNext(310, 5),
  105. OnNext(360, 6),
  106. OnNext(380, 7),
  107. OnNext(410, 8),
  108. OnNext(590, 9)
  109. );
  110. var res = scheduler.Start(() =>
  111. xs.SkipLast(0)
  112. );
  113. res.Messages.AssertEqual(
  114. OnNext(210, 2),
  115. OnNext(250, 3),
  116. OnNext(270, 4),
  117. OnNext(310, 5),
  118. OnNext(360, 6),
  119. OnNext(380, 7),
  120. OnNext(410, 8),
  121. OnNext(590, 9)
  122. );
  123. xs.Subscriptions.AssertEqual(
  124. Subscribe(200, 1000)
  125. );
  126. }
  127. [TestMethod]
  128. public void SkipLast_One_Completed()
  129. {
  130. var scheduler = new TestScheduler();
  131. var xs = scheduler.CreateHotObservable(
  132. OnNext(180, 1),
  133. OnNext(210, 2),
  134. OnNext(250, 3),
  135. OnNext(270, 4),
  136. OnNext(310, 5),
  137. OnNext(360, 6),
  138. OnNext(380, 7),
  139. OnNext(410, 8),
  140. OnNext(590, 9),
  141. OnCompleted<int>(650)
  142. );
  143. var res = scheduler.Start(() =>
  144. xs.SkipLast(1)
  145. );
  146. res.Messages.AssertEqual(
  147. OnNext(250, 2),
  148. OnNext(270, 3),
  149. OnNext(310, 4),
  150. OnNext(360, 5),
  151. OnNext(380, 6),
  152. OnNext(410, 7),
  153. OnNext(590, 8),
  154. OnCompleted<int>(650)
  155. );
  156. xs.Subscriptions.AssertEqual(
  157. Subscribe(200, 650)
  158. );
  159. }
  160. [TestMethod]
  161. public void SkipLast_One_Error()
  162. {
  163. var scheduler = new TestScheduler();
  164. var ex = new Exception();
  165. var xs = scheduler.CreateHotObservable(
  166. OnNext(180, 1),
  167. OnNext(210, 2),
  168. OnNext(250, 3),
  169. OnNext(270, 4),
  170. OnNext(310, 5),
  171. OnNext(360, 6),
  172. OnNext(380, 7),
  173. OnNext(410, 8),
  174. OnNext(590, 9),
  175. OnError<int>(650, ex)
  176. );
  177. var res = scheduler.Start(() =>
  178. xs.SkipLast(1)
  179. );
  180. res.Messages.AssertEqual(
  181. OnNext(250, 2),
  182. OnNext(270, 3),
  183. OnNext(310, 4),
  184. OnNext(360, 5),
  185. OnNext(380, 6),
  186. OnNext(410, 7),
  187. OnNext(590, 8),
  188. OnError<int>(650, ex)
  189. );
  190. xs.Subscriptions.AssertEqual(
  191. Subscribe(200, 650)
  192. );
  193. }
  194. [TestMethod]
  195. public void SkipLast_One_Disposed()
  196. {
  197. var scheduler = new TestScheduler();
  198. var xs = scheduler.CreateHotObservable(
  199. OnNext(180, 1),
  200. OnNext(210, 2),
  201. OnNext(250, 3),
  202. OnNext(270, 4),
  203. OnNext(310, 5),
  204. OnNext(360, 6),
  205. OnNext(380, 7),
  206. OnNext(410, 8),
  207. OnNext(590, 9)
  208. );
  209. var res = scheduler.Start(() =>
  210. xs.SkipLast(1)
  211. );
  212. res.Messages.AssertEqual(
  213. OnNext(250, 2),
  214. OnNext(270, 3),
  215. OnNext(310, 4),
  216. OnNext(360, 5),
  217. OnNext(380, 6),
  218. OnNext(410, 7),
  219. OnNext(590, 8)
  220. );
  221. xs.Subscriptions.AssertEqual(
  222. Subscribe(200, 1000)
  223. );
  224. }
  225. [TestMethod]
  226. public void SkipLast_Three_Completed()
  227. {
  228. var scheduler = new TestScheduler();
  229. var xs = scheduler.CreateHotObservable(
  230. OnNext(180, 1),
  231. OnNext(210, 2),
  232. OnNext(250, 3),
  233. OnNext(270, 4),
  234. OnNext(310, 5),
  235. OnNext(360, 6),
  236. OnNext(380, 7),
  237. OnNext(410, 8),
  238. OnNext(590, 9),
  239. OnCompleted<int>(650)
  240. );
  241. var res = scheduler.Start(() =>
  242. xs.SkipLast(3)
  243. );
  244. res.Messages.AssertEqual(
  245. OnNext(310, 2),
  246. OnNext(360, 3),
  247. OnNext(380, 4),
  248. OnNext(410, 5),
  249. OnNext(590, 6),
  250. OnCompleted<int>(650)
  251. );
  252. xs.Subscriptions.AssertEqual(
  253. Subscribe(200, 650)
  254. );
  255. }
  256. [TestMethod]
  257. public void SkipLast_Three_Error()
  258. {
  259. var scheduler = new TestScheduler();
  260. var ex = new Exception();
  261. var xs = scheduler.CreateHotObservable(
  262. OnNext(180, 1),
  263. OnNext(210, 2),
  264. OnNext(250, 3),
  265. OnNext(270, 4),
  266. OnNext(310, 5),
  267. OnNext(360, 6),
  268. OnNext(380, 7),
  269. OnNext(410, 8),
  270. OnNext(590, 9),
  271. OnError<int>(650, ex)
  272. );
  273. var res = scheduler.Start(() =>
  274. xs.SkipLast(3)
  275. );
  276. res.Messages.AssertEqual(
  277. OnNext(310, 2),
  278. OnNext(360, 3),
  279. OnNext(380, 4),
  280. OnNext(410, 5),
  281. OnNext(590, 6),
  282. OnError<int>(650, ex)
  283. );
  284. xs.Subscriptions.AssertEqual(
  285. Subscribe(200, 650)
  286. );
  287. }
  288. [TestMethod]
  289. public void SkipLast_Three_Disposed()
  290. {
  291. var scheduler = new TestScheduler();
  292. var xs = scheduler.CreateHotObservable(
  293. OnNext(180, 1),
  294. OnNext(210, 2),
  295. OnNext(250, 3),
  296. OnNext(270, 4),
  297. OnNext(310, 5),
  298. OnNext(360, 6),
  299. OnNext(380, 7),
  300. OnNext(410, 8),
  301. OnNext(590, 9)
  302. );
  303. var res = scheduler.Start(() =>
  304. xs.SkipLast(3)
  305. );
  306. res.Messages.AssertEqual(
  307. OnNext(310, 2),
  308. OnNext(360, 3),
  309. OnNext(380, 4),
  310. OnNext(410, 5),
  311. OnNext(590, 6)
  312. );
  313. xs.Subscriptions.AssertEqual(
  314. Subscribe(200, 1000)
  315. );
  316. }
  317. #endregion
  318. #region + Timed +
  319. [TestMethod]
  320. public void SkipLast_Timed_ArgumentChecking()
  321. {
  322. var xs = Observable.Return(42);
  323. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SkipLast(default(IObservable<int>), TimeSpan.FromSeconds(1)));
  324. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.SkipLast(xs, TimeSpan.FromSeconds(-1)));
  325. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SkipLast(default(IObservable<int>), TimeSpan.FromSeconds(1), Scheduler.Default));
  326. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SkipLast(xs, TimeSpan.FromSeconds(1), default));
  327. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.SkipLast(xs, TimeSpan.FromSeconds(-1), Scheduler.Default));
  328. }
  329. [TestMethod]
  330. public void SkipLast_Zero1()
  331. {
  332. var scheduler = new TestScheduler();
  333. var xs = scheduler.CreateHotObservable(
  334. OnNext(210, 1),
  335. OnNext(220, 2),
  336. OnCompleted<int>(230)
  337. );
  338. var res = scheduler.Start(() =>
  339. xs.SkipLast(TimeSpan.Zero, scheduler)
  340. );
  341. res.Messages.AssertEqual(
  342. OnNext(210, 1),
  343. OnNext(220, 2),
  344. OnCompleted<int>(230)
  345. );
  346. xs.Subscriptions.AssertEqual(
  347. Subscribe(200, 230)
  348. );
  349. }
  350. [TestMethod]
  351. public void SkipLast_Zero2()
  352. {
  353. var scheduler = new TestScheduler();
  354. var xs = scheduler.CreateHotObservable(
  355. OnNext(210, 1),
  356. OnNext(220, 2),
  357. OnNext(230, 3),
  358. OnCompleted<int>(230)
  359. );
  360. var res = scheduler.Start(() =>
  361. xs.SkipLast(TimeSpan.Zero, scheduler)
  362. );
  363. res.Messages.AssertEqual(
  364. OnNext(210, 1),
  365. OnNext(220, 2),
  366. OnNext(230, 3),
  367. OnCompleted<int>(230)
  368. );
  369. xs.Subscriptions.AssertEqual(
  370. Subscribe(200, 230)
  371. );
  372. }
  373. [TestMethod]
  374. public void SkipLast_Some1()
  375. {
  376. var scheduler = new TestScheduler();
  377. var xs = scheduler.CreateHotObservable(
  378. OnNext(210, 1),
  379. OnNext(220, 2),
  380. OnCompleted<int>(230)
  381. );
  382. var res = scheduler.Start(() =>
  383. xs.SkipLast(TimeSpan.FromTicks(15), scheduler)
  384. );
  385. res.Messages.AssertEqual(
  386. OnNext(230, 1),
  387. OnCompleted<int>(230)
  388. );
  389. xs.Subscriptions.AssertEqual(
  390. Subscribe(200, 230)
  391. );
  392. }
  393. [TestMethod]
  394. public void SkipLast_Some2()
  395. {
  396. var scheduler = new TestScheduler();
  397. var xs = scheduler.CreateHotObservable(
  398. OnNext(210, 1),
  399. OnNext(220, 2),
  400. OnNext(230, 3),
  401. OnNext(240, 4),
  402. OnNext(250, 5),
  403. OnNext(260, 6),
  404. OnNext(270, 7),
  405. OnNext(280, 8),
  406. OnNext(290, 9),
  407. OnCompleted<int>(300)
  408. );
  409. var res = scheduler.Start(() =>
  410. xs.SkipLast(TimeSpan.FromTicks(45), scheduler)
  411. );
  412. res.Messages.AssertEqual(
  413. OnNext(260, 1),
  414. OnNext(270, 2),
  415. OnNext(280, 3),
  416. OnNext(290, 4),
  417. OnNext(300, 5),
  418. OnCompleted<int>(300)
  419. );
  420. xs.Subscriptions.AssertEqual(
  421. Subscribe(200, 300)
  422. );
  423. }
  424. [TestMethod]
  425. public void SkipLast_All()
  426. {
  427. var scheduler = new TestScheduler();
  428. var xs = scheduler.CreateHotObservable(
  429. OnNext(210, 1),
  430. OnNext(220, 2),
  431. OnCompleted<int>(230)
  432. );
  433. var res = scheduler.Start(() =>
  434. xs.SkipLast(TimeSpan.FromTicks(50), scheduler)
  435. );
  436. res.Messages.AssertEqual(
  437. OnCompleted<int>(230)
  438. );
  439. xs.Subscriptions.AssertEqual(
  440. Subscribe(200, 230)
  441. );
  442. }
  443. [TestMethod]
  444. public void SkipLast_Error()
  445. {
  446. var scheduler = new TestScheduler();
  447. var ex = new Exception();
  448. var xs = scheduler.CreateHotObservable(
  449. OnError<int>(210, ex)
  450. );
  451. var res = scheduler.Start(() =>
  452. xs.SkipLast(TimeSpan.FromTicks(50), scheduler)
  453. );
  454. res.Messages.AssertEqual(
  455. OnError<int>(210, ex)
  456. );
  457. xs.Subscriptions.AssertEqual(
  458. Subscribe(200, 210)
  459. );
  460. }
  461. [TestMethod]
  462. public void SkipLast_Never()
  463. {
  464. var scheduler = new TestScheduler();
  465. var ex = new Exception();
  466. var xs = scheduler.CreateHotObservable<int>(
  467. );
  468. var res = scheduler.Start(() =>
  469. xs.SkipLast(TimeSpan.FromTicks(50), scheduler)
  470. );
  471. res.Messages.AssertEqual(
  472. );
  473. xs.Subscriptions.AssertEqual(
  474. Subscribe(200, 1000)
  475. );
  476. }
  477. [TestMethod]
  478. public void SkipLast_Default1()
  479. {
  480. var xs = Observable.Range(0, 10, Scheduler.Default);
  481. var res = xs.SkipLast(TimeSpan.FromSeconds(60));
  482. var e = new ManualResetEvent(false);
  483. var lst = new List<int>();
  484. res.Subscribe(
  485. lst.Add,
  486. () => e.Set()
  487. );
  488. e.WaitOne();
  489. Assert.True(lst.Count == 0);
  490. }
  491. [TestMethod]
  492. public void SkipLast_Default2()
  493. {
  494. var xs = Observable.Range(0, 10, Scheduler.Default);
  495. var res = xs.SkipLast(TimeSpan.FromSeconds(60), Scheduler.Default.DisableOptimizations());
  496. var e = new ManualResetEvent(false);
  497. var lst = new List<int>();
  498. res.Subscribe(
  499. lst.Add,
  500. () => e.Set()
  501. );
  502. e.WaitOne();
  503. Assert.True(lst.Count == 0);
  504. }
  505. [TestMethod]
  506. public void SkipLast_Default3()
  507. {
  508. var xs = Observable.Range(0, 10, Scheduler.Default);
  509. var res = xs.SkipLast(TimeSpan.Zero);
  510. var e = new ManualResetEvent(false);
  511. var lst = new List<int>();
  512. res.Subscribe(
  513. lst.Add,
  514. () => e.Set()
  515. );
  516. e.WaitOne();
  517. Assert.True(lst.SequenceEqual(Enumerable.Range(0, 10)));
  518. }
  519. [TestMethod]
  520. public void SkipLast_Default4()
  521. {
  522. var xs = Observable.Range(0, 10, Scheduler.Default);
  523. var res = xs.SkipLast(TimeSpan.Zero, Scheduler.Default.DisableOptimizations());
  524. var e = new ManualResetEvent(false);
  525. var lst = new List<int>();
  526. res.Subscribe(
  527. lst.Add,
  528. () => e.Set()
  529. );
  530. e.WaitOne();
  531. Assert.True(lst.SequenceEqual(Enumerable.Range(0, 10)));
  532. }
  533. #endregion
  534. }
  535. }