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