diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
index 09d9701692..eb7ec25457 100644
--- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
+++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
@@ -80,6 +80,7 @@
+
@@ -91,6 +92,8 @@
+
+
LicenseAcceptanceView.xaml
@@ -109,6 +112,8 @@
+
+
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs
index 50e342f05d..5990b7ddf6 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs
@@ -15,12 +15,14 @@ namespace ICSharpCode.PackageManagement
AvailablePackagesViewModel availablePackagesViewModel;
PackageUpdatesViewModel packageUpdatesViewModel;
- public AddPackageReferenceViewModel(IPackageManagementService packageManagementService)
+ public AddPackageReferenceViewModel(
+ IPackageManagementService packageManagementService,
+ ITaskFactory taskFactory)
{
this.packageManagementService = packageManagementService;
- installedPackagesViewModel = new InstalledPackagesViewModel(packageManagementService);
- availablePackagesViewModel = new AvailablePackagesViewModel(packageManagementService);
- packageUpdatesViewModel = new PackageUpdatesViewModel(packageManagementService);
+ installedPackagesViewModel = new InstalledPackagesViewModel(packageManagementService, taskFactory);
+ availablePackagesViewModel = new AvailablePackagesViewModel(packageManagementService, taskFactory);
+ packageUpdatesViewModel = new PackageUpdatesViewModel(packageManagementService, taskFactory);
installedPackagesViewModel.ReadPackages();
availablePackagesViewModel.ReadPackages();
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs
index a7dd9075e2..4fb004f9a9 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs
@@ -11,8 +11,10 @@ namespace ICSharpCode.PackageManagement
{
public class AvailablePackagesViewModel : PackagesViewModel
{
- public AvailablePackagesViewModel(IPackageManagementService packageManagementService)
- : base(packageManagementService)
+ public AvailablePackagesViewModel(
+ IPackageManagementService packageManagementService,
+ ITaskFactory taskFactory)
+ : base(packageManagementService, taskFactory)
{
IsSearchable = true;
ShowPackageSources = packageManagementService.HasMultiplePackageSources;
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/DesignTimePackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/DesignTimePackagesViewModel.cs
index 925be2dd51..8b04991fa0 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/DesignTimePackagesViewModel.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/DesignTimePackagesViewModel.cs
@@ -11,7 +11,7 @@ namespace ICSharpCode.PackageManagement.Design
public class DesignTimePackagesViewModel : PackagesViewModel
{
public DesignTimePackagesViewModel()
- : base(new DesignTimePackageManagementService())
+ : base(new DesignTimePackageManagementService(), new PackageManagementTaskFactory())
{
PageSize = 3;
AddPackageViewModels();
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementService.cs
index 3a2a0bca71..10d9c5dc10 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementService.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementService.cs
@@ -38,10 +38,8 @@ namespace ICSharpCode.PackageManagement.Design
public IPackageRepository RepositoryPassedToUninstallPackage;
public IPackage PackagePassedToUninstallPackage;
- public FakeProjectManager FakeActiveProjectManager {
- get { return ActiveProjectManager as FakeProjectManager; }
- set { ActiveProjectManager = value; }
- }
+ public FakeProjectManager FakeActiveProjectManager { get; set; }
+
public FakePackageRepository FakeActivePackageRepository {
get { return ActivePackageRepository as FakePackageRepository; }
set { ActivePackageRepository = value; }
@@ -55,7 +53,15 @@ namespace ICSharpCode.PackageManagement.Design
}
public IPackageRepository ActivePackageRepository { get; set; }
- public IProjectManager ActiveProjectManager { get; set; }
+
+ public IProjectManager ActiveProjectManager {
+ get {
+ if (ActiveProjectManagerExeptionToThrow != null) {
+ throw ActiveProjectManagerExeptionToThrow;
+ }
+ return FakeActiveProjectManager;
+ }
+ }
public void InstallPackage(IPackageRepository repository, IPackage package)
{
@@ -117,5 +123,7 @@ namespace ICSharpCode.PackageManagement.Design
{
return FakeAggregateRepository;
}
+
+ public Exception ActiveProjectManagerExeptionToThrow { get; set; }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ITask.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ITask.cs
new file mode 100644
index 0000000000..e38d568b37
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/ITask.cs
@@ -0,0 +1,19 @@
+// 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 ITask
+ {
+ void Start();
+ void Cancel();
+
+ TResult Result { get; }
+
+ bool IsCancelled { get; }
+ bool IsFaulted { get; }
+ AggregateException Exception { get; }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ITaskFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ITaskFactory.cs
new file mode 100644
index 0000000000..dfda7faaf8
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/ITaskFactory.cs
@@ -0,0 +1,14 @@
+// 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 ITaskFactory
+ {
+ ITask CreateTask(
+ Func function,
+ Action> continueWith);
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs
index 5b5207612c..7b9765337a 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs
@@ -10,8 +10,10 @@ namespace ICSharpCode.PackageManagement
{
public class InstalledPackagesViewModel : PackagesViewModel
{
- public InstalledPackagesViewModel(IPackageManagementService packageManagementService)
- : base(packageManagementService)
+ public InstalledPackagesViewModel(
+ IPackageManagementService packageManagementService,
+ ITaskFactory taskFactory)
+ : base(packageManagementService, taskFactory)
{
packageManagementService.PackageInstalled += PackageInstalled;
packageManagementService.PackageUninstalled += PackageUninstalled;
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementTask.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementTask.cs
new file mode 100644
index 0000000000..cdc678d1d3
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementTask.cs
@@ -0,0 +1,63 @@
+// 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.Threading;
+using System.Threading.Tasks;
+
+namespace ICSharpCode.PackageManagement
+{
+ public class PackageManagementTask : ITask
+ {
+ Task task;
+ Action> continueWith;
+ CancellationTokenSource cancellationTokenSource;
+
+ public PackageManagementTask(
+ Func function,
+ Action> continueWith)
+ {
+ this.continueWith = continueWith;
+ CreateTask(function);
+ }
+
+ void CreateTask(Func function)
+ {
+ TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
+ cancellationTokenSource = new CancellationTokenSource();
+ task = new Task(function, cancellationTokenSource.Token);
+ task.ContinueWith(result => OnContinueWith(result), scheduler);
+ }
+
+ void OnContinueWith(Task task)
+ {
+ continueWith(this);
+ }
+
+ public void Start()
+ {
+ task.Start();
+ }
+
+ public TResult Result {
+ get { return task.Result; }
+ }
+
+ public void Cancel()
+ {
+ cancellationTokenSource.Cancel();
+ }
+
+ public bool IsCancelled {
+ get { return task.IsCanceled; }
+ }
+
+ public bool IsFaulted {
+ get { return task.IsFaulted; }
+ }
+
+ public AggregateException Exception {
+ get { return task.Exception; }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementTaskFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementTaskFactory.cs
new file mode 100644
index 0000000000..66c25e1fd1
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementTaskFactory.cs
@@ -0,0 +1,21 @@
+// 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.Threading.Tasks;
+
+using NuGet;
+
+namespace ICSharpCode.PackageManagement
+{
+ public class PackageManagementTaskFactory : ITaskFactory
+ {
+ public ITask CreateTask(
+ Func function,
+ Action> continueWith)
+ {
+ return new PackageManagementTask(function, continueWith);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageUpdatesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageUpdatesViewModel.cs
index e4ec539fd8..93cdaad823 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageUpdatesViewModel.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageUpdatesViewModel.cs
@@ -14,8 +14,10 @@ namespace ICSharpCode.PackageManagement
List packages = new List();
IPackageManagementService packageManagementService;
- public PackageUpdatesViewModel(IPackageManagementService packageManagementService)
- : base(packageManagementService)
+ public PackageUpdatesViewModel(
+ IPackageManagementService packageManagementService,
+ ITaskFactory taskFactory)
+ : base(packageManagementService, taskFactory)
{
this.packageManagementService = packageManagementService;
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageResult.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageResult.cs
new file mode 100644
index 0000000000..db53f5ce9f
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesForSelectedPageResult.cs
@@ -0,0 +1,25 @@
+// 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 PackagesForSelectedPageResult
+ {
+ public PackagesForSelectedPageResult(IEnumerable packages, int totalPackages)
+ {
+ this.Packages = packages;
+ this.TotalPackagesOnPage = packages.Count();
+ this.TotalPackages = totalPackages;
+ }
+
+ public IEnumerable Packages { get; set; }
+ public int TotalPackagesOnPage { get; set; }
+ public int TotalPackages { get; set; }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesView.xaml b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesView.xaml
index 152e1aced0..6ae59390f2 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesView.xaml
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesView.xaml
@@ -232,6 +232,14 @@
ItemsSource="{Binding Path=PackageViewModels}"
HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
+
allPackages;
string searchTerms;
+ bool isReadingPackages;
+ ITask task;
+ int totalItems;
+ bool hasError;
+ string errorMessage = String.Empty;
- public PackagesViewModel(IPackageManagementService packageManagementService)
- : this(packageManagementService, new LicenseAcceptanceService())
+ public PackagesViewModel(IPackageManagementService packageManagementService, ITaskFactory taskFactory)
+ : this(
+ packageManagementService,
+ new LicenseAcceptanceService(),
+ taskFactory)
{
}
public PackagesViewModel(
IPackageManagementService packageManagementService,
- ILicenseAcceptanceService licenseAcceptanceService)
+ ILicenseAcceptanceService licenseAcceptanceService,
+ ITaskFactory taskFactory)
: this(
packageManagementService,
- new PackageViewModelFactory(packageManagementService, licenseAcceptanceService))
+ new PackageViewModelFactory(packageManagementService, licenseAcceptanceService),
+ taskFactory)
{
}
public PackagesViewModel(
IPackageManagementService packageManagementService,
- IPackageViewModelFactory packageViewModelFactory)
+ IPackageViewModelFactory packageViewModelFactory,
+ ITaskFactory taskFactory)
{
this.packageManagementService = packageManagementService;
this.packageViewModelFactory = packageViewModelFactory;
- this.projectManager = packageManagementService.ActiveProjectManager;
+ this.taskFactory = taskFactory;
+ GetActiveProjectManager();
+
CreateCommands();
}
+ void GetActiveProjectManager()
+ {
+ try {
+ this.projectManager = packageManagementService.ActiveProjectManager;
+ } catch (Exception ex) {
+ SaveError(ex);
+ }
+ }
+
+ void SaveError(Exception ex)
+ {
+ hasError = true;
+ errorMessage = ex.Message;
+ }
+
void CreateCommands()
{
showNextPageCommand = new DelegateCommand(param => ShowNextPage());
@@ -77,6 +106,14 @@ namespace ICSharpCode.PackageManagement
get { return searchCommand; }
}
+ public bool HasError {
+ get { return hasError; }
+ }
+
+ public string ErrorMessage {
+ get { return errorMessage; }
+ }
+
public ObservableCollection PackageViewModels {
get { return packageViewModels; }
set { packageViewModels = value; }
@@ -90,42 +127,80 @@ namespace ICSharpCode.PackageManagement
get { return projectManager; }
}
+ public bool IsReadingPackages {
+ get { return isReadingPackages; }
+ }
+
public void ReadPackages()
{
allPackages = null;
SelectedPageNumber = 1;
- UpdatePackageViewModels();
+ StartReadPackagesTask();
}
- void PagesChanged(object sender, NotifyCollectionChangedEventArgs e)
+ void StartReadPackagesTask()
{
- UpdatePackageViewModels();
- base.OnPropertyChanged(null);
+ isReadingPackages = true;
+ ClearPackages();
+ CancelReadPackagesTask();
+ CreateReadPackagesTask();
+ task.Start();
+ }
+
+ void CancelReadPackagesTask()
+ {
+ if (task != null) {
+ task.Cancel();
+ }
+ }
+
+ void CreateReadPackagesTask()
+ {
+ task = taskFactory.CreateTask(
+ () => GetPackagesForSelectedPageResult(),
+ (result) => OnPackagesReadForSelectedPage(result));
}
- void UpdatePackageViewModels()
+ PackagesForSelectedPageResult GetPackagesForSelectedPageResult()
{
+ IEnumerable packages = GetPackagesForSelectedPage();
+ return new PackagesForSelectedPageResult(packages, totalItems);
+ }
+
+ void OnPackagesReadForSelectedPage(ITask task)
+ {
+ isReadingPackages = false;
+ if (task.IsFaulted) {
+ SaveError(task.Exception);
+ } else if (task.IsCancelled) {
+ // Ignore
+ } else {
+ UpdatePackagesForSelectedPage(task.Result);
+ }
+ base.OnPropertyChanged(null);
+ }
+
+ void UpdatePackagesForSelectedPage(PackagesForSelectedPageResult result)
+ {
pages.CollectionChanged -= PagesChanged;
- IEnumerable packages = GetPackagesForSelectedPage();
- pages.TotalItemsOnSelectedPage = packages.Count();
- UpdatePackageViewModels(packages);
+ pages.TotalItems = result.TotalPackages;
+ pages.TotalItemsOnSelectedPage = result.TotalPackagesOnPage;
+ UpdatePackageViewModels(result.Packages);
pages.CollectionChanged += PagesChanged;
}
- IEnumerable GetPackagesForSelectedPage()
+ void PagesChanged(object sender, NotifyCollectionChangedEventArgs e)
{
- IEnumerable filteredPackages = GetFilteredPackagesBeforePagingResults();
- return GetPackagesForSelectedPage(filteredPackages);
+ StartReadPackagesTask();
+ base.OnPropertyChanged(null);
}
- IEnumerable GetPackagesForSelectedPage(IEnumerable allPackages)
+ IEnumerable GetPackagesForSelectedPage()
{
- int packagesToSkip = pages.ItemsBeforeFirstPage;
- return allPackages
- .Skip(packagesToSkip)
- .Take(pages.PageSize);
+ IEnumerable filteredPackages = GetFilteredPackagesBeforePagingResults();
+ return GetPackagesForSelectedPage(filteredPackages);
}
IEnumerable GetFilteredPackagesBeforePagingResults()
@@ -133,12 +208,20 @@ namespace ICSharpCode.PackageManagement
if (allPackages == null) {
IQueryable packages = GetAllPackages();
packages = packages.Find(searchTerms);
- pages.TotalItems = packages.Count();
+ totalItems = packages.Count();
allPackages = GetFilteredPackagesBeforePagingResults(packages);
}
return allPackages;
}
+ IEnumerable GetPackagesForSelectedPage(IEnumerable allPackages)
+ {
+ int packagesToSkip = pages.ItemsBeforeFirstPage;
+ return allPackages
+ .Skip(packagesToSkip)
+ .Take(pages.PageSize);
+ }
+
///
/// Returns all the packages.
///
@@ -170,10 +253,15 @@ namespace ICSharpCode.PackageManagement
void UpdatePackageViewModels(IEnumerable newPackageViewModels)
{
- PackageViewModels.Clear();
+ ClearPackages();
PackageViewModels.AddRange(newPackageViewModels);
}
+ void ClearPackages()
+ {
+ PackageViewModels.Clear();
+ }
+
public IEnumerable ConvertToPackageViewModels(IEnumerable packages)
{
foreach (IPackage package in packages) {
@@ -217,6 +305,10 @@ namespace ICSharpCode.PackageManagement
set { pages.MaximumSelectablePages = value; }
}
+ public int TotalItems {
+ get { return totalItems; }
+ }
+
public void ShowNextPage()
{
SelectedPageNumber += 1;
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ViewModelLocator.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ViewModelLocator.cs
index 6762572a25..c1b5bd4d72 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/ViewModelLocator.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/ViewModelLocator.cs
@@ -24,7 +24,7 @@ namespace ICSharpCode.PackageManagement
void CreateAddPackageReferenceViewModel()
{
CreatePackageManagementService();
- addPackageReferenceViewModel = new AddPackageReferenceViewModel(packageManagementService);
+ addPackageReferenceViewModel = new AddPackageReferenceViewModel(packageManagementService, new PackageManagementTaskFactory());
}
void CreatePackageManagementService()
diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
index c9c8292807..163613fb6c 100644
--- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
+++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
@@ -77,6 +77,8 @@
+
+
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/AddPackageReferenceViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/AddPackageReferenceViewModelTests.cs
index b8ed4b9af5..ec598f63cd 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/AddPackageReferenceViewModelTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/AddPackageReferenceViewModelTests.cs
@@ -16,11 +16,12 @@ namespace PackageManagement.Tests
public class AddPackageReferenceViewModelTests
{
AddPackageReferenceViewModel viewModel;
- FakePackageManagementService fakePackageManagementService;
+ FakePackageManagementService fakePackageManagementService;
+ FakeTaskFactory taskFactory;
void CreatePackageManagementService()
{
- fakePackageManagementService = new FakePackageManagementService();
+ fakePackageManagementService = new FakePackageManagementService();
}
void CreateViewModel()
@@ -31,7 +32,9 @@ namespace PackageManagement.Tests
void CreateViewModel(FakePackageManagementService packageManagementService)
{
- viewModel = new AddPackageReferenceViewModel(packageManagementService);
+ taskFactory = new FakeTaskFactory();
+ viewModel = new AddPackageReferenceViewModel(packageManagementService, taskFactory);
+ taskFactory.ExecuteAllFakeTasks();
}
[Test]
@@ -39,7 +42,7 @@ namespace PackageManagement.Tests
{
CreatePackageManagementService();
var projectManager = new FakeProjectManager();
- fakePackageManagementService.ActiveProjectManager = projectManager;
+ fakePackageManagementService.FakeActiveProjectManager = projectManager;
FakePackage package = new FakePackage();
projectManager.FakeLocalRepository.FakePackages.Add(package);
CreateViewModel(fakePackageManagementService);
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs
index 37852a8706..1bd4a1f004 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs
@@ -16,6 +16,7 @@ namespace PackageManagement.Tests
{
AvailablePackagesViewModel viewModel;
FakePackageManagementService packageManagementService;
+ FakeTaskFactory taskFactory = new FakeTaskFactory();
void CreateViewModel()
{
@@ -30,9 +31,20 @@ namespace PackageManagement.Tests
void CreateViewModel(IPackageManagementService packageManagementService)
{
- viewModel = new AvailablePackagesViewModel(packageManagementService);
+ taskFactory = new FakeTaskFactory();
+ viewModel = new AvailablePackagesViewModel(packageManagementService, taskFactory);
}
+ void CompleteReadPackagesTask()
+ {
+ taskFactory.ExecuteAllFakeTasks();
+ }
+
+ void ClearReadPackagesTasks()
+ {
+ taskFactory.ClearAllFakeTasks();
+ }
+
void AddOnePackageSourceToRegisteredSources()
{
packageManagementService.ClearPackageSources();
@@ -70,7 +82,8 @@ namespace PackageManagement.Tests
AddTwoPackageSourcesToRegisteredSources();
CreateViewModel(packageManagementService);
packageManagementService.ActivePackageSource = packageManagementService.Options.PackageSources[0];
- viewModel.ReadPackages();
+ viewModel.ReadPackages();
+ CompleteReadPackagesTask();
CreateNewActiveRepositoryWithDifferentPackages();
}
@@ -110,6 +123,7 @@ namespace PackageManagement.Tests
packageManagementService.FakeActivePackageRepository.FakePackages.AddRange(packages);
viewModel.ReadPackages();
+ CompleteReadPackagesTask();
var expectedPackages = new FakePackage[] {
package3
@@ -152,9 +166,12 @@ namespace PackageManagement.Tests
packageManagementService.FakeActivePackageRepository.FakePackages.AddRange(packages);
viewModel.ReadPackages();
+ CompleteReadPackagesTask();
+ ClearReadPackagesTasks();
viewModel.SearchTerms = "NotAMatch";
viewModel.Search();
+ CompleteReadPackagesTask();
Assert.AreEqual(0, viewModel.PackageViewModels.Count);
}
@@ -192,10 +209,13 @@ namespace PackageManagement.Tests
packageManagementService.FakeActivePackageRepository.FakePackages.AddRange(packages);
viewModel.ReadPackages();
+ CompleteReadPackagesTask();
+ ClearReadPackagesTasks();
bool collectionChangedEventFired = false;
viewModel.Pages.CollectionChanged += (sender, e) => collectionChangedEventFired = true;
viewModel.ShowNextPage();
+ CompleteReadPackagesTask();
var expectedPackages = new FakePackage[] {
package4
@@ -281,7 +301,9 @@ namespace PackageManagement.Tests
public void SelectedPackageSource_PackageSourceChangedAfterReadingPackages_PackagesReadFromNewPackageSourceAndDisplayed()
{
SetUpTwoPackageSourcesAndViewModelHasReadPackages();
+ ClearReadPackagesTasks();
ChangeSelectedPackageSourceToSecondSource();
+ CompleteReadPackagesTask();
var expectedPackages = packageManagementService.FakeActivePackageRepository.FakePackages;
@@ -295,7 +317,9 @@ namespace PackageManagement.Tests
int packageCountWhenPropertyChangedEventFired = -1;
viewModel.PropertyChanged += (sender, e) => packageCountWhenPropertyChangedEventFired = viewModel.PackageViewModels.Count;
+ ClearReadPackagesTasks();
ChangeSelectedPackageSourceToSecondSource();
+ CompleteReadPackagesTask();
Assert.AreEqual(1, packageCountWhenPropertyChangedEventFired);
}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs
new file mode 100644
index 0000000000..d26153e105
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs
@@ -0,0 +1,58 @@
+// 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;
+
+namespace PackageManagement.Tests.Helpers
+{
+ public class FakeTask : ITask
+ {
+ public bool IsStartCalled;
+ public bool IsCancelCalled;
+
+ Func function;
+ Action> continueWith;
+
+ public FakeTask(Func function, Action> continueWith)
+ {
+ this.function = function;
+ this.continueWith = continueWith;
+ Exception = new AggregateException();
+ }
+
+ public void Start()
+ {
+ IsStartCalled = true;
+ }
+
+ public TResult Result { get; set; }
+
+ public void ExecuteTaskCompletely()
+ {
+ ExecuteTaskButNotContinueWith();
+ ExecuteContinueWith();
+ }
+
+ public TResult ExecuteTaskButNotContinueWith()
+ {
+ Result = function();
+ return Result;
+ }
+
+ public void ExecuteContinueWith()
+ {
+ continueWith(this);
+ }
+
+ public void Cancel()
+ {
+ IsCancelCalled = true;
+ }
+
+ public bool IsCancelled { get;set; }
+ public bool IsFaulted { get; set; }
+
+ public AggregateException Exception { get; set; }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs
new file mode 100644
index 0000000000..521fd577d8
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs
@@ -0,0 +1,43 @@
+// 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.PackageManagement;
+using NuGet;
+
+namespace PackageManagement.Tests.Helpers
+{
+ public class FakeTaskFactory : ITaskFactory
+ {
+ public bool IsCreateTaskCalled;
+
+ public FakeTask FirstFakeTaskCreated {
+ get { return FakeTasksCreated[0] as FakeTask; }
+ }
+
+ public List