View Javadoc
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.valueOf(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/resources/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/resources/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  }