package net.bytebuddy.utility;
import net.bytebuddy.description.type.TypeDefinition;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.test.utility.JavaVersionRule;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import org.objectweb.asm.Opcodes;
import java.io.Serializable;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.GenericDeclaration;
import java.lang.reflect.Member;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
public class JavaTypeTest {
@Rule
public MethodRule javaVersionRule = new JavaVersionRule();
@Test
public void testMethodHandle() throws Exception {
assertThat(JavaType.METHOD_HANDLE.getTypeStub().getName(), is("java.lang.invoke.MethodHandle"));
assertThat(JavaType.METHOD_HANDLE.getTypeStub().getModifiers(), is(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT));
assertThat(JavaType.METHOD_HANDLE.getTypeStub().getSuperClass(), is(TypeDescription.Generic.OBJECT));
assertThat(JavaType.METHOD_HANDLE.getTypeStub().getInterfaces().size(), is(0));
}
@Test
public void testMethodType() throws Exception {
assertThat(JavaType.METHOD_TYPE.getTypeStub().getName(), is("java.lang.invoke.MethodType"));
assertThat(JavaType.METHOD_TYPE.getTypeStub().getModifiers(), is(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL));
assertThat(JavaType.METHOD_TYPE.getTypeStub().getSuperClass(), is(TypeDescription.Generic.OBJECT));
assertThat(JavaType.METHOD_TYPE.getTypeStub().getInterfaces().size(), is(1));
assertThat(JavaType.METHOD_TYPE.getTypeStub().getInterfaces().contains(new TypeDescription.Generic.OfNonGenericType.ForLoadedType(Serializable.class)), is(true));
}
@Test
public void testMethodTypesLookup() throws Exception {
assertThat(JavaType.METHOD_HANDLES_LOOKUP.getTypeStub().getName(), is("java.lang.invoke.MethodHandles$Lookup"));
assertThat(JavaType.METHOD_HANDLES_LOOKUP.getTypeStub().getModifiers(), is(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL));
assertThat(JavaType.METHOD_HANDLES_LOOKUP.getTypeStub().getSuperClass(), is(TypeDescription.Generic.OBJECT));
assertThat(JavaType.METHOD_HANDLES_LOOKUP.getTypeStub().getInterfaces().size(), is(0));
}
@Test
public void testCallSite() throws Exception {
assertThat(JavaType.CALL_SITE.getTypeStub().getName(), is("java.lang.invoke.CallSite"));
assertThat(JavaType.CALL_SITE.getTypeStub().getModifiers(), is(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT));
assertThat(JavaType.CALL_SITE.getTypeStub().getSuperClass(), is(TypeDescription.Generic.OBJECT));
assertThat(JavaType.CALL_SITE.getTypeStub().getInterfaces().size(), is(0));
}
@Test
public void testParameter() throws Exception {
assertThat(JavaType.PARAMETER.getTypeStub().getName(), is("java.lang.reflect.Parameter"));
assertThat(JavaType.PARAMETER.getTypeStub().getModifiers(), is(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL));
assertThat(JavaType.PARAMETER.getTypeStub().getSuperClass(), is(TypeDescription.Generic.OBJECT));
assertThat(JavaType.PARAMETER.getTypeStub().getInterfaces().size(), is(1));
assertThat(JavaType.PARAMETER.getTypeStub().getInterfaces().contains(new TypeDescription.Generic.OfNonGenericType.ForLoadedType(AnnotatedElement.class)), is(true));
}
@Test
public void testExecutable() throws Exception {
assertThat(JavaType.EXECUTABLE.getTypeStub().getName(), is("java.lang.reflect.Executable"));
assertThat(JavaType.EXECUTABLE.getTypeStub().getModifiers(), is(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT));
assertThat(JavaType.EXECUTABLE.getTypeStub().getSuperClass(), is((TypeDefinition) new TypeDescription.ForLoadedType(AccessibleObject.class)));
assertThat(JavaType.EXECUTABLE.getTypeStub().getInterfaces().size(), is(2));
assertThat(JavaType.EXECUTABLE.getTypeStub().getInterfaces().contains(new TypeDescription.Generic.OfNonGenericType.ForLoadedType(Member.class)), is(true));
assertThat(JavaType.EXECUTABLE.getTypeStub().getInterfaces().contains(new TypeDescription.Generic.OfNonGenericType.ForLoadedType(GenericDeclaration.class)), is(true));
}
@Test
public void testModule() throws Exception {
assertThat(JavaType.MODULE.getTypeStub().getName(), is("java.lang.Module"));
assertThat(JavaType.MODULE.getTypeStub().getModifiers(), is(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL));
assertThat(JavaType.MODULE.getTypeStub().getSuperClass(), is(TypeDescription.Generic.OBJECT));
assertThat(JavaType.MODULE.getTypeStub().getInterfaces().size(), is(0));
}
@Test
@JavaVersionRule.Enforce(7)
public void testJava7Types() throws Exception {
assertThat(JavaType.METHOD_HANDLE.load(), notNullValue(Class.class));
assertThat(JavaType.METHOD_TYPE.load(), notNullValue(Class.class));
assertThat(JavaType.METHOD_HANDLES_LOOKUP.load(), notNullValue(Class.class));
assertThat(JavaType.CALL_SITE.load(), notNullValue(Class.class));
}
@Test
@JavaVersionRule.Enforce(8)
public void testJava8Types() throws Exception {
assertThat(JavaType.PARAMETER.load(), notNullValue(Class.class));
assertThat(JavaType.EXECUTABLE.load(), notNullValue(Class.class));
}
@Test
public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(JavaType.class).apply();
}
}