From 4cff71838f8f156d91fc2cd401e0ac03df76299b Mon Sep 17 00:00:00 2001 From: mperor Date: Tue, 8 Oct 2024 14:55:35 +0200 Subject: [PATCH 1/8] Add Java 1.9 test class + new HTTP Client API --- src/test/java/pl/mperor/lab/java/Java9.java | 62 +++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/test/java/pl/mperor/lab/java/Java9.java diff --git a/src/test/java/pl/mperor/lab/java/Java9.java b/src/test/java/pl/mperor/lab/java/Java9.java new file mode 100644 index 0000000..058981c --- /dev/null +++ b/src/test/java/pl/mperor/lab/java/Java9.java @@ -0,0 +1,62 @@ +package pl.mperor.lab.java; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +/** + * Java 1.9 (September 2017) + */ +public class Java9 { + + @Test + public void testNewHTTPClientAPI_getMethod() throws URISyntaxException, IOException, InterruptedException, ExecutionException { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://jsonplaceholder.typicode.com/posts/1")) + .GET() + .build(); + + // Synchronous + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Assertions.assertEquals(200, response.statusCode()); + Assertions.assertNotNull(response.body()); + + // Asynchronous + CompletableFuture> responseFuture = + client.sendAsync(request, HttpResponse.BodyHandlers.ofString()); + + responseFuture.thenAccept(result -> { + Assertions.assertEquals(200, result.statusCode()); + Assertions.assertNotNull(result.body()); + }).get(); + } + + @Test + public void testNewHTTPClientAPI_postMethod() throws URISyntaxException, IOException, InterruptedException, ExecutionException { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://jsonplaceholder.typicode.com/posts")) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(""" + { + "title": "foo", + "body": "bar", + "userId": 1 + } + """) + ).build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Assertions.assertEquals(201, response.statusCode()); + Assertions.assertNotNull(response.body()); + } +} From c01a5ddacd3c31934e449dbd5ac7f3efa98ce604 Mon Sep 17 00:00:00 2001 From: mperor Date: Tue, 8 Oct 2024 15:44:24 +0200 Subject: [PATCH 2/8] Process API Improvements --- src/test/java/pl/mperor/lab/java/Java9.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/pl/mperor/lab/java/Java9.java b/src/test/java/pl/mperor/lab/java/Java9.java index 058981c..1f3e791 100644 --- a/src/test/java/pl/mperor/lab/java/Java9.java +++ b/src/test/java/pl/mperor/lab/java/Java9.java @@ -9,6 +9,7 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -59,4 +60,17 @@ public void testNewHTTPClientAPI_postMethod() throws URISyntaxException, IOExcep Assertions.assertEquals(201, response.statusCode()); Assertions.assertNotNull(response.body()); } + + @Test + public void testProcessAPI() throws IOException { + ProcessHandle self = ProcessHandle.current(); + ProcessHandle.Info info = self.info(); + Assertions.assertNotNull(info); + Assertions.assertTrue(info.command().isPresent()); + + Process process = new ProcessBuilder("java", "-version").start(); + Assertions.assertTrue(process.isAlive()); + Assertions.assertTrue(process.pid() != -1); + process.destroy(); + } } From 386b63cc9f26d753c49f233e579ecd3fb2fcfc02 Mon Sep 17 00:00:00 2001 From: mperor Date: Tue, 8 Oct 2024 16:02:08 +0200 Subject: [PATCH 3/8] Private Methods in Interfaces --- src/test/java/pl/mperor/lab/java/Java9.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/test/java/pl/mperor/lab/java/Java9.java b/src/test/java/pl/mperor/lab/java/Java9.java index 1f3e791..301142b 100644 --- a/src/test/java/pl/mperor/lab/java/Java9.java +++ b/src/test/java/pl/mperor/lab/java/Java9.java @@ -9,7 +9,6 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -73,4 +72,21 @@ public void testProcessAPI() throws IOException { Assertions.assertTrue(process.pid() != -1); process.destroy(); } + + @Test + public void testPrivateInterfaceMethod() { + InterfaceJava9 myInterface = new InterfaceJava9() {}; + Assertions.assertEquals("Private logic in public method", myInterface.publicMethod()); + } + + public interface InterfaceJava9 { + default String publicMethod() { + return privateMethod() + " in public method"; + } + + private String privateMethod() { + return "Private logic"; + } + } + } From 569bbb0924df2d346e4ecff1e057c230e5079b6a Mon Sep 17 00:00:00 2001 From: mperor Date: Wed, 9 Oct 2024 08:32:18 +0200 Subject: [PATCH 4/8] Refactoring --- src/test/java/pl/mperor/lab/java/Java9.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/pl/mperor/lab/java/Java9.java b/src/test/java/pl/mperor/lab/java/Java9.java index 301142b..1f0a2e6 100644 --- a/src/test/java/pl/mperor/lab/java/Java9.java +++ b/src/test/java/pl/mperor/lab/java/Java9.java @@ -18,7 +18,7 @@ public class Java9 { @Test - public void testNewHTTPClientAPI_getMethod() throws URISyntaxException, IOException, InterruptedException, ExecutionException { + public void testNewHTTPClientAPI_getMethodSyncVsAsync() throws URISyntaxException, IOException, InterruptedException, ExecutionException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(new URI("https://jsonplaceholder.typicode.com/posts/1")) @@ -41,7 +41,7 @@ public void testNewHTTPClientAPI_getMethod() throws URISyntaxException, IOExcept } @Test - public void testNewHTTPClientAPI_postMethod() throws URISyntaxException, IOException, InterruptedException, ExecutionException { + public void testNewHTTPClientAPI_postMethod() throws URISyntaxException, IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(new URI("https://jsonplaceholder.typicode.com/posts")) @@ -76,12 +76,12 @@ public void testProcessAPI() throws IOException { @Test public void testPrivateInterfaceMethod() { InterfaceJava9 myInterface = new InterfaceJava9() {}; - Assertions.assertEquals("Private logic in public method", myInterface.publicMethod()); + Assertions.assertEquals("Private logic in public method!", myInterface.publicMethod()); } public interface InterfaceJava9 { default String publicMethod() { - return privateMethod() + " in public method"; + return privateMethod() + " in public method!"; } private String privateMethod() { From 746ebe6b2ad1281a2ced749a89296b73c48ea45e Mon Sep 17 00:00:00 2001 From: mperor Date: Wed, 9 Oct 2024 10:37:06 +0200 Subject: [PATCH 5/8] JShell (Interactive REPL) --- src/test/java/pl/mperor/lab/java/Java9.java | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/java/pl/mperor/lab/java/Java9.java b/src/test/java/pl/mperor/lab/java/Java9.java index 1f0a2e6..9d1b34c 100644 --- a/src/test/java/pl/mperor/lab/java/Java9.java +++ b/src/test/java/pl/mperor/lab/java/Java9.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import java.io.IOException; +import java.io.PrintWriter; import java.net.URI; import java.net.URISyntaxException; import java.net.http.HttpClient; @@ -73,6 +74,27 @@ public void testProcessAPI() throws IOException { process.destroy(); } + @Test + public void testJShell() throws IOException, InterruptedException { + Process process = new ProcessBuilder("jshell") + .start(); + Assertions.assertTrue(process.isAlive()); + + try (var reader = process.inputReader(); + var writer = new PrintWriter(process.outputWriter())) { + writer.println("System.out.println(\"Hello from JShell!\");"); + writer.println("/exit"); + writer.flush(); + + String lastLineBeforeExit = reader.lines() + .takeWhile(s -> !s.contains("Goodbye")) + .reduce("", (first, second) -> second); + Assertions.assertEquals("Hello from JShell!", lastLineBeforeExit); + } + Assertions.assertEquals(0, process.waitFor()); + process.destroy(); + } + @Test public void testPrivateInterfaceMethod() { InterfaceJava9 myInterface = new InterfaceJava9() {}; From 865a864ea67dcf49bb34ac1e745f2f6d31363fcd Mon Sep 17 00:00:00 2001 From: mperor Date: Wed, 9 Oct 2024 10:58:54 +0200 Subject: [PATCH 6/8] Collection Factory Methods + fix Java2 collection test --- src/test/java/pl/mperor/lab/java/Java2.java | 12 +++++----- src/test/java/pl/mperor/lab/java/Java9.java | 25 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/test/java/pl/mperor/lab/java/Java2.java b/src/test/java/pl/mperor/lab/java/Java2.java index 640f90a..76a6186 100644 --- a/src/test/java/pl/mperor/lab/java/Java2.java +++ b/src/test/java/pl/mperor/lab/java/Java2.java @@ -6,9 +6,9 @@ import javax.swing.*; import java.awt.*; import java.lang.reflect.InvocationTargetException; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; /** * Java 1.2 (December 1998) @@ -17,9 +17,9 @@ public class Java2 { @Test public void testCollectionsApiBasics() { - var list = List.of(1, 2, 3); - var set = Set.of(1, 2, 3); - var map = Map.of(1, "One", 2, "Two", 3, "Three"); + var list = Arrays.asList(1, 2, 3); + var set = new HashSet<>(list); + var map = Collections.singletonMap(2, "Two"); Assertions.assertEquals(1, list.getFirst()); Assertions.assertTrue(set.contains(1)); Assertions.assertEquals("Two", map.get(2)); diff --git a/src/test/java/pl/mperor/lab/java/Java9.java b/src/test/java/pl/mperor/lab/java/Java9.java index 9d1b34c..91c4e9b 100644 --- a/src/test/java/pl/mperor/lab/java/Java9.java +++ b/src/test/java/pl/mperor/lab/java/Java9.java @@ -10,6 +10,7 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -111,4 +112,28 @@ private String privateMethod() { } } + @Test + public void testCollectionFactoryMethods() { + Map byFactoryMethodMap = Map.of("one", 1, "two", 2, "three", 3); + + // Old style combination of `new HashMap<>()` and `put()` + Map classicalMap = new HashMap<>(); + classicalMap.put("one", 1); + classicalMap.put("two", 2); + classicalMap.put("three", 3); + Assertions.assertEquals(byFactoryMethodMap, classicalMap); + + // Double Brace Initialization + Map doubleBraceInitializedMap = new HashMap<>() {{ + put("one", 1); + put("two", 2); + put("three", 3); + }}; + Assertions.assertEquals(byFactoryMethodMap, doubleBraceInitializedMap); + + // Single entry map + Map singleEntryMap = Collections.singletonMap("one", 1); + Assertions.assertEquals(byFactoryMethodMap.get("one"), singleEntryMap.get("one")); + } + } From a197165f2be8c170b6499e99a760d99bfe13dcac Mon Sep 17 00:00:00 2001 From: mperor Date: Wed, 9 Oct 2024 12:15:26 +0200 Subject: [PATCH 7/8] Java 9 Enhanced try-with-resources --- src/test/java/pl/mperor/lab/java/Java9.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/test/java/pl/mperor/lab/java/Java9.java b/src/test/java/pl/mperor/lab/java/Java9.java index 91c4e9b..c2985ba 100644 --- a/src/test/java/pl/mperor/lab/java/Java9.java +++ b/src/test/java/pl/mperor/lab/java/Java9.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.net.URI; @@ -10,7 +12,10 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.util.*; +import java.nio.file.Files; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -136,4 +141,18 @@ public void testCollectionFactoryMethods() { Assertions.assertEquals(byFactoryMethodMap.get("one"), singleEntryMap.get("one")); } + @Test + public void testTryWithResourcesWithJava9Syntax() throws IOException { + File tempFile = File.createTempFile("Java9", "txt"); + // Declare and initialize the resource before the try block + FileWriter writer = new FileWriter(tempFile); + try (writer) { + writer.write("Java 9 syntax for try-with-resources!"); + } + IOException flushException = Assertions.assertThrows(IOException.class, () -> writer.flush()); + Assertions.assertEquals("Stream closed", flushException.getMessage()); + Assertions.assertEquals("Java 9 syntax for try-with-resources!", Files.readString(tempFile.toPath())); + Assertions.assertTrue(Files.deleteIfExists(tempFile.toPath())); + } + } From 966d176a3a09767ea950d3bc4654fb53d34b4955 Mon Sep 17 00:00:00 2001 From: mperor Date: Wed, 9 Oct 2024 12:25:16 +0200 Subject: [PATCH 8/8] Update README.md --- README.md | 1 + src/test/java/pl/mperor/lab/java/Java9.java | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index a948c15..f081428 100644 --- a/README.md +++ b/README.md @@ -20,5 +20,6 @@ This project includes unit tests for key functionalities introduced in each Java - [Java 1.6 (Java 6)](src/test/java/pl/mperor/lab/java/Java6.java) - [Java 1.7 (Java 7)](src/test/java/pl/mperor/lab/java/Java7.java) - [Java 1.8 (Java 8)](src/test/java/pl/mperor/lab/java/Java8.java) +- [Java 1.9 (Java 9)](src/test/java/pl/mperor/lab/java/Java9.java) For detailed examples and tests of each feature, please refer to the individual source files linked above. \ No newline at end of file diff --git a/src/test/java/pl/mperor/lab/java/Java9.java b/src/test/java/pl/mperor/lab/java/Java9.java index c2985ba..3b99997 100644 --- a/src/test/java/pl/mperor/lab/java/Java9.java +++ b/src/test/java/pl/mperor/lab/java/Java9.java @@ -97,6 +97,7 @@ public void testJShell() throws IOException, InterruptedException { .reduce("", (first, second) -> second); Assertions.assertEquals("Hello from JShell!", lastLineBeforeExit); } + Assertions.assertEquals(0, process.waitFor()); process.destroy(); }