Browse Source

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
pull/10448/head
Steven Kirk 3 years ago
parent
commit
ac882ad3a1
  1. 11
      Avalonia.sln
  2. 1
      samples/IntegrationTestApp/MainWindow.axaml
  3. 12
      samples/IntegrationTestApp/MainWindow.axaml.cs
  4. 22
      samples/IntegrationTestApp/Program.cs
  5. 2
      tests/Avalonia.IntegrationTests.Appium/AutomationTests.cs
  6. 2
      tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs
  7. 2
      tests/Avalonia.IntegrationTests.Appium/CheckBoxTests.cs
  8. 14
      tests/Avalonia.IntegrationTests.Appium/CollectionDefinitions.cs
  9. 17
      tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs
  10. 38
      tests/Avalonia.IntegrationTests.Appium/DefaultAppFixture.cs
  11. 9
      tests/Avalonia.IntegrationTests.Appium/DefaultCollection.cs
  12. 2
      tests/Avalonia.IntegrationTests.Appium/GestureTests.cs
  13. 2
      tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs
  14. 16
      tests/Avalonia.IntegrationTests.Appium/MenuTests.cs
  15. 2
      tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs
  16. 19
      tests/Avalonia.IntegrationTests.Appium/OverlayPopupsAppFixture.cs
  17. 2
      tests/Avalonia.IntegrationTests.Appium/SliderTests.cs
  18. 2
      tests/Avalonia.IntegrationTests.Appium/WindowTests.cs
  19. 2
      tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs

11
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
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">

12
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;

22
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()

2
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;

2
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;

2
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
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>
{
}
}

17
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) { }
}
}
}

38
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()

9
tests/Avalonia.IntegrationTests.Appium/DefaultCollection.cs

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

2
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;

2
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;

16
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) { }
}
}
}

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

2
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;

2
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;

2
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;

Loading…
Cancel
Save