* Exec.cs: Write the commands, which can be multiline,
[mcs.git] / tests / dtest-006.cs
blobd9262676f3ca8ffd8946a26b8d6424b2b1078d8d
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Linq.Expressions;
5 using System.Reflection;
7 // Dynamic binary and unary operators tests
9 public struct InverseLogicalOperator
11 bool value;
12 public InverseLogicalOperator (bool value)
14 this.value = value;
17 public static bool operator true (InverseLogicalOperator u)
19 return u.value;
22 public static bool operator false (InverseLogicalOperator u)
24 return u.value;
28 // TODO: Create a clone which uses +(MyType, int) pattern and an implicit conversion
29 // is required to do the user-conversion
31 public struct MyType
33 int value;
35 public MyType (int value) : this ()
37 this.value = value;
40 public short ShortProp { get; set; }
42 public override int GetHashCode ()
44 throw new NotImplementedException ();
47 public static implicit operator int (MyType o)
49 return o.value;
52 public static bool operator true (MyType a)
54 return a.value == a;
57 public static bool operator false (MyType a)
59 return a.value != 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)
134 return a.value > 0;
137 public static int operator >> (MyType a, int b)
139 return a.value >> b;
142 public static int operator << (MyType a, int b)
144 return a.value << 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 ();
164 class MyTypeExplicit
166 int value;
168 public MyTypeExplicit (int value)
170 this.value = value;
173 public static explicit operator int (MyTypeExplicit m)
175 return m.value;
179 struct MyTypeImplicitOnly
181 short b;
183 public MyTypeImplicitOnly (short b)
185 this.b = b;
188 public static implicit operator short (MyTypeImplicitOnly m)
190 return m.b;
194 enum MyEnum : byte
196 Value_1 = 1,
197 Value_2 = 2
200 enum MyEnumUlong : ulong
202 Value_1 = 1,
203 Value_2 = 2
207 class Tester
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)) {
215 name += ": ";
216 throw new ApplicationException (name + expected + " != " + value);
220 static void AssertChecked<T> (Func<T> expected, T value, string name)
222 try {
223 Assert (expected (), value, name);
224 throw new ApplicationException (name + ": OverflowException expected");
225 } catch (OverflowException) {
226 // passed
230 static void AssertChecked (Action expected, string name)
232 try {
233 expected ();
234 throw new ApplicationException (name + ": OverflowException expected");
235 } catch (OverflowException) {
236 // passed
240 #pragma warning disable 169
242 void AddTest ()
244 dynamic d = 5;
246 int v = 2;
247 Assert (d + v, 7, "#1");
248 double v2 = 0.5;
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");
257 decimal v4 = 4m;
258 Assert (d + v4, 9m, "#4");
261 void AddNullableTest ()
263 dynamic d = 5;
265 int? v2 = null;
266 Assert<int?> (d + v2, null, "#1");
267 Assert<int?> (d + null, null, "#1a");
268 Assert<int?> (null + d, null, "#1b");
270 v2 = -2;
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");
281 decimal? v4 = 4m;
282 Assert (d + v4, 9m, "#4");
283 v4 = null;
284 Assert<decimal?> (d + v4, null, "#4a");
287 void AddEnumTest ()
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 ()
303 checked {
304 dynamic d = 5;
306 int v = int.MaxValue;
307 AssertChecked (() => d + v, 7, "#1");
309 int? v2 = v;
310 AssertChecked (() => d + v2, null, "#2");
312 MyType v3 = new MyType (int.MaxValue);
313 AssertChecked (() => d + v3, new MyType (35), "#3");
317 void AddStringTest ()
319 dynamic d = "foo";
320 string v = "->";
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");
326 uint? v2 = 4;
327 Assert (d + v2, "foo4", "#2");
330 void AddAssignTest ()
332 dynamic d = 5;
334 int v = 2;
335 d += v;
336 Assert (d, 7, "#1");
338 d = 5.0;
339 double v2 = 0.5;
340 d += v2;
341 Assert (d, 5.5, "#1a");
342 d += v;
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");
349 d = 5m;
350 decimal v4 = 4m;
351 d += v4;
352 Assert (d, 9m, "#4");
355 void AddAssignNullableTest ()
357 dynamic d = (int?) 5;
359 // FEATURE
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
364 // fails to resolve
366 long? v2 = null;
367 d += v2;
368 Assert<int?> (d, null, "#1");
369 d += null;
370 Assert<int?> (d, null, "#1a");
372 long? l = (long?) 3;
373 d = l;
374 v2 = -2;
375 d += v2;
376 Assert (d, 3, "#2");
377 d = (int?) -2;
378 d += 1;
379 Assert (d, -1, "#2a");
381 MyType? v3 = new MyType (30);
382 d += v3;
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");
388 decimal? v4 = 4m;
389 d = 2m;
390 d += v4;
391 Assert (d, 9m, "#4");
392 d += null;
393 Assert<decimal?> (d, null, "#4a");
397 void AddAssignEnumTest ()
399 dynamic d = MyEnum.Value_1;
401 d = MyEnum.Value_1;
402 d += 1;
403 Assert (d, MyEnum.Value_2, "#2");
405 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
406 d2 += (byte) 1;
407 Assert (d2, MyEnumUlong.Value_2, "#3");
410 void AddAssignCheckedTest ()
412 checked {
413 dynamic d = 5;
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 ()
425 dynamic d = "foo";
426 string v = "->";
427 d += v;
428 Assert (d, "foo->", "#1");
430 d = "foo";
431 d += 1;
432 Assert (d, "foo1", "#1a");
434 d += null;
435 Assert (d, "foo1", "#1b");
437 uint? v2 = 4;
438 d = "foo";
439 d += v2;
440 Assert (d, "foo4", "#2");
443 // TODO:
444 void AddAssignmentEvent ()
446 // IMPLEMENT
449 void AndTest ()
451 dynamic d = true;
453 var v = false;
454 Assert (d & v, false, "#1");
455 Assert (d & true, true, "#1a");
457 d = 42;
458 var v2 = 62;
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");
469 void AndTestEnum ()
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 ()
483 dynamic d = 5;
485 int? v2 = null;
486 Assert<int?> (d & v2, null, "#1");
487 Assert<int?> (d & null, null, "#1a");
488 Assert<int?> (null & d, null, "#1b");
490 v2 = -2;
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 ()
504 dynamic d = true;
506 var v = false;
507 d &= v;
508 Assert (d, false, "#1");
509 d = true;
510 d &= true;
511 Assert (d, true, "#1a");
513 d = 42;
514 var v2 = 62;
515 d &= v2;
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;
527 d &= MyEnum.Value_2;
528 Assert<MyEnum>(d, 0, "#1");
530 d = MyEnum.Value_2;
531 d &= d;
532 Assert (d, MyEnum.Value_2, "#2");
534 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
535 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
538 void AndAlsoTest ()
540 dynamic d = true;
542 var v = false;
543 Assert<bool> (d && v, false, "#1");
545 Assert (d && true, true, "#1a");
547 d = true;
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");
557 void DivideTest ()
559 dynamic d = 5;
561 int v = 2;
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");
570 decimal v4 = 4m;
571 Assert (d / v4, 1.25m, "#4");
574 void DivideNullableTest ()
576 dynamic d = 5;
578 double? v2 = null;
579 Assert<double?> (d / v2, null, "#1");
580 Assert<double?> (d / null, null, "#1a");
581 Assert<double?> (null / d, null, "#1b");
583 v2 = -2;
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");
594 decimal? v4 = 4m;
595 Assert (d / v4, 1.25m, "#4");
596 v4 = null;
597 Assert<decimal?> (d / v4, null, "#4a");
600 void DivideCheckedTest ()
602 checked {
603 // TODO:
607 void DivideAssignTest ()
609 dynamic d = 5;
611 int v = 2;
612 d /= v;
613 Assert (d, 2, "#1");
615 d = 5.0;
616 double v2 = 0.5;
617 d /= v2;
618 Assert (d, 10, "#1a");
619 d /= v;
620 Assert (d, 5, "#1b");
622 dynamic d3 = new MyType (-7);
623 d3 /= new MyType (6);
624 Assert<MyType> (d3, new MyType (-1), "#3");
626 d = 5m;
627 decimal v4 = 4m;
628 d /= v4;
629 Assert (d, 1.25m, "#4");
632 void DivideAssignCheckedTest ()
634 checked {
635 // TODO:
639 void EqualTest ()
641 dynamic d = 5;
643 int v = 2;
644 Assert (d == v, false, "#1");
645 double v2 = 5;
646 Assert (d == v2, true, "#1a");
648 d = true;
649 Assert (d == false, false, "#2");
650 bool b2 = true;
651 Assert (d == b2, true, "#2a");
653 d = new MyType (30);
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");
660 d = 2m;
661 decimal v4 = 4m;
662 Assert (d == v4, false, "#4");
663 Assert (d == 2m, true, "#4a");
665 d = null;
666 Assert (d == null, true, "#5");
669 void EqualNullableTest ()
671 dynamic d = 5;
673 int? v2 = null;
674 Assert (d == v2, false, "#1");
675 Assert (d == null, false, "#1a");
676 Assert (null == d, false, "#1b");
678 v2 = -2;
679 Assert (d == v2, false, "#2");
680 dynamic d2 = (int?) -2;
681 Assert (d2 == 1, false, "#2a");
682 d2 = (uint?) 44;
683 Assert (d2 == 44, true, "#2b");
685 d = new MyType (30);
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");
692 d = 4.1m;
693 decimal? v4 = 4m;
694 Assert (d == v4, false, "#4");
695 v4 = null;
696 Assert (d == v4, false, "#4a");
698 d = (bool?) true;
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 ()
720 dynamic d = "text";
722 Assert (d == "te", false, "#1");
723 Assert (d == "text", true, "#1a");
724 Assert (d == null, false, "#1b");
727 void EqualDelegateTest ()
729 dynamic d = this;
731 // Assert (d == delegate { }, true, "#1");
733 EmptyDelegate b = EqualDelegateTest;
734 d = b;
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 ()
755 dynamic d = true;
757 var v = false;
758 Assert (d ^ v, true, "#1");
759 Assert (d ^ true, false, "#1a");
761 d = 42;
762 var v2 = 62;
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 ()
775 dynamic d = 5;
777 int? v2 = null;
778 Assert<int?> (d ^ v2, null, "#1");
779 Assert<int?> (d ^ null, null, "#1a");
780 Assert<int?> (null ^ d, null, "#1b");
782 v2 = -2;
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 ()
808 dynamic d = true;
810 var v = false;
811 d ^= v;
812 Assert (d, true, "#1");
813 d = true;
814 d ^= true;
815 Assert (d, false, "#1a");
817 d = 42;
818 var v2 = 62;
819 d ^= v2;
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;
831 d ^= MyEnum.Value_2;
832 Assert<MyEnum>(d, (MyEnum) 3, "#1");
834 d = MyEnum.Value_2;
835 d ^= d;
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 ()
844 dynamic d = 5;
846 int v = 2;
847 Assert (d > v, true, "#1");
848 double v2 = 5;
849 Assert (d > v2, false, "#1a");
851 d = 4.6;
852 Assert (d > 4.59, true, "#2");
853 var b2 = 4.6;
854 Assert (d > b2, false, "#2a");
856 d = new MyType (30);
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");
863 d = 2m;
864 decimal v4 = 4m;
865 Assert (d > v4, false, "#4");
866 Assert (d > 2m, false, "#4a");
869 void GreaterThanNullableTest ()
871 dynamic d = 5;
873 int? v2 = null;
874 Assert (d > v2, false, "#1");
875 Assert (d > null, false, "#1a");
876 Assert (null > d, false, "#1b");
878 v2 = -2;
879 Assert (d > v2, true, "#2");
880 dynamic d2 = (int?) -2;
881 Assert (d2 > 1, false, "#2a");
882 d2 = (uint?) 44;
883 Assert (d2 > 44, false, "#2b");
885 d = new MyType (30);
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");
892 d = 4.1m;
893 decimal? v4 = 4m;
894 Assert (d > v4, true, "#4");
895 v4 = null;
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 ()
915 dynamic d = 5;
917 int v = 2;
918 Assert (d >= v, true, "#1");
919 double v2 = 5;
920 Assert (d >= v2, true, "#1a");
922 d = 4.6;
923 Assert (d >= 4.59, true, "#2");
924 var b2 = 4.6;
925 Assert (d >= b2, true, "#2a");
927 d = new MyType (30);
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");
934 d = 2m;
935 decimal v4 = 4m;
936 Assert (d >= v4, false, "#4");
937 Assert (d >= 2m, true, "#4a");
940 void GreaterThanEqualNullableTest ()
942 dynamic d = 5;
944 int? v2 = null;
945 Assert (d >= v2, false, "#1");
946 Assert (d >= null, false, "#1a");
947 Assert (null >= d, false, "#1b");
949 v2 = -2;
950 Assert (d >= v2, true, "#2");
951 dynamic d2 = (int?) -2;
952 Assert (d2 >= 1, false, "#2a");
953 d2 = (uint?) 44;
954 Assert (d2 >= 44, true, "#2b");
956 d = new MyType (30);
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");
963 d = 4.1m;
964 decimal? v4 = 4m;
965 Assert (d >= v4, true, "#4");
966 v4 = null;
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;
988 int v = 2;
989 Assert<ulong> (d << v, 0x1FC000, "#1");
990 Assert<ulong> (d << 1, 0xFE000, "#1a");
991 short s = 2;
992 Assert<ulong> (d << s, 0x1FC000, "#1b");
994 d = 0x7F000;
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 ()
1004 dynamic d = 5;
1006 int? v2 = null;
1007 Assert<int?> (d << v2, null, "#1");
1008 d = 5;
1009 Assert<int?> (d << null, null, "#1a");
1010 d = 5;
1011 Assert<int?> (null << d, null, "#1b");
1013 v2 = -2;
1014 Assert (d << v2, 0x40000000, "#2");
1015 dynamic d2 = (int?) -2;
1016 Assert (d2 << 1, -4, "#2a");
1018 d = 0xFFFFFF;
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;
1030 int v = 2;
1031 d <<= v;
1032 Assert (d, 0x1FC000, "#1");
1033 d <<= 1;
1034 Assert (d, 0x3F8000, "#1a");
1035 sbyte s = 2;
1036 d <<= s;
1037 Assert (d, 0xFE0000, "#1b");
1040 void LeftShiftAssignNullableTest ()
1042 dynamic d = 5;
1044 var v2 = -2;
1045 d <<= v2;
1046 Assert (d, 0x40000000, "#2");
1047 dynamic d2 = (int?) -2;
1048 d2 <<= 1;
1049 Assert (d2, -4, "#2a");
1051 d = 0xFFFFFF;
1052 MyType? v3 = new MyType (30);
1053 d <<= v3;
1054 Assert (d, new MyType (-1073741824), "#3");
1055 dynamic d3 = new MyType? (new MyType (-7));
1058 void LessThanTest ()
1060 dynamic d = 5;
1062 int v = 2;
1063 Assert (d < v, false, "#1");
1064 double v2 = 5;
1065 Assert (d < v2, false, "#1a");
1067 d = 4.6;
1068 Assert (d < 4.59, false, "#2");
1069 var b2 = 4.6;
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");
1079 d = 2m;
1080 decimal v4 = 4m;
1081 Assert (d < v4, true, "#4");
1082 Assert (d < 2m, false, "#4a");
1085 void LessThanNullableTest ()
1087 dynamic d = 5;
1089 int? v2 = null;
1090 Assert (d < v2, false, "#1");
1091 Assert (d < null, false, "#1a");
1092 Assert (null < d, false, "#1b");
1094 v2 = -2;
1095 Assert (d < v2, false, "#2");
1096 dynamic d2 = (int?) -2;
1097 Assert (d2 < 1, true, "#2a");
1098 d2 = (uint?) 44;
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");
1108 d = 4.1m;
1109 decimal? v4 = 4m;
1110 Assert (d < v4, false, "#4");
1111 v4 = null;
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 ()
1131 dynamic d = 5;
1133 int v = 2;
1134 Assert (d <= v, false, "#1");
1135 double v2 = 5;
1136 Assert (d <= v2, true, "#1a");
1138 d = 4.6;
1139 Assert (d <= 4.59, false, "#2");
1140 var b2 = 4.6;
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");
1150 d = 2m;
1151 decimal v4 = 4m;
1152 Assert (d <= v4, true, "#4");
1153 Assert (d <= 2m, true, "#4a");
1156 void LessThanOrEqualNullableTest ()
1158 dynamic d = 5;
1160 int? v2 = null;
1161 Assert (d <= v2, false, "#1");
1162 Assert (d <= null, false, "#1a");
1163 Assert (null <= d, false, "#1b");
1165 v2 = -2;
1166 Assert (d <= v2, false, "#2");
1167 dynamic d2 = (int?) -2;
1168 Assert (d2 <= 1, true, "#2a");
1169 d2 = (uint?) 44;
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");
1179 d = 4.1m;
1180 decimal? v4 = 4m;
1181 Assert (d <= v4, false, "#4");
1182 v4 = null;
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");
1200 void ModuloTest ()
1202 dynamic d = 5;
1204 int v = 2;
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");
1213 decimal v4 = 4m;
1214 Assert (d % v4, 1m, "#4");
1217 void ModuloNullableTest ()
1219 dynamic d = 5;
1221 double? v2 = null;
1222 Assert<double?> (d % v2, null, "#1");
1223 Assert<double?> (d % null, null, "#1a");
1224 Assert<double?> (null % d, null, "#1b");
1226 v2 = -2;
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");
1237 decimal? v4 = 4m;
1238 Assert (d % v4, 1m, "#4");
1239 v4 = null;
1240 Assert<decimal?> (d % v4, null, "#4a");
1243 void ModuloAssignTest ()
1245 dynamic d = 5;
1247 int v = 2;
1248 d %= v;
1249 Assert (d, 1, "#1");
1251 d = 5.0;
1252 double v2 = 0.5;
1253 d %= v2;
1254 Assert (d, 0, "#1a");
1255 d %= v;
1256 Assert (d, 0, "#1b");
1258 dynamic d3 = new MyType (-7);
1259 d3 %= new MyType (6);
1260 Assert<MyType> (d3, new MyType (-1), "#3");
1262 d = 5m;
1263 decimal v4 = 4m;
1264 d %= v4;
1265 Assert (d, 1m, "#4");
1268 void MultiplyTest ()
1270 dynamic d = 5;
1272 int v = 2;
1273 Assert (d * v, 10, "#1");
1274 double v2 = 0.5;
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");
1283 decimal v4 = 4m;
1284 d = 7.9m;
1285 Assert (d * v4, 31.6m, "#4");
1288 void MultiplyNullableTest ()
1290 dynamic d = 5;
1292 int? v2 = null;
1293 Assert<int?> (d * v2, null, "#1");
1294 Assert<int?> (d * null, null, "#1a");
1295 Assert<int?> (null * d, null, "#1b");
1297 v2 = -2;
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");
1308 decimal? v4 = 4m;
1309 Assert (d * v4, 20m, "#4");
1310 v4 = null;
1311 Assert<decimal?> (d * v4, null, "#4a");
1314 void MultiplyCheckedTest ()
1316 checked {
1317 dynamic d = 5;
1319 int v = int.MaxValue;
1320 AssertChecked (() => d * v, 7, "#1");
1322 int? v2 = v;
1323 AssertChecked (() => d * v2, null, "#2");
1325 MyType v3 = new MyType (int.MaxValue);
1326 AssertChecked (() => d * v3, new MyType (35), "#3");
1330 void MultiplyAssignTest ()
1332 dynamic d = 5;
1334 int v = 2;
1335 d *= v;
1336 Assert (d, 10, "#1");
1338 d = 5.0;
1339 double v2 = 0.5;
1340 d *= v2;
1341 Assert (d, 2.5, "#1a");
1342 d *= v;
1343 Assert (d, 5, "#1b");
1345 dynamic d3 = new MyType (-7);
1346 d3 *= new MyType (6);
1347 Assert<MyType> (d3, new MyType (-42), "#3");
1349 d = 5m;
1350 decimal v4 = 4m;
1351 d *= v4;
1352 Assert (d, 20m, "#4");
1355 void MultiplyAssignCheckedTest ()
1357 checked {
1358 dynamic d = 5;
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 ()
1370 dynamic d = 5;
1372 int v = 2;
1373 Assert (d != v, true, "#1");
1374 double v2 = 5;
1375 Assert (d != v2, false, "#1a");
1377 d = true;
1378 Assert (d != false, true, "#2");
1379 bool b2 = true;
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");
1389 d = 2m;
1390 decimal v4 = 4m;
1391 Assert (d != v4, true, "#4");
1392 Assert (d != 2m, false, "#4a");
1394 d = null;
1395 Assert (d != null, false, "#5");
1398 void NotEqualNullableTest ()
1400 dynamic d = 5;
1402 int? v2 = null;
1403 Assert (d != v2, true, "#1");
1404 Assert (d != null, true, "#1a");
1405 Assert (null != d, true, "#1b");
1407 v2 = -2;
1408 Assert (d != v2, true, "#2");
1409 dynamic d2 = (int?) -2;
1410 Assert (d2 != 1, true, "#2a");
1411 d2 = (uint?) 44;
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");
1421 d = 4.1m;
1422 decimal? v4 = 4m;
1423 Assert (d != v4, true, "#4");
1424 v4 = null;
1425 Assert (d != v4, true, "#4a");
1427 d = (bool?) true;
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 ()
1449 dynamic d = "text";
1451 Assert (d != "te", true, "#1");
1452 Assert (d != "text", false, "#1a");
1453 Assert (d != null, true, "#1b");
1456 void OrTest ()
1458 dynamic d = true;
1460 var v = false;
1461 Assert (d | v, true, "#1");
1462 Assert (d | false, true, "#1a");
1464 d = 42;
1465 var v2 = 62;
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");
1476 void OrTestEnum ()
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 ()
1490 dynamic d = 5;
1492 int? v2 = null;
1493 Assert<int?> (d | v2, null, "#1");
1494 Assert<int?> (d | null, null, "#1a");
1495 Assert<int?> (null | d, null, "#1b");
1497 v2 = -2;
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 ()
1511 dynamic d = true;
1513 var v = false;
1514 d |= v;
1515 Assert (d, true, "#1");
1516 d = true;
1517 d |= true;
1518 Assert (d, true, "#1a");
1520 d = 42;
1521 var v2 = 62;
1522 d |= v2;
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");
1537 d = MyEnum.Value_2;
1538 d |= d;
1539 Assert (d, MyEnum.Value_2, "#2");
1541 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1542 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
1545 void OrElseTest ()
1547 dynamic d = true;
1549 var v = false;
1550 Assert<bool> (d || v, true, "#1");
1552 Assert (d || true, true, "#1a");
1554 d = true;
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;
1567 int v = 2;
1568 Assert<ulong> (d >> v, 0x1FC00, "#1");
1569 Assert<ulong> (d >> 1, 0x3F800, "#1a");
1570 short s = 2;
1571 Assert<ulong> (d >> s, 0x1FC00, "#1b");
1573 d = 0x7F000;
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 ()
1583 dynamic d = 5;
1585 int? v2 = null;
1586 Assert<int?> (d >> v2, null, "#1");
1587 d = 5;
1588 Assert<int?> (d >> null, null, "#1a");
1589 d = 5;
1590 Assert<int?> (null >> d, null, "#1b");
1592 v2 = -2;
1593 Assert (d >> v2, 0, "#2");
1594 dynamic d2 = (int?) -200;
1595 Assert (d2 >> 1, -100, "#2a");
1597 d = 0xFFFFFF;
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;
1609 int v = 2;
1610 d >>= v;
1611 Assert (d, 0x1FC00, "#1");
1612 d >>= 1;
1613 Assert (d, 0xFE00, "#1a");
1614 sbyte s = 2;
1615 d >>= s;
1616 Assert (d, 0x3F80, "#1b");
1619 void RightShiftAssignNullableTest ()
1621 dynamic d = 0x2A0;
1623 var v2 = -2;
1624 d >>= v2;
1625 Assert (d, 0, "#2");
1626 dynamic d2 = (int?) -2;
1627 d2 >>= 1;
1628 Assert (d2, -1, "#2a");
1630 d = 0xFFFFFF;
1631 MyType? v3 = new MyType (3);
1632 d >>= v3;
1633 Assert (d, new MyType (0x1FFFFF), "#3");
1636 void SubtractTest ()
1638 dynamic d = 5;
1640 int v = 2;
1641 Assert (d - v, 3, "#1");
1642 double v2 = 0.5;
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");
1651 decimal v4 = 4m;
1652 Assert (d - v4, 1m, "#4");
1655 void SubtractNullableTest ()
1657 dynamic d = 5;
1659 int? v2 = null;
1660 Assert<int?> (d - v2, null, "#1");
1661 Assert<int?> (d - null, null, "#1a");
1662 Assert<int?> (null - d, null, "#1b");
1664 v2 = -2;
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");
1675 decimal? v4 = 4m;
1676 Assert (d - v4, 1m, "#4");
1677 v4 = null;
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 ()
1697 checked {
1698 dynamic d = 5;
1700 int v = int.MinValue;
1701 AssertChecked (() => d - v, 7, "#1");
1703 int? v2 = v;
1704 AssertChecked (() => d - v2, null, "#2");
1706 MyType v3 = new MyType (int.MinValue);
1707 AssertChecked (() => d - v3, new MyType (35), "#3");
1711 void SubtractAssignTest ()
1713 dynamic d = 5;
1715 int v = 2;
1716 d -= v;
1717 Assert (d, 3, "#1");
1719 d = 5.0;
1720 double v2 = 0.5;
1721 d -= v2;
1722 Assert (d, 4.5, "#1a");
1723 d -= v;
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");
1730 d = 5m;
1731 decimal v4 = 4m;
1732 d -= v4;
1733 Assert (d, 1m, "#4");
1736 void SubtractAssignEnumTest ()
1738 dynamic d = MyEnum.Value_1;
1740 d -= 1;
1741 Assert<MyEnum> (d, 0, "#2");
1743 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1744 d2 -= (byte) 1;
1745 Assert (d2, MyEnumUlong.Value_1, "#3");
1748 void SubtractAssignCheckedTest ()
1750 checked {
1751 dynamic d = 5;
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");
1761 // TODO:
1762 void SubtractAssignmentEvent ()
1764 // IMPLEMENT
1767 #pragma warning restore 169
1769 static bool RunTest (MethodInfo test)
1771 Console.Write ("Running test {0, -25}", test.Name);
1772 try {
1773 test.Invoke (new Tester (), null);
1774 Console.WriteLine ("OK");
1775 return true;
1776 } catch (Exception e) {
1777 Console.WriteLine ("FAILED");
1778 Console.WriteLine (e.InnerException.Message);
1779 return false;
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
1787 orderby test.Name
1788 select RunTest (test);
1790 int failures = tests.Count (a => !a);
1791 Console.WriteLine (failures + " tests failed");
1792 return failures;