committed by
GitHub
6 changed files with 146 additions and 0 deletions
@ -0,0 +1,63 @@ |
|||
using System; |
|||
using Avalonia.Automation; |
|||
using Avalonia.Automation.Peers; |
|||
using Avalonia.Automation.Provider; |
|||
|
|||
namespace Avalonia.Controls.Automation.Peers |
|||
{ |
|||
public class RadioButtonAutomationPeer : ToggleButtonAutomationPeer, ISelectionItemProvider |
|||
{ |
|||
public RadioButtonAutomationPeer(RadioButton owner) : base(owner) |
|||
{ |
|||
owner.PropertyChanged += (a, e) => |
|||
{ |
|||
if (e.Property == RadioButton.IsCheckedProperty) |
|||
{ |
|||
RaiseToggleStatePropertyChangedEvent((bool?)e.OldValue, (bool?)e.NewValue); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
override protected string GetClassNameCore() |
|||
{ |
|||
return "RadioButton"; |
|||
} |
|||
|
|||
override protected AutomationControlType GetAutomationControlTypeCore() |
|||
{ |
|||
return AutomationControlType.RadioButton; |
|||
} |
|||
|
|||
public bool IsSelected => ((RadioButton)Owner).IsChecked == true; |
|||
|
|||
public ISelectionProvider? SelectionContainer => null; |
|||
|
|||
public void AddToSelection() |
|||
{ |
|||
if (((RadioButton)Owner).IsChecked != true) |
|||
throw new InvalidOperationException("Operation cannot be performed"); |
|||
} |
|||
|
|||
public void RemoveFromSelection() |
|||
{ |
|||
if (((RadioButton)Owner).IsChecked == true) |
|||
throw new InvalidOperationException("Operation cannot be performed"); |
|||
} |
|||
|
|||
public void Select() |
|||
{ |
|||
if (!IsEnabled()) |
|||
throw new InvalidOperationException("Element is disabled thus it cannot be selected"); |
|||
|
|||
((RadioButton)Owner).IsChecked = true; |
|||
} |
|||
|
|||
internal virtual void RaiseToggleStatePropertyChangedEvent(bool? oldValue, bool? newValue) |
|||
{ |
|||
RaisePropertyChangedEvent( |
|||
SelectionItemPatternIdentifiers.IsSelectedProperty, |
|||
oldValue == true, |
|||
newValue == true); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
using Avalonia.Automation.Provider; |
|||
|
|||
namespace Avalonia.Automation |
|||
{ |
|||
/// <summary>
|
|||
/// Contains values used as identifiers by <see cref="ISelectionItemProvider"/>.
|
|||
/// </summary>
|
|||
public static class SelectionItemPatternIdentifiers |
|||
{ |
|||
/// <summary>Indicates the element is currently selected.</summary>
|
|||
public static AutomationProperty IsSelectedProperty { get; } = new AutomationProperty(); |
|||
|
|||
/// <summary>Indicates the element is currently selected.</summary>
|
|||
public static AutomationProperty SelectionContainerProperty { get; } = new AutomationProperty(); |
|||
} |
|||
} |
|||
@ -0,0 +1,48 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using OpenQA.Selenium.Appium; |
|||
using Xunit; |
|||
|
|||
namespace Avalonia.IntegrationTests.Appium |
|||
{ |
|||
[Collection("Default")] |
|||
public class RadioButtonTests |
|||
{ |
|||
private readonly AppiumDriver<AppiumWebElement> _session; |
|||
|
|||
public RadioButtonTests(TestAppFixture fixture) |
|||
{ |
|||
_session = fixture.Session; |
|||
|
|||
var tabs = _session.FindElementByAccessibilityId("MainTabs"); |
|||
tabs.FindElementByName("RadioButton").Click(); |
|||
} |
|||
|
|||
|
|||
[Fact] |
|||
public void RadioButton_IsChecked_True_When_Clicked() |
|||
{ |
|||
var button = _session.FindElementByAccessibilityId("BasicRadioButton"); |
|||
Assert.False(button.GetIsChecked()); |
|||
button.Click(); |
|||
Assert.True(button.GetIsChecked()); |
|||
} |
|||
|
|||
[Fact] |
|||
public void ThreeState_RadioButton_IsChecked_False_When_Other_ThreeState_RadioButton_Checked() |
|||
{ |
|||
var button1 = _session.FindElementByAccessibilityId("ThreeStatesRadioButton1"); |
|||
var button2 = _session.FindElementByAccessibilityId("ThreeStatesRadioButton2"); |
|||
Assert.True(button1.GetIsChecked()); |
|||
Assert.False(button2.GetIsChecked()); |
|||
button2.Click(); |
|||
Assert.False(button1.GetIsChecked()); |
|||
Assert.True(button2.GetIsChecked()); |
|||
} |
|||
|
|||
} |
|||
} |
|||
Loading…
Reference in new issue