module Test.Hspec.FailureReport ( writeFailureReport , readFailureReport ) where import System.IO import System.SetEnv import qualified Test.QuickCheck as QC import Test.Hspec.Config import Test.Hspec.Util (Path, safeTry, readMaybe, getEnv) type Seed = Integer writeFailureReport :: (Seed, [Path]) -> IO () writeFailureReport x = do -- on Windows this can throw an exception when the input is too large, hence -- we use `safeTry` here safeTry (setEnv "HSPEC_FAILURES" $ show x) >>= either onError return where onError err = do hPutStrLn stderr ("WARNING: Could not write environment variable HSPEC_FAILURES (" ++ show err ++ ")") readFailureReport :: Config -> IO Config readFailureReport c = do mx <- getEnv "HSPEC_FAILURES" case mx >>= readMaybe of Nothing -> do hPutStrLn stderr "WARNING: Could not read environment variable HSPEC_FAILURES; `--re-run' is ignored!" return c Just (seed, xs) -> do (return . setSeed seed . configAddFilter (`elem` xs)) c setSeed :: Seed -> Config -> Config setSeed seed c | hasSeed = c | otherwise = configSetSeed seed c where hasSeed = maybe False (const True) (QC.replay $ configQuickCheckArgs c)