Browse Source

Support enumerating project references and removing references from PowerShell scripts.

pull/15/head
Matt Ward 14 years ago
parent
commit
9b465c972b
  1. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 41
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
  3. 5
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectObject.cs
  4. 4
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Properties.cs
  5. 22
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Property.cs
  6. 30
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Reference.cs
  7. 33
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/References.cs
  8. 4
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  9. 82
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs
  10. 87
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/PropertyTests.cs
  11. 62
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ReferenceTests.cs
  12. 123
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ReferencesTests.cs
  13. 7
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectHelper.cs
  14. 33
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableDTEProject.cs
  15. 14
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs
  16. 2
      src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs

1
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -75,6 +75,7 @@ @@ -75,6 +75,7 @@
<Compile Include="Src\EnvDTE\ProjectObject.cs" />
<Compile Include="Src\EnvDTE\Properties.cs" />
<Compile Include="Src\EnvDTE\Property.cs" />
<Compile Include="Src\EnvDTE\Reference.cs" />
<Compile Include="Src\EnvDTE\References.cs" />
<Compile Include="Src\EnvDTE\Solution.cs" />
<Compile Include="Src\IAddPackageReferenceView.cs" />

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

@ -2,26 +2,57 @@ @@ -2,26 +2,57 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class Project
{
MSBuildBasedProject project;
IPackageManagementProjectService projectService;
public Project(MSBuildBasedProject project)
: this(project, new PackageManagementProjectService())
{
this.project = project;
Object = new ProjectObject(project);
Properties = new Properties(project);
}
public Project(MSBuildBasedProject project, IPackageManagementProjectService projectService)
{
this.MSBuildProject = project;
this.projectService = projectService;
Object = new ProjectObject(this);
Properties = new Properties(this);
}
public string Name {
get { return "Test"; }
get { return MSBuildProject.Name; }
}
public ProjectObject Object { get; private set; }
public Properties Properties { get; private set; }
internal MSBuildBasedProject MSBuildProject { get; private set; }
internal void Save()
{
projectService.Save(MSBuildProject);
}
internal void AddReference(string path)
{
var referenceItem = new ReferenceProjectItem(MSBuildProject, path);
projectService.AddProjectItem(MSBuildProject, referenceItem);
}
internal IEnumerable<ProjectItem> GetReferences()
{
return MSBuildProject.GetItemsOfType(ItemType.Reference);
}
internal void RemoveReference(ReferenceProjectItem referenceItem)
{
projectService.RemoveProjectItem(MSBuildProject, referenceItem);
}
}
}

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

@ -8,11 +8,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -8,11 +8,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectObject
{
MSBuildBasedProject project;
public ProjectObject(MSBuildBasedProject project)
public ProjectObject(Project project)
{
this.project = project;
References = new References(project);
}

4
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Properties.cs

@ -8,9 +8,9 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -8,9 +8,9 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class Properties
{
MSBuildBasedProject project;
Project project;
public Properties(MSBuildBasedProject project)
public Properties(Project project)
{
this.project = project;
}

22
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Property.cs

@ -8,33 +8,26 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -8,33 +8,26 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class Property
{
IPackageManagementProjectService projectService;
MSBuildBasedProject project;
Project project;
string name;
public Property(MSBuildBasedProject project, string name)
: this(project, name, new PackageManagementProjectService())
{
}
public Property(MSBuildBasedProject project, string name, IPackageManagementProjectService projectService)
public Property(Project project, string name)
{
this.project = project;
this.name = name;
this.projectService = projectService;
}
public object Value {
get { return GetProperty(name); }
set {
SetProperty(name, value);
SaveProject();
project.Save();
}
}
string GetProperty(string name)
{
string value = project.GetUnevalatedProperty(name);
string value = project.MSBuildProject.GetUnevalatedProperty(name);
return EmptyStringIfNull(value);
}
@ -49,12 +42,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -49,12 +42,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
void SetProperty(string name, object value)
{
bool escapeValue = false;
project.SetProperty(name, value as string, escapeValue);
}
void SaveProject()
{
projectService.Save(project);
project.MSBuildProject.SetProperty(name, value as string, escapeValue);
}
}
}

30
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Reference.cs

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
// 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.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class Reference
{
ReferenceProjectItem referenceProjectItem;
Project project;
public Reference(Project project, ReferenceProjectItem referenceProjectItem)
{
this.project = project;
this.referenceProjectItem = referenceProjectItem;
}
public string Name {
get { return referenceProjectItem.Name; }
}
public void Remove()
{
project.RemoveReference(referenceProjectItem);
project.Save();
}
}
}

33
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/References.cs

@ -2,14 +2,17 @@ @@ -2,14 +2,17 @@
// 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.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class References
public class References : IEnumerable<Reference>
{
MSBuildBasedProject project;
MSBuildBasedProject msbuildProject;
IPackageManagementProjectService projectService;
Project project;
public References(MSBuildBasedProject project)
: this(project, new PackageManagementProjectService())
@ -20,20 +23,36 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -20,20 +23,36 @@ namespace ICSharpCode.PackageManagement.EnvDTE
MSBuildBasedProject project,
IPackageManagementProjectService projectService)
{
this.project = project;
this.msbuildProject = project;
this.projectService = projectService;
}
public References(Project project)
{
this.project = project;
}
public void Add(string path)
{
var referenceItem = new ReferenceProjectItem(project, path);
projectService.AddProjectItem(project, referenceItem);
SaveProject();
project.AddReference(path);
project.Save();
}
void SaveProject()
{
projectService.Save(project);
project.Save();
}
public IEnumerator<Reference> GetEnumerator()
{
foreach (ReferenceProjectItem referenceProjectItem in project.GetReferences()) {
yield return new Reference(project, referenceProjectItem);
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}

4
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -72,6 +72,9 @@ @@ -72,6 +72,9 @@
<Compile Include="Src\AddPackageReferenceCommandTests.cs" />
<Compile Include="Src\EnvDTE\DTETests.cs" />
<Compile Include="Src\EnvDTE\ProjectTests.cs" />
<Compile Include="Src\EnvDTE\PropertyTests.cs" />
<Compile Include="Src\EnvDTE\ReferencesTests.cs" />
<Compile Include="Src\EnvDTE\ReferenceTests.cs" />
<Compile Include="Src\Helpers\ExceptionThrowingPackageManagementProject.cs" />
<Compile Include="Src\Helpers\ExceptionThrowingRegisteredPackageRepositories.cs" />
<Compile Include="Src\Helpers\FakeAddPackageReferenceView.cs" />
@ -85,6 +88,7 @@ @@ -85,6 +88,7 @@
<Compile Include="Src\Helpers\FakePackageViewModelFactory.cs" />
<Compile Include="Src\Helpers\FakePowerShellSession.cs" />
<Compile Include="Src\Helpers\TestableAddPackageReferenceCommand.cs" />
<Compile Include="Src\Helpers\TestableDTEProject.cs" />
<Compile Include="Src\PackageFromRepositoryTests.cs" />
<Compile Include="Src\PackageManagementEventsTests.cs" />
<Compile Include="Src\PackageManagementLoggerTests.cs" />

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

@ -22,88 +22,14 @@ namespace PackageManagement.Tests.EnvDTE @@ -22,88 +22,14 @@ namespace PackageManagement.Tests.EnvDTE
}
[Test]
public void ObjectReferencesAdd_AddGacAssemblyReference_ReferenceAddedToMSBuildProject()
public void Name_ProjectNameIsMyApp_ReturnsMyApp()
{
CreateProject();
project.Object.References.Add("System.Data");
msbuildProject.Name = "MyApp";
var reference = msbuildProject.Items[0] as ReferenceProjectItem;
string referenceName = reference.Name;
string name = project.Name;
Assert.AreEqual("System.Data", referenceName);
}
[Test]
public void ObjectReferencesAdd_AddGacAssemblyReference_MSBuildProjectIsSaved()
{
CreateProject();
project.Object.References.Add("System.Xml");
bool saved = msbuildProject.IsSaved;
Assert.IsTrue(saved);
}
[Test]
public void PropertiesItemValue_GetPostBuildEvent_ReturnsProjectsPostBuildEvent()
{
CreateProject();
msbuildProject.SetProperty("PostBuildEvent", "Test");
var postBuildEventProperty = project.Properties.Item("PostBuildEvent").Value;
Assert.AreEqual("Test", postBuildEventProperty);
}
[Test]
public void PropertiesItemValue_GetPostBuildEvent_ReturnsUnevaluatedPostBuildEvent()
{
CreateProject();
msbuildProject.SetProperty("PostBuildEvent", "$(SolutionDir)", false);
var postBuildEventProperty = project.Properties.Item("PostBuildEvent").Value;
Assert.AreEqual("$(SolutionDir)", postBuildEventProperty);
}
[Test]
public void PropertiesItemValue_GetNullProperty_ReturnsEmptyString()
{
CreateProject();
var property = project.Properties.Item("TestTestTest").Value;
Assert.AreEqual(String.Empty, property);
}
[Test]
public void PropertiesItemValue_SetPostBuildEvent_UpdatesProjectsPostBuildEvent()
{
CreateProject();
project.Properties.Item("PostBuildEvent").Value = "Test";
string postBuildEventProperty = msbuildProject.GetEvaluatedProperty("PostBuildEvent");
Assert.AreEqual("Test", postBuildEventProperty);
}
[Test]
public void PropertiesItemValue_SetPostBuildEvent_DoesNotEscapeText()
{
CreateProject();
project.Properties.Item("PostBuildEvent").Value = "$(SolutionDir)";
string postBuildEventProperty = msbuildProject.GetUnevalatedProperty("PostBuildEvent");
Assert.AreEqual("$(SolutionDir)", postBuildEventProperty);
}
[Test]
public void PropertiesItemValue_SetPostBuildEvent_MSBuildProjectIsSaved()
{
CreateProject();
project.Properties.Item("PostBuildEvent").Value = "test";
bool saved = msbuildProject.IsSaved;
Assert.IsTrue(saved);
Assert.AreEqual("MyApp", name);
}
}
}

87
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/PropertyTests.cs

@ -0,0 +1,87 @@ @@ -0,0 +1,87 @@
// 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 NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests.EnvDTE
{
[TestFixture]
public class PropertyTests
{
Properties properties;
TestableDTEProject project;
TestableProject msbuildProject;
void CreateProperties()
{
project = new TestableDTEProject();
msbuildProject = project.TestableProject;
properties = new Properties(project);
}
[Test]
public void Value_GetPostBuildEvent_ReturnsProjectsPostBuildEvent()
{
CreateProperties();
msbuildProject.SetProperty("PostBuildEvent", "Test");
var postBuildEventProperty = properties.Item("PostBuildEvent").Value;
Assert.AreEqual("Test", postBuildEventProperty);
}
[Test]
public void Value_GetPostBuildEvent_ReturnsUnevaluatedPostBuildEvent()
{
CreateProperties();
msbuildProject.SetProperty("PostBuildEvent", "$(SolutionDir)", false);
var postBuildEventProperty = properties.Item("PostBuildEvent").Value;
Assert.AreEqual("$(SolutionDir)", postBuildEventProperty);
}
[Test]
public void Value_GetNullProperty_ReturnsEmptyString()
{
CreateProperties();
var property = properties.Item("TestTestTest").Value;
Assert.AreEqual(String.Empty, property);
}
[Test]
public void Value_SetPostBuildEvent_UpdatesProjectsPostBuildEvent()
{
CreateProperties();
properties.Item("PostBuildEvent").Value = "Test";
string postBuildEventProperty = msbuildProject.GetEvaluatedProperty("PostBuildEvent");
Assert.AreEqual("Test", postBuildEventProperty);
}
[Test]
public void Value_SetPostBuildEvent_DoesNotEscapeText()
{
CreateProperties();
properties.Item("PostBuildEvent").Value = "$(SolutionDir)";
string postBuildEventProperty = msbuildProject.GetUnevalatedProperty("PostBuildEvent");
Assert.AreEqual("$(SolutionDir)", postBuildEventProperty);
}
[Test]
public void ItemValue_SetPostBuildEvent_MSBuildProjectIsSaved()
{
CreateProperties();
project.Properties.Item("PostBuildEvent").Value = "test";
bool saved = msbuildProject.IsSaved;
Assert.IsTrue(saved);
}
}
}

62
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ReferenceTests.cs

@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
// 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.Design;
using ICSharpCode.PackageManagement.EnvDTE;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests.EnvDTE
{
[TestFixture]
public class ReferenceTests
{
Reference reference;
TestableProject msbuildProject;
FakePackageManagementProjectService fakeProjectService;
TestableDTEProject project;
void CreateReference(string name)
{
project = new TestableDTEProject();
msbuildProject = project.TestableProject;
var referenceProjectItem = msbuildProject.AddReference(name);
fakeProjectService = project.FakeProjectService;
reference = new Reference(project, referenceProjectItem);
}
[Test]
public void Name_ReferenceNameIsSystemXml_ReturnsSystemXml()
{
CreateReference("System.Xml");
string name = reference.Name;
Assert.AreEqual("System.Xml", name);
}
[Test]
public void Remove_RemoveSystemXmlReferenceFromProject_ProjectReferenceRemoved()
{
CreateReference("System.Xml");
reference.Remove();
int count = msbuildProject.Items.Count;
Assert.AreEqual(0, count);
}
[Test]
public void Remove_RemoveSystemXmlReferenceFromProject_ProjectIsSaved()
{
CreateReference("System.Xml");
reference.Remove();
bool saved = msbuildProject.IsSaved;
Assert.IsTrue(saved);
}
}
}

123
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ReferencesTests.cs

@ -0,0 +1,123 @@ @@ -0,0 +1,123 @@
// 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.Design;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests.EnvDTE
{
[TestFixture]
public class ReferencesTests
{
References references;
FakePackageManagementProjectService fakeProjectService;
TestableProject msbuildProject;
TestableDTEProject project;
void CreateReferences()
{
project = new TestableDTEProject();
msbuildProject = project.TestableProject;
fakeProjectService = project.FakeProjectService;
references = project.Object.References;
}
void ReferenceCollectionAssertAreEqual(string[] expectedReferences, List<Reference> referenceList)
{
var actualReferences = new List<string>();
referenceList.ForEach(r => actualReferences.Add(r.Name));
CollectionAssert.AreEqual(expectedReferences, actualReferences);
}
void ReferenceCollectionAssertAreEqual(string[] expectedReferences, IEnumerable referenceList)
{
var actualReferences = new List<string>();
foreach (Reference reference in referenceList) {
actualReferences.Add(reference.Name);
}
CollectionAssert.AreEqual(expectedReferences, actualReferences);
}
[Test]
public void Add_AddGacAssemblyReference_ReferenceAddedToMSBuildProject()
{
CreateReferences();
references.Add("System.Data");
var reference = msbuildProject.Items[0] as ReferenceProjectItem;
string referenceName = reference.Name;
Assert.AreEqual("System.Data", referenceName);
}
[Test]
public void Add_AddGacAssemblyReference_MSBuildProjectIsSaved()
{
CreateReferences();
references.Add("System.Xml");
bool saved = msbuildProject.IsSaved;
Assert.IsTrue(saved);
}
[Test]
public void GetEnumerator_ProjectHasTwoReferences_TwoReferencesReturned()
{
CreateReferences();
msbuildProject.AddReference("System.Data");
msbuildProject.AddReference("System.Xml");
var referenceList = new List<Reference>();
referenceList.AddRange(references);
var expectedReferences = new string[] {
"System.Data",
"System.Xml"
};
ReferenceCollectionAssertAreEqual(expectedReferences, referenceList);
}
[Test]
public void GetEnumerator_ProjectHasFileItemBeforeReferenceItem_OneReferenceReturned()
{
CreateReferences();
msbuildProject.AddFile(@"src\Test.cs");
msbuildProject.AddReference("System.Xml");
var referenceList = new List<Reference>();
referenceList.AddRange(references);
var expectedReferences = new string[] {
"System.Xml"
};
ReferenceCollectionAssertAreEqual(expectedReferences, referenceList);
}
[Test]
public void GetEnumerator_UseUntypedEnumeratorProjectHasOneReference_OneReferenceReturned()
{
CreateReferences();
msbuildProject.AddReference("System.Xml");
var enumerable = references as IEnumerable;
var expectedReferences = new string[] {
"System.Xml"
};
ReferenceCollectionAssertAreEqual(expectedReferences, enumerable);
}
}
}

7
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectHelper.cs

@ -2,7 +2,6 @@ @@ -2,7 +2,6 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using DTE = ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Internal.Templates;
using ICSharpCode.SharpDevelop.Project;
@ -80,11 +79,5 @@ namespace PackageManagement.Tests.Helpers @@ -80,11 +79,5 @@ namespace PackageManagement.Tests.Helpers
}
return null;
}
public static DTE.Project CreateDTEProject()
{
TestableProject msbuildProject = CreateTestProject();
return new DTE.Project(msbuildProject);
}
}
}

33
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableDTEProject.cs

@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
// 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.Design;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Project;
namespace PackageManagement.Tests.Helpers
{
public class TestableDTEProject : Project
{
public TestableProject TestableProject;
public FakePackageManagementProjectService FakeProjectService;
public TestableDTEProject()
: this(ProjectHelper.CreateTestProject())
{
}
public TestableDTEProject(TestableProject project)
: this(project, new FakePackageManagementProjectService())
{
}
public TestableDTEProject(TestableProject project, FakePackageManagementProjectService projectService)
: base(project, projectService)
{
this.TestableProject = project;
this.FakeProjectService = projectService;
}
}
}

14
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs

@ -29,5 +29,19 @@ namespace PackageManagement.Tests.Helpers @@ -29,5 +29,19 @@ namespace PackageManagement.Tests.Helpers
{
return ItemTypeToReturnFromGetDefaultItemType;
}
public ReferenceProjectItem AddReference(string include)
{
var referenceProjectItem = new ReferenceProjectItem(this, include);
ProjectService.AddProjectItem(this, referenceProjectItem);
return referenceProjectItem;
}
public FileProjectItem AddFile(string include)
{
var fileProjectItem = new FileProjectItem(this, ItemType.Compile, include);
ProjectService.AddProjectItem(this, fileProjectItem);
return fileProjectItem;
}
}
}

2
src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs

@ -34,7 +34,7 @@ namespace PackageManagement.Tests.Scripting @@ -34,7 +34,7 @@ namespace PackageManagement.Tests.Scripting
public void Execute_PackageInstallDirectoryIsSet_ProjectSessionVariableIsSet()
{
CreateScript();
var expectedProject = ProjectHelper.CreateDTEProject();
var expectedProject = new TestableDTEProject();
var project = new FakePackageManagementProject();
project.DTEProject = expectedProject;
script.Project = project;

Loading…
Cancel
Save