From f69e6bdb831b1f86971bc885955506b462d56973 Mon Sep 17 00:00:00 2001 From: mrward Date: Wed, 9 Feb 2011 20:35:37 +0000 Subject: [PATCH] Prevent repeated http requests sent to NuGet repository when selecting a different page. --- .../Project/Src/PackagesViewModel.cs | 14 ++-- .../Test/Src/Helpers/FakeTask.cs | 8 +- .../Test/Src/Helpers/FakeTaskFactory.cs | 3 +- .../Test/Src/PackagesViewModelTests.cs | 76 ++++++++++++++++--- 4 files changed, 82 insertions(+), 19 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs index fdddd9b806..57d633599d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs @@ -112,7 +112,7 @@ namespace ICSharpCode.PackageManagement public void ReadPackages() { allPackages = null; - SelectedPageNumber = 1; + pages.SelectedPageNumber = 1; UpdateRepositoryBeforeReadPackagesTaskStarts(); StartReadPackagesTask(); } @@ -177,13 +177,9 @@ namespace ICSharpCode.PackageManagement void UpdatePackagesForSelectedPage(PackagesForSelectedPageResult result) { - pages.CollectionChanged -= PagesChanged; - pages.TotalItems = result.TotalPackages; pages.TotalItemsOnSelectedPage = result.TotalPackagesOnPage; UpdatePackageViewModels(result.Packages); - - pages.CollectionChanged += PagesChanged; } void PagesChanged(object sender, NotifyCollectionChangedEventArgs e) @@ -278,7 +274,13 @@ namespace ICSharpCode.PackageManagement public int SelectedPageNumber { get { return pages.SelectedPageNumber; } - set { pages.SelectedPageNumber = value; } + set { + if (pages.SelectedPageNumber != value) { + pages.SelectedPageNumber = value; + StartReadPackagesTask(); + base.OnPropertyChanged(null); + } + } } public int PageSize { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs index 92b5b316b5..2fcc2cfc0e 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs @@ -11,19 +11,25 @@ namespace PackageManagement.Tests.Helpers public bool IsStartCalled; public bool IsCancelCalled; + public bool RunTaskSynchronously; + Func function; Action> continueWith; - public FakeTask(Func function, Action> continueWith) + public FakeTask(Func function, Action> continueWith, bool runTaskSynchronously) { this.function = function; this.continueWith = continueWith; + RunTaskSynchronously = runTaskSynchronously; Exception = new AggregateException(new Exception("FakeTaskAggregateInnerException")); } public void Start() { IsStartCalled = true; + if (RunTaskSynchronously) { + ExecuteTaskCompletely(); + } } public TResult Result { get; set; } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs index 521fd577d8..5e3af52292 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs @@ -11,6 +11,7 @@ namespace PackageManagement.Tests.Helpers public class FakeTaskFactory : ITaskFactory { public bool IsCreateTaskCalled; + public bool RunTasksSynchronously; public FakeTask FirstFakeTaskCreated { get { return FakeTasksCreated[0] as FakeTask; } @@ -23,7 +24,7 @@ namespace PackageManagement.Tests.Helpers Action> continueWith) { IsCreateTaskCalled = true; - var task = new FakeTask(function, continueWith); + var task = new FakeTask(function, continueWith, RunTasksSynchronously); FakeTasksCreated.Add(task); return task; } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs index 0ea8131633..a50975fc2e 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs @@ -508,7 +508,7 @@ namespace PackageManagement.Tests } [Test] - public void ReadPackages_CalledThreeTimesAndThenSelectedPageChanged_ViewModelPropertiesChangedEventFiresFourTimesWhenSelectedPageChanged() + public void ReadPackages_CalledThreeTimesAndThenSelectedPageChanged_ViewModelPropertiesChangedEventFiresOnceWhenSelectedPageChanged() { CreateViewModel(); viewModel.PageSize = 3; @@ -527,16 +527,7 @@ namespace PackageManagement.Tests viewModel.PropertyChanged += (sender, e) => count++; viewModel.SelectedPageNumber = 2; - // PropertyChanged fired for clearing the pages. - int propertyChangedEventFiredForClearingPagesCount = 1; - - // PropertyChanged fired once for each page. - int propertyChangedEventFiredForAddingPagesCount = 2; - - int totalExpectedPropertyChangedFiredCount = - propertyChangedEventFiredForClearingPagesCount + propertyChangedEventFiredForAddingPagesCount; - - Assert.AreEqual(totalExpectedPropertyChangedFiredCount, count); + Assert.AreEqual(1, count); } [Test] @@ -1141,5 +1132,68 @@ namespace PackageManagement.Tests PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels); } + + [Test] + public void SelectedPageNumber_SixPackagesAndPageSizeIsFiveAndSelectedPageNumberIsChangedToTwo_OneReadPackagesTaskCreated() + { + CreateViewModel(); + viewModel.PageSize = 5; + viewModel.AddSixFakePackages(); + viewModel.ReadPackages(); + CompleteReadPackagesTask(); + ClearReadPackagesTasks(); + + viewModel.SelectedPageNumber = 2; + + Assert.AreEqual(1, taskFactory.FakeTasksCreated.Count); + } + + [Test] + public void SelectedPageNumber_SixPackagesAndSelectedPageNumberIsSetToPageOneButUnchanged_NoReadPackagesTaskCreated() + { + CreateViewModel(); + viewModel.PageSize = 5; + viewModel.AddSixFakePackages(); + viewModel.ReadPackages(); + CompleteReadPackagesTask(); + ClearReadPackagesTasks(); + + viewModel.SelectedPageNumber = 1; + + Assert.AreEqual(0, taskFactory.FakeTasksCreated.Count); + } + + [Test] + public void SelectedPageNumber_SixPackagesAndPageSizeIsFiveAndSelectedPageNumberIsChangedToTwo_PropertyChangedEventFiredAfterSelectedPageNumberChanged() + { + CreateViewModel(); + viewModel.PageSize = 5; + viewModel.AddSixFakePackages(); + viewModel.ReadPackages(); + CompleteReadPackagesTask(); + ClearReadPackagesTasks(); + + int selectedPageNumber = 0; + viewModel.PropertyChanged += (source, e) => selectedPageNumber = viewModel.SelectedPageNumber; + viewModel.SelectedPageNumber = 2; + + Assert.AreEqual(2, selectedPageNumber); + } + + [Test] + public void SelectedPageNumber_SixPackagesAndPageSizeIsFiveAndSelectedPageNumberIsChangedToTwo_SelectedPageNumberChangedBeforeReadPackagesTaskStarted() + { + CreateViewModel(); + viewModel.PageSize = 5; + viewModel.AddSixFakePackages(); + viewModel.ReadPackages(); + CompleteReadPackagesTask(); + ClearReadPackagesTasks(); + + taskFactory.RunTasksSynchronously = true; + viewModel.SelectedPageNumber = 2; + + Assert.AreEqual(1, viewModel.PackageViewModels.Count); + } } }