lsp-test-0.1.0.0: Functional test framework for LSP servers.

Maintainer luke_lau@icloud.com experimental POSIX None Haskell2010

Description

Provides the framework to start functionally testing Language Server Protocol servers. You should import Language.Haskell.LSP.Types alongside this.

Synopsis

# Sessions

type Session = ParserStateReader FromServerMessage SessionState SessionContext IO Source #

A session representing one instance of launching and connecting to a server.

You can send and receive messages to the server within Session via getMessage, sendRequest and sendNotification.

Arguments

 :: String The command to run the server. -> ClientCapabilities The capabilities that the client should declare. -> FilePath The filepath to the root directory for the session. -> Session a The session to run. -> IO a

Starts a new session.

runSession "hie" fullCaps "path/to/root/dir" $do doc <- openDoc "Desktop/simple.hs" "haskell" diags <- waitForDiagnostics let pos = Position 12 5 params = TextDocumentPositionParams doc hover <- request TextDocumentHover params ## Config Arguments  :: SessionConfig Configuration options for the session. -> String The command to run the server. -> ClientCapabilities The capabilities that the client should declare. -> FilePath The filepath to the root directory for the session. -> Session a The session to run. -> IO a Starts a new sesion with a custom configuration. Stuff you can configure for a Session. Constructors  SessionConfig FieldsmessageTimeout :: IntMaximum time to wait for a message in seconds, defaults to 60.logStdErr :: BoolRedirect the server's stderr to this stdout, defaults to False.logMessages :: BoolTrace the messages sent and received to stdout, defaults to True.logColor :: BoolAdd ANSI color to the logged messages, defaults to True. Instances  Source # Instance detailsDefined in Language.Haskell.LSP.Test.Session Methods The configuration used in runSession. ## Exceptions An exception that can be thrown during a Session Instances  Source # Instance detailsDefined in Language.Haskell.LSP.Test.Exceptions Methods Source # Instance detailsDefined in Language.Haskell.LSP.Test.Exceptions MethodsshowList :: [SessionException] -> ShowS # Source # Instance detailsDefined in Language.Haskell.LSP.Test.Exceptions Methods A predicate that matches on any SessionException withTimeout :: Int -> Session a -> Session a Source # Execute a block f that will throw a TimeoutException after duration seconds. This will override the global timeout for waiting for messages to arrive defined in SessionConfig. # Sending request :: (ToJSON params, FromJSON a) => ClientMethod -> params -> Session (ResponseMessage a) Source # Sends a request to the server and waits for its response. Will skip any messages in between the request and the response  rsp <- request TextDocumentDocumentSymbol params :: Session DocumentSymbolsResponse  Note: will skip any messages in between the request and the response. request_ :: ToJSON params => ClientMethod -> params -> Session () Source # The same as sendRequest, but discard the response. Arguments  :: ToJSON params => ClientMethod The request method. -> params The request parameters. -> Session LspId The id of the request that was sent. Sends a request to the server. Unlike request, this doesn't wait for the response. Arguments  :: ToJSON a => ClientMethod The notification method. -> a The notification parameters. -> Session () Sends a notification to the server. sendResponse :: ToJSON a => ResponseMessage a -> Session () Source # Sends a response to the server. # Receving To receive a message, just specify the type that expect: msg1 <- message :: Session ApplyWorkspaceEditRequest msg2 <- message :: Session HoverResponse  Session is actually just a parser that operates on messages under the hood. This means that you can create and combine parsers to match speicifc sequences of messages that you expect. For example, if you wanted to match either a definition or references request: defOrImpl = (message :: Session DefinitionRequest) <|> (message :: Session ReferencesRequest) If you wanted to match any number of telemetry notifications immediately followed by a response: logThenDiags = skipManyTill (message :: Session TelemetryNotification) anyResponse  message :: forall a. (Typeable a, FromJSON a) => Session a Source # Matches a message of type a. Matches if the message is a request. Matches if the message is a response. Matches if the message is a notification. Matches any type of message. Matches if the message is a log message notification or a show message notification/request. Matches a PublishDiagnosticsNotification (textDocument/publishDiagnostics) notification. responseForId :: forall a. FromJSON a => LspId -> Session (ResponseMessage a) Source # Matches a response for a specific id. # Utilities Quick helper functions for common tasks. ** Initialization Returns the initialize response that was received from the server. The initialize requests and responses are not included the session, so if you need to test it use this. ## Documents Opens a text document and sends a notification to the client. Closes a text document and sends a notification to the client. The current text contents of a document. Parses an ApplyEditRequest, checks that it is for the passed document and returns the new content Gets the Uri for the file corrected to the session directory. Adds the current version to the document, as tracked by the session. ## Symbols Returns the symbols in a document. ## Diagnostics Waits for diagnostics to be published and returns them. The same as waitForDiagnostics, but will only match a specific $sel:_source:Diagnostic.

Expects a PublishDiagnosticsNotification and throws an UnexpectedDiagnosticsException if there are any diagnostics returned.

## Commands

Executes a command.

## Code Actions

Returns all the code actions in a document by querying the code actions at each of the current diagnostics' positions.

Executes a code action. Matching with the specification, if a code action contains both an edit and a command, the edit will be applied first.

## Completions

Returns the completions for the position in the document.

## References

Arguments

 :: TextDocumentIdentifier The document to lookup in. -> Position The position to lookup. -> Bool Whether to include declarations as references. -> Session [Location] The locations of the references.

Returns the references for the position in the document.

## Definitions

Arguments

 :: TextDocumentIdentifier The document the term is in. -> Position The position the term is at. -> Session [Location] The location(s) of the definitions

Returns the definition(s) for the term at the specified position.

## Renaming

Renames the term at the specified position.

## Hover

Returns the hover information at the specified position.

## Highlights

Returns the highlighted occurences of the term at the specified position

## Formatting

Applies formatting to the specified document.

Applies formatting to the specified range in a document.

## Edits

Applys an edit to the document and returns the updated document version.