From 32aea583b1bf6f3b772258ed6ad12f473056625a Mon Sep 17 00:00:00 2001 From: artyom Date: Tue, 30 Jul 2019 20:08:15 +0300 Subject: [PATCH] Don't throw when in design mode --- src/Avalonia.ReactiveUI/AutoSuspendHelper.cs | 11 ++++-- .../AutoSuspendHelperTest.cs | 34 ++++++++++++------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/Avalonia.ReactiveUI/AutoSuspendHelper.cs b/src/Avalonia.ReactiveUI/AutoSuspendHelper.cs index a4f14a4138..b404ea57cb 100644 --- a/src/Avalonia.ReactiveUI/AutoSuspendHelper.cs +++ b/src/Avalonia.ReactiveUI/AutoSuspendHelper.cs @@ -35,7 +35,12 @@ namespace Avalonia.ReactiveUI RxApp.SuspensionHost.IsResuming = Observable.Never(); RxApp.SuspensionHost.IsLaunchingNew = _isLaunchingNew; - if (lifetime is IControlledApplicationLifetime controlled) + if (Avalonia.Controls.Design.IsDesignMode) + { + this.Log().Debug("Design mode detected. AutoSuspendHelper won't persist app state."); + RxApp.SuspensionHost.ShouldPersistState = Observable.Never(); + } + else if (lifetime is IControlledApplicationLifetime controlled) { this.Log().Debug("Using IControlledApplicationLifetime events to handle app exit."); controlled.Exit += (sender, args) => OnControlledApplicationLifetimeExit(); @@ -47,11 +52,11 @@ namespace Avalonia.ReactiveUI var message = $"Don't know how to detect app exit event for {type}."; throw new NotSupportedException(message); } - else + else { var message = "ApplicationLifetime is null. " + "Ensure you are initializing AutoSuspendHelper " - + "when Avalonia application initialization is completed."; + + "after Avalonia application initialization is completed."; throw new ArgumentNullException(message); } diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AutoSuspendHelperTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AutoSuspendHelperTest.cs index 876f37cc9e..56b14c3936 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AutoSuspendHelperTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AutoSuspendHelperTest.cs @@ -60,6 +60,28 @@ namespace Avalonia.ReactiveUI.UnitTests } } + [Fact] + public void AutoSuspendHelper_Should_Throw_When_Not_Supported_Lifetime_Is_Used() + { + using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) + using (var lifetime = new ExoticApplicationLifetimeWithoutLifecycleEvents()) + { + var application = AvaloniaLocator.Current.GetService(); + application.ApplicationLifetime = lifetime; + Assert.Throws(() => new AutoSuspendHelper(application.ApplicationLifetime)); + } + } + + [Fact] + public void AutoSuspendHelper_Should_Throw_When_Lifetime_Is_Null() + { + using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) + { + var application = AvaloniaLocator.Current.GetService(); + Assert.Throws(() => new AutoSuspendHelper(application.ApplicationLifetime)); + } + } + [Fact] public void ShouldPersistState_Should_Fire_On_App_Exit_When_SuspensionDriver_Is_Initialized() { @@ -82,17 +104,5 @@ namespace Avalonia.ReactiveUI.UnitTests Assert.Equal("Foo", RxApp.SuspensionHost.GetAppState().Example); } } - - [Fact] - public void AutoSuspendHelper_Should_Throw_For_Not_Supported_Lifetimes() - { - using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) - using (var lifetime = new ExoticApplicationLifetimeWithoutLifecycleEvents()) - { - var application = AvaloniaLocator.Current.GetService(); - application.ApplicationLifetime = lifetime; - Assert.Throws(() => new AutoSuspendHelper(application.ApplicationLifetime)); - } - } } } \ No newline at end of file