From 47b39b9e743a057310cf6cfbd1bae6221dcd4545 Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Fri, 10 Jan 2025 21:27:30 +0800 Subject: [PATCH] test: dynamic form a11y failure. --- .../AccessibilityTests/DynamicForm.axaml | 26 ++++++++++++++ .../AccessibilityTests/DynamicForm.axaml.cs | 31 ++++++++++++++++ .../FormAccessibilityTests.cs | 35 ++++++++++++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/DynamicForm.axaml create mode 100644 tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/DynamicForm.axaml.cs diff --git a/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/DynamicForm.axaml b/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/DynamicForm.axaml new file mode 100644 index 0000000..9dbaba4 --- /dev/null +++ b/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/DynamicForm.axaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/DynamicForm.axaml.cs b/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/DynamicForm.axaml.cs new file mode 100644 index 0000000..822ff72 --- /dev/null +++ b/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/DynamicForm.axaml.cs @@ -0,0 +1,31 @@ +using System.Collections.ObjectModel; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using CommunityToolkit.Mvvm.ComponentModel; + +namespace HeadlessTest.Ursa.Controls.FormTests.AccessibilityTests; + +public partial class DynamicForm : UserControl +{ + public DynamicForm() + { + InitializeComponent(); + this.DataContext = new DynamicFormViewModel(); + } +} + +public partial class DynamicFormViewModel: ObservableObject +{ + public ObservableCollection Items { get; set; } = + [ + new() { Label = "_Name" }, + new() { Label = "_Email" } + ]; +} + +public partial class FormTextViewModel : ObservableObject +{ + [ObservableProperty] private string? _label; + [ObservableProperty] private string? _value; +} \ No newline at end of file diff --git a/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/FormAccessibilityTests.cs b/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/FormAccessibilityTests.cs index e73e96e..f27102a 100644 --- a/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/FormAccessibilityTests.cs +++ b/tests/HeadlessTest.Ursa/Controls/FormTests/AccessibilityTests/FormAccessibilityTests.cs @@ -2,13 +2,15 @@ using Avalonia.Controls; using Avalonia.Headless; using Avalonia.Headless.XUnit; using Avalonia.Input; +using Avalonia.LogicalTree; +using Ursa.Controls; namespace HeadlessTest.Ursa.Controls.FormTests.AccessibilityTests; public class FormAccessibilityTests { [AvaloniaFact] - public void Form_Inner_Control_Accessible() + public void Static_Form_Inner_Control_Accessible() { var window = new Window(); var form = new StaticForm(); @@ -24,4 +26,35 @@ public class FormAccessibilityTests Assert.False(form.NameBox.IsFocused); Assert.True(form.EmailBox.IsFocused); } + + [AvaloniaFact] + public void Dynamic_Form_Inner_Control_Accessible() + { + var window = new Window(); + var form = new DynamicForm(); + window.Content = form; + window.Show(); + + var logicalChildren = form.form.GetLogicalChildren().ToList(); + Assert.Equal(2, logicalChildren.Count); + var first = logicalChildren[0] as FormItem; + var second = logicalChildren[1] as FormItem; + Assert.NotNull(first); + Assert.NotNull(second); + + var text1 = first.GetLogicalChildren().OfType().FirstOrDefault(); + var text2 = second.GetLogicalChildren().OfType().FirstOrDefault(); + + Assert.NotNull(text1); + Assert.NotNull(text2); + + Assert.False(text1.IsFocused); + Assert.False(text2.IsFocused); + window.KeyPressQwerty(PhysicalKey.N, RawInputModifiers.Alt); + Assert.True(text1.IsFocused); + Assert.False(text2.IsFocused); + window.KeyPressQwerty(PhysicalKey.E, RawInputModifiers.Alt); + Assert.False(text1.IsFocused); + Assert.True(text2.IsFocused); + } } \ No newline at end of file