1 // Compiler options: -unsafe
4 using System.Collections.Generic;
6 using System.Linq.Expressions;
7 using System.Reflection;
9 public struct InverseLogicalOperator
12 public InverseLogicalOperator (bool value)
17 public static bool operator true (InverseLogicalOperator u)
22 public static bool operator false (InverseLogicalOperator u)
28 /* TODO: Add tests for every numeric expression where a type has only 1 implicit
30 public struct MyType<T>
34 public MyType (T value)
39 public static implicit operator T (MyType<T> o)
47 // TODO: Create a clone which uses +(MyType, int) pattern and an implicit conversion
48 // is required to do the user-conversion
54 public MyType (int value) : this ()
59 public short ShortProp { get; set; }
61 public override int GetHashCode ()
63 throw new NotImplementedException ();
66 public static implicit operator int (MyType o)
71 public static bool operator true (MyType a)
76 public static bool operator false (MyType a)
81 public static MyType operator + (MyType a, MyType b)
83 return new MyType (a.value + b.value);
86 public static MyType operator - (MyType a, MyType b)
88 return new MyType (a.value - b.value);
91 public static MyType operator / (MyType a, MyType b)
93 return new MyType (a.value / b.value);
96 public static MyType operator * (MyType a, MyType b)
98 return new MyType (a.value * b.value);
101 public static MyType operator % (MyType a, MyType b)
103 return new MyType (a.value % b.value);
106 public static MyType operator &(MyType a, MyType b)
108 return new MyType (a.value & b.value);
111 public static MyType operator | (MyType a, MyType b)
113 return new MyType (a.value | b.value);
116 public static MyType operator ^ (MyType a, MyType b)
118 return new MyType (a.value ^ b.value);
121 public static bool operator == (MyType a, MyType b)
123 return a.value == b.value;
126 public static bool operator != (MyType a, MyType b)
128 return a.value != b.value;
131 public static bool operator > (MyType a, MyType b)
133 return a.value > b.value;
136 public static bool operator < (MyType a, MyType b)
138 return a.value < b.value;
141 public static bool operator >= (MyType a, MyType b)
143 return a.value >= b.value;
146 public static bool operator <= (MyType a, MyType b)
148 return a.value <= b.value;
151 public static bool operator ! (MyType a)
156 public static int operator >> (MyType a, int b)
161 public static int operator << (MyType a, int b)
166 public static MyType operator - (MyType a)
168 return new MyType (-a.value);
171 public static MyType operator + (MyType a)
173 return new MyType (+a.value);
176 public override string ToString ()
178 return value.ToString ();
187 public MyTypeExplicit (int value)
192 public static explicit operator int (MyTypeExplicit m)
198 struct MyTypeImplicitOnly
202 public MyTypeImplicitOnly (short b)
207 public static implicit operator short (MyTypeImplicitOnly m)
213 struct StructWithUserConstructor
215 public StructWithUserConstructor ()
221 class MemberAccessData
223 public bool BoolValue;
224 public static decimal DecimalValue = decimal.MinValue;
225 public volatile uint VolatileValue;
226 public string [] StringValues;
227 public List<string> ListValues;
229 event Func<bool> EventField;
230 public Expression<Func<Func<bool>>> GetEvent ()
232 return () => EventField;
236 public MyType MyTypeProperty {
245 public static string StaticProperty {
251 public object SetOnly { set { } }
260 enum MyEnumUlong : ulong
280 public NewTest (params T [] t)
285 public override int GetHashCode ()
287 return base.GetHashCode ();
290 public override bool Equals (object obj)
292 NewTest<T> obj_t = obj as NewTest<T>;
296 for (int i = 0; i < t.Length; ++i) {
297 if (!t [i].Equals (obj_t.t [i]))
307 public int this [int i] { get { return i; } set { } }
308 public string this [params string[] i] { get { return string.Concat (i); } }
314 // TODO: Add more nullable tests, follow AddTest pattern.
318 delegate void EmptyDelegate ();
319 delegate int IntDelegate ();
320 static int ReturnNumber ()
325 static void AssertNodeType (LambdaExpression e, ExpressionType et)
327 if (e.Body.NodeType != et)
328 throw new ApplicationException (e.Body.NodeType + " != " + et);
331 static void Assert<T> (T expected, T value)
333 Assert (expected, value, null);
336 static void Assert<T> (T expected, T value, string name)
338 if (!EqualityComparer<T>.Default.Equals (expected, value)) {
339 if (!string.IsNullOrEmpty (name))
341 throw new ApplicationException (name + expected + " != " + value);
345 static void Assert<T> (T [] expected, T [] value)
347 if (expected == null) {
349 throw new ApplicationException ("Both arrays expected to be null");
353 if (expected.Length != value.Length)
354 throw new ApplicationException ("Array length does not match " + expected.Length + " != " + value.Length);
356 for (int i = 0; i < expected.Length; ++i) {
357 if (!EqualityComparer<T>.Default.Equals (expected [i], value [i]))
358 throw new ApplicationException ("Index " + i + ": " + expected [i] + " != " + value [i]);
362 #pragma warning disable 169
366 Expression<Func<int, int, int>> e = (int a, int b) => a + b;
367 AssertNodeType (e, ExpressionType.Add);
368 Assert (50, e.Compile ().Invoke (20, 30));
373 Expression<Func<int?, int?, int?>> e2 = (a, b) => a + b;
374 AssertNodeType (e2, ExpressionType.Add);
375 Assert (null, e2.Compile ().Invoke (null, 3));
380 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a + b;
381 AssertNodeType (e3, ExpressionType.Add);
382 Assert (10, e3.Compile ().Invoke (new MyType (-20), new MyType (30)));
387 Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a + b;
388 AssertNodeType (e4, ExpressionType.Add);
389 Assert (new MyType (10), e4.Compile ().Invoke (new MyType (-20), new MyType (30)));
390 Assert (null, e4.Compile ().Invoke (null, new MyType (30)));
395 Expression<Func<int, MyType, int>> e5 = (int a, MyType b) => a + b;
396 AssertNodeType (e5, ExpressionType.Add);
397 Assert (31, e5.Compile ().Invoke (1, new MyType (30)));
402 Expression<Func<int, MyType?, int?>> e6 = (int a, MyType? b) => a + b;
403 AssertNodeType (e6, ExpressionType.Add);
404 Assert (-1, e6.Compile ().Invoke (-31, new MyType (30)));
409 Expression<Func<MyEnum, byte, MyEnum>> e7 = (a, b) => a + b;
410 AssertNodeType (e7, ExpressionType.Convert);
411 Assert (MyEnum.Value_2, e7.Compile ().Invoke (MyEnum.Value_1, 1));
416 // CSC BUG: probably due to missing numeric promotion
417 Expression<Func<MyEnum?, byte?, MyEnum?>> e8 = (a, b) => a + b;
418 AssertNodeType (e8, ExpressionType.Convert);
419 Assert<MyEnum?> (0, e8.Compile ().Invoke (MyEnum.Value_1, 255));
420 Assert (null, e8.Compile ().Invoke (MyEnum.Value_1, null));
421 Assert (null, e8.Compile ().Invoke (null, null));
426 Expression<Func<byte, MyEnum, MyEnum>> e9 = (a, b) => a + b;
427 AssertNodeType (e9, ExpressionType.Convert);
428 Assert (MyEnum.Value_2, e9.Compile ().Invoke (1, MyEnum.Value_1));
431 void AddCheckedTest ()
434 Expression<Func<int, int, int>> e = (int a, int b) => a + b;
435 AssertNodeType (e, ExpressionType.AddChecked);
436 Assert (50, e.Compile ().Invoke (20, 30));
440 void AddCheckedTest_2 ()
443 Expression<Func<int?, int?, int?>> e2 = (a, b) => a + b;
444 AssertNodeType (e2, ExpressionType.AddChecked);
445 Assert (null, e2.Compile ().Invoke (null, 3));
449 void AddCheckedTest_3 ()
452 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a + b;
453 AssertNodeType (e3, ExpressionType.Add);
454 Assert (10, e3.Compile ().Invoke (new MyType (-20), new MyType (30)));
458 void AddStringTest ()
460 Expression<Func<string, string>> e6 = (a) => 1 + a;
461 AssertNodeType (e6, ExpressionType.Add);
462 Assert ("1to", e6.Compile ().Invoke ("to"));
465 void AddStringTest_2 ()
467 Expression<Func<object, string, string>> e7 = (object a, string b) => a + b;
468 AssertNodeType (e7, ExpressionType.Add);
469 Assert ("testme", e7.Compile ().Invoke ("test", "me"));
470 Assert ("test", e7.Compile ().Invoke ("test", null));
471 Assert ("", e7.Compile ().Invoke (null, null));
474 void AddStringTest_3 ()
476 Expression<Func<string, int, string>> e8 = (a, b) => a + " " + "-" + "> " + b;
477 AssertNodeType (e8, ExpressionType.Add);
478 Assert ("test -> 2", e8.Compile ().Invoke ("test", 2));
481 void AddStringTest_4 ()
483 Expression<Func<string, ushort?, string>> e9 = (a, b) => a + b;
484 AssertNodeType (e9, ExpressionType.Add);
485 Assert ("test2", e9.Compile ().Invoke ("test", 2));
486 Assert ("test", e9.Compile ().Invoke ("test", null));
491 Expression<Func<bool, bool, bool>> e = (bool a, bool b) => a & b;
493 AssertNodeType (e, ExpressionType.And);
494 Func<bool, bool, bool> c = e.Compile ();
496 Assert (true, c (true, true));
497 Assert (false, c (true, false));
498 Assert (false, c (false, true));
499 Assert (false, c (false, false));
504 Expression<Func<MyType, MyType, MyType>> e2 = (MyType a, MyType b) => a & b;
506 AssertNodeType (e2, ExpressionType.And);
507 var c2 = e2.Compile ();
509 Assert (new MyType (0), c2 (new MyType (0), new MyType (1)));
510 Assert (new MyType (1), c2 (new MyType (0xFF), new MyType (0x01)));
515 Expression<Func<MyEnum, MyEnum, MyEnum>> e3 = (a, b) => a & b;
516 AssertNodeType (e3, ExpressionType.Convert);
517 Assert<MyEnum> (0, e3.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
518 Assert (MyEnum.Value_2, e3.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
523 Expression<Func<int, int>> e = (a) => a & 0;
524 AssertNodeType (e, ExpressionType.And);
525 var c = e.Compile ();
530 void AndNullableTest ()
532 Expression<Func<bool?, bool?, bool?>> e = (bool? a, bool? b) => a & b;
534 AssertNodeType (e, ExpressionType.And);
535 Func<bool?, bool?, bool?> c = e.Compile ();
537 Assert (true, c (true, true));
538 Assert (false, c (true, false));
539 Assert (false, c (false, true));
540 Assert (false, c (false, false));
542 Assert (null, c (true, null));
543 Assert (false, c (false, null));
544 Assert (false, c (null, false));
545 Assert (null, c (true, null));
546 Assert (null, c (null, null));
549 void AndNullableTest_2 ()
551 Expression<Func<MyType?, MyType?, MyType?>> e2 = (MyType? a, MyType? b) => a & b;
553 AssertNodeType (e2, ExpressionType.And);
554 var c2 = e2.Compile ();
556 Assert (new MyType (0), c2 (new MyType (0), new MyType (1)));
557 Assert (new MyType (1), c2 (new MyType (0xFF), new MyType (0x01)));
558 Assert (null, c2 (new MyType (0xFF), null));
561 void AndNullableTest_3 ()
563 Expression<Func<MyEnum?, MyEnum?, MyEnum?>> e3 = (a, b) => a & b;
564 AssertNodeType (e3, ExpressionType.Convert);
565 Assert (null, e3.Compile ().Invoke (null, MyEnum.Value_2));
566 Assert (MyEnum.Value_2, e3.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
571 Expression<Func<bool, bool, bool>> e = (bool a, bool b) => a && b;
572 AssertNodeType (e, ExpressionType.AndAlso);
573 Assert (false, e.Compile ().Invoke (true, false));
576 void AndAlsoTest_2 ()
578 Expression<Func<MyType, MyType, MyType>> e2 = (MyType a, MyType b) => a && b;
579 AssertNodeType (e2, ExpressionType.AndAlso);
580 Assert (new MyType (64), e2.Compile ().Invoke (new MyType (64), new MyType (64)));
581 Assert (new MyType (0), e2.Compile ().Invoke (new MyType (32), new MyType (64)));
584 void AndAlsoTest_3 ()
586 Expression<Func<bool, bool>> e3 = (bool a) => a && true;
587 AssertNodeType (e3, ExpressionType.AndAlso);
588 Assert (false, e3.Compile ().Invoke (false));
589 Assert (true, e3.Compile ().Invoke (true));
592 void ArrayIndexTest ()
594 Expression<Func<string [], long, string>> e = (string [] a, long i) => a [i];
595 AssertNodeType (e, ExpressionType.ArrayIndex);
596 Assert ("b", e.Compile ().Invoke (new string [] { "a", "b", "c" }, 1));
599 void ArrayIndexTest_2 ()
601 Expression<Func<string [], string>> e2 = (string [] a) => a [0];
602 AssertNodeType (e2, ExpressionType.ArrayIndex);
603 Assert ("a", e2.Compile ().Invoke (new string [] { "a", "b" }));
606 void ArrayIndexTest_3 ()
608 Expression<Func<object [,], int, int, object>> e3 = (object [,] a, int i, int j) => a [i, j];
609 AssertNodeType (e3, ExpressionType.Call);
611 Assert ("z", e3.Compile ().Invoke (
612 new object [,] { { 1, 2 }, { "x", "z" } }, 1, 1));
615 void ArrayIndexTest_4 ()
617 Expression<Func<decimal [] [], byte, decimal>> e4 = (decimal [] [] a, byte b) => a [b] [1];
618 AssertNodeType (e4, ExpressionType.ArrayIndex);
620 decimal [] [] array = { new decimal [] { 1, 9 }, new decimal [] { 10, 90 } };
621 Assert (90, e4.Compile ().Invoke (array, 1));
624 void ArrayIndexTest_5 ()
626 Expression<Func<int>> e5 = () => (new int [1]) [0];
627 AssertNodeType (e5, ExpressionType.ArrayIndex);
628 Assert (0, e5.Compile ().Invoke ());
631 void ArrayIndexTest_6 ()
635 Expression<Func<int[], int>> e = a => a [max];
636 AssertNodeType (e, ExpressionType.ArrayIndex);
637 Assert (4, e.Compile ().Invoke (new int [] { 1, 2, 3, 4, 5 }));
640 void ArrayIndexTest_7 ()
642 const ulong max = uint.MaxValue;
644 Expression<Func<int[], int>> e = a => a [max];
645 AssertNodeType (e, ExpressionType.ArrayIndex);
648 e.Compile ().Invoke (new int [0]);
649 throw new ApplicationException ("ArrayIndexTest_7");
650 } catch (System.OverflowException) {
651 // Check whether CheckedConversion was generated
655 void ArrayLengthTest ()
657 Expression<Func<double [], int>> e = (double [] a) => a.Length;
658 AssertNodeType (e, ExpressionType.ArrayLength);
659 Assert (0, e.Compile ().Invoke (new double [0]));
660 Assert (9, e.Compile ().Invoke (new double [9]));
663 void ArrayLengthTest_2 ()
665 Expression<Func<string [,], int>> e2 = (string [,] a) => a.Length;
666 AssertNodeType (e2, ExpressionType.MemberAccess);
667 Assert (0, e2.Compile ().Invoke (new string [0, 0]));
672 Expression<Func<int, int>> e = (int a) => Math.Max (a, 5);
673 AssertNodeType (e, ExpressionType.Call);
674 Assert (5, e.Compile ().Invoke (2));
675 Assert (9, e.Compile ().Invoke (9));
680 Expression<Func<string, string>> e2 = (string a) => InstanceMethod (a);
681 AssertNodeType (e2, ExpressionType.Call);
682 Assert ("abc", e2.Compile ().Invoke ("abc"));
687 Expression<Func<int, string, int, object>> e3 = (int index, string a, int b) => InstanceParamsMethod (index, a, b);
688 AssertNodeType (e3, ExpressionType.Call);
689 Assert<object> (4, e3.Compile ().Invoke (1, "a", 4));
694 Expression<Func<object>> e4 = () => InstanceParamsMethod (0);
695 AssertNodeType (e4, ExpressionType.Call);
696 Assert<object> ("<empty>", e4.Compile ().Invoke ());
701 Expression<Func<int, int>> e5 = (int a) => GenericMethod (a);
702 AssertNodeType (e5, ExpressionType.Call);
703 Assert (5, e5.Compile ().Invoke (5));
708 Expression<Action> e6 = () => Console.WriteLine ("call test");
709 AssertNodeType (e6, ExpressionType.Call);
714 Expression<Func<Indexer, int, int>> e7 = (a, b) => a [b];
715 AssertNodeType (e7, ExpressionType.Call);
716 Assert (3, e7.Compile ().Invoke (new Indexer (), 3));
721 Expression<Func<Indexer, string, string, string, string>> e8 = (a, b, c , d) => a [b, c, d];
722 AssertNodeType (e8, ExpressionType.Call);
723 Assert ("zyb", e8.Compile ().Invoke (new Indexer (), "z", "y", "b"));
728 Expression<Action<int>> e9 = (a) => RefMethod (ref a);
729 AssertNodeType (e9, ExpressionType.Call);
730 e9.Compile ().Invoke (1);
735 Expression<Func<string>> e = () => $"{int.MaxValue}";
736 AssertNodeType (e, ExpressionType.Call);
737 Assert (int.MaxValue.ToString (), e.Compile ().Invoke ());
742 Expression<Func<uint?, uint>> e = (uint? a) => a ?? 99;
743 AssertNodeType (e, ExpressionType.Coalesce);
744 var r = e.Compile ();
745 Assert ((uint) 5, r.Invoke (5));
746 Assert ((uint) 99, r.Invoke (null));
749 void CoalesceTest_2 ()
751 Expression<Func<MyType?, int>> e2 = (MyType? a) => a ?? -3;
752 AssertNodeType (e2, ExpressionType.Coalesce);
753 var r2 = e2.Compile ();
754 Assert (2, r2.Invoke (new MyType (2)));
755 Assert (-3, r2.Invoke (null));
758 void ConditionTest ()
760 Expression<Func<bool, byte, int, int>> e = (bool a, byte b, int c) => (a ? b : c);
761 AssertNodeType (e, ExpressionType.Conditional);
762 var r = e.Compile ();
763 Assert (3, r.Invoke (true, 3, 999999));
764 Assert (999999, r.Invoke (false, 3, 999999));
767 void ConditionTest_2 ()
769 Expression<Func<int, decimal, decimal?>> e2 = (int a, decimal d) => (a > 0 ? d : a < 0 ? -d : (decimal?) null);
770 AssertNodeType (e2, ExpressionType.Conditional);
771 var r2 = e2.Compile ();
772 Assert (null, r2.Invoke (0, 10));
773 Assert (50, r2.Invoke (1, 50));
774 Assert (30, r2.Invoke (-7, -30));
777 void ConditionTest_3 ()
779 Expression<Func<bool?, int?>> e3 = (bool? a) => ((bool) a ? 3 : -2);
780 AssertNodeType (e3, ExpressionType.Convert);
781 var r3 = e3.Compile ();
782 Assert (3, r3.Invoke (true));
783 Assert (-2, r3.Invoke (false));
786 void ConditionTest_4 ()
788 Expression<Func<InverseLogicalOperator, byte, byte, byte>> e4 = (InverseLogicalOperator a, byte b, byte c) => (a ? b : c);
789 AssertNodeType (e4, ExpressionType.Conditional);
790 var r4 = e4.Compile ();
791 Assert (3, r4.Invoke (new InverseLogicalOperator (true), 3, 4));
792 Assert (4, r4.Invoke (new InverseLogicalOperator (false), 3, 4));
795 void ConditionTest_5 ()
798 Expression<Func<int>> e = () => false ? 1 : 4;
799 AssertNodeType (e, ExpressionType.Conditional);
800 var r = e.Compile ();
801 Assert (4, r.Invoke ());
806 Expression<Func<int>> e1 = () => default (int);
807 AssertNodeType (e1, ExpressionType.Constant);
808 Assert (0, e1.Compile ().Invoke ());
811 void ConstantTest_2 ()
813 Expression<Func<int?>> e2 = () => default (int?);
814 AssertNodeType (e2, ExpressionType.Constant);
815 Assert (null, e2.Compile ().Invoke ());
818 void ConstantTest_3 ()
820 Expression<Func<Tester>> e3 = () => default (Tester);
821 AssertNodeType (e3, ExpressionType.Constant);
822 Assert (null, e3.Compile ().Invoke ());
825 void ConstantTest_4 ()
827 Expression<Func<object>> e4 = () => null;
828 AssertNodeType (e4, ExpressionType.Constant);
829 Assert (null, e4.Compile ().Invoke ());
832 void ConstantTest_5 ()
834 Expression<Func<int>> e5 = () => 8 / 4;
835 AssertNodeType (e5, ExpressionType.Constant);
836 Assert (2, e5.Compile ().Invoke ());
839 void ConstantTest_6 ()
841 Expression<Func<int>> e6 = () => 0xFFFFFF >> 0x40;
842 AssertNodeType (e6, ExpressionType.Constant);
843 Assert (0xFFFFFF, e6.Compile ().Invoke ());
846 void ConstantTest_7 ()
848 Expression<Func<object>> e7 = () => "Alleluia";
849 AssertNodeType (e7, ExpressionType.Constant);
850 Assert ("Alleluia", e7.Compile ().Invoke ());
853 void ConstantTest_8 ()
855 Expression<Func<Type>> e8 = () => typeof (int);
856 AssertNodeType (e8, ExpressionType.Constant);
857 Assert (typeof (int), e8.Compile ().Invoke ());
860 void ConstantTest_9 ()
862 Expression<Func<Type>> e9 = () => typeof (void);
863 AssertNodeType (e9, ExpressionType.Constant);
864 Assert (typeof (void), e9.Compile ().Invoke ());
867 void ConstantTest_10 ()
869 Expression<Func<Type>> e10 = () => typeof (Func<,>);
870 AssertNodeType (e10, ExpressionType.Constant);
871 Assert (typeof (Func<,>), e10.Compile ().Invoke ());
874 void ConstantTest_11 ()
876 Expression<Func<MyEnum>> e11 = () => MyEnum.Value_2;
877 AssertNodeType (e11, ExpressionType.Constant);
878 Assert (MyEnum.Value_2, e11.Compile ().Invoke ());
881 void ConstantTest_13 ()
883 Expression<Func<int>> e13 = () => sizeof (byte);
884 AssertNodeType (e13, ExpressionType.Constant);
885 Assert (1, e13.Compile ().Invoke ());
889 void ConstantTest_14 ()
891 Expression<Func<Type>> e14 = () => typeof (bool*);
892 AssertNodeType (e14, ExpressionType.Constant);
893 Assert (typeof (bool*), e14.Compile ().Invoke ());
896 void ConstantTest_15 ()
898 Expression<Func<int?>> e15 = () => null;
899 AssertNodeType (e15, ExpressionType.Constant);
900 Assert (null, e15.Compile ().Invoke ());
905 Expression<Func<int, byte>> e = (int a) => ((byte) a);
906 AssertNodeType (e, ExpressionType.Convert);
907 Assert (100, e.Compile ().Invoke (100));
910 void ConvertTest_2 ()
912 Expression<Func<long, ushort>> e2 = (long a) => ((ushort) a);
913 AssertNodeType (e2, ExpressionType.Convert);
914 Assert (100, e2.Compile ().Invoke (100));
917 void ConvertTest_3 ()
919 Expression<Func<float?, float>> e3 = (float? a) => ((float) a);
920 AssertNodeType (e3, ExpressionType.Convert);
921 Assert (-0.456f, e3.Compile ().Invoke (-0.456f));
924 void ConvertTest_4 ()
926 Expression<Func<MyType, int>> e4 = (MyType a) => (a);
927 AssertNodeType (e4, ExpressionType.Convert);
928 Assert (-9, e4.Compile ().Invoke (new MyType (-9)));
931 void ConvertTest_5 ()
933 Expression<Func<MyType, MyType, bool?>> e5 = (MyType a, MyType b) => a == b;
934 AssertNodeType (e5, ExpressionType.Convert);
937 void ConvertTest_6 ()
939 Expression<Func<MyType?, MyType?, bool?>> e6 = (MyType? a, MyType? b) => a == b;
940 AssertNodeType (e6, ExpressionType.Convert);
941 Assert (false, e6.Compile ().Invoke (null, new MyType (-20)));
942 Assert (true, e6.Compile ().Invoke (null, null));
943 Assert (true, e6.Compile ().Invoke (new MyType (120), new MyType (120)));
946 void ConvertTest_7 ()
948 Expression<Func<MyTypeExplicit, int?>> e7 = x => (int?)x;
949 AssertNodeType (e7, ExpressionType.Convert);
950 Assert (33, e7.Compile ().Invoke (new MyTypeExplicit (33)));
953 void ConvertTest_8 ()
955 Expression<Func<int?, object>> e8 = x => (object)x;
956 AssertNodeType (e8, ExpressionType.Convert);
957 Assert (null, e8.Compile ().Invoke (null));
958 Assert (-100, e8.Compile ().Invoke (-100));
961 unsafe void ConvertTest_9 ()
963 int*[] p = new int* [1];
964 Expression<Func<object>> e9 = () => (object)p;
965 AssertNodeType (e9, ExpressionType.Convert);
966 Assert (p, e9.Compile ().Invoke ());
969 void ConvertTest_10 ()
971 Expression<Func<Func<int>, Delegate>> e10 = (a) => a + a;
972 AssertNodeType (e10, ExpressionType.Convert);
973 Assert (null, e10.Compile ().Invoke (null));
974 Assert (new Func<int> (TestInt) + new Func<int> (TestInt), e10.Compile ().Invoke (TestInt));
977 void ConvertTest_11 ()
979 Expression<Func<Func<int>, Delegate>> e11 = (a) => a - a;
980 AssertNodeType (e11, ExpressionType.Convert);
981 Assert (null, e11.Compile ().Invoke (null));
984 void ConvertTest_12 ()
986 Expression<Func<Func<int>>> e12 = () => TestInt;
987 AssertNodeType (e12, ExpressionType.Convert);
988 Assert (29, e12.Compile ().Invoke () ());
991 void ConvertTest_13 ()
993 Expression<Func<decimal, sbyte>> e13 = a => (sbyte)a;
994 AssertNodeType (e13, ExpressionType.Convert);
995 Assert (6, e13.Compile ().Invoke (6));
998 void ConvertTest_14 ()
1000 Expression<Func<long, decimal>> e14 = a => a;
1001 AssertNodeType (e14, ExpressionType.Convert);
1002 Assert (-66, e14.Compile ().Invoke (-66));
1005 void ConvertTest_15 ()
1007 Expression<Func<ulong?, decimal?>> e15 = a => a;
1008 AssertNodeType (e15, ExpressionType.Convert);
1009 Assert (null, e15.Compile ().Invoke (null));
1010 Assert (9, e15.Compile ().Invoke (9));
1013 void ConvertTest_16 ()
1015 Expression<Func<sbyte, sbyte>> e16 = a => (sbyte)a;
1016 AssertNodeType (e16, ExpressionType.Convert);
1017 Assert (6, e16.Compile ().Invoke (6));
1020 void ConvertCheckedTest ()
1022 Expression<Func<int, byte>> e = (int a) => checked((byte) a);
1023 AssertNodeType (e, ExpressionType.ConvertChecked);
1024 Assert (100, e.Compile ().Invoke (100));
1027 void ConvertCheckedTest_2 ()
1030 Expression<Func<long, ushort>> e2 = (long a) => unchecked((ushort) a);
1031 AssertNodeType (e2, ExpressionType.Convert);
1032 Assert (100, e2.Compile ().Invoke (100));
1036 void ConvertCheckedTest_3 ()
1039 Expression<Func<float?, float>> e3 = (float? a) => ((float) a);
1040 AssertNodeType (e3, ExpressionType.ConvertChecked);
1041 Assert (-0.456f, e3.Compile ().Invoke (-0.456f));
1045 void ConvertCheckedTest_4 ()
1048 Expression<Func<MyType, int>> e4 = (MyType a) => (a);
1049 AssertNodeType (e4, ExpressionType.Convert);
1050 Assert (-9, e4.Compile ().Invoke (new MyType (-9)));
1056 Expression<Func<int, int, int>> e = (int a, int b) => a / b;
1057 AssertNodeType (e, ExpressionType.Divide);
1058 Assert (2, e.Compile ().Invoke (60, 30));
1061 void DivideTest_2 ()
1063 Expression<Func<double?, double?, double?>> e2 = (a, b) => a / b;
1064 AssertNodeType (e2, ExpressionType.Divide);
1065 Assert (null, e2.Compile ().Invoke (null, 3));
1066 Assert (1.5, e2.Compile ().Invoke (3, 2));
1069 void DivideTest_3 ()
1071 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a / b;
1072 AssertNodeType (e3, ExpressionType.Divide);
1073 Assert (1, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
1076 void DivideTest_4 ()
1078 Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a / b;
1079 AssertNodeType (e4, ExpressionType.Divide);
1080 Assert (null, e4.Compile ().Invoke (null, new MyType (-20)));
1081 Assert (new MyType (-6), e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
1084 void DivideTest_5 ()
1086 Expression<Func<int, MyType, int>> e5 = (int a, MyType b) => a / b;
1087 AssertNodeType (e5, ExpressionType.Divide);
1088 Assert (50, e5.Compile ().Invoke (100, new MyType (2)));
1091 void DivideTest_6 ()
1093 Expression<Func<int, MyType?, int?>> e6 = (int a, MyType? b) => a / b;
1094 AssertNodeType (e6, ExpressionType.Divide);
1095 Assert (50, e6.Compile ().Invoke (100, new MyType (2)));
1096 Assert (null, e6.Compile ().Invoke (20, null));
1099 void DivideTest_7 ()
1101 Expression<Func<float, uint?, float?>> e = (a, b) => a / b;
1102 AssertNodeType (e, ExpressionType.Divide);
1103 Assert (50, e.Compile () (100, 2));
1104 Assert (null, e.Compile () (20, null));
1109 Expression<Func<int, int, bool>> e = (int a, int b) => a == b;
1110 AssertNodeType (e, ExpressionType.Equal);
1111 Assert (false, e.Compile ().Invoke (60, 30));
1112 Assert (true, e.Compile ().Invoke (-1, -1));
1117 Expression<Func<double?, double?, bool>> e2 = (a, b) => a == b;
1118 AssertNodeType (e2, ExpressionType.Equal);
1119 Assert (true, e2.Compile ().Invoke (3, 3));
1120 Assert (false, e2.Compile ().Invoke (3, 2));
1125 Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a == b;
1126 AssertNodeType (e3, ExpressionType.Equal);
1127 Assert (true, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
1132 Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a == b;
1133 AssertNodeType (e4, ExpressionType.Equal);
1134 Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
1135 Assert (true, e4.Compile ().Invoke (null, null));
1136 Assert (true, e4.Compile ().Invoke (new MyType (120), new MyType (120)));
1141 Expression<Func<bool?, bool?, bool>> e5 = (bool? a, bool? b) => a == b;
1142 AssertNodeType (e5, ExpressionType.Equal);
1143 Assert (false, e5.Compile ().Invoke (true, null));
1144 Assert (true, e5.Compile ().Invoke (null, null));
1145 Assert (true, e5.Compile ().Invoke (false, false));
1150 Expression<Func<bool, bool>> e6 = (bool a) => a == null;
1151 AssertNodeType (e6, ExpressionType.Equal);
1152 Assert (false, e6.Compile ().Invoke (true));
1153 Assert (false, e6.Compile ().Invoke (false));
1158 Expression<Func<string, string, bool>> e7 = (string a, string b) => a == b;
1159 AssertNodeType (e7, ExpressionType.Equal);
1160 Assert (true, e7.Compile ().Invoke (null, null));
1161 Assert (false, e7.Compile ().Invoke ("a", "A"));
1162 Assert (true, e7.Compile ().Invoke ("a", "a"));
1167 Expression<Func<object, bool>> e8 = (object a) => null == a;
1168 AssertNodeType (e8, ExpressionType.Equal);
1169 Assert (true, e8.Compile ().Invoke (null));
1170 Assert (false, e8.Compile ().Invoke ("a"));
1171 Assert (false, e8.Compile ().Invoke (this));
1176 Expression<Func<MyEnum, MyEnum, bool>> e9 = (a, b) => a == b;
1177 AssertNodeType (e9, ExpressionType.Equal);
1178 Assert (false, e9.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
1179 Assert (true, e9.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1182 void EqualTest_10 ()
1184 Expression<Func<MyEnum?, MyEnum?, bool>> e10 = (a, b) => a == b;
1185 AssertNodeType (e10, ExpressionType.Equal);
1186 Assert (false, e10.Compile ().Invoke (MyEnum.Value_1, null));
1187 Assert (true, e10.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1190 void EqualTest_11 ()
1192 Expression<Func<MyEnum?, bool>> e11 = (a) => a == null;
1193 AssertNodeType (e11, ExpressionType.Equal);
1194 Assert (false, e11.Compile ().Invoke (MyEnum.Value_1));
1195 Assert (true, e11.Compile ().Invoke (null));
1198 void EqualTest_12 ()
1200 Expression<Func<MyEnumUlong, bool>> e12 = (a) => a == 0;
1201 AssertNodeType (e12, ExpressionType.Equal);
1202 Assert (false, e12.Compile ().Invoke (MyEnumUlong.Value_1));
1203 Assert (true, e12.Compile ().Invoke (0));
1206 void EqualTest_13 ()
1208 Expression<Func<MyEnum, bool>> e13 = (a) => a == MyEnum.Value_2;
1209 AssertNodeType (e13, ExpressionType.Equal);
1210 Assert (true, e13.Compile ().Invoke (MyEnum.Value_2));
1211 Assert (false, e13.Compile ().Invoke (0));
1214 void EqualTest_14 ()
1216 Expression<Func<MyEnum, bool>> e = (a) => a == null;
1217 AssertNodeType (e, ExpressionType.Equal);
1218 Assert (false, e.Compile ().Invoke (MyEnum.Value_1));
1221 void EqualTest_15 ()
1223 Expression<Func<int?, uint, bool>> e = (a, b) => a == b;
1224 AssertNodeType (e, ExpressionType.Equal);
1225 Assert (false, e.Compile ().Invoke (null, 0));
1226 Assert (true, e.Compile ().Invoke (4, 4));
1229 void EqualTest_16 ()
1231 Expression<Func<EnumInt?, EnumInt, bool?>> e = (x, y) => x == y;
1232 AssertNodeType (e, ExpressionType.Convert);
1233 Assert (false, e.Compile () (null, 0));
1234 Assert (true, e.Compile () (EnumInt.B, EnumInt.B));
1237 void EqualTestDelegate ()
1239 Expression<Func<Delegate, Delegate, bool>> e1 = (a, b) => a == b;
1240 AssertNodeType (e1, ExpressionType.Equal);
1241 Assert (true, e1.Compile ().Invoke (null, null));
1244 void EqualTestDelegate_2 ()
1246 EmptyDelegate ed = delegate () {};
1248 Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
1249 AssertNodeType (e2, ExpressionType.Equal);
1250 Assert (false, e2.Compile ().Invoke (delegate () {}, null));
1251 Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
1252 Assert (false, e2.Compile ().Invoke (ed, delegate {}));
1253 Assert (true, e2.Compile ().Invoke (ed, ed));
1256 void EqualTestDelegate_3 ()
1258 Expression<Func<Func<int>, bool>> e1 = (a) => a == ReturnNumber;
1259 AssertNodeType (e1, ExpressionType.Equal);
1260 Assert (false, e1.Compile ().Invoke (null));
1261 Assert (true, e1.Compile ().Invoke (ReturnNumber));
1264 void ExclusiveOrTest ()
1266 Expression<Func<int, short, int>> e = (int a, short b) => a ^ b;
1267 AssertNodeType (e, ExpressionType.ExclusiveOr);
1268 Assert (34, e.Compile ().Invoke (60, 30));
1271 void ExclusiveOrTest_2 ()
1273 Expression<Func<byte?, byte?, int?>> e2 = (a, b) => a ^ b;
1274 AssertNodeType (e2, ExpressionType.ExclusiveOr);
1275 Assert (null, e2.Compile ().Invoke (null, 3));
1276 Assert (1, e2.Compile ().Invoke (3, 2));
1279 void ExclusiveOrTest_3 ()
1281 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a ^ b;
1282 AssertNodeType (e3, ExpressionType.ExclusiveOr);
1283 Assert (0, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
1286 void ExclusiveOrTest_4 ()
1288 Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a ^ b;
1289 AssertNodeType (e4, ExpressionType.ExclusiveOr);
1290 Assert (null, e4.Compile ().Invoke (null, new MyType (-20)));
1291 Assert (new MyType (-108), e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
1294 void ExclusiveOrTest_5 ()
1296 Expression<Func<MyType?, byte, int?>> e5 = (MyType? a, byte b) => a ^ b;
1297 AssertNodeType (e5, ExpressionType.ExclusiveOr);
1298 Assert (null, e5.Compile ().Invoke (null, 64));
1299 Assert (96, e5.Compile ().Invoke (new MyType (64), 32));
1302 void ExclusiveOrTest_6 ()
1304 Expression<Func<MyEnum, MyEnum, MyEnum>> e6 = (a, b) => a ^ b;
1305 AssertNodeType (e6, ExpressionType.Convert);
1306 Assert ((MyEnum)3, e6.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
1307 Assert<MyEnum> (0, e6.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1310 void ExclusiveOrTest_7 ()
1312 Expression<Func<MyEnum?, MyEnum?, MyEnum?>> e7 = (a, b) => a ^ b;
1313 AssertNodeType (e7, ExpressionType.Convert);
1314 Assert (null, e7.Compile ().Invoke (MyEnum.Value_1, null));
1315 Assert<MyEnum?> (0, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1318 void ExclusiveOrTest_8 ()
1320 Expression<Func<MyEnum?, MyEnum?>> e8 = (a) => a ^ null;
1321 AssertNodeType (e8, ExpressionType.Convert);
1322 Assert (null, e8.Compile ().Invoke (MyEnum.Value_1));
1323 Assert (null, e8.Compile ().Invoke (null));
1326 void GreaterThanTest ()
1328 Expression<Func<int, int, bool>> e = (int a, int b) => a > b;
1329 AssertNodeType (e, ExpressionType.GreaterThan);
1330 Assert (true, e.Compile ().Invoke (60, 30));
1333 void GreaterThanTest_2 ()
1335 Expression<Func<uint?, byte?, bool>> e2 = (a, b) => a > b;
1336 AssertNodeType (e2, ExpressionType.GreaterThan);
1337 Assert (false, e2.Compile ().Invoke (null, 3));
1338 Assert (false, e2.Compile ().Invoke (2, 2));
1341 void GreaterThanTest_3 ()
1343 Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a > b;
1344 AssertNodeType (e3, ExpressionType.GreaterThan);
1345 Assert (false, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
1348 void GreaterThanTest_4 ()
1350 Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a > b;
1351 AssertNodeType (e4, ExpressionType.GreaterThan);
1352 Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
1353 Assert (false, e4.Compile ().Invoke (null, null));
1354 Assert (true, e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
1357 void GreaterThanTest_5 ()
1359 Expression<Func<MyType?, sbyte, bool>> e5 = (MyType? a, sbyte b) => a > b;
1360 AssertNodeType (e5, ExpressionType.GreaterThan);
1361 Assert (false, e5.Compile ().Invoke (null, 33));
1362 Assert (false, e5.Compile ().Invoke (null, 0));
1363 Assert (true, e5.Compile ().Invoke (new MyType (120), 3));
1366 void GreaterThanTest_6 ()
1368 Expression<Func<ushort, bool>> e6 = (ushort a) => a > null;
1369 AssertNodeType (e6, ExpressionType.GreaterThan);
1370 Assert (false, e6.Compile ().Invoke (60));
1373 void GreaterThanTest_7 ()
1375 Expression<Func<MyEnum, MyEnum, bool>> e7 = (a, b) => a > b;
1376 AssertNodeType (e7, ExpressionType.GreaterThan);
1377 Assert (true, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
1378 Assert (false, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1381 void GreaterThanTest_8 ()
1383 Expression<Func<MyEnum?, MyEnum?, bool>> e8 = (a, b) => a > b;
1384 AssertNodeType (e8, ExpressionType.GreaterThan);
1385 Assert (false, e8.Compile ().Invoke (MyEnum.Value_1, null));
1386 Assert (false, e8.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1389 void GreaterThanOrEqualTest ()
1391 Expression<Func<int, int, bool>> e = (int a, int b) => a >= b;
1392 AssertNodeType (e, ExpressionType.GreaterThanOrEqual);
1393 Assert (true, e.Compile ().Invoke (60, 30));
1396 void GreaterThanOrEqualTest_2 ()
1398 Expression<Func<byte?, byte?, bool>> e2 = (a, b) => a >= b;
1399 AssertNodeType (e2, ExpressionType.GreaterThanOrEqual);
1400 Assert (false, e2.Compile ().Invoke (null, 3));
1401 Assert (true, e2.Compile ().Invoke (2, 2));
1404 void GreaterThanOrEqualTest_3 ()
1406 Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a >= b;
1407 AssertNodeType (e3, ExpressionType.GreaterThanOrEqual);
1408 Assert (true, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)), "D1");
1411 void GreaterThanOrEqualTest_4 ()
1413 Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a >= b;
1414 AssertNodeType (e4, ExpressionType.GreaterThanOrEqual);
1415 Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
1416 Assert (false, e4.Compile ().Invoke (null, null));
1417 Assert (true, e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
1420 void GreaterThanOrEqualTest_5 ()
1422 Expression<Func<MyType?, sbyte, bool>> e5 = (MyType? a, sbyte b) => a >= b;
1423 AssertNodeType (e5, ExpressionType.GreaterThanOrEqual);
1424 Assert (false, e5.Compile ().Invoke (null, 33));
1425 Assert (false, e5.Compile ().Invoke (null, 0));
1426 Assert (true, e5.Compile ().Invoke (new MyType (120), 3));
1429 void GreaterThanOrEqualTest_6 ()
1431 Expression<Func<ushort, bool>> e6 = (ushort a) => a >= null;
1432 AssertNodeType (e6, ExpressionType.GreaterThanOrEqual);
1433 Assert (false, e6.Compile ().Invoke (60));
1436 void GreaterThanOrEqualTest_7 ()
1438 Expression<Func<MyEnum, MyEnum, bool>> e7 = (a, b) => a >= b;
1439 AssertNodeType (e7, ExpressionType.GreaterThanOrEqual);
1440 Assert (true, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
1441 Assert (true, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1444 void GreaterThanOrEqualTest_8 ()
1446 Expression<Func<MyEnum?, MyEnum?, bool>> e8 = (a, b) => a >= b;
1447 AssertNodeType (e8, ExpressionType.GreaterThanOrEqual);
1448 Assert (false, e8.Compile ().Invoke (MyEnum.Value_1, null));
1449 Assert (true, e8.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1454 var del = new IntDelegate (TestInt);
1455 Expression<Func<IntDelegate, int>> e = (a) => a ();
1456 AssertNodeType (e, ExpressionType.Invoke);
1457 Assert (29, e.Compile ().Invoke (del));
1460 void InvokeTest_2 ()
1462 Expression<Func<Func<int, string>, int, string>> e2 = (a, b) => a (b);
1463 AssertNodeType (e2, ExpressionType.Invoke);
1464 Assert ("4", e2.Compile ().Invoke ((a) => (a+1).ToString (), 3));
1469 Expression<Func<string, Func<string>>> e = (string s) => () => s;
1470 AssertNodeType (e, ExpressionType.Lambda);
1471 Assert ("xx", e.Compile ().Invoke ("xx") ());
1474 void LeftShiftTest ()
1476 Expression<Func<ulong, short, ulong>> e = (ulong a, short b) => a << b;
1477 AssertNodeType (e, ExpressionType.LeftShift);
1478 Assert ((ulong) 0x7F000, e.Compile ().Invoke (0xFE, 11));
1479 Assert ((ulong) 0x1FFFFFFFE, e.Compile ().Invoke (0xFFFFFFFF, 0xA01));
1481 // .net produces a strange result
1482 // see https://bugzilla.novell.com/show_bug.cgi?id=398358
1483 // Assert ((ulong) 0xFFFFFFFE00000000, e.Compile ().Invoke (0xFFFFFFFF, 0xA01));
1486 void LeftShiftTest_2 ()
1488 Expression<Func<MyType, MyType, int>> e2 = (MyType a, MyType b) => a << b;
1489 AssertNodeType (e2, ExpressionType.LeftShift);
1490 var c2 = e2.Compile ();
1491 Assert (1024, c2 (new MyType (256), new MyType (2)));
1494 void LeftShiftTest_3 ()
1496 Expression<Func<long?, sbyte, long?>> e3 = (long? a, sbyte b) => a << b;
1497 AssertNodeType (e3, ExpressionType.LeftShift);
1498 Assert (null, e3.Compile ().Invoke (null, 11));
1499 Assert (2048, e3.Compile ().Invoke (1024, 1));
1502 void LeftShiftTest_4 ()
1504 Expression<Func<MyType?, MyType?, int?>> e4 = (MyType? a, MyType? b) => a << b;
1505 AssertNodeType (e4, ExpressionType.LeftShift);
1506 var c4 = e4.Compile ();
1507 Assert (null, c4 (new MyType (8), null));
1508 Assert (null, c4 (null, new MyType (8)));
1509 Assert (1024, c4 (new MyType (256), new MyType (2)));
1512 void LeftShiftTest_5 ()
1514 Expression<Func<ushort, int?>> e5 = (ushort a) => a << null;
1515 AssertNodeType (e5, ExpressionType.LeftShift);
1516 Assert (null, e5.Compile ().Invoke (30));
1519 void LeftShiftTest_6 ()
1521 Expression<Func<int, MyTypeImplicitOnly, int>> e = (a, b) => a << b;
1522 AssertNodeType (e, ExpressionType.LeftShift);
1523 Assert (0x7F0, e.Compile ().Invoke (0xFE, new MyTypeImplicitOnly (3)));
1526 void LessThanTest ()
1528 Expression<Func<int, int, bool>> e = (int a, int b) => a < b;
1529 AssertNodeType (e, ExpressionType.LessThan);
1530 Assert (false, e.Compile ().Invoke (60, 30));
1533 void LessThanTest_2 ()
1535 Expression<Func<uint?, byte?, bool>> e2 = (a, b) => a < b;
1536 AssertNodeType (e2, ExpressionType.LessThan);
1537 Assert (false, e2.Compile ().Invoke (null, 3));
1538 Assert (false, e2.Compile ().Invoke (2, 2));
1541 void LessThanTest_3 ()
1543 Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a < b;
1544 AssertNodeType (e3, ExpressionType.LessThan);
1545 Assert (false, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
1548 void LessThanTest_4 ()
1550 Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a < b;
1551 AssertNodeType (e4, ExpressionType.LessThan);
1552 Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
1553 Assert (false, e4.Compile ().Invoke (null, null));
1554 Assert (false, e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
1557 void LessThanTest_5 ()
1559 Expression<Func<MyType?, sbyte, bool>> e5 = (MyType? a, sbyte b) => a < b;
1560 AssertNodeType (e5, ExpressionType.LessThan);
1561 Assert (false, e5.Compile ().Invoke (null, 33));
1562 Assert (false, e5.Compile ().Invoke (null, 0));
1563 Assert (false, e5.Compile ().Invoke (new MyType (120), 3));
1566 void LessThanTest_6 ()
1568 Expression<Func<ushort, bool>> e6 = (ushort a) => a < null;
1569 AssertNodeType (e6, ExpressionType.LessThan);
1570 Assert (false, e6.Compile ().Invoke (60));
1573 void LessThanTest_7 ()
1575 Expression<Func<MyEnum, MyEnum, bool>> e7 = (a, b) => a < b;
1576 AssertNodeType (e7, ExpressionType.LessThan);
1577 Assert (false, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
1578 Assert (false, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1581 void LessThanTest_8 ()
1583 Expression<Func<MyEnum?, MyEnum?, bool>> e8 = (a, b) => a < b;
1584 AssertNodeType (e8, ExpressionType.LessThan);
1585 Assert (false, e8.Compile ().Invoke (MyEnum.Value_1, null));
1586 Assert (false, e8.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1589 void LessThanTest_9 ()
1591 Expression<Func<object, int?, bool>> e = (a, b) => (int) a < b;
1592 AssertNodeType (e, ExpressionType.LessThan);
1593 Assert (false, e.Compile ().Invoke (1, null));
1594 Assert (false, e.Compile ().Invoke (3, 3));
1595 Assert (true, e.Compile ().Invoke (1, 3));
1598 void LessThanOrEqualTest ()
1600 Expression<Func<int, int, bool>> e = (int a, int b) => a <= b;
1601 AssertNodeType (e, ExpressionType.LessThanOrEqual);
1602 Assert (false, e.Compile ().Invoke (60, 30));
1605 void LessThanOrEqualTest_2 ()
1607 Expression<Func<byte?, byte?, bool>> e2 = (a, b) => a <= b;
1608 AssertNodeType (e2, ExpressionType.LessThanOrEqual);
1609 Assert (false, e2.Compile ().Invoke (null, 3));
1610 Assert (true, e2.Compile ().Invoke (2, 2));
1613 void LessThanOrEqualTest_3 ()
1615 Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a <= b;
1616 AssertNodeType (e3, ExpressionType.LessThanOrEqual);
1617 Assert (true, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
1620 void LessThanOrEqualTest_4 ()
1622 Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a <= b;
1623 AssertNodeType (e4, ExpressionType.LessThanOrEqual);
1624 Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
1625 Assert (false, e4.Compile ().Invoke (null, null));
1626 Assert (false, e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
1629 void LessThanOrEqualTest_5 ()
1631 Expression<Func<MyType?, sbyte, bool>> e5 = (MyType? a, sbyte b) => a <= b;
1632 AssertNodeType (e5, ExpressionType.LessThanOrEqual);
1633 Assert (false, e5.Compile ().Invoke (null, 33));
1634 Assert (false, e5.Compile ().Invoke (null, 0));
1635 Assert (false, e5.Compile ().Invoke (new MyType (120), 3));
1638 void LessThanOrEqualTest_6 ()
1640 Expression<Func<ushort, bool>> e6 = (ushort a) => a <= null;
1641 AssertNodeType (e6, ExpressionType.LessThanOrEqual);
1642 Assert (false, e6.Compile ().Invoke (60));
1645 void LessThanOrEqualTest_7 ()
1647 Expression<Func<MyEnum, MyEnum, bool>> e7 = (a, b) => a <= b;
1648 AssertNodeType (e7, ExpressionType.LessThanOrEqual);
1649 Assert (false, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
1650 Assert (true, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1653 void LessThanOrEqualTest_8 ()
1655 Expression<Func<MyEnum?, MyEnum?, bool>> e8 = (a, b) => a <= b;
1656 AssertNodeType (e8, ExpressionType.LessThanOrEqual);
1657 Assert (false, e8.Compile ().Invoke (MyEnum.Value_1, null));
1658 Assert (true, e8.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
1661 void ListInitTest ()
1663 Expression<Func<List<object>>> e1 = () => new List<object> { "Hello", "", null, "World", 5 };
1664 AssertNodeType (e1, ExpressionType.ListInit);
1665 var re1 = e1.Compile ().Invoke ();
1666 Assert (null, re1 [2]);
1667 Assert ("World", re1 [3]);
1668 Assert (5, re1 [4]);
1671 void ListInitTest_2 ()
1673 Expression<Func<int, Dictionary<string, int>>> e2 = (int value) => new Dictionary<string, int> (3) { { "A", value }, { "B", 2 } };
1674 AssertNodeType (e2, ExpressionType.ListInit);
1675 var re2 = e2.Compile ().Invoke (3456);
1676 Assert (3456, re2 ["A"]);
1679 void MemberAccessTest ()
1681 MemberAccessData d = new MemberAccessData ();
1683 Expression<Func<bool>> e = () => d.BoolValue;
1684 AssertNodeType (e, ExpressionType.MemberAccess);
1685 Assert (true, e.Compile ().Invoke ());
1686 d.BoolValue = false;
1687 Assert (false, e.Compile ().Invoke ());
1690 void MemberAccessTest_2 ()
1692 Expression<Func<decimal>> e2 = () => MemberAccessData.DecimalValue;
1693 AssertNodeType (e2, ExpressionType.MemberAccess);
1694 Assert (decimal.MinValue, e2.Compile ().Invoke ());
1697 void MemberAccessTest_3 ()
1699 MemberAccessData d = new MemberAccessData ();
1700 d.VolatileValue = 492;
1701 Expression<Func<uint>> e3 = () => d.VolatileValue;
1702 AssertNodeType (e3, ExpressionType.MemberAccess);
1703 Assert<uint> (492, e3.Compile ().Invoke ());
1706 void MemberAccessTest_4 ()
1708 MemberAccessData d = new MemberAccessData ();
1709 Expression<Func<string[]>> e4 = () => d.StringValues;
1710 AssertNodeType (e4, ExpressionType.MemberAccess);
1711 Assert (null, e4.Compile ().Invoke ());
1714 void MemberAccessTest_5 ()
1716 MemberAccessData d = new MemberAccessData ();
1717 var e5 = d.GetEvent ();
1718 AssertNodeType (e5, ExpressionType.MemberAccess);
1719 Assert (null, e5.Compile ().Invoke ());
1722 void MemberAccessTest_6 ()
1724 MemberAccessData d = new MemberAccessData ();
1725 Expression<Func<MyType>> e6 = () => d.MyTypeProperty;
1726 AssertNodeType (e6, ExpressionType.MemberAccess);
1727 Assert (new MyType (), e6.Compile ().Invoke ());
1730 void MemberAccessTest_7 ()
1732 MemberAccessData d = new MemberAccessData ();
1733 Expression<Func<MyType, short>> e7 = a => a.ShortProp;
1734 AssertNodeType (e7, ExpressionType.MemberAccess);
1735 MyType mt = new MyType ();
1737 Assert (124, e7.Compile ().Invoke (mt));
1740 void MemberAccessTest_8 ()
1742 Expression<Func<string>> e8 = () => MemberAccessData.StaticProperty;
1743 AssertNodeType (e8, ExpressionType.MemberAccess);
1744 Assert ("alo", e8.Compile ().Invoke ());
1747 void MemberAccessTest_9 ()
1749 string s = "localvar";
1750 Expression<Func<string>> e9 = () => s;
1753 AssertNodeType (e9, ExpressionType.MemberAccess);
1754 Assert ("changed", e9.Compile ().Invoke ());
1757 void MemberInitTest ()
1759 Expression<Func<MemberAccessData>> e = () => new MemberAccessData {
1760 VolatileValue = 2, StringValues = new string [] { "sv" }, MyTypeProperty = new MyType (692)
1762 AssertNodeType (e, ExpressionType.MemberInit);
1763 var r1 = e.Compile ().Invoke ();
1764 Assert<uint> (2, r1.VolatileValue);
1765 Assert (new string[] { "sv" }, r1.StringValues);
1766 Assert (new MyType (692), r1.MyTypeProperty);
1769 void MemberInitTest_2 ()
1771 Expression<Func<MemberAccessData>> e2 = () => new MemberAccessData {
1772 ListValues = new List<string> { "a", null }
1775 AssertNodeType (e2, ExpressionType.MemberInit);
1776 var r2 = e2.Compile ().Invoke ();
1777 Assert ("a", r2.ListValues [0]);
1780 void MemberInitTest_3 ()
1782 Expression<Func<short, MyType>> e3 = a => new MyType { ShortProp = a };
1783 AssertNodeType (e3, ExpressionType.MemberInit);
1784 var r3 = e3.Compile ().Invoke (33);
1785 Assert (33, r3.ShortProp);
1788 void MemberInitTest_4 ()
1790 Expression<Func<int>> e = () => new int { };
1792 AssertNodeType (e, ExpressionType.MemberInit);
1793 var r = e.Compile ().Invoke ();
1797 void MemberInitTest_5 ()
1799 Expression<Func<MemberAccessData>> e = () => new MemberAccessData { SetOnly = new object { } };
1801 AssertNodeType (e, ExpressionType.MemberInit);
1807 Expression<Func<int, int, int>> e = (int a, int b) => a % b;
1808 AssertNodeType (e, ExpressionType.Modulo);
1809 Assert (29, e.Compile ().Invoke (60, 31));
1812 void ModuloTest_2 ()
1814 Expression<Func<double?, double?, double?>> e2 = (a, b) => a % b;
1815 AssertNodeType (e2, ExpressionType.Modulo);
1816 Assert (null, e2.Compile ().Invoke (null, 3));
1817 Assert (1.1, e2.Compile ().Invoke (3.1, 2));
1820 void ModuloTest_3 ()
1822 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a % b;
1823 AssertNodeType (e3, ExpressionType.Modulo);
1824 Assert (0, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
1827 void ModuloTest_4 ()
1829 Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a % b;
1830 AssertNodeType (e4, ExpressionType.Modulo);
1831 Assert (null, e4.Compile ().Invoke (null, new MyType (-20)));
1832 Assert (new MyType (12), e4.Compile ().Invoke (new MyType (12), new MyType (-20)));
1835 void ModuloTest_5 ()
1837 Expression<Func<int, MyType, int>> e5 = (int a, MyType b) => a % b;
1838 AssertNodeType (e5, ExpressionType.Modulo);
1839 Assert (1, e5.Compile ().Invoke (99, new MyType (2)));
1842 void ModuloTest_6 ()
1844 Expression<Func<int, MyType?, int?>> e6 = (int a, MyType? b) => a % b;
1845 AssertNodeType (e6, ExpressionType.Modulo);
1846 Assert (100, e6.Compile ().Invoke (100, new MyType (200)));
1847 Assert (null, e6.Compile ().Invoke (20, null));
1850 void ModuloTest_7 ()
1852 Expression<Func<ushort, int?>> e7 = (ushort a) => a % null;
1853 AssertNodeType (e7, ExpressionType.Modulo);
1854 Assert (null, e7.Compile ().Invoke (60));
1857 void MultiplyTest ()
1859 Expression<Func<int, int, int>> e = (int a, int b) => a * b;
1860 AssertNodeType (e, ExpressionType.Multiply);
1861 Assert (1860, e.Compile ().Invoke (60, 31));
1862 Assert (2147483617, e.Compile ().Invoke (int.MaxValue, 31));
1865 void MultiplyTest_2 ()
1867 Expression<Func<double?, double?, double?>> e2 = (a, b) => a * b;
1868 AssertNodeType (e2, ExpressionType.Multiply);
1869 Assert (null, e2.Compile ().Invoke (null, 3));
1870 Assert (6.2, e2.Compile ().Invoke (3.1, 2));
1873 void MultiplyTest_3 ()
1875 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a * b;
1876 AssertNodeType (e3, ExpressionType.Multiply);
1877 Assert (400, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
1880 void MultiplyTest_4 ()
1882 Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a * b;
1883 AssertNodeType (e4, ExpressionType.Multiply);
1884 Assert (null, e4.Compile ().Invoke (null, new MyType (-20)));
1885 Assert (new MyType (-240), e4.Compile ().Invoke (new MyType (12), new MyType (-20)));
1888 void MultiplyTest_5 ()
1890 Expression<Func<int, MyType, int>> e5 = (int a, MyType b) => a * b;
1891 AssertNodeType (e5, ExpressionType.Multiply);
1892 Assert (198, e5.Compile ().Invoke (99, new MyType (2)));
1895 void MultiplyTest_6 ()
1897 Expression<Func<int, MyType?, int?>> e6 = (int a, MyType? b) => a * b;
1898 AssertNodeType (e6, ExpressionType.Multiply);
1899 Assert (0, e6.Compile ().Invoke (int.MinValue, new MyType (200)));
1900 Assert (null, e6.Compile ().Invoke (20, null));
1903 void MultiplyTest_7 ()
1905 Expression<Func<ushort, int?>> e7 = (ushort a) => a * null;
1906 AssertNodeType (e7, ExpressionType.Multiply);
1907 Assert (null, e7.Compile ().Invoke (60));
1910 void MultiplyTest_8 ()
1912 Expression<Func<double, ulong?, double?>> e = (a, b) => a * b;
1913 AssertNodeType (e, ExpressionType.Multiply);
1914 Assert (180, e.Compile () (60, 3));
1915 Assert (null, e.Compile () (60, null));
1918 void MultiplyCheckedTest ()
1921 Expression<Func<int, int, int>> e = (int a, int b) => a * b;
1922 AssertNodeType (e, ExpressionType.MultiplyChecked);
1924 e.Compile ().Invoke (int.MaxValue, 309);
1925 throw new ApplicationException ("MultiplyCheckedTest #1");
1926 } catch (OverflowException) { }
1930 void MultiplyCheckedTest_2 ()
1933 Expression<Func<byte?, byte?, int?>> e2 = (a, b) => a * b;
1934 AssertNodeType (e2, ExpressionType.MultiplyChecked);
1935 Assert (null, e2.Compile ().Invoke (null, 3));
1936 Assert (14025, e2.Compile ().Invoke (byte.MaxValue, 55));
1940 void MultiplyCheckedTest_3 ()
1943 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a * b;
1944 AssertNodeType (e3, ExpressionType.Multiply);
1945 Assert (-600, e3.Compile ().Invoke (new MyType (-20), new MyType (30)));
1949 void MultiplyCheckedTest_4 ()
1952 Expression<Func<double, double, double>> e4 = (a, b) => a * b;
1953 AssertNodeType (e4, ExpressionType.Multiply);
1954 Assert (double.PositiveInfinity, e4.Compile ().Invoke (double.MaxValue, int.MaxValue));
1958 void MultiplyCheckedTest_5 ()
1961 Expression<Func<float?, float?, float?>> e5 = (a, b) => b * a;
1962 AssertNodeType (e5, ExpressionType.MultiplyChecked);
1963 Assert (float.PositiveInfinity, e5.Compile ().Invoke (float.Epsilon, float.PositiveInfinity));
1969 Expression<Func<int, int>> e = (a) => -a;
1970 AssertNodeType (e, ExpressionType.Negate);
1971 Assert (30, e.Compile ().Invoke (-30));
1974 void NegateTest_2 ()
1976 Expression<Func<sbyte, int>> e2 = (a) => -(-a);
1977 AssertNodeType (e2, ExpressionType.Negate);
1978 Assert (-10, e2.Compile ().Invoke (-10));
1981 void NegateTest_3 ()
1983 Expression<Func<long?, long?>> e3 = (a) => -a;
1984 AssertNodeType (e3, ExpressionType.Negate);
1985 Assert (long.MinValue + 1, e3.Compile ().Invoke (long.MaxValue));
1986 Assert (null, e3.Compile ().Invoke (null));
1989 void NegateTest_4 ()
1991 Expression<Func<MyType, MyType>> e4 = (a) => -a;
1992 AssertNodeType (e4, ExpressionType.Negate);
1993 Assert (new MyType (14), e4.Compile ().Invoke (new MyType (-14)));
1996 void NegateTest_5 ()
1998 Expression<Func<MyType?, MyType?>> e5 = (a) => -a;
1999 AssertNodeType (e5, ExpressionType.Negate);
2000 Assert (new MyType (-33), e5.Compile ().Invoke (new MyType (33)));
2001 Assert (null, e5.Compile ().Invoke (null));
2004 void NegateTest_6 ()
2006 Expression<Func<MyTypeImplicitOnly, int>> e6 = (MyTypeImplicitOnly a) => -a;
2007 AssertNodeType (e6, ExpressionType.Negate);
2008 Assert (-4, e6.Compile ().Invoke (new MyTypeImplicitOnly (4)));
2011 void NegateTest_7 ()
2013 Expression<Func<MyTypeImplicitOnly?, int?>> e7 = (MyTypeImplicitOnly? a) => -a;
2014 AssertNodeType (e7, ExpressionType.Negate);
2015 Assert (-46, e7.Compile ().Invoke (new MyTypeImplicitOnly (46)));
2017 // Another version of MS bug when predefined conversion is required on nullable user operator
2018 // Assert (null, e7.Compile ().Invoke (null));
2021 void NegateTest_8 ()
2023 Expression<Func<sbyte?, int?>> e8 = (a) => -a;
2024 AssertNodeType (e8, ExpressionType.Negate);
2025 Assert (11, e8.Compile ().Invoke (-11));
2028 void NegateTest_9 ()
2030 Expression<Func<uint, long>> e9 = (a) => -a;
2031 AssertNodeType (e9, ExpressionType.Negate);
2032 Assert (-2, e9.Compile ().Invoke (2));
2035 void NegateTestChecked ()
2038 Expression<Func<int, int>> e = (int a) => -a;
2039 AssertNodeType (e, ExpressionType.NegateChecked);
2041 e.Compile ().Invoke (int.MinValue);
2042 throw new ApplicationException ("NegateTestChecked #1");
2043 } catch (OverflowException) { }
2047 void NegateTestChecked_2 ()
2050 Expression<Func<byte?, int?>> e2 = (a) => -a;
2051 AssertNodeType (e2, ExpressionType.NegateChecked);
2052 Assert (null, e2.Compile ().Invoke (null));
2053 Assert (-255, e2.Compile ().Invoke (byte.MaxValue));
2057 void NegateTestChecked_3 ()
2060 Expression<Func<MyType, MyType>> e3 = (MyType a) => -a;
2061 AssertNodeType (e3, ExpressionType.Negate);
2062 Assert (20, e3.Compile ().Invoke (new MyType (-20)));
2066 void NegateTestChecked_4 ()
2069 Expression<Func<double, double>> e4 = (a) => -a;
2070 AssertNodeType (e4, ExpressionType.Negate);
2071 Assert (double.NegativeInfinity, e4.Compile ().Invoke (double.PositiveInfinity));
2075 void NewArrayInitTest ()
2077 Expression<Func<int []>> e = () => new int [1] { 5 };
2078 AssertNodeType (e, ExpressionType.NewArrayInit);
2079 Assert (new int [1] { 5 }, e.Compile ().Invoke ());
2082 void NewArrayInitTest_2 ()
2084 Expression<Func<int []>> e1 = () => new int [] { };
2085 AssertNodeType (e1, ExpressionType.NewArrayInit);
2086 Assert (new int [0], e1.Compile ().Invoke ());
2089 void NewArrayInitTest_3 ()
2091 Expression<Func<ushort, ulong? []>> e2 = (ushort a) => new ulong? [] { a };
2092 AssertNodeType (e2, ExpressionType.NewArrayInit);
2093 Assert (new ulong? [1] { ushort.MaxValue }, e2.Compile ().Invoke (ushort.MaxValue));
2096 void NewArrayInitTest_4 ()
2098 Expression<Func<char [] []>> e3 = () => new char [] [] { new char [] { 'a' } };
2099 AssertNodeType (e3, ExpressionType.NewArrayInit);
2100 Assert (new char [] { 'a' }, e3.Compile ().Invoke () [0]);
2103 void NewArrayInitTest_5 ()
2105 Expression<Func<int?[]>> e = () => new int?[] { null, 3, 4 };
2106 AssertNodeType (e, ExpressionType.NewArrayInit);
2107 Assert (3, e.Compile ().Invoke ().Length);
2110 void NewArrayInitTest_6 ()
2112 Expression<Func<string []>> e = () => new [] { null, "a" };
2113 AssertNodeType (e, ExpressionType.NewArrayInit);
2114 Assert (2, e.Compile ().Invoke ().Length);
2117 void NewArrayBoundsTest ()
2119 Expression<Func<int [,]>> e = () => new int [2,3];
2120 AssertNodeType (e, ExpressionType.NewArrayBounds);
2121 Assert (new int [2,3].Length, e.Compile ().Invoke ().Length);
2124 void NewArrayBoundsTest_2 ()
2126 Expression<Func<int[,]>> e2 = () => new int [0,0];
2127 AssertNodeType (e2, ExpressionType.NewArrayBounds);
2128 Assert (new int [0, 0].Length, e2.Compile ().Invoke ().Length);
2131 void NewArrayBoundsTest_3 ()
2133 Expression<Func<int []>> e = () => new int [0];
2134 AssertNodeType (e, ExpressionType.NewArrayBounds);
2135 Assert (0, e.Compile ().Invoke ().Length);
2138 void NewArrayBoundsTest_4 ()
2140 const ulong max = ulong.MaxValue;
2142 Expression<Func<bool[]>> e = () => new bool [max];
2143 AssertNodeType (e, ExpressionType.NewArrayBounds);
2148 Expression<Func<MyType>> e = () => new MyType (2);
2149 AssertNodeType (e, ExpressionType.New);
2150 Assert (new MyType (2), e.Compile ().Invoke ());
2155 Expression<Func<MyType>> e2 = () => new MyType ();
2156 AssertNodeType (e2, ExpressionType.New);
2157 Assert (new MyType (), e2.Compile ().Invoke ());
2162 Expression<Func<NewTest<bool>>> e3 = () => new NewTest<bool> (true);
2163 AssertNodeType (e3, ExpressionType.New);
2164 Assert (new NewTest<bool> (true), e3.Compile ().Invoke ());
2169 Expression<Func<decimal, NewTest<decimal>>> e4 = (decimal d) => new NewTest<decimal> (1, 5, d);
2170 AssertNodeType (e4, ExpressionType.New);
2171 Assert (new NewTest<decimal> (1, 5, -9), e4.Compile ().Invoke (-9));
2176 Expression<Func<object>> e5 = () => new { A = 9, Value = "a" };
2177 AssertNodeType (e5, ExpressionType.New);
2178 var ne = ((NewExpression) e5.Body);
2180 Assert (2, ne.Members.Count, "members count");
2182 // Behaviour is different between .NET 3.5 and .NET 4.0
2183 if (ne.Members [0].MemberType == MemberTypes.Property) {
2184 Assert ("A", ne.Members [0].Name, "Name #1");
2185 Assert ("Value", ne.Members [1].Name, "Name #2");
2187 Assert ("get_A", ne.Members [0].Name, "Name #1");
2188 Assert ("get_Value", ne.Members [1].Name, "Name #2");
2191 Assert (new { A = 9, Value = "a" }, e5.Compile ().Invoke ());
2196 Expression<Func<object>> e5 = () => new { A = 9, Value = new MyType (5) };
2197 AssertNodeType (e5, ExpressionType.New);
2200 // CSC bug: emits new MyEnum as a constant
2203 Expression<Func<MyEnum>> e = () => new MyEnum ();
2204 AssertNodeType (e, ExpressionType.New);
2205 Assert<MyEnum> (0, e.Compile ().Invoke ());
2210 Expression<Func<DateTime>> e = () => new DateTime ();
2211 AssertNodeType (e, ExpressionType.New);
2212 Assert (null, ((NewExpression)e.Body).Constructor, "default ctor");
2214 Expression<Func<StructWithUserConstructor>> e2 = () => new StructWithUserConstructor ();
2215 AssertNodeType (e2, ExpressionType.New);
2216 Assert ("Void .ctor()", ((NewExpression)e2.Body).Constructor.ToString (), "user ctor");
2221 Expression<Func<bool, bool>> e = (bool a) => !a;
2222 AssertNodeType (e, ExpressionType.Not);
2223 Assert (false, e.Compile ().Invoke (true));
2228 Expression<Func<MyType, bool>> e2 = (MyType a) => !a;
2229 AssertNodeType (e2, ExpressionType.Not);
2230 Assert (true, e2.Compile ().Invoke (new MyType (1)));
2231 Assert (false, e2.Compile ().Invoke (new MyType (-1)));
2236 Expression<Func<int, int>> e3 = (int a) => ~a;
2237 AssertNodeType (e3, ExpressionType.Not);
2238 Assert (-8, e3.Compile ().Invoke (7));
2243 Expression<Func<MyType, int>> e4 = (MyType a) => ~a;
2244 AssertNodeType (e4, ExpressionType.Not);
2245 Assert (0, e4.Compile ().Invoke (new MyType (-1)));
2250 Expression<Func<ulong, ulong>> e5 = (ulong a) => ~a;
2251 AssertNodeType (e5, ExpressionType.Not);
2252 Assert<ulong> (18446744073709551608, e5.Compile ().Invoke (7));
2257 Expression<Func<MyEnum, MyEnum>> e6 = (MyEnum a) => ~a;
2258 AssertNodeType (e6, ExpressionType.Convert);
2259 Assert ((MyEnum)254, e6.Compile ().Invoke (MyEnum.Value_1));
2262 void NotNullableTest ()
2264 Expression<Func<bool?, bool?>> e = (bool? a) => !a;
2265 AssertNodeType (e, ExpressionType.Not);
2266 Assert (false, e.Compile ().Invoke (true));
2267 Assert (null, e.Compile ().Invoke (null));
2270 void NotNullableTest_2 ()
2272 Expression<Func<MyType?, bool?>> e2 = (MyType? a) => !a;
2273 AssertNodeType (e2, ExpressionType.Not);
2274 Assert (true, e2.Compile ().Invoke (new MyType (1)));
2275 Assert (null, e2.Compile ().Invoke (null));
2278 void NotNullableTest_3 ()
2280 Expression<Func<sbyte?, int?>> e3 = (sbyte? a) => ~a;
2281 AssertNodeType (e3, ExpressionType.Not);
2282 Assert (-5, e3.Compile ().Invoke (4));
2283 Assert (null, e3.Compile ().Invoke (null));
2286 void NotNullableTest_4 ()
2288 Expression<Func<MyType?, int?>> e4 = (MyType? a) => ~a;
2289 AssertNodeType (e4, ExpressionType.Not);
2290 Assert (0, e4.Compile ().Invoke (new MyType (-1)));
2291 Assert (null, e4.Compile ().Invoke (null));
2294 void NotNullableTest_5 ()
2296 Expression<Func<MyEnum?, MyEnum?>> e5 = (MyEnum? a) => ~a;
2297 AssertNodeType (e5, ExpressionType.Convert);
2298 Assert ((MyEnum) 254, e5.Compile ().Invoke (MyEnum.Value_1));
2299 Assert (null, e5.Compile ().Invoke (null));
2302 void NotEqualTest ()
2304 Expression<Func<int, int, bool>> e = (int a, int b) => a != b;
2305 AssertNodeType (e, ExpressionType.NotEqual);
2306 Assert (true, e.Compile ().Invoke (60, 30));
2307 Assert (false, e.Compile ().Invoke (-1, -1));
2310 void NotEqualTest_2 ()
2312 Expression<Func<sbyte?, sbyte?, bool>> e2 = (a, b) => a != b;
2313 AssertNodeType (e2, ExpressionType.NotEqual);
2314 Assert (false, e2.Compile ().Invoke (3, 3));
2315 Assert (true, e2.Compile ().Invoke (3, 2));
2318 void NotEqualTest_3 ()
2320 Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a != b;
2321 AssertNodeType (e3, ExpressionType.NotEqual);
2322 Assert (false, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
2325 void NotEqualTest_4 ()
2327 Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a != b;
2328 AssertNodeType (e4, ExpressionType.NotEqual);
2329 Assert (true, e4.Compile ().Invoke (null, new MyType (-20)));
2330 Assert (false, e4.Compile ().Invoke (null, null));
2331 Assert (false, e4.Compile ().Invoke (new MyType (120), new MyType (120)));
2334 void NotEqualTest_5 ()
2336 Expression<Func<bool?, bool?, bool>> e5 = (bool? a, bool? b) => a != b;
2337 AssertNodeType (e5, ExpressionType.NotEqual);
2338 Assert (true, e5.Compile ().Invoke (true, null));
2339 Assert (false, e5.Compile ().Invoke (null, null));
2340 Assert (false, e5.Compile ().Invoke (false, false));
2343 void NotEqualTest_6 ()
2345 Expression<Func<bool, bool>> e6 = (bool a) => a != null;
2346 AssertNodeType (e6, ExpressionType.NotEqual);
2347 Assert (true, e6.Compile ().Invoke (true));
2348 Assert (true, e6.Compile ().Invoke (false));
2351 void NotEqualTest_7 ()
2353 Expression<Func<string, string, bool>> e7 = (string a, string b) => a != b;
2354 AssertNodeType (e7, ExpressionType.NotEqual);
2355 Assert (false, e7.Compile ().Invoke (null, null));
2356 Assert (true, e7.Compile ().Invoke ("a", "A"));
2357 Assert (false, e7.Compile ().Invoke ("a", "a"));
2360 void NotEqualTest_8 ()
2362 Expression<Func<object, bool>> e8 = (object a) => null != a;
2363 AssertNodeType (e8, ExpressionType.NotEqual);
2364 Assert (false, e8.Compile ().Invoke (null));
2365 Assert (true, e8.Compile ().Invoke ("a"));
2366 Assert (true, e8.Compile ().Invoke (this));
2369 void NotEqualTest_9 ()
2371 Expression<Func<MyEnum, MyEnum, bool>> e9 = (a, b) => a != b;
2372 AssertNodeType (e9, ExpressionType.NotEqual);
2373 Assert (true, e9.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
2374 Assert (false, e9.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
2377 void NotEqualTest_10 ()
2379 Expression<Func<MyEnum?, MyEnum?, bool>> e10 = (a, b) => a != b;
2380 AssertNodeType (e10, ExpressionType.NotEqual);
2381 Assert (true, e10.Compile ().Invoke (MyEnum.Value_1, null));
2382 Assert (false, e10.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
2385 void NotEqualTest_11 ()
2387 Expression<Func<MyEnum?, bool>> e11 = (a) => a != null;
2388 AssertNodeType (e11, ExpressionType.NotEqual);
2389 Assert (true, e11.Compile ().Invoke (MyEnum.Value_1));
2390 Assert (false, e11.Compile ().Invoke (null));
2395 Expression<Func<bool, bool, bool>> e = (bool a, bool b) => a | b;
2397 AssertNodeType (e, ExpressionType.Or);
2398 Func<bool, bool, bool> c = e.Compile ();
2400 Assert (true, c (true, true));
2401 Assert (true, c (true, false));
2402 Assert (true, c (false, true));
2403 Assert (false, c (false, false));
2408 Expression<Func<MyType, MyType, MyType>> e2 = (MyType a, MyType b) => a | b;
2409 AssertNodeType (e2, ExpressionType.Or);
2410 var c2 = e2.Compile ();
2411 Assert (new MyType (3), c2 (new MyType (1), new MyType (2)));
2416 Expression<Func<MyEnum, MyEnum, MyEnum>> e3 = (a, b) => a | b;
2417 AssertNodeType (e3, ExpressionType.Convert);
2418 Assert ((MyEnum)3, e3.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
2419 Assert (MyEnum.Value_2, e3.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
2422 void OrNullableTest ()
2424 Expression<Func<bool?, bool?, bool?>> e = (bool? a, bool? b) => a | b;
2426 AssertNodeType (e, ExpressionType.Or);
2427 Func<bool?, bool?, bool?> c = e.Compile ();
2429 Assert (true, c (true, true));
2430 Assert (true, c (true, false));
2431 Assert (true, c (false, true));
2432 Assert (false, c (false, false));
2434 Assert (true, c (true, null));
2435 Assert (null, c (false, null));
2436 Assert (null, c (null, false));
2437 Assert (true, c (true, null));
2438 Assert (null, c (null, null));
2441 void OrNullableTest_2 ()
2443 Expression<Func<MyType?, MyType?, MyType?>> e2 = (MyType? a, MyType? b) => a | b;
2444 AssertNodeType (e2, ExpressionType.Or);
2445 var c2 = e2.Compile ();
2446 Assert (new MyType (3), c2 (new MyType (1), new MyType (2)));
2447 Assert (null, c2 (new MyType (1), null));
2450 void OrNullableTest_3 ()
2452 Expression<Func<MyType?, uint, long?>> e3 = (MyType? a, uint b) => a | b;
2453 AssertNodeType (e3, ExpressionType.Or);
2454 var c3 = e3.Compile ();
2455 Assert (9, c3 (new MyType (1), 8));
2458 void OrNullableTest_4 ()
2460 Expression<Func<MyEnum?, MyEnum?, MyEnum?>> e4 = (a, b) => a | b;
2461 AssertNodeType (e4, ExpressionType.Convert);
2462 Assert (null, e4.Compile ().Invoke (null, MyEnum.Value_2));
2463 Assert ((MyEnum)3, e4.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
2468 Expression<Func<bool, bool, bool>> e = (bool a, bool b) => a || b;
2469 AssertNodeType (e, ExpressionType.OrElse);
2470 Assert (true, e.Compile ().Invoke (true, false));
2473 void OrElseTest_2 ()
2475 Expression<Func<MyType, MyType, MyType>> e2 = (MyType a, MyType b) => a || b;
2476 AssertNodeType (e2, ExpressionType.OrElse);
2477 Assert (new MyType (64), e2.Compile ().Invoke (new MyType (64), new MyType (64)));
2478 Assert (new MyType (32), e2.Compile ().Invoke (new MyType (32), new MyType (64)));
2481 void ParameterTest ()
2483 Expression<Func<string, string>> e = (string a) => a;
2484 AssertNodeType (e, ExpressionType.Parameter);
2485 Assert ("t", e.Compile ().Invoke ("t"));
2488 void ParameterTest_2 ()
2490 Expression<Func<object[], object[]>> e2 = (object[] a) => a;
2491 AssertNodeType (e2, ExpressionType.Parameter);
2492 Assert (new object [0], e2.Compile ().Invoke (new object [0]));
2495 void ParameterTest_3 ()
2497 Expression<Func<IntPtr, IntPtr>> e3 = a => a;
2498 AssertNodeType (e3, ExpressionType.Parameter);
2499 Assert (IntPtr.Zero, e3.Compile ().Invoke (IntPtr.Zero));
2502 unsafe void ParameterTest_4 ()
2504 Expression<Func<int*[], int* []>> e4 = (a) => a;
2505 AssertNodeType (e4, ExpressionType.Parameter);
2506 Assert<int*[]> (null, e4.Compile ().Invoke (null));
2507 int* e4_el = stackalloc int [5];
2508 int*[] ptr = new int*[] { e4_el };
2509 Assert<int*[]> (ptr, e4.Compile ().Invoke (ptr));
2514 Expression<Func<Expression<Func<int>>>> e = () => () => 2;
2515 AssertNodeType (e, ExpressionType.Quote);
2516 Assert (2, e.Compile ().Invoke ().Compile ().Invoke ());
2521 Expression<Func<string, Expression<Func<string>>>> e = (string s) => () => s;
2522 AssertNodeType (e, ExpressionType.Quote);
2524 Assert ("data", e.Compile ().Invoke ("data").Compile ().Invoke ());
2527 void RightShiftTest ()
2529 Expression<Func<ulong, short, ulong>> e = (ulong a, short b) => a >> b;
2530 AssertNodeType (e, ExpressionType.RightShift);
2531 Assert ((ulong) 0x1FD940L, e.Compile ().Invoke (0xFECA0000, 11));
2532 Assert ((ulong) 0x7FFFFFFF, e.Compile ().Invoke (0xFFFFFFFF, 0xA01));
2534 // .net produces a strange result
2535 // see https://bugzilla.novell.com/show_bug.cgi?id=398358
2536 // Assert ((ulong)0, e.Compile ().Invoke (0xFFFFFFFF, 0xA01));
2539 void RightShiftTest_2 ()
2541 Expression<Func<MyType, MyType, int>> e2 = (MyType a, MyType b) => a >> b;
2542 AssertNodeType (e2, ExpressionType.RightShift);
2543 var c2 = e2.Compile ();
2544 Assert (64, c2 (new MyType (256), new MyType (2)));
2547 void RightShiftTest_3 ()
2549 Expression<Func<long?, sbyte, long?>> e3 = (long? a, sbyte b) => a >> b;
2550 AssertNodeType (e3, ExpressionType.RightShift);
2551 Assert (null, e3.Compile ().Invoke (null, 11));
2552 Assert (512, e3.Compile ().Invoke (1024, 1));
2555 void RightShiftTest_4 ()
2557 Expression<Func<MyType?, MyType?, int?>> e4 = (MyType? a, MyType? b) => a >> b;
2558 AssertNodeType (e4, ExpressionType.RightShift);
2559 var c4 = e4.Compile ();
2560 Assert (null, c4 (new MyType (8), null));
2561 Assert (null, c4 (null, new MyType (8)));
2562 Assert (64, c4 (new MyType (256), new MyType (2)));
2565 void RightShiftTest_5 ()
2567 Expression<Func<int, MyTypeImplicitOnly, int>> e = (a, b) => a >> b;
2568 AssertNodeType (e, ExpressionType.RightShift);
2569 Assert (31, e.Compile ().Invoke (0xFE, new MyTypeImplicitOnly (3)));
2572 void RightShiftTest_6 ()
2574 Expression<Func<ulong, byte?, ulong?>> e = (a, b) => a >> b;
2575 AssertNodeType (e, ExpressionType.RightShift);
2576 Assert (null, e.Compile () (2, null));
2579 void SubtractTest ()
2581 Expression<Func<int, int, int>> e = (int a, int b) => a - b;
2582 AssertNodeType (e, ExpressionType.Subtract);
2583 Assert (-10, e.Compile ().Invoke (20, 30));
2586 void SubtractTest_2 ()
2588 Expression<Func<int?, int?, int?>> e2 = (a, b) => a - b;
2589 AssertNodeType (e2, ExpressionType.Subtract);
2590 Assert (null, e2.Compile ().Invoke (null, 3));
2593 void SubtractTest_3 ()
2595 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a - b;
2596 AssertNodeType (e3, ExpressionType.Subtract);
2597 Assert (-50, e3.Compile ().Invoke (new MyType (-20), new MyType (30)));
2600 void SubtractTest_4 ()
2602 Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a - b;
2603 AssertNodeType (e4, ExpressionType.Subtract);
2604 Assert (new MyType (-50), e4.Compile ().Invoke (new MyType (-20), new MyType (30)));
2605 Assert (null, e4.Compile ().Invoke (null, new MyType (30)));
2608 void SubtractTest_5 ()
2610 Expression<Func<int, MyType, int>> e5 = (int a, MyType b) => a - b;
2611 AssertNodeType (e5, ExpressionType.Subtract);
2612 Assert (-29, e5.Compile ().Invoke (1, new MyType (30)));
2615 void SubtractTest_6 ()
2617 Expression<Func<int, MyType?, int?>> e6 = (int a, MyType? b) => a - b;
2618 AssertNodeType (e6, ExpressionType.Subtract);
2619 Assert (-61, e6.Compile ().Invoke (-31, new MyType (30)));
2622 void SubtractTest_7 ()
2624 Expression<Func<ushort, int?>> e7 = (ushort a) => null - a;
2625 AssertNodeType (e7, ExpressionType.Subtract);
2626 Assert (null, e7.Compile ().Invoke (690));
2629 void SubtractTest_8 ()
2631 Expression<Func<MyEnum, byte, MyEnum>> e8 = (a, b) => a - b;
2632 AssertNodeType (e8, ExpressionType.Convert);
2633 Assert ((MyEnum)255, e8.Compile ().Invoke (MyEnum.Value_1, 2));
2636 void SubtractTest_9 ()
2638 Expression<Func<MyEnum, MyEnum, byte>> e9 = (a, b) => a - b;
2639 AssertNodeType (e9, ExpressionType.Convert);
2640 Assert (1, e9.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
2643 void SubtractTest_10 ()
2645 Expression<Func<MyEnum?, byte?, MyEnum?>> e10 = (a, b) => a - b;
2646 AssertNodeType (e10, ExpressionType.Convert);
2647 Assert ((MyEnum) 255, e10.Compile ().Invoke (MyEnum.Value_1, 2));
2651 void SubtractTest_11 ()
2653 Expression<Func<MyEnum?, MyEnum?, byte?>> e11 = (a, b) => a - b;
2654 AssertNodeType (e11, ExpressionType.Convert);
2655 Assert<byte?> (1, e11.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
2658 void SubtractCheckedTest ()
2661 Expression<Func<long, long, long>> e = (long a, long b) => a - b;
2662 AssertNodeType (e, ExpressionType.SubtractChecked);
2664 e.Compile ().Invoke (long.MinValue, 309);
2665 throw new ApplicationException ("SubtractCheckedTest #1");
2666 } catch (OverflowException) { }
2670 void SubtractCheckedTest_2 ()
2673 Expression<Func<byte?, byte?, int?>> e2 = (a, b) => a - b;
2674 AssertNodeType (e2, ExpressionType.SubtractChecked);
2675 Assert (null, e2.Compile ().Invoke (null, 3));
2676 Assert (-55, e2.Compile ().Invoke (byte.MinValue, 55));
2680 void SubtractCheckedTest_3 ()
2683 Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a - b;
2684 AssertNodeType (e3, ExpressionType.Subtract);
2685 Assert (-50, e3.Compile ().Invoke (new MyType (-20), new MyType (30)));
2689 void SubtractCheckedTest_4 ()
2692 Expression<Func<double, double, double>> e4 = (a, b) => a - b;
2693 AssertNodeType (e4, ExpressionType.Subtract);
2694 Assert (double.PositiveInfinity, e4.Compile ().Invoke (double.MinValue, double.NegativeInfinity));
2700 Expression<Func<object, Tester>> e = (object a) => a as Tester;
2701 AssertNodeType (e, ExpressionType.TypeAs);
2702 Assert (this, e.Compile ().Invoke (this));
2705 void TypeAsTest_2 ()
2707 Expression<Func<object, int?>> e2 = (object a) => a as int?;
2708 AssertNodeType (e2, ExpressionType.TypeAs);
2709 Assert (null, e2.Compile ().Invoke (null));
2710 Assert (null, e2.Compile ().Invoke (this));
2711 Assert (44, e2.Compile ().Invoke (44));
2714 void TypeAsTest_3 ()
2716 Expression<Func<object, object>> e3 = (object a) => null as object;
2717 AssertNodeType (e3, ExpressionType.TypeAs);
2718 Assert (null, e3.Compile ().Invoke (null));
2721 void TypeAsTest_4 ()
2723 Expression<Func<int, IConvertible>> e = a => a as IConvertible;
2724 AssertNodeType (e, ExpressionType.TypeAs);
2725 Assert (ExpressionType.Parameter, ((UnaryExpression) e.Body).Operand.NodeType);
2726 Assert (5, e.Compile ().Invoke (5));
2731 Expression<Func<object, bool>> e = (object a) => a is Tester;
2732 AssertNodeType (e, ExpressionType.TypeIs);
2733 Assert (true, e.Compile ().Invoke (this));
2734 Assert (false, e.Compile ().Invoke (1));
2737 void TypeIsTest_2 ()
2739 Expression<Func<object, bool>> e2 = (object a) => a is int?;
2740 AssertNodeType (e2, ExpressionType.TypeIs);
2741 Assert (false, e2.Compile ().Invoke (null));
2742 Assert (true, e2.Compile ().Invoke (1));
2745 void TypeIsTest_3 ()
2747 Expression<Func<object, bool>> e3 = (object a) => null is object;
2748 AssertNodeType (e3, ExpressionType.TypeIs);
2749 Assert (false, e3.Compile ().Invoke (null));
2752 void TypeIsTest_4 ()
2754 Expression<Func<B, bool>> e = l => l is A;
2755 AssertNodeType (e, ExpressionType.TypeIs);
2756 Assert (false, e.Compile ().Invoke (null));
2759 void TypeIsTest_5 ()
2761 Expression<Func<bool>> e5 = () => 1 is int;
2762 AssertNodeType (e5, ExpressionType.TypeIs);
2763 Assert (true, e5.Compile ().Invoke ());
2766 void TypeIsTest_6 ()
2768 Expression<Func<int?, bool>> e6 = (a) => a is int;
2769 AssertNodeType (e6, ExpressionType.TypeIs);
2770 Assert (true, e6.Compile ().Invoke (1));
2771 Assert (false, e6.Compile ().Invoke (null));
2774 void UnaryPlusTest ()
2776 Expression<Func<int, int>> e = (a) => +a;
2777 AssertNodeType (e, ExpressionType.Parameter);
2778 Assert (-30, e.Compile ().Invoke (-30));
2781 void UnaryPlusTest_2 ()
2783 Expression<Func<long?, long?>> e2 = (a) => +a;
2784 AssertNodeType (e2, ExpressionType.Parameter);
2787 void UnaryPlusTest_3 ()
2789 Expression<Func<MyType, MyType>> e4 = (a) => +a;
2790 AssertNodeType (e4, ExpressionType.UnaryPlus);
2791 Assert (new MyType (-14), e4.Compile ().Invoke (new MyType (-14)));
2794 void UnaryPlusTest_4 ()
2796 Expression<Func<MyType?, MyType?>> e5 = (a) => +a;
2797 AssertNodeType (e5, ExpressionType.UnaryPlus);
2798 Assert (new MyType (33), e5.Compile ().Invoke (new MyType (33)));
2799 Assert (null, e5.Compile ().Invoke (null));
2802 void UnaryPlusTest_5 ()
2804 Expression<Func<sbyte?, long?>> e6 = (a) => +a;
2805 AssertNodeType (e6, ExpressionType.Convert);
2806 Assert (3, e6.Compile ().Invoke (3));
2807 Assert (null, e6.Compile ().Invoke (null));
2810 #pragma warning restore 169
2815 string InstanceMethod (string arg)
2820 object InstanceParamsMethod (int index, params object [] args)
2824 if (args.Length == 0)
2826 return args [index];
2829 static int TestInt ()
2834 T GenericMethod<T> (T t)
2839 static void RefMethod (ref int i)
2844 static bool RunTest (MethodInfo test)
2846 Console.Write ("Running test {0, -25}", test.Name);
2848 test.Invoke (new Tester (), null);
2849 Console.WriteLine ("OK");
2851 } catch (Exception e) {
2852 Console.WriteLine ("FAILED");
2853 Console.WriteLine (e.ToString ());
2858 public static int Main ()
2860 var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
2861 where test.GetParameters ().Length == 0
2863 select RunTest (test);
2865 int failures = tests.Count (a => !a);
2866 Console.WriteLine (failures + " tests failed");