From e428c65ef72e789755bb2ab5086fbec155dc7b93 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 13 Oct 2012 17:04:40 +0100 Subject: [PATCH] Implement EnvDTE.Solution.Properties. --- .../Project/PackageManagement.csproj | 2 + .../Project/Src/EnvDTE/Solution.cs | 23 +++-- .../Project/Src/EnvDTE/SolutionBuild.cs | 3 +- .../Project/Src/EnvDTE/SolutionProperty.cs | 37 +++++++++ .../Src/EnvDTE/SolutionPropertyFactory.cs | 37 +++++++++ .../Test/PackageManagement.Tests.csproj | 1 + .../Test/Src/EnvDTE/SolutionBuildTests.cs | 3 +- .../Test/Src/EnvDTE/SolutionPropertyTests.cs | 83 +++++++++++++++++++ .../Test/Src/Helpers/SolutionHelper.cs | 5 ++ 9 files changed, 185 insertions(+), 9 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionProperty.cs create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionPropertyFactory.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionPropertyTests.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index bc619c953b..0a3e7d6e3b 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -140,6 +140,8 @@ + + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs index 7d7060bc1d..86bd213214 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs @@ -19,6 +19,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE this.solution = projectService.OpenSolution; this.Projects = new Projects(projectService); this.Globals = new SolutionGlobals(this); + CreateProperties(); + } + + void CreateProperties() + { + var propertyFactory = new SolutionPropertyFactory(this); + Properties = new Properties(propertyFactory); } public string FullName { @@ -60,19 +67,23 @@ namespace ICSharpCode.PackageManagement.EnvDTE get { return new SolutionBuild(this); } } - public global::EnvDTE.Properties Properties { - get { - throw new NotImplementedException(); - } - } + public global::EnvDTE.Properties Properties { get; private set; } internal Project GetStartupProject() { - MSBuildBasedProject project = solution.StartupProject as MSBuildBasedProject; + MSBuildBasedProject project = solution.Preferences.StartupProject as MSBuildBasedProject; if (project != null) { return new Project(project); } return null; } + + internal IEnumerable GetAllPropertyNames() + { + return new string[] { + "Path", + "StartupProject" + }; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionBuild.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionBuild.cs index 1cb6f7c79b..e367c8abc4 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionBuild.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionBuild.cs @@ -8,7 +8,6 @@ namespace ICSharpCode.PackageManagement.EnvDTE public class SolutionBuild : MarshalByRefObject, global::EnvDTE.SolutionBuild { Solution solution; - int lastBuildInfo; public SolutionBuild() { @@ -27,7 +26,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE /// Returns the number of projects that failed to build. /// public int LastBuildInfo { - get { return lastBuildInfo; } + get { return 0; } } public void BuildProject(string solutionConfiguration, string projectUniqueName, bool waitForBuildToFinish) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionProperty.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionProperty.cs new file mode 100644 index 0000000000..20f1604b25 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionProperty.cs @@ -0,0 +1,37 @@ +// 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; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class SolutionProperty : Property + { + Solution solution; + + public SolutionProperty(Solution solution, string name) + : base(name) + { + this.solution = solution; + } + + protected override object GetValue() + { + if (Name == "StartupProject") { + return GetStartupProjectName(); + } else if (Name == "Path") { + return solution.FileName; + } + return String.Empty; + } + + string GetStartupProjectName() + { + Project project = solution.GetStartupProject(); + if (project != null) { + return solution.GetStartupProject().Name; + } + return String.Empty; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionPropertyFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionPropertyFactory.cs new file mode 100644 index 0000000000..ec9f203ace --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionPropertyFactory.cs @@ -0,0 +1,37 @@ +// 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; +using System.Linq; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class SolutionPropertyFactory : IPropertyFactory + { + Solution solution; + + public SolutionPropertyFactory(Solution solution) + { + this.solution = solution; + } + + public Property CreateProperty(string name) + { + return new SolutionProperty(solution, name); + } + + public IEnumerator GetEnumerator() + { + List properties = GetProperties().ToList(); + return properties.GetEnumerator(); + } + + IEnumerable GetProperties() + { + foreach (string propertyName in solution.GetAllPropertyNames()) { + yield return CreateProperty(propertyName); + } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 0778419620..170ee5c39b 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -104,6 +104,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionBuildTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionBuildTests.cs index 962deb1de1..b66536db84 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionBuildTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionBuildTests.cs @@ -30,7 +30,8 @@ namespace PackageManagement.Tests.EnvDTE void AddStartupProject(string projectFileName) { - solutionHelper.AddProjectToSolutionWithFileName("TestProject", projectFileName); + TestableProject project = solutionHelper.AddProjectToSolutionWithFileName("TestProject", projectFileName); + solutionHelper.SetStartupProject(project); } [Test] diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionPropertyTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionPropertyTests.cs new file mode 100644 index 0000000000..32ab2ff54a --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionPropertyTests.cs @@ -0,0 +1,83 @@ +// 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; +using SD = ICSharpCode.SharpDevelop.Project; + +namespace PackageManagement.Tests.EnvDTE +{ + [TestFixture] + public class SolutionPropertyTests + { + Properties properties; + Solution solution; + SD.Solution msbuildSolution; + SolutionHelper solutionHelper; + + void CreateProperties() + { + solutionHelper = new SolutionHelper(); + solution = solutionHelper.Solution; + msbuildSolution = solutionHelper.MSBuildSolution; + properties = (Properties)solution.Properties; + } + + void AddStartupProject(string name, string fileName) + { + TestableProject project = solutionHelper.AddProjectToSolutionWithFileName(name, fileName); + solutionHelper.SetStartupProject(project); + } + + [Test] + public void Value_GetPathProperty_ReturnsSolutionFileName() + { + CreateProperties(); + msbuildSolution.FileName = @"d:\projects\MyProject\MySolution.sln"; + + global::EnvDTE.Property property = properties.Item("Path"); + object path = property.Value; + + Assert.AreEqual(@"d:\projects\MyProject\MySolution.sln", path); + } + + [Test] + public void GetEnumerator_GetPathProperty_ReturnsSolutionFileName() + { + CreateProperties(); + msbuildSolution.FileName = @"d:\projects\MyProject\MySolution.sln"; + + global::EnvDTE.Property property = PropertiesHelper.FindProperty(properties, "Path"); + object path = property.Value; + + Assert.AreEqual(@"d:\projects\MyProject\MySolution.sln", path); + } + + [Test] + public void GetEnumerator_GetStartupProjectPropertyWhenSolutionHasOneStartableProject_ReturnsStartupProjectName() + { + CreateProperties(); + msbuildSolution.FileName = @"d:\projects\MyProject\MySolution.sln"; + AddStartupProject("MyProject", @"d:\projects\MyProject\MyProject.csproj"); + + global::EnvDTE.Property property = PropertiesHelper.FindProperty(properties, "StartupProject"); + object projectName = property.Value; + + Assert.AreEqual("MyProject", projectName); + } + + [Test] + public void GetEnumerator_GetStartupProjectPropertyWhenSolutionHasNoProjects_ReturnsPropertyWithEmptyStringAsValue() + { + CreateProperties(); + msbuildSolution.FileName = @"d:\projects\MyProject\MySolution.sln"; + + global::EnvDTE.Property property = PropertiesHelper.FindProperty(properties, "StartupProject"); + object projectName = property.Value; + + Assert.AreEqual(String.Empty, projectName); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs index 7de8f0b4dc..92ca7e49db 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs @@ -110,5 +110,10 @@ namespace PackageManagement.Tests.Helpers .First(); return project.AddFile(include); } + + public void SetStartupProject(SD.IProject project) + { + MSBuildSolution.Preferences.StartupProject = project; + } } }