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