Tests.Single.cs 15 KB

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