SequenceEqualTest.cs 29 KB

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