{-# LANGUAGE OverloadedStrings #-}
module Test.LSP (tests) where
import Agda
import Control.Monad.IO.Class
import qualified Data.Aeson as JSON
import Language.LSP.Protocol.Message
import Language.LSP.Protocol.Types
import Language.LSP.Test
import Switchboard (agdaCustomMethod)
import Test.Tasty
import Test.Tasty.HUnit
tests :: FilePath -> TestTree
tests alsPath =
testGroup
"LSP"
[ testCase "load" (demo alsPath)
]
demo :: FilePath -> IO ()
demo alsPath = do
putStrLn $ "Running LSP tests on the server with the following path to the als executable: " ++ alsPath
runSession alsPath fullLatestClientCaps "test/data/" $ do
doc <- openDoc "A.agda" "agda"
-- hover
TResponseMessage _ _ rsp <- request SMethod_TextDocumentHover (HoverParams doc (Position 3 9) Nothing)
case rsp of
Right (InL (Hover (InL (MarkupContent _ content)) (Just (Range start end)))) -> liftIO $ do
-- disregard the content of the hover message for now
-- because it varies depending on the version of Agda
-- content @?= "\n```agda-language-server\nAgda.Primitive.Set\n```\n"
start @?= Position 3 9
end @?= Position 3 9
_ -> liftIO $ assertFailure "Unexpected response"
-- agda-mode:load
testCustomMethod "IOTCM \"test/data/A.agdaa\" NonInteractive Direct( Cmd_load \"test/data/A.agda\" [] )"
-- | Sends a custom method request to the server and expects a response of `CmdRes Nothing`
testCustomMethod :: String -> Session ()
testCustomMethod cmd = do
TResponseMessage _ _ rsp <-
request agdaCustomMethod $
JSON.toJSON $
CmdReq cmd
liftIO $ rsp @?= Right (JSON.toJSON (CmdRes Nothing))