1
0
Эх сурвалжийг харах

Add failing integration tests for overlay popups.

Integration tests for #10420:

- Adds an `--overlayPopups` command-line argument to IntegrationTestApp
- Renames `TestAppFixture` -> `DefaultAppFixture`
- Adds additional `OverlayPopupsAppFixture`
- Runs ComboBox and Menu tests in both default and overlay popups mode
- VS keeps changing the `.sln` file
Steven Kirk 2 жил өмнө
parent
commit
ac882ad3a1

+ 6 - 5
Avalonia.sln

@@ -555,9 +555,14 @@ Global
 		{75C47156-C5D8-44BC-A5A7-E8657C2248D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{75C47156-C5D8-44BC-A5A7-E8657C2248D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{75C47156-C5D8-44BC-A5A7-E8657C2248D6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C810060E-3809-4B74-A125-F11533AF9C1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{C810060E-3809-4B74-A125-F11533AF9C1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{C810060E-3809-4B74-A125-F11533AF9C1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C810060E-3809-4B74-A125-F11533AF9C1B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Debug|Any CPU.ActiveCfg = Release|Any CPU
+		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Debug|Any CPU.Build.0 = Release|Any CPU
+		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Release|Any CPU.Build.0 = Release|Any CPU
 		{EE0F0DD4-A70D-472B-BD5D-B7D32D0E9386}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{EE0F0DD4-A70D-472B-BD5D-B7D32D0E9386}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{EE0F0DD4-A70D-472B-BD5D-B7D32D0E9386}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -566,10 +571,6 @@ Global
 		{F4E36AA8-814E-4704-BC07-291F70F45193}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{F4E36AA8-814E-4704-BC07-291F70F45193}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{F4E36AA8-814E-4704-BC07-291F70F45193}.Release|Any CPU.Build.0 = Release|Any CPU
-		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Debug|Any CPU.ActiveCfg = Release|Any CPU
-		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Debug|Any CPU.Build.0 = Release|Any CPU
-		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -635,8 +636,8 @@ Global
 		{90B08091-9BBD-4362-B712-E9F2CC62B218} = {9B9E3891-2366-4253-A952-D08BCEB71098}
 		{75C47156-C5D8-44BC-A5A7-E8657C2248D6} = {9B9E3891-2366-4253-A952-D08BCEB71098}
 		{C810060E-3809-4B74-A125-F11533AF9C1B} = {9B9E3891-2366-4253-A952-D08BCEB71098}
-		{F4E36AA8-814E-4704-BC07-291F70F45193} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
 		{C692FE73-43DB-49CE-87FC-F03ED61F25C9} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637}
+		{F4E36AA8-814E-4704-BC07-291F70F45193} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {87366D66-1391-4D90-8999-95A620AD786A}

+ 1 - 0
samples/IntegrationTestApp/MainWindow.axaml

@@ -25,6 +25,7 @@
     <StackPanel DockPanel.Dock="Bottom" Margin="4" Orientation="Horizontal">
       <TextBlock Margin="0,0,4,0">WindowState:</TextBlock>
       <TextBlock Name="MainWindowState" Text="{Binding WindowState}"/>
+      <TextBlock Name="AppOverlayPopups" Margin="8 0"/>
     </StackPanel>
     
     <TabControl TabStripPlacement="Left" Name="MainTabs">

+ 7 - 5
samples/IntegrationTestApp/MainWindow.axaml.cs

@@ -1,19 +1,17 @@
-using System;
 using System.Collections.Generic;
 using System.Linq;
 using Avalonia;
 using Avalonia.Automation;
 using Avalonia.Controls;
 using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Primitives.PopupPositioning;
 using Avalonia.Input;
 using Avalonia.Interactivity;
-using Avalonia.Media;
 using Avalonia.Markup.Xaml;
+using Avalonia.Media;
 using Avalonia.VisualTree;
 using Microsoft.CodeAnalysis;
-using Avalonia.Controls.Primitives;
-using Avalonia.Threading;
-using Avalonia.Controls.Primitives.PopupPositioning;
 
 namespace IntegrationTestApp
 {
@@ -25,6 +23,10 @@ namespace IntegrationTestApp
             InitializeViewMenu();
             InitializeGesturesTab();
             this.AttachDevTools();
+
+            var overlayPopups = this.Get<TextBlock>("AppOverlayPopups");
+            overlayPopups.Text = Program.OverlayPopups ? "Overlay Popups" : "Native Popups";
+
             AddHandler(Button.ClickEvent, OnButtonClick);
             ListBoxItems = Enumerable.Range(0, 100).Select(x => "Item " + x).ToList();
             DataContext = this;

+ 18 - 4
samples/IntegrationTestApp/Program.cs

@@ -1,17 +1,31 @@
 using System;
+using System.Linq;
 using Avalonia;
-using Avalonia.Controls;
-using Avalonia.Controls.ApplicationLifetimes;
 
 namespace IntegrationTestApp
 {
     class Program
     {
+        public static bool OverlayPopups { get; private set; }
+
         // Initialization code. Don't use any Avalonia, third-party APIs or any
         // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
         // yet and stuff might break.
-        public static void Main(string[] args) => BuildAvaloniaApp()
-            .StartWithClassicDesktopLifetime(args);
+        public static void Main(string[] args)
+        {
+            OverlayPopups = args.Contains("--overlayPopups");
+            
+            BuildAvaloniaApp()
+                .With(new Win32PlatformOptions
+                {
+                    OverlayPopups = OverlayPopups,
+                })
+                .With(new AvaloniaNativePlatformOptions
+                {
+                    OverlayPopups = OverlayPopups,
+                })
+                .StartWithClassicDesktopLifetime(args);
+        }
 
         // Avalonia configuration, don't remove; also used by visual designer.
         public static AppBuilder BuildAvaloniaApp()

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/AutomationTests.cs

@@ -8,7 +8,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public AutomationTests(TestAppFixture fixture)
+        public AutomationTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs

@@ -9,7 +9,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public ButtonTests(TestAppFixture fixture)
+        public ButtonTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/CheckBoxTests.cs

@@ -8,7 +8,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public CheckBoxTests(TestAppFixture fixture)
+        public CheckBoxTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 

+ 14 - 0
tests/Avalonia.IntegrationTests.Appium/CollectionDefinitions.cs

@@ -0,0 +1,14 @@
+using Xunit;
+
+namespace Avalonia.IntegrationTests.Appium
+{
+    [CollectionDefinition("Default")]
+    public class DefaultCollection : ICollectionFixture<DefaultAppFixture>
+    {
+    }
+
+    [CollectionDefinition("OverlayPopups")]
+    public class OverlayPopupsCollection : ICollectionFixture<OverlayPopupsAppFixture>
+    {
+    }
+}

+ 14 - 3
tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs

@@ -4,12 +4,11 @@ using Xunit;
 
 namespace Avalonia.IntegrationTests.Appium
 {
-    [Collection("Default")]
-    public class ComboBoxTests
+    public abstract class ComboBoxTests
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public ComboBoxTests(TestAppFixture fixture)
+        public ComboBoxTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 
@@ -153,5 +152,17 @@ namespace Avalonia.IntegrationTests.Appium
 
             Assert.Equal(string.Empty, comboBox.GetComboBoxValue());
         }
+
+        [Collection("Default")]
+        public class Default : ComboBoxTests
+        {
+            public Default(DefaultAppFixture fixture) : base(fixture) { }
+        }
+
+        [Collection("OverlayPopups")]
+        public class OverlayPopups : ComboBoxTests
+        {
+            public OverlayPopups(OverlayPopupsAppFixture fixture) : base(fixture) { }
+        }
     }
 }

+ 23 - 15
tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs → tests/Avalonia.IntegrationTests.Appium/DefaultAppFixture.cs

@@ -9,25 +9,21 @@ using OpenQA.Selenium.Appium.Windows;
 
 namespace Avalonia.IntegrationTests.Appium
 {
-    public class TestAppFixture : IDisposable
+    public class DefaultAppFixture : IDisposable
     {
         private const string TestAppPath = @"..\..\..\..\..\samples\IntegrationTestApp\bin\Debug\net7.0\IntegrationTestApp.exe";
         private const string TestAppBundleId = "net.avaloniaui.avalonia.integrationtestapp";
 
-        public TestAppFixture()
+        public DefaultAppFixture()
         {
-            var opts = new AppiumOptions();
-            var path = Path.GetFullPath(TestAppPath);
+            var options = new AppiumOptions();
 
             if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
             {
-                opts.AddAdditionalCapability(MobileCapabilityType.App, path);
-                opts.AddAdditionalCapability(MobileCapabilityType.PlatformName, MobilePlatform.Windows);
-                opts.AddAdditionalCapability(MobileCapabilityType.DeviceName, "WindowsPC");
-
+                ConfigureWin32Options(options);
                 Session = new WindowsDriver<AppiumWebElement>(
                     new Uri("http://127.0.0.1:4723"),
-                    opts);
+                    options);
 
                 // https://github.com/microsoft/WinAppDriver/issues/1025
                 SetForegroundWindow(new IntPtr(int.Parse(
@@ -36,14 +32,10 @@ namespace Avalonia.IntegrationTests.Appium
             }
             else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
             {
-                opts.AddAdditionalCapability("appium:bundleId", TestAppBundleId);
-                opts.AddAdditionalCapability(MobileCapabilityType.PlatformName, MobilePlatform.MacOS);
-                opts.AddAdditionalCapability(MobileCapabilityType.AutomationName, "mac2");
-                opts.AddAdditionalCapability("appium:showServerLogs", true);
-
+                ConfigureMacOptions(options);
                 Session = new MacDriver<AppiumWebElement>(
                     new Uri("http://127.0.0.1:4723/wd/hub"),
-                    opts);
+                    options);
             }
             else
             {
@@ -51,6 +43,22 @@ namespace Avalonia.IntegrationTests.Appium
             }
         }
 
+        protected virtual void ConfigureWin32Options(AppiumOptions options)
+        {
+            var path = Path.GetFullPath(TestAppPath);
+            options.AddAdditionalCapability(MobileCapabilityType.App, path);
+            options.AddAdditionalCapability(MobileCapabilityType.PlatformName, MobilePlatform.Windows);
+            options.AddAdditionalCapability(MobileCapabilityType.DeviceName, "WindowsPC");
+        }
+
+        protected virtual void ConfigureMacOptions(AppiumOptions options)
+        {
+            options.AddAdditionalCapability("appium:bundleId", TestAppBundleId);
+            options.AddAdditionalCapability(MobileCapabilityType.PlatformName, MobilePlatform.MacOS);
+            options.AddAdditionalCapability(MobileCapabilityType.AutomationName, "mac2");
+            options.AddAdditionalCapability("appium:showServerLogs", true);
+        }
+
         public AppiumDriver<AppiumWebElement> Session { get; }
 
         public void Dispose()

+ 0 - 9
tests/Avalonia.IntegrationTests.Appium/DefaultCollection.cs

@@ -1,9 +0,0 @@
-using Xunit;
-
-namespace Avalonia.IntegrationTests.Appium
-{
-    [CollectionDefinition("Default")]
-    public class DefaultCollection : ICollectionFixture<TestAppFixture>
-    {
-    }
-}

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/GestureTests.cs

@@ -11,7 +11,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public GestureTests(TestAppFixture fixture)
+        public GestureTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs

@@ -11,7 +11,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public ListBoxTests(TestAppFixture fixture)
+        public ListBoxTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 

+ 14 - 2
tests/Avalonia.IntegrationTests.Appium/MenuTests.cs

@@ -7,11 +7,11 @@ using Xunit;
 namespace Avalonia.IntegrationTests.Appium
 {
     [Collection("Default")]
-    public class MenuTests
+    public abstract class MenuTests
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public MenuTests(TestAppFixture fixture)
+        public MenuTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 
@@ -181,5 +181,17 @@ namespace Avalonia.IntegrationTests.Appium
             var tab = tabs.FindElementByName("Menu");
             tab.MovePointerOver();
         }
+
+        [Collection("Default")]
+        public class Default : MenuTests
+        {
+            public Default(DefaultAppFixture fixture) : base(fixture) { }
+        }
+
+        [Collection("OverlayPopups")]
+        public class OverlayPopups : MenuTests
+        {
+            public OverlayPopups(OverlayPopupsAppFixture fixture) : base(fixture) { }
+        }
     }
 }

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs

@@ -8,7 +8,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public NativeMenuTests(TestAppFixture fixture)
+        public NativeMenuTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 

+ 19 - 0
tests/Avalonia.IntegrationTests.Appium/OverlayPopupsAppFixture.cs

@@ -0,0 +1,19 @@
+using OpenQA.Selenium.Appium;
+
+namespace Avalonia.IntegrationTests.Appium
+{
+    public class OverlayPopupsAppFixture : DefaultAppFixture
+    {
+        protected override void ConfigureWin32Options(AppiumOptions options)
+        {
+            base.ConfigureWin32Options(options);
+            options.AddAdditionalCapability("appArguments", "--overlayPopups");
+        }
+
+        protected override void ConfigureMacOptions(AppiumOptions options)
+        {
+            base.ConfigureMacOptions(options);
+            options.AddAdditionalCapability("appium:arguments", new[] { "--overlayPopups" });
+        }
+    }
+}

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/SliderTests.cs

@@ -10,7 +10,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public SliderTests(TestAppFixture fixture)
+        public SliderTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/WindowTests.cs

@@ -19,7 +19,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public WindowTests(TestAppFixture fixture)
+        public WindowTests(DefaultAppFixture fixture)
         {
             _session = fixture.Session;
 

+ 1 - 1
tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs

@@ -16,7 +16,7 @@ namespace Avalonia.IntegrationTests.Appium
     {
         private readonly AppiumDriver<AppiumWebElement> _session;
 
-        public WindowTests_MacOS(TestAppFixture fixture)
+        public WindowTests_MacOS(DefaultAppFixture fixture)
         {
             var retry = 0;