module Main where
import System.FilePath.Glob
import Control.Monad.Error
import Puppet.DSL.Loader
import Puppet.DSL.Types
import Puppet.Interpreter.Catalog
import Puppet.Interpreter.Types
import Puppet.NativeTypes
import qualified Data.Map as Map
import Data.Either
import Data.List
import Text.Parsec.Pos
import qualified Data.Text as T
getstatement :: Map.Map (TopLevelType, T.Text) Statement -> TopLevelType -> T.Text -> IO (Either String Statement)
getstatement stmtlist toplevel name = case (Map.lookup (toplevel, name) stmtlist) of
Just x -> return $ Right x
Nothing -> return $ Left "not found"
gettemplate :: Either T.Text T.Text -> T.Text -> c -> IO (Either String T.Text)
gettemplate (Right n) _ _ = return $ Right n
gettemplate (Left n) _ _ = return $ Right n
main :: IO ()
main = do
filelist <- globDir [compile "*.pp"] "test/interpreter" >>= return . head . fst
testres <- mapM testinterpreter filelist
let testsrs = map fst testres
isgood = and $ map snd testres
outlist = zip [1..(length testres)] testsrs
mapM_ (\(n,t) -> putStrLn $ show n ++ " " ++ t) outlist
if (isgood)
then return ()
else error "fail"
pdb :: b -> c -> IO (Either String a)
pdb _ _ = return $ Left "No puppetdb"
testinterpreter :: FilePath -> IO (String, Bool)
testinterpreter fp = do
parsed <- runErrorT (parseFile fp)
case parsed of
Left err -> return (err, False)
Right p -> do
let facts = Map.fromList [("::hostname",ResolvedString "test"), ("::fqdn", ResolvedString "fqdn")]
toplevels = map convertTopLevel p
oktoplevels = rights toplevels
othertoplevels = lefts toplevels
topclass = ClassDeclaration "::" Nothing [] othertoplevels (initialPos fp)
stmtpmap :: Map.Map (TopLevelType, T.Text) Statement
stmtpmap = foldl' (\mp (ttype,tname,ts) -> Map.insert (ttype,tname) (TopContainer [(T.pack fp, topclass)] ts) mp) Map.empty oktoplevels
ctlg <- getCatalog (getstatement stmtpmap) gettemplate pdb "test" facts (Just "test/modules") baseNativeTypes
print ctlg
case ctlg of
(Right _, _) -> return ("PASS", True)
(Left x, y) -> error x