From 27740b578a7598297adc8844bccfab86dae1accd Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Sun, 9 Feb 2025 01:02:48 +0800 Subject: [PATCH 1/4] fix: fix pagination initialization issue. --- src/Ursa/Controls/Pagination/Pagination.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Ursa/Controls/Pagination/Pagination.cs b/src/Ursa/Controls/Pagination/Pagination.cs index f18f305..3d8abf7 100644 --- a/src/Ursa/Controls/Pagination/Pagination.cs +++ b/src/Ursa/Controls/Pagination/Pagination.cs @@ -166,7 +166,10 @@ public class Pagination : TemplatedControl private static int? CoerceCurrentPage(AvaloniaObject arg1, int? arg2) { if (arg2 is null) return null; - if (arg1 is Pagination p) arg2 = MathHelpers.SafeClamp(arg2.Value, 1, p.PageCount); + if (arg1 is Pagination { IsInitialized: true } p) + { + arg2 = MathHelpers.SafeClamp(arg2.Value, 1, p.PageCount); + } return arg2; } @@ -218,7 +221,7 @@ public class Pagination : TemplatedControl LostFocusEvent.AddHandler(OnQuickJumpInputLostFocus, _quickJumpInput); InitializePanelButtons(); - UpdateButtonsByCurrentPage(0); + UpdateButtonsByCurrentPage(CurrentPage); } private void OnQuickJumpInputKeyDown(object? sender, KeyEventArgs e) From c672b5bef3f3e7f6e19b4aa5b660eb0035103f3e Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Thu, 20 Feb 2025 22:16:25 +0800 Subject: [PATCH 2/4] fix: fix page initialization issue. --- demo/Ursa.Demo/Pages/PaginationDemo.axaml | 1 + src/Ursa/Controls/Pagination/Pagination.cs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/demo/Ursa.Demo/Pages/PaginationDemo.axaml b/demo/Ursa.Demo/Pages/PaginationDemo.axaml index 22d4ebc..f078b21 100644 --- a/demo/Ursa.Demo/Pages/PaginationDemo.axaml +++ b/demo/Ursa.Demo/Pages/PaginationDemo.axaml @@ -23,6 +23,7 @@ Date: Fri, 21 Feb 2025 01:41:25 +0800 Subject: [PATCH 3/4] test: add pagination tests. --- src/Ursa/Controls/Pagination/Pagination.cs | 10 +- .../PaginationTests/PaginationTests.cs | 279 ++++++++++++++++++ 2 files changed, 284 insertions(+), 5 deletions(-) create mode 100644 tests/HeadlessTest.Ursa/Controls/PaginationTests/PaginationTests.cs diff --git a/src/Ursa/Controls/Pagination/Pagination.cs b/src/Ursa/Controls/Pagination/Pagination.cs index 32a7e0e..c4e4ace 100644 --- a/src/Ursa/Controls/Pagination/Pagination.cs +++ b/src/Ursa/Controls/Pagination/Pagination.cs @@ -197,6 +197,7 @@ public class Pagination : TemplatedControl private void OnPageSizeChanged(AvaloniaPropertyChangedEventArgs args) { + if (!IsInitialized) return; var pageCount = TotalCount / args.NewValue.Value; var residue = TotalCount % args.NewValue.Value; if (residue > 0) pageCount++; @@ -305,16 +306,15 @@ public class Pagination : TemplatedControl { if (PageSize == 0) return; var pageCount = TotalCount / PageSize; + var currentPage = CurrentPage; + var residue = TotalCount % PageSize; + if (residue > 0) pageCount++; if (_buttonPanel is null) { SetCurrentValue(PageCountProperty, pageCount); return; } - - var currentPage = CurrentPage; - var residue = TotalCount % PageSize; - if (residue > 0) pageCount++; - + if (pageCount <= 7) { for (var i = 0; i < 7; i++) diff --git a/tests/HeadlessTest.Ursa/Controls/PaginationTests/PaginationTests.cs b/tests/HeadlessTest.Ursa/Controls/PaginationTests/PaginationTests.cs new file mode 100644 index 0000000..fdf14c3 --- /dev/null +++ b/tests/HeadlessTest.Ursa/Controls/PaginationTests/PaginationTests.cs @@ -0,0 +1,279 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Headless.XUnit; +using Avalonia.Interactivity; +using Avalonia.Markup.Xaml.MarkupExtensions; +using Avalonia.Threading; +using HeadlessTest.Ursa.TestHelpers; +using Ursa.Controls; + +namespace HeadlessTest.Ursa.Controls.PaginationTests; + +public class PaginationTests +{ + [AvaloniaFact] + public void CurrentPage_Can_Be_Initialized() + { + var window = new Window(); + var pagination = new Pagination + { + CurrentPage = 3, + PageSize = 50, + TotalCount = 300, + }; + window.Content = pagination; + window.Show(); + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + } + + [AvaloniaFact] + public void CurrentPage_Can_Be_Initialized_With_Another_Initialization_Order() + { + var window = new Window(); + var pagination = new Pagination + { + CurrentPage = 3, + TotalCount = 300, + PageSize = 50, + }; + window.Content = pagination; + window.Show(); + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + } + + [AvaloniaFact] + public void Change_TotalCount_Should_Update_PageCount() + { + var window = new Window(); + var pagination = new Pagination + { + CurrentPage = 3, + PageSize = 50, + TotalCount = 300, + }; + window.Content = pagination; + window.Show(); + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + pagination.TotalCount = 500; + Dispatcher.UIThread.RunJobs(); + Assert.Equal(10, pagination.PageCount); + Assert.Equal(500, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + } + + [AvaloniaFact] + public void Change_PageSize_Should_Update_PageCount() + { + var window = new Window(); + var pagination = new Pagination + { + CurrentPage = 3, + PageSize = 50, + TotalCount = 300, + }; + window.Content = pagination; + window.Show(); + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + pagination.PageSize = 100; + Dispatcher.UIThread.RunJobs(); + Assert.Equal(3, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(100, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + } + + [AvaloniaFact] + public void Change_TotalCount_Clamps_Current_Page() + { + var window = new Window(); + var pagination = new Pagination + { + CurrentPage = 3, + PageSize = 50, + TotalCount = 300, + }; + window.Content = pagination; + window.Show(); + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + pagination.TotalCount = 10; + Dispatcher.UIThread.RunJobs(); + Assert.Equal(1, pagination.PageCount); + Assert.Equal(10, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(1, pagination.CurrentPage); + } + + [AvaloniaFact] + public void CurrentPage_Is_Clamped() + { + var window = new Window(); + var pagination = new Pagination + { + CurrentPage = 3, + PageSize = 50, + TotalCount = 300, + }; + window.Content = pagination; + window.Show(); + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + pagination.CurrentPage = 10; + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(6, pagination.CurrentPage); + } + + [AvaloniaFact] + public void CurrentPage_Is_Clamped_When_PageCount_Changes() + { + var window = new Window(); + var pagination = new Pagination + { + CurrentPage = 3, + PageSize = 50, + TotalCount = 300, + }; + window.Content = pagination; + window.Show(); + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + pagination.TotalCount = 10; + Dispatcher.UIThread.RunJobs(); + Assert.Equal(1, pagination.PageCount); + Assert.Equal(10, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(1, pagination.CurrentPage); + } + + [AvaloniaFact] + public void Click_Next_Button_Should_Increment_CurrentPage() + { + var window = new Window(); + var pagination = new Pagination + { + CurrentPage = 3, + PageSize = 50, + TotalCount = 300, + }; + window.Content = pagination; + window.Show(); + Dispatcher.UIThread.RunJobs(); + Assert.Equal(6, pagination.PageCount); + Assert.Equal(300, pagination.TotalCount); + Assert.Equal(50, pagination.PageSize); + Assert.Equal(3, pagination.CurrentPage); + var nextButton = pagination.GetTemplateChildOfType