class Composifier[T] extends AnyRef
Class used via an implicit conversion that adds composeTwice
, mapResult
, and
mapArgs
methods to functions that produce a Matcher
.
- Source
- MatcherProducers.scala
- Alphabetic
- By Inheritance
- Composifier
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##(): Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- def composeTwice[U](g: (U) => T): (U) => Matcher[U]
Produces a new “matcher producer” function of type
U => Matcher[U]
from theT => Matcher[T]
(namedf
) passed to theComposifier
constructor and the givenT => U
transformation function,g
.Produces a new “matcher producer” function of type
U => Matcher[U]
from theT => Matcher[T]
(namedf
) passed to theComposifier
constructor and the givenT => U
transformation function,g
.The result of
composeTwice
is the result of the following function composition expression:(f compose g) andThen (_ compose g)
You would use
composeTwice
if you want to create a new matcher producer from an existing one, by transforming both the left and right sides of the expression with the same transformation function. As an example, the expression “be > 7
” produces aMatcher[Int]
:scala> import org.scalatest._ import org.scalatest._ scala> import Matchers._ import Matchers._ scala> val beGreaterThanSeven = be > 7 beGreaterThanSeven: org.scalatest.matchers.Matcher[Int] = be > 7
Given this
Matcher[Int]
, you can now use it in ashould
expression like this:scala> 8 should beGreaterThanSeven scala> 6 should beGreaterThanSeven org.scalatest.exceptions.TestFailedException: 6 was not greater than 7 ...
You can create a more general “matcher producer” function like this:
scala> val beGreaterThan = { (i: Int) => be > i } beGreaterThan: Int => org.scalatest.matchers.Matcher[Int] = <function1> scala> 8 should beGreaterThan (7) scala> 8 should beGreaterThan (9) org.scalatest.exceptions.TestFailedException: 8 was not greater than 9
Given
beGreaterThan
matcher producer function, you can create matcher producer function that takes aString
and produces aMatcher[String]
given a function fromInt => String
usingcomposeTwice
:scala> val stringToInt = { (s: String) => s.toInt } stringToInt: String => Int = <function1> scala> val beAsIntsGreaterThan = beGreaterThan composeTwice stringToInt beAsIntsGreaterThan: String => org.scalatest.matchers.Matcher[String] = <function1> scala> "7" should beAsIntsGreaterThan ("6") scala> "7" should beAsIntsGreaterThan ("8") org.scalatest.exceptions.TestFailedException: 7 was not greater than 8 ...
The
composeTwice
method is just a shorthand for this function composition expression:scala> val beAsIntsGreaterThan = (beGreaterThan compose stringToInt) andThen (_ compose stringToInt) beAsIntsGreaterThan: String => org.scalatest.matchers.Matcher[String] = <function1> scala> "7" should beAsIntsGreaterThan ("6") scala> "7" should beAsIntsGreaterThan ("8") org.scalatest.exceptions.TestFailedException: 7 was not greater than 8
The first part of that expression,
beGreaterThan
compose
stringToInt
, gives you a new matcher producer function that given aString
will produce aMatcher[Int]
:scala> val beAsIntGreaterThan = beGreaterThan compose stringToInt beAsIntGreaterThan: String => org.scalatest.matchers.Matcher[Int] = <function1>
This
compose
method is inherited fromFunction1
: on anyFunction1
,(f
compose
g)(x)
meansf(g(x))
. You can use this matcher producer like this:scala> 7 should beAsIntGreaterThan ("6") scala> 7 should beAsIntGreaterThan ("8") org.scalatest.exceptions.TestFailedException: 7 was not greater than 8
To get a matcher producer that will allow you to put a string on the right-hand-side, you'll need to transform the
String
=>
Matcher[Int]
to aString
=>
Matcher[String]
. To accomplish this you can first just apply the function to get aMatcher[Int]
, like this:scala> val beGreaterThanEight = beAsIntGreaterThan ("8") beGreaterThanEight: org.scalatest.matchers.Matcher[Int] = be > 8 scala> 9 should beGreaterThanEight scala> 7 should beGreaterThanEight org.scalatest.exceptions.TestFailedException: 7 was not greater than 8
To transform
beGreaterThanEight
, aMatcher[Int]
, to aMatcher[String]
, you can again usecompose
. A ScalaTestMatcher[T]
is a Scala function typeT
=>
MatchResult
. To get aMatcher[String]
therefore, just callcompose
on theMatcher[Int]
and pass in a function fromString
=>
Int
:scala> val beAsIntGreaterThanEight = beGreaterThanEight compose stringToInt beAsIntGreaterThanEight: org.scalatest.matchers.Matcher[String] = <function1>
After the second call to
compose
, therefore, you have what you want:scala> "9" should beAsIntGreaterThanEight scala> "7" should beAsIntGreaterThanEight org.scalatest.exceptions.TestFailedException: 7 was not greater than 8
So in summary, what the result of
(beGreaterThan
compose
stringToInt)
andThen
(_
compose
stringToInt)
will do once it is applied to a (right-hand-side)String
, is:- Transform
beGreaterThan
from anInt
=>
Matcher[Int]
to aString
=>
Matcher[Int]
with the firstcompose
- Apply the given (right-hand-side)
String
to that to get aMatcher[Int]
(the first part ofandThen
's behavior) - Pass the resulting
Matcher[Int]
to the given function,_
compose
stringToInt
, which will transform theMatcher[Int]
to aMatcher[String]
(the second part of theandThen
behavior).
- Transform
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def mapArgs(prettify: (Any) => String): (T) => Matcher[T]
Returns a function that given a
T
will return aMatcher[T]
that will produce theMatchResult
produced byf
(passed to theComposifier
constructor) with arguments transformed by the givenprettify
function.Returns a function that given a
T
will return aMatcher[T]
that will produce theMatchResult
produced byf
(passed to theComposifier
constructor) with arguments transformed by the givenprettify
function.- prettify
a function with which to transform the arguments of error messages.
- returns
a new
Matcher
producer function that produces prettified error messages
- def mapResult(prettify: (MatchResult) => MatchResult): (T) => Matcher[T]
Returns a function that given a
T
will return aMatcher[T]
that will produce theMatchResult
produced byf
(passed to theComposifier
constructor) transformed by the givenprettify
function.Returns a function that given a
T
will return aMatcher[T]
that will produce theMatchResult
produced byf
(passed to theComposifier
constructor) transformed by the givenprettify
function.- prettify
a function with which to transform
MatchResult
s.- returns
a new
Matcher
producer function that produces prettified error messages
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()