Bump NuGet.BuildTasks to get new updates and switch to `dev` branch (#5566)
[mono.git] / mcs / tests / dtest-006.cs
index df4c736661e0e33bac6ef3c7557a0aaf71575328..4d80081df540c48b18161d2157352a64afedc54c 100644 (file)
@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Linq.Expressions;
 using System.Reflection;
 
 // Dynamic binary operator, unary operators and convert tests
@@ -219,7 +218,7 @@ enum MyEnumUlong : ulong
 class Tester
 {
        delegate void EmptyDelegate ();
-       delegate int IntDelegate ();
+       event Action ev_assign;
 
        static void Assert<T> (T expected, T value, string name)
        {
@@ -306,14 +305,14 @@ class Tester
        {
                dynamic d = MyEnum.Value_1;
 
-               // CSC: Invalid System.InvalidOperationException
-               Assert (d + null, null, "#1");
-
-               Assert (d + 1, MyEnum.Value_2, "#2");
+               Assert (d + 1, MyEnum.Value_2, "#1");
 
                dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
-               Assert (d2 + (byte) 1, MyEnumUlong.Value_2, "#3");
-               Assert<MyEnumUlong?> (d2 + (object) null, null, "#3a");
+               Assert (d2 + (byte) 1, MyEnumUlong.Value_2, "#2");
+               Assert<MyEnumUlong?> (d2 + null, null, "#2a");
+               
+               // CSC: Invalid System.InvalidOperationException
+               Assert<MyEnum?> (d + null, null, "#1");
        }
        
        void AddCheckedTest ()
@@ -461,10 +460,12 @@ class Tester
                Assert (d, "foo4", "#2");
        }
 
-       // TODO:
-       void AddAssignmentEvent ()
+       void AddAssignEvent ()
        {
-               // IMPLEMENT
+               dynamic d = null;
+               
+               // FIXME: Will have to special case events
+               // ev_assign += d;
        }
 
        void AndTest ()
@@ -522,6 +523,11 @@ class Tester
                dynamic d3 = new MyType? (new MyType (-7));
                Assert (d3 & new MyType (6), new MyType (0), "#3a");
                Assert<MyType?> (d3 + null, null, "#3b");
+
+               dynamic a = (bool?) true;
+               dynamic b = (bool?) null;
+               Assert (a & b, (bool?)null, "#4a");
+               Assert (b & a, (bool?)null, "#4b");
        }
 
        void AndAssignedTest ()
@@ -574,9 +580,6 @@ class Tester
 
                dynamic d3 = new MyType (-7);
                Assert<MyType> (d3 && new MyType (6), new MyType (0), "#3");
-
-               d3 = new MyTypeImplicitOnly (5);
-               Assert (d3 && 11, 1, "#3b");
        }
 
        void DivideTest ()
@@ -690,6 +693,13 @@ class Tester
                bool b = false;
                var r = b ? d : "ss";
                Assert ("ss", r, "#6");
+               
+               var v = new [] { d, 1 };
+               Assert ("aa", v [0], "#7");
+               
+               dynamic [,] a = new dynamic [,] { { 1, 2 }, { 'b', 'x' } };
+               Assert (2, a [0, 1], "#8");
+               Assert ('x', a [1, 1], "#8a");
        }
 
        int ConvertImplicitReturnTest ()
@@ -733,6 +743,14 @@ class Tester
                        AssertChecked<uint?> (() => (uint?) d, 2, "#2");
                }
        }
+       
+       void ConvertArray ()
+       {
+               dynamic idx = (uint) 1;
+               var arr = new int [5];
+               arr [idx] = 2;
+               Assert (2, arr [idx], "#1");
+       }
 
        void EqualTest ()
        {
@@ -1086,6 +1104,14 @@ class Tester
                Assert (d2 >= null, false, "#3a");
        }
 
+       void IsTest ()
+       {
+               dynamic d = 1;
+               Assert (d is long, false, "#1");
+               Assert (d is int, true, "#2");
+               Assert (d is string, false, "#3");
+       }
+
        void LeftShiftTest ()
        {
                dynamic d = (ulong) 0x7F000;
@@ -1119,6 +1145,9 @@ class Tester
                Assert (d << v2, 0x40000000, "#2");
                dynamic d2 = (int?) -2;
                Assert (d2 << 1, -4, "#2a");
+
+               dynamic d3 = (int?) null;
+               Assert (d3 << (null << null), (int?)null, "#3");
        }
 
        void LeftShiftAssignTest ()
@@ -1454,6 +1483,11 @@ class Tester
                decimal v4 = 4m;
                d *= v4;
                Assert (d, 20m, "#4");
+               
+               int i = 3;
+               d = 5;
+               i *= d;
+               Assert (i, 15, "#5");
        }
 
        void MultiplyAssignCheckedTest ()
@@ -1587,6 +1621,11 @@ class Tester
                Assert (d != true, false, "#5");
                Assert (d != null, true, "#5a");
                Assert (d != false, true, "#5b");
+
+               d = null;
+               long? l = null;
+               Assert (d != l, false, "#6a");
+               Assert (l != d, false, "#6b");
        }
 
        void NotEqualEnumTest ()
@@ -1742,9 +1781,6 @@ class Tester
 
                dynamic d3 = new MyType (-7);
                Assert<MyType> (d3 || new MyType (6), new MyType (-7), "#3");
-
-               d3 = new MyTypeImplicitOnly (-7);
-               Assert (d3 || 11, -7, "#3b");
        }
 
        void RightShiftTest ()
@@ -1779,6 +1815,9 @@ class Tester
                Assert (d >> v2, 0, "#2");
                dynamic d2 = (int?) -200;
                Assert (d2 >> 1, -100, "#2a");
+
+               dynamic d3 = (int?) null;
+               Assert (d3 >> (null >> null), (int?) null, "#3");
        }
 
        void RightShiftAssignTest ()
@@ -1859,14 +1898,14 @@ class Tester
        {
                dynamic d = MyEnum.Value_1;
 
-               // CSC: Invalid System.InvalidOperationException
-               Assert (d - null, null, "#1");
-
-               Assert (d - 1, MyEnum.Value_2, "#2");
+               Assert<MyEnum> (d - 1, 0, "#1");
 
-               dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
-               Assert (d2 - (byte) 1, MyEnumUlong.Value_2, "#3");
-               Assert<MyEnumUlong?> (d2 - (object) null, null, "#3a");
+               dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
+               Assert (d2 - (byte) 1, MyEnumUlong.Value_1, "#2");
+               Assert<MyEnumUlong?> (d2 - null, null, "#2a");
+               
+               // CSC: Invalid System.InvalidOperationException
+               Assert<MyEnum?> (d - null, null, "#3");
        }
 
        void SubtractCheckedTest ()
@@ -1938,10 +1977,14 @@ class Tester
                }
        }
 
-       // TODO:
-       void SubtractAssignmentEvent ()
+       void SubtractAssignEvent ()
        {
-               // IMPLEMENT
+               Action print = () => { Console.WriteLine ("foo"); };
+               dynamic d = print;
+               
+               // FIXME: Will have to special case events
+               //ev_assign -= d;
+               //ev_assign ();
        }
 
        void UnaryDecrement ()
@@ -2065,7 +2108,7 @@ class Tester
                        return true;
                } catch (Exception e) {
                        Console.WriteLine ("FAILED");
-                       Console.WriteLine (e.InnerException.Message);
+                       Console.WriteLine (e.ToString ());
                        return false;
                }
        }