DoTest.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  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.Reactive;
  6. using System.Reactive.Linq;
  7. using Microsoft.Reactive.Testing;
  8. using Xunit;
  9. namespace ReactiveTests.Tests
  10. {
  11. public class DoTest : ReactiveTest
  12. {
  13. [Fact]
  14. public void Do_ArgumentChecking()
  15. {
  16. var someObservable = Observable.Empty<int>();
  17. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, (Action<int>)null));
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do<int>(null, _ => { }));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, x => { }, (Action)null));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, null, () => { }));
  21. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do<int>(null, x => { }, () => { }));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, x => { }, (Action<Exception>)null));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, null, (Exception _) => { }));
  24. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do<int>(null, x => { }, (Exception _) => { }));
  25. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, x => { }, (Exception _) => { }, null));
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, x => { }, null, () => { }));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, null, (Exception _) => { }, () => { }));
  28. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do<int>(null, x => { }, (Exception _) => { }, () => { }));
  29. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(null, Observer.Create<int>(i => { })));
  30. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Do(someObservable, default(IObserver<int>)));
  31. }
  32. [Fact]
  33. public void Do_ShouldSeeAllValues()
  34. {
  35. var scheduler = new TestScheduler();
  36. var xs = scheduler.CreateHotObservable(
  37. OnNext(150, 1),
  38. OnNext(210, 2),
  39. OnNext(220, 3),
  40. OnNext(230, 4),
  41. OnNext(240, 5),
  42. OnCompleted<int>(250)
  43. );
  44. var i = 0;
  45. var sum = 2 + 3 + 4 + 5;
  46. var res = scheduler.Start(() =>
  47. xs.Do(x => { i++; sum -= x; })
  48. );
  49. Assert.Equal(4, i);
  50. Assert.Equal(0, sum);
  51. res.Messages.AssertEqual(
  52. OnNext(210, 2),
  53. OnNext(220, 3),
  54. OnNext(230, 4),
  55. OnNext(240, 5),
  56. OnCompleted<int>(250)
  57. );
  58. xs.Subscriptions.AssertEqual(
  59. Subscribe(200, 250)
  60. );
  61. }
  62. [Fact]
  63. public void Do_PlainAction()
  64. {
  65. var scheduler = new TestScheduler();
  66. var xs = scheduler.CreateHotObservable(
  67. OnNext(150, 1),
  68. OnNext(210, 2),
  69. OnNext(220, 3),
  70. OnNext(230, 4),
  71. OnNext(240, 5),
  72. OnCompleted<int>(250)
  73. );
  74. var i = 0;
  75. var res = scheduler.Start(() =>
  76. xs.Do(_ => { i++; })
  77. );
  78. Assert.Equal(4, i);
  79. res.Messages.AssertEqual(
  80. OnNext(210, 2),
  81. OnNext(220, 3),
  82. OnNext(230, 4),
  83. OnNext(240, 5),
  84. OnCompleted<int>(250)
  85. );
  86. xs.Subscriptions.AssertEqual(
  87. Subscribe(200, 250)
  88. );
  89. }
  90. [Fact]
  91. public void Do_NextCompleted()
  92. {
  93. var scheduler = new TestScheduler();
  94. var xs = scheduler.CreateHotObservable(
  95. OnNext(150, 1),
  96. OnNext(210, 2),
  97. OnNext(220, 3),
  98. OnNext(230, 4),
  99. OnNext(240, 5),
  100. OnCompleted<int>(250)
  101. );
  102. var i = 0;
  103. var sum = 2 + 3 + 4 + 5;
  104. var completed = false;
  105. var res = scheduler.Start(() =>
  106. xs.Do(x => { i++; sum -= x; }, () => { completed = true; })
  107. );
  108. Assert.Equal(4, i);
  109. Assert.Equal(0, sum);
  110. Assert.True(completed);
  111. res.Messages.AssertEqual(
  112. OnNext(210, 2),
  113. OnNext(220, 3),
  114. OnNext(230, 4),
  115. OnNext(240, 5),
  116. OnCompleted<int>(250)
  117. );
  118. xs.Subscriptions.AssertEqual(
  119. Subscribe(200, 250)
  120. );
  121. }
  122. [Fact]
  123. public void Do_NextCompleted_Never()
  124. {
  125. var scheduler = new TestScheduler();
  126. var xs = scheduler.CreateHotObservable<int>();
  127. var i = 0;
  128. var completed = false;
  129. var res = scheduler.Start(() =>
  130. xs.Do(x => { i++; }, () => { completed = true; })
  131. );
  132. Assert.Equal(0, i);
  133. Assert.False(completed);
  134. res.Messages.AssertEqual(
  135. );
  136. xs.Subscriptions.AssertEqual(
  137. Subscribe(200, 1000)
  138. );
  139. }
  140. [Fact]
  141. public void Do_NextError()
  142. {
  143. var scheduler = new TestScheduler();
  144. var ex = new Exception();
  145. var xs = scheduler.CreateHotObservable(
  146. OnNext(150, 1),
  147. OnNext(210, 2),
  148. OnNext(220, 3),
  149. OnNext(230, 4),
  150. OnNext(240, 5),
  151. OnError<int>(250, ex)
  152. );
  153. var i = 0;
  154. var sum = 2 + 3 + 4 + 5;
  155. var sawError = false;
  156. var res = scheduler.Start(() =>
  157. xs.Do(x => { i++; sum -= x; }, e => { sawError = e == ex; })
  158. );
  159. Assert.Equal(4, i);
  160. Assert.Equal(0, sum);
  161. Assert.True(sawError);
  162. res.Messages.AssertEqual(
  163. OnNext(210, 2),
  164. OnNext(220, 3),
  165. OnNext(230, 4),
  166. OnNext(240, 5),
  167. OnError<int>(250, ex)
  168. );
  169. xs.Subscriptions.AssertEqual(
  170. Subscribe(200, 250)
  171. );
  172. }
  173. [Fact]
  174. public void Do_NextErrorNot()
  175. {
  176. var scheduler = new TestScheduler();
  177. var xs = scheduler.CreateHotObservable(
  178. OnNext(150, 1),
  179. OnNext(210, 2),
  180. OnNext(220, 3),
  181. OnNext(230, 4),
  182. OnNext(240, 5),
  183. OnCompleted<int>(250)
  184. );
  185. var i = 0;
  186. var sum = 2 + 3 + 4 + 5;
  187. var sawError = false;
  188. var res = scheduler.Start(() =>
  189. xs.Do(x => { i++; sum -= x; }, _ => { sawError = true; })
  190. );
  191. Assert.Equal(4, i);
  192. Assert.Equal(0, sum);
  193. Assert.False(sawError);
  194. res.Messages.AssertEqual(
  195. OnNext(210, 2),
  196. OnNext(220, 3),
  197. OnNext(230, 4),
  198. OnNext(240, 5),
  199. OnCompleted<int>(250)
  200. );
  201. xs.Subscriptions.AssertEqual(
  202. Subscribe(200, 250)
  203. );
  204. }
  205. [Fact]
  206. public void Do_NextErrorCompleted()
  207. {
  208. var scheduler = new TestScheduler();
  209. var xs = scheduler.CreateHotObservable(
  210. OnNext(150, 1),
  211. OnNext(210, 2),
  212. OnNext(220, 3),
  213. OnNext(230, 4),
  214. OnNext(240, 5),
  215. OnCompleted<int>(250)
  216. );
  217. var i = 0;
  218. var sum = 2 + 3 + 4 + 5;
  219. var sawError = false;
  220. var hasCompleted = false;
  221. var res = scheduler.Start(() =>
  222. xs.Do(x => { i++; sum -= x; }, e => { sawError = true; }, () => { hasCompleted = true; })
  223. );
  224. Assert.Equal(4, i);
  225. Assert.Equal(0, sum);
  226. Assert.False(sawError);
  227. Assert.True(hasCompleted);
  228. res.Messages.AssertEqual(
  229. OnNext(210, 2),
  230. OnNext(220, 3),
  231. OnNext(230, 4),
  232. OnNext(240, 5),
  233. OnCompleted<int>(250)
  234. );
  235. xs.Subscriptions.AssertEqual(
  236. Subscribe(200, 250)
  237. );
  238. }
  239. [Fact]
  240. public void Do_NextErrorCompletedError()
  241. {
  242. var scheduler = new TestScheduler();
  243. var ex = new Exception();
  244. var xs = scheduler.CreateHotObservable(
  245. OnNext(150, 1),
  246. OnNext(210, 2),
  247. OnNext(220, 3),
  248. OnNext(230, 4),
  249. OnNext(240, 5),
  250. OnError<int>(250, ex)
  251. );
  252. var i = 0;
  253. var sum = 2 + 3 + 4 + 5;
  254. var sawError = false;
  255. var hasCompleted = false;
  256. var res = scheduler.Start(() =>
  257. xs.Do(x => { i++; sum -= x; }, e => { sawError = e == ex; }, () => { hasCompleted = true; })
  258. );
  259. Assert.Equal(4, i);
  260. Assert.Equal(0, sum);
  261. Assert.True(sawError);
  262. Assert.False(hasCompleted);
  263. res.Messages.AssertEqual(
  264. OnNext(210, 2),
  265. OnNext(220, 3),
  266. OnNext(230, 4),
  267. OnNext(240, 5),
  268. OnError<int>(250, ex)
  269. );
  270. xs.Subscriptions.AssertEqual(
  271. Subscribe(200, 250)
  272. );
  273. }
  274. [Fact]
  275. public void Do_NextErrorCompletedNever()
  276. {
  277. var scheduler = new TestScheduler();
  278. var xs = scheduler.CreateHotObservable<int>();
  279. var i = 0;
  280. var sawError = false;
  281. var hasCompleted = false;
  282. var res = scheduler.Start(() =>
  283. xs.Do(x => { i++; }, e => { sawError = true; }, () => { hasCompleted = true; })
  284. );
  285. Assert.Equal(0, i);
  286. Assert.False(sawError);
  287. Assert.False(hasCompleted);
  288. res.Messages.AssertEqual(
  289. );
  290. xs.Subscriptions.AssertEqual(
  291. Subscribe(200, 1000)
  292. );
  293. }
  294. [Fact]
  295. public void Do_Observer_SomeDataWithError()
  296. {
  297. var scheduler = new TestScheduler();
  298. var ex = new Exception();
  299. var xs = scheduler.CreateHotObservable(
  300. OnNext(150, 1),
  301. OnNext(210, 2),
  302. OnNext(220, 3),
  303. OnNext(230, 4),
  304. OnNext(240, 5),
  305. OnError<int>(250, ex)
  306. );
  307. var i = 0;
  308. var sum = 2 + 3 + 4 + 5;
  309. var sawError = false;
  310. var hasCompleted = false;
  311. var res = scheduler.Start(() =>
  312. xs.Do(Observer.Create<int>(x => { i++; sum -= x; }, e => { sawError = e == ex; }, () => { hasCompleted = true; }))
  313. );
  314. Assert.Equal(4, i);
  315. Assert.Equal(0, sum);
  316. Assert.True(sawError);
  317. Assert.False(hasCompleted);
  318. res.Messages.AssertEqual(
  319. OnNext(210, 2),
  320. OnNext(220, 3),
  321. OnNext(230, 4),
  322. OnNext(240, 5),
  323. OnError<int>(250, ex)
  324. );
  325. xs.Subscriptions.AssertEqual(
  326. Subscribe(200, 250)
  327. );
  328. }
  329. [Fact]
  330. public void Do_Observer_SomeDataWithoutError()
  331. {
  332. var scheduler = new TestScheduler();
  333. var xs = scheduler.CreateHotObservable(
  334. OnNext(150, 1),
  335. OnNext(210, 2),
  336. OnNext(220, 3),
  337. OnNext(230, 4),
  338. OnNext(240, 5),
  339. OnCompleted<int>(250)
  340. );
  341. var i = 0;
  342. var sum = 2 + 3 + 4 + 5;
  343. var sawError = false;
  344. var hasCompleted = false;
  345. var res = scheduler.Start(() =>
  346. xs.Do(Observer.Create<int>(x => { i++; sum -= x; }, e => { sawError = true; }, () => { hasCompleted = true; }))
  347. );
  348. Assert.Equal(4, i);
  349. Assert.Equal(0, sum);
  350. Assert.False(sawError);
  351. Assert.True(hasCompleted);
  352. res.Messages.AssertEqual(
  353. OnNext(210, 2),
  354. OnNext(220, 3),
  355. OnNext(230, 4),
  356. OnNext(240, 5),
  357. OnCompleted<int>(250)
  358. );
  359. xs.Subscriptions.AssertEqual(
  360. Subscribe(200, 250)
  361. );
  362. }
  363. [Fact]
  364. public void Do1422_Next_NextThrows()
  365. {
  366. var scheduler = new TestScheduler();
  367. var ex = new Exception();
  368. var xs = scheduler.CreateHotObservable(
  369. OnNext(150, 1),
  370. OnNext(210, 2),
  371. OnCompleted<int>(250)
  372. );
  373. var res = scheduler.Start(() =>
  374. xs.Do(x => { throw ex; })
  375. );
  376. res.Messages.AssertEqual(
  377. OnError<int>(210, ex)
  378. );
  379. xs.Subscriptions.AssertEqual(
  380. Subscribe(200, 210)
  381. );
  382. }
  383. [Fact]
  384. public void Do1422_NextCompleted_NextThrows()
  385. {
  386. var scheduler = new TestScheduler();
  387. var ex = new Exception();
  388. var xs = scheduler.CreateHotObservable(
  389. OnNext(150, 1),
  390. OnNext(210, 2),
  391. OnCompleted<int>(250)
  392. );
  393. var res = scheduler.Start(() =>
  394. xs.Do(x => { throw ex; }, () => { })
  395. );
  396. res.Messages.AssertEqual(
  397. OnError<int>(210, ex)
  398. );
  399. xs.Subscriptions.AssertEqual(
  400. Subscribe(200, 210)
  401. );
  402. }
  403. [Fact]
  404. public void Do1422_NextCompleted_CompletedThrows()
  405. {
  406. var scheduler = new TestScheduler();
  407. var ex = new Exception();
  408. var xs = scheduler.CreateHotObservable(
  409. OnNext(150, 1),
  410. OnNext(210, 2),
  411. OnCompleted<int>(250)
  412. );
  413. var res = scheduler.Start(() =>
  414. xs.Do(x => { }, () => { throw ex; })
  415. );
  416. res.Messages.AssertEqual(
  417. OnNext(210, 2),
  418. OnError<int>(250, ex)
  419. );
  420. xs.Subscriptions.AssertEqual(
  421. Subscribe(200, 250)
  422. );
  423. }
  424. [Fact]
  425. public void Do1422_NextError_NextThrows()
  426. {
  427. var scheduler = new TestScheduler();
  428. var ex = new Exception();
  429. var xs = scheduler.CreateHotObservable(
  430. OnNext(150, 1),
  431. OnNext(210, 2),
  432. OnCompleted<int>(250)
  433. );
  434. var res = scheduler.Start(() =>
  435. xs.Do(x => { throw ex; }, _ => { })
  436. );
  437. res.Messages.AssertEqual(
  438. OnError<int>(210, ex)
  439. );
  440. xs.Subscriptions.AssertEqual(
  441. Subscribe(200, 210)
  442. );
  443. }
  444. [Fact]
  445. public void Do1422_NextError_ErrorThrows()
  446. {
  447. var scheduler = new TestScheduler();
  448. var ex1 = new Exception();
  449. var ex2 = new Exception();
  450. var xs = scheduler.CreateHotObservable(
  451. OnNext(150, 1),
  452. OnError<int>(210, ex1)
  453. );
  454. var res = scheduler.Start(() =>
  455. xs.Do(x => { }, _ => { throw ex2; })
  456. );
  457. res.Messages.AssertEqual(
  458. OnError<int>(210, ex2)
  459. );
  460. xs.Subscriptions.AssertEqual(
  461. Subscribe(200, 210)
  462. );
  463. }
  464. [Fact]
  465. public void Do1422_NextErrorCompleted_NextThrows()
  466. {
  467. var scheduler = new TestScheduler();
  468. var ex = new Exception();
  469. var xs = scheduler.CreateHotObservable(
  470. OnNext(150, 1),
  471. OnNext(210, 2),
  472. OnCompleted<int>(250)
  473. );
  474. var res = scheduler.Start(() =>
  475. xs.Do(x => { throw ex; }, _ => { }, () => { })
  476. );
  477. res.Messages.AssertEqual(
  478. OnError<int>(210, ex)
  479. );
  480. xs.Subscriptions.AssertEqual(
  481. Subscribe(200, 210)
  482. );
  483. }
  484. [Fact]
  485. public void Do1422_NextErrorCompleted_ErrorThrows()
  486. {
  487. var scheduler = new TestScheduler();
  488. var ex1 = new Exception();
  489. var ex2 = new Exception();
  490. var xs = scheduler.CreateHotObservable(
  491. OnNext(150, 1),
  492. OnError<int>(210, ex1)
  493. );
  494. var res = scheduler.Start(() =>
  495. xs.Do(x => { }, _ => { throw ex2; }, () => { })
  496. );
  497. res.Messages.AssertEqual(
  498. OnError<int>(210, ex2)
  499. );
  500. xs.Subscriptions.AssertEqual(
  501. Subscribe(200, 210)
  502. );
  503. }
  504. [Fact]
  505. public void Do1422_NextErrorCompleted_CompletedThrows()
  506. {
  507. var scheduler = new TestScheduler();
  508. var ex = new Exception();
  509. var xs = scheduler.CreateHotObservable(
  510. OnNext(150, 1),
  511. OnNext(210, 2),
  512. OnCompleted<int>(250)
  513. );
  514. var res = scheduler.Start(() =>
  515. xs.Do(x => { }, _ => { }, () => { throw ex; })
  516. );
  517. res.Messages.AssertEqual(
  518. OnNext(210, 2),
  519. OnError<int>(250, ex)
  520. );
  521. xs.Subscriptions.AssertEqual(
  522. Subscribe(200, 250)
  523. );
  524. }
  525. [Fact]
  526. public void Do1422_Observer_NextThrows()
  527. {
  528. var scheduler = new TestScheduler();
  529. var ex = new Exception();
  530. var xs = scheduler.CreateHotObservable(
  531. OnNext(150, 1),
  532. OnNext(210, 2),
  533. OnCompleted<int>(250)
  534. );
  535. var res = scheduler.Start(() =>
  536. xs.Do(Observer.Create<int>(x => { throw ex; }, _ => { }, () => { }))
  537. );
  538. res.Messages.AssertEqual(
  539. OnError<int>(210, ex)
  540. );
  541. xs.Subscriptions.AssertEqual(
  542. Subscribe(200, 210)
  543. );
  544. }
  545. [Fact]
  546. public void Do1422_Observer_ErrorThrows()
  547. {
  548. var scheduler = new TestScheduler();
  549. var ex1 = new Exception();
  550. var ex2 = new Exception();
  551. var xs = scheduler.CreateHotObservable(
  552. OnNext(150, 1),
  553. OnError<int>(210, ex1)
  554. );
  555. var res = scheduler.Start(() =>
  556. xs.Do(Observer.Create<int>(x => { }, _ => { throw ex2; }, () => { }))
  557. );
  558. res.Messages.AssertEqual(
  559. OnError<int>(210, ex2)
  560. );
  561. xs.Subscriptions.AssertEqual(
  562. Subscribe(200, 210)
  563. );
  564. }
  565. [Fact]
  566. public void Do1422_Observer_CompletedThrows()
  567. {
  568. var scheduler = new TestScheduler();
  569. var ex = new Exception();
  570. var xs = scheduler.CreateHotObservable(
  571. OnNext(150, 1),
  572. OnNext(210, 2),
  573. OnCompleted<int>(250)
  574. );
  575. var res = scheduler.Start(() =>
  576. xs.Do(Observer.Create<int>(x => { }, _ => { }, () => { throw ex; }))
  577. );
  578. res.Messages.AssertEqual(
  579. OnNext(210, 2),
  580. OnError<int>(250, ex)
  581. );
  582. xs.Subscriptions.AssertEqual(
  583. Subscribe(200, 250)
  584. );
  585. }
  586. }
  587. }