It's possible with isCase
snip:
/**
* Makes a new assertion that requires the sum type be a specified term.
*
* {{{
* isCase("Some", Some.unapply, anything)
* }}}
*/
def isCase[Sum, Proj](
termName: String,
term: Sum => Option[Proj],
assertion: Assertion[Proj]
)
And my (probably not ideal) solution:
sealed trait Result
case object Success extends Result
case class MyFailure(details: String) extends Result
val r: Result = MyFailure("not enought mana")
test("mana") {
assert(r)(
isCase[Result, String](
"details",
{
case MyFailure(details) => Some(details)
case _ => None
},
containsString("mana"))
)
}
Alternatively it's possible to create a helper function and use it for such cases:
def matches[A](mf: PartialFunction[A, Boolean]): Assertion[A] =
Assertion.assertion("matches")() {
a => mf.orElse[A, Boolean]({ case _ => false })(a)
}
Now the test might look like:
assert(r)(
matches {
case MyFailure(d) => d.contains("mana")
}
)