packages feed

grenade-0.1.0: test/Test/Hedgehog/Compat.hs

{-# LANGUAGE RankNTypes            #-}
module Test.Hedgehog.Compat (
    (...)
  , choose
  , blindForAll
  , semiBlindForAll
  , forAllRender
  )where

import           Control.Monad.Trans.Class (MonadTrans(..))

import           Data.Typeable ( typeOf )

import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import           Hedgehog.Internal.Property
import           Hedgehog.Internal.Source
import           Hedgehog.Internal.Show

(...) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(...) = (.) . (.)
{-# INLINE (...) #-}

choose :: ( Monad m, Integral a ) => a -> a -> Gen.Gen m a
choose = Gen.integral ... Range.constant

blindForAll :: Monad m => Gen.Gen m a -> Test m a
blindForAll = Test . lift . lift

semiBlindForAll :: (Monad m, Show a, HasCallStack) => Gen.Gen m a -> Test m a
semiBlindForAll gen = do
  x <- Test . lift $ lift gen
  writeLog $ Input (getCaller callStack) (typeOf ()) (showPretty x)
  return x

forAllRender :: (Monad m, HasCallStack) => ( a -> String ) -> Gen.Gen m a -> Test m a
forAllRender render gen = do
  x <- Test . lift $ lift gen
  writeLog $ Input (getCaller callStack) (typeOf ()) (render x)
  return x