cimple-0.0.8: test/Language/Cimple/AstSpec.hs
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
module Language.Cimple.AstSpec where
import Data.Fix (Fix (..))
import Data.Functor.Compose (Compose (..))
import Test.Hspec (Spec, describe, it, shouldBe,
shouldSatisfy)
import Language.Cimple (AlexPosn (..), AnnotF (..), Lexeme (..),
LexemeClass (..), LiteralType (..),
NodeF (..), Scope (..), addAnnot,
removeAnnot)
import Language.Cimple.IO (parseText)
spec :: Spec
spec = do
describe "Node" $ do
it "can be annotated" $ do
let Right [ast] = parseText "const int a = 3;"
addAnnot ast `shouldBe`
Fix (Compose (Annot () (
ConstDefn Global
(Fix (Compose (Annot () (
TyStd (L (AlexPn 6 1 7) IdStdType "int")))))
(L (AlexPn 10 1 11) IdVar "a")
(Fix (Compose (Annot () (
LiteralExpr Int (L (AlexPn 14 1 15) LitInteger "3"))))))))
removeAnnot (addAnnot ast) `shouldBe` ast
addAnnot ast `shouldSatisfy` \case
(removeAnnot -> Fix (ConstDefn Global
(Fix (TyStd (L (AlexPn 6 1 7) IdStdType "int")))
(L (AlexPn 10 1 11) IdVar "a")
(Fix (LiteralExpr Int (L (AlexPn 14 1 15) LitInteger "3"))))) -> True
_ -> False