{-# LANGUAGE TemplateHaskell, ScopedTypeVariables #-}
import Data.List
import qualified Data.Map as DM
import Data.Version
import Distribution.Client.Dynamic
import System.Directory
import Test.Tasty.HUnit
import Test.Tasty.TH
import qualified Config
case_targets :: Assertion
case_targets = do
tgs <- runQuery (on localPkgDesc targets) "dist/setup-config"
assertEqual "target names"
(sort
[ Library
[ "Distribution.Client.Dynamic"
, "Distribution.Client.Dynamic.Query"
, "Distribution.Client.Dynamic.LocalBuildInfo"
, "Distribution.Client.Dynamic.PackageDescription"
]
, TestSuite "dynamic-cabal-tests" (Just "Main.hs")
, TestSuite "doctests" (Just "doctests.hs")
])
(sort $ map info tgs)
assertEqual "source directories" (sort $ map sourceDirs tgs) $ sort $ map return ["src", "tests", "tests"]
assertBool "ghc options" $ all (elem "-Wall" . ghcOptions) tgs
assertBool "no extensions (except TH)" $ all (not . any ("TemplateHaskell" /=) . extensions) tgs
assertBool "everything buildable" $ all buildable tgs
assertBool "no cpp options" $ all (null . cppOptions) tgs
case_packageDBs :: Assertion
case_packageDBs = do
dbs <- runQuery packageDBs "dist/setup-config"
length dbs `seq` return ()
-- | test running raw query
case_raw :: Assertion
case_raw = do
s <- src
m :: DM.Map String [String] <- runRawQuery s "dist/setup-config"
assertEqual "number of build targets" 3 (DM.size m)
-- | the raw query source code
src :: IO String
src = do
distPrefix <- canonicalizePath "dist"
cv <- getCabalVersion (distPrefix ++ "/setup-config")
let optStr1 | cv >= Version [1,19,0] [] ="(compiler,_ ,_) <- configure V.silent Nothing Nothing defaultProgramDb"
| otherwise =""
let optStr | cv >= Version [1,19,0] [] ="renderGhcOptions compiler $ componentGhcOptions V.silent lbi b clbi " ++ show distPrefix
| cv >= Version [1,15,0] [] ="renderGhcOptions ((fst $ head $ readP_to_S parseVersion " ++ show Config.cProjectVersion ++ ") :: Version) $ componentGhcOptions V.silent lbi b clbi \"dist/build\""
| otherwise ="ghcOptions lbi b clbi \"dist/build\""
return $ unlines [
"module DynamicCabalQuery where"
,"import Distribution.PackageDescription"
,"import Distribution.Simple.LocalBuildInfo"
,"import Distribution.Simple.Configure (maybeGetPersistBuildConfig)"
,"import Data.IORef"
,"import qualified Data.Map as DM"
,"import qualified Distribution.Verbosity as V"
,"import Data.Version (parseVersion)"
,"import Text.ParserCombinators.ReadP(readP_to_S)"
,if cv >= Version [1,15,0] [] then "import Distribution.Simple.Program.GHC" else ""
,"import Distribution.Simple.GHC"
,if cv >= Version [1,19,0] [] then "import Distribution.Simple.Program.Db(defaultProgramDb)" else ""
,"import Distribution.Version"
,"import Control.Monad"
,""
,"result :: IO (DM.Map String [String])"
,"result=do"
,"Just lbi<-maybeGetPersistBuildConfig \""++distPrefix ++"\""
,"let pkg=localPkgDescr lbi"
,"r<-newIORef DM.empty"
, optStr1
,(if cv >= Version [1,18,0] [] then "withAllComponentsInBuildOrder" else "withComponentsLBI") ++ " pkg lbi (\\c clbi->do"
," let b=foldComponent libBuildInfo buildInfo testBuildInfo benchmarkBuildInfo c"
," let opts=" ++ optStr ++ "::[String]"
," let n=foldComponent (const \"\") exeName testName benchmarkName c"
," modifyIORef r (DM.insert n opts)"
," return ()"
," )"
,"readIORef r" ]
main :: IO ()
main = $(defaultMainGenerator)