using JdeScoping.ConfigManager.Services; using JdeScoping.ConfigManager.ViewModels.Dialogs; namespace JdeScoping.ConfigManager.Tests.ViewModels.Dialogs; public class DiffPreviewDialogViewModelTests { [Fact] public void Constructor_WithEmptyDiff_InitializesCorrectly() { // Arrange var diff = new DiffResult { HasChanges = false, Lines = [], Insertions = 0, Deletions = 0 }; // Act var sut = new DiffPreviewDialogViewModel(diff); // Assert sut.Lines.Count.ShouldBe(0); sut.HasChanges.ShouldBeFalse(); sut.Insertions.ShouldBe(0); sut.Deletions.ShouldBe(0); sut.Result.ShouldBeFalse(); } [Fact] public void Constructor_WithChanges_PopulatesLines() { // Arrange var diff = new DiffResult { HasChanges = true, Lines = [ new DiffLine { OldLineNumber = 1, NewLineNumber = 1, Text = "unchanged line", Type = DiffLineType.Unchanged }, new DiffLine { OldLineNumber = 2, NewLineNumber = null, Text = "removed line", Type = DiffLineType.Removed }, new DiffLine { OldLineNumber = null, NewLineNumber = 2, Text = "added line", Type = DiffLineType.Added } ], Insertions = 1, Deletions = 1 }; // Act var sut = new DiffPreviewDialogViewModel(diff); // Assert sut.Lines.Count.ShouldBe(3); sut.HasChanges.ShouldBeTrue(); sut.Insertions.ShouldBe(1); sut.Deletions.ShouldBe(1); } [Fact] public void SaveCommand_SetsResultTrue_AndInvokesRequestClose() { // Arrange var diff = CreateEmptyDiff(); var sut = new DiffPreviewDialogViewModel(diff); var closeInvoked = false; sut.RequestClose = () => closeInvoked = true; // Act sut.SaveCommand.Execute(null); // Assert sut.Result.ShouldBeTrue(); closeInvoked.ShouldBeTrue(); } [Fact] public void CancelCommand_SetsResultFalse_AndInvokesRequestClose() { // Arrange var diff = CreateEmptyDiff(); var sut = new DiffPreviewDialogViewModel(diff); var closeInvoked = false; sut.RequestClose = () => closeInvoked = true; // Act sut.CancelCommand.Execute(null); // Assert sut.Result.ShouldBeFalse(); closeInvoked.ShouldBeTrue(); } [Fact] public void SaveCommand_DoesNotThrow_WhenRequestCloseIsNull() { // Arrange var diff = CreateEmptyDiff(); var sut = new DiffPreviewDialogViewModel(diff); sut.RequestClose = null; // Act & Assert - Should not throw Should.NotThrow(() => sut.SaveCommand.Execute(null)); sut.Result.ShouldBeTrue(); } [Fact] public void CancelCommand_DoesNotThrow_WhenRequestCloseIsNull() { // Arrange var diff = CreateEmptyDiff(); var sut = new DiffPreviewDialogViewModel(diff); sut.RequestClose = null; // Act & Assert - Should not throw Should.NotThrow(() => sut.CancelCommand.Execute(null)); sut.Result.ShouldBeFalse(); } [Fact] public void Constructor_ThrowsOnNullDiff() { // Act & Assert Should.Throw(() => new DiffPreviewDialogViewModel(null!)); } [Fact] public void Result_InitialValue_IsFalse() { // Arrange var diff = CreateEmptyDiff(); // Act var sut = new DiffPreviewDialogViewModel(diff); // Assert sut.Result.ShouldBeFalse(); } private static DiffResult CreateEmptyDiff() { return new DiffResult { HasChanges = false, Lines = [], Insertions = 0, Deletions = 0 }; } } public class DiffLineViewModelTests { [Fact] public void Constructor_UnchangedLine_SetsPropertiesCorrectly() { // Arrange var line = new DiffLine { OldLineNumber = 5, NewLineNumber = 5, Text = "unchanged content", Type = DiffLineType.Unchanged }; // Act var sut = new DiffLineViewModel(line); // Assert sut.OldLineNumber.ShouldBe("5"); sut.NewLineNumber.ShouldBe("5"); sut.Text.ShouldBe("unchanged content"); sut.Type.ShouldBe(DiffLineType.Unchanged); sut.Background.ShouldBe("Transparent"); sut.BorderColor.ShouldBe("Transparent"); } [Fact] public void Constructor_AddedLine_SetsGreenStyling() { // Arrange var line = new DiffLine { OldLineNumber = null, NewLineNumber = 10, Text = "new line", Type = DiffLineType.Added }; // Act var sut = new DiffLineViewModel(line); // Assert sut.OldLineNumber.ShouldBe(""); sut.NewLineNumber.ShouldBe("10"); sut.Type.ShouldBe(DiffLineType.Added); sut.Background.ShouldBe("#1A3DD68C"); sut.BorderColor.ShouldBe("#3DD68C"); } [Fact] public void Constructor_RemovedLine_SetsRedStyling() { // Arrange var line = new DiffLine { OldLineNumber = 7, NewLineNumber = null, Text = "deleted line", Type = DiffLineType.Removed }; // Act var sut = new DiffLineViewModel(line); // Assert sut.OldLineNumber.ShouldBe("7"); sut.NewLineNumber.ShouldBe(""); sut.Type.ShouldBe(DiffLineType.Removed); sut.Background.ShouldBe("#1AFF6B6B"); sut.BorderColor.ShouldBe("#FF6B6B"); } [Fact] public void Constructor_NullLineNumbers_ReturnsEmptyStrings() { // Arrange var line = new DiffLine { OldLineNumber = null, NewLineNumber = null, Text = "text", Type = DiffLineType.Unchanged }; // Act var sut = new DiffLineViewModel(line); // Assert sut.OldLineNumber.ShouldBe(""); sut.NewLineNumber.ShouldBe(""); } }