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");
+ }
+ }
+}