parsley-2.0.0.0: test/Parsley/Precedence/Test.hs
{-# LANGUAGE TemplateHaskell, UnboxedTuples, ScopedTypeVariables, MultiParamTypeClasses, GADTs, DeriveGeneric, TypeApplications, FlexibleInstances, FlexibleContexts #-}
--{-# OPTIONS_GHC -ddump-splices #-}
module Parsley.Precedence.Test where
import Test.Tasty
import Test.Tasty.HUnit
import TestUtils
import qualified Parsley.Precedence.Parsers as Parsers
import Prelude hiding (pred)
import Parsley (empty, Parser)
--import Parsley.Patterns (deriveSubtype, deriveLiftedConstructors, deriveDeferredConstructors, Pos)
import Parsley.Precedence (Subtype(..))
--import GHC.Generics (Generic)
{-data Foo where
Foo :: Bar -> Foo
Goo :: String -> Pos -> Int -> Foo
deriving (Eq, Show, Generic)
newtype Bar = Bar Int deriving (Eq, Show, Generic)
data X a = X a a Pos
deriveSubtype ''Bar ''Foo
deriveLiftedConstructors "mk" ['X]
deriveLiftedConstructors "mk" ['Bar, 'Goo]
deriveDeferredConstructors "mkD" ['X]
testParser :: Parser (X a)
testParser = mkX empty empty
testParser' :: Parser Foo
testParser' = mkGoo empty empty
testParser'' :: Parser (a -> a -> X a)
testParser'' = mkDX-}
tests :: TestTree
tests = testGroup "Precedence" [
precHomoTests,
precedenceTests
--subtypeTests
]
expr :: String -> Maybe Parsers.Expr
expr = $$(runParserMocked Parsers.expr [||Parsers.expr||])
pred :: String -> Maybe Parsers.Pred
pred = $$(runParserMocked Parsers.pred [||Parsers.pred||])
precHomoTests :: TestTree
precHomoTests = testGroup "precHomo should"
[ testCase "parse precedence with correct associativity" $ expr "1+3*negate5+4" @?=
Just (Parsers.Add (Parsers.Num 1)
(Parsers.Add (Parsers.Mul (Parsers.Num 3)
(Parsers.Negate (Parsers.Num 5)))
(Parsers.Num 4)))]
instance Subtype a a where
upcast = id
downcast = Just
upcast' :: Parsers.Atom -> Parsers.Term
upcast' = upcast @Parsers.Not . upcast
upcast'' :: Subtype x Parsers.Term => x -> Parsers.Pred
upcast'' = Parsers.OfTerm . upcast
precedenceTests :: TestTree
precedenceTests = testGroup "precedence should"
[ testCase "parse precedence with correct associativity" $ pred "T|F|(T|!F)&F" @?=
Just (Parsers.Or (upcast' Parsers.T)
(Parsers.Or (upcast' Parsers.F)
(upcast'' (Parsers.And (upcast (Parsers.Parens
(Parsers.Or (upcast' Parsers.T)
(upcast'' (Parsers.Not (upcast Parsers.F))))))
(upcast' Parsers.F)))))]
{-subtypeTests :: TestTree
subtypeTests = testGroup "Subtype should"
[ testCase "upcast properly" $ upcast (Bar 5) @?= Foo (Bar 5)
, testCase "downcast properly" $ downcast (Foo (Bar 5)) @?= Just (Bar 5) ]-}