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");
528 void AndAssignedTest ()
534 Assert (d, false, "#1");
537 Assert (d, true, "#1a");
542 Assert (d, 42, "#2");
544 MyType v3 = new MyType (30);
545 dynamic d3 = new MyType (-7);
546 d3 &= new MyType (6);
547 Assert<MyType> (d3, new MyType (0), "#3");
550 void AndAssignedTestEnum ()
552 dynamic d = MyEnum.Value_1;
554 Assert<MyEnum>(d, 0, "#1");
558 Assert (d, MyEnum.Value_2, "#2");
560 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
561 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
569 Assert<bool> (d && v, false, "#1");
571 Assert (d && true, true, "#1a");
574 Assert (d && d, true, "#2");
576 dynamic d3 = new MyType (-7);
577 Assert<MyType> (d3 && new MyType (6), new MyType (0), "#3");
585 Assert (d / v, 2, "#1");
588 MyType v3 = new MyType (30);
589 Assert (d / v3, new MyType (0), "#3");
590 dynamic d3 = new MyType (-7);
591 Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
593 d = new MyTypeImplicitOnly (6);
595 Assert (d / v4, 1.5m, "#4");
598 void DivideNullableTest ()
603 Assert<double?> (d / v2, null, "#1");
604 Assert<double?> (d / null, null, "#1a");
605 Assert<double?> (null / d, null, "#1b");
608 Assert (d / v2, -2.5, "#2");
609 dynamic d2 = (int?) -2;
610 Assert (d2 / 1, -2, "#2a");
613 MyType? v3 = new MyType (30);
614 Assert (d / v3, new MyType (0), "#3");
615 dynamic d3 = new MyType? (new MyType (-7));
616 Assert (d3 / new MyType (6), new MyType (-1), "#3a");
617 Assert<MyType?> (d3 + null, null, "#3b");
619 d = new MyTypeImplicitOnly (5);
621 Assert (d / v4, 1.25m, "#4");
623 Assert<decimal?> (d / v4, null, "#4a");
626 void DivideCheckedTest ()
633 void DivideAssignTest ()
644 Assert (d, 10, "#1a");
646 Assert (d, 5, "#1b");
648 dynamic d3 = new MyType (-7);
649 d3 /= new MyType (6);
650 Assert<MyType> (d3, new MyType (-1), "#3");
655 Assert (d, 1.25m, "#4");
658 void DivideAssignCheckedTest ()
665 void ConvertImplicitTest ()
669 Assert (3m, v1, "#1");
671 d = new MyTypeImplicitOnly (5);
673 Assert (5, v2, "#2");
677 Assert (4, v3, "#3");
679 int[] v4 = new int[] { d };
680 Assert (4, v4[0], "#4");
683 var v5 = new [] { d, 1 };
684 Assert (true, v5[0], "#5");
685 Assert (1, v5[1], "#5a");
689 var r = b ? d : "ss";
690 Assert ("ss", r, "#6");
692 var v = new [] { d, 1 };
693 Assert ("aa", v [0], "#7");
695 dynamic [,] a = new dynamic [,] { { 1, 2 }, { 'b', 'x' } };
696 Assert (2, a [0, 1], "#8");
697 Assert ('x', a [1, 1], "#8a");
700 int ConvertImplicitReturnTest ()
702 dynamic d = (byte) 3;
706 IEnumerable<string> ConvertImplicitReturnTest_2 ()
712 void ConvertExplicitTest ()
715 Assert (44, (byte) d, "#1");
716 Assert<byte?> (44, (byte?) d, "#1a");
721 d = new MyTypeImplicitOnly (5);
722 Assert (5, (int) d, "#3");
724 d = new MyTypeExplicit (-2);
725 Assert (-2, (int) d, "#4");
728 Assert (null, (object) d, "#5");
731 void ConvertExplicitCheckedTest ()
735 AssertChecked (() => (byte) d, 7, "#1");
738 AssertChecked<uint?> (() => (uint?) d, 2, "#2");
744 dynamic idx = (uint) 1;
745 var arr = new int [5];
747 Assert (2, arr [idx], "#1");
755 Assert (d == v, false, "#1");
757 Assert (d == v2, true, "#1a");
760 Assert (d == false, false, "#2");
762 Assert (d == b2, true, "#2a");
765 MyType v3 = new MyType (30);
766 Assert (d == v3, true, "#3");
767 dynamic d3 = new MyTypeImplicitOnly (-7);
768 Assert (d3 == 11, false, "#3b");
772 Assert (d == v4, false, "#4");
773 Assert (d == 2m, true, "#4a");
776 Assert (d == null, true, "#5");
779 void EqualNullableTest ()
784 Assert (d == v2, false, "#1");
785 Assert (d == null, false, "#1a");
786 Assert (null == d, false, "#1b");
789 Assert (d == v2, false, "#2");
790 dynamic d2 = (int?) -2;
791 Assert (d2 == 1, false, "#2a");
793 Assert (d2 == 44, true, "#2b");
796 MyType? v3 = new MyType (30);
797 Assert (d == v3, true, "#3");
798 dynamic d3 = new MyType? (new MyType (-7));
799 Assert (d3 == new MyType (6), false, "#3a");
800 Assert (d3 == null, false, "#3b");
804 Assert (d == v4, false, "#4");
806 Assert (d == v4, false, "#4a");
809 Assert (d == true, true, "#5");
810 Assert (d == null, false, "#5a");
811 Assert (d == false, false, "#5b");
814 void EqualEnumTest ()
816 dynamic d = MyEnum.Value_1;
818 Assert (d == null, false, "#1");
820 Assert (d == MyEnum.Value_1, true, "#2");
821 Assert (d == 0, false, "#2a");
823 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
824 Assert (d2 == MyEnumUlong.Value_2, true, "#3");
825 Assert (d2 == null, false, "#3a");
828 void EqualStringTest ()
832 Assert (d == "te", false, "#1");
833 Assert (d == "text", true, "#1a");
834 Assert (d == null, false, "#1b");
837 void EqualDelegateTest ()
841 // Assert (d == delegate { }, true, "#1");
843 EmptyDelegate b = EqualDelegateTest;
846 //Assert (d == EqualDelegateTest, true, "#2");
850 void EqualTestDelegate_2 ()
852 EmptyDelegate ed = delegate () {};
854 Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
855 AssertNodeType (e2, ExpressionType.Equal);
856 Assert (false, e2.Compile ().Invoke (delegate () {}, null));
857 Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
858 Assert (false, e2.Compile ().Invoke (ed, delegate {}));
859 Assert (true, e2.Compile ().Invoke (ed, ed));
863 void ExclusiveOrTest ()
868 Assert (d ^ v, true, "#1");
869 Assert (d ^ true, false, "#1a");
873 Assert (d ^ v2, 20, "#2");
874 Assert (d ^ 0, 42, "#2a");
877 MyType v3 = new MyType (30);
878 Assert (d ^ v3, new MyType (52), "#3");
879 dynamic d3 = new MyType (-7);
880 Assert<MyType> (d3 ^ new MyType (6), new MyType (-1), "#3a");
882 d3 = new MyTypeImplicitOnly (-7);
883 Assert (d3 ^ 11, -14, "#3b");
886 void ExclusiveOrNullableTest ()
891 Assert<int?> (d ^ v2, null, "#1");
892 Assert<int?> (d ^ null, null, "#1a");
893 Assert<int?> (null ^ d, null, "#1b");
896 Assert (d ^ v2, -5, "#2");
897 dynamic d2 = (int?) -2;
898 Assert (d2 ^ 1, -1, "#2a");
901 MyType? v3 = new MyType (30);
902 Assert (d ^ v3, new MyType (27), "#3");
903 dynamic d3 = new MyType? (new MyType (-7));
904 Assert (d3 ^ new MyType (6), new MyType (-1), "#3a");
905 Assert<MyType?> (d3 ^ null, null, "#3b");
908 void ExclusiveOrTestEnum ()
910 dynamic d = MyEnum.Value_1;
912 Assert<MyEnum?> (d ^ null, null, "#1");
914 Assert<MyEnum> (d ^ d, 0, "#2");
916 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
917 Assert<MyEnumUlong> (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
920 void ExclusiveOrAssignedTest ()
926 Assert (d, true, "#1");
929 Assert (d, false, "#1a");
934 Assert (d, 20, "#2");
936 MyType v3 = new MyType (30);
937 dynamic d3 = new MyType (-7);
938 d3 ^= new MyType (6);
939 Assert (d3, new MyType (-1), "#3");
942 void ExclusiveOrAssignedTestEnum ()
944 dynamic d = MyEnum.Value_1;
946 Assert<MyEnum>(d, (MyEnum) 3, "#1");
950 Assert<MyEnum> (d, 0, "#2");
952 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
953 Assert (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
956 void GreaterThanTest ()
961 Assert (d > v, true, "#1");
963 Assert (d > v2, false, "#1a");
966 Assert (d > 4.59, true, "#2");
968 Assert (d > b2, false, "#2a");
971 MyType v3 = new MyType (30);
972 Assert (d > v3, false, "#3");
973 dynamic d3 = new MyType (-7);
974 Assert (d3 > new MyType (6), false, "#3a");
976 d3 = new MyTypeImplicitOnly (-7);
977 Assert (d3 > 11, false, "#3b");
981 Assert (d > v4, false, "#4");
982 Assert (d > 2m, false, "#4a");
985 void GreaterThanNullableTest ()
990 Assert (d > v2, false, "#1");
991 Assert (d > null, false, "#1a");
992 Assert (null > d, false, "#1b");
995 Assert (d > v2, true, "#2");
996 dynamic d2 = (int?) -2;
997 Assert (d2 > 1, false, "#2a");
999 Assert (d2 > 44, false, "#2b");
1001 d = new MyType (30);
1002 MyType? v3 = new MyType (30);
1003 Assert (d > v3, false, "#3");
1004 dynamic d3 = new MyType? (new MyType (-7));
1005 Assert (d3 > new MyType (6), false, "#3a");
1006 Assert (d3 > null, false, "#3b");
1010 Assert (d > v4, true, "#4");
1012 Assert (d > v4, false, "#4a");
1015 void GreaterThanEnumTest ()
1017 dynamic d = MyEnum.Value_1;
1019 Assert (d > null, false, "#1");
1021 Assert (d > MyEnum.Value_1, false, "#2");
1022 Assert (d > 0, true, "#2a");
1024 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1025 Assert (d2 > MyEnumUlong.Value_2, false, "#3");
1026 Assert (d2 > null, false, "#3a");
1029 void GreaterThanEqualTest ()
1034 Assert (d >= v, true, "#1");
1036 Assert (d >= v2, true, "#1a");
1039 Assert (d >= 4.59, true, "#2");
1041 Assert (d >= b2, true, "#2a");
1043 d = new MyType (30);
1044 MyType v3 = new MyType (30);
1045 Assert (d >= v3, true, "#3");
1046 dynamic d3 = new MyType (-7);
1047 Assert (d3 >= new MyType (6), false, "#3a");
1049 d3 = new MyTypeImplicitOnly (-7);
1050 Assert (d3 >= 11, false, "#3b");
1054 Assert (d >= v4, false, "#4");
1055 Assert (d >= 2m, true, "#4a");
1058 void GreaterThanEqualNullableTest ()
1063 Assert (d >= v2, false, "#1");
1064 Assert (d >= null, false, "#1a");
1065 Assert (null >= d, false, "#1b");
1068 Assert (d >= v2, true, "#2");
1069 dynamic d2 = (int?) -2;
1070 Assert (d2 >= 1, false, "#2a");
1072 Assert (d2 >= 44, true, "#2b");
1074 d = new MyType (30);
1075 MyType? v3 = new MyType (30);
1076 Assert (d >= v3, true, "#3");
1077 dynamic d3 = new MyType? (new MyType (-7));
1078 Assert (d3 >= new MyType (6), false, "#3a");
1079 Assert (d3 >= null, false, "#3b");
1083 Assert (d >= v4, true, "#4");
1085 Assert (d >= v4, false, "#4a");
1088 void GreaterThanEqualEnumTest ()
1090 dynamic d = MyEnum.Value_1;
1092 Assert (d >= null, false, "#1");
1094 Assert (d >= MyEnum.Value_1, true, "#2");
1095 Assert (d >= 0, true, "#2a");
1097 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1098 Assert (d2 >= MyEnumUlong.Value_2, true, "#3");
1099 Assert (d2 >= null, false, "#3a");
1102 void LeftShiftTest ()
1104 dynamic d = (ulong) 0x7F000;
1107 Assert<ulong> (d << v, 0x1FC000, "#1");
1108 Assert<ulong> (d << 1, 0xFE000, "#1a");
1110 Assert<ulong> (d << s, 0x1FC000, "#1b");
1113 MyTypeImplicitOnly v3 = new MyTypeImplicitOnly (3);
1114 Assert (d << v3, 0x3F8000, "#3");
1115 dynamic d3 = new MyType (-7);
1116 Assert (d3 << new MyTypeImplicitOnly (6), -448, "#3a");
1117 Assert (d3 << 11, -14336, "#3b");
1120 void LeftShiftNullableTest ()
1125 Assert<int?> (d << v2, null, "#1");
1127 Assert<int?> (d << null, null, "#1a");
1129 Assert<int?> (null << d, null, "#1b");
1132 Assert (d << v2, 0x40000000, "#2");
1133 dynamic d2 = (int?) -2;
1134 Assert (d2 << 1, -4, "#2a");
1136 dynamic d3 = (int?) null;
1137 Assert (d3 << (null << null), (int?)null, "#3");
1140 void LeftShiftAssignTest ()
1142 dynamic d = 0x7F000;
1146 Assert (d, 0x1FC000, "#1");
1148 Assert (d, 0x3F8000, "#1a");
1151 Assert (d, 0xFE0000, "#1b");
1154 void LeftShiftAssignNullableTest ()
1160 Assert (d, 0x40000000, "#2");
1161 dynamic d2 = (int?) -2;
1163 Assert (d2, -4, "#2a");
1166 void LessThanTest ()
1171 Assert (d < v, false, "#1");
1173 Assert (d < v2, false, "#1a");
1176 Assert (d < 4.59, false, "#2");
1178 Assert (d < b2, false, "#2a");
1180 d = new MyType (30);
1181 MyType v3 = new MyType (30);
1182 Assert (d < v3, false, "#3");
1183 dynamic d3 = new MyType (-7);
1184 Assert (d3 < new MyType (6), true, "#3a");
1186 d3 = new MyTypeImplicitOnly (-7);
1187 Assert (d3 < 11, true, "#3b");
1191 Assert (d < v4, true, "#4");
1192 Assert (d < 2m, false, "#4a");
1195 void LessThanNullableTest ()
1200 Assert (d < v2, false, "#1");
1201 Assert (d < null, false, "#1a");
1202 Assert (null < d, false, "#1b");
1205 Assert (d < v2, false, "#2");
1206 dynamic d2 = (int?) -2;
1207 Assert (d2 < 1, true, "#2a");
1209 Assert (d2 < 44, false, "#2b");
1211 d = new MyType (30);
1212 MyType? v3 = new MyType (30);
1213 Assert (d < v3, false, "#3");
1214 dynamic d3 = new MyType? (new MyType (-7));
1215 Assert (d3 < new MyType (6), true, "#3a");
1217 d3 = new MyTypeImplicitOnly (-7);
1218 Assert (d3 < null, false, "#3b");
1222 Assert (d < v4, false, "#4");
1224 Assert (d < v4, false, "#4a");
1227 void LessThanEnumTest ()
1229 dynamic d = MyEnum.Value_1;
1231 Assert (d < null, false, "#1");
1233 Assert (d < MyEnum.Value_1, false, "#2");
1234 Assert (d < 0, false, "#2a");
1236 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1237 Assert (d2 < MyEnumUlong.Value_2, false, "#3");
1238 Assert (d2 < null, false, "#3a");
1241 void LessThanOrEqualTest ()
1246 Assert (d <= v, false, "#1");
1248 Assert (d <= v2, true, "#1a");
1251 Assert (d <= 4.59, false, "#2");
1253 Assert (d <= b2, true, "#2a");
1255 d = new MyType (30);
1256 MyType v3 = new MyType (30);
1257 Assert (d <= v3, true, "#3");
1258 dynamic d3 = new MyType (-7);
1259 Assert (d3 <= new MyType (6), true, "#3a");
1261 d3 = new MyTypeImplicitOnly (-7);
1262 Assert (d3 <= 11, true, "#3b");
1266 Assert (d <= v4, true, "#4");
1267 Assert (d <= 2m, true, "#4a");
1270 void LessThanOrEqualNullableTest ()
1275 Assert (d <= v2, false, "#1");
1276 Assert (d <= null, false, "#1a");
1277 Assert (null <= d, false, "#1b");
1280 Assert (d <= v2, false, "#2");
1281 dynamic d2 = (int?) -2;
1282 Assert (d2 <= 1, true, "#2a");
1284 Assert (d2 <= 44, true, "#2b");
1286 d = new MyType (30);
1287 MyType? v3 = new MyType (30);
1288 Assert (d <= v3, true, "#3");
1289 dynamic d3 = new MyType? (new MyType (-7));
1290 Assert (d3 <= new MyType (6), true, "#3a");
1291 Assert (d3 <= null, false, "#3b");
1295 Assert (d <= v4, false, "#4");
1297 Assert (d <= v4, false, "#4a");
1300 void LessThanOrEqualEnumTest ()
1302 dynamic d = MyEnum.Value_1;
1304 Assert (d <= null, false, "#1");
1306 Assert (d <= MyEnum.Value_1, true, "#2");
1307 Assert (d <= 0, false, "#2a");
1309 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1310 Assert (d2 <= MyEnumUlong.Value_2, true, "#3");
1311 Assert (d2 <= null, false, "#3a");
1319 Assert (d % v, 1, "#1");
1322 MyType v3 = new MyType (30);
1323 Assert (d % v3, new MyType (5), "#3");
1324 dynamic d3 = new MyType (-7);
1325 Assert<MyType> (d3 % new MyType (6), new MyType (-1), "#3a");
1327 d = new MyTypeImplicitOnly (5);
1329 Assert (d % v4, 1m, "#4");
1332 void ModuloNullableTest ()
1337 Assert<double?> (d % v2, null, "#1");
1338 Assert<double?> (d % null, null, "#1a");
1339 Assert<double?> (null % d, null, "#1b");
1342 Assert (d % v2, 1, "#2");
1343 dynamic d2 = (int?) -2;
1344 Assert (d2 % 1, 0, "#2a");
1346 d = new MyType (-2);
1347 MyType? v3 = new MyType (30);
1348 Assert (d % v3, new MyType (-2), "#3");
1349 dynamic d3 = new MyType? (new MyType (-7));
1350 Assert (d3 % new MyType (6), new MyType (-1), "#3a");
1351 Assert<MyType?> (d3 + null, null, "#3b");
1353 d = new MyTypeImplicitOnly (5);
1355 Assert (d % v4, 1m, "#4");
1357 Assert<decimal?> (d % v4, null, "#4a");
1360 void ModuloAssignTest ()
1366 Assert (d, 1, "#1");
1371 Assert (d, 0, "#1a");
1373 Assert (d, 0, "#1b");
1375 dynamic d3 = new MyType (-7);
1376 d3 %= new MyType (6);
1377 Assert<MyType> (d3, new MyType (-1), "#3");
1382 Assert (d, 1m, "#4");
1385 void MultiplyTest ()
1390 Assert (d * v, 10, "#1");
1392 Assert (d * v2, 2.5, "#1a");
1395 MyType v3 = new MyType (30);
1396 Assert (d * v3, new MyType (150), "#3");
1397 dynamic d3 = new MyType (-7);
1398 Assert<MyType> (d3 * new MyType (6), new MyType (-42), "#3a");
1402 Assert (d * v4, 31.6m, "#4");
1405 void MultiplyNullableTest ()
1410 Assert<int?> (d * v2, null, "#1");
1411 Assert<int?> (d * null, null, "#1a");
1412 Assert<int?> (null * d, null, "#1b");
1415 Assert (d * v2, -10, "#2");
1416 dynamic d2 = (int?) -2;
1417 Assert (d2 * 1, -2, "#2a");
1420 MyType? v3 = new MyType (30);
1421 Assert (d * v3, new MyType (150), "#3");
1422 dynamic d3 = new MyType? (new MyType (-7));
1423 Assert (d3 * new MyType (6), new MyType (-42), "#3a");
1424 Assert<MyType?> (d3 * null, null, "#3b");
1426 d = new MyTypeImplicitOnly (5);
1428 Assert (d * v4, 20m, "#4");
1430 Assert<decimal?> (d * v4, null, "#4a");
1433 void MultiplyCheckedTest ()
1438 int v = int.MaxValue;
1439 AssertChecked (() => d * v, 7, "#1");
1442 AssertChecked (() => d * v2, null, "#2");
1445 MyType v3 = new MyType (int.MaxValue);
1446 Assert (d * v3, new MyType (-4), "#3");
1450 void MultiplyAssignTest ()
1456 Assert (d, 10, "#1");
1461 Assert (d, 2.5, "#1a");
1463 Assert (d, 5, "#1b");
1465 dynamic d3 = new MyType (-7);
1466 d3 *= new MyType (6);
1467 Assert<MyType> (d3, new MyType (-42), "#3");
1472 Assert (d, 20m, "#4");
1477 Assert (i, 15, "#5");
1480 void MultiplyAssignCheckedTest ()
1485 int v = int.MaxValue;
1486 AssertChecked (() => { d *= v; Assert (d, 0, "#1-"); }, "#1");
1488 d = new MyType (44);
1489 MyType v3 = new MyType (int.MaxValue);
1491 Assert (d, new MyType (-44), "#3-");
1498 Assert (8, -d, "#1");
1499 Assert (-8, -(-d), "#1a");
1501 d = new MyType (-14);
1502 Assert (new MyType (14), -d, "#2");
1504 d = new MyTypeImplicitOnly (4);
1505 Assert (-4, -d, "#3");
1508 Assert (-7, -d, "#4");
1510 d = double.NegativeInfinity;
1511 Assert (double.PositiveInfinity, -d, "#5");
1514 void NegateNullable ()
1516 dynamic d = (int?) -8;
1517 Assert (8, -d, "#1");
1518 Assert (-8, -(-d), "#1a");
1520 MyType? n1 = new MyType (4);
1522 Assert (new MyType (-4), -d, "#2");
1524 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
1526 Assert (-4, -d, "#3");
1529 Assert (-7, -d, "#4");
1532 void NegateChecked ()
1535 dynamic d = int.MinValue;
1536 AssertChecked (() => -d, 0, "#1");
1543 Assert (false, !d, "#1");
1545 var de = new MyType (-1);
1546 Assert (false, !d, "#2");
1549 void NotEqualTest ()
1554 Assert (d != v, true, "#1");
1556 Assert (d != v2, false, "#1a");
1559 Assert (d != false, true, "#2");
1561 Assert (d != b2, false, "#2a");
1563 d = new MyType (30);
1564 MyType v3 = new MyType (30);
1565 Assert (d != v3, false, "#3");
1566 dynamic d3 = new MyType (-7);
1567 Assert (d3 != new MyType (6), true, "#3a");
1571 Assert (d != v4, true, "#4");
1572 Assert (d != 2m, false, "#4a");
1575 Assert (d != null, false, "#5");
1578 void NotEqualNullableTest ()
1583 Assert (d != v2, true, "#1");
1584 Assert (d != null, true, "#1a");
1585 Assert (null != d, true, "#1b");
1588 Assert (d != v2, true, "#2");
1589 dynamic d2 = (int?) -2;
1590 Assert (d2 != 1, true, "#2a");
1592 Assert (d2 != 44, false, "#2b");
1594 d = new MyType (30);
1595 MyType? v3 = new MyType (30);
1596 Assert (d != v3, false, "#3");
1597 dynamic d3 = new MyType? (new MyType (-7));
1598 Assert (d3 != new MyType (6), true, "#3a");
1599 Assert (d3 != null, true, "#3b");
1603 Assert (d != v4, true, "#4");
1605 Assert (d != v4, true, "#4a");
1608 Assert (d != true, false, "#5");
1609 Assert (d != null, true, "#5a");
1610 Assert (d != false, true, "#5b");
1613 void NotEqualEnumTest ()
1615 dynamic d = MyEnum.Value_1;
1617 Assert (d != null, true, "#1");
1619 Assert (d != MyEnum.Value_1, false, "#2");
1620 Assert (d != 0, true, "#2a");
1622 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1623 Assert (d2 != MyEnumUlong.Value_2, false, "#3");
1624 Assert (d2 != null, true, "#3a");
1627 void NotEqualStringTest ()
1631 Assert (d != "te", true, "#1");
1632 Assert (d != "text", false, "#1a");
1633 Assert (d != null, true, "#1b");
1636 void OnesComplement ()
1639 Assert (-8, ~d, "#1");
1641 d = new MyType (-1);
1642 Assert (0, ~d, "#2");
1645 Assert (18446744073709551608, ~d, "#3");
1648 Assert ((MyEnum) 254, ~d, "#4");
1651 void OnesComplementNullable ()
1653 dynamic d = (int?) 7;
1654 Assert (-8, ~d, "#1");
1656 d = (MyEnum?) MyEnum.Value_1;
1657 Assert ((MyEnum) 254, ~d, "#4");
1665 Assert (d | v, true, "#1");
1666 Assert (d | false, true, "#1a");
1670 Assert (d | v2, 62, "#2");
1671 Assert (d | 0, 42, "#2a");
1673 d = new MyType (42);
1674 MyType v3 = new MyType (30);
1675 Assert (d | v3, new MyType (62), "#3");
1676 dynamic d3 = new MyType (-7);
1677 Assert<MyType> (d3 | new MyType (6), new MyType (-1), "#3a");
1679 d3 = new MyTypeImplicitOnly (-7);
1680 Assert (d3 | 11, -5, "#3b");
1685 dynamic d = MyEnum.Value_1;
1687 Assert<MyEnum?> (d | null, null, "#1");
1689 Assert (d | d, MyEnum.Value_1, "#2");
1691 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1692 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
1695 void OrTestNullable ()
1700 Assert<int?> (d | v2, null, "#1");
1701 Assert<int?> (d | null, null, "#1a");
1702 Assert<int?> (null | d, null, "#1b");
1705 Assert (d | v2, -1, "#2");
1706 dynamic d2 = (int?) -2;
1707 Assert (d2 | 1, -1, "#2a");
1709 d = new MyType (-2);
1710 MyType? v3 = new MyType (30);
1711 Assert (d | v3, new MyType (-2), "#3");
1712 dynamic d3 = new MyType? (new MyType (-7));
1713 Assert (d3 | new MyType (6), new MyType (-1), "#3a");
1716 void OrAssignedTest ()
1722 Assert (d, true, "#1");
1725 Assert (d, true, "#1a");
1730 Assert (d, 62, "#2");
1732 MyType v3 = new MyType (30);
1733 dynamic d3 = new MyType (-7);
1734 d3 |= new MyType (6);
1735 Assert<MyType> (d3, new MyType (-1), "#3");
1738 void OrAssignedTestEnum ()
1740 dynamic d = MyEnum.Value_1;
1741 d |= MyEnum.Value_2;
1742 Assert<MyEnum> (d, (MyEnum) 3, "#1");
1746 Assert (d, MyEnum.Value_2, "#2");
1748 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1749 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
1757 Assert<bool> (d || v, true, "#1");
1759 Assert (d || true, true, "#1a");
1762 Assert (d || d, true, "#2");
1764 dynamic d3 = new MyType (-7);
1765 Assert<MyType> (d3 || new MyType (6), new MyType (-7), "#3");
1768 void RightShiftTest ()
1770 dynamic d = (ulong) 0x7F000;
1773 Assert<ulong> (d >> v, 0x1FC00, "#1");
1774 Assert<ulong> (d >> 1, 0x3F800, "#1a");
1776 Assert<ulong> (d >> s, 0x1FC00, "#1b");
1779 MyTypeImplicitOnly v3 = new MyTypeImplicitOnly (3);
1780 Assert (d >> v3, 0xFE00, "#3");
1781 dynamic d3 = new MyType (-7);
1782 Assert (d3 >> new MyTypeImplicitOnly (11), -1, "#3a");
1785 void RightShiftNullableTest ()
1790 Assert<int?> (d >> v2, null, "#1");
1792 Assert<int?> (d >> null, null, "#1a");
1794 Assert<int?> (null >> d, null, "#1b");
1797 Assert (d >> v2, 0, "#2");
1798 dynamic d2 = (int?) -200;
1799 Assert (d2 >> 1, -100, "#2a");
1801 dynamic d3 = (int?) null;
1802 Assert (d3 >> (null >> null), (int?) null, "#3");
1805 void RightShiftAssignTest ()
1807 dynamic d = 0x7F000;
1811 Assert (d, 0x1FC00, "#1");
1813 Assert (d, 0xFE00, "#1a");
1816 Assert (d, 0x3F80, "#1b");
1819 void RightShiftAssignNullableTest ()
1825 Assert (d, 0, "#2");
1826 dynamic d2 = (int?) -2;
1828 Assert (d2, -1, "#2a");
1831 void SubtractTest ()
1836 Assert (d - v, 3, "#1");
1838 Assert (d - v2, 4.5, "#1a");
1841 MyType v3 = new MyType (30);
1842 Assert (d - v3, new MyType (-25), "#3");
1843 dynamic d3 = new MyType (-7);
1844 Assert (d3 - new MyType (6), new MyType (-13), "#3a");
1846 d = new MyTypeImplicitOnly (5);
1848 Assert (d - v4, 1m, "#4");
1851 void SubtractNullableTest ()
1856 Assert<int?> (d - v2, null, "#1");
1857 Assert<int?> (d - null, null, "#1a");
1858 Assert<int?> (null - d, null, "#1b");
1861 Assert (d - v2, 7, "#2");
1862 dynamic d2 = (int?) -2;
1863 Assert (d2 - 1, -3, "#2a");
1866 MyType? v3 = new MyType (30);
1867 Assert (d - v3, new MyType (-25), "#3");
1868 dynamic d3 = new MyType? (new MyType (-7));
1869 Assert (d3 - new MyType (6), new MyType (-13), "#3a");
1870 Assert<MyType?> (d3 - null, null, "#3b");
1872 d = new MyTypeImplicitOnly (5);
1874 Assert (d - v4, 1m, "#4");
1876 Assert<decimal?> (d - v4, null, "#4a");
1879 void SubtractEnumTest ()
1881 dynamic d = MyEnum.Value_1;
1883 Assert<MyEnum> (d - 1, 0, "#1");
1885 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1886 Assert (d2 - (byte) 1, MyEnumUlong.Value_1, "#2");
1887 Assert<MyEnumUlong?> (d2 - null, null, "#2a");
1889 // CSC: Invalid System.InvalidOperationException
1890 Assert<MyEnum?> (d - null, null, "#3");
1893 void SubtractCheckedTest ()
1898 int v = int.MinValue;
1899 AssertChecked (() => d - v, 7, "#1");
1902 AssertChecked (() => d - v2, null, "#2");
1905 MyType v3 = new MyType (int.MinValue);
1906 Assert (d - v3, new MyType (-2147483643), "#3");
1910 void SubtractAssignTest ()
1916 Assert (d, 3, "#1");
1921 Assert (d, 4.5, "#1a");
1923 Assert (d, 2.5, "#1b");
1925 dynamic d3 = new MyType (-7);
1926 d3 -= new MyType (6);
1927 Assert<MyType> (d3, new MyType (-13), "#3");
1932 Assert (d, 1m, "#4");
1935 void SubtractAssignEnumTest ()
1937 dynamic d = MyEnum.Value_1;
1940 Assert<MyEnum> (d, 0, "#2");
1942 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1944 Assert (d2, MyEnumUlong.Value_1, "#3");
1947 void SubtractAssignCheckedTest ()
1952 int v = int.MinValue;
1953 AssertChecked (() => { d -= v; Assert (d, 0, "#1a"); }, "#1");
1956 MyType v3 = new MyType (int.MinValue);
1958 Assert (d, new MyType (-2147483643), "#3a");
1962 void SubtractAssignEvent ()
1964 Action print = () => { Console.WriteLine ("foo"); };
1967 // FIXME: Will have to special case events
1972 void UnaryDecrement ()
1975 Assert (3, d--, "#1");
1976 Assert (2, d, "#1a");
1979 Assert (2, --d, "#2");
1980 Assert (2, d, "#2a");
1982 d = new MyType (-3);
1983 Assert (new MyType (-3), d--, "#3");
1984 Assert (new MyType (-1), d, "#3a");
1987 void UnaryDecrementCheckedTest ()
1990 dynamic d = int.MinValue;
1992 AssertChecked (() => { d--; Assert (d, -1073741824, "#1a"); }, "#1");
1994 d = new MyType (int.MinValue);
1996 Assert (d, new MyType (-1073741824), "#2");
2000 void UnaryIncrement ()
2003 Assert (3, d++, "#1");
2004 Assert (4, d, "#1a");
2007 Assert (4, ++d, "#2");
2008 Assert (4, d, "#2a");
2010 d = new MyType (-3);
2011 Assert (new MyType (-3), d++, "#3");
2012 Assert (new MyType (-6), d, "#3a");
2015 void UnaryIncrementCheckedTest ()
2018 dynamic d = int.MaxValue;
2020 AssertChecked (() => { d++; Assert (d, 0, "#1a"); }, "#1");
2022 d = new MyType (int.MaxValue);
2024 Assert (d, new MyType (-2), "#2");
2028 //void UnaryIsFalse ()
2030 // dynamic d = this;
2031 // object r = d == null;
2032 // Assert (false, (bool) r, "#1");
2033 // Assert<object> (true, d != null, "#1a");
2039 Assert (3, d ? 3 : 5, "#1");
2042 Assert (false, d < 1, "#2");
2044 d = new InverseLogicalOperator (true);
2045 Assert (1, d ? 1 : -1, "#3");
2051 Assert (-8, +d, "#1");
2052 Assert (-8, +(+d), "#1a");
2054 d = new MyType (14);
2055 Assert (new MyType (334455), +d, "#2");
2057 d = new MyTypeImplicitOnly (4);
2058 Assert (4, +d, "#3");
2061 Assert<uint> (7, +d, "#4");
2064 void UnaryPlusNullable ()
2066 dynamic d = (int?) -8;
2067 Assert (-8, +d, "#1");
2068 Assert (-8, +(+d), "#1a");
2070 MyType? n1 = new MyType (4);
2072 Assert (new MyType (334455), +d, "#2");
2074 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
2076 Assert (4, +d, "#3");
2079 Assert (7, +d, "#4");
2082 #pragma warning restore 169
2084 static bool RunTest (MethodInfo test)
2086 Console.Write ("Running test {0, -25}", test.Name);
2088 test.Invoke (new Tester (), null);
2089 Console.WriteLine ("OK");
2091 } catch (Exception e) {
2092 Console.WriteLine ("FAILED");
2093 Console.WriteLine (e.ToString ());
2098 public static int Main ()
2100 var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
2101 where test.GetParameters ().Length == 0
2103 select RunTest (test);
2105 int failures = tests.Count (a => !a);
2106 Console.WriteLine (failures + " tests failed");