diff --git a/src/RolandK.AvaloniaExtensions.Tests/Mvvm/MvvmUserControlTests.cs b/src/RolandK.AvaloniaExtensions.Tests/Mvvm/MvvmUserControlTests.cs index da82fa1..7bfa2d9 100644 --- a/src/RolandK.AvaloniaExtensions.Tests/Mvvm/MvvmUserControlTests.cs +++ b/src/RolandK.AvaloniaExtensions.Tests/Mvvm/MvvmUserControlTests.cs @@ -10,7 +10,7 @@ namespace RolandK.AvaloniaExtensions.Tests.Mvvm; [Collection(nameof(ApplicationTestCollection))] -public class MvvmUserControlTests +public partial class MvvmUserControlTests { [Fact] public Task Attach_MvvmUserControl_to_ViewModel() @@ -172,10 +172,69 @@ public Task Attach_ViewModel_to_multiple_views_throws_InvalidOperationException( }); } + [Fact] + public Task Attach_MvvmUserControl_to_ViewModel_then_detach_and_check_events_fired() + { + return UnitTestApplication.RunInApplicationContextAsync(() => + { + // Arrange + var testMvvmControl = new MvvmUserControl(); + var testViewModel = new TestViewModel(); + + var viewModelAttachedEventCount = 0; + var viewModelDetachedEventCount = 0; + testMvvmControl.ViewModelAttached += (_, _) => viewModelAttachedEventCount++; + testMvvmControl.ViewModelDetached += (_, _) => viewModelDetachedEventCount++; + + // Act + testMvvmControl.DataContext = testViewModel; + testMvvmControl.ViewFor = typeof(TestViewModel); + var testRoot = new TestRootWindow(testMvvmControl); + testRoot.Content = new Grid(); + + // Assert + Assert.Equal(1, viewModelAttachedEventCount); + Assert.Equal(1, viewModelDetachedEventCount); + + GC.KeepAlive(testRoot); + }); + } + + [Fact] + public Task Attach_MvvmUserControl_to_ViewModel_then_check_ViewModelPropertyChanged_event() + { + return UnitTestApplication.RunInApplicationContextAsync(() => + { + // Arrange + var testMvvmControl = new MvvmUserControl(); + var testViewModel = new TestViewModel(); + + var propertyChangedEventCount = 0; + var lastPropertyChangedEventPropertyName = string.Empty; + testMvvmControl.ViewModelPropertyChanged += (_, args) => + { + propertyChangedEventCount++; + lastPropertyChangedEventPropertyName = args.PropertyName; + }; + + // Act + testMvvmControl.DataContext = testViewModel; + testMvvmControl.ViewFor = typeof(TestViewModel); + var testRoot = new TestRootWindow(testMvvmControl); + testViewModel.DummyProperty = "Some other value.."; + + // Assert + Assert.Equal(1, propertyChangedEventCount); + Assert.Equal(nameof(TestViewModel.DummyProperty), lastPropertyChangedEventPropertyName); + + GC.KeepAlive(testRoot); + }); + } + //************************************************************************* //************************************************************************* //************************************************************************* - private class TestViewModel : ObservableObject, IAttachableViewModel + private partial class TestViewModel : ObservableObject, IAttachableViewModel { /// public event EventHandler? CloseWindowRequest; @@ -186,6 +245,9 @@ private class TestViewModel : ObservableObject, IAttachableViewModel /// public object? AssociatedView { get; set; } + [ObservableProperty] + private string _dummyProperty = string.Empty; + public TViewService? TryGetViewService() where TViewService : class { diff --git a/src/RolandK.AvaloniaExtensions.Tests/Mvvm/MvvmWindowTests.cs b/src/RolandK.AvaloniaExtensions.Tests/Mvvm/MvvmWindowTests.cs index aed7a0f..7cbea91 100644 --- a/src/RolandK.AvaloniaExtensions.Tests/Mvvm/MvvmWindowTests.cs +++ b/src/RolandK.AvaloniaExtensions.Tests/Mvvm/MvvmWindowTests.cs @@ -10,7 +10,7 @@ namespace RolandK.AvaloniaExtensions.Tests.Mvvm; [Collection(nameof(ApplicationTestCollection))] -public class MvvmWindowTests +public partial class MvvmWindowTests { [Fact] public async Task Attach_MvvmWindow_to_ViewModel() @@ -234,10 +234,70 @@ public Task Attach_ViewModel_to_multiple_views_throws_InvalidOperationException( }); } + [Fact] + public Task Attach_MvvmWindow_to_ViewModel_then_detach_and_check_events_fired() + { + return UnitTestApplication.RunInApplicationContextAsync(() => + { + // Arrange + var testMvvmWindow = new MvvmWindow(); + var testViewModel = new TestViewModel(); + + var viewModelAttachedEventCount = 0; + var viewModelDetachedEventCount = 0; + testMvvmWindow.ViewModelAttached += (_, _) => viewModelAttachedEventCount++; + testMvvmWindow.ViewModelDetached += (_, _) => viewModelDetachedEventCount++; + + // Act + testMvvmWindow.DataContext = testViewModel; + testMvvmWindow.ViewFor = typeof(TestViewModel); + testMvvmWindow.Show(); + testViewModel.TriggerCloseWindowRequest(); + + // Assert + Assert.Equal(1, viewModelAttachedEventCount); + Assert.Equal(1, viewModelDetachedEventCount); + + // Cleanup + testMvvmWindow.Close(); + }); + } + + [Fact] + public Task Attach_MvvmWindow_to_ViewModel_then_check_ViewModelPropertyChanged_event() + { + return UnitTestApplication.RunInApplicationContextAsync(() => + { + // Arrange + var testMvvmWindow = new MvvmWindow(); + var testViewModel = new TestViewModel(); + + var propertyChangedEventCount = 0; + var lastPropertyChangedEventPropertyName = string.Empty; + testMvvmWindow.ViewModelPropertyChanged += (_, args) => + { + propertyChangedEventCount++; + lastPropertyChangedEventPropertyName = args.PropertyName; + }; + + // Act + testMvvmWindow.DataContext = testViewModel; + testMvvmWindow.ViewFor = typeof(TestViewModel); + testMvvmWindow.Show(); + testViewModel.DummyProperty = "Some other value.."; + + // Assert + Assert.Equal(1, propertyChangedEventCount); + Assert.Equal(nameof(TestViewModel.DummyProperty), lastPropertyChangedEventPropertyName); + + testMvvmWindow.Close(); + }); + } + //************************************************************************* //************************************************************************* //************************************************************************* - private class TestViewModel : ObservableObject, IAttachableViewModel + private partial class TestViewModel : ObservableObject, IAttachableViewModel { /// public event EventHandler? CloseWindowRequest; @@ -248,6 +308,9 @@ private class TestViewModel : ObservableObject, IAttachableViewModel /// public object? AssociatedView { get; set; } + [ObservableProperty] + private string _dummyProperty = string.Empty; + public TViewService? TryGetViewService() where TViewService : class {