using Shouldly; using Xunit; using JdeScoping.SecureStoreManager.ViewModels; namespace JdeScoping.SecureStoreManager.Tests.ViewModels; public class ViewModelBaseTests { /// /// Test implementation of ViewModelBase for testing purposes. /// private class TestViewModel : ViewModelBase { private string _testProperty = string.Empty; private int _testIntProperty; public string TestProperty { get => _testProperty; set => SetProperty(ref _testProperty, value); } public int TestIntProperty { get => _testIntProperty; set => SetProperty(ref _testIntProperty, value); } public void RaisePropertyChangedForTest(string propertyName) { OnPropertyChanged(propertyName); } } [Fact] public void SetProperty_WhenValueUnchanged_ReturnsFalse() { // Arrange var sut = new TestViewModel(); sut.TestProperty = "initialValue"; // Act sut.TestProperty = "initialValue"; // Same value // Assert - SetProperty should have returned false, but we can verify by checking no event was raised // We test this indirectly through the property changed event not firing } [Fact] public void SetProperty_WhenValueUnchanged_DoesNotRaisePropertyChanged() { // Arrange var sut = new TestViewModel(); sut.TestProperty = "initialValue"; var eventRaised = false; sut.PropertyChanged += (s, e) => eventRaised = true; // Act sut.TestProperty = "initialValue"; // Same value // Assert eventRaised.ShouldBeFalse(); } [Fact] public void SetProperty_WhenValueChanged_ReturnsTrue() { // Arrange var sut = new TestViewModel(); // Act sut.TestProperty = "newValue"; // Assert - SetProperty returned true (verified by property change being made) sut.TestProperty.ShouldBe("newValue"); } [Fact] public void SetProperty_WhenValueChanged_RaisesPropertyChanged() { // Arrange var sut = new TestViewModel(); var eventRaised = false; sut.PropertyChanged += (s, e) => eventRaised = true; // Act sut.TestProperty = "newValue"; // Assert eventRaised.ShouldBeTrue(); } [Fact] public void SetProperty_RaisesEventWithCorrectPropertyName() { // Arrange var sut = new TestViewModel(); string? raisedPropertyName = null; sut.PropertyChanged += (s, e) => raisedPropertyName = e.PropertyName; // Act sut.TestProperty = "newValue"; // Assert raisedPropertyName.ShouldBe(nameof(TestViewModel.TestProperty)); } [Fact] public void SetProperty_RaisesEventWithSenderAsThis() { // Arrange var sut = new TestViewModel(); object? eventSender = null; sut.PropertyChanged += (s, e) => eventSender = s; // Act sut.TestProperty = "newValue"; // Assert eventSender.ShouldBe(sut); } [Fact] public void OnPropertyChanged_RaisesPropertyChangedEvent() { // Arrange var sut = new TestViewModel(); var eventRaised = false; sut.PropertyChanged += (s, e) => eventRaised = true; // Act sut.RaisePropertyChangedForTest("SomeProperty"); // Assert eventRaised.ShouldBeTrue(); } [Fact] public void OnPropertyChanged_RaisesEventWithCorrectPropertyName() { // Arrange var sut = new TestViewModel(); string? raisedPropertyName = null; sut.PropertyChanged += (s, e) => raisedPropertyName = e.PropertyName; // Act sut.RaisePropertyChangedForTest("CustomProperty"); // Assert raisedPropertyName.ShouldBe("CustomProperty"); } [Fact] public void SetProperty_WithValueType_WorksCorrectly() { // Arrange var sut = new TestViewModel(); var eventRaised = false; sut.PropertyChanged += (s, e) => eventRaised = true; // Act sut.TestIntProperty = 42; // Assert sut.TestIntProperty.ShouldBe(42); eventRaised.ShouldBeTrue(); } [Fact] public void SetProperty_WithSameValueType_DoesNotRaiseEvent() { // Arrange var sut = new TestViewModel(); sut.TestIntProperty = 42; var eventRaised = false; sut.PropertyChanged += (s, e) => eventRaised = true; // Act sut.TestIntProperty = 42; // Same value // Assert eventRaised.ShouldBeFalse(); } }