1
0

DoTest.cs 20 KB

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