packages feed

context-free-grammar-0.1.0: tests/Data/Cfg/FollowSetTests.hs

module Data.Cfg.FollowSetTests (
    tests
    ) where

import Data.Cfg.Analysis
import Data.Cfg.Augment
import Data.Cfg.LookaheadSet
import Data.Cfg.TestGrammars
import Test.Framework(Test, testGroup)
import Test.Framework.Providers.HUnit(testCase)
import Test.HUnit(assertEqual)

tests :: Test
tests = testGroup "Data.Cfg.FollowSet" [
    g0FollowSetTest,
    microFollowSetTest
    ]

g0FollowSetTest :: Test
g0FollowSetTest = testCase "g0 follow-set test" $ mapM_ f tab
    where
    f :: (String, LookaheadSet String) -> IO ()
    f (nt, expected) = assertEqual msg expected (fols $ AugNT nt)
	where
	msg = "g0: followSet(" ++ nt ++ ")"

    tab :: [(String, LookaheadSet String)]
    tab = [("e", mkLookaheadSet True ["RPAREN"]),
	   ("prefix", mkLookaheadSet False ["LPAREN"]),
	   ("tail", mkLookaheadSet True ["RPAREN"])]

    fols :: AugNT String -> LookaheadSet String
    fols = followSet g0Analysis

microFollowSetTest :: Test
microFollowSetTest = testCase "micro follow-set test" $ mapM_ f tab
    where
    f :: (String, LookaheadSet String) -> IO ()
    f (nt, expected) = assertEqual msg expected (fols $ AugNT nt)
	where
	msg = "micro: followSet(" ++ nt ++ ")"

    tab :: [(String, LookaheadSet String)]
    tab = [ ("program", mkLookaheadSet True []),
	    ("statement_list", mkLookaheadSet False $ words "END"),
	    ("statement", mkLookaheadSet False $ words "ID READ WRITE END"),
	    ("statement_tail", mkLookaheadSet False $ words "END"),
	    ("expression", mkLookaheadSet False $ words "COMMA SEMI RPAREN"),
	    ("id_list", mkLookaheadSet False $ words "RPAREN"),
	    ("expr_list", mkLookaheadSet False $ words "RPAREN"),
	    ("id_tail", mkLookaheadSet False $ words "RPAREN"),
	    ("expr_tail", mkLookaheadSet False $ words "RPAREN"),
	    ("primary",
		 mkLookaheadSet False $ words "COMMA SEMI PLUS MINUS RPAREN"),
	    ("primary_tail", mkLookaheadSet False $ words "COMMA SEMI RPAREN"),
	    ("add_op", mkLookaheadSet False $ words "ID INT_LITERAL LPAREN") ]

    fols :: AugNT String -> LookaheadSet String
    fols = followSet microAnalysis