diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs index 489755c5c6..973b15ab92 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs @@ -39,6 +39,8 @@ namespace ICSharpCode.PackageManagement.Design FakeUninstallPackageAction = new FakeUninstallPackageAction(this); this.Name = name; + + ConstraintProvider = NullConstraintProvider.Instance; } private FakeInstallPackageAction FakeInstallPackageAction; @@ -232,6 +234,11 @@ namespace ICSharpCode.PackageManagement.Design FakeSourceRepository.AddFakePackage(packageId); } + public FakePackage AddFakePackageToSourceRepository(string packageId, string version) + { + return FakeSourceRepository.AddFakePackageWithVersion(packageId, version); + } + public void UpdatePackages(UpdatePackagesAction action) { } @@ -274,5 +281,7 @@ namespace ICSharpCode.PackageManagement.Design { throw new NotImplementedException(); } + + public IPackageConstraintProvider ConstraintProvider { get; set; } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs index d84c17d928..629e24c367 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs @@ -38,6 +38,8 @@ namespace ICSharpCode.PackageManagement Project ConvertToDTEProject(); + IPackageConstraintProvider ConstraintProvider { get; } + bool IsPackageInstalled(IPackage package); bool IsPackageInstalled(string packageId); bool HasOlderPackageInstalled(IPackage package); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs index 3d17b9a309..2b206d57bd 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs @@ -178,5 +178,15 @@ namespace ICSharpCode.PackageManagement { packageManager.UpdatePackageReference(package, settings); } + + public IPackageConstraintProvider ConstraintProvider { + get { + var constraintProvider = projectManager.LocalRepository as IPackageConstraintProvider; + if (constraintProvider != null) { + return constraintProvider; + } + return NullConstraintProvider.Instance; + } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs index 740b745ee1..07add3da31 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs @@ -134,9 +134,12 @@ namespace ICSharpCode.PackageManagement void FindPackage() { - Package = Project - .SourceRepository - .FindPackage(PackageId, PackageVersion, AllowPrereleaseVersions, allowUnlisted: false); + Package = Project.SourceRepository.FindPackage( + PackageId, + PackageVersion, + Project.ConstraintProvider, + AllowPrereleaseVersions, + allowUnlisted: false); } void ThrowPackageNotFoundError(string packageId) diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 0a2c80e407..580664fc67 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -111,6 +111,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryWithConstraintProvider.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryWithConstraintProvider.cs new file mode 100644 index 0000000000..f83fd2881e --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryWithConstraintProvider.cs @@ -0,0 +1,39 @@ +// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using ICSharpCode.PackageManagement.Design; +using NuGet; + +namespace PackageManagement.Tests.Helpers +{ + public class FakePackageRepositoryWithConstraintProvider : FakePackageRepository, IPackageConstraintProvider + { + DefaultConstraintProvider constraintProvider = new DefaultConstraintProvider(); + + public IVersionSpec GetConstraint(string packageId) + { + return constraintProvider.GetConstraint(packageId); + } + + public void AddConstraint(string packageId, IVersionSpec versionSpec) + { + constraintProvider.AddConstraint (packageId, versionSpec); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs index c721492fd3..3c1c06b677 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs @@ -759,5 +759,27 @@ namespace PackageManagement.Tests Assert.AreEqual(package, fakePackageManager.PackagePassedToUpdatePackageReference); Assert.AreEqual(updatePackagesAction, fakePackageManager.SettingsPassedToUpdatePackageReference); } + + [Test] + public void ConstraintProvider_LocalRepositoryDoesNotImplementIConstraintProvider_ReturnsNullConstraintProviderInstance () + { + CreateProject (); + + IPackageConstraintProvider provider = project.ConstraintProvider; + + Assert.AreEqual (NullConstraintProvider.Instance, provider); + } + + [Test] + public void ConstraintProvider_LocalRepositoryImplementsIConstraintProvider_ReturnsLocalRepository () + { + CreateProject (); + var localRepository = new FakePackageRepositoryWithConstraintProvider (); + fakeProjectManager.FakeLocalRepository = localRepository; + + IPackageConstraintProvider provider = project.ConstraintProvider; + + Assert.AreEqual (localRepository, provider); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs index 2258dd1699..a4c5f15634 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs @@ -355,5 +355,28 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedPackage, actualPackage); } + + [Test] + public void Execute_PackageHasConstraint_LatestPackageIsNotUpdatedButPackageWithHighestVersionThatMatchesConstraint () + { + CreateSolution (); + var constraintProvider = new DefaultConstraintProvider (); + var versionSpec = new VersionSpec (); + versionSpec.MinVersion = new SemanticVersion ("1.0"); + versionSpec.IsMinInclusive = true; + versionSpec.IsMaxInclusive = true; + versionSpec.MaxVersion = new SemanticVersion ("2.0"); + constraintProvider.AddConstraint ("MyPackage", versionSpec); + fakeProject.ConstraintProvider = constraintProvider; + fakeProject.AddFakePackageToSourceRepository ("MyPackage", "1.0"); + FakePackage packageVersion2 = fakeProject.AddFakePackageToSourceRepository ("MyPackage", "2.0"); + fakeProject.AddFakePackageToSourceRepository ("MyPackage", "3.0"); + fakeProject.FakePackages.Add (new FakePackage ("MyPackage", "1.0")); + action.PackageId = "MyPackage"; + + action.Execute (); + + Assert.AreEqual (packageVersion2, fakeProject.PackagePassedToUpdatePackage); + } } }