content: module Test.QuickCheck.Extra
    ( expectException
    , expectXException
    , expectExceptionNoX
    ) where
  
  import Test.Tasty.QuickCheck
  import Control.DeepSeq (NFData)
  import Control.Exception (SomeException, try, evaluate)
  import Data.Either (isLeft)
  
  import Clash.XException (XException)
  
  -- | Succeed if evaluating leads to an XException
  expectXException :: (Show a, NFData a) => a -> Property
  expectXException a0 = ioProperty $ do
    a1 <- try @XException (evaluate a0)
    pure $
      counterexample
        ("Expected Exception, got: " <> show a1)
        (isLeft a1)
  
  -- | Succeed if evaluating leads to an Exception
  expectException :: (Show a, NFData a) => a -> Property
  expectException a0 = ioProperty $ do
    a1 <- try @SomeException (evaluate a0)
    pure $
      counterexample
        ("Expected Exception, got: " <> show a1)
        (isLeft a1)
  
  -- | Succeed if evaluating leads to a non-XException Exception
  expectExceptionNoX :: (Show a, NFData a) => a -> Property
  expectExceptionNoX a0 = ioProperty $ do
    a1 <- try @SomeException (try @XException (evaluate a0))
    pure $
      counterexample
        ("Expected non-XException Exception, got: " <> show a1)
        (isLeft a1)
  