1
ļ»æ// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using ICSharpCode.NRefactory.VB.Ast;
8
namespace ICSharpCode.NRefactory.VB.Tests.Ast
11
public class MethodDeclarationTests
16
public void VBNetDefiningPartialMethodDeclarationTest()
18
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>(@"Partial Sub MyMethod()
20
Assert.AreEqual(0, md.Parameters.Count);
21
Assert.AreEqual("MyMethod", md.Name);
22
Assert.IsFalse(md.IsExtensionMethod);
23
Assert.AreEqual(Modifiers.Partial, md.Modifier);
27
public void VBNetMethodWithModifiersRegionTest()
29
const string program = @"public shared sub MyMethod()
33
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>(program);
34
Assert.AreEqual(Modifiers.Public | Modifiers.Static, md.Modifier);
35
Assert.AreEqual(2, md.StartLocation.Line, "StartLocation.Y");
36
Assert.AreEqual(2, md.EndLocation.Line, "EndLocation.Y");
37
Assert.AreEqual(2, md.StartLocation.Column, "StartLocation.X");
41
public void VBNetFunctionMethodDeclarationTest()
43
const string program = @"public function MyFunction() as Integer
47
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>(program);
48
Assert.AreEqual(Modifiers.Public, md.Modifier);
49
Assert.AreEqual(2, md.StartLocation.Line, "StartLocation.Y");
50
Assert.AreEqual(2, md.StartLocation.Column, "StartLocation.X");
51
Assert.AreEqual(2, md.EndLocation.Line, "EndLocation.Y");
55
public void VBNetSubroutineMethodDeclarationTest()
57
const string program = @"public Sub MyMethod()
61
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>(program);
62
Assert.AreEqual(Modifiers.Public, md.Modifier);
63
Assert.AreEqual(2, md.StartLocation.Line, "StartLocation.Y");
64
Assert.AreEqual(2, md.StartLocation.Column, "StartLocation.X");
65
Assert.AreEqual(2, md.EndLocation.Line, "EndLocation.Y");
69
public void VBNetGenericFunctionMethodDeclarationTest()
71
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>("function MyMethod(Of T)(a As T) As Double\nEnd Function");
72
Assert.AreEqual("System.Double", md.TypeReference.Type);
73
Assert.AreEqual(1, md.Parameters.Count);
74
Assert.AreEqual("T", ((ParameterDeclarationExpression)md.Parameters[0]).TypeReference.Type);
75
Assert.AreEqual("a", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
77
Assert.AreEqual(1, md.Templates.Count);
78
Assert.AreEqual("T", md.Templates[0].Name);
82
public void VBNetGenericMethodDeclarationTest()
84
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>("Function MyMethod(Of T)(a As T) As T\nEnd Function ");
85
Assert.AreEqual("T", md.TypeReference.Type);
86
Assert.AreEqual(1, md.Parameters.Count);
87
Assert.AreEqual("T", ((ParameterDeclarationExpression)md.Parameters[0]).TypeReference.Type);
88
Assert.AreEqual("a", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
90
Assert.AreEqual(1, md.Templates.Count);
91
Assert.AreEqual("T", md.Templates[0].Name);
95
public void VBNetGenericMethodDeclarationWithConstraintTest()
97
string program = "Function MyMethod(Of T As { ISomeInterface })(a As T) As T\n End Function";
98
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>(program);
99
Assert.AreEqual("T", md.TypeReference.Type);
100
Assert.AreEqual(1, md.Parameters.Count);
101
Assert.AreEqual("T", ((ParameterDeclarationExpression)md.Parameters[0]).TypeReference.Type);
102
Assert.AreEqual("a", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
104
Assert.AreEqual(1, md.Templates.Count);
105
Assert.AreEqual("T", md.Templates[0].Name);
106
Assert.AreEqual(1, md.Templates[0].Bases.Count);
107
Assert.AreEqual("ISomeInterface", md.Templates[0].Bases[0].Type);
111
public void VBNetExtensionMethodDeclaration()
113
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>(
115
Sub Print(s As String)
119
Assert.AreEqual("Print", md.Name);
121
// IsExtensionMethod is only valid for c#.
122
// Assert.IsTrue(md.IsExtensionMethod);
124
Assert.AreEqual("s", md.Parameters[0].ParameterName);
125
Assert.AreEqual("System.String", md.Parameters[0].TypeReference.Type);
129
public void VBNetGenericMethodInInterface()
131
const string program = @"Interface MyInterface
132
Function MyMethod(Of T As {ISomeInterface})(a As T) As T
134
TypeDeclaration td = ParseUtil.ParseGlobal<TypeDeclaration>(program);
135
MethodDeclaration md = (MethodDeclaration)td.Children[0];
136
Assert.AreEqual("T", md.TypeReference.Type);
137
Assert.AreEqual(1, md.Parameters.Count);
138
Assert.AreEqual("T", ((ParameterDeclarationExpression)md.Parameters[0]).TypeReference.Type);
139
Assert.AreEqual("a", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
141
Assert.AreEqual(1, md.Templates.Count);
142
Assert.AreEqual("T", md.Templates[0].Name);
143
Assert.AreEqual(1, md.Templates[0].Bases.Count);
144
Assert.AreEqual("ISomeInterface", md.Templates[0].Bases[0].Type);
148
public void VBNetGenericVoidMethodInInterface()
150
const string program = @"interface MyInterface
151
Sub MyMethod(Of T As {ISomeInterface})(a as T)
154
TypeDeclaration td = ParseUtil.ParseGlobal<TypeDeclaration>(program);
155
MethodDeclaration md = (MethodDeclaration)td.Children[0];
156
Assert.AreEqual("System.Void", md.TypeReference.Type);
157
Assert.AreEqual(1, md.Parameters.Count);
158
Assert.AreEqual("T", ((ParameterDeclarationExpression)md.Parameters[0]).TypeReference.Type);
159
Assert.AreEqual("a", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
161
Assert.AreEqual(1, md.Templates.Count);
162
Assert.AreEqual("T", md.Templates[0].Name);
163
Assert.AreEqual(1, md.Templates[0].Bases.Count);
164
Assert.AreEqual("ISomeInterface", md.Templates[0].Bases[0].Type);
168
public void VBNetMethodWithHandlesClause()
170
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>(
171
@"Public Sub MyMethod(sender As Object, e As EventArgs) Handles x.y
173
Assert.AreEqual(new string[] { "x.y" }, md.HandlesClause.ToArray());
175
md = ParseUtil.ParseTypeMember<MethodDeclaration>(
176
@"Public Sub MyMethod() Handles Me.FormClosing
178
Assert.AreEqual(new string[] { "Me.FormClosing" }, md.HandlesClause.ToArray());
180
md = ParseUtil.ParseTypeMember<MethodDeclaration>(
181
@"Public Sub MyMethod() Handles MyBase.Event, Button1.Click
183
Assert.AreEqual(new string[] { "MyBase.Event", "Button1.Click" }, md.HandlesClause.ToArray());
187
public void VBNetMethodWithTypeCharactersTest()
189
const string program = @"Public Function Func!(ByVal Param&)
190
Func! = CSingle(Param&)
193
MethodDeclaration md = ParseUtil.ParseTypeMember<MethodDeclaration>(program);
194
Assert.AreEqual(Modifiers.Public, md.Modifier);