{-# 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. |]