|
Packit |
1d883e |
{-# LANGUAGE CPP, DeriveDataTypeable, FlexibleContexts #-}
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from base:
|
|
Packit |
1d883e |
#if !MIN_VERSION_base(4,6,0)
|
|
Packit |
1d883e |
import Prelude hiding (catch)
|
|
Packit |
1d883e |
#endif
|
|
Packit |
1d883e |
import Data.IORef
|
|
Packit |
1d883e |
import Data.Maybe
|
|
Packit |
1d883e |
import Data.Typeable (Typeable)
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from transformers-base:
|
|
Packit |
1d883e |
import Control.Monad.Base (liftBase)
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from transformers:
|
|
Packit |
1d883e |
import Control.Monad.Trans.Identity
|
|
Packit |
1d883e |
import Control.Monad.Trans.List
|
|
Packit |
1d883e |
import Control.Monad.Trans.Maybe
|
|
Packit |
1d883e |
import Control.Monad.Trans.Reader
|
|
Packit |
1d883e |
import Control.Monad.Trans.Writer
|
|
Packit |
1d883e |
import Control.Monad.Trans.Except
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
import Control.Monad.Trans.State
|
|
Packit |
1d883e |
import qualified Control.Monad.Trans.RWS as RWS
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from monad-control:
|
|
Packit |
1d883e |
import Control.Monad.Trans.Control (MonadBaseControl)
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from lifted-base (this package):
|
|
Packit |
1d883e |
import Control.Exception.Lifted
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from test-framework:
|
|
Packit |
1d883e |
import Test.Framework (defaultMain, testGroup, Test)
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from test-framework-hunit:
|
|
Packit |
1d883e |
import Test.Framework.Providers.HUnit
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from hunit:
|
|
Packit |
1d883e |
import Test.HUnit hiding (Test)
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
main :: IO ()
|
|
Packit |
1d883e |
main = defaultMain
|
|
Packit |
1d883e |
[ testSuite "IdentityT" runIdentityT
|
|
Packit |
1d883e |
, testSuite "ListT" $ fmap head . runListT
|
|
Packit |
1d883e |
, testSuite "MaybeT" $ fmap fromJust . runMaybeT
|
|
Packit |
1d883e |
, testSuite "ReaderT" $ flip runReaderT "reader state"
|
|
Packit |
1d883e |
, testSuite "WriterT" runWriterT'
|
|
Packit |
1d883e |
, testSuite "ExceptT" runExceptT'
|
|
Packit |
1d883e |
, testSuite "StateT" $ flip evalStateT "state state"
|
|
Packit |
1d883e |
, testSuite "RWST" $ \m -> runRWST' m "RWS in" "RWS state"
|
|
Packit |
1d883e |
, testCase "ExceptT throwE" case_throwE
|
|
Packit |
1d883e |
, testCase "WriterT tell" case_tell
|
|
Packit |
1d883e |
]
|
|
Packit |
1d883e |
where
|
|
Packit |
1d883e |
runWriterT' :: Functor m => WriterT [Int] m a -> m a
|
|
Packit |
1d883e |
runWriterT' = fmap fst . runWriterT
|
|
Packit |
1d883e |
runExceptT' :: Functor m => ExceptT String m () -> m ()
|
|
Packit |
1d883e |
runExceptT' = fmap (either (const ()) id) . runExceptT
|
|
Packit |
1d883e |
runRWST' :: (Monad m, Functor m) => RWS.RWST r [Int] s m a -> r -> s -> m a
|
|
Packit |
1d883e |
runRWST' m r s = fmap fst $ RWS.evalRWST m r s
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
testSuite :: MonadBaseControl IO m => String -> (m () -> IO ()) -> Test
|
|
Packit |
1d883e |
testSuite s run = testGroup s
|
|
Packit |
1d883e |
[ testCase "finally" $ case_finally run
|
|
Packit |
1d883e |
, testCase "catch" $ case_catch run
|
|
Packit |
1d883e |
, testCase "bracket" $ case_bracket run
|
|
Packit |
1d883e |
, testCase "bracket_" $ case_bracket_ run
|
|
Packit |
1d883e |
, testCase "onException" $ case_onException run
|
|
Packit |
1d883e |
]
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
ignore :: IO () -> IO ()
|
|
Packit |
1d883e |
ignore x =
|
|
Packit |
1d883e |
catch x go
|
|
Packit |
1d883e |
where
|
|
Packit |
1d883e |
go :: SomeException -> IO ()
|
|
Packit |
1d883e |
go _ = return ()
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
data Exc = Exc
|
|
Packit |
1d883e |
deriving (Show, Typeable)
|
|
Packit |
1d883e |
instance Exception Exc
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
one :: Int
|
|
Packit |
1d883e |
one = 1
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
case_finally :: MonadBaseControl IO m => (m () -> IO ()) -> Assertion
|
|
Packit |
1d883e |
case_finally run = do
|
|
Packit |
1d883e |
i <- newIORef one
|
|
Packit |
1d883e |
ignore
|
|
Packit |
1d883e |
(run $ (do
|
|
Packit |
1d883e |
liftBase $ writeIORef i 2
|
|
Packit |
1d883e |
error "error") `finally` (liftBase $ writeIORef i 3))
|
|
Packit |
1d883e |
j <- readIORef i
|
|
Packit |
1d883e |
j @?= 3
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
case_catch :: MonadBaseControl IO m => (m () -> IO ()) -> Assertion
|
|
Packit |
1d883e |
case_catch run = do
|
|
Packit |
1d883e |
i <- newIORef one
|
|
Packit |
1d883e |
run $ (do
|
|
Packit |
1d883e |
liftBase $ writeIORef i 2
|
|
Packit |
1d883e |
throw Exc) `catch` (\Exc -> liftBase $ writeIORef i 3)
|
|
Packit |
1d883e |
j <- readIORef i
|
|
Packit |
1d883e |
j @?= 3
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
case_bracket :: MonadBaseControl IO m => (m () -> IO ()) -> Assertion
|
|
Packit |
1d883e |
case_bracket run = do
|
|
Packit |
1d883e |
i <- newIORef one
|
|
Packit |
1d883e |
ignore $ run $ bracket
|
|
Packit |
1d883e |
(liftBase $ writeIORef i 2)
|
|
Packit |
1d883e |
(\() -> liftBase $ writeIORef i 4)
|
|
Packit |
1d883e |
(\() -> liftBase $ writeIORef i 3)
|
|
Packit |
1d883e |
j <- readIORef i
|
|
Packit |
1d883e |
j @?= 4
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
case_bracket_ :: MonadBaseControl IO m => (m () -> IO ()) -> Assertion
|
|
Packit |
1d883e |
case_bracket_ run = do
|
|
Packit |
1d883e |
i <- newIORef one
|
|
Packit |
1d883e |
ignore $ run $ bracket_
|
|
Packit |
1d883e |
(liftBase $ writeIORef i 2)
|
|
Packit |
1d883e |
(liftBase $ writeIORef i 4)
|
|
Packit |
1d883e |
(liftBase $ writeIORef i 3)
|
|
Packit |
1d883e |
j <- readIORef i
|
|
Packit |
1d883e |
j @?= 4
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
case_onException :: MonadBaseControl IO m => (m () -> IO ()) -> Assertion
|
|
Packit |
1d883e |
case_onException run = do
|
|
Packit |
1d883e |
i <- newIORef one
|
|
Packit |
1d883e |
ignore $ run $ onException
|
|
Packit |
1d883e |
(liftBase (writeIORef i 2) >> error "ignored")
|
|
Packit |
1d883e |
(liftBase $ writeIORef i 3)
|
|
Packit |
1d883e |
j <- readIORef i
|
|
Packit |
1d883e |
j @?= 3
|
|
Packit |
1d883e |
ignore $ run $ onException
|
|
Packit |
1d883e |
(liftBase $ writeIORef i 4)
|
|
Packit |
1d883e |
(liftBase $ writeIORef i 5)
|
|
Packit |
1d883e |
k <- readIORef i
|
|
Packit |
1d883e |
k @?= 4
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
case_throwE :: Assertion
|
|
Packit |
1d883e |
case_throwE = do
|
|
Packit |
1d883e |
i <- newIORef one
|
|
Packit |
1d883e |
Left "throwE" <- runExceptT $
|
|
Packit |
1d883e |
(liftBase (writeIORef i 2) >> throwE "throwE")
|
|
Packit |
1d883e |
`finally`
|
|
Packit |
1d883e |
(liftBase $ writeIORef i 3)
|
|
Packit |
1d883e |
j <- readIORef i
|
|
Packit |
1d883e |
j @?= 3
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
case_tell :: Assertion
|
|
Packit |
1d883e |
case_tell = do
|
|
Packit |
1d883e |
i <- newIORef one
|
|
Packit |
1d883e |
((), w) <- runWriterT $ bracket_
|
|
Packit |
1d883e |
(liftBase (writeIORef i 2) >> tell [1 :: Int])
|
|
Packit |
1d883e |
(liftBase (writeIORef i 4) >> tell [3])
|
|
Packit |
1d883e |
(liftBase (writeIORef i 3) >> tell [2])
|
|
Packit |
1d883e |
j <- readIORef i
|
|
Packit |
1d883e |
j @?= 4
|
|
Packit |
1d883e |
w @?= [2]
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
((), w') <- runWriterT $ bracket
|
|
Packit |
1d883e |
(liftBase (writeIORef i 5) >> tell [5 :: Int])
|
|
Packit |
1d883e |
(const $ liftBase (writeIORef i 7) >> tell [7])
|
|
Packit |
1d883e |
(const $ liftBase (writeIORef i 6) >> tell [6])
|
|
Packit |
1d883e |
j' <- readIORef i
|
|
Packit |
1d883e |
j' @?= 7
|
|
Packit |
1d883e |
w' @?= [5, 6]
|