{-# LANGUAGE QuasiQuotes #-}
module Data.Cfg.ReachableTests (
tests
) where
import Data.Cfg.Bnf(bnf)
import Data.Cfg.Cfg(Cfg(..), V(..))
import Data.Cfg.FreeCfg(FreeCfg(..), toFreeCfg)
import Data.Cfg.Reachable
import Data.Cfg.TestGrammars(assertEqCfg, wiki)
import qualified Data.Set as S
import Test.Framework(Test, testGroup)
import Test.Framework.Providers.HUnit(testCase)
import Test.HUnit(assertEqual)
import Text.PrettyPrint
tests :: Test
tests = testGroup "Data.Cfg.Reachable" [
wikiTest
]
wikiTest :: Test
wikiTest = testCase "wiki reachability test" $ do
assertEqual "reachables" (S.fromList $ words "s b c e")
(reachables wiki)
assertEqual "unreachables" (S.fromList $ words "d")
(unreachables wiki)
assertEqCfg ctxt ctxt "reachability" expected $ removeUnreachables wiki
where
ctxt :: V String String -> Doc
ctxt v = text $ case v of
NT nt -> nt
T t -> t
reach = [bnf|
s ::= b B | c C | e E.
b ::= b B | B.
c ::= c C | C.
e ::= e E.
|]
expected :: FreeCfg String String
expected = (toFreeCfg reach){
terminals' = terminals wiki
}