ReactiveUserControlTest.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using System.Reactive.Disposables;
  2. using Avalonia.Controls;
  3. using Avalonia.UnitTests;
  4. using ReactiveUI;
  5. using Splat;
  6. using Xunit;
  7. namespace Avalonia.ReactiveUI.UnitTests
  8. {
  9. public class ReactiveUserControlTest
  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 ExampleView : ReactiveUserControl<ExampleViewModel> { }
  24. public ReactiveUserControlTest() =>
  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_User_Control_View_Model()
  32. {
  33. var root = new TestRoot();
  34. var view = new ExampleView();
  35. root.Child = view;
  36. var viewModel = new ExampleViewModel();
  37. Assert.Null(view.ViewModel);
  38. view.DataContext = viewModel;
  39. Assert.Equal(view.ViewModel, viewModel);
  40. Assert.Equal(view.DataContext, viewModel);
  41. view.DataContext = null;
  42. Assert.Null(view.ViewModel);
  43. Assert.Null(view.DataContext);
  44. view.ViewModel = viewModel;
  45. Assert.Equal(viewModel, view.ViewModel);
  46. Assert.Equal(viewModel, view.DataContext);
  47. view.ViewModel = null;
  48. Assert.Null(view.ViewModel);
  49. Assert.Null(view.DataContext);
  50. }
  51. [Fact]
  52. public void Should_Start_With_NotNull_Activated_ViewModel()
  53. {
  54. var root = new TestRoot();
  55. var view = new ExampleView {ViewModel = new ExampleViewModel()};
  56. Assert.False(view.ViewModel.IsActive);
  57. root.Child = view;
  58. Assert.NotNull(view.ViewModel);
  59. Assert.NotNull(view.DataContext);
  60. Assert.True(view.ViewModel.IsActive);
  61. root.Child = null;
  62. Assert.NotNull(view.ViewModel);
  63. Assert.NotNull(view.DataContext);
  64. Assert.False(view.ViewModel.IsActive);
  65. }
  66. [Fact]
  67. public void Should_Start_With_NotNull_Activated_DataContext()
  68. {
  69. var root = new TestRoot();
  70. var view = new ExampleView {DataContext = new ExampleViewModel()};
  71. Assert.False(view.ViewModel.IsActive);
  72. root.Child = view;
  73. Assert.NotNull(view.ViewModel);
  74. Assert.NotNull(view.DataContext);
  75. Assert.True(view.ViewModel.IsActive);
  76. root.Child = null;
  77. Assert.NotNull(view.ViewModel);
  78. Assert.NotNull(view.DataContext);
  79. Assert.False(view.ViewModel.IsActive);
  80. }
  81. [Fact]
  82. public void Should_Inherit_DataContext()
  83. {
  84. var vm1 = new ExampleViewModel();
  85. var vm2 = new ExampleViewModel();
  86. var view = new ExampleView();
  87. var root = new TestRoot(view);
  88. Assert.Null(view.DataContext);
  89. Assert.Null(view.ViewModel);
  90. root.DataContext = vm1;
  91. Assert.Same(vm1, view.DataContext);
  92. Assert.Same(vm1, view.ViewModel);
  93. root.DataContext = null;
  94. Assert.Null(view.DataContext);
  95. Assert.Null(view.ViewModel);
  96. root.DataContext = vm2;
  97. Assert.Same(vm2, view.DataContext);
  98. Assert.Same(vm2, view.ViewModel);
  99. }
  100. [Fact]
  101. public void Should_Not_Overlap_Change_Notifications()
  102. {
  103. var vm1 = new ExampleViewModel();
  104. var vm2 = new ExampleViewModel();
  105. var view1 = new ExampleView();
  106. var view2 = new ExampleView();
  107. Assert.Null(view1.DataContext);
  108. Assert.Null(view2.DataContext);
  109. Assert.Null(view1.ViewModel);
  110. Assert.Null(view2.ViewModel);
  111. view1.DataContext = vm1;
  112. Assert.Same(vm1, view1.DataContext);
  113. Assert.Same(vm1, view1.ViewModel);
  114. Assert.Null(view2.DataContext);
  115. Assert.Null(view2.ViewModel);
  116. view2.DataContext = vm2;
  117. Assert.Same(vm1, view1.DataContext);
  118. Assert.Same(vm1, view1.ViewModel);
  119. Assert.Same(vm2, view2.DataContext);
  120. Assert.Same(vm2, view2.ViewModel);
  121. view1.ViewModel = null;
  122. Assert.Null(view1.DataContext);
  123. Assert.Null(view1.ViewModel);
  124. Assert.Same(vm2, view2.DataContext);
  125. Assert.Same(vm2, view2.ViewModel);
  126. view2.ViewModel = null;
  127. Assert.Null(view1.DataContext);
  128. Assert.Null(view2.DataContext);
  129. Assert.Null(view1.ViewModel);
  130. Assert.Null(view2.ViewModel);
  131. }
  132. }
  133. }