{-# language OverloadedStrings #-}
module Main where
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Test.Tasty
import Test.Tasty.ExpectedFailure
import Test.Tasty.Hedgehog
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 :: Property
prop_reverse_involutive =
property $ do
xs <- forAll genAlphaList
classify "empty" $ length xs == 0
classify "small" $ length xs < 10
classify "large" $ length xs >= 10
test_involutive reverse xs
badReverse :: [a] -> [a]
badReverse [] = []
badReverse [_] = []
badReverse (x : xs) = badReverse xs ++ [x]
prop_badReverse_involutive :: Property
prop_badReverse_involutive =
property $ do
xs <- forAll genAlphaList
test_involutive badReverse xs
main :: IO ()
main =
defaultMain $
testGroup "tasty-hedgehog tests"
[ testProperty
"reverse involutive"
prop_reverse_involutive
, expectFail $ testProperty
"badReverse involutive fails"
prop_badReverse_involutive
, testPropertyNamed
"reverse involutive"
"prop_reverse_involutive"
prop_reverse_involutive
, expectFail $ testPropertyNamed
"badReverse involutive fails"
"prop_badReverse_involutive"
prop_badReverse_involutive
]