Mark Karpov
Mark Karpov

Reputation: 7599

Is it possible to check cases when exception is thrown with QuickCheck?

Suppose I have a function that should calculate some value in one case and throw an exception otherwise. I would like to use QuickCheck to ensure my function behaves correctly, however is not obvious how to perform this sort of check. Is it possible and if yes, how to check that exception of certain type is thrown and it contains correct information about its cause?

Upvotes: 6

Views: 312

Answers (1)

Mark Karpov
Mark Karpov

Reputation: 7599

Indeed ioProperty is the key to this sort of test. You will need to use it in combination with catch or try. Here I show the latter:

prop_exceptional :: Int -> Property
prop_exceptional n = ioProperty $ do
  result <- try . evaluate $ myDangerousFunction n
  return $ r === result
  where r | n == 0    = Left  MyException
          | otherwise = Right 42

Quite obviously, myDangerousFunction should throw MyException whenever it gets 0 and return 42 otherwise. Note the useful function evaluate, which you need to use to evaluate pure function in IO context to catch exceptions produced there.

Upvotes: 2

Related Questions