ScanTest.cs 9.0 KB

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