package com.jenjinstudios.world.server.message; import com.jenjinstudios.core.io.Message; import com.jenjinstudios.core.io.MessageRegistry; import com.jenjinstudios.world.Actor; import com.jenjinstudios.world.World; import com.jenjinstudios.world.math.Angle; import com.jenjinstudios.world.server.WorldClientHandler; import com.jenjinstudios.world.server.WorldServer; import com.jenjinstudios.world.util.WorldUtils; import org.testng.Assert; import org.testng.annotations.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * @author Caleb Brinkman */ @SuppressWarnings("unchecked") public class ExecutableStateChangeRequestTest { private static final MessageRegistry messageRegistry = MessageRegistry.getInstance(); @Test public void testValidRequest() throws InterruptedException { World world = WorldUtils.createDefaultWorld(); Actor player = new Actor("FooBar"); world.getWorldObjects().add(player); world.update(); WorldClientHandler mock = mock(WorldClientHandler.class); when(mock.getPlayer()).thenReturn(player); WorldServer worldServer = mock(WorldServer.class); when(mock.getServer()).thenReturn(worldServer); when(worldServer.getUps()).thenReturn(50); Message request = messageRegistry.createMessage("StateChangeRequest"); request.setArgument("relativeAngle", Angle.FRONT); request.setArgument("absoluteAngle", 0.0); request.setArgument("xCoordinate", 0.0); request.setArgument("yCoordinate", 0.0); request.setArgument("timeOfChange", System.currentTimeMillis()); ExecutableStateChangeRequest executableStateChangeRequest = new ExecutableStateChangeRequest(mock, request); executableStateChangeRequest.runImmediate(); executableStateChangeRequest.runDelayed(); player.preUpdate(); player.update(); player.postUpdate(); Assert.assertEquals(player.getAngle(), new Angle(0.0, Angle.FRONT)); } @Test public void testInvalidRequestCoordinates() { World world = WorldUtils.createDefaultWorld(); Actor player = new Actor("FooBar"); world.getWorldObjects().add(player); world.update(); WorldClientHandler mock = mock(WorldClientHandler.class); when(mock.getPlayer()).thenReturn(player); WorldServer worldServer = mock(WorldServer.class); when(mock.getServer()).thenReturn(worldServer); when(worldServer.getUps()).thenReturn(50); Message request = messageRegistry.createMessage("StateChangeRequest"); request.setArgument("relativeAngle", Angle.FRONT); request.setArgument("absoluteAngle", 0.0); request.setArgument("xCoordinate", 15.0); request.setArgument("yCoordinate", 15.0); request.setArgument("timeOfChange", System.currentTimeMillis()); ExecutableStateChangeRequest executableStateChangeRequest = new ExecutableStateChangeRequest(mock, request); executableStateChangeRequest.runImmediate(); executableStateChangeRequest.runDelayed(); player.preUpdate(); player.update(); player.postUpdate(); Assert.assertEquals(player.getAngle(), new Angle(0.0, Angle.IDLE)); } @Test public void testInvalidRequestTime() { // Functionally the same as testing excessive delay. World world = WorldUtils.createDefaultWorld(); Actor player = new Actor("FooBar"); world.getWorldObjects().add(player); world.update(); WorldClientHandler mock = mock(WorldClientHandler.class); when(mock.getPlayer()).thenReturn(player); WorldServer worldServer = mock(WorldServer.class); when(mock.getServer()).thenReturn(worldServer); when(worldServer.getUps()).thenReturn(50); Message request = messageRegistry.createMessage("StateChangeRequest"); request.setArgument("relativeAngle", Angle.FRONT); request.setArgument("absoluteAngle", 0.0); request.setArgument("xCoordinate", 0.0); request.setArgument("yCoordinate", 0.0); request.setArgument("timeOfChange", System.currentTimeMillis() - 2000); ExecutableStateChangeRequest executableStateChangeRequest = new ExecutableStateChangeRequest(mock, request); executableStateChangeRequest.runImmediate(); executableStateChangeRequest.runDelayed(); player.preUpdate(); player.update(); player.postUpdate(); Assert.assertEquals(player.getAngle(), new Angle(0.0, Angle.IDLE)); } @Test public void testExcessiveDelay() throws InterruptedException { World world = WorldUtils.createDefaultWorld(); Actor player = new Actor("FooBar"); world.getWorldObjects().add(player); world.update(); WorldClientHandler mock = mock(WorldClientHandler.class); WorldServer worldServer = mock(WorldServer.class); when(mock.getServer()).thenReturn(worldServer); when(worldServer.getUps()).thenReturn(50); when(mock.getPlayer()).thenReturn(player); Message request = messageRegistry.createMessage("StateChangeRequest"); request.setArgument("relativeAngle", Angle.FRONT); request.setArgument("absoluteAngle", 0.0); request.setArgument("xCoordinate", 0.0); request.setArgument("yCoordinate", 0.0); request.setArgument("timeOfChange", System.currentTimeMillis()); Thread.sleep(1200); ExecutableStateChangeRequest executableStateChangeRequest = new ExecutableStateChangeRequest(mock, request); executableStateChangeRequest.runImmediate(); executableStateChangeRequest.runDelayed(); player.preUpdate(); player.update(); player.postUpdate(); Assert.assertEquals(player.getAngle(), new Angle(0.0, Angle.IDLE)); } }