All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.io.kotest.matchers.result.matchers.kt Maven / Gradle / Ivy

package io.kotest.matchers.result

import io.kotest.assertions.collectOrThrow
import io.kotest.assertions.errorCollector
import io.kotest.assertions.failure
import io.kotest.matchers.Matcher
import io.kotest.matchers.MatcherResult
import kotlin.reflect.KClass

fun  Result.shouldBeSuccess(block: ((T?) -> Unit)? = null) {
  test { BeSuccess().test(this) }
  block?.invoke(getOrNull())
}

fun  Result.shouldNotBeSuccess() = test(inverse = true) {
  BeSuccess().test(this)
}

infix fun  Result.shouldBeSuccess(expected: T) = test {
  BeSuccess(expected).test(this)
}

infix fun  Result.shouldNotBeSuccess(expected: T) = test(inverse = true) {
  BeSuccess(expected).test(this)
}
class BeSuccess(val expected: T? = null) : Matcher> {
  override fun test(value: Result): MatcherResult {
    return when {
      !value.isSuccess -> defaultResult(false)
      expected == null -> defaultResult(true)
      else -> MatcherResult(
        value.getOrNull() == expected,
        "Result should be a Success($expected), but instead got Succes(${value.getOrNull()}).",
        "Result should not be a Success($expected)"
      )
    }
  }

  private fun defaultResult(passed: Boolean) =
    MatcherResult(passed, "Result should be a success.", "Result should not be a success")
}

fun Result.shouldBeFailure(block: ((Throwable?) -> Unit)? = null) {
  test { BeFailure().test(this) }
  block?.invoke(exceptionOrNull())
}

fun Result.shouldNotBeFailure() = test(inverse = true) {
  BeFailure().test(this)
}
class BeFailure : Matcher> {
  override fun test(value: Result) = MatcherResult(
    value.isFailure,
    "Result should be a failure",
    "Result should not be a failure"
  )
}

inline fun  Result.shouldBeFailureOfType() = test {
  BeFailureOfType(A::class).test(this)
}
inline fun  Result.shouldNotBeFailureOfType() = test(inverse = true) {
  BeFailureOfType(A::class).test(this)
}

class BeFailureOfType(private val clazz: KClass) : Matcher> {
  override fun test(value: Result): MatcherResult {
    val error = value.exceptionOrNull()
    return when {
      value.isSuccess -> MatcherResult(false, "Result should be a failure", "")
      clazz.isInstance(error) -> MatcherResult(true,
        "Result should be a Failure($clazz)",
        "Result should not be a Failure($clazz)")
      else -> {
        MatcherResult(false, "Result should be a Failure($clazz) but was Failure(${error!!::class})", "")
      }
    }
  }
}

@PublishedApi
internal fun test(inverse: Boolean = false, block: () -> MatcherResult) {
  val result = block()
  if ((inverse && result.passed()) || (!inverse && !result.passed())) {
     errorCollector.collectOrThrow(
      failure(if (inverse) result.negatedFailureMessage() else result.failureMessage())
    )
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy