package openmods.reflection; import openmods.reflection.MethodAccess.Function0; import openmods.reflection.MethodAccess.Function1; import openmods.reflection.MethodAccess.Function2; import openmods.reflection.MethodAccess.Function3; import openmods.reflection.MethodAccess.Function4; import openmods.reflection.MethodAccess.Function5; import openmods.reflection.MethodAccess.FunctionVar; import org.junit.Assert; import org.junit.Test; public class FunctionTypesTest { static { TypeVariableHolderHandler.initializeClass(MethodAccess.TypeVariableHolders.class); } private static Class<?>[] wrap(Class<?>... cls) { return cls; } @Test public void testFunctionVar() { abstract class F implements FunctionVar<Integer> {} Assert.assertEquals(Integer.class, MethodAccess.resolveReturnType(F.class)); } @Test(expected = IllegalArgumentException.class) public void testFunctionVarParams() { abstract class F implements FunctionVar<Integer> {} MethodAccess.resolveParameterTypes(F.class); } @Test public void testFunction0() { abstract class F implements Function0<Integer> {} Assert.assertEquals(Integer.class, MethodAccess.resolveReturnType(F.class)); Assert.assertArrayEquals(wrap(), MethodAccess.resolveParameterTypes(F.class)); } @Test public void testFunction1() { abstract class F implements Function1<Boolean, Integer> {} Assert.assertEquals(Boolean.class, MethodAccess.resolveReturnType(F.class)); Assert.assertArrayEquals(wrap(Integer.class), MethodAccess.resolveParameterTypes(F.class)); } @Test public void testFunction2() { abstract class F implements Function2<Integer, Boolean, Character> {} Assert.assertEquals(Integer.class, MethodAccess.resolveReturnType(F.class)); Assert.assertArrayEquals(wrap(Boolean.class, Character.class), MethodAccess.resolveParameterTypes(F.class)); } @Test public void testFunction3() { abstract class F implements Function3<Character, Integer, Long, String> {} Assert.assertEquals(Character.class, MethodAccess.resolveReturnType(F.class)); Assert.assertArrayEquals(wrap(Integer.class, Long.class, String.class), MethodAccess.resolveParameterTypes(F.class)); } @Test public void testFunction4() { abstract class F implements Function4<String, Double, Integer, Boolean, Character> {} Assert.assertEquals(String.class, MethodAccess.resolveReturnType(F.class)); Assert.assertArrayEquals(wrap(Double.class, Integer.class, Boolean.class, Character.class), MethodAccess.resolveParameterTypes(F.class)); } @Test public void testFunction5() { abstract class F implements Function5<Void, Integer, Double, Long, Float, Boolean> {} Assert.assertEquals(Void.class, MethodAccess.resolveReturnType(F.class)); Assert.assertArrayEquals(wrap(Integer.class, Double.class, Long.class, Float.class, Boolean.class), MethodAccess.resolveParameterTypes(F.class)); } @Test(expected = IllegalArgumentException.class) public void testMultibaseFunction() { abstract class F implements Function0<Integer>, Function1<Integer, Boolean> {} MethodAccess.resolveParameterTypes(F.class); } }