Skip to content

Commit 74f3832

Browse files
committed
fix: restore Java 8 dependency and test compatibility
1 parent d7f534f commit 74f3832

7 files changed

Lines changed: 97 additions & 55 deletions

File tree

‎pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
<!-- Dependency versions -->
6262
<commons-exec.version>1.4.0</commons-exec.version>
6363
<commons-lang.version>2.6</commons-lang.version>
64-
<jackson.version>2.17.2</jackson.version>
64+
<jackson.version>2.18.9</jackson.version>
6565
<junit-jupiter.version>5.11.4</junit-jupiter.version>
6666
<junit.version>4.13.2</junit.version>
6767
<lombok.version>1.18.46</lombok.version>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.github.easy4j.opencode;
2+
3+
import java.util.Arrays;
4+
import java.util.Collections;
5+
import java.util.LinkedHashMap;
6+
import java.util.LinkedHashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
11+
/**
12+
* JDK 8 测试集合工厂,替代 JDK 9 引入的集合静态工厂。
13+
*/
14+
public final class Java8Collections {
15+
16+
private Java8Collections() {
17+
}
18+
19+
@SafeVarargs
20+
public static <T> List<T> list(T... values) {
21+
return Collections.unmodifiableList(Arrays.asList(values));
22+
}
23+
24+
@SuppressWarnings("unchecked")
25+
public static <K, V> Map<K, V> map(Object... values) {
26+
Map<K, V> result = new LinkedHashMap<>();
27+
for (int index = 0; index < values.length; index += 2) {
28+
result.put((K) values[index], (V) values[index + 1]);
29+
}
30+
return Collections.unmodifiableMap(result);
31+
}
32+
33+
@SafeVarargs
34+
public static <T> Set<T> set(T... values) {
35+
return Collections.unmodifiableSet(new LinkedHashSet<>(Arrays.asList(values)));
36+
}
37+
}

‎src/test/java/io/github/easy4j/opencode/OpenCodeClientTest.java‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.fasterxml.jackson.databind.ObjectMapper;
44
import io.github.easy4j.opencode.api.OpenCodeHttpClient;
55
import io.github.easy4j.opencode.api.OpenCodeSseClient;
6+
import io.github.easy4j.opencode.api.model.Agent;
7+
import io.github.easy4j.opencode.api.model.HealthStatus;
8+
import io.github.easy4j.opencode.api.model.OpenCodeConfig;
9+
import io.github.easy4j.opencode.api.model.Session;
610
import io.github.easy4j.opencode.cli.OpenCodeCli;
711
import io.github.easy4j.opencode.cli.OpenCodeCliExecutor;
812
import io.github.easy4j.opencode.cli.OpenCodeCliResult;
@@ -14,6 +18,7 @@
1418
import org.junit.jupiter.api.Test;
1519

1620
import java.io.IOException;
21+
import java.util.List;
1722
import java.util.concurrent.ExecutorService;
1823
import java.util.concurrent.Executors;
1924

@@ -131,7 +136,7 @@ void shouldDelegateHealthToHttpClient() {
131136
OpenCodeHttpClient httpClient = new OpenCodeHttpClient(httpConfig, new ObjectMapper(), null);
132137
OpenCodeClient client = new OpenCodeClient(config, httpClient, null, null);
133138

134-
var health = client.health();
139+
HealthStatus health = client.health();
135140
assertNotNull(health);
136141
assertTrue(health.getHealthy());
137142
client.close();
@@ -149,7 +154,7 @@ void shouldDelegateListSessions() {
149154
OpenCodeHttpClient httpClient = new OpenCodeHttpClient(httpConfig, new ObjectMapper(), null);
150155
OpenCodeClient client = new OpenCodeClient(config, httpClient, null, null);
151156

152-
var sessions = client.listSessions();
157+
List<Session> sessions = client.listSessions();
153158
assertNotNull(sessions);
154159
assertEquals(1, sessions.size());
155160
client.close();
@@ -167,7 +172,7 @@ void shouldDelegateListAgents() {
167172
OpenCodeHttpClient httpClient = new OpenCodeHttpClient(httpConfig, new ObjectMapper(), null);
168173
OpenCodeClient client = new OpenCodeClient(config, httpClient, null, null);
169174

170-
var agents = client.listAgents();
175+
List<Agent> agents = client.listAgents();
171176
assertNotNull(agents);
172177
assertEquals(1, agents.size());
173178
client.close();
@@ -185,7 +190,7 @@ void shouldDelegateGetConfig() {
185190
OpenCodeHttpClient httpClient = new OpenCodeHttpClient(httpConfig, new ObjectMapper(), null);
186191
OpenCodeClient client = new OpenCodeClient(config, httpClient, null, null);
187192

188-
var codeConfig = client.getOpenCodeConfig();
193+
OpenCodeConfig codeConfig = client.getOpenCodeConfig();
189194
assertNotNull(codeConfig);
190195
assertEquals("dark", codeConfig.getTheme());
191196
client.close();

‎src/test/java/io/github/easy4j/opencode/api/OpenCodeSseClientTest.java‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,20 @@
66
import io.github.easy4j.opencode.api.sse.SseQueueSubscription;
77
import io.github.easy4j.opencode.api.sse.SseSubscription;
88
import okhttp3.mockwebserver.MockResponse;
9+
import okhttp3.mockwebserver.RecordedRequest;
910
import okhttp3.mockwebserver.MockWebServer;
1011
import org.junit.jupiter.api.AfterEach;
1112
import org.junit.jupiter.api.BeforeEach;
1213
import org.junit.jupiter.api.Test;
1314

1415
import java.io.IOException;
1516
import java.util.Collections;
16-
import java.util.Set;
1717
import java.util.concurrent.ArrayBlockingQueue;
1818
import java.util.concurrent.BlockingQueue;
1919
import java.util.concurrent.TimeUnit;
2020
import java.util.concurrent.atomic.AtomicReference;
2121

22+
import static io.github.easy4j.opencode.Java8Collections.set;
2223
import static org.junit.jupiter.api.Assertions.*;
2324

2425
/**
@@ -75,7 +76,7 @@ void shouldSubscribeWithContext() throws InterruptedException {
7576
Thread.sleep(500);
7677
assertNotNull(received.get());
7778

78-
var request = server.takeRequest(2, TimeUnit.SECONDS);
79+
RecordedRequest request = server.takeRequest(2, TimeUnit.SECONDS);
7980
assertNotNull(request);
8081
assertEquals("/data/project", request.getHeader("X-OpenCode-Directory"));
8182
subscription.cancel();
@@ -121,7 +122,7 @@ void shouldFilterByEventTypes() throws InterruptedException {
121122

122123
AtomicReference<SseEvent> received = new AtomicReference<>();
123124
SseSubscription subscription = sseClient.subscribeEventTypes(
124-
Set.of("wanted"), received::set);
125+
set("wanted"), received::set);
125126

126127
Thread.sleep(500);
127128
assertNotNull(received.get());
@@ -197,7 +198,7 @@ public void onEvent(SseEvent event) {
197198
Thread.sleep(500);
198199
assertNotNull(received.get());
199200

200-
var request = server.takeRequest(2, TimeUnit.SECONDS);
201+
RecordedRequest request = server.takeRequest(2, TimeUnit.SECONDS);
201202
assertNotNull(request);
202203
assertEquals("/data/proj", request.getHeader("X-OpenCode-Directory"));
203204
subscription.cancel();

‎src/test/java/io/github/easy4j/opencode/api/event/EventHandlerTest.java‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import io.github.easy4j.opencode.api.sse.SseEvent;
44
import org.junit.jupiter.api.Test;
55

6-
import java.util.Map;
7-
6+
import static io.github.easy4j.opencode.Java8Collections.map;
87
import static org.junit.jupiter.api.Assertions.*;
98

109
/**
@@ -17,14 +16,14 @@ void shouldNotThrowOnDefaultMethods() {
1716
EventHandler handler = new EventHandler() {};
1817
SseEvent event = new SseEvent();
1918
event.setType("test");
20-
event.setProperties(Map.of());
19+
event.setProperties(map());
2120

2221
// All default methods should be no-op and not throw
2322
assertDoesNotThrow(() -> handler.onEvent(event));
2423
assertDoesNotThrow(() -> handler.onSessionIdle("sess-1", event));
2524
assertDoesNotThrow(() -> handler.onSessionError("sess-1", "error", event));
2625
assertDoesNotThrow(() -> handler.onTextDelta("delta", event));
27-
assertDoesNotThrow(() -> handler.onToolCall("bash", Map.of(), event));
26+
assertDoesNotThrow(() -> handler.onToolCall("bash", map(), event));
2827
assertDoesNotThrow(() -> handler.onToolResult("use-1", "output", event));
2928
assertDoesNotThrow(() -> handler.onMessage("msg-1", "assistant", event));
3029
assertDoesNotThrow(() -> handler.onSessionStatus("sess-1", "idle", event));

‎src/test/java/io/github/easy4j/opencode/api/model/ModelClassesTest.java‎

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
import org.junit.jupiter.api.Test;
88

99
import java.util.Collections;
10-
import java.util.List;
11-
import java.util.Map;
1210

11+
import static io.github.easy4j.opencode.Java8Collections.list;
12+
import static io.github.easy4j.opencode.Java8Collections.map;
1313
import static org.junit.jupiter.api.Assertions.*;
1414

1515
/**
@@ -83,7 +83,7 @@ void shouldCreateChatRequestWithAllFields() {
8383
req.setModel("anthropic/claude-sonnet-4-5");
8484
req.setMessages(Collections.singletonList(ChatMessage.user("hi")));
8585
req.setStream(true);
86-
req.setStreamOptions(Map.of("include_usage", true));
86+
req.setStreamOptions(map("include_usage", true));
8787
req.setAgent("coder");
8888
req.setSystem("system prompt");
8989
req.setMaxTokens(1024);
@@ -223,7 +223,7 @@ void shouldCreateCommand() {
223223
cmd.setName("/help");
224224
cmd.setDescription("Show help");
225225
cmd.setTemplate("help {{arg}}");
226-
cmd.setArgs(List.of("arg"));
226+
cmd.setArgs(list("arg"));
227227
cmd.setAgent("coder");
228228
assertEquals("/help", cmd.getName());
229229
assertEquals("Show help", cmd.getDescription());
@@ -240,7 +240,7 @@ void shouldCreateCommand() {
240240
void shouldCreateEvent() {
241241
SseEvent event = new SseEvent();
242242
event.setType("session.idle");
243-
event.setProperties(Map.of("sessionID", "sess-1"));
243+
event.setProperties(map("sessionID", "sess-1"));
244244
assertEquals("session.idle", event.getType());
245245
assertEquals("sess-1", event.getProperties().get("sessionID"));
246246
}
@@ -309,10 +309,10 @@ void shouldCreateFileNode() {
309309
void shouldCreateFileSearchResult() {
310310
FileSearchResult result = new FileSearchResult();
311311
result.setPath("src/Main.java");
312-
result.setLines(List.of("public class Main {}"));
312+
result.setLines(list("public class Main {}"));
313313
result.setLineNumber(1);
314314
result.setAbsoluteOffset(0);
315-
result.setSubmatches(List.of());
315+
result.setSubmatches(list());
316316
assertEquals("src/Main.java", result.getPath());
317317
assertEquals(1, result.getLineNumber());
318318
}
@@ -355,7 +355,7 @@ void shouldCreateLspStatus() {
355355
lsp.setName("Eclipse JDT");
356356
lsp.setRoot("/project");
357357
lsp.setStatus("running");
358-
lsp.setDiagnostics(List.of());
358+
lsp.setDiagnostics(list());
359359
assertEquals("jdtls", lsp.getId());
360360
assertEquals("running", lsp.getStatus());
361361
}
@@ -369,8 +369,8 @@ void shouldCreateMcpStatus() {
369369
McpStatus mcp = new McpStatus();
370370
mcp.setName("github");
371371
mcp.setStatus("connected");
372-
mcp.setConfig(Map.of("url", "http://localhost"));
373-
mcp.setTools(List.of("tool1"));
372+
mcp.setConfig(map("url", "http://localhost"));
373+
mcp.setTools(list("tool1"));
374374
assertEquals("github", mcp.getName());
375375
assertEquals("connected", mcp.getStatus());
376376
assertEquals(1, mcp.getTools().size());
@@ -403,7 +403,7 @@ void shouldCreateMessageInfo() {
403403
Message msg = new Message();
404404
msg.setId("msg-1");
405405
info.setInfo(msg);
406-
info.setParts(List.of());
406+
info.setParts(list());
407407
assertEquals("msg-1", info.getInfo().getId());
408408
assertTrue(info.getParts().isEmpty());
409409
}
@@ -424,15 +424,15 @@ void shouldCreateOpenCodeConfig() {
424424
cfg.setUsername("user");
425425
cfg.setShare("public");
426426
cfg.setAutoshare(true);
427-
cfg.setMode(Map.of("k", "v"));
428-
cfg.setProvider_(Map.of("k", "v"));
429-
cfg.setProviders(Map.of("k", "v"));
430-
cfg.setAgent_(Map.of("k", "v"));
431-
cfg.setAgents(Map.of("k", "v"));
432-
cfg.setPermission(Map.of("k", "v"));
433-
cfg.setTools(Map.of("k", "v"));
434-
cfg.setExperimental(Map.of("k", "v"));
435-
cfg.setExtra(Map.of("k", "v"));
427+
cfg.setMode(map("k", "v"));
428+
cfg.setProvider_(map("k", "v"));
429+
cfg.setProviders(map("k", "v"));
430+
cfg.setAgent_(map("k", "v"));
431+
cfg.setAgents(map("k", "v"));
432+
cfg.setPermission(map("k", "v"));
433+
cfg.setTools(map("k", "v"));
434+
cfg.setExperimental(map("k", "v"));
435+
cfg.setExtra(map("k", "v"));
436436
assertEquals("dark", cfg.getTheme());
437437
assertEquals("anthropic/claude-sonnet-4-5", cfg.getModel());
438438
assertEquals("coder", cfg.getAgent());
@@ -498,8 +498,8 @@ void shouldCreatePermissionRequest() {
498498
pr.setSessionID("sess-1");
499499
pr.setPermission("bash");
500500
pr.setDescription("run ls");
501-
pr.setMetadata(Map.of("command", "ls"));
502-
pr.setPatterns(List.of("ls *"));
501+
pr.setMetadata(map("command", "ls"));
502+
pr.setPatterns(list("ls *"));
503503
assertEquals("perm-1", pr.getId());
504504
assertEquals("bash", pr.getPermission());
505505
assertEquals(1, pr.getPatterns().size());
@@ -518,7 +518,7 @@ void shouldCreateProject() {
518518
project.setWorktree("/project");
519519
project.setVcsDir("/project/.git");
520520
project.setVcs("git");
521-
project.setSandboxes(List.of("sandbox1"));
521+
project.setSandboxes(list("sandbox1"));
522522
project.setCreatedAt("2025-01-01");
523523
assertEquals("proj-1", project.getId());
524524
assertEquals("my-project", project.getName());
@@ -550,7 +550,7 @@ void shouldCreatePromptRequestOfTextWithModel() {
550550
@Test
551551
void shouldSetAllPromptRequestFields() {
552552
PromptRequest req = new PromptRequest();
553-
req.setParts(List.of());
553+
req.setParts(list());
554554
req.setModel(new PromptRequest.ModelRef("anthropic", "claude-sonnet-4-5"));
555555
req.setAgent("coder");
556556
req.setNoReply(true);
@@ -577,7 +577,7 @@ void shouldExtractTextContent() {
577577
toolPart.setText("ignored");
578578

579579
PromptResult result = new PromptResult();
580-
result.setParts(List.of(textPart, textPart2, toolPart));
580+
result.setParts(list(textPart, textPart2, toolPart));
581581
assertEquals("hello world", result.getTextContent());
582582
}
583583

@@ -593,7 +593,7 @@ void shouldReturnEmptyStringWhenNoTextParts() {
593593
toolPart.setType("tool_use");
594594
toolPart.setText("data");
595595
PromptResult result = new PromptResult();
596-
result.setParts(List.of(toolPart));
596+
result.setParts(list(toolPart));
597597
assertEquals("", result.getTextContent());
598598
}
599599

@@ -608,9 +608,9 @@ void shouldCreateProvider() {
608608
p.setName("Anthropic");
609609
p.setDescription("AI provider");
610610
p.setSource("builtin");
611-
p.setAuthMethods(List.of());
612-
p.setModels(Map.of());
613-
p.setOptions(Map.of());
611+
p.setAuthMethods(list());
612+
p.setModels(map());
613+
p.setOptions(map());
614614
assertEquals("anthropic", p.getId());
615615
assertEquals("Anthropic", p.getName());
616616
}
@@ -642,9 +642,9 @@ void shouldCreateProviderAuthMethod() {
642642
ProviderAuthMethod method = new ProviderAuthMethod();
643643
method.setLabel("API Key");
644644
method.setType("api-key");
645-
method.setSchema(Map.of("type", "string"));
646-
method.setPrefill(Map.of());
647-
method.setPromptOptions(List.of());
645+
method.setSchema(map("type", "string"));
646+
method.setPrefill(map());
647+
method.setPromptOptions(list());
648648
assertEquals("API Key", method.getLabel());
649649
assertEquals("api-key", method.getType());
650650
}
@@ -656,10 +656,10 @@ void shouldCreateProviderAuthMethod() {
656656
@Test
657657
void shouldCreateProviderList() {
658658
ProviderList list = new ProviderList();
659-
list.setAll(List.of());
660-
list.setDefaults(Map.of("default", "anthropic/claude-sonnet-4-5"));
661-
list.setDefault_(Map.of("default", "anthropic/claude-sonnet-4-5"));
662-
list.setConnected(List.of("anthropic"));
659+
list.setAll(list());
660+
list.setDefaults(map("default", "anthropic/claude-sonnet-4-5"));
661+
list.setDefault_(map("default", "anthropic/claude-sonnet-4-5"));
662+
list.setConnected(list("anthropic"));
663663
assertTrue(list.getAll().isEmpty());
664664
assertEquals(1, list.getConnected().size());
665665
}
@@ -679,7 +679,7 @@ void shouldCreateQuestionRequest() {
679679
opt.setLabel("Option A");
680680
opt.setDescription("First option");
681681
opt.setPreview("preview");
682-
qr.setOptions(List.of(opt));
682+
qr.setOptions(list(opt));
683683
assertEquals("q-1", qr.getId());
684684
assertEquals(1, qr.getOptions().size());
685685
assertEquals("Option A", qr.getOptions().get(0).getLabel());
@@ -697,7 +697,7 @@ void shouldCreateSession() {
697697
s.setParentId(null);
698698
s.setCreatedAt("2025-01-01");
699699
s.setUpdatedAt("2025-01-02");
700-
s.setMetadata(Map.of("key", "val"));
700+
s.setMetadata(map("key", "val"));
701701
assertEquals("sess-1", s.getId());
702702
assertEquals("my-session", s.getTitle());
703703
}
@@ -759,7 +759,7 @@ void shouldCreateSymbol() {
759759
sym.setContainerName("io.github.easy4j.opencode");
760760
sym.setLocation("OpenCodeClient.java:50");
761761
sym.setUri("file:///project/OpenCodeClient.java");
762-
sym.setRange(Map.of());
762+
sym.setRange(map());
763763
assertEquals("OpenCodeClient", sym.getName());
764764
assertEquals("class", sym.getKind());
765765
}

0 commit comments

Comments
 (0)