13 changed files with 365 additions and 8 deletions
@ -0,0 +1,77 @@ |
|||||||
|
// 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 System.Linq; |
||||||
|
using NuGet; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement |
||||||
|
{ |
||||||
|
public class RecentPackageRepository : IPackageRepository |
||||||
|
{ |
||||||
|
public const int DefaultMaximumPackagesCount = 20; |
||||||
|
|
||||||
|
List<IPackage> packages = new List<IPackage>(); |
||||||
|
int maximumPackagesCount = DefaultMaximumPackagesCount; |
||||||
|
|
||||||
|
public RecentPackageRepository() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public string Source { |
||||||
|
get { return "RecentPackages"; } |
||||||
|
} |
||||||
|
|
||||||
|
public void AddPackage(IPackage package) |
||||||
|
{ |
||||||
|
RemovePackageIfAlreadyAdded(package); |
||||||
|
AddPackageAtBeginning(package); |
||||||
|
RemoveLastPackageIfCurrentPackageCountExceedsMaximum(); |
||||||
|
} |
||||||
|
|
||||||
|
void RemovePackageIfAlreadyAdded(IPackage package) |
||||||
|
{ |
||||||
|
int index = FindPackage(package); |
||||||
|
if (index >= 0) { |
||||||
|
packages.RemoveAt(index); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
int FindPackage(IPackage package) |
||||||
|
{ |
||||||
|
return packages.FindIndex(p => PackageEqualityComparer.IdAndVersion.Equals(package, p)); |
||||||
|
} |
||||||
|
|
||||||
|
void AddPackageAtBeginning(IPackage package) |
||||||
|
{ |
||||||
|
packages.Insert(0, package); |
||||||
|
} |
||||||
|
|
||||||
|
void RemoveLastPackageIfCurrentPackageCountExceedsMaximum() |
||||||
|
{ |
||||||
|
if (packages.Count > maximumPackagesCount) { |
||||||
|
RemoveLastPackage(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void RemoveLastPackage() |
||||||
|
{ |
||||||
|
packages.RemoveAt(packages.Count - 1); |
||||||
|
} |
||||||
|
|
||||||
|
public void RemovePackage(IPackage package) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public IQueryable<IPackage> GetPackages() |
||||||
|
{ |
||||||
|
return packages.AsQueryable(); |
||||||
|
} |
||||||
|
|
||||||
|
public int MaximumPackagesCount { |
||||||
|
get { return maximumPackagesCount; } |
||||||
|
set { maximumPackagesCount = value; } |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
// 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.Linq; |
||||||
|
using NuGet; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement |
||||||
|
{ |
||||||
|
public class RecentPackagesViewModel : PackagesViewModel |
||||||
|
{ |
||||||
|
IPackageRepository recentPackageRepository; |
||||||
|
|
||||||
|
public RecentPackagesViewModel(IPackageManagementService packageManagementService, ITaskFactory taskFactory) |
||||||
|
: base(packageManagementService, taskFactory) |
||||||
|
{ |
||||||
|
recentPackageRepository = packageManagementService.RecentPackageRepository; |
||||||
|
packageManagementService.PackageInstalled += PackageInstalled; |
||||||
|
} |
||||||
|
|
||||||
|
void PackageInstalled(object sender, EventArgs e) |
||||||
|
{ |
||||||
|
ReadPackages(); |
||||||
|
} |
||||||
|
|
||||||
|
protected override IQueryable<IPackage> GetAllPackages() |
||||||
|
{ |
||||||
|
return recentPackageRepository.GetPackages(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,111 @@ |
|||||||
|
// 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 System.Linq; |
||||||
|
using ICSharpCode.PackageManagement; |
||||||
|
using ICSharpCode.PackageManagement.Design; |
||||||
|
using NuGet; |
||||||
|
using NUnit.Framework; |
||||||
|
using PackageManagement.Tests.Helpers; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class RecentPackageRepositoryTests |
||||||
|
{ |
||||||
|
RecentPackageRepository repository; |
||||||
|
|
||||||
|
void CreateRepository() |
||||||
|
{ |
||||||
|
repository = new RecentPackageRepository(); |
||||||
|
} |
||||||
|
|
||||||
|
FakePackage AddOnePackageToRepository(string id) |
||||||
|
{ |
||||||
|
var package = new FakePackage(id); |
||||||
|
repository.AddPackage(package); |
||||||
|
return package; |
||||||
|
} |
||||||
|
|
||||||
|
IEnumerable<IPackage> AddTwoDifferentPackagesToRepository() |
||||||
|
{ |
||||||
|
yield return AddOnePackageToRepository("Test.Package.1"); |
||||||
|
yield return AddOnePackageToRepository("Test.Package.2"); |
||||||
|
} |
||||||
|
|
||||||
|
IEnumerable<IPackage> AddFourDifferentPackagesToRepository() |
||||||
|
{ |
||||||
|
yield return AddOnePackageToRepository("Test.Package.1"); |
||||||
|
yield return AddOnePackageToRepository("Test.Package.2"); |
||||||
|
yield return AddOnePackageToRepository("Test.Package.3"); |
||||||
|
yield return AddOnePackageToRepository("Test.Package.4"); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Source_NewRecentRepositoryCreated_IsRecentPackages() |
||||||
|
{ |
||||||
|
CreateRepository(); |
||||||
|
Assert.AreEqual("RecentPackages", repository.Source); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetPackages_RepositoryIsEmptyAndOnePackageAdded_ReturnsPackageAdded() |
||||||
|
{ |
||||||
|
CreateRepository(); |
||||||
|
var package = AddOnePackageToRepository("Test.Package"); |
||||||
|
|
||||||
|
var packages = repository.GetPackages(); |
||||||
|
|
||||||
|
var expectedPackages = new FakePackage[] { |
||||||
|
package |
||||||
|
}; |
||||||
|
|
||||||
|
PackageCollectionAssert.AreEqual(expectedPackages, packages); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetPackages_RepositoryIsEmptyAndTwoDifferentPackagesAdded_ReturnsPackagesInReverseOrderWithLastAddedFirst() |
||||||
|
{ |
||||||
|
CreateRepository(); |
||||||
|
var packagesAdded = AddTwoDifferentPackagesToRepository(); |
||||||
|
|
||||||
|
var packages = repository.GetPackages(); |
||||||
|
|
||||||
|
var expectedPackages = packagesAdded.Reverse(); |
||||||
|
|
||||||
|
PackageCollectionAssert.AreEqual(expectedPackages, packages); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetPackages_RepositoryCanHoldThreePackagesAndFourPackagesAdded_ReturnsLastThreePackagesAddedInReverseOrder() |
||||||
|
{ |
||||||
|
CreateRepository(); |
||||||
|
repository.MaximumPackagesCount = 3; |
||||||
|
var packagesAdded = AddFourDifferentPackagesToRepository(); |
||||||
|
|
||||||
|
var packages = repository.GetPackages(); |
||||||
|
|
||||||
|
var expectedPackages = packagesAdded.Reverse().Take(3); |
||||||
|
|
||||||
|
PackageCollectionAssert.AreEqual(expectedPackages, packages); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetPackages_RepositoryIsEmptyAndSamePackageIsAddedTwice_OnePackageReturned() |
||||||
|
{ |
||||||
|
CreateRepository(); |
||||||
|
AddOnePackageToRepository("Test"); |
||||||
|
var package = AddOnePackageToRepository("Test"); |
||||||
|
|
||||||
|
var packages = repository.GetPackages(); |
||||||
|
|
||||||
|
var expectedPackages = new FakePackage[] { |
||||||
|
package |
||||||
|
}; |
||||||
|
|
||||||
|
PackageCollectionAssert.AreEqual(expectedPackages, packages); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,67 @@ |
|||||||
|
// 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 ICSharpCode.PackageManagement.Design; |
||||||
|
using NUnit.Framework; |
||||||
|
using PackageManagement.Tests.Helpers; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class RecentPackagesViewModelTests |
||||||
|
{ |
||||||
|
RecentPackagesViewModel viewModel; |
||||||
|
FakePackageManagementService packageManagementService; |
||||||
|
FakeTaskFactory taskFactory; |
||||||
|
|
||||||
|
void CreateViewModel() |
||||||
|
{ |
||||||
|
CreatePackageManagementService(); |
||||||
|
CreateViewModel(packageManagementService); |
||||||
|
} |
||||||
|
|
||||||
|
void CreatePackageManagementService() |
||||||
|
{ |
||||||
|
packageManagementService = new FakePackageManagementService(); |
||||||
|
} |
||||||
|
|
||||||
|
void CreateViewModel(FakePackageManagementService packageManagementService) |
||||||
|
{ |
||||||
|
taskFactory = new FakeTaskFactory(); |
||||||
|
viewModel = new RecentPackagesViewModel(packageManagementService, taskFactory); |
||||||
|
} |
||||||
|
|
||||||
|
void CompleteReadPackagesTask() |
||||||
|
{ |
||||||
|
taskFactory.ExecuteAllFakeTasks(); |
||||||
|
} |
||||||
|
|
||||||
|
void ClearReadPackagesTasks() |
||||||
|
{ |
||||||
|
taskFactory.ClearAllFakeTasks(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void PackageViewModels_PackageIsInstalledAfterRecentPackagesDisplayed_PackagesOnDisplayAreUpdated() |
||||||
|
{ |
||||||
|
CreateViewModel(); |
||||||
|
viewModel.ReadPackages(); |
||||||
|
CompleteReadPackagesTask(); |
||||||
|
var package = new FakePackage("Test"); |
||||||
|
FakePackageRepository repository = packageManagementService.FakeRecentPackageRepository; |
||||||
|
repository.FakePackages.Add(package); |
||||||
|
|
||||||
|
ClearReadPackagesTasks(); |
||||||
|
packageManagementService.FirePackageInstalled(); |
||||||
|
CompleteReadPackagesTask(); |
||||||
|
|
||||||
|
var expectedPackages = new FakePackage[] { |
||||||
|
package |
||||||
|
}; |
||||||
|
|
||||||
|
PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue