packages feed

context-free-grammar-0.1.1: tests/Data/Cfg/FirstSetTests.hs

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