Browse Source

Fix COM exception when enabling migrations.

VsSolution returns an E_FAIL COM error if the project cannot be found.
If the project was in a subfolder inside the solution then VsSolution was failing to find the project
using its unique name (e.g. 'MyProject\MyProject.csproj').
pull/28/merge
Matt Ward 13 years ago
parent
commit
144ea87548
  1. 7
      src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/VsSolution.cs
  2. 26
      src/AddIns/Misc/PackageManagement/Test/Src/VisualStudio/VsSolutionTests.cs

7
src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/VsSolution.cs

@ -4,7 +4,7 @@
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using Microsoft.VisualStudio; using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Flavor; using Microsoft.VisualStudio.Shell.Flavor;
@ -44,9 +44,10 @@ namespace ICSharpCode.PackageManagement.VisualStudio
.SingleOrDefault(project => ProjectUniqueNameMatches(project, uniqueName)) as MSBuildBasedProject; .SingleOrDefault(project => ProjectUniqueNameMatches(project, uniqueName)) as MSBuildBasedProject;
} }
bool ProjectUniqueNameMatches(IProject project, string uniqueName) bool ProjectUniqueNameMatches(IProject msbuildProject, string uniqueName)
{ {
return IsCaseInsensitiveMatch(Path.GetFileName(project.FileName), uniqueName); var project = new Project(msbuildProject as MSBuildBasedProject);
return IsCaseInsensitiveMatch(project.UniqueName, uniqueName);
} }
bool IsCaseInsensitiveMatch(string a, string b) bool IsCaseInsensitiveMatch(string a, string b)

26
src/AddIns/Misc/PackageManagement/Test/Src/VisualStudio/VsSolutionTests.cs

@ -19,9 +19,12 @@ namespace PackageManagement.Tests.VisualStudio
IVsHierarchy hierarchy; IVsHierarchy hierarchy;
FakePackageManagementProjectService fakeProjectService; FakePackageManagementProjectService fakeProjectService;
void CreateVsSolution() void CreateVsSolution(string solutionFileName = @"d:\projects\test\Test.sln")
{ {
var msbuildSolution = new Solution(new MockProjectChangeWatcher());
msbuildSolution.FileName = solutionFileName;
fakeProjectService = new FakePackageManagementProjectService(); fakeProjectService = new FakePackageManagementProjectService();
fakeProjectService.OpenSolution = msbuildSolution;
solution = new VsSolution(fakeProjectService); solution = new VsSolution(fakeProjectService);
} }
@ -33,6 +36,7 @@ namespace PackageManagement.Tests.VisualStudio
void AddProjectToMSBuildSolution(string fileName) void AddProjectToMSBuildSolution(string fileName)
{ {
TestableProject project = ProjectHelper.CreateTestProject(); TestableProject project = ProjectHelper.CreateTestProject();
project.Parent = fakeProjectService.OpenSolution;
project.FileName = fileName; project.FileName = fileName;
fakeProjectService.AddFakeProject(project); fakeProjectService.AddFakeProject(project);
} }
@ -50,7 +54,7 @@ namespace PackageManagement.Tests.VisualStudio
[Test] [Test]
public void GetProjectOfUniqueName_SolutionHasProjectMatchingUniqueName_ReturnsSuccessAndVsHierarchy() public void GetProjectOfUniqueName_SolutionHasProjectMatchingUniqueName_ReturnsSuccessAndVsHierarchy()
{ {
CreateVsSolution(); CreateVsSolution(@"d:\projects\test\Test.sln");
AddProjectToMSBuildSolution(@"d:\projects\test\Test.csproj"); AddProjectToMSBuildSolution(@"d:\projects\test\Test.csproj");
int result = GetProjectOfUniqueName("Test.csproj"); int result = GetProjectOfUniqueName("Test.csproj");
@ -62,7 +66,7 @@ namespace PackageManagement.Tests.VisualStudio
[Test] [Test]
public void GetProjectOfUniqueName_SolutionHasProjectButDoesNotMatchUniqueName_ReturnsError() public void GetProjectOfUniqueName_SolutionHasProjectButDoesNotMatchUniqueName_ReturnsError()
{ {
CreateVsSolution(); CreateVsSolution(@"d:\projects\test\Test.sln");
AddProjectToMSBuildSolution(@"d:\projects\test\unknown.vbproj"); AddProjectToMSBuildSolution(@"d:\projects\test\unknown.vbproj");
int result = GetProjectOfUniqueName("Test.csproj"); int result = GetProjectOfUniqueName("Test.csproj");
@ -73,7 +77,7 @@ namespace PackageManagement.Tests.VisualStudio
[Test] [Test]
public void GetProjectOfUniqueName_UniqueNameCaseIsIgnored_ReturnsSuccess() public void GetProjectOfUniqueName_UniqueNameCaseIsIgnored_ReturnsSuccess()
{ {
CreateVsSolution(); CreateVsSolution(@"d:\projects\test\Test.sln");
AddProjectToMSBuildSolution(@"d:\projects\test\test.csproj"); AddProjectToMSBuildSolution(@"d:\projects\test\test.csproj");
int result = GetProjectOfUniqueName("TEST.CSPROJ"); int result = GetProjectOfUniqueName("TEST.CSPROJ");
@ -85,7 +89,7 @@ namespace PackageManagement.Tests.VisualStudio
[Test] [Test]
public void GetProjectOfUniqueName_ProjectTypeGuidsRetrievedFromAggregatableCSharpProject_ReturnsCSharpProjectTypeGuid() public void GetProjectOfUniqueName_ProjectTypeGuidsRetrievedFromAggregatableCSharpProject_ReturnsCSharpProjectTypeGuid()
{ {
CreateVsSolution(); CreateVsSolution(@"d:\projects\test\Test.sln");
AddProjectToMSBuildSolution(@"d:\projects\test\test.csproj"); AddProjectToMSBuildSolution(@"d:\projects\test\test.csproj");
GetProjectOfUniqueName("test.csproj"); GetProjectOfUniqueName("test.csproj");
@ -98,5 +102,17 @@ namespace PackageManagement.Tests.VisualStudio
Assert.AreEqual(VsConstants.S_OK, result); Assert.AreEqual(VsConstants.S_OK, result);
Assert.AreEqual(ProjectTypeGuids.CSharp, guids); Assert.AreEqual(ProjectTypeGuids.CSharp, guids);
} }
[Test]
public void GetProjectOfUniqueName_UniqueNameIncludesProjectFolderInsideSolutionr_ReturnsSuccess()
{
CreateVsSolution(@"d:\projects\test\Test.sln");
AddProjectToMSBuildSolution(@"d:\projects\test\Project\MyProject.csproj");
int result = GetProjectOfUniqueName(@"Project\MyProject.csproj");
Assert.AreEqual(VsConstants.S_OK, result);
Assert.IsNotNull(hierarchy);
}
} }
} }

Loading…
Cancel
Save