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

org.specs2.matcher.AdaptableMatcher.scala Maven / Gradle / Ivy

The newest version!
package org.specs2
package matcher

import org.specs2.fp.syntax.*

/** Inherit this trait to provide a Matcher where both the actual and the expected values can be adapted with a
  * function.
  */
trait AdaptableMatcher[T] extends Matcher[T]:
  outer =>

  /** @return
    *   a matcher changing its expected value and possibly adding more information to the ok and ko messages
    */
  def adapt(f: T => T, ok: String => String = identity, ko: String => String = identity): AdaptableMatcher[T]

  /** Adapt a matcher with both the expected and actual values ex: `be_==("message") ^^^ (_.trim)` will do the
    * comparison on both trimmed strings
    */
  def ^^^(f: T => T, ok: String => String = identity, ko: String => String = identity): AdaptableMatcher[T] =
    new AdaptableMatcher[T]:
      def adapt(g: T => T, okFunction: String => String, koFunction: String => String): AdaptableMatcher[T] =
        outer.adapt(g compose f, okFunction compose ok, koFunction compose ko)

      def apply[U <: T](a: Expectable[U]) =
        outer.adapt(f, ok, ko).apply(a)

  /** Adapts a matcher by changing the actual value before doing the match ex: `be_==("message") ^^ (_.trim)` will do
    * the comparison on a trimmed String before match
    */
  def ^^(f: T => T): AdaptableMatcher[T] =
    new AdaptableMatcher[T]:
      def adapt(f2: T => T, ok: String => String = identity, ko: String => String = identity) =
        outer.adapt(f2, ok, ko)

      def apply[U <: T](a: Expectable[U]) =
        outer.apply(a.map(f))




© 2015 - 2024 Weber Informatics LLC | Privacy Policy