mismi-core-0.0.1: test/Test/IO/Mismi/Control.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Test.IO.Mismi.Control (tests) where
import Control.Monad.Catch (throwM, catchIOError)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Resource (register)
import Data.IORef (modifyIORef, newIORef, readIORef)
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Mismi.Control (awsBracket)
import P
import System.IO.Error (userError)
import Test.Mismi (testAWS, liftAWS, runAWSDefaultRegion)
prop_bracket :: Property
prop_bracket =
property $ do
l <- forAll $ Gen.list (Range.linear 0 100) (Gen.text (Range.linear 0 50) Gen.alphaNum)
final <- forAll $ Gen.text (Range.linear 1 10) Gen.alphaNum
action <- forAll $ Gen.text (Range.linear 1 10) Gen.alphaNum
ref <- liftIO $ newIORef l
let
after' = (flip modifyIORef (final :))
action' = (flip modifyIORef (action :))
liftIO . runAWSDefaultRegion $ awsBracket (liftIO $ return ref) (liftIO . after') (liftIO . action')
result <- liftIO $ readIORef ref
result === final : action : l
prop_bracket_catch :: Property
prop_bracket_catch =
property $ do
l <- forAll $ Gen.list (Range.linear 0 100) (Gen.text (Range.linear 0 50) Gen.alphaNum)
final <- forAll $ Gen.text (Range.linear 1 10) Gen.alphaNum
ref <- liftIO $ newIORef l
let
after' = (flip modifyIORef (final :))
action' = const $ throwM (userError "")
liftIO . runAWSDefaultRegion $
awsBracket (liftIO $ return ref) (liftIO . after') (liftIO . action') `catchIOError` (const $ return ())
result <- liftIO $ readIORef ref
result === final : l
prop_testAWS :: Property
prop_testAWS =
withTests 1 . testAWS $
pure ()
prop_testAWS_PropertyT :: Property
prop_testAWS_PropertyT =
withTests 1 . property . liftAWS $ do
False === False
True === True
prop_finalizer :: Property
prop_finalizer =
property $ do
ref <- liftIO $ newIORef (0 :: Int)
liftIO . runAWSDefaultRegion $ do
void $ register (modifyIORef ref (const $ 1))
result <- liftIO $ readIORef ref
result === 1
tests :: IO Bool
tests =
checkSequential $$(discover)