json-autotype-1.0.18: test/TestExamples.hs
-- Test over all files in examples/ directory
module Main(main) where
import Control.Monad(forM)
import Data.Char(toUpper)
import Data.Functor ((<$>))
import Data.List(isPrefixOf, isSuffixOf)
import System.Directory(doesDirectoryExist, getDirectoryContents)
import System.FilePath(dropExtension, (</>), (<.>))
import System.Exit(exitSuccess, exitWith, ExitCode(..))
import CommonCLI
-- | <http://book.realworldhaskell.org/read/io-case-study-a-library-for-searching-the-filesystem.html>
getRecursiveContents :: FilePath -> IO [FilePath]
getRecursiveContents topdir = do
ex<-doesDirectoryExist topdir
if ex
then do
names <- getDirectoryContents topdir
let properNames = filter (not . isPrefixOf ".") names
paths <- forM properNames $ \name -> do
let path = topdir </> name
isDirectory <- doesDirectoryExist path
if isDirectory
then getRecursiveContents path
else return [path]
return (concat paths)
else return []
capitalize :: String -> String
capitalize (s:ss) = toUpper s:ss
main :: IO ()
main = do
filenames <- filter (isSuffixOf ".json")
<$> getRecursiveContents "examples"
results <- forM filenames $ \filename -> do
let outputFilename = capitalize (dropExtension filename) <.> "hs"
genResult <- runghc ["GenerateJSONParser.hs", filename, "--outputFilename", outputFilename]
return 0
if genResult == ExitSuccess
then return 0 -- number of failures so far
else do
parserResult <- runghc [outputFilename, filename]
if parserResult == ExitSuccess
then return 0
else return 1
exitCode $ sum results
exitCode :: Int -> IO ()
exitCode 0 = exitSuccess
exitCode n = exitWith $ ExitFailure n