You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
479 lines
12 KiB
479 lines
12 KiB
#warning |
|
//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) |
|
//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) |
|
// |
|
//using System; |
|
//using System.Collections; |
|
//using System.Collections.Generic; |
|
//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<T>(string program, string expression, int line) where T : ResolveResult |
|
// { |
|
// return nrrt.Resolve<T>(program, expression, line); |
|
// } |
|
// |
|
// T ResolveVB<T>(string program, string expression, int line) where T : ResolveResult |
|
// { |
|
// return nrrt.ResolveVB<T>(program, expression, line); |
|
// } |
|
// |
|
// List<ICompletionEntry> CtrlSpace(string program, int line) |
|
// { |
|
// return nrrt.CtrlSpaceResolveCSharp(program, line, ExpressionContext.Default); |
|
// } |
|
// #endregion |
|
// |
|
// #region Ctrl-Space tests |
|
// [Test] |
|
// public void CtrlSpaceIncludesInnerClass() |
|
// { |
|
// string program = @"class A { |
|
// class Inner { } |
|
// |
|
// }"; |
|
// Assert.IsTrue(IsInnerClassVisible(CtrlSpace(program, 3))); |
|
// } |
|
// |
|
// [Test] |
|
// public void CtrlSpaceIncludesInheritedInnerClass() |
|
// { |
|
// string program = @"class A : Outer { |
|
// |
|
// } |
|
// class Outer { protected class Inner { } } |
|
//"; |
|
// Assert.IsTrue(IsInnerClassVisible(CtrlSpace(program, 2))); |
|
// } |
|
// |
|
// [Test] |
|
// public void CtrlSpaceDoesNotIncludeInheritedPrivateInnerClass() |
|
// { |
|
// string program = @"class A : Outer { |
|
// |
|
// } |
|
// class Outer { class Inner { } } |
|
//"; |
|
// Assert.IsFalse(IsInnerClassVisible(CtrlSpace(program, 2))); |
|
// } |
|
// |
|
// [Test] |
|
// public void CtrlSpaceIncludesInnerClassFromOtherPart() |
|
// { |
|
// string program = @"partial class A { |
|
// |
|
// } |
|
// partial class A { class Inner { } } |
|
//"; |
|
// Assert.IsTrue(IsInnerClassVisible(CtrlSpace(program, 2))); |
|
// } |
|
// #endregion |
|
// |
|
// [Test] |
|
// public void InnerClassTest() |
|
// { |
|
// string program = @"using System; |
|
//class A { |
|
// |
|
//} |
|
//"; |
|
// ResolveResult result = Resolve<TypeResolveResult>(program, "Environment.SpecialFolder", 3); |
|
// Assert.AreEqual("System.Environment.SpecialFolder", result.ResolvedType.FullyQualifiedName); |
|
// } |
|
// |
|
// [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 InnerClassWithStaticFieldOfSameType() |
|
// { |
|
// string program = @"class A { |
|
// void Test() { |
|
// |
|
// } |
|
// class B { |
|
// public static B Instance; |
|
// } |
|
//} |
|
//"; |
|
// ResolveResult result = Resolve(program, "B.Instance", 3); |
|
// Assert.IsTrue(result is MemberResolveResult); |
|
// Assert.AreEqual("A.B", result.ResolvedType.FullyQualifiedName); |
|
// } |
|
// |
|
// [Test] |
|
// public void InnerClassWithStaticFieldOfSameTypeInPartialClass1() |
|
// { |
|
// string program = @"partial class A { |
|
// void Test() { |
|
// |
|
// } |
|
//} |
|
//partial class A { |
|
// class B { |
|
// public static B Instance; |
|
// } |
|
//} |
|
//"; |
|
// ResolveResult result = Resolve(program, "B.Instance", 3); |
|
// Assert.IsTrue(result is MemberResolveResult); |
|
// Assert.AreEqual("A.B", result.ResolvedType.FullyQualifiedName); |
|
// } |
|
// |
|
// [Test] |
|
// public void InnerClassWithStaticFieldOfSameTypeInPartialClass2() |
|
// { |
|
// string program = @"partial class A { |
|
// void Test() { |
|
// |
|
// } |
|
// class B { |
|
// public static B Instance; |
|
// } |
|
//} |
|
//partial class A { |
|
//} |
|
//"; |
|
// ResolveResult result = Resolve(program, "B.Instance", 3); |
|
// Assert.IsTrue(result is MemberResolveResult); |
|
// 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"); |
|
// var 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<MemberResolveResult>(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<MemberResolveResult>(program, "Test(4)", 8); |
|
// Assert.AreEqual("A.Test", result.ResolvedMember.FullyQualifiedName); |
|
// } |
|
// |
|
// [Test] |
|
// public void InheritedInnerClass() |
|
// { |
|
// string program = @"class A { |
|
// protected 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."); |
|
// } |
|
// |
|
// [Test] |
|
// public void NestedClassHidingHidesAllMethods() |
|
// { |
|
// string program = @"using System; |
|
//class A { |
|
// static void Test(int arg) {} |
|
// static void Test(string arg) {} |
|
// class B { |
|
// void MyMethod() { |
|
// |
|
// } |
|
// static void Test(long arg) {} |
|
// } |
|
//}"; |
|
// MemberResolveResult result = Resolve<MemberResolveResult>(program, "Test(4)", 7); |
|
// Assert.AreEqual("A.B.Test", result.ResolvedMember.FullyQualifiedName); |
|
// } |
|
// |
|
// [Test] |
|
// public void NestedInnerClasses() |
|
// { |
|
// string program = @"using System; |
|
//public sealed class GL { |
|
// void Test() { |
|
// |
|
// } |
|
// |
|
// public class Enums |
|
// { |
|
// public enum BeginMode {QUADS, LINES } |
|
// } |
|
//} |
|
//"; |
|
// TypeResolveResult trr = Resolve<TypeResolveResult>(program, "GL.Enums.BeginMode", 4); |
|
// Assert.AreEqual("GL.Enums.BeginMode", trr.ResolvedClass.FullyQualifiedName); |
|
// |
|
// trr = Resolve<TypeResolveResult>(program, "Enums.BeginMode", 4); |
|
// Assert.AreEqual("GL.Enums.BeginMode", trr.ResolvedClass.FullyQualifiedName); |
|
// |
|
// MemberResolveResult mrr = Resolve<MemberResolveResult>(program, "GL.Enums.BeginMode.LINES", 4); |
|
// Assert.AreEqual("GL.Enums.BeginMode.LINES", mrr.ResolvedMember.FullyQualifiedName); |
|
// |
|
// mrr = Resolve<MemberResolveResult>(program, "Enums.BeginMode.LINES", 4); |
|
// Assert.AreEqual("GL.Enums.BeginMode.LINES", mrr.ResolvedMember.FullyQualifiedName); |
|
// |
|
// // ensure that GetClass works correctly: |
|
// IClass c = trr.ResolvedClass.ProjectContent.GetClass("GL.Enums.BeginMode", 0); |
|
// Assert.IsNotNull(c); |
|
// Assert.AreEqual("GL.Enums.BeginMode", c.FullyQualifiedName); |
|
// } |
|
// |
|
// [Test] |
|
// public void DoNotShowInaccessibleInnerClass() |
|
// { |
|
// string program = @"using System; |
|
//class C { |
|
// |
|
//} |
|
//class Outer { private class Inner { } } |
|
//"; |
|
// TypeResolveResult trr = Resolve<TypeResolveResult>(program, "Outer", 3); |
|
// var l = trr.GetCompletionData(trr.ResolvedClass.ProjectContent); |
|
// Assert.IsFalse(IsInnerClassVisible(l)); |
|
// } |
|
// |
|
// [Test] |
|
// public void ShowProtectedInnerClassFromDerivedClass() |
|
// { |
|
// string program = @"using System; |
|
//class Derived : Outer { |
|
// |
|
//} |
|
//class Outer { protected class Inner {} } |
|
//"; |
|
// TypeResolveResult trr = Resolve<TypeResolveResult>(program, "Outer", 3); |
|
// var l = trr.GetCompletionData(trr.ResolvedClass.ProjectContent); |
|
// Assert.IsTrue(IsInnerClassVisible(l)); |
|
// } |
|
// |
|
// [Test] |
|
// public void ShowProtectedInnerClassThroughForeignDerivedClass() |
|
// { |
|
// string program = @"using System; |
|
//class Derived : Outer { |
|
// |
|
//} |
|
//class Derived2 : Outer { } |
|
//class Outer { protected class Inner {} } |
|
//"; |
|
// TypeResolveResult trr = Resolve<TypeResolveResult>(program, "Derived2", 3); |
|
// var l = trr.GetCompletionData(trr.ResolvedClass.ProjectContent); |
|
// Assert.IsTrue(IsInnerClassVisible(l)); |
|
// } |
|
// |
|
// [Test] |
|
// public void DoNotShowProtectedInnerClassThroughUnrelatedClass() |
|
// { |
|
// string program = @"using System; |
|
//class Unrelated { |
|
// |
|
//} |
|
//class Derived : Outer { } |
|
//class Outer { protected class Inner {} } |
|
//"; |
|
// TypeResolveResult trr = Resolve<TypeResolveResult>(program, "Derived", 3); |
|
// var l = trr.GetCompletionData(trr.ResolvedClass.ProjectContent); |
|
// Assert.IsFalse(IsInnerClassVisible(l)); |
|
// } |
|
// |
|
// bool IsInnerClassVisible(IEnumerable l) |
|
// { |
|
// foreach (object o in l) { |
|
// IClass c = o as IClass; |
|
// if (c != null && c.Name == "Inner") |
|
// return true; |
|
// } |
|
// return false; |
|
// } |
|
// |
|
// [Test] |
|
// public void GenericInnerClassOrNonGenericOuterClass() |
|
// { |
|
// string program = @"using System; |
|
//class Test { |
|
// |
|
// class TheClass<T> {} |
|
//} |
|
//class TheClass { } |
|
//"; |
|
// TypeResolveResult trr = Resolve<TypeResolveResult>(program, "TheClass<string>", 3); |
|
// Assert.AreEqual("Test.TheClass", trr.ResolvedClass.FullyQualifiedName); |
|
// } |
|
// |
|
// [Test] |
|
// public void GenericInnerClassOrNonGenericOuterClass2() |
|
// { |
|
// string program = @"using System; |
|
//class Test { |
|
// TheClass<string> x; |
|
// |
|
// class TheClass<T> {} |
|
//} |
|
//class TheClass { } |
|
//"; |
|
// MemberResolveResult rr = Resolve<MemberResolveResult>(program, "x", 3); |
|
// Assert.AreEqual("Test.TheClass", rr.ResolvedType.FullyQualifiedName); |
|
// } |
|
// |
|
// [Test] |
|
// public void GenericInnerClassOrNonGenericInnerClass() |
|
// { |
|
// string program = @"using System; |
|
//class Test { |
|
// TheClass<string> x1; |
|
// TheClass x2; |
|
// Test.TheClass<string> y1; |
|
// Test.TheClass y2; |
|
// global::Test.TheClass<string> z1; |
|
// global::Test.TheClass z2; |
|
// |
|
// public class TheClass { } |
|
// public class TheClass<T> {} |
|
//} |
|
//"; |
|
// MemberResolveResult rr = Resolve<MemberResolveResult>(program, "x1", 3); |
|
// Assert.AreEqual(1, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count); |
|
// |
|
// rr = Resolve<MemberResolveResult>(program, "y1", 3); |
|
// Assert.AreEqual(1, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count); |
|
// |
|
// rr = Resolve<MemberResolveResult>(program, "z1", 3); |
|
// Assert.AreEqual(1, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count); |
|
// |
|
// rr = Resolve<MemberResolveResult>(program, "x2", 3); |
|
// Assert.AreEqual(0, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count); |
|
// |
|
// rr = Resolve<MemberResolveResult>(program, "y2", 3); |
|
// Assert.AreEqual(0, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count); |
|
// |
|
// rr = Resolve<MemberResolveResult>(program, "z2", 3); |
|
// Assert.AreEqual(0, rr.ResolvedType.GetUnderlyingClass().TypeParameters.Count); |
|
// } |
|
// |
|
// [Test] |
|
// public void SimpleInnerClassInStruct() |
|
// { |
|
// string program = @"struct A { |
|
// void Test() { |
|
// |
|
// } |
|
// class B { } |
|
//} |
|
//"; |
|
// ResolveResult result = Resolve(program, "B", 3); |
|
// Assert.IsTrue(result is TypeResolveResult); |
|
// Assert.AreEqual("A.B", result.ResolvedType.FullyQualifiedName); |
|
// } |
|
// } |
|
//}
|
|
|