sensei-0.8.0: test/Helper.hs
module Helper (
module Imports
, silent
, ghciConfig
, withTempDirectory
, withSomeSpec
, passingSpec
, passingMetaSpec
, failingSpec
, Status(..)
, modulesLoaded
, Color(..)
, withColor
, timeout
) where
import Imports
import System.Directory as Imports
import System.IO.Temp (withSystemTempDirectory)
import System.Process as Imports (readProcess, callProcess, callCommand)
import Test.Hspec as Imports
import Test.Hspec.Contrib.Mocks.V1 as Imports
import Test.Mockery.Directory as Imports (touch)
import System.Environment
import qualified System.Timeout
import Run ()
import Util
import Language.Haskell.GhciWrapper (Config(..))
timeout :: IO a -> IO (Maybe a)
timeout action = lookupEnv "CI" >>= \ case
Nothing -> System.Timeout.timeout 5_000_000 action
Just _ -> System.Timeout.timeout 30_000_000 action
silent :: a -> IO ()
silent _ = pass
ghciConfig :: Config
ghciConfig = Config {
configIgnoreDotGhci = True
, configStartupFile = "startup.ghci"
, configWorkingDirectory = Nothing
, configEcho = silent
}
withTempDirectory :: (FilePath -> IO a) -> IO a
withTempDirectory = withSystemTempDirectory "hspec"
withSomeSpec :: (FilePath -> IO a) -> IO a
withSomeSpec action = withTempDirectory $ \ dir -> do
let name = dir </> "Spec.hs"
writeFile name passingSpec
action name
passingSpec :: String
passingSpec = unlines [
"module Spec (spec) where"
, ""
, "import Test.Hspec"
, ""
, "spec :: Spec"
, "spec = do"
, " it \"foo\" True"
, " it \"bar\" True"
]
passingMetaSpec :: String
passingMetaSpec = unlines [
"module Spec (spec) where"
, ""
, "import Test.Hspec.Meta"
, ""
, "spec :: Spec"
, "spec = do"
, " it \"foo\" True"
, " it \"bar\" True"
]
failingSpec :: String
failingSpec = unlines [
"module Spec (spec) where"
, ""
, "import Test.Hspec"
, ""
, "spec :: Spec"
, "spec = do"
, " it \"foo\" True"
, " it \"bar\" False"
]
data Status = Ok | Failed
deriving (Eq, Show)
modulesLoaded :: Status -> [String] -> String
modulesLoaded status xs = show status ++ ", " ++ mods ++ " loaded."
where
n = length xs
mods
| n == 0 = "no modules"
| n == 1 = "one module"
| n == 2 = "two modules"
| n == 3 = "three modules"
| n == 4 = "four modules"
| n == 5 = "five modules"
| n == 6 = "six modules"
| otherwise = show n ++ " modules"