diff --git a/Avalonia.sln b/Avalonia.sln index 56847bae31..539c39f63d 100644 --- a/Avalonia.sln +++ b/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} diff --git a/samples/IntegrationTestApp/MainWindow.axaml b/samples/IntegrationTestApp/MainWindow.axaml index 353e01dca7..f6abf543b9 100644 --- a/samples/IntegrationTestApp/MainWindow.axaml +++ b/samples/IntegrationTestApp/MainWindow.axaml @@ -25,6 +25,7 @@ WindowState: + diff --git a/samples/IntegrationTestApp/MainWindow.axaml.cs b/samples/IntegrationTestApp/MainWindow.axaml.cs index 087f25666b..19eb1d64b0 100644 --- a/samples/IntegrationTestApp/MainWindow.axaml.cs +++ b/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("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; diff --git a/samples/IntegrationTestApp/Program.cs b/samples/IntegrationTestApp/Program.cs index c09b249cfa..6603450b85 100644 --- a/samples/IntegrationTestApp/Program.cs +++ b/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() diff --git a/tests/Avalonia.IntegrationTests.Appium/AutomationTests.cs b/tests/Avalonia.IntegrationTests.Appium/AutomationTests.cs index bad015506f..4d8760ad61 100644 --- a/tests/Avalonia.IntegrationTests.Appium/AutomationTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/AutomationTests.cs @@ -8,7 +8,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public AutomationTests(TestAppFixture fixture) + public AutomationTests(DefaultAppFixture fixture) { _session = fixture.Session; diff --git a/tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs b/tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs index 6c630ae782..c0a5414ee3 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs @@ -9,7 +9,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public ButtonTests(TestAppFixture fixture) + public ButtonTests(DefaultAppFixture fixture) { _session = fixture.Session; diff --git a/tests/Avalonia.IntegrationTests.Appium/CheckBoxTests.cs b/tests/Avalonia.IntegrationTests.Appium/CheckBoxTests.cs index 02e7ac60c4..6c154fa268 100644 --- a/tests/Avalonia.IntegrationTests.Appium/CheckBoxTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/CheckBoxTests.cs @@ -8,7 +8,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public CheckBoxTests(TestAppFixture fixture) + public CheckBoxTests(DefaultAppFixture fixture) { _session = fixture.Session; diff --git a/tests/Avalonia.IntegrationTests.Appium/CollectionDefinitions.cs b/tests/Avalonia.IntegrationTests.Appium/CollectionDefinitions.cs new file mode 100644 index 0000000000..1e9fa22d9e --- /dev/null +++ b/tests/Avalonia.IntegrationTests.Appium/CollectionDefinitions.cs @@ -0,0 +1,14 @@ +using Xunit; + +namespace Avalonia.IntegrationTests.Appium +{ + [CollectionDefinition("Default")] + public class DefaultCollection : ICollectionFixture + { + } + + [CollectionDefinition("OverlayPopups")] + public class OverlayPopupsCollection : ICollectionFixture + { + } +} diff --git a/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs b/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs index 8df7873582..9e35d366d2 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs +++ b/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 _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) { } + } } } diff --git a/tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs b/tests/Avalonia.IntegrationTests.Appium/DefaultAppFixture.cs similarity index 62% rename from tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs rename to tests/Avalonia.IntegrationTests.Appium/DefaultAppFixture.cs index d71f9e9bcc..bb08cc0514 100644 --- a/tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs +++ b/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( 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( 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 Session { get; } public void Dispose() diff --git a/tests/Avalonia.IntegrationTests.Appium/DefaultCollection.cs b/tests/Avalonia.IntegrationTests.Appium/DefaultCollection.cs deleted file mode 100644 index bb2dd1fbec..0000000000 --- a/tests/Avalonia.IntegrationTests.Appium/DefaultCollection.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Xunit; - -namespace Avalonia.IntegrationTests.Appium -{ - [CollectionDefinition("Default")] - public class DefaultCollection : ICollectionFixture - { - } -} diff --git a/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs b/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs index 9745f993cb..65864cc649 100644 --- a/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs @@ -11,7 +11,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public GestureTests(TestAppFixture fixture) + public GestureTests(DefaultAppFixture fixture) { _session = fixture.Session; diff --git a/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs b/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs index e2943b3349..5c81c20af1 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs @@ -11,7 +11,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public ListBoxTests(TestAppFixture fixture) + public ListBoxTests(DefaultAppFixture fixture) { _session = fixture.Session; diff --git a/tests/Avalonia.IntegrationTests.Appium/MenuTests.cs b/tests/Avalonia.IntegrationTests.Appium/MenuTests.cs index 3f1fe7de12..5f57dfbc19 100644 --- a/tests/Avalonia.IntegrationTests.Appium/MenuTests.cs +++ b/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 _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) { } + } } } diff --git a/tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs b/tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs index 7858c4cc81..20594a9774 100644 --- a/tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs @@ -8,7 +8,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public NativeMenuTests(TestAppFixture fixture) + public NativeMenuTests(DefaultAppFixture fixture) { _session = fixture.Session; diff --git a/tests/Avalonia.IntegrationTests.Appium/OverlayPopupsAppFixture.cs b/tests/Avalonia.IntegrationTests.Appium/OverlayPopupsAppFixture.cs new file mode 100644 index 0000000000..1f8646888d --- /dev/null +++ b/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" }); + } + } +} diff --git a/tests/Avalonia.IntegrationTests.Appium/SliderTests.cs b/tests/Avalonia.IntegrationTests.Appium/SliderTests.cs index 7fa5eb83ee..9371a49ade 100644 --- a/tests/Avalonia.IntegrationTests.Appium/SliderTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/SliderTests.cs @@ -10,7 +10,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public SliderTests(TestAppFixture fixture) + public SliderTests(DefaultAppFixture fixture) { _session = fixture.Session; diff --git a/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs b/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs index ec24caa18c..a2bfb618d6 100644 --- a/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs @@ -19,7 +19,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public WindowTests(TestAppFixture fixture) + public WindowTests(DefaultAppFixture fixture) { _session = fixture.Session; diff --git a/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs b/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs index 55812d8df7..2eaaf2e0a8 100644 --- a/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs +++ b/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs @@ -16,7 +16,7 @@ namespace Avalonia.IntegrationTests.Appium { private readonly AppiumDriver _session; - public WindowTests_MacOS(TestAppFixture fixture) + public WindowTests_MacOS(DefaultAppFixture fixture) { var retry = 0;