Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Ward <ward.matt@gmail.com>2014-05-09 12:55:11 +0400
committerMatt Ward <ward.matt@gmail.com>2014-05-12 21:18:59 +0400
commit1dbf093706c80061397c1cb8408dbf6ac4ccc9d8 (patch)
treefdb19aee1f62802bcd16ff713c0f68491409fd76 /main/src/addins
parent0e07b6369c1708477b7b3eedf226a0ee29c38314 (diff)
[NuGet] Add more unit tests.
Port remaining unit tests from SharpDevelop.
Diffstat (limited to 'main/src/addins')
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs117
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs63
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeOperationAwareRepository.cs66
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectFactory.cs81
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectService.cs75
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs16
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManager.cs240
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagerFactory.cs49
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolver.cs52
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolverFactory.cs78
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactoryEvents.cs44
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithHttpClientEvents.cs52
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProject.cs61
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectManager.cs209
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystem.cs99
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystemFactory.cs45
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolution.cs48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepository.cs86
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepositoryFactory.cs45
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeWebRequest.cs42
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndDirectory.cs67
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndProjectName.cs66
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageReferenceRepositoryHelper.cs57
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ReferenceAndProjectName.cs67
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/SelectedProjectCollectionAssert.cs61
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestPackageHelper.cs66
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs119
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageViewModel.cs79
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProjectManager.cs105
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj44
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerFactoryTests.cs141
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerTests.cs1139
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectManagerTests.cs110
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs1095
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs86
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/OpenDotNetProjectTests.cs90
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementProjectTests.cs758
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectsTests.cs536
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSolutionTests.cs665
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageViewModelTests.cs772
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProjectHelper.cs123
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ReducedPackageOperationsTests.cs188
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryPathTests.cs117
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryTests.cs247
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UserAgentGeneratorForRepositoryRequestsTests.cs104
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj6
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs45
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs89
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs9
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs7
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs6
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IProject.cs44
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolution.cs38
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs24
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs19
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs19
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs8
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs48
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs12
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs13
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs46
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectProxy.cs70
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs9
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs11
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs45
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs10
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs5
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs11
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionProxy.cs51
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs26
75 files changed, 9018 insertions, 184 deletions
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs
new file mode 100644
index 0000000000..40dd7ebe19
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs
@@ -0,0 +1,117 @@
+//
+// FakeDotNetProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using MonoDevelop.Core;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.Projects;
+using System.Linq;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeDotNetProject : FakeProject, IDotNetProject
+ {
+ public FakeDotNetProject ()
+ {
+ References = new ProjectReferenceCollection ();
+ Files = new ProjectFileCollection ();
+ TargetFrameworkMoniker = new TargetFrameworkMoniker ("v4.5");
+ }
+
+ public FakeDotNetProject (string fileName)
+ : base (fileName)
+ {
+ References = new ProjectReferenceCollection ();
+ Files = new ProjectFileCollection ();
+ }
+
+ public DotNetProject DotNetProject { get; set; }
+ public TargetFrameworkMoniker TargetFrameworkMoniker { get; set; }
+ public string DefaultNamespace { get; set; }
+ public ProjectReferenceCollection References { get; set; }
+ public ProjectFileCollection Files { get; set; }
+
+ public List<ProjectFile> FilesAdded = new List<ProjectFile> ();
+
+ public void AddFile (ProjectFile projectFile)
+ {
+ FilesAdded.Add (projectFile);
+ Files.Add (projectFile);
+ }
+
+ public bool IsFileInProject (string fileName)
+ {
+ return Files.Any (file => file.FilePath == new FilePath (fileName));
+ }
+
+ public void AddProjectType (Guid guid)
+ {
+ ExtendedProperties.Add ("ProjectTypeGuids", guid.ToString ());
+ }
+
+ public int ReferencesWhenSavedCount;
+ public int FilesAddedWhenSavedCount;
+ public int FilesInProjectWhenSavedCount { get; set; }
+
+ public override void Save ()
+ {
+ base.Save ();
+ ReferencesWhenSavedCount = References.Count;
+ FilesAddedWhenSavedCount = FilesAdded.Count;
+ FilesInProjectWhenSavedCount = Files.Count;
+ }
+
+ public void AddDefaultBuildAction (string buildAction, string fileName)
+ {
+ DefaultBuildActions.Add (fileName, buildAction);
+ }
+
+ public Dictionary<string, string> DefaultBuildActions = new Dictionary<string, string> ();
+
+ public string GetDefaultBuildAction (string fileName)
+ {
+ string buildAction = null;
+ DefaultBuildActions.TryGetValue (fileName, out buildAction);
+ return buildAction;
+ }
+
+ public List<string> ImportsAdded = new List<string> ();
+
+ public void AddImportIfMissing (string name, string condition)
+ {
+ ImportsAdded.Add (name);
+ }
+
+ public List<string> ImportsRemoved = new List <string> ();
+
+ public void RemoveImport (string name)
+ {
+ ImportsRemoved.Add (name);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs
new file mode 100644
index 0000000000..cc98f10229
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs
@@ -0,0 +1,63 @@
+//
+// FakeFileService.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeFileService : IPackageManagementFileService
+ {
+ public string PathPassedToRemoveFile;
+ public string PathPassedToRemoveDirectory;
+
+ IDotNetProject project;
+
+ public FakeFileService (IDotNetProject project)
+ {
+ this.project = project;
+ }
+
+ public void RemoveFile (string path)
+ {
+ PathPassedToRemoveFile = path;
+ }
+
+ public void RemoveDirectory (string path)
+ {
+ PathPassedToRemoveDirectory = path;
+ project.Files.Clear ();
+ }
+
+ public void OnFileChanged (string path)
+ {
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeOperationAwareRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeOperationAwareRepository.cs
new file mode 100644
index 0000000000..7bbdce5119
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeOperationAwareRepository.cs
@@ -0,0 +1,66 @@
+//
+// FakeOperationAwareRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeOperationAwarePackageRepository : FakePackageRepository, IOperationAwareRepository, IDisposable
+ {
+ public string OperationStarted;
+ public string MainPackageIdForOperationStarted;
+
+ public IDisposable StartOperation (string operationName, string mainPackageId, string mainPackageVersion)
+ {
+ OperationStarted = operationName;
+ MainPackageIdForOperationStarted = mainPackageId;
+ return this;
+ }
+
+ public void AssertOperationWasStartedAndDisposed (string expectedOperationName, string expectedMainPackageId)
+ {
+ Assert.AreEqual (expectedOperationName, OperationStarted);
+ Assert.AreEqual (expectedMainPackageId, MainPackageIdForOperationStarted);
+ AssertOperationIsDisposed ();
+ }
+
+ void AssertOperationIsDisposed ()
+ {
+ Assert.IsTrue (IsDisposed);
+ }
+
+ public bool IsDisposed;
+
+ public void Dispose ()
+ {
+ IsDisposed = true;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectFactory.cs
new file mode 100644
index 0000000000..95d3e04eb0
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectFactory.cs
@@ -0,0 +1,81 @@
+//
+// FakePackageManagementProjectFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManagementProjectFactory : IPackageManagementProjectFactory
+ {
+ public FakePackageManagementProjectFactory ()
+ {
+ CreatePackageManagementProject = (sourceRepository, project) => {
+ RepositoriesPassedToCreateProject.Add (sourceRepository);
+ ProjectsPassedToCreateProject.Add (project);
+
+ var fakeProject = new FakePackageManagementProject ();
+ FakeProjectsCreated.Add (fakeProject);
+ return fakeProject;
+ };
+ }
+
+ public List<FakePackageManagementProject> FakeProjectsCreated =
+ new List<FakePackageManagementProject> ();
+
+ public FakePackageManagementProject FirstFakeProjectCreated {
+ get { return FakeProjectsCreated [0]; }
+ }
+
+ public IPackageRepository FirstRepositoryPassedToCreateProject {
+ get { return RepositoriesPassedToCreateProject [0]; }
+ }
+
+ public List<IPackageRepository> RepositoriesPassedToCreateProject =
+ new List<IPackageRepository> ();
+
+ public IDotNetProject FirstProjectPassedToCreateProject {
+ get { return ProjectsPassedToCreateProject [0]; }
+ }
+
+ public Func<IPackageRepository, IDotNetProject, FakePackageManagementProject>
+ CreatePackageManagementProject = (sourceRepository, project) => {
+ return null;
+ };
+
+ public List<IDotNetProject> ProjectsPassedToCreateProject =
+ new List<IDotNetProject> ();
+
+ public IPackageManagementProject CreateProject (IPackageRepository sourceRepository, IDotNetProject project)
+ {
+ return CreatePackageManagementProject (sourceRepository, project);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectService.cs
new file mode 100644
index 0000000000..d0aeb44a32
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementProjectService.cs
@@ -0,0 +1,75 @@
+//
+// FakePackageManagementProjectService.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManagementProjectService : IPackageManagementProjectService
+ {
+ public IProject CurrentProject { get; set; }
+ public ISolution OpenSolution { get; set; }
+
+ public ISolution SavedSolution;
+
+ public void Save (ISolution solution)
+ {
+ SavedSolution = solution;
+ }
+
+ public List<IDotNetProject> OpenProjects = new List<IDotNetProject> ();
+
+ public IEnumerable<IDotNetProject> GetOpenProjects ()
+ {
+ return OpenProjects;
+ }
+
+ public IProjectBrowserUpdater CreateProjectBrowserUpdater ()
+ {
+ throw new NotImplementedException ();
+ }
+
+ Dictionary<string, string> defaultCustomTools = new Dictionary<string, string> ();
+
+ public void AddDefaultCustomToolForFileName (string fileName, string customTool)
+ {
+ defaultCustomTools.Add (fileName, customTool);
+ }
+
+ public string GetDefaultCustomToolForFileName (ProjectFile projectItem)
+ {
+ if (defaultCustomTools.ContainsKey (projectItem.FilePath.ToString ())) {
+ return defaultCustomTools [projectItem.FilePath.ToString ()];
+ }
+ return String.Empty;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs
index 66f0e999c4..7185d1c5d4 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagementSolution.cs
@@ -89,12 +89,12 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers
return FakeProjectToReturnFromGetProject;
}
- public Project ProjectPassedToGetProject;
- public List<Project> ProjectsPassedToGetProject = new List<Project> ();
+ public IDotNetProject ProjectPassedToGetProject;
+ public List<IDotNetProject> ProjectsPassedToGetProject = new List<IDotNetProject> ();
public Dictionary<string, FakePackageManagementProject> FakeProjectsToReturnFromGetProject
- = new Dictionary<string, FakePackageManagementProject> ();
+ = new Dictionary<string, FakePackageManagementProject> ();
- public virtual IPackageManagementProject GetProject (IPackageRepository sourceRepository, Project project)
+ public virtual IPackageManagementProject GetProject (IPackageRepository sourceRepository, IDotNetProject project)
{
RepositoryPassedToGetProject = sourceRepository;
ProjectPassedToGetProject = project;
@@ -106,16 +106,16 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers
return FakeProjectToReturnFromGetProject;
}
- public Project FakeActiveDotNetProject;
+ public FakeDotNetProject FakeActiveDotNetProject;
- public Project GetActiveDotNetProject ()
+ public IDotNetProject GetActiveDotNetProject ()
{
return FakeActiveDotNetProject;
}
- public List<Project> FakeDotNetProjects = new List<Project> ();
+ public List<FakeDotNetProject> FakeDotNetProjects = new List<FakeDotNetProject> ();
- public IEnumerable<Project> GetDotNetProjects ()
+ public IEnumerable<IDotNetProject> GetDotNetProjects ()
{
return FakeDotNetProjects;
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManager.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManager.cs
new file mode 100644
index 0000000000..9a46479d10
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManager.cs
@@ -0,0 +1,240 @@
+//
+// FakePackageManager.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManager : ISharpDevelopPackageManager
+ {
+ public FakeProjectManager FakeProjectManager = new FakeProjectManager ();
+ public FakePackageManagementProjectService FakeProjectService = new FakePackageManagementProjectService ();
+
+ public IPackage PackagePassedToInstallPackage;
+ public bool IgnoreDependenciesPassedToInstallPackage;
+ public bool AllowPrereleaseVersionsPassedToInstallPackage;
+
+ public IPackage PackagePassedToUninstallPackage;
+
+ public UpdatePackagesAction UpdatePackagesActionsPassedToUpdatePackages;
+
+ #pragma warning disable 67
+ public event EventHandler<PackageOperationEventArgs> PackageInstalled;
+ public event EventHandler<PackageOperationEventArgs> PackageInstalling;
+ public event EventHandler<PackageOperationEventArgs> PackageUninstalled;
+ public event EventHandler<PackageOperationEventArgs> PackageUninstalling;
+ #pragma warning restore 67
+
+ public IFileSystem FileSystem {
+ get { return FakeFileSystem; }
+ set { FakeFileSystem = value as FakeFileSystem; }
+ }
+
+ public FakeFileSystem FakeFileSystem = new FakeFileSystem ();
+
+ public IPackageRepository LocalRepository { get; set; }
+
+ public ILogger Logger { get; set; }
+
+ public IPackageRepository SourceRepository { get; set; }
+
+ public ISharpDevelopProjectManager ProjectManager { get; set; }
+
+ public FakePackageRepository FakeSourceRepository = new FakePackageRepository ();
+
+ public FakePackageManager ()
+ {
+ ProjectManager = FakeProjectManager;
+ SourceRepository = FakeSourceRepository;
+ }
+
+ public bool ForceRemovePassedToUninstallPackage;
+ public bool RemoveDependenciesPassedToUninstallPackage;
+
+ public void UninstallPackage (IPackage package, UninstallPackageAction uninstallAction)
+ {
+ PackagePassedToUninstallPackage = package;
+ ForceRemovePassedToUninstallPackage = uninstallAction.ForceRemove;
+ RemoveDependenciesPassedToUninstallPackage = uninstallAction.RemoveDependencies;
+ }
+
+ public void UninstallPackage (IPackage package, bool forceRemove, bool removeDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IEnumerable<PackageOperation> PackageOperationsPassedToInstallPackage;
+
+ public void InstallPackage (IPackage package, InstallPackageAction installAction)
+ {
+ PackagePassedToInstallPackage = package;
+
+ IgnoreDependenciesPassedToInstallPackage = installAction.IgnoreDependencies;
+ PackageOperationsPassedToInstallPackage = installAction.Operations;
+ AllowPrereleaseVersionsPassedToInstallPackage = installAction.AllowPrereleaseVersions;
+ }
+
+ public List<PackageOperation> PackageOperationsToReturnFromGetInstallPackageOperations = new List<PackageOperation> ();
+ public IPackage PackagePassedToGetInstallPackageOperations;
+ public bool IgnoreDependenciesPassedToGetInstallPackageOperations;
+ public bool AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ public IEnumerable<PackageOperation> GetInstallPackageOperations (IPackage package, InstallPackageAction installAction)
+ {
+ PackagePassedToGetInstallPackageOperations = package;
+ IgnoreDependenciesPassedToGetInstallPackageOperations = installAction.IgnoreDependencies;
+ AllowPrereleaseVersionsPassedToGetInstallPackageOperations = installAction.AllowPrereleaseVersions;
+ return PackageOperationsToReturnFromGetInstallPackageOperations;
+ }
+
+ public IPackage PackagePassedToUpdatePackage;
+ public IEnumerable<PackageOperation> PackageOperationsPassedToUpdatePackage;
+ public bool UpdateDependenciesPassedToUpdatePackage;
+
+ public void UpdatePackage (IPackage package, UpdatePackageAction updateAction)
+ {
+ PackagePassedToUpdatePackage = package;
+ PackageOperationsPassedToUpdatePackage = updateAction.Operations;
+ UpdateDependenciesPassedToUpdatePackage = updateAction.UpdateDependencies;
+ AllowPrereleaseVersionsPassedToInstallPackage = updateAction.AllowPrereleaseVersions;
+ }
+
+ public void FirePackageInstalled (PackageOperationEventArgs e)
+ {
+ PackageInstalled (this, e);
+ }
+
+ public void FirePackageUninstalled (PackageOperationEventArgs e)
+ {
+ PackageUninstalled (this, e);
+ }
+
+ public IPackagePathResolver PathResolver {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public void UpdatePackage (IPackage newPackage, bool updateDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackage (string packageId, IVersionSpec versionSpec, bool updateDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void InstallPackage (IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void InstallPackage (string packageId, SemanticVersion version, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackage (IPackage newPackage, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackage (string packageId, SemanticVersion version, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackage (string packageId, IVersionSpec versionSpec, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UninstallPackage (string packageId, SemanticVersion version, bool forceRemove, bool removeDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void UpdatePackages (UpdatePackagesAction updateAction)
+ {
+ UpdatePackagesActionsPassedToUpdatePackages = updateAction;
+ }
+
+ public List<PackageOperation> PackageOperationsToReturnFromGetUpdatePackageOperations = new List<PackageOperation> ();
+ public IUpdatePackageSettings SettingsPassedToGetUpdatePackageOperations;
+ public IEnumerable<IPackage> PackagesPassedToGetUpdatePackageOperations;
+
+ public IEnumerable<PackageOperation> GetUpdatePackageOperations (IEnumerable<IPackage> packages, IUpdatePackageSettings settings)
+ {
+ SettingsPassedToGetUpdatePackageOperations = settings;
+ PackagesPassedToGetUpdatePackageOperations = packages;
+ return PackageOperationsToReturnFromGetUpdatePackageOperations;
+ }
+
+ public List<PackageOperation> PackageOperationsPassedToRunPackageOperations;
+
+ public void RunPackageOperations (IEnumerable<PackageOperation> operations)
+ {
+ PackageOperationsPassedToRunPackageOperations = operations.ToList ();
+ }
+
+ public IPackage PackagePassedToUpdatePackageReference;
+ public IUpdatePackageSettings SettingsPassedToUpdatePackageReference;
+
+ public void UpdatePackageReference (IPackage package, IUpdatePackageSettings settings)
+ {
+ PackagePassedToUpdatePackageReference = package;
+ SettingsPassedToUpdatePackageReference = settings;
+ }
+
+ public void InstallPackage (IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions, bool ignoreWalkInfo)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public DependencyVersion DependencyVersion {
+ get {
+ throw new NotImplementedException ();
+ }
+ set {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public bool WhatIf {
+ get {
+ throw new NotImplementedException ();
+ }
+ set {
+ throw new NotImplementedException ();
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagerFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagerFactory.cs
new file mode 100644
index 0000000000..bb98bc2097
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageManagerFactory.cs
@@ -0,0 +1,49 @@
+//
+// FakePackageManagerFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageManagerFactory : IPackageManagerFactory
+ {
+ public FakePackageManager FakePackageManager = new FakePackageManager ();
+ public IPackageRepository PackageRepositoryPassedToCreatePackageManager;
+ public IDotNetProject ProjectPassedToCreateRepository;
+
+ public ISharpDevelopPackageManager CreatePackageManager (IPackageRepository sourceRepository, IDotNetProject project)
+ {
+ PackageRepositoryPassedToCreatePackageManager = sourceRepository;
+ ProjectPassedToCreateRepository = project;
+ return FakePackageManager;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolver.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolver.cs
new file mode 100644
index 0000000000..d9e8eeca15
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolver.cs
@@ -0,0 +1,52 @@
+//
+// FakePackageOperationResolver.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageOperationResolver : IPackageOperationResolver
+ {
+ Dictionary <IPackage, PackageOperation []> packageOperations =
+ new Dictionary<IPackage, PackageOperation[]> ();
+
+ public IPackage PackagePassedToResolveOperations;
+
+ public IEnumerable<PackageOperation> ResolveOperations (IPackage package)
+ {
+ PackagePassedToResolveOperations = package;
+ return packageOperations [package];
+ }
+
+ public void AddOperations (IPackage package, PackageOperation[] operations)
+ {
+ packageOperations.Add (package, operations);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolverFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolverFactory.cs
new file mode 100644
index 0000000000..5c66ad1845
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageOperationResolverFactory.cs
@@ -0,0 +1,78 @@
+//
+// FakePackageOperationResolverFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageOperationResolverFactory : IPackageOperationResolverFactory
+ {
+ public FakePackageOperationResolver FakeInstallPackageOperationResolver = new FakePackageOperationResolver ();
+ public IPackageRepository LocalRepositoryPassedToCreateInstallPackageOperationsResolver;
+ public IPackageRepository SourceRepositoryPassedToCreateInstallPackageOperationsResolver;
+ public ILogger LoggerPassedToCreateInstallPackageOperationResolver;
+ public bool IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
+ public bool AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver;
+
+ public IPackageOperationResolver CreateInstallPackageOperationResolver (
+ IPackageRepository localRepository,
+ IPackageRepository sourceRepository,
+ ILogger logger,
+ InstallPackageAction installAction)
+ {
+ LocalRepositoryPassedToCreateInstallPackageOperationsResolver = localRepository;
+ SourceRepositoryPassedToCreateInstallPackageOperationsResolver = sourceRepository;
+ LoggerPassedToCreateInstallPackageOperationResolver = logger;
+ IgnoreDependenciesPassedToCreateInstallPackageOperationResolver = installAction.IgnoreDependencies;
+ AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver = installAction.AllowPrereleaseVersions;
+
+ return FakeInstallPackageOperationResolver;
+ }
+
+ public IPackageRepository LocalRepositoryPassedToCreateUpdatePackageOperationsResolver;
+ public IPackageRepository SourceRepositoryPassedToCreateUpdatePackageOperationsResolver;
+ public IPackageOperationResolver UpdatePackageOperationsResolver = new FakePackageOperationResolver ();
+ public ILogger LoggerPassedToCreateUpdatePackageOperationResolver;
+ public IUpdatePackageSettings SettingsPassedToCreatePackageOperationResolver;
+
+ public IPackageOperationResolver CreateUpdatePackageOperationResolver (
+ IPackageRepository localRepository,
+ IPackageRepository sourceRepository,
+ ILogger logger,
+ IUpdatePackageSettings settings)
+ {
+ LocalRepositoryPassedToCreateUpdatePackageOperationsResolver = localRepository;
+ SourceRepositoryPassedToCreateUpdatePackageOperationsResolver = sourceRepository;
+ LoggerPassedToCreateUpdatePackageOperationResolver = logger;
+ SettingsPassedToCreatePackageOperationResolver = settings;
+
+ return UpdatePackageOperationsResolver;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactoryEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactoryEvents.cs
new file mode 100644
index 0000000000..867e7c83de
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryFactoryEvents.cs
@@ -0,0 +1,44 @@
+//
+// FakePackageRepositoryFactoryEvents.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ public class FakePackageRepositoryFactoryEvents : IPackageRepositoryFactoryEvents
+ {
+ public event EventHandler<PackageRepositoryFactoryEventArgs> RepositoryCreated;
+
+ public void RaiseRepositoryCreatedEvent (PackageRepositoryFactoryEventArgs e)
+ {
+ if (RepositoryCreated != null) {
+ RepositoryCreated (this, e);
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithHttpClientEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithHttpClientEvents.cs
new file mode 100644
index 0000000000..2786060537
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithHttpClientEvents.cs
@@ -0,0 +1,52 @@
+//
+// FakePackageRepositoryWithHttpClientEvents.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakePackageRepositoryWithHttpClientEvents : FakePackageRepository, IHttpClientEvents
+ {
+ public event EventHandler<WebRequestEventArgs> SendingRequest;
+ public event EventHandler<ProgressEventArgs> ProgressAvailable;
+
+ public void RaiseSendingRequestEvent (WebRequestEventArgs e)
+ {
+ if (SendingRequest != null) {
+ SendingRequest (this, e);
+ }
+ }
+
+ public void RaiseProgressAvailableEvent (ProgressEventArgs e)
+ {
+ if (ProgressAvailable != null) {
+ ProgressAvailable (this, e);
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProject.cs
new file mode 100644
index 0000000000..73d4ae283f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProject.cs
@@ -0,0 +1,61 @@
+//
+// FakeProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProject : IProject
+ {
+ public string Name { get; set; }
+ public FilePath FileName { get; set; }
+ public FilePath BaseDirectory { get; set; }
+ public ISolution ParentSolution { get; set; }
+ public IDictionary ExtendedProperties { get; set; }
+
+ public FakeProject ()
+ {
+ ExtendedProperties = new Hashtable ();
+ }
+
+ public FakeProject (string fileName)
+ : this ()
+ {
+ FileName = new FilePath (fileName);
+ BaseDirectory = FileName.ParentDirectory;
+ }
+
+ public bool IsSaved;
+
+ public virtual void Save ()
+ {
+ IsSaved = true;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectManager.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectManager.cs
new file mode 100644
index 0000000000..b3d90c6e6f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectManager.cs
@@ -0,0 +1,209 @@
+//
+// FakeProjectManager.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+using NuGet;
+using System.Collections.Generic;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProjectManager : ISharpDevelopProjectManager
+ {
+ public FakePackageRepository FakeLocalRepository {
+ get { return LocalRepository as FakePackageRepository; }
+ set { LocalRepository = value; }
+ }
+
+ public FakePackageRepository FakeSourceRepository {
+ get { return SourceRepository as FakePackageRepository; }
+ set { SourceRepository = value; }
+ }
+
+ public bool IsInstalledReturnValue;
+
+ public FakeProjectManager ()
+ {
+ LocalRepository = new FakePackageRepository ();
+ SourceRepository = new FakePackageRepository ();
+ }
+
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceAdded;
+
+ protected virtual void OnPackageReferenceAdded (IPackage package)
+ {
+ if (PackageReferenceAdded != null) {
+ PackageReferenceAdded (this, new PackageOperationEventArgs (package, null, String.Empty));
+ }
+ }
+
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceRemoved;
+
+ protected virtual void OnPackageReferenceRemoved (PackageOperationEventArgs eventArgs)
+ {
+ if (PackageReferenceRemoved != null) {
+ PackageReferenceRemoved (this, eventArgs);
+ }
+ }
+
+ #pragma warning disable 67
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceAdding;
+ public event EventHandler<PackageOperationEventArgs> PackageReferenceRemoving;
+ #pragma warning restore 67
+
+ public IPackageRepository LocalRepository { get; set; }
+
+ public ILogger Logger { get; set; }
+
+ public IPackageRepository SourceRepository { get; set; }
+
+ public IPackagePathResolver PathResolver { get; set; }
+
+ public IProjectSystem Project {
+ get { return FakeProjectSystem; }
+ set { FakeProjectSystem = value as FakeProjectSystem; }
+ }
+
+ public FakeProjectSystem FakeProjectSystem = new FakeProjectSystem ();
+
+ public void RemovePackageReference (string packageId, bool forceRemove, bool removeDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IPackage PackagePassedToIsInstalled;
+
+ public bool IsInstalled (IPackage package)
+ {
+ PackagePassedToIsInstalled = package;
+ return IsInstalledReturnValue;
+ }
+
+ public string PackageIdPassedToIsInstalled;
+
+ public bool IsInstalled (string packageId)
+ {
+ PackageIdPassedToIsInstalled = packageId;
+ return IsInstalledReturnValue;
+ }
+
+ public void FirePackageReferenceAdded (IPackage package)
+ {
+ OnPackageReferenceAdded (package);
+ }
+
+ public void FirePackageReferenceRemoved (IPackage package)
+ {
+ FirePackageReferenceRemoved (new PackageOperationEventArgs (package, null, String.Empty));
+ }
+
+ public void FirePackageReferenceRemoved (PackageOperationEventArgs eventArgs)
+ {
+ OnPackageReferenceRemoved (eventArgs);
+ }
+
+ public void AddPackageReference (IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void RemovePackageReference (IPackage package, bool forceRemove, bool removeDependencies)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void AddPackageReference (string packageId, SemanticVersion version, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ string key = packageId + version.ToString ();
+ if (addPackageReferenceCallbacks.ContainsKey (key)) {
+ Action callback = addPackageReferenceCallbacks [key];
+ callback ();
+ }
+ }
+
+ Dictionary<string, Action> addPackageReferenceCallbacks = new Dictionary<string, Action> ();
+
+ public void WhenAddPackageReferenceCalled (string id, SemanticVersion version, Action callback)
+ {
+ string key = id + version.ToString ();
+ addPackageReferenceCallbacks.Add (key, callback);
+ }
+
+ public void UpdatePackageReference (string packageId, SemanticVersion version, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ string key = packageId + version.ToString ();
+ if (updatePackageReferenceCallbacks.ContainsKey (key)) {
+ Action callback = updatePackageReferenceCallbacks [key];
+ callback ();
+ }
+ }
+
+ Dictionary<string, Action> updatePackageReferenceCallbacks = new Dictionary<string, Action> ();
+
+ public void WhenUpdatePackageReferenceCalled (string id, SemanticVersion version, Action callback)
+ {
+ string key = id + version.ToString ();
+ updatePackageReferenceCallbacks.Add (key, callback);
+ }
+
+ public void UpdatePackageReference (string packageId, IVersionSpec versionSpec, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IPackage PackagePassedToHasOlderPackageInstalled;
+ public bool HasOlderPackageInstalledReturnValue;
+
+ public bool HasOlderPackageInstalled (IPackage package)
+ {
+ PackagePassedToHasOlderPackageInstalled = package;
+ return HasOlderPackageInstalledReturnValue;
+ }
+
+ public DependencyVersion DependencyVersion {
+ get {
+ throw new NotImplementedException ();
+ }
+ set {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public bool WhatIf {
+ get {
+ throw new NotImplementedException ();
+ }
+ set {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public void UpdatePackageReference (IPackage remotePackage, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystem.cs
new file mode 100644
index 0000000000..0b898101fa
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystem.cs
@@ -0,0 +1,99 @@
+//
+// FakeProjectSystem.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.IO;
+using System.Runtime.Versioning;
+
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProjectSystem : FakeFileSystem, IProjectSystem
+ {
+ public FrameworkName TargetFramework {
+ get { return new FrameworkName(".NETFramework, Version=v4.0"); }
+ }
+
+ public string ProjectName {
+ get { return String.Empty; }
+ }
+
+ public dynamic GetPropertyValue(string propertyName)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void AddReference(string referencePath, Stream stream)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool ReferenceExists(string name)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void RemoveReference(string name)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool IsSupportedFile(string path)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void AddFrameworkReference(string name)
+ {
+ throw new NotImplementedException();
+ }
+
+ public string ResolvePath(string path)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool IsBindingRedirectSupported { get; set; }
+
+ public void AddImport(string targetPath, ProjectImportLocation location)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void RemoveImport(string targetPath)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool FileExistsInProject(string path)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystemFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystemFactory.cs
new file mode 100644
index 0000000000..fc88fcd103
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeProjectSystemFactory.cs
@@ -0,0 +1,45 @@
+//
+// FakeProjectSystemFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+using MonoDevelop.Projects;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeProjectSystemFactory : ISharpDevelopProjectSystemFactory
+ {
+ public FakeProjectSystem FakeProjectSystem = new FakeProjectSystem ();
+
+ public IProjectSystem CreateProjectSystem (DotNetProject project)
+ {
+ return FakeProjectSystem;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolution.cs
new file mode 100644
index 0000000000..4417333858
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolution.cs
@@ -0,0 +1,48 @@
+//
+// FakeSolution.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeSolution : ISolution
+ {
+ public FilePath BaseDirectory { get; set; }
+ public FilePath FileName { get; set; }
+
+ public FakeSolution ()
+ {
+ }
+
+ public FakeSolution (string fileName)
+ {
+ FileName = new FilePath (fileName);
+ BaseDirectory = FileName.ParentDirectory;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepository.cs
new file mode 100644
index 0000000000..26be2ad35d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepository.cs
@@ -0,0 +1,86 @@
+//
+// FakeSolutionPackageRepository.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeSolutionPackageRepository : ISolutionPackageRepository
+ {
+ public FakeSharedPackageRepository FakeSharedRepository = new FakeSharedPackageRepository ();
+
+ public List<FakePackage> FakePackages;
+
+ public FakeSolutionPackageRepository ()
+ {
+ FakePackages = FakeSharedRepository.FakePackages;
+ }
+
+ public string InstallPathToReturn;
+ public IPackage PackagePassedToGetInstallPath;
+
+ public string GetInstallPath (IPackage package)
+ {
+ PackagePassedToGetInstallPath = package;
+ return InstallPathToReturn;
+ }
+
+ public IEnumerable<IPackage> GetPackagesByDependencyOrder ()
+ {
+ return FakePackages;
+ }
+
+ public List<FakePackage> FakePackagesByReverseDependencyOrder = new List<FakePackage> ();
+
+ public IEnumerable<IPackage> GetPackagesByReverseDependencyOrder ()
+ {
+ return FakePackagesByReverseDependencyOrder;
+ }
+
+ public bool IsInstalled (IPackage package)
+ {
+ return FakeSharedRepository.FakePackages.Exists (p => p == package);
+ }
+
+ public IQueryable<IPackage> GetPackages ()
+ {
+ return FakeSharedRepository.FakePackages.AsQueryable ();
+ }
+
+ public ISharedPackageRepository Repository {
+ get { return FakeSharedRepository; }
+ }
+
+ public IFileSystem FileSystem { get; set; }
+
+ public IPackagePathResolver PackagePathResolver { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepositoryFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepositoryFactory.cs
new file mode 100644
index 0000000000..4cc0386417
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeSolutionPackageRepositoryFactory.cs
@@ -0,0 +1,45 @@
+//
+// FakeSolutionPackageRepositoryFactory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FakeSolutionPackageRepositoryFactory : ISolutionPackageRepositoryFactory
+ {
+ public FakeSolutionPackageRepository FakeSolutionPackageRepository = new FakeSolutionPackageRepository ();
+ public ISolution SolutionPassedToCreateSolutionPackageRepository;
+
+ public ISolutionPackageRepository CreateSolutionPackageRepository (ISolution solution)
+ {
+ SolutionPassedToCreateSolutionPackageRepository = solution;
+ return FakeSolutionPackageRepository;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeWebRequest.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeWebRequest.cs
new file mode 100644
index 0000000000..f071e47439
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeWebRequest.cs
@@ -0,0 +1,42 @@
+//
+// FakeWebRequest.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Net;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ public class FakeWebRequest : WebRequest
+ {
+ public FakeWebRequest ()
+ {
+ Headers = new WebHeaderCollection ();
+ }
+
+ public override WebHeaderCollection Headers { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndDirectory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndDirectory.cs
new file mode 100644
index 0000000000..c15389b660
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndDirectory.cs
@@ -0,0 +1,67 @@
+//
+// FileNameAndDirectory.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FileNameAndDirectory
+ {
+ public FileNameAndDirectory ()
+ {
+ }
+
+ public FileNameAndDirectory (string fileName, string folder)
+ {
+ this.FileName = fileName;
+ this.Folder = folder;
+ }
+
+ public string FileName;
+ public string Folder;
+
+ public override bool Equals (object obj)
+ {
+ var rhs = obj as FileNameAndDirectory;
+ if (rhs != null) {
+ return (FileName == rhs.FileName) &&
+ (Folder == rhs.Folder);
+ }
+ return false;
+ }
+
+ public override int GetHashCode ()
+ {
+ return base.GetHashCode ();
+ }
+
+ public override string ToString ()
+ {
+ return String.Format ("[FileNameAndDirectory FileName={0}, Folder={1}]", FileName, Folder);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndProjectName.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndProjectName.cs
new file mode 100644
index 0000000000..1cb23d7eb3
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FileNameAndProjectName.cs
@@ -0,0 +1,66 @@
+//
+// FileNameAndProjectName.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class FileNameAndProjectName
+ {
+ public FileNameAndProjectName ()
+ {
+ }
+
+ public FileNameAndProjectName (string fileName, string projectName)
+ {
+ this.FileName = fileName;
+ this.ProjectName = projectName;
+ }
+
+ public string FileName;
+ public string ProjectName;
+
+ public override bool Equals (object obj)
+ {
+ FileNameAndProjectName rhs = obj as FileNameAndProjectName;
+ if (rhs != null) {
+ return (rhs.FileName == FileName) &&
+ (rhs.ProjectName == ProjectName);
+ }
+ return false;
+ }
+
+ public override int GetHashCode ()
+ {
+ return base.GetHashCode ();
+ }
+
+ public override string ToString ()
+ {
+ return String.Format ("[FileNameAndProjectName FileName={0}, ProjectName={1}]", FileName, ProjectName);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageReferenceRepositoryHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageReferenceRepositoryHelper.cs
new file mode 100644
index 0000000000..7eed2a283c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/PackageReferenceRepositoryHelper.cs
@@ -0,0 +1,57 @@
+//
+// PackageReferenceRepositoryHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class PackageReferenceRepositoryHelper
+ {
+ public FakeSharedPackageRepository FakeSharedSourceRepository = new FakeSharedPackageRepository ();
+ public FakeProjectSystem FakeProjectSystem = new FakeProjectSystem ();
+
+ public PackageReferenceRepositoryHelper ()
+ {
+ Init ();
+ }
+
+ void Init ()
+ {
+ string config =
+ "<root>\r\n" +
+ " <package id='Test' version='1.0.0.0'/>\r\n" +
+ "</root>";
+
+ FakeProjectSystem.FileExistsReturnValue = true;
+ FakeProjectSystem.FileToReturnFromOpenFile = config;
+
+ FakePackage package = new FakePackage ("Test", "1.0.0.0");
+
+ FakeSharedSourceRepository.FakePackages.Add (package);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ReferenceAndProjectName.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ReferenceAndProjectName.cs
new file mode 100644
index 0000000000..c70e0545f3
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ReferenceAndProjectName.cs
@@ -0,0 +1,67 @@
+//
+// ReferenceAndProjectName.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class ReferenceAndProjectName
+ {
+ public ReferenceAndProjectName ()
+ {
+ }
+
+ public ReferenceAndProjectName (string reference, string project)
+ {
+ this.Reference = reference;
+ this.Project = project;
+ }
+
+ public string Reference;
+ public string Project;
+
+ public override bool Equals (object obj)
+ {
+ ReferenceAndProjectName rhs = obj as ReferenceAndProjectName;
+ if (rhs != null) {
+ return (rhs.Project == Project) &&
+ (rhs.Reference == Reference);
+ }
+ return false;
+ }
+
+ public override int GetHashCode ()
+ {
+ return base.GetHashCode ();
+ }
+
+ public override string ToString ()
+ {
+ return String.Format ("[ReferenceAndProjectName Reference={0}, Project={1}]", Reference, Project);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/SelectedProjectCollectionAssert.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/SelectedProjectCollectionAssert.cs
new file mode 100644
index 0000000000..aa8cb49aac
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/SelectedProjectCollectionAssert.cs
@@ -0,0 +1,61 @@
+//
+// SelectedProjectCollectionAssert.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class SelectedProjectCollectionAssert
+ {
+ public static void AreEqual (
+ IEnumerable<IPackageManagementSelectedProject> expected,
+ IEnumerable<IPackageManagementSelectedProject> actual)
+ {
+ List<string> expectedAsStrings = ConvertToStrings (expected);
+ List<string> actualAsStrings = ConvertToStrings (actual);
+ CollectionAssert.AreEqual (expectedAsStrings, actualAsStrings);
+ }
+
+ static List<string> ConvertToStrings (IEnumerable<IPackageManagementSelectedProject> projects)
+ {
+ var projectsAsString = new List<string> ();
+ foreach (IPackageManagementSelectedProject project in projects) {
+ string text = String.Format (
+ "Name: {0}, IsSelected: {1}, IsEnabled: {2}",
+ project.Name,
+ project.IsSelected,
+ project.IsEnabled);
+ projectsAsString.Add (text);
+ }
+ return projectsAsString;
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestPackageHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestPackageHelper.cs
new file mode 100644
index 0000000000..2ad33ebfd1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestPackageHelper.cs
@@ -0,0 +1,66 @@
+//
+// TestPackageHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestPackageHelper
+ {
+ public FakePackage Package;
+
+ public TestPackageHelper ()
+ : this ("Test", "1.0.0.0")
+ {
+ }
+
+ public TestPackageHelper (string id, string version)
+ {
+ Package = new FakePackage (id, version);
+ }
+
+ public void SetId (string id)
+ {
+ Package.Id = id;
+ }
+
+ public void SetVersion (string version)
+ {
+ Package.Version = new SemanticVersion (version);
+ }
+
+ public void IsLatestVersion ()
+ {
+ Package.IsLatestVersion = true;
+ }
+
+ public void Listed ()
+ {
+ Package.Listed = true;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs
new file mode 100644
index 0000000000..e115f3a57a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs
@@ -0,0 +1,119 @@
+//
+// TestableMonoDevelopProjectSystem.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.IO;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Ide;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestableMonoDevelopProjectSystem : SharpDevelopProjectSystem
+ {
+ public string PathPassedToPhysicalFileSystemAddFile;
+ public Stream StreamPassedToPhysicalFileSystemAddFile;
+ public Action<Stream> ActionPassedToPhysicalFileSystemAddFile;
+ public FakeFileService FakeFileService;
+ public FakePackageManagementProjectService FakeProjectService;
+ public FakeLogger FakeLogger;
+ public string FileNamePassedToLogDeletedFile;
+ public FileNameAndDirectory FileNameAndDirectoryPassedToLogDeletedFileFromDirectory;
+ public string DirectoryPassedToLogDeletedDirectory;
+ public ReferenceAndProjectName ReferenceAndProjectNamePassedToLogAddedReferenceToProject;
+ public ReferenceAndProjectName ReferenceAndProjectNamePassedToLogRemovedReferenceFromProject;
+ public FileNameAndProjectName FileNameAndProjectNamePassedToLogAddedFileToProject;
+
+ public static Action<MessageHandler> GuiSyncDispatcher = handler => handler.Invoke ();
+
+ public TestableMonoDevelopProjectSystem (IDotNetProject project)
+ : this (
+ project,
+ new FakeFileService (project),
+ new FakePackageManagementProjectService (),
+ new FakeLogger ())
+ {
+ }
+
+ TestableMonoDevelopProjectSystem (
+ IDotNetProject project,
+ IPackageManagementFileService fileService,
+ IPackageManagementProjectService projectService,
+ FakeLogger logger)
+ : base (project, fileService, projectService, GuiSyncDispatcher)
+ {
+ FakeFileService = (FakeFileService)fileService;
+ FakeProjectService = (FakePackageManagementProjectService)projectService;
+ Logger = logger;
+ }
+
+ protected override void PhysicalFileSystemAddFile (string path, Stream stream)
+ {
+ PathPassedToPhysicalFileSystemAddFile = path;
+ StreamPassedToPhysicalFileSystemAddFile = stream;
+ }
+
+ protected override void PhysicalFileSystemAddFile (string path, Action<Stream> writeToStream)
+ {
+ PathPassedToPhysicalFileSystemAddFile = path;
+ ActionPassedToPhysicalFileSystemAddFile = writeToStream;
+ }
+
+ protected override void LogDeletedFile (string fileName)
+ {
+ FileNamePassedToLogDeletedFile = fileName;
+ }
+
+ protected override void LogDeletedFileFromDirectory (string fileName, string directory)
+ {
+ FileNameAndDirectoryPassedToLogDeletedFileFromDirectory = new FileNameAndDirectory (fileName, directory);
+ }
+
+ protected override void LogDeletedDirectory (string directory)
+ {
+ DirectoryPassedToLogDeletedDirectory = directory;
+ }
+
+ protected override void LogAddedReferenceToProject (string referenceName, string projectName)
+ {
+ ReferenceAndProjectNamePassedToLogAddedReferenceToProject =
+ new ReferenceAndProjectName (referenceName, projectName);
+ }
+
+ protected override void LogRemovedReferenceFromProject (string referenceName, string projectName)
+ {
+ ReferenceAndProjectNamePassedToLogRemovedReferenceFromProject =
+ new ReferenceAndProjectName (referenceName, projectName);
+ }
+
+ protected override void LogAddedFileToProject (string fileName, string projectName)
+ {
+ FileNameAndProjectNamePassedToLogAddedFileToProject =
+ new FileNameAndProjectName (fileName, projectName);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageViewModel.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageViewModel.cs
new file mode 100644
index 0000000000..94d0a57325
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageViewModel.cs
@@ -0,0 +1,79 @@
+using System;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestablePackageViewModel : PackageViewModel
+ {
+ public FakePackageManagementSolution FakeSolution;
+ public PackageManagementEvents PackageManagementEvents;
+ public FakePackage FakePackage;
+ public FakeLogger FakeLogger;
+
+ public TestablePackageViewModel (
+ IPackageViewModelParent parent,
+ FakePackageManagementSolution solution)
+ : this (
+ parent,
+ new FakePackage ("Test"),
+ new PackageManagementSelectedProjects (solution),
+ new PackageManagementEvents (),
+ new FakeLogger ())
+ {
+ this.FakeSolution = solution;
+ }
+
+ public TestablePackageViewModel (
+ IPackageViewModelParent parent,
+ FakePackage package,
+ PackageManagementSelectedProjects selectedProjects,
+ PackageManagementEvents packageManagementEvents,
+ FakeLogger logger)
+ : base (
+ parent,
+ package,
+ selectedProjects,
+ packageManagementEvents,
+ null,
+ logger)
+ {
+ this.FakePackage = package;
+ this.PackageManagementEvents = packageManagementEvents;
+ this.FakeLogger = logger;
+ }
+
+ protected override PackageViewModelOperationLogger CreateLogger (ILogger logger)
+ {
+ PackageViewModelOperationLogger operationLogger = base.CreateLogger (logger);
+ operationLogger.AddingPackageMessageFormat = "Installing...{0}";
+ operationLogger.RemovingPackageMessageFormat = "Uninstalling...{0}";
+ operationLogger.ManagingPackageMessageFormat = "Managing...{0}";
+ OperationLoggerCreated = operationLogger;
+ return operationLogger;
+ }
+
+ public PackageViewModelOperationLogger OperationLoggerCreated;
+
+ public PackageOperation AddOneFakeInstallPackageOperationForViewModelPackage ()
+ {
+ var operation = new FakePackageOperation (FakePackage, PackageAction.Install);
+
+ FakeSolution
+ .FakeProjectToReturnFromGetProject
+ .FakeInstallOperations
+ .Add (operation);
+
+ return operation;
+ }
+
+ public PackageOperation AddOneFakeUninstallPackageOperation ()
+ {
+ var package = new FakePackage ("PackageToUninstall");
+ var operation = new FakePackageOperation (package, PackageAction.Uninstall);
+ FakeSolution.FakeProjectToReturnFromGetProject.FakeInstallOperations.Add (operation);
+ return operation;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProjectManager.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProjectManager.cs
new file mode 100644
index 0000000000..61522f49ee
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableProjectManager.cs
@@ -0,0 +1,105 @@
+//
+// TestableProjectManager.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public class TestableProjectManager : SharpDevelopProjectManager
+ {
+ public IPackage PackagePassedToAddPackageReference;
+ public bool IgnoreDependenciesPassedToAddPackageReference;
+ public bool AllowPrereleaseVersionsPassedToAddPackageReference;
+
+ public IPackage PackagePassedToRemovePackageReference;
+ public bool ForcePassedToRemovePackageReference;
+ public bool RemoveDependenciesPassedToRemovePackageReference;
+
+ public IPackage PackagePassedToUpdatePackageReference;
+ public bool UpdateDependenciesPassedToUpdatePackageReference;
+ public bool AllowPrereleaseVersionsPassedToUpdatePackageReference;
+ public List<IPackage> PackagesPassedToUpdatePackageReference = new List<IPackage> ();
+
+ public FakePackageRepository FakeLocalRepository {
+ get { return LocalRepository as FakePackageRepository; }
+ }
+
+ public TestableProjectManager ()
+ : base (
+ new FakePackageRepository (),
+ new FakePackagePathResolver (),
+ new FakeProjectSystem (),
+ new FakePackageRepository ())
+ {
+ }
+
+ public override void AddPackageReference (string packageId, SemanticVersion version, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ var package = new FakePackage ();
+ package.Id = packageId;
+ package.Version = version;
+ PackagePassedToAddPackageReference = package;
+ IgnoreDependenciesPassedToAddPackageReference = ignoreDependencies;
+ AllowPrereleaseVersionsPassedToAddPackageReference = allowPrereleaseVersions;
+ }
+
+ public override void AddPackageReference (IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ PackagePassedToAddPackageReference = package;
+ IgnoreDependenciesPassedToAddPackageReference = ignoreDependencies;
+ AllowPrereleaseVersionsPassedToAddPackageReference = allowPrereleaseVersions;
+ }
+
+ public override void RemovePackageReference (IPackage package, bool force, bool removeDependencies)
+ {
+ PackagePassedToRemovePackageReference = package;
+ ForcePassedToRemovePackageReference = force;
+ RemoveDependenciesPassedToRemovePackageReference = removeDependencies;
+ }
+
+ public override void UpdatePackageReference (string packageId, SemanticVersion version, bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ var package = new FakePackage ();
+ package.Id = packageId;
+ package.Version = version;
+
+ PackagePassedToUpdatePackageReference = package;
+ UpdateDependenciesPassedToUpdatePackageReference = updateDependencies;
+ AllowPrereleaseVersionsPassedToUpdatePackageReference = allowPrereleaseVersions;
+
+ PackagesPassedToUpdatePackageReference.Add (package);
+ }
+
+ public FakePackage AddFakePackageToProjectLocalRepository (string packageId, string version)
+ {
+ return FakeLocalRepository.AddFakePackageWithVersion (packageId, version);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj
index ff7a0e5089..87460fe226 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj
@@ -49,6 +49,7 @@
<HintPath>..\..\..\..\external\nuget-binary\NuGet.Core.dll</HintPath>
<Private>False</Private>
</Reference>
+ <Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
@@ -116,6 +117,49 @@
<Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\UpdatePackageHelper.cs" />
<Compile Include="MonoDevelop.PackageManagement.Tests\UpdateAllPackagesInProjectTests.cs" />
<Compile Include="MonoDevelop.PackageManagement.Tests\UpdateAllPackagesInSolutionTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\UserAgentGeneratorForRepositoryRequestsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageRepositoryWithHttpClientEvents.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\NuGetPackageRestoreCommandLineTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\ReducedPackageOperationsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestPackageHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageOperationResolver.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\SolutionPackageRepositoryPathTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeSolution.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\SolutionPackageRepositoryTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementProjectTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManagerFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManager.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManagementProjectService.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProjectManager.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProjectSystem.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeDotNetProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\PackageReferenceRepositoryHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableProjectManager.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageOperationResolverFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MonoDevelopPackageManagerTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeSolutionPackageRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeWebRequest.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageRepositoryFactoryEvents.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MonoDevelopProjectSystemTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableMonoDevelopProjectSystem.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeFileService.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FileNameAndDirectory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FileNameAndProjectName.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\ReferenceAndProjectName.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\ProjectHelper.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\OpenDotNetProjectTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeProjectSystemFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MonoDevelopPackageManagerFactoryTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\MonoDevelopProjectManagerTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementSelectedProjectsTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\SelectedProjectCollectionAssert.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageViewModelTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestablePackageViewModel.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeOperationAwareRepository.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementSolutionTests.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeSolutionPackageRepositoryFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageManagementProjectFactory.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\core\MonoDevelop.Core\MonoDevelop.Core.csproj">
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerFactoryTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerFactoryTests.cs
new file mode 100644
index 0000000000..910341b2f8
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerFactoryTests.cs
@@ -0,0 +1,141 @@
+//
+// SharpDevelopPackageManagerFactoryTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MonoDevelopPackageManagerFactoryTests
+ {
+ SharpDevelopPackageManagerFactory factory;
+ IPackageManager packageManager;
+ FakePackageRepository fakePackageRepository;
+ FakeDotNetProject testProject;
+ PackageManagementOptions options;
+ FakePackageRepositoryFactory fakePackageRepositoryFactory;
+ FakeProjectSystemFactory fakeProjectSystemFactory;
+
+ void CreateFactory ()
+ {
+ options = new TestablePackageManagementOptions ();
+ fakePackageRepositoryFactory = new FakePackageRepositoryFactory ();
+ fakeProjectSystemFactory = new FakeProjectSystemFactory ();
+ factory = new SharpDevelopPackageManagerFactory (fakePackageRepositoryFactory, fakeProjectSystemFactory, options);
+ }
+
+ void CreateTestProject ()
+ {
+ testProject = ProjectHelper.CreateTestProject ();
+ var solution = new FakeSolution {
+ BaseDirectory = @"c:\projects\MyProject\"
+ };
+ testProject.ParentSolution = solution;
+ }
+
+ void CreatePackageManager ()
+ {
+ fakePackageRepository = new FakePackageRepository ();
+ packageManager = factory.CreatePackageManager (fakePackageRepository, testProject);
+ }
+
+ [Test]
+ public void CreatePackageManager_ProjectAndSolutionHaveDifferentFolders_PackageManagerLocalRepositoryIsSharedRepository ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ CreatePackageManager ();
+ ISharedPackageRepository sharedRepository = packageManager.LocalRepository as ISharedPackageRepository;
+
+ Assert.IsNotNull (sharedRepository);
+ }
+
+ [Test]
+ public void CreatePackageManager_PackagesSolutionFolderDefinedInOptions_SharedLocalRepositoryFileSystemRootIsSolutionFolder ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ options.PackagesDirectory = "MyPackages";
+ CreatePackageManager ();
+
+ string expectedRoot = @"c:\projects\MyProject\MyPackages";
+ string actualRoot = fakePackageRepositoryFactory.FileSystemPassedToCreateSharedRepository.Root;
+ Assert.AreEqual (expectedRoot, actualRoot);
+ }
+
+ [Test]
+ public void CreatePackageManager_PackagesSolutionFolderDefinedInOptions_SharedLocalRepositoryPackagePathResolverCreatedWithPackagesFolderInsideSolutionFolder ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ options.PackagesDirectory = "MyPackages";
+ CreatePackageManager ();
+
+ FakePackage package = new FakePackage ("Test.Package");
+ package.Version = new SemanticVersion (1, 0, 0, 0);
+ string expectedDirectory = @"c:\projects\MyProject\MyPackages\Test.Package.1.0.0.0";
+ string actualDirectory =
+ fakePackageRepositoryFactory
+ .PathResolverPassedToCreateSharedRepository
+ .GetInstallPath (package);
+
+ Assert.AreEqual (expectedDirectory, actualDirectory);
+ }
+
+ [Test]
+ public void CreatePackageManager_PackagesSolutionFolderDefinedInOptions_LocalRepositoryFileSystemIsPackageManagerFileSystem ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ CreatePackageManager ();
+
+ Assert.AreEqual (packageManager.FileSystem, fakePackageRepositoryFactory.FileSystemPassedToCreateSharedRepository);
+ }
+
+ [Test]
+ public void CreatePackageManager_PackagesSolutionFolderDefinedInOptions_PackageManagerPathResolverUsesPackagesFolderInsideSolutionFolder ()
+ {
+ CreateFactory ();
+ CreateTestProject ();
+ options.PackagesDirectory = "packages";
+ CreatePackageManager ();
+
+ var package = new FakePackage ("TestPackage", "1.0.0.0");
+
+ string expectedDirectory = @"c:\projects\MyProject\packages\TestPackage.1.0.0.0";
+
+ SharpDevelopPackageManager sharpDevelopPackageManager = packageManager as SharpDevelopPackageManager;
+ string actualDirectory = sharpDevelopPackageManager.PathResolver.GetInstallPath (package);
+
+ Assert.AreEqual (expectedDirectory, actualDirectory);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerTests.cs
new file mode 100644
index 0000000000..7e084154ad
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopPackageManagerTests.cs
@@ -0,0 +1,1139 @@
+//
+// SharpDevelopPackageManagerTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Linq;
+using System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MonoDevelopPackageManagerTests
+ {
+ SharpDevelopPackageManager packageManager;
+ FakePackageRepository fakeFeedSourceRepository;
+ FakeSharedPackageRepository fakeSolutionSharedRepository;
+ FakeProject project;
+ PackageManagementOptions options;
+ SolutionPackageRepositoryPath repositoryPaths;
+ PackageReferenceRepositoryHelper packageRefRepositoryHelper;
+ TestableProjectManager testableProjectManager;
+ FakeFileSystem fakeFileSystem;
+ FakePackageOperationResolverFactory fakePackageOperationResolverFactory;
+ FakePackageOperationResolver fakePackageOperationResolver;
+
+ void CreatePackageManager (IProject project, PackageReferenceRepositoryHelper packageRefRepositoryHelper)
+ {
+ options = new TestablePackageManagementOptions ();
+ options.PackagesDirectory = "packages";
+
+ repositoryPaths = new SolutionPackageRepositoryPath (project, options);
+ var pathResolver = new DefaultPackagePathResolver (repositoryPaths.PackageRepositoryPath);
+
+ fakeFileSystem = new FakeFileSystem ();
+
+ fakeFeedSourceRepository = new FakePackageRepository ();
+ fakeSolutionSharedRepository = packageRefRepositoryHelper.FakeSharedSourceRepository;
+
+ fakePackageOperationResolverFactory = new FakePackageOperationResolverFactory ();
+ fakePackageOperationResolver = fakePackageOperationResolverFactory.FakeInstallPackageOperationResolver;
+
+ var fakeSolutionPackageRepository = new FakeSolutionPackageRepository ();
+ fakeSolutionPackageRepository.FileSystem = fakeFileSystem;
+ fakeSolutionPackageRepository.PackagePathResolver = pathResolver;
+ fakeSolutionPackageRepository.FakeSharedRepository = fakeSolutionSharedRepository;
+
+ packageManager = new SharpDevelopPackageManager (fakeFeedSourceRepository,
+ packageRefRepositoryHelper.FakeProjectSystem,
+ fakeSolutionPackageRepository,
+ fakePackageOperationResolverFactory);
+ }
+
+ void CreatePackageManager ()
+ {
+ CreateTestProject ();
+ CreatePackageReferenceRepositoryHelper ();
+ CreatePackageManager (project, packageRefRepositoryHelper);
+ }
+
+ void CreatePackageReferenceRepositoryHelper ()
+ {
+ packageRefRepositoryHelper = new PackageReferenceRepositoryHelper ();
+ }
+
+ void CreateTestProject ()
+ {
+ var solution = new FakeSolution (@"c:\projects\Test\MyProject\MySolution.sln");
+ solution.BaseDirectory = @"c:\projects\Test\MyProject";
+ project = new FakeProject ();
+ project.ParentSolution = solution;
+ }
+
+ void CreateTestableProjectManager ()
+ {
+ testableProjectManager = new TestableProjectManager ();
+ packageManager.ProjectManager = testableProjectManager;
+ }
+
+ FakePackage CreateFakePackage (string id = "Test", string version = "1.0.0.0")
+ {
+ return new FakePackage (id, version);
+ }
+
+ FakePackage InstallPackage ()
+ {
+ FakePackage package = CreateFakePackage ();
+ packageManager.InstallPackage (package);
+ return package;
+ }
+
+ FakePackage InstallPackageWithNoPackageOperations ()
+ {
+ return InstallPackageWithNoPackageOperations (ignoreDependencies: false);
+ }
+
+ FakePackage InstallPackageWithNoPackageOperationsAndIgnoreDependencies ()
+ {
+ return InstallPackageWithNoPackageOperations (ignoreDependencies: true);
+ }
+
+ FakePackage InstallPackageWithNoPackageOperationsAndAllowPrereleaseVersions ()
+ {
+ return InstallPackageWithNoPackageOperations (ignoreDependencies: false, allowPrereleaseVersions: true);
+ }
+
+ FakePackage InstallPackageWithNoPackageOperations (bool ignoreDependencies)
+ {
+ return InstallPackageWithNoPackageOperations (ignoreDependencies, allowPrereleaseVersions: false);
+ }
+
+ FakePackage InstallPackageWithNoPackageOperations (bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ FakePackage package = CreateFakePackage ();
+ var operations = new List<PackageOperation> ();
+ var installAction = new FakeInstallPackageAction ();
+ installAction.IgnoreDependencies = ignoreDependencies;
+ installAction.AllowPrereleaseVersions = allowPrereleaseVersions;
+ installAction.Operations = operations;
+ packageManager.InstallPackage (package, installAction);
+ return package;
+ }
+
+ FakePackage InstallPackageWithPackageOperations (PackageOperation operation)
+ {
+ var operations = new PackageOperation[] {
+ operation
+ };
+ FakePackage package = CreateFakePackage ();
+ var installAction = new FakeInstallPackageAction ();
+ installAction.Operations = operations;
+ packageManager.InstallPackage (package, installAction);
+ return package;
+ }
+
+ FakePackage InstallPackageAndIgnoreDependencies ()
+ {
+ return InstallPackageWithParameters (true, false);
+ }
+
+ FakePackage InstallPackageWithParameters (bool ignoreDependencies, bool allowPrereleaseVersions)
+ {
+ FakePackage package = CreateFakePackage ();
+ packageManager.InstallPackage (package, ignoreDependencies, allowPrereleaseVersions);
+ return package;
+ }
+
+ FakePackage InstallPackageAndAllowPrereleaseVersions ()
+ {
+ return InstallPackageWithParameters (false, true);
+ }
+
+ FakePackage InstallPackageAndDoNotAllowPrereleaseVersions ()
+ {
+ return InstallPackageWithParameters (false, false);
+ }
+
+ FakePackage InstallPackageAndDoNotIgnoreDependencies ()
+ {
+ return InstallPackageWithParameters (false, false);
+ }
+
+ FakePackage UninstallPackage ()
+ {
+ FakePackage package = CreateFakePackage ();
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+
+ packageManager.UninstallPackage (package);
+ return package;
+ }
+
+ FakePackage UninstallPackageAndForceRemove ()
+ {
+ FakePackage package = CreateFakePackage ();
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+
+ bool removeDependencies = false;
+ bool forceRemove = true;
+ packageManager.UninstallPackage (package, forceRemove, removeDependencies);
+
+ return package;
+ }
+
+ FakePackage UninstallPackageAndRemoveDependencies ()
+ {
+ FakePackage package = CreateFakePackage ();
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+
+ bool removeDependencies = true;
+ bool forceRemove = false;
+ packageManager.UninstallPackage (package, forceRemove, removeDependencies);
+
+ return package;
+ }
+
+ PackageOperation CreateOneInstallPackageOperation (string id = "PackageToInstall", string version = "1.0")
+ {
+ FakePackage package = CreateFakePackage (id, version);
+ return new PackageOperation (package, PackageAction.Install);
+ }
+
+ IEnumerable<PackageOperation> GetInstallPackageOperations (FakePackage package)
+ {
+ return GetInstallPackageOperations (package, false, false);
+ }
+
+ IEnumerable<PackageOperation> GetInstallPackageOperationsAndIgnoreDependencies (FakePackage package)
+ {
+ return GetInstallPackageOperations (package, true, false);
+ }
+
+ IEnumerable<PackageOperation> GetInstallPackageOperationsAndAllowPrereleaseVersions (FakePackage package)
+ {
+ return GetInstallPackageOperations (package, false, true);
+ }
+
+ IEnumerable<PackageOperation> GetInstallPackageOperations (
+ FakePackage package,
+ bool ignoreDependencies,
+ bool allowPrereleaseVersions)
+ {
+ var fakeInstallAction = new FakeInstallPackageAction ();
+ fakeInstallAction.IgnoreDependencies = ignoreDependencies;
+ fakeInstallAction.AllowPrereleaseVersions = allowPrereleaseVersions;
+ return packageManager.GetInstallPackageOperations (package, fakeInstallAction);
+ }
+
+ FakePackage UpdatePackageWithNoPackageOperations ()
+ {
+ FakePackage package = CreateFakePackage ();
+ var updateAction = new FakeUpdatePackageAction ();
+ updateAction.Operations = new List<PackageOperation> ();
+ updateAction.UpdateDependencies = true;
+ packageManager.UpdatePackage (package, updateAction);
+ return package;
+ }
+
+ FakePackage UpdatePackageWithPackageOperations (PackageOperation operation)
+ {
+ var operations = new PackageOperation[] {
+ operation
+ };
+ FakePackage package = CreateFakePackage ();
+ var updateAction = new FakeUpdatePackageAction ();
+ updateAction.Operations = operations;
+ updateAction.UpdateDependencies = true;
+ packageManager.UpdatePackage (package, updateAction);
+ return package;
+ }
+
+ FakePackage UpdatePackageWithNoPackageOperationsAndDoNotUpdateDependencies ()
+ {
+ return UpdatePackageWithNoPackageOperations (false, false);
+ }
+
+ FakePackage UpdatePackageWithNoPackageOperationsAndAllowPrereleaseVersions ()
+ {
+ return UpdatePackageWithNoPackageOperations (false, true);
+ }
+
+ FakePackage UpdatePackageWithNoPackageOperations (bool updateDependencies, bool allowPrereleaseVersions)
+ {
+ FakePackage package = CreateFakePackage ();
+ var updateAction = new FakeUpdatePackageAction ();
+ updateAction.Operations = new List<PackageOperation> ();
+ updateAction.UpdateDependencies = updateDependencies;
+ updateAction.AllowPrereleaseVersions = allowPrereleaseVersions;
+ packageManager.UpdatePackage (package, updateAction);
+ return package;
+ }
+
+ UpdatePackagesAction CreateUpdatePackagesAction ()
+ {
+ return new UpdatePackagesAction (new FakePackageManagementProject (), null);
+ }
+
+ UpdatePackagesAction CreateUpdatePackagesActionWithPackages (params IPackageFromRepository[] packages)
+ {
+ UpdatePackagesAction action = CreateUpdatePackagesAction ();
+ action.AddPackages (packages);
+ return action;
+ }
+
+ UpdatePackagesAction CreateUpdatePackagesActionWithOperations (params PackageOperation[] operations)
+ {
+ UpdatePackagesAction action = CreateUpdatePackagesAction ();
+ action.AddOperations (operations);
+ return action;
+ }
+
+ PackageOperation AddInstallOperationForPackage (IPackage package)
+ {
+ var operation = new PackageOperation (package, PackageAction.Install);
+ AddInstallOperationsForPackage (package, operation);
+ return operation;
+ }
+
+ void AddInstallOperationsForPackage (IPackage package, params PackageOperation[] operations)
+ {
+ fakePackageOperationResolver.AddOperations (package, operations);
+ }
+
+ void CreateFakePackageResolverForUpdatePackageOperations ()
+ {
+ fakePackageOperationResolver = new FakePackageOperationResolver ();
+ fakePackageOperationResolverFactory.UpdatePackageOperationsResolver = fakePackageOperationResolver;
+ }
+
+ void RaisePackageRemovedEventWhenPackageReferenceUpdated (
+ FakeProjectManager projectManager,
+ FakePackage updatedPackage,
+ params PackageOperationEventArgs[] eventArgs)
+ {
+ projectManager.WhenUpdatePackageReferenceCalled (
+ updatedPackage.Id,
+ updatedPackage.Version,
+ () => eventArgs.ToList ().ForEach (eventArg => projectManager.FirePackageReferenceRemoved (eventArg)));
+ }
+
+ void RaisePackageRemovedEventWhenPackageReferenceAdded (
+ FakeProjectManager projectManager,
+ FakePackage newPackage,
+ params PackageOperationEventArgs[] eventArgs)
+ {
+ projectManager.WhenAddPackageReferenceCalled (
+ newPackage.Id,
+ newPackage.Version,
+ () => eventArgs.ToList ().ForEach (eventArg => projectManager.FirePackageReferenceRemoved (eventArg)));
+ }
+
+ [Test]
+ public void ProjectManager_InstanceCreated_SourceRepositoryIsSharedRepositoryPassedToPackageManager ()
+ {
+ CreatePackageManager ();
+ Assert.AreEqual (fakeSolutionSharedRepository, packageManager.ProjectManager.SourceRepository);
+ }
+
+ [Test]
+ public void ProjectManager_InstanceCreated_LocalRepositoryIsPackageReferenceRepository ()
+ {
+ CreatePackageManager ();
+ PackageReferenceRepository packageRefRepository = packageManager.ProjectManager.LocalRepository as PackageReferenceRepository;
+ Assert.IsNotNull (packageRefRepository);
+ }
+
+ [Test]
+ public void ProjectManager_InstanceCreated_LocalRepositoryIsRegisteredWithSharedRepository ()
+ {
+ CreateTestProject ();
+ CreatePackageReferenceRepositoryHelper ();
+
+ string expectedPath = @"c:\projects\Test\MyProject";
+ packageRefRepositoryHelper.FakeProjectSystem.PathToReturnFromGetFullPath = expectedPath;
+
+ CreatePackageManager (project, packageRefRepositoryHelper);
+
+ string actualPath = fakeSolutionSharedRepository.PathPassedToRegisterRepository;
+
+ Assert.AreEqual (expectedPath, actualPath);
+ }
+
+ [Test]
+ public void ProjectManager_InstanceCreated_PathResolverIsPackageManagerPathResolver ()
+ {
+ CreatePackageManager ();
+
+ Assert.AreEqual (packageManager.PathResolver, packageManager.ProjectManager.PathResolver);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstancePassed_AddsReferenceToProject ()
+ {
+ CreatePackageManager ();
+ FakePackage package = InstallPackage ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstancePassed_DependenciesNotIgnoredWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackage ();
+
+ Assert.IsFalse (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstancePassed_PrereleaseVersionsNotAllowedWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackage ();
+
+ Assert.IsFalse (testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassed_AddsReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = InstallPackageWithNoPackageOperations ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassed_DoNotIgnoreDependenciesWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageWithNoPackageOperations ();
+
+ Assert.IsFalse (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassed_DoNotAllowPrereleaseVersionsWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageWithNoPackageOperations ();
+
+ Assert.IsFalse (testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassedAndIgnoreDependenciesIsTrue_IgnoreDependenciesWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageWithNoPackageOperationsAndIgnoreDependencies ();
+
+ Assert.IsTrue (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndPackageOperationsPassedAndAllowPrereleaseVersionsIsTrue_PrereleaseVersionsallowedWhenAddingReferenceToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageWithNoPackageOperationsAndAllowPrereleaseVersions ();
+
+ Assert.IsTrue (testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageInstanceAndOneInstallPackageOperationPassed_PackageDefinedInOperationIsInstalledInLocalRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ PackageOperation operation = CreateOneInstallPackageOperation ();
+ InstallPackageWithPackageOperations (operation);
+
+ Assert.AreEqual (operation.Package, fakeSolutionSharedRepository.FirstPackageAdded);
+ }
+
+ [Test]
+ public void InstallPackage_PackageDependenciesIgnored_IgnoreDependenciesPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageAndIgnoreDependencies ();
+
+ Assert.IsTrue (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_AllowPrereleaseVersions_AllowPrereleaseVersionsPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageAndAllowPrereleaseVersions ();
+
+ Assert.IsTrue (testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageDependenciesIgnored_AddsReferenceToPackage ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = InstallPackageAndIgnoreDependencies ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageDependenciesNotIgnored_IgnoreDependenciesPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ InstallPackageAndDoNotIgnoreDependencies ();
+
+ Assert.IsFalse (testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
+ }
+
+ [Test]
+ public void InstallPackage_PackageDependenciesNotIgnored_AddsReferenceToPackage ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = InstallPackageAndDoNotIgnoreDependencies ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToAddPackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageInProjectLocalRepository_RemovesReferenceFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = UninstallPackage ();
+
+ Assert.AreEqual (package.Id, testableProjectManager.PackagePassedToRemovePackageReference.Id);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageInProjectLocalRepository_DoesNotRemoveReferenceForcefullyFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UninstallPackage ();
+
+ Assert.IsFalse (testableProjectManager.ForcePassedToRemovePackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageInProjectLocalRepository_DependenciesNotRemovedWhenPackageReferenceRemovedFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UninstallPackage ();
+
+ Assert.IsFalse (testableProjectManager.RemoveDependenciesPassedToRemovePackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_PassingForceRemove_ReferenceForcefullyRemovedFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ UninstallPackageAndForceRemove ();
+
+ Assert.IsTrue (testableProjectManager.ForcePassedToRemovePackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_PassingRemoveDependencies_DependenciesRemovedWhenPackageReferenceRemovedFromProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ UninstallPackageAndRemoveDependencies ();
+
+ Assert.IsTrue (testableProjectManager.RemoveDependenciesPassedToRemovePackageReference);
+ }
+
+ [Test]
+ public void UninstallPackage_ProjectLocalRepositoryHasPackage_PackageRemovedFromProjectRepositoryBeforeSolutionRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ FakePackage package = CreateFakePackage ();
+ package.Id = "Test";
+
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+
+ IPackage packageRemovedFromProject = null;
+ packageManager.PackageUninstalled += (sender, e) => {
+ packageRemovedFromProject = testableProjectManager.PackagePassedToRemovePackageReference;
+ };
+ packageManager.UninstallPackage (package);
+
+ Assert.AreEqual ("Test", packageRemovedFromProject.Id);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageReferencedByNoProjects_PackageIsRemovedFromSharedSolutionRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ FakePackage package = CreateFakePackage ();
+ package.Id = "MyPackageId";
+
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+ fakeSolutionSharedRepository.FakePackages.Add (package);
+
+ packageManager.UninstallPackage (package);
+
+ bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains (package);
+
+ Assert.IsFalse (containsPackage);
+ }
+
+ [Test]
+ public void UninstallPackage_PackageReferencedByTwoProjects_PackageIsNotRemovedFromSharedSolutionRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ var package = new FakePackage ("MyPackageId", "1.4.5.2");
+
+ testableProjectManager.FakeLocalRepository.FakePackages.Add (package);
+ fakeSolutionSharedRepository.FakePackages.Add (package);
+ fakeSolutionSharedRepository.PackageIdsReferences.Add ("MyPackageId");
+
+ packageManager.UninstallPackage (package);
+
+ bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains (package);
+
+ Assert.IsTrue (containsPackage);
+ Assert.AreEqual ("MyPackageId", fakeSolutionSharedRepository.PackageIdPassedToIsReferenced);
+ Assert.AreEqual (package.Version, fakeSolutionSharedRepository.VersionPassedToIsReferenced);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageOperationsReturnedFromPackageOperationsResolverCreated ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ var expectedOperations = new PackageOperation [] {
+ new PackageOperation (package, PackageAction.Install)
+ };
+ fakePackageOperationResolver.AddOperations (package, expectedOperations);
+
+ IEnumerable<PackageOperation> operations = GetInstallPackageOperations (package);
+
+ Assert.AreEqual (expectedOperations, operations);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLocalRepositoryWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ IPackageRepository expectedRepository = packageManager.LocalRepository;
+ IPackageRepository actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateInstallPackageOperationsResolver;
+
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesSourceRepositoryWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ IPackageRepository expectedRepository = packageManager.SourceRepository;
+ IPackageRepository actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateInstallPackageOperationsResolver;
+
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_DependenciesNotIgnored ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ bool result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLoggerWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ ILogger expectedLogger = packageManager.Logger;
+ ILogger actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateInstallPackageOperationResolver;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageUsedWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ IPackage actualPackage = fakePackageOperationResolverFactory
+ .FakeInstallPackageOperationResolver
+ .PackagePassedToResolveOperations;
+
+ Assert.AreEqual (package, actualPackage);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_IgnoreDependenciesIsTrue_PackageOperationResolverIgnoresDependencies ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperationsAndIgnoreDependencies (package);
+
+ bool result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_AllowPrereleaseVersionsIsTrue_PackageOperationResolverAllowsPrereleaseVersions ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ();
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperationsAndAllowPrereleaseVersions (package);
+
+ bool result = fakePackageOperationResolverFactory.AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_AllowPrereleaseVersionsIsFalse_PackageOperationResolverDoesNotAllowPrereleaseVersions ()
+ {
+ CreatePackageManager ();
+ var package = new FakePackage ("Test", "1.0");
+ AddInstallOperationForPackage (package);
+ GetInstallPackageOperations (package);
+
+ bool result = fakePackageOperationResolverFactory.AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver;
+
+ Assert.IsFalse (result);
+ }
+
+ public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesReferenceInProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = UpdatePackageWithNoPackageOperations ();
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesDependenciesInProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = UpdatePackageWithNoPackageOperations ();
+
+ Assert.IsTrue (testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageInstanceAndAllowPrereleaseVersionsIsTrue_PrereleaseVersionsAllowedToUpdateProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = UpdatePackageWithNoPackageOperationsAndAllowPrereleaseVersions ();
+
+ Assert.IsTrue (testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageInstanceAndAllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedToUpdateProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = UpdatePackageWithNoPackageOperations ();
+
+ Assert.IsFalse (testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageInstanceAndOneInstallPackageOperationPassed_PackageDefinedInOperationIsInstalledInLocalRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+
+ PackageOperation operation = CreateOneInstallPackageOperation ();
+ UpdatePackageWithPackageOperations (operation);
+
+ Assert.AreEqual (operation.Package, fakeSolutionSharedRepository.FirstPackageAdded);
+ }
+
+ [Test]
+ public void UpdatePackage_UpdateDependenciesSetToFalse_DependenciesInProjectNotUpdated ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ UpdatePackageWithNoPackageOperationsAndDoNotUpdateDependencies ();
+
+ Assert.IsFalse (testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_OnePackage_PackageReferencedIsAddedToProject ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+
+ packageManager.UpdatePackages (action);
+
+ Assert.AreEqual (package, testableProjectManager.PackagePassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_TwoPackages_PackageReferencedIsAddedToProjectForBothPackages ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package1 = CreateFakePackage ("First", "1.1");
+ FakePackage package2 = CreateFakePackage ("Second", "2.0");
+ var expectedPackages = new FakePackage[] { package1, package2 };
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (expectedPackages);
+
+ packageManager.UpdatePackages (action);
+
+ PackageCollectionAssert.AreEqual (expectedPackages, testableProjectManager.PackagesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_UpdateDependenciesIsTrue_UpdateDependenciesPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+ action.UpdateDependencies = true;
+
+ packageManager.UpdatePackages (action);
+
+ Assert.IsTrue (testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_UpdateDependenciesIsFalse_UpdateDependenciesPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+ action.UpdateDependencies = false;
+
+ packageManager.UpdatePackages (action);
+
+ Assert.IsFalse (testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_AllowPrereleaseVersionsIsTrue_AllowPrereleaseVersionsPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+ action.AllowPrereleaseVersions = true;
+
+ packageManager.UpdatePackages (action);
+
+ Assert.IsTrue (testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_AllowPrereleaseVersionsIsFalse_AllowPrereleaseVersionsPassedToProjectManager ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages (package);
+ action.AllowPrereleaseVersions = false;
+
+ packageManager.UpdatePackages (action);
+
+ Assert.IsFalse (testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
+ }
+
+ [Test]
+ public void UpdatePackages_TwoPackageOperations_BothPackagesInOperationsAddedToSharedRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ PackageOperation operation1 = CreateOneInstallPackageOperation ("First", "1.0");
+ PackageOperation operation2 = CreateOneInstallPackageOperation ("Second", "1.0");
+ UpdatePackagesAction action = CreateUpdatePackagesActionWithOperations (operation1, operation2);
+ var expectedPackages = new FakePackage[] {
+ operation1.Package as FakePackage,
+ operation2.Package as FakePackage
+ };
+
+ packageManager.UpdatePackages (action);
+
+ PackageCollectionAssert.AreEqual (expectedPackages, fakeSolutionSharedRepository.PackagesAdded);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLoggerWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package);
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ AddInstallOperationForPackage (package);
+
+ packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction);
+
+ ILogger expectedLogger = packageManager.Logger;
+ ILogger actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateUpdatePackageOperationResolver;
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLocalRepositoryWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package);
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ AddInstallOperationForPackage (package);
+
+ packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction);
+
+ IPackageRepository expectedRepository = packageManager.LocalRepository;
+ IPackageRepository actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateUpdatePackageOperationsResolver;
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesSourceRepositoryWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package);
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ AddInstallOperationForPackage (package);
+
+ packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction);
+
+ IPackageRepository expectedRepository = packageManager.SourceRepository;
+ IPackageRepository actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateUpdatePackageOperationsResolver;
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesUpdatePackageSettingsWhenGettingPackageOperations ()
+ {
+ CreatePackageManager ();
+ FakePackage package = CreateFakePackage ("Test", "1.1");
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package);
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ AddInstallOperationForPackage (package);
+
+ packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction);
+
+ IUpdatePackageSettings settings = fakePackageOperationResolverFactory.SettingsPassedToCreatePackageOperationResolver;
+ Assert.AreEqual (updateAction, settings);
+ }
+
+ [Test]
+ public void GetUpdatePackageOperations_TwoPackages_ReturnsPackageOperationsForBothPackages ()
+ {
+ CreatePackageManager ();
+ CreateFakePackageResolverForUpdatePackageOperations ();
+ IPackageFromRepository package1 = CreateFakePackage ("Test", "1.0");
+ IPackageFromRepository package2 = CreateFakePackage ("Test2", "1.0");
+ PackageOperation operation1 = AddInstallOperationForPackage (package1);
+ PackageOperation operation2 = AddInstallOperationForPackage (package2);
+ UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages (package1, package2);
+
+ List<PackageOperation> operations = packageManager.GetUpdatePackageOperations (updateAction.Packages, updateAction).ToList ();
+
+ Assert.AreEqual (2, operations.Count ());
+ Assert.IsTrue (operations.Contains (operation1));
+ Assert.IsTrue (operations.Contains (operation2));
+ }
+
+ [Test]
+ public void RunPackageOperations_TwoPackageOperations_BothPackagesInOperationsAddedToSharedRepository ()
+ {
+ CreatePackageManager ();
+ CreateTestableProjectManager ();
+ PackageOperation operation1 = CreateOneInstallPackageOperation ("First", "1.0");
+ PackageOperation operation2 = CreateOneInstallPackageOperation ("Second", "1.0");
+ var operations = new PackageOperation[] { operation1, operation2 };
+ var expectedPackages = new FakePackage[] {
+ operation1.Package as FakePackage,
+ operation2.Package as FakePackage
+ };
+
+ packageManager.RunPackageOperations (operations);
+
+ PackageCollectionAssert.AreEqual (expectedPackages, fakeSolutionSharedRepository.PackagesAdded);
+ }
+
+ [Test]
+ public void UpdatePackage_OldPackageReferenceIsRemovedOnUpdating_OldPackageIsUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage", "1.0");
+ FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ var eventArgs = new PackageOperationEventArgs (installedPackage, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceUpdated (fakeProjectManager, updatedPackage, eventArgs);
+ var updateAction = new FakeUpdatePackageAction {
+ Operations = new List<PackageOperation> (),
+ UpdateDependencies = false
+ };
+
+ packageManager.UpdatePackage (updatedPackage, updateAction);
+
+ Assert.IsFalse (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage));
+ }
+
+ [Test]
+ public void UpdatePackage_TwoOldPackageReferencesAreRemovedOnUpdating_BothOldPackagesAreUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage1 = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage-Core", "1.0");
+ FakePackage installedPackage2 = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage", "1.0");
+ FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ var eventArgs1 = new PackageOperationEventArgs (installedPackage1, null, null);
+ var eventArgs2 = new PackageOperationEventArgs (installedPackage2, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceUpdated (fakeProjectManager, updatedPackage, eventArgs1, eventArgs2);
+ var updateAction = new FakeUpdatePackageAction {
+ Operations = new List<PackageOperation> (),
+ UpdateDependencies = false
+ };
+
+ packageManager.UpdatePackage (updatedPackage, updateAction);
+
+ Assert.IsFalse (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage2));
+ Assert.IsFalse (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage1));
+ }
+
+ [Test]
+ public void UpdatePackage_OldPackageReferenceIsRemovedOnUpdatingButAnotherProjectStillReferencesThePackage_OldPackageIsNotUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage-Core", "1.0");
+ FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ var eventArgs = new PackageOperationEventArgs (installedPackage, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceUpdated (fakeProjectManager, updatedPackage, eventArgs);
+ var updateAction = new FakeUpdatePackageAction {
+ Operations = new List<PackageOperation> (),
+ UpdateDependencies = false
+ };
+ fakeSolutionSharedRepository.PackageIdsReferences.Add ("MyPackage-Core");
+
+ packageManager.UpdatePackage (updatedPackage, updateAction);
+
+ Assert.IsTrue (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage));
+ }
+
+ [Test]
+ public void InstallPackage_OldPackageReferenceIsRemovedOnInstalling_OldPackageIsUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage", "1.0");
+ FakePackage newPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ var eventArgs = new PackageOperationEventArgs (installedPackage, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceAdded (fakeProjectManager, newPackage, eventArgs);
+ var installAction = new FakeInstallPackageAction {
+ Operations = new List<PackageOperation> ()
+ };
+
+ packageManager.InstallPackage (newPackage, installAction);
+
+ Assert.IsFalse (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage));
+ }
+
+ [Test]
+ public void InstallPackage_OldPackageReferenceIsRemovedOnInstallingButOtherProjectsReferencesOldPackage_OldPackageIsNotUninstalled ()
+ {
+ CreatePackageManager ();
+ var fakeProjectManager = new FakeProjectManager ();
+ packageManager.ProjectManager = fakeProjectManager;
+ FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion ("MyPackage.Core", "1.0");
+ FakePackage newPackage = fakeFeedSourceRepository.AddFakePackageWithVersion ("MyPackage", "1.1");
+ fakeSolutionSharedRepository.PackageIdsReferences.Add ("MyPackage.Core");
+ var eventArgs = new PackageOperationEventArgs (installedPackage, null, null);
+ RaisePackageRemovedEventWhenPackageReferenceAdded (fakeProjectManager, newPackage, eventArgs);
+ var installAction = new FakeInstallPackageAction {
+ Operations = new List<PackageOperation> ()
+ };
+
+ packageManager.InstallPackage (newPackage, installAction);
+
+ Assert.IsTrue (fakeSolutionSharedRepository.FakePackages.Contains (installedPackage));
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectManagerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectManagerTests.cs
new file mode 100644
index 0000000000..88d01e1555
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectManagerTests.cs
@@ -0,0 +1,110 @@
+//
+// MonoDevelopProjectManagerTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MonoDevelopProjectManagerTests
+ {
+ TestableProjectManager projectManager;
+
+ void CreateProjectManager ()
+ {
+ projectManager = new TestableProjectManager ();
+ }
+
+ void AddFakePackageToProjectLocalRepository (string packageId, string version)
+ {
+ projectManager.AddFakePackageToProjectLocalRepository (packageId, version);
+ }
+
+ FakePackage CreatePackage (string packageId, string version)
+ {
+ return FakePackage.CreatePackageWithVersion (packageId, version);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedThatDoesNotExistInProjectLocalRepository_ReturnsFalse ()
+ {
+ CreateProjectManager ();
+
+ bool installed = projectManager.IsInstalled ("Test");
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedExistsInProjectLocalRepository_ReturnsTrue ()
+ {
+ CreateProjectManager ();
+ projectManager.AddFakePackageToProjectLocalRepository ("Test", "1.0.2");
+
+ bool installed = projectManager.IsInstalled ("Test");
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_ProjectLocalRepositoryDoesNotHavePackage_ReturnsFalse ()
+ {
+ CreateProjectManager ();
+ FakePackage package = CreatePackage ("Test", "1.0");
+
+ bool installed = projectManager.HasOlderPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_ProjectLocalRepositoryHasOlderPackage_ReturnsTrue ()
+ {
+ CreateProjectManager ();
+ projectManager.AddFakePackageToProjectLocalRepository ("Test", "1.0");
+ FakePackage package = CreatePackage ("Test", "1.1");
+
+ bool installed = projectManager.HasOlderPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_ProjectLocalRepositoryHasSamePackageVersion_ReturnsFalse ()
+ {
+ CreateProjectManager ();
+ projectManager.AddFakePackageToProjectLocalRepository ("Test", "1.1");
+ FakePackage package = CreatePackage ("Test", "1.1");
+
+ bool installed = projectManager.HasOlderPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs
new file mode 100644
index 0000000000..3196941dfe
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs
@@ -0,0 +1,1095 @@
+//
+// SharpDevelopProjectSystemTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.IO;
+using System.Linq;
+using System.Runtime.Versioning;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using MonoDevelop.Projects;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MonoDevelopProjectSystemTests
+ {
+ TestableMonoDevelopProjectSystem projectSystem;
+ FakeDotNetProject project;
+
+ void CreateProjectSystem (IDotNetProject project)
+ {
+ projectSystem = new TestableMonoDevelopProjectSystem (project);
+ }
+
+ void CreateTestProject ()
+ {
+ project = new FakeDotNetProject ();
+ }
+
+ void CreateTestWebApplicationProject ()
+ {
+ project = ProjectHelper.CreateTestWebApplicationProject ();
+ }
+
+ void CreateTestWebSiteProject ()
+ {
+ project = ProjectHelper.CreateTestWebSiteProject ();
+ }
+
+ void CreateTestProject (string fileName)
+ {
+ project = new FakeDotNetProject (fileName);
+ }
+
+ void AddFileToProject (string fileName)
+ {
+ ProjectHelper.AddFile (project, fileName);
+ }
+
+ void AddDefaultCustomToolForFileName (string fileName, string customTool)
+ {
+ projectSystem.FakeProjectService.AddDefaultCustomToolForFileName (fileName, customTool);
+ }
+
+ void AddFile (string fileName)
+ {
+ projectSystem.AddFile (fileName, (Stream)null);
+ }
+
+ void AssertLastMSBuildChildElementHasProjectAttributeValue (string expectedAttributeValue)
+ {
+ throw new NotImplementedException ();
+// ProjectImportElement import = project.GetLastMSBuildChildElement ();
+// Assert.AreEqual (expectedAttributeValue, import.Project);
+ }
+
+ void AssertLastMSBuildChildHasCondition (string expectedCondition)
+ {
+ throw new NotImplementedException ();
+// ProjectImportElement import = project.GetLastMSBuildChildElement ();
+// Assert.AreEqual (expectedCondition, import.Condition);
+ }
+
+ void AssertFirstMSBuildChildElementHasProjectAttributeValue (string expectedAttributeValue)
+ {
+ throw new NotImplementedException ();
+// ProjectImportElement import = project.GetFirstMSBuildChildElement ();
+// Assert.AreEqual (expectedAttributeValue, import.Project);
+ }
+
+ void AssertFirstMSBuildChildHasCondition (string expectedCondition)
+ {
+ throw new NotImplementedException ();
+// ProjectImportElement import = project.GetFirstMSBuildChildElement ();
+// Assert.AreEqual (expectedCondition, import.Condition);
+ }
+
+ [Test]
+ public void Root_NewInstanceCreated_ReturnsProjectDirectory ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+
+ string expectedRoot = @"d:\projects\MyProject\";
+ Assert.AreEqual (expectedRoot, projectSystem.Root);
+ }
+
+ [Test]
+ public void ProjectName_NewInstanceCreated_ReturnsProjectName ()
+ {
+ CreateTestProject ();
+ project.Name = "MyProjectName";
+ CreateProjectSystem (project);
+
+ Assert.AreEqual ("MyProjectName", projectSystem.ProjectName);
+ }
+
+ [Test]
+ [Ignore ("Arbitrary properties are not implemented")]
+ public void GetPropertyValue_PassedDefinedPropertyName_ReturnsExpectedPropertyValue ()
+ {
+ CreateTestProject ();
+ string expectedPropertyValue = "Test";
+ string propertyName = "TestProperty";
+ //project.SetEvaluatedProperty (propertyName, expectedPropertyValue);
+ CreateProjectSystem (project);
+
+ string propertyValue = projectSystem.GetPropertyValue (propertyName);
+
+ Assert.AreEqual (expectedPropertyValue, propertyValue);
+ }
+
+ [Test]
+ public void GetPropertyValue_PassedRootNamespacePropertyName_ReturnsRootNamespace ()
+ {
+ CreateTestProject ();
+ project.DefaultNamespace = "Test";
+ CreateProjectSystem (project);
+
+ string propertyValue = projectSystem.GetPropertyValue ("RootNamespace");
+
+ Assert.AreEqual ("Test", propertyValue);
+ }
+
+ [Test]
+ public void TargetFramework_TargetFrameworkVersion40DefinedInProject_ReturnsFullDotNetFramework40 ()
+ {
+ CreateTestProject ();
+ project.TargetFrameworkMoniker = new TargetFrameworkMoniker ("v4.0");
+ CreateProjectSystem (project);
+
+ FrameworkName expectedName = new FrameworkName (".NETFramework, Version=v4.0");
+
+ Assert.AreEqual (expectedName, projectSystem.TargetFramework);
+ }
+
+ [Test]
+ public void TargetFramework_TargetFrameworkVersion35ClientProfileDefinedInProject_ReturnsClientProfileDotNetFramework35 ()
+ {
+ CreateTestProject ();
+ project.TargetFrameworkMoniker = new TargetFrameworkMoniker (".NETFramework", "v3.5", "Client");
+ CreateProjectSystem (project);
+
+ FrameworkName expectedName = new FrameworkName (".NETFramework, Profile=Client, Version=v3.5");
+
+ Assert.AreEqual (expectedName, projectSystem.TargetFramework);
+ }
+
+ [Test]
+ public void TargetFramework_TargetFrameworkVersionIsSilverlight20DefinedInProject_ReturnsSilverlight ()
+ {
+ CreateTestProject ();
+ project.TargetFrameworkMoniker = new TargetFrameworkMoniker ("Silverlight", "v2.0");
+ CreateProjectSystem (project);
+
+ FrameworkName expectedName = new FrameworkName ("Silverlight, Version=v2.0");
+
+ Assert.AreEqual (expectedName, projectSystem.TargetFramework);
+ }
+
+ [Test]
+ public void IsSupportedFile_PassedCSharpFileName_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\abc.cs";
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsWebProjectAndPassedAppConfigFileName_ReturnsFalse ()
+ {
+ CreateTestWebApplicationProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\app.config";
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsWebProjectAndPassedAppConfigFileNameInUpperCase_ReturnsFalse ()
+ {
+ CreateTestWebApplicationProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"c:\projects\APP.CONFIG";
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsWebApplicationProjectAndPassedWebConfigFileName_ReturnsTrue ()
+ {
+ CreateTestWebApplicationProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\web.config";
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsWebSiteProjectAndPassedWebConfigFileName_ReturnsTrue ()
+ {
+ CreateTestWebSiteProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\web.config";
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsCSharpProjectAndPassedWebConfigFileName_ReturnsFalse ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\web.config";
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsCSharpProjectAndPassedWebConfigFileNameInUpperCase_ReturnsFalse ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\WEB.CONFIG";
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsSupportedFile_ProjectIsCSharpProjectAndPassedAppConfigFileName_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\temp\app.config";
+ bool result = projectSystem.IsSupportedFile (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ProjectHasReferenceAndFullPathToAssemblyPassedToMethod_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddReference (project, "MyAssembly");
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\MyAssembly.dll";
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ProjectHasNoReferences_ReturnsFalse ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\MyAssembly.dll";
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ProjectReferenceNameHasDifferentCase_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddReference (project, "myassembly");
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\MYASSEMBLY.dll";
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ReferenceNamePassedIsInProjectAndIsReferenceNameWithNoFileExtension_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddReference (project, "System.ComponentModel.Composition");
+ CreateProjectSystem (project);
+ string referenceName = "System.ComponentModel.Composition";
+
+ bool result = projectSystem.ReferenceExists (referenceName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ReferenceIsInProjectAndProjectReferenceSearchedForHasExeFileExtension_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddReference (project, "myassembly");
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\myassembly.exe";
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void ReferenceExists_ReferenceIsInProjectAndProjectReferenceSearchedForHasExeFileExtensionInUpperCase_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddReference (project, "myassembly");
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\MYASSEMBLY.EXE";
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void AddReference_AddReferenceToNUnitFramework_ProjectIsSavedAfterAddingReference ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ project.IsSaved = false;
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll";
+ projectSystem.AddReference (fileName, null);
+
+ Assert.AreEqual (1, project.ReferencesWhenSavedCount);
+ }
+
+ [Test]
+ public void AddReference_AddReferenceToNUnitFramework_ReferenceAddedToProject ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ project.IsSaved = false;
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll";
+ projectSystem.AddReference (fileName, null);
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "nunit.framework");
+
+ ProjectReference actualReference = project.References [0];
+ Assert.AreEqual (fileName, actualReference.Reference);
+ Assert.AreEqual (fileName, actualReference.HintPath);
+ }
+
+ [Test]
+ public void AddReference_ReferenceFileNameIsRelativePath_ReferenceAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ project.IsSaved = false;
+ string relativeFileName = @"packages\nunit\nunit.framework.dll";
+ string fullFileName = @"d:\projects\MyProject\packages\nunit\nunit.framework.dll";
+ projectSystem.AddReference (relativeFileName, null);
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "nunit.framework");
+
+ ProjectReference actualReference = project.References [0];
+ Assert.AreEqual (fullFileName, actualReference.Reference);
+ Assert.AreEqual (fullFileName, actualReference.HintPath);
+ }
+
+ [Test]
+ public void AddReference_AddReferenceToNUnitFramework_AddingReferenceIsLogged ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ project.Name = "MyTestProject";
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll";
+ projectSystem.AddReference (fileName, null);
+
+ var expectedReferenceAndProjectName = new ReferenceAndProjectName () {
+ Reference = fileName,
+ Project = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedReferenceAndProjectName, projectSystem.ReferenceAndProjectNamePassedToLogAddedReferenceToProject);
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceBeingRemovedHasFileExtension_ReferenceRemovedFromProject ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddReference (project, "nunit.framework");
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll";
+ projectSystem.RemoveReference (fileName);
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "nunit.framework");
+
+ Assert.IsNull (referenceItem);
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceCaseAddedToProjectDifferentToReferenceNameBeingRemoved_ReferenceRemovedFromProject ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddReference (project, "nunit.framework");
+ CreateProjectSystem (project);
+
+ string fileName = @"NUNIT.FRAMEWORK.DLL";
+ projectSystem.RemoveReference (fileName);
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "nunit.framework");
+
+ Assert.IsNull (referenceItem);
+ }
+
+ [Test]
+ public void RemoveReference_ProjectHasNoReference_ArgumentNullExceptionNotThrown ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string fileName = @"NUNIT.FRAMEWORK.DLL";
+ Assert.DoesNotThrow (() => projectSystem.RemoveReference (fileName));
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceExistsInProject_ProjectIsSavedAfterReferenceRemoved ()
+ {
+ CreateTestProject ();
+ ProjectHelper.AddReference (project, "nunit.framework");
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll";
+ projectSystem.RemoveReference (fileName);
+
+ Assert.AreEqual (0, project.ReferencesWhenSavedCount);
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceBeingRemovedHasFileExtension_ReferenceRemovalIsLogged ()
+ {
+ CreateTestProject ();
+ project.Name = "MyTestProject";
+ ProjectHelper.AddReference (project, "nunit.framework");
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll";
+ projectSystem.RemoveReference (fileName);
+
+ var expectedReferenceAndProjectName = new ReferenceAndProjectName {
+ Reference = "nunit.framework",
+ Project = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedReferenceAndProjectName, projectSystem.ReferenceAndProjectNamePassedToLogRemovedReferenceFromProject);
+ }
+
+ [Test]
+ public void AddFile_NewFile_AddsFileToFileSystem ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string expectedPath = @"d:\temp\abc.cs";
+ Stream expectedStream = new MemoryStream ();
+ projectSystem.AddFile (expectedPath, expectedStream);
+
+ Assert.AreEqual (expectedPath, projectSystem.PathPassedToPhysicalFileSystemAddFile);
+ Assert.AreEqual (expectedStream, projectSystem.StreamPassedToPhysicalFileSystemAddFile);
+ }
+
+ [Test]
+ public void AddFile_NewFile_AddsFileToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\src\NewFile.cs";
+ project.AddDefaultBuildAction (BuildAction.Compile, fileName);
+ CreateProjectSystem (project);
+ AddFile (fileName);
+
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+ FilePath expectedFileName = new FilePath (fileName);
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.Compile, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void AddFile_NewResxFile_AddsFileToProjectWithCorrectItemType ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\src\NewFile.resx";
+ project.AddDefaultBuildAction (BuildAction.EmbeddedResource, fileName);
+ CreateProjectSystem (project);
+
+ AddFile (fileName);
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+
+ FilePath expectedFileName = new FilePath (fileName);
+
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.EmbeddedResource, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void AddFile_RelativeFileNameUsed_AddsFileToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\src\NewFile.cs";
+ project.AddDefaultBuildAction (BuildAction.Compile, fileName);
+ CreateProjectSystem (project);
+
+ string relativeFileName = @"src\NewFile.cs";
+ AddFile (relativeFileName);
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+
+ FilePath expectedFileName = new FilePath (fileName);
+
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.Compile, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void AddFile_RelativeFileNameWithNoPathUsed_AddsFileToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\NewFile.cs";
+ project.AddDefaultBuildAction (BuildAction.Compile, fileName);
+ CreateProjectSystem (project);
+
+ string relativeFileName = @"NewFile.cs";
+ AddFile (relativeFileName);
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+
+ FilePath expectedFileName = new FilePath (fileName);
+
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.Compile, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void AddFile_NewFile_ProjectIsSavedAfterFileAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.IsSaved = false;
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\projects\MyProject\src\NewFile.cs";
+ AddFile (fileName);
+
+ Assert.AreEqual (1, project.FilesAddedWhenSavedCount);
+ }
+
+ [Test]
+ public void AddFile_NewFileToBeAddedInBinFolder_FileIsNotAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+
+ string fileName = @"bin\NewFile.dll";
+ AddFile (fileName);
+
+ Assert.AreEqual (0, project.FilesAdded.Count);
+ }
+
+ [Test]
+ public void AddFile_NewFileToBeAddedInBinFolderWithBinFolderNameInUpperCase_FileIsNotAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+
+ string fileName = @"BIN\NewFile.dll";
+ AddFile (fileName);
+
+ Assert.AreEqual (0, project.FilesAdded.Count);
+ }
+
+ [Test]
+ public void AddFile_FileAlreadyExistsInProject_FileIsNotAddedToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.AddDefaultBuildAction (BuildAction.Compile, @"d:\projects\MyProject\src\NewFile.cs");
+ CreateProjectSystem (project);
+ AddFileToProject (@"d:\projects\MyProject\src\NewFile.cs");
+
+ AddFile (@"src\NewFile.cs");
+
+ int projectItemsCount = project.FilesAdded.Count;
+ Assert.AreEqual (0, projectItemsCount);
+ }
+
+ [Test]
+ public void AddFile_NewFile_FileAddedToProjectIsLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.Name = "MyTestProject";
+ CreateProjectSystem (project);
+
+ AddFile (@"src\files\abc.cs");
+
+ var expectedFileNameAndProjectName = new FileNameAndProjectName {
+ FileName = @"src\files\abc.cs",
+ ProjectName = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedFileNameAndProjectName, projectSystem.FileNameAndProjectNamePassedToLogAddedFileToProject);
+ }
+
+ [Test]
+ public void AddFile_NewFileAlreadyExistsInProject_FileIsStillLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.Name = "MyTestProject";
+ AddFileToProject (@"src\files\abc.cs");
+ CreateProjectSystem (project);
+
+ AddFile (@"src\files\abc.cs");
+
+ var expectedFileNameAndProjectName = new FileNameAndProjectName {
+ FileName = @"src\files\abc.cs",
+ ProjectName = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedFileNameAndProjectName, projectSystem.FileNameAndProjectNamePassedToLogAddedFileToProject);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromFileSystem_CallsFileServiceRemoveFile ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile ("test.cs");
+
+ Assert.AreEqual (@"d:\temp\test.cs", projectSystem.FakeFileService.PathPassedToRemoveFile);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromFileSystem_ProjectIsSavedAfterFileRemoved ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.IsSaved = false;
+ AddFileToProject (@"d:\temp\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile ("test.cs");
+
+ Assert.AreEqual (0, project.FilesInProjectWhenSavedCount);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromFileSystem_FileDeletionLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile ("test.cs");
+
+ Assert.AreEqual ("test.cs", projectSystem.FileNamePassedToLogDeletedFile);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromFileSystem_FolderInformationNotLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile ("test.cs");
+
+ Assert.IsNull (projectSystem.FileNameAndDirectoryPassedToLogDeletedFileFromDirectory);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromSubFolder_FileDeletionLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\src\Files\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile (@"src\Files\test.cs");
+
+ var expectedFileNameAndFolder = new FileNameAndDirectory () {
+ FileName = "test.cs",
+ Folder = @"src\Files"
+ };
+
+ var actualFileNameAndFolder = projectSystem.FileNameAndDirectoryPassedToLogDeletedFileFromDirectory;
+
+ Assert.AreEqual (expectedFileNameAndFolder, actualFileNameAndFolder);
+ }
+
+ [Test]
+ public void DeleteFile_DeletesFileFromSubFolder_FileDeletionWithoutFolderInformationIsNotLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\src\Files\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteFile (@"src\Files\test.cs");
+
+ Assert.IsNull (projectSystem.FileNamePassedToLogDeletedFile);
+ }
+
+ [Test]
+ public void DeleteDirectory_DeletesDirectoryFromFileSystem_CallsFileServiceRemoveDirectory ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ AddFileToProject (@"d:\temp\test\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteDirectory ("test");
+
+ string path = @"d:\temp\test";
+ Assert.AreEqual (path, projectSystem.FakeFileService.PathPassedToRemoveDirectory);
+ }
+
+ [Test]
+ public void DeleteDirectory_DeletesDirectoryFromFileSystem_ProjectIsSavedAfterDirectoryDeleted ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.IsSaved = false;
+ AddFileToProject (@"d:\temp\test\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteDirectory ("test");
+
+ Assert.AreEqual (0, project.FilesInProjectWhenSavedCount);
+ Assert.IsTrue (project.IsSaved);
+ }
+
+ [Test]
+ public void DeleteDirectory_DeletesDirectoryFromFileSystem_DirectoryIsLogged ()
+ {
+ CreateTestProject (@"d:\temp\MyProject.csproj");
+ project.IsSaved = false;
+ AddFileToProject (@"d:\temp\test\test.cs");
+ CreateProjectSystem (project);
+
+ projectSystem.DeleteDirectory ("test");
+
+ Assert.AreEqual ("test", projectSystem.DirectoryPassedToLogDeletedDirectory);
+ }
+
+ [Test]
+ public void AddFrameworkReference_SystemXmlToBeAdded_ReferenceAddedToProject ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ projectSystem.AddFrameworkReference ("System.Xml");
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "System.Xml");
+
+ Assert.AreEqual ("System.Xml", referenceItem.Reference);
+ Assert.AreEqual (ReferenceType.Package, referenceItem.ReferenceType);
+ }
+
+ [Test]
+ public void AddFrameworkReference_SystemXmlToBeAdded_ProjectIsSaved ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ projectSystem.AddFrameworkReference ("System.Xml");
+
+ bool saved = project.IsSaved;
+
+ Assert.IsTrue (saved);
+ }
+
+ [Test]
+ public void AddFrameworkReference_SystemXmlToBeAdded_AddedReferenceIsLogged ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ project.Name = "MyTestProject";
+
+ projectSystem.AddFrameworkReference ("System.Xml");
+
+ var expectedReferenceAndProjectName = new ReferenceAndProjectName () {
+ Reference = "System.Xml",
+ Project = "MyTestProject"
+ };
+
+ Assert.AreEqual (expectedReferenceAndProjectName, projectSystem.ReferenceAndProjectNamePassedToLogAddedReferenceToProject);
+ }
+
+ [Test]
+ public void ResolvePath_PathPassed_ReturnsPathUnchanged ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string expectedPath = @"d:\temp";
+
+ string path = projectSystem.ResolvePath (expectedPath);
+
+ Assert.AreEqual (expectedPath, path);
+ }
+
+ [Test]
+ [Ignore ("Custom tool not implemented")]
+ public void AddFile_NewTextTemplateFileWithAssociatedDefaultCustomTool_AddsFileToProjectWithDefaultCustomTool ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ string path = @"d:\temp\abc.tt";
+ AddDefaultCustomToolForFileName (path, "TextTemplatingFileGenerator");
+ Stream stream = new MemoryStream ();
+
+ projectSystem.AddFile (path, stream);
+
+ ProjectFile fileItem = ProjectHelper.GetFile (project, path);
+ //string customTool = fileItem.CustomTool;
+ //Assert.AreEqual ("TextTemplatingFileGenerator", customTool);
+ }
+
+ [Test]
+ [Ignore ("Custom tool not implemented")]
+ public void AddFile_NewFileWithNoAssociatedDefaultCustomTool_AddsFileToProjectWithNoDefaultCustomTool ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+ string path = @"d:\temp\abc.tt";
+ AddDefaultCustomToolForFileName (path, null);
+ Stream stream = new MemoryStream ();
+
+ projectSystem.AddFile (path, stream);
+
+ ProjectFile fileItem = ProjectHelper.GetFile (project, path);
+ //string customTool = fileItem.CustomTool;
+ //Assert.AreEqual (String.Empty, customTool);
+ }
+
+ [Test]
+ [Ignore ("Not implemented in NuGet addin - MSBuild imports added elsewhere")]
+ public void AddImport_FullImportFilePathAndBottomOfProject_PathRelativeToProjectAddedAsLastImportInProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ AssertLastMSBuildChildElementHasProjectAttributeValue (@"..\packages\Foo.0.1\build\Foo.targets");
+ }
+
+ [Test]
+ [Ignore ("Not implemented in NuGet addin - MSBuild imports added elsewhere")]
+ public void AddImport_AddImportToBottomOfProject_ImportAddedWithConditionThatChecksForExistenceOfTargetsFile ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ AssertLastMSBuildChildHasCondition ("Exists('..\\packages\\Foo.0.1\\build\\Foo.targets')");
+ }
+
+ [Test]
+ public void AddImport_AddSameImportTwice_ImportOnlyAddedTwiceToProjectSinceProjectRemovesDuplicates ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ Assert.AreEqual (2, project.ImportsAdded.Count);
+ }
+
+ [Test]
+ public void AddImport_AddSameImportTwiceButWithDifferentCase_ImportOnlyAddedTwiceToProjectSinceProjectRemovesDuplicates ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath1 = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ string targetPath2 = @"d:\projects\MyProject\packages\Foo.0.1\BUILD\FOO.TARGETS";
+ projectSystem.AddImport (targetPath1, ProjectImportLocation.Bottom);
+
+ projectSystem.AddImport (targetPath2, ProjectImportLocation.Bottom);
+
+ Assert.AreEqual (2, project.ImportsAdded.Count);
+ }
+
+ [Test]
+ public void AddImport_FullImportFilePathAndBottomOfProject_ProjectIsSaved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ Assert.IsTrue (project.IsSaved);
+ }
+
+ [Test]
+ public void RemoveImport_ImportAlreadyAddedToBottomOfProject_ImportRemoved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Bottom);
+
+ projectSystem.RemoveImport (targetPath);
+
+ Assert.AreEqual (1, project.ImportsRemoved.Count);
+ }
+
+ [Test]
+ public void RemoveImport_ImportAlreadyWithDifferentCaseAddedToBottomOfProject_ImportRemoved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath1 = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ projectSystem.AddImport (targetPath1, ProjectImportLocation.Bottom);
+ string targetPath2 = @"d:\projects\MyProject\packages\Foo.0.1\BUILD\FOO.TARGETS";
+
+ projectSystem.RemoveImport (targetPath2);
+
+ Assert.AreEqual (1, project.ImportsAdded.Count);
+ Assert.AreEqual (1, project.ImportsRemoved.Count);
+ }
+
+ [Test]
+ public void RemoveImport_NoImportsAdded_ProjectIsSaved ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+
+ projectSystem.RemoveImport ("Unknown.targets");
+
+ Assert.IsTrue (project.IsSaved);
+ }
+
+ [Test]
+ [Ignore ("Not implemented in NuGet addin - MSBuild imports added elsewhere")]
+ public void AddImport_AddToTopOfProject_ImportAddedAsFirstChildElement ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Top);
+
+ AssertFirstMSBuildChildElementHasProjectAttributeValue (@"..\packages\Foo.0.1\build\Foo.targets");
+ }
+
+ [Test]
+ [Ignore ("MSBuild conditions not implemented")]
+ public void AddImport_AddImportToTopOfProject_ImportAddedWithConditionThatChecksForExistenceOfTargetsFile ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Top);
+
+ AssertFirstMSBuildChildHasCondition ("Exists('..\\packages\\Foo.0.1\\build\\Foo.targets')");
+ }
+
+ [Test]
+ public void AddImport_AddToTopOfProjectTwice_ImportAddedTwiceSinceProjectRemovesDuplicates ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ string targetPath = @"d:\projects\MyProject\packages\Foo.0.1\build\Foo.targets";
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Top);
+
+ projectSystem.AddImport (targetPath, ProjectImportLocation.Top);
+
+ Assert.AreEqual (2, project.ImportsAdded.Count);
+ }
+
+ [Test]
+ public void AddFile_NewFileAddedWithAction_AddsFileToFileSystem ()
+ {
+ CreateTestProject ();
+ CreateProjectSystem (project);
+
+ string expectedPath = @"d:\temp\abc.cs";
+ Action<Stream> expectedAction = stream => {
+ };
+ projectSystem.AddFile (expectedPath, expectedAction);
+
+ Assert.AreEqual (expectedPath, projectSystem.PathPassedToPhysicalFileSystemAddFile);
+ Assert.AreEqual (expectedAction, projectSystem.ActionPassedToPhysicalFileSystemAddFile);
+ }
+
+ [Test]
+ public void AddFile_NewFileAddedWithAction_AddsFileToProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ string fileName = @"d:\projects\MyProject\src\NewFile.cs";
+ project.AddDefaultBuildAction (BuildAction.Compile, fileName);
+ CreateProjectSystem (project);
+
+ Action<Stream> action = stream => {
+ };
+ projectSystem.AddFile (fileName, action);
+
+ ProjectFile fileItem = ProjectHelper.GetFile (project, fileName);
+ var expectedFileName = new FilePath (fileName);
+
+ Assert.AreEqual (expectedFileName, fileItem.FilePath);
+ Assert.AreEqual (BuildAction.Compile, fileItem.BuildAction);
+ }
+
+ [Test]
+ public void ReferenceExists_ReferenceIsInProjectButIncludesAssemblyVersion_ReturnsTrue ()
+ {
+ CreateTestProject ();
+ string include = "MyAssembly, Version=0.1.0.0, Culture=neutral, PublicKeyToken=8cc8392e8503e009";
+ ProjectHelper.AddReference (project, include);
+ CreateProjectSystem (project);
+ string fileName = @"D:\Projects\Test\myassembly.dll";
+
+ bool result = projectSystem.ReferenceExists (fileName);
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void RemoveReference_ReferenceBeingRemovedHasFileExtensionAndProjectHasReferenceIncludingAssemblyVersion_ReferenceRemovedFromProject ()
+ {
+ CreateTestProject ();
+ string include = "nunit.framework, Version=2.6.2.0, Culture=neutral, PublicKeyToken=8cc8392e8503e009";
+ ProjectHelper.AddReference (project, include);
+ CreateProjectSystem (project);
+ string fileName = @"d:\projects\packages\nunit\nunit.framework.dll";
+
+ projectSystem.RemoveReference (fileName);
+
+ ProjectReference referenceItem = ProjectHelper.GetReference (project, "nunit.framework");
+ Assert.IsNull (referenceItem);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs
new file mode 100644
index 0000000000..92dae73c23
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs
@@ -0,0 +1,86 @@
+//
+// NuGetPackageRestoreCommandLineTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+using NUnit.Framework;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using System.IO;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class NuGetPackageRestoreCommandLineTests
+ {
+ NuGetPackageRestoreCommandLine commandLine;
+
+ void CreateCommandLineWithSolution (string fileName)
+ {
+ CreateCommandLineWithSolution (fileName, null, false);
+ }
+
+ void CreateCommandLineWithSolution (string fileName, MonoRuntimeInfo monoRuntimeInfo)
+ {
+ CreateCommandLineWithSolution (fileName, monoRuntimeInfo, true);
+ }
+
+ void CreateCommandLineWithSolution (string fileName, MonoRuntimeInfo monoRuntimeInfo, bool isMonoRuntime)
+ {
+ var solution = new FakePackageManagementSolution ();
+ solution.FileName = fileName;
+ commandLine = new NuGetPackageRestoreCommandLine (
+ solution,
+ monoRuntimeInfo,
+ isMonoRuntime);
+ }
+
+ [Test]
+ public void Arguments_RestoreSolution_SolutionFullFileNameUsed ()
+ {
+ CreateCommandLineWithSolution (@"d:\projects\MySolution\MySolution.sln");
+
+ string arguments = commandLine.Arguments;
+
+ string expectedArguments = "restore \"d:\\projects\\MySolution\\MySolution.sln\"";
+ Assert.AreEqual (expectedArguments, arguments);
+ }
+
+ [Test]
+ public void CommandLine_RestoreSolutionOnMono_MonoUsedFromCurrentPrefix ()
+ {
+ var monoRuntime = new MonoRuntimeInfo (@"c:\Users\Prefix");
+ CreateCommandLineWithSolution (@"d:\projects\MySolution\MySolution.sln", monoRuntime);
+
+ string arguments = commandLine.Arguments;
+
+ string expectedCommandLine = Path.Combine (@"c:\Users\Prefix", "bin", "mono");
+ Assert.IsTrue (arguments.StartsWith ("--runtime=v4.0 "), arguments);
+ Assert.IsTrue (arguments.EndsWith ("restore \"d:\\projects\\MySolution\\MySolution.sln\""), arguments);
+ Assert.AreEqual (expectedCommandLine, commandLine.Command);
+ }
+ }
+} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/OpenDotNetProjectTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/OpenDotNetProjectTests.cs
new file mode 100644
index 0000000000..84d7b1a2ae
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/OpenDotNetProjectTests.cs
@@ -0,0 +1,90 @@
+//
+// OpenDotNetProjectTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class OpenDotNetProjectsTests
+ {
+ OpenDotNetProjects projects;
+ FakePackageManagementProjectService fakeProjectService;
+ List<IDotNetProject> openProjects;
+
+ void CreateOpenMSBuildProjects ()
+ {
+ fakeProjectService = new FakePackageManagementProjectService ();
+ openProjects = fakeProjectService.OpenProjects;
+
+ projects = new OpenDotNetProjects (fakeProjectService);
+ }
+
+ FakeDotNetProject AddProjectWithShortName (string projectName)
+ {
+ var project = ProjectHelper.CreateTestProject (projectName);
+ openProjects.Add (project);
+ return project;
+ }
+
+ FakeDotNetProject AddProjectWithFileName (string fileName)
+ {
+ FakeDotNetProject project = AddProjectWithShortName ("Test");
+ project.FileName = new FilePath (fileName);
+ return project;
+ }
+
+ [Test]
+ public void FindProject_ProjectShortNameUsedAndProjectIsOpen_ReturnsProject ()
+ {
+ CreateOpenMSBuildProjects ();
+ IDotNetProject expectedProject = AddProjectWithShortName ("MyProject");
+
+ IDotNetProject project = projects.FindProject ("MyProject");
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void FindProject_ProjectFileNameUsedAndProjectIsOpen_ReturnsProject ()
+ {
+ CreateOpenMSBuildProjects ();
+ string fileName = @"d:\projects\MyProject\MyProject.csproj";
+ IDotNetProject expectedProject = AddProjectWithFileName (fileName);
+
+ IDotNetProject project = projects.FindProject (fileName);
+
+ Assert.AreEqual (expectedProject, project);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementProjectTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementProjectTests.cs
new file mode 100644
index 0000000000..44144891f6
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementProjectTests.cs
@@ -0,0 +1,758 @@
+//
+// PackageManagementProjectTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementProjectTests
+ {
+ FakePackageManagerFactory fakePackageManagerFactory;
+ FakePackageRepository fakeSourceRepository;
+ FakeDotNetProject fakeProject;
+ PackageManagementProject project;
+ FakeProjectManager fakeProjectManager;
+ FakePackageManager fakePackageManager;
+ PackageManagementEvents packageManagementEvents;
+ FakeInstallPackageAction fakeInstallAction;
+ FakeUninstallPackageAction fakeUninstallAction;
+ FakeUpdatePackageAction fakeUpdateAction;
+ UpdatePackagesAction updatePackagesAction;
+
+ void CreateProject ()
+ {
+ fakePackageManagerFactory = new FakePackageManagerFactory ();
+ fakePackageManager = fakePackageManagerFactory.FakePackageManager;
+ fakeProjectManager = fakePackageManager.FakeProjectManager;
+ fakeSourceRepository = new FakePackageRepository ();
+ fakeProject = new FakeDotNetProject ();
+ packageManagementEvents = new PackageManagementEvents ();
+
+ project = new PackageManagementProject (
+ fakeSourceRepository,
+ fakeProject,
+ packageManagementEvents,
+ fakePackageManagerFactory);
+ }
+
+ FakeInstallPackageAction CreateFakeInstallAction ()
+ {
+ fakeInstallAction = new FakeInstallPackageAction ();
+ return fakeInstallAction;
+ }
+
+ FakeUninstallPackageAction CreateFakeUninstallAction ()
+ {
+ fakeUninstallAction = new FakeUninstallPackageAction (project);
+ return fakeUninstallAction;
+ }
+
+ FakeUpdatePackageAction CreateFakeUpdateAction ()
+ {
+ fakeUpdateAction = new FakeUpdatePackageAction (project);
+ return fakeUpdateAction;
+ }
+
+ void CreateUpdatePackagesAction ()
+ {
+ updatePackagesAction = new UpdatePackagesAction (project, null);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsInstalled_ReturnsTrue ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = true;
+ var package = new FakePackage ("Test");
+
+ bool installed = project.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsNotInstalled_ReturnsFalse ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = false;
+ var package = new FakePackage ("Test");
+
+ bool installed = project.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsInstalled_PackagePassedToProjectManager ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = false;
+ var expectedPackage = new FakePackage ("Test");
+
+ project.IsPackageInstalled (expectedPackage);
+ IPackage actualPackage = fakeProjectManager.PackagePassedToIsInstalled;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Constructor_RepositoryAndProjectPassed_RepositoryUsedToCreatePackageManager ()
+ {
+ CreateProject ();
+ IPackageRepository actualrepository = fakePackageManagerFactory.PackageRepositoryPassedToCreatePackageManager;
+
+ Assert.AreEqual (fakeSourceRepository, actualrepository);
+ }
+
+ [Test]
+ public void Constructor_RepositoryAndProjectPassed_ProjectUsedToCreatePackageManager ()
+ {
+ CreateProject ();
+ var actualProject = fakePackageManagerFactory.ProjectPassedToCreateRepository;
+
+ Assert.AreEqual (fakeProject, actualProject);
+ }
+
+ [Test]
+ public void GetPackages_ProjectManagerLocalRepositoryHasTwoPackages_ReturnsTwoPackages ()
+ {
+ CreateProject ();
+ FakePackageRepository repository = fakeProjectManager.FakeLocalRepository;
+ FakePackage packageA = repository.AddFakePackage ("A");
+ FakePackage packageB = repository.AddFakePackage ("B");
+
+ IQueryable<IPackage> actualPackages = project.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ packageA,
+ packageB
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_IgnoreDependenciesIsTrue_DependenciesIgnoredWhenRetrievingPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = true;
+
+ project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ Assert.IsTrue (fakePackageManager.IgnoreDependenciesPassedToGetInstallPackageOperations);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_IgnoreDependenciesIsFalse_DependenciesNotIgnoredWhenRetrievingPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = false;
+
+ project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ Assert.IsFalse (fakePackageManager.IgnoreDependenciesPassedToGetInstallPackageOperations);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackagePassed_PackageUsedToRetrievePackageOperations ()
+ {
+ CreateProject ();
+ var expectedPackage = new FakePackage ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = true;
+
+ project.GetInstallPackageOperations (expectedPackage, fakeInstallAction);
+
+ IPackage actualPackage = fakePackageManager.PackagePassedToGetInstallPackageOperations;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_PackagePassed_ReturnsPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = true;
+
+ IEnumerable<PackageOperation> operations = project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ IEnumerable<PackageOperation> expectedOperations = fakePackageManager.PackageOperationsToReturnFromGetInstallPackageOperations;
+
+ Assert.AreEqual (expectedOperations, operations);
+ }
+
+ [Test]
+ public void Logger_SetLogger_LoggerOnPackageManagerIsSet ()
+ {
+ CreateProject ();
+ var expectedLogger = new FakeLogger ();
+
+ project.Logger = expectedLogger;
+
+ Assert.AreEqual (expectedLogger, fakePackageManager.Logger);
+ }
+
+ [Test]
+ public void Logger_GetLogger_LoggerOnPackageManagerIsReturned ()
+ {
+ CreateProject ();
+
+ ILogger logger = project.Logger;
+ ILogger expectedLogger = fakePackageManager.Logger;
+
+ Assert.AreEqual (expectedLogger, logger);
+ }
+
+ [Test]
+ public void InstallPackage_PackagePassed_PackageInstalled ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .Package = package;
+
+ project.InstallPackage (package, fakeInstallAction);
+
+ IPackage expectedPackage = fakePackageManager.PackagePassedToInstallPackage;
+
+ Assert.AreEqual (expectedPackage, package);
+ }
+
+ [Test]
+ public void InstallPackage_IgnoreDependenciesIsTrue_DependenciesAreIgnoredWhenPackageIsInstalled ()
+ {
+ CreateProject ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = true;
+ project.InstallPackage (null, fakeInstallAction);
+
+ Assert.IsTrue (fakePackageManager.IgnoreDependenciesPassedToInstallPackage);
+ }
+
+ [Test]
+ public void InstallPackage_IgnoreDependenciesIsFalse_DependenciesAreNotIgnoredWhenPackageIsInstalled ()
+ {
+ CreateProject ();
+ CreateFakeInstallAction ()
+ .IgnoreDependencies = false;
+ project.InstallPackage (null, fakeInstallAction);
+
+ Assert.IsFalse (fakePackageManager.IgnoreDependenciesPassedToInstallPackage);
+ }
+
+ [Test]
+ public void InstallPackage_PackageOperationsPassed_PackageOperationsUsedToInstallPackage ()
+ {
+ CreateProject ();
+ var expectedOperations = new List<PackageOperation> ();
+ CreateFakeInstallAction ()
+ .Operations = expectedOperations;
+ project.InstallPackage (null, fakeInstallAction);
+
+ IEnumerable<PackageOperation> actualOperations = fakePackageManager.PackageOperationsPassedToInstallPackage;
+
+ Assert.AreEqual (expectedOperations, actualOperations);
+ }
+
+ [Test]
+ public void SourceRepository_NewInstance_ReturnsRepositoryUsedToCreateInstance ()
+ {
+ CreateProject ();
+ IPackageRepository repository = project.SourceRepository;
+
+ Assert.AreEqual (fakeSourceRepository, repository);
+ }
+
+ [Test]
+ public void UninstallPackage_PackagePassed_PackageUninstalled ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = true;
+ fakeUninstallAction.RemoveDependencies = true;
+ var package = new FakePackage ();
+
+ project.UninstallPackage (package, fakeUninstallAction);
+
+ IPackage expectedPackage = fakePackageManager.PackagePassedToUninstallPackage;
+
+ Assert.AreEqual (expectedPackage, package);
+ }
+
+ [Test]
+ public void UninstallPackage_ForceRemoveIsTrue_PackageUninstallIsForced ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = true;
+ fakeUninstallAction.RemoveDependencies = false;
+
+ project.UninstallPackage (null, fakeUninstallAction);
+
+ Assert.IsTrue (fakePackageManager.ForceRemovePassedToUninstallPackage);
+ }
+
+ [Test]
+ public void UninstallPackage_ForceRemoveIsFalse_PackageUninstallIsNotForced ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = false;
+ fakeUninstallAction.RemoveDependencies = true;
+
+ project.UninstallPackage (null, fakeUninstallAction);
+
+ Assert.IsFalse (fakePackageManager.ForceRemovePassedToUninstallPackage);
+ }
+
+ [Test]
+ public void UninstallPackage_RemoveDependenciesIsTrue_PackageDependenciesIsRemoved ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = false;
+ fakeUninstallAction.RemoveDependencies = true;
+
+ project.UninstallPackage (null, fakeUninstallAction);
+
+ Assert.IsTrue (fakePackageManager.RemoveDependenciesPassedToUninstallPackage);
+ }
+
+ [Test]
+ public void UninstallPackage_RemoveDependenciesIsFalse_PackageDependenciesNotRemoved ()
+ {
+ CreateProject ();
+ CreateFakeUninstallAction ();
+ fakeUninstallAction.ForceRemove = true;
+ fakeUninstallAction.RemoveDependencies = false;
+
+ project.UninstallPackage (null, fakeUninstallAction);
+
+ Assert.IsFalse (fakePackageManager.RemoveDependenciesPassedToUninstallPackage);
+ }
+
+ [Test]
+ public void UpdatePackage_PackagePassed_PackageUpdated ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeUpdateAction ()
+ .UpdateDependencies = true;
+
+ project.UpdatePackage (package, fakeUpdateAction);
+
+ IPackage expectedPackage = fakePackageManager.PackagePassedToUpdatePackage;
+
+ Assert.AreEqual (expectedPackage, package);
+ }
+
+ [Test]
+ public void UpdatePackage_UpdateDependenciesIsTrue_DependenciesUpdatedWhenPackageIsUpdated ()
+ {
+ CreateProject ();
+ CreateFakeUpdateAction ()
+ .UpdateDependencies = true;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ Assert.IsTrue (fakePackageManager.UpdateDependenciesPassedToUpdatePackage);
+ }
+
+ [Test]
+ public void UpdatePackage_UpdateDependenciesIsFalse_DependenciesAreNotUpdatedWhenPackageIsUpdated ()
+ {
+ CreateProject ();
+ CreateFakeUpdateAction ()
+ .UpdateDependencies = false;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ Assert.IsFalse (fakePackageManager.UpdateDependenciesPassedToUpdatePackage);
+ }
+
+ [Test]
+ public void UpdatePackage_PackageOperationsPassed_PackageOperationsUsedToUpdatePackage ()
+ {
+ CreateProject ();
+ var expectedOperations = new List<PackageOperation> ();
+ CreateFakeUpdateAction ()
+ .Operations = expectedOperations;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ IEnumerable<PackageOperation> actualOperations = fakePackageManager.PackageOperationsPassedToUpdatePackage;
+
+ Assert.AreEqual (expectedOperations, actualOperations);
+ }
+
+ [Test]
+ public void Logger_SetLogger_ProjectManagerUsesLogger ()
+ {
+ CreateProject ();
+ ILogger expectedLogger = new NullLogger ();
+ project.Logger = expectedLogger;
+ ILogger actualLogger = fakePackageManager.ProjectManager.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void Logger_SetLogger_ProjectManagerProjectSystemUsesLogger ()
+ {
+ CreateProject ();
+ ILogger expectedLogger = new NullLogger ();
+ project.Logger = expectedLogger;
+ ILogger actualLogger = fakePackageManager.ProjectManager.Project.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void Logger_SetLogger_PackageManagerFileSystemUsesLogger ()
+ {
+ CreateProject ();
+ ILogger expectedLogger = new NullLogger ();
+ project.Logger = expectedLogger;
+ ILogger actualLogger = fakePackageManager.FileSystem.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void Logger_GetLogger_ReturnsLogger ()
+ {
+ CreateProject ();
+ ILogger expectedLogger = new NullLogger ();
+ project.Logger = expectedLogger;
+ ILogger actualLogger = project.Logger;
+
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void PackageInstalled_PackagerManagerPackageInstalledEventFired_EventFiresWithPackage ()
+ {
+ CreateProject ();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageInstalled += (sender, e) => eventArgs = e;
+
+ var expectedEventArgs = new PackageOperationEventArgs (new FakePackage (), null, String.Empty);
+ fakePackageManager.FirePackageInstalled (expectedEventArgs);
+
+ Assert.AreEqual (expectedEventArgs, eventArgs);
+ }
+
+ [Test]
+ public void PackageUninstalled_PackagerManagerPackageUninstalledEventFired_EventFiresWithPackage ()
+ {
+ CreateProject ();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageUninstalled += (sender, e) => eventArgs = e;
+
+ var expectedEventArgs = new PackageOperationEventArgs (new FakePackage (), null, String.Empty);
+ fakePackageManager.FirePackageUninstalled (expectedEventArgs);
+
+ Assert.AreEqual (expectedEventArgs, eventArgs);
+ }
+
+ [Test]
+ public void PackageReferenceAdded_ProjectManagerPackageReferenceAddedEventFired_EventFiresWithPackage ()
+ {
+ CreateProject ();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageReferenceAdded += (sender, e) => eventArgs = e;
+
+ var expectedPackage = new FakePackage ();
+ fakeProjectManager.FirePackageReferenceAdded (expectedPackage);
+
+ Assert.AreEqual (expectedPackage, eventArgs.Package);
+ }
+
+ [Test]
+ public void PackageReferenceRemoved_ProjectManagerPackageReferenceRemovedEventFired_EventFiresWithPackage ()
+ {
+ CreateProject ();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageReferenceRemoved += (sender, e) => eventArgs = e;
+
+ var expectedPackage = new FakePackage ();
+ fakeProjectManager.FirePackageReferenceRemoved (expectedPackage);
+
+ Assert.AreEqual (expectedPackage, eventArgs.Package);
+ }
+
+ [Test]
+ public void Name_MSBuildProjectNameIsSet_ReturnsMSBuildProjectName ()
+ {
+ CreateProject ();
+ fakeProject.Name = "MyProject";
+
+ string name = project.Name;
+
+ Assert.AreEqual ("MyProject", name);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedAndPackageIsInstalled_ReturnsTrue ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = true;
+
+ bool installed = project.IsPackageInstalled ("Test");
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedAndPackageIsNotInstalled_ReturnsFalse ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = false;
+
+ bool installed = project.IsPackageInstalled ("Test");
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIdPassedPackageIsInstalled_PackageIdPassedToProjectManager ()
+ {
+ CreateProject ();
+ fakeProjectManager.IsInstalledReturnValue = false;
+
+ project.IsPackageInstalled ("Test");
+ string id = fakeProjectManager.PackageIdPassedToIsInstalled;
+
+ Assert.AreEqual ("Test", id);
+ }
+
+ [Test]
+ public void GetPackagesInReverseDependencyOrder_TwoPackages_ReturnsPackagesFromProjectLocalRepositoryInCorrectOrder ()
+ {
+ CreateProject ();
+ FakePackage packageA = fakeProjectManager.FakeLocalRepository.AddFakePackageWithVersion ("A", "1.0");
+ FakePackage packageB = fakeProjectManager.FakeLocalRepository.AddFakePackageWithVersion ("B", "1.0");
+
+ packageB.DependenciesList.Add (new PackageDependency ("A"));
+
+ var expectedPackages = new FakePackage[] {
+ packageB,
+ packageA
+ };
+
+ IEnumerable<IPackage> packages = project.GetPackagesInReverseDependencyOrder ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void InstallPackage_AllowPrereleaseVersionsIsTrue_PrereleaseVersionsAreNotAllowedWhenPackageIsInstalled ()
+ {
+ CreateProject ();
+ CreateFakeInstallAction ()
+ .AllowPrereleaseVersions = false;
+ project.InstallPackage (null, fakeInstallAction);
+
+ Assert.IsFalse (fakePackageManager.AllowPrereleaseVersionsPassedToInstallPackage);
+ }
+
+ [Test]
+ public void InstallPackage_AllowPrereleaseVersionsIsFalse_PrereleaseVersionsAreAllowedWhenPackageIsInstalled ()
+ {
+ CreateProject ();
+ CreateFakeInstallAction ()
+ .AllowPrereleaseVersions = true;
+ project.InstallPackage (null, fakeInstallAction);
+
+ Assert.IsTrue (fakePackageManager.AllowPrereleaseVersionsPassedToInstallPackage);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_AllowPrereleaseVersionsIsTrue_PrereleaseVersionsAllowedWhenRetrievingPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .AllowPrereleaseVersions = true;
+
+ project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ Assert.IsTrue (fakePackageManager.AllowPrereleaseVersionsPassedToGetInstallPackageOperations);
+ }
+
+ [Test]
+ public void GetInstallPackageOperations_AllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedWhenRetrievingPackageOperations ()
+ {
+ CreateProject ();
+ var package = new FakePackage ();
+ CreateFakeInstallAction ()
+ .AllowPrereleaseVersions = false;
+
+ project.GetInstallPackageOperations (package, fakeInstallAction);
+
+ Assert.IsFalse (fakePackageManager.AllowPrereleaseVersionsPassedToGetInstallPackageOperations);
+ }
+
+ [Test]
+ public void UpdatePackage_AllowPrereleaseVersionsIsTrue_PrereleaseVersionsNotAllowedWhenPackageIsUpdated ()
+ {
+ CreateProject ();
+ CreateFakeUpdateAction ()
+ .AllowPrereleaseVersions = true;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ Assert.IsTrue (fakePackageManager.AllowPrereleaseVersionsPassedToInstallPackage);
+ }
+
+ [Test]
+ public void UpdatePackage_AllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedWhenPackageIsUpdated ()
+ {
+ CreateProject ();
+ CreateFakeUpdateAction ()
+ .AllowPrereleaseVersions = false;
+
+ project.UpdatePackage (null, fakeUpdateAction);
+
+ Assert.IsFalse (fakePackageManager.AllowPrereleaseVersionsPassedToInstallPackage);
+ }
+
+ [Test]
+ public void UpdatePackages_ActionHasOperationsAndPackages_ActionPassedToPackageManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+
+ project.UpdatePackages (updatePackagesAction);
+
+ Assert.AreEqual (updatePackagesAction, fakePackageManager.UpdatePackagesActionsPassedToUpdatePackages);
+ }
+
+ [Test]
+ public void GetUpdatePackagesOperations_ActionPassed_ActionPassedToPackageManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ var expectedPackages = new FakePackage[] { new FakePackage ("Test") };
+ updatePackagesAction.AddPackages (expectedPackages);
+
+ project.GetUpdatePackagesOperations (updatePackagesAction.Packages, updatePackagesAction);
+
+ Assert.AreEqual (updatePackagesAction, fakePackageManager.SettingsPassedToGetUpdatePackageOperations);
+ Assert.AreEqual (expectedPackages, fakePackageManager.PackagesPassedToGetUpdatePackageOperations);
+ }
+
+ [Test]
+ public void GetUpdatePackagesOperations_ActionPassed_PackageOperationsReturned ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ List<PackageOperation> expectedOperations = PackageOperationHelper.CreateListWithOneInstallOperationWithFile ("readme.txt");
+ fakePackageManager.PackageOperationsToReturnFromGetUpdatePackageOperations = expectedOperations;
+
+ IEnumerable<PackageOperation> operations = project.GetUpdatePackagesOperations (updatePackagesAction.Packages, updatePackagesAction);
+
+ CollectionAssert.AreEqual (expectedOperations, operations);
+ }
+
+ [Test]
+ public void RunPackageOperations_OneOperation_PackageOperationsRunByPackageManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ List<PackageOperation> expectedOperations = PackageOperationHelper.CreateListWithOneInstallOperationWithFile ("readme.txt");
+
+ project.RunPackageOperations (expectedOperations);
+
+ CollectionAssert.AreEqual (expectedOperations, fakePackageManager.PackageOperationsPassedToRunPackageOperations);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_TestPackage_PackagePassedToProjectManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ var expectedPackage = new FakePackage ("Test");
+
+ project.HasOlderPackageInstalled (expectedPackage);
+
+ Assert.AreEqual (expectedPackage, fakeProjectManager.PackagePassedToHasOlderPackageInstalled);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_PackageIsInstalled_ReturnsTrue ()
+ {
+ CreateProject ();
+ fakeProjectManager.HasOlderPackageInstalledReturnValue = true;
+ var package = new FakePackage ("Test");
+
+ bool installed = project.HasOlderPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void HasOlderPackageInstalled_PackageIsNotInstalled_ReturnsFalse ()
+ {
+ CreateProject ();
+ fakeProjectManager.HasOlderPackageInstalledReturnValue = false;
+ var package = new FakePackage ("Test");
+
+ bool installed = project.HasOlderPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void UpdatePackageReference_PackageAndUpdateActionPassed_BothPassedToPackageManager ()
+ {
+ CreateProject ();
+ CreateUpdatePackagesAction ();
+ var package = new FakePackage ("Test");
+
+ project.UpdatePackageReference (package, updatePackagesAction);
+
+ Assert.AreEqual (package, fakePackageManager.PackagePassedToUpdatePackageReference);
+ Assert.AreEqual (updatePackagesAction, fakePackageManager.SettingsPassedToUpdatePackageReference);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectsTests.cs
new file mode 100644
index 0000000000..84572f65f1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSelectedProjectsTests.cs
@@ -0,0 +1,536 @@
+//
+// PackageManagementSelectedProjectsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementSelectedProjectsTests
+ {
+ PackageManagementSelectedProjects selectedProjects;
+ FakePackageManagementSolution fakeSolution;
+
+ void CreateSelectedProjects ()
+ {
+ selectedProjects = new PackageManagementSelectedProjects (fakeSolution);
+ }
+
+ void CreateFakeSolution ()
+ {
+ fakeSolution = new FakePackageManagementSolution ();
+ }
+
+ List<FakeDotNetProject> AddSolutionWithOneProjectToProjectService ()
+ {
+ FakeDotNetProject project = ProjectHelper.CreateTestProject ("Test1");
+ fakeSolution.FakeDotNetProjects.Add (project);
+
+ return fakeSolution.FakeDotNetProjects;
+ }
+
+ List<FakeDotNetProject> AddSolutionWithTwoProjectsToProjectService ()
+ {
+ ISolution solution = ProjectHelper.CreateSolution ();
+ FakeDotNetProject project1 = ProjectHelper.CreateTestProject (solution, "Test1");
+ FakeDotNetProject project2 = ProjectHelper.CreateTestProject ("Test2");
+
+ fakeSolution.FakeDotNetProjects.Add (project1);
+ fakeSolution.FakeDotNetProjects.Add (project2);
+
+ return fakeSolution.FakeDotNetProjects;
+ }
+
+ void NoProjectsSelected ()
+ {
+ fakeSolution.NoProjectsSelected ();
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjectsAndOneProjectSelectedInProjectsBrowser_ReturnsProjectSelectedInProjects ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject project = projectsAddedToSolution [1];
+ project.Name = "MyProject";
+ fakeSolution.FakeActiveDotNetProject = project;
+
+ var fakeProject = fakeSolution.AddFakeProjectToReturnFromGetProject ("MyProject");
+ CreateSelectedProjects ();
+
+ var fakePackage = new FakePackage ();
+ var projects = new List<IPackageManagementSelectedProject> ();
+ projects.AddRange (selectedProjects.GetProjects (fakePackage));
+
+ var expectedProject = new PackageManagementSelectedProject ("MyProject", selected: false, enabled: true);
+ var expectedProjects = new List<IPackageManagementSelectedProject> ();
+ expectedProjects.Add (expectedProject);
+
+ SelectedProjectCollectionAssert.AreEqual (expectedProjects, projects);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjectsAndOneProjectSelectedInitiallyAndGetProjectsCalledAgainAfterNoProjectsAreSelected_ReturnsProjectSelectedInProjects ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject project = projectsAddedToSolution [1];
+ project.Name = "MyProject";
+ fakeSolution.FakeActiveDotNetProject = project;
+
+ var fakeProject = fakeSolution.AddFakeProjectToReturnFromGetProject ("MyProject");
+ CreateSelectedProjects ();
+
+ var fakePackage = new FakePackage ();
+ var projects = new List<IPackageManagementSelectedProject> ();
+ projects.AddRange (selectedProjects.GetProjects (fakePackage));
+
+ projects.Clear ();
+
+ NoProjectsSelected ();
+ projects.AddRange (selectedProjects.GetProjects (fakePackage));
+
+ var expectedProject = new PackageManagementSelectedProject ("MyProject", selected: false, enabled: true);
+ var expectedProjects = new List<IPackageManagementSelectedProject> ();
+ expectedProjects.Add (expectedProject);
+
+ SelectedProjectCollectionAssert.AreEqual (expectedProjects, projects);
+ }
+
+ [Test]
+ public void HasMultipleProjects_SolutionHasTwoProjectsAndOneProjectSelectedInProjectsBrowser_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject expectedProject = projectsAddedToSolution [1];
+ fakeSolution.FakeActiveDotNetProject = expectedProject;
+ CreateSelectedProjects ();
+
+ bool hasMultipleProjects = selectedProjects.HasMultipleProjects ();
+
+ Assert.IsFalse (hasMultipleProjects);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjectsAndNoProjectSelectedInProjectsBrowser_ReturnsAllProjectsInSolutionForPackage ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ projectsAddedToSolution [0].Name = "Project A";
+ projectsAddedToSolution [1].Name = "Project B";
+ fakeSolution.FakeActiveProject = null;
+
+ fakeSolution.AddFakeProjectToReturnFromGetProject ("Project A");
+ fakeSolution.AddFakeProjectToReturnFromGetProject ("Project B");
+ CreateSelectedProjects ();
+
+ var fakePackage = new FakePackage ();
+ var projects = new List<IPackageManagementSelectedProject> ();
+ projects.AddRange (selectedProjects.GetProjects (fakePackage));
+
+ var expectedProjects = new List<IPackageManagementSelectedProject> ();
+ expectedProjects.Add (new PackageManagementSelectedProject ("Project A", selected: false, enabled: true));
+ expectedProjects.Add (new PackageManagementSelectedProject ("Project B", selected: false, enabled: true));
+
+ SelectedProjectCollectionAssert.AreEqual (expectedProjects, projects);
+ }
+
+ [Test]
+ public void HasMultipleProjects_SolutionHasTwoProjectsAndNoProjectSelectedInProjectsBrowser_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveProject = null;
+ CreateSelectedProjects ();
+
+ bool hasMultipleProjects = selectedProjects.HasMultipleProjects ();
+
+ Assert.IsTrue (hasMultipleProjects);
+ }
+
+ [Test]
+ public void HasMultipleProjects_SolutionHasOneProjectAndNoProjectSelectedInProjectsBrowser_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithOneProjectToProjectService ();
+ fakeSolution.FakeActiveProject = null;
+ CreateSelectedProjects ();
+
+ bool hasMultipleProjects = selectedProjects.HasMultipleProjects ();
+
+ Assert.IsFalse (hasMultipleProjects);
+ }
+
+ [Test]
+ public void SelectionName_SolutionHasOneProject_ReturnsProjectNameWithoutFileExtension ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithOneProjectToProjectService ();
+ projectsAddedToSolution [0].Name = "MyProject";
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ string name = selectedProjects.SelectionName;
+
+ Assert.AreEqual ("MyProject", name);
+ }
+
+ [Test]
+ public void SelectionName_SolutionHasTwoProjectsAndNoProjectSelected_ReturnsSolutionFileNameWithoutFullPath ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ fakeSolution.FileName = @"d:\projects\MyProject\MySolution.sln";
+ CreateSelectedProjects ();
+
+ string name = selectedProjects.SelectionName;
+
+ Assert.AreEqual ("MySolution.sln", name);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackageInstalledInSolutionWithTwoProjectsAndNoProjectSelected_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeInstalledPackages.Add (package);
+ CreateSelectedProjects ();
+
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackageIsInstalledInSolutionWithTwoProjectsAndNoProjectSelected_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ CreateSelectedProjects ();
+
+ var package = new FakePackage ("Test");
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackageIsInstalledInProjectAndProjectSelected_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeProjectToReturnFromGetProject.FakePackages.Add (package);
+ CreateSelectedProjects ();
+
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackageIsNotInstalledInProjectAndProjectSelected_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var package = new FakePackage ("Test");
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalled_PackagePackageIsNotInstalledInProjectAndProjectSelected_ProjectCreatedUsingPackageRepository ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var package = new FakePackage ("Test");
+ bool installed = selectedProjects.IsPackageInstalled (package);
+
+ IPackageRepository repository = fakeSolution.RepositoryPassedToGetProject;
+ IPackageRepository expectedRepository = package.FakePackageRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void IsPackageInstalledInSolution_PackageInstalledInSolutionWithTwoProjectsAndOneProjectSelected_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeInstalledPackages.Add (package);
+ CreateSelectedProjects ();
+
+ bool installed = selectedProjects.Solution.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsPackageInstalledInSolution_PackageNotInstalledInSolutionWithTwoProjectsAndOneProjectSelected_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var package = new FakePackage ("Test");
+
+ bool installed = selectedProjects.Solution.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void GetPackagesInstalledInSolution_PackageInstalledInSolutionAndProjectNotSelected_ReturnsPackageInstalledInSolution ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeInstalledPackages.Add (package);
+ CreateSelectedProjects ();
+
+ IQueryable<IPackage> packages = selectedProjects.Solution.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetSingleProjectSelected_ProjectSelected_ReturnsProject ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IPackageManagementProject project = selectedProjects.GetSingleProjectSelected (repository);
+
+ FakePackageManagementProject expectedProject = fakeSolution.FakeProjectToReturnFromGetProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetSingleProjectSelected_ProjectSelectedAndRepositoryPassed_ReturnsProjectCreatedWithRepository ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IPackageManagementProject project = selectedProjects.GetSingleProjectSelected (repository);
+
+ Assert.AreEqual (repository, fakeSolution.RepositoryPassedToGetProject);
+ }
+
+ [Test]
+ public void GetSingleProjectSelected_NoProjectSelectedAndRepositoryPassed_ReturnsProjectCreatedWithRepository ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IPackageManagementProject project = selectedProjects.GetSingleProjectSelected (repository);
+
+ Assert.AreEqual (repository, fakeSolution.RepositoryPassedToGetProject);
+ }
+
+ [Test]
+ public void HasSingleProjectSelected_SolutionHasTwoProjectsAndOneProjectSelectedInProjectsBrowser_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject expectedProject = projectsAddedToSolution [1];
+ fakeSolution.FakeActiveDotNetProject = expectedProject;
+ CreateSelectedProjects ();
+
+ bool singleProjectSelected = selectedProjects.HasSingleProjectSelected ();
+
+ Assert.IsTrue (singleProjectSelected);
+ }
+
+ [Test]
+ public void HasSingleProjectSelected_SolutionHasTwoProjectsAndNoProjectsSelectedInProjectsBrowser_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ CreateSelectedProjects ();
+
+ bool singleProjectSelected = selectedProjects.HasSingleProjectSelected ();
+
+ Assert.IsFalse (singleProjectSelected);
+ }
+
+ [Test]
+ public void HasSingleProjectSelected_NoProjectsInitiallySelectedAndProjectSelectedAfterInitialCall_IsUnchangedAndReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ CreateSelectedProjects ();
+
+ bool singleProjectSelected = selectedProjects.HasSingleProjectSelected ();
+ fakeSolution.FakeActiveDotNetProject = fakeSolution.FakeDotNetProjects [0];
+ singleProjectSelected = selectedProjects.HasSingleProjectSelected ();
+
+ Assert.IsFalse (singleProjectSelected);
+ }
+
+ [Test]
+ public void GetInstalledPackages_PackageInstalledInSolutionAndProjectNotSelected_ReturnsPackageInstalledInSolution ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+
+ var package = new FakePackage ("Test");
+ fakeSolution.FakeInstalledPackages.Add (package);
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IQueryable<IPackage> packages = selectedProjects.GetInstalledPackages (repository);
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetInstalledPackages_PackageInstalledInProjectAndProjectIsSelected_ReturnsPackageInstalledInProject ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ fakeSolution.FakeActiveDotNetProject.Name = "MyProject";
+
+ var package = new FakePackage ("Test");
+ var project = new FakePackageManagementProject ("MyProject");
+ project.FakePackages.Add (package);
+ fakeSolution.FakeProjectsToReturnFromGetProject.Add ("MyProject", project);
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IQueryable<IPackage> packages = selectedProjects.GetInstalledPackages (repository);
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetInstalledPackages_PackageInstalledInProjectAndProjectIsSelected_CreatesProjectUsingRepository ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ fakeSolution.FakeActiveDotNetProject = projectsAddedToSolution [0];
+ CreateSelectedProjects ();
+
+ var expectedRepository = new FakePackageRepository ();
+ IQueryable<IPackage> packages = selectedProjects.GetInstalledPackages (expectedRepository);
+
+ IPackageRepository repository = fakeSolution.RepositoryPassedToGetProject;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetSingleProjectSelected_NoProjectSelected_ReturnsNull ()
+ {
+ CreateFakeSolution ();
+ AddSolutionWithTwoProjectsToProjectService ();
+ NoProjectsSelected ();
+ CreateSelectedProjects ();
+
+ var repository = new FakePackageRepository ();
+ IPackageManagementProject project = selectedProjects.GetSingleProjectSelected (repository);
+
+ Assert.IsNull (project);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjectsAndOneProjectSelectedInitiallyAndActiveProjectChangedInSolutionAfterInstanceCreated_ReturnsProjectSelectedInProjects ()
+ {
+ CreateFakeSolution ();
+ List<FakeDotNetProject> projectsAddedToSolution = AddSolutionWithTwoProjectsToProjectService ();
+ FakeDotNetProject project = projectsAddedToSolution [1];
+ project.Name = "MyProject";
+ fakeSolution.FakeActiveDotNetProject = project;
+ var fakeProject = fakeSolution.AddFakeProjectToReturnFromGetProject ("MyProject");
+ CreateSelectedProjects ();
+
+ NoProjectsSelected ();
+
+ var fakePackage = new FakePackage ();
+ List<IPackageManagementSelectedProject> projects = selectedProjects.GetProjects (fakePackage).ToList ();
+
+ var expectedProject = new PackageManagementSelectedProject ("MyProject", selected: false, enabled: true);
+ var expectedProjects = new List<IPackageManagementSelectedProject> ();
+ expectedProjects.Add (expectedProject);
+
+ SelectedProjectCollectionAssert.AreEqual (expectedProjects, projects);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSolutionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSolutionTests.cs
new file mode 100644
index 0000000000..b46171479a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageManagementSolutionTests.cs
@@ -0,0 +1,665 @@
+//
+// PackageManagementSolutionTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageManagementSolutionTests
+ {
+ PackageManagementSolution solution;
+ FakeRegisteredPackageRepositories fakeRegisteredPackageRepositories;
+ OneRegisteredPackageSourceHelper packageSourcesHelper;
+ FakePackageManagementProjectService fakeProjectService;
+ FakePackageManagementProjectFactory fakeProjectFactory;
+ FakeDotNetProject testProject;
+ FakeSolutionPackageRepositoryFactory fakeSolutionPackageRepositoryFactory;
+ FakeSolutionPackageRepository fakeSolutionPackageRepository;
+
+ void CreatePackageSources ()
+ {
+ packageSourcesHelper = new OneRegisteredPackageSourceHelper ();
+ }
+
+ void CreateSolution ()
+ {
+ CreatePackageSources ();
+ CreateSolution (packageSourcesHelper.Options);
+ }
+
+ void CreateSolution (PackageManagementOptions options)
+ {
+ testProject = ProjectHelper.CreateTestProject ();
+ fakeRegisteredPackageRepositories = new FakeRegisteredPackageRepositories ();
+ fakeProjectFactory = new FakePackageManagementProjectFactory ();
+ fakeProjectService = new FakePackageManagementProjectService ();
+
+ fakeProjectService.CurrentProject = testProject;
+ fakeProjectService.OpenSolution = testProject.ParentSolution;
+
+ fakeSolutionPackageRepositoryFactory = new FakeSolutionPackageRepositoryFactory ();
+ fakeSolutionPackageRepository = fakeSolutionPackageRepositoryFactory.FakeSolutionPackageRepository;
+
+ solution =
+ new PackageManagementSolution (
+ fakeRegisteredPackageRepositories,
+ fakeProjectService,
+ fakeProjectFactory,
+ fakeSolutionPackageRepositoryFactory);
+ }
+
+ FakeDotNetProject AddProjectToOpenProjects (string projectName)
+ {
+ FakeDotNetProject project = ProjectHelper.CreateTestProject (projectName);
+ fakeProjectService.OpenProjects.Add (project);
+ return project;
+ }
+
+ FakePackage AddPackageInReverseDependencyOrderToSolution (string packageId)
+ {
+ var package = new FakePackage (packageId);
+ fakeSolutionPackageRepository.FakePackagesByReverseDependencyOrder.Add (package);
+ return package;
+ }
+
+ [Test]
+ public void GetActiveProject_ProjectIsSelected_CreatesProjectUsingCurrentProjectSelectedInSharpDevelop ()
+ {
+ CreateSolution ();
+
+ IPackageManagementProject activeProject = solution.GetActiveProject ();
+ IProject actualProject = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (testProject, actualProject);
+ }
+
+ [Test]
+ public void GetActiveProject_ProjectIsSelected_CreatesProjectUsingAggregateRepository ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = new FakeDotNetProject ();
+
+ IPackageManagementProject activeProject = solution.GetActiveProject ();
+
+ IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+ IPackageRepository expectedRepository = fakeRegisteredPackageRepositories.FakeAggregateRepository;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetActiveProject_ProjectIsSelected_ReturnsProjectCreatedByFactory ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = new FakeDotNetProject ();
+
+ IPackageManagementProject activeProject = solution.GetActiveProject ();
+ IPackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, activeProject);
+ }
+
+ [Test]
+ public void GetActiveProject_RepositoryPassed_CreatesProjectUsingRepository ()
+ {
+ CreateSolution ();
+ var expectedRepository = new FakePackageRepository ();
+ solution.GetActiveProject (expectedRepository);
+
+ IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetActiveProject_RepositoryPassed_CreatesProjectUsingCurrentActiveProject ()
+ {
+ CreateSolution ();
+ var expectedRepository = new FakePackageRepository ();
+ FakeDotNetProject expectedProject = ProjectHelper.CreateTestProject ();
+ fakeProjectService.CurrentProject = expectedProject;
+
+ solution.GetActiveProject (expectedRepository);
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetActiveProject_RepositoryPassed_ReturnsProjectFromProjectFactory ()
+ {
+ CreateSolution ();
+ var expectedRepository = new FakePackageRepository ();
+ IPackageManagementProject project = solution.GetActiveProject (expectedRepository);
+
+ FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesSourceAndProjectNamePassed_CreatesProjectUsingFoundProjectMatchingName ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var source = new PackageSource ("http://sharpdevelop.net");
+
+ solution.GetProject (source, "Test");
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesSourceAndProjectNameWithDifferentCasePassed_CreatesProjectUsingFoundProjectMatchingName ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var source = new PackageSource ("http://sharpdevelop.net");
+
+ solution.GetProject (source, "TEST");
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesSourceAndProjectPassed_ReturnsProjectFromProjectFactory ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("Test");
+ var source = new PackageSource ("http://sharpdevelop.net");
+ IPackageManagementProject project = solution.GetProject (source, "Test");
+
+ FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesSourceAndProjectPassed_PackageSourceUsedToCreateRepository ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("Test");
+ var expectedSource = new PackageSource ("http://sharpdevelop.net");
+ IPackageManagementProject project = solution.GetProject (expectedSource, "Test");
+
+ PackageSource actualSource = fakeRegisteredPackageRepositories.PackageSourcePassedToCreateRepository;
+
+ Assert.AreEqual (expectedSource, actualSource);
+ }
+
+ [Test]
+ public void GetProject_PackagesRepositoryAndProjectNamePassed_CreatesProjectUsingFoundProjectMatchingName ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ solution.GetProject (repository, "Test");
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesRepositoryAndProjectPassed_CreatesProjectUsingProjectPassed ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ solution.GetProject (repository, expectedProject);
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesRepositoryAndProjectPassed_ReturnsProjectCreatedFromProjectFactory ()
+ {
+ CreateSolution ();
+ FakeDotNetProject msbuildProject = AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ IPackageManagementProject project = solution.GetProject (repository, msbuildProject);
+
+ FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_PackagesRepositoryAndProjectPassed_CreatesProjectUsingRepository ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var expectedRepository = new FakePackageRepository ();
+
+ solution.GetProject (expectedRepository, expectedProject);
+
+ IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetProject_RepositoryAndProjectNameWithDifferentCasePassed_CreatesProjectUsingFoundProjectMatchingName ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ solution.GetProject (repository, "TEST");
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_RepositoryAndProjectNamePassed_ReturnsProject ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("Test");
+ var repository = new FakePackageRepository ();
+
+ IPackageManagementProject project = solution.GetProject (repository, "Test");
+
+ FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProject_RepositoryAndProjectNamePassed_RepositoryUsedToCreateProject ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("Test");
+ var expectedRepository = new FakePackageRepository ();
+
+ solution.GetProject (expectedRepository, "Test");
+
+ IPackageRepository actualRepository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+
+ Assert.AreEqual (expectedRepository, actualRepository);
+ }
+
+ [Test]
+ public void GetMSBuildProjects_TwoProjectsInOpenSolution_ReturnsTwoProjects ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("A");
+ AddProjectToOpenProjects ("B");
+
+ IEnumerable<IDotNetProject> projects = solution.GetDotNetProjects ();
+ IEnumerable<IDotNetProject> expectedProjects = fakeProjectService.OpenProjects;
+
+ CollectionAssert.AreEqual (expectedProjects, projects);
+ }
+
+ [Test]
+ public void IsOpen_NoSolutionOpen_ReturnsFalse ()
+ {
+ CreateSolution ();
+ fakeProjectService.OpenSolution = null;
+
+ bool open = solution.IsOpen;
+
+ Assert.IsFalse (open);
+ }
+
+ [Test]
+ public void IsOpen_SolutionIsOpen_ReturnsTrue ()
+ {
+ CreateSolution ();
+ fakeProjectService.OpenSolution = new FakeSolution ();
+
+ bool open = solution.IsOpen;
+
+ Assert.IsTrue (open);
+ }
+
+ [Test]
+ public void GetActiveMSBuildProject_CurrentProjectIsSetInProjectService_ReturnsProjectCurrentlySelected ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = testProject;
+
+ IProject activeProject = solution.GetActiveDotNetProject ();
+
+ Assert.AreEqual (testProject, activeProject);
+ }
+
+ [Test]
+ public void HasMultipleProjects_OneProjectInSolution_ReturnsFalse ()
+ {
+ CreateSolution ();
+ FakeDotNetProject project = ProjectHelper.CreateTestProject ();
+ fakeProjectService.OpenProjects.Add (project);
+
+ bool hasMultipleProjects = solution.HasMultipleProjects ();
+
+ Assert.IsFalse (hasMultipleProjects);
+ }
+
+ [Test]
+ public void HasMultipleProjects_TwoProjectsInSolution_ReturnsTrue ()
+ {
+ CreateSolution ();
+ FakeDotNetProject project1 = ProjectHelper.CreateTestProject ();
+ fakeProjectService.OpenProjects.Add (project1);
+ FakeDotNetProject project2 = ProjectHelper.CreateTestProject ();
+ fakeProjectService.OpenProjects.Add (project2);
+
+ bool hasMultipleProjects = solution.HasMultipleProjects ();
+
+ Assert.IsTrue (hasMultipleProjects);
+ }
+
+ [Test]
+ public void FileName_SolutionHasFileName_ReturnsSolutionFileName ()
+ {
+ CreateSolution ();
+ string expectedFileName = @"d:\projects\myproject\Project.sln";
+ var solution = new FakeSolution (expectedFileName);
+ fakeProjectService.OpenSolution = solution;
+
+ string fileName = this.solution.FileName;
+
+ Assert.AreEqual (expectedFileName, fileName);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsInstalledInSolutionLocalRepository_ReturnsTrue ()
+ {
+ CreateSolution ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (package);
+
+ bool installed = solution.IsPackageInstalled (package);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsNotInstalledInSolutionLocalRepository_ReturnsFalse ()
+ {
+ CreateSolution ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+
+ bool installed = solution.IsPackageInstalled (package);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsNotInstalledInSolutionLocalRepository_ActivSolutionUsedToCreateSolutionPackageRepository ()
+ {
+ CreateSolution ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+
+ solution.IsPackageInstalled (package);
+
+ ISolution expectedSolution = fakeProjectService.OpenSolution;
+ ISolution solutionUsedToCreateSolutionPackageRepository =
+ fakeSolutionPackageRepositoryFactory.SolutionPassedToCreateSolutionPackageRepository;
+
+ Assert.AreEqual (expectedSolution, solutionUsedToCreateSolutionPackageRepository);
+ }
+
+ [Test]
+ public void GetActiveProject_SolutionOpenButNoProjectSelected_ReturnsNull ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+
+ IPackageManagementProject activeProject = solution.GetActiveProject ();
+
+ Assert.IsNull (activeProject);
+ }
+
+ [Test]
+ public void GetActiveProject_RepositoryPassedWhenSolutionOpenButNoProjectSelected_ReturnsNull ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+
+ var repository = new FakePackageRepository ();
+ IPackageManagementProject activeProject = solution.GetActiveProject (repository);
+
+ Assert.IsNull (activeProject);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageInSolutionRepository_ReturnsOnePackage ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (package);
+ FakeDotNetProject testProject = AddProjectToOpenProjects ("Test");
+ var project = new FakePackageManagementProject ();
+ fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => {
+ return project;
+ };
+ project.FakePackages.Add (package);
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ package
+ };
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackagesInReverseDependencyOrder_TwoPackages_ReturnsPackagesFromSolutionLocalRepositoryInCorrectOrder ()
+ {
+ CreateSolution ();
+ FakePackage packageA = AddPackageInReverseDependencyOrderToSolution ("A");
+ FakePackage packageB = AddPackageInReverseDependencyOrderToSolution ("A");
+
+ packageB.DependenciesList.Add (new PackageDependency ("A"));
+
+ var expectedPackages = new FakePackage[] {
+ packageB,
+ packageA
+ };
+
+ IEnumerable<IPackage> packages = solution.GetPackagesInReverseDependencyOrder ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasOneProject_ReturnsOneProject ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("MyProject");
+ var repository = new FakePackageRepository ();
+ List<IPackageManagementProject> projects = solution.GetProjects (repository).ToList ();
+
+ Assert.AreEqual (1, projects.Count);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasOneProject_RepositoryUsedToCreateProject ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("MyProject");
+ var expectedRepository = new FakePackageRepository ();
+ List<IPackageManagementProject> projects = solution.GetProjects (expectedRepository).ToList ();
+
+ IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject;
+
+ Assert.AreEqual (expectedRepository, repository);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasOneProject_MSBuildProjectUsedToCreateProject ()
+ {
+ CreateSolution ();
+ FakeDotNetProject expectedProject = AddProjectToOpenProjects ("MyProject");
+ var repository = new FakePackageRepository ();
+ List<IPackageManagementProject> projects = solution.GetProjects (repository).ToList ();
+
+ IDotNetProject project = fakeProjectFactory.FirstProjectPassedToCreateProject;
+
+ Assert.AreEqual (expectedProject, project);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasNoProjects_ReturnsNoProjects ()
+ {
+ CreateSolution ();
+ var repository = new FakePackageRepository ();
+ List<IPackageManagementProject> projects = solution.GetProjects (repository).ToList ();
+
+ Assert.AreEqual (0, projects.Count);
+ }
+
+ [Test]
+ public void GetProjects_SolutionHasTwoProjects_ReturnsTwoProjects ()
+ {
+ CreateSolution ();
+ AddProjectToOpenProjects ("One");
+ AddProjectToOpenProjects ("Two");
+ var repository = new FakePackageRepository ();
+ List<IPackageManagementProject> projects = solution.GetProjects (repository).ToList ();
+
+ Assert.AreEqual (2, projects.Count);
+ }
+
+ [Test]
+ public void GetInstallPath_OnePackageInSolutionRepository_ReturnsPackageInstallPath ()
+ {
+ CreateSolution ();
+ FakePackage package = FakePackage.CreatePackageWithVersion ("Test", "1.3.4.5");
+ string expectedInstallPath = @"d:\projects\MyProject\packages\TestPackage";
+ fakeSolutionPackageRepository.InstallPathToReturn = expectedInstallPath;
+
+ string installPath = solution.GetInstallPath (package);
+
+ Assert.AreEqual (expectedInstallPath, installPath);
+ Assert.AreEqual (package, fakeSolutionPackageRepository.PackagePassedToGetInstallPath);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageInstalledIntoOneProjectButTwoPackagesInSolutionRepository_ReturnsOnePackageInstalledInProject ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ FakeDotNetProject testProject = AddProjectToOpenProjects ("Test");
+ var project = new FakePackageManagementProject ();
+ fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => {
+ return project;
+ };
+ FakePackage notInstalledPackage = FakePackage.CreatePackageWithVersion ("NotInstalled", "1.0.0.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (notInstalledPackage);
+ FakePackage installedPackage = FakePackage.CreatePackageWithVersion ("Installed", "1.0.0.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (installedPackage);
+ project.FakePackages.Add (installedPackage);
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ installedPackage
+ };
+
+ Assert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageInstalledIntoOneProjectButTwoPackagesInSolutionRepository_ReturnsOnlyOneProjectPackage ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ FakeDotNetProject testProject = AddProjectToOpenProjects ("Test");
+ var project = new FakePackageManagementProject ();
+ fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => {
+ return project;
+ };
+ FakePackage installedSolutionPackage = FakePackage.CreatePackageWithVersion ("SolutionPackage", "1.0.0.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (installedSolutionPackage);
+ FakePackage installedProjectPackage = FakePackage.CreatePackageWithVersion ("ProjectPackage", "1.0.0.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (installedProjectPackage);
+ project.FakePackages.Add (installedProjectPackage);
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ installedProjectPackage
+ };
+
+ Assert.AreEqual (expectedPackages, packages);
+ }
+
+ [Test]
+ public void GetPackages_TwoProjectsButNoPackagesInstalledInProjects_PackageProjectsCreatedUsingActiveRepository ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ FakeDotNetProject testProject1 = AddProjectToOpenProjects ("Test1");
+ FakeDotNetProject testProject2 = AddProjectToOpenProjects ("Test2");
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ Assert.AreEqual (testProject1, fakeProjectFactory.ProjectsPassedToCreateProject [0]);
+ Assert.AreEqual (testProject2, fakeProjectFactory.ProjectsPassedToCreateProject [1]);
+ Assert.AreEqual (fakeRegisteredPackageRepositories.ActiveRepository, fakeProjectFactory.RepositoriesPassedToCreateProject [0]);
+ Assert.AreEqual (fakeRegisteredPackageRepositories.ActiveRepository, fakeProjectFactory.RepositoriesPassedToCreateProject [1]);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageInstalledIntoPackagesFolderOnly_ReturnsNoPackages ()
+ {
+ CreateSolution ();
+ fakeProjectService.CurrentProject = null;
+ FakePackage fakePackage = FakePackage.CreatePackageWithVersion ("One", "1.0");
+ fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add (fakePackage);
+
+ IQueryable<IPackage> packages = solution.GetPackages ();
+
+ var expectedPackages = new FakePackage [0];
+ Assert.AreEqual (expectedPackages, packages);
+ }
+ }
+}
+
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageViewModelTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageViewModelTests.cs
new file mode 100644
index 0000000000..1404501014
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageViewModelTests.cs
@@ -0,0 +1,772 @@
+//
+// PackageViewModelTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class PackageViewModelTests
+ {
+ TestablePackageViewModel viewModel;
+ FakePackage fakePackage;
+ FakePackageManagementSolution fakeSolution;
+ PackageManagementEvents packageManagementEvents;
+ FakeUninstallPackageAction fakeUninstallPackageAction;
+ FakeLogger fakeLogger;
+ List<PackageManagementSelectedProject> fakeSelectedProjects;
+ AvailablePackagesViewModel viewModelParent;
+
+ void CreateFakeSolution ()
+ {
+ fakeSolution = new FakePackageManagementSolution ();
+ fakeSolution.FakeActiveDotNetProject = ProjectHelper.CreateTestProject ();
+ }
+
+ void CreateViewModel ()
+ {
+ CreateFakeSolution ();
+ CreateViewModel (fakeSolution);
+ }
+
+ void CreateViewModel (FakePackageManagementSolution solution)
+ {
+ viewModelParent = CreateViewModelParent ();
+ viewModel = new TestablePackageViewModel (viewModelParent, solution);
+ fakePackage = viewModel.FakePackage;
+ this.fakeSolution = solution;
+ packageManagementEvents = viewModel.PackageManagementEvents;
+ fakeLogger = viewModel.FakeLogger;
+ fakeUninstallPackageAction = solution.FakeProjectToReturnFromGetProject.FakeUninstallPackageAction;
+ }
+
+ AvailablePackagesViewModel CreateViewModelParent ()
+ {
+ var taskFactory = new FakeTaskFactory ();
+ var registeredPackageRepositories = new FakeRegisteredPackageRepositories ();
+ var packageViewModelFactory = new FakePackageViewModelFactory ();
+ var packageManagementEvents = new PackageManagementEvents ();
+ var recentPackageRepository = new FakeRecentPackageRepository ();
+
+ return new AvailablePackagesViewModel (
+ registeredPackageRepositories,
+ recentPackageRepository,
+ packageViewModelFactory,
+ taskFactory);
+ }
+
+ void AddProjectToSolution ()
+ {
+ FakeDotNetProject project = ProjectHelper.CreateTestProject ();
+ fakeSolution.FakeDotNetProjects.Add (project);
+ }
+
+ void CreateViewModelWithTwoProjectsSelected (string projectName1, string projectName2)
+ {
+ CreateFakeSolution ();
+ AddTwoProjectsSelected (projectName1, projectName2);
+ CreateViewModel (fakeSolution);
+ }
+
+ void AddTwoProjectsSelected (string projectName1, string projectName2)
+ {
+ AddProjectToSolution ();
+ AddProjectToSolution ();
+ fakeSolution.FakeDotNetProjects [0].Name = projectName1;
+ fakeSolution.FakeDotNetProjects [1].Name = projectName2;
+ fakeSolution.NoProjectsSelected ();
+
+ fakeSolution.AddFakeProjectToReturnFromGetProject (projectName1);
+ fakeSolution.AddFakeProjectToReturnFromGetProject (projectName2);
+ }
+
+ void SetPackageIdAndVersion (string id, string version)
+ {
+ fakePackage.Id = id;
+ fakePackage.Version = new SemanticVersion (version);
+ }
+
+ void UserCancelsProjectSelection ()
+ {
+ packageManagementEvents.SelectProjects += (sender, e) => {
+ e.IsAccepted = false;
+ };
+ }
+
+ void UserAcceptsProjectSelection ()
+ {
+ packageManagementEvents.SelectProjects += (sender, e) => {
+ e.IsAccepted = true;
+ };
+ }
+
+ List<PackageManagementSelectedProject> CreateTwoFakeSelectedProjects ()
+ {
+ fakeSelectedProjects = new List<PackageManagementSelectedProject> ();
+ var projectA = new FakePackageManagementProject ("Project A");
+ fakeSelectedProjects.Add (new PackageManagementSelectedProject (projectA));
+
+ var projectB = new FakePackageManagementProject ("Project B");
+ fakeSelectedProjects.Add (new PackageManagementSelectedProject (projectB));
+ return fakeSelectedProjects;
+ }
+
+ FakePackageOperation AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance (PackageManagementSelectedProject selectedProject)
+ {
+ return AddFakeInstallPackageOperationWithPackage (selectedProject, requireLicenseAcceptance: true);
+ }
+
+ FakePackageOperation AddFakeInstallPackageOperationWithPackageThatDoesNotRequireLicenseAcceptance (PackageManagementSelectedProject selectedProject)
+ {
+ return AddFakeInstallPackageOperationWithPackage (selectedProject, requireLicenseAcceptance: false);
+ }
+
+ FakePackageOperation AddFakeInstallPackageOperationWithPackage (PackageManagementSelectedProject selectedProject, bool requireLicenseAcceptance)
+ {
+ var project = selectedProject.Project as FakePackageManagementProject;
+ FakePackageOperation operation = project.AddFakeInstallOperation ();
+ operation.FakePackage.RequireLicenseAcceptance = requireLicenseAcceptance;
+ return operation;
+ }
+
+ FakePackageOperation AddFakeUninstallPackageOperationWithPackageThatRequiresLicenseAcceptance (PackageManagementSelectedProject selectedProject)
+ {
+ var project = selectedProject.Project as FakePackageManagementProject;
+ FakePackageOperation uninstallOperation = project.AddFakeUninstallOperation ();
+ uninstallOperation.FakePackage.RequireLicenseAcceptance = true;
+ return uninstallOperation;
+ }
+
+ PackageManagementSelectedProject FirstFakeSelectedProject {
+ get { return fakeSelectedProjects [0]; }
+ }
+
+ PackageManagementSelectedProject SecondFakeSelectedProject {
+ get { return fakeSelectedProjects [1]; }
+ }
+
+ void ParentAllowsPrereleasePackages ()
+ {
+ viewModelParent.IncludePrerelease = true;
+ }
+
+ [Test]
+ public void AddPackageCommand_CommandExecuted_InstallsPackage ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+
+ viewModel.AddPackageCommand.Execute (null);
+
+ IPackage package = fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated.Package;
+ Assert.AreEqual (fakePackage, package);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_SourcePackageRepositoryUsedToCreateProject ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+
+ viewModel.AddPackage ();
+
+ Assert.AreEqual (fakePackage.Repository, fakeSolution.RepositoryPassedToGetProject);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_PackageOperationsUsedWhenInstallingPackage ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ PackageOperation[] expectedOperations = new PackageOperation[] {
+ new PackageOperation (fakePackage, PackageAction.Install)
+ };
+
+ FakeInstallPackageAction action = fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated;
+ CollectionAssert.AreEqual (expectedOperations, action.Operations);
+ }
+
+ [Test]
+ public void HasLicenseUrl_PackageHasLicenseUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.LicenseUrl = new Uri ("http://sharpdevelop.com");
+
+ Assert.IsTrue (viewModel.HasLicenseUrl);
+ }
+
+ [Test]
+ public void HasLicenseUrl_PackageHasNoLicenseUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.LicenseUrl = null;
+
+ Assert.IsFalse (viewModel.HasLicenseUrl);
+ }
+
+ [Test]
+ public void HasProjectUrl_PackageHasProjectUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.ProjectUrl = new Uri ("http://sharpdevelop.com");
+
+ Assert.IsTrue (viewModel.HasProjectUrl);
+ }
+
+ [Test]
+ public void HasProjectUrl_PackageHasNoProjectUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.ProjectUrl = null;
+
+ Assert.IsFalse (viewModel.HasProjectUrl);
+ }
+
+ [Test]
+ public void HasReportAbuseUrl_PackageHasReportAbuseUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.ReportAbuseUrl = new Uri ("http://sharpdevelop.com");
+
+ Assert.IsTrue (viewModel.HasReportAbuseUrl);
+ }
+
+ [Test]
+ public void HasReportAbuseUrl_PackageHasNoReportAbuseUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.ReportAbuseUrl = null;
+
+ Assert.IsFalse (viewModel.HasReportAbuseUrl);
+ }
+
+ [Test]
+ public void IsAdded_ProjectHasPackageAdded_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakeSolution.FakeProjectToReturnFromGetProject.FakePackages.Add (fakePackage);
+
+ Assert.IsTrue (viewModel.IsAdded);
+ }
+
+ [Test]
+ public void IsAdded_ProjectDoesNotHavePackageInstalled_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakeSolution.FakeProjectToReturnFromGetProject.FakePackages.Clear ();
+
+ Assert.IsFalse (viewModel.IsAdded);
+ }
+
+ [Test]
+ public void RemovePackageCommand_CommandExecuted_UninstallsPackage ()
+ {
+ CreateViewModel ();
+ viewModel.RemovePackageCommand.Execute (null);
+
+ Assert.AreEqual (fakePackage, fakeUninstallPackageAction.Package);
+ }
+
+ [Test]
+ public void RemovePackage_PackageRemovedSuccessfully_RepositoryUsedToCreateProject ()
+ {
+ CreateViewModel ();
+ viewModel.RemovePackage ();
+
+ Assert.AreEqual (fakePackage.Repository, fakeSolution.RepositoryPassedToGetProject);
+ }
+
+ [Test]
+ public void PackageChanged_PackageRemovedSuccessfully_PropertyNotifyChangedFiredForIsAddedProperty ()
+ {
+ CreateViewModel ();
+ string propertyChangedName = null;
+ viewModel.PropertyChanged += (sender, e) => propertyChangedName = e.PropertyName;
+ viewModel.RemovePackage ();
+
+ Assert.AreEqual ("IsAdded", propertyChangedName);
+ }
+
+ [Test]
+ public void PackageChanged_PackageRemovedSuccessfully_PropertyNotifyChangedFiredAfterPackageUninstalled ()
+ {
+ CreateViewModel ();
+ IPackage packagePassedToUninstallPackageWhenPropertyNameChanged = null;
+ viewModel.PropertyChanged += (sender, e) => {
+ packagePassedToUninstallPackageWhenPropertyNameChanged = fakeUninstallPackageAction.Package;
+ };
+ viewModel.RemovePackage ();
+
+ Assert.AreEqual (fakePackage, packagePassedToUninstallPackageWhenPropertyNameChanged);
+ }
+
+ [Test]
+ public void HasDependencies_PackageHasNoDependencies_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.HasDependencies = false;
+
+ Assert.IsFalse (viewModel.HasDependencies);
+ }
+
+ [Test]
+ public void HasDependencies_PackageHasDependency_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.AddDependency ("Dependency");
+
+ Assert.IsTrue (viewModel.HasDependencies);
+ }
+
+ [Test]
+ public void HasNoDependencies_PackageHasNoDependencies_ReturnsTrue ()
+ {
+ CreateViewModel ();
+
+ Assert.IsTrue (viewModel.HasNoDependencies);
+ }
+
+ [Test]
+ public void HasNoDependencies_PackageHasOneDependency_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.AddDependency ("Dependency");
+
+ Assert.IsFalse (viewModel.HasNoDependencies);
+ }
+
+ [Test]
+ public void HasDownloadCount_DownloadCountIsZero_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.DownloadCount = 0;
+
+ Assert.IsTrue (viewModel.HasDownloadCount);
+ }
+
+ [Test]
+ public void HasDownloadCount_DownloadCountIsMinusOne_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.DownloadCount = -1;
+
+ Assert.IsFalse (viewModel.HasDownloadCount);
+ }
+
+ [Test]
+ public void HasLastPublished_PackageHasPublishedDate_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.Published = new DateTime (2011, 1, 2);
+
+ Assert.IsTrue (viewModel.HasLastPublished);
+ }
+
+ [Test]
+ public void HasLastPublished_PackageHasNoPublishedDate_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.Published = null;
+
+ Assert.IsFalse (viewModel.HasLastPublished);
+ }
+
+ [Test]
+ public void LastPublished_PackageHasPublishedDate_ReturnsPackagePublishedDate ()
+ {
+ CreateViewModel ();
+ fakePackage.Published = new DateTime (2011, 1, 2);
+
+ Assert.AreEqual (fakePackage.Published, viewModel.LastPublished);
+ }
+
+ [Test]
+ public void LastPublished_PackageHasNoPublishedDate_ReturnsNull ()
+ {
+ CreateViewModel ();
+ fakePackage.Published = null;
+
+ Assert.IsNull (viewModel.LastPublished);
+ }
+
+ [Test]
+ public void AddPackage_CheckLoggerUsed_PackageViewModelLoggerUsedWhenResolvingPackageOperations ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ ILogger expectedLogger = viewModel.OperationLoggerCreated;
+ ILogger actualLogger = fakeSolution.FakeProjectToReturnFromGetProject.Logger;
+ Assert.AreEqual (expectedLogger, actualLogger);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_InstallingPackageMessageIsFirstMessageLogged ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ fakePackage.Id = "Test.Package";
+ fakePackage.Version = new SemanticVersion (1, 2, 0, 55);
+ viewModel.AddPackage ();
+
+ string expectedMessage = "------- Installing...Test.Package 1.2.0.55 -------";
+ string actualMessage = fakeLogger.FirstFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_NextToLastMessageLoggedMarksEndOfInstallation ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ string expectedMessage = "==============================";
+ string actualMessage = fakeLogger.NextToLastFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void AddPackage_PackageAddedSuccessfully_LastMessageLoggedIsEmptyLine ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ string expectedMessage = String.Empty;
+ string actualMessage = fakeLogger.LastFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void RemovePackage_PackageRemovedSuccessfully_UninstallingPackageMessageIsFirstMessageLogged ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ fakePackage.Id = "Test.Package";
+ fakePackage.Version = new SemanticVersion (1, 2, 0, 55);
+ viewModel.RemovePackage ();
+
+ string expectedMessage = "------- Uninstalling...Test.Package 1.2.0.55 -------";
+ string actualMessage = fakeLogger.FirstFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void RemovePackage_PackageRemovedSuccessfully_NextToLastMessageLoggedMarksEndOfInstallation ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.RemovePackage ();
+
+ string expectedMessage = "==============================";
+ string actualMessage = fakeLogger.NextToLastFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void RemovePackage_PackageRemovedSuccessfully_LastMessageLoggedIsEmptyLine ()
+ {
+ CreateViewModel ();
+ viewModel.RemovePackage ();
+
+ string expectedMessage = String.Empty;
+ string actualMessage = fakeLogger.LastFormattedMessageLogged;
+
+ Assert.AreEqual (expectedMessage, actualMessage);
+ }
+
+ [Test]
+ public void AddPackage_PackagesInstalledSuccessfully_ViewModelPackageUsedWhenResolvingPackageOperations ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ FakePackage expectedPackage = fakePackage;
+ IPackage actualPackage = fakeSolution
+ .FakeProjectToReturnFromGetProject
+ .PackagePassedToGetInstallPackageOperations;
+
+ Assert.AreEqual (expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void AddPackage_PackagesInstalledSuccessfully_PackageDependenciesNotIgnoredWhenCheckingForPackageOperations ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ bool result = fakeSolution
+ .FakeProjectToReturnFromGetProject
+ .IgnoreDependenciesPassedToGetInstallPackageOperations;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void AddPackage_PackagesInstalledSuccessfully_PrereleaseVersionsNotAllowedWhenCheckingForPackageOperations ()
+ {
+ CreateViewModel ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ bool result = fakeSolution
+ .FakeProjectToReturnFromGetProject
+ .AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void AddPackage_ParentHasIncludePrereleaseSetToTrueWhenInstalling_PrereleaseVersionsAllowedWhenCheckingForPackageOperations ()
+ {
+ CreateViewModel ();
+ ParentAllowsPrereleasePackages ();
+ viewModel.AddOneFakeInstallPackageOperationForViewModelPackage ();
+ viewModel.AddPackage ();
+
+ bool result = fakeSolution
+ .FakeProjectToReturnFromGetProject
+ .AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void IsAdded_SolutionSelectedContainingOneProjectAndPackageIsInstalledInSolutionSharedRepository_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ AddProjectToSolution ();
+ fakeSolution.NoProjectsSelected ();
+ fakeSolution.FakeInstalledPackages.Add (fakePackage);
+ CreateViewModel (fakeSolution);
+
+ bool added = viewModel.IsAdded;
+
+ Assert.IsTrue (added);
+ }
+
+ [Test]
+ public void IsAdded_SolutionSelectedContainingOneProjectAndPackageIsNotInstalledInSolutionSharedRepository_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ AddProjectToSolution ();
+ fakeSolution.NoProjectsSelected ();
+
+ bool added = viewModel.IsAdded;
+
+ Assert.IsFalse (added);
+ }
+
+ [Test]
+ public void IsManaged_SolutionSelectedContainingTwoProjects_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ AddProjectToSolution ();
+ AddProjectToSolution ();
+ fakeSolution.NoProjectsSelected ();
+ CreateViewModel (fakeSolution);
+
+ bool managed = viewModel.IsManaged;
+
+ Assert.IsTrue (managed);
+ }
+
+ [Test]
+ public void IsManaged_SolutionSelectedContainingOneProject_ReturnsTrue ()
+ {
+ CreateFakeSolution ();
+ AddProjectToSolution ();
+ fakeSolution.NoProjectsSelected ();
+ CreateViewModel (fakeSolution);
+
+ bool managed = viewModel.IsManaged;
+
+ Assert.IsTrue (managed);
+ }
+
+ [Test]
+ public void IsManaged_SolutionWithOneProjectSelected_ReturnsFalse ()
+ {
+ CreateFakeSolution ();
+ AddProjectToSolution ();
+ fakeSolution.FakeActiveDotNetProject = fakeSolution.FakeDotNetProjects [0];
+ CreateViewModel (fakeSolution);
+
+ bool managed = viewModel.IsManaged;
+
+ Assert.IsFalse (managed);
+ }
+
+ [Test]
+ public void Summary_PackageHasSummary_PackageSummaryReturned ()
+ {
+ CreateViewModel ();
+ fakePackage.Summary = "Expected summary";
+
+ string summary = viewModel.Summary;
+
+ Assert.AreEqual ("Expected summary", summary);
+ }
+
+ [Test]
+ public void Summary_PackageHasDescriptionButNoSummary_PackageDescriptionReturned ()
+ {
+ CreateViewModel ();
+ fakePackage.Summary = String.Empty;
+ fakePackage.Description = "Expected description";
+
+ string summary = viewModel.Summary;
+
+ Assert.AreEqual ("Expected description", summary);
+ }
+
+ [Test]
+ public void Name_PackageHasIdButNoTitle_ReturnsPackageId ()
+ {
+ CreateViewModel ();
+ fakePackage.Id = "MyPackage";
+
+ string name = viewModel.Name;
+
+ Assert.AreEqual ("MyPackage", name);
+ }
+
+ [Test]
+ public void Name_PackageHasIdAndTitle_ReturnsPackageId ()
+ {
+ CreateViewModel ();
+ fakePackage.Id = "MyPackage";
+ fakePackage.Title = "My Package Title";
+
+ string name = viewModel.Name;
+
+ Assert.AreEqual ("My Package Title", name);
+ }
+
+ [Test]
+ public void GalleryUrl_PackageHasGalleryUrl_ReturnsUrl ()
+ {
+ CreateViewModel ();
+ var expectedUrl = new Uri ("http://test.com/MyPackage");
+ fakePackage.GalleryUrl = expectedUrl;
+
+ Uri url = viewModel.GalleryUrl;
+
+ Assert.AreEqual (expectedUrl, url);
+ }
+
+ [Test]
+ public void HasGalleryUrl_PackageHasGalleryUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ var expectedUrl = new Uri ("http://test.com/MyPackage");
+ fakePackage.GalleryUrl = expectedUrl;
+
+ bool result = viewModel.HasGalleryUrl;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void HasNoGalleryUrl_PackageHasNoGalleryUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ fakePackage.GalleryUrl = null;
+
+ bool result = viewModel.HasGalleryUrl;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void HasNoGalleryUrl_PackageHasGalleryUrl_ReturnsFalse ()
+ {
+ CreateViewModel ();
+ var expectedUrl = new Uri ("http://test.com/MyPackage");
+ fakePackage.GalleryUrl = expectedUrl;
+
+ bool result = viewModel.HasNoGalleryUrl;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void IsGalleryUrlMissing_PackageHasNoGalleryUrl_ReturnsTrue ()
+ {
+ CreateViewModel ();
+ fakePackage.GalleryUrl = null;
+
+ bool result = viewModel.HasNoGalleryUrl;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void AddPackage_PackageRepositoryIsOperationAwareAndPackageAddedSuccessfully_InstallOperationStartedForPackage ()
+ {
+ CreateViewModel ();
+ var operationAwareRepository = new FakeOperationAwarePackageRepository ();
+ fakePackage.FakePackageRepository = operationAwareRepository;
+ fakePackage.Id = "MyPackage";
+
+ viewModel.AddPackage ();
+
+ operationAwareRepository.AssertOperationWasStartedAndDisposed (RepositoryOperationNames.Install, "MyPackage");
+ }
+
+ [Test]
+ public void ManagePackage_TwoProjectsNeitherSelectedAndSourceRepositoryIsOperationAware_InstallOperationStarted ()
+ {
+ CreateViewModelWithTwoProjectsSelected ("Project A", "Project B");
+ UserAcceptsProjectSelection ();
+ var operationAwareRepository = new FakeOperationAwarePackageRepository ();
+ fakePackage.FakePackageRepository = operationAwareRepository;
+ fakePackage.Id = "MyPackage";
+
+ viewModel.ManagePackage ();
+
+ operationAwareRepository.AssertOperationWasStartedAndDisposed (RepositoryOperationNames.Install, "MyPackage");
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProjectHelper.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProjectHelper.cs
new file mode 100644
index 0000000000..7995f625f8
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ProjectHelper.cs
@@ -0,0 +1,123 @@
+//
+// ProjectHelper.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement;
+using MonoDevelop.Projects;
+using System.Linq;
+
+namespace MonoDevelop.PackageManagement.Tests.Helpers
+{
+ public static class ProjectHelper
+ {
+ public static ISolution CreateSolution ()
+ {
+ return new FakeSolution ();
+ }
+
+ public static FakeDotNetProject CreateTestProject ()
+ {
+ return CreateTestProject ("TestProject");
+ }
+
+ public static FakeDotNetProject CreateTestProject (string name)
+ {
+ ISolution solution = CreateSolution ();
+
+ return CreateTestProject (solution, name);
+ }
+
+ public static FakeDotNetProject CreateTestProject (
+ ISolution parentSolution,
+ string name,
+ string fileName = null)
+ {
+ return new FakeDotNetProject {
+ ParentSolution = parentSolution,
+ FileName = new FilePath (fileName),
+ Name = name
+ };
+ }
+
+ public static FakeDotNetProject CreateTestWebApplicationProject ()
+ {
+ FakeDotNetProject project = CreateTestProject ();
+ AddWebApplicationProjectType (project);
+ return project;
+ }
+
+ public static FakeDotNetProject CreateTestWebSiteProject ()
+ {
+ FakeDotNetProject project = CreateTestProject ();
+ AddWebSiteProjectType (project);
+ return project;
+ }
+
+ public static void AddWebApplicationProjectType (FakeDotNetProject project)
+ {
+ AddProjectType (project, DotNetProjectExtensions.WebApplication);
+ }
+
+ public static void AddWebSiteProjectType (FakeDotNetProject project)
+ {
+ AddProjectType (project, DotNetProjectExtensions.WebSite);
+ }
+
+ public static void AddProjectType (FakeDotNetProject project, Guid guid)
+ {
+ project.AddProjectType (guid);
+ }
+
+ public static void AddReference (FakeDotNetProject project, string referenceName)
+ {
+ var reference = new ProjectReference (ReferenceType.Assembly, referenceName);
+ project.References.Add (reference);
+ }
+
+ public static void AddFile (FakeDotNetProject project, string fileName)
+ {
+ project.Files.Add (new ProjectFile (fileName));
+ }
+
+ public static ProjectReference GetReference (FakeDotNetProject project, string referenceName)
+ {
+ foreach (ProjectReference referenceProjectItem in project.References) {
+ if (referenceProjectItem.Reference == referenceName) {
+ return referenceProjectItem;
+ }
+ }
+ return null;
+ }
+
+ public static ProjectFile GetFile (FakeDotNetProject project, string fileName)
+ {
+ return project.FilesAdded.FirstOrDefault (file => file.FilePath == new FilePath (fileName));
+ }
+ }
+} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ReducedPackageOperationsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ReducedPackageOperationsTests.cs
new file mode 100644
index 0000000000..88009cde41
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/ReducedPackageOperationsTests.cs
@@ -0,0 +1,188 @@
+//
+// ReducedPackageOperationsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class ReducedPackageOperationsTests
+ {
+ ReducedPackageOperations reducedPackageOperations;
+ FakePackageOperationResolver fakePackageOperationResolver;
+ List<IPackage> packages;
+
+ void CreateReducedPackageOperations ()
+ {
+ packages = new List<IPackage> ();
+ fakePackageOperationResolver = new FakePackageOperationResolver ();
+ reducedPackageOperations = new ReducedPackageOperations (fakePackageOperationResolver, packages);
+ }
+
+ IPackage AddPackage (string id, string version)
+ {
+ IPackage package = CreatePackage (id, version);
+ packages.Add (package);
+
+ return package;
+ }
+
+ IPackage CreatePackage (string id, string version)
+ {
+ return new TestPackageHelper (id, version).Package;
+ }
+
+ PackageOperation AddInstallOperationForPackage (IPackage package)
+ {
+ var operation = new PackageOperation (package, PackageAction.Install);
+ AddInstallOperationsForPackage (package, operation);
+ return operation;
+ }
+
+ void AddInstallOperationsForPackage (IPackage package, params PackageOperation[] operations)
+ {
+ fakePackageOperationResolver.AddOperations (package, operations);
+ }
+
+ PackageOperation CreatePackageOperation (string id, string version, PackageAction action)
+ {
+ IPackage package = CreatePackage (id, version);
+ return new PackageOperation (package, action);
+ }
+
+ void AssertReducedOperationsContains (PackageOperation operation)
+ {
+ Assert.IsTrue (reducedPackageOperations.Operations.ToList ().Contains (operation));
+ }
+
+ [Test]
+ public void Reduce_OnePackage_ReturnsPackageOperationsFromResolverForPackage ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package = AddPackage ("Test", "1.0");
+ PackageOperation operation = AddInstallOperationForPackage (package);
+
+ reducedPackageOperations.Reduce ();
+
+ Assert.AreEqual (1, reducedPackageOperations.Operations.Count ());
+ Assert.AreEqual (operation, reducedPackageOperations.Operations.First ());
+ }
+
+ [Test]
+ public void Reduce_TwoPackages_ReturnsPackageOperationsForBothPackages ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package1 = AddPackage ("Test", "1.0");
+ IPackage package2 = AddPackage ("Test2", "1.0");
+ PackageOperation operation1 = AddInstallOperationForPackage (package1);
+ PackageOperation operation2 = AddInstallOperationForPackage (package2);
+
+ reducedPackageOperations.Reduce ();
+
+ Assert.AreEqual (2, reducedPackageOperations.Operations.Count ());
+ AssertReducedOperationsContains (operation1);
+ AssertReducedOperationsContains (operation2);
+ }
+
+ [Test]
+ public void Reduce_OncePackageOperationInstallsPackageWhilstOneUninstallsSamePackage_PackageOperationNotIncludedInReducedSet ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package = AddPackage ("Test", "1.0");
+ PackageOperation installOperation = CreatePackageOperation ("Foo", "1.0", PackageAction.Install);
+ PackageOperation uninstallOperation = CreatePackageOperation ("Foo", "1.0", PackageAction.Uninstall);
+ AddInstallOperationsForPackage (package, installOperation, uninstallOperation);
+
+ reducedPackageOperations.Reduce ();
+
+ Assert.AreEqual (0, reducedPackageOperations.Operations.Count ());
+ }
+
+ [Test]
+ public void Reduce_OnePackageOperationMatchesPackageBeingInstalled_ReturnsOnlyOnePackageInstallOperationForThisPackage ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package1 = AddPackage ("Test", "1.0");
+ IPackage package2 = AddPackage ("Test2", "1.0");
+ PackageOperation operation1a = CreatePackageOperation ("Test", "1.0", PackageAction.Install);
+ PackageOperation operation1b = CreatePackageOperation ("Test2", "1.0", PackageAction.Install);
+ PackageOperation operation2 = CreatePackageOperation ("Test2", "1.0", PackageAction.Install);
+ AddInstallOperationsForPackage (package1, operation1a, operation1b);
+ AddInstallOperationsForPackage (package2, operation2);
+
+ reducedPackageOperations.Reduce ();
+
+ PackageOperation operation = reducedPackageOperations
+ .Operations
+ .SingleOrDefault (o => o.Package.Id == "Test2");
+ Assert.AreEqual (2, reducedPackageOperations.Operations.Count ());
+ }
+
+ [Test]
+ public void Reduce_OnePackageOperationMatchesPackageBeingInstalledOnlyById_MatchingPackageOperationByIdIncludedInSet ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package1 = AddPackage ("Test", "1.0");
+ IPackage package2 = AddPackage ("Test2", "1.0");
+ PackageOperation operation1a = CreatePackageOperation ("Test", "1.0", PackageAction.Install);
+ PackageOperation operation1b = CreatePackageOperation ("Test2", "1.1", PackageAction.Install);
+ PackageOperation operation2 = CreatePackageOperation ("Test2", "1.0", PackageAction.Install);
+ AddInstallOperationsForPackage (package1, operation1a, operation1b);
+ AddInstallOperationsForPackage (package2, operation2);
+
+ reducedPackageOperations.Reduce ();
+
+ Assert.AreEqual (3, reducedPackageOperations.Operations.Count ());
+ }
+
+ [Test]
+ public void Reduce_OnePackageOperationMatchesPackageBeingInstalledByIdAndVersionButOneIsInstallAndOneIsUninstall_BothOperationsNotIncludedInSet ()
+ {
+ CreateReducedPackageOperations ();
+ IPackage package1 = AddPackage ("Test", "1.0");
+ IPackage package2 = AddPackage ("Test2", "1.0");
+ PackageOperation operation1a = CreatePackageOperation ("Test", "1.0", PackageAction.Install);
+ PackageOperation operation1b = CreatePackageOperation ("Test2", "1.0", PackageAction.Uninstall);
+ PackageOperation operation2 = CreatePackageOperation ("Test2", "1.0", PackageAction.Install);
+ AddInstallOperationsForPackage (package1, operation1a, operation1b);
+ AddInstallOperationsForPackage (package2, operation2);
+
+ reducedPackageOperations.Reduce ();
+
+ PackageOperation operation = reducedPackageOperations
+ .Operations
+ .SingleOrDefault (o => o.Package.Id == "Test");
+ Assert.AreEqual (1, reducedPackageOperations.Operations.Count ());
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryPathTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryPathTests.cs
new file mode 100644
index 0000000000..c7a454313c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryPathTests.cs
@@ -0,0 +1,117 @@
+//
+// SolutionPackageRepositoryPathTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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;
+using NUnit.Framework;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class SolutionPackageRepositoryPathTests
+ {
+ SolutionPackageRepositoryPath repositoryPath;
+ FakeProject project;
+ PackageManagementOptions options;
+ FakeSolution solution;
+
+ void CreateSolutionPackageRepositoryPath ()
+ {
+ repositoryPath = new SolutionPackageRepositoryPath (project, options);
+ }
+
+ void CreateSolutionPackageRepositoryPath (ISolution solution)
+ {
+ repositoryPath = new SolutionPackageRepositoryPath (solution, options);
+ }
+
+ void CreateTestProject ()
+ {
+ project = new FakeProject ();
+ }
+
+ void CreateSolution (string fileName)
+ {
+ solution = new FakeSolution (fileName);
+ }
+
+ void CreateOptions ()
+ {
+ options = new TestablePackageManagementOptions ();
+ }
+
+ [Test]
+ public void PackageRepositoryPath_ProjectAndSolutionHaveDifferentFolders_IsConfiguredPackagesFolderInsideSolutionFolder ()
+ {
+ CreateOptions ();
+ CreateTestProject ();
+ CreateSolution (@"d:\projects\MyProject\MySolution.sln");
+ solution.BaseDirectory = @"d:\projects\MyProject\";
+ project.ParentSolution = solution;
+ options.PackagesDirectory = "MyPackages";
+ CreateSolutionPackageRepositoryPath ();
+
+ string path = repositoryPath.PackageRepositoryPath;
+ string expectedPath = @"d:\projects\MyProject\MyPackages";
+
+ Assert.AreEqual (expectedPath, path);
+ }
+
+ [Test]
+ public void PackageRepositoryPath_PassSolutionToConstructor_IsConfiguredPackagesFolderInsideSolutionFolder ()
+ {
+ CreateOptions ();
+ CreateSolution (@"d:\projects\MySolution\MySolution.sln");
+ options.PackagesDirectory = "Packages";
+ CreateSolutionPackageRepositoryPath (solution);
+
+ string path = repositoryPath.PackageRepositoryPath;
+ string expectedPath = @"d:\projects\MySolution\Packages";
+
+ Assert.AreEqual (expectedPath, path);
+ }
+
+ [Test]
+ public void GetInstallPath_GetInstallPathForPackage_ReturnsPackagePathInsideSolutionPackagesRepository ()
+ {
+ CreateOptions ();
+ CreateSolution (@"d:\projects\Test\MySolution\MyProject.sln");
+ options.PackagesDirectory = "MyPackages";
+ CreateSolutionPackageRepositoryPath (solution);
+
+ var package = FakePackage.CreatePackageWithVersion ("MyPackage", "1.2.1.40");
+
+ string installPath = repositoryPath.GetInstallPath (package);
+
+ string expectedInstallPath =
+ @"d:\projects\Test\MySolution\MyPackages\MyPackage.1.2.1.40";
+
+ Assert.AreEqual (expectedInstallPath, installPath);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryTests.cs
new file mode 100644
index 0000000000..332f1532e2
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/SolutionPackageRepositoryTests.cs
@@ -0,0 +1,247 @@
+//
+// SolutionPackageRepositoryTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+
+using ICSharpCode.PackageManagement;
+using NuGet;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class SolutionPackageRepositoryTests
+ {
+ SolutionPackageRepository repository;
+ TestablePackageManagementOptions options;
+ FakeSolution solution;
+ FakePackageRepositoryFactory fakeRepositoryFactory;
+ FakeSharedPackageRepository fakeSharedRepository;
+
+ void CreateSolution (string fileName)
+ {
+ solution = new FakeSolution (fileName);
+ }
+
+ void CreateFakeRepositoryFactory ()
+ {
+ fakeRepositoryFactory = new FakePackageRepositoryFactory ();
+ fakeSharedRepository = fakeRepositoryFactory.FakeSharedRepository;
+ }
+
+ void CreateOptions ()
+ {
+ options = new TestablePackageManagementOptions ();
+ }
+
+ void CreateRepository (ISolution solution, TestablePackageManagementOptions options)
+ {
+ CreateFakeRepositoryFactory ();
+ repository = new SolutionPackageRepository (solution, fakeRepositoryFactory, options);
+ }
+
+ void CreateRepository (ISolution solution)
+ {
+ CreateOptions ();
+ CreateRepository (solution, options);
+ }
+
+ void CreateRepository ()
+ {
+ CreateSolution (@"d:\projects\test\myproject\myproject.sln");
+ CreateRepository (solution);
+ }
+
+ FakePackage AddPackageToSharedRepository (string packageId)
+ {
+ FakeSharedPackageRepository sharedRepository = fakeRepositoryFactory.FakeSharedRepository;
+ return sharedRepository.AddFakePackage (packageId);
+ }
+
+ FakePackage AddPackageToSharedRepository (string packageId, string version)
+ {
+ FakeSharedPackageRepository sharedRepository = fakeRepositoryFactory.FakeSharedRepository;
+ return sharedRepository.AddFakePackageWithVersion (packageId, version);
+ }
+
+ [Test]
+ public void GetInstallPath_GetInstallPathForPackage_ReturnsPackagePathInsideSolutionPackagesRepository ()
+ {
+ CreateSolution (@"d:\projects\Test\MySolution\MyProject.sln");
+ CreateOptions ();
+ options.PackagesDirectory = "MyPackages";
+ CreateRepository (solution, options);
+
+ var package = FakePackage.CreatePackageWithVersion ("MyPackage", "1.0.1.40");
+
+ string installPath = repository.GetInstallPath (package);
+
+ string expectedInstallPath =
+ @"d:\projects\Test\MySolution\MyPackages\MyPackage.1.0.1.40";
+
+ Assert.AreEqual (expectedInstallPath, installPath);
+ }
+
+ [Test]
+ public void GetPackagesByDependencyOrder_OnePackageInSharedRepository_ReturnsOnePackage ()
+ {
+ CreateRepository ();
+ AddPackageToSharedRepository ("Test");
+
+ List<FakePackage> expectedPackages = fakeSharedRepository.FakePackages;
+
+ List<IPackage> actualPackages = repository.GetPackagesByDependencyOrder ().ToList ();
+
+ PackageCollectionAssert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void GetPackagesByDependencyOrder_OnePackageInSharedRepository_SharedRepositoryCreatedWithPathResolverForSolutionPackagesFolder ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage package = AddPackageToSharedRepository ("Test", "1.0");
+
+ List<IPackage> actualPackages = repository.GetPackagesByDependencyOrder ().ToList ();
+
+ IPackagePathResolver pathResolver = fakeRepositoryFactory.PathResolverPassedToCreateSharedRepository;
+ string installPath = pathResolver.GetInstallPath (package);
+
+ string expectedInstallPath = @"d:\projects\myproject\packages\Test.1.0";
+
+ Assert.AreEqual (expectedInstallPath, installPath);
+ }
+
+ [Test]
+ public void Constructor_CreateInstance_SharedRepositoryCreatedWithFileSystemForSolutionPackagesFolder ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+
+ IFileSystem fileSystem = fakeRepositoryFactory.FileSystemPassedToCreateSharedRepository;
+ string rootPath = fileSystem.Root;
+
+ string expectedRootPath = @"d:\projects\myproject\packages";
+
+ Assert.AreEqual (expectedRootPath, rootPath);
+ }
+
+ [Test]
+ public void Constructor_CreateInstance_SharedRepositoryCreatedWithConfigSettingsFileSystemForSolutionNuGetFolder ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+
+ IFileSystem fileSystem = fakeRepositoryFactory.ConfigSettingsFileSystemPassedToCreateSharedRepository;
+ string rootPath = fileSystem.Root;
+
+ string expectedRootPath = @"d:\projects\myproject\.nuget";
+
+ Assert.AreEqual (expectedRootPath, rootPath);
+ }
+
+ [Test]
+ public void GetPackagesByDependencyOrder_TwoPackagesInSharedRepositoryFirstPackageDependsOnSecond_ReturnsSecondPackageFirst ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage firstPackage = AddPackageToSharedRepository ("First");
+ firstPackage.AddDependency ("Second");
+ FakePackage secondPackage = AddPackageToSharedRepository ("Second");
+
+ List<IPackage> actualPackages = repository.GetPackagesByDependencyOrder ().ToList ();
+
+ var expectedPackages = new IPackage[] {
+ secondPackage,
+ firstPackage
+ };
+
+ Assert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void GetPackagesByReverseDependencyOrder_TwoPackagesInSharedRepositorySecondPackageDependsOnFirst_ReturnsSecondPackageFirst ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage firstPackage = AddPackageToSharedRepository ("First");
+ FakePackage secondPackage = AddPackageToSharedRepository ("Second");
+ secondPackage.AddDependency ("First");
+
+ List<IPackage> actualPackages = repository.GetPackagesByReverseDependencyOrder ().ToList ();
+
+ var expectedPackages = new IPackage[] {
+ secondPackage,
+ firstPackage
+ };
+
+ Assert.AreEqual (expectedPackages, actualPackages);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsInSharedRepository_ReturnsTrue ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage firstPackage = AddPackageToSharedRepository ("First");
+
+ bool installed = repository.IsInstalled (firstPackage);
+
+ Assert.IsTrue (installed);
+ }
+
+ [Test]
+ public void IsInstalled_PackageIsNotInSharedRepository_ReturnsFalse ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage testPackage = new FakePackage ("Test");
+
+ bool installed = repository.IsInstalled (testPackage);
+
+ Assert.IsFalse (installed);
+ }
+
+ [Test]
+ public void GetPackages_OnePackageIsInSharedRepository_ReturnsOnePackage ()
+ {
+ CreateSolution (@"d:\projects\myproject\myproject.sln");
+ CreateRepository (solution);
+ FakePackage firstPackage = AddPackageToSharedRepository ("First");
+
+ IQueryable<IPackage> packages = repository.GetPackages ();
+
+ var expectedPackages = new FakePackage[] {
+ firstPackage
+ };
+
+ PackageCollectionAssert.AreEqual (expectedPackages, packages);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UserAgentGeneratorForRepositoryRequestsTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UserAgentGeneratorForRepositoryRequestsTests.cs
new file mode 100644
index 0000000000..5651517ff1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/UserAgentGeneratorForRepositoryRequestsTests.cs
@@ -0,0 +1,104 @@
+//
+// UserAgentGeneratorForRepositoryRequestsTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Net;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using NuGet;
+using NUnit.Framework;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class UserAgentGeneratorForRepositoryRequestsTests
+ {
+ UserAgentGeneratorForRepositoryRequests generator;
+ FakePackageRepositoryFactoryEvents repositoryFactoryEvents;
+
+ void CreateGenerator ()
+ {
+ repositoryFactoryEvents = new FakePackageRepositoryFactoryEvents ();
+ generator = new UserAgentGeneratorForRepositoryRequests (repositoryFactoryEvents);
+ }
+
+ IPackageRepository CreatePackageRepository ()
+ {
+ return new FakePackageRepository ();
+ }
+
+ FakePackageRepositoryWithHttpClientEvents CreatePackageRepositoryThatImplementsIHttpClientEvents ()
+ {
+ return new FakePackageRepositoryWithHttpClientEvents ();
+ }
+
+ void FireRepositoryCreatedEvent (FakePackageRepositoryWithHttpClientEvents clientEvents)
+ {
+ FireRepositoryCreatedEvent (clientEvents as IPackageRepository);
+ }
+
+ void FireRepositoryCreatedEvent (IPackageRepository repository)
+ {
+ var eventArgs = new PackageRepositoryFactoryEventArgs (repository);
+ repositoryFactoryEvents.RaiseRepositoryCreatedEvent (eventArgs);
+ }
+
+ WebRequest FireSendingRequestEvent (FakePackageRepositoryWithHttpClientEvents clientEvents)
+ {
+ var request = new FakeWebRequest ();
+ request.Headers = new WebHeaderCollection ();
+
+ var eventArgs = new WebRequestEventArgs (request);
+ clientEvents.RaiseSendingRequestEvent (eventArgs);
+
+ return request;
+ }
+
+ [Test]
+ public void SendingRequest_UserAgentGeneration_UserAgentSetOnRequest ()
+ {
+ CreateGenerator ();
+ var clientEvents = CreatePackageRepositoryThatImplementsIHttpClientEvents ();
+ FireRepositoryCreatedEvent (clientEvents);
+
+ WebRequest request = FireSendingRequestEvent (clientEvents);
+
+ string userAgent = request.Headers [HttpRequestHeader.UserAgent];
+ Assert.IsTrue (userAgent.StartsWith (BrandingService.ApplicationName), userAgent);
+ }
+
+ [Test]
+ public void RepositoryCreated_RepositoryDoesNotImplementIHttpClientEvents_NullReferenceExceptionNotThrown ()
+ {
+ CreateGenerator ();
+ IPackageRepository repository = CreatePackageRepository ();
+
+ FireRepositoryCreatedEvent (repository);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
index 7e88cea29f..f13bf9e969 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
@@ -313,6 +313,12 @@
<Compile Include="MonoDevelop.PackageManagement\PackagesForSelectedPageQuery.cs" />
<Compile Include="MonoDevelop.PackageManagement\PackageManagementProgressProvider.cs" />
<Compile Include="MonoDevelop.PackageManagement\PackageManagementProgressMonitor.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\ISolution.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\IProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\ProjectProxy.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\SolutionProxy.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\IDotNetProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\DotNetProjectProxy.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="MonoDevelop.PackageManagement.addin.xml" />
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs
index 0bbe79cc15..8e656126b1 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ConfigSettingsFileSystem.cs
@@ -28,6 +28,7 @@
using System;
using System.IO;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -40,7 +41,7 @@ namespace ICSharpCode.PackageManagement
{
}
- public static ConfigSettingsFileSystem CreateConfigSettingsFileSystem(Solution solution)
+ public static ConfigSettingsFileSystem CreateConfigSettingsFileSystem (ISolution solution)
{
string configSettingsFolder = Path.Combine(solution.BaseDirectory, ".nuget");
return new ConfigSettingsFileSystem(configSettingsFolder);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
index 61c4c60a44..8b390d9a91 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
@@ -27,11 +27,12 @@
//
using System;
+using System.IO;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using MonoDevelop.Projects.Formats.MSBuild;
using NuGet;
-using System.IO;
-using MonoDevelop.Core;
namespace ICSharpCode.PackageManagement
{
@@ -40,20 +41,12 @@ namespace ICSharpCode.PackageManagement
public static readonly Guid WebApplication = Guid.Parse("{349C5851-65DF-11DA-9384-00065B846F21}");
public static readonly Guid WebSite = Guid.Parse("{E24C65DC-7377-472B-9ABA-BC803B73C61A}");
- public static bool IsWebProject(this DotNetProject project)
+ public static bool IsWebProject(this IDotNetProject project)
{
return project.HasProjectType(WebApplication) || project.HasProjectType(WebSite);
}
- public static string GetEvaluatedProperty(this DotNetProject project, string name)
- {
- if ("RootNamespace".Equals(name, StringComparison.OrdinalIgnoreCase)) {
- return project.DefaultNamespace;
- }
- return String.Empty;
- }
-
- public static bool HasProjectType(this DotNetProject project, Guid projectTypeGuid)
+ public static bool HasProjectType(this IDotNetProject project, Guid projectTypeGuid)
{
foreach (string guid in project.GetProjectTypeGuids()) {
if (IsMatch(projectTypeGuid, guid)) {
@@ -63,7 +56,7 @@ namespace ICSharpCode.PackageManagement
return false;
}
- public static string[] GetProjectTypeGuids(this DotNetProject project)
+ public static string[] GetProjectTypeGuids(this IDotNetProject project)
{
string projectTypeGuids = project.GetProjectTypeGuidPropertyValue();
return projectTypeGuids.Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries);
@@ -78,7 +71,7 @@ namespace ICSharpCode.PackageManagement
return false;
}
- public static string GetProjectTypeGuidPropertyValue(this DotNetProject project)
+ public static string GetProjectTypeGuidPropertyValue (this IDotNetProject project)
{
string propertyValue = null;
if (project.ExtendedProperties.Contains("ProjectTypeGuids")) {
@@ -86,30 +79,6 @@ namespace ICSharpCode.PackageManagement
}
return propertyValue ?? String.Empty;
}
-
- public static void AddImportIfMissing(
- this DotNetProject project,
- string importedProjectFile,
- ProjectImportLocation importLocation)
- {
- var msbuildProject = new MSBuildProject ();
- msbuildProject.Load (project.FileName);
- msbuildProject.AddImportIfMissing (importedProjectFile, importLocation, GetCondition (importedProjectFile));
- msbuildProject.Save (project.FileName);
- }
-
- static string GetCondition(string importedProjectFile)
- {
- return String.Format("Exists('{0}')", importedProjectFile);
- }
-
- public static void RemoveImport(this DotNetProject project, string importedProjectFile)
- {
- var msbuildProject = new MSBuildProject ();
- msbuildProject.Load (project.FileName);
- msbuildProject.RemoveImportIfExists (importedProjectFile);
- msbuildProject.Save (project.FileName);
- }
public static bool HasPackages (this DotNetProject project)
{
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs
new file mode 100644
index 0000000000..287a46f396
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs
@@ -0,0 +1,89 @@
+//
+// DotNetProjectProxy.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 MonoDevelop.Core.Assemblies;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ public class DotNetProjectProxy : ProjectProxy, IDotNetProject
+ {
+ DotNetProject project;
+
+ public DotNetProjectProxy (DotNetProject project)
+ : base (project)
+ {
+ this.project = project;
+ }
+
+ public DotNetProject DotNetProject {
+ get { return project; }
+ }
+
+ public TargetFrameworkMoniker TargetFrameworkMoniker {
+ get { return project.TargetFramework.Id; }
+ }
+
+ public string DefaultNamespace {
+ get { return project.DefaultNamespace; }
+ }
+
+ public ProjectReferenceCollection References {
+ get { return project.References; }
+ }
+
+ public ProjectFileCollection Files {
+ get { return project.Files; }
+ }
+
+ public void AddFile (ProjectFile projectFile)
+ {
+ project.AddFile (projectFile);
+ }
+
+ public string GetDefaultBuildAction (string fileName)
+ {
+ return project.GetDefaultBuildAction (fileName);
+ }
+
+ public bool IsFileInProject (string fileName)
+ {
+ return project.IsFileInProject (fileName);
+ }
+
+ public void AddImportIfMissing (string name, string condition)
+ {
+ project.AddImportIfMissing (name, condition);
+ }
+
+ public void RemoveImport (string name)
+ {
+ project.RemoveImport (name);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs
new file mode 100644
index 0000000000..8d8c0b98a3
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs
@@ -0,0 +1,48 @@
+//
+// IDotNetProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 MonoDevelop.Core.Assemblies;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ public interface IDotNetProject : IProject
+ {
+ DotNetProject DotNetProject { get; }
+ TargetFrameworkMoniker TargetFrameworkMoniker { get; }
+ string DefaultNamespace { get; }
+ ProjectReferenceCollection References { get; }
+ ProjectFileCollection Files { get; }
+
+ void AddFile (ProjectFile projectFile);
+ string GetDefaultBuildAction (string fileName);
+ bool IsFileInProject (string fileName);
+ void AddImportIfMissing (string name, string condition);
+ void RemoveImport (string name);
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs
index 5a92539b45..b9dbd43d97 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectFactory.cs
@@ -26,13 +26,13 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public interface IPackageManagementProjectFactory
{
- IPackageManagementProject CreateProject(IPackageRepository sourceRepository, DotNetProject project);
+ IPackageManagementProject CreateProject (IPackageRepository sourceRepository, IDotNetProject project);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs
index 436c21fcf4..88d458144c 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectService.cs
@@ -28,18 +28,17 @@
using System;
using System.Collections.Generic;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
namespace ICSharpCode.PackageManagement
{
public interface IPackageManagementProjectService
{
- Project CurrentProject { get; }
- Solution OpenSolution { get; }
+ IProject CurrentProject { get; }
+ ISolution OpenSolution { get; }
- void Save(Solution solution);
-
- IEnumerable<DotNetProject> GetOpenProjects();
+ IEnumerable<IDotNetProject> GetOpenProjects ();
IProjectBrowserUpdater CreateProjectBrowserUpdater();
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs
index acb993f73f..03f279d604 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementSolution.cs
@@ -30,6 +30,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -41,11 +42,11 @@ namespace ICSharpCode.PackageManagement
IPackageManagementProject GetActiveProject(IPackageRepository sourceRepository);
IPackageManagementProject GetProject(PackageSource source, string projectName);
IPackageManagementProject GetProject(IPackageRepository sourceRepository, string projectName);
- IPackageManagementProject GetProject(IPackageRepository sourceRepository, Project project);
+ IPackageManagementProject GetProject (IPackageRepository sourceRepository, IDotNetProject project);
IEnumerable<IPackageManagementProject> GetProjects(IPackageRepository sourceRepository);
- Project GetActiveDotNetProject();
- IEnumerable<Project> GetDotNetProjects();
+ IDotNetProject GetActiveDotNetProject ();
+ IEnumerable<IDotNetProject> GetDotNetProjects ();
bool HasMultipleProjects();
bool IsPackageInstalled(IPackage package);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs
index ec4285d316..0428fa1a84 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagerFactory.cs
@@ -27,15 +27,15 @@
//
using System;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public interface IPackageManagerFactory
{
- ISharpDevelopPackageManager CreatePackageManager(
+ ISharpDevelopPackageManager CreatePackageManager (
IPackageRepository sourceRepository,
- DotNetProject project);
+ IDotNetProject project);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IProject.cs
new file mode 100644
index 0000000000..d359be3c57
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IProject.cs
@@ -0,0 +1,44 @@
+//
+// IProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement
+{
+ public interface IProject
+ {
+ string Name { get; }
+ FilePath FileName { get; }
+ FilePath BaseDirectory { get; }
+ ISolution ParentSolution { get; }
+ IDictionary ExtendedProperties { get; }
+
+ void Save ();
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolution.cs
new file mode 100644
index 0000000000..abfd279ea7
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolution.cs
@@ -0,0 +1,38 @@
+//
+// ISolution.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement
+{
+ public interface ISolution
+ {
+ FilePath BaseDirectory { get; }
+ FilePath FileName { get; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs
index c3ab8c2652..c9cc090a9c 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ISolutionPackageRepositoryFactory.cs
@@ -27,12 +27,13 @@
//
using System;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
namespace ICSharpCode.PackageManagement
{
public interface ISolutionPackageRepositoryFactory
{
- ISolutionPackageRepository CreateSolutionPackageRepository(Solution solution);
+ ISolutionPackageRepository CreateSolutionPackageRepository (ISolution solution);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs
index 6422633538..20f1136e4b 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs
@@ -35,8 +35,25 @@ namespace ICSharpCode.PackageManagement
{
public class NuGetPackageRestoreCommandLine
{
- public NuGetPackageRestoreCommandLine(IPackageManagementSolution solution)
+ MonoRuntimeInfo monoRuntime;
+ bool isMonoRuntime;
+
+ public NuGetPackageRestoreCommandLine (IPackageManagementSolution solution)
+ : this (
+ solution,
+ MonoRuntimeInfo.FromCurrentRuntime (),
+ EnvironmentUtility.IsMonoRuntime)
{
+ }
+
+ public NuGetPackageRestoreCommandLine (
+ IPackageManagementSolution solution,
+ MonoRuntimeInfo monoRuntime,
+ bool isMonoRuntime)
+ {
+ this.monoRuntime = monoRuntime;
+ this.isMonoRuntime = isMonoRuntime;
+
GenerateCommandLine(solution);
GenerateWorkingDirectory(solution);
}
@@ -47,7 +64,7 @@ namespace ICSharpCode.PackageManagement
void GenerateCommandLine(IPackageManagementSolution solution)
{
- if (EnvironmentUtility.IsMonoRuntime) {
+ if (isMonoRuntime) {
GenerateMonoCommandLine(solution);
} else {
GenerateWindowsCommandLine(solution);
@@ -61,8 +78,7 @@ namespace ICSharpCode.PackageManagement
NuGetExePath.GetPath(),
solution.FileName);
- string monoPrefix = MonoRuntimeInfo.FromCurrentRuntime().Prefix;
- Command = Path.Combine(monoPrefix, "bin", "mono");
+ Command = Path.Combine (monoRuntime.Prefix, "bin", "mono");
}
void GenerateWindowsCommandLine(IPackageManagementSolution solution)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs
index 4845f95ae9..cd3138b4bc 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/OpenDotNetProjects.cs
@@ -29,6 +29,7 @@
using System;
using System.Collections.Generic;
using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
namespace ICSharpCode.PackageManagement
{
@@ -36,30 +37,30 @@ namespace ICSharpCode.PackageManagement
{
IPackageManagementProjectService projectService;
- public OpenDotNetProjects(IPackageManagementProjectService projectService)
+ public OpenDotNetProjects (IPackageManagementProjectService projectService)
{
this.projectService = projectService;
}
- public DotNetProject FindProject(string name)
+ public IDotNetProject FindProject (string name)
{
- foreach (Project project in projectService.GetOpenProjects()) {
- if (IsProjectNameMatch(project, name)) {
- return project as DotNetProject;
+ foreach (IProject project in projectService.GetOpenProjects ()) {
+ if (IsProjectNameMatch (project, name)) {
+ return project as IDotNetProject;
}
}
return null;
}
- bool IsProjectNameMatch(Project project, string name)
+ bool IsProjectNameMatch (IProject project, string name)
{
- return IsMatchIgnoringCase(project.Name, name) ||
+ return IsMatchIgnoringCase (project.Name, name) ||
(project.FileName == name);
}
- bool IsMatchIgnoringCase(string a, string b)
+ bool IsMatchIgnoringCase (string a, string b)
{
- return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
+ return String.Equals (a, b, StringComparison.OrdinalIgnoreCase);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs
index 4a206370e3..11b1f19285 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProject.cs
@@ -30,9 +30,10 @@ using System;
using System.Collections.Generic;
using System.Linq;
+using System.Runtime.Versioning;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
-using System.Runtime.Versioning;
namespace ICSharpCode.PackageManagement
{
@@ -41,29 +42,29 @@ namespace ICSharpCode.PackageManagement
ISharpDevelopPackageManager packageManager;
ISharpDevelopProjectManager projectManager;
IPackageManagementEvents packageManagementEvents;
- DotNetProject msbuildProject;
+ IDotNetProject project;
ProjectTargetFramework targetFramework;
- public PackageManagementProject(
+ public PackageManagementProject (
IPackageRepository sourceRepository,
- DotNetProject project,
+ IDotNetProject project,
IPackageManagementEvents packageManagementEvents,
IPackageManagerFactory packageManagerFactory)
{
SourceRepository = sourceRepository;
- msbuildProject = project;
+ this.project = project;
this.packageManagementEvents = packageManagementEvents;
- packageManager = packageManagerFactory.CreatePackageManager(sourceRepository, project);
+ packageManager = packageManagerFactory.CreatePackageManager (sourceRepository, project);
projectManager = packageManager.ProjectManager;
}
public string Name {
- get { return msbuildProject.Name; }
+ get { return project.Name; }
}
public DotNetProject DotNetProject {
- get { return msbuildProject; }
+ get { return project.DotNetProject; }
}
public FrameworkName TargetFramework {
@@ -73,7 +74,7 @@ namespace ICSharpCode.PackageManagement
FrameworkName GetTargetFramework()
{
if (targetFramework == null) {
- targetFramework = new ProjectTargetFramework(msbuildProject);
+ targetFramework = new ProjectTargetFramework(project);
}
return targetFramework.TargetFrameworkName;
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs
index 5e3c276d1f..6dfe3931de 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectFactory.cs
@@ -27,7 +27,7 @@
//
using System;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
@@ -42,11 +42,11 @@ namespace ICSharpCode.PackageManagement
this.packageManagementEvents = packageManagementEvents;
}
- public IPackageManagementProject CreateProject(
+ public IPackageManagementProject CreateProject (
IPackageRepository sourceRepository,
- DotNetProject project)
+ IDotNetProject project)
{
- return new PackageManagementProject(sourceRepository, project, packageManagementEvents, factory);
+ return new PackageManagementProject (sourceRepository, project, packageManagementEvents, factory);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs
index 8951c7d4d5..01c8d1d841 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectService.cs
@@ -30,6 +30,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using MonoDevelop.Ide;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
namespace ICSharpCode.PackageManagement
@@ -39,29 +40,42 @@ namespace ICSharpCode.PackageManagement
public PackageManagementProjectService()
{
}
-
- public Project CurrentProject {
- get { return IdeApp.ProjectOperations.CurrentSelectedProject; }
+
+ public IProject CurrentProject {
+ get {
+ Project project = IdeApp.ProjectOperations.CurrentSelectedProject;
+ if (project != null) {
+ if (project is DotNetProject) {
+ return new DotNetProjectProxy ((DotNetProject)project);
+ }
+ return new ProjectProxy (project);
+ }
+ return null;
+ }
}
-
- public Solution OpenSolution {
- get { return IdeApp.ProjectOperations.CurrentSelectedSolution; }
+
+ public ISolution OpenSolution {
+ get {
+ Solution solution = IdeApp.ProjectOperations.CurrentSelectedSolution;
+ if (solution != null) {
+ return new SolutionProxy (solution);
+ }
+ return null;
+ }
}
-
- public IEnumerable<DotNetProject> GetOpenProjects()
+
+ public IEnumerable<IDotNetProject> GetOpenProjects ()
{
- Solution solution = OpenSolution;
+ Solution solution = IdeApp.ProjectOperations.CurrentSelectedSolution;
if (solution != null) {
- return solution.GetAllProjects ().OfType<DotNetProject> ();
+ return solution
+ .GetAllProjects ()
+ .OfType<DotNetProject> ()
+ .Select (project => new DotNetProjectProxy (project));
}
- return new DotNetProject [0];
- }
-
- public void Save(Solution solution)
- {
- solution.Save();
+ return new IDotNetProject [0];
}
-
+
public IProjectBrowserUpdater CreateProjectBrowserUpdater()
{
return new ThreadSafeProjectBrowserUpdater();
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs
index c2fb5ca2f1..d4eef0a928 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProject.cs
@@ -44,13 +44,21 @@ namespace ICSharpCode.PackageManagement
{
}
- public PackageManagementSelectedProject(
+ public PackageManagementSelectedProject (
IPackageManagementProject project,
bool selected,
bool enabled)
+ : this (project.Name, selected, enabled)
{
this.Project = project;
- this.Name = Project.Name;
+ }
+
+ public PackageManagementSelectedProject (
+ string name,
+ bool selected,
+ bool enabled)
+ {
+ this.Name = name;
this.IsSelected = selected;
this.IsEnabled = enabled;
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs
index 58bcf6b977..d2d5b69700 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSelectedProjects.cs
@@ -34,13 +34,14 @@ using System.Runtime.Versioning;
using MonoDevelop.Projects;
using NuGet;
+using MonoDevelop.PackageManagement;
namespace ICSharpCode.PackageManagement
{
public class PackageManagementSelectedProjects
{
bool? singleProjectSelected;
- Project singleDotNetProjectSelected;
+ IDotNetProject singleDotNetProjectSelected;
public PackageManagementSelectedProjects(IPackageManagementSolution solution)
{
@@ -55,8 +56,8 @@ namespace ICSharpCode.PackageManagement
if (HasSingleProjectSelected()) {
yield return GetSingleProjectSelected(package);
} else {
- foreach (Project project in GetOpenProjects()) {
- yield return CreateSelectedProject(project, package);
+ foreach (IDotNetProject project in GetOpenProjects ()) {
+ yield return CreateSelectedProject (project, package);
}
}
}
@@ -75,7 +76,7 @@ namespace ICSharpCode.PackageManagement
singleProjectSelected = singleDotNetProjectSelected != null;
}
- IEnumerable<Project> GetOpenProjects()
+ IEnumerable<IDotNetProject> GetOpenProjects ()
{
return Solution.GetDotNetProjects();
}
@@ -85,7 +86,7 @@ namespace ICSharpCode.PackageManagement
return CreateSelectedProject(singleDotNetProjectSelected, package);
}
- IPackageManagementSelectedProject CreateSelectedProject(Project dotNetProject, IPackageFromRepository package)
+ IPackageManagementSelectedProject CreateSelectedProject(IDotNetProject dotNetProject, IPackageFromRepository package)
{
IPackageManagementProject project = Solution.GetProject(package.Repository, dotNetProject);
return CreateSelectedProject(project, package);
@@ -191,7 +192,7 @@ namespace ICSharpCode.PackageManagement
public FrameworkName GetTargetFramework ()
{
if (HasSingleProjectSelected ()) {
- return new ProjectTargetFramework ((DotNetProject)singleDotNetProjectSelected)
+ return new ProjectTargetFramework (singleDotNetProjectSelected)
.TargetFrameworkName;
}
return null;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs
index 57f61d7f41..ba5cfb3433 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementSolution.cs
@@ -29,7 +29,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
@@ -68,10 +68,10 @@ namespace ICSharpCode.PackageManagement
get { return OpenSolution.FileName; }
}
- Solution OpenSolution {
+ ISolution OpenSolution {
get { return projectService.OpenSolution; }
}
-
+
public IPackageManagementProject GetActiveProject()
{
if (HasActiveProject()) {
@@ -85,9 +85,12 @@ namespace ICSharpCode.PackageManagement
return GetActiveDotNetProject() != null;
}
- public Project GetActiveDotNetProject()
+ public IDotNetProject GetActiveDotNetProject ()
{
- return projectService.CurrentProject;
+ if (projectService.CurrentProject != null) {
+ return projectService.CurrentProject as IDotNetProject;
+ }
+ return null;
}
IPackageRepository ActivePackageRepository {
@@ -96,18 +99,18 @@ namespace ICSharpCode.PackageManagement
public IPackageManagementProject GetActiveProject(IPackageRepository sourceRepository)
{
- var activeProject = GetActiveDotNetProject() as DotNetProject;
+ IDotNetProject activeProject = GetActiveDotNetProject ();
if (activeProject != null) {
- return CreateProject(sourceRepository, activeProject);
+ return CreateProject (sourceRepository, activeProject);
}
return null;
}
-
- IPackageManagementProject CreateProject(IPackageRepository sourceRepository, DotNetProject project)
+
+ IPackageManagementProject CreateProject (IPackageRepository sourceRepository, IDotNetProject project)
{
- return projectFactory.CreateProject(sourceRepository, project);
+ return projectFactory.CreateProject (sourceRepository, project);
}
-
+
IPackageRepository CreatePackageRepository(PackageSource source)
{
return registeredPackageRepositories.CreateRepository(source);
@@ -115,17 +118,17 @@ namespace ICSharpCode.PackageManagement
public IPackageManagementProject GetProject(PackageSource source, string projectName)
{
- DotNetProject project = GetDotNetProject(projectName);
+ IDotNetProject project = GetDotNetProject (projectName);
return CreateProject(source, project);
}
- DotNetProject GetDotNetProject(string name)
+ IDotNetProject GetDotNetProject (string name)
{
var openProjects = new OpenDotNetProjects(projectService);
return openProjects.FindProject(name);
}
- IPackageManagementProject CreateProject(PackageSource source, DotNetProject project)
+ IPackageManagementProject CreateProject (PackageSource source, IDotNetProject project)
{
IPackageRepository sourceRepository = CreatePackageRepository(source);
return CreateProject(sourceRepository, project);
@@ -133,19 +136,18 @@ namespace ICSharpCode.PackageManagement
public IPackageManagementProject GetProject(IPackageRepository sourceRepository, string projectName)
{
- DotNetProject project = GetDotNetProject(projectName);
+ IDotNetProject project = GetDotNetProject (projectName);
return CreateProject(sourceRepository, project);
}
- public IPackageManagementProject GetProject(IPackageRepository sourceRepository, Project project)
+ public IPackageManagementProject GetProject (IPackageRepository sourceRepository, IDotNetProject project)
{
- var dotNetProject = project as DotNetProject;
- return CreateProject(sourceRepository, dotNetProject);
+ return CreateProject (sourceRepository, project);
}
- public IEnumerable<Project> GetDotNetProjects()
+ public IEnumerable<IDotNetProject> GetDotNetProjects ()
{
- return projectService.GetOpenProjects();
+ return projectService.GetOpenProjects ();
}
public bool IsOpen {
@@ -165,7 +167,7 @@ namespace ICSharpCode.PackageManagement
ISolutionPackageRepository CreateSolutionPackageRepository()
{
- return solutionPackageRepositoryFactory.CreateSolutionPackageRepository(OpenSolution);
+ return solutionPackageRepositoryFactory.CreateSolutionPackageRepository (OpenSolution);
}
public IQueryable<IPackage> GetPackages()
@@ -199,7 +201,7 @@ namespace ICSharpCode.PackageManagement
public IEnumerable<IPackageManagementProject> GetProjects(IPackageRepository sourceRepository)
{
- foreach (DotNetProject dotNetProject in GetDotNetProjects()) {
+ foreach (IDotNetProject dotNetProject in GetDotNetProjects ()) {
yield return projectFactory.CreateProject(sourceRepository, dotNetProject);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectProxy.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectProxy.cs
new file mode 100644
index 0000000000..7aef3277df
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectProxy.cs
@@ -0,0 +1,70 @@
+//
+// ProjectProxy.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 System.Collections;
+using ICSharpCode.PackageManagement;
+using MonoDevelop.Core;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ public class ProjectProxy : IProject
+ {
+ Project project;
+
+ public ProjectProxy (Project project)
+ {
+ this.project = project;
+ }
+
+ public string Name {
+ get { return project.Name; }
+ }
+
+ public FilePath FileName {
+ get { return project.FileName; }
+ }
+
+ public FilePath BaseDirectory {
+ get { return project.BaseDirectory; }
+ }
+
+ public ISolution ParentSolution {
+ get { return new SolutionProxy (project.ParentSolution); }
+ }
+
+ public IDictionary ExtendedProperties {
+ get { return project.ExtendedProperties; }
+ }
+
+ public void Save ()
+ {
+ project.Save ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs
index 249dc72c36..9099f6d4c7 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTargetFramework.cs
@@ -29,16 +29,17 @@
using System;
using System.Runtime.Versioning;
using MonoDevelop.Core.Assemblies;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
namespace ICSharpCode.PackageManagement
{
public class ProjectTargetFramework
{
- DotNetProject project;
+ IDotNetProject project;
FrameworkName targetFramework;
-
- public ProjectTargetFramework(DotNetProject project)
+
+ public ProjectTargetFramework (IDotNetProject project)
{
this.project = project;
GetTargetFramework();
@@ -65,7 +66,7 @@ namespace ICSharpCode.PackageManagement
}
TargetFrameworkMoniker TargetFrameworkMoniker {
- get { return project.TargetFramework.Id; }
+ get { return project.TargetFrameworkMoniker; }
}
string UseDefaultIfNullOrEmpty(string value, string defaultValue)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
index 60684fbee6..8dd74549aa 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
@@ -103,8 +103,9 @@ namespace MonoDevelop.PackageManagement
return null;
}
- IPackageManagementProject CreatePackageManagementProject (DotNetProject dotNetProject)
+ IPackageManagementProject CreatePackageManagementProject (DotNetProject project)
{
+ var dotNetProject = new DotNetProjectProxy (project);
return packageManagementSolution.GetProject (packageRepositoryCache.CreateAggregateRepository (), dotNetProject);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs
index 4f5d627629..eda02af109 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopPackageManagerFactory.cs
@@ -26,6 +26,7 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -57,10 +58,10 @@ namespace ICSharpCode.PackageManagement
public ISharpDevelopPackageManager CreatePackageManager(
IPackageRepository sourceRepository,
- DotNetProject project)
+ IDotNetProject project)
{
- SolutionPackageRepository solutionPackageRepository = CreateSolutionPackageRepository(project.ParentSolution);
- IProjectSystem projectSystem = CreateProjectSystem(project);
+ SolutionPackageRepository solutionPackageRepository = CreateSolutionPackageRepository (project.ParentSolution);
+ IProjectSystem projectSystem = CreateProjectSystem (project.DotNetProject);
PackageOperationsResolverFactory packageOperationResolverFactory = new PackageOperationsResolverFactory();
return new SharpDevelopPackageManager(
@@ -70,9 +71,9 @@ namespace ICSharpCode.PackageManagement
packageOperationResolverFactory);
}
- SolutionPackageRepository CreateSolutionPackageRepository(Solution solution)
+ SolutionPackageRepository CreateSolutionPackageRepository (ISolution solution)
{
- return new SolutionPackageRepository(solution, packageRepositoryFactory, options);
+ return new SolutionPackageRepository (solution, packageRepositoryFactory, options);
}
IProjectSystem CreateProjectSystem(DotNetProject project)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs
index 258818d24f..07851a4676 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SharpDevelopProjectSystem.cs
@@ -41,25 +41,32 @@ namespace ICSharpCode.PackageManagement
{
public class SharpDevelopProjectSystem : PhysicalFileSystem, IProjectSystem
{
- DotNetProject project;
+ IDotNetProject project;
ProjectTargetFramework targetFramework;
IPackageManagementFileService fileService;
IPackageManagementProjectService projectService;
-
+ Action<MessageHandler> guiSyncDispatcher;
+
public SharpDevelopProjectSystem(DotNetProject project)
- : this(project, new PackageManagementFileService(), new PackageManagementProjectService())
+ : this (
+ new DotNetProjectProxy (project),
+ new PackageManagementFileService (),
+ new PackageManagementProjectService (),
+ DispatchService.GuiSyncDispatch)
{
}
- public SharpDevelopProjectSystem(
- DotNetProject project,
+ public SharpDevelopProjectSystem (
+ IDotNetProject project,
IPackageManagementFileService fileService,
- IPackageManagementProjectService projectService)
- : base(AppendTrailingSlashToDirectory(project.BaseDirectory))
+ IPackageManagementProjectService projectService,
+ Action<MessageHandler> guiSyncDispatcher)
+ : base (AppendTrailingSlashToDirectory (project.BaseDirectory))
{
this.project = project;
this.fileService = fileService;
this.projectService = projectService;
+ this.guiSyncDispatcher = guiSyncDispatcher;
}
static string AppendTrailingSlashToDirectory(string directory)
@@ -88,14 +95,17 @@ namespace ICSharpCode.PackageManagement
return GuiSyncDispatch (() => project.Name);
}
}
-
- public dynamic GetPropertyValue(string propertyName)
+
+ public dynamic GetPropertyValue (string propertyName)
{
return GuiSyncDispatch (() => {
- return project.GetEvaluatedProperty (propertyName);
+ if ("RootNamespace".Equals(propertyName, StringComparison.OrdinalIgnoreCase)) {
+ return project.DefaultNamespace;
+ }
+ return String.Empty;
});
}
-
+
public void AddReference(string referencePath, Stream stream)
{
GuiSyncDispatch (() => {
@@ -249,10 +259,15 @@ namespace ICSharpCode.PackageManagement
public override void AddFile(string path, Action<Stream> writeToStream)
{
- base.AddFile(path, writeToStream);
+ PhysicalFileSystemAddFile (path, writeToStream);
GuiSyncDispatch (() => AddFileToProject (path));
}
-
+
+ protected virtual void PhysicalFileSystemAddFile (string path, Action<Stream> writeToStream)
+ {
+ base.AddFile(path, writeToStream);
+ }
+
void AddFileToProject(string path)
{
if (ShouldAddFileToProject(path)) {
@@ -416,13 +431,13 @@ namespace ICSharpCode.PackageManagement
T GuiSyncDispatch<T> (Func<T> action)
{
T result = default(T);
- DispatchService.GuiSyncDispatch (() => result = action ());
+ guiSyncDispatcher (() => result = action ());
return result;
}
void GuiSyncDispatch (Action action)
{
- DispatchService.GuiSyncDispatch (() => action ());
+ guiSyncDispatcher (() => action ());
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs
index e6cb4013e5..47600b40a3 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepository.cs
@@ -30,7 +30,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
-using MonoDevelop.Projects;
+using MonoDevelop.PackageManagement;
using NuGet;
namespace ICSharpCode.PackageManagement
@@ -43,16 +43,16 @@ namespace ICSharpCode.PackageManagement
PhysicalFileSystem fileSystem;
ISharedPackageRepository repository;
- public SolutionPackageRepository(Solution solution)
- : this(
+ public SolutionPackageRepository (ISolution solution)
+ : this (
solution,
new SharpDevelopPackageRepositoryFactory(),
PackageManagementServices.Options)
{
}
- public SolutionPackageRepository(
- Solution solution,
+ public SolutionPackageRepository (
+ ISolution solution,
ISharpDevelopPackageRepositoryFactory repositoryFactory,
PackageManagementOptions options)
{
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs
index 9ac4dca212..d08e71d5c7 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryFactory.cs
@@ -27,6 +27,7 @@
//
using System;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -50,9 +51,9 @@ namespace ICSharpCode.PackageManagement
this.options = options;
}
- public ISolutionPackageRepository CreateSolutionPackageRepository(Solution solution)
+ public ISolutionPackageRepository CreateSolutionPackageRepository (ISolution solution)
{
- return new SolutionPackageRepository(solution, repositoryFactory, options);
+ return new SolutionPackageRepository (solution, repositoryFactory, options);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs
index 6daca5784d..3265a3984e 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionPackageRepositoryPath.cs
@@ -28,6 +28,7 @@
using System;
using System.IO;
+using MonoDevelop.PackageManagement;
using MonoDevelop.Projects;
using NuGet;
@@ -36,20 +37,20 @@ namespace ICSharpCode.PackageManagement
public class SolutionPackageRepositoryPath
{
string packagesRelativeDirectory;
- Solution solution;
+ ISolution solution;
DefaultPackagePathResolver pathResolver;
public SolutionPackageRepositoryPath(Project project)
- : this(project, new PackageManagementOptions())
+ : this (new ProjectProxy (project), new PackageManagementOptions ())
{
}
- public SolutionPackageRepositoryPath(Project project, PackageManagementOptions options)
- : this(project.ParentSolution, options)
+ public SolutionPackageRepositoryPath (IProject project, PackageManagementOptions options)
+ : this (project.ParentSolution, options)
{
}
- public SolutionPackageRepositoryPath(Solution solution, PackageManagementOptions options)
+ public SolutionPackageRepositoryPath (ISolution solution, PackageManagementOptions options)
{
packagesRelativeDirectory = options.PackagesDirectory;
this.solution = solution;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionProxy.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionProxy.cs
new file mode 100644
index 0000000000..a41e940ccd
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/SolutionProxy.cs
@@ -0,0 +1,51 @@
+//
+// SolutionProxy.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// 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 MonoDevelop.Core;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ public class SolutionProxy : ISolution
+ {
+ Solution solution;
+
+ public SolutionProxy (Solution solution)
+ {
+ this.solution = solution;
+ }
+
+ public FilePath BaseDirectory {
+ get { return solution.BaseDirectory; }
+ }
+
+ public FilePath FileName {
+ get { return solution.FileName; }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs
index 56badb8e9f..55ff40412a 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs
@@ -36,22 +36,22 @@ namespace ICSharpCode.PackageManagement
{
public class ThreadSafePackageManagementEvents : IThreadSafePackageManagementEvents
{
- static Action<MessageHandler> defaultGuiSyncDispatch = DispatchService.GuiSyncDispatch;
+ static Action<MessageHandler> defaultGuiSyncDispatcher = DispatchService.GuiSyncDispatch;
- Action<MessageHandler> guiSyncDispatch;
+ Action<MessageHandler> guiSyncDispatcher;
IPackageManagementEvents unsafeEvents;
public ThreadSafePackageManagementEvents (IPackageManagementEvents unsafeEvents)
- : this (unsafeEvents, defaultGuiSyncDispatch)
+ : this (unsafeEvents, defaultGuiSyncDispatcher)
{
}
public ThreadSafePackageManagementEvents (
IPackageManagementEvents unsafeEvents,
- Action<MessageHandler> guiSyncDispatch)
+ Action<MessageHandler> guiSyncDispatcher)
{
this.unsafeEvents = unsafeEvents;
- this.guiSyncDispatch = guiSyncDispatch;
+ this.guiSyncDispatcher = guiSyncDispatcher;
RegisterEventHandlers();
}
@@ -86,7 +86,7 @@ namespace ICSharpCode.PackageManagement
void RaisePackageOperationStartingEventIfHasSubscribers(object sender, EventArgs e)
{
if (PackageOperationsStarting != null) {
- guiSyncDispatch (() => RaisePackageOperationStartingEvent (sender, e));
+ guiSyncDispatcher (() => RaisePackageOperationStartingEvent (sender, e));
}
}
@@ -100,7 +100,7 @@ namespace ICSharpCode.PackageManagement
void RaisePackageOperationFinishedEventIfHasSubscribers(object sender, EventArgs e)
{
if (PackageOperationsFinished != null) {
- guiSyncDispatch (() => RaisePackageOperationFinishedEvent (sender, e));
+ guiSyncDispatcher (() => RaisePackageOperationFinishedEvent (sender, e));
}
}
@@ -114,14 +114,14 @@ namespace ICSharpCode.PackageManagement
void RaisePackageOperationErrorEventIfHasSubscribers(object sender, PackageOperationExceptionEventArgs e)
{
if (PackageOperationError != null) {
- guiSyncDispatch (() => RaisePackageOperationErrorEvent(sender, e));
+ guiSyncDispatcher (() => RaisePackageOperationErrorEvent(sender, e));
}
}
void RaisePackageOperationErrorEvent(object sender, PackageOperationExceptionEventArgs e)
{
if (PackageOperationError != null) {
- guiSyncDispatch (() => PackageOperationError(sender, e));
+ guiSyncDispatcher (() => PackageOperationError(sender, e));
}
}
@@ -130,7 +130,7 @@ namespace ICSharpCode.PackageManagement
void RaiseParentPackageInstalledEventIfHasSubscribers(object sender, ParentPackageOperationEventArgs e)
{
if (ParentPackageInstalled != null) {
- guiSyncDispatch (() => RaiseParentPackageInstalledEvent(sender, e));
+ guiSyncDispatcher (() => RaiseParentPackageInstalledEvent(sender, e));
}
}
@@ -144,7 +144,7 @@ namespace ICSharpCode.PackageManagement
void RaiseParentPackageUninstalledEventIfHasSubscribers(object sender, ParentPackageOperationEventArgs e)
{
if (ParentPackageUninstalled != null) {
- guiSyncDispatch (() => RaiseParentPackageUninstalledEvent(sender, e));
+ guiSyncDispatcher (() => RaiseParentPackageUninstalledEvent(sender, e));
}
}
@@ -220,7 +220,7 @@ namespace ICSharpCode.PackageManagement
void RaiseResolveFileConflictEventIfHasSubscribers (object sender, ResolveFileConflictEventArgs e)
{
if (ResolveFileConflict != null) {
- guiSyncDispatch (() => ResolveFileConflict (sender, e));
+ guiSyncDispatcher (() => ResolveFileConflict (sender, e));
}
}
@@ -234,7 +234,7 @@ namespace ICSharpCode.PackageManagement
void RaiseParentPackagesUpdatedEventIfHasSubscribers(object sender, ParentPackagesOperationEventArgs e)
{
if (ParentPackagesUpdated != null) {
- guiSyncDispatch (() => RaiseParentPackagesUpdatedEvent(sender, e));
+ guiSyncDispatcher (() => RaiseParentPackagesUpdatedEvent(sender, e));
}
}