Skip to content
This repository was archived by the owner on Jan 24, 2025. It is now read-only.

Commit e837585

Browse files
committed
Additional empty line should make a difference
this closes #422
1 parent ea0201d commit e837585

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

core/src/main/scala/com/softwaremill/diffx/instances/DiffForString.scala

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,51 @@ class DiffForString(similarityThreshold: Double = 0.5) extends Diff[String] {
1111
val rows = generator.generateDiffRows(splitIntoLines(left), splitIntoLines(right))
1212
val lineResults = processLineDiffs(rows)
1313
if (lineResults.forall(_.isIdentical)) {
14-
IdenticalValue(left)
14+
if (left == right) {
15+
IdenticalValue(left)
16+
} else {
17+
val resultsByChar =
18+
generator.generateDiffRows[Int](left.map(c => c.toInt).toList, right.map(c => c.toInt).toList)
19+
val resultsAsString = resultsByChar.map {
20+
case DiffRow.Insert(newLine) => DiffRow.Insert(newLine.toChar.toString)
21+
case DiffRow.Delete(oldLine) => DiffRow.Delete(oldLine.toChar.toString)
22+
case DiffRow.Change(oldLine, newLine) => DiffRow.Change(oldLine.toChar.toString, newLine.toChar.toString)
23+
case DiffRow.Equal(oldLine, newLine) => DiffRow.Equal(oldLine.toChar.toString, newLine.toChar.toString)
24+
}
25+
DiffResultString(mergeIdentical(resultsAsString))
26+
}
1527
} else {
1628
DiffResultString(lineResults)
1729
}
1830
}
1931

32+
private def mergeIdentical(rows: List[DiffRow[String]]) = {
33+
rows
34+
.foldLeft(List[DiffResult](IdenticalValue(""))) { (acc, item) =>
35+
acc match {
36+
case list @ ::(IdenticalValue(head), next) =>
37+
item match {
38+
case DiffRow.Insert("\n") => DiffResultMissing("") :: list
39+
case DiffRow.Insert(newLine) => DiffResultMissing(newLine) :: list
40+
case DiffRow.Delete("\n") => DiffResultAdditional("") :: list
41+
case DiffRow.Delete(oldLine) => DiffResultAdditional(oldLine) :: list
42+
case DiffRow.Change(oldLine, newLine) => DiffResultValue(oldLine, newLine) :: list
43+
case DiffRow.Equal(oldLine, newLine) => IdenticalValue(head + oldLine) :: next
44+
}
45+
case other =>
46+
item match {
47+
case DiffRow.Insert("\n") => DiffResultMissing("") :: other
48+
case DiffRow.Insert(newLine) => DiffResultMissing(newLine) :: other
49+
case DiffRow.Delete("\n") => DiffResultAdditional("") :: other
50+
case DiffRow.Delete(oldLine) => DiffResultAdditional(oldLine) :: other
51+
case DiffRow.Change(oldLine, newLine) => DiffResultValue(oldLine, newLine) :: other
52+
case DiffRow.Equal(oldLine, newLine) => IdenticalValue(oldLine) :: other
53+
}
54+
}
55+
}
56+
.reverse
57+
}
58+
2059
private def processLineDiffs(rows: List[DiffRow[String]]) = {
2160
rows.map {
2261
case DiffRow.Insert(newLine) => DiffResultMissing(newLine)
@@ -56,8 +95,10 @@ class DiffForString(similarityThreshold: Double = 0.5) extends Diff[String] {
5695
.map(_.mkString)
5796
}
5897

59-
private def processWordDiffs(words: List[DiffRow[String]]): List[DiffResult] = {
60-
words.map {
98+
private def processWordDiffs(words: List[DiffRow[String]]): List[DiffResult] = words.map(processWordDiff)
99+
100+
private def processWordDiff(wd: DiffRow[String]) = {
101+
wd match {
61102
case DiffRow.Insert(newLine) => DiffResultMissingChunk(newLine)
62103
case DiffRow.Delete(oldLine) => DiffResultAdditionalChunk(oldLine)
63104
case DiffRow.Change("", newLine) => DiffResultMissingChunk(newLine)

core/src/test/scala/com/softwaremill/diffx/test/DiffStringTest.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.softwaremill.diffx.{
55
DiffResultAdditional,
66
DiffResultAdditionalChunk,
77
DiffResultChunk,
8+
DiffResultMissing,
89
DiffResultMissingChunk,
910
DiffResultString,
1011
DiffResultStringLine,
@@ -239,5 +240,16 @@ class DiffStringTest extends AnyFreeSpec with Matchers {
239240
List(IdenticalValue("bob"), IdenticalValue("and mark"), DiffResultAdditional("alice went to school"))
240241
)
241242
}
243+
244+
"additional empty line should make a difference" in {
245+
diffForString("hello", "hello\n") shouldBe DiffResultString(List(IdenticalValue("hello"), DiffResultMissing("")))
246+
diffForString("hello\n", "hello") shouldBe DiffResultString(
247+
List(IdenticalValue("hello"), DiffResultAdditional(""))
248+
)
249+
diffForString("\nhello", "hello") shouldBe DiffResultString(
250+
List(DiffResultAdditional(""), IdenticalValue("hello"))
251+
)
252+
diffForString("hello", "\nhello") shouldBe DiffResultString(List(DiffResultMissing(""), IdenticalValue("hello")))
253+
}
242254
}
243255
}

0 commit comments

Comments
 (0)