module Data.Cfg.FirstSetTests ( 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.FirstSet" [ g0FirstSetTest, microFirstSetTest ] g0FirstSetTest :: Test g0FirstSetTest = testCase "g0 first-set test" $ mapM_ f tab where f :: (String, LookaheadSet String) -> IO () f (nt, expected) = assertEqual msg expected (fs $ AugNT nt) where msg = "g0: firstSet(" ++ nt ++ ")" tab :: [(String, LookaheadSet String)] tab = [("e", mkLookaheadSet False $ words "F LPAREN V"), ("prefix", mkLookaheadSet True ["F"]), ("tail", mkLookaheadSet True ["PLUS"])] fs :: AugNT String -> LookaheadSet String fs = firstSet g0Analysis microFirstSetTest :: Test microFirstSetTest = testCase "micro first-set test" $ mapM_ f tab where f :: (String, LookaheadSet String) -> IO () f (nt, expected) = assertEqual msg expected (fs $ AugNT nt) where msg = "micro: firstSet(" ++ nt ++ ")" tab :: [(String, LookaheadSet String)] tab = [ ("program", mkLookaheadSet False $ words "BEGIN"), ("statement_list", mkLookaheadSet False $ words "ID READ WRITE"), ("statement", mkLookaheadSet False $ words "ID READ WRITE"), ("statement_tail", mkLookaheadSet True $ words "ID READ WRITE"), ("expression", mkLookaheadSet False $ words "ID INT_LITERAL LPAREN"), ("id_list", mkLookaheadSet False $ words "ID"), ("expr_list", mkLookaheadSet False $ words "ID INT_LITERAL LPAREN"), ("id_tail", mkLookaheadSet True $ words "COMMA"), ("expr_tail", mkLookaheadSet True $ words "COMMA"), ("primary", mkLookaheadSet False $ words "ID INT_LITERAL LPAREN"), ("primary_tail", mkLookaheadSet True $ words "PLUS MINUS"), ("add_op", mkLookaheadSet False $ words "PLUS MINUS") ] fs :: AugNT String -> LookaheadSet String fs = firstSet microAnalysis