packages feed

hic-0.0.0.1: test/Language/Cimple/HicSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module Language.Cimple.HicSpec where

import           Data.Fix                (Fix (..), unFix)
import           Data.Text               (Text)
import           Test.Hspec              (Spec, describe, it, shouldBe)

import qualified Language.Cimple         as C
import           Language.Cimple.Hic
import           Language.Cimple.Hic.Ast
import qualified Language.Cimple.Program as C

spec :: Spec
spec = do
    let dummyLoc = C.AlexPn 0 0 0
    let lVar v = C.L dummyLoc C.IdVar v
    let lInt i = C.L dummyLoc C.LitInteger i

    describe "lower" $ do
        let liftHic :: C.Node (C.Lexeme Text) -> Node (C.Lexeme Text)
            liftHic (Fix f) = Fix (CimpleNode (fmap liftHic f))

        it "lowers a CimpleNode" $ do
            let node = Fix (CimpleNode (C.Break)) :: Node (C.Lexeme Text)
            lower node `shouldBe` (Fix C.Break :: C.Node (C.Lexeme Text))

        it "lowers a Raise node" $ do
            let var = Fix (C.VarExpr (lVar "error_var"))
            let val = Fix (C.LiteralExpr C.Int (lInt "1"))
            let err = Fix (C.LiteralExpr C.Int (lInt "-1"))
            let node = Fix (HicNode (Raise (Just (liftHic var)) (liftHic val) (ReturnError (liftHic err))))
            lower node `shouldBe` (Fix (C.Group
                [ Fix (C.ExprStmt (Fix (C.AssignExpr var C.AopEq val)))
                , Fix (C.Return (Just err))
                ]) :: C.Node (C.Lexeme Text))