Add test generation functionality (optional with vscode-java-test)

This commit is contained in:
Mathias Fussenegger 2023-07-09 10:12:41 +02:00 committed by Mathias Fußenegger
parent 0261cf5a76
commit 6e6352f671
5 changed files with 120 additions and 2 deletions

View file

@ -37,6 +37,8 @@ alternative:
- [x] `jol` command to show memory usage of current file (`jol_path` must be set)
- [x] `jshell` command to open up `jshell` with `classpath` from project set
- [x] Debugger support via [nvim-dap][5]
- [x] Optional vscode-java-test extensions
- [x] Generate tests via `require("jdtls.tests").generate()`
Take a look at [a demo](https://github.com/mfussenegger/nvim-jdtls/issues/3) to
see some of the functionality in action.

View file

@ -250,4 +250,11 @@ JdtTestOpts *JdtTestOpts*
{lnum?} (number) 1-indexed line number. Used to find nearest test. Defaults to cursor position of the current window.
==============================================================================
Functions which require vscode-java-test *jdtls.tests*
M.generate() *jdtls.tests.generate*
Generate tests for the current class
vim:tw=78:ts=8:noet:ft=help:norl:

View file

@ -1,4 +1,4 @@
#!/usr/bin/env bash
set -Eeuo pipefail
lemmy-help -f lua/jdtls.lua lua/jdtls/dap.lua >doc/jdtls.txt
lemmy-help -f lua/jdtls.lua lua/jdtls/dap.lua lua/jdtls/tests.lua >doc/jdtls.txt

View file

@ -761,7 +761,9 @@ local function java_override_methods(_, context)
print("Error getting workspace edits: " .. err2.message)
return
end
vim.lsp.util.apply_workspace_edit(result2, offset_encoding)
if result2 then
vim.lsp.util.apply_workspace_edit(result2, offset_encoding)
end
end)()
end
@ -777,6 +779,28 @@ M.commands = {
['java.action.generateConstructorsPrompt'] = java_generate_constructors_prompt;
['java.action.generateDelegateMethodsPrompt'] = java_generate_delegate_methods_prompt;
['java.action.overrideMethodsPrompt'] = java_override_methods;
['_java.test.askClientForChoice'] = function(args)
local prompt = args[1]
local choices = args[2]
local pick_many = args[3]
return require("jdtls.tests")._ask_client_for_choice(prompt, choices, pick_many)
end,
['_java.test.advancedAskClientForChoice'] = function(args)
local prompt = args[1]
local choices = args[2]
-- local advanced_action = args[3]
local pick_many = args[4]
return require("jdtls.tests")._ask_client_for_choice(prompt, choices, pick_many)
end,
['_java.test.askClientForInput'] = function(args)
local prompt = args[1]
local default = args[2]
local result = vim.fn.input({
prompt = prompt .. ': ',
default = default
})
return result and result or vim.NIL
end,
}
if vim.lsp.commands then

85
lua/jdtls/tests.lua Normal file
View file

@ -0,0 +1,85 @@
---@mod jdtls.tests Functions which require vscode-java-test
local api = vim.api
local M = {}
--- Generate tests for the current class
function M.generate()
local bufnr = api.nvim_get_current_buf()
local win = api.nvim_get_current_win()
local cursor = api.nvim_win_get_cursor(win) -- (1, 0) indexed
local lnum = cursor[1]
local line = api.nvim_buf_get_lines(bufnr, lnum -1, lnum, true)[1]
local byteoffset = vim.fn.line2byte(lnum) + vim.str_byteindex(line, cursor[2], true)
local command = {
title = "Generate tests",
command = "vscode.java.test.generateTests",
arguments = {vim.uri_from_bufnr(bufnr), byteoffset},
}
---@param result? lsp.WorkspaceEdit
local on_result = function(err, result)
assert(not err, err)
if not result then
return
end
vim.lsp.util.apply_workspace_edit(result, "utf-16")
if not api.nvim_win_is_valid(win) or api.nvim_win_get_buf(win) ~= bufnr then
return
end
-- Set buffer of window to first created/changed file
local uri = next(result.changes or {})
if uri then
local changed_buf = vim.uri_to_bufnr(uri)
api.nvim_win_set_buf(win, changed_buf)
else
-- documentChanges?: ( TextDocumentEdit[] | (TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[]);
local changes = result.documentChanges or {}
local _, change = next(changes)
---@diagnostic disable-next-line: undefined-field
local document = changes.textDocument or change.textDocument
if change.uri and change.kind ~= "delete" then
local changed_buf = vim.uri_to_bufnr(change.uri)
api.nvim_win_set_buf(win, changed_buf)
elseif document then
local changed_buf = vim.uri_to_bufnr(document.uri)
api.nvim_win_set_buf(win, changed_buf)
end
end
end
require("jdtls.util").execute_command(command, on_result, bufnr)
end
---@private
function M._ask_client_for_choice(prompt, choices, pick_many)
local label = function(x)
local description = x.description and (' ' .. x.description) or ''
return x.label .. description
end
local ui = require("jdtls.ui")
if pick_many then
local opts = {
is_selected = function(x) return x.picked end
}
local result = ui.pick_many(choices, prompt, label, opts)
return vim.tbl_map(function(x) return x.value or x.label end, result)
else
local co, is_main = coroutine.running()
local choice
if co and not is_main then
ui.pick_one_async(choices, prompt, label, function(result)
coroutine.resume(co, result)
end)
choice = coroutine.yield()
else
choice = ui.pick_one(choices, prompt, label)
end
return choice and (choice.value or choice.label) or vim.NIL
end
end
return M