package nl.tudelft.bw4t.client.controller; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import java.lang.reflect.InvocationTargetException; import java.util.LinkedList; import java.util.Stack; import nl.tudelft.bw4t.client.BW4TClient; import nl.tudelft.bw4t.client.environment.RemoteEnvironment; import nl.tudelft.bw4t.client.gui.BW4TClientGUI; import nl.tudelft.bw4t.map.BlockColor; import nl.tudelft.bw4t.map.NewMap; import nl.tudelft.bw4t.map.Zone; import nl.tudelft.bw4t.map.view.ViewBlock; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import eis.iilang.Function; import eis.iilang.Identifier; import eis.iilang.Numeral; import eis.iilang.Parameter; import eis.iilang.ParameterList; @RunWith(MockitoJUnitRunner.class) public class ClientMapControllerTest { @Mock private ClientController clientController; private NewMap map = new NewMap(); @Mock private RemoteEnvironment remoteEnvironment; @Mock private BW4TClientGUI clientGUI; @Mock private BW4TClient client; private ClientMapController clientMapController; @Before public void setUp() throws Exception { // when(map.getArea()).thenReturn(new Point(1.0, 1.0)); // when(clientController.getEnvironment()).thenReturn(remoteEnvironment); clientMapController = new ClientMapController(map, clientController); } /*********************************************************************************/ /************************* support functions *************************************/ /*********************************************************************************/ // private ViewBlock getBlock(Long blockID) throws NoSuchMethodException, // IllegalAccessException, InvocationTargetException { // Method method = ClientMapController.class.getDeclaredMethod("getBlock", // Long.class); // method.setAccessible(true); // ViewBlock block = (ViewBlock) method.invoke(clientMapController, // blockID); // return block; // } /** * Adds 3 blue blocks, having id 1, 2 and 3. */ private void add3Blocks() { for (int blocknr = 1; blocknr <= 3; blocknr++) { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(blocknr)); parameters.add(new Identifier("blue")); clientMapController.handlePercept("color", parameters); } } private void addRooms() { Zone zone = new Zone("Room1", null, Zone.Type.ROOM); clientMapController.addOccupiedRoom(zone); clientMapController.getMap().addZone(zone); zone = new Zone(Zone.DROP_ZONE_NAME, null, Zone.Type.ROOM); clientMapController.getMap().addZone(zone); } /*********************************************************************************/ /******************************** tests ******************************************/ /*********************************************************************************/ @Ignore @Test public void testRun() { clientMapController.run(); verify(clientController, times(1)).getEnvironment(); } @Test public void testUpdateRenderer() { clientMapController.updateRenderer(clientGUI); verify(clientGUI, times(1)).validate(); verify(clientGUI, times(1)).repaint(); } @Test public void testHandlePerceptNotOccupied() { addRooms(); LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Function("occupied", new Identifier("Room1"))); clientMapController.handlePercept("not", parameters); assertFalse(clientMapController.getOccupiedRooms().contains("Room1")); } @Test public void testHandlePerceptHolding() { add3Blocks(); ParameterList blocks = new ParameterList(); blocks.add(new Numeral(2)); blocks.add(new Numeral(3)); LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(blocks); clientMapController.handlePercept("holdingblocks", parameters); assertTrue(stackContains(clientMapController.getTheBot().getHolding(), 2)); assertTrue(stackContains(clientMapController.getTheBot().getHolding(), 3)); assertFalse(stackContains(clientMapController.getTheBot().getHolding(), 1)); blocks = new ParameterList(); blocks.add(new Numeral(1)); parameters = new LinkedList<Parameter>(); parameters.add(blocks); clientMapController.handlePercept("holdingblocks", parameters); assertFalse(stackContains(clientMapController.getTheBot().getHolding(), 2)); assertFalse(stackContains(clientMapController.getTheBot().getHolding(), 3)); assertTrue(stackContains(clientMapController.getTheBot().getHolding(), 1)); } @Test public void testHandlePerceptNotOther() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Function("other", new Numeral(2))); clientMapController.handlePercept("not", parameters); } @Test public void testHandlePerceptRobot() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(2)); clientMapController.handlePercept("robot", parameters); assertEquals(new Long(2), clientMapController.getTheBot().getId()); } @Test public void testHandlePerceptOccupied() { addRooms(); LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Identifier(Zone.DROP_ZONE_NAME)); clientMapController.handlePercept("occupied", parameters); Zone dropzone = clientMapController.getDropZone(); assertTrue(dropzone != null); assertTrue(clientMapController.isOccupied(dropzone)); // can't check #calls, this is real object, not a mock. // verify(map, times(1)).getZone(Zone.DROP_ZONE_NAME); } /** check if some id is in the stack of blocks. */ private boolean stackContains(Stack<ViewBlock> blocks, int id) { for (ViewBlock block : blocks) { if (block.getObjectId() == id) { return true; } } return false; } @Test public void testHandlePerceptPosition() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(3)); parameters.add(new Numeral(3)); parameters.add(new Numeral(4)); clientMapController.handlePercept("position", parameters); Long blockID = new Long(3); ViewBlock block = clientMapController.getBlock(blockID); assertEquals(3.0, block.getPosition().getX(), 0.001); assertEquals(4.0, block.getPosition().getY(), 0.001); } @Test public void testHandlePerceptPositionEPartner() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(3)); parameters.add(new Numeral(3)); parameters.add(new Numeral(3)); parameters.add(new ParameterList()); testHandlePerceptEPartner(); clientMapController.handlePercept("position", parameters); assertEquals(3, clientMapController.getViewEPartner(3).getLocation() .getX(), 0.001); assertEquals(3, clientMapController.getViewEPartner(3).getLocation() .getX(), 0.001); } @Test public void testHandlePerceptColor() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(3)); parameters.add(new Identifier("blue")); clientMapController.handlePercept("color", parameters); ViewBlock block = clientMapController.getBlock(new Long(3)); assertEquals(BlockColor.BLUE, block.getColor()); } @Test public void testHandlePerceptColors() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { add3Blocks(); assertEquals(3, clientMapController.getVisibleBlocks().size()); ViewBlock block = clientMapController.getBlock(new Long(3)); assertEquals(BlockColor.BLUE, block.getColor()); } @Test public void testHandlePerceptEPartner() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(3)); parameters.add(new Identifier("NAAM")); parameters.add(new Numeral(3)); parameters.add(new ParameterList()); clientMapController.handlePercept("epartner", parameters); assertEquals(new Long(3), clientMapController.getViewEPartner(3) .getId()); assertEquals("NAAM", clientMapController.getViewEPartner(3).getName()); } @Test public void testHandlePerceptEPartnerNull() { testHandlePerceptEPartner(); testHandlePerceptEPartner(); } @Test public void testHandlePerceptEPartnerHolderID() { testHandlePerceptRobot(); LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(2)); parameters.add(new Identifier("NAAM")); parameters.add(new Numeral(2)); parameters.add(new ParameterList()); clientMapController.handlePercept("epartner", parameters); assertEquals(new Long(2), clientMapController.getViewEPartner(2) .getId()); assertEquals("NAAM", clientMapController.getViewEPartner(2).getName()); } @Test public void testHandlePerceptEPartnerHolderIDSameID() { testHandlePerceptRobot(); testHandlePerceptEPartnerHolderID(); LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(2)); parameters.add(new Identifier("NAAM")); parameters.add(new Numeral(2)); parameters.add(new ParameterList()); clientMapController.handlePercept("epartner", parameters); assertEquals(new Long(2), clientMapController.getViewEPartner(2) .getId()); assertEquals("NAAM", clientMapController.getViewEPartner(2).getName()); } @Test public void testHandlePerceptEPartnerSameIDHoldingPartner() { testHandlePerceptRobot(); testHandlePerceptEPartnerHolderID(); // testHandlePerceptHolding(); // Why is this called separately?????? LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(2)); parameters.add(new Identifier("NAAM")); parameters.add(new Numeral(3)); parameters.add(new ParameterList()); clientMapController.handlePercept("epartner", parameters); assertEquals(new Long(2), clientMapController.getViewEPartner(2) .getId()); assertEquals("NAAM", clientMapController.getViewEPartner(2).getName()); } @Test public void testHandlePerceptEPartnerSameIDHoldingPartnerNegative() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(1)); parameters.add(new Identifier("NAAM")); parameters.add(new Numeral(-2)); parameters.add(new ParameterList()); clientMapController.handlePercept("epartner", parameters); assertEquals(-1, clientMapController.getTheBot().getHoldingEpartner()); assertEquals("NAAM", clientMapController.getViewEPartner(1).getName()); } @Test public void testHandlePerceptColorSequence() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); ParameterList parameterList = new ParameterList(); parameterList.add(new Identifier("b")); parameterList.add(new Identifier("r")); parameterList.add(new Identifier("g")); parameterList.add(new Identifier("y")); parameters.add(parameterList); clientMapController.handlePercept("sequence", parameters); assertEquals(BlockColor.BLUE, clientMapController.getSequence().get(0)); assertEquals(BlockColor.RED, clientMapController.getSequence().get(1)); assertEquals(BlockColor.GREEN, clientMapController.getSequence().get(2)); assertEquals(BlockColor.YELLOW, clientMapController.getSequence() .get(3)); } @Test public void testHandlePerceptSequenceIndex() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(3)); clientMapController.handlePercept("sequenceIndex", parameters); assertEquals(3, clientMapController.getSequenceIndex()); } @Test public void testHandlePerceptLocation() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(3)); parameters.add(new Numeral(3)); clientMapController.handlePercept("location", parameters); } @Test public void testHandlePerceptRobotSize() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(2)); parameters.add(new Numeral(2)); testHandlePerceptRobot(); clientMapController.handlePercept("robotSize", parameters); assertEquals(2, clientMapController.getTheBot().getRobotSize()); } @Test public void testHandlePerceptRobotSizeNeq() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(314159)); parameters.add(new Numeral(314159)); testHandlePerceptRobotSize(); testHandlePerceptRobot(); clientMapController.handlePercept("robotSize", parameters); assertEquals(2, clientMapController.getTheBot().getRobotSize()); } @Test public void testHandlePerceptIgnorePercept() { LinkedList<Parameter> parameters = new LinkedList<Parameter>(); parameters.add(new Numeral(314159)); parameters.add(new Numeral(314159)); testHandlePerceptRobot(); clientMapController.handlePercept("tudelft", parameters); } }