Selaa lähdekoodia

Added a few ListBox tests.

Steven Kirk 3 vuotta sitten
vanhempi
sitoutus
261f46ea74

+ 9 - 0
samples/IntegrationTestApp/MainWindow.axaml

@@ -67,6 +67,15 @@
           <Button Name="ComboBoxSelectFirst">Select First</Button>
         </StackPanel>
       </TabItem>
+
+      <TabItem Header="ListBox">
+        <DockPanel>
+          <StackPanel DockPanel.Dock="Bottom">
+            <Button Name="ListBoxSelectionClear">Clear Selection</Button>
+          </StackPanel>
+          <ListBox Name="BasicListBox" Items="{Binding ListBoxItems}" SelectionMode="Multiple"/>
+        </DockPanel>
+      </TabItem>
       
       <TabItem Header="Menu">
         <DockPanel>

+ 8 - 0
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<string> ListBoxItems { get; }
+
         private void InitializeComponent()
         {
             AvaloniaXamlLoader.Load(this);
@@ -54,6 +60,8 @@ namespace IntegrationTestApp
                 this.FindControl<ComboBox>("BasicComboBox").SelectedIndex = -1;
             if (source?.Name == "ComboBoxSelectFirst")
                 this.FindControl<ComboBox>("BasicComboBox").SelectedIndex = 0;
+            if (source?.Name == "ListBoxSelectionClear")
+                this.FindControl<ListBox>("BasicListBox").SelectedIndex = -1;
         }
     }
 }

+ 1 - 3
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

+ 5 - 5
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<AppiumWebElement> 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();
             }
         }
 

+ 103 - 0
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<AppiumWebElement> _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");
+        }
+    }
+}