+let s:SEP = has('win32') ? '\' : '/'
+
+function! s:get_debug_info(bufnr) abort
+ let uri = lsp#utils#get_buffer_uri(a:bufnr)
+ let all_diags = lsp#internal#diagnostics#state#_get_all_diagnostics_grouped_by_server_for_uri(uri)
+ return "\nall diags: " . string(all_diags)
+ \ . "\nlocation list: " . string(ale#engine#GetLoclist(a:bufnr))
+ \ . "\nserver_status: " . lsp#get_server_status()
+ \ . "\ncurrent lines: " . string(getline(1, '$'))
+endfunction
+
+Describe rust-analyzer
+ Before all
+ if !executable('rust-analyzer')
+ throw 'rust-analyzer command is not found. It must be installed for running integration tests'
+ endif
+
+ let dir = IntegTestRootDir()
+ execute 'cd' dir
+ let file = join([dir, 'project', 'src', 'lib.rs'], s:SEP)
+
+ " Note: It might be better to write lib.rs here and delete in `After all` hook rather than
+ " modifying a file committed to repository directly.
+ let lib_rs_contents = readfile(file)
+ End
+
+ After all
+ " Restore contents of lib.rs since it was modified by test case
+ call writefile(lib_rs_contents, file)
+
+ redir! > integ_messages.txt
+ if exists(':LspStatus')
+ LspStatus
+ else
+ echom 'No :LspStatus command is defined'
+ endif
+ message
+ redir END
+ End
+
+ Before each
+ execute 'edit!' file
+ End
+
+ After each
+ bwipeout!
+ End
+
+ It shows diagnostics results with ALE through vim-lsp
+ Assert lsp#ale#enabled()
+
+ let bufnr = bufnr('')
+
+ let elapsed = 0 " in seconds
+ let timeout = 120 " in seconds
+ let counts = ale#statusline#Count(bufnr)
+ while elapsed <= timeout
+ if counts.total > 0
+ break
+ endif
+ sleep 1
+ let elapsed += 1
+ let counts = ale#statusline#Count(bufnr)
+ endwhile
+
+ let info = s:get_debug_info(bufnr)
+ Assert True(counts.total > 0, 'No error found after ' . elapsed . ' seconds' . info)
+
+ let loclist = ale#engine#GetLoclist(bufnr)
+ Assert NotEmpty(loclist, 'Location list from ALE is empty after ' . elapsed . ' seconds. ' . info)
+
+ let item = loclist[0]
+ let item_str = string(item)
+ Assert Equals(item.linter_name, 'vim-lsp', item_str . info)
+ Assert True(item.from_other_source, item_str . info)
+ Assert Match(item.filename, 'lib\.rs$', item_str . info)
+ Assert Match(item.text, 'this_variable_is_unused', item_str . info)
+
+ " Fix the problem
+ normal! ggjdd
+ write
+
+ let elapsed = 0 " in seconds
+ let counts = ale#statusline#Count(bufnr)
+ while elapsed <= timeout
+ if counts.total == 0
+ break
+ endif
+ sleep 1
+ let elapsed += 1
+ let counts = ale#statusline#Count(bufnr)
+ endwhile
+
+ let info = s:get_debug_info(bufnr)
+ Assert True(counts.total == 0, 'Error found after ' . elapsed . ' seconds' . info)
+
+ " Check the error was removed from location list since it'd been fixed
+ let loclist = ale#engine#GetLoclist(bufnr)
+ Assert Empty(loclist, 'Location list from ALE is not empty after ' . elapsed . ' seconds. ' . info)
+ End
+End
+
+" vim: set ft=vim: