AutoSuspendHelperTest.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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.Runtime.Serialization;
  11. using System.Threading;
  12. using Avalonia.Controls.ApplicationLifetimes;
  13. using Avalonia.Controls;
  14. using Avalonia.Rendering;
  15. using Avalonia.Platform;
  16. using Avalonia.UnitTests;
  17. using Avalonia.Markup.Xaml;
  18. using Avalonia.ReactiveUI;
  19. using Avalonia;
  20. using ReactiveUI;
  21. using DynamicData;
  22. using Xunit;
  23. using Splat;
  24. namespace Avalonia.ReactiveUI.UnitTests
  25. {
  26. public class AutoSuspendHelperTest
  27. {
  28. [DataContract]
  29. public class AppState
  30. {
  31. [DataMember]
  32. public string Example { get; set; }
  33. }
  34. public class ExoticApplicationLifetimeWithoutLifecycleEvents : IDisposable, IApplicationLifetime
  35. {
  36. public void Dispose() { }
  37. }
  38. [Fact]
  39. public void AutoSuspendHelper_Should_Immediately_Fire_IsLaunchingNew()
  40. {
  41. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  42. using (var lifetime = new ClassicDesktopStyleApplicationLifetime())
  43. {
  44. var isLaunchingReceived = false;
  45. var application = AvaloniaLocator.Current.GetService<Application>();
  46. application.ApplicationLifetime = lifetime;
  47. // Initialize ReactiveUI Suspension as in real-world scenario.
  48. var suspension = new AutoSuspendHelper(application.ApplicationLifetime);
  49. RxApp.SuspensionHost.IsLaunchingNew.Subscribe(_ => isLaunchingReceived = true);
  50. suspension.OnFrameworkInitializationCompleted();
  51. Assert.True(isLaunchingReceived);
  52. }
  53. }
  54. [Fact]
  55. public void AutoSuspendHelper_Should_Throw_When_Not_Supported_Lifetime_Is_Used()
  56. {
  57. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  58. using (var lifetime = new ExoticApplicationLifetimeWithoutLifecycleEvents())
  59. {
  60. var application = AvaloniaLocator.Current.GetService<Application>();
  61. application.ApplicationLifetime = lifetime;
  62. Assert.Throws<NotSupportedException>(() => new AutoSuspendHelper(application.ApplicationLifetime));
  63. }
  64. }
  65. [Fact]
  66. public void AutoSuspendHelper_Should_Throw_When_Lifetime_Is_Null()
  67. {
  68. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  69. {
  70. var application = AvaloniaLocator.Current.GetService<Application>();
  71. Assert.Throws<ArgumentNullException>(() => new AutoSuspendHelper(application.ApplicationLifetime));
  72. }
  73. }
  74. [Fact]
  75. public void ShouldPersistState_Should_Fire_On_App_Exit_When_SuspensionDriver_Is_Initialized()
  76. {
  77. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  78. using (var lifetime = new ClassicDesktopStyleApplicationLifetime())
  79. {
  80. var shouldPersistReceived = false;
  81. var application = AvaloniaLocator.Current.GetService<Application>();
  82. application.ApplicationLifetime = lifetime;
  83. // Initialize ReactiveUI Suspension as in real-world scenario.
  84. var suspension = new AutoSuspendHelper(application.ApplicationLifetime);
  85. RxApp.SuspensionHost.CreateNewAppState = () => new AppState { Example = "Foo" };
  86. RxApp.SuspensionHost.ShouldPersistState.Subscribe(_ => shouldPersistReceived = true);
  87. RxApp.SuspensionHost.SetupDefaultSuspendResume(new DummySuspensionDriver());
  88. suspension.OnFrameworkInitializationCompleted();
  89. lifetime.Shutdown();
  90. Assert.True(shouldPersistReceived);
  91. Assert.Equal("Foo", RxApp.SuspensionHost.GetAppState<AppState>().Example);
  92. }
  93. }
  94. }
  95. }