SkipWhileTest.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  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 SkipWhileTest : ReactiveTest
  22. {
  23. [Fact]
  24. public void SkipWhile_ArgumentChecking()
  25. {
  26. ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SkipWhile(DummyFunc<int, bool>.Instance));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SkipWhile(default(Func<int, bool>)));
  28. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SkipWhile(DummyFunc<int, bool>.Instance).Subscribe(null));
  29. ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SkipWhile((x, i) => true));
  30. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SkipWhile(default(Func<int, int, bool>)));
  31. }
  32. [Fact]
  33. public void SkipWhile_Complete_Before()
  34. {
  35. var scheduler = new TestScheduler();
  36. var xs = scheduler.CreateHotObservable(
  37. OnNext(90, -1),
  38. OnNext(110, -1),
  39. OnNext(210, 2),
  40. OnNext(260, 5),
  41. OnNext(290, 13),
  42. OnNext(320, 3),
  43. OnCompleted<int>(330),
  44. OnNext(350, 7),
  45. OnNext(390, 4),
  46. OnNext(410, 17),
  47. OnNext(450, 8),
  48. OnNext(500, 23),
  49. OnCompleted<int>(600)
  50. );
  51. var invoked = 0;
  52. var res = scheduler.Start(() =>
  53. xs.SkipWhile(x =>
  54. {
  55. invoked++;
  56. return IsPrime(x);
  57. })
  58. );
  59. res.Messages.AssertEqual(
  60. OnCompleted<int>(330)
  61. );
  62. xs.Subscriptions.AssertEqual(
  63. Subscribe(200, 330)
  64. );
  65. Assert.Equal(4, invoked);
  66. }
  67. [Fact]
  68. public void SkipWhile_Complete_After()
  69. {
  70. var scheduler = new TestScheduler();
  71. var xs = scheduler.CreateHotObservable(
  72. OnNext(90, -1),
  73. OnNext(110, -1),
  74. OnNext(210, 2),
  75. OnNext(260, 5),
  76. OnNext(290, 13),
  77. OnNext(320, 3),
  78. OnNext(350, 7),
  79. OnNext(390, 4),
  80. OnNext(410, 17),
  81. OnNext(450, 8),
  82. OnNext(500, 23),
  83. OnCompleted<int>(600)
  84. );
  85. var invoked = 0;
  86. var res = scheduler.Start(() =>
  87. xs.SkipWhile(x =>
  88. {
  89. invoked++;
  90. return IsPrime(x);
  91. })
  92. );
  93. res.Messages.AssertEqual(
  94. OnNext(390, 4),
  95. OnNext(410, 17),
  96. OnNext(450, 8),
  97. OnNext(500, 23),
  98. OnCompleted<int>(600)
  99. );
  100. xs.Subscriptions.AssertEqual(
  101. Subscribe(200, 600)
  102. );
  103. Assert.Equal(6, invoked);
  104. }
  105. [Fact]
  106. public void SkipWhile_Error_Before()
  107. {
  108. var scheduler = new TestScheduler();
  109. var ex = new Exception();
  110. var xs = scheduler.CreateHotObservable(
  111. OnNext(90, -1),
  112. OnNext(110, -1),
  113. OnNext(210, 2),
  114. OnNext(260, 5),
  115. OnError<int>(270, ex),
  116. OnNext(290, 13),
  117. OnNext(320, 3),
  118. OnNext(350, 7),
  119. OnNext(390, 4),
  120. OnNext(410, 17),
  121. OnNext(450, 8),
  122. OnNext(500, 23)
  123. );
  124. var invoked = 0;
  125. var res = scheduler.Start(() =>
  126. xs.SkipWhile(x =>
  127. {
  128. invoked++;
  129. return IsPrime(x);
  130. })
  131. );
  132. res.Messages.AssertEqual(
  133. OnError<int>(270, ex)
  134. );
  135. xs.Subscriptions.AssertEqual(
  136. Subscribe(200, 270)
  137. );
  138. Assert.Equal(2, invoked);
  139. }
  140. [Fact]
  141. public void SkipWhile_Error_After()
  142. {
  143. var scheduler = new TestScheduler();
  144. var ex = new Exception();
  145. var xs = scheduler.CreateHotObservable(
  146. OnNext(90, -1),
  147. OnNext(110, -1),
  148. OnNext(210, 2),
  149. OnNext(260, 5),
  150. OnNext(290, 13),
  151. OnNext(320, 3),
  152. OnNext(350, 7),
  153. OnNext(390, 4),
  154. OnNext(410, 17),
  155. OnNext(450, 8),
  156. OnNext(500, 23),
  157. OnError<int>(600, ex)
  158. );
  159. var invoked = 0;
  160. var res = scheduler.Start(() =>
  161. xs.SkipWhile(x =>
  162. {
  163. invoked++;
  164. return IsPrime(x);
  165. })
  166. );
  167. res.Messages.AssertEqual(
  168. OnNext(390, 4),
  169. OnNext(410, 17),
  170. OnNext(450, 8),
  171. OnNext(500, 23),
  172. OnError<int>(600, ex)
  173. );
  174. xs.Subscriptions.AssertEqual(
  175. Subscribe(200, 600)
  176. );
  177. Assert.Equal(6, invoked);
  178. }
  179. [Fact]
  180. public void SkipWhile_Dispose_Before()
  181. {
  182. var scheduler = new TestScheduler();
  183. var xs = scheduler.CreateHotObservable(
  184. OnNext(90, -1),
  185. OnNext(110, -1),
  186. OnNext(210, 2),
  187. OnNext(260, 5),
  188. OnNext(290, 13),
  189. OnNext(320, 3),
  190. OnNext(350, 7),
  191. OnNext(390, 4),
  192. OnNext(410, 17),
  193. OnNext(450, 8),
  194. OnNext(500, 23),
  195. OnCompleted<int>(600)
  196. );
  197. var invoked = 0;
  198. var res = scheduler.Start(() =>
  199. xs.SkipWhile(x =>
  200. {
  201. invoked++;
  202. return IsPrime(x);
  203. }),
  204. 300
  205. );
  206. res.Messages.AssertEqual(
  207. );
  208. xs.Subscriptions.AssertEqual(
  209. Subscribe(200, 300)
  210. );
  211. Assert.Equal(3, invoked);
  212. }
  213. [Fact]
  214. public void SkipWhile_Dispose_After()
  215. {
  216. var scheduler = new TestScheduler();
  217. var xs = scheduler.CreateHotObservable(
  218. OnNext(90, -1),
  219. OnNext(110, -1),
  220. OnNext(210, 2),
  221. OnNext(260, 5),
  222. OnNext(290, 13),
  223. OnNext(320, 3),
  224. OnNext(350, 7),
  225. OnNext(390, 4),
  226. OnNext(410, 17),
  227. OnNext(450, 8),
  228. OnNext(500, 23),
  229. OnCompleted<int>(600)
  230. );
  231. var invoked = 0;
  232. var res = scheduler.Start(() =>
  233. xs.SkipWhile(x =>
  234. {
  235. invoked++;
  236. return IsPrime(x);
  237. }),
  238. 470
  239. );
  240. res.Messages.AssertEqual(
  241. OnNext(390, 4),
  242. OnNext(410, 17),
  243. OnNext(450, 8)
  244. );
  245. xs.Subscriptions.AssertEqual(
  246. Subscribe(200, 470)
  247. );
  248. Assert.Equal(6, invoked);
  249. }
  250. [Fact]
  251. public void SkipWhile_Zero()
  252. {
  253. var scheduler = new TestScheduler();
  254. var xs = scheduler.CreateHotObservable(
  255. OnNext(90, -1),
  256. OnNext(110, -1),
  257. OnNext(205, 100),
  258. OnNext(210, 2),
  259. OnNext(260, 5),
  260. OnNext(290, 13),
  261. OnNext(320, 3),
  262. OnNext(350, 7),
  263. OnNext(390, 4),
  264. OnNext(410, 17),
  265. OnNext(450, 8),
  266. OnNext(500, 23),
  267. OnCompleted<int>(600)
  268. );
  269. var invoked = 0;
  270. var res = scheduler.Start(() =>
  271. xs.SkipWhile(x =>
  272. {
  273. invoked++;
  274. return IsPrime(x);
  275. })
  276. );
  277. res.Messages.AssertEqual(
  278. OnNext(205, 100),
  279. OnNext(210, 2),
  280. OnNext(260, 5),
  281. OnNext(290, 13),
  282. OnNext(320, 3),
  283. OnNext(350, 7),
  284. OnNext(390, 4),
  285. OnNext(410, 17),
  286. OnNext(450, 8),
  287. OnNext(500, 23),
  288. OnCompleted<int>(600)
  289. );
  290. xs.Subscriptions.AssertEqual(
  291. Subscribe(200, 600)
  292. );
  293. Assert.Equal(1, invoked);
  294. }
  295. [Fact]
  296. public void SkipWhile_Throw()
  297. {
  298. var scheduler = new TestScheduler();
  299. var xs = scheduler.CreateHotObservable(
  300. OnNext(90, -1),
  301. OnNext(110, -1),
  302. OnNext(210, 2),
  303. OnNext(260, 5),
  304. OnNext(290, 13),
  305. OnNext(320, 3),
  306. OnNext(350, 7),
  307. OnNext(390, 4),
  308. OnNext(410, 17),
  309. OnNext(450, 8),
  310. OnNext(500, 23),
  311. OnCompleted<int>(600)
  312. );
  313. var invoked = 0;
  314. var ex = new Exception();
  315. var res = scheduler.Start(() =>
  316. xs.SkipWhile(x =>
  317. {
  318. invoked++;
  319. if (invoked == 3)
  320. throw ex;
  321. return IsPrime(x);
  322. })
  323. );
  324. res.Messages.AssertEqual(
  325. OnError<int>(290, ex)
  326. );
  327. xs.Subscriptions.AssertEqual(
  328. Subscribe(200, 290)
  329. );
  330. Assert.Equal(3, invoked);
  331. }
  332. [Fact]
  333. public void SkipWhile_Index()
  334. {
  335. var scheduler = new TestScheduler();
  336. var xs = scheduler.CreateHotObservable(
  337. OnNext(90, -1),
  338. OnNext(110, -1),
  339. OnNext(205, 100),
  340. OnNext(210, 2),
  341. OnNext(260, 5),
  342. OnNext(290, 13),
  343. OnNext(320, 3),
  344. OnNext(350, 7),
  345. OnNext(390, 4),
  346. OnNext(410, 17),
  347. OnNext(450, 8),
  348. OnNext(500, 23),
  349. OnCompleted<int>(600)
  350. );
  351. var res = scheduler.Start(() =>
  352. xs.SkipWhile((x, i) => i < 5)
  353. );
  354. res.Messages.AssertEqual(
  355. OnNext(350, 7),
  356. OnNext(390, 4),
  357. OnNext(410, 17),
  358. OnNext(450, 8),
  359. OnNext(500, 23),
  360. OnCompleted<int>(600)
  361. );
  362. xs.Subscriptions.AssertEqual(
  363. Subscribe(200, 600)
  364. );
  365. }
  366. [Fact]
  367. public void SkipWhile_Index_Throw()
  368. {
  369. var scheduler = new TestScheduler();
  370. var ex = new Exception();
  371. var xs = scheduler.CreateHotObservable(
  372. OnNext(90, -1),
  373. OnNext(110, -1),
  374. OnNext(205, 100),
  375. OnNext(210, 2),
  376. OnNext(260, 5),
  377. OnNext(290, 13),
  378. OnNext(320, 3),
  379. OnNext(350, 7),
  380. OnNext(390, 4),
  381. OnError<int>(400, ex)
  382. );
  383. var res = scheduler.Start(() =>
  384. xs.SkipWhile((x, i) => i < 5)
  385. );
  386. res.Messages.AssertEqual(
  387. OnNext(350, 7),
  388. OnNext(390, 4),
  389. OnError<int>(400, ex)
  390. );
  391. xs.Subscriptions.AssertEqual(
  392. Subscribe(200, 400)
  393. );
  394. }
  395. [Fact]
  396. public void SkipWhile_Index_SelectorThrows()
  397. {
  398. var scheduler = new TestScheduler();
  399. var ex = new Exception();
  400. var xs = scheduler.CreateHotObservable(
  401. OnNext(90, -1),
  402. OnNext(110, -1),
  403. OnNext(205, 100),
  404. OnNext(210, 2),
  405. OnNext(260, 5),
  406. OnNext(290, 13),
  407. OnNext(320, 3),
  408. OnNext(350, 7),
  409. OnNext(390, 4),
  410. OnCompleted<int>(400)
  411. );
  412. var res = scheduler.Start(() =>
  413. xs.SkipWhile((x, i) => { if (i < 5) return true; throw ex; })
  414. );
  415. res.Messages.AssertEqual(
  416. OnError<int>(350, ex)
  417. );
  418. xs.Subscriptions.AssertEqual(
  419. Subscribe(200, 350)
  420. );
  421. }
  422. static bool IsPrime(int i)
  423. {
  424. if (i <= 1)
  425. return false;
  426. var max = (int)Math.Sqrt(i);
  427. for (var j = 2; j <= max; ++j)
  428. if (i % j == 0)
  429. return false;
  430. return true;
  431. }
  432. }
  433. }