2 using System.Collections.Generic;
4 using System.Linq.Expressions;
5 using System.Reflection;
7 // Dynamic binary operator, unary operators and convert tests
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)
32 public MyType (int value) : this ()
37 public short ShortProp { get; set; }
39 public override int GetHashCode ()
41 throw new NotImplementedException ();
44 public static bool operator true (MyType a)
49 public static bool operator false (MyType a)
54 public static MyType operator + (MyType a, MyType b)
56 return new MyType (a.value + b.value);
59 public static MyType operator - (MyType a, MyType b)
61 return new MyType (a.value - b.value);
64 public static MyType operator / (MyType a, MyType b)
66 return new MyType (a.value / b.value);
69 public static MyType operator * (MyType a, MyType b)
71 return new MyType (a.value * b.value);
74 public static MyType operator % (MyType a, MyType b)
76 return new MyType (a.value % b.value);
79 public static MyType operator &(MyType a, MyType b)
81 return new MyType (a.value & b.value);
84 public static MyType operator | (MyType a, MyType b)
86 return new MyType (a.value | b.value);
89 public static MyType operator ^ (MyType a, MyType b)
91 return new MyType (a.value ^ b.value);
94 public static bool operator == (MyType a, MyType b)
96 return a.value == b.value;
99 public static bool operator != (MyType a, MyType b)
101 return a.value != b.value;
104 public static bool operator > (MyType a, MyType b)
106 return a.value > b.value;
109 public static bool operator < (MyType a, MyType b)
111 return a.value < b.value;
114 public static bool operator >= (MyType a, MyType b)
116 return a.value >= b.value;
119 public static bool operator <= (MyType a, MyType b)
121 return a.value <= b.value;
124 public static bool operator ! (MyType a)
129 public static int operator ~ (MyType a)
134 public static MyType operator ++ (MyType a)
136 return new MyType (a.value * 2);
139 public static MyType operator -- (MyType a)
141 return new MyType (a.value / 2);
144 public static int operator >> (MyType a, int b)
149 public static int operator << (MyType a, int b)
154 public static MyType operator - (MyType a)
156 return new MyType (-a.value);
159 public static MyType operator + (MyType a)
161 return new MyType (334455); // magic number
164 public override string ToString ()
166 return value.ToString ();
175 public MyTypeExplicit (int value)
180 public static explicit operator int (MyTypeExplicit m)
186 struct MyTypeImplicitOnly
190 public MyTypeImplicitOnly (short b)
195 public static implicit operator short (MyTypeImplicitOnly m)
200 public static implicit operator bool (MyTypeImplicitOnly m)
212 enum MyEnumUlong : ulong
221 delegate void EmptyDelegate ();
222 delegate int IntDelegate ();
224 static void Assert<T> (T expected, T value, string name)
226 if (!EqualityComparer<T>.Default.Equals (expected, value)) {
228 throw new ApplicationException (name + expected + " != " + value);
232 static void AssertChecked<T> (Func<T> expected, T value, string name)
235 Assert (expected (), value, name);
236 throw new ApplicationException (name + ": OverflowException expected");
237 } catch (OverflowException) {
242 static void AssertChecked (Action expected, string name)
246 throw new ApplicationException (name + ": OverflowException expected");
247 } catch (OverflowException) {
252 #pragma warning disable 169
259 Assert (d + v, 7, "#1");
261 Assert (d + v2, 5.5, "#1a");
264 MyType v3 = new MyType (30);
265 Assert (d + v3, new MyType (35), "#3");
266 dynamic d3 = new MyType (-7);
267 Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
269 d3 = new MyTypeImplicitOnly (6);
270 Assert (d3 + new MyTypeImplicitOnly (11), 17, "#3b");
272 d = new MyTypeImplicitOnly (5);
274 Assert (d + v4, 9m, "#4");
277 void AddNullableTest ()
282 Assert<int?> (d + v2, null, "#1");
283 Assert<int?> (d + null, null, "#1a");
284 Assert<int?> (null + d, null, "#1b");
287 Assert (d + v2, 3, "#2");
288 dynamic d2 = (int?) -2;
289 Assert (d2 + 1, -1, "#2a");
292 MyType? v3 = new MyType (30);
293 Assert (d + v3, new MyType (35), "#3");
294 dynamic d3 = new MyType? (new MyType (-7));
295 Assert (d3 + new MyType (6), new MyType (-1), "#3a");
296 Assert<MyType?> (d3 + null, null, "#3b");
298 d = new MyTypeImplicitOnly (5);
300 Assert (d + v4, 9m, "#4");
302 Assert<decimal?> (d + v4, null, "#4a");
307 dynamic d = MyEnum.Value_1;
309 // CSC: Invalid System.InvalidOperationException
310 Assert (d + null, null, "#1");
312 Assert (d + 1, MyEnum.Value_2, "#2");
314 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
315 Assert (d2 + (byte) 1, MyEnumUlong.Value_2, "#3");
316 Assert<MyEnumUlong?> (d2 + (object) null, null, "#3a");
319 void AddCheckedTest ()
324 int v = int.MaxValue;
325 AssertChecked (() => d + v, 7, "#1");
328 AssertChecked (() => d + v2, null, "#2");
331 MyType v3 = new MyType (int.MaxValue);
332 Assert (new MyType (-2147483646), d + v3, "#3");
336 void AddStringTest ()
340 Assert (d + v, "foo->", "#1");
341 Assert (d + 1, "foo1", "#1a");
342 Assert (d + null, "foo", "#1b");
343 Assert (d + 1 + v, "foo1->", "#1a");
346 Assert (d + v2, "foo4", "#2");
349 void AddAssignTest ()
360 Assert (d, 5.5, "#1a");
362 Assert (d, 7.5, "#1b");
364 dynamic d3 = new MyType (-7);
365 d3 += new MyType (6);
366 Assert<MyType> (d3, new MyType (-1), "#3");
371 Assert (d, 9m, "#4");
374 void AddAssignNullableTest ()
376 dynamic d = (int?) 5;
379 // For now it's impossible to use nullable compound assignment
380 // due to the way how DLR works. GetType () on nullable object returns
381 // underlying type and not nullable type, that means that
382 // C# binder is initialized with wrong operand type and any operation
387 Assert<int?> (d, null, "#1");
389 Assert<int?> (d, null, "#1a");
398 Assert (d, -1, "#2a");
400 MyType? v3 = new MyType (30);
402 Assert (d, new MyType (35), "#3");
403 dynamic d3 = new MyType? (new MyType (-7));
404 Assert (d3 + new MyType (6), new MyType (-1), "#3a");
405 Assert<MyType?> (d3 + null, null, "#3b");
410 Assert (d, 9m, "#4");
412 Assert<decimal?> (d, null, "#4a");
416 void AddAssignEnumTest ()
418 dynamic d = MyEnum.Value_1;
422 Assert (d, MyEnum.Value_2, "#2");
424 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
426 Assert (d2, MyEnumUlong.Value_2, "#3");
429 void AddAssignCheckedTest ()
434 int v = int.MaxValue;
435 AssertChecked (() => { d += v; Assert (d, 0, "#1-"); }, "#1");
438 MyType v3 = new MyType (int.MaxValue);
440 Assert (d, new MyType (-2147483644), "#3-");
444 void AddAssignStringTest ()
449 Assert (d, "foo->", "#1");
453 Assert (d, "foo1", "#1a");
456 Assert (d, "foo1", "#1b");
461 Assert (d, "foo4", "#2");
465 void AddAssignmentEvent ()
475 Assert (d & v, false, "#1");
476 Assert (d & true, true, "#1a");
480 Assert (d & v2, 42, "#2");
481 Assert (d & 0, 0, "#2a");
484 MyType v3 = new MyType (30);
485 Assert (d & v3, new MyType (10), "#3");
486 dynamic d3 = new MyType (-7);
487 Assert<MyType> (d3 & new MyType (6), new MyType (0), "#3a");
489 d3 = new MyTypeImplicitOnly (6);
490 Assert (d3 & 11, 2, "#3b");
495 dynamic d = MyEnum.Value_1;
497 Assert<MyEnum?> (d & null, null, "#1");
499 Assert (d & d, MyEnum.Value_1, "#2");
501 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
502 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
505 void AndTestNullable ()
510 Assert<int?> (d & v2, null, "#1");
511 Assert<int?> (d & null, null, "#1a");
512 Assert<int?> (null & d, null, "#1b");
515 Assert (d & v2, 4, "#2");
516 dynamic d2 = (int?) -2;
517 Assert (d2 & 1, 0, "#2a");
520 MyType? v3 = new MyType (30);
521 Assert (d & v3, new MyType (22), "#3");
522 dynamic d3 = new MyType? (new MyType (-7));
523 Assert (d3 & new MyType (6), new MyType (0), "#3a");
524 Assert<MyType?> (d3 + null, null, "#3b");
527 void AndAssignedTest ()
533 Assert (d, false, "#1");
536 Assert (d, true, "#1a");
541 Assert (d, 42, "#2");
543 MyType v3 = new MyType (30);
544 dynamic d3 = new MyType (-7);
545 d3 &= new MyType (6);
546 Assert<MyType> (d3, new MyType (0), "#3");
549 void AndAssignedTestEnum ()
551 dynamic d = MyEnum.Value_1;
553 Assert<MyEnum>(d, 0, "#1");
557 Assert (d, MyEnum.Value_2, "#2");
559 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
560 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
568 Assert<bool> (d && v, false, "#1");
570 Assert (d && true, true, "#1a");
573 Assert (d && d, true, "#2");
575 dynamic d3 = new MyType (-7);
576 Assert<MyType> (d3 && new MyType (6), new MyType (0), "#3");
578 d3 = new MyTypeImplicitOnly (5);
579 Assert (d3 && 11, 1, "#3b");
587 Assert (d / v, 2, "#1");
590 MyType v3 = new MyType (30);
591 Assert (d / v3, new MyType (0), "#3");
592 dynamic d3 = new MyType (-7);
593 Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
595 d = new MyTypeImplicitOnly (6);
597 Assert (d / v4, 1.5m, "#4");
600 void DivideNullableTest ()
605 Assert<double?> (d / v2, null, "#1");
606 Assert<double?> (d / null, null, "#1a");
607 Assert<double?> (null / d, null, "#1b");
610 Assert (d / v2, -2.5, "#2");
611 dynamic d2 = (int?) -2;
612 Assert (d2 / 1, -2, "#2a");
615 MyType? v3 = new MyType (30);
616 Assert (d / v3, new MyType (0), "#3");
617 dynamic d3 = new MyType? (new MyType (-7));
618 Assert (d3 / new MyType (6), new MyType (-1), "#3a");
619 Assert<MyType?> (d3 + null, null, "#3b");
621 d = new MyTypeImplicitOnly (5);
623 Assert (d / v4, 1.25m, "#4");
625 Assert<decimal?> (d / v4, null, "#4a");
628 void DivideCheckedTest ()
635 void DivideAssignTest ()
646 Assert (d, 10, "#1a");
648 Assert (d, 5, "#1b");
650 dynamic d3 = new MyType (-7);
651 d3 /= new MyType (6);
652 Assert<MyType> (d3, new MyType (-1), "#3");
657 Assert (d, 1.25m, "#4");
660 void DivideAssignCheckedTest ()
667 void ConvertImplicitTest ()
671 Assert (3m, v1, "#1");
673 d = new MyTypeImplicitOnly (5);
675 Assert (5, v2, "#2");
679 Assert (4, v3, "#3");
681 int[] v4 = new int[] { d };
682 Assert (4, v4[0], "#4");
685 var v5 = new [] { d, 1 };
686 Assert (true, v5[0], "#5");
687 Assert (1, v5[1], "#5a");
691 var r = b ? d : "ss";
692 Assert ("ss", r, "#6");
695 int ConvertImplicitReturnTest ()
697 dynamic d = (byte) 3;
701 IEnumerable<string> ConvertImplicitReturnTest_2 ()
707 void ConvertExplicitTest ()
710 Assert (44, (byte) d, "#1");
711 Assert<byte?> (44, (byte?) d, "#1a");
716 d = new MyTypeImplicitOnly (5);
717 Assert (5, (int) d, "#3");
719 d = new MyTypeExplicit (-2);
720 Assert (-2, (int) d, "#4");
723 Assert (null, (object) d, "#5");
726 void ConvertExplicitCheckedTest ()
730 AssertChecked (() => (byte) d, 7, "#1");
733 AssertChecked<uint?> (() => (uint?) d, 2, "#2");
742 Assert (d == v, false, "#1");
744 Assert (d == v2, true, "#1a");
747 Assert (d == false, false, "#2");
749 Assert (d == b2, true, "#2a");
752 MyType v3 = new MyType (30);
753 Assert (d == v3, true, "#3");
754 dynamic d3 = new MyTypeImplicitOnly (-7);
755 Assert (d3 == 11, false, "#3b");
759 Assert (d == v4, false, "#4");
760 Assert (d == 2m, true, "#4a");
763 Assert (d == null, true, "#5");
766 void EqualNullableTest ()
771 Assert (d == v2, false, "#1");
772 Assert (d == null, false, "#1a");
773 Assert (null == d, false, "#1b");
776 Assert (d == v2, false, "#2");
777 dynamic d2 = (int?) -2;
778 Assert (d2 == 1, false, "#2a");
780 Assert (d2 == 44, true, "#2b");
783 MyType? v3 = new MyType (30);
784 Assert (d == v3, true, "#3");
785 dynamic d3 = new MyType? (new MyType (-7));
786 Assert (d3 == new MyType (6), false, "#3a");
787 Assert (d3 == null, false, "#3b");
791 Assert (d == v4, false, "#4");
793 Assert (d == v4, false, "#4a");
796 Assert (d == true, true, "#5");
797 Assert (d == null, false, "#5a");
798 Assert (d == false, false, "#5b");
801 void EqualEnumTest ()
803 dynamic d = MyEnum.Value_1;
805 Assert (d == null, false, "#1");
807 Assert (d == MyEnum.Value_1, true, "#2");
808 Assert (d == 0, false, "#2a");
810 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
811 Assert (d2 == MyEnumUlong.Value_2, true, "#3");
812 Assert (d2 == null, false, "#3a");
815 void EqualStringTest ()
819 Assert (d == "te", false, "#1");
820 Assert (d == "text", true, "#1a");
821 Assert (d == null, false, "#1b");
824 void EqualDelegateTest ()
828 // Assert (d == delegate { }, true, "#1");
830 EmptyDelegate b = EqualDelegateTest;
833 //Assert (d == EqualDelegateTest, true, "#2");
837 void EqualTestDelegate_2 ()
839 EmptyDelegate ed = delegate () {};
841 Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
842 AssertNodeType (e2, ExpressionType.Equal);
843 Assert (false, e2.Compile ().Invoke (delegate () {}, null));
844 Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
845 Assert (false, e2.Compile ().Invoke (ed, delegate {}));
846 Assert (true, e2.Compile ().Invoke (ed, ed));
850 void ExclusiveOrTest ()
855 Assert (d ^ v, true, "#1");
856 Assert (d ^ true, false, "#1a");
860 Assert (d ^ v2, 20, "#2");
861 Assert (d ^ 0, 42, "#2a");
864 MyType v3 = new MyType (30);
865 Assert (d ^ v3, new MyType (52), "#3");
866 dynamic d3 = new MyType (-7);
867 Assert<MyType> (d3 ^ new MyType (6), new MyType (-1), "#3a");
869 d3 = new MyTypeImplicitOnly (-7);
870 Assert (d3 ^ 11, -14, "#3b");
873 void ExclusiveOrNullableTest ()
878 Assert<int?> (d ^ v2, null, "#1");
879 Assert<int?> (d ^ null, null, "#1a");
880 Assert<int?> (null ^ d, null, "#1b");
883 Assert (d ^ v2, -5, "#2");
884 dynamic d2 = (int?) -2;
885 Assert (d2 ^ 1, -1, "#2a");
888 MyType? v3 = new MyType (30);
889 Assert (d ^ v3, new MyType (27), "#3");
890 dynamic d3 = new MyType? (new MyType (-7));
891 Assert (d3 ^ new MyType (6), new MyType (-1), "#3a");
892 Assert<MyType?> (d3 ^ null, null, "#3b");
895 void ExclusiveOrTestEnum ()
897 dynamic d = MyEnum.Value_1;
899 Assert<MyEnum?> (d ^ null, null, "#1");
901 Assert<MyEnum> (d ^ d, 0, "#2");
903 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
904 Assert<MyEnumUlong> (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
907 void ExclusiveOrAssignedTest ()
913 Assert (d, true, "#1");
916 Assert (d, false, "#1a");
921 Assert (d, 20, "#2");
923 MyType v3 = new MyType (30);
924 dynamic d3 = new MyType (-7);
925 d3 ^= new MyType (6);
926 Assert (d3, new MyType (-1), "#3");
929 void ExclusiveOrAssignedTestEnum ()
931 dynamic d = MyEnum.Value_1;
933 Assert<MyEnum>(d, (MyEnum) 3, "#1");
937 Assert<MyEnum> (d, 0, "#2");
939 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
940 Assert (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
943 void GreaterThanTest ()
948 Assert (d > v, true, "#1");
950 Assert (d > v2, false, "#1a");
953 Assert (d > 4.59, true, "#2");
955 Assert (d > b2, false, "#2a");
958 MyType v3 = new MyType (30);
959 Assert (d > v3, false, "#3");
960 dynamic d3 = new MyType (-7);
961 Assert (d3 > new MyType (6), false, "#3a");
963 d3 = new MyTypeImplicitOnly (-7);
964 Assert (d3 > 11, false, "#3b");
968 Assert (d > v4, false, "#4");
969 Assert (d > 2m, false, "#4a");
972 void GreaterThanNullableTest ()
977 Assert (d > v2, false, "#1");
978 Assert (d > null, false, "#1a");
979 Assert (null > d, false, "#1b");
982 Assert (d > v2, true, "#2");
983 dynamic d2 = (int?) -2;
984 Assert (d2 > 1, false, "#2a");
986 Assert (d2 > 44, false, "#2b");
989 MyType? v3 = new MyType (30);
990 Assert (d > v3, false, "#3");
991 dynamic d3 = new MyType? (new MyType (-7));
992 Assert (d3 > new MyType (6), false, "#3a");
993 Assert (d3 > null, false, "#3b");
997 Assert (d > v4, true, "#4");
999 Assert (d > v4, false, "#4a");
1002 void GreaterThanEnumTest ()
1004 dynamic d = MyEnum.Value_1;
1006 Assert (d > null, false, "#1");
1008 Assert (d > MyEnum.Value_1, false, "#2");
1009 Assert (d > 0, true, "#2a");
1011 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1012 Assert (d2 > MyEnumUlong.Value_2, false, "#3");
1013 Assert (d2 > null, false, "#3a");
1016 void GreaterThanEqualTest ()
1021 Assert (d >= v, true, "#1");
1023 Assert (d >= v2, true, "#1a");
1026 Assert (d >= 4.59, true, "#2");
1028 Assert (d >= b2, true, "#2a");
1030 d = new MyType (30);
1031 MyType v3 = new MyType (30);
1032 Assert (d >= v3, true, "#3");
1033 dynamic d3 = new MyType (-7);
1034 Assert (d3 >= new MyType (6), false, "#3a");
1036 d3 = new MyTypeImplicitOnly (-7);
1037 Assert (d3 >= 11, false, "#3b");
1041 Assert (d >= v4, false, "#4");
1042 Assert (d >= 2m, true, "#4a");
1045 void GreaterThanEqualNullableTest ()
1050 Assert (d >= v2, false, "#1");
1051 Assert (d >= null, false, "#1a");
1052 Assert (null >= d, false, "#1b");
1055 Assert (d >= v2, true, "#2");
1056 dynamic d2 = (int?) -2;
1057 Assert (d2 >= 1, false, "#2a");
1059 Assert (d2 >= 44, true, "#2b");
1061 d = new MyType (30);
1062 MyType? v3 = new MyType (30);
1063 Assert (d >= v3, true, "#3");
1064 dynamic d3 = new MyType? (new MyType (-7));
1065 Assert (d3 >= new MyType (6), false, "#3a");
1066 Assert (d3 >= null, false, "#3b");
1070 Assert (d >= v4, true, "#4");
1072 Assert (d >= v4, false, "#4a");
1075 void GreaterThanEqualEnumTest ()
1077 dynamic d = MyEnum.Value_1;
1079 Assert (d >= null, false, "#1");
1081 Assert (d >= MyEnum.Value_1, true, "#2");
1082 Assert (d >= 0, true, "#2a");
1084 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1085 Assert (d2 >= MyEnumUlong.Value_2, true, "#3");
1086 Assert (d2 >= null, false, "#3a");
1089 void LeftShiftTest ()
1091 dynamic d = (ulong) 0x7F000;
1094 Assert<ulong> (d << v, 0x1FC000, "#1");
1095 Assert<ulong> (d << 1, 0xFE000, "#1a");
1097 Assert<ulong> (d << s, 0x1FC000, "#1b");
1100 MyTypeImplicitOnly v3 = new MyTypeImplicitOnly (3);
1101 Assert (d << v3, 0x3F8000, "#3");
1102 dynamic d3 = new MyType (-7);
1103 Assert (d3 << new MyTypeImplicitOnly (6), -448, "#3a");
1104 Assert (d3 << 11, -14336, "#3b");
1107 void LeftShiftNullableTest ()
1112 Assert<int?> (d << v2, null, "#1");
1114 Assert<int?> (d << null, null, "#1a");
1116 Assert<int?> (null << d, null, "#1b");
1119 Assert (d << v2, 0x40000000, "#2");
1120 dynamic d2 = (int?) -2;
1121 Assert (d2 << 1, -4, "#2a");
1124 void LeftShiftAssignTest ()
1126 dynamic d = 0x7F000;
1130 Assert (d, 0x1FC000, "#1");
1132 Assert (d, 0x3F8000, "#1a");
1135 Assert (d, 0xFE0000, "#1b");
1138 void LeftShiftAssignNullableTest ()
1144 Assert (d, 0x40000000, "#2");
1145 dynamic d2 = (int?) -2;
1147 Assert (d2, -4, "#2a");
1150 void LessThanTest ()
1155 Assert (d < v, false, "#1");
1157 Assert (d < v2, false, "#1a");
1160 Assert (d < 4.59, false, "#2");
1162 Assert (d < b2, false, "#2a");
1164 d = new MyType (30);
1165 MyType v3 = new MyType (30);
1166 Assert (d < v3, false, "#3");
1167 dynamic d3 = new MyType (-7);
1168 Assert (d3 < new MyType (6), true, "#3a");
1170 d3 = new MyTypeImplicitOnly (-7);
1171 Assert (d3 < 11, true, "#3b");
1175 Assert (d < v4, true, "#4");
1176 Assert (d < 2m, false, "#4a");
1179 void LessThanNullableTest ()
1184 Assert (d < v2, false, "#1");
1185 Assert (d < null, false, "#1a");
1186 Assert (null < d, false, "#1b");
1189 Assert (d < v2, false, "#2");
1190 dynamic d2 = (int?) -2;
1191 Assert (d2 < 1, true, "#2a");
1193 Assert (d2 < 44, false, "#2b");
1195 d = new MyType (30);
1196 MyType? v3 = new MyType (30);
1197 Assert (d < v3, false, "#3");
1198 dynamic d3 = new MyType? (new MyType (-7));
1199 Assert (d3 < new MyType (6), true, "#3a");
1201 d3 = new MyTypeImplicitOnly (-7);
1202 Assert (d3 < null, false, "#3b");
1206 Assert (d < v4, false, "#4");
1208 Assert (d < v4, false, "#4a");
1211 void LessThanEnumTest ()
1213 dynamic d = MyEnum.Value_1;
1215 Assert (d < null, false, "#1");
1217 Assert (d < MyEnum.Value_1, false, "#2");
1218 Assert (d < 0, false, "#2a");
1220 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1221 Assert (d2 < MyEnumUlong.Value_2, false, "#3");
1222 Assert (d2 < null, false, "#3a");
1225 void LessThanOrEqualTest ()
1230 Assert (d <= v, false, "#1");
1232 Assert (d <= v2, true, "#1a");
1235 Assert (d <= 4.59, false, "#2");
1237 Assert (d <= b2, true, "#2a");
1239 d = new MyType (30);
1240 MyType v3 = new MyType (30);
1241 Assert (d <= v3, true, "#3");
1242 dynamic d3 = new MyType (-7);
1243 Assert (d3 <= new MyType (6), true, "#3a");
1245 d3 = new MyTypeImplicitOnly (-7);
1246 Assert (d3 <= 11, true, "#3b");
1250 Assert (d <= v4, true, "#4");
1251 Assert (d <= 2m, true, "#4a");
1254 void LessThanOrEqualNullableTest ()
1259 Assert (d <= v2, false, "#1");
1260 Assert (d <= null, false, "#1a");
1261 Assert (null <= d, false, "#1b");
1264 Assert (d <= v2, false, "#2");
1265 dynamic d2 = (int?) -2;
1266 Assert (d2 <= 1, true, "#2a");
1268 Assert (d2 <= 44, true, "#2b");
1270 d = new MyType (30);
1271 MyType? v3 = new MyType (30);
1272 Assert (d <= v3, true, "#3");
1273 dynamic d3 = new MyType? (new MyType (-7));
1274 Assert (d3 <= new MyType (6), true, "#3a");
1275 Assert (d3 <= null, false, "#3b");
1279 Assert (d <= v4, false, "#4");
1281 Assert (d <= v4, false, "#4a");
1284 void LessThanOrEqualEnumTest ()
1286 dynamic d = MyEnum.Value_1;
1288 Assert (d <= null, false, "#1");
1290 Assert (d <= MyEnum.Value_1, true, "#2");
1291 Assert (d <= 0, false, "#2a");
1293 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1294 Assert (d2 <= MyEnumUlong.Value_2, true, "#3");
1295 Assert (d2 <= null, false, "#3a");
1303 Assert (d % v, 1, "#1");
1306 MyType v3 = new MyType (30);
1307 Assert (d % v3, new MyType (5), "#3");
1308 dynamic d3 = new MyType (-7);
1309 Assert<MyType> (d3 % new MyType (6), new MyType (-1), "#3a");
1311 d = new MyTypeImplicitOnly (5);
1313 Assert (d % v4, 1m, "#4");
1316 void ModuloNullableTest ()
1321 Assert<double?> (d % v2, null, "#1");
1322 Assert<double?> (d % null, null, "#1a");
1323 Assert<double?> (null % d, null, "#1b");
1326 Assert (d % v2, 1, "#2");
1327 dynamic d2 = (int?) -2;
1328 Assert (d2 % 1, 0, "#2a");
1330 d = new MyType (-2);
1331 MyType? v3 = new MyType (30);
1332 Assert (d % v3, new MyType (-2), "#3");
1333 dynamic d3 = new MyType? (new MyType (-7));
1334 Assert (d3 % new MyType (6), new MyType (-1), "#3a");
1335 Assert<MyType?> (d3 + null, null, "#3b");
1337 d = new MyTypeImplicitOnly (5);
1339 Assert (d % v4, 1m, "#4");
1341 Assert<decimal?> (d % v4, null, "#4a");
1344 void ModuloAssignTest ()
1350 Assert (d, 1, "#1");
1355 Assert (d, 0, "#1a");
1357 Assert (d, 0, "#1b");
1359 dynamic d3 = new MyType (-7);
1360 d3 %= new MyType (6);
1361 Assert<MyType> (d3, new MyType (-1), "#3");
1366 Assert (d, 1m, "#4");
1369 void MultiplyTest ()
1374 Assert (d * v, 10, "#1");
1376 Assert (d * v2, 2.5, "#1a");
1379 MyType v3 = new MyType (30);
1380 Assert (d * v3, new MyType (150), "#3");
1381 dynamic d3 = new MyType (-7);
1382 Assert<MyType> (d3 * new MyType (6), new MyType (-42), "#3a");
1386 Assert (d * v4, 31.6m, "#4");
1389 void MultiplyNullableTest ()
1394 Assert<int?> (d * v2, null, "#1");
1395 Assert<int?> (d * null, null, "#1a");
1396 Assert<int?> (null * d, null, "#1b");
1399 Assert (d * v2, -10, "#2");
1400 dynamic d2 = (int?) -2;
1401 Assert (d2 * 1, -2, "#2a");
1404 MyType? v3 = new MyType (30);
1405 Assert (d * v3, new MyType (150), "#3");
1406 dynamic d3 = new MyType? (new MyType (-7));
1407 Assert (d3 * new MyType (6), new MyType (-42), "#3a");
1408 Assert<MyType?> (d3 * null, null, "#3b");
1410 d = new MyTypeImplicitOnly (5);
1412 Assert (d * v4, 20m, "#4");
1414 Assert<decimal?> (d * v4, null, "#4a");
1417 void MultiplyCheckedTest ()
1422 int v = int.MaxValue;
1423 AssertChecked (() => d * v, 7, "#1");
1426 AssertChecked (() => d * v2, null, "#2");
1429 MyType v3 = new MyType (int.MaxValue);
1430 Assert (d * v3, new MyType (-4), "#3");
1434 void MultiplyAssignTest ()
1440 Assert (d, 10, "#1");
1445 Assert (d, 2.5, "#1a");
1447 Assert (d, 5, "#1b");
1449 dynamic d3 = new MyType (-7);
1450 d3 *= new MyType (6);
1451 Assert<MyType> (d3, new MyType (-42), "#3");
1456 Assert (d, 20m, "#4");
1459 void MultiplyAssignCheckedTest ()
1464 int v = int.MaxValue;
1465 AssertChecked (() => { d *= v; Assert (d, 0, "#1-"); }, "#1");
1467 d = new MyType (44);
1468 MyType v3 = new MyType (int.MaxValue);
1470 Assert (d, new MyType (-44), "#3-");
1477 Assert (8, -d, "#1");
1478 Assert (-8, -(-d), "#1a");
1480 d = new MyType (-14);
1481 Assert (new MyType (14), -d, "#2");
1483 d = new MyTypeImplicitOnly (4);
1484 Assert (-4, -d, "#3");
1487 Assert (-7, -d, "#4");
1489 d = double.NegativeInfinity;
1490 Assert (double.PositiveInfinity, -d, "#5");
1493 void NegateNullable ()
1495 dynamic d = (int?) -8;
1496 Assert (8, -d, "#1");
1497 Assert (-8, -(-d), "#1a");
1499 MyType? n1 = new MyType (4);
1501 Assert (new MyType (-4), -d, "#2");
1503 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
1505 Assert (-4, -d, "#3");
1508 Assert (-7, -d, "#4");
1511 void NegateChecked ()
1514 dynamic d = int.MinValue;
1515 AssertChecked (() => -d, 0, "#1");
1522 Assert (false, !d, "#1");
1524 var de = new MyType (-1);
1525 Assert (false, !d, "#2");
1528 void NotEqualTest ()
1533 Assert (d != v, true, "#1");
1535 Assert (d != v2, false, "#1a");
1538 Assert (d != false, true, "#2");
1540 Assert (d != b2, false, "#2a");
1542 d = new MyType (30);
1543 MyType v3 = new MyType (30);
1544 Assert (d != v3, false, "#3");
1545 dynamic d3 = new MyType (-7);
1546 Assert (d3 != new MyType (6), true, "#3a");
1550 Assert (d != v4, true, "#4");
1551 Assert (d != 2m, false, "#4a");
1554 Assert (d != null, false, "#5");
1557 void NotEqualNullableTest ()
1562 Assert (d != v2, true, "#1");
1563 Assert (d != null, true, "#1a");
1564 Assert (null != d, true, "#1b");
1567 Assert (d != v2, true, "#2");
1568 dynamic d2 = (int?) -2;
1569 Assert (d2 != 1, true, "#2a");
1571 Assert (d2 != 44, false, "#2b");
1573 d = new MyType (30);
1574 MyType? v3 = new MyType (30);
1575 Assert (d != v3, false, "#3");
1576 dynamic d3 = new MyType? (new MyType (-7));
1577 Assert (d3 != new MyType (6), true, "#3a");
1578 Assert (d3 != null, true, "#3b");
1582 Assert (d != v4, true, "#4");
1584 Assert (d != v4, true, "#4a");
1587 Assert (d != true, false, "#5");
1588 Assert (d != null, true, "#5a");
1589 Assert (d != false, true, "#5b");
1592 void NotEqualEnumTest ()
1594 dynamic d = MyEnum.Value_1;
1596 Assert (d != null, true, "#1");
1598 Assert (d != MyEnum.Value_1, false, "#2");
1599 Assert (d != 0, true, "#2a");
1601 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1602 Assert (d2 != MyEnumUlong.Value_2, false, "#3");
1603 Assert (d2 != null, true, "#3a");
1606 void NotEqualStringTest ()
1610 Assert (d != "te", true, "#1");
1611 Assert (d != "text", false, "#1a");
1612 Assert (d != null, true, "#1b");
1615 void OnesComplement ()
1618 Assert (-8, ~d, "#1");
1620 d = new MyType (-1);
1621 Assert (0, ~d, "#2");
1624 Assert (18446744073709551608, ~d, "#3");
1627 Assert ((MyEnum) 254, ~d, "#4");
1630 void OnesComplementNullable ()
1632 dynamic d = (int?) 7;
1633 Assert (-8, ~d, "#1");
1635 d = (MyEnum?) MyEnum.Value_1;
1636 Assert ((MyEnum) 254, ~d, "#4");
1644 Assert (d | v, true, "#1");
1645 Assert (d | false, true, "#1a");
1649 Assert (d | v2, 62, "#2");
1650 Assert (d | 0, 42, "#2a");
1652 d = new MyType (42);
1653 MyType v3 = new MyType (30);
1654 Assert (d | v3, new MyType (62), "#3");
1655 dynamic d3 = new MyType (-7);
1656 Assert<MyType> (d3 | new MyType (6), new MyType (-1), "#3a");
1658 d3 = new MyTypeImplicitOnly (-7);
1659 Assert (d3 | 11, -5, "#3b");
1664 dynamic d = MyEnum.Value_1;
1666 Assert<MyEnum?> (d | null, null, "#1");
1668 Assert (d | d, MyEnum.Value_1, "#2");
1670 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1671 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
1674 void OrTestNullable ()
1679 Assert<int?> (d | v2, null, "#1");
1680 Assert<int?> (d | null, null, "#1a");
1681 Assert<int?> (null | d, null, "#1b");
1684 Assert (d | v2, -1, "#2");
1685 dynamic d2 = (int?) -2;
1686 Assert (d2 | 1, -1, "#2a");
1688 d = new MyType (-2);
1689 MyType? v3 = new MyType (30);
1690 Assert (d | v3, new MyType (-2), "#3");
1691 dynamic d3 = new MyType? (new MyType (-7));
1692 Assert (d3 | new MyType (6), new MyType (-1), "#3a");
1695 void OrAssignedTest ()
1701 Assert (d, true, "#1");
1704 Assert (d, true, "#1a");
1709 Assert (d, 62, "#2");
1711 MyType v3 = new MyType (30);
1712 dynamic d3 = new MyType (-7);
1713 d3 |= new MyType (6);
1714 Assert<MyType> (d3, new MyType (-1), "#3");
1717 void OrAssignedTestEnum ()
1719 dynamic d = MyEnum.Value_1;
1720 d |= MyEnum.Value_2;
1721 Assert<MyEnum> (d, (MyEnum) 3, "#1");
1725 Assert (d, MyEnum.Value_2, "#2");
1727 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1728 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
1736 Assert<bool> (d || v, true, "#1");
1738 Assert (d || true, true, "#1a");
1741 Assert (d || d, true, "#2");
1743 dynamic d3 = new MyType (-7);
1744 Assert<MyType> (d3 || new MyType (6), new MyType (-7), "#3");
1746 d3 = new MyTypeImplicitOnly (-7);
1747 Assert (d3 || 11, -7, "#3b");
1750 void RightShiftTest ()
1752 dynamic d = (ulong) 0x7F000;
1755 Assert<ulong> (d >> v, 0x1FC00, "#1");
1756 Assert<ulong> (d >> 1, 0x3F800, "#1a");
1758 Assert<ulong> (d >> s, 0x1FC00, "#1b");
1761 MyTypeImplicitOnly v3 = new MyTypeImplicitOnly (3);
1762 Assert (d >> v3, 0xFE00, "#3");
1763 dynamic d3 = new MyType (-7);
1764 Assert (d3 >> new MyTypeImplicitOnly (11), -1, "#3a");
1767 void RightShiftNullableTest ()
1772 Assert<int?> (d >> v2, null, "#1");
1774 Assert<int?> (d >> null, null, "#1a");
1776 Assert<int?> (null >> d, null, "#1b");
1779 Assert (d >> v2, 0, "#2");
1780 dynamic d2 = (int?) -200;
1781 Assert (d2 >> 1, -100, "#2a");
1784 void RightShiftAssignTest ()
1786 dynamic d = 0x7F000;
1790 Assert (d, 0x1FC00, "#1");
1792 Assert (d, 0xFE00, "#1a");
1795 Assert (d, 0x3F80, "#1b");
1798 void RightShiftAssignNullableTest ()
1804 Assert (d, 0, "#2");
1805 dynamic d2 = (int?) -2;
1807 Assert (d2, -1, "#2a");
1810 void SubtractTest ()
1815 Assert (d - v, 3, "#1");
1817 Assert (d - v2, 4.5, "#1a");
1820 MyType v3 = new MyType (30);
1821 Assert (d - v3, new MyType (-25), "#3");
1822 dynamic d3 = new MyType (-7);
1823 Assert (d3 - new MyType (6), new MyType (-13), "#3a");
1825 d = new MyTypeImplicitOnly (5);
1827 Assert (d - v4, 1m, "#4");
1830 void SubtractNullableTest ()
1835 Assert<int?> (d - v2, null, "#1");
1836 Assert<int?> (d - null, null, "#1a");
1837 Assert<int?> (null - d, null, "#1b");
1840 Assert (d - v2, 7, "#2");
1841 dynamic d2 = (int?) -2;
1842 Assert (d2 - 1, -3, "#2a");
1845 MyType? v3 = new MyType (30);
1846 Assert (d - v3, new MyType (-25), "#3");
1847 dynamic d3 = new MyType? (new MyType (-7));
1848 Assert (d3 - new MyType (6), new MyType (-13), "#3a");
1849 Assert<MyType?> (d3 - null, null, "#3b");
1851 d = new MyTypeImplicitOnly (5);
1853 Assert (d - v4, 1m, "#4");
1855 Assert<decimal?> (d - v4, null, "#4a");
1858 void SubtractEnumTest ()
1860 dynamic d = MyEnum.Value_1;
1862 // CSC: Invalid System.InvalidOperationException
1863 Assert (d - null, null, "#1");
1865 Assert (d - 1, MyEnum.Value_2, "#2");
1867 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1868 Assert (d2 - (byte) 1, MyEnumUlong.Value_2, "#3");
1869 Assert<MyEnumUlong?> (d2 - (object) null, null, "#3a");
1872 void SubtractCheckedTest ()
1877 int v = int.MinValue;
1878 AssertChecked (() => d - v, 7, "#1");
1881 AssertChecked (() => d - v2, null, "#2");
1884 MyType v3 = new MyType (int.MinValue);
1885 Assert (d - v3, new MyType (-2147483643), "#3");
1889 void SubtractAssignTest ()
1895 Assert (d, 3, "#1");
1900 Assert (d, 4.5, "#1a");
1902 Assert (d, 2.5, "#1b");
1904 dynamic d3 = new MyType (-7);
1905 d3 -= new MyType (6);
1906 Assert<MyType> (d3, new MyType (-13), "#3");
1911 Assert (d, 1m, "#4");
1914 void SubtractAssignEnumTest ()
1916 dynamic d = MyEnum.Value_1;
1919 Assert<MyEnum> (d, 0, "#2");
1921 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1923 Assert (d2, MyEnumUlong.Value_1, "#3");
1926 void SubtractAssignCheckedTest ()
1931 int v = int.MinValue;
1932 AssertChecked (() => { d -= v; Assert (d, 0, "#1a"); }, "#1");
1935 MyType v3 = new MyType (int.MinValue);
1937 Assert (d, new MyType (-2147483643), "#3a");
1942 void SubtractAssignmentEvent ()
1947 void UnaryDecrement ()
1950 Assert (3, d--, "#1");
1951 Assert (2, d, "#1a");
1954 Assert (2, --d, "#2");
1955 Assert (2, d, "#2a");
1957 d = new MyType (-3);
1958 Assert (new MyType (-3), d--, "#3");
1959 Assert (new MyType (-1), d, "#3a");
1962 void UnaryDecrementCheckedTest ()
1965 dynamic d = int.MinValue;
1967 AssertChecked (() => { d--; Assert (d, -1073741824, "#1a"); }, "#1");
1969 d = new MyType (int.MinValue);
1971 Assert (d, new MyType (-1073741824), "#2");
1975 void UnaryIncrement ()
1978 Assert (3, d++, "#1");
1979 Assert (4, d, "#1a");
1982 Assert (4, ++d, "#2");
1983 Assert (4, d, "#2a");
1985 d = new MyType (-3);
1986 Assert (new MyType (-3), d++, "#3");
1987 Assert (new MyType (-6), d, "#3a");
1990 void UnaryIncrementCheckedTest ()
1993 dynamic d = int.MaxValue;
1995 AssertChecked (() => { d++; Assert (d, 0, "#1a"); }, "#1");
1997 d = new MyType (int.MaxValue);
1999 Assert (d, new MyType (-2), "#2");
2003 //void UnaryIsFalse ()
2005 // dynamic d = this;
2006 // object r = d == null;
2007 // Assert (false, (bool) r, "#1");
2008 // Assert<object> (true, d != null, "#1a");
2014 Assert (3, d ? 3 : 5, "#1");
2017 Assert (false, d < 1, "#2");
2019 d = new InverseLogicalOperator (true);
2020 Assert (1, d ? 1 : -1, "#3");
2026 Assert (-8, +d, "#1");
2027 Assert (-8, +(+d), "#1a");
2029 d = new MyType (14);
2030 Assert (new MyType (334455), +d, "#2");
2032 d = new MyTypeImplicitOnly (4);
2033 Assert (4, +d, "#3");
2036 Assert<uint> (7, +d, "#4");
2039 void UnaryPlusNullable ()
2041 dynamic d = (int?) -8;
2042 Assert (-8, +d, "#1");
2043 Assert (-8, +(+d), "#1a");
2045 MyType? n1 = new MyType (4);
2047 Assert (new MyType (334455), +d, "#2");
2049 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
2051 Assert (4, +d, "#3");
2054 Assert (7, +d, "#4");
2057 #pragma warning restore 169
2059 static bool RunTest (MethodInfo test)
2061 Console.Write ("Running test {0, -25}", test.Name);
2063 test.Invoke (new Tester (), null);
2064 Console.WriteLine ("OK");
2066 } catch (Exception e) {
2067 Console.WriteLine ("FAILED");
2068 Console.WriteLine (e.InnerException.Message);
2073 public static int Main ()
2075 var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
2076 where test.GetParameters ().Length == 0
2078 select RunTest (test);
2080 int failures = tests.Count (a => !a);
2081 Console.WriteLine (failures + " tests failed");