content: {-# language OverloadedStrings, OverloadedLists, TemplateHaskell #-}
  module LexerParser (lexerParserTests) where
  
  import Hedgehog
  import Control.Monad (void)
  import Data.List.NonEmpty (NonEmpty(..))
  import qualified Data.Text as Text
  
  import Language.Python.DSL
  import Language.Python.Render
  import Language.Python.Parse (parseModule, parseStatement, parseExpr, parseExprList)
  import Language.Python.Syntax.Ann
  import Language.Python.Syntax.CommaSep (CommaSep(..), Comma(..))
  import Language.Python.Syntax.Expr (Expr(..))
  import Language.Python.Syntax.Strings
    ( StringLiteral(..), StringType(..), QuoteType(..), PyChar(..)
    , RawBytesPrefix(..), RawStringPrefix(..)
    )
  import Language.Python.Syntax.Whitespace (Whitespace(..))
  
  import Helpers (shouldBeParseSuccess, shouldBeParseFailure)
  
  lexerParserTests :: Group
  lexerParserTests = $$discover
  
  prop_fulltrip_1 :: Property
  prop_fulltrip_1 =
    withTests 1 . property $ do
      let str = "def a(x, y=2, *z, **w):\n   return 2 + 3"
  
      tree <- shouldBeParseSuccess parseStatement str
  
      showStatement tree === str
  
  prop_fulltrip_2 :: Property
  prop_fulltrip_2 =
    withTests 1 . property $ do
      let str = "(   1\n       *\n  3\n    )"
  
      tree <- shouldBeParseSuccess parseExpr str
  
      showExpr tree === str
  
  prop_fulltrip_3 :: Property
  prop_fulltrip_3 =
    withTests 1 . property $ do
      let str = "pass;"
  
      tree <- shouldBeParseSuccess parseStatement str
  
      showStatement tree === str
  
  prop_fulltrip_4 :: Property
  prop_fulltrip_4 =
    withTests 1 . property $ do
      let str = "def a():\n pass\n #\n pass\n"
  
      tree <- shouldBeParseSuccess parseStatement str
  
      showStatement tree === str
  
  prop_fulltrip_5 :: Property
  prop_fulltrip_5 =
    withTests 1 . property $ do
      let str = "if False:\n pass\n pass\nelse:\n pass\n pass\n"
  
      tree <- shouldBeParseSuccess parseStatement str
  
      showStatement tree === str
  
  prop_fulltrip_6 :: Property
  prop_fulltrip_6 =
    withTests 1 . property $ do
      let str = "# blah\ndef boo():\n    pass\n       #bing\n    #   bop\n"
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_7 :: Property
  prop_fulltrip_7 =
    withTests 1 . property $ do
      let str = "if False:\n pass\nelse \\\n      \\\r\n:\n pass\n"
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_8 :: Property
  prop_fulltrip_8 =
    withTests 1 . property $ do
      let str = "def a():\n \n pass\n pass\n"
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_9 :: Property
  prop_fulltrip_9 =
    withTests 1 . property $ do
      let
        str =
          "try:\n pass\nexcept False:\n pass\nelse:\n pass\nfinally:\n pass\n def a():\n  pass\n pass\n"
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_10 :: Property
  prop_fulltrip_10 =
    withTests 1 . property $ do
      let
        str =
          Text.unlines
          [ "from blah import  boo"
          , "import baz   as wop"
          , ""
          , "def thing():"
          , "    pass"
          , ""
          , "def    hello():"
          , "    what; up;"
          , ""
          , "def boo(a, *b, c=1, **d):"
          , "    pass"
          ]
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_11 :: Property
  prop_fulltrip_11 =
    withTests 1 . property $ do
      let
        str =
          Text.unlines
          [ "if False:"
          , " pass"
          , " pass"
          , "else:"
          , " \tpass"
          , " \tpass"
          ]
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_12 :: Property
  prop_fulltrip_12 =
    withTests 1 . property $ do
      let
        str =
          Text.unlines
          [ "try:"
          , " \tpass"
          , " \tdef a():"
          , " \t pass"
          , " \tpass"
          , "finally:"
          , " pass"
          ]
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_13 :: Property
  prop_fulltrip_13 =
    withTests 1 . property $ do
      let
        str =
          Text.unlines
          [ "if []:"
          , " False"
          , " def a():"
          , "  pass"
          , "  pass"
          , ""
          , "else:"
          , " pass"
          , " pass"
          ]
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_14 :: Property
  prop_fulltrip_14 =
    withTests 1 . property $ do
      let
        str = "not ((False for a in False) if False else False or False)"
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_15 :: Property
  prop_fulltrip_15 =
    withTests 1 . property $ do
      let
        str = "01."
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_16 :: Property
  prop_fulltrip_16 =
    withTests 1 . property $ do
      let
        str = "def a():\n  return ~i"
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_17 :: Property
  prop_fulltrip_17 =
    withTests 1 . property $ do
      let str = "r\"\\\"\""
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_18 :: Property
  prop_fulltrip_18 =
    withTests 1 . property $ do
      let str = "\"\0\""
  
      tree <- shouldBeParseSuccess parseModule str
  
      showModule tree === str
  
  prop_fulltrip_19 :: Property
  prop_fulltrip_19 =
    withTests 1 . property $ do
      let str = " \\\n"
  
      shouldBeParseFailure parseModule str
  
  prop_fulltrip_20 :: Property
  prop_fulltrip_20 =
    withTests 1 . property $ do
      let str = " pass"
  
      shouldBeParseFailure parseModule str
  
  prop_fulltrip_21 :: Property
  prop_fulltrip_21 =
    withTests 1 . property $ do
      let str = "if a:\n  \\\n\n  pass"
  
      shouldBeParseFailure parseModule str
  
  prop_fulltrip_22 :: Property
  prop_fulltrip_22 =
    withTests 1 . property $ do
      let str = "for a in (b, *c): pass"
  
      void $ shouldBeParseSuccess parseModule str
  
  prop_fulltrip_23 :: Property
  prop_fulltrip_23 =
    withTests 1 . property $ do
      let str = "None,*None"
  
      void $ shouldBeParseSuccess parseModule str
  
  prop_fulltrip_24 :: Property
  prop_fulltrip_24 =
    withTests 1 . property $ do
      let str = "'\1'"
  
      void $ shouldBeParseSuccess parseModule str
  
  prop_fulltrip_25 :: Property
  prop_fulltrip_25 =
    withTests 1 . property $ do
      let str = "'\11'"
  
      void $ shouldBeParseSuccess parseModule str
  
  prop_fulltrip_26 :: Property
  prop_fulltrip_26 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawBytesLiteral (Ann ())
                 Prefix_br
                 LongString
                 SingleQuote
                 [ Char_esc_bslash ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_27 :: Property
  prop_fulltrip_27 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawStringLiteral (Ann ())
                 Prefix_r
                 LongString
                 SingleQuote
                 [ Char_lit '\\', Char_lit '\\', Char_lit '\\', Char_lit '\'' ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_28 :: Property
  prop_fulltrip_28 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawStringLiteral (Ann ())
                 Prefix_r
                 ShortString
                 DoubleQuote
                 [ Char_lit '\\' ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_29 :: Property
  prop_fulltrip_29 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawStringLiteral (Ann ())
                 Prefix_r
                 ShortString
                 DoubleQuote
                 [ Char_lit '\\', Char_lit '\\' ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_30 :: Property
  prop_fulltrip_30 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawStringLiteral (Ann ())
                 Prefix_r
                 ShortString
                 DoubleQuote
                 [ Char_lit '\\', Char_lit '\\', Char_lit '\\' ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_31 :: Property
  prop_fulltrip_31 =
    withTests 1 . property $ do
      let str = "del(a)"
  
      void $ shouldBeParseSuccess parseModule str
  
  prop_fulltrip_32 :: Property
  prop_fulltrip_32 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawStringLiteral (Ann ())
                 Prefix_r
                 LongString
                 DoubleQuote
                 [ Char_lit ' ', Char_lit '"' ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_33 :: Property
  prop_fulltrip_33 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawStringLiteral (Ann ())
                 Prefix_r
                 LongString
                 DoubleQuote
                 [ Char_lit '"', Char_lit ' ' ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_34 :: Property
  prop_fulltrip_34 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawStringLiteral (Ann ())
                 Prefix_r
                 LongString
                 DoubleQuote
                 [ Char_lit '"' ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_35 :: Property
  prop_fulltrip_35 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (pure $
               RawStringLiteral (Ann ())
                 Prefix_r
                 LongString
                 DoubleQuote
                 [ Char_lit '\\'
                 , Char_esc_bslash
                 , Char_esc_doublequote
                 ]
                 [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_36 :: Property
  prop_fulltrip_36 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (RawStringLiteral (Ann ())
                 Prefix_r
                 LongString
                 SingleQuote
                 [Char_lit '\\', Char_esc_bslash] [] :|
              [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_37 :: Property
  prop_fulltrip_37 =
    withTests 1 . property $ do
      let str = "None,*None"
  
      void $ shouldBeParseSuccess parseExprList str
  
  prop_fulltrip_38 :: Property
  prop_fulltrip_38 =
    withTests 1 . property $ do
      let str =
            showExpr $
            String (Ann ())
              (RawStringLiteral (Ann ())
                 Prefix_r
                 LongString
                 SingleQuote
                 [Char_esc_bslash, Char_lit '\\'] [] :|
              [])
      annotateShow str
  
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  
  prop_fulltrip_39 :: Property
  prop_fulltrip_39 =
    withTests 1 . property $ do
      let str = "def a(*b, *): pass"
  
      shouldBeParseFailure parseStatement str
  
  prop_fulltrip_40 :: Property
  prop_fulltrip_40 =
    withTests 1 . property $ do
      let str = "def a():\n    yield op, oparg"
      res <- shouldBeParseSuccess parseStatement str
      str === showStatement (() <$ res)
  
  prop_fulltrip_41 :: Property
  prop_fulltrip_41 =
    withTests 1 . property $ do
      let
        s = "def a(*a, *b): pass"
      shouldBeParseFailure parseModule s
  
  prop_fulltrip_42 :: Property
  prop_fulltrip_42 =
    withTests 1 . property $ do
      let
        s = "lambda *a, *b: pass"
      shouldBeParseFailure parseModule s
  
  prop_fulltrip_43 :: Property
  prop_fulltrip_43 =
    withTests 1 . property $ do
      let
        e =
          Yield
          { _unsafeExprAnn = Ann ()
          , _unsafeYieldWhitespace = [Space]
          , _unsafeYieldValue =
              CommaSepMany (Ident (Ann ()) (MkIdent (Ann ()) "a" [])) (MkComma [Space]) $
              CommaSepMany (tuple_ [ti_ $ var_ "b"]) (MkComma []) $
              CommaSepNone
          }
        -- yield a, (b,),
        str = showExpr e
      res <- shouldBeParseSuccess parseExpr str
      str === showExpr (() <$ res)
  