From b4e5ad0435f0d1d0708b9f51a35f8d8e1ed95d24 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Mon, 7 Nov 2022 18:07:23 +0100 Subject: [PATCH 01/11] Add failing tests --- .../Media/GlyphRunTests.cs | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs index 1b0193bfdb..f6440e7fd4 100644 --- a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs +++ b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs @@ -50,6 +50,66 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } + [Fact] + public async Task Should_Render_GlyphRun_UnPositioned() + { + var control = new UnPositionedGlyphRunControl + { + [TextElement.ForegroundProperty] = new LinearGradientBrush + { + StartPoint = new RelativePoint(0, 0.5, RelativeUnit.Relative), + EndPoint = new RelativePoint(1, 0.5, RelativeUnit.Relative), + GradientStops = + { + new GradientStop { Color = Colors.Red, Offset = 0 }, + new GradientStop { Color = Colors.Blue, Offset = 1 } + } + } + }; + + Decorator target = new Decorator + { + Padding = new Thickness(8), + Width = 190, + Height = 120, + Child = control + }; + + await RenderToFile(target); + + CompareImages(); + } + + [Fact] + public async Task Should_Render_GlyphRun_Positioned() + { + var control = new PositionedGlyphRunControl + { + [TextElement.ForegroundProperty] = new LinearGradientBrush + { + StartPoint = new RelativePoint(0, 0.5, RelativeUnit.Relative), + EndPoint = new RelativePoint(1, 0.5, RelativeUnit.Relative), + GradientStops = + { + new GradientStop { Color = Colors.Red, Offset = 0 }, + new GradientStop { Color = Colors.Blue, Offset = 1 } + } + } + }; + + Decorator target = new Decorator + { + Padding = new Thickness(8), + Width = 190, + Height = 120, + Child = control + }; + + await RenderToFile(target); + + CompareImages(); + } + public class GlyphRunGeometryControl : Control { public GlyphRunGeometryControl() @@ -74,5 +134,56 @@ namespace Avalonia.Direct2D1.RenderTests.Media context.DrawGeometry(foreground, null, Geometry); } } + + public class UnPositionedGlyphRunControl : Control + { + public UnPositionedGlyphRunControl() + { + var glyphTypeface = new Typeface(TestFontFamily).GlyphTypeface; + + var glyphIndices = new[] { glyphTypeface.GetGlyph('A'), glyphTypeface.GetGlyph('B'), glyphTypeface.GetGlyph('C') }; + + var characters = new[] { 'A', 'B', 'C' }; + + GlyphRun = new GlyphRun(glyphTypeface, 100, characters, glyphIndices); + } + + public GlyphRun GlyphRun { get; } + + public override void Render(DrawingContext context) + { + var foreground = TextElement.GetForeground(this); + + context.DrawGlyphRun(foreground, GlyphRun); + } + } + + public class PositionedGlyphRunControl : Control + { + public PositionedGlyphRunControl() + { + var glyphTypeface = new Typeface(TestFontFamily).GlyphTypeface; + + var glyphIndices = new[] { glyphTypeface.GetGlyph('A'), glyphTypeface.GetGlyph('B'), glyphTypeface.GetGlyph('C') }; + + var scale = glyphTypeface.Metrics.DesignEmHeight / 100.0; + + var advances = new[] { glyphTypeface.GetGlyphAdvance(glyphIndices[0]) * scale, glyphTypeface.GetGlyphAdvance(glyphIndices[1]) * scale, glyphTypeface.GetGlyphAdvance(glyphIndices[2]) * scale }; + + var characters = new[] { 'A', 'B', 'C' }; + + GlyphRun = new GlyphRun(glyphTypeface, 100, characters, glyphIndices, advances); + } + + public GlyphRun GlyphRun { get; } + + public override void Render(DrawingContext context) + { + var foreground = TextElement.GetForeground(this); + + context.DrawGlyphRun(foreground, GlyphRun); + } + } + } } From b2959352867ab890a3a0069155d97072b5a54c3e Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Mon, 7 Nov 2022 18:40:33 +0100 Subject: [PATCH 02/11] Fix unpositioned GlyphRuns --- .../Avalonia.Skia/PlatformRenderInterface.cs | 10 +++++----- .../Avalonia.RenderTests/Media/GlyphRunTests.cs | 6 ++++-- ...hould_Render_GlyphRun_Positioned.expected.png | Bin 0 -> 5420 bytes ...uld_Render_GlyphRun_UnPositioned.expected.png | Bin 0 -> 5420 bytes ...hould_Render_GlyphRun_Positioned.expected.png | Bin 0 -> 4966 bytes ...uld_Render_GlyphRun_UnPositioned.expected.png | Bin 0 -> 4966 bytes 6 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png create mode 100644 tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png create mode 100644 tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png create mode 100644 tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index dd3badb2d8..f34e25299c 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -242,7 +242,7 @@ namespace Avalonia.Skia "Current GPU acceleration backend does not support OpenGL integration"); } - public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList glyphIndices, + public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList glyphIndices, IReadOnlyList glyphAdvances, IReadOnlyList glyphOffsets) { if (glyphTypeface == null) @@ -273,7 +273,7 @@ namespace Avalonia.Skia var count = glyphIndices.Count; - if(glyphOffsets != null && glyphAdvances != null) + if (glyphOffsets != null && glyphAdvances != null) { var runBuffer = builder.AllocatePositionedRun(font, count); @@ -295,7 +295,7 @@ namespace Avalonia.Skia } else { - if(glyphAdvances != null) + if (glyphAdvances != null) { var runBuffer = builder.AllocateHorizontalRun(font, count, 0); @@ -304,7 +304,7 @@ namespace Avalonia.Skia var currentX = 0.0; - for (int i = 0; i < glyphOffsets.Count; i++) + for (int i = 0; i < glyphAdvances.Count; i++) { glyphSpan[i] = glyphIndices[i]; @@ -319,7 +319,7 @@ namespace Avalonia.Skia var glyphSpan = runBuffer.GetGlyphSpan(); - for (int i = 0; i < glyphOffsets.Count; i++) + for (int i = 0; i < glyphIndices.Count; i++) { glyphSpan[i] = glyphIndices[i]; } diff --git a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs index f6440e7fd4..fb90038a74 100644 --- a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs +++ b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs @@ -166,9 +166,11 @@ namespace Avalonia.Direct2D1.RenderTests.Media var glyphIndices = new[] { glyphTypeface.GetGlyph('A'), glyphTypeface.GetGlyph('B'), glyphTypeface.GetGlyph('C') }; - var scale = glyphTypeface.Metrics.DesignEmHeight / 100.0; + var scale = 100.0 / glyphTypeface.Metrics.DesignEmHeight; - var advances = new[] { glyphTypeface.GetGlyphAdvance(glyphIndices[0]) * scale, glyphTypeface.GetGlyphAdvance(glyphIndices[1]) * scale, glyphTypeface.GetGlyphAdvance(glyphIndices[2]) * scale }; + var advance = glyphTypeface.GetGlyphAdvance(glyphIndices[0]) * scale; + + var advances = new[] { advance, advance, advance}; var characters = new[] { 'A', 'B', 'C' }; diff --git a/tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png b/tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..913266b6523a39fff08811b22e809c003b2c678f GIT binary patch literal 5420 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 Oq{% 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 N5HM?#Vk7tH{|C(Tfx`d* literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png b/tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8371541e228a3062aacacf216bfbec2c9c40d1 GIT binary patch literal 4966 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 N5HM?#Vk7tH{|C(Tfx`d* literal 0 HcmV?d00001 From 981e95781b66fa26ffc7b6cc19ea903bfb3a7ebb Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 10 Nov 2022 12:36:32 +0000 Subject: [PATCH 03/11] use net 7 for integration tests --- azure-pipelines-integrationtests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-integrationtests.yml b/azure-pipelines-integrationtests.yml index 4fba4ca36f..456b8f8f7e 100644 --- a/azure-pipelines-integrationtests.yml +++ b/azure-pipelines-integrationtests.yml @@ -56,9 +56,9 @@ jobs: version: 6.0.401 - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 7.0.100-rc.2.22477.23' + displayName: 'Use .NET Core SDK 7.0.100' inputs: - version: 7.0.100-rc.2.22477.23 + version: 7.0.100 - task: Windows Application Driver@0 inputs: From 773cac89318551129ef6496bb3c7d93cd0000815 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 10 Nov 2022 12:45:00 +0000 Subject: [PATCH 04/11] mac os net7.0.100 --- azure-pipelines-integrationtests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-integrationtests.yml b/azure-pipelines-integrationtests.yml index 456b8f8f7e..4316d5c298 100644 --- a/azure-pipelines-integrationtests.yml +++ b/azure-pipelines-integrationtests.yml @@ -18,9 +18,9 @@ jobs: version: 6.0.401 - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 7.0.100-rc.2.22477.23' + displayName: 'Use .NET Core SDK 7.0.100' inputs: - version: 7.0.100-rc.2.22477.23 + version: 7.0.100 - script: system_profiler SPDisplaysDataType |grep Resolution From ad574e2c64d184ff6aca4158072f8c9745a4d8d9 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 10 Nov 2022 13:01:25 +0000 Subject: [PATCH 05/11] use net 7 for integration test app. --- samples/IntegrationTestApp/IntegrationTestApp.csproj | 2 +- tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs | 2 +- .../Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh | 2 +- tests/Avalonia.IntegrationTests.Appium/readme.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/IntegrationTestApp/IntegrationTestApp.csproj b/samples/IntegrationTestApp/IntegrationTestApp.csproj index 4284399357..0a761d70ba 100644 --- a/samples/IntegrationTestApp/IntegrationTestApp.csproj +++ b/samples/IntegrationTestApp/IntegrationTestApp.csproj @@ -1,7 +1,7 @@  WinExe - net6.0 + net7.0 enable diff --git a/tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs b/tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs index b3385d8ee7..d71f9e9bcc 100644 --- a/tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs +++ b/tests/Avalonia.IntegrationTests.Appium/TestAppFixture.cs @@ -11,7 +11,7 @@ namespace Avalonia.IntegrationTests.Appium { public class TestAppFixture : IDisposable { - private const string TestAppPath = @"..\..\..\..\..\samples\IntegrationTestApp\bin\Debug\net6.0\IntegrationTestApp.exe"; + private const string TestAppPath = @"..\..\..\..\..\samples\IntegrationTestApp\bin\Debug\net7.0\IntegrationTestApp.exe"; private const string TestAppBundleId = "net.avaloniaui.avalonia.integrationtestapp"; public TestAppFixture() diff --git a/tests/Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh b/tests/Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh index 14e765d16a..dc4619f35c 100755 --- a/tests/Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh +++ b/tests/Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh @@ -10,7 +10,7 @@ pkill IntegrationTestApp rm -rf $(osascript -e "POSIX path of (path to application id \"net.avaloniaui.avalonia.integrationtestapp\")") pkill IntegrationTestApp ./samples/IntegrationTestApp/bundle.sh -open -n ./samples/IntegrationTestApp/bin/Debug/net6.0/osx-arm64/publish/IntegrationTestApp.app +open -n ./samples/IntegrationTestApp/bin/Debug/net7.0/osx-arm64/publish/IntegrationTestApp.app pkill IntegrationTestApp open -b net.avaloniaui.avalonia.integrationtestapp dotnet test tests/Avalonia.IntegrationTests.Appium/ -l "console;verbosity=detailed" diff --git a/tests/Avalonia.IntegrationTests.Appium/readme.md b/tests/Avalonia.IntegrationTests.Appium/readme.md index ee630a31fd..f54720920d 100644 --- a/tests/Avalonia.IntegrationTests.Appium/readme.md +++ b/tests/Avalonia.IntegrationTests.Appium/readme.md @@ -18,7 +18,7 @@ - Install Appium: https://appium.io/ - Give [Xcode helper the required permissions](https://apple.stackexchange.com/questions/334008) - `cd samples/IntegrationTestApp` then `./bundle.sh` to create an app bundle for `IntegrationTestApp` -- Register the app bundle by running `open -n ./bin/Debug/net6.0/osx-arm64/publish/IntegrationTestApp.app` +- Register the app bundle by running `open -n ./bin/Debug/net7.0/osx-arm64/publish/IntegrationTestApp.app` ### Running From 4d153e05b7945ffe3e14ec2055898dbe87f98482 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 10 Nov 2022 13:03:24 +0000 Subject: [PATCH 06/11] fix run command --- azure-pipelines-integrationtests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines-integrationtests.yml b/azure-pipelines-integrationtests.yml index 4316d5c298..43253ac6be 100644 --- a/azure-pipelines-integrationtests.yml +++ b/azure-pipelines-integrationtests.yml @@ -32,7 +32,7 @@ jobs: rm -rf $(osascript -e "POSIX path of (path to application id \"net.avaloniaui.avalonia.integrationtestapp\")") pkill IntegrationTestApp ./samples/IntegrationTestApp/bundle.sh - open -n ./samples/IntegrationTestApp/bin/Debug/net6.0/osx-arm64/publish/IntegrationTestApp.app + open -n ./samples/IntegrationTestApp/bin/Debug/net7.0/osx-arm64/publish/IntegrationTestApp.app pkill IntegrationTestApp - task: DotNetCoreCLI@2 From 73a892f13efe9695653c404aef49f678cb7a2712 Mon Sep 17 00:00:00 2001 From: Benedikt Date: Thu, 10 Nov 2022 14:50:04 +0100 Subject: [PATCH 07/11] Only run tests on Windows --- tests/Avalonia.RenderTests/Media/GlyphRunTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs index fb90038a74..31e485448e 100644 --- a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs +++ b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs @@ -50,7 +50,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } - [Fact] + [Win32Fact("For consistent results")] public async Task Should_Render_GlyphRun_UnPositioned() { var control = new UnPositionedGlyphRunControl @@ -80,7 +80,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } - [Fact] + [Win32Fact("For consistent results")] public async Task Should_Render_GlyphRun_Positioned() { var control = new PositionedGlyphRunControl From ae7a532d068633e4043351f625a7500afb959298 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Thu, 10 Nov 2022 14:19:23 +0000 Subject: [PATCH 08/11] do not create a surface if the window provided is invalid --- src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs b/src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs index a6d8c1e98d..04ea29a507 100644 --- a/src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs +++ b/src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs @@ -50,6 +50,8 @@ namespace Avalonia.OpenGL.Egl { using (PrimaryContext.MakeCurrent()) { + if(window == IntPtr.Zero) + throw new OpenGlException($"Window {window} is invalid."); var s = Display.EglInterface.CreateWindowSurface(Display.Handle, Display.Config, window, new[] { EGL_NONE, EGL_NONE }); if (s == IntPtr.Zero) From 9311d88a263dd9b1a9bc78776c996b6272e07d18 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 10 Nov 2022 14:49:48 +0000 Subject: [PATCH 09/11] fix gesture tests on macos --- tests/Avalonia.IntegrationTests.Appium/GestureTests.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs b/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs index 205ad6b8cf..86a8c65fcc 100644 --- a/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs @@ -82,7 +82,7 @@ namespace Avalonia.IntegrationTests.Appium new Actions(_session).ClickAndHold(border).Release().Perform(); - Thread.Sleep(100); + Thread.Sleep(50); // DoubleTapped is raised on second pointer press, not release. new Actions(_session).ClickAndHold(border).Perform(); @@ -93,7 +93,8 @@ namespace Avalonia.IntegrationTests.Appium } finally { - new Actions(_session).Release(border).Perform(); + + new Actions(_session).MoveToElement(lastGesture).Release().Perform(); } } From 8f6e9f1d0d9b1cae54a2cce2b3f3418b2949e4a3 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Thu, 10 Nov 2022 15:01:12 +0000 Subject: [PATCH 10/11] move check before MakeCurrent --- src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs b/src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs index 04ea29a507..a1ac2a9d37 100644 --- a/src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs +++ b/src/Avalonia.OpenGL/Egl/EglPlatformOpenGlInterface.cs @@ -44,14 +44,15 @@ namespace Avalonia.OpenGL.Egl public IGlContext CreateContext() => Display.CreateContext(null); public IGlContext CreateSharedContext() => Display.CreateContext(PrimaryEglContext); - + public EglSurface CreateWindowSurface(IntPtr window) { + if (window == IntPtr.Zero) + throw new OpenGlException($"Window {window} is invalid."); + using (PrimaryContext.MakeCurrent()) { - if(window == IntPtr.Zero) - throw new OpenGlException($"Window {window} is invalid."); var s = Display.EglInterface.CreateWindowSurface(Display.Handle, Display.Config, window, new[] { EGL_NONE, EGL_NONE }); if (s == IntPtr.Zero) From 07f6a431286fa633567205519ef768adb967da3a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 10 Nov 2022 15:37:48 +0000 Subject: [PATCH 11/11] fix integration tests. --- .../GestureTests.cs | 11 +++++++---- .../WindowTests_MacOS.cs | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs b/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs index 86a8c65fcc..9745f993cb 100644 --- a/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/GestureTests.cs @@ -119,12 +119,15 @@ namespace Avalonia.IntegrationTests.Appium // #8733 var border = _session.FindElementByAccessibilityId("GestureBorder"); var lastGesture = _session.FindElementByAccessibilityId("LastGesture"); - + new Actions(_session) .MoveToElement(border) .DoubleClick() - .DoubleClick() .Perform(); + + Thread.Sleep(100); + + new Actions(_session).MoveToElement(lastGesture, 200, 200).DoubleClick().Perform(); Assert.Equal("DoubleTapped2", lastGesture.Text); } @@ -148,9 +151,9 @@ namespace Avalonia.IntegrationTests.Appium var device = new PointerInputDevice(PointerKind.Mouse); var b = new ActionBuilder(); - b.AddAction(device.CreatePointerMove(border, 50, 50, TimeSpan.FromMilliseconds(100))); + b.AddAction(device.CreatePointerMove(border, 50, 50, TimeSpan.FromMilliseconds(50))); b.AddAction(device.CreatePointerDown(MouseButton.Right)); - b.AddAction(device.CreatePointerMove(border, 2, 2, TimeSpan.FromMilliseconds(100))); + b.AddAction(device.CreatePointerMove(border, 52, 52, TimeSpan.FromMilliseconds(50))); b.AddAction(device.CreatePointerUp(MouseButton.Right)); _session.PerformActions(b.ToActionSequenceList()); diff --git a/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs b/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs index 2dd849bee1..05ed0616a8 100644 --- a/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs +++ b/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs @@ -180,10 +180,23 @@ namespace Avalonia.IntegrationTests.Appium Assert.False(miniaturizeButton.Enabled); } } + + [PlatformTheory(TestPlatforms.MacOS)] + [InlineData(ShowWindowMode.Owned)] + public void Minimize_Button_Disabled_Owned_Window(ShowWindowMode mode) + { + using (OpenWindow(new PixelSize(200, 100), mode, WindowStartupLocation.Manual)) + { + var secondaryWindow = GetWindow("SecondaryWindow"); + var (_, miniaturizeButton, _) = secondaryWindow.GetChromeButtons(); + + Assert.Equal(false, miniaturizeButton.Enabled); + } + } + [PlatformTheory(TestPlatforms.MacOS)] [InlineData(ShowWindowMode.NonOwned)] - [InlineData(ShowWindowMode.Owned)] public void Minimize_Button_Minimizes_Window(ShowWindowMode mode) { using (OpenWindow(new PixelSize(200, 100), mode, WindowStartupLocation.Manual))