From 9d4f11a1119d86e84daae2077da3f7a3d3acadc8 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 25 Mar 2023 17:05:03 +0600 Subject: [PATCH] Fixed tests --- .../Threading/DispatcherOperation.cs | 4 +-- .../ClassicDesktopStyleApplicationLifetime.cs | 1 + .../DesktopStyleApplicationLifetimeTests.cs | 26 +++++++++++++------ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/Avalonia.Base/Threading/DispatcherOperation.cs b/src/Avalonia.Base/Threading/DispatcherOperation.cs index 01652fb731..9fe99e5db4 100644 --- a/src/Avalonia.Base/Threading/DispatcherOperation.cs +++ b/src/Avalonia.Base/Threading/DispatcherOperation.cs @@ -105,9 +105,7 @@ public class DispatcherOperation { lock (Dispatcher.InstanceLock) { - if (Status == DispatcherOperationStatus.Pending) - return; - Dispatcher.Abort(this); + if (Status == DispatcherOperationStatus.Pending) Dispatcher.Abort(this); } } diff --git a/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs b/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs index ada0b94124..16fc46563f 100644 --- a/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs +++ b/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs @@ -184,6 +184,7 @@ namespace Avalonia.Controls.ApplicationLifetimes _cts?.Cancel(); _cts = null; _isShuttingDown = false; + Dispatcher.UIThread.BeginInvokeShutdown(DispatcherPriority.Send); } return true; diff --git a/tests/Avalonia.Controls.UnitTests/DesktopStyleApplicationLifetimeTests.cs b/tests/Avalonia.Controls.UnitTests/DesktopStyleApplicationLifetimeTests.cs index 90a0db691c..58811cd081 100644 --- a/tests/Avalonia.Controls.UnitTests/DesktopStyleApplicationLifetimeTests.cs +++ b/tests/Avalonia.Controls.UnitTests/DesktopStyleApplicationLifetimeTests.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Threading; using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Controls.Platform; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Threading; @@ -13,17 +15,22 @@ namespace Avalonia.Controls.UnitTests public class DesktopStyleApplicationLifetimeTests { - IDispatcherImpl CreateDispatcherWithInstantMainLoop() => Mock.Of(x => x.CurrentThreadIsLoopThread == true); - - + IDispatcherImpl CreateDispatcherWithInstantMainLoop() + { + var mock = new Mock(); + mock.Setup(x => x.RunLoop(It.IsAny())) + .Callback(() => Dispatcher.UIThread.ExitAllFrames()); + mock.Setup(x => x.CurrentThreadIsLoopThread).Returns(true); + return mock.Object; + } + [Fact] public void Should_Set_ExitCode_After_Shutdown() { - using (UnitTestApplication.Start(new TestServices(dispatcherImpl: CreateDispatcherWithInstantMainLoop()))) + using (UnitTestApplication.Start(new TestServices(dispatcherImpl: new ManagedDispatcherImpl(null)))) using(var lifetime = new ClassicDesktopStyleApplicationLifetime()) { - lifetime.Shutdown(1337); - + Dispatcher.UIThread.Post(() => lifetime.Shutdown(1337)); var exitCode = lifetime.Start(Array.Empty()); Assert.Equal(1337, exitCode); @@ -219,11 +226,14 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Should_Allow_Canceling_Shutdown_Via_ShutdownRequested_Event() { - using (UnitTestApplication.Start(TestServices.StyledWindow.With(dispatcherImpl: CreateDispatcherWithInstantMainLoop()))) + using (UnitTestApplication.Start(TestServices.StyledWindow.With(dispatcherImpl: new ManagedDispatcherImpl(null)))) using (var lifetime = new ClassicDesktopStyleApplicationLifetime()) { var lifetimeEvents = new Mock(); AvaloniaLocator.CurrentMutable.Bind().ToConstant(lifetimeEvents.Object); + + // Force exit immediately + Dispatcher.UIThread.Post(Dispatcher.UIThread.ExitAllFrames); lifetime.Start(Array.Empty()); var window = new Window(); @@ -356,7 +366,7 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Shutdown_NotCancellable_By_Preventing_Window_Close() { - using (UnitTestApplication.Start(TestServices.StyledWindow)) + using (UnitTestApplication.Start(TestServices.StyledWindow.With(dispatcherImpl: CreateDispatcherWithInstantMainLoop()))) using(var lifetime = new ClassicDesktopStyleApplicationLifetime()) { var hasExit = false;