genvalidity-hspec-0.4.0.0: test/Test/Validity/TestUtils.hs
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE CPP #-}
-- | Utilities to define your own validity-based 'Property's
--
-- You will need @TypeApplications@ to use these.
module Test.Validity.TestUtils where
import Test.Hspec
import Data.GenValidity
import Test.Validity
import Test.Hspec.Core.Formatters
import Test.Hspec.Core.Runner
import Test.Hspec.Core.Spec
import Test.QuickCheck.Property
failsBecause :: String -> SpecWith () -> SpecWith ()
failsBecause s st = mapSpecTree go st
where
go :: SpecTree () -> SpecTree ()
go sp =
Leaf $
Item
{ itemRequirement = s
, itemLocation = Nothing
, itemIsParallelizable = False
, itemExample =
\ps runner callback -> do
let conf = defaultConfig {configFormatter = Just silent}
r <- hspecWithResult conf $ fromSpecList [sp]
let succesful = summaryExamples r > 0 && summaryFailures r > 0
pure $ produceResult succesful
}
#if MIN_VERSION_hspec_core(2,4,0)
produceResult succesful =
Right $
if succesful
then Success
else Failure Nothing $ Reason "Should have failed but didn't."
#else
produceResult succesful =
if succesful
then Success
else Fail Nothing "Should have failed but didn't."
#endif
shouldFail :: Property -> Property
shouldFail =
mapResult $ \res ->
res
{ reason = unwords ["Should have failed:", reason res]
, expect = not $ expect res
}