8 changed files with 163 additions and 10 deletions
@ -0,0 +1,11 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement |
||||||
|
{ |
||||||
|
public interface IPackageRepositoryCache : ISharpDevelopPackageRepositoryFactory |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
// 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 NuGet; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement |
||||||
|
{ |
||||||
|
public class PackageRepositoryCache : IPackageRepositoryCache |
||||||
|
{ |
||||||
|
ISharpDevelopPackageRepositoryFactory factory; |
||||||
|
Dictionary<PackageSource, IPackageRepository> repositories = |
||||||
|
new Dictionary<PackageSource, IPackageRepository>(); |
||||||
|
|
||||||
|
public PackageRepositoryCache(ISharpDevelopPackageRepositoryFactory factory) |
||||||
|
{ |
||||||
|
this.factory = factory; |
||||||
|
} |
||||||
|
|
||||||
|
public PackageRepositoryCache() |
||||||
|
: this(new SharpDevelopPackageRepositoryFactory()) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public IPackageRepository CreateRepository(PackageSource packageSource) |
||||||
|
{ |
||||||
|
IPackageRepository repository = GetExistingRepository(packageSource); |
||||||
|
if (repository != null) { |
||||||
|
return repository; |
||||||
|
} |
||||||
|
return CreateNewCachedRepository(packageSource); |
||||||
|
} |
||||||
|
|
||||||
|
IPackageRepository GetExistingRepository(PackageSource packageSource) |
||||||
|
{ |
||||||
|
IPackageRepository repository = null; |
||||||
|
if (repositories.TryGetValue(packageSource, out repository)) { |
||||||
|
return repository; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
IPackageRepository CreateNewCachedRepository(PackageSource packageSource) |
||||||
|
{ |
||||||
|
IPackageRepository repository = factory.CreateRepository(packageSource); |
||||||
|
repositories.Add(packageSource, repository); |
||||||
|
return repository; |
||||||
|
} |
||||||
|
|
||||||
|
public ISharedPackageRepository CreateSharedRepository(string path) |
||||||
|
{ |
||||||
|
return factory.CreateSharedRepository(path); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,79 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using ICSharpCode.PackageManagement; |
||||||
|
using NuGet; |
||||||
|
using NUnit.Framework; |
||||||
|
using PackageManagement.Tests.Helpers; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class PackageRepositoryCacheTests |
||||||
|
{ |
||||||
|
PackageRepositoryCache cache; |
||||||
|
FakePackageRepositoryFactory fakePackageRepositoryFactory; |
||||||
|
PackageSource nuGetPackageSource; |
||||||
|
|
||||||
|
void CreateCache() |
||||||
|
{ |
||||||
|
nuGetPackageSource = new PackageSource("http://nuget.org", "NuGet"); |
||||||
|
fakePackageRepositoryFactory = new FakePackageRepositoryFactory(); |
||||||
|
cache = new PackageRepositoryCache(fakePackageRepositoryFactory); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CreateRepository_CacheCastToISharpDevelopPackageRepositoryFactory_CreatesPackageRepositoryUsingPackageRepositoryFactoryPassedInConstructor() |
||||||
|
{ |
||||||
|
CreateCache(); |
||||||
|
var factory = cache as ISharpDevelopPackageRepositoryFactory; |
||||||
|
IPackageRepository repository = factory.CreateRepository(nuGetPackageSource); |
||||||
|
|
||||||
|
Assert.AreEqual(fakePackageRepositoryFactory.FakePackageRepository, repository); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CreateRepository_PackageSourcePassed_PackageSourceUsedToCreateRepository() |
||||||
|
{ |
||||||
|
CreateCache(); |
||||||
|
cache.CreateRepository(nuGetPackageSource); |
||||||
|
|
||||||
|
var actualPackageSource = fakePackageRepositoryFactory.FirstPackageSourcePassedToCreateRepository; |
||||||
|
Assert.AreEqual(nuGetPackageSource, actualPackageSource); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CreateRepository_RepositoryAlreadyCreatedForPackageSource_NoRepositoryCreated() |
||||||
|
{ |
||||||
|
CreateCache(); |
||||||
|
cache.CreateRepository(nuGetPackageSource); |
||||||
|
fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Clear(); |
||||||
|
|
||||||
|
cache.CreateRepository(nuGetPackageSource); |
||||||
|
|
||||||
|
Assert.AreEqual(0, fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Count); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CreateRepository_RepositoryAlreadyCreatedForPackageSource_RepositoryOriginallyCreatedIsReturned() |
||||||
|
{ |
||||||
|
CreateCache(); |
||||||
|
IPackageRepository originallyCreatedRepository = cache.CreateRepository(nuGetPackageSource); |
||||||
|
fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Clear(); |
||||||
|
|
||||||
|
IPackageRepository repository = cache.CreateRepository(nuGetPackageSource); |
||||||
|
|
||||||
|
Assert.AreSame(originallyCreatedRepository, repository); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CreatedSharedRepository_PathPassed_PathUsedToCreatedSharedRepository() |
||||||
|
{ |
||||||
|
CreateCache(); |
||||||
|
FakeSharedPackageRepository repository = cache.CreateSharedRepository("abc") as FakeSharedPackageRepository; |
||||||
|
|
||||||
|
Assert.AreEqual("abc", repository.PathPassedToConstructor); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue