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
)
28 // TODO: Create a clone which uses +(MyType, int) pattern and an implicit conversion
29 // is required to do the user-conversion
35 public MyType (int value) : this ()
40 public short ShortProp { get; set; }
42 public override int GetHashCode ()
44 throw new NotImplementedException ();
47 public static implicit operator int (MyType o
)
52 public static bool operator true (MyType a
)
57 public static bool operator false (MyType a
)
62 public static MyType
operator + (MyType a
, MyType b
)
64 return new MyType (a
.value + b
.value);
67 public static MyType
operator - (MyType a
, MyType b
)
69 return new MyType (a
.value - b
.value);
72 public static MyType
operator / (MyType a
, MyType b
)
74 return new MyType (a
.value / b
.value);
77 public static MyType
operator * (MyType a
, MyType b
)
79 return new MyType (a
.value * b
.value);
82 public static MyType
operator % (MyType a
, MyType b
)
84 return new MyType (a
.value % b
.value);
87 public static MyType
operator &(MyType a
, MyType b
)
89 return new MyType (a
.value & b
.value);
92 public static MyType
operator | (MyType a
, MyType b
)
94 return new MyType (a
.value | b
.value);
97 public static MyType
operator ^
(MyType a
, MyType b
)
99 return new MyType (a
.value ^ b
.value);
102 public static bool operator == (MyType a
, MyType b
)
104 return a
.value == b
.value;
107 public static bool operator != (MyType a
, MyType b
)
109 return a
.value != b
.value;
112 public static bool operator > (MyType a
, MyType b
)
114 return a
.value > b
.value;
117 public static bool operator < (MyType a
, MyType b
)
119 return a
.value < b
.value;
122 public static bool operator >= (MyType a
, MyType b
)
124 return a
.value >= b
.value;
127 public static bool operator <= (MyType a
, MyType b
)
129 return a
.value <= b
.value;
132 public static bool operator ! (MyType a
)
137 public static int operator >> (MyType a
, int b
)
142 public static int operator << (MyType a
, int b
)
147 public static MyType
operator - (MyType a
)
149 return new MyType (-a
.value);
152 public static MyType
operator + (MyType a
)
154 return new MyType (+a
.value);
157 public override string ToString ()
159 return value.ToString ();
168 public MyTypeExplicit (int value)
173 public static explicit operator int (MyTypeExplicit m
)
179 struct MyTypeImplicitOnly
183 public MyTypeImplicitOnly (short b
)
188 public static implicit operator short (MyTypeImplicitOnly m
)
200 enum MyEnumUlong
: ulong
209 delegate void EmptyDelegate ();
210 delegate int IntDelegate ();
212 static void Assert
<T
> (T expected
, T
value, string name
)
214 if (!EqualityComparer
<T
>.Default
.Equals (expected
, value)) {
216 throw new ApplicationException (name
+ expected
+ " != " + value);
220 static void AssertChecked
<T
> (Func
<T
> expected
, T
value, string name
)
223 Assert (expected (), value, name
);
224 throw new ApplicationException (name
+ ": OverflowException expected");
225 } catch (OverflowException
) {
230 static void AssertChecked (Action expected
, string name
)
234 throw new ApplicationException (name
+ ": OverflowException expected");
235 } catch (OverflowException
) {
240 #pragma warning disable 169
247 Assert (d
+ v
, 7, "#1");
249 Assert (d
+ v2
, 5.5, "#1a");
251 MyType v3
= new MyType (30);
252 Assert (d
+ v3
, new MyType (35), "#3");
253 dynamic d3
= new MyType (-7);
254 Assert
<MyType
> (d3
+ new MyType (6), new MyType (-1), "#3a");
255 Assert (d3
+ 11, 4, "#3b");
258 Assert (d
+ v4
, 9m
, "#4");
261 void AddNullableTest ()
266 Assert
<int?> (d
+ v2
, null, "#1");
267 Assert
<int?> (d
+ null, null, "#1a");
268 Assert
<int?> (null + d
, null, "#1b");
271 Assert (d
+ v2
, 3, "#2");
272 dynamic d2
= (int?) -2;
273 Assert (d2
+ 1, -1, "#2a");
275 MyType
? v3
= new MyType (30);
276 Assert (d
+ v3
, new MyType (35), "#3");
277 dynamic d3
= new MyType
? (new MyType (-7));
278 Assert (d3
+ new MyType (6), new MyType (-1), "#3a");
279 Assert
<MyType
?> (d3
+ null, null, "#3b");
282 Assert (d
+ v4
, 9m
, "#4");
284 Assert
<decimal?> (d
+ v4
, null, "#4a");
289 dynamic d
= MyEnum
.Value_1
;
291 // CSC: Invalid System.InvalidOperationException
292 Assert (d
+ null, null, "#1");
294 Assert (d
+ 1, MyEnum
.Value_2
, "#2");
296 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
297 Assert (d2
+ (byte) 1, MyEnumUlong
.Value_2
, "#3");
298 Assert
<MyEnumUlong
?> (d2
+ (object) null, null, "#3a");
301 void AddCheckedTest ()
306 int v
= int.MaxValue
;
307 AssertChecked (() => d
+ v
, 7, "#1");
310 AssertChecked (() => d
+ v2
, null, "#2");
312 MyType v3
= new MyType (int.MaxValue
);
313 AssertChecked (() => d
+ v3
, new MyType (35), "#3");
317 void AddStringTest ()
321 Assert (d
+ v
, "foo->", "#1");
322 Assert (d
+ 1, "foo1", "#1a");
323 Assert (d
+ null, "foo", "#1b");
324 Assert (d
+ 1 + v
, "foo1->", "#1a");
327 Assert (d
+ v2
, "foo4", "#2");
330 void AddAssignTest ()
341 Assert (d
, 5.5, "#1a");
343 Assert (d
, 7.5, "#1b");
345 dynamic d3
= new MyType (-7);
346 d3
+= new MyType (6);
347 Assert
<MyType
> (d3
, new MyType (-1), "#3");
352 Assert (d
, 9m
, "#4");
355 void AddAssignNullableTest ()
357 dynamic d
= (int?) 5;
360 // For now it's impossible to use nullable compound assignment
361 // due to the way how DLR works. GetType () on nullable object returns
362 // underlying type and not nullable type, that means that
363 // C# binder is initialized with wrong operand type and any operation
368 Assert<int?> (d, null, "#1");
370 Assert<int?> (d, null, "#1a");
379 Assert (d, -1, "#2a");
381 MyType? v3 = new MyType (30);
383 Assert (d, new MyType (35), "#3");
384 dynamic d3 = new MyType? (new MyType (-7));
385 Assert (d3 + new MyType (6), new MyType (-1), "#3a");
386 Assert<MyType?> (d3 + null, null, "#3b");
391 Assert (d, 9m, "#4");
393 Assert<decimal?> (d, null, "#4a");
397 void AddAssignEnumTest ()
399 dynamic d
= MyEnum
.Value_1
;
403 Assert (d
, MyEnum
.Value_2
, "#2");
405 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
407 Assert (d2
, MyEnumUlong
.Value_2
, "#3");
410 void AddAssignCheckedTest ()
415 int v
= int.MaxValue
;
416 AssertChecked (() => { d += v; Assert (d, 0, "#1-"); }
, "#1");
418 MyType v3
= new MyType (int.MaxValue
);
419 AssertChecked (() => { d += v3; Assert (d, 0, "#3-"); }
, "#3");
423 void AddAssignStringTest ()
428 Assert (d
, "foo->", "#1");
432 Assert (d
, "foo1", "#1a");
435 Assert (d
, "foo1", "#1b");
440 Assert (d
, "foo4", "#2");
444 void AddAssignmentEvent ()
454 Assert (d
& v
, false, "#1");
455 Assert (d
& true, true, "#1a");
459 Assert (d
& v2
, 42, "#2");
460 Assert (d
& 0, 0, "#2a");
462 MyType v3
= new MyType (30);
463 Assert (d
& v3
, new MyType (10), "#3");
464 dynamic d3
= new MyType (-7);
465 Assert
<MyType
> (d3
& new MyType (6), new MyType (0), "#3a");
466 Assert (d3
& 11, 9, "#3b");
471 dynamic d
= MyEnum
.Value_1
;
473 Assert
<MyEnum
?> (d
& null, null, "#1");
475 Assert (d
& d
, MyEnum
.Value_1
, "#2");
477 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
478 Assert
<MyEnumUlong
> (d2
& MyEnumUlong
.Value_2
, 0, "#3");
481 void AndTestNullable ()
486 Assert
<int?> (d
& v2
, null, "#1");
487 Assert
<int?> (d
& null, null, "#1a");
488 Assert
<int?> (null & d
, null, "#1b");
491 Assert (d
& v2
, 4, "#2");
492 dynamic d2
= (int?) -2;
493 Assert (d2
& 1, 0, "#2a");
495 MyType
? v3
= new MyType (30);
496 Assert (d
& v3
, new MyType (4), "#3");
497 dynamic d3
= new MyType
? (new MyType (-7));
498 Assert (d3
& new MyType (6), new MyType (0), "#3a");
499 Assert
<MyType
?> (d3
+ null, null, "#3b");
502 void AndAssignedTest ()
508 Assert (d
, false, "#1");
511 Assert (d
, true, "#1a");
516 Assert (d
, 42, "#2");
518 MyType v3
= new MyType (30);
519 dynamic d3
= new MyType (-7);
520 d3
&= new MyType (6);
521 Assert
<MyType
> (d3
, new MyType (0), "#3");
524 void AndAssignedTestEnum ()
526 dynamic d
= MyEnum
.Value_1
;
528 Assert
<MyEnum
>(d
, 0, "#1");
532 Assert (d
, MyEnum
.Value_2
, "#2");
534 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
535 Assert
<MyEnumUlong
> (d2
& MyEnumUlong
.Value_2
, 0, "#3");
543 Assert
<bool> (d
&& v
, false, "#1");
545 Assert (d
&& true, true, "#1a");
548 Assert (d
&& d
, true, "#2");
550 dynamic d3
= new MyType (-7);
551 Assert
<MyType
> (d3
&& new MyType (6), new MyType (0), "#3");
553 // This should not compile
554 Assert (d3
&& 11, 9, "#3b");
562 Assert (d
/ v
, 2, "#1");
564 MyType v3
= new MyType (30);
565 Assert (d
/ v3
, new MyType (0), "#3");
566 dynamic d3
= new MyType (-7);
567 Assert
<MyType
> (d3
+ new MyType (6), new MyType (-1), "#3a");
568 Assert (d3
/ 11, 0, "#3b");
571 Assert (d
/ v4
, 1.25m
, "#4");
574 void DivideNullableTest ()
579 Assert
<double?> (d
/ v2
, null, "#1");
580 Assert
<double?> (d
/ null, null, "#1a");
581 Assert
<double?> (null / d
, null, "#1b");
584 Assert (d
/ v2
, -2.5, "#2");
585 dynamic d2
= (int?) -2;
586 Assert (d2
/ 1, -2, "#2a");
588 MyType
? v3
= new MyType (30);
589 Assert (d
/ v3
, new MyType (0), "#3");
590 dynamic d3
= new MyType
? (new MyType (-7));
591 Assert (d3
/ new MyType (6), new MyType (-1), "#3a");
592 Assert
<MyType
?> (d3
+ null, null, "#3b");
595 Assert (d
/ v4
, 1.25m
, "#4");
597 Assert
<decimal?> (d
/ v4
, null, "#4a");
600 void DivideCheckedTest ()
607 void DivideAssignTest ()
618 Assert (d
, 10, "#1a");
620 Assert (d
, 5, "#1b");
622 dynamic d3
= new MyType (-7);
623 d3
/= new MyType (6);
624 Assert
<MyType
> (d3
, new MyType (-1), "#3");
629 Assert (d
, 1.25m
, "#4");
632 void DivideAssignCheckedTest ()
644 Assert (d
== v
, false, "#1");
646 Assert (d
== v2
, true, "#1a");
649 Assert (d
== false, false, "#2");
651 Assert (d
== b2
, true, "#2a");
654 MyType v3
= new MyType (30);
655 Assert (d
== v3
, true, "#3");
656 dynamic d3
= new MyType (-7);
657 Assert (d3
== new MyType (6), false, "#3a");
658 Assert (d3
== 11, false, "#3b");
662 Assert (d
== v4
, false, "#4");
663 Assert (d
== 2m
, true, "#4a");
666 Assert (d
== null, true, "#5");
669 void EqualNullableTest ()
674 Assert (d
== v2
, false, "#1");
675 Assert (d
== null, false, "#1a");
676 Assert (null == d
, false, "#1b");
679 Assert (d
== v2
, false, "#2");
680 dynamic d2
= (int?) -2;
681 Assert (d2
== 1, false, "#2a");
683 Assert (d2
== 44, true, "#2b");
686 MyType
? v3
= new MyType (30);
687 Assert (d
== v3
, true, "#3");
688 dynamic d3
= new MyType
? (new MyType (-7));
689 Assert (d3
== new MyType (6), false, "#3a");
690 Assert (d3
== null, false, "#3b");
694 Assert (d
== v4
, false, "#4");
696 Assert (d
== v4
, false, "#4a");
699 Assert (d
== true, true, "#5");
700 Assert (d
== null, false, "#5a");
701 Assert (d
== false, false, "#5b");
704 void EqualEnumTest ()
706 dynamic d
= MyEnum
.Value_1
;
708 Assert (d
== null, false, "#1");
710 Assert (d
== MyEnum
.Value_1
, true, "#2");
711 Assert (d
== 0, false, "#2a");
713 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
714 Assert (d2
== MyEnumUlong
.Value_2
, true, "#3");
715 Assert (d2
== null, false, "#3a");
718 void EqualStringTest ()
722 Assert (d
== "te", false, "#1");
723 Assert (d
== "text", true, "#1a");
724 Assert (d
== null, false, "#1b");
727 void EqualDelegateTest ()
731 // Assert (d == delegate { }, true, "#1");
733 EmptyDelegate b
= EqualDelegateTest
;
736 //Assert (d == EqualDelegateTest, true, "#2");
740 void EqualTestDelegate_2 ()
742 EmptyDelegate ed = delegate () {};
744 Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
745 AssertNodeType (e2, ExpressionType.Equal);
746 Assert (false, e2.Compile ().Invoke (delegate () {}, null));
747 Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
748 Assert (false, e2.Compile ().Invoke (ed, delegate {}));
749 Assert (true, e2.Compile ().Invoke (ed, ed));
753 void ExclusiveOrTest ()
758 Assert (d ^ v
, true, "#1");
759 Assert (d ^
true, false, "#1a");
763 Assert (d ^ v2
, 20, "#2");
764 Assert (d ^
0, 42, "#2a");
766 MyType v3
= new MyType (30);
767 Assert (d ^ v3
, new MyType (52), "#3");
768 dynamic d3
= new MyType (-7);
769 Assert
<MyType
> (d3 ^
new MyType (6), new MyType (-1), "#3a");
770 Assert (d3 ^
11, -14, "#3b");
773 void ExclusiveOrNullableTest ()
778 Assert
<int?> (d ^ v2
, null, "#1");
779 Assert
<int?> (d ^
null, null, "#1a");
780 Assert
<int?> (null ^ d
, null, "#1b");
783 Assert (d ^ v2
, -5, "#2");
784 dynamic d2
= (int?) -2;
785 Assert (d2 ^
1, -1, "#2a");
787 MyType
? v3
= new MyType (30);
788 Assert (d ^ v3
, new MyType (27), "#3");
789 dynamic d3
= new MyType
? (new MyType (-7));
790 Assert (d3 ^
new MyType (6), new MyType (-1), "#3a");
791 Assert
<MyType
?> (d3 ^
null, null, "#3b");
794 void ExclusiveOrTestEnum ()
796 dynamic d
= MyEnum
.Value_1
;
798 Assert
<MyEnum
?> (d ^
null, null, "#1");
800 Assert
<MyEnum
> (d ^ d
, 0, "#2");
802 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
803 Assert
<MyEnumUlong
> (d2 ^ MyEnumUlong
.Value_2
, (MyEnumUlong
) 3, "#3");
806 void ExclusiveOrAssignedTest ()
812 Assert (d
, true, "#1");
815 Assert (d
, false, "#1a");
820 Assert (d
, 20, "#2");
822 MyType v3
= new MyType (30);
823 dynamic d3
= new MyType (-7);
824 d3 ^
= new MyType (6);
825 Assert (d3
, new MyType (-1), "#3");
828 void ExclusiveOrAssignedTestEnum ()
830 dynamic d
= MyEnum
.Value_1
;
832 Assert
<MyEnum
>(d
, (MyEnum
) 3, "#1");
836 Assert
<MyEnum
> (d
, 0, "#2");
838 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
839 Assert (d2 ^ MyEnumUlong
.Value_2
, (MyEnumUlong
)3, "#3");
842 void GreaterThanTest ()
847 Assert (d
> v
, true, "#1");
849 Assert (d
> v2
, false, "#1a");
852 Assert (d
> 4.59, true, "#2");
854 Assert (d
> b2
, false, "#2a");
857 MyType v3
= new MyType (30);
858 Assert (d
> v3
, false, "#3");
859 dynamic d3
= new MyType (-7);
860 Assert (d3
> new MyType (6), false, "#3a");
861 Assert (d3
> 11, false, "#3b");
865 Assert (d
> v4
, false, "#4");
866 Assert (d
> 2m
, false, "#4a");
869 void GreaterThanNullableTest ()
874 Assert (d
> v2
, false, "#1");
875 Assert (d
> null, false, "#1a");
876 Assert (null > d
, false, "#1b");
879 Assert (d
> v2
, true, "#2");
880 dynamic d2
= (int?) -2;
881 Assert (d2
> 1, false, "#2a");
883 Assert (d2
> 44, false, "#2b");
886 MyType
? v3
= new MyType (30);
887 Assert (d
> v3
, false, "#3");
888 dynamic d3
= new MyType
? (new MyType (-7));
889 Assert (d3
> new MyType (6), false, "#3a");
890 Assert (d3
> null, false, "#3b");
894 Assert (d
> v4
, true, "#4");
896 Assert (d
> v4
, false, "#4a");
899 void GreaterThanEnumTest ()
901 dynamic d
= MyEnum
.Value_1
;
903 Assert (d
> null, false, "#1");
905 Assert (d
> MyEnum
.Value_1
, false, "#2");
906 Assert (d
> 0, true, "#2a");
908 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
909 Assert (d2
> MyEnumUlong
.Value_2
, false, "#3");
910 Assert (d2
> null, false, "#3a");
913 void GreaterThanEqualTest ()
918 Assert (d
>= v
, true, "#1");
920 Assert (d
>= v2
, true, "#1a");
923 Assert (d
>= 4.59, true, "#2");
925 Assert (d
>= b2
, true, "#2a");
928 MyType v3
= new MyType (30);
929 Assert (d
>= v3
, true, "#3");
930 dynamic d3
= new MyType (-7);
931 Assert (d3
>= new MyType (6), false, "#3a");
932 Assert (d3
>= 11, false, "#3b");
936 Assert (d
>= v4
, false, "#4");
937 Assert (d
>= 2m
, true, "#4a");
940 void GreaterThanEqualNullableTest ()
945 Assert (d
>= v2
, false, "#1");
946 Assert (d
>= null, false, "#1a");
947 Assert (null >= d
, false, "#1b");
950 Assert (d
>= v2
, true, "#2");
951 dynamic d2
= (int?) -2;
952 Assert (d2
>= 1, false, "#2a");
954 Assert (d2
>= 44, true, "#2b");
957 MyType
? v3
= new MyType (30);
958 Assert (d
>= v3
, true, "#3");
959 dynamic d3
= new MyType
? (new MyType (-7));
960 Assert (d3
>= new MyType (6), false, "#3a");
961 Assert (d3
>= null, false, "#3b");
965 Assert (d
>= v4
, true, "#4");
967 Assert (d
>= v4
, false, "#4a");
970 void GreaterThanEqualEnumTest ()
972 dynamic d
= MyEnum
.Value_1
;
974 Assert (d
>= null, false, "#1");
976 Assert (d
>= MyEnum
.Value_1
, true, "#2");
977 Assert (d
>= 0, true, "#2a");
979 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
980 Assert (d2
>= MyEnumUlong
.Value_2
, true, "#3");
981 Assert (d2
>= null, false, "#3a");
984 void LeftShiftTest ()
986 dynamic d
= (ulong) 0x7F000;
989 Assert
<ulong> (d
<< v
, 0x1FC000, "#1");
990 Assert
<ulong> (d
<< 1, 0xFE000, "#1a");
992 Assert
<ulong> (d
<< s
, 0x1FC000, "#1b");
995 MyType v3
= new MyType (3);
996 Assert (d
<< v3
, new MyType (0x3F8000), "#3");
997 dynamic d3
= new MyType (-7);
998 Assert (d3
<< new MyType (6), new MyType (-448), "#3a");
999 Assert (d3
<< 11, -14336, "#3b");
1002 void LeftShiftNullableTest ()
1007 Assert
<int?> (d
<< v2
, null, "#1");
1009 Assert
<int?> (d
<< null, null, "#1a");
1011 Assert
<int?> (null << d
, null, "#1b");
1014 Assert (d
<< v2
, 0x40000000, "#2");
1015 dynamic d2
= (int?) -2;
1016 Assert (d2
<< 1, -4, "#2a");
1019 MyType
? v3
= new MyType (30);
1020 Assert (d
<< v3
, new MyType (-1073741824), "#3");
1021 dynamic d3
= new MyType
? (new MyType (-7));
1022 Assert (d3
<< new MyType (6), new MyType (-448), "#3a");
1023 Assert
<MyType
?> (d3
<< null, null, "#3b");
1026 void LeftShiftAssignTest ()
1028 dynamic d
= 0x7F000;
1032 Assert (d
, 0x1FC000, "#1");
1034 Assert (d
, 0x3F8000, "#1a");
1037 Assert (d
, 0xFE0000, "#1b");
1040 void LeftShiftAssignNullableTest ()
1046 Assert (d
, 0x40000000, "#2");
1047 dynamic d2
= (int?) -2;
1049 Assert (d2
, -4, "#2a");
1052 MyType
? v3
= new MyType (30);
1054 Assert (d
, new MyType (-1073741824), "#3");
1055 dynamic d3
= new MyType
? (new MyType (-7));
1058 void LessThanTest ()
1063 Assert (d
< v
, false, "#1");
1065 Assert (d
< v2
, false, "#1a");
1068 Assert (d
< 4.59, false, "#2");
1070 Assert (d
< b2
, false, "#2a");
1072 d
= new MyType (30);
1073 MyType v3
= new MyType (30);
1074 Assert (d
< v3
, false, "#3");
1075 dynamic d3
= new MyType (-7);
1076 Assert (d3
< new MyType (6), true, "#3a");
1077 Assert (d3
< 11, true, "#3b");
1081 Assert (d
< v4
, true, "#4");
1082 Assert (d
< 2m
, false, "#4a");
1085 void LessThanNullableTest ()
1090 Assert (d
< v2
, false, "#1");
1091 Assert (d
< null, false, "#1a");
1092 Assert (null < d
, false, "#1b");
1095 Assert (d
< v2
, false, "#2");
1096 dynamic d2
= (int?) -2;
1097 Assert (d2
< 1, true, "#2a");
1099 Assert (d2
< 44, false, "#2b");
1101 d
= new MyType (30);
1102 MyType
? v3
= new MyType (30);
1103 Assert (d
< v3
, false, "#3");
1104 dynamic d3
= new MyType
? (new MyType (-7));
1105 Assert (d3
< new MyType (6), true, "#3a");
1106 Assert (d3
< null, false, "#3b");
1110 Assert (d
< v4
, false, "#4");
1112 Assert (d
< v4
, false, "#4a");
1115 void LessThanEnumTest ()
1117 dynamic d
= MyEnum
.Value_1
;
1119 Assert (d
< null, false, "#1");
1121 Assert (d
< MyEnum
.Value_1
, false, "#2");
1122 Assert (d
< 0, false, "#2a");
1124 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1125 Assert (d2
< MyEnumUlong
.Value_2
, false, "#3");
1126 Assert (d2
< null, false, "#3a");
1129 void LessThanOrEqualTest ()
1134 Assert (d
<= v
, false, "#1");
1136 Assert (d
<= v2
, true, "#1a");
1139 Assert (d
<= 4.59, false, "#2");
1141 Assert (d
<= b2
, true, "#2a");
1143 d
= new MyType (30);
1144 MyType v3
= new MyType (30);
1145 Assert (d
<= v3
, true, "#3");
1146 dynamic d3
= new MyType (-7);
1147 Assert (d3
<= new MyType (6), true, "#3a");
1148 Assert (d3
<= 11, true, "#3b");
1152 Assert (d
<= v4
, true, "#4");
1153 Assert (d
<= 2m
, true, "#4a");
1156 void LessThanOrEqualNullableTest ()
1161 Assert (d
<= v2
, false, "#1");
1162 Assert (d
<= null, false, "#1a");
1163 Assert (null <= d
, false, "#1b");
1166 Assert (d
<= v2
, false, "#2");
1167 dynamic d2
= (int?) -2;
1168 Assert (d2
<= 1, true, "#2a");
1170 Assert (d2
<= 44, true, "#2b");
1172 d
= new MyType (30);
1173 MyType
? v3
= new MyType (30);
1174 Assert (d
<= v3
, true, "#3");
1175 dynamic d3
= new MyType
? (new MyType (-7));
1176 Assert (d3
<= new MyType (6), true, "#3a");
1177 Assert (d3
<= null, false, "#3b");
1181 Assert (d
<= v4
, false, "#4");
1183 Assert (d
<= v4
, false, "#4a");
1186 void LessThanOrEqualEnumTest ()
1188 dynamic d
= MyEnum
.Value_1
;
1190 Assert (d
<= null, false, "#1");
1192 Assert (d
<= MyEnum
.Value_1
, true, "#2");
1193 Assert (d
<= 0, false, "#2a");
1195 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1196 Assert (d2
<= MyEnumUlong
.Value_2
, true, "#3");
1197 Assert (d2
<= null, false, "#3a");
1205 Assert (d
% v
, 1, "#1");
1207 MyType v3
= new MyType (30);
1208 Assert (d
% v3
, new MyType (5), "#3");
1209 dynamic d3
= new MyType (-7);
1210 Assert
<MyType
> (d3
+ new MyType (6), new MyType (-1), "#3a");
1211 Assert (d3
% 11, -7, "#3b");
1214 Assert (d
% v4
, 1m
, "#4");
1217 void ModuloNullableTest ()
1222 Assert
<double?> (d
% v2
, null, "#1");
1223 Assert
<double?> (d
% null, null, "#1a");
1224 Assert
<double?> (null % d
, null, "#1b");
1227 Assert (d
% v2
, 1, "#2");
1228 dynamic d2
= (int?) -2;
1229 Assert (d2
% 1, 0, "#2a");
1231 MyType
? v3
= new MyType (30);
1232 Assert (d
% v3
, new MyType (5), "#3");
1233 dynamic d3
= new MyType
? (new MyType (-7));
1234 Assert (d3
% new MyType (6), new MyType (-1), "#3a");
1235 Assert
<MyType
?> (d3
+ null, null, "#3b");
1238 Assert (d
% v4
, 1m
, "#4");
1240 Assert
<decimal?> (d
% v4
, null, "#4a");
1243 void ModuloAssignTest ()
1249 Assert (d
, 1, "#1");
1254 Assert (d
, 0, "#1a");
1256 Assert (d
, 0, "#1b");
1258 dynamic d3
= new MyType (-7);
1259 d3
%= new MyType (6);
1260 Assert
<MyType
> (d3
, new MyType (-1), "#3");
1265 Assert (d
, 1m
, "#4");
1268 void MultiplyTest ()
1273 Assert (d
* v
, 10, "#1");
1275 Assert (d
* v2
, 2.5, "#1a");
1277 MyType v3
= new MyType (30);
1278 Assert (d
* v3
, new MyType (150), "#3");
1279 dynamic d3
= new MyType (-7);
1280 Assert
<MyType
> (d3
* new MyType (6), new MyType (-42), "#3a");
1281 Assert (d3
* 11, -77, "#3b");
1285 Assert (d
* v4
, 31.6m
, "#4");
1288 void MultiplyNullableTest ()
1293 Assert
<int?> (d
* v2
, null, "#1");
1294 Assert
<int?> (d
* null, null, "#1a");
1295 Assert
<int?> (null * d
, null, "#1b");
1298 Assert (d
* v2
, -10, "#2");
1299 dynamic d2
= (int?) -2;
1300 Assert (d2
* 1, -2, "#2a");
1302 MyType
? v3
= new MyType (30);
1303 Assert (d
* v3
, new MyType (150), "#3");
1304 dynamic d3
= new MyType
? (new MyType (-7));
1305 Assert (d3
* new MyType (6), new MyType (-42), "#3a");
1306 Assert
<MyType
?> (d3
* null, null, "#3b");
1309 Assert (d
* v4
, 20m
, "#4");
1311 Assert
<decimal?> (d
* v4
, null, "#4a");
1314 void MultiplyCheckedTest ()
1319 int v
= int.MaxValue
;
1320 AssertChecked (() => d
* v
, 7, "#1");
1323 AssertChecked (() => d
* v2
, null, "#2");
1325 MyType v3
= new MyType (int.MaxValue
);
1326 AssertChecked (() => d
* v3
, new MyType (35), "#3");
1330 void MultiplyAssignTest ()
1336 Assert (d
, 10, "#1");
1341 Assert (d
, 2.5, "#1a");
1343 Assert (d
, 5, "#1b");
1345 dynamic d3
= new MyType (-7);
1346 d3
*= new MyType (6);
1347 Assert
<MyType
> (d3
, new MyType (-42), "#3");
1352 Assert (d
, 20m
, "#4");
1355 void MultiplyAssignCheckedTest ()
1360 int v
= int.MaxValue
;
1361 AssertChecked (() => { d *= v; Assert (d, 0, "#1-"); }
, "#1");
1363 MyType v3
= new MyType (int.MaxValue
);
1364 AssertChecked (() => { d *= v3; Assert (d, 0, "#3-"); }
, "#3");
1368 void NotEqualTest ()
1373 Assert (d
!= v
, true, "#1");
1375 Assert (d
!= v2
, false, "#1a");
1378 Assert (d
!= false, true, "#2");
1380 Assert (d
!= b2
, false, "#2a");
1382 d
= new MyType (30);
1383 MyType v3
= new MyType (30);
1384 Assert (d
!= v3
, false, "#3");
1385 dynamic d3
= new MyType (-7);
1386 Assert (d3
!= new MyType (6), true, "#3a");
1387 Assert (d3
!= 11, true, "#3b");
1391 Assert (d
!= v4
, true, "#4");
1392 Assert (d
!= 2m
, false, "#4a");
1395 Assert (d
!= null, false, "#5");
1398 void NotEqualNullableTest ()
1403 Assert (d
!= v2
, true, "#1");
1404 Assert (d
!= null, true, "#1a");
1405 Assert (null != d
, true, "#1b");
1408 Assert (d
!= v2
, true, "#2");
1409 dynamic d2
= (int?) -2;
1410 Assert (d2
!= 1, true, "#2a");
1412 Assert (d2
!= 44, false, "#2b");
1414 d
= new MyType (30);
1415 MyType
? v3
= new MyType (30);
1416 Assert (d
!= v3
, false, "#3");
1417 dynamic d3
= new MyType
? (new MyType (-7));
1418 Assert (d3
!= new MyType (6), true, "#3a");
1419 Assert (d3
!= null, true, "#3b");
1423 Assert (d
!= v4
, true, "#4");
1425 Assert (d
!= v4
, true, "#4a");
1428 Assert (d
!= true, false, "#5");
1429 Assert (d
!= null, true, "#5a");
1430 Assert (d
!= false, true, "#5b");
1433 void NotEqualEnumTest ()
1435 dynamic d
= MyEnum
.Value_1
;
1437 Assert (d
!= null, true, "#1");
1439 Assert (d
!= MyEnum
.Value_1
, false, "#2");
1440 Assert (d
!= 0, true, "#2a");
1442 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1443 Assert (d2
!= MyEnumUlong
.Value_2
, false, "#3");
1444 Assert (d2
!= null, true, "#3a");
1447 void NotEqualStringTest ()
1451 Assert (d
!= "te", true, "#1");
1452 Assert (d
!= "text", false, "#1a");
1453 Assert (d
!= null, true, "#1b");
1461 Assert (d
| v
, true, "#1");
1462 Assert (d
| false, true, "#1a");
1466 Assert (d
| v2
, 62, "#2");
1467 Assert (d
| 0, 42, "#2a");
1469 MyType v3
= new MyType (30);
1470 Assert (d
| v3
, new MyType (62), "#3");
1471 dynamic d3
= new MyType (-7);
1472 Assert
<MyType
> (d3
| new MyType (6), new MyType (-1), "#3a");
1473 Assert (d3
| 11, -5, "#3b");
1478 dynamic d
= MyEnum
.Value_1
;
1480 Assert
<MyEnum
?> (d
| null, null, "#1");
1482 Assert (d
| d
, MyEnum
.Value_1
, "#2");
1484 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
1485 Assert
<MyEnumUlong
> (d2
| MyEnumUlong
.Value_2
, (MyEnumUlong
) 3, "#3");
1488 void OrTestNullable ()
1493 Assert
<int?> (d
| v2
, null, "#1");
1494 Assert
<int?> (d
| null, null, "#1a");
1495 Assert
<int?> (null | d
, null, "#1b");
1498 Assert (d
| v2
, -1, "#2");
1499 dynamic d2
= (int?) -2;
1500 Assert (d2
| 1, -1, "#2a");
1502 MyType
? v3
= new MyType (30);
1503 Assert (d
| v3
, new MyType (31), "#3");
1504 dynamic d3
= new MyType
? (new MyType (-7));
1505 Assert (d3
| new MyType (6), new MyType (-1), "#3a");
1506 Assert
<MyType
?> (d3
+ null, null, "#3b");
1509 void OrAssignedTest ()
1515 Assert (d
, true, "#1");
1518 Assert (d
, true, "#1a");
1523 Assert (d
, 62, "#2");
1525 MyType v3
= new MyType (30);
1526 dynamic d3
= new MyType (-7);
1527 d3
|= new MyType (6);
1528 Assert
<MyType
> (d3
, new MyType (-1), "#3");
1531 void OrAssignedTestEnum ()
1533 dynamic d
= MyEnum
.Value_1
;
1534 d
|= MyEnum
.Value_2
;
1535 Assert
<MyEnum
> (d
, (MyEnum
) 3, "#1");
1539 Assert (d
, MyEnum
.Value_2
, "#2");
1541 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
1542 Assert
<MyEnumUlong
> (d2
| MyEnumUlong
.Value_2
, (MyEnumUlong
)3, "#3");
1550 Assert
<bool> (d
|| v
, true, "#1");
1552 Assert (d
|| true, true, "#1a");
1555 Assert (d
|| d
, true, "#2");
1557 dynamic d3
= new MyType (-7);
1558 Assert
<MyType
> (d3
|| new MyType (6), new MyType (-7), "#3");
1560 Assert (d3
|| 11, -7, "#3b");
1563 void RightShiftTest ()
1565 dynamic d
= (ulong) 0x7F000;
1568 Assert
<ulong> (d
>> v
, 0x1FC00, "#1");
1569 Assert
<ulong> (d
>> 1, 0x3F800, "#1a");
1571 Assert
<ulong> (d
>> s
, 0x1FC00, "#1b");
1574 MyType v3
= new MyType (3);
1575 Assert (d
>> v3
, new MyType (0xFE00), "#3");
1576 dynamic d3
= new MyType (-7);
1577 Assert (d3
>> new MyType (6), new MyType (-1), "#3a");
1578 Assert (d3
>> 11, -1, "#3b");
1581 void RightShiftNullableTest ()
1586 Assert
<int?> (d
>> v2
, null, "#1");
1588 Assert
<int?> (d
>> null, null, "#1a");
1590 Assert
<int?> (null >> d
, null, "#1b");
1593 Assert (d
>> v2
, 0, "#2");
1594 dynamic d2
= (int?) -200;
1595 Assert (d2
>> 1, -100, "#2a");
1598 MyType
? v3
= new MyType (3);
1599 Assert (d
>> v3
, new MyType (0x1FFFFF), "#3");
1600 dynamic d3
= new MyType
? (new MyType (-7));
1601 Assert (d3
>> new MyType (6), new MyType (-1), "#3a");
1602 Assert
<MyType
?> (d3
>> null, null, "#3b");
1605 void RightShiftAssignTest ()
1607 dynamic d
= 0x7F000;
1611 Assert (d
, 0x1FC00, "#1");
1613 Assert (d
, 0xFE00, "#1a");
1616 Assert (d
, 0x3F80, "#1b");
1619 void RightShiftAssignNullableTest ()
1625 Assert (d
, 0, "#2");
1626 dynamic d2
= (int?) -2;
1628 Assert (d2
, -1, "#2a");
1631 MyType
? v3
= new MyType (3);
1633 Assert (d
, new MyType (0x1FFFFF), "#3");
1636 void SubtractTest ()
1641 Assert (d
- v
, 3, "#1");
1643 Assert (d
- v2
, 4.5, "#1a");
1645 MyType v3
= new MyType (30);
1646 Assert (d
- v3
, new MyType (-25), "#3");
1647 dynamic d3
= new MyType (-7);
1648 Assert
<MyType
> (d3
- new MyType (6), new MyType (-13), "#3a");
1649 Assert (d3
- 11, -18, "#3b");
1652 Assert (d
- v4
, 1m
, "#4");
1655 void SubtractNullableTest ()
1660 Assert
<int?> (d
- v2
, null, "#1");
1661 Assert
<int?> (d
- null, null, "#1a");
1662 Assert
<int?> (null - d
, null, "#1b");
1665 Assert (d
- v2
, 7, "#2");
1666 dynamic d2
= (int?) -2;
1667 Assert (d2
- 1, -3, "#2a");
1669 MyType
? v3
= new MyType (30);
1670 Assert (d
- v3
, new MyType (-25), "#3");
1671 dynamic d3
= new MyType
? (new MyType (-7));
1672 Assert (d3
- new MyType (6), new MyType (-13), "#3a");
1673 Assert
<MyType
?> (d3
- null, null, "#3b");
1676 Assert (d
- v4
, 1m
, "#4");
1678 Assert
<decimal?> (d
- v4
, null, "#4a");
1681 void SubtractEnumTest ()
1683 dynamic d
= MyEnum
.Value_1
;
1685 // CSC: Invalid System.InvalidOperationException
1686 Assert (d
- null, null, "#1");
1688 Assert (d
- 1, MyEnum
.Value_2
, "#2");
1690 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_1
;
1691 Assert (d2
- (byte) 1, MyEnumUlong
.Value_2
, "#3");
1692 Assert
<MyEnumUlong
?> (d2
- (object) null, null, "#3a");
1695 void SubtractCheckedTest ()
1700 int v
= int.MinValue
;
1701 AssertChecked (() => d
- v
, 7, "#1");
1704 AssertChecked (() => d
- v2
, null, "#2");
1706 MyType v3
= new MyType (int.MinValue
);
1707 AssertChecked (() => d
- v3
, new MyType (35), "#3");
1711 void SubtractAssignTest ()
1717 Assert (d
, 3, "#1");
1722 Assert (d
, 4.5, "#1a");
1724 Assert (d
, 2.5, "#1b");
1726 dynamic d3
= new MyType (-7);
1727 d3
-= new MyType (6);
1728 Assert
<MyType
> (d3
, new MyType (-13), "#3");
1733 Assert (d
, 1m
, "#4");
1736 void SubtractAssignEnumTest ()
1738 dynamic d
= MyEnum
.Value_1
;
1741 Assert
<MyEnum
> (d
, 0, "#2");
1743 dynamic d2
= (MyEnumUlong
?) MyEnumUlong
.Value_2
;
1745 Assert (d2
, MyEnumUlong
.Value_1
, "#3");
1748 void SubtractAssignCheckedTest ()
1753 int v
= int.MinValue
;
1754 AssertChecked (() => { d -= v; Assert (d, 0, "#1a"); }
, "#1");
1756 MyType v3
= new MyType (int.MinValue
);
1757 AssertChecked (() => { d -= v3; Assert (d, 0, "#3a"); }
, "#3");
1762 void SubtractAssignmentEvent ()
1767 #pragma warning restore 169
1769 static bool RunTest (MethodInfo test
)
1771 Console
.Write ("Running test {0, -25}", test
.Name
);
1773 test
.Invoke (new Tester (), null);
1774 Console
.WriteLine ("OK");
1776 } catch (Exception e
) {
1777 Console
.WriteLine ("FAILED");
1778 Console
.WriteLine (e
.InnerException
.Message
);
1783 public static int Main ()
1785 var tests
= from test
in typeof (Tester
).GetMethods (BindingFlags
.Instance
| BindingFlags
.NonPublic
| BindingFlags
.DeclaredOnly
)
1786 where test
.GetParameters ().Length
== 0
1788 select RunTest (test
);
1790 int failures
= tests
.Count (a
=> !a
);
1791 Console
.WriteLine (failures
+ " tests failed");