packages feed

platinum-parsing-0.1.0.0: test/PPTest/Grammars/LexicalHelper.hs

module PPTest.Grammars.LexicalHelper (specs) where

import           PP
import           PP.Grammars.LexicalHelper
import           Test.Hspec

specs = describe "PPTest.Grammars.LexicalHelper" $ do

  it "should detect a simple syntax error" $
    case parseAst "a %= b" :: To LexicalRule of
      Left e  -> show e `shouldNotBe` ""
      Right o -> stringify o `shouldBe` "an error"

  it "should parseAst a simple correct input" $
    case parseAst "a %= b;" :: To LexicalRule of
      Left e  -> show e `shouldBe` "not an error"
      Right o -> stringify o `shouldBe` "a%=b;"

  it "should parseAst a more complex correct input" $
    case parseAst "a %= b, \"c\", d;" :: To LexicalRule of
      Left e  -> show e `shouldBe` "not an error"
      Right o -> stringify o `shouldBe` "a%=b,\"c\",d;"

  it "should parseAst terminal string" $
    case parseAst "a %= \"h 'w\", \"h \\\"w\";" :: To LexicalRule of
      Left e  -> show e `shouldBe` "not an error"
      Right o -> stringify o `shouldBe` "a%=\"h 'w\",\"h \\\"w\";"

  it "should parseAst complex meta identifiers" $
    case parseAst "a a %= b b;" :: To LexicalRule of
      Left e  -> show e `shouldBe` "not an error"
      Right o -> stringify o `shouldBe` "a a%=b b;"

  it "should deal with any white spaces" $
    case parseAst " \t\n a \n  %= \tb  \n\t,  c  ; \t " :: To LexicalRule of
      Left e  -> show e `shouldBe` "not an error"
      Right o -> stringify o `shouldBe` "a%=b,c;"

  it "should handle multiple parseAst and stringify" $
    case parseAst "a %= b, \"c\";" :: To LexicalRule of
      Left e1  -> show e1 `shouldBe` "not an error (e1)"
      Right o1 -> let s1 = stringify o1 in
        case parseAst s1 :: To LexicalRule of
          Left e2  -> show e2 `shouldBe` "not an error (e2)"
          Right o2 -> stringify o2 `shouldBe` "a%=b,\"c\";"

  it "should handle translation to canonical rules (lexical identifiers)" $
    let Right ast = parseAst "a %= b;" :: To LexicalRule in
      rules ast `shouldBe` [Rule "a" [NonTerm "b", Empty]]

  it "should handle translation to canonical rules (lexical string)" $
    let Right ast = parseAst "a %= \"hi\";" :: To LexicalRule in
      rules ast `shouldBe` [Rule "a" [RegEx "hi", Empty]]

  it "should handle translation to canonical rules (complex rules)" $
    let Right ast = parseAst "a %= b, \"c\", d;" :: To LexicalRule in
      rules ast `shouldBe` [Rule "a" [NonTerm "b", RegEx "c", NonTerm "d", Empty]]