packages feed

dynamic-cabal-0.3.4: tests/Main.hs

{-# 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)