From 334be3ec74a54fb0c2932c995817f5dff93c0059 Mon Sep 17 00:00:00 2001 From: punker76 Date: Sun, 10 Nov 2024 14:18:46 +0100 Subject: [PATCH] fix: #17291 use CustomDateFormatString for parsing the text input --- .../CalendarDatePicker/CalendarDatePicker.cs | 4 +- .../CalendarDatePickerTests.cs | 63 +++++++++++++++++-- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs b/src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs index ec54533f4e1..85f035a604f 100644 --- a/src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs +++ b/src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs @@ -730,7 +730,9 @@ private void OpenDropDown() // the TextParseError event try { - newSelectedDate = DateTime.Parse(text, DateTimeHelper.GetCurrentDateFormat()); + newSelectedDate = !string.IsNullOrEmpty(this.CustomDateFormatString) ? + DateTime.ParseExact(text, this.CustomDateFormatString, DateTimeHelper.GetCurrentDateFormat()) : + DateTime.Parse(text, DateTimeHelper.GetCurrentDateFormat()); if (Calendar.IsValidDateSelection(this._calendar!, newSelectedDate)) { diff --git a/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs b/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs index c3acf31caa7..ac6817233a4 100644 --- a/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs @@ -1,17 +1,13 @@ using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; using System.Linq; using Avalonia.Controls.Primitives; -using Avalonia.Controls.Presenters; using Avalonia.Controls.Templates; -using Avalonia.Data; -using Avalonia.Markup.Data; +using Avalonia.Input; using Avalonia.Platform; using Avalonia.UnitTests; using Moq; using Xunit; +using System.Globalization; namespace Avalonia.Controls.UnitTests { @@ -73,6 +69,34 @@ public void Adding_Blackout_Dates_Containing_Selected_Date_Should_Throw() } } + [Fact] + public void Setting_Date_Manually_With_CustomDateFormatString_Should_Be_Accepted() + { + CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); + using (UnitTestApplication.Start(Services)) + { + CalendarDatePicker datePicker = CreateControl(); + datePicker.SelectedDateFormat = CalendarDatePickerFormat.Custom; + datePicker.CustomDateFormatString = "dd.MM.yyyy"; + + var tb = GetTextBox(datePicker); + + tb.Clear(); + RaiseTextEvent(tb, "17.10.2024"); + RaiseKeyEvent(tb, Key.Enter, KeyModifiers.None); + + Assert.Equal("17.10.2024", datePicker.Text); + Assert.True(CompareDates(datePicker.SelectedDate.Value, new DateTime(2024, 10, 17))); + + tb.Clear(); + RaiseTextEvent(tb, "12.10.2024"); + RaiseKeyEvent(tb, Key.Enter, KeyModifiers.None); + + Assert.Equal("12.10.2024", datePicker.Text); + Assert.True(CompareDates(datePicker.SelectedDate.Value, new DateTime(2024, 10, 12))); + } + } + private static TestServices Services => TestServices.MockThreadingInterface.With( standardCursorFactory: Mock.Of()); @@ -127,5 +151,32 @@ private static IControlTemplate CreateTemplate() }); } + + private TextBox GetTextBox(CalendarDatePicker control) + { + return control.GetTemplateChildren() + .OfType() + .First(); + } + + private static void RaiseKeyEvent(TextBox textBox, Key key, KeyModifiers inputModifiers) + { + textBox.RaiseEvent(new KeyEventArgs + { + RoutedEvent = InputElement.KeyDownEvent, + KeyModifiers = inputModifiers, + Key = key + }); + } + + private static void RaiseTextEvent(TextBox textBox, string text) + { + textBox.RaiseEvent(new TextInputEventArgs + { + RoutedEvent = InputElement.TextInputEvent, + Text = text + }); + } + } }