diff --git a/build.sbt b/build.sbt index 219742b6..ff8d7715 100644 --- a/build.sbt +++ b/build.sbt @@ -168,12 +168,17 @@ lazy val cats = crossProject(JVMPlatform, JSPlatform, NativePlatform) .dependsOn(framework, coreCats) .settings( name := "weaver-cats", - testFrameworks := Seq(new TestFramework("weaver.framework.CatsEffect")) + testFrameworks := Seq(new TestFramework("weaver.framework.CatsEffect")), + // Ensure that the source locations in failure messages are identical on CI + // as when running locally. See `weaver.internals.SourceLocationUrl`. + Test / envVars := Map("WEAVER_SOURCE_URL" -> "") ) lazy val catsJVM = cats.jvm .settings( libraryDependencies += - "com.siriusxm" %% "snapshot4s-core" % Version.snapshot4s % Test + "com.siriusxm" %% "snapshot4s-core" % Version.snapshot4s % Test, + // Required for seting the WEAVER_SOURCE_URL environment variable. + Test / fork := true ) .enablePlugins(Snapshot4sPlugin) diff --git a/docs/features/troubleshooting_failures.md b/docs/features/troubleshooting_failures.md index 1e99c4b2..701c7387 100644 --- a/docs/features/troubleshooting_failures.md +++ b/docs/features/troubleshooting_failures.md @@ -193,6 +193,16 @@ object SourceLocationSuite extends FunSuite { println(weaver.docs.Output.runSuites(SourceLocationSuite)) ``` +## Displaying source locations in CI test runs + +Source locations in CI runs are displayed as urls. If you use GitHub Actions, the source code URL is determined automatically. + +You can display urls in other CI providers using the `WEAVER_SOURCE_URL` environment variable. + +```sh +export WEAVER_SOURCE_URL=https://gitlab.com/my-org/my-repo/-/tree/my-branch/ +``` + ## Displaying a trace If you have a test codebase with many nested helper functions, you may want to display a trace of source locations. You can do this with the `traced(here)` function. diff --git a/modules/core/js/src/main/scala/weaver/internals/Env.scala b/modules/core/js/src/main/scala/weaver/internals/Env.scala new file mode 100644 index 00000000..5a05de7c --- /dev/null +++ b/modules/core/js/src/main/scala/weaver/internals/Env.scala @@ -0,0 +1,16 @@ +package weaver.internals + +import scala.scalajs.js +import scala.util.Try + +private[weaver] object Env { + def get(name: String): Option[String] = processEnv.get(name).collect { + case value: String => value + } + + // Attempt to read NodeJS environment variables + private def processEnv: js.Dictionary[Any] = + Try(js.Dynamic.global.process.env.asInstanceOf[js.Dictionary[Any]]) + .getOrElse(js.Dictionary.empty) + +} diff --git a/modules/core/jvm-native/src/main/scala/weaver/internals/Env.scala b/modules/core/jvm-native/src/main/scala/weaver/internals/Env.scala new file mode 100644 index 00000000..e1236f16 --- /dev/null +++ b/modules/core/jvm-native/src/main/scala/weaver/internals/Env.scala @@ -0,0 +1,5 @@ +package weaver.internals + +private[weaver] object Env { + def get(key: String): Option[String] = sys.env.get(key) +} diff --git a/modules/core/shared/src/main/scala/weaver/Result.scala b/modules/core/shared/src/main/scala/weaver/Result.scala index 49532efe..8698e110 100644 --- a/modules/core/shared/src/main/scala/weaver/Result.scala +++ b/modules/core/shared/src/main/scala/weaver/Result.scala @@ -2,6 +2,7 @@ package weaver import cats.data.NonEmptyList import cats.data.Validated.{ Invalid, Valid } +import weaver.internals.SourceLocationUrl private[weaver] sealed trait Result { def formatted: Option[String] @@ -172,7 +173,7 @@ private[weaver] object Result { if (index == 0) color + linePrefix + line + location - .map(l => s" (${l.fileRelativePath}:${l.line})") + .map(l => s" (${formatLocationPath(l)})") .mkString("\n") else color + linePrefix + line @@ -183,12 +184,24 @@ private[weaver] object Result { private def locationFooter(locations: List[SourceLocation]): List[String] = { val lines = locations.flatMap { l => - val prefix = s"${l.fileRelativePath}:${l.line}" l.sourceCode.fold(List.empty[String]) { sourceCode => val pointer = " " * (sourceCode.column - 1) + "^" - List(prefix, sourceCode.sourceLine, pointer) + List(formatLocationPath(l), + sourceCode.sourceLine, + pointer) } } if (lines.nonEmpty) "" :: lines else Nil } + + private def formatLocationPath(l: SourceLocation): String = + SourceLocationUrl() match { + case Some(url) => + // Display a URL to a source location on a CI host. Line numbers are typically referenced with #L anchors. + s"${url}${l.fileRelativePath}#L${l.line}" + case None => + // Display a path to a local file. + s"${l.fileRelativePath}:${l.line}" + } + } diff --git a/modules/core/shared/src/main/scala/weaver/internals/SourceLocationUrl.scala b/modules/core/shared/src/main/scala/weaver/internals/SourceLocationUrl.scala new file mode 100644 index 00000000..64d70cf0 --- /dev/null +++ b/modules/core/shared/src/main/scala/weaver/internals/SourceLocationUrl.scala @@ -0,0 +1,26 @@ +package weaver.internals + +import cats.syntax.all._ + +/** + * Constructs base URL to use for displaying source locations in failure + * messages. + */ +private[weaver] object SourceLocationUrl { + + def apply(): Option[String] = { + // Users can support non-GitHub CIs by setting WEAVER_SOURCE_URL + def readWeaverUrl(): Option[String] = Env.get("WEAVER_SOURCE_URL") + // If tests are run on GitHub Actions, construct a URL to the test source code. + // See https://docs.github.com/en/actions/reference/workflows-and-actions/variables#default-environment-variables + def readGitHubUrl(): Option[String] = ( + Env.get("GITHUB_SERVER_URL"), + Env.get("GITHUB_REPOSITORY"), + Env.get("GITHUB_SHA") + ).mapN { case (serverUrl, repo, sha) => + s"$serverUrl/$repo/tree/$sha/" + } + + readWeaverUrl().orElse(readGitHubUrl()) + } +} diff --git a/modules/framework-cats/js-native/src/test/scala/Snapshot4sStubs.scala b/modules/framework-cats/js-native/src/test/scala/Snapshot4sStubs.scala index 0429005e..3e53098d 100644 --- a/modules/framework-cats/js-native/src/test/scala/Snapshot4sStubs.scala +++ b/modules/framework-cats/js-native/src/test/scala/Snapshot4sStubs.scala @@ -24,5 +24,5 @@ object SnapshotExpectations { implicit @unused config: snapshot4s.SnapshotConfig, comparison: Comparison[A] ): IO[Expectations] = - IO(Expectations.Helpers.expect.eql(found, snapshot)) + IO(Expectations.Helpers.expect.eql(snapshot, found)) } diff --git a/modules/framework-cats/jvm/src/test/scala/junit/JUnitRunnerTests.scala b/modules/framework-cats/jvm/src/test/scala/junit/JUnitRunnerTests.scala index 640ff0ad..20cb03d0 100644 --- a/modules/framework-cats/jvm/src/test/scala/junit/JUnitRunnerTests.scala +++ b/modules/framework-cats/jvm/src/test/scala/junit/JUnitRunnerTests.scala @@ -60,9 +60,9 @@ object JUnitRunnerTests extends SimpleIOSuite { "modules/framework-cats/jvm/src/test/scala/junit/Meta.scala" val message = s"""- $name 0ms - | 'Only' tag is not allowed when `isCI=true` ($srcPath:$lineNumber) + | 'Only' tag is not allowed when `isCI=true` ($srcPath#L$lineNumber) | - | $srcPath:$lineNumber + | $srcPath#L$lineNumber |${sourceCode.trim.stripMargin} | |""".stripMargin @@ -169,9 +169,9 @@ object JUnitRunnerTests extends SimpleIOSuite { """ val message = s"""- $name 0ms - | 'Only' tag is not allowed when `isCI=true` ($srcPath:$lineNumber) + | 'Only' tag is not allowed when `isCI=true` ($srcPath#L$lineNumber) | - | $srcPath:$lineNumber + | $srcPath#L$lineNumber |${sourceCode.trim.stripMargin} | |""".stripMargin diff --git a/modules/framework-cats/shared/src/test/scala/DogFoodTests.scala b/modules/framework-cats/shared/src/test/scala/DogFoodTests.scala index d488856a..b0b08eb8 100644 --- a/modules/framework-cats/shared/src/test/scala/DogFoodTests.scala +++ b/modules/framework-cats/shared/src/test/scala/DogFoodTests.scala @@ -68,15 +68,15 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(failure)") assertInlineSnapshot( actual, - """- (failure) 0ms - expected (src/main/DogFoodTests.scala:5) - - [INFO] 12:54:35 [DogFoodTests.scala:5] this test - [ERROR] 12:54:35 [DogFoodTests.scala:5] has failed - [DEBUG] 12:54:35 [DogFoodTests.scala:5] with context - a -> b - token -> - request -> true""" + s"""- (failure) 0ms + | expected (src/main/DogFoodTests.scala#L5) + | + | [INFO] 12:54:35 [DogFoodTests.scala:5] this test + | [ERROR] 12:54:35 [DogFoodTests.scala:5] has failed + | [DEBUG] 12:54:35 [DogFoodTests.scala:5] with context + | a -> b + | token -> + | request -> true""".stripMargin ) } } @@ -87,17 +87,17 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(multiple-failures)") assertInlineSnapshot( actual, - """- (multiple-failures) 0ms - [0] expected (src/main/DogFoodTests.scala:5) - - [1] another (src/main/DogFoodTests.scala:5) - - [INFO] 12:54:35 [DogFoodTests.scala:5] this test - [ERROR] 12:54:35 [DogFoodTests.scala:5] has failed - [DEBUG] 12:54:35 [DogFoodTests.scala:5] with context - a -> b - token -> - request -> true""" + s"""- (multiple-failures) 0ms + | [0] expected (src/main/DogFoodTests.scala#L5) + | + | [1] another (src/main/DogFoodTests.scala#L5) + | + | [INFO] 12:54:35 [DogFoodTests.scala:5] this test + | [ERROR] 12:54:35 [DogFoodTests.scala:5] has failed + | [DEBUG] 12:54:35 [DogFoodTests.scala:5] with context + | a -> b + | token -> + | request -> true""".stripMargin ) } } @@ -164,7 +164,7 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (failure) 0ms - expected (src/main/DogFoodTests.scala:5) + expected (src/main/DogFoodTests.scala#L5) [ERROR] 12:54:35 [DogFoodTests.scala:5] error weaver.framework.test.Meta$CustomException: surfaced error @@ -185,17 +185,17 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, - """- lots 0ms - of - multiline - (failure) - assertion failed (src/main/DogFoodTests.scala:5) - - expect(clue(x) == y) - - Clues { - x: Int = 1 - }""" + s"""- lots 0ms + | of + | multiline + | (failure) + | assertion failed (src/main/DogFoodTests.scala#L5) + | + | expect(clue(x) == y) + | + | Clues { + | x: Int = 1 + | }""".stripMargin ) } } @@ -223,12 +223,14 @@ object DogFoodTests extends IOSuite { extractLogEventBeforeFailures(logs) { case LoggedEvent.Info(msg) if msg.contains("(ignored)") => msg }.get - assertInlineSnapshot(actual, - """- lots 0ms - of - multiline - (ignored) !!! IGNORED !!! - Ignore me (src/main/DogFoodTests.scala:5)""") + assertInlineSnapshot( + actual, + s"""- lots 0ms + | of + | multiline + | (ignored) !!! IGNORED !!! + | Ignore me (src/main/DogFoodTests.scala#L5)""".stripMargin + ) } } @@ -239,14 +241,14 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(eql Comparison)") assertInlineSnapshot( actual, - """- (eql Comparison) 0ms - Values not equal: (src/main/DogFoodTests.scala:5) - - in expect.eql(- expected, + found) - s: foo - - i: 1 - + i: 2 - }""" + s"""- (eql Comparison) 0ms + | Values not equal: (src/main/DogFoodTests.scala#L5) + | + | in expect.eql(- expected, + found) + | s: foo + | - i: 1 + | + i: 2 + | }""".stripMargin ) } } @@ -258,14 +260,14 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(same Comparison)") assertInlineSnapshot( actual, - """- (same Comparison) 0ms - Values not equal: (src/main/DogFoodTests.scala:5) - - in expect.same(- expected, + found) - s: foo - - i: 1 - + i: 2 - }""" + s"""- (same Comparison) 0ms + | Values not equal: (src/main/DogFoodTests.scala#L5) + | + | in expect.same(- expected, + found) + | s: foo + | - i: 1 + | + i: 2 + | }""".stripMargin ) } } @@ -277,7 +279,7 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (eql Show) 0ms - Values not equal: (src/main/DogFoodTests.scala:5) + Values not equal: (src/main/DogFoodTests.scala#L5) in expect.eql(expected, found) Values have the same string representation. Consider modifying their Show instance. @@ -294,7 +296,7 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (interpolator) 0ms - assertion failed (src/main/DogFoodTests.scala:5) + assertion failed (src/main/DogFoodTests.scala#L5) expect(s"$x" == "2") @@ -311,13 +313,13 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, s"""- (failFast) 0ms - | [0] Values not equal: (src/main/DogFoodTests.scala:5) + | [0] Values not equal: (src/main/DogFoodTests.scala#L5) | [0] | [0] in expect.eql(- expected, + found) | [0] -1 | [0] +2 | - | [1] Values not equal: (src/main/DogFoodTests.scala:5) + | [1] Values not equal: (src/main/DogFoodTests.scala#L5) | [1] | [1] in expect.eql(- expected, + found) | [1] -3 @@ -343,15 +345,15 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(failure)") assertInlineSnapshot( actual, - """- (failure) 0ms - assertion failed (src/main/DogFoodTests.scala:5) - - expect(clue(x) == clue(y)) - - Clues { - x: Int = 1 - y: Int = 2 - }""" + s"""- (failure) 0ms + | assertion failed (src/main/DogFoodTests.scala#L5) + | + | expect(clue(x) == clue(y)) + | + | Clues { + | x: Int = 1 + | y: Int = 2 + | }""".stripMargin ) } } @@ -362,16 +364,16 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(nested)") assertInlineSnapshot( actual, - """- (nested) 0ms - assertion failed (src/main/DogFoodTests.scala:5) - - expect(clue(List(clue(x), clue(y))) == List(x, x)) - - Clues { - x: Int = 1 - y: Int = 2 - List(clue(x), clue(y)): List[Int] = List(1, 2) - }""" + s"""- (nested) 0ms + | assertion failed (src/main/DogFoodTests.scala#L5) + | + | expect(clue(List(clue(x), clue(y))) == List(x, x)) + | + | Clues { + | x: Int = 1 + | y: Int = 2 + | List(clue(x), clue(y)): List[Int] = List(1, 2) + | }""".stripMargin ) } } @@ -383,15 +385,15 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, - """- (map) 0ms - assertion failed (src/main/DogFoodTests.scala:5) - - expect(List(x, y).map(v => clue(v)) == List(x, x)) - - Clues { - v: Int = 1 - v: Int = 2 - }""" + s"""- (map) 0ms + | assertion failed (src/main/DogFoodTests.scala#L5) + | + | expect(List(x, y).map(v => clue(v)) == List(x, x)) + | + | Clues { + | v: Int = 1 + | v: Int = 2 + | }""".stripMargin ) } } @@ -401,24 +403,24 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(all)") assertInlineSnapshot( actual, - """- (all) 0ms - [0] assertion failed (src/main/DogFoodTests.scala:5) - [0] - [0] clue(x) == clue(y) - [0] - [0] Clues { - [0] x: Int = 1 - [0] y: Int = 2 - [0] } - - [1] assertion failed (src/main/DogFoodTests.scala:5) - [1] - [1] clue(y) == clue(z) - [1] - [1] Clues { - [1] y: Int = 2 - [1] z: Int = 3 - [1] }""" + s"""- (all) 0ms + | [0] assertion failed (src/main/DogFoodTests.scala#L5) + | [0] + | [0] clue(x) == clue(y) + | [0] + | [0] Clues { + | [0] x: Int = 1 + | [0] y: Int = 2 + | [0] } + | + | [1] assertion failed (src/main/DogFoodTests.scala#L5) + | [1] + | [1] clue(y) == clue(z) + | [1] + | [1] Clues { + | [1] y: Int = 2 + | [1] z: Int = 3 + | [1] }""".stripMargin ) } } @@ -429,15 +431,15 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(show)") assertInlineSnapshot( actual, - """- (show) 0ms - assertion failed (src/main/DogFoodTests.scala:5) - - expect(clue(x) == clue(y)) - - Clues { - x: Int = int-1 - y: Int = int-2 - }""" + s"""- (show) 0ms + | assertion failed (src/main/DogFoodTests.scala#L5) + | + | expect(clue(x) == clue(y)) + | + | Clues { + | x: Int = int-1 + | y: Int = int-2 + | }""".stripMargin ) } } @@ -448,15 +450,15 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(show-from-to-string)") assertInlineSnapshot( actual, - """- (show-from-to-string) 0ms - assertion failed (src/main/DogFoodTests.scala:5) - - expect(clue(x) == clue(y)) - - Clues { - x: Foo = foo-1 - y: Foo = foo-2 - }""" + s"""- (show-from-to-string) 0ms + | assertion failed (src/main/DogFoodTests.scala#L5) + | + | expect(clue(x) == clue(y)) + | + | Clues { + | x: Foo = foo-1 + | y: Foo = foo-2 + | }""".stripMargin ) } } @@ -466,16 +468,16 @@ object DogFoodTests extends IOSuite { val actual = extractFailureMessageForTest(logs, "(helpers)") assertInlineSnapshot( actual, - """- (helpers) 0ms - assertion failed (src/main/DogFoodTests.scala:5) - - expect(CustomHelpers.clue(x) == otherclue(y) || x == clue(z)) - - Clues { - x: Int = 1 - y: Int = 2 - z: Int = 3 - }""" + s"""- (helpers) 0ms + | assertion failed (src/main/DogFoodTests.scala#L5) + | + | expect(CustomHelpers.clue(x) == otherclue(y) || x == clue(z)) + | + | Clues { + | x: Int = 1 + | y: Int = 2 + | z: Int = 3 + | }""".stripMargin ) } } @@ -488,13 +490,13 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (expect-same) 0ms - Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala:22) + Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala#L22) in expect.same(- expected, + found) -1 +2 - modules/framework-cats/shared/src/test/scala/Meta.scala:22 + modules/framework-cats/shared/src/test/scala/Meta.scala#L22 expect.same(x, y) ^""" ) @@ -502,13 +504,13 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (expect-same) 0ms - Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala:22) + Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala#L22) in expect.same(- expected, + found) -1 +2 - modules/framework-cats/shared/src/test/scala/Meta.scala:22 + modules/framework-cats/shared/src/test/scala/Meta.scala#L22 expect.same(x, y) ^""" ) @@ -523,23 +525,23 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (multiple) 0ms - [0] Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala:29) + [0] Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala#L29) [0] [0] in expect.same(- expected, + found) [0] -1 [0] +2 [0] - [0] modules/framework-cats/shared/src/test/scala/Meta.scala:29 + [0] modules/framework-cats/shared/src/test/scala/Meta.scala#L29 [0] expect.same(x, y) && expect.same(y, z) [0] ^ - [1] Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala:29) + [1] Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala#L29) [1] [1] in expect.same(- expected, + found) [1] -2 [1] +3 [1] - [1] modules/framework-cats/shared/src/test/scala/Meta.scala:29 + [1] modules/framework-cats/shared/src/test/scala/Meta.scala#L29 [1] expect.same(x, y) && expect.same(y, z) [1] ^""" ) @@ -547,23 +549,23 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (multiple) 0ms - [0] Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala:29) + [0] Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala#L29) [0] [0] in expect.same(- expected, + found) [0] -1 [0] +2 [0] - [0] modules/framework-cats/shared/src/test/scala/Meta.scala:29 + [0] modules/framework-cats/shared/src/test/scala/Meta.scala#L29 [0] expect.same(x, y) && expect.same(y, z) [0] ^ - [1] Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala:29) + [1] Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala#L29) [1] [1] in expect.same(- expected, + found) [1] -2 [1] +3 [1] - [1] modules/framework-cats/shared/src/test/scala/Meta.scala:29 + [1] modules/framework-cats/shared/src/test/scala/Meta.scala#L29 [1] expect.same(x, y) && expect.same(y, z) [1] ^""" ) @@ -578,21 +580,21 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (traced) 0ms - Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala:33) - (modules/framework-cats/shared/src/test/scala/Meta.scala:40) - (modules/framework-cats/shared/src/test/scala/Meta.scala:37) + Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala#L33) + (modules/framework-cats/shared/src/test/scala/Meta.scala#L40) + (modules/framework-cats/shared/src/test/scala/Meta.scala#L37) in expect.same(- expected, + found) -1 +2 - modules/framework-cats/shared/src/test/scala/Meta.scala:33 + modules/framework-cats/shared/src/test/scala/Meta.scala#L33 helper ^ - modules/framework-cats/shared/src/test/scala/Meta.scala:40 + modules/framework-cats/shared/src/test/scala/Meta.scala#L40 expect.same(1, 2).traced(here) ^ - modules/framework-cats/shared/src/test/scala/Meta.scala:37 + modules/framework-cats/shared/src/test/scala/Meta.scala#L37 nestedHelper.traced(here) ^""" ) @@ -600,21 +602,21 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (traced) 0ms - Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala:33) - (modules/framework-cats/shared/src/test/scala/Meta.scala:40) - (modules/framework-cats/shared/src/test/scala/Meta.scala:37) + Values not equal: (modules/framework-cats/shared/src/test/scala/Meta.scala#L33) + (modules/framework-cats/shared/src/test/scala/Meta.scala#L40) + (modules/framework-cats/shared/src/test/scala/Meta.scala#L37) in expect.same(- expected, + found) -1 +2 - modules/framework-cats/shared/src/test/scala/Meta.scala:33 + modules/framework-cats/shared/src/test/scala/Meta.scala#L33 helper ^ - modules/framework-cats/shared/src/test/scala/Meta.scala:40 + modules/framework-cats/shared/src/test/scala/Meta.scala#L40 expect.same(1, 2).traced(here) ^ - modules/framework-cats/shared/src/test/scala/Meta.scala:37 + modules/framework-cats/shared/src/test/scala/Meta.scala#L37 nestedHelper.traced(here) ^""" ) @@ -629,13 +631,13 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (interpolator) 0ms - assertion failed (modules/framework-cats/shared/src/test/scala/Meta.scala:44) + assertion failed (modules/framework-cats/shared/src/test/scala/Meta.scala#L44) expect(x == "2") Use the `clue` function to troubleshoot - modules/framework-cats/shared/src/test/scala/Meta.scala:44 + modules/framework-cats/shared/src/test/scala/Meta.scala#L44 forEach(Option(s"$x"))(x => expect(x == "2")) ^""" ) @@ -643,13 +645,13 @@ object DogFoodTests extends IOSuite { assertInlineSnapshot( actual, """- (interpolator) 0ms - assertion failed (modules/framework-cats/shared/src/test/scala/Meta.scala:44) + assertion failed (modules/framework-cats/shared/src/test/scala/Meta.scala#L44) expect(x == "2") Use the `clue` function to troubleshoot - modules/framework-cats/shared/src/test/scala/Meta.scala:44 + modules/framework-cats/shared/src/test/scala/Meta.scala#L44 forEach(Option(s"$x"))(x => expect(x == "2")) ^""" ) diff --git a/modules/framework-cats/shared/src/test/scala/TagDogFoodTests.scala b/modules/framework-cats/shared/src/test/scala/TagDogFoodTests.scala index e95d0774..a2d8f37d 100644 --- a/modules/framework-cats/shared/src/test/scala/TagDogFoodTests.scala +++ b/modules/framework-cats/shared/src/test/scala/TagDogFoodTests.scala @@ -27,10 +27,10 @@ object TagDogFoodTests extends IOSuite { assertInlineSnapshot( failureMessages, List( - """- (should-fail) 0ms - 'Only' tag is not allowed when `isCI=true` (src/main/MaoTests.scala:1)""", - """- (should-also-fail) 0ms - 'Only' tag is not allowed when `isCI=true` (src/main/MaoTests.scala:1)""" + s"""- (should-fail) 0ms + | 'Only' tag is not allowed when `isCI=true` (src/main/MaoTests.scala#L1)""".stripMargin, + s"""- (should-also-fail) 0ms + | 'Only' tag is not allowed when `isCI=true` (src/main/MaoTests.scala#L1)""".stripMargin ) ) }