{-# LANGUAGE OverloadedStrings #-}
module Main where
import Hedgehog hiding (withTests)
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Test.Tasty
import Test.Tasty.ExpectedFailure
import Test.Tasty.Hedgehog.Coverage
genAlphaList :: Gen String
genAlphaList =
Gen.list (Range.linear 0 100) Gen.alpha
test_involutive :: (MonadTest m, Eq a, Show a) => (a -> a) -> a -> m ()
test_involutive f x =
f (f x) === x
prop_reverse_involutive :: Cover
prop_reverse_involutive = withTests 500 . withCoverage $ do
xs <- forAll genAlphaList
classify (length xs > 50) "non-trivial"
test_involutive reverse xs
badReverse :: [a] -> [a]
badReverse [] = []
badReverse [_] = []
badReverse as = reverse as
prop_badReverse_involutive :: Cover
prop_badReverse_involutive = withCoverage $ do
xs <- forAll genAlphaList
classify (length xs < 10) "trivial"
classify (length xs > 10) "non-trivial"
test_involutive badReverse xs
main :: IO ()
main = defaultMain $
testGroup "tasty-hedgehog-coverage tests"
[ testPropertyCoverage
"reverse involutive"
prop_reverse_involutive
, expectFail $ testPropertyCoverage
"badReverse involutive fails"
prop_badReverse_involutive
]