#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

552 lines
18 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.Core;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design;
using ICSharpCode.SharpDevelop.Project;
using NuGet;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests
{
[TestFixture]
public class SharpDevelopPackageManagerTests
{
SharpDevelopPackageManager packageManager;
FakePackageRepository fakeFeedSourceRepository;
FakeSharedPackageRepository fakeSolutionSharedRepository;
IProject testProject;
PackageManagementOptions options;
PackageRepositoryPaths repositoryPaths;
PackageReferenceRepositoryHelper packageRefRepositoryHelper;
TestableProjectManager testableProjectManager;
FakeFileSystem fakeFileSystem;
FakePackageOperationResolverFactory fakePackageOperationResolverFactory;
void CreatePackageManager(IProject project, PackageReferenceRepositoryHelper packageRefRepositoryHelper)
{
options = new PackageManagementOptions(new Properties());
options.PackagesDirectory = "packages";
repositoryPaths = new PackageRepositoryPaths(project, options);
var pathResolver = new DefaultPackagePathResolver(repositoryPaths.SolutionPackagesPath);
fakeFileSystem = new FakeFileSystem();
fakeFeedSourceRepository = new FakePackageRepository();
fakeSolutionSharedRepository = packageRefRepositoryHelper.FakeSharedSourceRepository;
fakePackageOperationResolverFactory = new FakePackageOperationResolverFactory();
packageManager = new SharpDevelopPackageManager(fakeFeedSourceRepository,
packageRefRepositoryHelper.FakeProjectSystem,
fakeFileSystem,
fakeSolutionSharedRepository,
pathResolver,
fakePackageOperationResolverFactory);
}
void CreatePackageManager()
{
CreateTestProject();
CreatePackageReferenceRepositoryHelper();
CreatePackageManager(testProject, packageRefRepositoryHelper);
}
void CreatePackageReferenceRepositoryHelper()
{
packageRefRepositoryHelper = new PackageReferenceRepositoryHelper();
}
void CreateTestProject()
{
testProject = ProjectHelper.CreateTestProject();
}
void CreateTestableProjectManager()
{
testableProjectManager = new TestableProjectManager();
packageManager.ProjectManager = testableProjectManager;
}
FakePackage CreateFakePackage()
{
var package = new FakePackage();
package.Id = "Test";
package.Version = new Version(1, 0, 0, 0);
return package;
}
FakePackage InstallPackage()
{
FakePackage package = CreateFakePackage();
packageManager.InstallPackage(package);
return package;
}
FakePackage InstallPackageWithNoPackageOperations()
{
return InstallPackageWithNoPackageOperations(ignoreDependencies: false);
}
FakePackage InstallPackageWithNoPackageOperationsAndIgnoreDependencies()
{
return InstallPackageWithNoPackageOperations(ignoreDependencies: true);
}
FakePackage InstallPackageWithNoPackageOperations(bool ignoreDependencies)
{
FakePackage package = CreateFakePackage();
var operations = new List<PackageOperation>();
packageManager.InstallPackage(package, operations, ignoreDependencies);
return package;
}
FakePackage InstallPackageWithPackageOperations(PackageOperation operation)
{
var operations = new PackageOperation[] {
operation
};
FakePackage package = CreateFakePackage();
packageManager.InstallPackage(package, operations, false);
return package;
}
FakePackage InstallPackageAndIgnoreDependencies()
{
FakePackage package = CreateFakePackage();
packageManager.InstallPackage(package, true);
return package;
}
FakePackage InstallPackageAndDoNotIgnoreDependencies()
{
FakePackage package = CreateFakePackage();
packageManager.InstallPackage(package, false);
return package;
}
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()
{
var package = CreateFakePackage();
package.Id = "PackageToInstall";
return new PackageOperation(package, PackageAction.Install);
}
IEnumerable<PackageOperation> GetInstallPackageOperations(FakePackage package)
{
return packageManager.GetInstallPackageOperations(package, false);
}
IEnumerable<PackageOperation> GetInstallPackageOperationsAndIgnoreDependencies(FakePackage package)
{
return packageManager.GetInstallPackageOperations(package, true);
}
FakePackage UpdatePackageWithNoPackageOperations()
{
FakePackage package = CreateFakePackage();
var operations = new List<PackageOperation>();
packageManager.UpdatePackage(package, operations, true);
return package;
}
FakePackage UpdatePackageWithPackageOperations(PackageOperation operation)
{
var operations = new PackageOperation[] {
operation
};
FakePackage package = CreateFakePackage();
packageManager.UpdatePackage(package, operations, true);
return package;
}
FakePackage UpdatePackageWithNoPackageOperationsAndDoNotUpdateDependencies()
{
FakePackage package = CreateFakePackage();
var operations = new List<PackageOperation>();
packageManager.UpdatePackage(package, operations, false);
return package;
}
[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(testProject, 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();
var package = InstallPackage();
Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
}
[Test]
public void InstallPackage_PackageInstancePassed_DependenciesNotIgnoredWhenAddingReferenceToProject()
{
CreatePackageManager();
CreateTestableProjectManager();
InstallPackage();
Assert.IsFalse(testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
}
[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_PackageInstanceAndPackageOperationsPassedAndIgnoreDependenciesIsTrue_IgnoreDependenciesWhenAddingReferenceToProject()
{
CreatePackageManager();
CreateTestableProjectManager();
InstallPackageWithNoPackageOperationsAndIgnoreDependencies();
Assert.IsTrue(testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
}
[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_PackageDependenciesIgnored_AddsReferenceToPackage()
{
CreatePackageManager();
CreateTestableProjectManager();
var 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();
var package = InstallPackageAndDoNotIgnoreDependencies();
Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
}
[Test]
public void UninstallPackage_PackageInProjectLocalRepository_RemovesReferenceFromProject()
{
CreatePackageManager();
CreateTestableProjectManager();
var 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 GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageOperationsReturnedFromPackageOperationsResolverCreated()
{
CreatePackageManager();
var package = new FakePackage();
var operations = GetInstallPackageOperations(package);
var expectedOperations = fakePackageOperationResolverFactory.FakeInstallPackageOperationResolver.PackageOperations;
Assert.AreEqual(expectedOperations, operations);
}
[Test]
public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLocalRepositoryWhenGettingPackageOperations()
{
CreatePackageManager();
var package = new FakePackage();
GetInstallPackageOperations(package);
var expectedRepository = packageManager.LocalRepository;
var actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateInstallPackageOperationsResolver;
Assert.AreEqual(expectedRepository, actualRepository);
}
[Test]
public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesSourceRepositoryWhenGettingPackageOperations()
{
CreatePackageManager();
var package = new FakePackage();
GetInstallPackageOperations(package);
var expectedRepository = packageManager.SourceRepository;
var actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateInstallPackageOperationsResolver;
Assert.AreEqual(expectedRepository, actualRepository);
}
[Test]
public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_DependenciesNotIgnored()
{
CreatePackageManager();
var package = new FakePackage();
GetInstallPackageOperations(package);
var result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
Assert.IsFalse(result);
}
[Test]
public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLoggerWhenGettingPackageOperations()
{
CreatePackageManager();
var package = new FakePackage();
GetInstallPackageOperations(package);
var expectedLogger = packageManager.Logger;
var actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateInstallPackageOperationResolver;
Assert.AreEqual(expectedLogger, actualLogger);
}
[Test]
public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageUsedWhenGettingPackageOperations()
{
CreatePackageManager();
var package = new FakePackage();
GetInstallPackageOperations(package);
var actualPackage = fakePackageOperationResolverFactory
.FakeInstallPackageOperationResolver
.PackagePassedToResolveOperations;
Assert.AreEqual(package, actualPackage);
}
[Test]
public void GetInstallPackageOperations_IgnoreDependenciesIsTrue_PackageOperationResolverIgnoresDependencies()
{
CreatePackageManager();
var package = new FakePackage();
GetInstallPackageOperationsAndIgnoreDependencies(package);
bool result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
Assert.IsTrue(result);
}
public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesReferenceInProject()
{
CreatePackageManager();
CreateTestableProjectManager();
var package = UpdatePackageWithNoPackageOperations();
Assert.AreEqual(package, testableProjectManager.PackagePassedToUpdatePackageReference);
}
[Test]
public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesDependenciesInProject()
{
CreatePackageManager();
CreateTestableProjectManager();
var package = UpdatePackageWithNoPackageOperations();
Assert.IsTrue(testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
}
[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);
}
}
}