Tests.Imperative.cs 6.0 KB

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