{-# LANGUAGE ScopedTypeVariables #-} module Test.Simple(main) where import Test.Type import Development.Rattle import System.FilePattern.Directory import Development.Shake.FilePath import Control.Exception import System.Directory import System.Info.Extra import Control.Monad.Extra -- Don't run on Mac because of https://github.com/jacereda/fsatrace/issues/25 main = unless isMac $ do let wipe = mapM (ignoreIO . removeFile) =<< getDirectoryFiles "." ["*"] cs <- liftIO $ getDirectoryFiles "." [root "test/C/*.c"] let toO x = takeBaseName x <.> "o" let build = do forM_ cs $ \c -> cmd "gcc -o" [toO c, "-c", c] cmd "gcc -o" ["Main" <.> exe] (map toO cs) cmd ["./Main" <.> exe] putStrLn "Build 1: Expect everything" rattleRun rattleOptions build putStrLn "Getting profiling data" writeProfile rattleOptions $ root ++ "/report.html" (w,s,p) <- graphData rattleOptions putStrLn $ "Work: " ++ show w putStrLn $ "Span: " ++ show s putStrLn $ "Parallelism: " ++ show p putStrLn "Build 2: Expect 1 thing" ignoreIO $ cmd ["sh", "-c", "echo '//comment' >> " ++ root ++ "/test/C/constants.c"] rattleRun rattleOptions build putStrLn "Build 2.5: Expect nothing" rattleRun rattleOptions build wipe putStrLn "Build 3: Expect cached (some speculation)" rattleRun rattleOptions build putStrLn "Build 4: Read/write hazard" handle (\(h :: Hazard) -> print h) $ do rattleRun rattleOptions{rattleSpeculate=Nothing} $ do cmd ["./Main" <.> exe] cmd "gcc -o" ["Main" <.> exe] (reverse $ map toO cs) putStrLn "Hoped it failed, but doesn't always" -- fail "Expected a hazard" putStrLn "Build 5: Rebuild after" rattleRun rattleOptions build putStrLn "Build 6: Rebuild from a different directory" createDirectoryIfMissing True "inner" withCurrentDirectory "inner" $ rattleRun rattleOptions $ withCmdOptions [Cwd ".."] build putStrLn "Build 7: Cause Restartable hazard" rattleRun rattleOptions $ forM_ cs $ \c -> cmd "touch" c -- count as a write putStrLn "Should cause restartable hazard" rattleRun rattleOptions build