/Ix/NET/Tests/Tests.Buffering.cs

http://rx.codeplex.com · C# · 625 lines · 522 code · 102 blank · 1 comment · 4 complexity · c29a8e7fc97b4d16cf101bf9a994819d MD5 · raw file

  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. using System;
  3. using System.Text;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using Microsoft.VisualStudio.TestTools.UnitTesting;
  7. using System.Collections;
  8. namespace Tests
  9. {
  10. public partial class Tests
  11. {
  12. [TestMethod]
  13. public void Share_Arguments()
  14. {
  15. AssertThrows<ArgumentNullException>(() => EnumerableEx.Share<int>(null));
  16. }
  17. [TestMethod]
  18. public void Share1()
  19. {
  20. var rng = Enumerable.Range(0, 5).Share();
  21. var e1 = rng.GetEnumerator();
  22. HasNext(e1, 0);
  23. HasNext(e1, 1);
  24. HasNext(e1, 2);
  25. HasNext(e1, 3);
  26. HasNext(e1, 4);
  27. NoNext(e1);
  28. }
  29. [TestMethod]
  30. public void Share2()
  31. {
  32. var rng = Enumerable.Range(0, 5).Share();
  33. var e1 = rng.GetEnumerator();
  34. var e2 = rng.GetEnumerator();
  35. HasNext(e1, 0);
  36. HasNext(e2, 1);
  37. HasNext(e1, 2);
  38. HasNext(e2, 3);
  39. HasNext(e1, 4);
  40. NoNext(e2);
  41. NoNext(e1);
  42. }
  43. [TestMethod]
  44. public void Share3()
  45. {
  46. var rng = Enumerable.Range(0, 5).Share();
  47. var e1 = rng.GetEnumerator();
  48. HasNext(e1, 0);
  49. HasNext(e1, 1);
  50. HasNext(e1, 2);
  51. var e2 = rng.GetEnumerator();
  52. HasNext(e2, 3);
  53. HasNext(e2, 4);
  54. NoNext(e2);
  55. NoNext(e1);
  56. }
  57. [TestMethod]
  58. public void Share4()
  59. {
  60. var rng = Enumerable.Range(0, 5).Share();
  61. var e1 = rng.GetEnumerator();
  62. HasNext(e1, 0);
  63. HasNext(e1, 1);
  64. HasNext(e1, 2);
  65. e1.Dispose();
  66. Assert.IsFalse(e1.MoveNext());
  67. }
  68. [TestMethod]
  69. public void Share5()
  70. {
  71. var rng = Enumerable.Range(0, 5).Share();
  72. var e1 = rng.GetEnumerator();
  73. HasNext(e1, 0);
  74. HasNext(e1, 1);
  75. HasNext(e1, 2);
  76. rng.Dispose();
  77. AssertThrows<ObjectDisposedException>(() => e1.MoveNext());
  78. AssertThrows<ObjectDisposedException>(() => rng.GetEnumerator());
  79. AssertThrows<ObjectDisposedException>(() => ((IEnumerable)rng).GetEnumerator());
  80. }
  81. [TestMethod]
  82. public void Share6()
  83. {
  84. var rng = Enumerable.Range(0, 5).Share();
  85. var e1 = ((IEnumerable)rng).GetEnumerator();
  86. Assert.IsTrue(e1.MoveNext());
  87. Assert.AreEqual(0, (int)e1.Current);
  88. }
  89. [TestMethod]
  90. public void Publish_Arguments()
  91. {
  92. AssertThrows<ArgumentNullException>(() => EnumerableEx.Publish<int>(null));
  93. }
  94. [TestMethod]
  95. public void Publish0()
  96. {
  97. var n = 0;
  98. var rng = Tick(i => n += i).Publish();
  99. var e1 = rng.GetEnumerator();
  100. var e2 = rng.GetEnumerator();
  101. HasNext(e1, 0);
  102. Assert.AreEqual(0, n);
  103. HasNext(e1, 1);
  104. Assert.AreEqual(1, n);
  105. HasNext(e1, 2);
  106. Assert.AreEqual(3, n);
  107. HasNext(e2, 0);
  108. Assert.AreEqual(3, n);
  109. HasNext(e1, 3);
  110. Assert.AreEqual(6, n);
  111. HasNext(e2, 1);
  112. Assert.AreEqual(6, n);
  113. HasNext(e2, 2);
  114. Assert.AreEqual(6, n);
  115. HasNext(e2, 3);
  116. Assert.AreEqual(6, n);
  117. HasNext(e2, 4);
  118. Assert.AreEqual(10, n);
  119. HasNext(e1, 4);
  120. Assert.AreEqual(10, n);
  121. }
  122. static IEnumerable<int> Tick(Action<int> t)
  123. {
  124. var i = 0;
  125. while (true)
  126. {
  127. t(i);
  128. yield return i++;
  129. }
  130. }
  131. [TestMethod]
  132. public void Publish1()
  133. {
  134. var rng = Enumerable.Range(0, 5).Publish();
  135. var e1 = rng.GetEnumerator();
  136. HasNext(e1, 0);
  137. HasNext(e1, 1);
  138. HasNext(e1, 2);
  139. HasNext(e1, 3);
  140. HasNext(e1, 4);
  141. NoNext(e1);
  142. }
  143. [TestMethod]
  144. public void Publish2()
  145. {
  146. var rng = Enumerable.Range(0, 5).Publish();
  147. var e1 = rng.GetEnumerator();
  148. var e2 = rng.GetEnumerator();
  149. HasNext(e1, 0);
  150. HasNext(e2, 0);
  151. HasNext(e1, 1);
  152. HasNext(e2, 1);
  153. HasNext(e1, 2);
  154. HasNext(e2, 2);
  155. HasNext(e1, 3);
  156. HasNext(e2, 3);
  157. HasNext(e1, 4);
  158. HasNext(e2, 4);
  159. NoNext(e1);
  160. NoNext(e2);
  161. }
  162. [TestMethod]
  163. public void Publish3()
  164. {
  165. var rng = Enumerable.Range(0, 5).Publish();
  166. var e1 = rng.GetEnumerator();
  167. var e2 = rng.GetEnumerator();
  168. HasNext(e1, 0);
  169. HasNext(e1, 1);
  170. HasNext(e1, 2);
  171. HasNext(e1, 3);
  172. HasNext(e1, 4);
  173. HasNext(e2, 0);
  174. HasNext(e2, 1);
  175. HasNext(e2, 2);
  176. HasNext(e2, 3);
  177. HasNext(e2, 4);
  178. NoNext(e1);
  179. NoNext(e2);
  180. }
  181. [TestMethod]
  182. public void Publish4()
  183. {
  184. var rng = Enumerable.Range(0, 5).Publish();
  185. var e1 = rng.GetEnumerator();
  186. HasNext(e1, 0);
  187. HasNext(e1, 1);
  188. HasNext(e1, 2);
  189. var e2 = rng.GetEnumerator();
  190. HasNext(e1, 3);
  191. HasNext(e1, 4);
  192. HasNext(e2, 3);
  193. HasNext(e2, 4);
  194. NoNext(e1);
  195. NoNext(e2);
  196. }
  197. [TestMethod]
  198. public void Publish5()
  199. {
  200. var rng = Enumerable.Range(0, 5).Publish();
  201. var e1 = rng.GetEnumerator();
  202. HasNext(e1, 0);
  203. HasNext(e1, 1);
  204. HasNext(e1, 2);
  205. e1.Dispose();
  206. var e2 = rng.GetEnumerator();
  207. HasNext(e2, 3);
  208. HasNext(e2, 4);
  209. NoNext(e2);
  210. }
  211. [TestMethod]
  212. public void Publish6()
  213. {
  214. var ex = new MyException();
  215. var rng = Enumerable.Range(0, 2).Concat(EnumerableEx.Throw<int>(ex)).Publish();
  216. var e1 = rng.GetEnumerator();
  217. var e2 = rng.GetEnumerator();
  218. HasNext(e1, 0);
  219. HasNext(e1, 1);
  220. AssertThrows<MyException>(() => e1.MoveNext());
  221. HasNext(e2, 0);
  222. HasNext(e2, 1);
  223. AssertThrows<MyException>(() => e2.MoveNext());
  224. }
  225. class MyException : Exception
  226. {
  227. }
  228. [TestMethod]
  229. public void Publish7()
  230. {
  231. var rng = Enumerable.Range(0, 5).Publish();
  232. var e1 = rng.GetEnumerator();
  233. HasNext(e1, 0);
  234. HasNext(e1, 1);
  235. HasNext(e1, 2);
  236. var e2 = rng.GetEnumerator();
  237. HasNext(e2, 3);
  238. HasNext(e2, 4);
  239. NoNext(e2);
  240. HasNext(e1, 3);
  241. HasNext(e1, 4);
  242. NoNext(e2);
  243. var e3 = rng.GetEnumerator();
  244. NoNext(e3);
  245. }
  246. [TestMethod]
  247. public void Publish8()
  248. {
  249. var rng = Enumerable.Range(0, 5).Publish();
  250. var e1 = rng.GetEnumerator();
  251. HasNext(e1, 0);
  252. HasNext(e1, 1);
  253. HasNext(e1, 2);
  254. rng.Dispose();
  255. AssertThrows<ObjectDisposedException>(() => e1.MoveNext());
  256. AssertThrows<ObjectDisposedException>(() => rng.GetEnumerator());
  257. AssertThrows<ObjectDisposedException>(() => ((IEnumerable)rng).GetEnumerator());
  258. }
  259. [TestMethod]
  260. public void Publish9()
  261. {
  262. var rng = Enumerable.Range(0, 5).Publish();
  263. var e1 = ((IEnumerable)rng).GetEnumerator();
  264. Assert.IsTrue(e1.MoveNext());
  265. Assert.AreEqual(0, (int)e1.Current);
  266. }
  267. [TestMethod]
  268. public void Publish10()
  269. {
  270. var rnd = Rand().Take(1000).Publish();
  271. Assert.IsTrue(rnd.Zip(rnd, (l, r) => l == r).All(x => x));
  272. }
  273. [TestMethod]
  274. public void Memoize_Arguments()
  275. {
  276. AssertThrows<ArgumentNullException>(() => EnumerableEx.Memoize<int>(null));
  277. }
  278. [TestMethod]
  279. public void MemoizeLimited_Arguments()
  280. {
  281. AssertThrows<ArgumentNullException>(() => EnumerableEx.Memoize<int>(null, 2));
  282. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.Memoize<int>(new[] { 1 }, 0));
  283. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.Memoize<int>(new[] { 1 }, -1));
  284. }
  285. [TestMethod]
  286. public void Memoize0()
  287. {
  288. var n = 0;
  289. var rng = Tick(i => n += i).Memoize();
  290. var e1 = rng.GetEnumerator();
  291. var e2 = rng.GetEnumerator();
  292. HasNext(e1, 0);
  293. Assert.AreEqual(0, n);
  294. HasNext(e1, 1);
  295. Assert.AreEqual(1, n);
  296. HasNext(e1, 2);
  297. Assert.AreEqual(3, n);
  298. HasNext(e2, 0);
  299. Assert.AreEqual(3, n);
  300. HasNext(e1, 3);
  301. Assert.AreEqual(6, n);
  302. HasNext(e2, 1);
  303. Assert.AreEqual(6, n);
  304. HasNext(e2, 2);
  305. Assert.AreEqual(6, n);
  306. HasNext(e2, 3);
  307. Assert.AreEqual(6, n);
  308. HasNext(e2, 4);
  309. Assert.AreEqual(10, n);
  310. HasNext(e1, 4);
  311. Assert.AreEqual(10, n);
  312. }
  313. [TestMethod]
  314. public void Publish11()
  315. {
  316. var rng = Enumerable.Range(0, 5).Publish();
  317. var e1 = rng.GetEnumerator();
  318. var e2 = rng.GetEnumerator();
  319. HasNext(e1, 0);
  320. HasNext(e1, 1);
  321. HasNext(e1, 2);
  322. e1.Dispose();
  323. HasNext(e2, 0);
  324. HasNext(e2, 1);
  325. e2.Dispose();
  326. var e3 = rng.GetEnumerator();
  327. HasNext(e3, 3);
  328. HasNext(e3, 4);
  329. NoNext(e3);
  330. }
  331. [TestMethod]
  332. public void Memoize1()
  333. {
  334. var rng = Enumerable.Range(0, 5).Memoize();
  335. var e1 = rng.GetEnumerator();
  336. HasNext(e1, 0);
  337. HasNext(e1, 1);
  338. HasNext(e1, 2);
  339. HasNext(e1, 3);
  340. HasNext(e1, 4);
  341. NoNext(e1);
  342. }
  343. [TestMethod]
  344. public void Memoize2()
  345. {
  346. var rng = Enumerable.Range(0, 5).Memoize();
  347. var e1 = rng.GetEnumerator();
  348. HasNext(e1, 0);
  349. HasNext(e1, 1);
  350. HasNext(e1, 2);
  351. HasNext(e1, 3);
  352. HasNext(e1, 4);
  353. NoNext(e1);
  354. var e2 = rng.GetEnumerator();
  355. HasNext(e2, 0);
  356. HasNext(e2, 1);
  357. HasNext(e2, 2);
  358. HasNext(e2, 3);
  359. HasNext(e2, 4);
  360. NoNext(e2);
  361. }
  362. [TestMethod]
  363. public void Memoize3()
  364. {
  365. var rng = Enumerable.Range(0, 5).Memoize();
  366. var e1 = rng.GetEnumerator();
  367. HasNext(e1, 0);
  368. HasNext(e1, 1);
  369. HasNext(e1, 2);
  370. var e2 = rng.GetEnumerator();
  371. HasNext(e1, 3);
  372. HasNext(e2, 0);
  373. HasNext(e2, 1);
  374. HasNext(e1, 4);
  375. HasNext(e2, 2);
  376. NoNext(e1);
  377. HasNext(e2, 3);
  378. HasNext(e2, 4);
  379. NoNext(e2);
  380. }
  381. [TestMethod]
  382. public void Memoize4()
  383. {
  384. var rng = Enumerable.Range(0, 5).Memoize(2);
  385. var e1 = rng.GetEnumerator();
  386. HasNext(e1, 0);
  387. HasNext(e1, 1);
  388. HasNext(e1, 2);
  389. var e2 = rng.GetEnumerator();
  390. HasNext(e2, 0);
  391. HasNext(e2, 1);
  392. HasNext(e2, 2);
  393. var e3 = rng.GetEnumerator();
  394. AssertThrows<InvalidOperationException>(() => e3.MoveNext());
  395. }
  396. [TestMethod]
  397. public void Memoize6()
  398. {
  399. var ex = new MyException();
  400. var rng = Enumerable.Range(0, 2).Concat(EnumerableEx.Throw<int>(ex)).Memoize();
  401. var e1 = rng.GetEnumerator();
  402. var e2 = rng.GetEnumerator();
  403. HasNext(e1, 0);
  404. HasNext(e1, 1);
  405. AssertThrows<MyException>(() => e1.MoveNext());
  406. HasNext(e2, 0);
  407. HasNext(e2, 1);
  408. AssertThrows<MyException>(() => e2.MoveNext());
  409. }
  410. [TestMethod]
  411. public void Memoize7()
  412. {
  413. var rng = Enumerable.Range(0, 5).Memoize();
  414. var e1 = rng.GetEnumerator();
  415. HasNext(e1, 0);
  416. HasNext(e1, 1);
  417. HasNext(e1, 2);
  418. e1.Dispose();
  419. var e2 = rng.GetEnumerator();
  420. HasNext(e2, 0);
  421. HasNext(e2, 1);
  422. e2.Dispose();
  423. var e3 = rng.GetEnumerator();
  424. HasNext(e3, 0);
  425. HasNext(e3, 1);
  426. HasNext(e3, 2);
  427. HasNext(e3, 3);
  428. HasNext(e3, 4);
  429. NoNext(e3);
  430. }
  431. [TestMethod]
  432. public void Memoize8()
  433. {
  434. var rng = Enumerable.Range(0, 5).Memoize();
  435. var e1 = rng.GetEnumerator();
  436. HasNext(e1, 0);
  437. HasNext(e1, 1);
  438. HasNext(e1, 2);
  439. rng.Dispose();
  440. AssertThrows<ObjectDisposedException>(() => e1.MoveNext());
  441. AssertThrows<ObjectDisposedException>(() => rng.GetEnumerator());
  442. AssertThrows<ObjectDisposedException>(() => ((IEnumerable)rng).GetEnumerator());
  443. }
  444. [TestMethod]
  445. public void Memoize9()
  446. {
  447. var rng = Enumerable.Range(0, 5).Memoize();
  448. var e1 = ((IEnumerable)rng).GetEnumerator();
  449. Assert.IsTrue(e1.MoveNext());
  450. Assert.AreEqual(0, (int)e1.Current);
  451. }
  452. [TestMethod]
  453. public void Memoize10()
  454. {
  455. var rnd = Rand().Take(1000).Memoize();
  456. Assert.IsTrue(rnd.Zip(rnd, (l, r) => l == r).All(x => x));
  457. }
  458. static Random s_rand = new Random();
  459. static IEnumerable<int> Rand()
  460. {
  461. while (true)
  462. yield return s_rand.Next();
  463. }
  464. [TestMethod]
  465. public void ShareLambda_Arguments()
  466. {
  467. AssertThrows<ArgumentNullException>(() => EnumerableEx.Share<int, int>(null, xs => xs));
  468. AssertThrows<ArgumentNullException>(() => EnumerableEx.Share<int, int>(new[] { 1 }, null));
  469. }
  470. [TestMethod]
  471. public void ShareLambda()
  472. {
  473. var n = 0;
  474. var res = Enumerable.Range(0, 10).Do(_ => n++).Share(xs => xs.Zip(xs, (l, r) => l + r).Take(4)).ToList();
  475. Assert.IsTrue(res.SequenceEqual(new[] { 0 + 1, 2 + 3, 4 + 5, 6 + 7 }));
  476. Assert.AreEqual(8, n);
  477. }
  478. [TestMethod]
  479. public void PublishLambda_Arguments()
  480. {
  481. AssertThrows<ArgumentNullException>(() => EnumerableEx.Publish<int, int>(null, xs => xs));
  482. AssertThrows<ArgumentNullException>(() => EnumerableEx.Publish<int, int>(new[] { 1 }, null));
  483. }
  484. [TestMethod]
  485. public void PublishLambda()
  486. {
  487. var n = 0;
  488. var res = Enumerable.Range(0, 10).Do(_ => n++).Publish(xs => xs.Zip(xs, (l, r) => l + r).Take(4)).ToList();
  489. Assert.IsTrue(res.SequenceEqual(Enumerable.Range(0, 4).Select(x => x * 2)));
  490. Assert.AreEqual(4, n);
  491. }
  492. [TestMethod]
  493. public void MemoizeLambda_Arguments()
  494. {
  495. AssertThrows<ArgumentNullException>(() => EnumerableEx.Memoize<int, int>(null, xs => xs));
  496. AssertThrows<ArgumentNullException>(() => EnumerableEx.Memoize<int, int>(new[] { 1 }, null));
  497. }
  498. [TestMethod]
  499. public void MemoizeLambda()
  500. {
  501. var n = 0;
  502. var res = Enumerable.Range(0, 10).Do(_ => n++).Memoize(xs => xs.Zip(xs, (l, r) => l + r).Take(4)).ToList();
  503. Assert.IsTrue(res.SequenceEqual(Enumerable.Range(0, 4).Select(x => x * 2)));
  504. Assert.AreEqual(4, n);
  505. }
  506. [TestMethod]
  507. public void MemoizeLimitedLambda_Arguments()
  508. {
  509. AssertThrows<ArgumentNullException>(() => EnumerableEx.Memoize<int, int>(null, 2, xs => xs));
  510. AssertThrows<ArgumentNullException>(() => EnumerableEx.Memoize<int, int>(new[] { 1 }, 2, null));
  511. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.Memoize<int, int>(new[] { 1 }, 0, xs => xs));
  512. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.Memoize<int, int>(new[] { 1 }, -1, xs => xs));
  513. }
  514. [TestMethod]
  515. public void MemoizeLimitedLambda()
  516. {
  517. var n = 0;
  518. var res = Enumerable.Range(0, 10).Do(_ => n++).Memoize(2, xs => xs.Zip(xs, (l, r) => l + r).Take(4)).ToList();
  519. Assert.IsTrue(res.SequenceEqual(Enumerable.Range(0, 4).Select(x => x * 2)));
  520. Assert.AreEqual(4, n);
  521. }
  522. }
  523. }