2014-08-03 14:17:43 +02:00
|
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module ParserTests (tests) where
|
|
|
|
|
|
|
|
import Test.Tasty
|
|
|
|
import Test.Tasty.HUnit
|
|
|
|
import Test.Tasty.TH
|
2014-08-05 21:23:28 +02:00
|
|
|
import Data.Text (pack)
|
2014-08-03 14:17:43 +02:00
|
|
|
|
|
|
|
import Nix.Types
|
|
|
|
import Nix.Parser
|
|
|
|
|
|
|
|
case_constant_int :: Assertion
|
2014-08-05 21:23:28 +02:00
|
|
|
case_constant_int = assertParseString "234" $ mkInt 234
|
|
|
|
|
|
|
|
case_constant_bool :: Assertion
|
|
|
|
case_constant_bool = do
|
|
|
|
assertParseString "true" $ mkBool True
|
|
|
|
assertParseString "false" $ mkBool False
|
2014-08-03 14:17:43 +02:00
|
|
|
|
|
|
|
case_simple_set :: Assertion
|
|
|
|
case_simple_set = assertParseString "{ a = 23; b = 4; }" $ Fix $ NSet NonRec
|
2014-08-13 19:33:19 +02:00
|
|
|
[ NamedVar (mkSym "a") $ mkInt 23
|
|
|
|
, NamedVar (mkSym "b") $ mkInt 4
|
2014-08-03 14:17:43 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
case_int_list :: Assertion
|
|
|
|
case_int_list = assertParseString "[1 2 3]" $ Fix $ NList
|
2014-08-05 21:23:28 +02:00
|
|
|
[ mkInt i | i <- [1,2,3] ]
|
2014-08-03 14:17:43 +02:00
|
|
|
|
|
|
|
case_int_null_list :: Assertion
|
|
|
|
case_int_null_list = assertParseString "[1 2 3 null 4]" $ Fix (NList (map (Fix . NConstant) [NInt 1, NInt 2, NInt 3, NNull, NInt 4]))
|
|
|
|
|
|
|
|
case_simple_lambda :: Assertion
|
2014-08-13 19:48:38 +02:00
|
|
|
case_simple_lambda = assertParseString "a: a" $ Fix (NAbs (Fix $ NArgs $ FormalName "a") (mkSym "a"))
|
2014-08-03 14:17:43 +02:00
|
|
|
|
|
|
|
case_lambda_app_int :: Assertion
|
2014-08-05 21:23:28 +02:00
|
|
|
case_lambda_app_int = assertParseString "(a: a) 3" $ Fix (NApp lam int) where
|
|
|
|
int = mkInt 3
|
2014-08-13 19:48:38 +02:00
|
|
|
lam = Fix (NAbs (Fix $ NArgs $ FormalName "a") asym)
|
2014-08-05 21:23:28 +02:00
|
|
|
asym = mkSym "a"
|
2014-08-03 14:17:43 +02:00
|
|
|
|
|
|
|
case_simple_let :: Assertion
|
|
|
|
case_simple_let = assertParseString "let a = 4; in a" $ Fix (NLet binds asym) where
|
2014-08-13 19:33:19 +02:00
|
|
|
binds = [NamedVar asym $ mkInt 4]
|
2014-08-05 21:23:28 +02:00
|
|
|
asym = mkSym "a"
|
2014-08-03 14:17:43 +02:00
|
|
|
|
2014-08-03 16:45:34 +02:00
|
|
|
case_identifier_special_chars :: Assertion
|
|
|
|
case_identifier_special_chars = do
|
2014-08-05 21:23:28 +02:00
|
|
|
assertParseString "_a" $ mkSym "_a"
|
|
|
|
assertParseString "a_b" $ mkSym "a_b"
|
|
|
|
assertParseString "a'b" $ mkSym "a'b"
|
|
|
|
assertParseString "a''b" $ mkSym "a''b"
|
|
|
|
assertParseString "a-b" $ mkSym "a-b"
|
|
|
|
assertParseString "a--b" $ mkSym "a--b"
|
|
|
|
assertParseString "a12a" $ mkSym "a12a"
|
2014-08-03 16:45:34 +02:00
|
|
|
assertParseFail ".a"
|
|
|
|
assertParseFail "'a"
|
|
|
|
|
2014-08-05 21:23:28 +02:00
|
|
|
makeStringParseTest :: String -> Assertion
|
|
|
|
makeStringParseTest str = assertParseString ("\"" ++ str ++ "\"") $ mkStr $ pack str
|
|
|
|
|
|
|
|
case_simple_string :: Assertion
|
|
|
|
case_simple_string = mapM_ makeStringParseTest ["abcdef", "a", "A"]
|
|
|
|
|
|
|
|
case_string_dollar :: Assertion
|
|
|
|
case_string_dollar = mapM_ makeStringParseTest ["a$b", "a$$b", "$cdef", "gh$i"]
|
|
|
|
|
|
|
|
case_string_escape :: Assertion
|
|
|
|
case_string_escape = assertParseString "\"\\$\\n\\t\\r\\\\\"" $ mkStr "$\n\t\r\\"
|
|
|
|
|
|
|
|
case_if :: Assertion
|
|
|
|
case_if = do
|
|
|
|
assertParseString "if true then true else false" $ Fix $ NIf (mkBool True) (mkBool True) (mkBool False)
|
|
|
|
assertParseFail "if true then false"
|
|
|
|
assertParseFail "else"
|
|
|
|
assertParseFail "if true then false else"
|
|
|
|
assertParseFail "if true then false else false else"
|
|
|
|
assertParseFail "1 + 2 then"
|
|
|
|
|
2014-08-03 14:17:43 +02:00
|
|
|
tests :: TestTree
|
|
|
|
tests = $testGroupGenerator
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
assertParseString :: String -> NExpr -> Assertion
|
|
|
|
assertParseString str expected = case parseNixString str of
|
|
|
|
Success actual -> assertEqual ("When parsing " ++ str) expected actual
|
|
|
|
Failure err -> assertFailure $ "Unexpected error parsing `" ++ str ++ "':\n" ++ show err
|
2014-08-03 16:45:34 +02:00
|
|
|
|
|
|
|
assertParseFail :: String -> Assertion
|
|
|
|
assertParseFail str = case parseNixString str of
|
|
|
|
Failure _ -> return ()
|
|
|
|
Success r -> assertFailure $ "Unexpected success parsing `" ++ str ++ ":\nParsed value:" ++ show r
|