using System;
using System.Collections.Generic;
using System.Linq;
-using System.Linq.Expressions;
using System.Reflection;
// Dynamic binary operator, unary operators and convert tests
class Tester
{
delegate void EmptyDelegate ();
- delegate int IntDelegate ();
+ event Action ev_assign;
static void Assert<T> (T expected, T value, string name)
{
{
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 ()
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 ()
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 ()
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 ()
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 ()
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 ()
{
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;
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 ()
decimal v4 = 4m;
d *= v4;
Assert (d, 20m, "#4");
+
+ int i = 3;
+ d = 5;
+ i *= d;
+ Assert (i, 15, "#5");
}
void MultiplyAssignCheckedTest ()
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 ()
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 ()
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 ()
{
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 ()
}
}
- // 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 ()
return true;
} catch (Exception e) {
Console.WriteLine ("FAILED");
- Console.WriteLine (e.InnerException.Message);
+ Console.WriteLine (e.ToString ());
return false;
}
}