context-free-grammar-0.1.1: tests/Data/Cfg/ProductiveTests.hs
{-# LANGUAGE QuasiQuotes #-}
module Data.Cfg.ProductiveTests
( tests
) where
import Data.Cfg.Bnf (Grammar(..), bnf)
import Data.Cfg.Cfg (Cfg(..), V(..))
import Data.Cfg.FreeCfg (FreeCfg(..), toFreeCfg)
import Data.Cfg.Productive
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.Productive" [wikiTest]
wikiTest :: Test
wikiTest =
testCase "wiki productivity test" $ do
assertEqual
"productives"
(S.fromList $ grammarProductions prods')
(productives wiki)
assertEqual
"unproductives"
(S.fromList $ grammarProductions unprods')
(unproductives wiki)
assertEqCfg ctxt ctxt "productivity" expected $ removeUnproductives wiki
where
ctxt :: V String String -> Doc
ctxt v =
text $
case v of
NT nt -> nt
T t -> t
expected :: FreeCfg String String
expected = (toFreeCfg prods') {terminals' = terminals wiki}
prods' :: Grammar String String
prods' =
[bnf|
s ::= b B | c C.
b ::= b B | B.
c ::= c C | C.
d ::= b D | c D | D.
|]
unprods' :: Grammar String String
unprods' =
[bnf|
s ::= e E.
e ::= e E.
|]