import Prelude ()
import Prelude.Compat
import Control.Monad
import Data.List
import System.Directory
import System.Exit.Compat
import System.FilePath
import System.IO.Temp
import System.Process
import Test.Hspec
import BashProtocol
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
files <- runIO $
map ("docs" </>) <$>
filter ((".hs" ==) . takeExtension) <$>
sort <$>
getDirectoryContents "docs"
forM_ files $ \ file -> do
describe "docs directory ghc" $ do
it ("compile and run " ++ file) $ do
withSystemTempDirectory "getopt-generics-test" $ \ tempDir -> do
compile tempDir file >>= execute file
compile :: FilePath -> FilePath -> IO FilePath
compile tempDir file = do
let program = tempDir </> "program"
callCommandCompat $ "cabal exec -- ghc " ++ file ++
" -outputdir " ++ (tempDir </> "build") ++
" -o " ++ program ++
" -isrc -O0" ++
" -Wall -Werror -fno-warn-unused-binds -fno-warn-name-shadowing"
return program
execute :: FilePath -> FilePath -> IO ()
execute haskellFile program = do
let bashProtocolFile = dropExtension haskellFile <.> "bash-protocol"
exists <- doesFileExist bashProtocolFile
if not exists
then callCommandCompat $ program ++ " --help"
else do
testBashProtocol program =<< readFile bashProtocolFile
callCommandCompat :: String -> IO ()
callCommandCompat command = do
exitCode <- system command
case exitCode of
ExitSuccess -> return ()
failure@ExitFailure{} -> exitWith failure