packages feed

rattle-0.2: test/Test/Trace.hs

module Test.Trace(main) where

import Control.Monad
import Data.List.Extra
import Test.Type
import Development.Shake.Command
import System.Directory
import System.FilePath


check got want = do
    want <- mapM canonicalizePath want
    nubOrd got `intersect` want === want

traceWrite :: [FSATrace FilePath] -> [FilePath] -> IO ()
traceWrite ts = check [t | FSAWrite t <- ts]

traceRead :: [FSATrace FilePath] -> [FilePath] -> IO ()
traceRead ts = check [t | FSARead t <- ts]


main =
    forM_ [Nothing, Just Shell] $ \opts -> do
        putStrLn "Check GCC works"
        writeFile "helloworld.h" "#include <stdio.h>\n"
        writeFile "helloworld.c" $ unlines
            ["#include \"helloworld.h\""
            ,"int main(){"
            ,"  printf(\"Hello World!\\n\");"
            ,"  return 0;"
            ,"}"
            ]

        xs <- cmd opts "gcc -c helloworld.c"
        traceRead xs ["helloworld.c","helloworld.h"]
        traceWrite xs ["helloworld.o"]

        xs <- cmd opts "gcc helloworld.o -o helloworld.exe"
        traceRead xs ["helloworld.o"]
        traceWrite xs ["helloworld.exe"]

        xs <- cmd opts $ "." </> "helloworld.exe"
        traceRead xs ["helloworld.exe"]

        putStrLn "Check curl works"
        -- Require the Shell below because of https://github.com/jacereda/fsatrace/issues/28
        xs <- cmd opts Shell "curl -sSL http://example.com/ -o example.txt"
        traceWrite xs ["example.txt"]