What is this?
It's a framework that lets you control a mock LSP client to talk to your server. Use it to make integration tests for your server's functionality. (You could probably also use it to make an actual client too)
How to use
import Language.Haskell.LSP.Test import Language.Haskell.LSP.Types runSession "hie" fullCaps "my/project" $ do doc <- openDoc "Bar.hs" "haskell" loggingNotification -- assert we receive a logging type message diags <- getDefinitions doc (Position 4 5) rename doc (Position 2 3) "howdy" documentContents doc >>= liftIO . print
Tests are contained within a
Session, a complete connection between your server and the test client from the initialise request to the exit notification.
There are a bunch of built in functions for doing common actions, such as opening a document or asserting that you receive a message. These all use Haskell.LSP.Types, which you probably want to import as well.
HSpec is also useful if you want to use it to write unit tests.
Sending and receiving manually
runSession "hie" fullCaps "my/dir" = do doc <- openDoc "Foo.hs" "haskell" let params = DocumentSymbolParams doc -- send and wait for the response rsp <- sendRequest TextDocumentDocumentSymbol params -- or manually send and wait sendRequest TextDocumentSymbol params -- next immediate message must be a DocumentSymbolsResponse message :: Session DocumentSymbolsResponse let closeParams = DidCloseTextDocumentParams doc sendNotification TextDocumentDidClose closeParams
Session is actually a parser under the hood, so you can use all your favourite combinators:
nEdits :: Session [ApplyWorkspaceEditRequest] nEdits = skipManyTill anyResponse (count n (message :: Session ApplyWorkspaceEditRequest))