From afd5449f5bb9d038e995dcd3afe56dcd02b88477 Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Mon, 17 Feb 2025 03:03:27 +0800 Subject: [PATCH] test: WIP, fix an issue when passing year event. --- .../DateTimePicker/CalendarYearButton.cs | 2 +- .../DateTimePicker/CalendarDayButtonTests.cs | 73 ++++++++++++++ .../DateTimePicker/CalendarViewTests.cs | 61 +++++++++--- .../DateTimePicker/CalendarYearButtonTests.cs | 96 +++++++++++++++++++ .../CalendarDayButtonTests.cs | 21 ++++ 5 files changed, 237 insertions(+), 16 deletions(-) create mode 100644 tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarDayButtonTests.cs create mode 100644 tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarYearButtonTests.cs diff --git a/src/Ursa/Controls/DateTimePicker/CalendarYearButton.cs b/src/Ursa/Controls/DateTimePicker/CalendarYearButton.cs index 37428ad..3e3b053 100644 --- a/src/Ursa/Controls/DateTimePicker/CalendarYearButton.cs +++ b/src/Ursa/Controls/DateTimePicker/CalendarYearButton.cs @@ -25,7 +25,7 @@ public class CalendarYearButton : ContentControl internal CalendarViewMode Mode { get; private set; } - public event EventHandler ItemSelected + public event EventHandler ItemSelected { add => AddHandler(ItemSelectedEvent, value); remove => RemoveHandler(ItemSelectedEvent, value); diff --git a/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarDayButtonTests.cs b/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarDayButtonTests.cs new file mode 100644 index 0000000..1e43534 --- /dev/null +++ b/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarDayButtonTests.cs @@ -0,0 +1,73 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Headless; +using Avalonia.Headless.XUnit; +using Avalonia.Input; +using Avalonia.Threading; +using Ursa.Controls; + +namespace HeadlessTest.Ursa.Controls.DateTimePicker; + +public class CalendarDayButtonTests +{ + [AvaloniaFact] + public void OnPointerReleased_RaisesDateSelectedEvent() + { + Window window = new Window(); + var button = new CalendarDayButton(); + var date = new DateTime(2023, 5, 15); + button.DataContext = date; + window.Content = button; + window.Show(); + Dispatcher.UIThread.RunJobs(); + int eventRaised = 0; + DateTime? eventContext = null; + + void OnMouseClick(object? sender, CalendarDayButtonEventArgs args) + { + eventRaised++; + eventContext = args.Date; + } + + button.DateSelected += OnMouseClick; + window.MouseUp(new Point(10, 10), MouseButton.Left); + Assert.Equal(1, eventRaised); + Assert.Equal(date, eventContext); + button.DateSelected -= OnMouseClick; + eventContext = null; + window.MouseUp(new Point(10, 10), MouseButton.Left); + Assert.Null(eventContext); + Assert.Equal(1, eventRaised); + } + + [AvaloniaFact] + public void OnPointerEntered_RaisesDatePreviewedEvent() + { + Window window = new Window(); + var button = new CalendarDayButton(); + var date = new DateTime(2023, 5, 15); + button.DataContext = date; + window.Content = button; + window.Show(); + Dispatcher.UIThread.RunJobs(); + int eventRaised = 0; + DateTime? eventContext = null; + + void OnMouseEnter(object? sender, CalendarDayButtonEventArgs args) + { + eventRaised++; + eventContext = args.Date; + } + + button.DatePreviewed += OnMouseEnter; + window.MouseMove(new Point(10, 10)); + Assert.Equal(1, eventRaised); + Assert.Equal(date, eventContext); + window.MouseMove(new Point(100, 100)); + button.DatePreviewed -= OnMouseEnter; + eventContext = null; + window.MouseMove(new Point(10, 10)); + Assert.Null(eventContext); + Assert.Equal(1, eventRaised); + } +} \ No newline at end of file diff --git a/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarViewTests.cs b/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarViewTests.cs index b9247c2..3785420 100644 --- a/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarViewTests.cs +++ b/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarViewTests.cs @@ -1,5 +1,6 @@ using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.Templates; using Avalonia.Headless; using Avalonia.Headless.XUnit; using Avalonia.Input; @@ -20,7 +21,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(2023, 5); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); Dispatcher.UIThread.RunJobs(); calendarView.ClickNext(); Assert.Equal(6, calendarView.ContextDate.Month); @@ -36,7 +37,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(2023, 5); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); Dispatcher.UIThread.RunJobs(); calendarView.ClickFastNext(); Assert.Equal(5, calendarView.ContextDate.Month); @@ -52,7 +53,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(2023, 5); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); Dispatcher.UIThread.RunJobs(); calendarView.ClickNext(); Assert.Equal(5, calendarView.ContextDate.Month); @@ -67,7 +68,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(null, null, 2000, 2009); + calendarView.SyncContextDate(new CalendarContext(null, null, 2000, 2009)); Dispatcher.UIThread.RunJobs(); calendarView.ClickNext(); Assert.Equal(2010, calendarView.ContextDate.StartYear); @@ -82,7 +83,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(null, null, 1900, 1999); + calendarView.SyncContextDate(new CalendarContext(null, null, 1900, 1999)); Dispatcher.UIThread.RunJobs(); calendarView.ClickNext(); Assert.Equal(2000, calendarView.ContextDate.StartYear); @@ -97,7 +98,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(2023, 5); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); Dispatcher.UIThread.RunJobs(); calendarView.ClickPrevious(); Assert.Equal(4, calendarView.ContextDate.Month); @@ -112,7 +113,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(2023, 5); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); Dispatcher.UIThread.RunJobs(); calendarView.ClickPrevious(); Assert.Equal(2022, calendarView.ContextDate.Year); @@ -126,7 +127,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(null, null, 2000, 2009); + calendarView.SyncContextDate(new CalendarContext(null, null, 2000, 2009)); Dispatcher.UIThread.RunJobs(); calendarView.ClickPrevious(); Assert.Equal(1990, calendarView.ContextDate.StartYear); @@ -141,7 +142,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(null, null, 1900, 1999); + calendarView.SyncContextDate(new CalendarContext(null, null, 1900, 1999)); Dispatcher.UIThread.RunJobs(); calendarView.ClickPrevious(); Assert.Equal(1800, calendarView.ContextDate.StartYear); @@ -156,7 +157,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(2023, 5); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); Dispatcher.UIThread.RunJobs(); calendarView.ClickFastPrevious(); Assert.Equal(2022, calendarView.ContextDate.Year); @@ -170,7 +171,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(2023, 5); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); Dispatcher.UIThread.RunJobs(); calendarView.ClickHeaderButton(); Assert.Equal(CalendarViewMode.Decade, calendarView.Mode); @@ -186,7 +187,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(null, null, 2000, 2009); + calendarView.SyncContextDate(new CalendarContext(null, null, 2000, 2009)); Dispatcher.UIThread.RunJobs(); calendarView.ClickHeaderButton(); Assert.Equal(CalendarViewMode.Century, calendarView.Mode); @@ -200,7 +201,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(null, null, 1900, 1999); + calendarView.SyncContextDate(new CalendarContext(null, null, 1900, 1999)); Dispatcher.UIThread.RunJobs(); var yearButton = calendarView.FindDescendantOfType(); var position = yearButton?.TranslatePoint(new Point(6, 6), window); @@ -217,7 +218,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(null, null, 2000, 2009); + calendarView.SyncContextDate(new CalendarContext(null, null, 2000, 2009)); Dispatcher.UIThread.RunJobs(); var yearButton = calendarView.FindDescendantOfType(); var position = yearButton?.TranslatePoint(new Point(6, 6), window); @@ -234,7 +235,7 @@ public class CalendarViewTests window.Content = calendarView; window.Show(); Dispatcher.UIThread.RunJobs(); - calendarView.ContextDate = new CalendarContext(2023, 5); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); Dispatcher.UIThread.RunJobs(); var yearButton = calendarView.FindDescendantOfType(); var position = yearButton?.TranslatePoint(new Point(6, 6), window); @@ -242,4 +243,34 @@ public class CalendarViewTests window.MouseUp(position.Value, MouseButton.Left); Assert.Equal(CalendarViewMode.Month, calendarView.Mode); } + + [AvaloniaFact] + public void Update_FirstDayOfWeek_UpdatesCalendar() + { + var window = new Window(); + var calendarView = new CalendarView { Mode = CalendarViewMode.Month, FirstDayOfWeek = DayOfWeek.Sunday}; + window.Content = calendarView; + window.Show(); + Dispatcher.UIThread.RunJobs(); + calendarView.SyncContextDate(new CalendarContext(2023, 5)); + Dispatcher.UIThread.RunJobs(); + var monthGrid = calendarView.GetTemplateChildren() + .FirstOrDefault(a => a is Grid && a.Name == CalendarView.PART_MonthGrid) as Grid; + Assert.NotNull(monthGrid); + var dayHeader = monthGrid.Children.OfType().FirstOrDefault(); + var dayButton = monthGrid.Children.OfType().FirstOrDefault(); + Assert.NotNull(dayHeader); + Assert.NotNull(dayButton); + Assert.Equal("S", dayHeader.Text); + Assert.Equal(30, (dayButton.DataContext as DateTime?)?.Day); + + calendarView.FirstDayOfWeek = DayOfWeek.Tuesday; + + dayHeader = monthGrid.Children.OfType().FirstOrDefault(); + dayButton = monthGrid.Children.OfType().FirstOrDefault(); + Assert.Equal("T", dayHeader.Text); + Assert.Equal(25, (dayButton.DataContext as DateTime?)?.Day); + + } + } \ No newline at end of file diff --git a/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarYearButtonTests.cs b/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarYearButtonTests.cs new file mode 100644 index 0000000..a1d1850 --- /dev/null +++ b/tests/HeadlessTest.Ursa/Controls/DateTimePicker/CalendarYearButtonTests.cs @@ -0,0 +1,96 @@ +using System.Globalization; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Headless; +using Avalonia.Headless.XUnit; +using Avalonia.Input; +using Ursa.Controls; + +namespace HeadlessTest.Ursa.Controls.DateTimePicker; + +public class CalendarYearButtonTests +{ + [AvaloniaFact] + public void SetContext_YearMode_SetsContentToAbbreviatedMonthName() + { + var button = new CalendarYearButton(); + var context = new CalendarContext(null, 5); + button.SetContext(CalendarViewMode.Year, context); + Assert.Equal("May", button.Content); + } + + [AvaloniaFact] + public void SetContext_YearMode_SetsContentToAbbreviatedMonthName_Chinese() + { + CultureInfo.CurrentCulture = new CultureInfo("zh-CN"); + var button = new CalendarYearButton(); + var context = new CalendarContext(null, 5); + button.SetContext(CalendarViewMode.Year, context); + Assert.Equal("5月", button.Content); + } + + [AvaloniaFact] + public void SetContext_DecadeMode_SetsContentToYear() + { + var button = new CalendarYearButton(); + var context = new CalendarContext(2023); + button.SetContext(CalendarViewMode.Decade, context); + Assert.Equal("2023", button.Content); + } + + [AvaloniaFact] + public void SetContext_CenturyMode_SetsContentToYearRange() + { + var button = new CalendarYearButton(); + var context = new CalendarContext(null, null, 1900, 1999); + button.SetContext(CalendarViewMode.Century, context); + Assert.Equal("1900-1999", button.Content); + } + + [AvaloniaFact] + public void SetContext_InvalidYear_DisablesButton() + { + var button = new CalendarYearButton(); + var context = new CalendarContext(null, null, -1); + button.SetContext(CalendarViewMode.Decade, context); + Assert.False(button.IsEnabled); + } + + [AvaloniaFact] + public void SetContext_Month_Mode_DisablesButton() + { + var button = new CalendarYearButton(); + var context = new CalendarContext(1, 1); + button.SetContext(CalendarViewMode.Month, context); + Assert.False(button.IsEnabled); + } + + [AvaloniaFact] + public void OnPointerReleased_RaisesItemSelectedEvent() + { + + var button = new CalendarYearButton(); + var context = new CalendarContext(2023, 5); + button.SetContext(CalendarViewMode.Year, context); + int eventRaised = 0; + CalendarContext? eventContext = null; + void OnItemSelected( object? sender, CalendarYearButtonEventArgs args) + { + eventRaised++; + eventContext = args.Context; + } + button.ItemSelected += OnItemSelected; + Window window = new Window(); + window.Content = button; + window.Show(); + window.MouseUp(new Point(10, 10), MouseButton.Left); + Assert.Equal(1, eventRaised); + Assert.Equal(context, eventContext); + button.ItemSelected -= OnItemSelected; + eventContext = null; + window.MouseUp(new Point(10, 10), MouseButton.Left); + Assert.Null(eventContext); + Assert.Equal(1, eventRaised); + + } +} \ No newline at end of file diff --git a/tests/Test.Ursa/DateTimePickerTests/CalendarDayButtonTests.cs b/tests/Test.Ursa/DateTimePickerTests/CalendarDayButtonTests.cs index f98d5d3..28f7d0c 100644 --- a/tests/Test.Ursa/DateTimePickerTests/CalendarDayButtonTests.cs +++ b/tests/Test.Ursa/DateTimePickerTests/CalendarDayButtonTests.cs @@ -12,6 +12,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsToday = true; Assert.Contains(CalendarDayButton.PC_Today, button.Classes); + Assert.True(button.IsToday); } [Fact] @@ -20,6 +21,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsStartDate = true; Assert.Contains(CalendarDayButton.PC_StartDate, button.Classes); + Assert.True(button.IsStartDate); } [Fact] @@ -28,6 +30,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsEndDate = true; Assert.Contains(CalendarDayButton.PC_EndDate, button.Classes); + Assert.True(button.IsEndDate); } [Fact] @@ -36,6 +39,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsPreviewStartDate = true; Assert.Contains(CalendarDayButton.PC_PreviewStartDate, button.Classes); + Assert.True(button.IsPreviewStartDate); } [Fact] @@ -44,6 +48,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsPreviewEndDate = true; Assert.Contains(CalendarDayButton.PC_PreviewEndDate, button.Classes); + Assert.True(button.IsPreviewEndDate); } [Fact] @@ -52,6 +57,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsInRange = true; Assert.Contains(CalendarDayButton.PC_InRange, button.Classes); + Assert.True(button.IsInRange); } [Fact] @@ -60,6 +66,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsSelected = true; Assert.Contains(PseudoClassName.PC_Selected, button.Classes); + Assert.True(button.IsSelected); } [Fact] @@ -68,6 +75,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsBlackout = true; Assert.Contains(CalendarDayButton.PC_Blackout, button.Classes); + Assert.True(button.IsBlackout); } [Fact] @@ -76,6 +84,7 @@ public class CalendarDayButtonTests var button = new CalendarDayButton(); button.IsNotCurrentMonth = true; Assert.Contains(CalendarDayButton.PC_NotCurrentMonth, button.Classes); + Assert.True(button.IsNotCurrentMonth); } [Fact] @@ -88,4 +97,16 @@ public class CalendarDayButtonTests Assert.DoesNotContain(PseudoClassName.PC_Selected, button.Classes); Assert.DoesNotContain(CalendarDayButton.PC_StartDate, button.Classes); } + + [Fact] + public void IsToday_ClearsOtherPseudoClasses() + { + var button = new CalendarDayButton(); + button.IsStartDate = true; + button.IsEndDate = true; + button.IsToday = true; + Assert.Contains(CalendarDayButton.PC_Today, button.Classes); + Assert.Contains(CalendarDayButton.PC_EndDate, button.Classes); + Assert.DoesNotContain(CalendarDayButton.PC_StartDate, button.Classes); + } } \ No newline at end of file