mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
250 lines
5.5 KiB
250 lines
5.5 KiB
using System; |
|
|
|
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
|
{ |
|
internal class DynamicTests |
|
{ |
|
private static dynamic field; |
|
private static object objectField; |
|
public dynamic Property { |
|
get; |
|
set; |
|
} |
|
|
|
public DynamicTests() |
|
{ |
|
} |
|
|
|
public DynamicTests(dynamic test) |
|
{ |
|
} |
|
|
|
public DynamicTests(DynamicTests test) |
|
{ |
|
} |
|
|
|
private static void InvokeConstructor() |
|
{ |
|
DynamicTests dynamicTests = new DynamicTests(); |
|
dynamic val = new DynamicTests(); |
|
val.Test(new UnauthorizedAccessException()); |
|
dynamic val2 = new DynamicTests(val); |
|
val2.Get(new DynamicTests((DynamicTests)val)); |
|
val2.Call(new DynamicTests((dynamic)dynamicTests)); |
|
} |
|
|
|
private static dynamic InlineAssign(object a, out dynamic b) |
|
{ |
|
return b = ((dynamic)a).Test; |
|
} |
|
|
|
private static dynamic SelfReference(dynamic d) |
|
{ |
|
return d[d, d] = d; |
|
} |
|
|
|
private static dynamic LongArgumentListFunc(dynamic d) |
|
{ |
|
// Func`13 |
|
return d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); |
|
} |
|
|
|
private static void LongArgumentListAction(dynamic d) |
|
{ |
|
// Action`13 |
|
d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); |
|
} |
|
|
|
private static void DynamicThrow() |
|
{ |
|
try { |
|
throw (Exception)field; |
|
} catch (Exception ex) { |
|
Console.WriteLine(ex.ToString()); |
|
throw; |
|
} |
|
} |
|
|
|
private static void MemberAccess(dynamic a) |
|
{ |
|
a.Test1(); |
|
a.GenericTest<int, int>(); |
|
a.Test2(1); |
|
a.Test3(a.InnerTest(1, 2, 3, 4, 5)); |
|
a.Test4(2, null, a.Index[0]); |
|
a.Test5(a, a.Number, a.String); |
|
a[0] = 3; |
|
a.Index[a.Number] = 5; |
|
a.Setter = new DynamicTests(); |
|
a.Setter2 = 5; |
|
} |
|
|
|
private static void RequiredCasts() |
|
{ |
|
((dynamic)objectField).A = 5; |
|
((dynamic)objectField).B += 5; |
|
((dynamic)objectField).Call(); |
|
((object)field).ToString(); |
|
field.Call("Hello World"); |
|
field.Call((object)"Hello World"); |
|
field.Call((dynamic)"Hello World"); |
|
} |
|
|
|
private static void DynamicCallWithString() |
|
{ |
|
field.Call("Hello World"); |
|
} |
|
|
|
private static void DynamicCallWithNamedArgs() |
|
{ |
|
field.Call(a: "Hello World"); |
|
} |
|
|
|
private static void DynamicCallWithRefOutArg(int a, out int b) |
|
{ |
|
field.Call(ref a, out b); |
|
} |
|
|
|
private static void DynamicCallWithStringCastToObj() |
|
{ |
|
field.Call((object)"Hello World"); |
|
} |
|
|
|
private static void DynamicCallWithStringCastToDynamic() |
|
{ |
|
field.Call((dynamic)"Hello World"); |
|
} |
|
|
|
private static void DynamicCallWithStringCastToDynamic2() |
|
{ |
|
field.Call((dynamic)"Hello World", 5, null); |
|
} |
|
|
|
private static void DynamicCallWithStringCastToDynamic3() |
|
{ |
|
field.Call((dynamic)"Hello World", 5u, null); |
|
} |
|
|
|
private static void Invocation(dynamic a, dynamic b) |
|
{ |
|
a(null, b.Test()); |
|
} |
|
|
|
private static dynamic Test1(dynamic a) |
|
{ |
|
dynamic val = a.IndexedProperty; |
|
return val[0]; |
|
} |
|
|
|
private static dynamic Test2(dynamic a) |
|
{ |
|
return a.IndexedProperty[0]; |
|
} |
|
|
|
private static void ArithmeticBinaryOperators(dynamic a, dynamic b) |
|
{ |
|
DynamicTests.MemberAccess(a + b); |
|
DynamicTests.MemberAccess(a + 1); |
|
DynamicTests.MemberAccess(a + null); |
|
DynamicTests.MemberAccess(a - b); |
|
DynamicTests.MemberAccess(a - 1); |
|
DynamicTests.MemberAccess(a - null); |
|
DynamicTests.MemberAccess(a * b); |
|
DynamicTests.MemberAccess(a * 1); |
|
DynamicTests.MemberAccess(a * null); |
|
DynamicTests.MemberAccess(a / b); |
|
DynamicTests.MemberAccess(a / 1); |
|
DynamicTests.MemberAccess(a / null); |
|
DynamicTests.MemberAccess(a % b); |
|
DynamicTests.MemberAccess(a % 1); |
|
DynamicTests.MemberAccess(a % null); |
|
} |
|
|
|
private static void RelationalOperators(dynamic a, dynamic b) |
|
{ |
|
DynamicTests.MemberAccess(a == b); |
|
DynamicTests.MemberAccess(a == 1); |
|
DynamicTests.MemberAccess(a == null); |
|
DynamicTests.MemberAccess(a != b); |
|
DynamicTests.MemberAccess(a != 1); |
|
DynamicTests.MemberAccess(a != null); |
|
DynamicTests.MemberAccess(a < b); |
|
DynamicTests.MemberAccess(a < 1); |
|
DynamicTests.MemberAccess(a < null); |
|
DynamicTests.MemberAccess(a > b); |
|
DynamicTests.MemberAccess(a > 1); |
|
DynamicTests.MemberAccess(a > null); |
|
DynamicTests.MemberAccess(a >= b); |
|
DynamicTests.MemberAccess(a >= 1); |
|
DynamicTests.MemberAccess(a >= null); |
|
DynamicTests.MemberAccess(a <= b); |
|
DynamicTests.MemberAccess(a <= 1); |
|
DynamicTests.MemberAccess(a <= null); |
|
} |
|
|
|
private static void Casts(dynamic a) |
|
{ |
|
Console.WriteLine(); |
|
MemberAccess((int)a); |
|
} |
|
|
|
private static void CompoundAssignment(dynamic a, dynamic b) |
|
{ |
|
a.Setter2 += 5; |
|
a.Setter2 -= 1; |
|
a.Setter2 *= 2; |
|
a.Setter2 /= 5; |
|
a.Setter2 += b; |
|
a.Setter2 -= b; |
|
a.Setter2 *= b; |
|
a.Setter2 /= b; |
|
field.Setter += 5; |
|
field.Setter -= 5; |
|
} |
|
|
|
private static void InlineCompoundAssignment(dynamic a, dynamic b) |
|
{ |
|
Console.WriteLine(a.Setter2 += 5); |
|
Console.WriteLine(a.Setter2 -= 1); |
|
Console.WriteLine(a.Setter2 *= 2); |
|
Console.WriteLine(a.Setter2 /= 5); |
|
Console.WriteLine(a.Setter2 += b); |
|
Console.WriteLine(a.Setter2 -= b); |
|
Console.WriteLine(a.Setter2 *= b); |
|
Console.WriteLine(a.Setter2 /= b); |
|
} |
|
|
|
private static void UnaryOperators(dynamic a) |
|
{ |
|
// TODO : beautify inc/dec on locals |
|
//a--; |
|
//a++; |
|
//--a; |
|
//++a; |
|
DynamicTests.Casts(-a); |
|
DynamicTests.Casts(+a); |
|
} |
|
|
|
private static void Loops(dynamic list) |
|
{ |
|
foreach (dynamic item in list) { |
|
DynamicTests.UnaryOperators(item); |
|
} |
|
} |
|
|
|
private static void If(dynamic a, dynamic b) |
|
{ |
|
if (a == b) { |
|
Console.WriteLine("Equal"); |
|
} |
|
} |
|
|
|
private static void If2(dynamic a, dynamic b) |
|
{ |
|
// TODO : beautify complex conditions |
|
//if (a == null || b == null) { |
|
// Console.WriteLine("Equal"); |
|
//} |
|
} |
|
} |
|
}
|
|
|