fix: completely fix timepicker racing issue.

This commit is contained in:
Dong Bin
2025-02-18 18:02:37 +08:00
parent e062efead0
commit 27375f722e
7 changed files with 237 additions and 131 deletions

View File

@@ -17,7 +17,7 @@ public class TimePickerPresenterTests
Assert.False(presenter.NeedsConfirmation);
Assert.Equal(1, presenter.MinuteIncrement);
Assert.Equal(1, presenter.SecondIncrement);
Assert.Null(presenter.Time);
Assert.Null(presenter.TimeHolder);
Assert.Equal("HH mm ss t", presenter.PanelFormat);
}
@@ -27,9 +27,9 @@ public class TimePickerPresenterTests
var presenter = new TimePickerPresenter();
var time = new TimeSpan(10, 30, 45);
presenter.Time = time;
presenter.TimeHolder = time;
Assert.Equal(time, presenter.Time);
Assert.Equal(time, presenter.TimeHolder);
}
[AvaloniaTheory]
@@ -77,37 +77,44 @@ public class TimePickerPresenterTests
[Fact]
[AvaloniaFact]
public void TimePickerPresenter_Confirm_ShouldSetTimeProperty()
{
var presenter = new TimePickerPresenter { NeedsConfirmation = true };
var time = new TimeSpan(10, 30, 45);
var eventRaised = 0;
TimeSpan? eventResult = null;
presenter.SelectedTimeChanged += (o, e) =>
{
eventRaised++;
eventResult = e.NewTime;
};
presenter.TimeHolder = time;
Assert.NotEqual(time, presenter.Time);
Assert.Null(eventResult);
Assert.Equal(0, eventRaised);
presenter.Confirm();
Assert.Equal(time, presenter.Time);
Assert.Equal(time, presenter.TimeHolder);
Assert.Equal(time, eventResult);
Assert.Equal(1, eventRaised);
}
[AvaloniaFact]
public void TimePickerPresenter_OnTimeChanged_ShouldRaiseEvent()
public void TimePickerPresenter_SyncTime_Should_Not_RaiseEvent()
{
var presenter = new TimePickerPresenter();
var oldTime = new TimeSpan(10, 30, 45);
var newTime = new TimeSpan(11, 45, 30);
presenter.Time = oldTime;
presenter.SyncTime(oldTime);
var eventRaised = false;
presenter.SelectedTimeChanged += (sender, args) =>
{
eventRaised = true;
Assert.Equal(oldTime, args.OldTime);
Assert.Equal(newTime, args.NewTime);
};
presenter.Time = newTime;
Assert.True(eventRaised);
presenter.SyncTime(newTime);
Assert.False(eventRaised);
}
[AvaloniaTheory]
@@ -120,6 +127,11 @@ public class TimePickerPresenterTests
window.Show();
Dispatcher.UIThread.RunJobs();
presenter.PanelFormat = format;
TimeSpan? eventResult = null;
presenter.SelectedTimeChanged += (o, e) =>
{
eventResult = e.NewTime;
};
Dispatcher.UIThread.RunJobs();
var hourPanel = presenter.GetTemplateChildren().OfType<DateTimePickerPanel>().FirstOrDefault(a => a.Name == TimePickerPresenter.PART_HourSelector);
@@ -137,7 +149,7 @@ public class TimePickerPresenterTests
secondPanel.SelectedValue = secondSelection;
amPanel.SelectedValue = amSelection;
Assert.Equal(expectedTime, presenter.Time);
Assert.Equal(expectedTime, eventResult);
}
[AvaloniaTheory]

View File

@@ -0,0 +1,62 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Headless;
using Avalonia.Headless.XUnit;
using Avalonia.Input;
using Avalonia.Layout;
using Avalonia.Threading;
using HeadlessTest.Ursa.TestHelpers;
using TimePicker = Ursa.Controls.TimePicker;
namespace HeadlessTest.Ursa.Controls.DateTimePicker;
public class TimePickerTests
{
[AvaloniaFact]
public void Click_Opens_Popup()
{
var window = new Window();
var timePicker = new TimePicker()
{
Width = 300,
HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Top,
};
window.Content = timePicker;
window.Show();
Dispatcher.UIThread.RunJobs();
Assert.False(timePicker.IsDropdownOpen);
window.MouseDown(new Point(10, 10), MouseButton.Left);
Assert.True(timePicker.IsDropdownOpen);
}
[AvaloniaFact]
public void Click_Button_Toggles_Popup()
{
var window = new Window();
var picker = new TimePicker()
{
Width = 300,
HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Top
};
window.Content = picker;
window.Show();
var button = picker.GetTemplateChildOfType<Button>(TimePicker.PART_Button);
var position = button?.TranslatePoint(new Point(5, 5), window);
Assert.NotNull(position);
Assert.False(picker.IsDropdownOpen);
Dispatcher.UIThread.RunJobs();
window.MouseDown(position.Value, MouseButton.Left);
window.MouseUp(position.Value, MouseButton.Left);
Dispatcher.UIThread.RunJobs();
Assert.True(picker.IsDropdownOpen);
window.MouseDown(position.Value, MouseButton.Left);
window.MouseUp(position.Value, MouseButton.Left);
Dispatcher.UIThread.RunJobs();
Assert.False(picker.IsDropdownOpen);
}
}