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

net.ruippeixotog.akka.testkit.specs2.ResultValue.scala Maven / Gradle / Ivy

The newest version!
package net.ruippeixotog.akka.testkit.specs2

import org.specs2.execute.{ Failure, Result, Success }
import org.specs2.matcher.ValueCheck

import net.ruippeixotog.akka.testkit.specs2.ResultValue.{ CheckFailed, FailureReason, ReceiveTimeout }

sealed trait ResultValue[+A] {
  def result: Result
}

case class SuccessValue[A](result: Result, value: A) extends ResultValue[A]

object SuccessValue {
  def apply[A](msg: String, value: A): SuccessValue[A] = SuccessValue(Success(msg), value)
}

case class FailureValue(result: Result, reason: FailureReason) extends ResultValue[Nothing]

object FailureValue {
  def apply(msg: String, reason: FailureReason): FailureValue = FailureValue(Failure(msg), reason)
  def timeout(msg: String): FailureValue = FailureValue(msg, ReceiveTimeout)
  def failedCheck(msg: String): FailureValue = FailureValue(msg, CheckFailed)
}

object ResultValue {
  sealed trait FailureReason
  case object ReceiveTimeout extends FailureReason
  case object CheckFailed extends FailureReason

  implicit class ResultValueOps[A](val res: ResultValue[A]) extends AnyVal {

    def mapCheck(check: ValueCheck[A]): ResultValue[A] = res match {
      case fail: FailureValue => fail
      case SuccessValue(result, value) =>
        val newResult = check.check(value)
        if (newResult.isSuccess) SuccessValue(s"${result.message} and ${newResult.message}", value)
        else FailureValue.failedCheck(s"${result.message} but ${newResult.message}")
    }

    def mapTransform[B](check: ValueCheck[A], g: A => B): ResultValue[B] = res match {
      case fail: FailureValue => fail
      case SuccessValue(result, value) =>
        val newResult = check.check(value)
        if (newResult.isSuccess) SuccessValue(result, g(value))
        else FailureValue.failedCheck(s"${result.message} but ${newResult.message}")
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy