Tests.Single.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  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. namespace Tests
  8. {
  9. public partial class Tests
  10. {
  11. [TestMethod]
  12. public void Hide_Arguments()
  13. {
  14. AssertThrows<ArgumentNullException>(() => EnumerableEx.Hide<int>(null));
  15. }
  16. [TestMethod]
  17. public void Hide()
  18. {
  19. var xs = new List<int> { 1, 2, 3 };
  20. var ys = xs.Hide();
  21. Assert.IsFalse(ys is List<int>);
  22. Assert.IsTrue(xs.SequenceEqual(ys));
  23. }
  24. [TestMethod]
  25. public void ForEach_Arguments()
  26. {
  27. AssertThrows<ArgumentNullException>(() => EnumerableEx.ForEach<int>(null, x => { }));
  28. AssertThrows<ArgumentNullException>(() => EnumerableEx.ForEach<int>(new[] { 1 }, default(Action<int>)));
  29. AssertThrows<ArgumentNullException>(() => EnumerableEx.ForEach<int>(null, (x, i) => { }));
  30. AssertThrows<ArgumentNullException>(() => EnumerableEx.ForEach<int>(new[] { 1 }, default(Action<int, int>)));
  31. }
  32. [TestMethod]
  33. public void ForEach1()
  34. {
  35. var n = 0;
  36. Enumerable.Range(5, 3).ForEach(x => n += x);
  37. Assert.AreEqual(5 + 6 + 7, n);
  38. }
  39. [TestMethod]
  40. public void ForEach2()
  41. {
  42. var n = 0;
  43. Enumerable.Range(5, 3).ForEach((x, i) => n += x * i);
  44. Assert.AreEqual(5 * 0 + 6 * 1 + 7 * 2, n);
  45. }
  46. [TestMethod]
  47. public void Buffer_Arguments()
  48. {
  49. AssertThrows<ArgumentNullException>(() => EnumerableEx.Buffer<int>(null, 5));
  50. AssertThrows<ArgumentNullException>(() => EnumerableEx.Buffer<int>(null, 5, 3));
  51. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.Buffer<int>(new[] { 1 }, 0));
  52. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.Buffer<int>(new[] { 1 }, 5, 0));
  53. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.Buffer<int>(new[] { 1 }, 0, 3));
  54. }
  55. [TestMethod]
  56. public void Buffer1()
  57. {
  58. var rng = Enumerable.Range(0, 10);
  59. var res = rng.Buffer(3).ToList();
  60. Assert.AreEqual(4, res.Count);
  61. Assert.IsTrue(res[0].SequenceEqual(new[] { 0, 1, 2 }));
  62. Assert.IsTrue(res[1].SequenceEqual(new[] { 3, 4, 5 }));
  63. Assert.IsTrue(res[2].SequenceEqual(new[] { 6, 7, 8 }));
  64. Assert.IsTrue(res[3].SequenceEqual(new[] { 9 }));
  65. }
  66. [TestMethod]
  67. public void Buffer2()
  68. {
  69. var rng = Enumerable.Range(0, 10);
  70. var res = rng.Buffer(5).ToList();
  71. Assert.AreEqual(2, res.Count);
  72. Assert.IsTrue(res[0].SequenceEqual(new[] { 0, 1, 2, 3, 4 }));
  73. Assert.IsTrue(res[1].SequenceEqual(new[] { 5, 6, 7, 8, 9 }));
  74. }
  75. [TestMethod]
  76. public void Buffer3()
  77. {
  78. var rng = Enumerable.Empty<int>();
  79. var res = rng.Buffer(5).ToList();
  80. Assert.AreEqual(0, res.Count);
  81. }
  82. [TestMethod]
  83. public void Buffer4()
  84. {
  85. var rng = Enumerable.Range(0, 10);
  86. var res = rng.Buffer(3, 2).ToList();
  87. Assert.AreEqual(5, res.Count);
  88. Assert.IsTrue(res[0].SequenceEqual(new[] { 0, 1, 2 }));
  89. Assert.IsTrue(res[1].SequenceEqual(new[] { 2, 3, 4 }));
  90. Assert.IsTrue(res[2].SequenceEqual(new[] { 4, 5, 6 }));
  91. Assert.IsTrue(res[3].SequenceEqual(new[] { 6, 7, 8 }));
  92. Assert.IsTrue(res[4].SequenceEqual(new[] { 8, 9 }));
  93. }
  94. [TestMethod]
  95. public void Buffer5()
  96. {
  97. var rng = Enumerable.Range(0, 10);
  98. var res = rng.Buffer(3, 4).ToList();
  99. Assert.AreEqual(3, res.Count);
  100. Assert.IsTrue(res[0].SequenceEqual(new[] { 0, 1, 2 }));
  101. Assert.IsTrue(res[1].SequenceEqual(new[] { 4, 5, 6 }));
  102. Assert.IsTrue(res[2].SequenceEqual(new[] { 8, 9 }));
  103. }
  104. [TestMethod]
  105. public void Do_Arguments()
  106. {
  107. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(null, _ => { }));
  108. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(null, _ => { }, () => { }));
  109. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(null, _ => { }, _ => { }));
  110. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(null, _ => { }, _ => { }, () => { }));
  111. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, default(Action<int>)));
  112. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, default(Action<int>), () => { }));
  113. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, _ => { }, default(Action)));
  114. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, default(Action<int>), _ => { }, () => { }));
  115. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, _ => { }, default(Action<Exception>), () => { }));
  116. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, _ => { }, _ => { }, default(Action)));
  117. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, default(Action<int>), _ => { }));
  118. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, _ => { }, default(Action<Exception>)));
  119. #if !NO_RXINTERFACES
  120. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(null, new MyObserver()));
  121. AssertThrows<ArgumentNullException>(() => EnumerableEx.Do<int>(new[] { 1 }, default(IObserver<int>)));
  122. #endif
  123. }
  124. [TestMethod]
  125. public void Do1()
  126. {
  127. var n = 0;
  128. Enumerable.Range(0, 10).Do(x => n += x).ForEach(_ => { });
  129. Assert.AreEqual(45, n);
  130. }
  131. [TestMethod]
  132. public void Do2()
  133. {
  134. var n = 0;
  135. Enumerable.Range(0, 10).Do(x => n += x, () => n *= 2).ForEach(_ => { });
  136. Assert.AreEqual(90, n);
  137. }
  138. [TestMethod]
  139. public void Do3()
  140. {
  141. var ex = new MyException();
  142. var ok = false;
  143. AssertThrows<MyException>(() =>
  144. EnumerableEx.Throw<int>(ex).Do(x => { Assert.Fail(); }, e => { Assert.AreEqual(ex, e); ok = true; }).ForEach(_ => { })
  145. );
  146. Assert.IsTrue(ok);
  147. }
  148. #if !NO_RXINTERFACES
  149. [TestMethod]
  150. public void Do4()
  151. {
  152. var obs = new MyObserver();
  153. Enumerable.Range(0, 10).Do(obs).ForEach(_ => { });
  154. Assert.IsTrue(obs.Done);
  155. Assert.AreEqual(45, obs.Sum);
  156. }
  157. class MyObserver : IObserver<int>
  158. {
  159. public int Sum;
  160. public bool Done;
  161. public void OnCompleted()
  162. {
  163. Done = true;
  164. }
  165. public void OnError(Exception error)
  166. {
  167. throw new NotImplementedException();
  168. }
  169. public void OnNext(int value)
  170. {
  171. Sum += value;
  172. }
  173. }
  174. #endif
  175. [TestMethod]
  176. public void Do5()
  177. {
  178. var sum = 0;
  179. var done = false;
  180. Enumerable.Range(0, 10).Do(x => sum += x, ex => { throw ex; }, () => done = true).ForEach(_ => { });
  181. Assert.IsTrue(done);
  182. Assert.AreEqual(45, sum);
  183. }
  184. [TestMethod]
  185. public void StartWith_Arguments()
  186. {
  187. AssertThrows<ArgumentNullException>(() => EnumerableEx.StartWith<int>(null, 5));
  188. }
  189. [TestMethod]
  190. public void StartWith1()
  191. {
  192. var e = Enumerable.Range(1, 5);
  193. var r = e.StartWith(0).ToList();
  194. Assert.IsTrue(Enumerable.SequenceEqual(r, Enumerable.Range(0, 6)));
  195. }
  196. [TestMethod]
  197. public void StartWith2()
  198. {
  199. var oops = false;
  200. var e = Enumerable.Range(1, 5).Do(_ => oops = true);
  201. var r = e.StartWith(0).Take(1).ToList();
  202. Assert.IsFalse(oops);
  203. }
  204. [TestMethod]
  205. public void Expand_Arguments()
  206. {
  207. AssertThrows<ArgumentNullException>(() => EnumerableEx.Expand<int>(null, _ => new[] { _ }));
  208. AssertThrows<ArgumentNullException>(() => EnumerableEx.Expand<int>(new[] { 1 }, null));
  209. }
  210. [TestMethod]
  211. public void Expand1()
  212. {
  213. var res = new[] { 0 }.Expand(x => new[] { x + 1 }).Take(10).ToList();
  214. Assert.IsTrue(Enumerable.SequenceEqual(res, Enumerable.Range(0, 10)));
  215. }
  216. [TestMethod]
  217. public void Expand2()
  218. {
  219. var res = new[] { 3 }.Expand(x => Enumerable.Range(0, x)).ToList();
  220. var exp = new[] {
  221. 3,
  222. 0, 1, 2,
  223. 0,
  224. 0, 1,
  225. 0
  226. };
  227. Assert.IsTrue(Enumerable.SequenceEqual(res, exp));
  228. }
  229. [TestMethod]
  230. public void Distinct_Arguments()
  231. {
  232. AssertThrows<ArgumentNullException>(() => EnumerableEx.Distinct<int, int>(null, _ => _));
  233. AssertThrows<ArgumentNullException>(() => EnumerableEx.Distinct<int, int>(new[] { 1 }, null));
  234. AssertThrows<ArgumentNullException>(() => EnumerableEx.Distinct<int, int>(null, _ => _, EqualityComparer<int>.Default));
  235. AssertThrows<ArgumentNullException>(() => EnumerableEx.Distinct<int, int>(new[] { 1 }, null, EqualityComparer<int>.Default));
  236. AssertThrows<ArgumentNullException>(() => EnumerableEx.Distinct<int, int>(new[] { 1 }, _ => _, null));
  237. }
  238. [TestMethod]
  239. public void Distinct1()
  240. {
  241. var res = Enumerable.Range(0, 10).Distinct(x => x % 5).ToList();
  242. Assert.IsTrue(Enumerable.SequenceEqual(res, Enumerable.Range(0, 5)));
  243. }
  244. [TestMethod]
  245. public void Distinct2()
  246. {
  247. var res = Enumerable.Range(0, 10).Distinct(x => x % 5, new MyEqualityComparer()).ToList();
  248. Assert.IsTrue(Enumerable.SequenceEqual(res, new[] { 0, 1 }));
  249. }
  250. class MyEqualityComparer : IEqualityComparer<int>
  251. {
  252. public bool Equals(int x, int y)
  253. {
  254. return x % 2 == y % 2;
  255. }
  256. public int GetHashCode(int obj)
  257. {
  258. return EqualityComparer<int>.Default.GetHashCode(obj % 2);
  259. }
  260. }
  261. [TestMethod]
  262. public void DistinctUntilChanged_Arguments()
  263. {
  264. AssertThrows<ArgumentNullException>(() => EnumerableEx.DistinctUntilChanged<int>(null));
  265. AssertThrows<ArgumentNullException>(() => EnumerableEx.DistinctUntilChanged<int>(null, EqualityComparer<int>.Default));
  266. AssertThrows<ArgumentNullException>(() => EnumerableEx.DistinctUntilChanged<int>(new[] { 1 }, null));
  267. AssertThrows<ArgumentNullException>(() => EnumerableEx.DistinctUntilChanged<int, int>(null, _ => _));
  268. AssertThrows<ArgumentNullException>(() => EnumerableEx.DistinctUntilChanged<int, int>(new[] { 1 }, null));
  269. AssertThrows<ArgumentNullException>(() => EnumerableEx.DistinctUntilChanged<int, int>(null, _ => _, EqualityComparer<int>.Default));
  270. AssertThrows<ArgumentNullException>(() => EnumerableEx.DistinctUntilChanged<int, int>(new[] { 1 }, null, EqualityComparer<int>.Default));
  271. AssertThrows<ArgumentNullException>(() => EnumerableEx.DistinctUntilChanged<int, int>(new[] { 1 }, _ => _, null));
  272. }
  273. [TestMethod]
  274. public void DistinctUntilChanged1()
  275. {
  276. var res = new[] { 1, 2, 2, 3, 3, 3, 2, 2, 1 }.DistinctUntilChanged().ToList();
  277. Assert.IsTrue(Enumerable.SequenceEqual(res, new[] { 1, 2, 3, 2, 1 }));
  278. }
  279. [TestMethod]
  280. public void DistinctUntilChanged2()
  281. {
  282. var res = new[] { 1, 1, 2, 3, 4, 5, 5, 6, 7 }.DistinctUntilChanged(x => x / 2).ToList();
  283. Assert.IsTrue(Enumerable.SequenceEqual(res, new[] { 1, 2, 4, 6 }));
  284. }
  285. [TestMethod]
  286. public void IgnoreElements_Arguments()
  287. {
  288. AssertThrows<ArgumentNullException>(() => EnumerableEx.IgnoreElements<int>(null));
  289. }
  290. [TestMethod]
  291. public void IgnoreElements()
  292. {
  293. var n = 0;
  294. Enumerable.Range(0, 10).Do(_ => n++).IgnoreElements().Take(5).ForEach(_ => { });
  295. Assert.AreEqual(10, n);
  296. }
  297. [TestMethod]
  298. public void TakeLast_Arguments()
  299. {
  300. AssertThrows<ArgumentNullException>(() => EnumerableEx.TakeLast<int>(null, 5));
  301. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.TakeLast<int>(new[] { 1 }, -1));
  302. }
  303. [TestMethod]
  304. public void TakeLast_Empty()
  305. {
  306. var e = Enumerable.Empty<int>();
  307. var r = e.TakeLast(1).ToList();
  308. Assert.IsTrue(Enumerable.SequenceEqual(r, e));
  309. }
  310. [TestMethod]
  311. public void TakeLast_All()
  312. {
  313. var e = Enumerable.Range(0, 5);
  314. var r = e.TakeLast(5).ToList();
  315. Assert.IsTrue(Enumerable.SequenceEqual(r, e));
  316. }
  317. [TestMethod]
  318. public void TakeLast_Part()
  319. {
  320. var e = Enumerable.Range(0, 5);
  321. var r = e.TakeLast(3).ToList();
  322. Assert.IsTrue(Enumerable.SequenceEqual(r, e.Skip(2)));
  323. }
  324. [TestMethod]
  325. public void SkipLast_Arguments()
  326. {
  327. AssertThrows<ArgumentNullException>(() => EnumerableEx.SkipLast<int>(null, 5));
  328. AssertThrows<ArgumentOutOfRangeException>(() => EnumerableEx.SkipLast<int>(new[] { 1 }, -1));
  329. }
  330. [TestMethod]
  331. public void SkipLast_Empty()
  332. {
  333. var e = Enumerable.Empty<int>();
  334. var r = e.SkipLast(1).ToList();
  335. Assert.IsTrue(Enumerable.SequenceEqual(r, e));
  336. }
  337. [TestMethod]
  338. public void SkipLast_All()
  339. {
  340. var e = Enumerable.Range(0, 5);
  341. var r = e.SkipLast(0).ToList();
  342. Assert.IsTrue(Enumerable.SequenceEqual(r, e));
  343. }
  344. [TestMethod]
  345. public void SkipLast_Part()
  346. {
  347. var e = Enumerable.Range(0, 5);
  348. var r = e.SkipLast(3).ToList();
  349. Assert.IsTrue(Enumerable.SequenceEqual(r, e.Take(2)));
  350. }
  351. [TestMethod]
  352. public void Scan_Arguments()
  353. {
  354. AssertThrows<ArgumentNullException>(() => EnumerableEx.Scan<int>(null, (x, y) => x + y));
  355. AssertThrows<ArgumentNullException>(() => EnumerableEx.Scan<int>(new[] { 1 }, null));
  356. AssertThrows<ArgumentNullException>(() => EnumerableEx.Scan<int, int>(null, 0, (x, y) => x + y));
  357. AssertThrows<ArgumentNullException>(() => EnumerableEx.Scan<int, int>(new[] { 1 }, 0, null));
  358. }
  359. [TestMethod]
  360. public void Scan1()
  361. {
  362. var res = Enumerable.Range(0, 5).Scan((n, x) => n + x).ToList();
  363. Assert.IsTrue(Enumerable.SequenceEqual(res, new[] { 1, 3, 6, 10 }));
  364. }
  365. [TestMethod]
  366. public void Scan2()
  367. {
  368. var res = Enumerable.Range(0, 5).Scan(10, (n, x) => n - x).ToList();
  369. Assert.IsTrue(Enumerable.SequenceEqual(res, new[] { 10, 9, 7, 4, 0 }));
  370. }
  371. }
  372. }