shake-0.17: src/Test/Version.hs
{-# LANGUAGE TypeFamilies, GeneralizedNewtypeDeriving, DeriveDataTypeable #-}
module Test.Version(main) where
import Development.Shake
import Development.Shake.Classes
import General.GetOpt
import Text.Read.Extra
import Test.Type
newtype Opts = Ver Int
opts = [Option "" ["ver"] (ReqArg (fmap Ver . readEither) "INT") ""]
newtype Oracle = Oracle ()
deriving (Show,Eq,Hashable,Binary,NFData,Typeable)
type instance RuleResult Oracle = Int
main = testBuildArgs test opts $ \opts -> do
want ["foo.txt","ver.txt","oracle.txt"]
"foo.txt" %> \file -> liftIO $ appendFile file "x"
let ver = head $ [x | Ver x <- opts] ++ [0]
versioned ver $ "ver.txt" %> \out -> liftIO $ appendFile out $ show ver
versioned ver $ addOracleCache $ \(Oracle ()) -> do
liftIO $ appendFile "oracle.in" $ show ver
return $ ver `mod` 2
"oracle.txt" %> \out -> do
v <- askOracle $ Oracle ()
liftIO $ appendFile out $ show v
test build = do
writeFile "foo.txt" ""
v1 <- getHashedShakeVersion ["foo.txt"]
writeFile "foo.txt" "y"
v2 <- getHashedShakeVersion ["foo.txt"]
assertBool (v1 /= v2) "Hashes must not be equal"
build ["clean"]
build []
assertContents "foo.txt" "x"
build ["--rule-version=new"]
assertContents "foo.txt" "xx"
build ["--rule-version=new"]
assertContents "foo.txt" "xx"
build ["--rule-version=extra","--silent"]
assertContents "foo.txt" "xxx"
build ["--rule-version=more","--no-rule-version"]
assertContents "foo.txt" "xxx"
build ["--rule-version=more"]
assertContents "foo.txt" "xxx"
build ["--rule-version=final","--silent"]
assertContents "foo.txt" "xxxx"
build ["clean"]
build []
assertContents "ver.txt" "0"
assertContents "foo.txt" "x"
build ["--ver=0","--silent"]
assertContents "ver.txt" "0"
build ["--ver=8"]
build ["--ver=9","--silent"]
build ["--ver=9","--silent"]
build ["--ver=3","--silent"]
assertContents "ver.txt" "0893"
assertContents "oracle.in" "0893"
-- when you change version you don't do cutoff
assertContents "oracle.txt" "0011"
assertContents "foo.txt" "x"