shake-0.17: src/Test/Batch.hs
module Test.Batch(main) where
import Development.Shake
import Development.Shake.FilePath
import System.Directory
import General.Extra
import Test.Type
import Control.Monad
main = testBuild test $ do
let inp x = x -<.> "in"
file <- newResource "log.txt" 1
batch 3 ("*.out" %>) (\out -> do need [inp out]; return out) $ \outs -> do
liftIO $ assertBool (length outs <= 3) "length outs <= 3"
withResource file 1 $ liftIO $ appendFile "log.txt" $ show (length outs) ++ "\n"
putNormal $ "Building batch: " ++ unwords outs
forM_ outs $ \out -> liftIO $ copyFile (inp out) out
want [show i <.> "out" | i <- [1..6]]
"ABn.txt" %> \out -> do
xs <- needHasChanged ["An.txt", "Bn.txt"]
writeFileLines out xs
["An", "Bn"] &?%> \outs -> do
xs <- needHasChanged $ map (-<.> "in") outs
os <- mapM resultHasChanged outs
forM_ (zip outs os) $ \(out, o) ->
when (o || (out -<.> "in" `elem` xs)) $
writeFile' out "1"
"On" %> \out -> do
xs <- needHasChanged ["An", "Bn"]
o <- resultHasChanged out
writeFileLines out $ xs ++ ["On" | o]
test build = do
forM_ [1..6] $ \i -> writeFile (show i <.> "in") $ show i
build ["--sleep","-j2"]
assertBoolIO (do src <- readFile "log.txt"; return $ length (lines src) < 6) "some batching"
writeFile "log.txt" ""
writeFile "2.in" "22"
writeFile "5.in" "55"
build []
assertContents "log.txt" "2\n"
writeFile "An.txt" "1"
writeFile "Bn.txt" "1"
build ["ABn.txt", "--sleep"]
assertContents "ABn.txt" "An.txt\nBn.txt\n"
writeFile "An.txt" "1"
build ["ABn.txt", "--sleep"]
assertContents "ABn.txt" "An.txt\n"
writeFile "Bn.txt" "1"
build ["ABn.txt", "--sleep"]
assertContents "ABn.txt" "Bn.txt\n"
build ["ABn.txt", "--sleep"]
assertContents "ABn.txt" "Bn.txt\n"
writeFile "ABn.txt" "bogus"
build ["ABn.txt", "--sleep"]
assertContents "ABn.txt" ""
forM_ [[],["--usepredicate"]] $ \args -> do
writeFile "An.in" "1"
writeFile "Bn.in" "1"
removeFile_ "On"
build $ ["On", "--sleep"] ++ args
assertContents "On" "An\nBn\nOn\n"
writeFile "An.in" "1"
build $ ["On", "--sleep"] ++ args
assertContents "On" "An\n"
writeFile "Bn.in" "1"
build $ ["On", "--sleep"] ++ args
assertContents "On" "Bn\n"
build $ ["On", "--sleep"] ++ args
assertContents "On" "Bn\n"
removeFile "An"
build $ ["On", "--sleep"] ++ args
assertContents "On" "An\n"
removeFile "An"
writeFile "Bn.in" "2"
build $ ["On", "--sleep"] ++ args
assertContents "On" "An\nBn\n"
removeFile "On"
build $ ["On", "--sleep"] ++ args
assertContents "On" "On\n"