2009-09-30 Jb Evain <jbevain@novell.com>
[mcs.git] / tests / dtest-006.cs
blob04b4a9312e20f564c62c411073d13c5ef93eb71e
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 public struct MyType
30 int value;
32 public MyType (int value) : this ()
34 this.value = value;
37 public short ShortProp { get; set; }
39 public override int GetHashCode ()
41 throw new NotImplementedException ();
44 public static bool operator true (MyType a)
46 return a.value != 1;
49 public static bool operator false (MyType a)
51 return a.value == 0;
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)
126 return a.value > 0;
129 public static int operator ~ (MyType a)
131 return ~a.value;
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)
146 return a.value >> b;
149 public static int operator << (MyType a, int b)
151 return a.value << 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 ();
171 class MyTypeExplicit
173 int value;
175 public MyTypeExplicit (int value)
177 this.value = value;
180 public static explicit operator int (MyTypeExplicit m)
182 return m.value;
186 struct MyTypeImplicitOnly
188 short b;
190 public MyTypeImplicitOnly (short b)
192 this.b = b;
195 public static implicit operator short (MyTypeImplicitOnly m)
197 return m.b;
200 public static implicit operator bool (MyTypeImplicitOnly m)
202 return m.b != 0;
206 enum MyEnum : byte
208 Value_1 = 1,
209 Value_2 = 2
212 enum MyEnumUlong : ulong
214 Value_1 = 1,
215 Value_2 = 2
219 class Tester
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)) {
227 name += ": ";
228 throw new ApplicationException (name + expected + " != " + value);
232 static void AssertChecked<T> (Func<T> expected, T value, string name)
234 try {
235 Assert (expected (), value, name);
236 throw new ApplicationException (name + ": OverflowException expected");
237 } catch (OverflowException) {
238 // passed
242 static void AssertChecked (Action expected, string name)
244 try {
245 expected ();
246 throw new ApplicationException (name + ": OverflowException expected");
247 } catch (OverflowException) {
248 // passed
252 #pragma warning disable 169
254 void AddTest ()
256 dynamic d = 5;
258 int v = 2;
259 Assert (d + v, 7, "#1");
260 double v2 = 0.5;
261 Assert (d + v2, 5.5, "#1a");
263 d = new MyType (5);
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);
273 decimal v4 = 4m;
274 Assert (d + v4, 9m, "#4");
277 void AddNullableTest ()
279 dynamic d = 5;
281 int? v2 = null;
282 Assert<int?> (d + v2, null, "#1");
283 Assert<int?> (d + null, null, "#1a");
284 Assert<int?> (null + d, null, "#1b");
286 v2 = -2;
287 Assert (d + v2, 3, "#2");
288 dynamic d2 = (int?) -2;
289 Assert (d2 + 1, -1, "#2a");
291 d = new MyType (5);
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);
299 decimal? v4 = 4m;
300 Assert (d + v4, 9m, "#4");
301 v4 = null;
302 Assert<decimal?> (d + v4, null, "#4a");
305 void AddEnumTest ()
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 ()
321 checked {
322 dynamic d = 5;
324 int v = int.MaxValue;
325 AssertChecked (() => d + v, 7, "#1");
327 int? v2 = v;
328 AssertChecked (() => d + v2, null, "#2");
330 d = new MyType (3);
331 MyType v3 = new MyType (int.MaxValue);
332 Assert (new MyType (-2147483646), d + v3, "#3");
336 void AddStringTest ()
338 dynamic d = "foo";
339 string v = "->";
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");
345 uint? v2 = 4;
346 Assert (d + v2, "foo4", "#2");
349 void AddAssignTest ()
351 dynamic d = 5;
353 int v = 2;
354 d += v;
355 Assert (d, 7, "#1");
357 d = 5.0;
358 double v2 = 0.5;
359 d += v2;
360 Assert (d, 5.5, "#1a");
361 d += v;
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");
368 d = 5m;
369 decimal v4 = 4m;
370 d += v4;
371 Assert (d, 9m, "#4");
374 void AddAssignNullableTest ()
376 dynamic d = (int?) 5;
378 // FEATURE
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
383 // fails to resolve
385 long? v2 = null;
386 d += v2;
387 Assert<int?> (d, null, "#1");
388 d += null;
389 Assert<int?> (d, null, "#1a");
391 long? l = (long?) 3;
392 d = l;
393 v2 = -2;
394 d += v2;
395 Assert (d, 3, "#2");
396 d = (int?) -2;
397 d += 1;
398 Assert (d, -1, "#2a");
400 MyType? v3 = new MyType (30);
401 d += v3;
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");
407 decimal? v4 = 4m;
408 d = 2m;
409 d += v4;
410 Assert (d, 9m, "#4");
411 d += null;
412 Assert<decimal?> (d, null, "#4a");
416 void AddAssignEnumTest ()
418 dynamic d = MyEnum.Value_1;
420 d = MyEnum.Value_1;
421 d += 1;
422 Assert (d, MyEnum.Value_2, "#2");
424 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
425 d2 += (byte) 1;
426 Assert (d2, MyEnumUlong.Value_2, "#3");
429 void AddAssignCheckedTest ()
431 checked {
432 dynamic d = 5;
434 int v = int.MaxValue;
435 AssertChecked (() => { d += v; Assert (d, 0, "#1-"); }, "#1");
437 d = new MyType (5);
438 MyType v3 = new MyType (int.MaxValue);
439 d += v3;
440 Assert (d, new MyType (-2147483644), "#3-");
444 void AddAssignStringTest ()
446 dynamic d = "foo";
447 string v = "->";
448 d += v;
449 Assert (d, "foo->", "#1");
451 d = "foo";
452 d += 1;
453 Assert (d, "foo1", "#1a");
455 d += null;
456 Assert (d, "foo1", "#1b");
458 uint? v2 = 4;
459 d = "foo";
460 d += v2;
461 Assert (d, "foo4", "#2");
464 // TODO:
465 void AddAssignmentEvent ()
467 // IMPLEMENT
470 void AndTest ()
472 dynamic d = true;
474 var v = false;
475 Assert (d & v, false, "#1");
476 Assert (d & true, true, "#1a");
478 d = 42;
479 var v2 = 62;
480 Assert (d & v2, 42, "#2");
481 Assert (d & 0, 0, "#2a");
483 d = new MyType (10);
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");
493 void AndTestEnum ()
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 ()
507 dynamic d = 5;
509 int? v2 = null;
510 Assert<int?> (d & v2, null, "#1");
511 Assert<int?> (d & null, null, "#1a");
512 Assert<int?> (null & d, null, "#1b");
514 v2 = -2;
515 Assert (d & v2, 4, "#2");
516 dynamic d2 = (int?) -2;
517 Assert (d2 & 1, 0, "#2a");
519 d = new MyType (22);
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 ()
529 dynamic d = true;
531 var v = false;
532 d &= v;
533 Assert (d, false, "#1");
534 d = true;
535 d &= true;
536 Assert (d, true, "#1a");
538 d = 42;
539 var v2 = 62;
540 d &= v2;
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;
552 d &= MyEnum.Value_2;
553 Assert<MyEnum>(d, 0, "#1");
555 d = MyEnum.Value_2;
556 d &= d;
557 Assert (d, MyEnum.Value_2, "#2");
559 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
560 Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
563 void AndAlsoTest ()
565 dynamic d = true;
567 var v = false;
568 Assert<bool> (d && v, false, "#1");
570 Assert (d && true, true, "#1a");
572 d = true;
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");
582 void DivideTest ()
584 dynamic d = 5;
586 int v = 2;
587 Assert (d / v, 2, "#1");
589 d = new MyType (5);
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);
596 decimal v4 = 4m;
597 Assert (d / v4, 1.5m, "#4");
600 void DivideNullableTest ()
602 dynamic d = 5;
604 double? v2 = null;
605 Assert<double?> (d / v2, null, "#1");
606 Assert<double?> (d / null, null, "#1a");
607 Assert<double?> (null / d, null, "#1b");
609 v2 = -2;
610 Assert (d / v2, -2.5, "#2");
611 dynamic d2 = (int?) -2;
612 Assert (d2 / 1, -2, "#2a");
614 d = new MyType (5);
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);
622 decimal? v4 = 4m;
623 Assert (d / v4, 1.25m, "#4");
624 v4 = null;
625 Assert<decimal?> (d / v4, null, "#4a");
628 void DivideCheckedTest ()
630 checked {
631 // TODO:
635 void DivideAssignTest ()
637 dynamic d = 5;
639 int v = 2;
640 d /= v;
641 Assert (d, 2, "#1");
643 d = 5.0;
644 double v2 = 0.5;
645 d /= v2;
646 Assert (d, 10, "#1a");
647 d /= v;
648 Assert (d, 5, "#1b");
650 dynamic d3 = new MyType (-7);
651 d3 /= new MyType (6);
652 Assert<MyType> (d3, new MyType (-1), "#3");
654 d = 5m;
655 decimal v4 = 4m;
656 d /= v4;
657 Assert (d, 1.25m, "#4");
660 void DivideAssignCheckedTest ()
662 checked {
663 // TODO:
667 void EqualTest ()
669 dynamic d = 5;
671 int v = 2;
672 Assert (d == v, false, "#1");
673 double v2 = 5;
674 Assert (d == v2, true, "#1a");
676 d = true;
677 Assert (d == false, false, "#2");
678 bool b2 = true;
679 Assert (d == b2, true, "#2a");
681 d = new MyType (30);
682 MyType v3 = new MyType (30);
683 Assert (d == v3, true, "#3");
684 dynamic d3 = new MyTypeImplicitOnly (-7);
685 Assert (d3 == 11, false, "#3b");
687 d = 2m;
688 decimal v4 = 4m;
689 Assert (d == v4, false, "#4");
690 Assert (d == 2m, true, "#4a");
692 d = null;
693 Assert (d == null, true, "#5");
696 void EqualNullableTest ()
698 dynamic d = 5;
700 int? v2 = null;
701 Assert (d == v2, false, "#1");
702 Assert (d == null, false, "#1a");
703 Assert (null == d, false, "#1b");
705 v2 = -2;
706 Assert (d == v2, false, "#2");
707 dynamic d2 = (int?) -2;
708 Assert (d2 == 1, false, "#2a");
709 d2 = (uint?) 44;
710 Assert (d2 == 44, true, "#2b");
712 d = new MyType (30);
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");
719 d = 4.1m;
720 decimal? v4 = 4m;
721 Assert (d == v4, false, "#4");
722 v4 = null;
723 Assert (d == v4, false, "#4a");
725 d = (bool?) true;
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 ()
747 dynamic d = "text";
749 Assert (d == "te", false, "#1");
750 Assert (d == "text", true, "#1a");
751 Assert (d == null, false, "#1b");
754 void EqualDelegateTest ()
756 dynamic d = this;
758 // Assert (d == delegate { }, true, "#1");
760 EmptyDelegate b = EqualDelegateTest;
761 d = b;
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 ()
782 dynamic d = true;
784 var v = false;
785 Assert (d ^ v, true, "#1");
786 Assert (d ^ true, false, "#1a");
788 d = 42;
789 var v2 = 62;
790 Assert (d ^ v2, 20, "#2");
791 Assert (d ^ 0, 42, "#2a");
793 d = new MyType (42);
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 ()
805 dynamic d = 5;
807 int? v2 = null;
808 Assert<int?> (d ^ v2, null, "#1");
809 Assert<int?> (d ^ null, null, "#1a");
810 Assert<int?> (null ^ d, null, "#1b");
812 v2 = -2;
813 Assert (d ^ v2, -5, "#2");
814 dynamic d2 = (int?) -2;
815 Assert (d2 ^ 1, -1, "#2a");
817 d = new MyType (5);
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 ()
839 dynamic d = true;
841 var v = false;
842 d ^= v;
843 Assert (d, true, "#1");
844 d = true;
845 d ^= true;
846 Assert (d, false, "#1a");
848 d = 42;
849 var v2 = 62;
850 d ^= v2;
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;
862 d ^= MyEnum.Value_2;
863 Assert<MyEnum>(d, (MyEnum) 3, "#1");
865 d = MyEnum.Value_2;
866 d ^= d;
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 ()
875 dynamic d = 5;
877 int v = 2;
878 Assert (d > v, true, "#1");
879 double v2 = 5;
880 Assert (d > v2, false, "#1a");
882 d = 4.6;
883 Assert (d > 4.59, true, "#2");
884 var b2 = 4.6;
885 Assert (d > b2, false, "#2a");
887 d = new MyType (30);
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");
896 d = 2m;
897 decimal v4 = 4m;
898 Assert (d > v4, false, "#4");
899 Assert (d > 2m, false, "#4a");
902 void GreaterThanNullableTest ()
904 dynamic d = 5;
906 int? v2 = null;
907 Assert (d > v2, false, "#1");
908 Assert (d > null, false, "#1a");
909 Assert (null > d, false, "#1b");
911 v2 = -2;
912 Assert (d > v2, true, "#2");
913 dynamic d2 = (int?) -2;
914 Assert (d2 > 1, false, "#2a");
915 d2 = (uint?) 44;
916 Assert (d2 > 44, false, "#2b");
918 d = new MyType (30);
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");
925 d = 4.1m;
926 decimal? v4 = 4m;
927 Assert (d > v4, true, "#4");
928 v4 = null;
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 ()
948 dynamic d = 5;
950 int v = 2;
951 Assert (d >= v, true, "#1");
952 double v2 = 5;
953 Assert (d >= v2, true, "#1a");
955 d = 4.6;
956 Assert (d >= 4.59, true, "#2");
957 var b2 = 4.6;
958 Assert (d >= b2, true, "#2a");
960 d = new MyType (30);
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");
969 d = 2m;
970 decimal v4 = 4m;
971 Assert (d >= v4, false, "#4");
972 Assert (d >= 2m, true, "#4a");
975 void GreaterThanEqualNullableTest ()
977 dynamic d = 5;
979 int? v2 = null;
980 Assert (d >= v2, false, "#1");
981 Assert (d >= null, false, "#1a");
982 Assert (null >= d, false, "#1b");
984 v2 = -2;
985 Assert (d >= v2, true, "#2");
986 dynamic d2 = (int?) -2;
987 Assert (d2 >= 1, false, "#2a");
988 d2 = (uint?) 44;
989 Assert (d2 >= 44, true, "#2b");
991 d = new MyType (30);
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");
998 d = 4.1m;
999 decimal? v4 = 4m;
1000 Assert (d >= v4, true, "#4");
1001 v4 = null;
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;
1023 int v = 2;
1024 Assert<ulong> (d << v, 0x1FC000, "#1");
1025 Assert<ulong> (d << 1, 0xFE000, "#1a");
1026 short s = 2;
1027 Assert<ulong> (d << s, 0x1FC000, "#1b");
1029 d = 0x7F000;
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 ()
1039 dynamic d = 5;
1041 int? v2 = null;
1042 Assert<int?> (d << v2, null, "#1");
1043 d = 5;
1044 Assert<int?> (d << null, null, "#1a");
1045 d = 5;
1046 Assert<int?> (null << d, null, "#1b");
1048 v2 = -2;
1049 Assert (d << v2, 0x40000000, "#2");
1050 dynamic d2 = (int?) -2;
1051 Assert (d2 << 1, -4, "#2a");
1054 void LeftShiftAssignTest ()
1056 dynamic d = 0x7F000;
1058 int v = 2;
1059 d <<= v;
1060 Assert (d, 0x1FC000, "#1");
1061 d <<= 1;
1062 Assert (d, 0x3F8000, "#1a");
1063 sbyte s = 2;
1064 d <<= s;
1065 Assert (d, 0xFE0000, "#1b");
1068 void LeftShiftAssignNullableTest ()
1070 dynamic d = 5;
1072 var v2 = -2;
1073 d <<= v2;
1074 Assert (d, 0x40000000, "#2");
1075 dynamic d2 = (int?) -2;
1076 d2 <<= 1;
1077 Assert (d2, -4, "#2a");
1080 void LessThanTest ()
1082 dynamic d = 5;
1084 int v = 2;
1085 Assert (d < v, false, "#1");
1086 double v2 = 5;
1087 Assert (d < v2, false, "#1a");
1089 d = 4.6;
1090 Assert (d < 4.59, false, "#2");
1091 var b2 = 4.6;
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");
1103 d = 2m;
1104 decimal v4 = 4m;
1105 Assert (d < v4, true, "#4");
1106 Assert (d < 2m, false, "#4a");
1109 void LessThanNullableTest ()
1111 dynamic d = 5;
1113 int? v2 = null;
1114 Assert (d < v2, false, "#1");
1115 Assert (d < null, false, "#1a");
1116 Assert (null < d, false, "#1b");
1118 v2 = -2;
1119 Assert (d < v2, false, "#2");
1120 dynamic d2 = (int?) -2;
1121 Assert (d2 < 1, true, "#2a");
1122 d2 = (uint?) 44;
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");
1134 d = 4.1m;
1135 decimal? v4 = 4m;
1136 Assert (d < v4, false, "#4");
1137 v4 = null;
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 ()
1157 dynamic d = 5;
1159 int v = 2;
1160 Assert (d <= v, false, "#1");
1161 double v2 = 5;
1162 Assert (d <= v2, true, "#1a");
1164 d = 4.6;
1165 Assert (d <= 4.59, false, "#2");
1166 var b2 = 4.6;
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");
1178 d = 2m;
1179 decimal v4 = 4m;
1180 Assert (d <= v4, true, "#4");
1181 Assert (d <= 2m, true, "#4a");
1184 void LessThanOrEqualNullableTest ()
1186 dynamic d = 5;
1188 int? v2 = null;
1189 Assert (d <= v2, false, "#1");
1190 Assert (d <= null, false, "#1a");
1191 Assert (null <= d, false, "#1b");
1193 v2 = -2;
1194 Assert (d <= v2, false, "#2");
1195 dynamic d2 = (int?) -2;
1196 Assert (d2 <= 1, true, "#2a");
1197 d2 = (uint?) 44;
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");
1207 d = 4.1m;
1208 decimal? v4 = 4m;
1209 Assert (d <= v4, false, "#4");
1210 v4 = null;
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");
1228 void ModuloTest ()
1230 dynamic d = 5;
1232 int v = 2;
1233 Assert (d % v, 1, "#1");
1235 d = new MyType (5);
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);
1242 decimal v4 = 4m;
1243 Assert (d % v4, 1m, "#4");
1246 void ModuloNullableTest ()
1248 dynamic d = 5;
1250 double? v2 = null;
1251 Assert<double?> (d % v2, null, "#1");
1252 Assert<double?> (d % null, null, "#1a");
1253 Assert<double?> (null % d, null, "#1b");
1255 v2 = -2;
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);
1268 decimal? v4 = 4m;
1269 Assert (d % v4, 1m, "#4");
1270 v4 = null;
1271 Assert<decimal?> (d % v4, null, "#4a");
1274 void ModuloAssignTest ()
1276 dynamic d = 5;
1278 int v = 2;
1279 d %= v;
1280 Assert (d, 1, "#1");
1282 d = 5.0;
1283 double v2 = 0.5;
1284 d %= v2;
1285 Assert (d, 0, "#1a");
1286 d %= v;
1287 Assert (d, 0, "#1b");
1289 dynamic d3 = new MyType (-7);
1290 d3 %= new MyType (6);
1291 Assert<MyType> (d3, new MyType (-1), "#3");
1293 d = 5m;
1294 decimal v4 = 4m;
1295 d %= v4;
1296 Assert (d, 1m, "#4");
1299 void MultiplyTest ()
1301 dynamic d = 5;
1303 int v = 2;
1304 Assert (d * v, 10, "#1");
1305 double v2 = 0.5;
1306 Assert (d * v2, 2.5, "#1a");
1308 d = new MyType (5);
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");
1314 decimal v4 = 4m;
1315 d = 7.9m;
1316 Assert (d * v4, 31.6m, "#4");
1319 void MultiplyNullableTest ()
1321 dynamic d = 5;
1323 int? v2 = null;
1324 Assert<int?> (d * v2, null, "#1");
1325 Assert<int?> (d * null, null, "#1a");
1326 Assert<int?> (null * d, null, "#1b");
1328 v2 = -2;
1329 Assert (d * v2, -10, "#2");
1330 dynamic d2 = (int?) -2;
1331 Assert (d2 * 1, -2, "#2a");
1333 d = new MyType (5);
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);
1341 decimal? v4 = 4m;
1342 Assert (d * v4, 20m, "#4");
1343 v4 = null;
1344 Assert<decimal?> (d * v4, null, "#4a");
1347 void MultiplyCheckedTest ()
1349 checked {
1350 dynamic d = 5;
1352 int v = int.MaxValue;
1353 AssertChecked (() => d * v, 7, "#1");
1355 int? v2 = v;
1356 AssertChecked (() => d * v2, null, "#2");
1358 d = new MyType (4);
1359 MyType v3 = new MyType (int.MaxValue);
1360 Assert (d * v3, new MyType (-4), "#3");
1364 void MultiplyAssignTest ()
1366 dynamic d = 5;
1368 int v = 2;
1369 d *= v;
1370 Assert (d, 10, "#1");
1372 d = 5.0;
1373 double v2 = 0.5;
1374 d *= v2;
1375 Assert (d, 2.5, "#1a");
1376 d *= v;
1377 Assert (d, 5, "#1b");
1379 dynamic d3 = new MyType (-7);
1380 d3 *= new MyType (6);
1381 Assert<MyType> (d3, new MyType (-42), "#3");
1383 d = 5m;
1384 decimal v4 = 4m;
1385 d *= v4;
1386 Assert (d, 20m, "#4");
1389 void MultiplyAssignCheckedTest ()
1391 checked {
1392 dynamic d = 5;
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);
1399 d *= v3;
1400 Assert (d, new MyType (-44), "#3-");
1404 void Negate ()
1406 dynamic d = -8;
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");
1416 d = (uint) 7;
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);
1430 d = n1;
1431 Assert (new MyType (-4), -d, "#2");
1433 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
1434 d = n2;
1435 Assert (-4, -d, "#3");
1437 d = (sbyte?) 7;
1438 Assert (-7, -d, "#4");
1441 void NegateChecked ()
1443 checked {
1444 dynamic d = int.MinValue;
1445 AssertChecked (() => -d, 0, "#1");
1449 void Not ()
1451 dynamic d = true;
1452 Assert (false, !d, "#1");
1454 var de = new MyType (-1);
1455 Assert (false, !d, "#2");
1458 void NotEqualTest ()
1460 dynamic d = 5;
1462 int v = 2;
1463 Assert (d != v, true, "#1");
1464 double v2 = 5;
1465 Assert (d != v2, false, "#1a");
1467 d = true;
1468 Assert (d != false, true, "#2");
1469 bool b2 = true;
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");
1478 d = 2m;
1479 decimal v4 = 4m;
1480 Assert (d != v4, true, "#4");
1481 Assert (d != 2m, false, "#4a");
1483 d = null;
1484 Assert (d != null, false, "#5");
1487 void NotEqualNullableTest ()
1489 dynamic d = 5;
1491 int? v2 = null;
1492 Assert (d != v2, true, "#1");
1493 Assert (d != null, true, "#1a");
1494 Assert (null != d, true, "#1b");
1496 v2 = -2;
1497 Assert (d != v2, true, "#2");
1498 dynamic d2 = (int?) -2;
1499 Assert (d2 != 1, true, "#2a");
1500 d2 = (uint?) 44;
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");
1510 d = 4.1m;
1511 decimal? v4 = 4m;
1512 Assert (d != v4, true, "#4");
1513 v4 = null;
1514 Assert (d != v4, true, "#4a");
1516 d = (bool?) true;
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 ()
1538 dynamic d = "text";
1540 Assert (d != "te", true, "#1");
1541 Assert (d != "text", false, "#1a");
1542 Assert (d != null, true, "#1b");
1545 void OnesComplement ()
1547 dynamic d = 7;
1548 Assert (-8, ~d, "#1");
1550 d = new MyType (-1);
1551 Assert (0, ~d, "#2");
1553 d = (ulong) 7;
1554 Assert (18446744073709551608, ~d, "#3");
1556 d = MyEnum.Value_1;
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");
1569 void OrTest ()
1571 dynamic d = true;
1573 var v = false;
1574 Assert (d | v, true, "#1");
1575 Assert (d | false, true, "#1a");
1577 d = 42;
1578 var v2 = 62;
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");
1592 void OrTestEnum ()
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 ()
1606 dynamic d = 5;
1608 int? v2 = null;
1609 Assert<int?> (d | v2, null, "#1");
1610 Assert<int?> (d | null, null, "#1a");
1611 Assert<int?> (null | d, null, "#1b");
1613 v2 = -2;
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 ()
1627 dynamic d = true;
1629 var v = false;
1630 d |= v;
1631 Assert (d, true, "#1");
1632 d = true;
1633 d |= true;
1634 Assert (d, true, "#1a");
1636 d = 42;
1637 var v2 = 62;
1638 d |= v2;
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");
1653 d = MyEnum.Value_2;
1654 d |= d;
1655 Assert (d, MyEnum.Value_2, "#2");
1657 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
1658 Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
1661 void OrElseTest ()
1663 dynamic d = true;
1665 var v = false;
1666 Assert<bool> (d || v, true, "#1");
1668 Assert (d || true, true, "#1a");
1670 d = true;
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;
1684 int v = 2;
1685 Assert<ulong> (d >> v, 0x1FC00, "#1");
1686 Assert<ulong> (d >> 1, 0x3F800, "#1a");
1687 short s = 2;
1688 Assert<ulong> (d >> s, 0x1FC00, "#1b");
1690 d = 0x7F000;
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 ()
1699 dynamic d = 5;
1701 int? v2 = null;
1702 Assert<int?> (d >> v2, null, "#1");
1703 d = 5;
1704 Assert<int?> (d >> null, null, "#1a");
1705 d = 5;
1706 Assert<int?> (null >> d, null, "#1b");
1708 v2 = -2;
1709 Assert (d >> v2, 0, "#2");
1710 dynamic d2 = (int?) -200;
1711 Assert (d2 >> 1, -100, "#2a");
1714 void RightShiftAssignTest ()
1716 dynamic d = 0x7F000;
1718 int v = 2;
1719 d >>= v;
1720 Assert (d, 0x1FC00, "#1");
1721 d >>= 1;
1722 Assert (d, 0xFE00, "#1a");
1723 sbyte s = 2;
1724 d >>= s;
1725 Assert (d, 0x3F80, "#1b");
1728 void RightShiftAssignNullableTest ()
1730 dynamic d = 0x2A0;
1732 var v2 = -2;
1733 d >>= v2;
1734 Assert (d, 0, "#2");
1735 dynamic d2 = (int?) -2;
1736 d2 >>= 1;
1737 Assert (d2, -1, "#2a");
1740 void SubtractTest ()
1742 dynamic d = 5;
1744 int v = 2;
1745 Assert (d - v, 3, "#1");
1746 double v2 = 0.5;
1747 Assert (d - v2, 4.5, "#1a");
1749 d = new MyType (5);
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);
1756 decimal v4 = 4m;
1757 Assert (d - v4, 1m, "#4");
1760 void SubtractNullableTest ()
1762 dynamic d = 5;
1764 int? v2 = null;
1765 Assert<int?> (d - v2, null, "#1");
1766 Assert<int?> (d - null, null, "#1a");
1767 Assert<int?> (null - d, null, "#1b");
1769 v2 = -2;
1770 Assert (d - v2, 7, "#2");
1771 dynamic d2 = (int?) -2;
1772 Assert (d2 - 1, -3, "#2a");
1774 d = new MyType (5);
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);
1782 decimal? v4 = 4m;
1783 Assert (d - v4, 1m, "#4");
1784 v4 = null;
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 ()
1804 checked {
1805 dynamic d = 5;
1807 int v = int.MinValue;
1808 AssertChecked (() => d - v, 7, "#1");
1810 int? v2 = v;
1811 AssertChecked (() => d - v2, null, "#2");
1813 d = new MyType (5);
1814 MyType v3 = new MyType (int.MinValue);
1815 Assert (d - v3, new MyType (-2147483643), "#3");
1819 void SubtractAssignTest ()
1821 dynamic d = 5;
1823 int v = 2;
1824 d -= v;
1825 Assert (d, 3, "#1");
1827 d = 5.0;
1828 double v2 = 0.5;
1829 d -= v2;
1830 Assert (d, 4.5, "#1a");
1831 d -= v;
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");
1838 d = 5m;
1839 decimal v4 = 4m;
1840 d -= v4;
1841 Assert (d, 1m, "#4");
1844 void SubtractAssignEnumTest ()
1846 dynamic d = MyEnum.Value_1;
1848 d -= 1;
1849 Assert<MyEnum> (d, 0, "#2");
1851 dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
1852 d2 -= (byte) 1;
1853 Assert (d2, MyEnumUlong.Value_1, "#3");
1856 void SubtractAssignCheckedTest ()
1858 checked {
1859 dynamic d = 5;
1861 int v = int.MinValue;
1862 AssertChecked (() => { d -= v; Assert (d, 0, "#1a"); }, "#1");
1864 d = new MyType (5);
1865 MyType v3 = new MyType (int.MinValue);
1866 d -= v3;
1867 Assert (d, new MyType (-2147483643), "#3a");
1871 // TODO:
1872 void SubtractAssignmentEvent ()
1874 // IMPLEMENT
1877 void UnaryDecrement ()
1879 dynamic d = 3;
1880 Assert (3, d--, "#1");
1881 Assert (2, d, "#1a");
1883 d = 3;
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 ()
1894 checked {
1895 dynamic d = int.MinValue;
1897 AssertChecked (() => { d--; Assert (d, -1073741824, "#1a"); }, "#1");
1899 d = new MyType (int.MinValue);
1900 d--;
1901 Assert (d, new MyType (-1073741824), "#2");
1905 void UnaryIncrement ()
1907 dynamic d = 3;
1908 Assert (3, d++, "#1");
1909 Assert (4, d, "#1a");
1911 d = 3;
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 ()
1922 checked {
1923 dynamic d = int.MaxValue;
1925 AssertChecked (() => { d++; Assert (d, 0, "#1a"); }, "#1");
1927 d = new MyType (int.MaxValue);
1928 d++;
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");
1941 void UnaryIsTrue ()
1943 dynamic d = true;
1944 Assert (3, d ? 3 : 5, "#1");
1946 d = 4;
1947 Assert (false, d < 1, "#2");
1949 d = new InverseLogicalOperator (true);
1950 Assert (1, d ? 1 : -1, "#3");
1953 void UnaryPlus ()
1955 dynamic d = -8;
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");
1965 d = (uint) 7;
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);
1976 d = n1;
1977 Assert (new MyType (334455), +d, "#2");
1979 MyTypeImplicitOnly? n2 = new MyTypeImplicitOnly (4);
1980 d = n2;
1981 Assert (4, +d, "#3");
1983 d = (sbyte?) 7;
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);
1992 try {
1993 test.Invoke (new Tester (), null);
1994 Console.WriteLine ("OK");
1995 return true;
1996 } catch (Exception e) {
1997 Console.WriteLine ("FAILED");
1998 Console.WriteLine (e.InnerException.Message);
1999 return false;
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
2007 orderby test.Name
2008 select RunTest (test);
2010 int failures = tests.Count (a => !a);
2011 Console.WriteLine (failures + " tests failed");
2012 return failures;