AutoSuspendHelperTest.cs 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using System.Reactive.Concurrency;
  5. using System.Reactive.Disposables;
  6. using System.ComponentModel;
  7. using System.Threading.Tasks;
  8. using System.Reactive;
  9. using System.Reactive.Subjects;
  10. using System.Reactive.Linq;
  11. using System.Collections.Generic;
  12. using System.Runtime.Serialization;
  13. using System.Threading;
  14. using Avalonia.Controls.ApplicationLifetimes;
  15. using Avalonia.Controls;
  16. using Avalonia.Rendering;
  17. using Avalonia.Platform;
  18. using Avalonia.UnitTests;
  19. using Avalonia.Markup.Xaml;
  20. using Avalonia.ReactiveUI;
  21. using Avalonia;
  22. using ReactiveUI;
  23. using DynamicData;
  24. using Xunit;
  25. using Splat;
  26. namespace Avalonia.ReactiveUI.UnitTests
  27. {
  28. public class AutoSuspendHelperTest
  29. {
  30. [DataContract]
  31. public class AppState
  32. {
  33. [DataMember]
  34. public string Example { get; set; }
  35. }
  36. public class ExoticApplicationLifetimeWithoutLifecycleEvents : IDisposable, IApplicationLifetime
  37. {
  38. public void Dispose() { }
  39. }
  40. [Fact]
  41. public void AutoSuspendHelper_Should_Immediately_Fire_IsLaunchingNew()
  42. {
  43. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  44. using (var lifetime = new ClassicDesktopStyleApplicationLifetime(Application.Current))
  45. {
  46. var isLaunchingReceived = false;
  47. var application = AvaloniaLocator.Current.GetService<Application>();
  48. application.ApplicationLifetime = lifetime;
  49. // Initialize ReactiveUI Suspension as in real-world scenario.
  50. var suspension = new AutoSuspendHelper(application.ApplicationLifetime);
  51. RxApp.SuspensionHost.IsLaunchingNew.Subscribe(_ => isLaunchingReceived = true);
  52. suspension.OnFrameworkInitializationCompleted();
  53. Assert.True(isLaunchingReceived);
  54. }
  55. }
  56. [Fact]
  57. public void ShouldPersistState_Should_Fire_On_App_Exit_When_SuspensionDriver_Is_Initialized()
  58. {
  59. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  60. using (var lifetime = new ClassicDesktopStyleApplicationLifetime(Application.Current))
  61. {
  62. var shouldPersistReceived = false;
  63. var application = AvaloniaLocator.Current.GetService<Application>();
  64. application.ApplicationLifetime = lifetime;
  65. // Initialize ReactiveUI Suspension as in real-world scenario.
  66. var suspension = new AutoSuspendHelper(application.ApplicationLifetime);
  67. RxApp.SuspensionHost.CreateNewAppState = () => new AppState { Example = "Foo" };
  68. RxApp.SuspensionHost.ShouldPersistState.Subscribe(_ => shouldPersistReceived = true);
  69. RxApp.SuspensionHost.SetupDefaultSuspendResume(new DummySuspensionDriver());
  70. suspension.OnFrameworkInitializationCompleted();
  71. lifetime.Shutdown();
  72. Assert.True(shouldPersistReceived);
  73. Assert.Equal("Foo", RxApp.SuspensionHost.GetAppState<AppState>().Example);
  74. }
  75. }
  76. [Fact]
  77. public void AutoSuspendHelper_Should_Throw_For_Not_Supported_Lifetimes()
  78. {
  79. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  80. using (var lifetime = new ExoticApplicationLifetimeWithoutLifecycleEvents())
  81. {
  82. var application = AvaloniaLocator.Current.GetService<Application>();
  83. application.ApplicationLifetime = lifetime;
  84. Assert.Throws<NotSupportedException>(() => new AutoSuspendHelper(application.ApplicationLifetime));
  85. }
  86. }
  87. }
  88. }