SkipTest.cs 19 KB

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