ScanTest.cs 8.8 KB

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