ScanTest.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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.Linq;
  6. using Microsoft.Reactive.Testing;
  7. using Microsoft.VisualStudio.TestTools.UnitTesting;
  8. namespace ReactiveTests.Tests
  9. {
  10. [TestClass]
  11. public class ScanTest : ReactiveTest
  12. {
  13. [TestMethod]
  14. public void Scan_ArgumentChecking()
  15. {
  16. var someObservable = Observable.Empty<int>();
  17. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Scan<int>(null, (_, __) => 0));
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Scan(someObservable, null));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Scan<int, int>(null, 0, (_, __) => 0));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Scan(someObservable, 0, null));
  21. }
  22. [TestMethod]
  23. public void Scan_Seed_Never()
  24. {
  25. var scheduler = new TestScheduler();
  26. var xs = scheduler.CreateHotObservable<int>();
  27. var seed = 42;
  28. var res = scheduler.Start(() =>
  29. xs.Scan(seed, (acc, x) => acc + x)
  30. );
  31. res.Messages.AssertEqual(
  32. );
  33. xs.Subscriptions.AssertEqual(
  34. Subscribe(200, 1000)
  35. );
  36. }
  37. [TestMethod]
  38. public void Scan_Seed_Empty()
  39. {
  40. var scheduler = new TestScheduler();
  41. var xs = scheduler.CreateHotObservable(
  42. OnNext(150, 1),
  43. OnCompleted<int>(250)
  44. );
  45. var seed = 42;
  46. var res = scheduler.Start(() =>
  47. xs.Scan(seed, (acc, x) => acc + x)
  48. );
  49. res.Messages.AssertEqual(
  50. OnCompleted<int>(250)
  51. );
  52. xs.Subscriptions.AssertEqual(
  53. Subscribe(200, 250)
  54. );
  55. }
  56. [TestMethod]
  57. public void Scan_Seed_Return()
  58. {
  59. var scheduler = new TestScheduler();
  60. var xs = scheduler.CreateHotObservable(
  61. OnNext(150, 1),
  62. OnNext(220, 2),
  63. OnCompleted<int>(250)
  64. );
  65. var seed = 42;
  66. var res = scheduler.Start(() =>
  67. xs.Scan(seed, (acc, x) => acc + x)
  68. );
  69. res.Messages.AssertEqual(
  70. OnNext(220, seed + 2),
  71. OnCompleted<int>(250)
  72. );
  73. xs.Subscriptions.AssertEqual(
  74. Subscribe(200, 250)
  75. );
  76. }
  77. [TestMethod]
  78. public void Scan_Seed_Throw()
  79. {
  80. var scheduler = new TestScheduler();
  81. var ex = new Exception();
  82. var xs = scheduler.CreateHotObservable(
  83. OnNext(150, 1),
  84. OnError<int>(250, ex)
  85. );
  86. var seed = 42;
  87. var res = scheduler.Start(() =>
  88. xs.Scan(seed, (acc, x) => acc + x)
  89. );
  90. res.Messages.AssertEqual(
  91. OnError<int>(250, ex)
  92. );
  93. xs.Subscriptions.AssertEqual(
  94. Subscribe(200, 250)
  95. );
  96. }
  97. [TestMethod]
  98. public void Scan_Seed_SomeData()
  99. {
  100. var scheduler = new TestScheduler();
  101. var xs = scheduler.CreateHotObservable(
  102. OnNext(150, 1),
  103. OnNext(210, 2),
  104. OnNext(220, 3),
  105. OnNext(230, 4),
  106. OnNext(240, 5),
  107. OnCompleted<int>(250)
  108. );
  109. var seed = 1;
  110. var res = scheduler.Start(() =>
  111. xs.Scan(seed, (acc, x) => acc + x)
  112. );
  113. res.Messages.AssertEqual(
  114. OnNext(210, seed + 2),
  115. OnNext(220, seed + 2 + 3),
  116. OnNext(230, seed + 2 + 3 + 4),
  117. OnNext(240, seed + 2 + 3 + 4 + 5),
  118. OnCompleted<int>(250)
  119. );
  120. xs.Subscriptions.AssertEqual(
  121. Subscribe(200, 250)
  122. );
  123. }
  124. [TestMethod]
  125. public void Scan_Seed_AccumulatorThrows()
  126. {
  127. var scheduler = new TestScheduler();
  128. var xs = scheduler.CreateHotObservable(
  129. OnNext(150, 1),
  130. OnNext(210, 2),
  131. OnNext(220, 3),
  132. OnNext(230, 4),
  133. OnNext(240, 5),
  134. OnCompleted<int>(250)
  135. );
  136. var ex = new Exception();
  137. var seed = 1;
  138. var res = scheduler.Start(() =>
  139. xs.Scan(seed, (acc, x) => { if (x == 4) { throw ex; } return acc + x; })
  140. );
  141. res.Messages.AssertEqual(
  142. OnNext(210, seed + 2),
  143. OnNext(220, seed + 2 + 3),
  144. OnError<int>(230, ex)
  145. );
  146. xs.Subscriptions.AssertEqual(
  147. Subscribe(200, 230)
  148. );
  149. }
  150. [TestMethod]
  151. public void Scan_NoSeed_Never()
  152. {
  153. var scheduler = new TestScheduler();
  154. var xs = scheduler.CreateHotObservable<int>();
  155. var res = scheduler.Start(() =>
  156. xs.Scan((acc, x) => acc + x)
  157. );
  158. res.Messages.AssertEqual(
  159. );
  160. xs.Subscriptions.AssertEqual(
  161. Subscribe(200, 1000)
  162. );
  163. }
  164. [TestMethod]
  165. public void Scan_NoSeed_Empty()
  166. {
  167. var scheduler = new TestScheduler();
  168. var xs = scheduler.CreateHotObservable(
  169. OnNext(150, 1),
  170. OnCompleted<int>(250)
  171. );
  172. var res = scheduler.Start(() =>
  173. xs.Scan((acc, x) => acc + x)
  174. );
  175. res.Messages.AssertEqual(
  176. OnCompleted<int>(250)
  177. );
  178. xs.Subscriptions.AssertEqual(
  179. Subscribe(200, 250)
  180. );
  181. }
  182. [TestMethod]
  183. public void Scan_NoSeed_Return()
  184. {
  185. var scheduler = new TestScheduler();
  186. var xs = scheduler.CreateHotObservable(
  187. OnNext(150, 1),
  188. OnNext(220, 2),
  189. OnCompleted<int>(250)
  190. );
  191. var res = scheduler.Start(() =>
  192. xs.Scan((acc, x) => acc + x)
  193. );
  194. res.Messages.AssertEqual(
  195. OnNext(220, 2),
  196. OnCompleted<int>(250)
  197. );
  198. xs.Subscriptions.AssertEqual(
  199. Subscribe(200, 250)
  200. );
  201. }
  202. [TestMethod]
  203. public void Scan_NoSeed_Throw()
  204. {
  205. var scheduler = new TestScheduler();
  206. var ex = new Exception();
  207. var xs = scheduler.CreateHotObservable(
  208. OnNext(150, 1),
  209. OnError<int>(250, ex)
  210. );
  211. var res = scheduler.Start(() =>
  212. xs.Scan((acc, x) => acc + x)
  213. );
  214. res.Messages.AssertEqual(
  215. OnError<int>(250, ex)
  216. );
  217. xs.Subscriptions.AssertEqual(
  218. Subscribe(200, 250)
  219. );
  220. }
  221. [TestMethod]
  222. public void Scan_NoSeed_SomeData()
  223. {
  224. var scheduler = new TestScheduler();
  225. var xs = scheduler.CreateHotObservable(
  226. OnNext(150, 1),
  227. OnNext(210, 2),
  228. OnNext(220, 3),
  229. OnNext(230, 4),
  230. OnNext(240, 5),
  231. OnCompleted<int>(250)
  232. );
  233. var res = scheduler.Start(() =>
  234. xs.Scan((acc, x) => acc + x)
  235. );
  236. res.Messages.AssertEqual(
  237. OnNext(210, 2),
  238. OnNext(220, 2 + 3),
  239. OnNext(230, 2 + 3 + 4),
  240. OnNext(240, 2 + 3 + 4 + 5),
  241. OnCompleted<int>(250)
  242. );
  243. xs.Subscriptions.AssertEqual(
  244. Subscribe(200, 250)
  245. );
  246. }
  247. [TestMethod]
  248. public void Scan_NoSeed_AccumulatorThrows()
  249. {
  250. var scheduler = new TestScheduler();
  251. var xs = scheduler.CreateHotObservable(
  252. OnNext(150, 1),
  253. OnNext(210, 2),
  254. OnNext(220, 3),
  255. OnNext(230, 4),
  256. OnNext(240, 5),
  257. OnCompleted<int>(250)
  258. );
  259. var ex = new Exception();
  260. var res = scheduler.Start(() =>
  261. xs.Scan((acc, x) => { if (x == 4) { throw ex; } return acc + x; })
  262. );
  263. res.Messages.AssertEqual(
  264. OnNext(210, 2),
  265. OnNext(220, 2 + 3),
  266. OnError<int>(230, ex)
  267. );
  268. xs.Subscriptions.AssertEqual(
  269. Subscribe(200, 230)
  270. );
  271. }
  272. }
  273. }