ide-backend-0.9.0: test/TestTools.hs
{-# LANGUAGE ScopedTypeVariables #-}
module TestTools where
import qualified Control.Exception as Ex
import Data.Typeable (typeOf)
import System.Posix.Signals (Signal, raiseSignal)
import Test.HUnit (Assertion, assertBool, assertFailure)
-- | Check that the given IO action raises the specified exception
assertRaises :: (Ex.Exception e, Show e)
=> String -- ^ Message displayed if assertion fails
-> (e -> Bool) -- ^ Expected exception
-> IO a -- ^ Action to run
-> Assertion
assertRaises msg checkEx p = do
mex <- Ex.try p
case mex of
Right _ -> assertFailure (msg ++ ": No exception was raised")
Left ex ->
case Ex.fromException ex of
Just ex' -> assertBool (msg ++ ": Got the wrong exception: " ++ show ex') (checkEx ex')
Nothing -> assertFailure $ msg ++ ": "
++ "Raised exception of the wrong type "
++ exceptionType ex ++ ": "
++ show ex
-- | Find the type of an exception (only a few kinds of exceptions are supported)
exceptionType :: Ex.SomeException -> String
exceptionType (Ex.SomeException ex) = show (typeOf ex)
-- | Like 'raiseSignal', but with a more general type
throwSignal :: Signal -> IO a
throwSignal signal = raiseSignal signal >> undefined