TakeWhileTest.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  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.Linq;
  7. using Microsoft.Reactive.Testing;
  8. using ReactiveTests.Dummies;
  9. using Microsoft.VisualStudio.TestTools.UnitTesting;
  10. using Assert = Xunit.Assert;
  11. namespace ReactiveTests.Tests
  12. {
  13. [TestClass]
  14. public class TakeWhileTest : ReactiveTest
  15. {
  16. [TestMethod]
  17. public void TakeWhile_ArgumentChecking()
  18. {
  19. ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).TakeWhile(DummyFunc<int, bool>.Instance));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.TakeWhile(default(Func<int, bool>)));
  21. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.TakeWhile(DummyFunc<int, bool>.Instance).Subscribe(null));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).TakeWhile((x, i) => true));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.TakeWhile(default(Func<int, int, bool>)));
  24. }
  25. [TestMethod]
  26. public void TakeWhile_Complete_Before()
  27. {
  28. var scheduler = new TestScheduler();
  29. var xs = scheduler.CreateHotObservable(
  30. OnNext(90, -1),
  31. OnNext(110, -1),
  32. OnNext(210, 2),
  33. OnNext(260, 5),
  34. OnNext(290, 13),
  35. OnNext(320, 3),
  36. OnCompleted<int>(330),
  37. OnNext(350, 7),
  38. OnNext(390, 4),
  39. OnNext(410, 17),
  40. OnNext(450, 8),
  41. OnNext(500, 23),
  42. OnCompleted<int>(600)
  43. );
  44. var invoked = 0;
  45. var res = scheduler.Start(() =>
  46. xs.TakeWhile(x =>
  47. {
  48. invoked++;
  49. return IsPrime(x);
  50. })
  51. );
  52. res.Messages.AssertEqual(
  53. OnNext(210, 2),
  54. OnNext(260, 5),
  55. OnNext(290, 13),
  56. OnNext(320, 3),
  57. OnCompleted<int>(330)
  58. );
  59. xs.Subscriptions.AssertEqual(
  60. Subscribe(200, 330)
  61. );
  62. Assert.Equal(4, invoked);
  63. }
  64. [TestMethod]
  65. public void TakeWhile_Complete_After()
  66. {
  67. var scheduler = new TestScheduler();
  68. var xs = scheduler.CreateHotObservable(
  69. OnNext(90, -1),
  70. OnNext(110, -1),
  71. OnNext(210, 2),
  72. OnNext(260, 5),
  73. OnNext(290, 13),
  74. OnNext(320, 3),
  75. OnNext(350, 7),
  76. OnNext(390, 4),
  77. OnNext(410, 17),
  78. OnNext(450, 8),
  79. OnNext(500, 23),
  80. OnCompleted<int>(600)
  81. );
  82. var invoked = 0;
  83. var res = scheduler.Start(() =>
  84. xs.TakeWhile(x =>
  85. {
  86. invoked++;
  87. return IsPrime(x);
  88. })
  89. );
  90. res.Messages.AssertEqual(
  91. OnNext(210, 2),
  92. OnNext(260, 5),
  93. OnNext(290, 13),
  94. OnNext(320, 3),
  95. OnNext(350, 7),
  96. OnCompleted<int>(390)
  97. );
  98. xs.Subscriptions.AssertEqual(
  99. Subscribe(200, 390)
  100. );
  101. Assert.Equal(6, invoked);
  102. }
  103. [TestMethod]
  104. public void TakeWhile_Error_Before()
  105. {
  106. var scheduler = new TestScheduler();
  107. var ex = new Exception();
  108. var xs = scheduler.CreateHotObservable(
  109. OnNext(90, -1),
  110. OnNext(110, -1),
  111. OnNext(210, 2),
  112. OnNext(260, 5),
  113. OnError<int>(270, ex),
  114. OnNext(290, 13),
  115. OnNext(320, 3),
  116. OnNext(350, 7),
  117. OnNext(390, 4),
  118. OnNext(410, 17),
  119. OnNext(450, 8),
  120. OnNext(500, 23)
  121. );
  122. var invoked = 0;
  123. var res = scheduler.Start(() =>
  124. xs.TakeWhile(x =>
  125. {
  126. invoked++;
  127. return IsPrime(x);
  128. })
  129. );
  130. res.Messages.AssertEqual(
  131. OnNext(210, 2),
  132. OnNext(260, 5),
  133. OnError<int>(270, ex)
  134. );
  135. xs.Subscriptions.AssertEqual(
  136. Subscribe(200, 270)
  137. );
  138. Assert.Equal(2, invoked);
  139. }
  140. [TestMethod]
  141. public void TakeWhile_Error_After()
  142. {
  143. var scheduler = new TestScheduler();
  144. var xs = scheduler.CreateHotObservable(
  145. OnNext(90, -1),
  146. OnNext(110, -1),
  147. OnNext(210, 2),
  148. OnNext(260, 5),
  149. OnNext(290, 13),
  150. OnNext(320, 3),
  151. OnNext(350, 7),
  152. OnNext(390, 4),
  153. OnNext(410, 17),
  154. OnNext(450, 8),
  155. OnNext(500, 23),
  156. OnError<int>(600, new Exception())
  157. );
  158. var invoked = 0;
  159. var res = scheduler.Start(() =>
  160. xs.TakeWhile(x =>
  161. {
  162. invoked++;
  163. return IsPrime(x);
  164. })
  165. );
  166. res.Messages.AssertEqual(
  167. OnNext(210, 2),
  168. OnNext(260, 5),
  169. OnNext(290, 13),
  170. OnNext(320, 3),
  171. OnNext(350, 7),
  172. OnCompleted<int>(390)
  173. );
  174. xs.Subscriptions.AssertEqual(
  175. Subscribe(200, 390)
  176. );
  177. Assert.Equal(6, invoked);
  178. }
  179. [TestMethod]
  180. public void TakeWhile_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.TakeWhile(x =>
  200. {
  201. invoked++;
  202. return IsPrime(x);
  203. }),
  204. 300
  205. );
  206. res.Messages.AssertEqual(
  207. OnNext(210, 2),
  208. OnNext(260, 5),
  209. OnNext(290, 13)
  210. );
  211. xs.Subscriptions.AssertEqual(
  212. Subscribe(200, 300)
  213. );
  214. Assert.Equal(3, invoked);
  215. }
  216. [TestMethod]
  217. public void TakeWhile_Dispose_After()
  218. {
  219. var scheduler = new TestScheduler();
  220. var xs = scheduler.CreateHotObservable(
  221. OnNext(90, -1),
  222. OnNext(110, -1),
  223. OnNext(210, 2),
  224. OnNext(260, 5),
  225. OnNext(290, 13),
  226. OnNext(320, 3),
  227. OnNext(350, 7),
  228. OnNext(390, 4),
  229. OnNext(410, 17),
  230. OnNext(450, 8),
  231. OnNext(500, 23),
  232. OnCompleted<int>(600)
  233. );
  234. var invoked = 0;
  235. var res = scheduler.Start(() =>
  236. xs.TakeWhile(x =>
  237. {
  238. invoked++;
  239. return IsPrime(x);
  240. }),
  241. 400
  242. );
  243. res.Messages.AssertEqual(
  244. OnNext(210, 2),
  245. OnNext(260, 5),
  246. OnNext(290, 13),
  247. OnNext(320, 3),
  248. OnNext(350, 7),
  249. OnCompleted<int>(390)
  250. );
  251. xs.Subscriptions.AssertEqual(
  252. Subscribe(200, 390)
  253. );
  254. Assert.Equal(6, invoked);
  255. }
  256. [TestMethod]
  257. public void TakeWhile_Zero()
  258. {
  259. var scheduler = new TestScheduler();
  260. var xs = scheduler.CreateHotObservable(
  261. OnNext(90, -1),
  262. OnNext(110, -1),
  263. OnNext(205, 100),
  264. OnNext(210, 2),
  265. OnNext(260, 5),
  266. OnNext(290, 13),
  267. OnNext(320, 3),
  268. OnNext(350, 7),
  269. OnNext(390, 4),
  270. OnNext(410, 17),
  271. OnNext(450, 8),
  272. OnNext(500, 23),
  273. OnCompleted<int>(600)
  274. );
  275. var invoked = 0;
  276. var res = scheduler.Start(() =>
  277. xs.TakeWhile(x =>
  278. {
  279. invoked++;
  280. return IsPrime(x);
  281. }),
  282. 300
  283. );
  284. res.Messages.AssertEqual(
  285. OnCompleted<int>(205)
  286. );
  287. xs.Subscriptions.AssertEqual(
  288. Subscribe(200, 205)
  289. );
  290. Assert.Equal(1, invoked);
  291. }
  292. [TestMethod]
  293. public void TakeWhile_Throw()
  294. {
  295. var scheduler = new TestScheduler();
  296. var xs = scheduler.CreateHotObservable(
  297. OnNext(90, -1),
  298. OnNext(110, -1),
  299. OnNext(210, 2),
  300. OnNext(260, 5),
  301. OnNext(290, 13),
  302. OnNext(320, 3),
  303. OnNext(350, 7),
  304. OnNext(390, 4),
  305. OnNext(410, 17),
  306. OnNext(450, 8),
  307. OnNext(500, 23),
  308. OnCompleted<int>(600)
  309. );
  310. var invoked = 0;
  311. var ex = new Exception();
  312. var res = scheduler.Start(() =>
  313. xs.TakeWhile(x =>
  314. {
  315. invoked++;
  316. if (invoked == 3)
  317. {
  318. throw ex;
  319. }
  320. return IsPrime(x);
  321. })
  322. );
  323. res.Messages.AssertEqual(
  324. OnNext(210, 2),
  325. OnNext(260, 5),
  326. OnError<int>(290, ex)
  327. );
  328. xs.Subscriptions.AssertEqual(
  329. Subscribe(200, 290)
  330. );
  331. Assert.Equal(3, invoked);
  332. }
  333. [TestMethod]
  334. public void TakeWhile_Index1()
  335. {
  336. var scheduler = new TestScheduler();
  337. var xs = scheduler.CreateHotObservable(
  338. OnNext(90, -1),
  339. OnNext(110, -1),
  340. OnNext(205, 100),
  341. OnNext(210, 2),
  342. OnNext(260, 5),
  343. OnNext(290, 13),
  344. OnNext(320, 3),
  345. OnNext(350, 7),
  346. OnNext(390, 4),
  347. OnNext(410, 17),
  348. OnNext(450, 8),
  349. OnNext(500, 23),
  350. OnCompleted<int>(600)
  351. );
  352. var res = scheduler.Start(() =>
  353. xs.TakeWhile((x, i) => i < 5)
  354. );
  355. res.Messages.AssertEqual(
  356. OnNext(205, 100),
  357. OnNext(210, 2),
  358. OnNext(260, 5),
  359. OnNext(290, 13),
  360. OnNext(320, 3),
  361. OnCompleted<int>(350)
  362. );
  363. xs.Subscriptions.AssertEqual(
  364. Subscribe(200, 350)
  365. );
  366. }
  367. [TestMethod]
  368. public void TakeWhile_Index2()
  369. {
  370. var scheduler = new TestScheduler();
  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. OnCompleted<int>(400)
  382. );
  383. var res = scheduler.Start(() =>
  384. xs.TakeWhile((x, i) => i >= 0)
  385. );
  386. res.Messages.AssertEqual(
  387. OnNext(205, 100),
  388. OnNext(210, 2),
  389. OnNext(260, 5),
  390. OnNext(290, 13),
  391. OnNext(320, 3),
  392. OnNext(350, 7),
  393. OnNext(390, 4),
  394. OnCompleted<int>(400)
  395. );
  396. xs.Subscriptions.AssertEqual(
  397. Subscribe(200, 400)
  398. );
  399. }
  400. [TestMethod]
  401. public void TakeWhile_Index_Throw()
  402. {
  403. var scheduler = new TestScheduler();
  404. var ex = new Exception();
  405. var xs = scheduler.CreateHotObservable(
  406. OnNext(90, -1),
  407. OnNext(110, -1),
  408. OnNext(205, 100),
  409. OnNext(210, 2),
  410. OnNext(260, 5),
  411. OnNext(290, 13),
  412. OnNext(320, 3),
  413. OnNext(350, 7),
  414. OnNext(390, 4),
  415. OnError<int>(400, ex)
  416. );
  417. var res = scheduler.Start(() =>
  418. xs.TakeWhile((x, i) => i >= 0)
  419. );
  420. res.Messages.AssertEqual(
  421. OnNext(205, 100),
  422. OnNext(210, 2),
  423. OnNext(260, 5),
  424. OnNext(290, 13),
  425. OnNext(320, 3),
  426. OnNext(350, 7),
  427. OnNext(390, 4),
  428. OnError<int>(400, ex)
  429. );
  430. xs.Subscriptions.AssertEqual(
  431. Subscribe(200, 400)
  432. );
  433. }
  434. [TestMethod]
  435. public void TakeWhile_Index_SelectorThrows()
  436. {
  437. var scheduler = new TestScheduler();
  438. var ex = new Exception();
  439. var xs = scheduler.CreateHotObservable(
  440. OnNext(90, -1),
  441. OnNext(110, -1),
  442. OnNext(205, 100),
  443. OnNext(210, 2),
  444. OnNext(260, 5),
  445. OnNext(290, 13),
  446. OnNext(320, 3),
  447. OnNext(350, 7),
  448. OnNext(390, 4),
  449. OnCompleted<int>(400)
  450. );
  451. var res = scheduler.Start(() =>
  452. xs.TakeWhile((x, i) => { if (i < 5) { return true; } throw ex; })
  453. );
  454. res.Messages.AssertEqual(
  455. OnNext(205, 100),
  456. OnNext(210, 2),
  457. OnNext(260, 5),
  458. OnNext(290, 13),
  459. OnNext(320, 3),
  460. OnError<int>(350, ex)
  461. );
  462. xs.Subscriptions.AssertEqual(
  463. Subscribe(200, 350)
  464. );
  465. }
  466. private static bool IsPrime(int i)
  467. {
  468. if (i <= 1)
  469. {
  470. return false;
  471. }
  472. var max = (int)Math.Sqrt(i);
  473. for (var j = 2; j <= max; ++j)
  474. {
  475. if (i % j == 0)
  476. {
  477. return false;
  478. }
  479. }
  480. return true;
  481. }
  482. }
  483. }