egison-pattern-src-haskell-mode-0.1.0.0: test/Language/Egison/Pretty/Pattern/Mode/HaskellSpec.hs
module Language.Egison.Pretty.Pattern.Mode.HaskellSpec
( test_atom_patterns
, test_special_pattern_operators
)
where
import TestImport
import Data.Text ( pack )
import Test.Tasty
import Test.Tasty.HUnit
import Language.Haskell.Exts.Build ( name
, sym
, op
, infixApp
, intE
)
assertPrintExpr :: Expr (QName ()) (Name ()) (Exp ()) -> String -> Assertion
assertPrintExpr e expected = case testPrintExpr e of
Left err -> fail $ show err
Right got ->
assertEqual ("while printing \"" ++ show e ++ "\"") (pack expected) got
uqname :: String -> QName ()
uqname = UnQual () . name
qname :: String -> String -> QName ()
qname modName = Qual () (ModuleName () modName) . name
uqsym :: String -> QName ()
uqsym = UnQual () . sym
qsym :: String -> String -> QName ()
qsym modName = Qual () (ModuleName () modName) . sym
test_atom_patterns :: [TestTree]
test_atom_patterns =
[ testCase "wildcard pattern" $ assertPrintExpr Wildcard "_"
, testCase "variable pattern" $ assertPrintExpr (Variable $ name "x") "$x"
, testCase "variable pattern of symbols"
$ assertPrintExpr (Variable $ sym "%") "$(%)"
, testCase "value pattern" $ assertPrintExpr (Value $ intE 10) "#10"
, testCase "value pattern between parentheses" $ assertPrintExpr
(Value $ infixApp (intE 1) (op $ sym "+") (intE 2))
"#(1 + 2)"
, testCase "predicate pattern" $ assertPrintExpr (Predicate $ intE 10) "?10"
, testCase "constructor pattern" $ assertPrintExpr
(Pattern (uqname "ctor") [Wildcard, Wildcard, Wildcard])
"(ctor _ _ _)"
, testCase "constructor pattern with data constructor" $ assertPrintExpr
(Pattern (uqname "Ctor") [Wildcard, Wildcard, Wildcard])
"(Ctor _ _ _)"
, testCase "constructor pattern with qualified name" $ assertPrintExpr
(Pattern (qname "Mod" "ctor") [Wildcard, Wildcard, Wildcard])
"(Mod.ctor _ _ _)"
, testCase "constructor pattern that the symbol is between parentheses"
$ assertPrintExpr (Pattern (uqsym "++") [Wildcard, Wildcard]) "((++) _ _)"
, testCase
"constructor pattern that the qualified symbol is between parentheses"
$ assertPrintExpr (Pattern (qsym "Mod" "++") [Wildcard, Wildcard])
"((Mod.++) _ _)"
, testCase "constructor pattern without arguments"
$ assertPrintExpr (Pattern (uqname "nil") []) "nil"
, testCase "constructor pattern with qualified name without arguments"
$ assertPrintExpr (Pattern (qname "Mod" "nil") []) "Mod.nil"
]
test_special_pattern_operators :: [TestTree]
test_special_pattern_operators =
[ testCase "cons pattern"
$ assertPrintExpr (Infix (uqsym ":") Wildcard Wildcard) "_ : _"
, testCase "join pattern"
$ assertPrintExpr (Infix (uqsym "++") Wildcard Wildcard) "_ ++ _"
, testCase "nested cons pattern" $ assertPrintExpr
(Infix (uqsym ":") Wildcard (Infix (uqsym ":") Wildcard Wildcard))
"_ : _ : _"
, testCase "nested cons pattern (with parentheses)" $ assertPrintExpr
(Infix (uqsym ":") (Infix (uqsym ":") Wildcard Wildcard) Wildcard)
"(_ : _) : _"
, testCase "nested cons pattern (qualified, with parentheses)"
$ assertPrintExpr
(Infix (uqsym ":")
(Infix (qsym "Special" ":") Wildcard Wildcard)
Wildcard
)
"(_ Special.: _) : _"
, testCase "nested join pattern" $ assertPrintExpr
(Infix (uqsym "++") Wildcard (Infix (uqsym "++") Wildcard Wildcard))
"_ ++ _ ++ _"
, testCase "nested join pattern (with parentheses)" $ assertPrintExpr
(Infix (uqsym "++") (Infix (uqsym "++") Wildcard Wildcard) Wildcard)
"(_ ++ _) ++ _"
, testCase "nested join, cons pattern" $ assertPrintExpr
(Infix (uqsym "++") Wildcard (Infix (uqsym ":") Wildcard Wildcard))
"_ ++ _ : _"
, testCase "nested cons, join pattern" $ assertPrintExpr
(Infix (uqsym ":") Wildcard (Infix (uqsym "++") Wildcard Wildcard))
"_ : _ ++ _"
, testCase "nested cons, join pattern (with parentheses)" $ assertPrintExpr
(Infix (uqsym "++") (Infix (uqsym ":") Wildcard Wildcard) Wildcard)
"(_ : _) ++ _"
, testCase "qualified non-symbol" $ assertPrintExpr
(Infix (qname "Special" "mod") Wildcard Wildcard)
"_ `Special.mod` _"
, testCase "nested qualified non-symbol and symbol" $ assertPrintExpr
(Infix (qsym "Special" ":")
Wildcard
(Infix (qname "Special" "mod") Wildcard Wildcard)
)
"_ Special.: _ `Special.mod` _"
]