📄 nrefactoryresolvertests.cs
字号:
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision: 1383 $</version>
// </file>
using System;
using System.Collections;
using System.IO;
using NUnit.Framework;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
namespace ICSharpCode.SharpDevelop.Tests
{
[TestFixture]
public class NRefactoryResolverTests
{
#region Test helper methods
ICompilationUnit Parse(string fileName, string fileContent)
{
ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(ICSharpCode.NRefactory.Parser.SupportedLanguage.CSharp, new StringReader(fileContent));
p.ParseMethodBodies = false;
p.Parse();
DefaultProjectContent pc = new DefaultProjectContent();
pc.ReferencedContents.Add(ProjectContentRegistry.Mscorlib);
pc.ReferencedContents.Add(ProjectContentRegistry.WinForms);
ParserService.ForceProjectContent(pc);
lastPC = pc;
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(pc);
visitor.Visit(p.CompilationUnit, null);
visitor.Cu.FileName = fileName;
visitor.Cu.ErrorsDuringCompile = p.Errors.count > 0;
foreach (IClass c in visitor.Cu.Classes) {
pc.AddClassToNamespaceList(c);
}
return visitor.Cu;
}
public IProjectContent lastPC;
ICompilationUnit ParseVB(string fileName, string fileContent)
{
ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(ICSharpCode.NRefactory.Parser.SupportedLanguage.VBNet, new StringReader(fileContent));
p.ParseMethodBodies = false;
p.Parse();
DefaultProjectContent pc = new DefaultProjectContent();
ParserService.ForceProjectContent(pc);
pc.ReferencedContents.Add(ProjectContentRegistry.Mscorlib);
pc.ReferencedContents.Add(ProjectContentRegistry.WinForms);
pc.Language = LanguageProperties.VBNet;
lastPC = pc;
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(pc);
visitor.Visit(p.CompilationUnit, null);
visitor.Cu.FileName = fileName;
visitor.Cu.ErrorsDuringCompile = p.Errors.count > 0;
foreach (IClass c in visitor.Cu.Classes) {
pc.AddClassToNamespaceList(c);
}
return visitor.Cu;
}
void AddCompilationUnit(ICompilationUnit parserOutput, string fileName)
{
ParserService.UpdateParseInformation(parserOutput, fileName, false, false);
}
public ResolveResult Resolve(string program, string expression, int line)
{
AddCompilationUnit(Parse("a.cs", program), "a.cs");
NRefactoryResolver resolver = new NRefactoryResolver(ICSharpCode.NRefactory.Parser.SupportedLanguage.CSharp);
return resolver.Resolve(new ExpressionResult(expression),
line, 0,
"a.cs",
program);
}
public ResolveResult ResolveVB(string program, string expression, int line)
{
AddCompilationUnit(ParseVB("a.vb", program), "a.vb");
NRefactoryResolver resolver = new NRefactoryResolver(ICSharpCode.NRefactory.Parser.SupportedLanguage.VBNet);
return resolver.Resolve(new ExpressionResult(expression),
line, 0,
"a.vb",
program);
}
public T Resolve<T>(string program, string expression, int line) where T : ResolveResult
{
ResolveResult rr = Resolve(program, expression, line);
Assert.IsNotNull(rr, "Resolve returned null");
Assert.IsTrue(rr is T, "result is " + typeof(T).Name);
return (T)rr;
}
public T ResolveVB<T>(string program, string expression, int line) where T : ResolveResult
{
ResolveResult rr = ResolveVB(program, expression, line);
Assert.IsNotNull(rr, "Resolve returned null");
Assert.IsTrue(rr is T, "result is " + typeof(T).Name);
return (T)rr;
}
#endregion
#region Test for old issues (Fidalgo)
// Issue SD-291
[Test]
public void VBNetMultipleVariableDeclarationsTest()
{
string program = @"Class X
Shared Sub Main
Dim a, b As String
End Sub
End Class
";
ResolveResult result = ResolveVB<LocalResolveResult>(program, "a", 4);
Assert.AreEqual("System.String", result.ResolvedType.FullyQualifiedName);
result = ResolveVB<LocalResolveResult>(program, "b", 4);
Assert.AreEqual("System.String", result.ResolvedType.FullyQualifiedName);
}
// Issue SD-258
[Test]
public void VBNetForeachLoopVariableTest()
{
string program = @"Class Test
Shared Sub Main()
For Each c As String In MyColl
Next
End Sub
End Class
";
ResolveResult result = ResolveVB<LocalResolveResult>(program, "c", 4);
Assert.AreEqual("System.String", result.ResolvedType.FullyQualifiedName);
}
// Issue SD-265
[Test]
public void VBNetStaticMembersOnInstanceTest()
{
string program = @"Class X
Sub Z()
Dim a As String
End Sub
End Class
";
ResolveResult result = ResolveVB(program, "a", 4);
Assert.IsNotNull(result, "result");
ArrayList arr = result.GetCompletionData(lastPC);
Assert.IsNotNull(arr, "arr");
foreach (object o in arr) {
if (o is IMember) {
if (((IMember)o).FullyQualifiedName == "System.String.Empty")
return;
}
}
Assert.Fail("Static member empty not found on string instance!");
}
// Issue SD-217
[Test]
public void VBNetLocalArrayLookupTest()
{
string program = @"Module Main
Sub Main()
Dim t As String()
End Sub
End Module
";
ResolveResult result = ResolveVB<LocalResolveResult>(program, "t", 4);
ArrayList arr = result.GetCompletionData(lastPC);
Assert.IsNotNull(arr, "arr");
foreach (object o in arr) {
if (o is IMember) {
if (((IMember)o).FullyQualifiedName == "System.Array.Length")
return;
}
}
Assert.Fail("Length not found on array instance (resolve result was " + result.ResolvedType.ToString() + ")");
}
#endregion
#region Simple Tests
const string arrayListConflictProgram = @"using System.Collections;
class A {
void Test() {
}
ArrayList arrayList;
public ArrayList ArrayList {
get {
return arrayList;
}
}
}
";
[Test]
public void PropertyTypeConflictTest()
{
ResolveResult result = Resolve<MemberResolveResult>(arrayListConflictProgram, "arrayList", 4);
Assert.AreEqual("System.Collections.ArrayList", result.ResolvedType.FullyQualifiedName);
}
[Test]
public void PropertyTypeConflictCompletionResultTest()
{
ResolveResult result = Resolve(arrayListConflictProgram, "ArrayList", 4);
// CC should offer both static and non-static results
ArrayList list = result.GetCompletionData(lastPC);
bool ok = false;
foreach (object o in list) {
IMethod method = o as IMethod;
if (method != null && method.Name == "AddRange")
ok = true;
}
Assert.IsTrue(ok, "AddRange should exist");
ok = false;
foreach (object o in list) {
IMethod method = o as IMethod;
if (method != null && method.Name == "Adapter")
ok = true;
}
Assert.IsTrue(ok, "Adapter should exist");
}
[Test]
public void InheritedInterfaceResolveTest()
{
string program = @"using System;
class A {
void Method(IInterface1 a) {
}
}
interface IInterface1 : IInterface2, IDisposable {
void Method1();
}
interface IInterface2 {
void Method2();
}
";
ResolveResult result = Resolve<LocalResolveResult>(program, "a", 4);
ArrayList arr = result.GetCompletionData(lastPC);
Assert.IsNotNull(arr, "arr");
bool m1 = false;
bool m2 = false;
bool disp = false;
bool getType = false;
foreach (IMethod m in arr) {
if (m.Name == "Method1")
m1 = true;
if (m.Name == "Method2")
m2 = true;
if (m.Name == "Dispose")
disp = true;
if (m.Name == "GetType")
getType = true;
}
Assert.IsTrue(m1, "Method1 not found");
Assert.IsTrue(m2, "Method2 not found");
Assert.IsTrue(disp, "Dispose not found");
Assert.IsTrue(getType, "GetType not found");
}
[Test]
public void InvalidMethodCallTest()
{
string program = @"class A {
void Method(string b) {
}
}
";
ResolveResult result = Resolve(program, "b.ThisMethodDoesNotExistOnString()", 3);
Assert.IsNull(result, "result");
}
[Test]
public void InvalidConstructorCallTest()
{
string program = @"class A {
void Method() {
}
}
";
ResolveResult result = Resolve(program, "new ThisClassDoesNotExist()", 3);
Assert.IsNull(result);
}
[Test]
public void MethodCallTest()
{
string program = @"class A {
void Method() {
}
int TargetMethod() {
return 3;
}
}
";
ResolveResult result = Resolve<MemberResolveResult>(program, "TargetMethod()", 3);
Assert.AreEqual("System.Int32", result.ResolvedType.FullyQualifiedName, "'TargetMethod()'");
}
[Test]
public void ThisMethodCallTest()
{
string program = @"class A {
void Method() {
}
int TargetMethod() {
return 3;
}
}
";
ResolveResult result = Resolve<MemberResolveResult>(program, "this.TargetMethod()", 3);
Assert.AreEqual("System.Int32", result.ResolvedType.FullyQualifiedName, "'this.TargetMethod()'");
}
[Test]
public void EventCallTest()
{
string program = @"using System;
class A {
void Method() {
}
public event EventHandler TestEvent;
}
";
MemberResolveResult result = Resolve<MemberResolveResult>(program, "TestEvent(this, EventArgs.Empty)", 4);
Assert.AreEqual("A.TestEvent", result.ResolvedMember.FullyQualifiedName);
}
[Test]
public void VoidTest()
{
string program = @"using System;
class A {
void TestMethod() {
}
}
";
ResolveResult result = Resolve(program, "TestMethod()", 4);
Assert.IsNotNull(result);
Assert.AreSame(ReflectionReturnType.Void, result.ResolvedType, result.ResolvedType.ToString());
Assert.AreEqual(0, result.GetCompletionData(lastPC).Count);
}
[Test]
public void ThisEventCallTest()
{
string program = @"using System;
class A {
void Method() {
}
public event EventHandler TestEvent;
}
";
MemberResolveResult result = Resolve<MemberResolveResult>(program, "this.TestEvent(this, EventArgs.Empty)", 4);
Assert.AreEqual("A.TestEvent", result.ResolvedMember.FullyQualifiedName);
}
[Test]
public void DelegateCallTest()
{
string program = @"using System.Reflection;
class A {
void Method() {
ModuleResolveEventHandler eh = SomeClass.SomeProperty;
}
}
";
ResolveResult result = Resolve<LocalResolveResult>(program, "eh(this, new ResolveEventArgs())", 5);
Assert.AreEqual("eh", (result as LocalResolveResult).Field.Name);
result = Resolve<MemberResolveResult>(program, "eh(this, new ResolveEventArgs()).GetType(\"bla\")", 5);
Assert.AreEqual("System.Reflection.Module.GetType", (result as MemberResolveResult).ResolvedMember.FullyQualifiedName);
}
[Test]
public void OverloadLookupTest()
{
string program = @"class A {
void Method() {
}
int Multiply(int a, int b) { return a * b; }
double Multiply(double a, double b) { return a * b; }
}
";
ResolveResult result = Resolve<MemberResolveResult>(program, "Multiply(1, 1)", 3);
Assert.AreEqual("System.Int32", result.ResolvedType.FullyQualifiedName, "'Multiply(1,1)'");
result = Resolve<MemberResolveResult>(program, "Multiply(1.0, 1.0)", 3);
Assert.AreEqual("System.Double", result.ResolvedType.FullyQualifiedName, "'Multiply(1.0,1.0)'");
}
[Test]
public void CTorOverloadLookupTest()
{
string program = @"class A {
void Method() {
}
static A() {}
A() {}
A(int intVal) {}
A(double dblVal) {}
}
";
MemberResolveResult result = Resolve<MemberResolveResult>(program, "new A()", 3);
IMethod m = (IMethod)result.ResolvedMember;
Assert.IsFalse(m.IsStatic, "new A() is static");
Assert.AreEqual(0, m.Parameters.Count, "new A() parameter count");
result = Resolve<MemberResolveResult>(program, "new A(10)", 3);
m = (IMethod)result.ResolvedMember;
Assert.AreEqual(1, m.Parameters.Count, "new A(10) parameter count");
Assert.AreEqual("intVal", m.Parameters[0].Name, "new A(10) parameter");
result = Resolve<MemberResolveResult>(program, "new A(11.1)", 3);
m = (IMethod)result.ResolvedMember;
Assert.AreEqual(1, m.Parameters.Count, "new A(11.1) parameter count");
Assert.AreEqual("dblVal", m.Parameters[0].Name, "new A(11.1) parameter");
}
[Test]
public void DefaultCTorOverloadLookupTest()
{
string program = @"class A {
void Method() {
}
}
";
MemberResolveResult result = Resolve<MemberResolveResult>(program, "new A()", 3);
IMethod m = (IMethod)result.ResolvedMember;
Assert.IsNotNull(m);
}
[Test]
public void ValueInsideSetterTest()
{
string program = @"class A {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -