PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/IronPython_Main/Runtime/Tests/ETScenarios/Operators/Decrement.cs

#
C# | 220 lines | 164 code | 41 blank | 15 comment | 0 complexity | 71d7e46cba72e6fe3d15353f02814c92 MD5 | raw file
Possible License(s): GPL-2.0, MPL-2.0-no-copyleft-exception, CPL-1.0, CC-BY-SA-3.0, BSD-3-Clause, ISC, AGPL-3.0, LGPL-2.1, Apache-2.0
  1. #if !CLR2
  2. using System.Linq.Expressions;
  3. #else
  4. using Microsoft.Scripting.Ast;
  5. using Microsoft.Scripting.Utils;
  6. #endif
  7. using System;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using System.Reflection;
  11. namespace ETScenarios.Operators {
  12. using EU = ETUtils.ExpressionUtils;
  13. using Expr = Expression;
  14. using AstUtils = Microsoft.Scripting.Ast.Utils;
  15. public class Decrement {
  16. // Decrement of numeric types
  17. // Regression for Dev10 Bug 546775
  18. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 1", new string[] { "positive", "decrement", "operators", "Pri1" })]
  19. public static Expr Decrement1(EU.IValidator V) {
  20. List<Expression> Expressions = new List<Expression>();
  21. Expressions.Add(EU.GenAreEqual(Expr.Constant((short)(-1), typeof(short)), Expr.Decrement(Expr.Constant((short)(0), typeof(short))), "Decrement 1"));
  22. Expressions.Add(EU.GenAreEqual(Expr.Constant((ushort)1, typeof(ushort)), Expr.Decrement(Expr.Constant((ushort)2, typeof(ushort))), "Decrement 2"));
  23. Expressions.Add(EU.GenAreEqual(Expr.Constant((Int16)0, typeof(Int16)), Expr.Decrement(Expr.Constant((Int16)1, typeof(Int16))), "Decrement 3"));
  24. Expressions.Add(EU.GenAreEqual(Expr.Constant((UInt16)1, typeof(UInt16)), Expr.Decrement(Expr.Constant((UInt16)2, typeof(UInt16))), "Decrement 4"));
  25. Expressions.Add(EU.GenAreEqual(Expr.Constant((Int32)Int32.MaxValue, typeof(Int32)), Expr.Decrement(Expr.Constant((Int32)Int32.MinValue, typeof(Int32))), "Decrement 5"));
  26. Expressions.Add(EU.GenAreEqual(Expr.Constant((UInt32)1, typeof(UInt32)), Expr.Decrement(Expr.Constant((UInt32)2, typeof(UInt32))), "Decrement 6"));
  27. Expressions.Add(EU.GenAreEqual(Expr.Constant((double)1.0, typeof(double)), Expr.Decrement(Expr.Constant((double)2.0, typeof(double))), "Decrement 7"));
  28. Expressions.Add(EU.GenAreEqual(Expr.Constant((long)1.1, typeof(long)), Expr.Decrement(Expr.Constant((long)2.1, typeof(long))), "Decrement 8"));
  29. Expressions.Add(EU.GenAreEqual(Expr.Constant((ulong)1.001, typeof(ulong)), Expr.Decrement(Expr.Constant((ulong)2.001, typeof(ulong))), "Decrement 9"));
  30. Expressions.Add(EU.GenAreEqual(Expr.Constant((decimal)(0.001), typeof(decimal)), Expr.Decrement(Expr.Constant((decimal)1.001, typeof(decimal))), "Decrement 10"));
  31. var tree = Expr.Block(Expressions);
  32. V.Validate(tree);
  33. return tree;
  34. }
  35. // Decrement of void
  36. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 2", new string[] { "negative", "decrement", "operators", "Pri1" }, Exception = typeof(ArgumentException))]
  37. public static Expr Decrement2(EU.IValidator V) {
  38. List<Expression> Expressions = new List<Expression>();
  39. var Result = EU.Throws<ArgumentException>(() => { Expr.Variable(typeof(void), "Result"); });
  40. Expr.Decrement(Result);
  41. return Expr.Empty();
  42. }
  43. // Pass null to expression
  44. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 3", new string[] { "negative", "decrement", "operators", "Pri2" }, Exception = typeof(ArgumentNullException))]
  45. public static Expr Decrement3(EU.IValidator V) {
  46. List<Expression> Expressions = new List<Expression>();
  47. EU.Throws<System.ArgumentNullException>(() => {
  48. Expressions.Add(Expr.Decrement(null) );
  49. });
  50. return Expr.Empty();
  51. }
  52. public class TestClass {
  53. public int X { get; set; }
  54. public TestClass(int val) { X = val; }
  55. public static TestClass operator --(TestClass a) {
  56. a.X -= 1;
  57. return a;
  58. }
  59. public static int TestMethod(int x) {
  60. return x - 2;
  61. }
  62. }
  63. // Decrement of a user defined type that defines the decrement operator
  64. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 4", new string[] { "positive", "decrement", "operators", "Pri2" })]
  65. public static Expr Decrement4(EU.IValidator V) {
  66. List<Expression> Expressions = new List<Expression>();
  67. ParameterExpression Result = Expr.Variable(typeof(TestClass), "Result");
  68. var ci = typeof(TestClass).GetConstructor(new Type[] { typeof(int) });
  69. Expressions.Add(Expr.Assign(Result, Expr.New(ci, new Expression[] { Expr.Constant(0) })));
  70. PropertyInfo pi = typeof(TestClass).GetProperty("X");
  71. Expr newValue = Expr.Decrement(Result);
  72. Expressions.Add(EU.GenAreEqual(Expr.Constant(-1), Expr.Property(newValue, pi), "Decrement 1"));
  73. var tree = Expr.Block(new[] { Result }, Expressions);
  74. V.Validate(tree);
  75. return tree;
  76. }
  77. // Decrement of string
  78. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 5", new string[] { "negative", "decrement", "operators", "Pri2" }, Exception = typeof(InvalidOperationException))]
  79. public static Expr Decrement5(EU.IValidator V) {
  80. List<Expression> Expressions = new List<Expression>();
  81. Expressions.Add(EU.Throws<InvalidOperationException>(() => { Expr.Decrement(Expr.Constant("1")); }));
  82. return Expr.Empty();
  83. }
  84. // Decrement of date
  85. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 6", new string[] { "negative", "decrement", "operators", "Pri2" }, Exception = typeof(InvalidOperationException))]
  86. public static Expr Decrement6(EU.IValidator V) {
  87. List<Expression> Expressions = new List<Expression>();
  88. Expressions.Add(EU.Throws<InvalidOperationException>(() => { EU.GenAreEqual(Expr.Constant(DateTime.Parse("1/2/2009")), Expr.Decrement(Expr.Constant(DateTime.Parse("1/1/2009"))), "Decrement 1"); }));
  89. return Expr.Empty();
  90. }
  91. // Overflow an int with the decrement operator
  92. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 7", new string[] { "positive", "decrement", "operators", "Pri2" })]
  93. public static Expr Decrement7(EU.IValidator V) {
  94. List<Expression> Expressions = new List<Expression>();
  95. Expressions.Add(EU.GenAreEqual(Expr.Constant(Int32.MaxValue), Expr.Decrement(Expr.Constant(Int32.MinValue)), "Decrement 1"));
  96. var tree = Expr.Block(Expressions);
  97. V.Validate(tree);
  98. return tree;
  99. }
  100. // Pass null to expression
  101. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 8", new string[] { "negative", "decrement", "operators", "Pri2" }, Exception = typeof(ArgumentNullException))]
  102. public static Expr Decrement8(EU.IValidator V) {
  103. List<Expression> Expressions = new List<Expression>();
  104. MethodInfo mi = typeof(TestClass).GetMethod("TestMethod");
  105. Expressions.Add(EU.Throws<ArgumentNullException>(() => { Expr.Decrement(null, mi); }));
  106. return Expr.Empty();
  107. }
  108. // With a null method, decrement of numeric types
  109. // Regression for Dev10 Bug 546775
  110. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 9", new string[] { "positive", "decrement", "operators", "Pri2" })]
  111. public static Expr Decrement9(EU.IValidator V) {
  112. List<Expression> Expressions = new List<Expression>();
  113. Expressions.Add(EU.GenAreEqual(Expr.Constant((short)(-1), typeof(short)), Expr.Decrement(Expr.Constant((short)(0), typeof(short)), null), "Decrement 1"));
  114. Expressions.Add(EU.GenAreEqual(Expr.Constant((ushort)1, typeof(ushort)), Expr.Decrement(Expr.Constant((ushort)2, typeof(ushort)), null), "Decrement 2"));
  115. Expressions.Add(EU.GenAreEqual(Expr.Constant((Int16)0, typeof(Int16)), Expr.Decrement(Expr.Constant((Int16)1, typeof(Int16)), null), "Decrement 3"));
  116. Expressions.Add(EU.GenAreEqual(Expr.Constant((UInt16)1, typeof(UInt16)), Expr.Decrement(Expr.Constant((UInt16)2, typeof(UInt16)), null), "Decrement 4"));
  117. Expressions.Add(EU.GenAreEqual(Expr.Constant((Int32)Int32.MaxValue, typeof(Int32)), Expr.Decrement(Expr.Constant((Int32)Int32.MinValue, typeof(Int32)), null), "Decrement 5"));
  118. Expressions.Add(EU.GenAreEqual(Expr.Constant((UInt32)1, typeof(UInt32)), Expr.Decrement(Expr.Constant((UInt32)2, typeof(UInt32)), null), "Decrement 6"));
  119. Expressions.Add(EU.GenAreEqual(Expr.Constant((double)1.0, typeof(double)), Expr.Decrement(Expr.Constant((double)2.0, typeof(double)), null), "Decrement 7"));
  120. Expressions.Add(EU.GenAreEqual(Expr.Constant((long)1.1, typeof(long)), Expr.Decrement(Expr.Constant((long)2.1, typeof(long)), null), "Decrement 8"));
  121. Expressions.Add(EU.GenAreEqual(Expr.Constant((ulong)1.001, typeof(ulong)), Expr.Decrement(Expr.Constant((ulong)2.001, typeof(ulong)), null), "Decrement 9"));
  122. Expressions.Add(EU.GenAreEqual(Expr.Constant((decimal)(0.001), typeof(decimal)), Expr.Decrement(Expr.Constant((decimal)1.001, typeof(decimal)), null), "Decrement 10"));
  123. var tree = Expr.Block(Expressions);
  124. V.Validate(tree);
  125. return tree;
  126. }
  127. // Pass a method that takes no arguments
  128. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 10", new string[] { "negative", "decrement", "operators", "Pri2" }, Exception = typeof(ArgumentException))]
  129. public static Expr Decrement10(EU.IValidator V) {
  130. List<Expression> Expressions = new List<Expression>();
  131. Func<int> f = () => 1;
  132. MethodInfo mi = f.Method;
  133. Expressions.Add(EU.Throws<System.ArgumentException>(() =>
  134. {
  135. EU.GenAreEqual(Expr.Constant(0), Expr.Decrement(Expr.Constant(1), mi), "Decrement 1");
  136. }));
  137. return Expr.Block(Expressions);
  138. }
  139. public static int paramTestMethod(params int[] args) {
  140. return 3;
  141. }
  142. // Pass a method that takes a param array
  143. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 11", new string[] { "negative", "decrement", "operators", "Pri2" }, Exception = typeof(InvalidOperationException))]
  144. public static Expr Decrement11(EU.IValidator V) {
  145. List<Expression> Expressions = new List<Expression>();
  146. MethodInfo mi = typeof(Decrement).GetMethod("paramTestMethod");
  147. EU.Throws<System.InvalidOperationException>(() =>
  148. {
  149. Expressions.Add(EU.GenAreEqual(Expr.Constant(3), Expr.Decrement(Expr.Constant(1), mi), "Decrement 1"));
  150. });
  151. return Expr.Empty();
  152. }
  153. // Pass a method that takes 2 arguments
  154. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 12", new string[] { "negative", "decrement", "operators", "Pri2" }, Exception = typeof(ArgumentException))]
  155. public static Expr Decrement12(EU.IValidator V) {
  156. List<Expression> Expressions = new List<Expression>();
  157. Func<int, int, int> f = (x, y) => x + y;
  158. MethodInfo mi = f.Method;
  159. Expressions.Add(EU.Throws<System.ArgumentException>(() =>
  160. {
  161. EU.GenAreEqual(Expr.Constant(5), Expr.Decrement(Expr.Constant(4), mi), "Decrement 1");
  162. }));
  163. return Expr.Empty();
  164. }
  165. public static double typeTestMethod(int x) {
  166. return (double)x - 1.0;
  167. }
  168. // Pass a method that returns a different type from expression
  169. [ETUtils.TestAttribute(ETUtils.TestState.Enabled, "Decrement 13", new string[] { "positive", "decrement", "operators", "Pri2" })]
  170. public static Expr Decrement13(EU.IValidator V) {
  171. List<Expression> Expressions = new List<Expression>();
  172. MethodInfo mi = typeof(Decrement).GetMethod("typeTestMethod");
  173. Expressions.Add(EU.GenAreEqual(Expr.Constant((double)2.0, typeof(double)), Expr.Decrement(Expr.Constant(3), mi), "Decrement 1"));
  174. var tree = Expr.Block(Expressions);
  175. V.Validate(tree);
  176. return tree;
  177. }
  178. }
  179. }