AggregateTest.cs 14 KB

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