diff --git a/samples/IntegrationTestApp/MainWindow.axaml b/samples/IntegrationTestApp/MainWindow.axaml index 90407294b5..fe1487a7f2 100644 --- a/samples/IntegrationTestApp/MainWindow.axaml +++ b/samples/IntegrationTestApp/MainWindow.axaml @@ -67,6 +67,15 @@ + + + + + + + + + diff --git a/samples/IntegrationTestApp/MainWindow.axaml.cs b/samples/IntegrationTestApp/MainWindow.axaml.cs index 74bfb6b579..b9e631a312 100644 --- a/samples/IntegrationTestApp/MainWindow.axaml.cs +++ b/samples/IntegrationTestApp/MainWindow.axaml.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Interactivity; @@ -14,8 +16,12 @@ namespace IntegrationTestApp InitializeViewMenu(); this.AttachDevTools(); AddHandler(Button.ClickEvent, OnButtonClick); + ListBoxItems = Enumerable.Range(0, 100).Select(x => "Item " + x).ToList(); + DataContext = this; } + public List ListBoxItems { get; } + private void InitializeComponent() { AvaloniaXamlLoader.Load(this); @@ -54,6 +60,8 @@ namespace IntegrationTestApp this.FindControl("BasicComboBox").SelectedIndex = -1; if (source?.Name == "ComboBoxSelectFirst") this.FindControl("BasicComboBox").SelectedIndex = 0; + if (source?.Name == "ListBoxSelectionClear") + this.FindControl("BasicListBox").SelectedIndex = -1; } } } diff --git a/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs b/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs index 4f407e5964..fad3e1eb9f 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs @@ -1,7 +1,5 @@ -using System.Threading; -using OpenQA.Selenium; +using OpenQA.Selenium; using OpenQA.Selenium.Appium; -using OpenQA.Selenium.Appium.Mac; using Xunit; namespace Avalonia.IntegrationTests.Appium diff --git a/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs b/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs index 81d85be861..15e22f4424 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs +++ b/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs @@ -1,13 +1,16 @@ using System; +using System.Collections.Generic; using System.Runtime.InteropServices; using OpenQA.Selenium.Appium; -using OpenQA.Selenium.Appium.MultiTouch; using OpenQA.Selenium.Interactions; namespace Avalonia.IntegrationTests.Appium { internal static class ElementExtensions { + public static IReadOnlyList GetChildren(this AppiumWebElement element) => + element.FindElementsByXPath("*/*"); + public static string GetComboBoxValue(this AppiumWebElement element) { return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @@ -37,10 +40,7 @@ namespace Avalonia.IntegrationTests.Appium // The Click() method seems to correspond to accessibilityPerformPress on macOS but certain controls // such as list items don't support this action, so instead simulate a physical click as VoiceOver // does. - var action = new Actions(element.WrappedDriver); - action.MoveToElement(element); - action.Click(); - action.Perform(); + new Actions(element.WrappedDriver).MoveToElement(element).Click().Perform(); } } diff --git a/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs b/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs new file mode 100644 index 0000000000..9c2252e99f --- /dev/null +++ b/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs @@ -0,0 +1,103 @@ +using System.Threading; +using OpenQA.Selenium; +using OpenQA.Selenium.Appium; +using OpenQA.Selenium.Interactions; +using Xunit; + +namespace Avalonia.IntegrationTests.Appium +{ + [Collection("Default")] + public class ListBoxTests + { + private readonly AppiumDriver _session; + + public ListBoxTests(TestAppFixture fixture) + { + _session = fixture.Session; + + var tabs = _session.FindElementByAccessibilityId("MainTabs"); + var tab = tabs.FindElementByName("ListBox"); + tab.Click(); + } + + [Fact] + public void Can_Select_Item_By_Clicking() + { + var listBox = GetTarget(); + var item2 = listBox.FindElementByName("Item 2"); + var item4 = listBox.FindElementByName("Item 4"); + + Assert.False(item2.Selected); + Assert.False(item4.Selected); + + item2.SendClick(); + Assert.True(item2.Selected); + Assert.False(item4.Selected); + + item4.SendClick(); + Assert.False(item2.Selected); + Assert.True(item4.Selected); + } + + // WinAppDriver seems unable to consistently send a Ctrl key. + [PlatformFact(SkipOnWindows = true)] + public void Can_Select_Items_By_Ctrl_Clicking() + { + var listBox = GetTarget(); + var item2 = listBox.FindElementByName("Item 2"); + var item4 = listBox.FindElementByName("Item 4"); + + Assert.False(item2.Selected); + Assert.False(item4.Selected); + + new Actions(_session) + .Click(item2) + .KeyDown(Keys.Control) + .Click(item4) + .KeyUp(Keys.Control) + .Perform(); + + Assert.True(item2.Selected); + Assert.True(item4.Selected); + } + + [Fact] + public void Can_Select_Range_By_Shift_Clicking() + { + var listBox = GetTarget(); + var item2 = listBox.FindElementByName("Item 2"); + var item3 = listBox.FindElementByName("Item 3"); + var item4 = listBox.FindElementByName("Item 4"); + + Assert.False(item2.Selected); + Assert.False(item3.Selected); + Assert.False(item4.Selected); + + new Actions(_session) + .Click(item2) + .KeyDown(Keys.Shift) + .Click(item4) + .KeyUp(Keys.Shift) + .Perform(); + + Assert.True(item2.Selected); + Assert.True(item3.Selected); + Assert.True(item4.Selected); + } + + [Fact] + public void Is_Virtualized() + { + var listBox = GetTarget(); + var children = listBox.GetChildren(); + + Assert.True(children.Count < 100); + } + + private AppiumWebElement GetTarget() + { + _session.FindElementByAccessibilityId("ListBoxSelectionClear").Click(); + return _session.FindElementByAccessibilityId("BasicListBox"); + } + } +}