DoTest.cs 20 KB

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