{-# LANGUAGE DataKinds #-} -- For using P.viewGrammar
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE TypeApplications #-}
module Golden.Grammar where

import Data.Bool (Bool(..))
import Control.Monad (Monad(..))
import Data.Function (($))
import Data.Semigroup (Semigroup(..))
import Data.String (IsString(..))
import Test.Tasty
import Test.Tasty.Golden
import Text.Show (Show(..))
import Data.Int (Int)
import qualified Data.List as List

import Golden.Utils
import qualified Symantic.Parser as P
import qualified Grammar

goldens :: TestTree
goldens = testGroup "Grammar" $
  [ testGroup "ViewGrammar" $
    (\f -> List.zipWith f Grammar.grammars [1::Int ..]) $ \gram g ->
    let grammarFile = getGoldenDir $ "Grammar/ViewGrammar/G"<>show g<>".expected.txt" in
    goldenVsStringDiff ("G"<>show g) goldenDiff grammarFile $ do
      resetTHNameCounter
      return $ fromString $ show $
        P.viewGrammar @'False gram
  , testGroup "OptimizeGrammar" $
    (\f -> List.zipWith f Grammar.grammars [1::Int ..]) $ \gram g ->
    let grammarFile = getGoldenDir $ "Grammar/OptimizeGrammar/G"<>show g<>".expected.txt" in
    goldenVsStringDiff ("G"<>show g) goldenDiff grammarFile $ do
      resetTHNameCounter
      return $ fromString $ show $
        P.viewGrammar @'False $
        P.optimizeGrammar gram
  ]