ThenTest.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  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.Collections.Generic;
  6. using System.Reactive.Linq;
  7. using Microsoft.Reactive.Testing;
  8. using Microsoft.VisualStudio.TestTools.UnitTesting;
  9. namespace ReactiveTests.Tests
  10. {
  11. [TestClass]
  12. public class ThenTest : ReactiveTest
  13. {
  14. [TestMethod]
  15. public void Then_ArgumentChecking()
  16. {
  17. var someObservable = Observable.Return(1);
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Then<int, int>(null, _ => _));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Then<int, int>(someObservable, null));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).Then<int>(null));
  21. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).Then<int>(null));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).Then<int>(null));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  24. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  25. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  28. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  29. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  30. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  31. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  32. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  33. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  34. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.And(someObservable, someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).And(someObservable).Then<int>(null));
  35. }
  36. [TestMethod]
  37. public void Then1()
  38. {
  39. var scheduler = new TestScheduler();
  40. var xs = scheduler.CreateHotObservable(
  41. OnNext(210, 1),
  42. OnCompleted<int>(220)
  43. );
  44. var res = scheduler.Start(() =>
  45. Observable.When(xs.Then(a => a))
  46. );
  47. res.Messages.AssertEqual(
  48. OnNext(210, 1),
  49. OnCompleted<int>(220)
  50. );
  51. }
  52. [TestMethod]
  53. public void Then1Error()
  54. {
  55. var ex = new Exception();
  56. var scheduler = new TestScheduler();
  57. var xs = scheduler.CreateHotObservable(
  58. OnError<int>(210, ex)
  59. );
  60. var res = scheduler.Start(() =>
  61. Observable.When(xs.Then(a => a))
  62. );
  63. res.Messages.AssertEqual(
  64. OnError<int>(210, ex)
  65. );
  66. }
  67. [TestMethod]
  68. public void Then1Throws()
  69. {
  70. var ex = new Exception();
  71. var scheduler = new TestScheduler();
  72. var xs = scheduler.CreateHotObservable(
  73. OnNext(210, 1),
  74. OnCompleted<int>(220)
  75. );
  76. var res = scheduler.Start(() =>
  77. Observable.When(xs.Then<int, int>(a => { throw ex; }))
  78. );
  79. res.Messages.AssertEqual(
  80. OnError<int>(210, ex)
  81. );
  82. }
  83. [TestMethod]
  84. public void Then2Throws()
  85. {
  86. var scheduler = new TestScheduler();
  87. var ex = new Exception();
  88. const int N = 2;
  89. var obs = new List<IObservable<int>>();
  90. for (var i = 0; i < N; i++)
  91. {
  92. obs.Add(scheduler.CreateHotObservable(
  93. OnNext(210, 1),
  94. OnCompleted<int>(220)
  95. ));
  96. }
  97. var res = scheduler.Start(() =>
  98. Observable.When(obs[0].And(obs[1]).Then<int>((a, b) => { throw ex; }))
  99. );
  100. res.Messages.AssertEqual(
  101. OnError<int>(210, ex)
  102. );
  103. }
  104. [TestMethod]
  105. public void Then3Throws()
  106. {
  107. var scheduler = new TestScheduler();
  108. var ex = new Exception();
  109. const int N = 3;
  110. var obs = new List<IObservable<int>>();
  111. for (var i = 0; i < N; i++)
  112. {
  113. obs.Add(scheduler.CreateHotObservable(
  114. OnNext(210, 1),
  115. OnCompleted<int>(220)
  116. ));
  117. }
  118. var res = scheduler.Start(() =>
  119. Observable.When(obs[0].And(obs[1]).And(obs[2]).Then<int>((a, b, c) => { throw ex; }))
  120. );
  121. res.Messages.AssertEqual(
  122. OnError<int>(210, ex)
  123. );
  124. }
  125. [TestMethod]
  126. public void Then4Throws()
  127. {
  128. var scheduler = new TestScheduler();
  129. var ex = new Exception();
  130. const int N = 4;
  131. var obs = new List<IObservable<int>>();
  132. for (var i = 0; i < N; i++)
  133. {
  134. obs.Add(scheduler.CreateHotObservable(
  135. OnNext(210, 1),
  136. OnCompleted<int>(220)
  137. ));
  138. }
  139. var res = scheduler.Start(() =>
  140. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).Then<int>((a, b, c, d) => { throw ex; }))
  141. );
  142. res.Messages.AssertEqual(
  143. OnError<int>(210, ex)
  144. );
  145. }
  146. [TestMethod]
  147. public void Then5Throws()
  148. {
  149. var scheduler = new TestScheduler();
  150. var ex = new Exception();
  151. const int N = 5;
  152. var obs = new List<IObservable<int>>();
  153. for (var i = 0; i < N; i++)
  154. {
  155. obs.Add(scheduler.CreateHotObservable(
  156. OnNext(210, 1),
  157. OnCompleted<int>(220)
  158. ));
  159. }
  160. var res = scheduler.Start(() =>
  161. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).Then<int>((a, b, c, d, e) => { throw ex; }))
  162. );
  163. res.Messages.AssertEqual(
  164. OnError<int>(210, ex)
  165. );
  166. }
  167. [TestMethod]
  168. public void Then6Throws()
  169. {
  170. var scheduler = new TestScheduler();
  171. var ex = new Exception();
  172. const int N = 6;
  173. var obs = new List<IObservable<int>>();
  174. for (var i = 0; i < N; i++)
  175. {
  176. obs.Add(scheduler.CreateHotObservable(
  177. OnNext(210, 1),
  178. OnCompleted<int>(220)
  179. ));
  180. }
  181. var res = scheduler.Start(() =>
  182. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).Then<int>((a, b, c, d, e, f) => { throw ex; }))
  183. );
  184. res.Messages.AssertEqual(
  185. OnError<int>(210, ex)
  186. );
  187. }
  188. [TestMethod]
  189. public void Then7Throws()
  190. {
  191. var scheduler = new TestScheduler();
  192. var ex = new Exception();
  193. const int N = 7;
  194. var obs = new List<IObservable<int>>();
  195. for (var i = 0; i < N; i++)
  196. {
  197. obs.Add(scheduler.CreateHotObservable(
  198. OnNext(210, 1),
  199. OnCompleted<int>(220)
  200. ));
  201. }
  202. var res = scheduler.Start(() =>
  203. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).Then<int>((a, b, c, d, e, f, g) => { throw ex; }))
  204. );
  205. res.Messages.AssertEqual(
  206. OnError<int>(210, ex)
  207. );
  208. }
  209. [TestMethod]
  210. public void Then8Throws()
  211. {
  212. var scheduler = new TestScheduler();
  213. var ex = new Exception();
  214. const int N = 8;
  215. var obs = new List<IObservable<int>>();
  216. for (var i = 0; i < N; i++)
  217. {
  218. obs.Add(scheduler.CreateHotObservable(
  219. OnNext(210, 1),
  220. OnCompleted<int>(220)
  221. ));
  222. }
  223. var res = scheduler.Start(() =>
  224. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).Then<int>((a, b, c, d, e, f, g, h) => { throw ex; }))
  225. );
  226. res.Messages.AssertEqual(
  227. OnError<int>(210, ex)
  228. );
  229. }
  230. [TestMethod]
  231. public void Then9Throws()
  232. {
  233. var scheduler = new TestScheduler();
  234. var ex = new Exception();
  235. const int N = 9;
  236. var obs = new List<IObservable<int>>();
  237. for (var i = 0; i < N; i++)
  238. {
  239. obs.Add(scheduler.CreateHotObservable(
  240. OnNext(210, 1),
  241. OnCompleted<int>(220)
  242. ));
  243. }
  244. var res = scheduler.Start(() =>
  245. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).And(obs[8]).Then<int>((a, b, c, d, e, f, g, h, i_) => { throw ex; }))
  246. );
  247. res.Messages.AssertEqual(
  248. OnError<int>(210, ex)
  249. );
  250. }
  251. [TestMethod]
  252. public void Then10Throws()
  253. {
  254. var scheduler = new TestScheduler();
  255. var ex = new Exception();
  256. const int N = 10;
  257. var obs = new List<IObservable<int>>();
  258. for (var i = 0; i < N; i++)
  259. {
  260. obs.Add(scheduler.CreateHotObservable(
  261. OnNext(210, 1),
  262. OnCompleted<int>(220)
  263. ));
  264. }
  265. var res = scheduler.Start(() =>
  266. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).And(obs[8]).And(obs[9]).Then<int>((a, b, c, d, e, f, g, h, i_, j) => { throw ex; }))
  267. );
  268. res.Messages.AssertEqual(
  269. OnError<int>(210, ex)
  270. );
  271. }
  272. [TestMethod]
  273. public void Then11Throws()
  274. {
  275. var scheduler = new TestScheduler();
  276. var ex = new Exception();
  277. const int N = 11;
  278. var obs = new List<IObservable<int>>();
  279. for (var i = 0; i < N; i++)
  280. {
  281. obs.Add(scheduler.CreateHotObservable(
  282. OnNext(210, 1),
  283. OnCompleted<int>(220)
  284. ));
  285. }
  286. var res = scheduler.Start(() =>
  287. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).And(obs[8]).And(obs[9]).And(obs[10]).Then<int>((a, b, c, d, e, f, g, h, i_, j, k) => { throw ex; }))
  288. );
  289. res.Messages.AssertEqual(
  290. OnError<int>(210, ex)
  291. );
  292. }
  293. [TestMethod]
  294. public void Then12Throws()
  295. {
  296. var scheduler = new TestScheduler();
  297. var ex = new Exception();
  298. const int N = 12;
  299. var obs = new List<IObservable<int>>();
  300. for (var i = 0; i < N; i++)
  301. {
  302. obs.Add(scheduler.CreateHotObservable(
  303. OnNext(210, 1),
  304. OnCompleted<int>(220)
  305. ));
  306. }
  307. var res = scheduler.Start(() =>
  308. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).And(obs[8]).And(obs[9]).And(obs[10]).And(obs[11]).Then<int>((a, b, c, d, e, f, g, h, i_, j, k, l) => { throw ex; }))
  309. );
  310. res.Messages.AssertEqual(
  311. OnError<int>(210, ex)
  312. );
  313. }
  314. [TestMethod]
  315. public void Then13Throws()
  316. {
  317. var scheduler = new TestScheduler();
  318. var ex = new Exception();
  319. const int N = 13;
  320. var obs = new List<IObservable<int>>();
  321. for (var i = 0; i < N; i++)
  322. {
  323. obs.Add(scheduler.CreateHotObservable(
  324. OnNext(210, 1),
  325. OnCompleted<int>(220)
  326. ));
  327. }
  328. var res = scheduler.Start(() =>
  329. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).And(obs[8]).And(obs[9]).And(obs[10]).And(obs[11]).And(obs[12]).Then<int>((a, b, c, d, e, f, g, h, i_, j, k, l, m) => { throw ex; }))
  330. );
  331. res.Messages.AssertEqual(
  332. OnError<int>(210, ex)
  333. );
  334. }
  335. [TestMethod]
  336. public void Then14Throws()
  337. {
  338. var scheduler = new TestScheduler();
  339. var ex = new Exception();
  340. const int N = 14;
  341. var obs = new List<IObservable<int>>();
  342. for (var i = 0; i < N; i++)
  343. {
  344. obs.Add(scheduler.CreateHotObservable(
  345. OnNext(210, 1),
  346. OnCompleted<int>(220)
  347. ));
  348. }
  349. var res = scheduler.Start(() =>
  350. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).And(obs[8]).And(obs[9]).And(obs[10]).And(obs[11]).And(obs[12]).And(obs[13]).Then<int>((a, b, c, d, e, f, g, h, i_, j, k, l, m, n) => { throw ex; }))
  351. );
  352. res.Messages.AssertEqual(
  353. OnError<int>(210, ex)
  354. );
  355. }
  356. [TestMethod]
  357. public void Then15Throws()
  358. {
  359. var scheduler = new TestScheduler();
  360. var ex = new Exception();
  361. const int N = 15;
  362. var obs = new List<IObservable<int>>();
  363. for (var i = 0; i < N; i++)
  364. {
  365. obs.Add(scheduler.CreateHotObservable(
  366. OnNext(210, 1),
  367. OnCompleted<int>(220)
  368. ));
  369. }
  370. var res = scheduler.Start(() =>
  371. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).And(obs[8]).And(obs[9]).And(obs[10]).And(obs[11]).And(obs[12]).And(obs[13]).And(obs[14]).Then<int>((a, b, c, d, e, f, g, h, i_, j, k, l, m, n, o) => { throw ex; }))
  372. );
  373. res.Messages.AssertEqual(
  374. OnError<int>(210, ex)
  375. );
  376. }
  377. [TestMethod]
  378. public void Then16Throws()
  379. {
  380. var scheduler = new TestScheduler();
  381. var ex = new Exception();
  382. const int N = 16;
  383. var obs = new List<IObservable<int>>();
  384. for (var i = 0; i < N; i++)
  385. {
  386. obs.Add(scheduler.CreateHotObservable(
  387. OnNext(210, 1),
  388. OnCompleted<int>(220)
  389. ));
  390. }
  391. var res = scheduler.Start(() =>
  392. Observable.When(obs[0].And(obs[1]).And(obs[2]).And(obs[3]).And(obs[4]).And(obs[5]).And(obs[6]).And(obs[7]).And(obs[8]).And(obs[9]).And(obs[10]).And(obs[11]).And(obs[12]).And(obs[13]).And(obs[14]).And(obs[15]).Then<int>((a, b, c, d, e, f, g, h, i_, j, k, l, m, n, o, p) => { throw ex; }))
  393. );
  394. res.Messages.AssertEqual(
  395. OnError<int>(210, ex)
  396. );
  397. }
  398. }
  399. }