From 9065cebc57e20b408bde7362e8848acb8c024170 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 28 Apr 2011 19:30:25 +0100 Subject: [PATCH] Support enumerating project item properties in PowerShell scripts. --- .../Project/Src/EnvDTE/IPropertyFactory.cs | 2 ++ .../Project/Src/EnvDTE/ProjectItem.cs | 2 +- .../Src/EnvDTE/ProjectItemPropertyFactory.cs | 6 ++++ .../Src/EnvDTE/ProjectPropertyFactory.cs | 6 ++++ .../Project/Src/EnvDTE/Properties.cs | 14 +++++++- .../Src/EnvDTE/ProjectItemPropertyTests.cs | 36 +++++++++++++++++++ 6 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IPropertyFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IPropertyFactory.cs index 56d7de5178..131d595e8b 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IPropertyFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IPropertyFactory.cs @@ -2,11 +2,13 @@ // 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 interface IPropertyFactory { Property CreateProperty(string name); + IEnumerator GetEnumerator(); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs index 748f19e738..603c281547 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs @@ -12,7 +12,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE public class ProjectItem { SD.FileProjectItem projectItem; - const string CopyToOutputDirectoryPropertyName = "CopyToOutputDirectory"; + public const string CopyToOutputDirectoryPropertyName = "CopyToOutputDirectory"; public ProjectItem(Project project, SD.FileProjectItem projectItem) { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemPropertyFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemPropertyFactory.cs index 4f4e64018f..365e4373d3 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemPropertyFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemPropertyFactory.cs @@ -2,6 +2,7 @@ // 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 { @@ -18,5 +19,10 @@ namespace ICSharpCode.PackageManagement.EnvDTE { return new ProjectItemProperty(projectItem, name); } + + public IEnumerator GetEnumerator() + { + yield return new ProjectItemProperty(projectItem, ProjectItem.CopyToOutputDirectoryPropertyName); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectPropertyFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectPropertyFactory.cs index 49a87f5485..3c4b417349 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectPropertyFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectPropertyFactory.cs @@ -2,6 +2,7 @@ // 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 { @@ -18,5 +19,10 @@ namespace ICSharpCode.PackageManagement.EnvDTE { return new ProjectProperty(project, name); } + + public IEnumerator GetEnumerator() + { + throw new NotImplementedException(); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Properties.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Properties.cs index 6cd9c97e4e..2e5fbc0a44 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Properties.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Properties.cs @@ -2,11 +2,13 @@ // 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 Properties + public class Properties : IEnumerable { IPropertyFactory propertyFactory; @@ -19,5 +21,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE { return propertyFactory.CreateProperty(propertyName); } + + public IEnumerator GetEnumerator() + { + return propertyFactory.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemPropertyTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemPropertyTests.cs index c0891f549b..fd7b92b02d 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemPropertyTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemPropertyTests.cs @@ -2,6 +2,9 @@ // 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.EnvDTE; using NUnit.Framework; using PackageManagement.Tests.Helpers; @@ -27,6 +30,17 @@ namespace PackageManagement.Tests.EnvDTE properties = projectItem.Properties; } + void AssertContainsProperty(string propertyName, IEnumerable items) + { + var itemsList = new List(); + foreach (Property property in items) { + itemsList.Add(property); + } + var matchedProperty = itemsList.Find(p => p.Name == propertyName); + + Assert.AreEqual(propertyName, matchedProperty.Name); + } + [Test] public void Value_GetCopyToOutputDirectoryPropertyValue_ReturnsCopyToOutputDirectoryValueFromMSBuildProject() { @@ -76,5 +90,27 @@ namespace PackageManagement.Tests.EnvDTE Assert.IsTrue(saved); } + + [Test] + public void GetEnumerator_FindCopyToOutputDirectoryPropertyInAllProperties_ReturnsPropertyWithCopyToOutputDirectoryName() + { + CreateProjectItemProperties(); + + var projectItemProperties = new List(properties); + var property = projectItemProperties.Find(p => p.Name == "CopyToOutputDirectory"); + + Assert.AreEqual("CopyToOutputDirectory", property.Name); + } + + + [Test] + public void GetEnumerator_FindCopyToOutputDirectoryPropertyFromUntypedEnumerator_ReturnsPropertyWithCopyToOutputDirectoryName() + { + CreateProjectItemProperties(); + + var projectItemProperties = properties as IEnumerable; + + AssertContainsProperty("CopyToOutputDirectory", projectItemProperties); + } } }