module AssertQFails where

import Hedgehog

import Control.Exception (try, SomeException)
import Control.Monad.IO.Class (liftIO)
import Language.Haskell.TH (runQ, Q)

qFails :: Show a => Q a -> PropertyT IO ()
qFails :: forall a. Show a => Q a -> PropertyT IO ()
qFails (Q a
q :: Q a) =
  do
    Either SomeException a
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (forall e a. Exception e => IO a -> IO (Either e a)
try (forall (m :: * -> *) a. Quasi m => Q a -> m a
runQ Q a
q) :: IO (Either SomeException a))
    case Either SomeException a
result of
        Left SomeException
_ -> forall (m :: * -> *). MonadTest m => m ()
success
        Right a
_ -> forall (m :: * -> *) a. (MonadTest m, HasCallStack) => m a
failure