SequenceEqualTest.cs 29 KB

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