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 delegate int IntDelegate ();
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 // CSC: Invalid System.InvalidOperationException
309 Assert (d + null, null, "#1");
311 Assert (d + 1, MyEnum.Value_2, "#2");
313 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
314 Assert (d2 + (byte) 1, MyEnumUlong.Value_2, "#3");
315 Assert<MyEnumUlong?> (d2 + (object) null, null, "#3a");
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");
464 void AddAssignmentEvent ()
474 Assert (d & v, false, "#1");
475 Assert (d & true, true, "#1a");
479 Assert (d & v2, 42, "#2");
480 Assert (d & 0, 0, "#2a");
483 MyType v3 = new MyType (30);
484 Assert (d & v3, new MyType (10), "#3");
485 dynamic d3 = new MyType (-7);
486 Assert<MyType> (d3 & new MyType (6), new MyType (0), "#3a");
488 d3 = new MyTypeImplicitOnly (6);
489 Assert (d3 & 11, 2, "#3b");
494 dynamic d = MyEnum.Value_1;
496 Assert<MyEnum?> (d & null, null, "#1");
498 Assert (d & d, MyEnum.Value_1, "#2");
500 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
501 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
504 void AndTestNullable ()
509 Assert<int?> (d & v2, null, "#1");
510 Assert<int?> (d & null, null, "#1a");
511 Assert<int?> (null & d, null, "#1b");
514 Assert (d & v2, 4, "#2");
515 dynamic d2 = (int?) -2;
516 Assert (d2 & 1, 0, "#2a");
519 MyType? v3 = new MyType (30);
520 Assert (d & v3, new MyType (22), "#3");
521 dynamic d3 = new MyType? (new MyType (-7));
522 Assert (d3 & new MyType (6), new MyType (0), "#3a");
523 Assert<MyType?> (d3 + null, null, "#3b");
526 void AndAssignedTest ()
532 Assert (d, false, "#1");
535 Assert (d, true, "#1a");
540 Assert (d, 42, "#2");
542 MyType v3 = new MyType (30);
543 dynamic d3 = new MyType (-7);
544 d3 &= new MyType (6);
545 Assert<MyType> (d3, new MyType (0), "#3");
548 void AndAssignedTestEnum ()
550 dynamic d = MyEnum.Value_1;
552 Assert<MyEnum>(d, 0, "#1");
556 Assert (d, MyEnum.Value_2, "#2");
558 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
559 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
567 Assert<bool> (d && v, false, "#1");
569 Assert (d && true, true, "#1a");
572 Assert (d && d, true, "#2");
574 dynamic d3 = new MyType (-7);
575 Assert<MyType> (d3 && new MyType (6), new MyType (0), "#3");
583 Assert (d / v, 2, "#1");
586 MyType v3 = new MyType (30);
587 Assert (d / v3, new MyType (0), "#3");
588 dynamic d3 = new MyType (-7);
589 Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
591 d = new MyTypeImplicitOnly (6);
593 Assert (d / v4, 1.5m, "#4");
596 void DivideNullableTest ()
601 Assert<double?> (d / v2, null, "#1");
602 Assert<double?> (d / null, null, "#1a");
603 Assert<double?> (null / d, null, "#1b");
606 Assert (d / v2, -2.5, "#2");
607 dynamic d2 = (int?) -2;
608 Assert (d2 / 1, -2, "#2a");
611 MyType? v3 = new MyType (30);
612 Assert (d / v3, new MyType (0), "#3");
613 dynamic d3 = new MyType? (new MyType (-7));
614 Assert (d3 / new MyType (6), new MyType (-1), "#3a");
615 Assert<MyType?> (d3 + null, null, "#3b");
617 d = new MyTypeImplicitOnly (5);
619 Assert (d / v4, 1.25m, "#4");
621 Assert<decimal?> (d / v4, null, "#4a");
624 void DivideCheckedTest ()
631 void DivideAssignTest ()
642 Assert (d, 10, "#1a");
644 Assert (d, 5, "#1b");
646 dynamic d3 = new MyType (-7);
647 d3 /= new MyType (6);
648 Assert<MyType> (d3, new MyType (-1), "#3");
653 Assert (d, 1.25m, "#4");
656 void DivideAssignCheckedTest ()
663 void ConvertImplicitTest ()
667 Assert (3m, v1, "#1");
669 d = new MyTypeImplicitOnly (5);
671 Assert (5, v2, "#2");
675 Assert (4, v3, "#3");
677 int[] v4 = new int[] { d };
678 Assert (4, v4[0], "#4");
681 var v5 = new [] { d, 1 };
682 Assert (true, v5[0], "#5");
683 Assert (1, v5[1], "#5a");
687 var r = b ? d : "ss";
688 Assert ("ss", r, "#6");
691 int ConvertImplicitReturnTest ()
693 dynamic d = (byte) 3;
697 IEnumerable<string> ConvertImplicitReturnTest_2 ()
703 void ConvertExplicitTest ()
706 Assert (44, (byte) d, "#1");
707 Assert<byte?> (44, (byte?) d, "#1a");
712 d = new MyTypeImplicitOnly (5);
713 Assert (5, (int) d, "#3");
715 d = new MyTypeExplicit (-2);
716 Assert (-2, (int) d, "#4");
719 Assert (null, (object) d, "#5");
722 void ConvertExplicitCheckedTest ()
726 AssertChecked (() => (byte) d, 7, "#1");
729 AssertChecked<uint?> (() => (uint?) d, 2, "#2");
735 dynamic idx = (uint) 1;
736 var arr = new int [5];
738 Assert (2, arr [idx], "#1");
746 Assert (d == v, false, "#1");
748 Assert (d == v2, true, "#1a");
751 Assert (d == false, false, "#2");
753 Assert (d == b2, true, "#2a");
756 MyType v3 = new MyType (30);
757 Assert (d == v3, true, "#3");
758 dynamic d3 = new MyTypeImplicitOnly (-7);
759 Assert (d3 == 11, false, "#3b");
763 Assert (d == v4, false, "#4");
764 Assert (d == 2m, true, "#4a");
767 Assert (d == null, true, "#5");
770 void EqualNullableTest ()
775 Assert (d == v2, false, "#1");
776 Assert (d == null, false, "#1a");
777 Assert (null == d, false, "#1b");
780 Assert (d == v2, false, "#2");
781 dynamic d2 = (int?) -2;
782 Assert (d2 == 1, false, "#2a");
784 Assert (d2 == 44, true, "#2b");
787 MyType? v3 = new MyType (30);
788 Assert (d == v3, true, "#3");
789 dynamic d3 = new MyType? (new MyType (-7));
790 Assert (d3 == new MyType (6), false, "#3a");
791 Assert (d3 == null, false, "#3b");
795 Assert (d == v4, false, "#4");
797 Assert (d == v4, false, "#4a");
800 Assert (d == true, true, "#5");
801 Assert (d == null, false, "#5a");
802 Assert (d == false, false, "#5b");
805 void EqualEnumTest ()
807 dynamic d = MyEnum.Value_1;
809 Assert (d == null, false, "#1");
811 Assert (d == MyEnum.Value_1, true, "#2");
812 Assert (d == 0, false, "#2a");
814 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
815 Assert (d2 == MyEnumUlong.Value_2, true, "#3");
816 Assert (d2 == null, false, "#3a");
819 void EqualStringTest ()
823 Assert (d == "te", false, "#1");
824 Assert (d == "text", true, "#1a");
825 Assert (d == null, false, "#1b");
828 void EqualDelegateTest ()
832 // Assert (d == delegate { }, true, "#1");
834 EmptyDelegate b = EqualDelegateTest;
837 //Assert (d == EqualDelegateTest, true, "#2");
841 void EqualTestDelegate_2 ()
843 EmptyDelegate ed = delegate () {};
845 Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
846 AssertNodeType (e2, ExpressionType.Equal);
847 Assert (false, e2.Compile ().Invoke (delegate () {}, null));
848 Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
849 Assert (false, e2.Compile ().Invoke (ed, delegate {}));
850 Assert (true, e2.Compile ().Invoke (ed, ed));
854 void ExclusiveOrTest ()
859 Assert (d ^ v, true, "#1");
860 Assert (d ^ true, false, "#1a");
864 Assert (d ^ v2, 20, "#2");
865 Assert (d ^ 0, 42, "#2a");
868 MyType v3 = new MyType (30);
869 Assert (d ^ v3, new MyType (52), "#3");
870 dynamic d3 = new MyType (-7);
871 Assert<MyType> (d3 ^ new MyType (6), new MyType (-1), "#3a");
873 d3 = new MyTypeImplicitOnly (-7);
874 Assert (d3 ^ 11, -14, "#3b");
877 void ExclusiveOrNullableTest ()
882 Assert<int?> (d ^ v2, null, "#1");
883 Assert<int?> (d ^ null, null, "#1a");
884 Assert<int?> (null ^ d, null, "#1b");
887 Assert (d ^ v2, -5, "#2");
888 dynamic d2 = (int?) -2;
889 Assert (d2 ^ 1, -1, "#2a");
892 MyType? v3 = new MyType (30);
893 Assert (d ^ v3, new MyType (27), "#3");
894 dynamic d3 = new MyType? (new MyType (-7));
895 Assert (d3 ^ new MyType (6), new MyType (-1), "#3a");
896 Assert<MyType?> (d3 ^ null, null, "#3b");
899 void ExclusiveOrTestEnum ()
901 dynamic d = MyEnum.Value_1;
903 Assert<MyEnum?> (d ^ null, null, "#1");
905 Assert<MyEnum> (d ^ d, 0, "#2");
907 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
908 Assert<MyEnumUlong> (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
911 void ExclusiveOrAssignedTest ()
917 Assert (d, true, "#1");
920 Assert (d, false, "#1a");
925 Assert (d, 20, "#2");
927 MyType v3 = new MyType (30);
928 dynamic d3 = new MyType (-7);
929 d3 ^= new MyType (6);
930 Assert (d3, new MyType (-1), "#3");
933 void ExclusiveOrAssignedTestEnum ()
935 dynamic d = MyEnum.Value_1;
937 Assert<MyEnum>(d, (MyEnum) 3, "#1");
941 Assert<MyEnum> (d, 0, "#2");
943 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
944 Assert (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
947 void GreaterThanTest ()
952 Assert (d > v, true, "#1");
954 Assert (d > v2, false, "#1a");
957 Assert (d > 4.59, true, "#2");
959 Assert (d > b2, false, "#2a");
962 MyType v3 = new MyType (30);
963 Assert (d > v3, false, "#3");
964 dynamic d3 = new MyType (-7);
965 Assert (d3 > new MyType (6), false, "#3a");
967 d3 = new MyTypeImplicitOnly (-7);
968 Assert (d3 > 11, false, "#3b");
972 Assert (d > v4, false, "#4");
973 Assert (d > 2m, false, "#4a");
976 void GreaterThanNullableTest ()
981 Assert (d > v2, false, "#1");
982 Assert (d > null, false, "#1a");
983 Assert (null > d, false, "#1b");
986 Assert (d > v2, true, "#2");
987 dynamic d2 = (int?) -2;
988 Assert (d2 > 1, false, "#2a");
990 Assert (d2 > 44, false, "#2b");
993 MyType? v3 = new MyType (30);
994 Assert (d > v3, false, "#3");
995 dynamic d3 = new MyType? (new MyType (-7));
996 Assert (d3 > new MyType (6), false, "#3a");
997 Assert (d3 > null, false, "#3b");
1001 Assert (d > v4, true, "#4");
1003 Assert (d > v4, false, "#4a");
1006 void GreaterThanEnumTest ()
1008 dynamic d = MyEnum.Value_1;
1010 Assert (d > null, false, "#1");
1012 Assert (d > MyEnum.Value_1, false, "#2");
1013 Assert (d > 0, true, "#2a");
1015 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1016 Assert (d2 > MyEnumUlong.Value_2, false, "#3");
1017 Assert (d2 > null, false, "#3a");
1020 void GreaterThanEqualTest ()
1025 Assert (d >= v, true, "#1");
1027 Assert (d >= v2, true, "#1a");
1030 Assert (d >= 4.59, true, "#2");
1032 Assert (d >= b2, true, "#2a");
1034 d = new MyType (30);
1035 MyType v3 = new MyType (30);
1036 Assert (d >= v3, true, "#3");
1037 dynamic d3 = new MyType (-7);
1038 Assert (d3 >= new MyType (6), false, "#3a");
1040 d3 = new MyTypeImplicitOnly (-7);
1041 Assert (d3 >= 11, false, "#3b");
1045 Assert (d >= v4, false, "#4");
1046 Assert (d >= 2m, true, "#4a");
1049 void GreaterThanEqualNullableTest ()
1054 Assert (d >= v2, false, "#1");
1055 Assert (d >= null, false, "#1a");
1056 Assert (null >= d, false, "#1b");
1059 Assert (d >= v2, true, "#2");
1060 dynamic d2 = (int?) -2;
1061 Assert (d2 >= 1, false, "#2a");
1063 Assert (d2 >= 44, true, "#2b");
1065 d = new MyType (30);
1066 MyType? v3 = new MyType (30);
1067 Assert (d >= v3, true, "#3");
1068 dynamic d3 = new MyType? (new MyType (-7));
1069 Assert (d3 >= new MyType (6), false, "#3a");
1070 Assert (d3 >= null, false, "#3b");
1074 Assert (d >= v4, true, "#4");
1076 Assert (d >= v4, false, "#4a");
1079 void GreaterThanEqualEnumTest ()
1081 dynamic d = MyEnum.Value_1;
1083 Assert (d >= null, false, "#1");
1085 Assert (d >= MyEnum.Value_1, true, "#2");
1086 Assert (d >= 0, true, "#2a");
1088 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1089 Assert (d2 >= MyEnumUlong.Value_2, true, "#3");
1090 Assert (d2 >= null, false, "#3a");
1093 void LeftShiftTest ()
1095 dynamic d = (ulong) 0x7F000;
1098 Assert<ulong> (d << v, 0x1FC000, "#1");
1099 Assert<ulong> (d << 1, 0xFE000, "#1a");
1101 Assert<ulong> (d << s, 0x1FC000, "#1b");
1104 MyTypeImplicitOnly v3 = new MyTypeImplicitOnly (3);
1105 Assert (d << v3, 0x3F8000, "#3");
1106 dynamic d3 = new MyType (-7);
1107 Assert (d3 << new MyTypeImplicitOnly (6), -448, "#3a");
1108 Assert (d3 << 11, -14336, "#3b");
1111 void LeftShiftNullableTest ()
1116 Assert<int?> (d << v2, null, "#1");
1118 Assert<int?> (d << null, null, "#1a");
1120 Assert<int?> (null << d, null, "#1b");
1123 Assert (d << v2, 0x40000000, "#2");
1124 dynamic d2 = (int?) -2;
1125 Assert (d2 << 1, -4, "#2a");
1128 void LeftShiftAssignTest ()
1130 dynamic d = 0x7F000;
1134 Assert (d, 0x1FC000, "#1");
1136 Assert (d, 0x3F8000, "#1a");
1139 Assert (d, 0xFE0000, "#1b");
1142 void LeftShiftAssignNullableTest ()
1148 Assert (d, 0x40000000, "#2");
1149 dynamic d2 = (int?) -2;
1151 Assert (d2, -4, "#2a");
1154 void LessThanTest ()
1159 Assert (d < v, false, "#1");
1161 Assert (d < v2, false, "#1a");
1164 Assert (d < 4.59, false, "#2");
1166 Assert (d < b2, false, "#2a");
1168 d = new MyType (30);
1169 MyType v3 = new MyType (30);
1170 Assert (d < v3, false, "#3");
1171 dynamic d3 = new MyType (-7);
1172 Assert (d3 < new MyType (6), true, "#3a");
1174 d3 = new MyTypeImplicitOnly (-7);
1175 Assert (d3 < 11, true, "#3b");
1179 Assert (d < v4, true, "#4");
1180 Assert (d < 2m, false, "#4a");
1183 void LessThanNullableTest ()
1188 Assert (d < v2, false, "#1");
1189 Assert (d < null, false, "#1a");
1190 Assert (null < d, false, "#1b");
1193 Assert (d < v2, false, "#2");
1194 dynamic d2 = (int?) -2;
1195 Assert (d2 < 1, true, "#2a");
1197 Assert (d2 < 44, false, "#2b");
1199 d = new MyType (30);
1200 MyType? v3 = new MyType (30);
1201 Assert (d < v3, false, "#3");
1202 dynamic d3 = new MyType? (new MyType (-7));
1203 Assert (d3 < new MyType (6), true, "#3a");
1205 d3 = new MyTypeImplicitOnly (-7);
1206 Assert (d3 < null, false, "#3b");
1210 Assert (d < v4, false, "#4");
1212 Assert (d < v4, false, "#4a");
1215 void LessThanEnumTest ()
1217 dynamic d = MyEnum.Value_1;
1219 Assert (d < null, false, "#1");
1221 Assert (d < MyEnum.Value_1, false, "#2");
1222 Assert (d < 0, false, "#2a");
1224 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1225 Assert (d2 < MyEnumUlong.Value_2, false, "#3");
1226 Assert (d2 < null, false, "#3a");
1229 void LessThanOrEqualTest ()
1234 Assert (d <= v, false, "#1");
1236 Assert (d <= v2, true, "#1a");
1239 Assert (d <= 4.59, false, "#2");
1241 Assert (d <= b2, true, "#2a");
1243 d = new MyType (30);
1244 MyType v3 = new MyType (30);
1245 Assert (d <= v3, true, "#3");
1246 dynamic d3 = new MyType (-7);
1247 Assert (d3 <= new MyType (6), true, "#3a");
1249 d3 = new MyTypeImplicitOnly (-7);
1250 Assert (d3 <= 11, true, "#3b");
1254 Assert (d <= v4, true, "#4");
1255 Assert (d <= 2m, true, "#4a");
1258 void LessThanOrEqualNullableTest ()
1263 Assert (d <= v2, false, "#1");
1264 Assert (d <= null, false, "#1a");
1265 Assert (null <= d, false, "#1b");
1268 Assert (d <= v2, false, "#2");
1269 dynamic d2 = (int?) -2;
1270 Assert (d2 <= 1, true, "#2a");
1272 Assert (d2 <= 44, true, "#2b");
1274 d = new MyType (30);
1275 MyType? v3 = new MyType (30);
1276 Assert (d <= v3, true, "#3");
1277 dynamic d3 = new MyType? (new MyType (-7));
1278 Assert (d3 <= new MyType (6), true, "#3a");
1279 Assert (d3 <= null, false, "#3b");
1283 Assert (d <= v4, false, "#4");
1285 Assert (d <= v4, false, "#4a");
1288 void LessThanOrEqualEnumTest ()
1290 dynamic d = MyEnum.Value_1;
1292 Assert (d <= null, false, "#1");
1294 Assert (d <= MyEnum.Value_1, true, "#2");
1295 Assert (d <= 0, false, "#2a");
1297 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1298 Assert (d2 <= MyEnumUlong.Value_2, true, "#3");
1299 Assert (d2 <= null, false, "#3a");
1307 Assert (d % v, 1, "#1");
1310 MyType v3 = new MyType (30);
1311 Assert (d % v3, new MyType (5), "#3");
1312 dynamic d3 = new MyType (-7);
1313 Assert<MyType> (d3 % new MyType (6), new MyType (-1), "#3a");
1315 d = new MyTypeImplicitOnly (5);
1317 Assert (d % v4, 1m, "#4");
1320 void ModuloNullableTest ()
1325 Assert<double?> (d % v2, null, "#1");
1326 Assert<double?> (d % null, null, "#1a");
1327 Assert<double?> (null % d, null, "#1b");
1330 Assert (d % v2, 1, "#2");
1331 dynamic d2 = (int?) -2;
1332 Assert (d2 % 1, 0, "#2a");
1334 d = new MyType (-2);
1335 MyType? v3 = new MyType (30);
1336 Assert (d % v3, new MyType (-2), "#3");
1337 dynamic d3 = new MyType? (new MyType (-7));
1338 Assert (d3 % new MyType (6), new MyType (-1), "#3a");
1339 Assert<MyType?> (d3 + null, null, "#3b");
1341 d = new MyTypeImplicitOnly (5);
1343 Assert (d % v4, 1m, "#4");
1345 Assert<decimal?> (d % v4, null, "#4a");
1348 void ModuloAssignTest ()
1354 Assert (d, 1, "#1");
1359 Assert (d, 0, "#1a");
1361 Assert (d, 0, "#1b");
1363 dynamic d3 = new MyType (-7);
1364 d3 %= new MyType (6);
1365 Assert<MyType> (d3, new MyType (-1), "#3");
1370 Assert (d, 1m, "#4");
1373 void MultiplyTest ()
1378 Assert (d * v, 10, "#1");
1380 Assert (d * v2, 2.5, "#1a");
1383 MyType v3 = new MyType (30);
1384 Assert (d * v3, new MyType (150), "#3");
1385 dynamic d3 = new MyType (-7);
1386 Assert<MyType> (d3 * new MyType (6), new MyType (-42), "#3a");
1390 Assert (d * v4, 31.6m, "#4");
1393 void MultiplyNullableTest ()
1398 Assert<int?> (d * v2, null, "#1");
1399 Assert<int?> (d * null, null, "#1a");
1400 Assert<int?> (null * d, null, "#1b");
1403 Assert (d * v2, -10, "#2");
1404 dynamic d2 = (int?) -2;
1405 Assert (d2 * 1, -2, "#2a");
1408 MyType? v3 = new MyType (30);
1409 Assert (d * v3, new MyType (150), "#3");
1410 dynamic d3 = new MyType? (new MyType (-7));
1411 Assert (d3 * new MyType (6), new MyType (-42), "#3a");
1412 Assert<MyType?> (d3 * null, null, "#3b");
1414 d = new MyTypeImplicitOnly (5);
1416 Assert (d * v4, 20m, "#4");
1418 Assert<decimal?> (d * v4, null, "#4a");
1421 void MultiplyCheckedTest ()
1426 int v = int.MaxValue;
1427 AssertChecked (() => d * v, 7, "#1");
1430 AssertChecked (() => d * v2, null, "#2");
1433 MyType v3 = new MyType (int.MaxValue);
1434 Assert (d * v3, new MyType (-4), "#3");
1438 void MultiplyAssignTest ()
1444 Assert (d, 10, "#1");
1449 Assert (d, 2.5, "#1a");
1451 Assert (d, 5, "#1b");
1453 dynamic d3 = new MyType (-7);
1454 d3 *= new MyType (6);
1455 Assert<MyType> (d3, new MyType (-42), "#3");
1460 Assert (d, 20m, "#4");
1463 void MultiplyAssignCheckedTest ()
1468 int v = int.MaxValue;
1469 AssertChecked (() => { d *= v; Assert (d, 0, "#1-"); }, "#1");
1471 d = new MyType (44);
1472 MyType v3 = new MyType (int.MaxValue);
1474 Assert (d, new MyType (-44), "#3-");
1481 Assert (8, -d, "#1");
1482 Assert (-8, -(-d), "#1a");
1484 d = new MyType (-14);
1485 Assert (new MyType (14), -d, "#2");
1487 d = new MyTypeImplicitOnly (4);
1488 Assert (-4, -d, "#3");
1491 Assert (-7, -d, "#4");
1493 d = double.NegativeInfinity;
1494 Assert (double.PositiveInfinity, -d, "#5");
1497 void NegateNullable ()
1499 dynamic d = (int?) -8;
1500 Assert (8, -d, "#1");
1501 Assert (-8, -(-d), "#1a");
1503 MyType? n1 = new MyType (4);
1505 Assert (new MyType (-4), -d, "#2");
1507 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
1509 Assert (-4, -d, "#3");
1512 Assert (-7, -d, "#4");
1515 void NegateChecked ()
1518 dynamic d = int.MinValue;
1519 AssertChecked (() => -d, 0, "#1");
1526 Assert (false, !d, "#1");
1528 var de = new MyType (-1);
1529 Assert (false, !d, "#2");
1532 void NotEqualTest ()
1537 Assert (d != v, true, "#1");
1539 Assert (d != v2, false, "#1a");
1542 Assert (d != false, true, "#2");
1544 Assert (d != b2, false, "#2a");
1546 d = new MyType (30);
1547 MyType v3 = new MyType (30);
1548 Assert (d != v3, false, "#3");
1549 dynamic d3 = new MyType (-7);
1550 Assert (d3 != new MyType (6), true, "#3a");
1554 Assert (d != v4, true, "#4");
1555 Assert (d != 2m, false, "#4a");
1558 Assert (d != null, false, "#5");
1561 void NotEqualNullableTest ()
1566 Assert (d != v2, true, "#1");
1567 Assert (d != null, true, "#1a");
1568 Assert (null != d, true, "#1b");
1571 Assert (d != v2, true, "#2");
1572 dynamic d2 = (int?) -2;
1573 Assert (d2 != 1, true, "#2a");
1575 Assert (d2 != 44, false, "#2b");
1577 d = new MyType (30);
1578 MyType? v3 = new MyType (30);
1579 Assert (d != v3, false, "#3");
1580 dynamic d3 = new MyType? (new MyType (-7));
1581 Assert (d3 != new MyType (6), true, "#3a");
1582 Assert (d3 != null, true, "#3b");
1586 Assert (d != v4, true, "#4");
1588 Assert (d != v4, true, "#4a");
1591 Assert (d != true, false, "#5");
1592 Assert (d != null, true, "#5a");
1593 Assert (d != false, true, "#5b");
1596 void NotEqualEnumTest ()
1598 dynamic d = MyEnum.Value_1;
1600 Assert (d != null, true, "#1");
1602 Assert (d != MyEnum.Value_1, false, "#2");
1603 Assert (d != 0, true, "#2a");
1605 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1606 Assert (d2 != MyEnumUlong.Value_2, false, "#3");
1607 Assert (d2 != null, true, "#3a");
1610 void NotEqualStringTest ()
1614 Assert (d != "te", true, "#1");
1615 Assert (d != "text", false, "#1a");
1616 Assert (d != null, true, "#1b");
1619 void OnesComplement ()
1622 Assert (-8, ~d, "#1");
1624 d = new MyType (-1);
1625 Assert (0, ~d, "#2");
1628 Assert (18446744073709551608, ~d, "#3");
1631 Assert ((MyEnum) 254, ~d, "#4");
1634 void OnesComplementNullable ()
1636 dynamic d = (int?) 7;
1637 Assert (-8, ~d, "#1");
1639 d = (MyEnum?) MyEnum.Value_1;
1640 Assert ((MyEnum) 254, ~d, "#4");
1648 Assert (d | v, true, "#1");
1649 Assert (d | false, true, "#1a");
1653 Assert (d | v2, 62, "#2");
1654 Assert (d | 0, 42, "#2a");
1656 d = new MyType (42);
1657 MyType v3 = new MyType (30);
1658 Assert (d | v3, new MyType (62), "#3");
1659 dynamic d3 = new MyType (-7);
1660 Assert<MyType> (d3 | new MyType (6), new MyType (-1), "#3a");
1662 d3 = new MyTypeImplicitOnly (-7);
1663 Assert (d3 | 11, -5, "#3b");
1668 dynamic d = MyEnum.Value_1;
1670 Assert<MyEnum?> (d | null, null, "#1");
1672 Assert (d | d, MyEnum.Value_1, "#2");
1674 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1675 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
1678 void OrTestNullable ()
1683 Assert<int?> (d | v2, null, "#1");
1684 Assert<int?> (d | null, null, "#1a");
1685 Assert<int?> (null | d, null, "#1b");
1688 Assert (d | v2, -1, "#2");
1689 dynamic d2 = (int?) -2;
1690 Assert (d2 | 1, -1, "#2a");
1692 d = new MyType (-2);
1693 MyType? v3 = new MyType (30);
1694 Assert (d | v3, new MyType (-2), "#3");
1695 dynamic d3 = new MyType? (new MyType (-7));
1696 Assert (d3 | new MyType (6), new MyType (-1), "#3a");
1699 void OrAssignedTest ()
1705 Assert (d, true, "#1");
1708 Assert (d, true, "#1a");
1713 Assert (d, 62, "#2");
1715 MyType v3 = new MyType (30);
1716 dynamic d3 = new MyType (-7);
1717 d3 |= new MyType (6);
1718 Assert<MyType> (d3, new MyType (-1), "#3");
1721 void OrAssignedTestEnum ()
1723 dynamic d = MyEnum.Value_1;
1724 d |= MyEnum.Value_2;
1725 Assert<MyEnum> (d, (MyEnum) 3, "#1");
1729 Assert (d, MyEnum.Value_2, "#2");
1731 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1732 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
1740 Assert<bool> (d || v, true, "#1");
1742 Assert (d || true, true, "#1a");
1745 Assert (d || d, true, "#2");
1747 dynamic d3 = new MyType (-7);
1748 Assert<MyType> (d3 || new MyType (6), new MyType (-1), "#3");
1751 void RightShiftTest ()
1753 dynamic d = (ulong) 0x7F000;
1756 Assert<ulong> (d >> v, 0x1FC00, "#1");
1757 Assert<ulong> (d >> 1, 0x3F800, "#1a");
1759 Assert<ulong> (d >> s, 0x1FC00, "#1b");
1762 MyTypeImplicitOnly v3 = new MyTypeImplicitOnly (3);
1763 Assert (d >> v3, 0xFE00, "#3");
1764 dynamic d3 = new MyType (-7);
1765 Assert (d3 >> new MyTypeImplicitOnly (11), -1, "#3a");
1768 void RightShiftNullableTest ()
1773 Assert<int?> (d >> v2, null, "#1");
1775 Assert<int?> (d >> null, null, "#1a");
1777 Assert<int?> (null >> d, null, "#1b");
1780 Assert (d >> v2, 0, "#2");
1781 dynamic d2 = (int?) -200;
1782 Assert (d2 >> 1, -100, "#2a");
1785 void RightShiftAssignTest ()
1787 dynamic d = 0x7F000;
1791 Assert (d, 0x1FC00, "#1");
1793 Assert (d, 0xFE00, "#1a");
1796 Assert (d, 0x3F80, "#1b");
1799 void RightShiftAssignNullableTest ()
1805 Assert (d, 0, "#2");
1806 dynamic d2 = (int?) -2;
1808 Assert (d2, -1, "#2a");
1811 void SubtractTest ()
1816 Assert (d - v, 3, "#1");
1818 Assert (d - v2, 4.5, "#1a");
1821 MyType v3 = new MyType (30);
1822 Assert (d - v3, new MyType (-25), "#3");
1823 dynamic d3 = new MyType (-7);
1824 Assert (d3 - new MyType (6), new MyType (-13), "#3a");
1826 d = new MyTypeImplicitOnly (5);
1828 Assert (d - v4, 1m, "#4");
1831 void SubtractNullableTest ()
1836 Assert<int?> (d - v2, null, "#1");
1837 Assert<int?> (d - null, null, "#1a");
1838 Assert<int?> (null - d, null, "#1b");
1841 Assert (d - v2, 7, "#2");
1842 dynamic d2 = (int?) -2;
1843 Assert (d2 - 1, -3, "#2a");
1846 MyType? v3 = new MyType (30);
1847 Assert (d - v3, new MyType (-25), "#3");
1848 dynamic d3 = new MyType? (new MyType (-7));
1849 Assert (d3 - new MyType (6), new MyType (-13), "#3a");
1850 Assert<MyType?> (d3 - null, null, "#3b");
1852 d = new MyTypeImplicitOnly (5);
1854 Assert (d - v4, 1m, "#4");
1856 Assert<decimal?> (d - v4, null, "#4a");
1859 void SubtractEnumTest ()
1861 dynamic d = MyEnum.Value_1;
1863 // CSC: Invalid System.InvalidOperationException
1864 Assert (d - null, null, "#1");
1866 Assert (d - 1, MyEnum.Value_2, "#2");
1868 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1869 Assert (d2 - (byte) 1, MyEnumUlong.Value_2, "#3");
1870 Assert<MyEnumUlong?> (d2 - (object) null, null, "#3a");
1873 void SubtractCheckedTest ()
1878 int v = int.MinValue;
1879 AssertChecked (() => d - v, 7, "#1");
1882 AssertChecked (() => d - v2, null, "#2");
1885 MyType v3 = new MyType (int.MinValue);
1886 Assert (d - v3, new MyType (-2147483643), "#3");
1890 void SubtractAssignTest ()
1896 Assert (d, 3, "#1");
1901 Assert (d, 4.5, "#1a");
1903 Assert (d, 2.5, "#1b");
1905 dynamic d3 = new MyType (-7);
1906 d3 -= new MyType (6);
1907 Assert<MyType> (d3, new MyType (-13), "#3");
1912 Assert (d, 1m, "#4");
1915 void SubtractAssignEnumTest ()
1917 dynamic d = MyEnum.Value_1;
1920 Assert<MyEnum> (d, 0, "#2");
1922 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1924 Assert (d2, MyEnumUlong.Value_1, "#3");
1927 void SubtractAssignCheckedTest ()
1932 int v = int.MinValue;
1933 AssertChecked (() => { d -= v; Assert (d, 0, "#1a"); }, "#1");
1936 MyType v3 = new MyType (int.MinValue);
1938 Assert (d, new MyType (-2147483643), "#3a");
1943 void SubtractAssignmentEvent ()
1948 void UnaryDecrement ()
1951 Assert (3, d--, "#1");
1952 Assert (2, d, "#1a");
1955 Assert (2, --d, "#2");
1956 Assert (2, d, "#2a");
1958 d = new MyType (-3);
1959 Assert (new MyType (-3), d--, "#3");
1960 Assert (new MyType (-1), d, "#3a");
1963 void UnaryDecrementCheckedTest ()
1966 dynamic d = int.MinValue;
1968 AssertChecked (() => { d--; Assert (d, -1073741824, "#1a"); }, "#1");
1970 d = new MyType (int.MinValue);
1972 Assert (d, new MyType (-1073741824), "#2");
1976 void UnaryIncrement ()
1979 Assert (3, d++, "#1");
1980 Assert (4, d, "#1a");
1983 Assert (4, ++d, "#2");
1984 Assert (4, d, "#2a");
1986 d = new MyType (-3);
1987 Assert (new MyType (-3), d++, "#3");
1988 Assert (new MyType (-6), d, "#3a");
1991 void UnaryIncrementCheckedTest ()
1994 dynamic d = int.MaxValue;
1996 AssertChecked (() => { d++; Assert (d, 0, "#1a"); }, "#1");
1998 d = new MyType (int.MaxValue);
2000 Assert (d, new MyType (-2), "#2");
2004 //void UnaryIsFalse ()
2006 // dynamic d = this;
2007 // object r = d == null;
2008 // Assert (false, (bool) r, "#1");
2009 // Assert<object> (true, d != null, "#1a");
2015 Assert (3, d ? 3 : 5, "#1");
2018 Assert (false, d < 1, "#2");
2020 d = new InverseLogicalOperator (true);
2021 Assert (1, d ? 1 : -1, "#3");
2027 Assert (-8, +d, "#1");
2028 Assert (-8, +(+d), "#1a");
2030 d = new MyType (14);
2031 Assert (new MyType (334455), +d, "#2");
2033 d = new MyTypeImplicitOnly (4);
2034 Assert (4, +d, "#3");
2037 Assert<uint> (7, +d, "#4");
2040 void UnaryPlusNullable ()
2042 dynamic d = (int?) -8;
2043 Assert (-8, +d, "#1");
2044 Assert (-8, +(+d), "#1a");
2046 MyType? n1 = new MyType (4);
2048 Assert (new MyType (334455), +d, "#2");
2050 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
2052 Assert (4, +d, "#3");
2055 Assert (7, +d, "#4");
2058 #pragma warning restore 169
2060 static bool RunTest (MethodInfo test)
2062 Console.Write ("Running test {0, -25}", test.Name);
2064 test.Invoke (new Tester (), null);
2065 Console.WriteLine ("OK");
2067 } catch (Exception e) {
2068 Console.WriteLine ("FAILED");
2069 Console.WriteLine (e.ToString ());
2074 public static int Main ()
2076 var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
2077 where test.GetParameters ().Length == 0
2079 select RunTest (test);
2081 int failures = tests.Count (a => !a);
2082 Console.WriteLine (failures + " tests failed");