TakeWhileTest.cs 15 KB

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