SkipLastTest.cs 17 KB

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