module Main where import LLVM.Context import LLVM.Pretty (ppllvm) import qualified LLVM.Module as M import Control.Monad (filterM) import Control.Monad.Except import Data.Functor import qualified Data.Text.Lazy as T import qualified Data.Text.Lazy.IO as T import System.IO import System.Exit import System.Directory import System.FilePath import System.Environment import Test.Tasty import Test.Tasty.HUnit ------------------------------------------------------------------------------- -- Harness ------------------------------------------------------------------------------- llvmFile :: FilePath -> IO Bool llvmFile fname = do str <- readFile fname withContext $ \ctx -> do res <- M.withModuleFromLLVMAssembly ctx str $ \mod -> do ast <- M.moduleAST mod let str = ppllvm ast T.writeFile ("tests/output" takeFileName fname) str trip <- M.withModuleFromLLVMAssembly ctx (T.unpack str) (const $ return ()) {-T.putStrLn str-} pure () return True makeTest :: FilePath -> TestTree makeTest fname = testCase fname $ assert (llvmFile fname) testPath :: FilePath testPath = "tests/input/" suite :: IO TestTree suite = do dirFiles <- listDirectory testPath let testFiles = fmap (\x -> testPath x) dirFiles pure $ testGroup "Test Suite" [ testGroup "Roundtrip Tests" $ fmap makeTest testFiles ] main :: IO () main = defaultMain =<< suite