packages feed

context-free-grammar-0.0.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.
        |]