--- /dev/null
+Before:
+ runtime autoload/ale/lsp.vim
+
+ let g:message_list = []
+
+ " Register a fake connection and get it for tests.
+ call ale#lsp#Register('ale-fake-lsp-server', '/code', '', {})
+ let b:conn = ale#lsp#GetConnections()['ale-fake-lsp-server:/code']
+
+ function! ale#lsp#Send(conn_id, message) abort
+ call add(g:message_list, a:message)
+
+ return 42
+ endfunction
+
+After:
+ " Remove the connection with the ID.
+ call ale#lsp#RemoveConnectionWithID(b:conn.id)
+
+ unlet! b:conn
+ unlet! g:message_list
+
+ runtime autoload/ale/lsp.vim
+
+Execute(Messages with no method and capabilities should initialize projects):
+ call ale#lsp#HandleInitResponse(b:conn, {
+ \ 'result': {'capabilities': {}},
+ \})
+
+ AssertEqual 1, b:conn.initialized
+ AssertEqual [[1, 'initialized', {}]], g:message_list
+
+Execute(Other messages should not initialize projects):
+ call ale#lsp#HandleInitResponse(b:conn, {'method': 'lolwat'})
+
+ AssertEqual 0, b:conn.initialized
+ AssertEqual [], g:message_list
+
+ call ale#lsp#HandleInitResponse(b:conn, {'result': {'x': {}}})
+
+ AssertEqual 0, b:conn.initialized
+ AssertEqual [], g:message_list
+
+Execute(Capabilities should be set up correctly):
+ call ale#lsp#HandleInitResponse(b:conn, {
+ \ 'jsonrpc': '2.0',
+ \ 'id': 1,
+ \ 'result': {
+ \ 'capabilities': {
+ \ 'renameProvider': v:true,
+ \ 'executeCommandProvider': {
+ \ 'commands': [],
+ \ },
+ \ 'hoverProvider': v:true,
+ \ 'documentSymbolProvider': v:true,
+ \ 'documentRangeFormattingProvider': v:true,
+ \ 'codeLensProvider': {
+ \ 'resolveProvider': v:false
+ \ },
+ \ 'referencesProvider': v:true,
+ \ 'textDocumentSync': 2,
+ \ 'documentFormattingProvider': v:true,
+ \ 'codeActionProvider': v:true,
+ \ 'signatureHelpProvider': {
+ \ 'triggerCharacters': ['(', ','],
+ \ },
+ \ 'completionProvider': {
+ \ 'triggerCharacters': ['.'],
+ \ 'resolveProvider': v:false
+ \ },
+ \ 'definitionProvider': v:true,
+ \ 'experimental': {},
+ \ 'documentHighlightProvider': v:true,
+ \ 'workspaceSymbolProvider': v:true
+ \ },
+ \ },
+ \})
+
+ AssertEqual 1, b:conn.initialized
+ AssertEqual
+ \ {
+ \ 'code_actions': 1,
+ \ 'completion': 1,
+ \ 'completion_trigger_characters': ['.'],
+ \ 'definition': 1,
+ \ 'did_save': 0,
+ \ 'filerename': 0,
+ \ 'hover': 1,
+ \ 'implementation': 0,
+ \ 'includeText': 0,
+ \ 'references': 1,
+ \ 'rename': 1,
+ \ 'pull_model': 0,
+ \ 'symbol_search': 1,
+ \ 'typeDefinition': 0,
+ \ },
+ \ b:conn.capabilities
+ AssertEqual [[1, 'initialized', {}]], g:message_list
+
+Execute(Disabled capabilities should be recognised correctly):
+ call ale#lsp#HandleInitResponse(b:conn, {
+ \ 'jsonrpc': '2.0',
+ \ 'id': 1,
+ \ 'result': {
+ \ 'capabilities': {
+ \ 'renameProvider': v:false,
+ \ 'executeCommandProvider': {
+ \ 'commands': [],
+ \ },
+ \ 'hoverProvider': v:false,
+ \ 'documentSymbolProvider': v:true,
+ \ 'documentRangeFormattingProvider': v:true,
+ \ 'codeLensProvider': {
+ \ 'resolveProvider': v:false
+ \ },
+ \ 'referencesProvider': v:false,
+ \ 'textDocumentSync': 2,
+ \ 'documentFormattingProvider': v:true,
+ \ 'codeActionProvider': v:false,
+ \ 'signatureHelpProvider': {
+ \ 'triggerCharacters': ['(', ','],
+ \ },
+ \ 'definitionProvider': v:false,
+ \ 'experimental': {},
+ \ 'documentHighlightProvider': v:true,
+ \ 'diagnosticProvider': {},
+ \ },
+ \ },
+ \})
+
+ AssertEqual 1, b:conn.initialized
+ AssertEqual
+ \ {
+ \ 'code_actions': 0,
+ \ 'completion': 0,
+ \ 'completion_trigger_characters': [],
+ \ 'definition': 0,
+ \ 'did_save': 0,
+ \ 'filerename': 0,
+ \ 'hover': 0,
+ \ 'implementation': 0,
+ \ 'includeText': 0,
+ \ 'references': 0,
+ \ 'rename': 0,
+ \ 'pull_model': 0,
+ \ 'symbol_search': 0,
+ \ 'typeDefinition': 0,
+ \ },
+ \ b:conn.capabilities
+ AssertEqual [[1, 'initialized', {}]], g:message_list
+
+Execute(Capabilities should be enabled when sent as Dictionaries):
+ call ale#lsp#HandleInitResponse(b:conn, {
+ \ 'jsonrpc': '2.0',
+ \ 'id': 1,
+ \ 'result': {
+ \ 'capabilities': {
+ \ 'renameProvider': {},
+ \ 'executeCommandProvider': {
+ \ 'commands': [],
+ \ },
+ \ 'hoverProvider': {},
+ \ 'documentSymbolProvider': v:true,
+ \ 'documentRangeFormattingProvider': v:true,
+ \ 'codeLensProvider': {
+ \ 'resolveProvider': v:false
+ \ },
+ \ 'completionProvider': {
+ \ 'triggerCharacters': ['.'],
+ \ 'resolveProvider': v:false
+ \ },
+ \ 'referencesProvider': {},
+ \ 'textDocumentSync': {
+ \ 'save': {
+ \ 'includeText': v:true
+ \ }
+ \ },
+ \ 'documentFormattingProvider': v:true,
+ \ 'codeActionProvider': v:true,
+ \ 'signatureHelpProvider': {
+ \ 'triggerCharacters': ['(', ','],
+ \ },
+ \ 'definitionProvider': {},
+ \ 'typeDefinitionProvider': {},
+ \ 'implementationProvider': {},
+ \ 'experimental': {},
+ \ 'documentHighlightProvider': v:true,
+ \ 'diagnosticProvider': {
+ \ 'interFileDependencies': v:false,
+ \ },
+ \ 'workspaceSymbolProvider': {}
+ \ },
+ \ },
+ \})
+
+ AssertEqual 1, b:conn.initialized
+ AssertEqual
+ \ {
+ \ 'code_actions': 1,
+ \ 'completion': 1,
+ \ 'completion_trigger_characters': ['.'],
+ \ 'definition': 1,
+ \ 'did_save': 1,
+ \ 'filerename': 0,
+ \ 'hover': 1,
+ \ 'implementation': 1,
+ \ 'includeText': 1,
+ \ 'references': 1,
+ \ 'rename': 1,
+ \ 'pull_model': 1,
+ \ 'symbol_search': 1,
+ \ 'typeDefinition': 1,
+ \ },
+ \ b:conn.capabilities
+ AssertEqual [[1, 'initialized', {}]], g:message_list
+
+Execute(Results that are not dictionaries should be handled correctly):
+ call ale#lsp#HandleInitResponse(b:conn, {
+ \ 'jsonrpc': '2.0',
+ \ 'id': 1,
+ \ 'result': v:null,
+ \})
+ AssertEqual [], g:message_list