LongCountTest.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  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.Linq;
  6. using System.Reactive.Concurrency;
  7. using System.Reactive.Linq;
  8. using Microsoft.Reactive.Testing;
  9. using ReactiveTests.Dummies;
  10. using Xunit;
  11. namespace ReactiveTests.Tests
  12. {
  13. public class LongCountTest : ReactiveTest
  14. {
  15. [Fact]
  16. public void LongCount_ArgumentChecking()
  17. {
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(default(IObservable<int>)));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(default(IObservable<int>), _ => true));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(DummyObservable<int>.Instance, default));
  21. }
  22. [Fact]
  23. public void LongCount_Empty()
  24. {
  25. var scheduler = new TestScheduler();
  26. var xs = scheduler.CreateHotObservable(
  27. OnNext(150, 1),
  28. OnCompleted<int>(250)
  29. );
  30. var res = scheduler.Start(() =>
  31. xs.LongCount()
  32. );
  33. res.Messages.AssertEqual(
  34. OnNext(250, 0L),
  35. OnCompleted<long>(250)
  36. );
  37. xs.Subscriptions.AssertEqual(
  38. Subscribe(200, 250)
  39. );
  40. }
  41. [Fact]
  42. public void LongCount_Return()
  43. {
  44. var scheduler = new TestScheduler();
  45. var xs = scheduler.CreateHotObservable(
  46. OnNext(150, 1),
  47. OnNext(210, 2),
  48. OnCompleted<int>(250)
  49. );
  50. var res = scheduler.Start(() =>
  51. xs.LongCount()
  52. );
  53. res.Messages.AssertEqual(
  54. OnNext(250, 1L),
  55. OnCompleted<long>(250)
  56. );
  57. xs.Subscriptions.AssertEqual(
  58. Subscribe(200, 250)
  59. );
  60. }
  61. [Fact]
  62. public void LongCount_Some()
  63. {
  64. var scheduler = new TestScheduler();
  65. var xs = scheduler.CreateHotObservable(
  66. OnNext(150, 1),
  67. OnNext(210, 2),
  68. OnNext(220, 3),
  69. OnNext(230, 4),
  70. OnCompleted<int>(250)
  71. );
  72. var res = scheduler.Start(() =>
  73. xs.LongCount()
  74. );
  75. res.Messages.AssertEqual(
  76. OnNext(250, 3L),
  77. OnCompleted<long>(250)
  78. );
  79. xs.Subscriptions.AssertEqual(
  80. Subscribe(200, 250)
  81. );
  82. }
  83. [Fact]
  84. public void LongCount_Throw()
  85. {
  86. var ex = new Exception();
  87. var scheduler = new TestScheduler();
  88. var xs = scheduler.CreateHotObservable(
  89. OnNext(150, 1),
  90. OnError<int>(210, ex)
  91. );
  92. var res = scheduler.Start(() =>
  93. xs.LongCount()
  94. );
  95. res.Messages.AssertEqual(
  96. OnError<long>(210, ex)
  97. );
  98. xs.Subscriptions.AssertEqual(
  99. Subscribe(200, 210)
  100. );
  101. }
  102. [Fact]
  103. public void LongCount_Never()
  104. {
  105. var scheduler = new TestScheduler();
  106. var xs = scheduler.CreateHotObservable(
  107. OnNext(150, 1)
  108. );
  109. var res = scheduler.Start(() =>
  110. xs.LongCount()
  111. );
  112. res.Messages.AssertEqual(
  113. );
  114. xs.Subscriptions.AssertEqual(
  115. Subscribe(200, 1000)
  116. );
  117. }
  118. #if !NO_PERF && !NO_THREAD
  119. [Fact]
  120. public void LongCount_InjectOverflow()
  121. {
  122. var xs = Observable.Return(42, ThreadPoolScheduler.Instance);
  123. var res = new OverflowInjection<int>(xs, long.MaxValue).LongCount();
  124. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  125. }
  126. #endif
  127. [Fact]
  128. public void LongCount_Predicate_Empty_True()
  129. {
  130. var scheduler = new TestScheduler();
  131. var xs = scheduler.CreateHotObservable(
  132. OnNext(150, 1),
  133. OnCompleted<int>(250)
  134. );
  135. var res = scheduler.Start(() =>
  136. xs.LongCount(_ => true)
  137. );
  138. res.Messages.AssertEqual(
  139. OnNext(250, 0L),
  140. OnCompleted<long>(250)
  141. );
  142. xs.Subscriptions.AssertEqual(
  143. Subscribe(200, 250)
  144. );
  145. }
  146. [Fact]
  147. public void LongCount_Predicate_Empty_False()
  148. {
  149. var scheduler = new TestScheduler();
  150. var xs = scheduler.CreateHotObservable(
  151. OnNext(150, 1),
  152. OnCompleted<int>(250)
  153. );
  154. var res = scheduler.Start(() =>
  155. xs.LongCount(_ => false)
  156. );
  157. res.Messages.AssertEqual(
  158. OnNext(250, 0L),
  159. OnCompleted<long>(250)
  160. );
  161. xs.Subscriptions.AssertEqual(
  162. Subscribe(200, 250)
  163. );
  164. }
  165. [Fact]
  166. public void LongCount_Predicate_Return_True()
  167. {
  168. var scheduler = new TestScheduler();
  169. var xs = scheduler.CreateHotObservable(
  170. OnNext(150, 1),
  171. OnNext(210, 2),
  172. OnCompleted<int>(250)
  173. );
  174. var res = scheduler.Start(() =>
  175. xs.LongCount(_ => true)
  176. );
  177. res.Messages.AssertEqual(
  178. OnNext(250, 1L),
  179. OnCompleted<long>(250)
  180. );
  181. xs.Subscriptions.AssertEqual(
  182. Subscribe(200, 250)
  183. );
  184. }
  185. [Fact]
  186. public void LongCount_Predicate_Return_False()
  187. {
  188. var scheduler = new TestScheduler();
  189. var xs = scheduler.CreateHotObservable(
  190. OnNext(150, 1),
  191. OnNext(210, 2),
  192. OnCompleted<int>(250)
  193. );
  194. var res = scheduler.Start(() =>
  195. xs.LongCount(_ => false)
  196. );
  197. res.Messages.AssertEqual(
  198. OnNext(250, 0L),
  199. OnCompleted<long>(250)
  200. );
  201. xs.Subscriptions.AssertEqual(
  202. Subscribe(200, 250)
  203. );
  204. }
  205. [Fact]
  206. public void LongCount_Predicate_Some_All()
  207. {
  208. var scheduler = new TestScheduler();
  209. var xs = scheduler.CreateHotObservable(
  210. OnNext(150, 1),
  211. OnNext(210, 2),
  212. OnNext(220, 3),
  213. OnNext(230, 4),
  214. OnCompleted<int>(250)
  215. );
  216. var res = scheduler.Start(() =>
  217. xs.LongCount(x => x < 10)
  218. );
  219. res.Messages.AssertEqual(
  220. OnNext(250, 3L),
  221. OnCompleted<long>(250)
  222. );
  223. xs.Subscriptions.AssertEqual(
  224. Subscribe(200, 250)
  225. );
  226. }
  227. [Fact]
  228. public void LongCount_Predicate_Some_None()
  229. {
  230. var scheduler = new TestScheduler();
  231. var xs = scheduler.CreateHotObservable(
  232. OnNext(150, 1),
  233. OnNext(210, 2),
  234. OnNext(220, 3),
  235. OnNext(230, 4),
  236. OnCompleted<int>(250)
  237. );
  238. var res = scheduler.Start(() =>
  239. xs.LongCount(x => x > 10)
  240. );
  241. res.Messages.AssertEqual(
  242. OnNext(250, 0L),
  243. OnCompleted<long>(250)
  244. );
  245. xs.Subscriptions.AssertEqual(
  246. Subscribe(200, 250)
  247. );
  248. }
  249. [Fact]
  250. public void LongCount_Predicate_Some_Even()
  251. {
  252. var scheduler = new TestScheduler();
  253. var xs = scheduler.CreateHotObservable(
  254. OnNext(150, 1),
  255. OnNext(210, 2),
  256. OnNext(220, 3),
  257. OnNext(230, 4),
  258. OnCompleted<int>(250)
  259. );
  260. var res = scheduler.Start(() =>
  261. xs.LongCount(x => x % 2 == 0)
  262. );
  263. res.Messages.AssertEqual(
  264. OnNext(250, 2L),
  265. OnCompleted<long>(250)
  266. );
  267. xs.Subscriptions.AssertEqual(
  268. Subscribe(200, 250)
  269. );
  270. }
  271. [Fact]
  272. public void LongCount_Predicate_Throw_True()
  273. {
  274. var ex = new Exception();
  275. var scheduler = new TestScheduler();
  276. var xs = scheduler.CreateHotObservable(
  277. OnNext(150, 1),
  278. OnError<int>(210, ex)
  279. );
  280. var res = scheduler.Start(() =>
  281. xs.LongCount(_ => true)
  282. );
  283. res.Messages.AssertEqual(
  284. OnError<long>(210, ex)
  285. );
  286. xs.Subscriptions.AssertEqual(
  287. Subscribe(200, 210)
  288. );
  289. }
  290. [Fact]
  291. public void LongCount_Predicate_Throw_False()
  292. {
  293. var ex = new Exception();
  294. var scheduler = new TestScheduler();
  295. var xs = scheduler.CreateHotObservable(
  296. OnNext(150, 1),
  297. OnError<int>(210, ex)
  298. );
  299. var res = scheduler.Start(() =>
  300. xs.LongCount(_ => false)
  301. );
  302. res.Messages.AssertEqual(
  303. OnError<long>(210, ex)
  304. );
  305. xs.Subscriptions.AssertEqual(
  306. Subscribe(200, 210)
  307. );
  308. }
  309. [Fact]
  310. public void LongCount_Predicate_Never()
  311. {
  312. var scheduler = new TestScheduler();
  313. var xs = scheduler.CreateHotObservable(
  314. OnNext(150, 1)
  315. );
  316. var res = scheduler.Start(() =>
  317. xs.LongCount(_ => true)
  318. );
  319. res.Messages.AssertEqual(
  320. );
  321. xs.Subscriptions.AssertEqual(
  322. Subscribe(200, 1000)
  323. );
  324. }
  325. [Fact]
  326. public void LongCount_Predicate_PredicateThrows()
  327. {
  328. var scheduler = new TestScheduler();
  329. var xs = scheduler.CreateHotObservable(
  330. OnNext(150, 1),
  331. OnNext(210, 2),
  332. OnNext(230, 3),
  333. OnCompleted<int>(240)
  334. );
  335. var ex = new Exception();
  336. var res = scheduler.Start(() =>
  337. xs.LongCount(x =>
  338. {
  339. if (x == 3)
  340. {
  341. throw ex;
  342. }
  343. return true;
  344. })
  345. );
  346. res.Messages.AssertEqual(
  347. OnError<long>(230, ex)
  348. );
  349. xs.Subscriptions.AssertEqual(
  350. Subscribe(200, 230)
  351. );
  352. }
  353. #if !NO_PERF && !NO_THREAD && !CRIPPLED_REFLECTION
  354. [Fact]
  355. public void LongCount_Predicate_InjectOverflow()
  356. {
  357. var xs = Observable.Return(42, ThreadPoolScheduler.Instance);
  358. var res = new OverflowInjection<int>(xs, long.MaxValue).LongCount(_ => true);
  359. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  360. }
  361. #endif
  362. }
  363. }