package openmods.reflection; import java.lang.reflect.TypeVariable; import org.junit.Assert; import org.junit.Test; public class TypeVariableHolderTest { public interface ParA<A, B> {} public interface ParB<A, B> {} @TypeVariableHolder(ParA.class) private static class ParHolder { public static TypeVariable<?> A; @TypeVariableHolder(ParB.class) public static TypeVariable<?> B; } @TypeVariableHolder private static class ParamerizedHolderClassLevel<A, B> { public static TypeVariable<?> A; public static TypeVariable<?> B; } private static class ParamerizedHolderVariableLevel<A, B> { @TypeVariableHolder public static TypeVariable<?> A; public static TypeVariable<?> B; } @Test public void testClassLevelOwnParameters() { final TypeVariableHolderHandler handler = new TypeVariableHolderHandler(); handler.fillHolders(ParamerizedHolderClassLevel.class); final TypeVariable<?>[] parameters = ParamerizedHolderClassLevel.class.getTypeParameters(); Assert.assertEquals(parameters[0], ParamerizedHolderClassLevel.A); Assert.assertEquals(parameters[1], ParamerizedHolderClassLevel.B); } @Test public void testVariableLevelOwnParameters() { final TypeVariableHolderHandler handler = new TypeVariableHolderHandler(); handler.fillHolders(ParamerizedHolderVariableLevel.class); final TypeVariable<?>[] parameters = ParamerizedHolderVariableLevel.class.getTypeParameters(); Assert.assertEquals(parameters[0], ParamerizedHolderVariableLevel.A); Assert.assertNull(ParamerizedHolderVariableLevel.B); } @Test public void testParametersFromExternalClass() { final TypeVariableHolderHandler handler = new TypeVariableHolderHandler(); handler.fillHolders(ParHolder.class); final TypeVariable<?>[] parametersA = ParA.class.getTypeParameters(); final TypeVariable<?>[] parametersB = ParB.class.getTypeParameters(); Assert.assertEquals(parametersA[0], ParHolder.A); Assert.assertEquals(parametersB[1], ParHolder.B); } }