package net.bytebuddy;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.objectweb.asm.Opcodes;
import java.util.Arrays;
import java.util.Collection;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
@RunWith(Parameterized.class)
public class ClassFileVersionKnownVersionsTest {
private final int javaVersion;
private final int minorMajorVersion;
private final int majorVersion;
private final int minorVersion;
private final boolean atLeastJava5;
private final boolean atLeastJava7;
private final boolean atLeastJava8;
public ClassFileVersionKnownVersionsTest(int javaVersion,
int minorMajorVersion,
int majorVersion,
int minorVersion,
boolean atLeastJava5,
boolean atLeastJava7,
boolean atLeastJava8) {
this.javaVersion = javaVersion;
this.minorMajorVersion = minorMajorVersion;
this.majorVersion = majorVersion;
this.minorVersion = minorVersion;
this.atLeastJava5 = atLeastJava5;
this.atLeastJava7 = atLeastJava7;
this.atLeastJava8 = atLeastJava8;
}
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{1, Opcodes.V1_1, 45, 3, false, false, false},
{2, Opcodes.V1_2, 46, 0, false, false, false},
{3, Opcodes.V1_3, 47, 0, false, false, false},
{4, Opcodes.V1_4, 48, 0, false, false, false},
{5, Opcodes.V1_5, 49, 0, true, false, false},
{6, Opcodes.V1_6, 50, 0, true, false, false},
{7, Opcodes.V1_7, 51, 0, true, true, false},
{8, Opcodes.V1_8, 52, 0, true, true, true},
{9, 53, 53, 0, true, true, true}
});
}
@Test
public void testVersion() throws Exception {
assertThat(ClassFileVersion.ofJavaVersion(javaVersion).getMinorMajorVersion(), is(minorMajorVersion));
}
@Test
public void testMinorVersion() throws Exception {
assertThat(ClassFileVersion.ofJavaVersion(javaVersion).getMinorVersion(), is(minorVersion));
}
@Test
public void testMajorVersion() throws Exception {
assertThat(ClassFileVersion.ofJavaVersion(javaVersion).getMajorVersion(), is(majorVersion));
}
@Test
public void testAtLeastJava5() throws Exception {
assertThat(ClassFileVersion.ofJavaVersion(javaVersion).isAtLeast(ClassFileVersion.JAVA_V5), is(atLeastJava5));
}
@Test
public void testAtLeastJava7() throws Exception {
assertThat(ClassFileVersion.ofJavaVersion(javaVersion).isAtLeast(ClassFileVersion.JAVA_V7), is(atLeastJava7));
}
@Test
public void testAtLeastJava8() throws Exception {
assertThat(ClassFileVersion.ofJavaVersion(javaVersion).isAtLeast(ClassFileVersion.JAVA_V8), is(atLeastJava8));
}
@Test
public void testJavaVersion() throws Exception {
assertThat(ClassFileVersion.ofJavaVersion(javaVersion).getJavaVersion(), is(javaVersion));
}
@Test
public void testLessThanJava8() throws Exception {
assertThat(ClassFileVersion.ofJavaVersion(javaVersion).isLessThan(ClassFileVersion.JAVA_V8), is(!atLeastJava8));
}
@Test
public void testSimpleClassCreation() throws Exception {
ClassFileVersion classFileVersion = ClassFileVersion.ofJavaVersion(javaVersion);
if (ClassFileVersion.ofThisVm().compareTo(classFileVersion) >= 0) {
Class<?> type = new ByteBuddy(classFileVersion)
.subclass(Foo.class)
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
assertThat(type.getDeclaredConstructor().newInstance(), notNullValue(Object.class));
}
}
public static class Foo {
/* empty */
}
}