module Main where import Control.Applicative import Control.Arrow (first) import Control.Monad import Data.Maybe import qualified Data.Text as T import Data.Tuple.Strict import qualified Data.Vector as V import Puppet.Parser import Puppet.Parser.PrettyPrinter () import Puppet.Parser.Types import Text.Parser.Combinators testcases :: [(T.Text, Expression)] testcases = [ ("5 + 3 * 2", 5 + 3 * 2) , ("5+2 == 7", Equal (5 + 2) 7) , ("include(foo::bar)", Terminal (UFunctionCall "include" (V.singleton "foo::bar") )) , ("$y ? {\ \ undef => 'undef',\ \ default => 'default',\ \ }", ConditionalValue (Terminal (UVariableReference "y")) (V.fromList [SelectorValue (UString "undef") :!: Terminal (UString "undef") ,SelectorDefault :!: Terminal (UString "default")])) , ("$x", Terminal (UVariableReference "x")) , ("\"${x}\"", Terminal (UInterpolable (V.fromList [Terminal (UVariableReference "x")]))) , ("\"${x[3]}\"", Terminal (UInterpolable (V.fromList [Lookup (Terminal (UVariableReference "x")) 3]))) , ("\"${x[$y]}\"", Terminal (UInterpolable (V.fromList [Lookup (Terminal (UVariableReference "x")) (Terminal (UVariableReference "y")) ]))) ] main :: IO () main = do let testres = map (first (runPParser (expression <* eof) "tests")) testcases isFailure (Left x, _) = Just (show x) isFailure (Right x, e) = if x == e then Nothing else Just ("Expected: " ++ show e ++ "\nActual: " ++ show x) bads = mapMaybe isFailure testres unless (null bads) $ do mapM_ putStrLn bads error "failed"