module FreeC.Environment.RenamerTests where
import Data.Maybe ( mapMaybe )
import Test.Hspec
import Test.QuickCheck
import qualified FreeC.Backend.Coq.Base as Coq.Base
import FreeC.Backend.Coq.Keywords
import qualified FreeC.Backend.Coq.Syntax as Coq
import FreeC.Environment
import FreeC.Environment.Entry
import FreeC.Environment.Renamer
import FreeC.IR.SrcSpan
import qualified FreeC.IR.Syntax as IR
testRenamer :: Spec
testRenamer = describe "FreeC.Environment.Renamer" $ do
testMustRenameIdent
testRenameIdent
genIdent :: Gen String
genIdent = do
ident <- frequency [ (6, genRegularIdent)
, (2, genKeyword)
, (2, genVernacularCommand)
, (1, genReservedIdent)
]
num <- choose (0, 42) :: Gen Int
oneof $ map return [ident, ident ++ show num]
genRegularIdent :: Gen String
genRegularIdent = oneof $ map return ["x", "y", "z"]
genReservedIdent :: Gen String
genReservedIdent
= oneof $ map return $ mapMaybe Coq.unpackQualid Coq.Base.reservedIdents
genKeyword :: Gen String
genKeyword = oneof $ map return coqKeywords
genVernacularCommand :: Gen String
genVernacularCommand = oneof $ map return vernacularCommands
testMustRenameIdent :: Spec
testMustRenameIdent = describe "mustRenameIdent" $ do
it "keywords must be renamed" $ do
property $ forAll genKeyword $ flip mustRenameIdent emptyEnv
it "reserved identifiers must be renamed" $ do
property $ forAll genReservedIdent $ flip mustRenameIdent emptyEnv
it "defined identifiers must be renamed" $ do
property $ forAll genIdent $ \ident ->
let env = addEntry TypeVarEntry
{ entrySrcSpan = NoSrcSpan
, entryName = IR.UnQual (IR.Ident ident)
, entryIdent = Coq.bare ident
, entryAgdaIdent = undefined
} emptyEnv
in mustRenameIdent ident env
testRenameIdent :: Spec
testRenameIdent = describe "renameIdent" $ do
it "generated identifiers don't need to be renamed" $ do
property $ forAll genIdent $ \ident ->
let ident' = renameIdent ident emptyEnv
in not (mustRenameIdent ident' emptyEnv)
it "generated identifiers are not renamed again" $ do
property $ forAll genIdent $ \ident ->
let ident' = renameIdent ident emptyEnv
in renameIdent ident' emptyEnv == ident'