using JdeScoping.ConfigManager.Core.Services; namespace JdeScoping.ConfigManager.Core.Tests.Services; public class DiffServiceTests { private readonly DiffService _sut; public DiffServiceTests() { _sut = new DiffService(); } [Fact] public void GenerateDiff_WithNoChanges_ReturnsEmptyDiff() { // Arrange var original = "line1\nline2\nline3"; var modified = "line1\nline2\nline3"; // Act var result = _sut.GenerateDiff(original, modified); // Assert result.HasChanges.ShouldBeFalse(); } [Fact] public void GenerateDiff_WithChanges_ReturnsDiffLines() { // Arrange var original = "line1\nline2\nline3"; var modified = "line1\nmodified\nline3"; // Act var result = _sut.GenerateDiff(original, modified); // Assert result.HasChanges.ShouldBeTrue(); result.Lines.ShouldNotBeEmpty(); } [Fact] public void GenerateDiff_WithAddedLine_ReportsInsertion() { // Arrange var original = "line1\nline2"; var modified = "line1\nline2\nline3"; // Act var result = _sut.GenerateDiff(original, modified); // Assert result.HasChanges.ShouldBeTrue(); result.Insertions.ShouldBe(1); result.Deletions.ShouldBe(0); result.Lines.ShouldContain(l => l.Type == DiffLineType.Added && l.Text == "line3"); } [Fact] public void GenerateDiff_WithRemovedLine_ReportsDeletion() { // Arrange var original = "line1\nline2\nline3"; var modified = "line1\nline3"; // Act var result = _sut.GenerateDiff(original, modified); // Assert result.HasChanges.ShouldBeTrue(); result.Deletions.ShouldBe(1); result.Lines.ShouldContain(l => l.Type == DiffLineType.Removed && l.Text == "line2"); } [Fact] public void GenerateDiff_WithModifiedLine_ReportsAdditionAndDeletion() { // Arrange var original = "line1\noriginal\nline3"; var modified = "line1\nchanged\nline3"; // Act var result = _sut.GenerateDiff(original, modified); // Assert result.HasChanges.ShouldBeTrue(); result.Insertions.ShouldBeGreaterThan(0); result.Deletions.ShouldBeGreaterThan(0); } [Fact] public void GenerateDiff_WithEmptyOriginal_ReportsAllAsInsertions() { // Arrange var original = ""; var modified = "line1\nline2"; // Act var result = _sut.GenerateDiff(original, modified); // Assert result.HasChanges.ShouldBeTrue(); result.Insertions.ShouldBeGreaterThan(0); result.Deletions.ShouldBe(0); } [Fact] public void GenerateDiff_WithEmptyModified_ReportsAllAsDeletions() { // Arrange var original = "line1\nline2"; var modified = ""; // Act var result = _sut.GenerateDiff(original, modified); // Assert result.HasChanges.ShouldBeTrue(); result.Insertions.ShouldBe(0); result.Deletions.ShouldBeGreaterThan(0); } [Fact] public void GenerateDiff_LineNumbers_AreCorrectForUnchangedLines() { // Arrange var original = "line1\nline2\nline3"; var modified = "line1\nline2\nline3"; // Act var result = _sut.GenerateDiff(original, modified); // Assert var firstLine = result.Lines.First(); firstLine.OldLineNumber.ShouldBe(1); firstLine.NewLineNumber.ShouldBe(1); } [Fact] public void GenerateDiff_AddedLine_HasNullOldLineNumber() { // Arrange var original = "line1"; var modified = "line1\nline2"; // Act var result = _sut.GenerateDiff(original, modified); // Assert var addedLine = result.Lines.FirstOrDefault(l => l.Type == DiffLineType.Added); addedLine.ShouldNotBeNull(); addedLine.OldLineNumber.ShouldBeNull(); addedLine.NewLineNumber.ShouldNotBeNull(); } [Fact] public void GenerateDiff_RemovedLine_HasNullNewLineNumber() { // Arrange var original = "line1\nline2"; var modified = "line1"; // Act var result = _sut.GenerateDiff(original, modified); // Assert var removedLine = result.Lines.FirstOrDefault(l => l.Type == DiffLineType.Removed); removedLine.ShouldNotBeNull(); removedLine.OldLineNumber.ShouldNotBeNull(); removedLine.NewLineNumber.ShouldBeNull(); } }