AutoSuspendHelperTest.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System;
  2. using System.Reactive.Concurrency;
  3. using System.Reactive.Disposables;
  4. using System.ComponentModel;
  5. using System.Threading.Tasks;
  6. using System.Reactive;
  7. using System.Reactive.Subjects;
  8. using System.Reactive.Linq;
  9. using System.Collections.Generic;
  10. using System.IO;
  11. using System.Runtime.Serialization;
  12. using System.Threading;
  13. using Avalonia.Controls.ApplicationLifetimes;
  14. using Avalonia.Controls;
  15. using Avalonia.Rendering;
  16. using Avalonia.Platform;
  17. using Avalonia.UnitTests;
  18. using Avalonia.Markup.Xaml;
  19. using Avalonia.ReactiveUI;
  20. using Avalonia;
  21. using Avalonia.Threading;
  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())
  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 AutoSuspendHelper_Should_Throw_When_Not_Supported_Lifetime_Is_Used()
  58. {
  59. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  60. using (var lifetime = new ExoticApplicationLifetimeWithoutLifecycleEvents())
  61. {
  62. var application = AvaloniaLocator.Current.GetService<Application>();
  63. application.ApplicationLifetime = lifetime;
  64. Assert.Throws<NotSupportedException>(() => new AutoSuspendHelper(application.ApplicationLifetime));
  65. }
  66. }
  67. [Fact]
  68. public void AutoSuspendHelper_Should_Throw_When_Lifetime_Is_Null()
  69. {
  70. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  71. {
  72. var application = AvaloniaLocator.Current.GetService<Application>();
  73. Assert.Throws<ArgumentNullException>(() => new AutoSuspendHelper(application.ApplicationLifetime));
  74. }
  75. }
  76. [Fact]
  77. public void ShouldPersistState_Should_Fire_On_App_Exit_When_SuspensionDriver_Is_Initialized()
  78. {
  79. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  80. using (var lifetime = new ClassicDesktopStyleApplicationLifetime())
  81. {
  82. var shouldPersistReceived = false;
  83. var application = AvaloniaLocator.Current.GetService<Application>();
  84. application.ApplicationLifetime = lifetime;
  85. // Initialize ReactiveUI Suspension as in real-world scenario.
  86. var suspension = new AutoSuspendHelper(application.ApplicationLifetime);
  87. RxApp.SuspensionHost.CreateNewAppState = () => new AppState { Example = "Foo" };
  88. RxApp.SuspensionHost.ShouldPersistState.Subscribe(_ => shouldPersistReceived = true);
  89. RxApp.SuspensionHost.SetupDefaultSuspendResume(new FakeSuspensionDriver());
  90. suspension.OnFrameworkInitializationCompleted();
  91. lifetime.Shutdown();
  92. Assert.True(shouldPersistReceived);
  93. Assert.Equal("Foo", RxApp.SuspensionHost.GetAppState<AppState>().Example);
  94. }
  95. }
  96. private class FakeSuspensionDriver : ISuspensionDriver
  97. {
  98. public IObservable<object> LoadState() => Observable.Empty<object>();
  99. public IObservable<Unit> SaveState(object state) => Observable.Empty<Unit>();
  100. public IObservable<Unit> InvalidateState() => Observable.Empty<Unit>();
  101. }
  102. }
  103. }