Skip to content

Commit 960425f

Browse files
authored
feat: add java test run APIs (#10)
1 parent baf5e5b commit 960425f

File tree

9 files changed

+708
-8
lines changed

9 files changed

+708
-8
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
local List = require('java.utils.list')
2+
local Set = require('java.utils.set')
3+
local JavaTestClient = require('java.ls.clients.java-test-client')
4+
5+
local M = {}
6+
7+
---@class JavaTestLauncherConfig
8+
---@field name string
9+
---@field type string
10+
---@field request string
11+
---@field mainClass string
12+
---@field projectName string
13+
---@field cwd string
14+
---@field classPaths string[]
15+
---@field modulePaths string[]
16+
---@field vmArgs string
17+
---@field noDebug boolean
18+
---@field javaExec string
19+
---@field args string
20+
---@field env? { [string]: string; }
21+
---@field envFile? string
22+
---@field sourcePaths string[]
23+
---@field preLaunchTask? string
24+
---@field postDebugTask? string
25+
26+
---Returns the launcher config
27+
---@param test_details JavaTestDetails | JavaTestDetails[]
28+
---@param launch_args JavaTestJunitLaunchArguments
29+
---@param java_exec JavaDebugResolveJavaExecutableResponse
30+
---@param config { debug: boolean, label: string }
31+
---@return JavaTestLauncherConfig
32+
function M.get_dap_launcher_config(launch_args, java_exec, config)
33+
return {
34+
name = config.label,
35+
type = 'java',
36+
request = 'launch',
37+
mainClass = launch_args.mainClass,
38+
projectName = launch_args.projectName,
39+
noDebug = not config.debug,
40+
javaExec = java_exec,
41+
cwd = launch_args.workingDirectory,
42+
classPaths = Set:new(launch_args.classpath),
43+
modulePaths = Set:new(launch_args.modulepath),
44+
vmArgs = List:new(launch_args.vmArguments):join(' '),
45+
args = List:new(launch_args.programArguments):join(' '),
46+
-- env: config?.env,
47+
-- envFile: config?.envFile,
48+
-- sourcePaths: config?.sourcePaths,
49+
-- preLaunchTask: config?.preLaunchTask,
50+
-- postDebugTask: config?.postDebugTask,
51+
}
52+
53+
-- if test_details.testKind == TestKind.TestNG then
54+
-- path.join(extensionContext.extensionPath, 'server', 'com.microsoft.java.test.runner-jar-with-dependencies.jar'),
55+
-- end
56+
end
57+
58+
---comment
59+
---@param tests JavaTestDetails | JavaTestDetails[]
60+
function M.get_junit_launch_argument_params(tests)
61+
if not vim.tbl_islist(tests) then
62+
return {
63+
projectName = tests.projectName,
64+
testLevel = tests.testLevel,
65+
testKind = tests.testKind,
66+
testNames = M.get_test_names({ tests }),
67+
}
68+
end
69+
70+
local first_test = tests[1]
71+
72+
return {
73+
projectName = first_test.projectName,
74+
testLevel = first_test.testLevel,
75+
testKind = first_test.testKind,
76+
testNames = M.get_test_names(tests),
77+
}
78+
end
79+
80+
---Returns a list of test names to be passed to test launch arguments resolver
81+
---@param tests JavaTestDetails[]
82+
---@return List
83+
function M.get_test_names(tests)
84+
return List:new(tests):map(function(test)
85+
if
86+
test.testKind == JavaTestClient.TestKind.TestNG
87+
or test.testLevel == JavaTestClient.TestLevel.Class
88+
then
89+
return test.fullName
90+
end
91+
92+
return test.jdtHandler
93+
end)
94+
end
95+
96+
return M

lua/java/ls/clients/java-debug-client.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
local JDTLSClient = require('java.ls.clients.jdtls-client')
22

3+
---@class JavaDebugClient: JDTLSClient
34
local M = JDTLSClient:new()
45

56
---@class JavaDebugResolveMainClassRecord
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
local log = require('java.utils.log')
2+
local JDTLSClient = require('java.ls.clients.jdtls-client')
3+
4+
---@class JavaTestDetails: Configuration
5+
---@field fullName string
6+
---@field id string
7+
---@field jdtHandler string
8+
---@field label string
9+
---@field projectName string
10+
---@field testKind integer
11+
---@field testLevel integer
12+
---@field uri string
13+
14+
---@class JavaTestDetailsWithRange: JavaTestDetails
15+
---@field range Range
16+
17+
---@class JavaTestDetailsWithChildren: JavaTestDetails
18+
---@field children JavaTestDetailsWithRange[]
19+
20+
---@class JavaTestDetailsWithChildrenAndRange: JavaTestDetails
21+
---@field range Range
22+
---@field children JavaTestDetailsWithRange[]
23+
24+
---@class Range
25+
---@field start CursorPoint
26+
---@field end CursorPoint
27+
28+
---@class CursorPoint
29+
---@field line integer
30+
---@field character integer
31+
32+
---@class JavaTestClient: JDTLSClient
33+
local M = JDTLSClient:new()
34+
35+
---@alias JavaTestFindJavaProjectsResponse JavaTestDetails[]
36+
37+
---Returns a list of project details in the current root
38+
---@return Promise
39+
function M:find_java_projects()
40+
return self:execute_command(
41+
'vscode.java.test.findJavaProjects',
42+
{ vim.uri_from_fname(self.client.config.root_dir) }
43+
)
44+
end
45+
46+
---@alias JavaTestFindTestPackagesAndTypesResponse JavaTestDetailsWithChildren[]
47+
48+
---Returns a list of test package details
49+
---@param token any
50+
---@return Promise
51+
function M:find_test_packages_and_types(handler, token)
52+
return self:execute_command(
53+
'vscode.java.test.findTestPackagesAndTypes',
54+
{ handler, token }
55+
)
56+
end
57+
58+
---@alias JavaTestFindTestTypesAndMethodsResponse JavaTestDetailsWithChildrenAndRange[]
59+
60+
---Returns test informations in a given file
61+
---@param file_uri string
62+
---@param token any
63+
---@return Promise
64+
function M:find_test_types_and_methods(file_uri, token)
65+
return self:execute_command(
66+
'vscode.java.test.findTestTypesAndMethods',
67+
{ file_uri, token }
68+
)
69+
end
70+
71+
---@class JavaTestJunitLaunchArguments
72+
---@field classpath string[]
73+
---@field mainClass string
74+
---@field modulepath string[]
75+
---@field programArguments string[]
76+
---@field projectName string
77+
---@field vmArguments string[]
78+
---@field workingDirectory string
79+
80+
---@class JavaTestResolveJUnitLaunchArgumentsParams
81+
---@field project_name string
82+
---@field test_names string[]
83+
---@field test_level TestLevel
84+
---@field test_kind TestKind
85+
86+
---Returns junit launch arguments
87+
---@param args JavaTestResolveJUnitLaunchArgumentsParams
88+
---@return Promise
89+
function M:resolve_junit_launch_arguments(args)
90+
return self
91+
:execute_command(
92+
'vscode.java.test.junit.argument',
93+
vim.fn.json_encode(args)
94+
)
95+
:thenCall(
96+
97+
---@class JavaTestJunitLaunchArgumentsResponse
98+
---@field body JavaTestJunitLaunchArguments
99+
---@field status integer
100+
101+
---@param res JavaTestJunitLaunchArgumentsResponse
102+
function(res)
103+
if not res.body then
104+
local msg = 'Failed to retrive JUnit launch arguments'
105+
106+
log.error(msg, res)
107+
error(msg)
108+
end
109+
110+
return res.body
111+
end
112+
)
113+
end
114+
115+
---@enum TestKind
116+
M.TestKind = {
117+
JUnit5 = 0,
118+
JUnit = 1,
119+
TestNG = 2,
120+
None = 100,
121+
}
122+
123+
---@enum TestLevel
124+
M.TestLevel = {
125+
Root = 0,
126+
Workspace = 1,
127+
WorkspaceFolder = 2,
128+
Project = 3,
129+
Package = 4,
130+
Class = 5,
131+
Method = 6,
132+
Invocation = 7,
133+
}
134+
135+
return M

0 commit comments

Comments
 (0)