{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleContexts #-}
module Main ( main ) where
import Control.Concurrent.MVar
import Control.Exception (Exception, ErrorCall, catch)
import Control.Monad (void)
import Data.Functor
import Data.Typeable
import Test.Framework ( defaultMain, testGroup, Test )
import Test.Framework.Providers.HUnit
import Test.Framework.Providers.QuickCheck2
import Test.HUnit hiding ( Test, State )
import Test.QuickCheck
import Test.QuickCheck.Property
import Control.Eff
import Control.Eff.Lift
import Control.Eff.Resource
main :: IO ()
main = defaultMain tests
statefulResourceTest :: Integer -> Property
statefulResourceTest x = morallyDubiousIOProperty $ do
m <- newMVar True
v <- runLift $ runResource $ do
let alloc = swapMVar m False
dealloc old = () <$ swapMVar m old
(k, v) <- allocate alloc dealloc
return v
mv <- takeMVar m
return $ v && mv
tests :: [Test]
tests = [
testProperty "stateful resource" statefulResourceTest
]