using Shouldly; using Xunit; using JdeScoping.SecureStoreManager.ViewModels; namespace JdeScoping.SecureStoreManager.Tests.ViewModels; public class RelayCommandTests { [Fact] public void Execute_CallsAction() { // Arrange var wasCalled = false; var sut = new RelayCommand(() => wasCalled = true); // Act sut.Execute(null); // Assert wasCalled.ShouldBeTrue(); } [Fact] public void Execute_PassesParameterToAction() { // Arrange object? receivedParameter = null; var sut = new RelayCommand(p => receivedParameter = p); // Act sut.Execute("testParam"); // Assert receivedParameter.ShouldBe("testParam"); } [Fact] public void CanExecute_WhenNoPredicate_ReturnsTrue() { // Arrange var sut = new RelayCommand(() => { }); // Act var result = sut.CanExecute(null); // Assert result.ShouldBeTrue(); } [Fact] public void CanExecute_WhenPredicateReturnsTrue_ReturnsTrue() { // Arrange var sut = new RelayCommand(() => { }, () => true); // Act var result = sut.CanExecute(null); // Assert result.ShouldBeTrue(); } [Fact] public void CanExecute_WhenPredicateReturnsFalse_ReturnsFalse() { // Arrange var sut = new RelayCommand(() => { }, () => false); // Act var result = sut.CanExecute(null); // Assert result.ShouldBeFalse(); } [Fact] public void CanExecute_WithParameterPredicate_EvaluatesParameter() { // Arrange var sut = new RelayCommand(_ => { }, p => p is string s && s == "valid"); // Act var validResult = sut.CanExecute("valid"); var invalidResult = sut.CanExecute("invalid"); // Assert validResult.ShouldBeTrue(); invalidResult.ShouldBeFalse(); } [Fact] public void RaiseCanExecuteChanged_FiresCanExecuteChangedEvent() { // Arrange var sut = new RelayCommand(() => { }); var eventFired = false; sut.CanExecuteChanged += (s, e) => eventFired = true; // Act sut.RaiseCanExecuteChanged(); // Assert eventFired.ShouldBeTrue(); } [Fact] public void RaiseCanExecuteChanged_EventSenderIsSut() { // Arrange var sut = new RelayCommand(() => { }); object? eventSender = null; sut.CanExecuteChanged += (s, e) => eventSender = s; // Act sut.RaiseCanExecuteChanged(); // Assert eventSender.ShouldBe(sut); } [Fact] public void Constructor_WithNullExecute_ThrowsArgumentNullException() { // Arrange & Act & Assert Should.Throw(() => new RelayCommand((Action)null!)); } }