WhereTest.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  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.Linq;
  6. using System.Reactive.Concurrency;
  7. using System.Reactive.Disposables;
  8. using System.Reactive.Linq;
  9. using Microsoft.Reactive.Testing;
  10. using ReactiveTests.Dummies;
  11. using Microsoft.VisualStudio.TestTools.UnitTesting;
  12. using Assert = Xunit.Assert;
  13. namespace ReactiveTests.Tests
  14. {
  15. [TestClass]
  16. public class WhereTest : ReactiveTest
  17. {
  18. [TestMethod]
  19. public void Where_ArgumentChecking()
  20. {
  21. ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).Where(DummyFunc<int, bool>.Instance));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Where((Func<int, bool>)null));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Where(DummyFunc<int, bool>.Instance).Subscribe(null));
  24. }
  25. private static bool IsPrime(int i)
  26. {
  27. if (i <= 1)
  28. {
  29. return false;
  30. }
  31. var max = (int)Math.Sqrt(i);
  32. for (var j = 2; j <= max; ++j)
  33. {
  34. if (i % j == 0)
  35. {
  36. return false;
  37. }
  38. }
  39. return true;
  40. }
  41. [TestMethod]
  42. public void Where_Complete()
  43. {
  44. var scheduler = new TestScheduler();
  45. var invoked = 0;
  46. var xs = scheduler.CreateHotObservable(
  47. OnNext(110, 1),
  48. OnNext(180, 2),
  49. OnNext(230, 3),
  50. OnNext(270, 4),
  51. OnNext(340, 5),
  52. OnNext(380, 6),
  53. OnNext(390, 7),
  54. OnNext(450, 8),
  55. OnNext(470, 9),
  56. OnNext(560, 10),
  57. OnNext(580, 11),
  58. OnCompleted<int>(600),
  59. OnNext(610, 12),
  60. OnError<int>(620, new Exception()),
  61. OnCompleted<int>(630)
  62. );
  63. var res = scheduler.Start(() =>
  64. xs.Where(x =>
  65. {
  66. invoked++;
  67. return IsPrime(x);
  68. })
  69. );
  70. res.Messages.AssertEqual(
  71. OnNext(230, 3),
  72. OnNext(340, 5),
  73. OnNext(390, 7),
  74. OnNext(580, 11),
  75. OnCompleted<int>(600)
  76. );
  77. xs.Subscriptions.AssertEqual(
  78. Subscribe(200, 600)
  79. );
  80. Assert.Equal(9, invoked);
  81. }
  82. [TestMethod]
  83. public void Where_True()
  84. {
  85. var scheduler = new TestScheduler();
  86. var invoked = 0;
  87. var xs = scheduler.CreateHotObservable(
  88. OnNext(110, 1),
  89. OnNext(180, 2),
  90. OnNext(230, 3),
  91. OnNext(270, 4),
  92. OnNext(340, 5),
  93. OnNext(380, 6),
  94. OnNext(390, 7),
  95. OnNext(450, 8),
  96. OnNext(470, 9),
  97. OnNext(560, 10),
  98. OnNext(580, 11),
  99. OnCompleted<int>(600)
  100. );
  101. var res = scheduler.Start(() =>
  102. xs.Where(x =>
  103. {
  104. invoked++;
  105. return true;
  106. })
  107. );
  108. res.Messages.AssertEqual(
  109. OnNext(230, 3),
  110. OnNext(270, 4),
  111. OnNext(340, 5),
  112. OnNext(380, 6),
  113. OnNext(390, 7),
  114. OnNext(450, 8),
  115. OnNext(470, 9),
  116. OnNext(560, 10),
  117. OnNext(580, 11),
  118. OnCompleted<int>(600)
  119. );
  120. xs.Subscriptions.AssertEqual(
  121. Subscribe(200, 600)
  122. );
  123. Assert.Equal(9, invoked);
  124. }
  125. [TestMethod]
  126. public void Where_False()
  127. {
  128. var scheduler = new TestScheduler();
  129. var invoked = 0;
  130. var xs = scheduler.CreateHotObservable(
  131. OnNext(110, 1),
  132. OnNext(180, 2),
  133. OnNext(230, 3),
  134. OnNext(270, 4),
  135. OnNext(340, 5),
  136. OnNext(380, 6),
  137. OnNext(390, 7),
  138. OnNext(450, 8),
  139. OnNext(470, 9),
  140. OnNext(560, 10),
  141. OnNext(580, 11),
  142. OnCompleted<int>(600)
  143. );
  144. var res = scheduler.Start(() =>
  145. xs.Where(x =>
  146. {
  147. invoked++;
  148. return false;
  149. })
  150. );
  151. res.Messages.AssertEqual(
  152. OnCompleted<int>(600)
  153. );
  154. xs.Subscriptions.AssertEqual(
  155. Subscribe(200, 600)
  156. );
  157. Assert.Equal(9, invoked);
  158. }
  159. [TestMethod]
  160. public void Where_Dispose()
  161. {
  162. var scheduler = new TestScheduler();
  163. var invoked = 0;
  164. var xs = scheduler.CreateHotObservable(
  165. OnNext(110, 1),
  166. OnNext(180, 2),
  167. OnNext(230, 3),
  168. OnNext(270, 4),
  169. OnNext(340, 5),
  170. OnNext(380, 6),
  171. OnNext(390, 7),
  172. OnNext(450, 8),
  173. OnNext(470, 9),
  174. OnNext(560, 10),
  175. OnNext(580, 11),
  176. OnCompleted<int>(600)
  177. );
  178. var res = scheduler.Start(() =>
  179. xs.Where(x =>
  180. {
  181. invoked++;
  182. return IsPrime(x);
  183. }),
  184. 400
  185. );
  186. res.Messages.AssertEqual(
  187. OnNext(230, 3),
  188. OnNext(340, 5),
  189. OnNext(390, 7)
  190. );
  191. xs.Subscriptions.AssertEqual(
  192. Subscribe(200, 400)
  193. );
  194. Assert.Equal(5, invoked);
  195. }
  196. [TestMethod]
  197. public void Where_Error()
  198. {
  199. var scheduler = new TestScheduler();
  200. var invoked = 0;
  201. var ex = new Exception();
  202. var xs = scheduler.CreateHotObservable(
  203. OnNext(110, 1),
  204. OnNext(180, 2),
  205. OnNext(230, 3),
  206. OnNext(270, 4),
  207. OnNext(340, 5),
  208. OnNext(380, 6),
  209. OnNext(390, 7),
  210. OnNext(450, 8),
  211. OnNext(470, 9),
  212. OnNext(560, 10),
  213. OnNext(580, 11),
  214. OnError<int>(600, ex),
  215. OnNext(610, 12),
  216. OnError<int>(620, new Exception()),
  217. OnCompleted<int>(630)
  218. );
  219. var res = scheduler.Start(() =>
  220. xs.Where(x =>
  221. {
  222. invoked++;
  223. return IsPrime(x);
  224. })
  225. );
  226. res.Messages.AssertEqual(
  227. OnNext(230, 3),
  228. OnNext(340, 5),
  229. OnNext(390, 7),
  230. OnNext(580, 11),
  231. OnError<int>(600, ex)
  232. );
  233. xs.Subscriptions.AssertEqual(
  234. Subscribe(200, 600)
  235. );
  236. Assert.Equal(9, invoked);
  237. }
  238. [TestMethod]
  239. public void Where_Throw()
  240. {
  241. var scheduler = new TestScheduler();
  242. var invoked = 0;
  243. var ex = new Exception();
  244. var xs = scheduler.CreateHotObservable(
  245. OnNext(110, 1),
  246. OnNext(180, 2),
  247. OnNext(230, 3),
  248. OnNext(270, 4),
  249. OnNext(340, 5),
  250. OnNext(380, 6),
  251. OnNext(390, 7),
  252. OnNext(450, 8),
  253. OnNext(470, 9),
  254. OnNext(560, 10),
  255. OnNext(580, 11),
  256. OnCompleted<int>(600),
  257. OnNext(610, 12),
  258. OnError<int>(620, new Exception()),
  259. OnCompleted<int>(630)
  260. );
  261. var res = scheduler.Start(() =>
  262. xs.Where(x =>
  263. {
  264. invoked++;
  265. if (x > 5)
  266. {
  267. throw ex;
  268. }
  269. return IsPrime(x);
  270. })
  271. );
  272. res.Messages.AssertEqual(
  273. OnNext(230, 3),
  274. OnNext(340, 5),
  275. OnError<int>(380, ex)
  276. );
  277. xs.Subscriptions.AssertEqual(
  278. Subscribe(200, 380)
  279. );
  280. Assert.Equal(4, invoked);
  281. }
  282. [TestMethod]
  283. public void Where_DisposeInPredicate()
  284. {
  285. var scheduler = new TestScheduler();
  286. var invoked = 0;
  287. var xs = scheduler.CreateHotObservable(
  288. OnNext(110, 1),
  289. OnNext(180, 2),
  290. OnNext(230, 3),
  291. OnNext(270, 4),
  292. OnNext(340, 5),
  293. OnNext(380, 6),
  294. OnNext(390, 7),
  295. OnNext(450, 8),
  296. OnNext(470, 9),
  297. OnNext(560, 10),
  298. OnNext(580, 11),
  299. OnCompleted<int>(600),
  300. OnNext(610, 12),
  301. OnError<int>(620, new Exception()),
  302. OnCompleted<int>(630)
  303. );
  304. var res = scheduler.CreateObserver<int>();
  305. var d = new SerialDisposable();
  306. var ys = default(IObservable<int>);
  307. scheduler.ScheduleAbsolute(Created, () => ys = xs.Where(x =>
  308. {
  309. invoked++;
  310. if (x == 8)
  311. {
  312. d.Dispose();
  313. }
  314. return IsPrime(x);
  315. }));
  316. scheduler.ScheduleAbsolute(Subscribed, () => d.Disposable = ys.Subscribe(res));
  317. scheduler.ScheduleAbsolute(Disposed, () => d.Dispose());
  318. scheduler.Start();
  319. res.Messages.AssertEqual(
  320. OnNext(230, 3),
  321. OnNext(340, 5),
  322. OnNext(390, 7)
  323. );
  324. xs.Subscriptions.AssertEqual(
  325. Subscribe(200, 450)
  326. );
  327. Assert.Equal(6, invoked);
  328. }
  329. [TestMethod]
  330. public void WhereWhereOptimization_Regular()
  331. {
  332. var scheduler = new TestScheduler();
  333. var xs = scheduler.CreateHotObservable(
  334. OnNext(110, 1),
  335. OnNext(180, 2),
  336. OnNext(230, 3),
  337. OnNext(270, 4),
  338. OnNext(340, 5),
  339. OnNext(380, 6),
  340. OnNext(390, 7),
  341. OnNext(450, 8),
  342. OnNext(470, 9),
  343. OnNext(560, 10),
  344. OnNext(580, 11),
  345. OnCompleted<int>(600)
  346. );
  347. var res = scheduler.Start(() =>
  348. xs.Where(x => x > 3).Where(x => x % 2 == 0)
  349. );
  350. res.Messages.AssertEqual(
  351. OnNext(270, 4),
  352. OnNext(380, 6),
  353. OnNext(450, 8),
  354. OnNext(560, 10),
  355. OnCompleted<int>(600)
  356. );
  357. }
  358. [TestMethod]
  359. public void WhereWhereOptimization_SecondPredicateThrows()
  360. {
  361. var scheduler = new TestScheduler();
  362. var xs = scheduler.CreateHotObservable(
  363. OnNext(110, 1),
  364. OnNext(180, 2),
  365. OnNext(230, 3),
  366. OnNext(270, 4),
  367. OnNext(340, 5),
  368. OnNext(380, 6),
  369. OnNext(390, 7),
  370. OnNext(450, 8),
  371. OnNext(470, 9),
  372. OnNext(560, 10),
  373. OnNext(580, 11),
  374. OnCompleted<int>(600)
  375. );
  376. var res = scheduler.Start(() =>
  377. xs.Where(x => x > 3).Where(x =>
  378. {
  379. if (x <= 3)
  380. {
  381. throw new Exception();
  382. }
  383. return x % 2 == 0;
  384. })
  385. );
  386. res.Messages.AssertEqual(
  387. OnNext(270, 4),
  388. OnNext(380, 6),
  389. OnNext(450, 8),
  390. OnNext(560, 10),
  391. OnCompleted<int>(600)
  392. );
  393. }
  394. [TestMethod]
  395. public void WhereIndex_ArgumentChecking()
  396. {
  397. ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).Where(DummyFunc<int, int, bool>.Instance));
  398. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Where((Func<int, int, bool>)null));
  399. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Where(DummyFunc<int, int, bool>.Instance).Subscribe(null));
  400. }
  401. [TestMethod]
  402. public void WhereIndex_Complete()
  403. {
  404. var scheduler = new TestScheduler();
  405. var invoked = 0;
  406. var xs = scheduler.CreateHotObservable(
  407. OnNext(110, 1),
  408. OnNext(180, 2),
  409. OnNext(230, 3),
  410. OnNext(270, 4),
  411. OnNext(340, 5),
  412. OnNext(380, 6),
  413. OnNext(390, 7),
  414. OnNext(450, 8),
  415. OnNext(470, 9),
  416. OnNext(560, 10),
  417. OnNext(580, 11),
  418. OnCompleted<int>(600),
  419. OnNext(610, 12),
  420. OnError<int>(620, new Exception()),
  421. OnCompleted<int>(630)
  422. );
  423. var res = scheduler.Start(() =>
  424. xs.Where((x, i) =>
  425. {
  426. invoked++;
  427. return IsPrime(x + i * 10);
  428. })
  429. );
  430. res.Messages.AssertEqual(
  431. OnNext(230, 3),
  432. OnNext(390, 7),
  433. OnCompleted<int>(600)
  434. );
  435. xs.Subscriptions.AssertEqual(
  436. Subscribe(200, 600)
  437. );
  438. Assert.Equal(9, invoked);
  439. }
  440. [TestMethod]
  441. public void WhereIndex_True()
  442. {
  443. var scheduler = new TestScheduler();
  444. var invoked = 0;
  445. var xs = scheduler.CreateHotObservable(
  446. OnNext(110, 1),
  447. OnNext(180, 2),
  448. OnNext(230, 3),
  449. OnNext(270, 4),
  450. OnNext(340, 5),
  451. OnNext(380, 6),
  452. OnNext(390, 7),
  453. OnNext(450, 8),
  454. OnNext(470, 9),
  455. OnNext(560, 10),
  456. OnNext(580, 11),
  457. OnCompleted<int>(600)
  458. );
  459. var res = scheduler.Start(() =>
  460. xs.Where((x, i) =>
  461. {
  462. invoked++;
  463. return true;
  464. })
  465. );
  466. res.Messages.AssertEqual(
  467. OnNext(230, 3),
  468. OnNext(270, 4),
  469. OnNext(340, 5),
  470. OnNext(380, 6),
  471. OnNext(390, 7),
  472. OnNext(450, 8),
  473. OnNext(470, 9),
  474. OnNext(560, 10),
  475. OnNext(580, 11),
  476. OnCompleted<int>(600)
  477. );
  478. xs.Subscriptions.AssertEqual(
  479. Subscribe(200, 600)
  480. );
  481. Assert.Equal(9, invoked);
  482. }
  483. [TestMethod]
  484. public void WhereIndex_False()
  485. {
  486. var scheduler = new TestScheduler();
  487. var invoked = 0;
  488. var xs = scheduler.CreateHotObservable(
  489. OnNext(110, 1),
  490. OnNext(180, 2),
  491. OnNext(230, 3),
  492. OnNext(270, 4),
  493. OnNext(340, 5),
  494. OnNext(380, 6),
  495. OnNext(390, 7),
  496. OnNext(450, 8),
  497. OnNext(470, 9),
  498. OnNext(560, 10),
  499. OnNext(580, 11),
  500. OnCompleted<int>(600)
  501. );
  502. var res = scheduler.Start(() =>
  503. xs.Where((x, i) =>
  504. {
  505. invoked++;
  506. return false;
  507. })
  508. );
  509. res.Messages.AssertEqual(
  510. OnCompleted<int>(600)
  511. );
  512. xs.Subscriptions.AssertEqual(
  513. Subscribe(200, 600)
  514. );
  515. Assert.Equal(9, invoked);
  516. }
  517. [TestMethod]
  518. public void WhereIndex_Dispose()
  519. {
  520. var scheduler = new TestScheduler();
  521. var invoked = 0;
  522. var xs = scheduler.CreateHotObservable(
  523. OnNext(110, 1),
  524. OnNext(180, 2),
  525. OnNext(230, 3),
  526. OnNext(270, 4),
  527. OnNext(340, 5),
  528. OnNext(380, 6),
  529. OnNext(390, 7),
  530. OnNext(450, 8),
  531. OnNext(470, 9),
  532. OnNext(560, 10),
  533. OnNext(580, 11),
  534. OnCompleted<int>(600)
  535. );
  536. var res = scheduler.Start(() =>
  537. xs.Where((x, i) =>
  538. {
  539. invoked++;
  540. return IsPrime(x + i * 10);
  541. }),
  542. 400
  543. );
  544. res.Messages.AssertEqual(
  545. OnNext(230, 3),
  546. OnNext(390, 7)
  547. );
  548. xs.Subscriptions.AssertEqual(
  549. Subscribe(200, 400)
  550. );
  551. Assert.Equal(5, invoked);
  552. }
  553. [TestMethod]
  554. public void WhereIndex_Error()
  555. {
  556. var scheduler = new TestScheduler();
  557. var invoked = 0;
  558. var ex = new Exception();
  559. var xs = scheduler.CreateHotObservable(
  560. OnNext(110, 1),
  561. OnNext(180, 2),
  562. OnNext(230, 3),
  563. OnNext(270, 4),
  564. OnNext(340, 5),
  565. OnNext(380, 6),
  566. OnNext(390, 7),
  567. OnNext(450, 8),
  568. OnNext(470, 9),
  569. OnNext(560, 10),
  570. OnNext(580, 11),
  571. OnError<int>(600, ex),
  572. OnNext(610, 12),
  573. OnError<int>(620, new Exception()),
  574. OnCompleted<int>(630)
  575. );
  576. var res = scheduler.Start(() =>
  577. xs.Where((x, i) =>
  578. {
  579. invoked++;
  580. return IsPrime(x + i * 10);
  581. })
  582. );
  583. res.Messages.AssertEqual(
  584. OnNext(230, 3),
  585. OnNext(390, 7),
  586. OnError<int>(600, ex)
  587. );
  588. xs.Subscriptions.AssertEqual(
  589. Subscribe(200, 600)
  590. );
  591. Assert.Equal(9, invoked);
  592. }
  593. [TestMethod]
  594. public void WhereIndex_Throw()
  595. {
  596. var scheduler = new TestScheduler();
  597. var invoked = 0;
  598. var ex = new Exception();
  599. var xs = scheduler.CreateHotObservable(
  600. OnNext(110, 1),
  601. OnNext(180, 2),
  602. OnNext(230, 3),
  603. OnNext(270, 4),
  604. OnNext(340, 5),
  605. OnNext(380, 6),
  606. OnNext(390, 7),
  607. OnNext(450, 8),
  608. OnNext(470, 9),
  609. OnNext(560, 10),
  610. OnNext(580, 11),
  611. OnCompleted<int>(600),
  612. OnNext(610, 12),
  613. OnError<int>(620, new Exception()),
  614. OnCompleted<int>(630)
  615. );
  616. var res = scheduler.Start(() =>
  617. xs.Where((x, i) =>
  618. {
  619. invoked++;
  620. if (x > 5)
  621. {
  622. throw ex;
  623. }
  624. return IsPrime(x + i * 10);
  625. })
  626. );
  627. res.Messages.AssertEqual(
  628. OnNext(230, 3),
  629. OnError<int>(380, ex)
  630. );
  631. xs.Subscriptions.AssertEqual(
  632. Subscribe(200, 380)
  633. );
  634. Assert.Equal(4, invoked);
  635. }
  636. [TestMethod]
  637. public void WhereIndex_DisposeInPredicate()
  638. {
  639. var scheduler = new TestScheduler();
  640. var invoked = 0;
  641. var xs = scheduler.CreateHotObservable(
  642. OnNext(110, 1),
  643. OnNext(180, 2),
  644. OnNext(230, 3),
  645. OnNext(270, 4),
  646. OnNext(340, 5),
  647. OnNext(380, 6),
  648. OnNext(390, 7),
  649. OnNext(450, 8),
  650. OnNext(470, 9),
  651. OnNext(560, 10),
  652. OnNext(580, 11),
  653. OnCompleted<int>(600),
  654. OnNext(610, 12),
  655. OnError<int>(620, new Exception()),
  656. OnCompleted<int>(630)
  657. );
  658. var res = scheduler.CreateObserver<int>();
  659. var d = new SerialDisposable();
  660. var ys = default(IObservable<int>);
  661. scheduler.ScheduleAbsolute(Created, () => ys = xs.Where((x, i) =>
  662. {
  663. invoked++;
  664. if (x == 8)
  665. {
  666. d.Dispose();
  667. }
  668. return IsPrime(x + i * 10);
  669. }));
  670. scheduler.ScheduleAbsolute(Subscribed, () => d.Disposable = ys.Subscribe(res));
  671. scheduler.ScheduleAbsolute(Disposed, () => d.Dispose());
  672. scheduler.Start();
  673. res.Messages.AssertEqual(
  674. OnNext(230, 3),
  675. OnNext(390, 7)
  676. );
  677. xs.Subscriptions.AssertEqual(
  678. Subscribe(200, 450)
  679. );
  680. Assert.Equal(6, invoked);
  681. }
  682. [TestMethod]
  683. public void Where_Where1()
  684. {
  685. var scheduler = new TestScheduler();
  686. var xs = scheduler.CreateHotObservable(
  687. OnNext(110, 1),
  688. OnNext(180, 2),
  689. OnNext(230, 3),
  690. OnNext(270, 4),
  691. OnNext(340, 5),
  692. OnNext(380, 6),
  693. OnNext(390, 7),
  694. OnCompleted<int>(400)
  695. );
  696. var res = scheduler.Start(() =>
  697. xs.Where(x => x > 3).Where(x => x < 6)
  698. );
  699. res.Messages.AssertEqual(
  700. OnNext(270, 4),
  701. OnNext(340, 5),
  702. OnCompleted<int>(400)
  703. );
  704. xs.Subscriptions.AssertEqual(
  705. Subscribe(200, 400)
  706. );
  707. }
  708. [TestMethod]
  709. public void Where_Where2()
  710. {
  711. var scheduler = new TestScheduler();
  712. var xs = scheduler.CreateHotObservable(
  713. OnNext(110, 1),
  714. OnNext(180, 2),
  715. OnNext(230, 3),
  716. OnNext(270, 4),
  717. OnNext(340, 5),
  718. OnNext(380, 6),
  719. OnNext(390, 7),
  720. OnCompleted<int>(400)
  721. );
  722. var res = scheduler.Start(() =>
  723. xs.Where((x, i) => i >= 1).Where(x => x < 6)
  724. );
  725. res.Messages.AssertEqual(
  726. OnNext(270, 4),
  727. OnNext(340, 5),
  728. OnCompleted<int>(400)
  729. );
  730. xs.Subscriptions.AssertEqual(
  731. Subscribe(200, 400)
  732. );
  733. }
  734. [TestMethod]
  735. public void Where_Where3()
  736. {
  737. var scheduler = new TestScheduler();
  738. var xs = scheduler.CreateHotObservable(
  739. OnNext(110, 1),
  740. OnNext(180, 2),
  741. OnNext(230, 3),
  742. OnNext(270, 4),
  743. OnNext(340, 5),
  744. OnNext(380, 6),
  745. OnNext(390, 7),
  746. OnCompleted<int>(400)
  747. );
  748. var res = scheduler.Start(() =>
  749. xs.Where(x => x > 3).Where((x, i) => i < 2)
  750. );
  751. res.Messages.AssertEqual(
  752. OnNext(270, 4),
  753. OnNext(340, 5),
  754. OnCompleted<int>(400)
  755. );
  756. xs.Subscriptions.AssertEqual(
  757. Subscribe(200, 400)
  758. );
  759. }
  760. [TestMethod]
  761. public void Where_Where4()
  762. {
  763. var scheduler = new TestScheduler();
  764. var xs = scheduler.CreateHotObservable(
  765. OnNext(110, 1),
  766. OnNext(180, 2),
  767. OnNext(230, 3),
  768. OnNext(270, 4),
  769. OnNext(340, 5),
  770. OnNext(380, 6),
  771. OnNext(390, 7),
  772. OnCompleted<int>(400)
  773. );
  774. var res = scheduler.Start(() =>
  775. xs.Where((x, i) => i >= 1).Where((x, i) => i < 2)
  776. );
  777. res.Messages.AssertEqual(
  778. OnNext(270, 4),
  779. OnNext(340, 5),
  780. OnCompleted<int>(400)
  781. );
  782. xs.Subscriptions.AssertEqual(
  783. Subscribe(200, 400)
  784. );
  785. }
  786. }
  787. }