1 package org.codehaus.plexus.languages.java.version;
2
3 import java.io.IOException;
4 import java.io.UncheckedIOException;
5 import java.nio.file.DirectoryStream;
6 import java.nio.file.Files;
7 import java.nio.file.Path;
8 import java.nio.file.Paths;
9 import java.util.List;
10 import java.util.stream.Collectors;
11 import java.util.stream.Stream;
12 import java.util.stream.StreamSupport;
13
14 import org.junit.jupiter.api.Test;
15 import org.junit.jupiter.params.ParameterizedTest;
16 import org.junit.jupiter.params.provider.MethodSource;
17
18 import static org.junit.jupiter.api.Assertions.assertEquals;
19 import static org.junit.jupiter.api.Assertions.assertNotEquals;
20 import static org.junit.jupiter.api.Assertions.assertThrows;
21 import static org.junit.jupiter.api.Assertions.assertTrue;
22
23 class JavaClassVersionTest {
24
25 @ParameterizedTest
26 @MethodSource("provideClassFiles")
27 void testFilesClassVersions(Path filePath) {
28 String fileName = filePath.getFileName().toString();
29 int javaVersion = Integer.parseInt(fileName.substring(fileName.indexOf("-") + 1, fileName.length() - 6));
30 JavaClassfileVersion classVersion = JavaClassfileVersion.of(filePath);
31 assertEquals(javaVersion + 44, classVersion.majorVersion());
32 assertEquals(0, classVersion.minorVersion());
33 assertEquals(JavaVersion.parse("" + javaVersion), classVersion.javaVersion());
34 }
35
36 static Stream<Path> provideClassFiles() {
37 List<Path> paths;
38 try (DirectoryStream<Path> directoryStream =
39 Files.newDirectoryStream(Paths.get("src/test/test-data/classfile.version/"), "*-[0-9]?.class")) {
40 paths = StreamSupport.stream(directoryStream.spliterator(), false)
41 .filter(Files::isRegularFile)
42 .collect(Collectors.toList());
43 } catch (IOException ex) {
44 throw new UncheckedIOException(ex);
45 }
46 return paths.stream();
47 }
48
49 @Test
50 void testJavaClassPreview() {
51 Path previewFile = Paths.get("src/test/test-data/classfile.version/helloworld-preview.class");
52 JavaClassfileVersion previewClass = JavaClassfileVersion.of(previewFile);
53 assertTrue(previewClass.isPreview());
54 assertEquals(20 + 44, previewClass.majorVersion());
55 assertEquals(JavaVersion.parse("20"), previewClass.javaVersion());
56 }
57
58 @Test
59 void testJavaClassVersionMajor45orAbove() {
60 assertThrows(
61 IllegalArgumentException.class,
62 () -> new JavaClassfileVersion(44, 0),
63 "Java class major version must be 45 or above.");
64 }
65
66 @Test
67 void equalsContract() {
68 JavaClassfileVersion javaClassVersion = new JavaClassfileVersion(65, 0);
69 JavaClassfileVersion previewFeature = new JavaClassfileVersion(65, 65535);
70 assertNotEquals(javaClassVersion, previewFeature);
71 assertNotEquals(javaClassVersion.hashCode(), previewFeature.hashCode());
72
73 JavaClassfileVersion javaClassVersionOther = new JavaClassfileVersion(65, 0);
74 assertEquals(javaClassVersion, javaClassVersionOther);
75 assertEquals(javaClassVersion.hashCode(), javaClassVersionOther.hashCode());
76 assertEquals(javaClassVersion.javaVersion(), javaClassVersionOther.javaVersion());
77 assertEquals(javaClassVersion.javaVersion(), previewFeature.javaVersion());
78 }
79 }