private void CoreMergeTest_Status(LineStatus status1, LineStatus status2, LineStatus expectedStatus) { // arraange IChangedLine changedLine1 = new ChangedLine("1", 1, 1, status1); IChangedLine changedLine2 = new ChangedLine("1", 1, 3, status2); LineStatus expected = expectedStatus; // act var result = new MergeTwoChangedAndOriginalLines(new StrComparer()).Merge( "1", changedLine1, changedLine2, "fvn", "svn").Status; //assert Assert.AreEqual(expected, result, "Статус результирующей строки"); }
public List<IChangedLine> GetChangeOriginalLines( List<String> originalText, List<String> newText) { if (originalText == null || newText == null) { throw new ArgumentNullException(); } List<SurvivedTextLine> survivedTextLines = SurvivedTextTreeCreator.GetTextLine( originalText, newText).GetThisAndNextValues().ToList(); List<IChangedLine> result = new List<IChangedLine>(); // Нулевая строка, для строк, вставленных перед первой result.Add(new ChangedLine("", null, null, LineStatus.FirstEmptyRow)); // Проходим по оригинальным строкам и ищем удаленные for (int origLineIndex = 0; origLineIndex < originalText.Count; origLineIndex++) { var origStrLine = originalText[origLineIndex]; IChangedLine col = new ChangedLine(origStrLine, origLineIndex, null, LineStatus.Removed); if (survivedTextLines.Any(line => line.OriginalLineIndex == origLineIndex)) { var changedLineIndex = survivedTextLines.Find( line => line.OriginalLineIndex == origLineIndex).ChangedLineIndex; col.Status = LineStatus.Survived; col.ChangedLineIndex = changedLineIndex; } result.Add(col); } // Проходим по новым строкам и ищем добавленные for (int newLineIndex = 0; newLineIndex < newText.Count; newLineIndex++) { if (!result.Any(line => line.ChangedLineIndex != null && line.ChangedLineIndex == newLineIndex)) { // ==>> // // Находим следующую выжившую строку после нашей новой (в новом тексте) // var nextSurviveLineIndex = result.FindIndex(line => line.ChangedLineIndex > newLineIndex); // // И вставляем в строчку перед ней новые строки // if (nextSurviveLineIndex - 1 >= 0) // { // result[nextSurviveLineIndex - 1].AddedLinesAfter.Add(newText[newLineIndex]); // } // if (nextSurviveLineIndex - 1 >= 0) // { // result[nextSurviveLineIndex - 1].AddedLinesAfter.Add(newText[newLineIndex]); // } // else // { // if (newLineIndex > result.Max(line => line.ChangedLineIndex)) // { // result.Last().AddedLinesAfter.Add(newText[newLineIndex]); // } // else // { // result[0].AddedLinesAfter.Add(newText[newLineIndex]); // } // } // Находим предыдущую строку (удаленную, нет - не важно) и вставляем в нее. var nextSurviveLineIndex = result.OrderByDescending(line => line.ChangedLineIndex) .FirstOrDefault(line => line.ChangedLineIndex < newLineIndex); // И вставляем в строчку перед ней новые строки if (nextSurviveLineIndex != null && nextSurviveLineIndex.ChangedLineIndex < newLineIndex) { nextSurviveLineIndex.AddedLinesAfter.Add(newText[newLineIndex]); } else { if (newLineIndex > result.Max(line => line.ChangedLineIndex)) { result.Last().AddedLinesAfter.Add(newText[newLineIndex]); } else { result[0].AddedLinesAfter.Add(newText[newLineIndex]); } } // <== } } return result; }
private void CoreMergeTest_IsHaveConflict(List<string> addedLinesAfter1, List<string> addedLinesAfter2, IComparer<string> comparer, bool expected) { // arraange IChangedLine changedLine1 = new ChangedLine("1", 1, 1, LineStatus.Survived) { AddedLinesAfter = addedLinesAfter1 }; IChangedLine changedLine2 = new ChangedLine("1", 1, 3, LineStatus.Survived) { AddedLinesAfter = addedLinesAfter2 }; // act var result = new MergeTwoChangedAndOriginalLines(comparer).Merge( "1", changedLine1, changedLine2, "fvn", "svn" ).IsHaveConflict; //assert Assert.AreEqual(expected, result, "Проверка конфликта в строках"); }