test: WIP, fix an issue when passing year event.

This commit is contained in:
Dong Bin
2025-02-17 03:03:27 +08:00
parent 051482de57
commit afd5449f5b
5 changed files with 237 additions and 16 deletions

View File

@@ -25,7 +25,7 @@ public class CalendarYearButton : ContentControl
internal CalendarViewMode Mode { get; private set; }
public event EventHandler<CalendarDayButtonEventArgs> ItemSelected
public event EventHandler<CalendarYearButtonEventArgs> ItemSelected
{
add => AddHandler(ItemSelectedEvent, value);
remove => RemoveHandler(ItemSelectedEvent, value);

View File

@@ -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);
}
}

View File

@@ -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<CalendarYearButton>();
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<CalendarYearButton>();
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<CalendarYearButton>();
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<TextBlock>().FirstOrDefault();
var dayButton = monthGrid.Children.OfType<CalendarDayButton>().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<TextBlock>().FirstOrDefault();
dayButton = monthGrid.Children.OfType<CalendarDayButton>().FirstOrDefault();
Assert.Equal("T", dayHeader.Text);
Assert.Equal(25, (dayButton.DataContext as DateTime?)?.Day);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}