language-puppet-1.4.1: tests/Parser/ExprSpec.hs
{-# LANGUAGE OverloadedLists #-}
module Parser.ExprSpec (spec) where
import Test.Hspec
import Test.Hspec.Megaparsec
import Text.Megaparsec
import Puppet.Parser
import Puppet.Parser.Internal
import XPrelude
expressions :: [(Text, Expression)]
expressions =
[ ("5 + 3 * 2", 5 + 3 * 2)
, ("5+2 == 7", Equal (5 + 2) 7)
, ("include(foo::bar)", Terminal (UFunctionCall "include" ["foo::bar"] ))
, ("$y ? {\
\ undef => 'undef',\
\ default => 'default',\
\ }", ConditionalValue (Terminal (UVariableReference "y"))
[ SelectorValue UUndef :!: Terminal (UString "undef")
, SelectorDefault :!: Terminal (UString "default")])
, ("$x", Terminal (UVariableReference "x"))
, ("x($y)", Terminal (UFunctionCall "x" [ Terminal (UVariableReference "y") ]))
, ("\"$\"", Terminal (UInterpolable [Terminal (UString "$")]))
, ("\"${x}\"", Terminal (UInterpolable [Terminal (UVariableReference "x")]))
, ("$x[ 3 ]", Lookup (Terminal (UVariableReference "x")) (Terminal (UNumber 3)))
, ("\"${ os[ 'architecture' ]}\"", Terminal (UInterpolable [Lookup (Terminal (UVariableReference "os")) (Terminal (UString "architecture"))]))
, ("\"${facts['os']['architecture']}\"", Terminal (UInterpolable [Lookup (Lookup (Terminal (UVariableReference "facts")) (Terminal (UString "os"))) (Terminal (UString "architecture"))]))
, ("\"${x[$y]}\"", Terminal (UInterpolable [Lookup (Terminal (UVariableReference "x")) (Terminal (UVariableReference "y")) ]))
, ("\"${x($y)}\"", Terminal (UInterpolable [ Terminal (UFunctionCall "x" [ Terminal (UVariableReference "y") ] ) ] ))
, ("\"${x($y)}$'\"", Terminal (UInterpolable [ Terminal (UFunctionCall "x" [ Terminal (UVariableReference "y") ])
, Terminal (UString "$"),Terminal (UString "'")]))
]
invalid :: [Text]
invalid = [ "$os['name]"
-- pending
-- , "$os ['name']"
-- interpolation
, "\"${os['name]}\""
, "\"${os[name}\""
, "\"${os[name]\""
]
testExpression (t,e) = it ("should parse " <> toS t) $ parse (expression <* eof) "" t `shouldParse` e
testInvalid s = it ("rejects " <> toS s) $ shouldFailOn (parse (expression <* eof) "") s
spec = do
describe "Expression parser" $ mapM_ testExpression expressions
describe "Invalid expression" $ mapM_ testInvalid invalid