12 changed files with 378 additions and 54 deletions
@ -0,0 +1,46 @@ |
|||||||
|
// 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 System.IO; |
||||||
|
|
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
using SD = ICSharpCode.SharpDevelop.Project; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement.EnvDTE |
||||||
|
{ |
||||||
|
public class ChildProjectItems : IEnumerable<ProjectItem> |
||||||
|
{ |
||||||
|
public ChildProjectItems(ProjectItem projectItem) |
||||||
|
{ |
||||||
|
this.ProjectItem = projectItem; |
||||||
|
this.Project = projectItem.ContainingProject; |
||||||
|
} |
||||||
|
|
||||||
|
ProjectItem ProjectItem { get; set; } |
||||||
|
Project Project { get; set; } |
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() |
||||||
|
{ |
||||||
|
return GetEnumerator(); |
||||||
|
} |
||||||
|
|
||||||
|
public IEnumerator<ProjectItem> GetEnumerator() |
||||||
|
{ |
||||||
|
foreach (SD.ProjectItem msbuildProjectItem in Project.MSBuildProject.Items) { |
||||||
|
ProjectItem item = ConvertToProjectItem(msbuildProjectItem); |
||||||
|
if (item != null) { |
||||||
|
yield return item; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ProjectItem ConvertToProjectItem(SD.ProjectItem msbuildProjectItem) |
||||||
|
{ |
||||||
|
ProjectItemRelationship relationship = ProjectItem.GetRelationship(msbuildProjectItem); |
||||||
|
return relationship.GetChild(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,49 @@ |
|||||||
|
// 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.IO; |
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
using SD = ICSharpCode.SharpDevelop.Project; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement.EnvDTE |
||||||
|
{ |
||||||
|
public class DirectoryProjectItem : ProjectItem |
||||||
|
{ |
||||||
|
string relativePath; |
||||||
|
|
||||||
|
public DirectoryProjectItem( |
||||||
|
Project project, |
||||||
|
string relativePath) |
||||||
|
: this(project, CreateFileProjectItem(project, relativePath)) |
||||||
|
{ |
||||||
|
this.relativePath = relativePath; |
||||||
|
} |
||||||
|
|
||||||
|
static FileProjectItem CreateFileProjectItem(Project project, string relativePath) |
||||||
|
{ |
||||||
|
string directory = GetLastDirectoryName(relativePath); |
||||||
|
return new FileProjectItem(project.MSBuildProject, ItemType.Folder, directory); |
||||||
|
} |
||||||
|
|
||||||
|
static string GetLastDirectoryName(string relativePath) |
||||||
|
{ |
||||||
|
string[] directoryNames = relativePath.Split('\\'); |
||||||
|
return directoryNames[1]; |
||||||
|
} |
||||||
|
|
||||||
|
public DirectoryProjectItem(Project project, FileProjectItem projectItem) |
||||||
|
: base(project, projectItem) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
internal override bool IsChildItem(SD.ProjectItem msbuildProjectItem) |
||||||
|
{ |
||||||
|
string directory = Path.GetDirectoryName(msbuildProjectItem.Include); |
||||||
|
if (directory == relativePath) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
// 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.Generic; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement.EnvDTE |
||||||
|
{ |
||||||
|
public class DirectoryProjectItems : ProjectItems |
||||||
|
{ |
||||||
|
ProjectItem projectItem; |
||||||
|
|
||||||
|
public DirectoryProjectItems(ProjectItem projectItem) |
||||||
|
: base(projectItem.ContainingProject, new PackageManagementFileService()) |
||||||
|
{ |
||||||
|
this.projectItem = projectItem; |
||||||
|
} |
||||||
|
|
||||||
|
public override IEnumerator<ProjectItem> GetEnumerator() |
||||||
|
{ |
||||||
|
var items = new ChildProjectItems(projectItem); |
||||||
|
return items.GetEnumerator(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,69 @@ |
|||||||
|
// 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.IO; |
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
using SD = ICSharpCode.SharpDevelop.Project; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement.EnvDTE |
||||||
|
{ |
||||||
|
public class ProjectItemRelationship |
||||||
|
{ |
||||||
|
public ProjectItemRelationship(ProjectItem projectItem, SD.ProjectItem msbuildProjectItem) |
||||||
|
{ |
||||||
|
this.ProjectItem = projectItem; |
||||||
|
this.MSBuildProjectItem = msbuildProjectItem; |
||||||
|
this.Project = projectItem.ContainingProject; |
||||||
|
GetRelationship(); |
||||||
|
} |
||||||
|
|
||||||
|
public ProjectItem ProjectItem { get; private set; } |
||||||
|
public SD.ProjectItem MSBuildProjectItem { get; private set; } |
||||||
|
public Project Project { get; private set; } |
||||||
|
|
||||||
|
string MSBuildProjectItemDirectory; |
||||||
|
|
||||||
|
void GetRelationship() |
||||||
|
{ |
||||||
|
GetMSBuildProjectItemDirectory(); |
||||||
|
} |
||||||
|
|
||||||
|
void GetMSBuildProjectItemDirectory() |
||||||
|
{ |
||||||
|
MSBuildProjectItemDirectory = Path.GetDirectoryName(MSBuildProjectItem.Include); |
||||||
|
} |
||||||
|
|
||||||
|
public ProjectItem GetChild() |
||||||
|
{ |
||||||
|
if (IsChildItem()) { |
||||||
|
return CreateProjectItem(); |
||||||
|
} else { |
||||||
|
if (IsInChildDirectory()) { |
||||||
|
return CreateDirectoryItem(); |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
bool IsChildItem() |
||||||
|
{ |
||||||
|
return ProjectItem.IsChildItem(MSBuildProjectItem); |
||||||
|
} |
||||||
|
|
||||||
|
ProjectItem CreateProjectItem() |
||||||
|
{ |
||||||
|
return new ProjectItem(Project, MSBuildProjectItem as FileProjectItem); |
||||||
|
} |
||||||
|
|
||||||
|
bool IsInChildDirectory() |
||||||
|
{ |
||||||
|
return MSBuildProjectItemDirectory.StartsWith(ProjectItem.Name); |
||||||
|
} |
||||||
|
|
||||||
|
ProjectItem CreateDirectoryItem() |
||||||
|
{ |
||||||
|
return new DirectoryProjectItem(Project, MSBuildProjectItemDirectory); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,100 @@ |
|||||||
|
// 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.PackageManagement.EnvDTE; |
||||||
|
using DTE = ICSharpCode.PackageManagement.EnvDTE; |
||||||
|
using NUnit.Framework; |
||||||
|
using PackageManagement.Tests.Helpers; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests.EnvDTE |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class ProjectItemTests |
||||||
|
{ |
||||||
|
TestableDTEProject project; |
||||||
|
ProjectItems projectItems; |
||||||
|
TestableProject msbuildProject; |
||||||
|
FakeFileService fakeFileService; |
||||||
|
|
||||||
|
void CreateProjectItems() |
||||||
|
{ |
||||||
|
project = new TestableDTEProject(); |
||||||
|
msbuildProject = project.TestableProject; |
||||||
|
projectItems = project.ProjectItems; |
||||||
|
fakeFileService = project.FakeFileService; |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ProjectItems_ProjectHasOneFileInsideSrcDirectory_ReturnsOneFileForSrcDirectory() |
||||||
|
{ |
||||||
|
CreateProjectItems(); |
||||||
|
msbuildProject.AddFile(@"src\program.cs"); |
||||||
|
|
||||||
|
var directoryItem = projectItems.Item("src"); |
||||||
|
var directoryProjectItems = directoryItem.ProjectItems; |
||||||
|
var files = new List<DTE.ProjectItem>(directoryProjectItems); |
||||||
|
|
||||||
|
string[] expectedFiles = new string[] { |
||||||
|
"program.cs" |
||||||
|
}; |
||||||
|
|
||||||
|
ProjectItemCollectionAssert.AreEqual(expectedFiles, files); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ProjectItems_ProjectHasTestDirectoryInsideSrcDirectory_ReturnsTestDirectoryItemForSrcDirectory() |
||||||
|
{ |
||||||
|
CreateProjectItems(); |
||||||
|
msbuildProject.AddDirectory(@"src\test"); |
||||||
|
|
||||||
|
var directoryItem = projectItems.Item("src"); |
||||||
|
var directoryProjectItems = directoryItem.ProjectItems; |
||||||
|
var items = directoryProjectItems as IEnumerable; |
||||||
|
|
||||||
|
string[] expectedItems = new string[] { |
||||||
|
"test" |
||||||
|
}; |
||||||
|
|
||||||
|
ProjectItemCollectionAssert.AreEqual(expectedItems, items); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ProjectItems_ProjectHasTwoFilesOneNotInSrcDirectory_ReturnsOneFileItemForSrcDirectory() |
||||||
|
{ |
||||||
|
CreateProjectItems(); |
||||||
|
msbuildProject.AddFile(@"src\test.cs"); |
||||||
|
msbuildProject.AddFile("program.cs"); |
||||||
|
|
||||||
|
var directoryItem = projectItems.Item("src"); |
||||||
|
var directoryProjectItems = directoryItem.ProjectItems; |
||||||
|
var items = directoryProjectItems as IEnumerable; |
||||||
|
|
||||||
|
string[] expectedItems = new string[] { |
||||||
|
"test.cs" |
||||||
|
}; |
||||||
|
|
||||||
|
ProjectItemCollectionAssert.AreEqual(expectedItems, items); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ProjectItems_ProjectHasOneFileInTestDirectoryTwoLevelsDeep_ReturnsOneFileItemForTestDirectory() |
||||||
|
{ |
||||||
|
CreateProjectItems(); |
||||||
|
msbuildProject.AddFile(@"src\test\test.cs"); |
||||||
|
|
||||||
|
var directoryItem = projectItems.Item("src"); |
||||||
|
var testDirectoryItem = directoryItem.ProjectItems.Item("test"); |
||||||
|
var testDirectoryProjectItems = testDirectoryItem.ProjectItems; |
||||||
|
var items = testDirectoryProjectItems as IEnumerable; |
||||||
|
|
||||||
|
string[] expectedItems = new string[] { |
||||||
|
"test.cs" |
||||||
|
}; |
||||||
|
|
||||||
|
ProjectItemCollectionAssert.AreEqual(expectedItems, items); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
// 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 DTE = ICSharpCode.PackageManagement.EnvDTE; |
||||||
|
using NUnit.Framework; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests.Helpers |
||||||
|
{ |
||||||
|
public static class ProjectItemCollectionAssert |
||||||
|
{ |
||||||
|
public static void AreEqual(string[] expectedItems, List<DTE.ProjectItem> itemsList) |
||||||
|
{ |
||||||
|
var actualItems = new List<string>(); |
||||||
|
itemsList.ForEach(r => actualItems.Add(r.Name)); |
||||||
|
|
||||||
|
CollectionAssert.AreEqual(expectedItems, actualItems); |
||||||
|
} |
||||||
|
|
||||||
|
public static void AreEqual(string[] expectedItems, IEnumerable itemsList) |
||||||
|
{ |
||||||
|
var actualItems = new List<string>(); |
||||||
|
foreach (DTE.ProjectItem item in itemsList) { |
||||||
|
actualItems.Add(item.Name); |
||||||
|
} |
||||||
|
|
||||||
|
CollectionAssert.AreEqual(expectedItems, actualItems); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue