-- | Testing module
module Tests
( runIlTests ) where
import Il.Lexer
import Il.Parser
import Defs.Util
import Defs.AST
import Analyzer
import Typechecker
import Control.DeepSeq
import System.FilePath.Posix
import Control.Exception
import Data.List
import System.Directory
import Prelude hiding (lex, catch)
-- | Runs all Il tests
runIlTests :: IO ()
runIlTests = listFiles "Il/tests/" >>= runTestFiles
-- | Run all test files given by filenames
runTestFiles :: [FilePath] -> IO()
runTestFiles = mapM_ runTest
-- | Opens a test file and runs the test
runTest :: FilePath -> IO()
runTest name = do
yellowColor
putStrLn $ "Test File " ++ name
resetColor
contents <- readFile name
test contents
-- | Lists all filenames in a given directory
listFiles :: FilePath -> IO [FilePath]
listFiles path = do
allfiles <- getDirectoryContents path
let files = sort $ filter (\s -> last (split "/" s) `notElem` [".", ".."]) allfiles
return $ map (path </>) files
-- | Lexes, parses, analyzes and pretty prints test results
test :: String -> IO()
test src = do
let fns = (parse.lex) src
typechecking fns `catch` handler "\nTyping failed"
analysis fns `catch` handler "\nAnalysis failed"
-- | Tests analysis
analysis :: [Function] -> IO ()
analysis fns = do
printRecommendationFromAnalysis.analyze $ fns
greenColor
putStrLn "Passed"
resetColor
-- | Tests typechecking
typechecking :: [Function] -> IO ()
typechecking fns = mapM_ (\fn -> do
blueColor
deepseq (typecheckF fns fn) (putStrLn "Typed")
resetColor) fns
-- | Handles failing tests
handler :: String -> SomeException -> IO ()
handler msg e = do
redColor
putStrLn msg
print (e :: SomeException)
resetColor