DoTest.cs 20 KB

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