SkipLastTest.cs 17 KB

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