1 2module Test.Digest(main) where 3 4import Control.Monad 5import Development.Shake 6import Test.Type 7 8 9main = testBuild test $ do 10 want ["Out.txt","Out2.txt"] 11 12 "Out.txt" %> \out -> do 13 txt <- readFile' "In.txt" 14 liftIO $ appendFile out txt 15 16 ["Out1.txt","Out2.txt"] &%> \[out1,out2] -> do 17 txt <- readFile' "In.txt" 18 liftIO $ appendFile out1 txt 19 liftIO $ appendFile out2 txt 20 21 ["Bug1.txt","Bug2.txt"] &%> \[out1,out2] -> do 22 need ["Bug3.txt"] 23 writeFile' out1 "X" 24 writeFile' out2 "Y" 25 26 "leaf" ~> pure () 27 "node1.txt" %> \file -> do need ["leaf"]; writeFile' file "x" 28 "node2.txt" %> \file -> do need ["node1.txt"]; liftIO $ appendFile file "x" 29 30 ["rewrite1","rewrite2"] &%> \outs -> do 31 alwaysRerun 32 forM_ outs $ \out -> writeFile' out "rewrite" 33 34 35test build = do 36 let outs = ["Out.txt","Out1.txt","Out2.txt"] 37 let writeOut x = forM_ outs $ \out -> writeFile out x 38 let writeIn = writeFile "In.txt" 39 let assertOut x = forM_ outs $ \out -> assertContents out x 40 41 writeOut "" 42 writeIn "X" 43 build ["--sleep","--digest-and"] 44 assertOut "X" 45 46 -- should not involve a hash calculation (sadly no way to test that) 47 build ["--sleep","--digest-and"] 48 assertOut "X" 49 50 writeIn "X" 51 build ["--sleep","--digest-and"] 52 assertOut "X" 53 54 writeIn "X" 55 build ["--sleep","--digest-or"] 56 assertOut "XX" 57 58 writeIn "X" 59 build ["--sleep","--digest-and"] 60 assertOut "XX" 61 62 build ["--sleep","--digest-and"] 63 writeOut "XX" 64 build ["--sleep","--digest-and"] 65 assertOut "XX" 66 67 build ["--sleep","--digest-and"] 68 writeOut "Y" 69 build ["--sleep","--digest-and"] 70 assertOut "YX" 71 72 writeIn "X" 73 build ["--sleep","--digest"] 74 assertOut "YX" 75 76 writeIn "Z" 77 build ["--sleep","--digest-and-input"] 78 assertOut "YXZ" 79 80 build ["--sleep","--digest-and-input"] 81 writeOut "YXZ" 82 build ["--sleep","--digest-and-input"] 83 assertOut "YXZZ" 84 85 writeIn "Q" 86 build ["--sleep","--digest-and-input"] 87 assertOut "YXZZQ" 88 89 writeIn "Q" 90 build ["--sleep","--digest-and-input"] 91 assertOut "YXZZQ" 92 93 -- test for #218 94 forM_ [("--digest",1),("--digest-and",1),("--digest-or",2),("--digest-and-input",2),("",2)] $ \(flag,count) -> do 95 writeFile "node2.txt" "y" 96 replicateM_ 2 $ build $ ["node2.txt","--sleep"] ++ [flag | flag /= ""] 97 assertContents "node2.txt" $ 'y' : replicate count 'x' 98 99 -- test for #296 100 writeFile "Bug3.txt" "X" 101 build ["--digest-and-input","Bug1.txt","--sleep"] 102 writeFile "Bug3.txt" "Y" 103 build ["--digest-and-input","Bug1.txt","--lint"] 104 105 -- test for #427 106 build ["rewrite1","--digest-and"] 107 build ["rewrite1","--digest-and","--lint","--sleep"] 108