.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
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.
 
 
 
 

155 lines
6.4 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
using System;
using System.Linq;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.CSharp.Parser.Expression
{
[TestFixture, Ignore("Port unit tests to new DOM")]
public class InvocationExpressionTests
{
[Test]
public void SimpleInvocationExpressionTest()
{
var ie = ParseUtilCSharp.ParseExpression<InvocationExpression>("myMethod()");
Assert.AreEqual(0, ie.Arguments.Count());
Assert.IsTrue(ie.Target is IdentifierExpression);
Assert.AreEqual("myMethod", ((IdentifierExpression)ie.Target).Identifier);
}
/* TODO port unit tests to new DOM
[Test]
public void GenericInvocationExpressionTest()
{
var expr = ParseUtilCSharp.ParseExpression<InvocationExpression>("myMethod<char>('a')");
Assert.AreEqual(1, expr.Arguments.Count());
Assert.IsTrue(expr.TargetObject is IdentifierExpression);
IdentifierExpression ident = (IdentifierExpression)expr.TargetObject;
Assert.AreEqual("myMethod", ident.Identifier);
Assert.AreEqual(1, ident.TypeArguments.Count);
Assert.AreEqual("System.Char", ident.TypeArguments[0].Type);
}
[Test]
public void GenericInvocation2ExpressionTest()
{
var expr = ParseUtilCSharp.ParseExpression<InvocationExpression>("myMethod<T,bool>()");
Assert.AreEqual(0, expr.Arguments.Count);
Assert.IsTrue(expr.TargetObject is IdentifierExpression);
IdentifierExpression ident = (IdentifierExpression)expr.TargetObject;
Assert.AreEqual("myMethod", ident.Identifier);
Assert.AreEqual(2, ident.TypeArguments.Count);
Assert.AreEqual("T", ident.TypeArguments[0].Type);
Assert.IsFalse(ident.TypeArguments[0].IsKeyword);
Assert.AreEqual("System.Boolean", ident.TypeArguments[1].Type);
Assert.IsTrue(ident.TypeArguments[1].IsKeyword);
}
[Test]
public void AmbiguousGrammarGenericMethodCall()
{
InvocationExpression ie = ParseUtilCSharp.ParseExpression<InvocationExpression>("F(G<A,B>(7))");
Assert.IsTrue(ie.TargetObject is IdentifierExpression);
Assert.AreEqual(1, ie.Arguments.Count);
ie = (InvocationExpression)ie.Arguments[0];
Assert.AreEqual(1, ie.Arguments.Count);
Assert.IsTrue(ie.Arguments[0] is PrimitiveExpression);
IdentifierExpression ident = (IdentifierExpression)ie.TargetObject;
Assert.AreEqual("G", ident.Identifier);
Assert.AreEqual(2, ident.TypeArguments.Count);
}
[Test]
public void AmbiguousGrammarNotAGenericMethodCall()
{
BinaryOperatorExpression boe = ParseUtilCSharp.ParseExpression<BinaryOperatorExpression>("F<A>+y");
Assert.AreEqual(BinaryOperatorType.GreaterThan, boe.Op);
Assert.IsTrue(boe.Left is BinaryOperatorExpression);
Assert.IsTrue(boe.Right is UnaryOperatorExpression);
}
[Test]
public void InvalidNestedInvocationExpressionTest()
{
// this test was written because this bug caused the AbstractASTVisitor to crash
InvocationExpression expr = ParseUtilCSharp.ParseExpression<InvocationExpression>("WriteLine(myMethod(,))", true);
Assert.IsTrue(expr.TargetObject is IdentifierExpression);
Assert.AreEqual("WriteLine", ((IdentifierExpression)expr.TargetObject).Identifier);
Assert.AreEqual(1, expr.Arguments.Count); // here a second null parameter was added incorrectly
Assert.IsTrue(expr.Arguments[0] is InvocationExpression);
CheckSimpleInvoke((InvocationExpression)expr.Arguments[0]);
}
[Test]
public void NestedInvocationPositions()
{
InvocationExpression expr = ParseUtilCSharp.ParseExpression<InvocationExpression>("a.B().C(args)");
Assert.AreEqual(new Location(8, 1), expr.StartLocation);
Assert.AreEqual(new Location(14, 1), expr.EndLocation);
MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject;
Assert.AreEqual(new Location(6, 1), mre.StartLocation);
Assert.AreEqual(new Location(8, 1), mre.EndLocation);
Assert.AreEqual(new Location(4, 1), mre.TargetObject.StartLocation);
Assert.AreEqual(new Location(6, 1), mre.TargetObject.EndLocation);
}
[Test]
public void InvocationOnGenericType()
{
InvocationExpression expr = ParseUtilCSharp.ParseExpression<InvocationExpression>("A<T>.Foo()");
MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject;
Assert.AreEqual("Foo", mre.MemberName);
TypeReferenceExpression tre = (TypeReferenceExpression)mre.TargetObject;
Assert.AreEqual("A", tre.TypeReference.Type);
Assert.AreEqual("T", tre.TypeReference.GenericTypes[0].Type);
}
[Test]
public void InvocationOnInnerClassInGenericType()
{
InvocationExpression expr = ParseUtilCSharp.ParseExpression<InvocationExpression>("A<T>.B.Foo()");
MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject;
Assert.AreEqual("Foo", mre.MemberName);
MemberReferenceExpression mre2 = (MemberReferenceExpression)mre.TargetObject;
Assert.AreEqual("B", mre2.MemberName);
TypeReferenceExpression tre = (TypeReferenceExpression)mre2.TargetObject;
Assert.AreEqual("A", tre.TypeReference.Type);
Assert.AreEqual("T", tre.TypeReference.GenericTypes[0].Type);
}
[Test]
public void InvocationOnGenericInnerClassInGenericType()
{
InvocationExpression expr = ParseUtilCSharp.ParseExpression<InvocationExpression>("A<T>.B.C<U>.Foo()");
MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject;
Assert.AreEqual("Foo", mre.MemberName);
TypeReferenceExpression tre = (TypeReferenceExpression)mre.TargetObject;
InnerClassTypeReference ictr = (InnerClassTypeReference)tre.TypeReference;
Assert.AreEqual("B.C", ictr.Type);
Assert.AreEqual(1, ictr.GenericTypes.Count);
Assert.AreEqual("U", ictr.GenericTypes[0].Type);
Assert.AreEqual("A", ictr.BaseType.Type);
Assert.AreEqual(1, ictr.BaseType.GenericTypes.Count);
Assert.AreEqual("T", ictr.BaseType.GenericTypes[0].Type);
}
[Test]
public void InvocationWithNamedArgument()
{
InvocationExpression expr = ParseUtilCSharp.ParseExpression<InvocationExpression>("a(arg: ref v)");
Assert.AreEqual(1, expr.Arguments.Count);
NamedArgumentExpression nae = (NamedArgumentExpression)expr.Arguments[0];
Assert.AreEqual("arg", nae.Name);
DirectionExpression dir = (DirectionExpression)nae.Expression;
Assert.AreEqual(FieldDirection.Ref, dir.FieldDirection);
Assert.IsInstanceOf<IdentifierExpression>(dir.Expression);
}*/
}
}