From e9e548e3a0b9d0fc7120beb9b677463b495493af Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Sat, 18 Jan 2025 13:58:36 -0800 Subject: [PATCH] Diff: refactor, move static methods to companion --- .../src/main/scala/munit/diff/Diff.scala | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/munit-diff/shared/src/main/scala/munit/diff/Diff.scala b/munit-diff/shared/src/main/scala/munit/diff/Diff.scala index 7656ef47..95585357 100644 --- a/munit-diff/shared/src/main/scala/munit/diff/Diff.scala +++ b/munit-diff/shared/src/main/scala/munit/diff/Diff.scala @@ -6,12 +6,14 @@ import munit.diff.console.Printers import scala.collection.JavaConverters._ class Diff(val obtained: String, val expected: String) extends Serializable { + import Diff._ + val obtainedClean: String = AnsiColors.filterAnsi(obtained) val expectedClean: String = AnsiColors.filterAnsi(expected) val obtainedLines: Seq[String] = splitIntoLines(obtainedClean) val expectedLines: Seq[String] = splitIntoLines(expectedClean) val unifiedDiff: String = createUnifiedDiff(obtainedLines, expectedLines) - def isEmpty: Boolean = unifiedDiff.isEmpty() + def isEmpty: Boolean = unifiedDiff.isEmpty def createReport( title: String, @@ -45,6 +47,10 @@ class Diff(val obtained: String, val expected: String) extends Serializable { sb.append(unifiedDiff) } +} + +object Diff { + private def asStripMargin(obtained: String): String = if (!obtained.contains("\n")) Printers.print(obtained) else { @@ -69,19 +75,19 @@ class Diff(val obtained: String, val expected: String) extends Serializable { if (diff.getDeltas.isEmpty) "" else DiffUtils .generateUnifiedDiff("obtained", "expected", original.asJava, diff, 1) - .asScala.iterator.drop(2).filterNot(_.startsWith("@@")).map(line => - if (line.isEmpty()) line - else if (line.last == ' ') line + "∙" - else line - ).map(line => - if (line.startsWith("-")) AnsiColors.c(line, AnsiColors.LightRed) - else if (line.startsWith("+")) AnsiColors - .c(line, AnsiColors.LightGreen) - else line + .asScala.iterator.drop(2).filterNot(_.startsWith("@@")) + .map(line => if (line.lastOption.contains(' ')) line + "∙" else line) + .map(line => + line.headOption match { + case Some('-') => AnsiColors.c(line, AnsiColors.LightRed) + case Some('+') => AnsiColors.c(line, AnsiColors.LightGreen) + case _ => line + } ).mkString("\n") result } private def splitIntoLines(string: String): Seq[String] = string.trim() .replace("\r\n", "\n").split("\n").toIndexedSeq + }