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