Browse Source

Update EnvDTE.CodeType unit tests.

Return correct value for InfoLocation on EnvDTE.CodeType.
pull/375/head
Matt Ward 12 years ago
parent
commit
22b2a6e177
  1. 5
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs
  2. 5
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs
  3. 31
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs
  4. 10
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsInNamespace.cs
  5. 45
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsList.cs
  6. 9
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs
  7. 28
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs
  8. 1
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeNamespace.cs
  9. 36
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs
  10. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
  11. 19
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs
  12. 4
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeClass2Tests.cs
  13. 88
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs
  14. 373
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeTests.cs
  15. 35
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs
  16. 5
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CodeElementsExtensions.cs

5
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs

@ -16,6 +16,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -16,6 +16,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
}
public CodeClass(CodeModelContext context, ITypeDefinition typeDefinition)
: base(context, typeDefinition)
{
}
public CodeClass()
{
}

5
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs

@ -15,6 +15,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -15,6 +15,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
}
public CodeClass2(CodeModelContext context, ITypeDefinition typeDefinition)
: base(context, typeDefinition)
{
}
public global::EnvDTE.CodeElements PartialClasses {
get {
var list = new CodeElementsList<CodeType>();

31
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs

@ -13,6 +13,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -13,6 +13,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
DTE dte;
protected CodeModelContext context;
readonly ISymbolModel symbolModel;
IEntity entity;
public CodeElement()
{
@ -32,7 +33,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -32,7 +33,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
}
public static CodeElement CreateMember(CodeModelContext context, IMemberModel m)
public CodeElement(CodeModelContext context, IEntity entity)
{
this.context = context;
this.entity = entity;
if (context.CurrentProject != null) {
this.Language = context.CurrentProject.GetCodeModelLanguage();
}
}
internal static CodeElement CreateMember(CodeModelContext context, IMemberModel m)
{
switch (m.SymbolKind) {
case SymbolKind.Field:
@ -54,7 +64,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -54,7 +64,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
public virtual string Name {
get { return symbolModel.Name; }
get {
if (symbolModel != null)
return symbolModel.Name;
return entity.Name;
}
}
public virtual string Language { get; protected set; }
@ -99,16 +113,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -99,16 +113,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE
protected CodeElementsList<CodeAttribute2> GetAttributes(IEntityModel entityModel)
{
var list = new CodeElementsList<CodeAttribute2>();
IEntity td = entityModel.Resolve();
if (td != null) {
foreach (IAttribute attr in td.Attributes) {
if (IsInFilter(attr.Region)) {
list.Add(new CodeAttribute2(context, attr));
}
var attributes = new CodeElementsList<CodeAttribute2>();
foreach (IAttribute attribute in entity.Attributes) {
if (IsInFilter(attribute.Region)) {
attributes.Add(new CodeAttribute2(context, attribute));
}
}
return list;
return attributes;
}
protected override bool GetIsDerivedFrom(string fullName)

10
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsInNamespace.cs

@ -12,7 +12,7 @@ using ICSharpCode.SharpDevelop.Dom; @@ -12,7 +12,7 @@ using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class CodeElementsInNamespace : CodeElementsList2
public class CodeElementsInNamespace : CodeElementsList<CodeElement>
{
CodeModelContext context;
NamespaceName namespaceName;
@ -55,16 +55,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -55,16 +55,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE
void AddCodeNamespace(INamespace ns)
{
AddCodeElement(new CodeNamespace(context, ns));
Add(new CodeNamespace(context, ns));
}
void AddType(IType type)
{
ITypeDefinitionModel typeDefinition = type.GetDefinition().GetModel();
if (typeDefinition.TypeKind == TypeKind.Interface) {
ITypeDefinition typeDefinition = type.GetDefinition();
if (typeDefinition.Kind == TypeKind.Interface) {
} else {
AddCodeElement(new CodeClass2(context, typeDefinition));
Add(new CodeClass2(context, typeDefinition));
}
}
}

45
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsList.cs

@ -9,47 +9,6 @@ using ICSharpCode.SharpDevelop.Dom; @@ -9,47 +9,6 @@ using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class CodeElementsList2 : MarshalByRefObject, global::EnvDTE.CodeElements
{
List<CodeElement> elements = new List<CodeElement>();
public CodeElementsList2()
{
}
protected virtual void AddCodeElement(CodeElement element)
{
elements.Add(element);
}
public int Count {
get { return elements.Count; }
}
public IEnumerator GetEnumerator()
{
return elements.GetEnumerator();
}
public global::EnvDTE.CodeElement Item(object index)
{
if (index is int) {
return Item((int)index);
}
return Item((string)index);
}
global::EnvDTE.CodeElement Item(int index)
{
return elements[index - 1];
}
global::EnvDTE.CodeElement Item(string name)
{
return elements.Single(item => item.Name == name);
}
}
public class CodeElementsList<T> : MarshalByRefObject, global::EnvDTE.CodeElements, IList<T>
where T : global::EnvDTE.CodeElement
{
@ -59,7 +18,6 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -59,7 +18,6 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
}
#region EnvDTE.CodeElements implementation
public int Count {
get { return elements.Count; }
}
@ -86,9 +44,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -86,9 +44,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
return elements.Single(item => item.Name == name);
}
#endregion
#region IList<T>
public T this[int index] {
get { return elements[index]; }
set { elements[index] = value; }
@ -142,6 +98,5 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -142,6 +98,5 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
return elements.GetEnumerator();
}
#endregion
}
}

9
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs

@ -2,10 +2,9 @@ @@ -2,10 +2,9 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Dom;
//using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class CodeInterface : CodeType, global::EnvDTE.CodeInterface
@ -23,6 +22,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -23,6 +22,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE
// fullName = base.FullName;
}
public CodeInterface(CodeModelContext context, ITypeDefinition typeDefinition)
: base(context, typeDefinition)
{
// fullName = base.FullName;
}
// public CodeInterface(IProjectContent projectContent, IReturnType type, IClass c)
// : base(projectContent, c)
// {

28
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs

@ -31,38 +31,34 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -31,38 +31,34 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public global::EnvDTE.CodeType CodeTypeFromFullName(string name)
{
ITypeDefinitionModel typeDefinition = GetTypeDefinition(name);
ITypeDefinition typeDefinition = GetTypeDefinition(name);
if (typeDefinition != null) {
return CreateCodeTypeForTypeDefinition(typeDefinition);
}
return null;
}
ITypeDefinitionModel GetTypeDefinition(string name)
ITypeDefinition GetTypeDefinition(string name)
{
ICompilation compilation = project.GetCompilationUnit();
var typeName = new TopLevelTypeName(name);
ITypeDefinitionModel typeDefinitionModel = project.MSBuildProject.AssemblyModel.TopLevelTypeDefinitions[typeName];
if (typeDefinitionModel != null) {
return typeDefinitionModel;
}
// foreach (IAssembly assembly in compilation.ReferencedAssemblies) {
// ITypeDefinition typeDefinition = assembly.GetTypeDefinition(typeName);
// if (typeDefinition != null) {
// return typeDefinition.GetModel();
// }
// }
foreach (IAssembly assembly in compilation.Assemblies) {
ITypeDefinition typeDefinition = assembly.GetTypeDefinition(typeName);
if (typeDefinition != null) {
return typeDefinition;
}
}
return null;
}
CodeType CreateCodeTypeForTypeDefinition(ITypeDefinitionModel typeDefinition)
CodeType CreateCodeTypeForTypeDefinition(ITypeDefinition typeDefinition)
{
if (typeDefinition.TypeKind == TypeKind.Interface) {
return new CodeInterface(null, typeDefinition);
if (typeDefinition.Kind == TypeKind.Interface) {
return new CodeInterface(context, typeDefinition);
}
return new CodeClass2(null, typeDefinition);
return new CodeClass2(context, typeDefinition);
}
public string Language {

1
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeNamespace.cs

@ -13,6 +13,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -13,6 +13,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
INamespace ns;
public CodeNamespace(CodeModelContext context, INamespace ns)
: base(context)
{
this.ns = ns;
//this.InfoLocation = global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationExternal;

36
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs

@ -16,6 +16,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -16,6 +16,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public class CodeType : CodeElement, global::EnvDTE.CodeType
{
protected readonly ITypeDefinitionModel typeModel;
protected readonly ITypeDefinition typeDefinition;
CodeElementsList<CodeElement> members;
@ -55,10 +56,25 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -55,10 +56,25 @@ namespace ICSharpCode.PackageManagement.EnvDTE
: base(context, typeModel)
{
this.typeModel = typeModel;
this.InfoLocation = GetInfoLocationOld();
}
public CodeType(CodeModelContext context, ITypeDefinition typeDefinition)
: base(context, typeDefinition)
{
this.typeDefinition = typeDefinition;
this.InfoLocation = GetInfoLocation();
}
global::EnvDTE.vsCMInfoLocation GetInfoLocation()
{
if (typeDefinition.ParentAssembly.IsMainAssembly) {
return global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationProject;
}
return global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationExternal;
}
global::EnvDTE.vsCMInfoLocation GetInfoLocationOld()
{
if (typeModel != null) {
return global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationProject;
@ -71,9 +87,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -71,9 +87,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
public virtual global::EnvDTE.vsCMAccess Access {
get { return typeModel.Accessibility.ToAccess(); }
get { return typeDefinition.Accessibility.ToAccess(); }
set {
ITypeDefinition typeDefinition = typeModel.Resolve();
if (typeDefinition != null) {
context.CodeGenerator.ChangeAccessibility(typeDefinition, value.ToAccessibility());
}
@ -82,7 +97,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -82,7 +97,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public virtual string FullName {
get {
FullTypeName fullTypeName = typeModel.FullTypeName;
FullTypeName fullTypeName = GetFullTypeName();
var fullName = new StringBuilder();
if (!string.IsNullOrEmpty(fullTypeName.TopLevelTypeName.Namespace)) {
fullName.Append(fullTypeName.TopLevelTypeName.Namespace);
@ -97,6 +112,14 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -97,6 +112,14 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
}
FullTypeName GetFullTypeName()
{
if (typeModel != null) {
return typeModel.FullTypeName;
}
return typeDefinition.FullTypeName;
}
public virtual global::EnvDTE.CodeElements Members {
get {
if (members == null) {
@ -151,7 +174,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -151,7 +174,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public virtual global::EnvDTE.ProjectItem ProjectItem {
get {
if (context.CurrentProject != null) {
return EnvDTE.ProjectItem.FindByEntity(context.CurrentProject, typeModel);
return EnvDTE.ProjectItem.FindByEntity(context.CurrentProject, typeDefinition);
}
return null;
}
@ -163,8 +186,9 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -163,8 +186,9 @@ namespace ICSharpCode.PackageManagement.EnvDTE
/// </summary>
protected override bool GetIsDerivedFrom(string fullName)
{
ITypeDefinition typeDefinition = typeModel.Resolve();
return typeDefinition != null && typeDefinition.GetAllBaseTypeDefinitions().Any(baseType => baseType.FullName == fullName);
return typeDefinition
.GetAllBaseTypeDefinitions()
.Any(baseType => baseType.FullName == fullName);
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs

@ -314,11 +314,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -314,11 +314,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
internal ProjectItem FindProjectItem(string fileName)
{
SD.FileProjectItem item = MSBuildProject.FindFile(new FileName(fileName));
if (item != null) {
return new ProjectItem(this, item);
}
return null;
return ProjectItem.FindByFileName(MSBuildProject, fileName);
}
internal IViewContent GetOpenFile(string fileName)

19
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs

@ -2,12 +2,11 @@ @@ -2,12 +2,11 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.ComponentModel;
using System.IO;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
using SD = ICSharpCode.SharpDevelop.Project;
@ -40,9 +39,21 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -40,9 +39,21 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return new FileProjectItems(this);
}
internal static ProjectItem FindByEntity(IProject project, IEntityModel entity)
internal static ProjectItem FindByEntity(IProject project, IEntity entity)
{
throw new NotImplementedException();
if (entity.Region.FileName != null) {
return FindByFileName(project, entity.Region.FileName);
}
return null;
}
internal static ProjectItem FindByFileName(IProject project, string fileName)
{
SD.FileProjectItem item = project.FindFile(new FileName(fileName));
if (item != null) {
return new ProjectItem(new Project(project as MSBuildBasedProject), item);
}
return null;
}
// internal ProjectItem(MSBuildBasedProject project, IClass c)

4
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeClass2Tests.cs

@ -22,8 +22,8 @@ namespace PackageManagement.Tests.EnvDTE @@ -22,8 +22,8 @@ namespace PackageManagement.Tests.EnvDTE
void CreateClass(string code)
{
AddCodeFile("class.cs", code);
ITypeDefinitionModel typeModel = assemblyModel.TopLevelTypeDefinitions.Single();
codeClass = new CodeClass2(codeModelContext, typeModel);
ITypeDefinition typeDefinition = assemblyModel.TopLevelTypeDefinitions.Single().Resolve();
codeClass = new CodeClass2(codeModelContext, typeDefinition);
}
[Test]

88
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs

@ -71,26 +71,6 @@ namespace PackageManagement.Tests.EnvDTE @@ -71,26 +71,6 @@ namespace PackageManagement.Tests.EnvDTE
AddCodeFile("class.cs", code);
}
// void AddClassToDifferentProjectContent(string className)
// {
// helper.AddClassToDifferentProjectContent(className);
// }
//
// void AddClassToProjectContent(string namespaceName, string className)
// {
// helper.AddClassToProjectContentAndCompletionEntries(namespaceName, className);
// }
//
// void AddInterfaceToProjectContent(string interfaceName)
// {
// helper.AddInterfaceToProjectContent(interfaceName);
// }
//
// void AddInterfaceToDifferentProjectContent(string interfaceName)
// {
// helper.AddInterfaceToDifferentProjectContent(interfaceName);
// }
//
[Test]
public void CodeTypeFromFullName_NoSuchTypeInProject_ReturnsNull()
{
@ -217,39 +197,40 @@ namespace PackageManagement.Tests.EnvDTE @@ -217,39 +197,40 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationProject, codeClass.InfoLocation);
}
//
// [Test]
// public void CodeTypeFromFullName_ClassExistsInDifferentProject_InfoLocationIsExternal()
// {
// CreateCodeModel();
// AddClassToDifferentProjectContent("Tests.TestClass");
//
// var codeClass = codeModel.CodeTypeFromFullName("Tests.TestClass") as CodeClass2;
//
// Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationExternal, codeClass.InfoLocation);
// }
//
// [Test]
// public void CodeTypeFromFullName_InterfaceExistsInProject_InfoLocationIsLocalProject()
// {
// CreateCodeModel();
// AddInterfaceToProjectContent("Tests.ITest");
//
// var codeInterface = codeModel.CodeTypeFromFullName("Tests.ITest") as CodeInterface;
//
// Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationProject, codeInterface.InfoLocation);
// }
//
// [Test]
// public void CodeTypeFromFullName_InterfaceExistsInDifferentProject_InfoLocationIsExternal()
// {
// CreateCodeModel();
// AddInterfaceToDifferentProjectContent("Tests.ITest");
//
// var codeInterface = codeModel.CodeTypeFromFullName("Tests.ITest") as CodeInterface;
//
// Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationExternal, codeInterface.InfoLocation);
// }
[Test]
public void CodeTypeFromFullName_ClassExistsInDifferentAssembly_InfoLocationIsExternal()
{
CreateCodeModel();
var codeClass = codeModel.CodeTypeFromFullName("System.String") as CodeClass2;
Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationExternal, codeClass.InfoLocation);
}
[Test]
public void CodeTypeFromFullName_InterfaceExistsInProject_InfoLocationIsLocalProject()
{
CreateCodeModel();
AddClassToProject(
"namespace Tests {\r\n" +
" public interface ITest {} \r\n" +
"}");
var codeInterface = codeModel.CodeTypeFromFullName("Tests.ITest") as CodeInterface;
Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationProject, codeInterface.InfoLocation);
}
[Test]
public void CodeTypeFromFullName_InterfaceExistsInDifferentAssembly_InfoLocationIsExternal()
{
CreateCodeModel();
var codeInterface = codeModel.CodeTypeFromFullName("System.IDisposable") as CodeInterface;
Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationExternal, codeInterface.InfoLocation);
}
[Test]
public void Language_CSharpProject_ReturnsCSharpProjectGuid()
@ -272,7 +253,6 @@ namespace PackageManagement.Tests.EnvDTE @@ -272,7 +253,6 @@ namespace PackageManagement.Tests.EnvDTE
}
[Test]
[Ignore("TODO - Use NRefactory")]
public void CodeTypeFromFullName_SystemString_ReturnsCodeClass2()
{
CreateCodeModel();

373
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeTests.cs

@ -1,198 +1,175 @@ @@ -1,198 +1,175 @@
//// 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 ICSharpCode.PackageManagement.EnvDTE;
//using ICSharpCode.SharpDevelop.Dom;
//using SDProject = ICSharpCode.SharpDevelop.Project;
//using NUnit.Framework;
//using PackageManagement.Tests.Helpers;
//
//namespace PackageManagement.Tests.EnvDTE
//{
// [TestFixture]
// public class CodeTypeTests
// {
// CodeType codeType;
// ClassHelper helper;
//
// void CreateProjectContent()
// {
// helper = new ClassHelper();
// }
//
// void CreateClass(string name)
// {
// helper.CreateClass(name);
// }
//
// void CreateCodeType()
// {
// codeType = new CodeType(helper.ProjectContentHelper.ProjectContent, helper.Class);
// }
//
// TestableProject AddProjectToProjectContent()
// {
// TestableProject project = ProjectHelper.CreateTestProject();
// helper.ProjectContentHelper.SetProjectForProjectContent(project);
// return project;
// }
//
// void AddAttributeToClass(string name)
// {
// helper.AddAttributeToClass(name);
// }
//
// SDProject.FileProjectItem AddFileToProjectAndProjectContent(TestableProject project, string fileName)
// {
// helper.CompilationUnitHelper.SetFileName(fileName);
// return project.AddFile(fileName);
// }
//
// /// <summary>
// /// Classes at the end of the array are at the top of the inheritance tree.
// /// </summary>
// void AddClassInheritanceTree(params string[] classNames)
// {
// helper.AddClassInheritanceTreeClassesOnly(classNames);
// }
//
// [Test]
// public void Attributes_ClassHasOneAttribute_ReturnsOneAttribute()
// {
// CreateProjectContent();
// CreateClass("TestClass");
// AddAttributeToClass("TestAttribute");
// CreateCodeType();
//
// global::EnvDTE.CodeElements attributes = codeType.Attributes;
//
// CodeAttribute2 attribute = attributes.Item(1) as CodeAttribute2;
//
// Assert.AreEqual(1, attributes.Count);
// Assert.AreEqual("Test", attribute.Name);
// }
//
// [Test]
// public void ProjectItem_ProjectContentHasNullProject_ReturnsNull()
// {
// CreateProjectContent();
// CreateClass("Class1");
// CreateCodeType();
//
// global::EnvDTE.ProjectItem item = codeType.ProjectItem;
//
// Assert.IsNull(item);
// }
//
// [Test]
// public void ProjectItem_ProjectContentHasProject_ReturnsNonNullProjectItem()
// {
// CreateProjectContent();
// TestableProject project = AddProjectToProjectContent();
// AddFileToProjectAndProjectContent(project, @"d:\projects\MyProject\class1.cs");
// CreateClass("Class1");
// CreateCodeType();
//
// global::EnvDTE.ProjectItem item = codeType.ProjectItem;
//
// Assert.IsNotNull(item);
// }
//
// [Test]
// public void ProjectItem_ProjectContentHasProject_ReturnsProjectItemThatUsesProject()
// {
// CreateProjectContent();
// TestableProject project = AddProjectToProjectContent();
// project.FileName = @"d:\projects\MyProject\MyProject.csproj";
// AddFileToProjectAndProjectContent(project, @"d:\projects\MyProject\class1.cs");
// CreateClass("Class1");
// CreateCodeType();
//
// global::EnvDTE.ProjectItem item = codeType.ProjectItem;
//
// Assert.AreEqual(@"d:\projects\MyProject\MyProject.csproj", item.ContainingProject.FileName);
// }
//
// [Test]
// public void ProjectItem_ProjectContentHasProject_ReturnsProjectItemThatUsesProjectFileItem()
// {
// CreateProjectContent();
// TestableProject project = AddProjectToProjectContent();
// string fileName = @"d:\projects\MyProject\test.cs";
// SDProject.FileProjectItem fileProjectItem = AddFileToProjectAndProjectContent(project, fileName);
//
// CreateClass("Class1");
// CreateCodeType();
//
// global::EnvDTE.ProjectItem item = codeType.ProjectItem;
//
// Assert.AreEqual("test.cs", item.Name);
// }
//
// [Test]
// public void IsDerivedFrom_ClassFullyQualifiedNameMatchesTypeNameBeingChecked_ReturnsTrue()
// {
// CreateProjectContent();
// CreateClass("System.Web.Mvc.ActionResult");
// CreateCodeType();
//
// bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
//
// Assert.IsTrue(derivedFrom);
// }
//
// [Test]
// public void IsDerivedFrom_ClassFullyQualifiedNameDoesNotMatcheTypeNameBeingChecked_ReturnsFalse()
// {
// CreateProjectContent();
// CreateClass("TestClass");
// AddClassInheritanceTree("System.Object");
// CreateCodeType();
//
// bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
//
// Assert.IsFalse(derivedFrom);
// }
//
// [Test]
// public void IsDerivedFrom_ClassBaseTypeFullyQualifiedNameMatchesTypeName_ReturnsTrue()
// {
// CreateProjectContent();
// CreateClass("CustomActionResult");
// helper.AddBaseTypeToClass("System.Web.Mvc.ActionResult");
// CreateCodeType();
//
// bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
//
// Assert.IsTrue(derivedFrom);
// }
//
// [Test]
// public void IsDerivedFrom_ClassHasTypeInClassInheritanceTreeButNotImmediateBaseType_ReturnsTrue()
// {
// CreateProjectContent();
// CreateClass("CustomActionResult");
// AddClassInheritanceTree("CustomActionResultBase", "System.Web.Mvc.ActionResult");
// CreateCodeType();
//
// bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
//
// Assert.IsTrue(derivedFrom);
// }
//
// [Test]
// public void IsDerivedFrom_ClassHasClassInInheritanceTreeButNotImmediateParentAndClassBaseTypePropertyIsNotNull_ReturnsTrue()
// {
// CreateProjectContent();
// CreateClass("CustomActionResult");
// helper.AddBaseTypeToClass("CustomActionResultBase");
// AddClassInheritanceTree("CustomActionResultBase", "System.Web.Mvc.ActionResult");
// CreateCodeType();
//
// bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
//
// Assert.IsTrue(derivedFrom);
// }
// }
//}
// 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.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Dom;
using FileProjectItem = ICSharpCode.SharpDevelop.Project.FileProjectItem;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
using Rhino.Mocks;
using SDProject = ICSharpCode.SharpDevelop.Project;
namespace PackageManagement.Tests.EnvDTE
{
[TestFixture]
public class CodeTypeTests : CodeModelTestBase
{
CodeType codeType;
void CreateCodeType(string code, string fileName = "class.cs")
{
AddCodeFile(fileName, code);
ITypeDefinition typeDefinition = assemblyModel.TopLevelTypeDefinitions.Single().Resolve();
CreateCodeType(typeDefinition);
}
void CreateCodeType(ITypeDefinition typeDefinition)
{
codeType = new CodeType(codeModelContext, typeDefinition);
}
FileProjectItem AddFileToProject(string fileName)
{
var projectItem = new FileProjectItem(project, ICSharpCode.SharpDevelop.Project.ItemType.Compile);
project
.Stub(p => p.FindFile(new FileName(fileName)))
.Return(projectItem);
project
.Stub(p => p.SyncRoot)
.Return(new object());
return projectItem;
}
[Test]
public void Attributes_ClassHasOneAttribute_ReturnsOneAttribute()
{
CreateCodeType("[TestAttribute] public class TestClass {}");
global::EnvDTE.CodeElements attributes = codeType.Attributes;
CodeAttribute2 attribute = attributes.Item(1) as CodeAttribute2;
Assert.AreEqual(1, attributes.Count);
Assert.AreEqual("Test", attribute.Name);
}
[Test]
public void ProjectItem_TypeNotFromProject_ReturnsNull()
{
AddCodeFile("class.cs", "public class TestClass {}");
ITypeDefinition typeDefinition = projectContent
.CreateCompilation()
.ReferencedAssemblies
.FirstOrDefault()
.TopLevelTypeDefinitions.First();
CreateCodeType(typeDefinition);
global::EnvDTE.ProjectItem item = codeType.ProjectItem;
Assert.IsNull(item);
}
[Test]
public void ProjectItem_TypeIsFromProject_ReturnsNonNullProjectItem()
{
string fileName = @"d:\projects\MyProject\class1.cs";
CreateCodeType("public class TestClass {}", fileName);
AddFileToProject(fileName);
global::EnvDTE.ProjectItem item = codeType.ProjectItem;
Assert.IsNotNull(item);
}
[Test]
public void ProjectItem_TypeIsFromProject_ReturnsProjectItemThatUsesProject()
{
string fileName = @"d:\projects\MyProject\class1.cs";
CreateCodeType("public class TestClass {}", fileName);
TestableProject testableProject = ProjectHelper.CreateTestProject();
testableProject.FileName = new FileName(@"d:\projects\MyProject\MyProject.csproj");
codeModelContext.CurrentProject = testableProject;
testableProject.AddFile(fileName);
global::EnvDTE.ProjectItem item = codeType.ProjectItem;
Assert.AreEqual(@"d:\projects\MyProject\MyProject.csproj", item.ContainingProject.FileName);
}
[Test]
public void ProjectItem_ProjectContentHasProject_ReturnsProjectItemThatUsesProjectFileItem()
{
string fileName = @"d:\projects\MyProject\test.cs";
CreateCodeType("public class TestClass {}", fileName);
TestableProject testableProject = ProjectHelper.CreateTestProject();
testableProject.FileName = new FileName(@"d:\projects\MyProject\MyProject.csproj");
codeModelContext.CurrentProject = testableProject;
testableProject.AddFile(fileName);
global::EnvDTE.ProjectItem item = codeType.ProjectItem;
Assert.AreEqual("test.cs", item.Name);
}
[Test]
public void IsDerivedFrom_ClassFullyQualifiedNameMatchesTypeNameBeingChecked_ReturnsTrue()
{
CreateCodeType(
"namespace System.Web.Mvc {\r\n" +
" public class ActionResult {}\r\n" +
"}");
bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsTrue(derivedFrom);
}
[Test]
public void IsDerivedFrom_ClassFullyQualifiedNameDoesNotMatchTypeNameBeingChecked_ReturnsFalse()
{
CreateCodeType("public class Test {}");
bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsFalse(derivedFrom);
}
[Test]
public void IsDerivedFrom_ClassBaseTypeFullyQualifiedNameMatchesTypeName_ReturnsTrue()
{
AddCodeFile(
"class.cs",
"namespace System.Web.Mvc {\r\n" +
" public class CustomActionResult : ActionResult {}\r\n" +
" public class ActionResult {}\r\n" +
"}");
CreateCodeType(assemblyModel.TopLevelTypeDefinitions.First().Resolve());
bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsTrue(derivedFrom);
}
[Test]
public void IsDerivedFrom_ClassHasTypeInClassInheritanceTreeButNotImmediateBaseType_ReturnsTrue()
{
AddCodeFile(
"class.cs",
"namespace System.Web.Mvc {\r\n" +
" public class CustomActionResult : CustomActionResultBase {}\r\n" +
" public class CustomActionResultBase : ActionResult {}\r\n" +
" public class ActionResult {}\r\n" +
"}");
CreateCodeType(assemblyModel.TopLevelTypeDefinitions.First().Resolve());
bool derivedFrom = codeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsTrue(derivedFrom);
}
}
}

35
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs

@ -44,16 +44,6 @@ namespace PackageManagement.Tests.EnvDTE @@ -44,16 +44,6 @@ namespace PackageManagement.Tests.EnvDTE
AddCodeFile("class.cs", code);
}
void SetProjectForProjectContent()
{
// helper.SetProjectForProjectContent(msbuildProject);
}
void SetDifferentProjectForProjectContent()
{
// helper.SetProjectForProjectContent(ProjectHelper.CreateTestProject());
}
void SetParentSolutionFileName(string fileName)
{
var solutionFileName = new FileName(fileName);
@ -234,29 +224,30 @@ namespace PackageManagement.Tests.EnvDTE @@ -234,29 +224,30 @@ namespace PackageManagement.Tests.EnvDTE
}
[Test]
[Ignore("TODO")]
public void CodeModel_ClassExistsInProjectContentForProject_ReturnsClassWithLocationSetToInProject()
public void CodeModel_ClassExistsInProject_ReturnsClassWithLocationSetToInProject()
{
CreateProject();
SetProjectForProjectContent();
//helper.AddClassToCompletionEntries(String.Empty, "MyClass");
AddClassToProject("public class MyClass {}");
//CodeElement element = project.CodeModel.CodeElements.FirstOrDefault();
CodeElement element = dteProject.CodeModel.CodeElements
.FindFirstOrDefault(e => e.Name == "MyClass");
//Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationProject, element.InfoLocation);
Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationProject, element.InfoLocation);
}
[Test]
[Ignore("TODO")]
public void CodeModel_ClassExistsInProjectContentForDifferentProject_ReturnsClassWithLocationSetToExternal()
public void CodeModel_ClassExistsInDifferentAssembly_ReturnsClassWithLocationSetToExternal()
{
CreateProject();
//SetProjectForProjectContent();
//helper.AddClassCompletionEntriesInDifferentProjectContent(String.Empty, "MyClass");
//CodeElement element = project.CodeModel.CodeElements.FirstOrDefault();
CodeElement element = dteProject
.CodeModel
.CodeElements
.FindFirstCodeNamespaceOrDefault(e => e.Name == "System")
.Members
.FindFirstOrDefault(e => e.Name == "String");
//Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationExternal, element.InfoLocation);
Assert.AreEqual(global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationExternal, element.InfoLocation);
}
[Test]

5
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CodeElementsExtensions.cs

@ -19,6 +19,11 @@ namespace PackageManagement.Tests.Helpers @@ -19,6 +19,11 @@ namespace PackageManagement.Tests.Helpers
return list;
}
public static CodeElement FindFirstOrDefault(this global::EnvDTE.CodeElements codeElements, Func<CodeElement, bool> predicate)
{
return ToList(codeElements).FirstOrDefault(predicate);
}
public static CodeElement FirstOrDefault(this global::EnvDTE.CodeElements codeElements)
{
return ToList(codeElements).FirstOrDefault();

Loading…
Cancel
Save