SequenceEqualTest.cs 29 KB

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