void CreateProject (IPackageRepository sourceRepository)
		{
			fakePackageManagerFactory = new FakePackageManagerFactory ();
			fakePackageManager = fakePackageManagerFactory.FakePackageManager;
			fakeProjectManager = fakePackageManager.FakeProjectManager;
			fakeProject = new FakeDotNetProject ();
			packageManagementEvents = new PackageManagementEvents ();

			project = new PackageManagementProject (
				sourceRepository,
				fakeProject,
				packageManagementEvents,
				fakePackageManagerFactory);
		}
		void RaisePackageRemovedEventWhenPackageReferenceAdded (
			FakeProjectManager projectManager,
			FakePackage newPackage,
			params PackageOperationEventArgs[] eventArgs)
		{
			projectManager.WhenAddPackageReferenceCalled (
				newPackage.Id,
				newPackage.Version,
				() => eventArgs.ToList ().ForEach (eventArg => projectManager.FirePackageReferenceRemoved (eventArg)));
		}
		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));
		}
		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));
		}
		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));
		}