content: module BNFC.Backend.HaskellSpec where
  
  import Test.Hspec
  import BNFC.GetCF
  import BNFC.Hspec
  import BNFC.Options hiding (Backend)
  import BNFC.Backend.Base
  
  import BNFC.Backend.Haskell -- SUT
  
  calcOptions = defaultOptions { lang = "Calc" }
  getCalc = parseCF  calcOptions TargetHaskell $
    unlines [ "EAdd. Exp ::= Exp \"+\" Exp1  ;"
            , "ESub. Exp ::= Exp \"-\" Exp1  ;"
            , "EMul. Exp1  ::= Exp1  \"*\" Exp2  ;"
            , "EDiv. Exp1  ::= Exp1  \"/\" Exp2  ;"
            , "EInt. Exp2  ::= Integer ;"
            , "coercions Exp 2 ;" ]
  
  spec = do
  
    context "with default option and the Calc grammar" $ do
      it "generates a file called AbsCalc.hs" $ do
        calc <- getCalc
        files <- execBackend (makeHaskell calcOptions calc)
        map fileName files `shouldSatisfy` elem "AbsCalc.hs"
  
      it "generates a file called LexCalc.x" $ do
        calc <- getCalc
        files <- execBackend (makeHaskell calcOptions calc)
        map fileName files `shouldSatisfy` elem "LexCalc.x"
  
      it "generates a file called ParCalc.y" $ do
        calc <- getCalc
        makeHaskell calcOptions calc `shouldGenerate` "ParCalc.y"
  
      it "generates a squeleton file" $ do
        calc <- getCalc
        makeHaskell calcOptions calc `shouldGenerate` "SkelCalc.hs"
  
      it "generates a pretty printer file" $ do
        calc <- getCalc
        makeHaskell calcOptions calc `shouldGenerate` "PrintCalc.hs"
  
      it "generates a test program file" $ do
        calc <- getCalc
        makeHaskell calcOptions calc `shouldGenerate` "TestCalc.hs"
  
      it "generates a error module file" $ do
        calc <- getCalc
        makeHaskell calcOptions calc `shouldGenerate` "ErrM.hs"
  
    context "with option -mMyMakefile and the Calc grammar" $ do
      it "generates a Makefile" $ do
        calc <- getCalc
        let options = calcOptions { optMake = Just "MyMakefile" }
        makeHaskell options calc `shouldGenerate` "MyMakefile"
  