packages feed

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