/* * Copyright 2011 Blazebit */ package com.blazebit.reflection; import java.lang.reflect.ParameterizedType; import java.lang.reflect.TypeVariable; import java.util.Collection; import java.util.Map; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.Test; /** * * @author Christian Beikov */ public class ReflectionUtilsTest { private interface A { @SuppressWarnings("unused") static String A_FIELD = ""; String getA(); boolean isB(); void setA(String a); void setB(boolean b); } private interface B { @SuppressWarnings("unused") static Integer B_FIELD = 1; } private interface C extends A { @SuppressWarnings("unused") static boolean C_FIELD = true; } private class ClassA implements A { public String getA() { return ""; } public void setA(String a) { } public boolean isB() { return false; } public void setB(boolean b) { } } private class ClassB extends ClassA implements B { @Override public boolean isB() { return true; } } private class GenericClassA<T, E extends Exception> { private T field; private Collection<T> fieldCollection; private Map<T, T> fieldMap; @SuppressWarnings("unused") public T getField() { return field; } @SuppressWarnings("unused") public void setField(T field) { this.field = field; } @SuppressWarnings("unused") public Collection<T> getFieldCollection() { return fieldCollection; } @SuppressWarnings("unused") public void setFieldCollection(Collection<T> fieldCollection) { this.fieldCollection = fieldCollection; } @SuppressWarnings("unused") public Map<T, T> getFieldMap() { return fieldMap; } @SuppressWarnings("unused") public void setFieldMap(Map<T, T> fieldMap) { this.fieldMap = fieldMap; } @SuppressWarnings("unused") public void throwsException() throws E { } } private class ConcreteClassA extends GenericClassA<Integer, Exception> { } private interface GenericInterfaceA<T, E extends Exception> { public T getField(); public void setField(T field); public Collection<T> getFieldCollection(); public void setFieldCollection(Collection<T> fieldCollection); public Map<T, T> getFieldMap(); public void setFieldMap(Map<T, T> fieldMap); public void throwsException() throws E; } private interface ConcreteInterfaceA extends GenericInterfaceA<Integer, Exception> { } /** * Test of resolveTypeVariable method, of class ReflectionUtil. */ @Test public void testResolveTypeVariable() throws Exception { // Resolve field types TypeVariable<?> typeVariable = (TypeVariable<?>) ReflectionUtils .getField(ConcreteClassA.class, "field").getGenericType(); Class<?> concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); typeVariable = (TypeVariable<?>) ((ParameterizedType) ReflectionUtils .getField(ConcreteClassA.class, "fieldCollection") .getGenericType()).getActualTypeArguments()[0]; concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); typeVariable = (TypeVariable<?>) ((ParameterizedType) ReflectionUtils .getField(ConcreteClassA.class, "fieldMap").getGenericType()) .getActualTypeArguments()[0]; concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); // Resolve unresolveable field types typeVariable = (TypeVariable<?>) ReflectionUtils.getField( GenericClassA.class, "field").getGenericType(); concreteType = ReflectionUtils.resolveTypeVariable(GenericClassA.class, typeVariable); assertEquals(Object.class, concreteType); typeVariable = (TypeVariable<?>) ((ParameterizedType) ReflectionUtils .getField(GenericClassA.class, "fieldCollection") .getGenericType()).getActualTypeArguments()[0]; concreteType = ReflectionUtils.resolveTypeVariable(GenericClassA.class, typeVariable); assertEquals(Object.class, concreteType); typeVariable = (TypeVariable<?>) ((ParameterizedType) ReflectionUtils .getField(GenericClassA.class, "fieldMap").getGenericType()) .getActualTypeArguments()[0]; concreteType = ReflectionUtils.resolveTypeVariable(GenericClassA.class, typeVariable); assertEquals(Object.class, concreteType); // Resolve method return types typeVariable = (TypeVariable<?>) ReflectionUtils.getGetter( ConcreteClassA.class, "field").getGenericReturnType(); concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); typeVariable = (TypeVariable<?>) ((ParameterizedType) ReflectionUtils .getGetter(ConcreteClassA.class, "fieldCollection") .getGenericReturnType()).getActualTypeArguments()[0]; concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); typeVariable = (TypeVariable<?>) ((ParameterizedType) ReflectionUtils .getGetter(ConcreteClassA.class, "fieldMap") .getGenericReturnType()).getActualTypeArguments()[0]; concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); // Resolve method parameter types typeVariable = (TypeVariable<?>) ReflectionUtils.getSetter( ConcreteClassA.class, "field").getGenericParameterTypes()[0]; concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); typeVariable = (TypeVariable<?>) ((ParameterizedType) ReflectionUtils .getSetter(ConcreteClassA.class, "fieldCollection") .getGenericParameterTypes()[0]).getActualTypeArguments()[0]; concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); typeVariable = (TypeVariable<?>) ((ParameterizedType) ReflectionUtils .getSetter(ConcreteClassA.class, "fieldMap") .getGenericParameterTypes()[0]).getActualTypeArguments()[0]; concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Integer.class, concreteType); // Resolve method throws types typeVariable = (TypeVariable<?>) ReflectionUtils.getMethod( ConcreteClassA.class, "throwsException") .getGenericExceptionTypes()[0]; concreteType = ReflectionUtils.resolveTypeVariable( ConcreteClassA.class, typeVariable); assertEquals(Exception.class, concreteType); } /** * Test of getMethodExceptionTypes method, of class ReflectionUtil. */ @Test public void testGetMethodExceptionTypes() throws Exception { assertEquals(Exception.class, ReflectionUtils.getMethodExceptionTypes( ConcreteClassA.class, "throwsException")[0]); assertNull(ReflectionUtils.getMethodExceptionTypes( ConcreteClassA.class, "")); } /** * Test of getResolvedMethodReturnType method, of class ReflectionUtil. */ @Test public void testGetResolvedMethodReturnType() throws Exception { assertEquals(Integer.class, ReflectionUtils.getResolvedMethodReturnType( ConcreteClassA.class, ReflectionUtils.getGetter( ConcreteClassA.class, "field"))); assertNull(ReflectionUtils.getResolvedMethodReturnType( ConcreteClassA.class, "")); } /** * Test of getResolvedMethodReturnTypeArguments method, of class * ReflectionUtil. */ @Test public void testGetResolvedMethodReturnTypeArguments() throws Exception { assertEquals(Integer.class, ReflectionUtils.getResolvedMethodReturnTypeArguments( ConcreteClassA.class, ReflectionUtils.getGetter( ConcreteClassA.class, "fieldCollection"))[0]); assertEquals(Integer.class, ReflectionUtils.getResolvedMethodReturnTypeArguments( ConcreteClassA.class, ReflectionUtils.getGetter( ConcreteClassA.class, "fieldMap"))[0]); assertArrayEquals(new Class<?>[0], ReflectionUtils.getResolvedMethodReturnTypeArguments( ConcreteClassA.class, "throwsException")); assertNull(ReflectionUtils.getResolvedMethodReturnTypeArguments( ConcreteClassA.class, "")); } /** * Test of getResolvedMethodParameterTypes method, of class ReflectionUtil. */ @Test public void testGetResolvedMethodParameterTypes() throws Exception { assertEquals(Integer.class, ReflectionUtils.getResolvedMethodParameterTypes( ConcreteClassA.class, ReflectionUtils.getSetter( ConcreteClassA.class, "field"))[0]); assertArrayEquals(new Class<?>[0], ReflectionUtils.getResolvedMethodParameterTypes( ConcreteClassA.class, "throwsException")); assertNull(ReflectionUtils.getResolvedMethodParameterTypes( ConcreteClassA.class, "")); } /** * Test of getResolvedMethodExceptionTypes method, of class ReflectionUtil. */ @Test public void testGetResolvedMethodExceptionTypes() throws Exception { assertEquals(Exception.class, ReflectionUtils.getResolvedMethodExceptionTypes( ConcreteClassA.class, ReflectionUtils.getMethod( ConcreteClassA.class, "throwsException"))[0]); assertArrayEquals(new Class<?>[0], ReflectionUtils.getResolvedMethodExceptionTypes( ConcreteClassA.class, "getField")); assertNull(ReflectionUtils.getResolvedMethodExceptionTypes( ConcreteClassA.class, "")); } /** * Test of getResolvedMethodReturnType method, of class ReflectionUtil. */ @Test public void testGetResolvedInterfaceMethodReturnType() throws Exception { assertEquals(Integer.class, ReflectionUtils.getResolvedMethodReturnType( ConcreteInterfaceA.class, ReflectionUtils.getGetter( ConcreteInterfaceA.class, "field"))); assertNull(ReflectionUtils.getResolvedMethodReturnType( ConcreteInterfaceA.class, "")); } /** * Test of getResolvedMethodReturnTypeArguments method, of class * ReflectionUtil. */ @Test public void testGetResolvedInterfaceMethodReturnTypeArguments() throws Exception { assertEquals(Integer.class, ReflectionUtils.getResolvedMethodReturnTypeArguments( ConcreteInterfaceA.class, ReflectionUtils.getGetter( ConcreteInterfaceA.class, "fieldCollection"))[0]); assertEquals(Integer.class, ReflectionUtils.getResolvedMethodReturnTypeArguments( ConcreteInterfaceA.class, ReflectionUtils.getGetter( ConcreteInterfaceA.class, "fieldMap"))[0]); assertArrayEquals(new Class<?>[0], ReflectionUtils.getResolvedMethodReturnTypeArguments( ConcreteInterfaceA.class, "throwsException")); assertNull(ReflectionUtils.getResolvedMethodReturnTypeArguments( ConcreteInterfaceA.class, "")); } /** * Test of getResolvedMethodParameterTypes method, of class ReflectionUtil. */ @Test public void testGetResolvedInterfaceMethodParameterTypes() throws Exception { assertEquals(Integer.class, ReflectionUtils.getResolvedMethodParameterTypes( ConcreteInterfaceA.class, ReflectionUtils.getSetter( ConcreteInterfaceA.class, "field"))[0]); assertArrayEquals(new Class<?>[0], ReflectionUtils.getResolvedMethodParameterTypes( ConcreteInterfaceA.class, "throwsException")); assertNull(ReflectionUtils.getResolvedMethodParameterTypes( ConcreteInterfaceA.class, "")); } /** * Test of getResolvedMethodExceptionTypes method, of class ReflectionUtil. */ @Test public void testGetResolvedInterfaceMethodExceptionTypes() throws Exception { assertEquals(Exception.class, ReflectionUtils.getResolvedMethodExceptionTypes( ConcreteInterfaceA.class, ReflectionUtils.getMethod( ConcreteInterfaceA.class, "throwsException"))[0]); assertArrayEquals(new Class<?>[0], ReflectionUtils.getResolvedMethodExceptionTypes( ConcreteInterfaceA.class, "getField")); assertNull(ReflectionUtils.getResolvedMethodExceptionTypes( ConcreteInterfaceA.class, "")); } /** * Test of getClass method, of class ReflectionUtil. */ @Test public void testGetClass() throws Exception { assertEquals(ReflectionUtils.getClass("int"), Integer.TYPE); assertEquals(ReflectionUtils.getClass("long"), Long.TYPE); assertEquals(ReflectionUtils.getClass("double"), Double.TYPE); assertEquals(ReflectionUtils.getClass("float"), Float.TYPE); assertEquals(ReflectionUtils.getClass("boolean"), Boolean.TYPE); assertEquals(ReflectionUtils.getClass("char"), Character.TYPE); assertEquals(ReflectionUtils.getClass("byte"), Byte.TYPE); assertEquals(ReflectionUtils.getClass("void"), Void.TYPE); assertEquals(ReflectionUtils.getClass("short"), Short.TYPE); assertEquals(ReflectionUtils.getClass("java.lang.Object"), Object.class); } /** * Test of isSubtype method, of class ReflectionUtil. */ @Test public void testIsSubtype() { assertTrue(ReflectionUtils.isSubtype(ClassB.class, ClassB.class)); assertTrue(ReflectionUtils.isSubtype(ClassB.class, ClassA.class)); assertTrue(ReflectionUtils.isSubtype(ClassB.class, B.class)); assertTrue(ReflectionUtils.isSubtype(ClassB.class, A.class)); assertTrue(ReflectionUtils.isSubtype(ClassA.class, ClassA.class)); assertTrue(ReflectionUtils.isSubtype(ClassA.class, A.class)); assertFalse(ReflectionUtils.isSubtype(ClassA.class, ClassB.class)); assertFalse(ReflectionUtils.isSubtype(ClassA.class, B.class)); } /** * Test of getSuperTypes method, of class ReflectionUtil. */ @Test public void testGetSuperTypes() { assertTrue(ReflectionUtils.getSuperTypes(ClassB.class).contains( ClassB.class)); assertTrue(ReflectionUtils.getSuperTypes(ClassB.class).contains( ClassA.class)); assertTrue(ReflectionUtils.getSuperTypes(ClassB.class) .contains(A.class)); assertTrue(ReflectionUtils.getSuperTypes(ClassB.class) .contains(B.class)); assertTrue(ReflectionUtils.getSuperTypes(ClassA.class).contains( ClassA.class)); assertTrue(ReflectionUtils.getSuperTypes(ClassA.class) .contains(A.class)); assertTrue(ReflectionUtils.getSuperTypes(C.class).contains(C.class)); assertTrue(ReflectionUtils.getSuperTypes(C.class).contains(A.class)); assertTrue(ReflectionUtils.getSuperTypes(B.class).contains(B.class)); assertTrue(ReflectionUtils.getSuperTypes(A.class).contains(A.class)); } /** * Test of getFieldType method, of class ReflectionUtil. */ @Test public void testGetFieldType() { assertEquals(ReflectionUtils.getFieldType(ClassB.class, "B_FIELD"), Integer.class); assertEquals(ReflectionUtils.getFieldType(ClassB.class, "A_FIELD"), String.class); assertNull(ReflectionUtils.getFieldType(ClassA.class, "B_FIELD")); assertEquals(ReflectionUtils.getFieldType(ClassA.class, "A_FIELD"), String.class); assertEquals(ReflectionUtils.getFieldType(A.class, "A_FIELD"), String.class); assertEquals(ReflectionUtils.getFieldType(B.class, "B_FIELD"), Integer.class); assertNull(ReflectionUtils.getFieldType(B.class, "A_FIELD")); assertEquals(ReflectionUtils.getFieldType(C.class, "C_FIELD"), boolean.class); assertNull(ReflectionUtils.getFieldType(C.class, "B_FIELD")); assertEquals(ReflectionUtils.getFieldType(C.class, "A_FIELD"), String.class); } /** * Test of getField method, of class ReflectionUtil. */ @Test public void testGetField() { assertNotNull(ReflectionUtils.getField(ClassB.class, "B_FIELD")); assertNotNull(ReflectionUtils.getField(ClassB.class, "A_FIELD")); assertNull(ReflectionUtils.getField(ClassA.class, "B_FIELD")); assertNotNull(ReflectionUtils.getField(ClassA.class, "A_FIELD")); assertNotNull(ReflectionUtils.getField(A.class, "A_FIELD")); assertNotNull(ReflectionUtils.getField(B.class, "B_FIELD")); assertNull(ReflectionUtils.getField(B.class, "A_FIELD")); assertNotNull(ReflectionUtils.getField(C.class, "C_FIELD")); assertNull(ReflectionUtils.getField(C.class, "B_FIELD")); assertNotNull(ReflectionUtils.getField(C.class, "A_FIELD")); } /** * Test of getMethodType method, of class ReflectionUtil. */ @Test public void testGetMethodReturnType() { assertEquals(ReflectionUtils.getMethodReturnType(ClassB.class, "getA"), String.class); assertEquals(ReflectionUtils.getMethodReturnType(ClassA.class, "getA"), String.class); assertEquals(ReflectionUtils.getMethodReturnType(A.class, "getA"), String.class); assertEquals(ReflectionUtils.getMethodReturnType(C.class, "getA"), String.class); assertNull(ReflectionUtils.getMethodReturnType(B.class, "getA", String.class)); assertEquals(ReflectionUtils.getMethodReturnType(ClassB.class, "isB"), boolean.class); assertEquals(ReflectionUtils.getMethodReturnType(ClassA.class, "isB"), boolean.class); assertEquals(ReflectionUtils.getMethodReturnType(A.class, "isB"), boolean.class); assertEquals(ReflectionUtils.getMethodReturnType(C.class, "isB"), boolean.class); assertNull(ReflectionUtils.getMethodReturnType(B.class, "isB")); assertEquals(ReflectionUtils.getMethodReturnType(ClassB.class, "setA", String.class), void.class); assertEquals(ReflectionUtils.getMethodReturnType(ClassA.class, "setA", String.class), void.class); assertEquals(ReflectionUtils.getMethodReturnType(A.class, "setA", String.class), void.class); assertEquals(ReflectionUtils.getMethodReturnType(C.class, "setA", String.class), void.class); assertNull(ReflectionUtils.getMethodReturnType(B.class, "setA", String.class)); assertEquals(ReflectionUtils.getMethodReturnType(ClassB.class, "setB", boolean.class), void.class); assertEquals(ReflectionUtils.getMethodReturnType(ClassA.class, "setB", boolean.class), void.class); assertEquals(ReflectionUtils.getMethodReturnType(A.class, "setB", boolean.class), void.class); assertEquals(ReflectionUtils.getMethodReturnType(C.class, "setB", boolean.class), void.class); assertNull(ReflectionUtils.getMethodReturnType(B.class, "setB", boolean.class)); } /** * Test of getMethod method, of class ReflectionUtil. */ @Test public void testGetMethod() { assertNotNull(ReflectionUtils.getMethod(ClassB.class, "getA")); assertNotNull(ReflectionUtils.getMethod(ClassA.class, "getA")); assertNotNull(ReflectionUtils.getMethod(A.class, "getA")); assertNotNull(ReflectionUtils.getMethod(C.class, "getA")); assertNull(ReflectionUtils.getMethod(B.class, "getA")); assertNotNull(ReflectionUtils.getMethod(ClassB.class, "isB")); assertNotNull(ReflectionUtils.getMethod(ClassA.class, "isB")); assertNotNull(ReflectionUtils.getMethod(A.class, "isB")); assertNotNull(ReflectionUtils.getMethod(C.class, "isB")); assertNull(ReflectionUtils.getMethod(B.class, "isB")); assertNotNull(ReflectionUtils.getMethod(ClassB.class, "setA", String.class)); assertNotNull(ReflectionUtils.getMethod(ClassA.class, "setA", String.class)); assertNotNull(ReflectionUtils.getMethod(A.class, "setA", String.class)); assertNotNull(ReflectionUtils.getMethod(C.class, "setA", String.class)); assertNull(ReflectionUtils.getMethod(B.class, "setA", String.class)); assertNotNull(ReflectionUtils.getMethod(ClassB.class, "setB", boolean.class)); assertNotNull(ReflectionUtils.getMethod(ClassA.class, "setB", boolean.class)); assertNotNull(ReflectionUtils.getMethod(A.class, "setB", boolean.class)); assertNotNull(ReflectionUtils.getMethod(C.class, "setB", boolean.class)); assertNull(ReflectionUtils.getMethod(B.class, "setB", boolean.class)); } /** * Test of getGetter method, of class ReflectionUtil. */ @Test public void testGetGetter() { assertNotNull(ReflectionUtils.getGetter(ClassB.class, "a")); assertNotNull(ReflectionUtils.getGetter(ClassA.class, "a")); assertNotNull(ReflectionUtils.getGetter(A.class, "a")); assertNotNull(ReflectionUtils.getGetter(C.class, "a")); assertNull(ReflectionUtils.getGetter(B.class, "a")); assertNotNull(ReflectionUtils.getGetter(ClassB.class, "b")); assertNotNull(ReflectionUtils.getGetter(ClassA.class, "b")); assertNotNull(ReflectionUtils.getGetter(A.class, "b")); assertNotNull(ReflectionUtils.getGetter(C.class, "b")); assertNull(ReflectionUtils.getGetter(B.class, "b")); } /** * Test of getSetter method, of class ReflectionUtil. */ @Test public void testGetSetter() { assertNotNull(ReflectionUtils.getSetter(ClassB.class, "a")); assertNotNull(ReflectionUtils.getSetter(ClassA.class, "a")); assertNotNull(ReflectionUtils.getSetter(A.class, "a")); assertNotNull(ReflectionUtils.getSetter(C.class, "a")); assertNull(ReflectionUtils.getSetter(B.class, "a")); assertNotNull(ReflectionUtils.getSetter(ClassB.class, "b")); assertNotNull(ReflectionUtils.getSetter(ClassA.class, "b")); assertNotNull(ReflectionUtils.getSetter(A.class, "b")); assertNotNull(ReflectionUtils.getSetter(C.class, "b")); assertNull(ReflectionUtils.getSetter(B.class, "b")); } }