package jalse.entities.functions; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Test; import jalse.actions.Action; import jalse.actions.ActionContext; import jalse.entities.Entity; import jalse.entities.annotations.ScheduleForActor; import jalse.entities.methods.ScheduleForActorMethod; public class ScheduleForActorFunctionTest { public static class TestAction implements Action<Entity> { @Override public void perform(final ActionContext<Entity> context) throws InterruptedException {} } interface TestInvalidEntity extends Entity { ActionContext<Entity> scheduleTest(); } interface TestInvalidEntity2 extends Entity { @ScheduleForActor(action = TestAction.class) Boolean scheduleTest(); } interface TestInvalidEntity3 extends Entity { @ScheduleForActor(action = TestAction.class) ActionContext<Boolean> scheduleTest(); } interface TestInvalidEntity4 extends Entity { @ScheduleForActor(action = TestAction.class) void scheduleTest(String str); } interface TestInvalidEntity5 extends Entity { @ScheduleForActor(action = TestAction.class, initialDelay = -1L, period = -1L) void scheduleTest(); } interface TestValidEntity extends Entity { @ScheduleForActor(action = TestAction.class) ActionContext<Entity> scheduleTest(); } interface TestValidEntity2 extends Entity { @ScheduleForActor(action = TestAction.class) void scheduleTest(); } interface TestValidEntity3 extends Entity { @ScheduleForActor(action = TestAction.class, initialDelay = 50, unit = TimeUnit.MILLISECONDS) void scheduleTest(); } interface TestValidEntity4 extends Entity { @ScheduleForActor(action = TestAction.class, initialDelay = 50, period = 200, unit = TimeUnit.MILLISECONDS) void scheduleTest(); } ScheduleForActorFunction function; @After public void after() { function = null; } public Method scheduleTestMethod(final Class<?> clazz, final Class<?>... params) { Method m = null; try { m = clazz.getDeclaredMethod("scheduleTest", params); } catch (NoSuchMethodException | SecurityException e) { fail("Could not get method reference"); } return m; } @Test public void testInvalid() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestInvalidEntity.class); final ScheduleForActorMethod sfam = function.apply(m); assertNull(sfam); } @Test(expected = IllegalArgumentException.class) public void testInvalid2() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestInvalidEntity2.class); function.apply(m); } @Test(expected = IllegalArgumentException.class) public void testInvalid3() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestInvalidEntity3.class); function.apply(m); } @Test(expected = IllegalArgumentException.class) public void testInvalid4() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestInvalidEntity4.class, String.class); function.apply(m); } @Test(expected = IllegalArgumentException.class) public void testInvalid5() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestInvalidEntity5.class); function.apply(m); } @Test public void testValid() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestValidEntity.class); final ScheduleForActorMethod sfam = function.apply(m); assertNotNull(sfam); assertTrue(sfam.getInitialDelay() == 0L); assertTrue(sfam.getPeriod() == 0L); assertEquals(sfam.getUnit(), TimeUnit.NANOSECONDS); } @Test public void testValid2() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestValidEntity2.class); final ScheduleForActorMethod sfam = function.apply(m); assertNotNull(sfam); assertTrue(sfam.getInitialDelay() == 0L); assertTrue(sfam.getPeriod() == 0L); assertEquals(sfam.getUnit(), TimeUnit.NANOSECONDS); } @Test public void testValid3() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestValidEntity3.class); final ScheduleForActorMethod sfam = function.apply(m); assertNotNull(sfam); assertTrue(sfam.getInitialDelay() == 50L); assertTrue(sfam.getPeriod() == 0L); assertEquals(sfam.getUnit(), TimeUnit.MILLISECONDS); } @Test public void testValid4() { function = new ScheduleForActorFunction(); final Method m = scheduleTestMethod(TestValidEntity4.class); final ScheduleForActorMethod sfam = function.apply(m); assertNotNull(sfam); assertTrue(sfam.getInitialDelay() == 50L); assertTrue(sfam.getPeriod() == 200L); assertEquals(sfam.getUnit(), TimeUnit.MILLISECONDS); } }