diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileProjectItems.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileProjectItems.cs index 5900365428..523a352117 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileProjectItems.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileProjectItems.cs @@ -17,11 +17,18 @@ namespace ICSharpCode.PackageManagement.EnvDTE public class FileProjectItems : ProjectItems { ProjectItem projectItem; + IPackageManagementFileService fileService; public FileProjectItems(ProjectItem projectItem) - : base(projectItem.ContainingProject, projectItem, new PackageManagementFileService()) + : this(projectItem, new PackageManagementFileService()) + { + } + + public FileProjectItems(ProjectItem projectItem, IPackageManagementFileService fileService) + : base(projectItem.ContainingProject, projectItem, fileService) { this.projectItem = projectItem; + this.fileService = fileService; } protected override IEnumerable GetProjectItems() @@ -46,5 +53,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE .Where(item => item is SD.FileProjectItem) .Select(item => (SD.FileProjectItem)item); } + + protected override ProjectItem AddFileProjectItemToProject(string fileName) + { + return AddFileProjectItemWithDependent(fileName); + } + + ProjectItem AddFileProjectItemWithDependent(string fileName) + { + return Project.AddFileProjectItemWithDependentUsingFullPath(fileName, projectItem.Name); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs index 8bfbe644da..17a71d99b3 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs @@ -157,9 +157,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE } internal ProjectItem AddFileProjectItemUsingFullPath(string path) + { + return AddFileProjectItemWithDependentUsingFullPath(path, null); + } + + internal ProjectItem AddFileProjectItemWithDependentUsingFullPath(string path, string dependentUpon) { FileProjectItem fileProjectItem = CreateFileProjectItemUsingFullPath(path); fileProjectItem.FileName = path; + fileProjectItem.DependentUpon = dependentUpon; AddProjectItemToMSBuildProject(fileProjectItem); return new ProjectItem(this, fileProjectItem); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs index 6117da940a..5b694bc970 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs @@ -119,13 +119,21 @@ namespace ICSharpCode.PackageManagement.EnvDTE public virtual ProjectItem AddFromFile(string fileName) { using (IProjectBrowserUpdater updater = Project.CreateProjectBrowserUpdater()) { - ProjectItem projectItem = Project.AddFileProjectItemUsingFullPath(fileName); + ProjectItem projectItem = AddFileProjectItemToProject(fileName); Project.Save(); fileService.ParseFile(fileName); return projectItem; } } + /// + /// Adds a file to the project with this ProjectItems as its parent. + /// + protected virtual ProjectItem AddFileProjectItemToProject(string fileName) + { + return Project.AddFileProjectItemUsingFullPath(fileName); + } + public virtual int Count { get { return GetProjectItems().Count(); } } diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 9ea4866e47..eba8c5a39f 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -98,6 +98,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/FileProjectItemsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/FileProjectItemsTests.cs new file mode 100644 index 0000000000..9d6dff0c76 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/FileProjectItemsTests.cs @@ -0,0 +1,108 @@ +// 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.Linq; + +using ICSharpCode.PackageManagement; +using ICSharpCode.PackageManagement.EnvDTE; +using ICSharpCode.SharpDevelop.Project; +using NUnit.Framework; +using PackageManagement.Tests.Helpers; +using Rhino.Mocks; +using DTE = ICSharpCode.PackageManagement.EnvDTE; + +namespace PackageManagement.Tests.EnvDTE +{ + [TestFixture] + public class FileProjectItemsTests + { + TestableDTEProject project; + FileProjectItems fileProjectItems; + TestableProject msbuildProject; + FakeFileService fakeFileService; + + void CreateProjectWithOneFileInProjectFolder( + string include, + string projectFileName = @"c:\projects\MyProject\MyProject.csproj") + { + project = new TestableDTEProject(); + msbuildProject = project.TestableProject; + fakeFileService = project.FakeFileService; + msbuildProject.FileName = projectFileName; + msbuildProject.AddFile(include); + } + + void CreateFileProjectItemsFromFileInProjectFolder(string include) + { + DTE.ProjectItem projectItem = project.ProjectItems.Item(include); + fileProjectItems = new DTE.FileProjectItems(projectItem, fakeFileService); + } + + IProjectBrowserUpdater CreateProjectBrowserUpdater() + { + IProjectBrowserUpdater projectBrowserUpdater = MockRepository.GenerateStub(); + project.FakeProjectService.ProjectBrowserUpdater = projectBrowserUpdater; + return projectBrowserUpdater; + } + + [Test] + public void AddFromFile_AddFromFileFromProjectItemsBelongingToFile_FileIsParsed() + { + string projectFileName = @"d:\projects\myproject\MyProject.csproj"; + CreateProjectWithOneFileInProjectFolder("MainForm.cs", projectFileName); + CreateFileProjectItemsFromFileInProjectFolder("MainForm.cs"); + string fileName = @"d:\projects\myproject\MainForm.Designer.cs"; + + fileProjectItems.AddFromFile(fileName); + + string parsedFileName = fakeFileService.FileNamePassedToParseFile; + Assert.AreEqual(fileName, parsedFileName); + } + + [Test] + public void AddFromFile_AddFromFileFromProjectItemsBelongingToFile_ReturnsProjectItemAdded() + { + string projectFileName = @"d:\projects\myproject\MyProject.csproj"; + CreateProjectWithOneFileInProjectFolder("MainForm.cs", projectFileName); + CreateFileProjectItemsFromFileInProjectFolder("MainForm.cs"); + string fileName = @"d:\projects\myproject\MainForm.Designer.cs"; + + DTE.ProjectItem itemAdded = fileProjectItems.AddFromFile(fileName); + + string fullPath = (string)itemAdded.Properties.Item("FullPath").Value; + Assert.AreEqual("MainForm.Designer.cs", itemAdded.Name); + Assert.AreEqual(fileName, fullPath); + } + + [Test] + public void AddFromFile_AddFromFileFromProjectItemsBelongingToFile_ProjectIsSaved() + { + string projectFileName = @"d:\projects\myproject\MyProject.csproj"; + CreateProjectWithOneFileInProjectFolder("MainForm.cs", projectFileName); + CreateFileProjectItemsFromFileInProjectFolder("MainForm.cs"); + string fileName = @"d:\projects\myproject\MainForm.Designer.cs"; + + fileProjectItems.AddFromFile(fileName); + + bool saved = msbuildProject.IsSaved; + Assert.IsTrue(saved); + } + + [Test] + public void AddFromFile_AddFromFileFromProjectItemsBelongingToFile_ProjectBrowserUpdaterIsDisposed() + { + string projectFileName = @"d:\projects\myproject\MyProject.csproj"; + CreateProjectWithOneFileInProjectFolder("MainForm.cs", projectFileName); + IProjectBrowserUpdater projectBrowserUpdater = CreateProjectBrowserUpdater(); + CreateFileProjectItemsFromFileInProjectFolder("MainForm.cs"); + string fileName = @"d:\projects\myproject\MainForm.Designer.cs"; + + fileProjectItems.AddFromFile(fileName); + + projectBrowserUpdater.AssertWasCalled(updater => updater.Dispose()); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs index bbf272916a..e53150ff99 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs @@ -667,7 +667,7 @@ namespace PackageManagement.Tests.EnvDTE projectBrowserUpdater.AssertWasCalled(updater => updater.Dispose()); } - + [Test] public void AddFromDirectory_EmptyDirectoryInsideProject_ProjectBrowserUpdaterIsDisposed() { @@ -840,5 +840,26 @@ namespace PackageManagement.Tests.EnvDTE Assert.Throws(() => projectItems.Item("unknown.cs")); } + + [Test] + public void AddFromFile_AddFromFileFromProjectItemsBelongingToFile_FileIsAddedAsDependentFile() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\myproject\myproject.csproj"; + msbuildProject.AddFile("MainForm.cs"); + string fileName = @"d:\projects\myproject\MainForm.Designer.cs"; + msbuildProject.ItemTypeToReturnFromGetDefaultItemType = ItemType.Page; + projectItems = project.ProjectItems.Item("MainForm.cs").ProjectItems; + + projectItems.AddFromFile(fileName); + + FileProjectItem fileItem = msbuildProject.FindFile(fileName); + + Assert.AreEqual("MainForm.Designer.cs", fileItem.Include); + Assert.AreEqual(fileName, fileItem.FileName); + Assert.AreEqual(ItemType.Page, fileItem.ItemType); + Assert.AreEqual(msbuildProject, fileItem.Project); + Assert.AreEqual("MainForm.cs", fileItem.DependentUpon); + } } }