SkipTest.cs 19 KB

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