@ -3,49 +3,50 @@
@@ -3,49 +3,50 @@
using System ;
using System.Linq ;
using ICSharpCode.NRefactory.TypeSystem ;
using NUnit.Framework ;
namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
{
[TestFixture]
[TestFixture, Ignore("Generics not yet implemented") ]
public class MethodDeclarationTests
{
[Test, Ignore("type references not yet implemented") ]
[Test]
public void SimpleMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyMethod() {} " ) ;
Assert . AreEqual ( "System.V oid" , md . ReturnType ) ;
Assert . AreEqual ( "v oid" , ( ( PrimitiveType ) md . ReturnType ) . Keyword ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ( ) ) ;
Assert . IsFalse ( md . IsExtensionMethod ) ;
}
[Test, Ignore("type references not yet implemented") ]
[Test]
public void AbstractMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "abstract void MyMethod();" ) ;
Assert . AreEqual ( "System.V oid" , md . ReturnType ) ;
Assert . AreEqual ( "v oid" , ( ( PrimitiveType ) md . ReturnType ) . Keyword ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ( ) ) ;
Assert . IsFalse ( md . IsExtensionMethod ) ;
Assert . IsTrue ( md . Body . IsNull ) ;
Assert . AreEqual ( Modifiers . Abstract , md . Modifiers ) ;
}
[Test, Ignore("type references not yet implemented") ]
[Test]
public void DefiningPartialMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "partial void MyMethod();" ) ;
Assert . AreEqual ( "System.V oid" , md . ReturnType ) ;
Assert . AreEqual ( "v oid" , ( ( PrimitiveType ) md . ReturnType ) . Keyword ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ( ) ) ;
Assert . IsFalse ( md . IsExtensionMethod ) ;
Assert . IsTrue ( md . Body . IsNull ) ;
Assert . AreEqual ( Modifiers . Partial , md . Modifiers ) ;
}
[Test, Ignore("type references not yet implemented") ]
[Test]
public void ImplementingPartialMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "partial void MyMethod() { }" ) ;
Assert . AreEqual ( "System.V oid" , md . ReturnType ) ;
Assert . AreEqual ( "v oid" , ( ( PrimitiveType ) md . ReturnType ) . Keyword ) ;
Assert . AreEqual ( 0 , md . Parameters . Count ( ) ) ;
Assert . IsFalse ( md . IsExtensionMethod ) ;
Assert . IsFalse ( md . Body . IsNull ) ;
@ -81,6 +82,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
@@ -81,6 +82,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
Assert . AreEqual ( 2 , md . StartLocation . Line , "StartLocation.Y" ) ;
Assert . AreEqual ( 5 , md . EndLocation . Line , "EndLocation.Y" ) ;
Assert . AreEqual ( 3 , md . StartLocation . Column , "StartLocation.X" ) ;
Assert . AreEqual ( 4 , md . EndLocation . Column , "EndLocation.X" ) ;
}
[Test]
@ -89,142 +91,176 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
@@ -89,142 +91,176 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyMethod(int) {} " , true ) ;
Assert . AreEqual ( "System.Void" , md . ReturnType ) ;
Assert . AreEqual ( 1 , md . Parameters . Count ( ) ) ;
//Assert.AreEqual("?", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
Assert . AreEqual ( "int" , ( ( PrimitiveType ) md . Parameters . Single ( ) . Type ) . Keyword ) ;
}
/ * TODO : port unit tests
[Test]
public void GenericVoidMethodDeclarationTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyMethod<T>(T a) {} " ) ;
Assert . AreEqual ( "System.Void" , md . ReturnType ) ;
Assert . AreEqual ( 1 , md . Parameters . Count ( ) ) ;
Assert . AreEqual ( "T" , md . Parameters . Single ( ) . Type ) ;
Assert . AreEqual ( "a" , md . Parameters . Single ( ) . Name ) ;
Assert . AreEqual ( 1 , md . TypeParameters . Count ( ) ) ;
Assert . AreEqual ( "T" , md . Templates [ 0 ] . Name ) ;
ParseUtilCSharp . AssertTypeMember (
"void MyMethod<T>(T a) {} " ,
new MethodDeclaration {
ReturnType = new PrimitiveType ( "void" ) ,
Name = "MyMethod" ,
TypeParameters = { new TypeParameterDeclaration { Name = "T" } } ,
Parameters = { new ParameterDeclaration ( new SimpleType ( "T" ) , "a" ) } ,
Body = new BlockStatement ( )
} ) ;
}
[Test]
public void GenericMethodDeclarationTest ( )
{
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 ) ;
ParseUtilCSharp . AssertTypeMember (
"T MyMethod<T>(T a) {} " ,
new MethodDeclaration {
ReturnType = new SimpleType ( "T" ) ,
Name = "MyMethod" ,
TypeParameters = { new TypeParameterDeclaration { Name = "T" } } ,
Parameters = { new ParameterDeclaration ( new SimpleType ( "T" ) , "a" ) } ,
Body = new BlockStatement ( )
} ) ;
}
[Test]
public void GenericMethodDeclarationWithConstraintTest ( )
{
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 ) ;
ParseUtilCSharp . AssertTypeMember (
"T MyMethod<T>(T a) where T : ISomeInterface {} " ,
new MethodDeclaration {
ReturnType = new SimpleType ( "T" ) ,
Name = "MyMethod" ,
TypeParameters = { new TypeParameterDeclaration { Name = "T" } } ,
Parameters = { new ParameterDeclaration ( new SimpleType ( "T" ) , "a" ) } ,
Constraints = {
new Constraint {
TypeParameter = "T" ,
BaseTypes = { new SimpleType ( "ISomeInterface" ) }
}
} ,
Body = new BlockStatement ( )
} ) ;
}
[Test]
public void GenericMethodInInterface ( )
{
const string program = @ "interface MyInterface {
ParseUtilCSharp . AssertGlobal (
@ "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 ) ;
",
new TypeDeclaration {
ClassType = ClassType . Interface ,
Members = {
new MethodDeclaration {
ReturnType = new SimpleType ( "T" ) ,
Name = "MyMethod" ,
TypeParameters = { new TypeParameterDeclaration { Name = "T" } } ,
Parameters = { new ParameterDeclaration ( new SimpleType ( "T" ) , "a" ) } ,
Constraints = {
new Constraint {
TypeParameter = "T" ,
BaseTypes = { new SimpleType ( "ISomeInterface" ) }
}
}
} } } ) ;
}
[Test]
public void GenericVoidMethodInInterface ( )
{
const string program = @ "interface MyInterface {
ParseUtilCSharp . AssertGlobal (
@ "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 ) ;
",
new TypeDeclaration {
ClassType = ClassType . Interface ,
Members = {
new MethodDeclaration {
ReturnType = new PrimitiveType ( "void" ) ,
Name = "MyMethod" ,
TypeParameters = { new TypeParameterDeclaration { Name = "T" } } ,
Parameters = { new ParameterDeclaration ( new SimpleType ( "T" ) , "a" ) } ,
Constraints = {
new Constraint {
TypeParameter = "T" ,
BaseTypes = { new SimpleType ( "ISomeInterface" ) }
}
}
} } } ) ;
}
[Test]
public void ShadowingMethodInInterface ( )
{
const string program = @ "interface MyInterface : IDisposable {
ParseUtilCSharp . AssertGlobal (
@ "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 ) ;
",
new TypeDeclaration {
ClassType = ClassType . Interface ,
BaseTypes = { new SimpleType ( "IDisposable" ) } ,
Members = {
new MethodDeclaration {
Modifiers = Modifiers . New ,
ReturnType = new PrimitiveType ( "void" ) ,
Name = "Dispose"
} } } ) ;
}
[Test]
public void MethodImplementingInterfaceTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "int MyInterface.MyMethod() {} " ) ;
Assert . AreEqual ( "System.Int32" , md . TypeReference . Type ) ;
Assert . AreEqual ( "MyInterface" , md . InterfaceImplementations [ 0 ] . InterfaceType . Type ) ;
ParseUtilCSharp . AssertGlobal (
"int MyInterface.MyMethod() {} " ,
new MethodDeclaration {
ReturnType = new PrimitiveType ( "int" ) ,
PrivateImplementationType = new SimpleType ( "MyInterface" ) ,
Name = "MyMethod" ,
Body = new BlockStatement ( )
} ) ;
}
[Test]
public void MethodImplementingGenericInterfaceTest ( )
{
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 ) ;
ParseUtilCSharp . AssertGlobal (
"int MyInterface<string>.MyMethod() {} " ,
new MethodDeclaration {
ReturnType = new PrimitiveType ( "int" ) ,
PrivateImplementationType = new SimpleType ( "MyInterface" ) { TypeArguments = { new PrimitiveType ( "string" ) } } ,
Name = "MyMethod" ,
Body = new BlockStatement ( )
} ) ;
}
[Test]
public void VoidMethodImplementingInterfaceTest ( )
{
MethodDeclaration md = ParseUtilCSharp . ParseTypeMember < MethodDeclaration > ( "void MyInterface.MyMethod() {} " ) ;
Assert . AreEqual ( "System.Void" , md . TypeReference . Type ) ;
Assert . AreEqual ( "MyInterface" , md . InterfaceImplementations [ 0 ] . InterfaceType . Type ) ;
ParseUtilCSharp . AssertGlobal (
"void MyInterface.MyMethod() {} " ,
new MethodDeclaration {
ReturnType = new PrimitiveType ( "void" ) ,
PrivateImplementationType = new SimpleType ( "MyInterface" ) ,
Name = "MyMethod" ,
Body = new BlockStatement ( )
} ) ;
}
[Test]
public void VoidMethodImplementingGenericInterfaceTest ( )
{
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 ) ;
ParseUtilCSharp . AssertGlobal (
"void MyInterface<string>.MyMethod() {} " ,
new MethodDeclaration {
ReturnType = new PrimitiveType ( "void" ) ,
PrivateImplementationType = new SimpleType ( "MyInterface" ) ,
Name = "MyMethod" ,
Body = new BlockStatement ( )
} ) ;
}
[Test]
@ -234,9 +270,9 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
@@ -234,9 +270,9 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
"void a<T>() where T { }" , true // expect errors
) ;
Assert . AreEqual ( "a" , md . Name ) ;
Assert . AreEqual ( 1 , md . Template s . Count ) ;
Assert . AreEqual ( "T" , md . Templates [ 0 ] . Name ) ;
Assert . AreEqual ( 0 , md . Templates [ 0 ] . Bases . Count ) ;
Assert . AreEqual ( 1 , md . TypeParameter s . Count ) ;
Assert . AreEqual ( "T" , md . TypeParameters . Single ( ) . Name ) ;
Assert . AreEqual ( 0 , md . Constraints . Count ( ) ) ;
}
[Test]
@ -246,11 +282,11 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
@@ -246,11 +282,11 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
"public static int ToInt32(this string s) { return int.Parse(s); }"
) ;
Assert . AreEqual ( "ToInt32" , md . Name ) ;
Assert . AreEqual ( "s" , md . Parameters . First ( ) . Name ) ;
Assert . AreEqual ( ParameterModifier . This , md . Parameters . First ( ) . ParameterModifier ) ;
Assert . AreEqual ( "string" , ( ( PrimitiveType ) md . Parameters . First ( ) . Type ) . Keyword ) ;
Assert . IsTrue ( md . IsExtensionMethod ) ;
Assert . AreEqual ( "s" , md . Parameters [ 0 ] . ParameterName ) ;
Assert . AreEqual ( "System.String" , md . Parameters [ 0 ] . TypeReference . Type ) ;
}
* /
[Test]
public void VoidExtensionMethodTest ( )
@ -265,7 +301,6 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
@@ -265,7 +301,6 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
Assert . IsTrue ( md . IsExtensionMethod ) ;
}
/ * TODO
[Test]
public void MethodWithEmptyAssignmentErrorInBody ( )
{
@ -277,27 +312,32 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
@@ -277,27 +312,32 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
"}" , 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 ) ;
Assert . AreEqual ( new Ast Location( 1 , 2 ) , md . Body . StartLocation ) ;
Assert . AreEqual ( new Ast Location( 2 , 5 ) , md . Body . EndLocation ) ;
}
[Test]
public void OptionalParameterTest ( )
{
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 ) ;
} * /
ParseUtilCSharp . AssertTypeMember (
"public void Foo(string bar = null, int baz = 0) { }" ,
new MethodDeclaration {
Modifiers = Modifiers . Public ,
ReturnType = new PrimitiveType ( "void" ) ,
Name = "Foo" ,
Body = new BlockStatement ( ) ,
Parameters = {
new ParameterDeclaration {
Type = new PrimitiveType ( "string" ) ,
Name = "bar" ,
DefaultExpression = new NullReferenceExpression ( )
} ,
new ParameterDeclaration {
Type = new PrimitiveType ( "int" ) ,
Name = "baz" ,
DefaultExpression = new PrimitiveExpression ( 0 )
}
} } ) ;
}
}
}