2 using System.Collections.Generic;
4 using System.Reflection;
6 // Dynamic binary operator, unary operators and convert tests
8 public struct InverseLogicalOperator
11 public InverseLogicalOperator (bool value)
16 public static bool operator true (InverseLogicalOperator u)
21 public static bool operator false (InverseLogicalOperator u)
31 public MyType (int value) : this ()
36 public short ShortProp { get; set; }
38 public override int GetHashCode ()
40 throw new NotImplementedException ();
43 public static bool operator true (MyType a)
48 public static bool operator false (MyType a)
53 public static MyType operator + (MyType a, MyType b)
55 return new MyType (a.value + b.value);
58 public static MyType operator - (MyType a, MyType b)
60 return new MyType (a.value - b.value);
63 public static MyType operator / (MyType a, MyType b)
65 return new MyType (a.value / b.value);
68 public static MyType operator * (MyType a, MyType b)
70 return new MyType (a.value * b.value);
73 public static MyType operator % (MyType a, MyType b)
75 return new MyType (a.value % b.value);
78 public static MyType operator &(MyType a, MyType b)
80 return new MyType (a.value & b.value);
83 public static MyType operator | (MyType a, MyType b)
85 return new MyType (a.value | b.value);
88 public static MyType operator ^ (MyType a, MyType b)
90 return new MyType (a.value ^ b.value);
93 public static bool operator == (MyType a, MyType b)
95 return a.value == b.value;
98 public static bool operator != (MyType a, MyType b)
100 return a.value != b.value;
103 public static bool operator > (MyType a, MyType b)
105 return a.value > b.value;
108 public static bool operator < (MyType a, MyType b)
110 return a.value < b.value;
113 public static bool operator >= (MyType a, MyType b)
115 return a.value >= b.value;
118 public static bool operator <= (MyType a, MyType b)
120 return a.value <= b.value;
123 public static bool operator ! (MyType a)
128 public static int operator ~ (MyType a)
133 public static MyType operator ++ (MyType a)
135 return new MyType (a.value * 2);
138 public static MyType operator -- (MyType a)
140 return new MyType (a.value / 2);
143 public static int operator >> (MyType a, int b)
148 public static int operator << (MyType a, int b)
153 public static MyType operator - (MyType a)
155 return new MyType (-a.value);
158 public static MyType operator + (MyType a)
160 return new MyType (334455); // magic number
163 public override string ToString ()
165 return value.ToString ();
174 public MyTypeExplicit (int value)
179 public static explicit operator int (MyTypeExplicit m)
185 struct MyTypeImplicitOnly
189 public MyTypeImplicitOnly (short b)
194 public static implicit operator short (MyTypeImplicitOnly m)
199 public static implicit operator bool (MyTypeImplicitOnly m)
211 enum MyEnumUlong : ulong
220 delegate void EmptyDelegate ();
221 event Action ev_assign;
223 static void Assert<T> (T expected, T value, string name)
225 if (!EqualityComparer<T>.Default.Equals (expected, value)) {
227 throw new ApplicationException (name + expected + " != " + value);
231 static void AssertChecked<T> (Func<T> expected, T value, string name)
234 Assert (expected (), value, name);
235 throw new ApplicationException (name + ": OverflowException expected");
236 } catch (OverflowException) {
241 static void AssertChecked (Action expected, string name)
245 throw new ApplicationException (name + ": OverflowException expected");
246 } catch (OverflowException) {
251 #pragma warning disable 169
258 Assert (d + v, 7, "#1");
260 Assert (d + v2, 5.5, "#1a");
263 MyType v3 = new MyType (30);
264 Assert (d + v3, new MyType (35), "#3");
265 dynamic d3 = new MyType (-7);
266 Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
268 d3 = new MyTypeImplicitOnly (6);
269 Assert (d3 + new MyTypeImplicitOnly (11), 17, "#3b");
271 d = new MyTypeImplicitOnly (5);
273 Assert (d + v4, 9m, "#4");
276 void AddNullableTest ()
281 Assert<int?> (d + v2, null, "#1");
282 Assert<int?> (d + null, null, "#1a");
283 Assert<int?> (null + d, null, "#1b");
286 Assert (d + v2, 3, "#2");
287 dynamic d2 = (int?) -2;
288 Assert (d2 + 1, -1, "#2a");
291 MyType? v3 = new MyType (30);
292 Assert (d + v3, new MyType (35), "#3");
293 dynamic d3 = new MyType? (new MyType (-7));
294 Assert (d3 + new MyType (6), new MyType (-1), "#3a");
295 Assert<MyType?> (d3 + null, null, "#3b");
297 d = new MyTypeImplicitOnly (5);
299 Assert (d + v4, 9m, "#4");
301 Assert<decimal?> (d + v4, null, "#4a");
306 dynamic d = MyEnum.Value_1;
308 Assert (d + 1, MyEnum.Value_2, "#1");
310 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
311 Assert (d2 + (byte) 1, MyEnumUlong.Value_2, "#2");
312 Assert<MyEnumUlong?> (d2 + null, null, "#2a");
314 // CSC: Invalid System.InvalidOperationException
315 Assert<MyEnum?> (d + null, null, "#1");
318 void AddCheckedTest ()
323 int v = int.MaxValue;
324 AssertChecked (() => d + v, 7, "#1");
327 AssertChecked (() => d + v2, null, "#2");
330 MyType v3 = new MyType (int.MaxValue);
331 Assert (new MyType (-2147483646), d + v3, "#3");
335 void AddStringTest ()
339 Assert (d + v, "foo->", "#1");
340 Assert (d + 1, "foo1", "#1a");
341 Assert (d + null, "foo", "#1b");
342 Assert (d + 1 + v, "foo1->", "#1a");
345 Assert (d + v2, "foo4", "#2");
348 void AddAssignTest ()
359 Assert (d, 5.5, "#1a");
361 Assert (d, 7.5, "#1b");
363 dynamic d3 = new MyType (-7);
364 d3 += new MyType (6);
365 Assert<MyType> (d3, new MyType (-1), "#3");
370 Assert (d, 9m, "#4");
373 void AddAssignNullableTest ()
375 dynamic d = (int?) 5;
378 // For now it's impossible to use nullable compound assignment
379 // due to the way how DLR works. GetType () on nullable object returns
380 // underlying type and not nullable type, that means that
381 // C# binder is initialized with wrong operand type and any operation
386 Assert<int?> (d, null, "#1");
388 Assert<int?> (d, null, "#1a");
397 Assert (d, -1, "#2a");
399 MyType? v3 = new MyType (30);
401 Assert (d, new MyType (35), "#3");
402 dynamic d3 = new MyType? (new MyType (-7));
403 Assert (d3 + new MyType (6), new MyType (-1), "#3a");
404 Assert<MyType?> (d3 + null, null, "#3b");
409 Assert (d, 9m, "#4");
411 Assert<decimal?> (d, null, "#4a");
415 void AddAssignEnumTest ()
417 dynamic d = MyEnum.Value_1;
421 Assert (d, MyEnum.Value_2, "#2");
423 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
425 Assert (d2, MyEnumUlong.Value_2, "#3");
428 void AddAssignCheckedTest ()
433 int v = int.MaxValue;
434 AssertChecked (() => { d += v; Assert (d, 0, "#1-"); }, "#1");
437 MyType v3 = new MyType (int.MaxValue);
439 Assert (d, new MyType (-2147483644), "#3-");
443 void AddAssignStringTest ()
448 Assert (d, "foo->", "#1");
452 Assert (d, "foo1", "#1a");
455 Assert (d, "foo1", "#1b");
460 Assert (d, "foo4", "#2");
463 void AddAssignEvent ()
467 // FIXME: Will have to special case events
476 Assert (d & v, false, "#1");
477 Assert (d & true, true, "#1a");
481 Assert (d & v2, 42, "#2");
482 Assert (d & 0, 0, "#2a");
485 MyType v3 = new MyType (30);
486 Assert (d & v3, new MyType (10), "#3");
487 dynamic d3 = new MyType (-7);
488 Assert<MyType> (d3 & new MyType (6), new MyType (0), "#3a");
490 d3 = new MyTypeImplicitOnly (6);
491 Assert (d3 & 11, 2, "#3b");
496 dynamic d = MyEnum.Value_1;
498 Assert<MyEnum?> (d & null, null, "#1");
500 Assert (d & d, MyEnum.Value_1, "#2");
502 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
503 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
506 void AndTestNullable ()
511 Assert<int?> (d & v2, null, "#1");
512 Assert<int?> (d & null, null, "#1a");
513 Assert<int?> (null & d, null, "#1b");
516 Assert (d & v2, 4, "#2");
517 dynamic d2 = (int?) -2;
518 Assert (d2 & 1, 0, "#2a");
521 MyType? v3 = new MyType (30);
522 Assert (d & v3, new MyType (22), "#3");
523 dynamic d3 = new MyType? (new MyType (-7));
524 Assert (d3 & new MyType (6), new MyType (0), "#3a");
525 Assert<MyType?> (d3 + null, null, "#3b");
527 dynamic a = (bool?) true;
528 dynamic b = (bool?) null;
529 Assert (a & b, (bool?)null, "#4a");
530 Assert (b & a, (bool?)null, "#4b");
533 void AndAssignedTest ()
539 Assert (d, false, "#1");
542 Assert (d, true, "#1a");
547 Assert (d, 42, "#2");
549 MyType v3 = new MyType (30);
550 dynamic d3 = new MyType (-7);
551 d3 &= new MyType (6);
552 Assert<MyType> (d3, new MyType (0), "#3");
555 void AndAssignedTestEnum ()
557 dynamic d = MyEnum.Value_1;
559 Assert<MyEnum>(d, 0, "#1");
563 Assert (d, MyEnum.Value_2, "#2");
565 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
566 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
574 Assert<bool> (d && v, false, "#1");
576 Assert (d && true, true, "#1a");
579 Assert (d && d, true, "#2");
581 dynamic d3 = new MyType (-7);
582 Assert<MyType> (d3 && new MyType (6), new MyType (0), "#3");
590 Assert (d / v, 2, "#1");
593 MyType v3 = new MyType (30);
594 Assert (d / v3, new MyType (0), "#3");
595 dynamic d3 = new MyType (-7);
596 Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
598 d = new MyTypeImplicitOnly (6);
600 Assert (d / v4, 1.5m, "#4");
603 void DivideNullableTest ()
608 Assert<double?> (d / v2, null, "#1");
609 Assert<double?> (d / null, null, "#1a");
610 Assert<double?> (null / d, null, "#1b");
613 Assert (d / v2, -2.5, "#2");
614 dynamic d2 = (int?) -2;
615 Assert (d2 / 1, -2, "#2a");
618 MyType? v3 = new MyType (30);
619 Assert (d / v3, new MyType (0), "#3");
620 dynamic d3 = new MyType? (new MyType (-7));
621 Assert (d3 / new MyType (6), new MyType (-1), "#3a");
622 Assert<MyType?> (d3 + null, null, "#3b");
624 d = new MyTypeImplicitOnly (5);
626 Assert (d / v4, 1.25m, "#4");
628 Assert<decimal?> (d / v4, null, "#4a");
631 void DivideCheckedTest ()
638 void DivideAssignTest ()
649 Assert (d, 10, "#1a");
651 Assert (d, 5, "#1b");
653 dynamic d3 = new MyType (-7);
654 d3 /= new MyType (6);
655 Assert<MyType> (d3, new MyType (-1), "#3");
660 Assert (d, 1.25m, "#4");
663 void DivideAssignCheckedTest ()
670 void ConvertImplicitTest ()
674 Assert (3m, v1, "#1");
676 d = new MyTypeImplicitOnly (5);
678 Assert (5, v2, "#2");
682 Assert (4, v3, "#3");
684 int[] v4 = new int[] { d };
685 Assert (4, v4[0], "#4");
688 var v5 = new [] { d, 1 };
689 Assert (true, v5[0], "#5");
690 Assert (1, v5[1], "#5a");
694 var r = b ? d : "ss";
695 Assert ("ss", r, "#6");
697 var v = new [] { d, 1 };
698 Assert ("aa", v [0], "#7");
700 dynamic [,] a = new dynamic [,] { { 1, 2 }, { 'b', 'x' } };
701 Assert (2, a [0, 1], "#8");
702 Assert ('x', a [1, 1], "#8a");
705 int ConvertImplicitReturnTest ()
707 dynamic d = (byte) 3;
711 IEnumerable<string> ConvertImplicitReturnTest_2 ()
717 void ConvertExplicitTest ()
720 Assert (44, (byte) d, "#1");
721 Assert<byte?> (44, (byte?) d, "#1a");
726 d = new MyTypeImplicitOnly (5);
727 Assert (5, (int) d, "#3");
729 d = new MyTypeExplicit (-2);
730 Assert (-2, (int) d, "#4");
733 Assert (null, (object) d, "#5");
736 void ConvertExplicitCheckedTest ()
740 AssertChecked (() => (byte) d, 7, "#1");
743 AssertChecked<uint?> (() => (uint?) d, 2, "#2");
749 dynamic idx = (uint) 1;
750 var arr = new int [5];
752 Assert (2, arr [idx], "#1");
760 Assert (d == v, false, "#1");
762 Assert (d == v2, true, "#1a");
765 Assert (d == false, false, "#2");
767 Assert (d == b2, true, "#2a");
770 MyType v3 = new MyType (30);
771 Assert (d == v3, true, "#3");
772 dynamic d3 = new MyTypeImplicitOnly (-7);
773 Assert (d3 == 11, false, "#3b");
777 Assert (d == v4, false, "#4");
778 Assert (d == 2m, true, "#4a");
781 Assert (d == null, true, "#5");
784 void EqualNullableTest ()
789 Assert (d == v2, false, "#1");
790 Assert (d == null, false, "#1a");
791 Assert (null == d, false, "#1b");
794 Assert (d == v2, false, "#2");
795 dynamic d2 = (int?) -2;
796 Assert (d2 == 1, false, "#2a");
798 Assert (d2 == 44, true, "#2b");
801 MyType? v3 = new MyType (30);
802 Assert (d == v3, true, "#3");
803 dynamic d3 = new MyType? (new MyType (-7));
804 Assert (d3 == new MyType (6), false, "#3a");
805 Assert (d3 == null, false, "#3b");
809 Assert (d == v4, false, "#4");
811 Assert (d == v4, false, "#4a");
814 Assert (d == true, true, "#5");
815 Assert (d == null, false, "#5a");
816 Assert (d == false, false, "#5b");
819 void EqualEnumTest ()
821 dynamic d = MyEnum.Value_1;
823 Assert (d == null, false, "#1");
825 Assert (d == MyEnum.Value_1, true, "#2");
826 Assert (d == 0, false, "#2a");
828 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
829 Assert (d2 == MyEnumUlong.Value_2, true, "#3");
830 Assert (d2 == null, false, "#3a");
833 void EqualStringTest ()
837 Assert (d == "te", false, "#1");
838 Assert (d == "text", true, "#1a");
839 Assert (d == null, false, "#1b");
842 void EqualDelegateTest ()
846 // Assert (d == delegate { }, true, "#1");
848 EmptyDelegate b = EqualDelegateTest;
851 //Assert (d == EqualDelegateTest, true, "#2");
855 void EqualTestDelegate_2 ()
857 EmptyDelegate ed = delegate () {};
859 Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
860 AssertNodeType (e2, ExpressionType.Equal);
861 Assert (false, e2.Compile ().Invoke (delegate () {}, null));
862 Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
863 Assert (false, e2.Compile ().Invoke (ed, delegate {}));
864 Assert (true, e2.Compile ().Invoke (ed, ed));
868 void ExclusiveOrTest ()
873 Assert (d ^ v, true, "#1");
874 Assert (d ^ true, false, "#1a");
878 Assert (d ^ v2, 20, "#2");
879 Assert (d ^ 0, 42, "#2a");
882 MyType v3 = new MyType (30);
883 Assert (d ^ v3, new MyType (52), "#3");
884 dynamic d3 = new MyType (-7);
885 Assert<MyType> (d3 ^ new MyType (6), new MyType (-1), "#3a");
887 d3 = new MyTypeImplicitOnly (-7);
888 Assert (d3 ^ 11, -14, "#3b");
891 void ExclusiveOrNullableTest ()
896 Assert<int?> (d ^ v2, null, "#1");
897 Assert<int?> (d ^ null, null, "#1a");
898 Assert<int?> (null ^ d, null, "#1b");
901 Assert (d ^ v2, -5, "#2");
902 dynamic d2 = (int?) -2;
903 Assert (d2 ^ 1, -1, "#2a");
906 MyType? v3 = new MyType (30);
907 Assert (d ^ v3, new MyType (27), "#3");
908 dynamic d3 = new MyType? (new MyType (-7));
909 Assert (d3 ^ new MyType (6), new MyType (-1), "#3a");
910 Assert<MyType?> (d3 ^ null, null, "#3b");
913 void ExclusiveOrTestEnum ()
915 dynamic d = MyEnum.Value_1;
917 Assert<MyEnum?> (d ^ null, null, "#1");
919 Assert<MyEnum> (d ^ d, 0, "#2");
921 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
922 Assert<MyEnumUlong> (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
925 void ExclusiveOrAssignedTest ()
931 Assert (d, true, "#1");
934 Assert (d, false, "#1a");
939 Assert (d, 20, "#2");
941 MyType v3 = new MyType (30);
942 dynamic d3 = new MyType (-7);
943 d3 ^= new MyType (6);
944 Assert (d3, new MyType (-1), "#3");
947 void ExclusiveOrAssignedTestEnum ()
949 dynamic d = MyEnum.Value_1;
951 Assert<MyEnum>(d, (MyEnum) 3, "#1");
955 Assert<MyEnum> (d, 0, "#2");
957 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
958 Assert (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
961 void GreaterThanTest ()
966 Assert (d > v, true, "#1");
968 Assert (d > v2, false, "#1a");
971 Assert (d > 4.59, true, "#2");
973 Assert (d > b2, false, "#2a");
976 MyType v3 = new MyType (30);
977 Assert (d > v3, false, "#3");
978 dynamic d3 = new MyType (-7);
979 Assert (d3 > new MyType (6), false, "#3a");
981 d3 = new MyTypeImplicitOnly (-7);
982 Assert (d3 > 11, false, "#3b");
986 Assert (d > v4, false, "#4");
987 Assert (d > 2m, false, "#4a");
990 void GreaterThanNullableTest ()
995 Assert (d > v2, false, "#1");
996 Assert (d > null, false, "#1a");
997 Assert (null > d, false, "#1b");
1000 Assert (d > v2, true, "#2");
1001 dynamic d2 = (int?) -2;
1002 Assert (d2 > 1, false, "#2a");
1004 Assert (d2 > 44, false, "#2b");
1006 d = new MyType (30);
1007 MyType? v3 = new MyType (30);
1008 Assert (d > v3, false, "#3");
1009 dynamic d3 = new MyType? (new MyType (-7));
1010 Assert (d3 > new MyType (6), false, "#3a");
1011 Assert (d3 > null, false, "#3b");
1015 Assert (d > v4, true, "#4");
1017 Assert (d > v4, false, "#4a");
1020 void GreaterThanEnumTest ()
1022 dynamic d = MyEnum.Value_1;
1024 Assert (d > null, false, "#1");
1026 Assert (d > MyEnum.Value_1, false, "#2");
1027 Assert (d > 0, true, "#2a");
1029 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1030 Assert (d2 > MyEnumUlong.Value_2, false, "#3");
1031 Assert (d2 > null, false, "#3a");
1034 void GreaterThanEqualTest ()
1039 Assert (d >= v, true, "#1");
1041 Assert (d >= v2, true, "#1a");
1044 Assert (d >= 4.59, true, "#2");
1046 Assert (d >= b2, true, "#2a");
1048 d = new MyType (30);
1049 MyType v3 = new MyType (30);
1050 Assert (d >= v3, true, "#3");
1051 dynamic d3 = new MyType (-7);
1052 Assert (d3 >= new MyType (6), false, "#3a");
1054 d3 = new MyTypeImplicitOnly (-7);
1055 Assert (d3 >= 11, false, "#3b");
1059 Assert (d >= v4, false, "#4");
1060 Assert (d >= 2m, true, "#4a");
1063 void GreaterThanEqualNullableTest ()
1068 Assert (d >= v2, false, "#1");
1069 Assert (d >= null, false, "#1a");
1070 Assert (null >= d, false, "#1b");
1073 Assert (d >= v2, true, "#2");
1074 dynamic d2 = (int?) -2;
1075 Assert (d2 >= 1, false, "#2a");
1077 Assert (d2 >= 44, true, "#2b");
1079 d = new MyType (30);
1080 MyType? v3 = new MyType (30);
1081 Assert (d >= v3, true, "#3");
1082 dynamic d3 = new MyType? (new MyType (-7));
1083 Assert (d3 >= new MyType (6), false, "#3a");
1084 Assert (d3 >= null, false, "#3b");
1088 Assert (d >= v4, true, "#4");
1090 Assert (d >= v4, false, "#4a");
1093 void GreaterThanEqualEnumTest ()
1095 dynamic d = MyEnum.Value_1;
1097 Assert (d >= null, false, "#1");
1099 Assert (d >= MyEnum.Value_1, true, "#2");
1100 Assert (d >= 0, true, "#2a");
1102 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1103 Assert (d2 >= MyEnumUlong.Value_2, true, "#3");
1104 Assert (d2 >= null, false, "#3a");
1107 void LeftShiftTest ()
1109 dynamic d = (ulong) 0x7F000;
1112 Assert<ulong> (d << v, 0x1FC000, "#1");
1113 Assert<ulong> (d << 1, 0xFE000, "#1a");
1115 Assert<ulong> (d << s, 0x1FC000, "#1b");
1118 MyTypeImplicitOnly v3 = new MyTypeImplicitOnly (3);
1119 Assert (d << v3, 0x3F8000, "#3");
1120 dynamic d3 = new MyType (-7);
1121 Assert (d3 << new MyTypeImplicitOnly (6), -448, "#3a");
1122 Assert (d3 << 11, -14336, "#3b");
1125 void LeftShiftNullableTest ()
1130 Assert<int?> (d << v2, null, "#1");
1132 Assert<int?> (d << null, null, "#1a");
1134 Assert<int?> (null << d, null, "#1b");
1137 Assert (d << v2, 0x40000000, "#2");
1138 dynamic d2 = (int?) -2;
1139 Assert (d2 << 1, -4, "#2a");
1141 dynamic d3 = (int?) null;
1142 Assert (d3 << (null << null), (int?)null, "#3");
1145 void LeftShiftAssignTest ()
1147 dynamic d = 0x7F000;
1151 Assert (d, 0x1FC000, "#1");
1153 Assert (d, 0x3F8000, "#1a");
1156 Assert (d, 0xFE0000, "#1b");
1159 void LeftShiftAssignNullableTest ()
1165 Assert (d, 0x40000000, "#2");
1166 dynamic d2 = (int?) -2;
1168 Assert (d2, -4, "#2a");
1171 void LessThanTest ()
1176 Assert (d < v, false, "#1");
1178 Assert (d < v2, false, "#1a");
1181 Assert (d < 4.59, false, "#2");
1183 Assert (d < b2, false, "#2a");
1185 d = new MyType (30);
1186 MyType v3 = new MyType (30);
1187 Assert (d < v3, false, "#3");
1188 dynamic d3 = new MyType (-7);
1189 Assert (d3 < new MyType (6), true, "#3a");
1191 d3 = new MyTypeImplicitOnly (-7);
1192 Assert (d3 < 11, true, "#3b");
1196 Assert (d < v4, true, "#4");
1197 Assert (d < 2m, false, "#4a");
1200 void LessThanNullableTest ()
1205 Assert (d < v2, false, "#1");
1206 Assert (d < null, false, "#1a");
1207 Assert (null < d, false, "#1b");
1210 Assert (d < v2, false, "#2");
1211 dynamic d2 = (int?) -2;
1212 Assert (d2 < 1, true, "#2a");
1214 Assert (d2 < 44, false, "#2b");
1216 d = new MyType (30);
1217 MyType? v3 = new MyType (30);
1218 Assert (d < v3, false, "#3");
1219 dynamic d3 = new MyType? (new MyType (-7));
1220 Assert (d3 < new MyType (6), true, "#3a");
1222 d3 = new MyTypeImplicitOnly (-7);
1223 Assert (d3 < null, false, "#3b");
1227 Assert (d < v4, false, "#4");
1229 Assert (d < v4, false, "#4a");
1232 void LessThanEnumTest ()
1234 dynamic d = MyEnum.Value_1;
1236 Assert (d < null, false, "#1");
1238 Assert (d < MyEnum.Value_1, false, "#2");
1239 Assert (d < 0, false, "#2a");
1241 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1242 Assert (d2 < MyEnumUlong.Value_2, false, "#3");
1243 Assert (d2 < null, false, "#3a");
1246 void LessThanOrEqualTest ()
1251 Assert (d <= v, false, "#1");
1253 Assert (d <= v2, true, "#1a");
1256 Assert (d <= 4.59, false, "#2");
1258 Assert (d <= b2, true, "#2a");
1260 d = new MyType (30);
1261 MyType v3 = new MyType (30);
1262 Assert (d <= v3, true, "#3");
1263 dynamic d3 = new MyType (-7);
1264 Assert (d3 <= new MyType (6), true, "#3a");
1266 d3 = new MyTypeImplicitOnly (-7);
1267 Assert (d3 <= 11, true, "#3b");
1271 Assert (d <= v4, true, "#4");
1272 Assert (d <= 2m, true, "#4a");
1275 void LessThanOrEqualNullableTest ()
1280 Assert (d <= v2, false, "#1");
1281 Assert (d <= null, false, "#1a");
1282 Assert (null <= d, false, "#1b");
1285 Assert (d <= v2, false, "#2");
1286 dynamic d2 = (int?) -2;
1287 Assert (d2 <= 1, true, "#2a");
1289 Assert (d2 <= 44, true, "#2b");
1291 d = new MyType (30);
1292 MyType? v3 = new MyType (30);
1293 Assert (d <= v3, true, "#3");
1294 dynamic d3 = new MyType? (new MyType (-7));
1295 Assert (d3 <= new MyType (6), true, "#3a");
1296 Assert (d3 <= null, false, "#3b");
1300 Assert (d <= v4, false, "#4");
1302 Assert (d <= v4, false, "#4a");
1305 void LessThanOrEqualEnumTest ()
1307 dynamic d = MyEnum.Value_1;
1309 Assert (d <= null, false, "#1");
1311 Assert (d <= MyEnum.Value_1, true, "#2");
1312 Assert (d <= 0, false, "#2a");
1314 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1315 Assert (d2 <= MyEnumUlong.Value_2, true, "#3");
1316 Assert (d2 <= null, false, "#3a");
1324 Assert (d % v, 1, "#1");
1327 MyType v3 = new MyType (30);
1328 Assert (d % v3, new MyType (5), "#3");
1329 dynamic d3 = new MyType (-7);
1330 Assert<MyType> (d3 % new MyType (6), new MyType (-1), "#3a");
1332 d = new MyTypeImplicitOnly (5);
1334 Assert (d % v4, 1m, "#4");
1337 void ModuloNullableTest ()
1342 Assert<double?> (d % v2, null, "#1");
1343 Assert<double?> (d % null, null, "#1a");
1344 Assert<double?> (null % d, null, "#1b");
1347 Assert (d % v2, 1, "#2");
1348 dynamic d2 = (int?) -2;
1349 Assert (d2 % 1, 0, "#2a");
1351 d = new MyType (-2);
1352 MyType? v3 = new MyType (30);
1353 Assert (d % v3, new MyType (-2), "#3");
1354 dynamic d3 = new MyType? (new MyType (-7));
1355 Assert (d3 % new MyType (6), new MyType (-1), "#3a");
1356 Assert<MyType?> (d3 + null, null, "#3b");
1358 d = new MyTypeImplicitOnly (5);
1360 Assert (d % v4, 1m, "#4");
1362 Assert<decimal?> (d % v4, null, "#4a");
1365 void ModuloAssignTest ()
1371 Assert (d, 1, "#1");
1376 Assert (d, 0, "#1a");
1378 Assert (d, 0, "#1b");
1380 dynamic d3 = new MyType (-7);
1381 d3 %= new MyType (6);
1382 Assert<MyType> (d3, new MyType (-1), "#3");
1387 Assert (d, 1m, "#4");
1390 void MultiplyTest ()
1395 Assert (d * v, 10, "#1");
1397 Assert (d * v2, 2.5, "#1a");
1400 MyType v3 = new MyType (30);
1401 Assert (d * v3, new MyType (150), "#3");
1402 dynamic d3 = new MyType (-7);
1403 Assert<MyType> (d3 * new MyType (6), new MyType (-42), "#3a");
1407 Assert (d * v4, 31.6m, "#4");
1410 void MultiplyNullableTest ()
1415 Assert<int?> (d * v2, null, "#1");
1416 Assert<int?> (d * null, null, "#1a");
1417 Assert<int?> (null * d, null, "#1b");
1420 Assert (d * v2, -10, "#2");
1421 dynamic d2 = (int?) -2;
1422 Assert (d2 * 1, -2, "#2a");
1425 MyType? v3 = new MyType (30);
1426 Assert (d * v3, new MyType (150), "#3");
1427 dynamic d3 = new MyType? (new MyType (-7));
1428 Assert (d3 * new MyType (6), new MyType (-42), "#3a");
1429 Assert<MyType?> (d3 * null, null, "#3b");
1431 d = new MyTypeImplicitOnly (5);
1433 Assert (d * v4, 20m, "#4");
1435 Assert<decimal?> (d * v4, null, "#4a");
1438 void MultiplyCheckedTest ()
1443 int v = int.MaxValue;
1444 AssertChecked (() => d * v, 7, "#1");
1447 AssertChecked (() => d * v2, null, "#2");
1450 MyType v3 = new MyType (int.MaxValue);
1451 Assert (d * v3, new MyType (-4), "#3");
1455 void MultiplyAssignTest ()
1461 Assert (d, 10, "#1");
1466 Assert (d, 2.5, "#1a");
1468 Assert (d, 5, "#1b");
1470 dynamic d3 = new MyType (-7);
1471 d3 *= new MyType (6);
1472 Assert<MyType> (d3, new MyType (-42), "#3");
1477 Assert (d, 20m, "#4");
1482 Assert (i, 15, "#5");
1485 void MultiplyAssignCheckedTest ()
1490 int v = int.MaxValue;
1491 AssertChecked (() => { d *= v; Assert (d, 0, "#1-"); }, "#1");
1493 d = new MyType (44);
1494 MyType v3 = new MyType (int.MaxValue);
1496 Assert (d, new MyType (-44), "#3-");
1503 Assert (8, -d, "#1");
1504 Assert (-8, -(-d), "#1a");
1506 d = new MyType (-14);
1507 Assert (new MyType (14), -d, "#2");
1509 d = new MyTypeImplicitOnly (4);
1510 Assert (-4, -d, "#3");
1513 Assert (-7, -d, "#4");
1515 d = double.NegativeInfinity;
1516 Assert (double.PositiveInfinity, -d, "#5");
1519 void NegateNullable ()
1521 dynamic d = (int?) -8;
1522 Assert (8, -d, "#1");
1523 Assert (-8, -(-d), "#1a");
1525 MyType? n1 = new MyType (4);
1527 Assert (new MyType (-4), -d, "#2");
1529 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
1531 Assert (-4, -d, "#3");
1534 Assert (-7, -d, "#4");
1537 void NegateChecked ()
1540 dynamic d = int.MinValue;
1541 AssertChecked (() => -d, 0, "#1");
1548 Assert (false, !d, "#1");
1550 var de = new MyType (-1);
1551 Assert (false, !d, "#2");
1554 void NotEqualTest ()
1559 Assert (d != v, true, "#1");
1561 Assert (d != v2, false, "#1a");
1564 Assert (d != false, true, "#2");
1566 Assert (d != b2, false, "#2a");
1568 d = new MyType (30);
1569 MyType v3 = new MyType (30);
1570 Assert (d != v3, false, "#3");
1571 dynamic d3 = new MyType (-7);
1572 Assert (d3 != new MyType (6), true, "#3a");
1576 Assert (d != v4, true, "#4");
1577 Assert (d != 2m, false, "#4a");
1580 Assert (d != null, false, "#5");
1583 void NotEqualNullableTest ()
1588 Assert (d != v2, true, "#1");
1589 Assert (d != null, true, "#1a");
1590 Assert (null != d, true, "#1b");
1593 Assert (d != v2, true, "#2");
1594 dynamic d2 = (int?) -2;
1595 Assert (d2 != 1, true, "#2a");
1597 Assert (d2 != 44, false, "#2b");
1599 d = new MyType (30);
1600 MyType? v3 = new MyType (30);
1601 Assert (d != v3, false, "#3");
1602 dynamic d3 = new MyType? (new MyType (-7));
1603 Assert (d3 != new MyType (6), true, "#3a");
1604 Assert (d3 != null, true, "#3b");
1608 Assert (d != v4, true, "#4");
1610 Assert (d != v4, true, "#4a");
1613 Assert (d != true, false, "#5");
1614 Assert (d != null, true, "#5a");
1615 Assert (d != false, true, "#5b");
1619 Assert (d != l, false, "#6a");
1620 Assert (l != d, false, "#6b");
1623 void NotEqualEnumTest ()
1625 dynamic d = MyEnum.Value_1;
1627 Assert (d != null, true, "#1");
1629 Assert (d != MyEnum.Value_1, false, "#2");
1630 Assert (d != 0, true, "#2a");
1632 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1633 Assert (d2 != MyEnumUlong.Value_2, false, "#3");
1634 Assert (d2 != null, true, "#3a");
1637 void NotEqualStringTest ()
1641 Assert (d != "te", true, "#1");
1642 Assert (d != "text", false, "#1a");
1643 Assert (d != null, true, "#1b");
1646 void OnesComplement ()
1649 Assert (-8, ~d, "#1");
1651 d = new MyType (-1);
1652 Assert (0, ~d, "#2");
1655 Assert (18446744073709551608, ~d, "#3");
1658 Assert ((MyEnum) 254, ~d, "#4");
1661 void OnesComplementNullable ()
1663 dynamic d = (int?) 7;
1664 Assert (-8, ~d, "#1");
1666 d = (MyEnum?) MyEnum.Value_1;
1667 Assert ((MyEnum) 254, ~d, "#4");
1675 Assert (d | v, true, "#1");
1676 Assert (d | false, true, "#1a");
1680 Assert (d | v2, 62, "#2");
1681 Assert (d | 0, 42, "#2a");
1683 d = new MyType (42);
1684 MyType v3 = new MyType (30);
1685 Assert (d | v3, new MyType (62), "#3");
1686 dynamic d3 = new MyType (-7);
1687 Assert<MyType> (d3 | new MyType (6), new MyType (-1), "#3a");
1689 d3 = new MyTypeImplicitOnly (-7);
1690 Assert (d3 | 11, -5, "#3b");
1695 dynamic d = MyEnum.Value_1;
1697 Assert<MyEnum?> (d | null, null, "#1");
1699 Assert (d | d, MyEnum.Value_1, "#2");
1701 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1702 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
1705 void OrTestNullable ()
1710 Assert<int?> (d | v2, null, "#1");
1711 Assert<int?> (d | null, null, "#1a");
1712 Assert<int?> (null | d, null, "#1b");
1715 Assert (d | v2, -1, "#2");
1716 dynamic d2 = (int?) -2;
1717 Assert (d2 | 1, -1, "#2a");
1719 d = new MyType (-2);
1720 MyType? v3 = new MyType (30);
1721 Assert (d | v3, new MyType (-2), "#3");
1722 dynamic d3 = new MyType? (new MyType (-7));
1723 Assert (d3 | new MyType (6), new MyType (-1), "#3a");
1726 void OrAssignedTest ()
1732 Assert (d, true, "#1");
1735 Assert (d, true, "#1a");
1740 Assert (d, 62, "#2");
1742 MyType v3 = new MyType (30);
1743 dynamic d3 = new MyType (-7);
1744 d3 |= new MyType (6);
1745 Assert<MyType> (d3, new MyType (-1), "#3");
1748 void OrAssignedTestEnum ()
1750 dynamic d = MyEnum.Value_1;
1751 d |= MyEnum.Value_2;
1752 Assert<MyEnum> (d, (MyEnum) 3, "#1");
1756 Assert (d, MyEnum.Value_2, "#2");
1758 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1759 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
1767 Assert<bool> (d || v, true, "#1");
1769 Assert (d || true, true, "#1a");
1772 Assert (d || d, true, "#2");
1774 dynamic d3 = new MyType (-7);
1775 Assert<MyType> (d3 || new MyType (6), new MyType (-7), "#3");
1778 void RightShiftTest ()
1780 dynamic d = (ulong) 0x7F000;
1783 Assert<ulong> (d >> v, 0x1FC00, "#1");
1784 Assert<ulong> (d >> 1, 0x3F800, "#1a");
1786 Assert<ulong> (d >> s, 0x1FC00, "#1b");
1789 MyTypeImplicitOnly v3 = new MyTypeImplicitOnly (3);
1790 Assert (d >> v3, 0xFE00, "#3");
1791 dynamic d3 = new MyType (-7);
1792 Assert (d3 >> new MyTypeImplicitOnly (11), -1, "#3a");
1795 void RightShiftNullableTest ()
1800 Assert<int?> (d >> v2, null, "#1");
1802 Assert<int?> (d >> null, null, "#1a");
1804 Assert<int?> (null >> d, null, "#1b");
1807 Assert (d >> v2, 0, "#2");
1808 dynamic d2 = (int?) -200;
1809 Assert (d2 >> 1, -100, "#2a");
1811 dynamic d3 = (int?) null;
1812 Assert (d3 >> (null >> null), (int?) null, "#3");
1815 void RightShiftAssignTest ()
1817 dynamic d = 0x7F000;
1821 Assert (d, 0x1FC00, "#1");
1823 Assert (d, 0xFE00, "#1a");
1826 Assert (d, 0x3F80, "#1b");
1829 void RightShiftAssignNullableTest ()
1835 Assert (d, 0, "#2");
1836 dynamic d2 = (int?) -2;
1838 Assert (d2, -1, "#2a");
1841 void SubtractTest ()
1846 Assert (d - v, 3, "#1");
1848 Assert (d - v2, 4.5, "#1a");
1851 MyType v3 = new MyType (30);
1852 Assert (d - v3, new MyType (-25), "#3");
1853 dynamic d3 = new MyType (-7);
1854 Assert (d3 - new MyType (6), new MyType (-13), "#3a");
1856 d = new MyTypeImplicitOnly (5);
1858 Assert (d - v4, 1m, "#4");
1861 void SubtractNullableTest ()
1866 Assert<int?> (d - v2, null, "#1");
1867 Assert<int?> (d - null, null, "#1a");
1868 Assert<int?> (null - d, null, "#1b");
1871 Assert (d - v2, 7, "#2");
1872 dynamic d2 = (int?) -2;
1873 Assert (d2 - 1, -3, "#2a");
1876 MyType? v3 = new MyType (30);
1877 Assert (d - v3, new MyType (-25), "#3");
1878 dynamic d3 = new MyType? (new MyType (-7));
1879 Assert (d3 - new MyType (6), new MyType (-13), "#3a");
1880 Assert<MyType?> (d3 - null, null, "#3b");
1882 d = new MyTypeImplicitOnly (5);
1884 Assert (d - v4, 1m, "#4");
1886 Assert<decimal?> (d - v4, null, "#4a");
1889 void SubtractEnumTest ()
1891 dynamic d = MyEnum.Value_1;
1893 Assert<MyEnum> (d - 1, 0, "#1");
1895 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1896 Assert (d2 - (byte) 1, MyEnumUlong.Value_1, "#2");
1897 Assert<MyEnumUlong?> (d2 - null, null, "#2a");
1899 // CSC: Invalid System.InvalidOperationException
1900 Assert<MyEnum?> (d - null, null, "#3");
1903 void SubtractCheckedTest ()
1908 int v = int.MinValue;
1909 AssertChecked (() => d - v, 7, "#1");
1912 AssertChecked (() => d - v2, null, "#2");
1915 MyType v3 = new MyType (int.MinValue);
1916 Assert (d - v3, new MyType (-2147483643), "#3");
1920 void SubtractAssignTest ()
1926 Assert (d, 3, "#1");
1931 Assert (d, 4.5, "#1a");
1933 Assert (d, 2.5, "#1b");
1935 dynamic d3 = new MyType (-7);
1936 d3 -= new MyType (6);
1937 Assert<MyType> (d3, new MyType (-13), "#3");
1942 Assert (d, 1m, "#4");
1945 void SubtractAssignEnumTest ()
1947 dynamic d = MyEnum.Value_1;
1950 Assert<MyEnum> (d, 0, "#2");
1952 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1954 Assert (d2, MyEnumUlong.Value_1, "#3");
1957 void SubtractAssignCheckedTest ()
1962 int v = int.MinValue;
1963 AssertChecked (() => { d -= v; Assert (d, 0, "#1a"); }, "#1");
1966 MyType v3 = new MyType (int.MinValue);
1968 Assert (d, new MyType (-2147483643), "#3a");
1972 void SubtractAssignEvent ()
1974 Action print = () => { Console.WriteLine ("foo"); };
1977 // FIXME: Will have to special case events
1982 void UnaryDecrement ()
1985 Assert (3, d--, "#1");
1986 Assert (2, d, "#1a");
1989 Assert (2, --d, "#2");
1990 Assert (2, d, "#2a");
1992 d = new MyType (-3);
1993 Assert (new MyType (-3), d--, "#3");
1994 Assert (new MyType (-1), d, "#3a");
1997 void UnaryDecrementCheckedTest ()
2000 dynamic d = int.MinValue;
2002 AssertChecked (() => { d--; Assert (d, -1073741824, "#1a"); }, "#1");
2004 d = new MyType (int.MinValue);
2006 Assert (d, new MyType (-1073741824), "#2");
2010 void UnaryIncrement ()
2013 Assert (3, d++, "#1");
2014 Assert (4, d, "#1a");
2017 Assert (4, ++d, "#2");
2018 Assert (4, d, "#2a");
2020 d = new MyType (-3);
2021 Assert (new MyType (-3), d++, "#3");
2022 Assert (new MyType (-6), d, "#3a");
2025 void UnaryIncrementCheckedTest ()
2028 dynamic d = int.MaxValue;
2030 AssertChecked (() => { d++; Assert (d, 0, "#1a"); }, "#1");
2032 d = new MyType (int.MaxValue);
2034 Assert (d, new MyType (-2), "#2");
2038 //void UnaryIsFalse ()
2040 // dynamic d = this;
2041 // object r = d == null;
2042 // Assert (false, (bool) r, "#1");
2043 // Assert<object> (true, d != null, "#1a");
2049 Assert (3, d ? 3 : 5, "#1");
2052 Assert (false, d < 1, "#2");
2054 d = new InverseLogicalOperator (true);
2055 Assert (1, d ? 1 : -1, "#3");
2061 Assert (-8, +d, "#1");
2062 Assert (-8, +(+d), "#1a");
2064 d = new MyType (14);
2065 Assert (new MyType (334455), +d, "#2");
2067 d = new MyTypeImplicitOnly (4);
2068 Assert (4, +d, "#3");
2071 Assert<uint> (7, +d, "#4");
2074 void UnaryPlusNullable ()
2076 dynamic d = (int?) -8;
2077 Assert (-8, +d, "#1");
2078 Assert (-8, +(+d), "#1a");
2080 MyType? n1 = new MyType (4);
2082 Assert (new MyType (334455), +d, "#2");
2084 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
2086 Assert (4, +d, "#3");
2089 Assert (7, +d, "#4");
2092 #pragma warning restore 169
2094 static bool RunTest (MethodInfo test)
2096 Console.Write ("Running test {0, -25}", test.Name);
2098 test.Invoke (new Tester (), null);
2099 Console.WriteLine ("OK");
2101 } catch (Exception e) {
2102 Console.WriteLine ("FAILED");
2103 Console.WriteLine (e.ToString ());
2108 public static int Main ()
2110 var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
2111 where test.GetParameters ().Length == 0
2113 select RunTest (test);
2115 int failures = tests.Count (a => !a);
2116 Console.WriteLine (failures + " tests failed");