org.scalatest.matchers.MatcherProducers
Produces a new “matcher producer” function of type U => Matcher[U]
from the
T => Matcher[T]
(named f
) passed to the Composifier
constructor and the given
T => U
transformation function, g
.”“
Produces a new “matcher producer” function of type U => Matcher[U]
from the
T => Matcher[T]
(named f
) passed to the Composifier
constructor and the given
T => 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 a Matcher[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 a should
expression like this:
scala> 8 should beGreaterThanSevenscala> 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 a String
and produces a Matcher[String]
given a function from
Int => String
using composeTwice
:
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 a String
will produce a Matcher[Int]
:
scala> val beAsIntGreaterThan = beGreaterThan compose stringToInt beAsIntGreaterThan: String => org.scalatest.matchers.Matcher[Int] = <function1>
This compose
method is inherited from Function1
: on any Function1
,
(f
compose
g)(x)
means f(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 a String
=>
Matcher[String]
. To accomplish this you can first just apply the function to get a Matcher[Int]
,
like this:
scala> val beGreaterThanEight = beAsIntGreaterThan ("8") beGreaterThanEight: org.scalatest.matchers.Matcher[Int] = be > 8scala> 9 should beGreaterThanEight
scala> 7 should beGreaterThanEight org.scalatest.exceptions.TestFailedException: 7 was not greater than 8
To transform beGreaterThanEight
, a Matcher[Int]
, to a Matcher[String]
,
you can again use compose
. A ScalaTest Matcher[T]
is a Scala function type T
=>
MatchResult
. To get a Matcher[String]
therefore, just call
compose
on the Matcher[Int]
and pass in a function from String
=>
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 beAsIntGreaterThanEightscala> "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:
beGreaterThan
from an Int
=>
Matcher[Int]
to a String
=>
Matcher[Int]
with the first compose
String
to that to get a Matcher[Int]
(the first part
of andThen
's behavior)Matcher[Int]
to the given function, _
compose
stringToInt
, which will transform the Matcher[Int]
to a Matcher[String]
(the
second part of the andThen
behavior).Returns a function that given a T
will return a Matcher[T]
that will produce the
MatchResult
produced by f
(passed to the Composifier
constructor)
with arguments transformed by the given prettify
function.
Returns a function that given a T
will return a Matcher[T]
that will produce the
MatchResult
produced by f
(passed to the Composifier
constructor)
with arguments transformed by the given prettify
function.
a function with which to transform the arguments of error messages.
a new Matcher
producer function that produces prettified error messages
Returns a function that given a T
will return a Matcher[T]
that will produce the
MatchResult
produced by f
(passed to the Composifier
constructor)
transformed by the given prettify
function.
Returns a function that given a T
will return a Matcher[T]
that will produce the
MatchResult
produced by f
(passed to the Composifier
constructor)
transformed by the given prettify
function.
a function with which to transform MatchResult
s.
a new Matcher
producer function that produces prettified error messages
Class used via an implicit conversion that adds
composeTwice
,mapResult
, andmapArgs
methods to functions that produce aMatcher
.