module Festung.Concurrency.UtilsSpec (spec) where import Test.Hspec import Control.Concurrent import Control.Applicative import Festung.Concurrency.Utils oneSecond :: Int oneSecond = 1 * 1000 * 1000 spec :: Spec spec = do describe "copyMVar" $ do it "Copies content without taking it" $ do src <- newMVar () dst <- newEmptyMVar copyMVar id src dst tryReadMVar src `shouldReturn` Just () tryReadMVar dst `shouldReturn` Just () describe "readAnyMVar" $ do let getMVars = pure (,) <*> newMVar 1 <*> (newEmptyMVar :: IO (MVar ())) it "Reads non-empty mvar" $ do (value, empty) <- getMVars readAnyMVar value empty `shouldReturn` Left 1 readAnyMVar empty value `shouldReturn` Right 1 it "Doesn't take the non-empty mvar" $ do (value, empty) <- getMVars readAnyMVar value empty `shouldReturn` Left 1 tryReadMVar value `shouldReturn` Just 1 describe "readMVarTimeout" $ do it "Reads a filled mvar" $ do filled <- newMVar () readMVarTimeout oneSecond filled `shouldReturn` Just () it "Times out" $ do empty <- newEmptyMVar :: IO (MVar ()) readMVarTimeout 0 empty `shouldReturn` Nothing describe "readChanTimeout" $ do it "Reads a Chan with data" $ do chan <- newChan writeChan chan () readChanTimeout oneSecond chan `shouldReturn` Just () it "Times out" $ do chan <- newChan :: IO (Chan ()) readChanTimeout 0 chan `shouldReturn` Nothing