{-# LANGUAGE DisambiguateRecordFields #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE ViewPatterns #-} module Main ( main ) where import Data.Foldable (find) import Data.Maybe (mapMaybe) import Data.Text (Text) import qualified Ide.Plugin.HaddockComments as HaddockComments import System.FilePath ((<.>), ()) import Test.Hls main :: IO () main = defaultTestRunner tests haddockCommentsPlugin :: PluginTestDescriptor HaddockComments.Log haddockCommentsPlugin = mkPluginTestDescriptor HaddockComments.descriptor "haddockComments" tests :: TestTree tests = testGroup "haddock comments" [ goldenWithHaddockComments "HigherRankFunction" Signature 4 6, goldenWithHaddockComments "KindSigFunction" Signature 9 10, goldenWithHaddockComments "MultivariateFunction" Signature 4 8, goldenWithHaddockComments "QualFunction" Signature 2 10, goldenWithHaddockComments "Record" Record 7 2, goldenWithHaddockComments "Record2" Record 3 6, goldenWithHaddockComments "InlineRecord" Record 3 20, expectedNothing "ConstFunction" Signature 2 2, expectedNothing "StaleFunction" Signature 3 3, expectedNothing "StaleRecord" Record 4 9 ] goldenWithHaddockComments :: FilePath -> GenCommentsType -> UInt -> UInt -> TestTree goldenWithHaddockComments fp (toTitle -> expectedTitle) l c = goldenWithHaskellDoc def haddockCommentsPlugin (fp <> " (golden)") testDataDir fp "expected" "hs" $ \doc -> do actions <- getCodeActions doc (Range (Position l c) (Position l $ succ c)) case find ((== Just expectedTitle) . caTitle) actions of Just (InR x) -> executeCodeAction x _ -> liftIO $ assertFailure "Unable to find CodeAction" expectedNothing :: FilePath -> GenCommentsType -> UInt -> UInt -> TestTree expectedNothing fp (toTitle -> expectedTitle) l c = testCase fp $ runSessionWithServer def haddockCommentsPlugin testDataDir $ do doc <- openDoc (fp <.> "hs") "haskell" titles <- mapMaybe caTitle <$> getCodeActions doc (Range (Position l c) (Position l $ succ c)) liftIO $ expectedTitle `notElem` titles @? "Unexpected CodeAction" data GenCommentsType = Signature | Record toTitle :: GenCommentsType -> Text toTitle Signature = "Generate signature comments" toTitle Record = "Generate haddock comments" caTitle :: (Command |? CodeAction) -> Maybe Text caTitle (InR CodeAction {_title}) = Just _title caTitle _ = Nothing testDataDir :: String testDataDir = "test" "testdata"