1
0

ThenTest.cs 18 KB

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