katt-0.2.0.3: katt-tests/src/TestSourceHandler.hs
module Main where
import Control.Applicative ((<$>))
import Control.Monad (liftM2)
import Data.List (subsequences)
import Data.Monoid ((<>))
import System.Exit (exitFailure, exitSuccess)
import System.Directory (getDirectoryContents)
import System.IO (hPutStrLn, stderr)
import Utils.Katt.SourceHandler
import Utils.Katt.Utils
main :: IO ()
main = do
res <- verifyLanguages
if res then exitSuccess else exitFailure
-- Given a set of source files, categorized into folders corresponding to all supported languages.
-- Test the following things:
-- (1) That the corresponding languages are actually identified correctly, also when intermixed.
-- (2) That all main method classes are identified correctly in the case of java and python
languages :: [(KattisLanguage, String)]
languages = [(LangCplusplus, "c++"), (LangC, "c"), (LangJava, "java")]
testDir :: String
testDir = "katt-tests/data/sample_submissions/"
verifyLanguages :: IO Bool
verifyLanguages = and <$> mapM (\lang -> liftM2 (&&) (verifyLanguage lang) (verifyMain lang)) languages
where
verifyMain info@(LangJava, folder) = do
tests <- getFileNamesSimple $ testDir <> folder
res <- mapM (\test -> findMainClass ([test], fst info)) tests
if Nothing `notElem` res then return True else do
hPutStrLn stderr $ "Failed to verify SourceHandler: main class for language " <> show (fst info)
return False
verifyMain _ = return True
verifyLanguage (identifier, folder)= do
tests <- getFileNames $ testDir <> folder
let res = map determineLanguage tests
if Nothing `notElem` res then return True else do
hPutStrLn stderr $ "Failed to verify SourceHandler: language " <> show identifier
return False
filterNonFiles = filter (`notElem` [".", ".."])
addFolder folder = map ((folder <> "/") <>)
getFileNames folder = map (addFolder folder) <$> files
where files = map filterNonFiles . drop 1 . subsequences
<$> getDirectoryContents folder
getFileNamesSimple folder = addFolder folder <$> files
where files = filterNonFiles <$> getDirectoryContents folder