diff --git a/native/Avalonia.Native/src/OSX/automation.mm b/native/Avalonia.Native/src/OSX/automation.mm index 4e79d8af6e..46515380a5 100644 --- a/native/Avalonia.Native/src/OSX/automation.mm +++ b/native/Avalonia.Native/src/OSX/automation.mm @@ -194,7 +194,7 @@ private: switch (_peer->ToggleProvider_GetToggleState()) { case 0: return [NSNumber numberWithBool:NO]; case 1: return [NSNumber numberWithBool:YES]; - default: return [NSNumber numberWithInt:-1]; + default: return [NSNumber numberWithInt:2]; } } else if (_peer->IsValueProvider()) @@ -314,6 +314,10 @@ private: { _peer->ExpandCollapseProvider_Expand(); } + else if (_peer->IsToggleProvider()) + { + _peer->ToggleProvider_Toggle(); + } return YES; } @@ -357,7 +361,7 @@ private: } else if (selector == @selector(accessibilityPerformPress)) { - return _peer->IsInvokeProvider() || _peer->IsExpandCollapseProvider(); + return _peer->IsInvokeProvider() || _peer->IsExpandCollapseProvider() || _peer->IsToggleProvider(); } else if (selector == @selector(accessibilityPerformIncrement) || selector == @selector(accessibilityPerformDecrement) || diff --git a/tests/Avalonia.IntegrationTests.Win32/CheckBoxTests.cs b/tests/Avalonia.IntegrationTests.Win32/CheckBoxTests.cs index fdc3f10415..71be603dc9 100644 --- a/tests/Avalonia.IntegrationTests.Win32/CheckBoxTests.cs +++ b/tests/Avalonia.IntegrationTests.Win32/CheckBoxTests.cs @@ -6,7 +6,7 @@ namespace Avalonia.IntegrationTests.Win32 [Collection("Default")] public class CheckBoxTests { - private AppiumDriver _session; + private readonly AppiumDriver _session; public CheckBoxTests(TestAppFixture fixture) { @@ -22,14 +22,11 @@ namespace Avalonia.IntegrationTests.Win32 { var checkBox = _session.FindElementByAccessibilityId("UncheckedCheckBox"); - Assert.Equal("Unchecked", checkBox.Text); - Assert.False(checkBox.Selected); - Assert.Equal("0", checkBox.GetAttribute("Toggle.ToggleState")); + Assert.Equal("Unchecked", checkBox.GetName()); + Assert.Equal(false, checkBox.GetIsChecked()); checkBox.Click(); - - Assert.True(checkBox.Selected); - Assert.Equal("1", checkBox.GetAttribute("Toggle.ToggleState")); + Assert.Equal(true, checkBox.GetIsChecked()); } [Fact] @@ -37,14 +34,11 @@ namespace Avalonia.IntegrationTests.Win32 { var checkBox = _session.FindElementByAccessibilityId("CheckedCheckBox"); - Assert.Equal("Checked", checkBox.Text); - Assert.True(checkBox.Selected); - Assert.Equal("1", checkBox.GetAttribute("Toggle.ToggleState")); + Assert.Equal("Checked", checkBox.GetName()); + Assert.Equal(true, checkBox.GetIsChecked()); checkBox.Click(); - - Assert.False(checkBox.Selected); - Assert.Equal("0", checkBox.GetAttribute("Toggle.ToggleState")); + Assert.Equal(false, checkBox.GetIsChecked()); } [Fact] @@ -52,21 +46,17 @@ namespace Avalonia.IntegrationTests.Win32 { var checkBox = _session.FindElementByAccessibilityId("ThreeStateCheckBox"); - Assert.Equal("ThreeState", checkBox.Text); - Assert.Equal("2", checkBox.GetAttribute("Toggle.ToggleState")); + Assert.Equal("ThreeState", checkBox.GetName()); + Assert.Null(checkBox.GetIsChecked()); checkBox.Click(); - - Assert.False(checkBox.Selected); - Assert.Equal("0", checkBox.GetAttribute("Toggle.ToggleState")); + Assert.Equal(false, checkBox.GetIsChecked()); checkBox.Click(); - - Assert.True(checkBox.Selected); - Assert.Equal("1", checkBox.GetAttribute("Toggle.ToggleState")); + Assert.Equal(true, checkBox.GetIsChecked()); checkBox.Click(); - Assert.Equal("2", checkBox.GetAttribute("Toggle.ToggleState")); + Assert.Null(checkBox.GetIsChecked()); } } } diff --git a/tests/Avalonia.IntegrationTests.Win32/ElementExtensions.cs b/tests/Avalonia.IntegrationTests.Win32/ElementExtensions.cs index 545a2741bf..ac92cd0c5d 100644 --- a/tests/Avalonia.IntegrationTests.Win32/ElementExtensions.cs +++ b/tests/Avalonia.IntegrationTests.Win32/ElementExtensions.cs @@ -8,6 +8,15 @@ namespace Avalonia.IntegrationTests.Win32 { public static string GetName(this AppiumWebElement element) => GetAttribute(element, "Name", "title"); + public static bool? GetIsChecked(this AppiumWebElement element) => + GetAttribute(element, "Toggle.ToggleState", "value") switch + { + "0" => false, + "1" => true, + "2" => null, + _ => throw new ArgumentOutOfRangeException($"Unexpected IsChecked value.") + }; + public static string GetAttribute(AppiumWebElement element, string windows, string macOS) { return element.GetAttribute(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? windows : macOS); diff --git a/tests/Avalonia.IntegrationTests.Win32/TestAppFixture.cs b/tests/Avalonia.IntegrationTests.Win32/TestAppFixture.cs index e8f73ec82d..761787872f 100644 --- a/tests/Avalonia.IntegrationTests.Win32/TestAppFixture.cs +++ b/tests/Avalonia.IntegrationTests.Win32/TestAppFixture.cs @@ -52,7 +52,17 @@ namespace Avalonia.IntegrationTests.Win32 public AppiumDriver Session { get; } - public void Dispose() => Session.Close(); + public void Dispose() + { + try + { + Session.Close(); + } + catch + { + // Closing the session currently seems to crash the mac2 driver. + } + } [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)]