Tests.Single.cs 15 KB

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