packages feed

strict-mvar-1.2.0.0: test/Test/Utils.hs

{-# LANGUAGE RankNTypes #-}

module Test.Utils
  ( runSimGen
  , monadicSim
  ) where

import           Control.Monad.IOSim (IOSim, runSimOrThrow)
import           Test.QuickCheck (Gen, Property, Testable (..))
import           Test.QuickCheck.Gen.Unsafe (Capture (..), capture)
import           Test.QuickCheck.Monadic (PropertyM, monadic')

{-------------------------------------------------------------------------------
  Property runners (copied from "Ouroboros.Network.Testing.QuickCheck")
-------------------------------------------------------------------------------}

runSimGen :: (forall s. Gen (IOSim s a)) -> Gen a
runSimGen f = do
    Capture eval <- capture
    return $ runSimOrThrow (eval f)

monadicSim :: Testable a => (forall s. PropertyM (IOSim s) a) -> Property
monadicSim m = property (runSimGen (monadic' m))