{-# LANGUAGE CPP #-} module Main where import Data.List.NonEmpty (nonEmpty) import Language.Haskell.Meta.Parse import qualified Language.Haskell.TH as TH import qualified Language.Haskell.TH.Syntax as TH import Test.Hspec ( hspec, describe, it, shouldBe, Spec ) spec :: Spec spec = do #if MIN_VERSION_ghc(9,2,0) describe "Record dot syntax" $ do it "parses access" $ do let Right exp = parseExp "a.b" exp `shouldBe` TH.GetFieldE (TH.VarE (TH.mkName "a")) "b" it "parses single projection" $ do let Right exp = parseExp "(.b)" let Just list = nonEmpty ["b"] exp `shouldBe` TH.ProjectionE list it "parses multi projection" $ do let Right exp = parseExp "(.b.c.d)" let Just list = nonEmpty ["b", "c", "d"] exp `shouldBe` TH.ProjectionE list #endif describe "Overloaded labels" $ do it "parses labels" $ do let Right exp = parseExp "#name" exp `shouldBe` TH.LabelE "name" describe "Type application" $ do it "parses application" $ do let Right exp = parseExp "a @b" exp `shouldBe` TH.AppTypeE (TH.VarE (TH.mkName "a")) (TH.VarT (TH.mkName "b")) describe "infix operators" $ do it "parses infix operator" $ do let Right exp = parseExp "a |> b" exp `shouldBe` TH.UInfixE (TH.VarE (TH.mkName "a")) (TH.VarE (TH.mkName "|>")) (TH.VarE (TH.mkName "b")) main = hspec spec