ReactiveWindowTest.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System.Reactive.Disposables;
  2. using Avalonia.Threading;
  3. using Avalonia.UnitTests;
  4. using ReactiveUI;
  5. using Splat;
  6. using Xunit;
  7. namespace Avalonia.ReactiveUI.UnitTests
  8. {
  9. public class ReactiveWindowTest
  10. {
  11. public class ExampleViewModel : ReactiveObject, IActivatableViewModel
  12. {
  13. public bool IsActive { get; private set; }
  14. public ViewModelActivator Activator { get; } = new ViewModelActivator();
  15. public ExampleViewModel() => this.WhenActivated(disposables =>
  16. {
  17. IsActive = true;
  18. Disposable
  19. .Create(() => IsActive = false)
  20. .DisposeWith(disposables);
  21. });
  22. }
  23. public class ExampleWindow : ReactiveWindow<ExampleViewModel> { }
  24. public ReactiveWindowTest() =>
  25. Locator
  26. .CurrentMutable
  27. .RegisterConstant(
  28. new AvaloniaActivationForViewFetcher(),
  29. typeof(IActivationForViewFetcher));
  30. [Fact]
  31. public void Data_Context_Should_Stay_In_Sync_With_Reactive_Window_View_Model()
  32. {
  33. using (UnitTestApplication.Start(TestServices.StyledWindow))
  34. {
  35. var view = new ExampleWindow();
  36. var viewModel = new ExampleViewModel();
  37. view.Show();
  38. Assert.Null(view.ViewModel);
  39. Assert.Null(view.DataContext);
  40. view.DataContext = viewModel;
  41. Assert.Equal(viewModel, view.ViewModel);
  42. Assert.Equal(viewModel, view.DataContext);
  43. view.DataContext = null;
  44. Assert.Null(view.ViewModel);
  45. Assert.Null(view.DataContext);
  46. view.ViewModel = viewModel;
  47. Assert.Equal(viewModel, view.ViewModel);
  48. Assert.Equal(viewModel, view.DataContext);
  49. view.ViewModel = null;
  50. Assert.Null(view.ViewModel);
  51. Assert.Null(view.DataContext);
  52. }
  53. }
  54. [Fact]
  55. public void Should_Start_With_NotNull_Activated_ViewModel()
  56. {
  57. using (UnitTestApplication.Start(TestServices.StyledWindow))
  58. {
  59. var view = new ExampleWindow { ViewModel = new ExampleViewModel() };
  60. Assert.False(view.ViewModel.IsActive);
  61. view.Show();
  62. Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
  63. Assert.NotNull(view.ViewModel);
  64. Assert.NotNull(view.DataContext);
  65. Assert.True(view.ViewModel.IsActive);
  66. view.Close();
  67. Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
  68. Assert.NotNull(view.ViewModel);
  69. Assert.NotNull(view.DataContext);
  70. Assert.False(view.ViewModel.IsActive);
  71. }
  72. }
  73. [Fact]
  74. public void Should_Start_With_NotNull_Activated_DataContext()
  75. {
  76. using (UnitTestApplication.Start(TestServices.StyledWindow))
  77. {
  78. var view = new ExampleWindow { DataContext = new ExampleViewModel() };
  79. Assert.False(view.ViewModel.IsActive);
  80. view.Show();
  81. Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
  82. Assert.NotNull(view.ViewModel);
  83. Assert.NotNull(view.DataContext);
  84. Assert.True(view.ViewModel.IsActive);
  85. view.Close();
  86. Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
  87. Assert.NotNull(view.ViewModel);
  88. Assert.NotNull(view.DataContext);
  89. Assert.False(view.ViewModel.IsActive);
  90. }
  91. }
  92. }
  93. }