diff --git a/result4k/kotest/src/main/kotlin/dev/forkhandles/result4k/kotest/matchers.kt b/result4k/kotest/src/main/kotlin/dev/forkhandles/result4k/kotest/matchers.kt index 713d5e8..62525b4 100644 --- a/result4k/kotest/src/main/kotlin/dev/forkhandles/result4k/kotest/matchers.kt +++ b/result4k/kotest/src/main/kotlin/dev/forkhandles/result4k/kotest/matchers.kt @@ -3,6 +3,7 @@ package dev.forkhandles.result4k.kotest import dev.forkhandles.result4k.Failure import dev.forkhandles.result4k.Result import dev.forkhandles.result4k.Success +import io.kotest.matchers.ComparableMatcherResult import io.kotest.matchers.Matcher import io.kotest.matchers.MatcherResult import io.kotest.matchers.should @@ -59,15 +60,29 @@ infix fun Result<*, E>.shouldBeFailure(expected: E) = this should beFailure(expected) private fun Result.matchesValue(value: Result): MatcherResult = - MatcherResult( + matcherResultWithIntelliJDiff( passed = value == this, - failureMessageFn = { "$value should be $this" }, - negatedFailureMessageFn = { "$value should not be $this" }, + actual = toString(), + expected = value.toString() ) private fun > Result.matchesType(resultClass: KClass): MatcherResult = - MatcherResult( + matcherResultWithIntelliJDiff( passed = resultClass.isInstance(this), - failureMessageFn = { "$this should be ${resultClass.simpleName}" }, - negatedFailureMessageFn = { "$this should not be ${resultClass.simpleName}" }, + actual = this.toString(), + expected = resultClass.simpleName!! + ) + +/** + * Return ComparableMatcherResult so that Kotest throws AssertFailedError + * with the failure message formatted by io.kotest.assertions.intellijFormatError() + * which makes IntelliJ show the link to the diff window. + */ +private fun matcherResultWithIntelliJDiff(passed: Boolean, actual: String, expected: String) = + ComparableMatcherResult( + passed = passed, + failureMessageFn = { "" }, + negatedFailureMessageFn = { "not " }, + actual = actual, + expected = expected ) diff --git a/result4k/kotest/src/test/kotlin/dev/forkhandles/result4k/kotest/MatchersTest.kt b/result4k/kotest/src/test/kotlin/dev/forkhandles/result4k/kotest/MatchersTest.kt index 820edea..4c7cd58 100644 --- a/result4k/kotest/src/test/kotlin/dev/forkhandles/result4k/kotest/MatchersTest.kt +++ b/result4k/kotest/src/test/kotlin/dev/forkhandles/result4k/kotest/MatchersTest.kt @@ -39,13 +39,13 @@ class MatchersTest { val value = "Test successful" val success = Success(value) - throwsAssertionError("Success(value=Test successful) should be Failure") { + throwsAssertionError("expected: but was:") { success.shouldBeFailure() } - throwsAssertionError("Success(value=Test successful) should be Failure") { + throwsAssertionError("expected: but was:") { success.shouldBeFailure { } } - throwsAssertionError("Success(value=Test successful) should be Failure(reason=Test successful)") { + throwsAssertionError("expected: but was:") { success.shouldBeFailure(value) } } @@ -55,23 +55,23 @@ class MatchersTest { val reason = "Test failed" val failure = Failure(reason) - throwsAssertionError("Failure(reason=Test failed) should be Success") { + throwsAssertionError("expected: but was:") { failure.shouldBeSuccess() } - throwsAssertionError("Failure(reason=Test failed) should be Success") { + throwsAssertionError("expected: but was:") { failure.shouldBeSuccess { } } - throwsAssertionError("Failure(reason=Test failed) should be Success(value=Test failed)") { + throwsAssertionError("expected: but was:") { failure.shouldBeSuccess(reason) } } @Test fun `should correctly assert value`() { - throwsAssertionError("Failure(reason=Actual value) should be Failure(reason=Expected value)") { + throwsAssertionError("expected: but was:") { Failure("Actual value").shouldBeFailure("Expected value") } - throwsAssertionError("Success(value=Actual value) should be Success(value=Expected value)") { + throwsAssertionError("expected: but was:") { Success("Actual value").shouldBeSuccess("Expected value") } }