| -- Copyright : (c) Data61 2018-2019 |
| -- Commonwealth Science and Research Organisation (CSIRO) |
| -- ABN 41 687 119 230 |
| -- License : BSD3 |
| -- |
| module Example where |
| import System.Posix.Redirect |
| import System.FilePath |
| import System.Directory |
| import qualified Minigent.CLI as CLI |
| import qualified Data.ByteString.Char8 as B |
| import Control.Exception |
| import System.Console.ANSI |
| import Control.Monad.Except |
| import System.Exit |
| import Data.Char |
| |
| trim, ltrim, rtrim :: B.ByteString -> B.ByteString |
| trim = ltrim . rtrim |
| ltrim s | Just (x, s') <- B.uncons s, isSpace x = ltrim s' |
| | otherwise = s |
| rtrim s | Just (s', x) <- B.unsnoc s, isSpace x = rtrim s' |
| | otherwise = s |
| |
| updateExpected :: FilePath -> IO () |
| updateExpected f = do |
| phase <- loadConfig |
| let compile = CLI.compiler phase [CLI.Dump phase CLI.Stdout CLI.PrettyPlain, CLI.NoColour] [f </> "in.minigent"] |
| (out', (err', _)) <- redirectStdout (redirectStderr (blockExceptions compile)) |
| let out = trim out' |
| err = trim err' |
| B.writeFile (f </> "expected.out") out |
| B.writeFile (f </> "expected.err") err |
| putStrLn $ "Writing files to " ++ f |
| where |
| |
| loadConfig :: IO CLI.Phase |
| loadConfig = do |
| b <- doesFileExist (f </> "config") |
| contents <- if b then readFile (f </> "config") else pure "" |
| v <- runExceptT (CLI.parsePhase contents) |
| pure $ case v of |
| Left _ -> CLI.TC |
| Right p -> p |
| |
| blockExceptions :: IO a -> IO (Either SomeException a) |
| blockExceptions = try |
| |
| example :: FilePath -> IO () |
| example f = do |
| phase <- loadConfig |
| let compile = CLI.compiler phase [CLI.Dump phase CLI.Stdout CLI.PrettyPlain, CLI.NoColour] [f </> "in.minigent"] |
| (out', (err', _)) <- redirectStdout (redirectStderr (blockExceptions compile)) |
| let out = trim out' |
| err = trim err' |
| expectedErr <- trim <$> readIfExists (f </> "expected.err") |
| expectedOut <- trim <$> readIfExists (f </> "expected.out") |
| when (expectedErr /= err) $ do |
| setSGR [SetColor Foreground Vivid Red] |
| putStrLn ("Failed: " ++ f) |
| putStrLn "Standard error output differed from expectations. The compiler produced:" |
| setSGR [SetColor Foreground Vivid Cyan] |
| B.putStrLn err |
| setSGR [SetColor Foreground Vivid Red] |
| putStrLn "But the test expects:" |
| setSGR [SetColor Foreground Vivid Magenta] |
| B.putStrLn expectedErr |
| setSGR [Reset] |
| exitFailure |
| when (expectedOut /= out) $ do |
| setSGR [SetColor Foreground Vivid Red] |
| putStrLn ("Failed: " ++ f) |
| putStrLn "Standard output differed from expectations. The compiler produced:" |
| setSGR [SetColor Foreground Vivid Cyan] |
| B.putStrLn out |
| setSGR [SetColor Foreground Vivid Red] |
| putStrLn "But the test expects:" |
| setSGR [SetColor Foreground Vivid Magenta] |
| B.putStrLn expectedOut |
| setSGR [Reset] |
| exitFailure |
| setSGR [SetColor Foreground Vivid Green] |
| putStrLn ("Passed: " ++ f) |
| setSGR [Reset] |
| return () |
| |
| where |
| |
| loadConfig :: IO CLI.Phase |
| loadConfig = do |
| b <- doesFileExist (f </> "config") |
| contents <- if b then readFile (f </> "config") else pure "" |
| v <- runExceptT (CLI.parsePhase contents) |
| pure $ case v of |
| Left _ -> CLI.TC |
| Right p -> p |
| |
| blockExceptions :: IO a -> IO (Either SomeException a) |
| blockExceptions = try |
| |
| readIfExists :: FilePath -> IO B.ByteString |
| readIfExists fp = do |
| b <- doesFileExist fp |
| if b then B.readFile fp else pure mempty |