SkipTest.cs 19 KB

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