ExpressionTester.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using System.Data;
  2. using System.Linq.Expressions;
  3. using Microsoft.VisualStudio.TestTools.UnitTesting;
  4. using Vit.Linq;
  5. namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
  6. {
  7. public abstract partial class ExpressionTester
  8. {
  9. public static List<User> Test(IQueryable<User> query, Expression<Func<User, bool>> predicate)
  10. {
  11. var expected = GetSourceData().AsQueryable().Where(predicate).ToList();
  12. if (expected.Count == 0) throw new Exception("result of predicate must not be empty");
  13. {
  14. var actual = query.Where(predicate).ToList();
  15. Check(expected, actual);
  16. return actual;
  17. }
  18. void Check(List<User> expected, List<User> actual)
  19. {
  20. Assert.AreEqual(expected.Count, actual.Count);
  21. for (var t = 0; t < expected.Count; t++)
  22. {
  23. Assert.AreEqual(expected[t].id, actual[t].id);
  24. }
  25. }
  26. }
  27. public static void TestQueryable(IQueryable<User> query)
  28. {
  29. Expression<Func<User, bool>> predicate;
  30. #region #0 Add, An addition operation, such as a + b, without overflow checking, for numeric operands.
  31. {
  32. predicate = u => u.id + 1 == 6;
  33. var rows = Test(query, predicate);
  34. Assert.AreEqual(5, rows[0].id);
  35. }
  36. #endregion
  37. #region #3 AndAlso, A conditional AND operation that evaluates the second operand only if the first operand evaluates to true. It corresponds to (a && b)
  38. {
  39. predicate = u => u.id > 5 && u.id < 7;
  40. var rows = Test(query, predicate);
  41. }
  42. #endregion
  43. #region #7 Coalesce, A node that represents a null coalescing operation, such as (a ?? b)
  44. {
  45. predicate = u => (u.fatherId ?? u.id) == 5;
  46. var rows = Test(query, predicate);
  47. }
  48. #endregion
  49. #region #8 Conditional, A conditional operation, such as a > b ? a : b
  50. {
  51. predicate = u => (u.id == 2 ? 1 : 0) == 1;
  52. var rows = Test(query, predicate);
  53. }
  54. #endregion
  55. #region #9 Constant, A constant value.
  56. {
  57. predicate = u => u.id == 2;
  58. var rows = Test(query, predicate);
  59. }
  60. #endregion
  61. #region #10 Convert, A cast or conversion operation, such as (SampleType)obj
  62. {
  63. predicate = u => ((double)u.id) <= 2.0;
  64. var rows = Test(query, predicate);
  65. }
  66. #endregion
  67. #region #12 Divide, A division operation, such as (a / b), for numeric operands.
  68. {
  69. predicate = u => u.id / 10.0 == 10.0;
  70. var rows = Test(query, predicate);
  71. }
  72. #endregion
  73. #region #13 Equal, A node that represents an equality comparison, such as (a == b)
  74. {
  75. predicate = u => u.id == 2;
  76. var rows = Test(query, predicate);
  77. }
  78. {
  79. predicate = u => u.fatherId == null;
  80. var rows = Test(query, predicate);
  81. }
  82. #endregion
  83. #region #15 GreaterThan, A "greater than" comparison, such as (a > b).
  84. {
  85. predicate = u => u.id > 5;
  86. var rows = Test(query, predicate);
  87. }
  88. #endregion
  89. #region #16 GreaterThanOrEqual, A "greater than or equal to" comparison, such as (a >= b).
  90. {
  91. predicate = u => u.id >= 5;
  92. var rows = Test(query, predicate);
  93. }
  94. #endregion
  95. #region #20 LessThan, A "less than" comparison, such as (a < b).
  96. {
  97. predicate = u => u.id < 5;
  98. var rows = Test(query, predicate);
  99. }
  100. #endregion
  101. #region #21 LessThanOrEqual, A "less than or equal to" comparison, such as (a <= b).
  102. {
  103. predicate = u => u.id <= 5;
  104. var rows = Test(query, predicate);
  105. }
  106. #endregion
  107. #region #23 MemberAccess, An operation that reads from a field or property, such as obj.SampleProperty.
  108. {
  109. predicate = u => u.id == 5;
  110. var rows = Test(query, predicate);
  111. }
  112. #endregion
  113. #region #25 Modulo, An arithmetic remainder operation, such as (a % b)
  114. {
  115. predicate = u => (u.id % 10) == 0;
  116. var rows = Test(query, predicate);
  117. }
  118. #endregion
  119. #region #26 Multiply, A multiplication operation, such as (a * b), without overflow checking, for numeric operands
  120. {
  121. predicate = u => u.id * 10 == 20;
  122. var rows = Test(query, predicate);
  123. }
  124. #endregion
  125. #region #28 Negate, An arithmetic negation operation, such as (-a). The object a should not be modified in place.
  126. {
  127. predicate = u => -u.id == -2;
  128. var rows = Test(query, predicate);
  129. }
  130. #endregion
  131. #region #34 Not, A bitwise complement or logical negation operation. It is equivalent to (~a) for integral types and to (!a) for Boolean values.
  132. {
  133. predicate = u => !(u.id == 2);
  134. var rows = Test(query, predicate);
  135. }
  136. #endregion
  137. #region #35 NotEqual, An inequality comparison, such as (a != b)
  138. {
  139. predicate = u => u.id != 2;
  140. var rows = Test(query, predicate);
  141. }
  142. {
  143. predicate = u => u.fatherId != null;
  144. var rows = Test(query, predicate);
  145. }
  146. #endregion
  147. #region #37 OrElse, A short-circuiting conditional OR operation, such as (a || b)
  148. {
  149. predicate = u => u.id == 2 || u.id == 3;
  150. var rows = Test(query, predicate);
  151. }
  152. #endregion
  153. #region #42 Subtract, A subtraction operation, such as (a - b), without overflow checking
  154. {
  155. predicate = u => u.id - 2 == 9;
  156. var rows = Test(query, predicate);
  157. }
  158. #endregion
  159. #region Test the priority of mathematical calculations
  160. {
  161. predicate = u => 10 + u.id * 10 == 110;
  162. var rows = Test(query, predicate);
  163. }
  164. #endregion
  165. }
  166. }
  167. }