entwine-0.0.2: test/Test/Disorder.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Test.Disorder (
testIO
, withCPUTime
, disorderMain
, disorderCliMain
) where
import Control.Monad
import Control.Monad.IO.Class (liftIO, MonadIO)
import Test.QuickCheck
import Test.QuickCheck.Monadic
import System.Directory
import System.Process
import System.Exit
import System.IO
import System.CPUTime (getCPUTime)
testIO :: forall a. (Testable a) => IO a -> Property
testIO mx = monadicIO $ do
p <- (run mx)
stop p :: PropertyM IO a
-- | Perform an action and return the CPU time it takes, in picoseconds
-- (actual precision varies with implementation).
withCPUTime :: MonadIO m => m a -> m (Integer, a)
withCPUTime a = do
t1 <- liftIO getCPUTime
r <- a
t2 <- liftIO getCPUTime
return (t2 - t1, r)
disorderMain :: [IO Bool] -> IO ()
disorderMain tests =
sanity >> sequence tests >>= \rs -> unless (and rs) exitFailure
disorderCliMain :: [String] -> IO ()
disorderCliMain arguments =
let ignore p = ".." == p || "." == p || "core" == p
exec t = callProcess ("test/cli/" ++ t ++ "/run") arguments
in sanity >> filter (not . ignore) <$> getDirectoryContents "test/cli/" >>= mapM_ exec
sanity :: IO ()
sanity =
hSetBuffering stdout LineBuffering >> hSetBuffering stderr LineBuffering