packages feed

swarm-0.6.0.0: test/unit/TestParse.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

-- |
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Swarm parser tests.
module TestParse where

import Data.Foldable qualified as F
import Data.Text (Text)
import Swarm.Language.Parser.Core (runParser)
import Swarm.Language.Parser.Lex (sc)
import Swarm.Language.Parser.Term (parseTerm)
import Swarm.Language.Parser.Util (fullyMaybe)
import Swarm.Language.Syntax
import Test.Tasty
import Test.Tasty.HUnit (Assertion, assertEqual, assertFailure, testCase)
import Text.Megaparsec (errorBundlePretty)
import Witch (into)

testParse :: TestTree
testParse =
  testGroup
    "Parser - comments"
    [ testCase "none" $
        expectParsedComments
          "1 + 2"
          []
    , testCase "suffix" $
        expectParsedComments
          "1 + 2 // add"
          [Comment (SrcLoc 6 12) LineComment SuffixComment " add"]
    , testCase "standalone" $
        expectParsedComments
          "// add\n1 + 2"
          [Comment (SrcLoc 0 6) LineComment StandaloneComment " add"]
    , testCase "block suffix" $
        expectParsedComments
          "1 + 2 /* add */"
          [Comment (SrcLoc 6 15) BlockComment SuffixComment " add "]
    , testCase "block standalone" $
        expectParsedComments
          "/* add */\n1 + 2"
          [Comment (SrcLoc 0 9) BlockComment StandaloneComment " add "]
    , testCase "block prefix" $
        expectParsedComments
          "/* add */ 1 + 2"
          [Comment (SrcLoc 0 9) BlockComment StandaloneComment " add "]
    , testCase "block infix" $
        expectParsedComments
          "1 + /*add*/ 2"
          [Comment (SrcLoc 4 11) BlockComment SuffixComment "add"]
    , testCase "multiline block" $
        expectParsedComments
          "/* add \n  some numbers */\n  1 + 2"
          [Comment (SrcLoc 0 25) BlockComment StandaloneComment " add \n  some numbers "]
    , testCase "multiple lines" $
        expectParsedComments
          "// add\n// some numbers\n  1 + 2"
          [ Comment (SrcLoc 0 6) LineComment StandaloneComment " add"
          , Comment (SrcLoc 7 22) LineComment StandaloneComment " some numbers"
          ]
    ]

expectParsedComments :: Text -> [Comment] -> Assertion
expectParsedComments input ex = case runParser (fullyMaybe sc parseTerm) input of
  Left err -> assertFailure (into @String $ errorBundlePretty err)
  Right (_, res) -> assertEqual "Expected parsed comments" ex (F.toList res)