// // // // // $Revision$ // using System; using System.Collections; using ICSharpCode.SharpDevelop.Dom; using NUnit.Framework; namespace ICSharpCode.SharpDevelop.Tests { [TestFixture] public class InnerClassesResolverTests { #region Test helper methods NRefactoryResolverTests nrrt = new NRefactoryResolverTests(); ResolveResult Resolve(string program, string expression, int line) { return nrrt.Resolve(program, expression, line); } T Resolve(string program, string expression, int line) where T : ResolveResult { return nrrt.Resolve(program, expression, line); } ResolveResult ResolveVB(string program, string expression, int line) { return nrrt.ResolveVB(program, expression, line); } #endregion [Test] public void SimpleInnerClass() { string program = @"class A { void Test() { } class B { } } "; ResolveResult result = Resolve(program, "B", 3); Assert.IsTrue(result is TypeResolveResult); Assert.AreEqual("A.B", result.ResolvedType.FullyQualifiedName); } [Test] public void ReflectionInnerClass() { string program = @"using System; class A { void Test() { } } "; ResolveResult result = Resolve(program, "Environment.SpecialFolder", 3); Assert.IsTrue(result is TypeResolveResult); Assert.AreEqual("System.Environment.SpecialFolder", result.ResolvedType.FullyQualifiedName); } [Test] public void OuterclassPrivateFieldCtrlSpaceTest() { string program = @"class A { int myField; class B { void MyMethod(A a) { } } } "; ResolveResult result = Resolve(program, "a", 8); Assert.IsNotNull(result, "result"); Assert.IsTrue(result is LocalResolveResult, "result is LocalResolveResult"); ArrayList arr = result.GetCompletionData(nrrt.lastPC); Assert.IsNotNull(arr, "arr"); foreach (object o in arr) { if (o is IField) { Assert.AreEqual("myField", ((IField)o).Name); return; } } Assert.Fail("private field not visible from inner class"); } [Test] public void OuterclassStaticFieldResolveTest() { string program = @"class A { static int myField; class B { void MyMethod() { } } } "; MemberResolveResult result = Resolve(program, "myField", 8); Assert.AreEqual("A.myField", result.ResolvedMember.FullyQualifiedName); } [Test] public void OuterclassStaticMethodCallResolveTest() { string program = @"class A { static void Test(int arg); class B { void MyMethod() { } } } "; MemberResolveResult result = Resolve(program, "Test(4)", 8); Assert.AreEqual("A.Test", result.ResolvedMember.FullyQualifiedName); } [Test] public void InheritedInnerClass() { string program = @"class A { class B { } } class C : A { void Main() { } } "; ResolveResult result = Resolve(program, "B", 6); Assert.IsTrue(result is TypeResolveResult); Assert.AreEqual("A.B", result.ResolvedType.FullyQualifiedName); result = Resolve(program, "C.B", 6); Assert.IsTrue(result is TypeResolveResult); Assert.AreEqual("A.B", result.ResolvedType.FullyQualifiedName); result = Resolve(program, "C", 6); Assert.IsTrue(result is TypeResolveResult); Assert.AreEqual("C", result.ResolvedType.FullyQualifiedName); foreach (object o in result.GetCompletionData(nrrt.lastPC)) { if (o is IClass) { Assert.AreEqual("A.B", ((IClass)o).FullyQualifiedName); return; } } Assert.Fail("Inherited inner class not visible."); } } }