TakeLastTest.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917
  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 TakeLastTest : ReactiveTest
  18. {
  19. #region + Count +
  20. [TestMethod]
  21. public void TakeLast_ArgumentChecking()
  22. {
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast<int>(null, 0));
  24. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.TakeLast(DummyObservable<int>.Instance, -1));
  25. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast<int>(null, 0, Scheduler.Default));
  26. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.TakeLast(DummyObservable<int>.Instance, -1, Scheduler.Default));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast(DummyObservable<int>.Instance, 0, default));
  28. }
  29. [TestMethod]
  30. public void TakeLast_Zero_Completed()
  31. {
  32. var scheduler = new TestScheduler();
  33. var xs = scheduler.CreateHotObservable(
  34. OnNext(180, 1),
  35. OnNext(210, 2),
  36. OnNext(250, 3),
  37. OnNext(270, 4),
  38. OnNext(310, 5),
  39. OnNext(360, 6),
  40. OnNext(380, 7),
  41. OnNext(410, 8),
  42. OnNext(590, 9),
  43. OnCompleted<int>(650)
  44. );
  45. var res = scheduler.Start(() =>
  46. xs.TakeLast(0)
  47. );
  48. res.Messages.AssertEqual(
  49. OnCompleted<int>(650)
  50. );
  51. xs.Subscriptions.AssertEqual(
  52. Subscribe(200, 650)
  53. );
  54. }
  55. [TestMethod]
  56. public void TakeLast_Zero_Error()
  57. {
  58. var scheduler = new TestScheduler();
  59. var ex = new Exception();
  60. var xs = scheduler.CreateHotObservable(
  61. OnNext(180, 1),
  62. OnNext(210, 2),
  63. OnNext(250, 3),
  64. OnNext(270, 4),
  65. OnNext(310, 5),
  66. OnNext(360, 6),
  67. OnNext(380, 7),
  68. OnNext(410, 8),
  69. OnNext(590, 9),
  70. OnError<int>(650, ex)
  71. );
  72. var res = scheduler.Start(() =>
  73. xs.TakeLast(0)
  74. );
  75. res.Messages.AssertEqual(
  76. OnError<int>(650, ex)
  77. );
  78. xs.Subscriptions.AssertEqual(
  79. Subscribe(200, 650)
  80. );
  81. }
  82. [TestMethod]
  83. public void TakeLast_Zero_Disposed()
  84. {
  85. var scheduler = new TestScheduler();
  86. var xs = scheduler.CreateHotObservable(
  87. OnNext(180, 1),
  88. OnNext(210, 2),
  89. OnNext(250, 3),
  90. OnNext(270, 4),
  91. OnNext(310, 5),
  92. OnNext(360, 6),
  93. OnNext(380, 7),
  94. OnNext(410, 8),
  95. OnNext(590, 9)
  96. );
  97. var res = scheduler.Start(() =>
  98. xs.TakeLast(0)
  99. );
  100. res.Messages.AssertEqual(
  101. );
  102. xs.Subscriptions.AssertEqual(
  103. Subscribe(200, 1000)
  104. );
  105. }
  106. [TestMethod]
  107. public void TakeLast_One_Completed()
  108. {
  109. var scheduler = new TestScheduler();
  110. var xs = scheduler.CreateHotObservable(
  111. OnNext(180, 1),
  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. OnCompleted<int>(650)
  121. );
  122. var res = scheduler.Start(() =>
  123. xs.TakeLast(1)
  124. );
  125. res.Messages.AssertEqual(
  126. OnNext(650, 9),
  127. OnCompleted<int>(650)
  128. );
  129. xs.Subscriptions.AssertEqual(
  130. Subscribe(200, 650)
  131. );
  132. }
  133. [TestMethod]
  134. public void TakeLast_One_Error()
  135. {
  136. var scheduler = new TestScheduler();
  137. var ex = new Exception();
  138. var xs = scheduler.CreateHotObservable(
  139. OnNext(180, 1),
  140. OnNext(210, 2),
  141. OnNext(250, 3),
  142. OnNext(270, 4),
  143. OnNext(310, 5),
  144. OnNext(360, 6),
  145. OnNext(380, 7),
  146. OnNext(410, 8),
  147. OnNext(590, 9),
  148. OnError<int>(650, ex)
  149. );
  150. var res = scheduler.Start(() =>
  151. xs.TakeLast(1)
  152. );
  153. res.Messages.AssertEqual(
  154. OnError<int>(650, ex)
  155. );
  156. xs.Subscriptions.AssertEqual(
  157. Subscribe(200, 650)
  158. );
  159. }
  160. [TestMethod]
  161. public void TakeLast_One_Disposed()
  162. {
  163. var scheduler = new TestScheduler();
  164. var xs = scheduler.CreateHotObservable(
  165. OnNext(180, 1),
  166. OnNext(210, 2),
  167. OnNext(250, 3),
  168. OnNext(270, 4),
  169. OnNext(310, 5),
  170. OnNext(360, 6),
  171. OnNext(380, 7),
  172. OnNext(410, 8),
  173. OnNext(590, 9)
  174. );
  175. var res = scheduler.Start(() =>
  176. xs.TakeLast(1)
  177. );
  178. res.Messages.AssertEqual(
  179. );
  180. xs.Subscriptions.AssertEqual(
  181. Subscribe(200, 1000)
  182. );
  183. }
  184. [TestMethod]
  185. public void TakeLast_Three_Completed()
  186. {
  187. var scheduler = new TestScheduler();
  188. var xs = scheduler.CreateHotObservable(
  189. OnNext(180, 1),
  190. OnNext(210, 2),
  191. OnNext(250, 3),
  192. OnNext(270, 4),
  193. OnNext(310, 5),
  194. OnNext(360, 6),
  195. OnNext(380, 7),
  196. OnNext(410, 8),
  197. OnNext(590, 9),
  198. OnCompleted<int>(650)
  199. );
  200. var res = scheduler.Start(() =>
  201. xs.TakeLast(3)
  202. );
  203. res.Messages.AssertEqual(
  204. OnNext(650, 7),
  205. OnNext(650, 8),
  206. OnNext(650, 9),
  207. OnCompleted<int>(650)
  208. );
  209. xs.Subscriptions.AssertEqual(
  210. Subscribe(200, 650)
  211. );
  212. }
  213. [TestMethod]
  214. public void TakeLast_Three_Error()
  215. {
  216. var scheduler = new TestScheduler();
  217. var ex = new Exception();
  218. var xs = scheduler.CreateHotObservable(
  219. OnNext(180, 1),
  220. OnNext(210, 2),
  221. OnNext(250, 3),
  222. OnNext(270, 4),
  223. OnNext(310, 5),
  224. OnNext(360, 6),
  225. OnNext(380, 7),
  226. OnNext(410, 8),
  227. OnNext(590, 9),
  228. OnError<int>(650, ex)
  229. );
  230. var res = scheduler.Start(() =>
  231. xs.TakeLast(3)
  232. );
  233. res.Messages.AssertEqual(
  234. OnError<int>(650, ex)
  235. );
  236. xs.Subscriptions.AssertEqual(
  237. Subscribe(200, 650)
  238. );
  239. }
  240. [TestMethod]
  241. public void TakeLast_Three_Disposed()
  242. {
  243. var scheduler = new TestScheduler();
  244. var xs = scheduler.CreateHotObservable(
  245. OnNext(180, 1),
  246. OnNext(210, 2),
  247. OnNext(250, 3),
  248. OnNext(270, 4),
  249. OnNext(310, 5),
  250. OnNext(360, 6),
  251. OnNext(380, 7),
  252. OnNext(410, 8),
  253. OnNext(590, 9)
  254. );
  255. var res = scheduler.Start(() =>
  256. xs.TakeLast(3)
  257. );
  258. res.Messages.AssertEqual(
  259. );
  260. xs.Subscriptions.AssertEqual(
  261. Subscribe(200, 1000)
  262. );
  263. }
  264. [TestMethod]
  265. public void TakeLast_LongRunning_Regular()
  266. {
  267. var res = Observable.Range(0, 100, Scheduler.Default).TakeLast(10, NewThreadScheduler.Default);
  268. var lst = new List<int>();
  269. res.ForEach(lst.Add);
  270. Assert.True(Enumerable.Range(90, 10).SequenceEqual(lst));
  271. }
  272. #endregion
  273. #region + Timed +
  274. [TestMethod]
  275. public void TakeLast_Timed_ArgumentChecking()
  276. {
  277. var xs = Observable.Return(42);
  278. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast(default(IObservable<int>), TimeSpan.FromSeconds(1)));
  279. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.TakeLast(xs, TimeSpan.FromSeconds(-1)));
  280. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast(default(IObservable<int>), TimeSpan.FromSeconds(1), Scheduler.Default));
  281. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast(xs, TimeSpan.FromSeconds(1), default));
  282. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.TakeLast(xs, TimeSpan.FromSeconds(-1), Scheduler.Default));
  283. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast(default(IObservable<int>), TimeSpan.FromSeconds(1), Scheduler.Default, Scheduler.Default));
  284. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast(xs, TimeSpan.FromSeconds(1), default, Scheduler.Default));
  285. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeLast(xs, TimeSpan.FromSeconds(1), Scheduler.Default, default));
  286. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.TakeLast(xs, TimeSpan.FromSeconds(-1), Scheduler.Default, Scheduler.Default));
  287. }
  288. [TestMethod]
  289. public void TakeLast_Zero1()
  290. {
  291. var scheduler = new TestScheduler();
  292. var xs = scheduler.CreateHotObservable(
  293. OnNext(210, 1),
  294. OnNext(220, 2),
  295. OnCompleted<int>(230)
  296. );
  297. var res = scheduler.Start(() =>
  298. xs.TakeLast(TimeSpan.Zero, scheduler)
  299. );
  300. res.Messages.AssertEqual(
  301. OnCompleted<int>(230)
  302. );
  303. xs.Subscriptions.AssertEqual(
  304. Subscribe(200, 230)
  305. );
  306. }
  307. [TestMethod]
  308. public void TakeLast_Zero1_WithLoopScheduler()
  309. {
  310. var scheduler = new TestScheduler();
  311. var xs = scheduler.CreateHotObservable(
  312. OnNext(210, 1),
  313. OnNext(220, 2),
  314. OnCompleted<int>(230)
  315. );
  316. var res = scheduler.Start(() =>
  317. xs.TakeLast(TimeSpan.Zero, scheduler, scheduler)
  318. );
  319. res.Messages.AssertEqual(
  320. OnCompleted<int>(231)
  321. );
  322. xs.Subscriptions.AssertEqual(
  323. Subscribe(200, 230)
  324. );
  325. }
  326. [TestMethod]
  327. public void TakeLast_Zero2()
  328. {
  329. var scheduler = new TestScheduler();
  330. var xs = scheduler.CreateHotObservable(
  331. OnNext(210, 1),
  332. OnNext(220, 2),
  333. OnNext(230, 3),
  334. OnCompleted<int>(230)
  335. );
  336. var res = scheduler.Start(() =>
  337. xs.TakeLast(TimeSpan.Zero, scheduler)
  338. );
  339. res.Messages.AssertEqual(
  340. OnCompleted<int>(230)
  341. );
  342. xs.Subscriptions.AssertEqual(
  343. Subscribe(200, 230)
  344. );
  345. }
  346. [TestMethod]
  347. public void TakeLast_Zero2_WithLoopScheduler()
  348. {
  349. var scheduler = new TestScheduler();
  350. var xs = scheduler.CreateHotObservable(
  351. OnNext(210, 1),
  352. OnNext(220, 2),
  353. OnNext(230, 3),
  354. OnCompleted<int>(230)
  355. );
  356. var res = scheduler.Start(() =>
  357. xs.TakeLast(TimeSpan.Zero, scheduler, scheduler)
  358. );
  359. res.Messages.AssertEqual(
  360. OnCompleted<int>(231)
  361. );
  362. xs.Subscriptions.AssertEqual(
  363. Subscribe(200, 230)
  364. );
  365. }
  366. [TestMethod]
  367. public void TakeLast_Some1()
  368. {
  369. var scheduler = new TestScheduler();
  370. var xs = scheduler.CreateHotObservable(
  371. OnNext(210, 1),
  372. OnNext(220, 2),
  373. OnNext(230, 3),
  374. OnCompleted<int>(240)
  375. );
  376. var res = scheduler.Start(() =>
  377. xs.TakeLast(TimeSpan.FromTicks(25), scheduler)
  378. );
  379. res.Messages.AssertEqual(
  380. OnNext(240, 2),
  381. OnNext(240, 3),
  382. OnCompleted<int>(240)
  383. );
  384. xs.Subscriptions.AssertEqual(
  385. Subscribe(200, 240)
  386. );
  387. }
  388. [TestMethod]
  389. public void TakeLast_Some1_WithLoopScheduler()
  390. {
  391. var scheduler = new TestScheduler();
  392. var xs = scheduler.CreateHotObservable(
  393. OnNext(210, 1),
  394. OnNext(220, 2),
  395. OnNext(230, 3),
  396. OnCompleted<int>(240)
  397. );
  398. var res = scheduler.Start(() =>
  399. xs.TakeLast(TimeSpan.FromTicks(25), scheduler, scheduler)
  400. );
  401. res.Messages.AssertEqual(
  402. OnNext(241, 2),
  403. OnNext(242, 3),
  404. OnCompleted<int>(243)
  405. );
  406. xs.Subscriptions.AssertEqual(
  407. Subscribe(200, 240)
  408. );
  409. }
  410. [TestMethod]
  411. public void TakeLast_Some2()
  412. {
  413. var scheduler = new TestScheduler();
  414. var xs = scheduler.CreateHotObservable(
  415. OnNext(210, 1),
  416. OnNext(220, 2),
  417. OnNext(230, 3),
  418. OnCompleted<int>(300)
  419. );
  420. var res = scheduler.Start(() =>
  421. xs.TakeLast(TimeSpan.FromTicks(25), scheduler)
  422. );
  423. res.Messages.AssertEqual(
  424. OnCompleted<int>(300)
  425. );
  426. xs.Subscriptions.AssertEqual(
  427. Subscribe(200, 300)
  428. );
  429. }
  430. [TestMethod]
  431. public void TakeLast_Some2_WithLoopScheduler()
  432. {
  433. var scheduler = new TestScheduler();
  434. var xs = scheduler.CreateHotObservable(
  435. OnNext(210, 1),
  436. OnNext(220, 2),
  437. OnNext(230, 3),
  438. OnCompleted<int>(300)
  439. );
  440. var res = scheduler.Start(() =>
  441. xs.TakeLast(TimeSpan.FromTicks(25), scheduler, scheduler)
  442. );
  443. res.Messages.AssertEqual(
  444. OnCompleted<int>(301)
  445. );
  446. xs.Subscriptions.AssertEqual(
  447. Subscribe(200, 300)
  448. );
  449. }
  450. [TestMethod]
  451. public void TakeLast_Some3()
  452. {
  453. var scheduler = new TestScheduler();
  454. var xs = scheduler.CreateHotObservable(
  455. OnNext(210, 1),
  456. OnNext(220, 2),
  457. OnNext(230, 3),
  458. OnNext(240, 4),
  459. OnNext(250, 5),
  460. OnNext(260, 6),
  461. OnNext(270, 7),
  462. OnNext(280, 8),
  463. OnNext(290, 9),
  464. OnCompleted<int>(300)
  465. );
  466. var res = scheduler.Start(() =>
  467. xs.TakeLast(TimeSpan.FromTicks(45), scheduler)
  468. );
  469. res.Messages.AssertEqual(
  470. OnNext(300, 6),
  471. OnNext(300, 7),
  472. OnNext(300, 8),
  473. OnNext(300, 9),
  474. OnCompleted<int>(300)
  475. );
  476. xs.Subscriptions.AssertEqual(
  477. Subscribe(200, 300)
  478. );
  479. }
  480. [TestMethod]
  481. public void TakeLast_Some3_WithLoopScheduler()
  482. {
  483. var scheduler = new TestScheduler();
  484. var xs = scheduler.CreateHotObservable(
  485. OnNext(210, 1),
  486. OnNext(220, 2),
  487. OnNext(230, 3),
  488. OnNext(240, 4),
  489. OnNext(250, 5),
  490. OnNext(260, 6),
  491. OnNext(270, 7),
  492. OnNext(280, 8),
  493. OnNext(290, 9),
  494. OnCompleted<int>(300)
  495. );
  496. var res = scheduler.Start(() =>
  497. xs.TakeLast(TimeSpan.FromTicks(45), scheduler, scheduler)
  498. );
  499. res.Messages.AssertEqual(
  500. OnNext(301, 6),
  501. OnNext(302, 7),
  502. OnNext(303, 8),
  503. OnNext(304, 9),
  504. OnCompleted<int>(305)
  505. );
  506. xs.Subscriptions.AssertEqual(
  507. Subscribe(200, 300)
  508. );
  509. }
  510. [TestMethod]
  511. public void TakeLast_Some4()
  512. {
  513. var scheduler = new TestScheduler();
  514. var xs = scheduler.CreateHotObservable(
  515. OnNext(210, 1),
  516. OnNext(240, 2),
  517. OnNext(250, 3),
  518. OnNext(280, 4),
  519. OnNext(290, 5),
  520. OnNext(300, 6),
  521. OnCompleted<int>(350)
  522. );
  523. var res = scheduler.Start(() =>
  524. xs.TakeLast(TimeSpan.FromTicks(25), scheduler)
  525. );
  526. res.Messages.AssertEqual(
  527. OnCompleted<int>(350)
  528. );
  529. xs.Subscriptions.AssertEqual(
  530. Subscribe(200, 350)
  531. );
  532. }
  533. [TestMethod]
  534. public void TakeLast_Some4_WithLoopScheduler()
  535. {
  536. var scheduler = new TestScheduler();
  537. var xs = scheduler.CreateHotObservable(
  538. OnNext(210, 1),
  539. OnNext(240, 2),
  540. OnNext(250, 3),
  541. OnNext(280, 4),
  542. OnNext(290, 5),
  543. OnNext(300, 6),
  544. OnCompleted<int>(350)
  545. );
  546. var res = scheduler.Start(() =>
  547. xs.TakeLast(TimeSpan.FromTicks(25), scheduler, scheduler)
  548. );
  549. res.Messages.AssertEqual(
  550. OnCompleted<int>(351)
  551. );
  552. xs.Subscriptions.AssertEqual(
  553. Subscribe(200, 350)
  554. );
  555. }
  556. [TestMethod]
  557. public void TakeLast_All()
  558. {
  559. var scheduler = new TestScheduler();
  560. var xs = scheduler.CreateHotObservable(
  561. OnNext(210, 1),
  562. OnNext(220, 2),
  563. OnCompleted<int>(230)
  564. );
  565. var res = scheduler.Start(() =>
  566. xs.TakeLast(TimeSpan.FromTicks(50), scheduler)
  567. );
  568. res.Messages.AssertEqual(
  569. OnNext(230, 1),
  570. OnNext(230, 2),
  571. OnCompleted<int>(230)
  572. );
  573. xs.Subscriptions.AssertEqual(
  574. Subscribe(200, 230)
  575. );
  576. }
  577. [TestMethod]
  578. public void TakeLast_All_WithLoopScheduler()
  579. {
  580. var scheduler = new TestScheduler();
  581. var xs = scheduler.CreateHotObservable(
  582. OnNext(210, 1),
  583. OnNext(220, 2),
  584. OnCompleted<int>(230)
  585. );
  586. var res = scheduler.Start(() =>
  587. xs.TakeLast(TimeSpan.FromTicks(50), scheduler, scheduler)
  588. );
  589. res.Messages.AssertEqual(
  590. OnNext(231, 1),
  591. OnNext(232, 2),
  592. OnCompleted<int>(233)
  593. );
  594. xs.Subscriptions.AssertEqual(
  595. Subscribe(200, 230)
  596. );
  597. }
  598. [TestMethod]
  599. public void TakeLast_Error()
  600. {
  601. var scheduler = new TestScheduler();
  602. var ex = new Exception();
  603. var xs = scheduler.CreateHotObservable(
  604. OnError<int>(210, ex)
  605. );
  606. var res = scheduler.Start(() =>
  607. xs.TakeLast(TimeSpan.FromTicks(50), scheduler)
  608. );
  609. res.Messages.AssertEqual(
  610. OnError<int>(210, ex)
  611. );
  612. xs.Subscriptions.AssertEqual(
  613. Subscribe(200, 210)
  614. );
  615. }
  616. [TestMethod]
  617. public void TakeLast_Error_WithLoopScheduler()
  618. {
  619. var scheduler = new TestScheduler();
  620. var ex = new Exception();
  621. var xs = scheduler.CreateHotObservable(
  622. OnError<int>(210, ex)
  623. );
  624. var res = scheduler.Start(() =>
  625. xs.TakeLast(TimeSpan.FromTicks(50), scheduler, scheduler)
  626. );
  627. res.Messages.AssertEqual(
  628. OnError<int>(210, ex)
  629. );
  630. xs.Subscriptions.AssertEqual(
  631. Subscribe(200, 210)
  632. );
  633. }
  634. [TestMethod]
  635. public void TakeLast_Never()
  636. {
  637. var scheduler = new TestScheduler();
  638. var ex = new Exception();
  639. var xs = scheduler.CreateHotObservable<int>(
  640. );
  641. var res = scheduler.Start(() =>
  642. xs.TakeLast(TimeSpan.FromTicks(50), scheduler)
  643. );
  644. res.Messages.AssertEqual(
  645. );
  646. xs.Subscriptions.AssertEqual(
  647. Subscribe(200, 1000)
  648. );
  649. }
  650. [TestMethod]
  651. public void TakeLast_Never_WithLoopScheduler()
  652. {
  653. var scheduler = new TestScheduler();
  654. var ex = new Exception();
  655. var xs = scheduler.CreateHotObservable<int>(
  656. );
  657. var res = scheduler.Start(() =>
  658. xs.TakeLast(TimeSpan.FromTicks(50), scheduler, scheduler)
  659. );
  660. res.Messages.AssertEqual(
  661. );
  662. xs.Subscriptions.AssertEqual(
  663. Subscribe(200, 1000)
  664. );
  665. }
  666. [TestMethod]
  667. public void TakeLast_Default1()
  668. {
  669. var xs = Observable.Range(0, 10, Scheduler.Default);
  670. var res = xs.TakeLast(TimeSpan.FromSeconds(60));
  671. var e = new ManualResetEvent(false);
  672. var lst = new List<int>();
  673. res.Subscribe(
  674. lst.Add,
  675. () => e.Set()
  676. );
  677. e.WaitOne();
  678. Assert.True(lst.SequenceEqual(Enumerable.Range(0, 10)));
  679. }
  680. [TestMethod]
  681. public void TakeLast_Default2()
  682. {
  683. var xs = Observable.Range(0, 10, Scheduler.Default);
  684. var res = xs.TakeLast(TimeSpan.FromSeconds(60), Scheduler.Default.DisableOptimizations());
  685. var e = new ManualResetEvent(false);
  686. var lst = new List<int>();
  687. res.Subscribe(
  688. lst.Add,
  689. () => e.Set()
  690. );
  691. e.WaitOne();
  692. Assert.True(lst.SequenceEqual(Enumerable.Range(0, 10)));
  693. }
  694. [TestMethod]
  695. public void TakeLast_Default3()
  696. {
  697. var xs = Observable.Range(0, 10, Scheduler.Default);
  698. var res = xs.TakeLast(TimeSpan.Zero);
  699. var e = new ManualResetEvent(false);
  700. var lst = new List<int>();
  701. res.Subscribe(
  702. lst.Add,
  703. () => e.Set()
  704. );
  705. e.WaitOne();
  706. Assert.True(lst.Count == 0);
  707. }
  708. [TestMethod]
  709. public void TakeLast_Default4()
  710. {
  711. var xs = Observable.Range(0, 10, Scheduler.Default);
  712. var res = xs.TakeLast(TimeSpan.Zero, Scheduler.Default.DisableOptimizations());
  713. var e = new ManualResetEvent(false);
  714. var lst = new List<int>();
  715. res.Subscribe(
  716. lst.Add,
  717. () => e.Set()
  718. );
  719. e.WaitOne();
  720. Assert.True(lst.Count == 0);
  721. }
  722. [TestMethod]
  723. public void TakeLast_Timed_LongRunning_Regular()
  724. {
  725. var res = Observable.Range(0, 10, Scheduler.Default).TakeLast(TimeSpan.FromSeconds(60), Scheduler.Default, NewThreadScheduler.Default);
  726. var lst = new List<int>();
  727. res.ForEach(lst.Add);
  728. Assert.True(Enumerable.Range(0, 10).SequenceEqual(lst));
  729. }
  730. #endregion
  731. }
  732. }