packages feed

HList-0.4.0.0: examples/runexamples.hs

module Main where

import Cabal
import Control.Exception
import System.FilePath
import Test.Hspec
import System.Exit
import System.Process
import System.Directory
import Data.Maybe
import Control.Monad

main = do
  es <- getDirectoryContents "examples"
  print es
  -- very dumb
  es <- filterM (\e -> allM
    [return (takeExtension e == ".hs"),
     doesFileExist (dropExtension ("examples"</>e) ++ ".ref") ]) es

  print es

  hspec $ do
    mapM_ runghcwith es


runghcwith f = describe f $ it "ok" $
  do
    let ex = ("examples" </>)
    let inFile = ex (takeBaseName f)
        outFile = dropExtension inFile ++ ".out"
        errFile = dropExtension inFile ++ ".err"
        refFile = dropExtension inFile ++ ".ref"

    (ec, stdout, stderr) <- cabal
            ["repl","examples",
              "-v0", "--ghc-options", "-w -fcontext-stack=50 -iexamples -v0"]
              (":set -i\n:set -iexamples\n:load " ++ inFile ++ "\nmain")

    writeFile outFile stdout

    ofe <- doesFileExist refFile
    diff <- if ofe
      then fmap Just $
        readProcess "diff" ["-b", outFile, refFile] ""
          `finally` writeFile errFile stderr
      else return Nothing

    unless (diff == Just "") $ writeFile errFile stderr

    return (ec, stderr, diff)
 `shouldReturn` (ExitSuccess, "", Just "")



allM [] = return True
allM (x:xs) = do
    x <- x
    if x then allM xs else return False