LongCountTest.cs 11 KB

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