-- | Use Hedgehog generators with QuickCheck. -- module Test.QuickCheck.Hedgehog ( hedgehog ) where import Control.Monad.Trans.Maybe (runMaybeT) import Data.Functor.Identity (runIdentity) import Hedgehog import Hedgehog.Internal.Gen (runGenT) import qualified Hedgehog.Internal.Seed as Seed import Hedgehog.Internal.Tree (Tree(..), Node(..)) import qualified Test.QuickCheck as QuickCheck genSeed :: QuickCheck.Gen Seed genSeed = Seed.from <$> QuickCheck.arbitraryBoundedIntegral -- | Create a QuickCheck 'QuickCheck.Gen' from a Hedgehog 'Gen'. -- -- /Note that this conversion does not preserve shrinking. There is currently/ -- /no way to use Hedgehog's shrinking capability inside QuickCheck./ -- hedgehog :: Gen a -> QuickCheck.Gen a hedgehog gen = let loop n = if n <= 0 then QuickCheck.discard else do seed <- genSeed size <- QuickCheck.sized (pure . fromIntegral) case runIdentity . runMaybeT . runTree $ runGenT size seed gen of Nothing -> loop (n - 1) Just x -> pure $ nodeValue x in loop (100 :: Int)