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 }