Skip to content

Commit

Permalink
fix: #17291 use CustomDateFormatString for parsing the text input
Browse files Browse the repository at this point in the history
  • Loading branch information
punker76 committed Nov 10, 2024
1 parent d411bd2 commit 334be3e
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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))
{
Expand Down
63 changes: 57 additions & 6 deletions tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs
Original file line number Diff line number Diff line change
@@ -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
{
Expand Down Expand Up @@ -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<ICursorFactory>());

Expand Down Expand Up @@ -127,5 +151,32 @@ private static IControlTemplate CreateTemplate()
});

}

private TextBox GetTextBox(CalendarDatePicker control)
{
return control.GetTemplateChildren()
.OfType<TextBox>()
.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
});
}

}
}

0 comments on commit 334be3e

Please sign in to comment.