package util; import java.lang.reflect.Method; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.junit.runners.MethodSorters; import static org.junit.Assert.*; import static util.ArrayUtils.*; import static util.MemberAccessor.*; @RunWith(JUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class MemberAccessorTests { static class Test1 { /* Different kind of methods: no params, some params, variadic params alone, * variadic params with other params, ... */ public void test1() {} public void test2(Test1 x) {} public void test3(Test1 x, Test1 y) {} public void test4(Test1... x) {} public void test5(String x, Test1... y) {} public void test6(Test1 x, Test1... y) {} // Private method. @SuppressWarnings("unused") private void test7(Test1 x, Test1... y) {} /* Ambiguous overloaded methods: the selected method needs to be * disambiguated using an arbiter. */ public int test8(Test1 x) { return 1; } public int test8(Test2 x) { return 2; } public int test9(Test1 x, Test2 y, Test2 z) { return 1; } public int test9(Test2 x, Test1 y, Test1 z) { return 2; } // Methods taking primitive parameters. public void test10(int x) {} public void test11(int... x) {} } static class Test2 extends Test1 {} static final Class<Test1> klass = Test1.class; static Method test1; static Method test2; static Method test3; static Method test4; static Method test5; static Method test6; @BeforeClass public static void setup() throws Exception { test1 = klass.getMethod("test1"); test2 = klass.getMethod("test2", Test1.class); test3 = klass.getMethod("test3", Test1.class, Test1.class); test4 = klass.getMethod("test4", Test1[].class); test5 = klass.getMethod("test5", String.class, Test1[].class); test6 = klass.getMethod("test6", Test1.class, Test1[].class); } @Test public void aa_checkParams() throws Exception { assertTrue (checkParams(test1, new Class<?>[0])); assertFalse (checkParams(test1, arr(Object.class))); assertTrue (checkParams(test2, arr(Test1.class))); assertTrue (checkParams(test2, arr(Test2.class))); assertFalse (checkParams(test2, arr(Object.class))); assertTrue (checkParams(test3, arr(Test2.class, Test2.class))); assertTrue (checkParams(test4, new Class<?>[0])); assertTrue (checkParams(test4, arr(Test2.class))); assertTrue (checkParams(test4, arr(Test2.class, Test2.class))); assertFalse (checkParams(test4, arr(Object.class))); assertTrue (checkParams(test5, arr(String.class))); assertTrue (checkParams(test5, arr(String.class, Test2.class))); assertTrue (checkParams(test5, arr(String.class, Test2.class, Test2.class))); assertTrue (checkParams(test6, arr(Test2.class))); assertTrue (checkParams(test6, arr(Test2.class, Test2.class))); assertTrue (checkParams(test6, arr(Test2.class, Test2.class, Test2.class))); assertFalse (checkParams(test6, new Class<?>[0])); } @Test public void ab_repackageParams() throws Exception { Test1 t = new Test1(); test1.invoke(t, repackageParams(test1, arr())); test2.invoke(t, repackageParams(test2, arr(t))); test4.invoke(t, repackageParams(test4, arr())); test4.invoke(t, repackageParams(test4, arr(t))); test4.invoke(t, repackageParams(test4, arr(t, t))); test5.invoke(t, repackageParams(test5, arr("x"))); test5.invoke(t, repackageParams(test5, arr("x", t))); test6.invoke(t, repackageParams(test6, arr(t))); test6.invoke(t, repackageParams(test6, arr(t, t))); } @Test public void ac_invoke() throws Exception { /* Test2 subclasses Test1, which defines the methods. So the invocations * will test that the hierarchy is traversed properly. */ Test1 t = new Test2(); invoke(t, "test1"); invoke(t, "test2", t); invoke(t, "test3", t, t); invoke(t, "test4"); invoke(t, "test4", t); invoke(t, "test4", t, t); invoke(t, "test5", "x"); invoke(t, "test5", "x", t, t); invoke(t, "test6", t); invoke(t, "test6", t, t, t); invoke(t, "test7", t, t, t); assertEquals(1, invoke(t, "test8", arr(Test1.class), t)); assertEquals(2, invoke(t, "test8", arr(Test2.class), t)); assertEquals(1, invoke(t, "test9", arr(Test2.class, Test2.class), t, t, t)); assertEquals(2, invoke(t, "test9", arr(Test2.class, Test1.class), t, t, t)); invoke(t, "test10", 1); invoke(t, "test11"); invoke(t, "test11", 1, 1, 1); try { invoke(t, "test11", "x"); fail("Expected NoSuchMethodException."); } catch (MemberAccessException e) { assertTrue(e.getCause() instanceof NoSuchMethodException); } try { invoke(t, "testDontExist"); fail("Expected NoSuchMethodException."); } catch (MemberAccessException e) { assertTrue(e.getCause() instanceof NoSuchMethodException); } } }