Skip to content

Commit d0eee5d

Browse files
committed
Update test class for Java 16 ...
- samples only for standard features - markdown javadoc for JEPs - organize classes related to Java 16 - improve code readability
1 parent 20f2768 commit d0eee5d

File tree

7 files changed

+153
-67
lines changed

7 files changed

+153
-67
lines changed

src/test/java/pl/mperor/lab/java/Java12.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public void testSwitchExpression() {
2323
Assertions.assertThrows(IllegalStateException.class, () -> getTypeOfDayByNumber(0));
2424
}
2525

26-
private String getTypeOfDayByNumber(Integer dayOfWeek) {
26+
private String getTypeOfDayByNumber(int dayOfWeek) {
2727
return switch (dayOfWeek) {
2828
case 1, 2, 3, 4, 5 -> "Working Day";
2929
case 6, 7 -> {
@@ -34,21 +34,6 @@ private String getTypeOfDayByNumber(Integer dayOfWeek) {
3434
};
3535
}
3636

37-
@Test
38-
public void testPatternMatchingInstanceOfAkaSmartCasting() {
39-
Object o = "Hello String!";
40-
if (o instanceof String s) {
41-
Assertions.assertNotNull(s);
42-
Assertions.assertInstanceOf(String.class, s);
43-
}
44-
Assertions.assertTrue(nonEmptyString("Hello World!"));
45-
Assertions.assertFalse(nonEmptyString(null));
46-
}
47-
48-
private static boolean nonEmptyString(Object obj) {
49-
return (obj instanceof String str) && !str.isEmpty();
50-
}
51-
5237
@Test
5338
public void testStringIndentAndTransformMethods() {
5439
String text = "Hello\nJava 12\n";

src/test/java/pl/mperor/lab/java/Java14.java

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,6 @@
1010
*/
1111
public class Java14 {
1212

13-
// POJOs
14-
@Test
15-
public void testPairRecord() {
16-
var pair = Pair.of("Boy", "Girl");
17-
Assertions.assertEquals("Boy", pair.left);
18-
Assertions.assertEquals("Girl", pair.right);
19-
Assertions.assertEquals("Pair[left=Boy, right=Girl]", pair.toString());
20-
Assertions.assertEquals(Pair.of(1, 1), Pair.of(1, 1));
21-
Assertions.assertNotEquals(Pair.of(0, 0), Pair.of(1, 1));
22-
Assertions.assertThrows(NullPointerException.class, () -> Pair.of(0, null));
23-
}
24-
25-
record Pair<L, R>(L left, R right) {
26-
Pair {
27-
Objects.requireNonNull(left);
28-
Objects.requireNonNull(right);
29-
}
30-
31-
public static <L, R> Pair<L, R> of(L left, R right) {
32-
return new Pair<>(left, right);
33-
}
34-
}
35-
3613
@Test
3714
public void testHelpfulNullPointerExceptions() {
3815
NullPointerException exception = Assertions.assertThrows(NullPointerException.class, () -> {

src/test/java/pl/mperor/lab/java/Java15.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package pl.mperor.lab.java;
22

3-
import org.junit.jupiter.api.Assertions;
4-
import org.junit.jupiter.api.Test;
5-
import pl.mperor.lab.java.sealed.*;
6-
73
/**
84
* Java 15 (September 2020)
95
*/

src/test/java/pl/mperor/lab/java/Java16.java

Lines changed: 107 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,108 @@
55
import org.junit.jupiter.api.Test;
66
import pl.mperor.lab.TestUtils;
77

8+
import java.io.BufferedReader;
89
import java.io.IOException;
10+
import java.io.InputStreamReader;
11+
import java.io.PrintWriter;
12+
import java.net.InetSocketAddress;
13+
import java.net.ServerSocket;
14+
import java.net.StandardProtocolFamily;
15+
import java.net.UnixDomainSocketAddress;
16+
import java.nio.channels.ServerSocketChannel;
17+
import java.nio.channels.SocketChannel;
18+
import java.nio.file.Files;
19+
import java.nio.file.Path;
20+
import java.nio.file.Paths;
921
import java.time.LocalTime;
1022
import java.time.format.DateTimeFormatter;
1123
import java.util.List;
1224
import java.util.Locale;
25+
import java.util.Objects;
26+
import java.util.concurrent.CountDownLatch;
27+
import java.util.concurrent.Executors;
1328
import java.util.stream.Collectors;
1429

15-
/**
16-
* Java 16 (March 2021)
17-
*/
30+
/// Java 16™ (March 2021)
31+
/// [JDK 16](https://openjdk.org/projects/jdk/16)
32+
///
33+
/// - STANDARD FEATURES:
34+
/// - 395: Records
35+
/// - 394: Pattern Matching for instanceof
36+
/// - 390: Warnings for Value-Based Classes
37+
/// - 392: Packaging Tool
38+
/// - 396: Strongly Encapsulate JDK Internals by Default
39+
/// - 376: ZGC: Concurrent Thread-Stack Processing
40+
/// - 380: Unix-Domain Socket Channels
41+
/// - 387: Elastic Metaspace
42+
/// - 347: Enable C++14 Language Features
43+
/// - 386: Alpine Linux Port
44+
/// - 388: Windows/AArch64 Port
45+
/// - 357: Migrate from Mercurial to Git
46+
/// - 369: Migrate to GitHub
47+
///
48+
/// - PREVIEW & INCUBATOR:
49+
/// - 389: Foreign Linker API (Incubator)
50+
/// - 397: Sealed Classes (Second Preview)
51+
/// - 393: Foreign-Memory Access API (Third Incubator)
52+
/// - 338: Vector API (Incubator)
1853
public class Java16 {
1954

55+
// POJOs
56+
@Test
57+
public void testPairRecord() {
58+
var pair = Pair.of("Boy", "Girl");
59+
Assertions.assertEquals("Boy", pair.left);
60+
Assertions.assertEquals("Girl", pair.right);
61+
Assertions.assertEquals("Pair[left=Boy, right=Girl]", pair.toString());
62+
Assertions.assertEquals(Pair.of(1, 1), Pair.of(1, 1));
63+
Assertions.assertNotEquals(Pair.of(0, 0), Pair.of(1, 1));
64+
Assertions.assertThrows(NullPointerException.class, () -> Pair.of(0, null));
65+
}
66+
67+
record Pair<L, R>(L left, R right) {
68+
Pair {
69+
Objects.requireNonNull(left);
70+
Objects.requireNonNull(right);
71+
}
72+
73+
public static <L, R> Pair<L, R> of(L left, R right) {
74+
return new Pair<>(left, right);
75+
}
76+
}
77+
78+
@Test
79+
public void testPatternMatchingInstanceOfAkaSmartCasting() {
80+
Object o = "Hello String!";
81+
if (o instanceof String s) {
82+
Assertions.assertNotNull(s);
83+
Assertions.assertInstanceOf(String.class, s);
84+
}
85+
Assertions.assertTrue(nonEmptyString("Hello World!"));
86+
Assertions.assertFalse(nonEmptyString(null));
87+
}
88+
89+
private static boolean nonEmptyString(Object obj) {
90+
return (obj instanceof String str) && !str.isEmpty();
91+
}
92+
93+
@SuppressWarnings({"removal", "synchronization"})
94+
@Test
95+
public void testValueBasedClasses() {
96+
// warning: [removal] Long(long) in Long has been deprecated and marked for removal
97+
Long longByConstructor = new Long(13);
98+
99+
// warning: [synchronization] attempt to synchronize on an instance of a value-based class
100+
synchronized (longByConstructor) {
101+
System.out.println("From the synchronized block!");
102+
}
103+
104+
Long longByFactoryMethod = Long.valueOf(13L);
105+
Assertions.assertFalse(longByConstructor == longByFactoryMethod);
106+
Assertions.assertTrue(longByConstructor.equals(longByFactoryMethod));
107+
Assertions.assertTrue(Long.valueOf(13L) == longByFactoryMethod);
108+
}
109+
20110
@Test
21111
public void testPeriodSupport() {
22112
LocalTime date = LocalTime.parse("16:00:00");
@@ -70,23 +160,6 @@ public void call() {
70160
TestUtils.resetSystemOut();
71161
}
72162

73-
@SuppressWarnings({"removal", "synchronization"})
74-
@Test
75-
public void testValueBasedClasses() {
76-
// warning: new Long(...) has been deprecated and marked for removal
77-
Long longByConstructor = new Long(13);
78-
79-
// warning: attempt to synchronize on an instance of a value-based class
80-
synchronized (longByConstructor) {
81-
System.out.println("From the synchronized block!");
82-
}
83-
84-
Long longByFactoryMethod = Long.valueOf(13L);
85-
Assertions.assertFalse(longByConstructor == longByFactoryMethod);
86-
Assertions.assertTrue(longByConstructor.equals(longByFactoryMethod));
87-
Assertions.assertTrue(Long.valueOf(13L) == longByFactoryMethod);
88-
}
89-
90163
@Disabled("Dependent on the OS and additional libraries, besides having a long execution time.")
91164
@Test
92165
public void testJPackage() throws IOException, InterruptedException {
@@ -102,4 +175,18 @@ public void testJPackage() throws IOException, InterruptedException {
102175
process.destroy();
103176
}
104177

178+
@Test
179+
public void testUnixDomainSocketChannels() throws IOException {
180+
Path socketPath = Paths.get("/tmp/unix_socket");
181+
Files.deleteIfExists(socketPath);
182+
UnixDomainSocketAddress socketAddress = UnixDomainSocketAddress.of(socketPath);
183+
Assertions.assertNotNull(socketAddress);
184+
Assertions.assertNotNull(StandardProtocolFamily.UNIX);
185+
186+
try (ServerSocket serverSocket = ServerSocketChannel.open(StandardProtocolFamily.UNIX)
187+
.bind(socketAddress)
188+
.socket()) {
189+
}
190+
}
191+
105192
}

src/test/java/pl/mperor/lab/java/Java17.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ public void testDeprecated() {
133133

134134
@Test
135135
public void testRmiActivation() {
136-
Assertions.assertFalse(ModuleLayer.boot().findModule("java.rmi").stream().map(Module::getPackages)
136+
Assertions.assertFalse(ModuleLayer.boot().findModule("java.rmi").stream()
137+
.map(Module::getPackages)
137138
.flatMap(Set::stream)
138139
.anyMatch("java.rmi.activation"::equals));
139140
}

src/test/java/pl/mperor/lab/java/Java18.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ private static String curlResponse(String url) throws IOException, InterruptedEx
8383
public void testFinalizeDeprecated() throws Throwable {
8484
var out = TestUtils.setTempSystemOut();
8585

86-
// warning: finalize() in Object has been deprecated and marked for removal
86+
// warning: [removal] finalize() in Object has been deprecated and marked for removal
8787
var object = new Object() {
8888
@Override
8989
protected void finalize() throws Throwable {

src/test/java/pl/mperor/lab/java/Java4.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@
55

66
import javax.imageio.ImageIO;
77
import java.awt.image.BufferedImage;
8-
import java.io.File;
9-
import java.io.IOException;
8+
import java.io.*;
9+
import java.net.InetSocketAddress;
10+
import java.net.ServerSocket;
11+
import java.nio.channels.ServerSocketChannel;
12+
import java.nio.channels.SocketChannel;
1013
import java.nio.file.Files;
1114
import java.nio.file.Path;
1215
import java.nio.file.Paths;
16+
import java.util.concurrent.CountDownLatch;
17+
import java.util.concurrent.Executors;
1318
import java.util.logging.Logger;
1419
import java.util.regex.Matcher;
1520
import java.util.regex.Pattern;
@@ -85,5 +90,40 @@ public void testImageIO() throws IOException {
8590
BufferedImage image = ImageIO.read(new File("src/test/resources/imageio.png"));
8691
Assertions.assertTrue(ImageIO.write(image, "jpg", File.createTempFile("imageio", ".jpg")));
8792
}
93+
@Test
94+
public void testServerClientSocketChannel() throws IOException, InterruptedException {
95+
int port = 8888;
96+
CountDownLatch serverReadyLatch = new CountDownLatch(1);
97+
98+
var executorService = Executors.newSingleThreadExecutor();
99+
executorService.submit(() -> {
100+
try (ServerSocket serverSocket = ServerSocketChannel.open().bind(new InetSocketAddress(port)).socket()) {
101+
serverReadyLatch.countDown();
102+
handleConnectedClient(serverSocket);
103+
} catch (IOException e) {
104+
throw new RuntimeException(e);
105+
}
106+
});
107+
108+
serverReadyLatch.await();
109+
try (var clientSocket = SocketChannel.open(new InetSocketAddress("localhost", port));
110+
var reader = new BufferedReader(new InputStreamReader(clientSocket.socket().getInputStream()));
111+
var writer = new PrintWriter(clientSocket.socket().getOutputStream(), true)) {
112+
writer.println("Hello Server!");
113+
Assertions.assertEquals("Hello Client!", reader.readLine());
114+
}
115+
116+
executorService.close();
117+
}
118+
119+
private void handleConnectedClient(ServerSocket serverSocket) throws IOException {
120+
try (var clientSocket = serverSocket.accept();
121+
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
122+
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
123+
Assertions.assertEquals("Hello Server!", reader.readLine());
124+
out.println("Hello Client!");
125+
}
126+
}
127+
88128

89129
}

0 commit comments

Comments
 (0)