{-# 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 }