diff options
Diffstat (limited to 'test/lsp')
-rw-r--r-- | test/lsp/test_did_save_event.vader | 15 | ||||
-rw-r--r-- | test/lsp/test_lsp_client_messages.vader | 27 | ||||
-rw-r--r-- | test/lsp/test_lsp_command_formatting.vader | 6 | ||||
-rw-r--r-- | test/lsp/test_lsp_connections.vader | 54 | ||||
-rw-r--r-- | test/lsp/test_other_initialize_message_handling.vader | 132 | ||||
-rw-r--r-- | test/lsp/test_read_lsp_diagnostics.vader | 57 | ||||
-rw-r--r-- | test/lsp/test_update_config.vader | 17 |
7 files changed, 153 insertions, 155 deletions
diff --git a/test/lsp/test_did_save_event.vader b/test/lsp/test_did_save_event.vader index 428135fb..f8ff8f70 100644 --- a/test/lsp/test_did_save_event.vader +++ b/test/lsp/test_did_save_event.vader @@ -13,6 +13,7 @@ Before: let b:ale_enabled = 1 let g:ale_lsp_next_message_id = 1 let g:ale_run_synchronously = 1 + let g:conn_id = v:null let g:message_list = [] function! LanguageCallback() abort @@ -34,26 +35,29 @@ Before: let g:ale_linters = {'foobar': ['dummy_linter']} function! ale#lsp_linter#StartLSP(buffer, linter) abort - let l:conn = ale#lsp#NewConnection({}) - let l:conn.id = 347 - let l:conn.open_documents = {a:buffer : -1} + let g:conn_id = ale#lsp#Register('executable', '/foo/bar', {}) + call ale#lsp#MarkDocumentAsOpen(g:conn_id, a:buffer) return { \ 'buffer': a:buffer, - \ 'connection_id': 347, + \ 'connection_id': g:conn_id, \ 'project_root': '/foo/bar', \ 'language_id': 'foobar', \} endfunction " Replace the Send function for LSP, so we can monitor calls to it. - function! ale#lsp#Send(conn_id, message, ...) abort + function! ale#lsp#Send(conn_id, message) abort call add(g:message_list, a:message) endfunction After: Restore + if g:conn_id isnot v:null + call ale#lsp#RemoveConnectionWithID(g:conn_id) + endif + unlet! b:ale_enabled unlet! b:ale_linters unlet! g:message_list @@ -61,7 +65,6 @@ After: delfunction LanguageCallback delfunction ProjectRootCallback - call ale#lsp#RemoveConnectionWithID(347) call ale#test#RestoreDirectory() call ale#linter#Reset() diff --git a/test/lsp/test_lsp_client_messages.vader b/test/lsp/test_lsp_client_messages.vader index dc28c2e9..71768ce5 100644 --- a/test/lsp/test_lsp_client_messages.vader +++ b/test/lsp/test_lsp_client_messages.vader @@ -161,6 +161,17 @@ Execute(ale#lsp#message#References() should return correct messages): \ ], \ ale#lsp#message#References(bufnr(''), 12, 34) +Execute(ale#lsp#message#Symbol() should return correct messages): + AssertEqual + \ [ + \ 0, + \ 'workspace/symbol', + \ { + \ 'query': 'foobar', + \ } + \ ], + \ ale#lsp#message#Symbol('foobar') + Execute(ale#lsp#message#Hover() should return correct messages): AssertEqual \ [ @@ -175,6 +186,22 @@ Execute(ale#lsp#message#Hover() should return correct messages): \ ], \ ale#lsp#message#Hover(bufnr(''), 12, 34) +Execute(ale#lsp#message#DidChangeConfiguration() should return correct messages): + let g:ale_lsp_configuration = { + \ 'foo': 'bar' + \ } + AssertEqual + \ [ + \ 0, + \ 'workspace/didChangeConfiguration', + \ { + \ 'settings': { + \ 'foo': 'bar', + \ } + \ } + \ ], + \ ale#lsp#message#DidChangeConfiguration(bufnr(''), g:ale_lsp_configuration) + Execute(ale#lsp#tsserver_message#Open() should return correct messages): AssertEqual \ [ diff --git a/test/lsp/test_lsp_command_formatting.vader b/test/lsp/test_lsp_command_formatting.vader index 9d2c84ee..9721f37f 100644 --- a/test/lsp/test_lsp_command_formatting.vader +++ b/test/lsp/test_lsp_command_formatting.vader @@ -5,7 +5,7 @@ Before: " Mock the StartProgram function so we can just capture the arguments. function! ale#lsp#StartProgram(...) abort - let g:args = a:000 + let g:args = a:000[1:] endfunction After: @@ -27,10 +27,10 @@ Execute(Command formatting should be applied correctly for LSP linters): if has('win32') AssertEqual - \ ['cmd', 'cmd /s/c "cmd --foo"', {}], + \ ['cmd', 'cmd /s/c "cmd --foo"'], \ g:args else AssertEqual - \ ['true', [&shell, '-c', '''true'' --foo'], {}], + \ ['true', [&shell, '-c', '''true'' --foo']], \ g:args endif diff --git a/test/lsp/test_lsp_connections.vader b/test/lsp/test_lsp_connections.vader index ae64eadb..1c2fceab 100644 --- a/test/lsp/test_lsp_connections.vader +++ b/test/lsp/test_lsp_connections.vader @@ -225,57 +225,3 @@ Execute(ale#lsp#ReadMessageData() should handle a message with part of a second \ . '{"id":2,"jsonrpc":"2.0","result":{"foo":"barÜ"}}' \ . b:data \ ) - -Execute(Projects with regular project roots should be registered correctly): - let b:conn = ale#lsp#NewConnection({}) - call ale#lsp#RegisterProject(b:conn.id, '/foo/bar') - - AssertEqual - \ { - \ '/foo/bar': { - \ 'root': '/foo/bar', - \ 'initialized': 0, - \ 'message_queue': [], - \ 'capabilities_queue': [], - \ 'init_request_id': 0, - \ }, - \ }, - \ b:conn.projects - -Execute(Projects with regular project roots should be fetched correctly): - let b:conn = { - \ 'projects': { - \ '/foo/bar': {'initialized': 0, 'message_queue': [], 'init_request_id': 0}, - \ }, - \} - - AssertEqual - \ {'initialized': 0, 'message_queue': [], 'init_request_id': 0}, - \ ale#lsp#GetProject(b:conn, '/foo/bar') - -Execute(Projects with empty project roots should be registered correctly): - let b:conn = ale#lsp#NewConnection({}) - call ale#lsp#RegisterProject(b:conn.id, '') - - AssertEqual - \ { - \ '<<EMPTY>>': { - \ 'root': '', - \ 'initialized': 1, - \ 'message_queue': [], - \ 'capabilities_queue': [], - \ 'init_request_id': 0, - \ }, - \ }, - \ b:conn.projects - -Execute(Projects with empty project roots should be fetched correctly): - let b:conn = { - \ 'projects': { - \ '<<EMPTY>>': {'initialized': 1, 'message_queue': [], 'init_request_id': 0}, - \ }, - \} - - AssertEqual - \ {'initialized': 1, 'message_queue': [], 'init_request_id': 0}, - \ ale#lsp#GetProject(b:conn, '') diff --git a/test/lsp/test_other_initialize_message_handling.vader b/test/lsp/test_other_initialize_message_handling.vader index 45457979..2f59535d 100644 --- a/test/lsp/test_other_initialize_message_handling.vader +++ b/test/lsp/test_other_initialize_message_handling.vader @@ -1,83 +1,47 @@ Before: - let b:project = { + let b:conn = { + \ 'is_tsserver': 0, + \ 'data': '', + \ 'root': '/foo/bar', + \ 'open_documents': {}, \ 'initialized': 0, - \ 'init_request_id': 3, + \ 'init_request_id': 0, + \ 'init_options': {}, + \ 'config': {}, + \ 'callback_list': [], \ 'message_queue': [], \ 'capabilities_queue': [], - \} - - let b:conn = { - \ 'projects': { - \ '/foo/bar': b:project, - \ }, \ 'capabilities': { \ 'hover': 0, \ 'references': 0, \ 'completion': 0, \ 'completion_trigger_characters': [], \ 'definition': 0, + \ 'symbol_search': 0, \ }, \} After: - unlet! b:project unlet! b:conn -Execute(publishDiagnostics messages with files inside project directories should initialize projects): - " This is for some other file, ignore this one. - call ale#lsp#HandleOtherInitializeResponses(b:conn, { - \ 'method': 'textDocument/publishDiagnostics', - \ 'params': {'uri': 'file:///xyz/bar/baz.txt'}, - \}) - - AssertEqual - \ { - \ 'initialized': 0, - \ 'init_request_id': 3, - \ 'message_queue': [], - \ 'capabilities_queue': [], - \ }, - \ b:project - - call ale#lsp#HandleOtherInitializeResponses(b:conn, { - \ 'method': 'textDocument/publishDiagnostics', - \ 'params': {'uri': 'file:///foo/bar/baz.txt'}, - \}) - - AssertEqual - \ { - \ 'initialized': 1, - \ 'init_request_id': 3, - \ 'message_queue': [], - \ 'capabilities_queue': [], - \ }, - \ b:project - Execute(Messages with no method and capabilities should initialize projects): - call ale#lsp#HandleOtherInitializeResponses(b:conn, { + call ale#lsp#HandleInitResponse(b:conn, { \ 'result': {'capabilities': {}}, \}) - AssertEqual - \ { - \ 'initialized': 1, - \ 'init_request_id': 3, - \ 'message_queue': [], - \ 'capabilities_queue': [], - \ }, - \ b:project + AssertEqual 1, b:conn.initialized Execute(Other messages should not initialize projects): - call ale#lsp#HandleOtherInitializeResponses(b:conn, {'method': 'lolwat'}) + call ale#lsp#HandleInitResponse(b:conn, {'method': 'lolwat'}) - AssertEqual 0, b:project.initialized + AssertEqual 0, b:conn.initialized - call ale#lsp#HandleOtherInitializeResponses(b:conn, {'result': {'x': {}}}) + call ale#lsp#HandleInitResponse(b:conn, {'result': {'x': {}}}) - AssertEqual 0, b:project.initialized + AssertEqual 0, b:conn.initialized Execute(Capabilities should bet set up correctly): - call ale#lsp#HandleOtherInitializeResponses(b:conn, { + call ale#lsp#HandleInitResponse(b:conn, { \ 'jsonrpc': '2.0', \ 'id': 1, \ 'result': { @@ -105,34 +69,26 @@ Execute(Capabilities should bet set up correctly): \ }, \ 'definitionProvider': v:true, \ 'experimental': {}, - \ 'documentHighlightProvider': v:true + \ 'documentHighlightProvider': v:true, + \ 'workspaceSymbolProvider': v:true \ }, \ }, \}) + AssertEqual 1, b:conn.initialized AssertEqual \ { - \ 'capabilities': { - \ 'completion_trigger_characters': ['.'], - \ 'completion': 1, - \ 'references': 1, - \ 'hover': 1, - \ 'definition': 1, - \ }, - \ 'message_queue': [], - \ 'projects': { - \ '/foo/bar': { - \ 'initialized': 1, - \ 'message_queue': [], - \ 'capabilities_queue': [], - \ 'init_request_id': 3, - \ }, - \ }, + \ 'completion_trigger_characters': ['.'], + \ 'completion': 1, + \ 'references': 1, + \ 'hover': 1, + \ 'definition': 1, + \ 'symbol_search': 1, \ }, - \ b:conn + \ b:conn.capabilities Execute(Disabled capabilities should be recognised correctly): - call ale#lsp#HandleOtherInitializeResponses(b:conn, { + call ale#lsp#HandleInitResponse(b:conn, { \ 'jsonrpc': '2.0', \ 'id': 1, \ 'result': { @@ -161,23 +117,21 @@ Execute(Disabled capabilities should be recognised correctly): \ }, \}) + AssertEqual 1, b:conn.initialized AssertEqual \ { - \ 'capabilities': { - \ 'completion_trigger_characters': [], - \ 'completion': 0, - \ 'references': 0, - \ 'hover': 0, - \ 'definition': 0, - \ }, - \ 'message_queue': [], - \ 'projects': { - \ '/foo/bar': { - \ 'initialized': 1, - \ 'message_queue': [], - \ 'capabilities_queue': [], - \ 'init_request_id': 3, - \ }, - \ }, + \ 'completion_trigger_characters': [], + \ 'completion': 0, + \ 'references': 0, + \ 'hover': 0, + \ 'definition': 0, + \ 'symbol_search': 0, \ }, - \ b:conn + \ b:conn.capabilities + +Execute(Results that are not dictionaries should be handled correctly): + call ale#lsp#HandleInitResponse(b:conn, { + \ 'jsonrpc': '2.0', + \ 'id': 1, + \ 'result': v:null, + \}) diff --git a/test/lsp/test_read_lsp_diagnostics.vader b/test/lsp/test_read_lsp_diagnostics.vader index 6ca4f962..a5c5ded3 100644 --- a/test/lsp/test_read_lsp_diagnostics.vader +++ b/test/lsp/test_read_lsp_diagnostics.vader @@ -18,7 +18,7 @@ Execute(ale#lsp#response#ReadDiagnostics() should handle errors): \ 'col': 11, \ 'end_lnum': 5, \ 'end_col': 16, - \ 'nr': 'some-error', + \ 'code': 'some-error', \ } \ ], \ ale#lsp#response#ReadDiagnostics({'params': {'uri': 'filename.ts', 'diagnostics': [ @@ -39,7 +39,7 @@ Execute(ale#lsp#response#ReadDiagnostics() should handle warnings): \ 'col': 4, \ 'end_lnum': 2, \ 'end_col': 4, - \ 'nr': 'some-warning', + \ 'code': 'some-warning', \ } \ ], \ ale#lsp#response#ReadDiagnostics({'params': {'uri': 'filename.ts', 'diagnostics': [ @@ -60,7 +60,7 @@ Execute(ale#lsp#response#ReadDiagnostics() should treat messages with missing se \ 'col': 11, \ 'end_lnum': 5, \ 'end_col': 16, - \ 'nr': 'some-error', + \ 'code': 'some-error', \ } \ ], \ ale#lsp#response#ReadDiagnostics({'params': {'uri': 'filename.ts', 'diagnostics': [ @@ -109,6 +109,25 @@ Execute(ale#lsp#response#ReadDiagnostics() should include sources in detail): \ } \ ]}}) +Execute(ale#lsp#response#ReadDiagnostics() should consider -1 to be a meaningless code): + AssertEqual [ + \ { + \ 'type': 'E', + \ 'text': 'Something went wrong!', + \ 'lnum': 3, + \ 'col': 11, + \ 'end_lnum': 5, + \ 'end_col': 16, + \ } + \ ], + \ ale#lsp#response#ReadDiagnostics({'params': {'uri': 'filename.ts', 'diagnostics': [ + \ { + \ 'range': Range(2, 10, 4, 15), + \ 'message': 'Something went wrong!', + \ 'code': -1, + \ }, + \ ]}}) + Execute(ale#lsp#response#ReadDiagnostics() should handle multiple messages): AssertEqual [ \ { @@ -140,12 +159,42 @@ Execute(ale#lsp#response#ReadDiagnostics() should handle multiple messages): \ }, \ ]}}) +Execute(ale#lsp#response#ReadDiagnostics() should use relatedInformation for detail): + AssertEqual [ + \ { + \ 'type': 'E', + \ 'text': 'Something went wrong!', + \ 'lnum': 1, + \ 'col': 3, + \ 'end_lnum': 1, + \ 'end_col': 3, + \ 'detail': "Something went wrong!\n/tmp/someotherfile.txt:43:80:\n\tmight be this" + \ } + \ ], + \ ale#lsp#response#ReadDiagnostics({'params': {'uri': 'filename.ts', 'diagnostics': [ + \ { + \ 'range': Range(0, 2, 0, 2), + \ 'message': 'Something went wrong!', + \ 'relatedInformation': [{ + \ 'message': 'might be this', + \ 'location': { + \ 'uri': 'file:///tmp/someotherfile.txt', + \ 'range': { + \ 'start': { 'line': 42, 'character': 79 }, + \ 'end': { 'line': 142, 'character': 179}, + \ } + \ } + \ }] + \ } + \ ]}}) + Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle tsserver responses): AssertEqual \ [ \ { \ 'type': 'E', \ 'nr': 2365, + \ 'code': '2365', \ 'text': 'Operator ''''+'''' cannot be applied to types ''''3'''' and ''''{}''''.', \ 'lnum': 1, \ 'col': 11, @@ -162,6 +211,7 @@ Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle warnings from t \ 'lnum': 27, \ 'col': 3, \ 'nr': 2515, + \ 'code': '2515', \ 'end_lnum': 27, \ 'type': 'W', \ 'end_col': 14, @@ -177,6 +227,7 @@ Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle suggestions fro \ 'lnum': 27, \ 'col': 3, \ 'nr': 2515, + \ 'code': '2515', \ 'end_lnum': 27, \ 'type': 'I', \ 'end_col': 14, diff --git a/test/lsp/test_update_config.vader b/test/lsp/test_update_config.vader new file mode 100644 index 00000000..07068bc8 --- /dev/null +++ b/test/lsp/test_update_config.vader @@ -0,0 +1,17 @@ +Before: + runtime autoload/ale/lsp.vim + + let g:conn_id = ale#lsp#Register('executable', '/foo/bar', {}) + +After: + Restore + + unlet! g:conn_id + + runtime autoload/ale/lsp.vim + +Execute(Only send updates when the configuration dictionary changes): + AssertEqual 0, ale#lsp#UpdateConfig(g:conn_id, bufnr(''), {}) + AssertEqual 1, ale#lsp#UpdateConfig(g:conn_id, bufnr(''), {'a': 1}) + AssertEqual 0, ale#lsp#UpdateConfig(g:conn_id, bufnr(''), {'a': 1}) + AssertEqual 1, ale#lsp#UpdateConfig(g:conn_id, bufnr(''), {}) |