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 @@ args) { + if (!IsInitialized) return; var pageCount = TotalCount / args.NewValue.Value; var residue = TotalCount % args.NewValue.Value; if (residue > 0) pageCount++; @@ -218,7 +223,8 @@ public class Pagination : TemplatedControl LostFocusEvent.AddHandler(OnQuickJumpInputLostFocus, _quickJumpInput); InitializePanelButtons(); - UpdateButtonsByCurrentPage(0); + CurrentPage = MathHelpers.SafeClamp(CurrentPage ?? 1, 1, PageCount); + UpdateButtonsByCurrentPage(CurrentPage); } private void OnQuickJumpInputKeyDown(object? sender, KeyEventArgs e) @@ -300,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..9f7ad87 --- /dev/null +++ b/tests/HeadlessTest.Ursa/Controls/PaginationTests/PaginationTests.cs @@ -0,0 +1,435 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Data; +using Avalonia.Headless.XUnit; +using Avalonia.Interactivity; +using Avalonia.Markup.Xaml.MarkupExtensions; +using Avalonia.Threading; +using CommunityToolkit.Mvvm.Input; +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