TakeTest.cs 23 KB

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