packages feed

dynamic-cabal-0.3: 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.HUnit
import           Test.Tasty.HUnit
import           Test.Tasty.TH

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" $ all (null . 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 "map size" 3 (DM.size m)
  -- print m

-- | the raw query source code
src :: IO String
src=do
  setupConfig' <- canonicalizePath "dist/setup-config"
  cv<-getCabalVersion setupConfig'
  let optStr=if cv>=Version [1,15,0] []
               then "       let opts=renderGhcOptions ((fst $ head $ readP_to_S  parseVersion  \"7.6.3\") :: Version) $ componentGhcOptions V.silent lbi b clbi \"dist/build\""
               else "       let opts=ghcOptions lbi b clbi \"dist/build\""
  return $ unlines [
    "module DynamicCabalQuery where"
    ,"import Distribution.PackageDescription"
    ,"import Distribution.Simple.LocalBuildInfo"
    ,"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"
    ,"import Distribution.Version"
    ,"import Control.Monad"
    ,""
    ,"result :: IO (DM.Map String [String])"
    ,"result=do"
    ,"lbi<-liftM (read . Prelude.unlines . drop 1 . lines) $ Prelude.readFile \""++setupConfig' ++"\""
    ,"let pkg=localPkgDescr lbi"
    ,"r<-newIORef DM.empty"
    ,"withComponentsLBI pkg lbi (\\c clbi->do"
    ,"       let b=foldComponent libBuildInfo buildInfo testBuildInfo benchmarkBuildInfo c"
    ,optStr 
    ,"       let n=foldComponent (const \"\") exeName testName benchmarkName c"
    ,"       modifyIORef r (DM.insert n opts)"
    ,"       return ()"
    ,"       )"
    ,"readIORef r" ]



main :: IO ()
main = $(defaultMainGenerator)