@ -10,295 +10,6 @@ namespace ICSharpCode.NRefactory.VB.Tests.Dom
@@ -10,295 +10,6 @@ namespace ICSharpCode.NRefactory.VB.Tests.Dom
[TestFixture]
public class MethodDeclarationTests
{
#region C#
[Test]
public void CSharpSimpleMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyMethod() {} " ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ) ;
Assert . IsFalse ( md . IsExtensionMethod ) ;
}
[Test]
public void CSharpAbstractMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "abstract void MyMethod();" ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ) ;
Assert . IsFalse ( md . IsExtensionMethod ) ;
Assert . IsTrue ( md . Body . IsNull ) ;
Assert . AreEqual ( Modifiers . Abstract , md . Modifier ) ;
}
[Test]
public void CSharpDefiningPartialMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "partial void MyMethod();" ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ) ;
Assert . IsFalse ( md . IsExtensionMethod ) ;
Assert . IsTrue ( md . Body . IsNull ) ;
Assert . AreEqual ( Modifiers . Partial , md . Modifier ) ;
}
[Test]
public void CSharpImplementingPartialMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "partial void MyMethod() { }" ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ) ;
Assert . IsFalse ( md . IsExtensionMethod ) ;
Assert . IsFalse ( md . Body . IsNull ) ;
Assert . AreEqual ( Modifiers . Partial , md . Modifier ) ;
}
[Test]
public void CSharpSimpleMethodRegionTest ( )
{
const string program = @ "
void MyMethod ( )
{
OtherMethod ( ) ;
}
";
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( program ) ;
Assert . AreEqual ( 2 , md . StartLocation . Line , "StartLocation.Y" ) ;
Assert . AreEqual ( 2 , md . EndLocation . Line , "EndLocation.Y" ) ;
Assert . AreEqual ( 3 , md . StartLocation . Column , "StartLocation.X" ) ;
// endLocation.X is currently 20. It should be 18, but that error is not critical
//Assert.AreEqual(18, md.EndLocation.X, "EndLocation.X");
}
[Test]
public void CSharpMethodWithModifiersRegionTest ( )
{
const string program = @ "
public static void MyMethod ( )
{
OtherMethod ( ) ;
}
";
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( program ) ;
Assert . AreEqual ( 2 , md . StartLocation . Line , "StartLocation.Y" ) ;
Assert . AreEqual ( 2 , md . EndLocation . Line , "EndLocation.Y" ) ;
Assert . AreEqual ( 3 , md . StartLocation . Column , "StartLocation.X" ) ;
}
[Test]
public void CSharpMethodWithUnnamedParameterDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyMethod(int) {} " , true ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( 1 , md . Parameters . Count ) ;
//Assert.AreEqual("?", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
}
[Test]
public void CSharpGenericVoidMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyMethod<T>(T a) {} " ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( 1 , md . Parameters . Count ) ;
Assert . AreEqual ( "T" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . TypeReference . Type ) ;
Assert . AreEqual ( "a" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . ParameterName ) ;
Assert . AreEqual ( 1 , md . Templates . Count ) ;
Assert . AreEqual ( "T" , md . Templates [ 0 ] . Name ) ;
}
[Test]
public void CSharpGenericMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "T MyMethod<T>(T a) {} " ) ;
Assert . AreEqual ( "T" , md . TypeReference . Type ) ;
Assert . AreEqual ( 1 , md . Parameters . Count ) ;
Assert . AreEqual ( "T" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . TypeReference . Type ) ;
Assert . AreEqual ( "a" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . ParameterName ) ;
Assert . AreEqual ( 1 , md . Templates . Count ) ;
Assert . AreEqual ( "T" , md . Templates [ 0 ] . Name ) ;
}
[Test]
public void CSharpGenericMethodDeclarationWithConstraintTest ( )
{
string program = "T MyMethod<T>(T a) where T : ISomeInterface {} " ;
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( program ) ;
Assert . AreEqual ( "T" , md . TypeReference . Type ) ;
Assert . AreEqual ( 1 , md . Parameters . Count ) ;
Assert . AreEqual ( "T" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . TypeReference . Type ) ;
Assert . AreEqual ( "a" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . ParameterName ) ;
Assert . AreEqual ( 1 , md . Templates . Count ) ;
Assert . AreEqual ( "T" , md . Templates [ 0 ] . Name ) ;
Assert . AreEqual ( 1 , md . Templates [ 0 ] . Bases . Count ) ;
Assert . AreEqual ( "ISomeInterface" , md . Templates [ 0 ] . Bases [ 0 ] . Type ) ;
}
[Test]
public void CSharpGenericMethodInInterface ( )
{
const string program = @ "interface MyInterface {
T MyMethod < T > ( T a ) where T : ISomeInterface ;
}
";
TypeDeclaration td = ParseUtilCSharp . ParseGlobal < TypeDeclaration > ( program ) ;
MethodDeclaration md = ( MethodDeclaration ) td . Children [ 0 ] ;
Assert . AreEqual ( "T" , md . TypeReference . Type ) ;
Assert . AreEqual ( 1 , md . Parameters . Count ) ;
Assert . AreEqual ( "T" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . TypeReference . Type ) ;
Assert . AreEqual ( "a" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . ParameterName ) ;
Assert . AreEqual ( 1 , md . Templates . Count ) ;
Assert . AreEqual ( "T" , md . Templates [ 0 ] . Name ) ;
Assert . AreEqual ( 1 , md . Templates [ 0 ] . Bases . Count ) ;
Assert . AreEqual ( "ISomeInterface" , md . Templates [ 0 ] . Bases [ 0 ] . Type ) ;
}
[Test]
public void CSharpGenericVoidMethodInInterface ( )
{
const string program = @ "interface MyInterface {
void MyMethod < T > ( T a ) where T : ISomeInterface ;
}
";
TypeDeclaration td = ParseUtilCSharp . ParseGlobal < TypeDeclaration > ( program ) ;
MethodDeclaration md = ( MethodDeclaration ) td . Children [ 0 ] ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( 1 , md . Parameters . Count ) ;
Assert . AreEqual ( "T" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . TypeReference . Type ) ;
Assert . AreEqual ( "a" , ( ( ParameterDeclarationExpression ) md . Parameters [ 0 ] ) . ParameterName ) ;
Assert . AreEqual ( 1 , md . Templates . Count ) ;
Assert . AreEqual ( "T" , md . Templates [ 0 ] . Name ) ;
Assert . AreEqual ( 1 , md . Templates [ 0 ] . Bases . Count ) ;
Assert . AreEqual ( "ISomeInterface" , md . Templates [ 0 ] . Bases [ 0 ] . Type ) ;
}
[Test]
public void CSharpShadowingMethodInInterface ( )
{
const string program = @ "interface MyInterface : IDisposable {
new void Dispose ( ) ;
}
";
TypeDeclaration td = ParseUtilCSharp . ParseGlobal < TypeDeclaration > ( program ) ;
MethodDeclaration md = ( MethodDeclaration ) td . Children [ 0 ] ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ) ;
Assert . AreEqual ( Modifiers . New , md . Modifier ) ;
}
[Test]
public void CSharpMethodImplementingInterfaceTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "int MyInterface.MyMethod() {} " ) ;
Assert . AreEqual ( "System.Int32" , md . TypeReference . Type ) ;
Assert . AreEqual ( "MyInterface" , md . InterfaceImplementations [ 0 ] . InterfaceType . Type ) ;
}
[Test]
public void CSharpMethodImplementingGenericInterfaceTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "int MyInterface<string>.MyMethod() {} " ) ;
Assert . AreEqual ( "System.Int32" , md . TypeReference . Type ) ;
Assert . AreEqual ( "MyInterface" , md . InterfaceImplementations [ 0 ] . InterfaceType . Type ) ;
Assert . AreEqual ( "System.String" , md . InterfaceImplementations [ 0 ] . InterfaceType . GenericTypes [ 0 ] . Type ) ;
}
[Test]
public void CSharpVoidMethodImplementingInterfaceTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyInterface.MyMethod() {} " ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( "MyInterface" , md . InterfaceImplementations [ 0 ] . InterfaceType . Type ) ;
}
[Test]
public void CSharpVoidMethodImplementingGenericInterfaceTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyInterface<string>.MyMethod() {} " ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( "MyInterface" , md . InterfaceImplementations [ 0 ] . InterfaceType . Type ) ;
Assert . AreEqual ( "System.String" , md . InterfaceImplementations [ 0 ] . InterfaceType . GenericTypes [ 0 ] . Type ) ;
}
[Test]
public void CSharpIncompleteConstraintsTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > (
"void a<T>() where T { }" , true /* expect errors */
) ;
Assert . AreEqual ( "a" , md . Name ) ;
Assert . AreEqual ( 1 , md . Templates . Count ) ;
Assert . AreEqual ( "T" , md . Templates [ 0 ] . Name ) ;
Assert . AreEqual ( 0 , md . Templates [ 0 ] . Bases . Count ) ;
}
[Test]
public void CSharpExtensionMethodTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > (
"public static int ToInt32(this string s) { return int.Parse(s); }"
) ;
Assert . AreEqual ( "ToInt32" , md . Name ) ;
Assert . IsTrue ( md . IsExtensionMethod ) ;
Assert . AreEqual ( "s" , md . Parameters [ 0 ] . ParameterName ) ;
Assert . AreEqual ( "System.String" , md . Parameters [ 0 ] . TypeReference . Type ) ;
}
[Test]
public void CSharpVoidExtensionMethodTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > (
"public static void Print(this string s) { Console.WriteLine(s); }"
) ;
Assert . AreEqual ( "Print" , md . Name ) ;
Assert . IsTrue ( md . IsExtensionMethod ) ;
Assert . AreEqual ( "s" , md . Parameters [ 0 ] . ParameterName ) ;
Assert . AreEqual ( "System.String" , md . Parameters [ 0 ] . TypeReference . Type ) ;
}
[Test]
public void CSharpMethodWithEmptyAssignmentErrorInBody ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > (
"void A\n" +
"{\n" +
"int a = 3;\n" +
" = 4;\n" +
"}" , true /* expect errors */
) ;
Assert . AreEqual ( "A" , md . Name ) ;
Assert . AreEqual ( new Location ( 1 , 2 ) , md . Body . StartLocation ) ;
Assert . AreEqual ( new Location ( 2 , 5 ) , md . Body . EndLocation ) ;
}
[Test]
public void CSharpOptionalParameterTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > (
"public void Foo(string bar = null, int baz = 0) { }"
) ;
Assert . AreEqual ( "Foo" , md . Name ) ;
Assert . AreEqual ( "bar" , md . Parameters [ 0 ] . ParameterName ) ;
Assert . AreEqual ( "System.String" , md . Parameters [ 0 ] . TypeReference . Type ) ;
Assert . AreEqual ( ParameterModifiers . In | ParameterModifiers . Optional , md . Parameters [ 0 ] . ParamModifier ) ;
Assert . IsNull ( ( ( PrimitiveExpression ) md . Parameters [ 0 ] . DefaultValue ) . Value ) ;
Assert . AreEqual ( "baz" , md . Parameters [ 1 ] . ParameterName ) ;
Assert . AreEqual ( "System.Int32" , md . Parameters [ 1 ] . TypeReference . Type ) ;
Assert . AreEqual ( ParameterModifiers . In | ParameterModifiers . Optional , md . Parameters [ 1 ] . ParamModifier ) ;
Assert . AreEqual ( 0 , ( ( PrimitiveExpression ) md . Parameters [ 1 ] . DefaultValue ) . Value ) ;
}
#endregion
#region VB.NET
[Test]