hie-bios-0.6.2: tests/ParserTests.hs
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Test.Tasty
import Test.Tasty.HUnit
import HIE.Bios.Config
import qualified Data.HashMap.Strict as Map
import Data.Void
import Data.Yaml
import qualified Data.Text as T
import System.FilePath
import Control.Applicative ( (<|>) )
configDir :: FilePath
configDir = "tests/configs"
main :: IO ()
main = defaultMain $
testCase "Parser Tests" $ do
assertParser "cabal-1.yaml" (noDeps (Cabal (Just "lib:hie-bios")))
assertParser "stack-config.yaml" (noDeps (Stack Nothing))
--assertParser "bazel.yaml" (noDeps Bazel)
assertParser "bios-1.yaml" (noDeps (Bios (Program "program") Nothing Nothing))
assertParser "bios-2.yaml" (noDeps (Bios (Program "program") (Just (Program "dep-program")) Nothing))
assertParser "bios-3.yaml" (noDeps (Bios (Command "shellcommand") Nothing Nothing))
assertParser "bios-4.yaml" (noDeps (Bios (Command "shellcommand") (Just (Command "dep-shellcommand")) Nothing))
assertParser "bios-5.yaml" (noDeps (Bios (Command "shellcommand") (Just (Program "dep-program")) Nothing))
assertParser "dependencies.yaml" (Config (CradleConfig ["depFile"] (Cabal (Just "lib:hie-bios"))))
assertParser "direct.yaml" (noDeps (Direct ["list", "of", "arguments"]))
assertParser "none.yaml" (noDeps None)
--assertParser "obelisk.yaml" (noDeps Obelisk)
assertParser "multi.yaml" (noDeps (Multi [("./src", CradleConfig [] (Cabal (Just "lib:hie-bios")))
, ("./test", CradleConfig [] (Cabal (Just "test")) ) ]))
assertParser "cabal-multi.yaml" (noDeps (CabalMulti [("./src", "lib:hie-bios")
,("./", "lib:hie-bios")]))
assertParser "stack-multi.yaml" (noDeps (StackMulti [("./src", "lib:hie-bios")
,("./", "lib:hie-bios")]))
assertParser "nested-cabal-multi.yaml" (noDeps (Multi [("./test/testdata", CradleConfig [] None)
,("./", CradleConfig [] (
CabalMulti [("./src", "lib:hie-bios")
,("./tests", "parser-tests")]))]))
assertParser "nested-stack-multi.yaml" (noDeps (Multi [("./test/testdata", CradleConfig [] None)
,("./", CradleConfig [] (
StackMulti [("./src", "lib:hie-bios")
,("./tests", "parser-tests")]))]))
assertCustomParser "ch-cabal.yaml"
(noDeps (Other CabalHelperCabal $ simpleCabalHelperYaml "cabal"))
assertCustomParser "ch-stack.yaml"
(noDeps (Other CabalHelperStack $ simpleCabalHelperYaml "stack"))
assertCustomParser "multi-ch.yaml"
(noDeps (Multi
[ ("./src", CradleConfig [] (Other CabalHelperStack $ simpleCabalHelperYaml "stack"))
, ("./input", CradleConfig [] (Other CabalHelperCabal $ simpleCabalHelperYaml "cabal"))
, ("./test", CradleConfig [] (Cabal (Just "test")))
, (".", CradleConfig [] None)
]))
assertParser :: FilePath -> Config Void -> Assertion
assertParser fp cc = do
conf <- readConfig (configDir </> fp)
(conf == cc) @? (unlines [("Parser Failed: " ++ fp)
, "Expected: " ++ show cc
, "Actual: " ++ show conf ])
assertCustomParser :: FilePath -> Config CabalHelper -> Assertion
assertCustomParser fp cc = do
conf <- readConfig (configDir </> fp)
(conf == cc) @? (unlines [("Parser Failed: " ++ fp)
, "Expected: " ++ show cc
, "Actual: " ++ show conf ])
noDeps :: CradleType a -> Config a
noDeps c = Config (CradleConfig [] c)
-- ------------------------------------------------------------------
data CabalHelper
= CabalHelperCabal
| CabalHelperStack
deriving (Show, Eq)
instance FromJSON CabalHelper where
parseJSON (Object o)
| Just obj <- Map.lookup "cabal-helper" o = chCabal obj <|> chStack obj
where
chCabal (Object val)
| Just _val <- Map.lookup "cabal" val = return CabalHelperCabal
chCabal _ = fail "CH: not a cabal cradle."
chStack (Object val)
| Just _val <- Map.lookup "stack" val = return CabalHelperStack
chStack _ = fail "CH: not a stack cradle."
parseJSON _ = fail "Not a valid cabal-helper specification"
simpleCabalHelperYaml :: T.Text -> Value
simpleCabalHelperYaml tool =
object
[ ( "cabal-helper", object
[ (tool, Null)
]
)
]