Blame test/test.hs

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]