Tests.Imperative.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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 While_Arguments()
  14. {
  15. AssertThrows<ArgumentNullException>(() => EnumerableEx.While<int>(null, new[] { 1 }));
  16. AssertThrows<ArgumentNullException>(() => EnumerableEx.While<int>(() => true, null));
  17. }
  18. [Fact]
  19. public void While1()
  20. {
  21. var x = 5;
  22. var res = EnumerableEx.While(() => x > 0, EnumerableEx.Defer(() => new[] { x }).Do(_ => x--)).ToList();
  23. Assert.True(Enumerable.SequenceEqual(res, new[] { 5, 4, 3, 2, 1 }));
  24. }
  25. [Fact]
  26. public void While2()
  27. {
  28. var x = 0;
  29. var res = EnumerableEx.While(() => x > 0, EnumerableEx.Defer(() => new[] { x }).Do(_ => x--)).ToList();
  30. Assert.True(Enumerable.SequenceEqual(res, new int[0]));
  31. }
  32. [Fact]
  33. public void DoWhile_Arguments()
  34. {
  35. AssertThrows<ArgumentNullException>(() => EnumerableEx.DoWhile<int>(new[] { 1 }, null));
  36. AssertThrows<ArgumentNullException>(() => EnumerableEx.DoWhile<int>(null, () => true));
  37. }
  38. [Fact]
  39. public void DoWhile1()
  40. {
  41. var x = 5;
  42. var res = EnumerableEx.DoWhile(EnumerableEx.Defer(() => new[] { x }).Do(_ => x--), () => x > 0).ToList();
  43. Assert.True(Enumerable.SequenceEqual(res, new[] { 5, 4, 3, 2, 1 }));
  44. }
  45. [Fact]
  46. public void DoWhile2()
  47. {
  48. var x = 0;
  49. var res = EnumerableEx.DoWhile(EnumerableEx.Defer(() => new[] { x }).Do(_ => x--), () => x > 0).ToList();
  50. Assert.True(Enumerable.SequenceEqual(res, new[] { 0 }));
  51. }
  52. [Fact]
  53. public void If_Arguments()
  54. {
  55. AssertThrows<ArgumentNullException>(() => EnumerableEx.If<int>(null, new[] { 1 }));
  56. AssertThrows<ArgumentNullException>(() => EnumerableEx.If<int>(() => true, null));
  57. AssertThrows<ArgumentNullException>(() => EnumerableEx.If<int>(null, new[] { 1 }, new[] { 1 }));
  58. AssertThrows<ArgumentNullException>(() => EnumerableEx.If<int>(() => true, null, new[] { 1 }));
  59. AssertThrows<ArgumentNullException>(() => EnumerableEx.If<int>(() => true, new[] { 1 }, null));
  60. }
  61. [Fact]
  62. public void If1()
  63. {
  64. var x = 5;
  65. var res = EnumerableEx.If(() => x > 0, new[] { +1 }, new[] { -1 });
  66. Assert.Equal(+1, res.Single());
  67. x = -x;
  68. Assert.Equal(-1, res.Single());
  69. }
  70. [Fact]
  71. public void If2()
  72. {
  73. var x = 5;
  74. var res = EnumerableEx.If(() => x > 0, new[] { +1 });
  75. Assert.Equal(+1, res.Single());
  76. x = -x;
  77. Assert.True(res.IsEmpty());
  78. }
  79. [Fact]
  80. public void Case_Arguments()
  81. {
  82. AssertThrows<ArgumentNullException>(() => EnumerableEx.Case<int, int>(null, new Dictionary<int, IEnumerable<int>>()));
  83. AssertThrows<ArgumentNullException>(() => EnumerableEx.Case<int, int>(() => 1, null));
  84. AssertThrows<ArgumentNullException>(() => EnumerableEx.Case<int, int>(null, new Dictionary<int, IEnumerable<int>>(), new[] { 1 }));
  85. AssertThrows<ArgumentNullException>(() => EnumerableEx.Case<int, int>(() => 1, null, new[] { 1 }));
  86. AssertThrows<ArgumentNullException>(() => EnumerableEx.Case<int, int>(() => 1, new Dictionary<int, IEnumerable<int>>(), null));
  87. }
  88. [Fact]
  89. public void Case1()
  90. {
  91. var x = 1;
  92. var d = 'd';
  93. var res = EnumerableEx.Case<int, char>(() => x, new Dictionary<int, IEnumerable<char>>
  94. {
  95. { 0, new[] { 'a' } },
  96. { 1, new[] { 'b' } },
  97. { 2, new[] { 'c' } },
  98. { 3, EnumerableEx.Defer(() => new[] { d }) },
  99. });
  100. Assert.Equal('b', res.Single());
  101. Assert.Equal('b', res.Single());
  102. x = 0;
  103. Assert.Equal('a', res.Single());
  104. x = 2;
  105. Assert.Equal('c', res.Single());
  106. x = 3;
  107. Assert.Equal('d', res.Single());
  108. d = 'e';
  109. Assert.Equal('e', res.Single());
  110. x = 4;
  111. Assert.True(res.IsEmpty());
  112. }
  113. [Fact]
  114. public void Case2()
  115. {
  116. var x = 1;
  117. var d = 'd';
  118. var res = EnumerableEx.Case<int, char>(() => x, new Dictionary<int, IEnumerable<char>>
  119. {
  120. { 0, new[] { 'a' } },
  121. { 1, new[] { 'b' } },
  122. { 2, new[] { 'c' } },
  123. { 3, EnumerableEx.Defer(() => new[] { d }) },
  124. }, new[] { 'z' });
  125. Assert.Equal('b', res.Single());
  126. Assert.Equal('b', res.Single());
  127. x = 0;
  128. Assert.Equal('a', res.Single());
  129. x = 2;
  130. Assert.Equal('c', res.Single());
  131. x = 3;
  132. Assert.Equal('d', res.Single());
  133. d = 'e';
  134. Assert.Equal('e', res.Single());
  135. x = 4;
  136. Assert.Equal('z', res.Single());
  137. }
  138. [Fact]
  139. public void For_Arguments()
  140. {
  141. AssertThrows<ArgumentNullException>(() => EnumerableEx.For<int, int>(null, x => new[] { 1 }));
  142. AssertThrows<ArgumentNullException>(() => EnumerableEx.For<int, int>(new[] { 1 }, null));
  143. }
  144. [Fact]
  145. public void For()
  146. {
  147. var res = EnumerableEx.For(new[] { 1, 2, 3 }, x => Enumerable.Range(0, x)).ToList();
  148. Assert.True(res.SequenceEqual(new[] { 0, 0, 1, 0, 1, 2 }));
  149. }
  150. }
  151. }