Similarly to how quickcheck supports counterexamples:
property \x ->
counterexample ("Foo failed with: " ++ ...) $
foo x
but in a way that it works with shouldBe
, e.g.
failDetails (" details: " ++ baz a) $
a `shouldBe` 2
And I would like it to print something along the lines of:
expected: 2
but got: 3
details: ...
Yes, it seems to be possible:
import Control.Exception
import Test.HUnit.Lang (HUnitFailure(..))
failDetails details assert = do
assert `catch` \(HUnitFailure loc msg) -> do
throw $ HUnitFailure loc $ msg ++ "\n" ++ details
We catch the exception thrown by shouldBe
, amend the message, and rethrow it.
We can even use it like:
1 `shouldBe` 2
$> failDetails "foobar"
if we define:
($>) = flip ($)
infixl 0 $>
{-# INLINE ($>) #-}