2 using System
.Collections
.Generic
;
4 using System
.Linq
.Expressions
;
5 using System
.Reflection
;
7 // Dynamic binary and unary operators tests
9 public struct InverseLogicalOperator
12 public InverseLogicalOperator (bool value)
17 public static bool operator true (InverseLogicalOperator u
)
22 public static bool operator false (InverseLogicalOperator u
)
32 public MyType (int value) : this ()
37 public short ShortProp { get; set; }
39 public override int GetHashCode ()
41 throw new NotImplementedException ();
44 public static bool operator true (MyType a
)
49 public static bool operator false (MyType a
)
54 public static MyType
operator + (MyType a
, MyType b
)
56 return new MyType (a
.value + b
.value);
59 public static MyType
operator - (MyType a
, MyType b
)
61 return new MyType (a
.value - b
.value);
64 public static MyType
operator / (MyType a
, MyType b
)
66 return new MyType (a
.value / b
.value);
69 public static MyType
operator * (MyType a
, MyType b
)
71 return new MyType (a
.value * b
.value);
74 public static MyType
operator % (MyType a
, MyType b
)
76 return new MyType (a
.value % b
.value);
79 public static MyType
operator &(MyType a
, MyType b
)
81 return new MyType (a
.value & b
.value);
84 public static MyType
operator | (MyType a
, MyType b
)
86 return new MyType (a
.value | b
.value);
89 public static MyType
operator ^
(MyType a
, MyType b
)
91 return new MyType (a
.value ^ b
.value);
94 public static bool operator == (MyType a
, MyType b
)
96 return a
.value == b
.value;
99 public static bool operator != (MyType a
, MyType b
)
101 return a
.value != b
.value;
104 public static bool operator > (MyType a
, MyType b
)
106 return a
.value > b
.value;
109 public static bool operator < (MyType a
, MyType b
)
111 return a
.value < b
.value;
114 public static bool operator >= (MyType a
, MyType b
)
116 return a
.value >= b
.value;
119 public static bool operator <= (MyType a
, MyType b
)
121 return a
.value <= b
.value;
124 public static bool operator ! (MyType a
)
129 public static int operator ~
(MyType a
)
134 public static MyType
operator ++ (MyType a
)
136 return new MyType (a
.value * 2);
139 public static MyType
operator -- (MyType a
)
141 return new MyType (a
.value / 2);
144 public static int operator >> (MyType a
, int b
)
149 public static int operator << (MyType a
, int b
)
154 public static MyType
operator - (MyType a
)
156 return new MyType (-a
.value);
159 public static MyType
operator + (MyType a
)
161 return new MyType (334455); // magic number
164 public override string ToString ()
166 return value.ToString ();
175 public MyTypeExplicit (int value)
180 public static explicit operator int (MyTypeExplicit m
)
186 struct MyTypeImplicitOnly
190 public MyTypeImplicitOnly (short b
)
195 public static implicit operator short (MyTypeImplicitOnly m
)
200 public static implicit operator bool (MyTypeImplicitOnly m
)
212 enum MyEnumUlong
: ulong
221 delegate void EmptyDelegate ();
222 delegate int IntDelegate ();
224 static void Assert
<T
> (T expected
, T
value, string name
)
226 if (!EqualityComparer
<T
>.Default
.Equals (expected
, value)) {
228 throw new ApplicationException (name
+ expected
+ " != " + value);
232 static void AssertChecked
<T
> (Func
<T
> expected
, T
value, string name
)
235 Assert (expected (), value, name
);
236 throw new ApplicationException (name
+ ": OverflowException expected");
237 } catch (OverflowException
) {
242 static void AssertChecked (Action expected
, string name
)
246 throw new ApplicationException (name
+ ": OverflowException expected");
247 } catch (OverflowException
) {
252 #pragma warning disable 169
259 Assert (d
+ v
, 7, "#1");
261 Assert (d
+ v2
, 5.5, "#1a");
264 MyType v3
= new MyType (30);
265 Assert (d
+ v3
, new MyType (35), "#3");
266 dynamic d3
= new MyType (-7);
267 Assert
<MyType
> (d3
+ new MyType (6), new MyType (-1), "#3a");
269 d3
= new MyTypeImplicitOnly (6);
270 Assert (d3
+ new MyTypeImplicitOnly (11), 17, "#3b");
272 d
= new MyTypeImplicitOnly (5);
274 Assert (d
+ v4
, 9m
, "#4");
277 void AddNullableTest ()
282 Assert
<int?> (d
+ v2
, null, "#1");
283 Assert
<int?> (d
+ null, null, "#1a");
284 Assert
<int?> (null + d
, null, "#1b");
287 Assert (d
+ v2
, 3, "#2");
288 dynamic d2
= (int?) -2;
289 Assert (d2
+ 1, -1, "#2a");
292 MyType
? v3
= new MyType (30);
293 Assert (d
+ v3
, new MyType (35), "#3");
294 dynamic d3
= new MyType
? (new MyType (-7));
295 Assert (d3
+ new MyType (6), new MyType (-1), "#3a");
296 Assert
<MyType
?> (d3
+ null, null, "#3b");
298 d
= new MyTypeImplicitOnly (5);
300 Assert (d
+ v4
, 9m
, "#4");
302 Assert
<decimal?> (d
+ v4
, null, "#4a");
307 dynamic d
= MyEnum
.Value_1
;
309 // CSC: Invalid System.InvalidOperationException
310 Assert (d
+ null, null, "#1");
312 Assert (d
+ 1, MyEnum
.Value_2
, "#2");
314 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
315 Assert (d2
+ (byte) 1, MyEnumUlong
.Value_2
, "#3");
316 Assert
<MyEnumUlong
?> (d2
+ (object) null, null, "#3a");
319 void AddCheckedTest ()
324 int v
= int.MaxValue
;
325 AssertChecked (() => d
+ v
, 7, "#1");
328 AssertChecked (() => d
+ v2
, null, "#2");
331 MyType v3
= new MyType (int.MaxValue
);
332 Assert (new MyType (-2147483646), d
+ v3
, "#3");
336 void AddStringTest ()
340 Assert (d
+ v
, "foo->", "#1");
341 Assert (d
+ 1, "foo1", "#1a");
342 Assert (d
+ null, "foo", "#1b");
343 Assert (d
+ 1 + v
, "foo1->", "#1a");
346 Assert (d
+ v2
, "foo4", "#2");
349 void AddAssignTest ()
360 Assert (d
, 5.5, "#1a");
362 Assert (d
, 7.5, "#1b");
364 dynamic d3
= new MyType (-7);
365 d3
+= new MyType (6);
366 Assert
<MyType
> (d3
, new MyType (-1), "#3");
371 Assert (d
, 9m
, "#4");
374 void AddAssignNullableTest ()
376 dynamic d
= (int?) 5;
379 // For now it's impossible to use nullable compound assignment
380 // due to the way how DLR works. GetType () on nullable object returns
381 // underlying type and not nullable type, that means that
382 // C# binder is initialized with wrong operand type and any operation
387 Assert<int?> (d, null, "#1");
389 Assert<int?> (d, null, "#1a");
398 Assert (d, -1, "#2a");
400 MyType? v3 = new MyType (30);
402 Assert (d, new MyType (35), "#3");
403 dynamic d3 = new MyType? (new MyType (-7));
404 Assert (d3 + new MyType (6), new MyType (-1), "#3a");
405 Assert<MyType?> (d3 + null, null, "#3b");
410 Assert (d, 9m, "#4");
412 Assert<decimal?> (d, null, "#4a");
416 void AddAssignEnumTest ()
418 dynamic d
= MyEnum
.Value_1
;
422 Assert (d
, MyEnum
.Value_2
, "#2");
424 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
426 Assert (d2
, MyEnumUlong
.Value_2
, "#3");
429 void AddAssignCheckedTest ()
434 int v
= int.MaxValue
;
435 AssertChecked (() => { d += v; Assert (d, 0, "#1-"); }
, "#1");
438 MyType v3
= new MyType (int.MaxValue
);
440 Assert (d
, new MyType (-2147483644), "#3-");
444 void AddAssignStringTest ()
449 Assert (d
, "foo->", "#1");
453 Assert (d
, "foo1", "#1a");
456 Assert (d
, "foo1", "#1b");
461 Assert (d
, "foo4", "#2");
465 void AddAssignmentEvent ()
475 Assert (d
& v
, false, "#1");
476 Assert (d
& true, true, "#1a");
480 Assert (d
& v2
, 42, "#2");
481 Assert (d
& 0, 0, "#2a");
484 MyType v3
= new MyType (30);
485 Assert (d
& v3
, new MyType (10), "#3");
486 dynamic d3
= new MyType (-7);
487 Assert
<MyType
> (d3
& new MyType (6), new MyType (0), "#3a");
489 d3
= new MyTypeImplicitOnly (6);
490 Assert (d3
& 11, 2, "#3b");
495 dynamic d
= MyEnum
.Value_1
;
497 Assert
<MyEnum
?> (d
& null, null, "#1");
499 Assert (d
& d
, MyEnum
.Value_1
, "#2");
501 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
502 Assert
<MyEnumUlong
> (d2
& MyEnumUlong
.Value_2
, 0, "#3");
505 void AndTestNullable ()
510 Assert
<int?> (d
& v2
, null, "#1");
511 Assert
<int?> (d
& null, null, "#1a");
512 Assert
<int?> (null & d
, null, "#1b");
515 Assert (d
& v2
, 4, "#2");
516 dynamic d2
= (int?) -2;
517 Assert (d2
& 1, 0, "#2a");
520 MyType
? v3
= new MyType (30);
521 Assert (d
& v3
, new MyType (22), "#3");
522 dynamic d3
= new MyType
? (new MyType (-7));
523 Assert (d3
& new MyType (6), new MyType (0), "#3a");
524 Assert
<MyType
?> (d3
+ null, null, "#3b");
527 void AndAssignedTest ()
533 Assert (d
, false, "#1");
536 Assert (d
, true, "#1a");
541 Assert (d
, 42, "#2");
543 MyType v3
= new MyType (30);
544 dynamic d3
= new MyType (-7);
545 d3
&= new MyType (6);
546 Assert
<MyType
> (d3
, new MyType (0), "#3");
549 void AndAssignedTestEnum ()
551 dynamic d
= MyEnum
.Value_1
;
553 Assert
<MyEnum
>(d
, 0, "#1");
557 Assert (d
, MyEnum
.Value_2
, "#2");
559 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
560 Assert
<MyEnumUlong
> (d2
& MyEnumUlong
.Value_2
, 0, "#3");
568 Assert
<bool> (d
&& v
, false, "#1");
570 Assert (d
&& true, true, "#1a");
573 Assert (d
&& d
, true, "#2");
575 dynamic d3
= new MyType (-7);
576 Assert
<MyType
> (d3
&& new MyType (6), new MyType (0), "#3");
578 d3
= new MyTypeImplicitOnly (5);
579 Assert (d3
&& 11, 1, "#3b");
587 Assert (d
/ v
, 2, "#1");
590 MyType v3
= new MyType (30);
591 Assert (d
/ v3
, new MyType (0), "#3");
592 dynamic d3
= new MyType (-7);
593 Assert
<MyType
> (d3
+ new MyType (6), new MyType (-1), "#3a");
595 d
= new MyTypeImplicitOnly (6);
597 Assert (d
/ v4
, 1.5m
, "#4");
600 void DivideNullableTest ()
605 Assert
<double?> (d
/ v2
, null, "#1");
606 Assert
<double?> (d
/ null, null, "#1a");
607 Assert
<double?> (null / d
, null, "#1b");
610 Assert (d
/ v2
, -2.5, "#2");
611 dynamic d2
= (int?) -2;
612 Assert (d2
/ 1, -2, "#2a");
615 MyType
? v3
= new MyType (30);
616 Assert (d
/ v3
, new MyType (0), "#3");
617 dynamic d3
= new MyType
? (new MyType (-7));
618 Assert (d3
/ new MyType (6), new MyType (-1), "#3a");
619 Assert
<MyType
?> (d3
+ null, null, "#3b");
621 d
= new MyTypeImplicitOnly (5);
623 Assert (d
/ v4
, 1.25m
, "#4");
625 Assert
<decimal?> (d
/ v4
, null, "#4a");
628 void DivideCheckedTest ()
635 void DivideAssignTest ()
646 Assert (d
, 10, "#1a");
648 Assert (d
, 5, "#1b");
650 dynamic d3
= new MyType (-7);
651 d3
/= new MyType (6);
652 Assert
<MyType
> (d3
, new MyType (-1), "#3");
657 Assert (d
, 1.25m
, "#4");
660 void DivideAssignCheckedTest ()
672 Assert (d
== v
, false, "#1");
674 Assert (d
== v2
, true, "#1a");
677 Assert (d
== false, false, "#2");
679 Assert (d
== b2
, true, "#2a");
682 MyType v3
= new MyType (30);
683 Assert (d
== v3
, true, "#3");
684 dynamic d3
= new MyTypeImplicitOnly (-7);
685 Assert (d3
== 11, false, "#3b");
689 Assert (d
== v4
, false, "#4");
690 Assert (d
== 2m
, true, "#4a");
693 Assert (d
== null, true, "#5");
696 void EqualNullableTest ()
701 Assert (d
== v2
, false, "#1");
702 Assert (d
== null, false, "#1a");
703 Assert (null == d
, false, "#1b");
706 Assert (d
== v2
, false, "#2");
707 dynamic d2
= (int?) -2;
708 Assert (d2
== 1, false, "#2a");
710 Assert (d2
== 44, true, "#2b");
713 MyType
? v3
= new MyType (30);
714 Assert (d
== v3
, true, "#3");
715 dynamic d3
= new MyType
? (new MyType (-7));
716 Assert (d3
== new MyType (6), false, "#3a");
717 Assert (d3
== null, false, "#3b");
721 Assert (d
== v4
, false, "#4");
723 Assert (d
== v4
, false, "#4a");
726 Assert (d
== true, true, "#5");
727 Assert (d
== null, false, "#5a");
728 Assert (d
== false, false, "#5b");
731 void EqualEnumTest ()
733 dynamic d
= MyEnum
.Value_1
;
735 Assert (d
== null, false, "#1");
737 Assert (d
== MyEnum
.Value_1
, true, "#2");
738 Assert (d
== 0, false, "#2a");
740 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
741 Assert (d2
== MyEnumUlong
.Value_2
, true, "#3");
742 Assert (d2
== null, false, "#3a");
745 void EqualStringTest ()
749 Assert (d
== "te", false, "#1");
750 Assert (d
== "text", true, "#1a");
751 Assert (d
== null, false, "#1b");
754 void EqualDelegateTest ()
758 // Assert (d == delegate { }, true, "#1");
760 EmptyDelegate b
= EqualDelegateTest
;
763 //Assert (d == EqualDelegateTest, true, "#2");
767 void EqualTestDelegate_2 ()
769 EmptyDelegate ed = delegate () {};
771 Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
772 AssertNodeType (e2, ExpressionType.Equal);
773 Assert (false, e2.Compile ().Invoke (delegate () {}, null));
774 Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
775 Assert (false, e2.Compile ().Invoke (ed, delegate {}));
776 Assert (true, e2.Compile ().Invoke (ed, ed));
780 void ExclusiveOrTest ()
785 Assert (d ^ v
, true, "#1");
786 Assert (d ^
true, false, "#1a");
790 Assert (d ^ v2
, 20, "#2");
791 Assert (d ^
0, 42, "#2a");
794 MyType v3
= new MyType (30);
795 Assert (d ^ v3
, new MyType (52), "#3");
796 dynamic d3
= new MyType (-7);
797 Assert
<MyType
> (d3 ^
new MyType (6), new MyType (-1), "#3a");
799 d3
= new MyTypeImplicitOnly (-7);
800 Assert (d3 ^
11, -14, "#3b");
803 void ExclusiveOrNullableTest ()
808 Assert
<int?> (d ^ v2
, null, "#1");
809 Assert
<int?> (d ^
null, null, "#1a");
810 Assert
<int?> (null ^ d
, null, "#1b");
813 Assert (d ^ v2
, -5, "#2");
814 dynamic d2
= (int?) -2;
815 Assert (d2 ^
1, -1, "#2a");
818 MyType
? v3
= new MyType (30);
819 Assert (d ^ v3
, new MyType (27), "#3");
820 dynamic d3
= new MyType
? (new MyType (-7));
821 Assert (d3 ^
new MyType (6), new MyType (-1), "#3a");
822 Assert
<MyType
?> (d3 ^
null, null, "#3b");
825 void ExclusiveOrTestEnum ()
827 dynamic d
= MyEnum
.Value_1
;
829 Assert
<MyEnum
?> (d ^
null, null, "#1");
831 Assert
<MyEnum
> (d ^ d
, 0, "#2");
833 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
834 Assert
<MyEnumUlong
> (d2 ^ MyEnumUlong
.Value_2
, (MyEnumUlong
) 3, "#3");
837 void ExclusiveOrAssignedTest ()
843 Assert (d
, true, "#1");
846 Assert (d
, false, "#1a");
851 Assert (d
, 20, "#2");
853 MyType v3
= new MyType (30);
854 dynamic d3
= new MyType (-7);
855 d3 ^
= new MyType (6);
856 Assert (d3
, new MyType (-1), "#3");
859 void ExclusiveOrAssignedTestEnum ()
861 dynamic d
= MyEnum
.Value_1
;
863 Assert
<MyEnum
>(d
, (MyEnum
) 3, "#1");
867 Assert
<MyEnum
> (d
, 0, "#2");
869 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
870 Assert (d2 ^ MyEnumUlong
.Value_2
, (MyEnumUlong
)3, "#3");
873 void GreaterThanTest ()
878 Assert (d
> v
, true, "#1");
880 Assert (d
> v2
, false, "#1a");
883 Assert (d
> 4.59, true, "#2");
885 Assert (d
> b2
, false, "#2a");
888 MyType v3
= new MyType (30);
889 Assert (d
> v3
, false, "#3");
890 dynamic d3
= new MyType (-7);
891 Assert (d3
> new MyType (6), false, "#3a");
893 d3
= new MyTypeImplicitOnly (-7);
894 Assert (d3
> 11, false, "#3b");
898 Assert (d
> v4
, false, "#4");
899 Assert (d
> 2m
, false, "#4a");
902 void GreaterThanNullableTest ()
907 Assert (d
> v2
, false, "#1");
908 Assert (d
> null, false, "#1a");
909 Assert (null > d
, false, "#1b");
912 Assert (d
> v2
, true, "#2");
913 dynamic d2
= (int?) -2;
914 Assert (d2
> 1, false, "#2a");
916 Assert (d2
> 44, false, "#2b");
919 MyType
? v3
= new MyType (30);
920 Assert (d
> v3
, false, "#3");
921 dynamic d3
= new MyType
? (new MyType (-7));
922 Assert (d3
> new MyType (6), false, "#3a");
923 Assert (d3
> null, false, "#3b");
927 Assert (d
> v4
, true, "#4");
929 Assert (d
> v4
, false, "#4a");
932 void GreaterThanEnumTest ()
934 dynamic d
= MyEnum
.Value_1
;
936 Assert (d
> null, false, "#1");
938 Assert (d
> MyEnum
.Value_1
, false, "#2");
939 Assert (d
> 0, true, "#2a");
941 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
942 Assert (d2
> MyEnumUlong
.Value_2
, false, "#3");
943 Assert (d2
> null, false, "#3a");
946 void GreaterThanEqualTest ()
951 Assert (d
>= v
, true, "#1");
953 Assert (d
>= v2
, true, "#1a");
956 Assert (d
>= 4.59, true, "#2");
958 Assert (d
>= b2
, true, "#2a");
961 MyType v3
= new MyType (30);
962 Assert (d
>= v3
, true, "#3");
963 dynamic d3
= new MyType (-7);
964 Assert (d3
>= new MyType (6), false, "#3a");
966 d3
= new MyTypeImplicitOnly (-7);
967 Assert (d3
>= 11, false, "#3b");
971 Assert (d
>= v4
, false, "#4");
972 Assert (d
>= 2m
, true, "#4a");
975 void GreaterThanEqualNullableTest ()
980 Assert (d
>= v2
, false, "#1");
981 Assert (d
>= null, false, "#1a");
982 Assert (null >= d
, false, "#1b");
985 Assert (d
>= v2
, true, "#2");
986 dynamic d2
= (int?) -2;
987 Assert (d2
>= 1, false, "#2a");
989 Assert (d2
>= 44, true, "#2b");
992 MyType
? v3
= new MyType (30);
993 Assert (d
>= v3
, true, "#3");
994 dynamic d3
= new MyType
? (new MyType (-7));
995 Assert (d3
>= new MyType (6), false, "#3a");
996 Assert (d3
>= null, false, "#3b");
1000 Assert (d
>= v4
, true, "#4");
1002 Assert (d
>= v4
, false, "#4a");
1005 void GreaterThanEqualEnumTest ()
1007 dynamic d
= MyEnum
.Value_1
;
1009 Assert (d
>= null, false, "#1");
1011 Assert (d
>= MyEnum
.Value_1
, true, "#2");
1012 Assert (d
>= 0, true, "#2a");
1014 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1015 Assert (d2
>= MyEnumUlong
.Value_2
, true, "#3");
1016 Assert (d2
>= null, false, "#3a");
1019 void LeftShiftTest ()
1021 dynamic d
= (ulong) 0x7F000;
1024 Assert
<ulong> (d
<< v
, 0x1FC000, "#1");
1025 Assert
<ulong> (d
<< 1, 0xFE000, "#1a");
1027 Assert
<ulong> (d
<< s
, 0x1FC000, "#1b");
1030 MyTypeImplicitOnly v3
= new MyTypeImplicitOnly (3);
1031 Assert (d
<< v3
, 0x3F8000, "#3");
1032 dynamic d3
= new MyType (-7);
1033 Assert (d3
<< new MyTypeImplicitOnly (6), -448, "#3a");
1034 Assert (d3
<< 11, -14336, "#3b");
1037 void LeftShiftNullableTest ()
1042 Assert
<int?> (d
<< v2
, null, "#1");
1044 Assert
<int?> (d
<< null, null, "#1a");
1046 Assert
<int?> (null << d
, null, "#1b");
1049 Assert (d
<< v2
, 0x40000000, "#2");
1050 dynamic d2
= (int?) -2;
1051 Assert (d2
<< 1, -4, "#2a");
1054 void LeftShiftAssignTest ()
1056 dynamic d
= 0x7F000;
1060 Assert (d
, 0x1FC000, "#1");
1062 Assert (d
, 0x3F8000, "#1a");
1065 Assert (d
, 0xFE0000, "#1b");
1068 void LeftShiftAssignNullableTest ()
1074 Assert (d
, 0x40000000, "#2");
1075 dynamic d2
= (int?) -2;
1077 Assert (d2
, -4, "#2a");
1080 void LessThanTest ()
1085 Assert (d
< v
, false, "#1");
1087 Assert (d
< v2
, false, "#1a");
1090 Assert (d
< 4.59, false, "#2");
1092 Assert (d
< b2
, false, "#2a");
1094 d
= new MyType (30);
1095 MyType v3
= new MyType (30);
1096 Assert (d
< v3
, false, "#3");
1097 dynamic d3
= new MyType (-7);
1098 Assert (d3
< new MyType (6), true, "#3a");
1100 d3
= new MyTypeImplicitOnly (-7);
1101 Assert (d3
< 11, true, "#3b");
1105 Assert (d
< v4
, true, "#4");
1106 Assert (d
< 2m
, false, "#4a");
1109 void LessThanNullableTest ()
1114 Assert (d
< v2
, false, "#1");
1115 Assert (d
< null, false, "#1a");
1116 Assert (null < d
, false, "#1b");
1119 Assert (d
< v2
, false, "#2");
1120 dynamic d2
= (int?) -2;
1121 Assert (d2
< 1, true, "#2a");
1123 Assert (d2
< 44, false, "#2b");
1125 d
= new MyType (30);
1126 MyType
? v3
= new MyType (30);
1127 Assert (d
< v3
, false, "#3");
1128 dynamic d3
= new MyType
? (new MyType (-7));
1129 Assert (d3
< new MyType (6), true, "#3a");
1131 d3
= new MyTypeImplicitOnly (-7);
1132 Assert (d3
< null, false, "#3b");
1136 Assert (d
< v4
, false, "#4");
1138 Assert (d
< v4
, false, "#4a");
1141 void LessThanEnumTest ()
1143 dynamic d
= MyEnum
.Value_1
;
1145 Assert (d
< null, false, "#1");
1147 Assert (d
< MyEnum
.Value_1
, false, "#2");
1148 Assert (d
< 0, false, "#2a");
1150 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1151 Assert (d2
< MyEnumUlong
.Value_2
, false, "#3");
1152 Assert (d2
< null, false, "#3a");
1155 void LessThanOrEqualTest ()
1160 Assert (d
<= v
, false, "#1");
1162 Assert (d
<= v2
, true, "#1a");
1165 Assert (d
<= 4.59, false, "#2");
1167 Assert (d
<= b2
, true, "#2a");
1169 d
= new MyType (30);
1170 MyType v3
= new MyType (30);
1171 Assert (d
<= v3
, true, "#3");
1172 dynamic d3
= new MyType (-7);
1173 Assert (d3
<= new MyType (6), true, "#3a");
1175 d3
= new MyTypeImplicitOnly (-7);
1176 Assert (d3
<= 11, true, "#3b");
1180 Assert (d
<= v4
, true, "#4");
1181 Assert (d
<= 2m
, true, "#4a");
1184 void LessThanOrEqualNullableTest ()
1189 Assert (d
<= v2
, false, "#1");
1190 Assert (d
<= null, false, "#1a");
1191 Assert (null <= d
, false, "#1b");
1194 Assert (d
<= v2
, false, "#2");
1195 dynamic d2
= (int?) -2;
1196 Assert (d2
<= 1, true, "#2a");
1198 Assert (d2
<= 44, true, "#2b");
1200 d
= new MyType (30);
1201 MyType
? v3
= new MyType (30);
1202 Assert (d
<= v3
, true, "#3");
1203 dynamic d3
= new MyType
? (new MyType (-7));
1204 Assert (d3
<= new MyType (6), true, "#3a");
1205 Assert (d3
<= null, false, "#3b");
1209 Assert (d
<= v4
, false, "#4");
1211 Assert (d
<= v4
, false, "#4a");
1214 void LessThanOrEqualEnumTest ()
1216 dynamic d
= MyEnum
.Value_1
;
1218 Assert (d
<= null, false, "#1");
1220 Assert (d
<= MyEnum
.Value_1
, true, "#2");
1221 Assert (d
<= 0, false, "#2a");
1223 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1224 Assert (d2
<= MyEnumUlong
.Value_2
, true, "#3");
1225 Assert (d2
<= null, false, "#3a");
1233 Assert (d
% v
, 1, "#1");
1236 MyType v3
= new MyType (30);
1237 Assert (d
% v3
, new MyType (5), "#3");
1238 dynamic d3
= new MyType (-7);
1239 Assert
<MyType
> (d3
% new MyType (6), new MyType (-1), "#3a");
1241 d
= new MyTypeImplicitOnly (5);
1243 Assert (d
% v4
, 1m
, "#4");
1246 void ModuloNullableTest ()
1251 Assert
<double?> (d
% v2
, null, "#1");
1252 Assert
<double?> (d
% null, null, "#1a");
1253 Assert
<double?> (null % d
, null, "#1b");
1256 Assert (d
% v2
, 1, "#2");
1257 dynamic d2
= (int?) -2;
1258 Assert (d2
% 1, 0, "#2a");
1260 d
= new MyType (-2);
1261 MyType
? v3
= new MyType (30);
1262 Assert (d
% v3
, new MyType (-2), "#3");
1263 dynamic d3
= new MyType
? (new MyType (-7));
1264 Assert (d3
% new MyType (6), new MyType (-1), "#3a");
1265 Assert
<MyType
?> (d3
+ null, null, "#3b");
1267 d
= new MyTypeImplicitOnly (5);
1269 Assert (d
% v4
, 1m
, "#4");
1271 Assert
<decimal?> (d
% v4
, null, "#4a");
1274 void ModuloAssignTest ()
1280 Assert (d
, 1, "#1");
1285 Assert (d
, 0, "#1a");
1287 Assert (d
, 0, "#1b");
1289 dynamic d3
= new MyType (-7);
1290 d3
%= new MyType (6);
1291 Assert
<MyType
> (d3
, new MyType (-1), "#3");
1296 Assert (d
, 1m
, "#4");
1299 void MultiplyTest ()
1304 Assert (d
* v
, 10, "#1");
1306 Assert (d
* v2
, 2.5, "#1a");
1309 MyType v3
= new MyType (30);
1310 Assert (d
* v3
, new MyType (150), "#3");
1311 dynamic d3
= new MyType (-7);
1312 Assert
<MyType
> (d3
* new MyType (6), new MyType (-42), "#3a");
1316 Assert (d
* v4
, 31.6m
, "#4");
1319 void MultiplyNullableTest ()
1324 Assert
<int?> (d
* v2
, null, "#1");
1325 Assert
<int?> (d
* null, null, "#1a");
1326 Assert
<int?> (null * d
, null, "#1b");
1329 Assert (d
* v2
, -10, "#2");
1330 dynamic d2
= (int?) -2;
1331 Assert (d2
* 1, -2, "#2a");
1334 MyType
? v3
= new MyType (30);
1335 Assert (d
* v3
, new MyType (150), "#3");
1336 dynamic d3
= new MyType
? (new MyType (-7));
1337 Assert (d3
* new MyType (6), new MyType (-42), "#3a");
1338 Assert
<MyType
?> (d3
* null, null, "#3b");
1340 d
= new MyTypeImplicitOnly (5);
1342 Assert (d
* v4
, 20m
, "#4");
1344 Assert
<decimal?> (d
* v4
, null, "#4a");
1347 void MultiplyCheckedTest ()
1352 int v
= int.MaxValue
;
1353 AssertChecked (() => d
* v
, 7, "#1");
1356 AssertChecked (() => d
* v2
, null, "#2");
1359 MyType v3
= new MyType (int.MaxValue
);
1360 Assert (d
* v3
, new MyType (-4), "#3");
1364 void MultiplyAssignTest ()
1370 Assert (d
, 10, "#1");
1375 Assert (d
, 2.5, "#1a");
1377 Assert (d
, 5, "#1b");
1379 dynamic d3
= new MyType (-7);
1380 d3
*= new MyType (6);
1381 Assert
<MyType
> (d3
, new MyType (-42), "#3");
1386 Assert (d
, 20m
, "#4");
1389 void MultiplyAssignCheckedTest ()
1394 int v
= int.MaxValue
;
1395 AssertChecked (() => { d *= v; Assert (d, 0, "#1-"); }
, "#1");
1397 d
= new MyType (44);
1398 MyType v3
= new MyType (int.MaxValue
);
1400 Assert (d
, new MyType (-44), "#3-");
1407 Assert (8, -d
, "#1");
1408 Assert (-8, -(-d
), "#1a");
1410 d
= new MyType (-14);
1411 Assert (new MyType (14), -d
, "#2");
1413 d
= new MyTypeImplicitOnly (4);
1414 Assert (-4, -d
, "#3");
1417 Assert (-7, -d
, "#4");
1419 d
= double.NegativeInfinity
;
1420 Assert (double.PositiveInfinity
, -d
, "#5");
1423 void NegateNullable ()
1425 dynamic d
= (int?) -8;
1426 Assert (8, -d
, "#1");
1427 Assert (-8, -(-d
), "#1a");
1429 MyType
? n1
= new MyType (4);
1431 Assert (new MyType (-4), -d
, "#2");
1433 MyTypeImplicitOnly
? n2
= new MyTypeImplicitOnly (4);
1435 Assert (-4, -d
, "#3");
1438 Assert (-7, -d
, "#4");
1441 void NegateChecked ()
1444 dynamic d
= int.MinValue
;
1445 AssertChecked (() => -d
, 0, "#1");
1452 Assert (false, !d
, "#1");
1454 var de
= new MyType (-1);
1455 Assert (false, !d
, "#2");
1458 void NotEqualTest ()
1463 Assert (d
!= v
, true, "#1");
1465 Assert (d
!= v2
, false, "#1a");
1468 Assert (d
!= false, true, "#2");
1470 Assert (d
!= b2
, false, "#2a");
1472 d
= new MyType (30);
1473 MyType v3
= new MyType (30);
1474 Assert (d
!= v3
, false, "#3");
1475 dynamic d3
= new MyType (-7);
1476 Assert (d3
!= new MyType (6), true, "#3a");
1480 Assert (d
!= v4
, true, "#4");
1481 Assert (d
!= 2m
, false, "#4a");
1484 Assert (d
!= null, false, "#5");
1487 void NotEqualNullableTest ()
1492 Assert (d
!= v2
, true, "#1");
1493 Assert (d
!= null, true, "#1a");
1494 Assert (null != d
, true, "#1b");
1497 Assert (d
!= v2
, true, "#2");
1498 dynamic d2
= (int?) -2;
1499 Assert (d2
!= 1, true, "#2a");
1501 Assert (d2
!= 44, false, "#2b");
1503 d
= new MyType (30);
1504 MyType
? v3
= new MyType (30);
1505 Assert (d
!= v3
, false, "#3");
1506 dynamic d3
= new MyType
? (new MyType (-7));
1507 Assert (d3
!= new MyType (6), true, "#3a");
1508 Assert (d3
!= null, true, "#3b");
1512 Assert (d
!= v4
, true, "#4");
1514 Assert (d
!= v4
, true, "#4a");
1517 Assert (d
!= true, false, "#5");
1518 Assert (d
!= null, true, "#5a");
1519 Assert (d
!= false, true, "#5b");
1522 void NotEqualEnumTest ()
1524 dynamic d
= MyEnum
.Value_1
;
1526 Assert (d
!= null, true, "#1");
1528 Assert (d
!= MyEnum
.Value_1
, false, "#2");
1529 Assert (d
!= 0, true, "#2a");
1531 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1532 Assert (d2
!= MyEnumUlong
.Value_2
, false, "#3");
1533 Assert (d2
!= null, true, "#3a");
1536 void NotEqualStringTest ()
1540 Assert (d
!= "te", true, "#1");
1541 Assert (d
!= "text", false, "#1a");
1542 Assert (d
!= null, true, "#1b");
1545 void OnesComplement ()
1548 Assert (-8, ~d
, "#1");
1550 d
= new MyType (-1);
1551 Assert (0, ~d
, "#2");
1554 Assert (18446744073709551608, ~d
, "#3");
1557 Assert ((MyEnum
) 254, ~d
, "#4");
1560 void OnesComplementNullable ()
1562 dynamic d
= (int?) 7;
1563 Assert (-8, ~d
, "#1");
1565 d
= (MyEnum
?) MyEnum
.Value_1
;
1566 Assert ((MyEnum
) 254, ~d
, "#4");
1574 Assert (d
| v
, true, "#1");
1575 Assert (d
| false, true, "#1a");
1579 Assert (d
| v2
, 62, "#2");
1580 Assert (d
| 0, 42, "#2a");
1582 d
= new MyType (42);
1583 MyType v3
= new MyType (30);
1584 Assert (d
| v3
, new MyType (62), "#3");
1585 dynamic d3
= new MyType (-7);
1586 Assert
<MyType
> (d3
| new MyType (6), new MyType (-1), "#3a");
1588 d3
= new MyTypeImplicitOnly (-7);
1589 Assert (d3
| 11, -5, "#3b");
1594 dynamic d
= MyEnum
.Value_1
;
1596 Assert
<MyEnum
?> (d
| null, null, "#1");
1598 Assert (d
| d
, MyEnum
.Value_1
, "#2");
1600 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
1601 Assert
<MyEnumUlong
> (d2
| MyEnumUlong
.Value_2
, (MyEnumUlong
) 3, "#3");
1604 void OrTestNullable ()
1609 Assert
<int?> (d
| v2
, null, "#1");
1610 Assert
<int?> (d
| null, null, "#1a");
1611 Assert
<int?> (null | d
, null, "#1b");
1614 Assert (d
| v2
, -1, "#2");
1615 dynamic d2
= (int?) -2;
1616 Assert (d2
| 1, -1, "#2a");
1618 d
= new MyType (-2);
1619 MyType
? v3
= new MyType (30);
1620 Assert (d
| v3
, new MyType (-2), "#3");
1621 dynamic d3
= new MyType
? (new MyType (-7));
1622 Assert (d3
| new MyType (6), new MyType (-1), "#3a");
1625 void OrAssignedTest ()
1631 Assert (d
, true, "#1");
1634 Assert (d
, true, "#1a");
1639 Assert (d
, 62, "#2");
1641 MyType v3
= new MyType (30);
1642 dynamic d3
= new MyType (-7);
1643 d3
|= new MyType (6);
1644 Assert
<MyType
> (d3
, new MyType (-1), "#3");
1647 void OrAssignedTestEnum ()
1649 dynamic d
= MyEnum
.Value_1
;
1650 d
|= MyEnum
.Value_2
;
1651 Assert
<MyEnum
> (d
, (MyEnum
) 3, "#1");
1655 Assert (d
, MyEnum
.Value_2
, "#2");
1657 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
1658 Assert
<MyEnumUlong
> (d2
| MyEnumUlong
.Value_2
, (MyEnumUlong
)3, "#3");
1666 Assert
<bool> (d
|| v
, true, "#1");
1668 Assert (d
|| true, true, "#1a");
1671 Assert (d
|| d
, true, "#2");
1673 dynamic d3
= new MyType (-7);
1674 Assert
<MyType
> (d3
|| new MyType (6), new MyType (-7), "#3");
1676 d3
= new MyTypeImplicitOnly (-7);
1677 Assert (d3
|| 11, -7, "#3b");
1680 void RightShiftTest ()
1682 dynamic d
= (ulong) 0x7F000;
1685 Assert
<ulong> (d
>> v
, 0x1FC00, "#1");
1686 Assert
<ulong> (d
>> 1, 0x3F800, "#1a");
1688 Assert
<ulong> (d
>> s
, 0x1FC00, "#1b");
1691 MyTypeImplicitOnly v3
= new MyTypeImplicitOnly (3);
1692 Assert (d
>> v3
, 0xFE00, "#3");
1693 dynamic d3
= new MyType (-7);
1694 Assert (d3
>> new MyTypeImplicitOnly (11), -1, "#3a");
1697 void RightShiftNullableTest ()
1702 Assert
<int?> (d
>> v2
, null, "#1");
1704 Assert
<int?> (d
>> null, null, "#1a");
1706 Assert
<int?> (null >> d
, null, "#1b");
1709 Assert (d
>> v2
, 0, "#2");
1710 dynamic d2
= (int?) -200;
1711 Assert (d2
>> 1, -100, "#2a");
1714 void RightShiftAssignTest ()
1716 dynamic d
= 0x7F000;
1720 Assert (d
, 0x1FC00, "#1");
1722 Assert (d
, 0xFE00, "#1a");
1725 Assert (d
, 0x3F80, "#1b");
1728 void RightShiftAssignNullableTest ()
1734 Assert (d
, 0, "#2");
1735 dynamic d2
= (int?) -2;
1737 Assert (d2
, -1, "#2a");
1740 void SubtractTest ()
1745 Assert (d
- v
, 3, "#1");
1747 Assert (d
- v2
, 4.5, "#1a");
1750 MyType v3
= new MyType (30);
1751 Assert (d
- v3
, new MyType (-25), "#3");
1752 dynamic d3
= new MyType (-7);
1753 Assert (d3
- new MyType (6), new MyType (-13), "#3a");
1755 d
= new MyTypeImplicitOnly (5);
1757 Assert (d
- v4
, 1m
, "#4");
1760 void SubtractNullableTest ()
1765 Assert
<int?> (d
- v2
, null, "#1");
1766 Assert
<int?> (d
- null, null, "#1a");
1767 Assert
<int?> (null - d
, null, "#1b");
1770 Assert (d
- v2
, 7, "#2");
1771 dynamic d2
= (int?) -2;
1772 Assert (d2
- 1, -3, "#2a");
1775 MyType
? v3
= new MyType (30);
1776 Assert (d
- v3
, new MyType (-25), "#3");
1777 dynamic d3
= new MyType
? (new MyType (-7));
1778 Assert (d3
- new MyType (6), new MyType (-13), "#3a");
1779 Assert
<MyType
?> (d3
- null, null, "#3b");
1781 d
= new MyTypeImplicitOnly (5);
1783 Assert (d
- v4
, 1m
, "#4");
1785 Assert
<decimal?> (d
- v4
, null, "#4a");
1788 void SubtractEnumTest ()
1790 dynamic d
= MyEnum
.Value_1
;
1792 // CSC: Invalid System.InvalidOperationException
1793 Assert (d
- null, null, "#1");
1795 Assert (d
- 1, MyEnum
.Value_2
, "#2");
1797 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
1798 Assert (d2
- (byte) 1, MyEnumUlong
.Value_2
, "#3");
1799 Assert
<MyEnumUlong
?> (d2
- (object) null, null, "#3a");
1802 void SubtractCheckedTest ()
1807 int v
= int.MinValue
;
1808 AssertChecked (() => d
- v
, 7, "#1");
1811 AssertChecked (() => d
- v2
, null, "#2");
1814 MyType v3
= new MyType (int.MinValue
);
1815 Assert (d
- v3
, new MyType (-2147483643), "#3");
1819 void SubtractAssignTest ()
1825 Assert (d
, 3, "#1");
1830 Assert (d
, 4.5, "#1a");
1832 Assert (d
, 2.5, "#1b");
1834 dynamic d3
= new MyType (-7);
1835 d3
-= new MyType (6);
1836 Assert
<MyType
> (d3
, new MyType (-13), "#3");
1841 Assert (d
, 1m
, "#4");
1844 void SubtractAssignEnumTest ()
1846 dynamic d
= MyEnum
.Value_1
;
1849 Assert
<MyEnum
> (d
, 0, "#2");
1851 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1853 Assert (d2
, MyEnumUlong
.Value_1
, "#3");
1856 void SubtractAssignCheckedTest ()
1861 int v
= int.MinValue
;
1862 AssertChecked (() => { d -= v; Assert (d, 0, "#1a"); }
, "#1");
1865 MyType v3
= new MyType (int.MinValue
);
1867 Assert (d
, new MyType (-2147483643), "#3a");
1872 void SubtractAssignmentEvent ()
1877 void UnaryDecrement ()
1880 Assert (3, d
--, "#1");
1881 Assert (2, d
, "#1a");
1884 Assert (2, --d
, "#2");
1885 Assert (2, d
, "#2a");
1887 d
= new MyType (-3);
1888 Assert (new MyType (-3), d
--, "#3");
1889 Assert (new MyType (-1), d
, "#3a");
1892 void UnaryDecrementCheckedTest ()
1895 dynamic d
= int.MinValue
;
1897 AssertChecked (() => { d--; Assert (d, -1073741824, "#1a"); }
, "#1");
1899 d
= new MyType (int.MinValue
);
1901 Assert (d
, new MyType (-1073741824), "#2");
1905 void UnaryIncrement ()
1908 Assert (3, d
++, "#1");
1909 Assert (4, d
, "#1a");
1912 Assert (4, ++d
, "#2");
1913 Assert (4, d
, "#2a");
1915 d
= new MyType (-3);
1916 Assert (new MyType (-3), d
++, "#3");
1917 Assert (new MyType (-6), d
, "#3a");
1920 void UnaryIncrementCheckedTest ()
1923 dynamic d
= int.MaxValue
;
1925 AssertChecked (() => { d++; Assert (d, 0, "#1a"); }
, "#1");
1927 d
= new MyType (int.MaxValue
);
1929 Assert (d
, new MyType (-2), "#2");
1933 //void UnaryIsFalse ()
1935 // dynamic d = this;
1936 // object r = d == null;
1937 // Assert (false, (bool) r, "#1");
1938 // Assert<object> (true, d != null, "#1a");
1944 Assert (3, d
? 3 : 5, "#1");
1947 Assert (false, d
< 1, "#2");
1949 d
= new InverseLogicalOperator (true);
1950 Assert (1, d
? 1 : -1, "#3");
1956 Assert (-8, +d
, "#1");
1957 Assert (-8, +(+d
), "#1a");
1959 d
= new MyType (14);
1960 Assert (new MyType (334455), +d
, "#2");
1962 d
= new MyTypeImplicitOnly (4);
1963 Assert (4, +d
, "#3");
1966 Assert
<uint> (7, +d
, "#4");
1969 void UnaryPlusNullable ()
1971 dynamic d
= (int?) -8;
1972 Assert (-8, +d
, "#1");
1973 Assert (-8, +(+d
), "#1a");
1975 MyType
? n1
= new MyType (4);
1977 Assert (new MyType (334455), +d
, "#2");
1979 MyTypeImplicitOnly
? n2
= new MyTypeImplicitOnly (4);
1981 Assert (4, +d
, "#3");
1984 Assert (7, +d
, "#4");
1987 #pragma warning restore 169
1989 static bool RunTest (MethodInfo test
)
1991 Console
.Write ("Running test {0, -25}", test
.Name
);
1993 test
.Invoke (new Tester (), null);
1994 Console
.WriteLine ("OK");
1996 } catch (Exception e
) {
1997 Console
.WriteLine ("FAILED");
1998 Console
.WriteLine (e
.InnerException
.Message
);
2003 public static int Main ()
2005 var tests
= from test
in typeof (Tester
).GetMethods (BindingFlags
.Instance
| BindingFlags
.NonPublic
| BindingFlags
.DeclaredOnly
)
2006 where test
.GetParameters ().Length
== 0
2008 select RunTest (test
);
2010 int failures
= tests
.Count (a
=> !a
);
2011 Console
.WriteLine (failures
+ " tests failed");