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;