added contents

This commit is contained in:
Mark Minas
2024-09-18 17:04:31 +02:00
parent d28b17eba5
commit 71a4ac8d12
176 changed files with 51198 additions and 0 deletions

View File

@@ -0,0 +1,157 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.client;
import org.junit.Before;
import org.junit.Test;
import pp.battleship.BattleshipConfig;
import pp.battleship.game.client.ClientGameLogic;
import pp.battleship.message.server.GameDetails;
import pp.battleship.model.Battleship;
import pp.battleship.model.Battleship.Status;
import pp.battleship.model.IntPoint;
import pp.battleship.model.Rotation;
import java.util.Properties;
import static java.util.Collections.emptyList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public class EditorTest {
private static final BattleshipConfig CONFIG = new BattleshipConfig();
static {
final Properties props = new Properties();
props.setProperty("map.width", "10");
props.setProperty("map.height", "10");
props.setProperty("harbor.width", "6");
props.setProperty("harbor.height", "10");
props.setProperty("ship.nums", "1,1");
CONFIG.readFrom(props);
}
private ClientGameLogic logic;
private static IntPoint p(int x, int y) {
return new IntPoint(x, y);
}
@Before
public void setUp() {
logic = new ClientGameLogic(null);
logic.received(new GameDetails(CONFIG));
}
@Test
public void testInit() {
assertEquals(emptyList(), logic.getOwnMap().getItems());
assertEquals(2, logic.getHarbor().getItems().size());
final Battleship ship1 = (Battleship) logic.getHarbor().getItems().get(0);
checkShip(ship1, 1, 0, 0, Rotation.RIGHT, Status.NORMAL);
final Battleship ship2 = (Battleship) logic.getHarbor().getItems().get(1);
checkShip(ship2, 2, 0, 1, Rotation.RIGHT, Status.NORMAL);
}
private void checkShip(Battleship ship, int length, int x, int y, Rotation rot, Status status) {
assertEquals(length, ship.getLength());
assertEquals(x, ship.getX());
assertEquals(y, ship.getY());
assertEquals(rot, ship.getRot());
assertEquals(status, ship.getStatus());
}
@Test
public void testRun1() {
logic.clickHarbor(p(0, 0));
logic.clickOwnMap(p(0, 0)); // place ship 1 at (0,0)
assertEquals(1, logic.getOwnMap().getShips().count());
assertEquals(1, logic.getHarbor().getShips().count());
checkShip((Battleship) logic.getHarbor().getItems().get(0),
2, 0, 1, Rotation.RIGHT, Status.NORMAL);
checkShip((Battleship) logic.getOwnMap().getItems().get(0),
1, 0, 0, Rotation.RIGHT, Status.NORMAL);
assertEquals(logic.getOwnMap().findShipAt(0, 0), logic.getOwnMap().getShips().findFirst().get());
assertNull(logic.getOwnMap().findShipAt(1, 0));
assertNull(logic.getOwnMap().findShipAt(0, 1));
logic.clickOwnMap(p(0, 0)); // select ship1
logic.clickHarbor(p(0, 0)); // return it to harbor
assertEquals(0, logic.getOwnMap().getShips().count());
assertEquals(2, logic.getHarbor().getShips().count());
logic.clickHarbor(p(0, 0)); // select ship 1 in harbor
logic.clickOwnMap(p(0, 0)); // place it at (0,0)
checkShip((Battleship) logic.getHarbor().getItems().get(0),
2, 0, 1, Rotation.RIGHT, Status.NORMAL);
checkShip((Battleship) logic.getOwnMap().getItems().get(0),
1, 0, 0, Rotation.RIGHT, Status.NORMAL);
logic.clickHarbor(p(0, 1)); // select ship 2 in harbor
logic.clickOwnMap(p(0, 0)); // try to place it at (0,0); this is too close to ship 1
assertEquals(2, logic.getOwnMap().getShips().count());
assertEquals(1, logic.getHarbor().getShips().count());
checkShip((Battleship) logic.getHarbor().getItems().get(0),
2, 0, 1, Rotation.RIGHT, Status.VALID_PREVIEW);
checkShip((Battleship) logic.getOwnMap().getItems().get(0),
1, 0, 0, Rotation.RIGHT, Status.NORMAL);
checkShip((Battleship) logic.getOwnMap().getItems().get(1),
2, 0, 0, Rotation.RIGHT, Status.INVALID_PREVIEW);
logic.rotateShip(); // rotate selected ship 2
logic.clickOwnMap(p(5, 5)); // place it at (5,5)
assertEquals(2, logic.getOwnMap().getShips().count());
assertEquals(0, logic.getHarbor().getShips().count());
checkShip((Battleship) logic.getOwnMap().getItems().get(0),
1, 0, 0, Rotation.RIGHT, Status.NORMAL);
checkShip((Battleship) logic.getOwnMap().getItems().get(1),
2, 5, 5, Rotation.DOWN, Status.NORMAL);
assertEquals(logic.getOwnMap().getShips().toList().get(1), logic.getOwnMap().findShipAt(5, 5));
assertEquals(logic.getOwnMap().getShips().toList().get(1), logic.getOwnMap().findShipAt(5, 4));
assertTrue(logic.isMapComplete());
}
@Test
public void testRun2() {
logic.clickHarbor(p(0, 0));
logic.clickOwnMap(p(9, 9)); // place ship 1 at (9,9)
assertEquals(1, logic.getOwnMap().getShips().count());
assertEquals(1, logic.getHarbor().getShips().count());
checkShip((Battleship) logic.getHarbor().getItems().get(0),
2, 0, 1, Rotation.RIGHT, Status.NORMAL);
checkShip((Battleship) logic.getOwnMap().getItems().get(0),
1, 9, 9, Rotation.RIGHT, Status.NORMAL);
assertEquals(logic.getOwnMap().findShipAt(9, 9), logic.getOwnMap().getShips().findFirst().get());
assertNull(logic.getOwnMap().findShipAt(10, 9));
assertNull(logic.getOwnMap().findShipAt(9, 10));
assertFalse(logic.isMapComplete());
logic.clickHarbor(p(0, 1)); // select ship 2 in harbor of player 2
logic.clickOwnMap(p(0, 0)); // place it at (0,0)
assertEquals(2, logic.getOwnMap().getShips().count());
assertEquals(0, logic.getHarbor().getShips().count());
assertEquals(logic.getOwnMap().getShips().toList().get(0), logic.getOwnMap().findShipAt(9, 9));
assertEquals(logic.getOwnMap().getShips().toList().get(1), logic.getOwnMap().findShipAt(0, 0));
assertEquals(logic.getOwnMap().getShips().toList().get(1), logic.getOwnMap().findShipAt(1, 0));
assertTrue(logic.isMapComplete());
}
}

View File

@@ -0,0 +1,63 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.game.client;
import org.junit.Before;
import pp.battleship.message.client.ClientMessage;
import pp.battleship.model.Battleship;
import pp.battleship.model.Battleship.Status;
import pp.battleship.model.IntPoint;
import pp.battleship.model.Rotation;
import pp.battleship.notification.GameEventListener;
import pp.battleship.notification.InfoTextEvent;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import static org.junit.Assert.assertEquals;
public abstract class AbstractClientGameTest {
final Deque<String> infoTexts = new ArrayDeque<>();
final Deque<ClientMessage> messages = new ArrayDeque<>();
final ClientGameLogic clientLogic = new ClientGameLogic(messages::offer);
static {
// Configure logging
final Logger rootLogger = LogManager.getLogManager().getLogger("");
rootLogger.setLevel(Level.WARNING);
for (Handler h : rootLogger.getHandlers()) {
h.setLevel(Level.WARNING);
}
}
@Before
public void setup() {
clientLogic.addListener(new GameEventListener() {
@Override
public void receivedEvent(InfoTextEvent event) {
infoTexts.offer(event.key());
}
});
}
static IntPoint p(int x, int y) {
return new IntPoint(x, y);
}
void checkShip(Battleship ship, int length, int x, int y, Rotation rot, Status status) {
assertEquals(length, ship.getLength());
assertEquals(x, ship.getX());
assertEquals(y, ship.getY());
assertEquals(rot, ship.getRot());
assertEquals(status, ship.getStatus());
}
}

View File

@@ -0,0 +1,243 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.game.client;
import org.junit.Test;
import pp.battleship.BattleshipConfig;
import pp.battleship.message.client.MapMessage;
import pp.battleship.message.client.ShootMessage;
import pp.battleship.message.server.EffectMessage;
import pp.battleship.message.server.GameDetails;
import pp.battleship.message.server.StartBattleMessage;
import pp.battleship.model.Battleship;
import java.util.List;
import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static pp.battleship.model.Battleship.Status.NORMAL;
import static pp.battleship.model.Battleship.Status.VALID_PREVIEW;
import static pp.battleship.model.Rotation.DOWN;
import static pp.battleship.model.Rotation.RIGHT;
/**
* Integration test cases for the client game logic of Player 1 in a small game, called "Game 1".
* The test cases for Player 2 are contained in {@linkplain ClientGame1Player2Test}
* and the test cases for the server in {@linkplain pp.battleship.game.server.ServerGame1Test}.
*
* @see ClientGame1Player2Test
* @see pp.battleship.game.server.ServerGame1Test
*/
public class ClientGame1Player1Test extends AbstractClientGameTest {
@Test
public void testClient() {
BattleshipConfig config;
Properties props;
List<Battleship> ships;
MapMessage mapMsg;
ShootMessage shootMsg;
config = new BattleshipConfig();
props = new Properties();
props.setProperty("map.width", "6");
props.setProperty("map.height", "6");
props.setProperty("harbor.width", "6");
props.setProperty("harbor.height", "6");
props.setProperty("ship.nums", "1,1");
config.readFrom(props);
clientLogic.received(new GameDetails(config));
assertEquals("place.ships.in.your.map", infoTexts.poll());
clientLogic.clickHarbor(p(0, 1));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 0, 1, RIGHT, VALID_PREVIEW);
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 0, 1, RIGHT, VALID_PREVIEW);
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(4, 1));
clientLogic.movePreview(p(4, 1));
clientLogic.movePreview(p(3, 1));
clientLogic.movePreview(p(2, 1));
clientLogic.movePreview(p(2, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(0, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(2, 1));
clientLogic.movePreview(p(2, 1));
clientLogic.movePreview(p(2, 1));
clientLogic.movePreview(p(2, 1));
clientLogic.movePreview(p(2, 1));
clientLogic.movePreview(p(2, 1));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 2, 1, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 0, 1, RIGHT, VALID_PREVIEW);
clientLogic.clickOwnMap(p(2, 1));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 2, 1, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, NORMAL);
clientLogic.clickHarbor(p(0, 0));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 1, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 1, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, VALID_PREVIEW);
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 1, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 5, 1, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, VALID_PREVIEW);
clientLogic.clickOwnMap(p(5, 1));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 1, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 5, 1, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(0, ships.size());
clientLogic.mapFinished();
mapMsg = (MapMessage) messages.poll();
assertEquals(2, mapMsg.getShips().size());
checkShip(mapMsg.getShips().get(0), 2, 2, 1, RIGHT, NORMAL);
checkShip(mapMsg.getShips().get(1), 1, 5, 1, RIGHT, NORMAL);
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(new StartBattleMessage(true));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(3, 3));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(3, 3), shootMsg.getPosition());
clientLogic.received(EffectMessage.miss(true, p(3, 3)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.miss(false, p(2, 2)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(1, 3));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(1, 3), shootMsg.getPosition());
clientLogic.clickOpponentMap(p(1, 3));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(1, 3), shootMsg.getPosition());
clientLogic.received(EffectMessage.miss(true, p(1, 3)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.hit(false, p(2, 1)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.shipDestroyed(false, p(3, 1), new Battleship(2, 2, 1, RIGHT)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.miss(false, p(5, 3)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(2, 3));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(2, 3), shootMsg.getPosition());
clientLogic.clickOpponentMap(p(2, 3));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(2, 3), shootMsg.getPosition());
clientLogic.received(EffectMessage.miss(true, p(2, 3)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.miss(false, p(3, 3)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(1, 4));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(1, 4), shootMsg.getPosition());
clientLogic.clickOpponentMap(p(1, 4));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(1, 4), shootMsg.getPosition());
clientLogic.received(EffectMessage.hit(true, p(1, 4)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.received(EffectMessage.hit(true, p(1, 4)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(1, 5));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(1, 5), shootMsg.getPosition());
clientLogic.received(EffectMessage.shipDestroyed(true, p(1, 5), new Battleship(2, 1, 5, DOWN)));
assertEquals("its.your.turn", infoTexts.poll());
ships = clientLogic.getOpponentMap().getShips().toList();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 1, 5, DOWN, NORMAL);
clientLogic.clickOpponentMap(p(2, 2));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(2, 2), shootMsg.getPosition());
clientLogic.received(EffectMessage.miss(true, p(2, 2)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.lost(p(5, 1), new Battleship(1, 5, 1, RIGHT), List.of(new Battleship(1, 1, 2, RIGHT))));
assertEquals("you.lost.the.game", infoTexts.poll());
ships = clientLogic.getOpponentMap().getShips().toList();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 1, 5, DOWN, NORMAL);
checkShip(ships.get(1), 1, 1, 2, RIGHT, NORMAL);
assertEquals(0, infoTexts.size());
assertEquals(0, messages.size());
}
}

View File

@@ -0,0 +1,389 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.game.client;
import org.junit.Test;
import pp.battleship.BattleshipConfig;
import pp.battleship.message.client.MapMessage;
import pp.battleship.message.client.ShootMessage;
import pp.battleship.message.server.EffectMessage;
import pp.battleship.message.server.GameDetails;
import pp.battleship.message.server.StartBattleMessage;
import pp.battleship.model.Battleship;
import java.util.List;
import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static pp.battleship.model.Battleship.Status.NORMAL;
import static pp.battleship.model.Battleship.Status.VALID_PREVIEW;
import static pp.battleship.model.Rotation.DOWN;
import static pp.battleship.model.Rotation.RIGHT;
/**
* Integration test cases for the client game logic of Player 2 in a small game, called "Game 1".
* The test cases for Player 1 are contained in {@linkplain ClientGame1Player1Test}
* and the test cases for the server in {@linkplain pp.battleship.game.server.ServerGame1Test}.
*
* @see ClientGame1Player1Test
* @see pp.battleship.game.server.ServerGame1Test
*/
public class ClientGame1Player2Test extends AbstractClientGameTest {
@Test
public void testClient() {
BattleshipConfig config;
Properties props;
List<Battleship> ships;
MapMessage mapMsg;
ShootMessage shootMsg;
config = new BattleshipConfig();
props = new Properties();
props.setProperty("map.width", "6");
props.setProperty("map.height", "6");
props.setProperty("harbor.width", "6");
props.setProperty("harbor.height", "6");
props.setProperty("ship.nums", "1,1");
config.readFrom(props);
clientLogic.received(new GameDetails(config));
assertEquals("place.ships.in.your.map", infoTexts.poll());
clientLogic.clickHarbor(p(1, 1));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 0, 1, RIGHT, VALID_PREVIEW);
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 0, 1, RIGHT, VALID_PREVIEW);
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(3, 3));
clientLogic.movePreview(p(3, 3));
clientLogic.movePreview(p(3, 3));
clientLogic.movePreview(p(3, 3));
clientLogic.movePreview(p(2, 3));
clientLogic.movePreview(p(2, 3));
clientLogic.movePreview(p(2, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 2, 2, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 0, 1, RIGHT, VALID_PREVIEW);
clientLogic.clickOwnMap(p(2, 2));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 2, 2, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, NORMAL);
clientLogic.clickHarbor(p(0, 0));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, VALID_PREVIEW);
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 1));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 5, 2, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 0, 0, RIGHT, VALID_PREVIEW);
clientLogic.clickOwnMap(p(5, 2));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 5, 2, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(0, ships.size());
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 5, 2, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(0, ships.size());
clientLogic.clickOwnMap(p(2, 2));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 5, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 2, 2, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, VALID_PREVIEW);
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.clickHarbor(p(1, 1));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 5, 2, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, NORMAL);
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 5, 2, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, NORMAL);
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 5, 2, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, NORMAL);
clientLogic.clickOwnMap(p(5, 2));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 5, 2, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 0, 1, RIGHT, VALID_PREVIEW);
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(5, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(4, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(3, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(2, 2));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 2));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 1, 2, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 0, 1, RIGHT, VALID_PREVIEW);
clientLogic.clickOwnMap(p(1, 2));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 1, 1, 2, RIGHT, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, NORMAL);
clientLogic.clickHarbor(p(0, 0));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 1, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 1, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 0, 0, RIGHT, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, VALID_PREVIEW);
clientLogic.movePreview(p(5, 0));
clientLogic.movePreview(p(5, 0));
clientLogic.movePreview(p(4, 0));
clientLogic.movePreview(p(4, 0));
clientLogic.movePreview(p(3, 0));
clientLogic.movePreview(p(3, 0));
clientLogic.rotateShip();
clientLogic.movePreview(p(1, 0));
clientLogic.movePreview(p(1, 1));
clientLogic.movePreview(p(1, 2));
clientLogic.movePreview(p(1, 3));
clientLogic.movePreview(p(1, 4));
clientLogic.movePreview(p(1, 4));
clientLogic.movePreview(p(1, 5));
clientLogic.movePreview(p(1, 5));
clientLogic.movePreview(p(1, 5));
clientLogic.movePreview(p(1, 5));
clientLogic.movePreview(p(1, 5));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 1, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 1, 5, DOWN, VALID_PREVIEW);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 0, 0, RIGHT, VALID_PREVIEW);
clientLogic.clickOwnMap(p(1, 5));
ships = clientLogic.getOwnMap().getRemainingShips();
assertEquals(2, ships.size());
checkShip(ships.get(0), 1, 1, 2, RIGHT, NORMAL);
checkShip(ships.get(1), 2, 1, 5, DOWN, NORMAL);
ships = clientLogic.getHarbor().getRemainingShips();
assertEquals(0, ships.size());
clientLogic.mapFinished();
mapMsg = (MapMessage) messages.poll();
assertEquals(2, mapMsg.getShips().size());
checkShip(mapMsg.getShips().get(0), 1, 1, 2, RIGHT, NORMAL);
checkShip(mapMsg.getShips().get(1), 2, 1, 5, DOWN, NORMAL);
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(new StartBattleMessage(false));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.miss(false, p(3, 3)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(2, 2));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(2, 2), shootMsg.getPosition());
clientLogic.clickOpponentMap(p(2, 2));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(2, 2), shootMsg.getPosition());
clientLogic.received(EffectMessage.miss(true, p(2, 2)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.miss(false, p(1, 3)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(2, 1));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(2, 1), shootMsg.getPosition());
clientLogic.received(EffectMessage.hit(true, p(2, 1)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(3, 1));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(3, 1), shootMsg.getPosition());
clientLogic.received(EffectMessage.shipDestroyed(true, p(3, 1), new Battleship(2, 2, 1, RIGHT)));
assertEquals("its.your.turn", infoTexts.poll());
ships = clientLogic.getOpponentMap().getShips().toList();
assertEquals(1, ships.size());
checkShip(ships.get(0), 2, 2, 1, RIGHT, NORMAL);
clientLogic.clickOpponentMap(p(5, 3));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(5, 3), shootMsg.getPosition());
clientLogic.received(EffectMessage.miss(true, p(5, 3)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.miss(false, p(2, 3)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(3, 3));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(3, 3), shootMsg.getPosition());
clientLogic.received(EffectMessage.miss(true, p(3, 3)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.hit(false, p(1, 4)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.hit(false, p(1, 4)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.shipDestroyed(false, p(1, 5), new Battleship(2, 1, 5, DOWN)));
assertEquals("wait.for.opponent", infoTexts.poll());
clientLogic.received(EffectMessage.miss(false, p(2, 2)));
assertEquals("its.your.turn", infoTexts.poll());
clientLogic.clickOpponentMap(p(5, 1));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(5, 1), shootMsg.getPosition());
clientLogic.clickOpponentMap(p(5, 1));
shootMsg = (ShootMessage) messages.poll();
assertEquals(p(5, 1), shootMsg.getPosition());
clientLogic.received(EffectMessage.won(p(5, 1), new Battleship(1, 5, 1, RIGHT)));
assertEquals("you.won.the.game", infoTexts.poll());
ships = clientLogic.getOpponentMap().getShips().toList();
assertEquals(2, ships.size());
checkShip(ships.get(0), 2, 2, 1, RIGHT, NORMAL);
checkShip(ships.get(1), 1, 5, 1, RIGHT, NORMAL);
assertEquals(0, infoTexts.size());
assertEquals(0, messages.size());
}
}

View File

@@ -0,0 +1,187 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.game.client;
import org.junit.Before;
import org.junit.Test;
import pp.battleship.message.client.ClientMessage;
import pp.battleship.message.server.EffectMessage;
import pp.battleship.message.server.GameDetails;
import pp.battleship.message.server.StartBattleMessage;
import pp.battleship.model.IntPoint;
import java.io.File;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ClientGameLogicTest {
private ClientGameLogic logic;
private ClientSender clientSender;
private ClientState initialState;
private ClientState editorState;
private ClientState gameOverState;
@Before
public void setUp() {
clientSender = mock(ClientSender.class);
initialState = mock(ClientState.class);
editorState = mock(ClientState.class);
gameOverState = mock(ClientState.class);
logic = new ClientGameLogic(clientSender);
logic.setState(initialState);
}
@Test
public void testSetState() {
logic.setState(editorState);
assertEquals(editorState, logic.getState());
}
@Test
public void testShowEditor() {
when(initialState.showEditor()).thenReturn(true);
when(editorState.showEditor()).thenReturn(false);
assertTrue(logic.showEditor());
logic.setState(editorState);
assertFalse(logic.showEditor());
}
@Test
public void testShowBattle() {
when(initialState.showBattle()).thenReturn(false);
when(gameOverState.showBattle()).thenReturn(true);
assertFalse(logic.showBattle());
logic.setState(gameOverState);
assertTrue(logic.showBattle());
}
@Test
public void testReceivedGameDetails() {
final GameDetails details = mock(GameDetails.class);
logic.received(details);
verify(initialState).receivedGameDetails(details);
}
@Test
public void testMovePreview() {
final IntPoint pos = new IntPoint(42, 42);
logic.movePreview(pos);
verify(initialState).movePreview(pos);
}
@Test
public void testClickOwnMap() {
final IntPoint pos = new IntPoint(42, 42);
logic.clickOwnMap(pos);
verify(initialState).clickOwnMap(pos);
}
@Test
public void testClickHarbor() {
final IntPoint pos = new IntPoint(42, 42);
logic.clickHarbor(pos);
verify(initialState).clickHarbor(pos);
}
@Test
public void testClickOpponentMap() {
final IntPoint pos = new IntPoint(42, 42);
logic.clickOpponentMap(pos);
verify(initialState).clickOpponentMap(pos);
}
@Test
public void testRotateShip() {
logic.rotateShip();
verify(initialState).rotateShip();
}
@Test
public void testMapFinished() {
logic.mapFinished();
verify(initialState).mapFinished();
}
@Test
public void testIsMapComplete() {
logic.setState(editorState);
when(editorState.isMapComplete()).thenReturn(true);
assertTrue(logic.isMapComplete());
when(editorState.isMapComplete()).thenReturn(false);
assertFalse(logic.isMapComplete());
}
@Test
public void testMovingShip() {
logic.setState(editorState);
when(editorState.movingShip()).thenReturn(true);
assertTrue(logic.movingShip());
when(editorState.movingShip()).thenReturn(false);
assertFalse(logic.movingShip());
}
@Test
public void testReceivedStartShooting() {
final StartBattleMessage msg = mock(StartBattleMessage.class);
logic.received(msg);
verify(initialState).receivedStartBattle(msg);
}
@Test
public void testReceivedEffectMessage() {
final EffectMessage msg = mock(EffectMessage.class);
logic.received(msg);
verify(initialState).receivedEffect(msg);
}
@Test
public void testLoadMap() throws IOException {
final File file = mock(File.class);
logic.loadMap(file);
verify(initialState).loadMap(file);
}
@Test
public void testMayLoadMap() {
logic.setState(editorState);
when(editorState.mayLoadMap()).thenReturn(true);
assertTrue(logic.mayLoadMap());
when(editorState.mayLoadMap()).thenReturn(false);
assertFalse(logic.mayLoadMap());
}
@Test
public void testMaySaveMap() {
logic.setState(editorState);
when(editorState.maySaveMap()).thenReturn(true);
assertTrue(logic.maySaveMap());
when(editorState.maySaveMap()).thenReturn(false);
assertFalse(logic.maySaveMap());
}
@Test(expected = IOException.class)
public void testSaveMap() throws IOException {
final File file = mock(File.class);
logic.setState(editorState);
when(editorState.maySaveMap()).thenReturn(false);
logic.saveMap(file);
}
@Test
public void testSend() {
final ClientMessage msg = mock(ClientMessage.class);
logic.send(msg);
verify(clientSender).send(msg);
}
}

View File

@@ -0,0 +1,55 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.game.server;
import pp.battleship.BattleshipConfig;
import pp.battleship.message.server.ServerMessage;
import pp.battleship.model.Battleship;
import pp.battleship.model.Battleship.Status;
import pp.battleship.model.IntPoint;
import pp.battleship.model.Rotation;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import static org.junit.Assert.assertEquals;
public abstract class AbstractServerGameTest {
static final BattleshipConfig CONFIG = new BattleshipConfig();
static {
// Configure logging
final Logger rootLogger = LogManager.getLogManager().getLogger("");
rootLogger.setLevel(Level.WARNING);
for (Handler h : rootLogger.getHandlers()) {
h.setLevel(Level.WARNING);
}
}
record ServerMessageWrapper(int id, ServerMessage msg) {}
final Deque<ServerMessageWrapper> messages = new ArrayDeque<>();
final ServerSender serverSender = (id, msg) -> messages.offer(new ServerMessageWrapper(id, msg));
final ServerGameLogic serverLogic = new ServerGameLogic(serverSender, CONFIG);
static IntPoint p(int x, int y) {
return new IntPoint(x, y);
}
void checkShip(Battleship ship, int length, int x, int y, Rotation rot, Status status) {
assertEquals(length, ship.getLength());
assertEquals(x, ship.getX());
assertEquals(y, ship.getY());
assertEquals(rot, ship.getRot());
assertEquals(status, ship.getStatus());
}
}

View File

@@ -0,0 +1,254 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.game.server;
import org.junit.Test;
import pp.battleship.message.client.MapMessage;
import pp.battleship.message.client.ShootMessage;
import pp.battleship.message.server.EffectMessage;
import pp.battleship.message.server.GameDetails;
import pp.battleship.message.server.StartBattleMessage;
import pp.battleship.model.Battleship;
import pp.battleship.model.Shot;
import java.util.List;
import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static pp.battleship.model.Battleship.Status.NORMAL;
import static pp.battleship.model.Rotation.DOWN;
import static pp.battleship.model.Rotation.RIGHT;
/**
* Integration test cases for the server game logic in a small game, called "Game 1", where Player 2 (with id 1) wins.
* The test cases for the players are contained in {@linkplain pp.battleship.game.client.ClientGame1Player1Test}
* and {@linkplain pp.battleship.game.client.ClientGame1Player2Test}.
*
* @see pp.battleship.game.client.ClientGame1Player1Test
* @see pp.battleship.game.client.ClientGame1Player2Test
*/
public class ServerGame1Test extends AbstractServerGameTest {
static {
final Properties props = new Properties();
props.setProperty("map.width", "6");
props.setProperty("map.height", "6");
props.setProperty("ship.nums", "1,1");
CONFIG.readFrom(props);
}
@Test
public void testRun() {
EffectMessage effectMsg;
GameDetails details;
StartBattleMessage startShooting;
serverLogic.addPlayer(0); // Player 1
serverLogic.addPlayer(1); // Player 2
assertEquals(0, messages.peek().id());
details = (GameDetails) messages.poll().msg();
assertEquals(6, details.getWidth());
assertEquals(6, details.getHeight());
assertEquals(2, details.getShipNums().size());
assertEquals(Integer.valueOf(1), details.getShipNums().get(1));
assertEquals(Integer.valueOf(1), details.getShipNums().get(2));
assertEquals(1, messages.peek().id());
details = (GameDetails) messages.poll().msg();
assertEquals(6, details.getWidth());
assertEquals(6, details.getHeight());
assertEquals(2, details.getShipNums().size());
assertEquals(Integer.valueOf(1), details.getShipNums().get(1));
assertEquals(Integer.valueOf(1), details.getShipNums().get(2));
serverLogic.received(new MapMessage(List.of(new Battleship(1, 1, 2, RIGHT), new Battleship(2, 1, 5, DOWN))), 1);
serverLogic.received(new MapMessage(List.of(new Battleship(2, 2, 1, RIGHT), new Battleship(1, 5, 1, RIGHT))), 0);
assertEquals(0, messages.peek().id());
startShooting = (StartBattleMessage) messages.poll().msg();
assertTrue(startShooting.isMyTurn());
assertEquals(1, messages.peek().id());
startShooting = (StartBattleMessage) messages.poll().msg();
assertFalse(startShooting.isMyTurn());
serverLogic.received(new ShootMessage(p(3, 3)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(3, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(3, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 2)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 2, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 2, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 2)), 1);
serverLogic.received(new ShootMessage(p(1, 3)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(1, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(1, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(1, 3)), 0);
serverLogic.received(new ShootMessage(p(2, 1)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 1, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 1, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(3, 1)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(3, 1, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 2, 1, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(3, 1, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 2, 1, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 3)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 3)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 3)), 0);
serverLogic.received(new ShootMessage(p(3, 3)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(3, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(3, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(1, 4)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(1, 4, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(1, 4, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(1, 4)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(1, 4, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(1, 4, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(1, 5)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(1, 5, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 1, 5, DOWN, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(1, 5, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 1, 5, DOWN, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 2)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 2, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 2, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 1)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 1, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 5, 1, RIGHT, NORMAL);
assertEquals(0, effectMsg.getRemainingOpponentShips().size());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 1, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 5, 1, RIGHT, NORMAL);
assertEquals(1, effectMsg.getRemainingOpponentShips().size());
checkShip(effectMsg.getRemainingOpponentShips().get(0), 1, 1, 2, RIGHT, NORMAL);
// Player 2 wins
assertEquals(0, messages.size());
}
}

View File

@@ -0,0 +1,574 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.game.server;
import org.junit.Test;
import pp.battleship.message.client.MapMessage;
import pp.battleship.message.client.ShootMessage;
import pp.battleship.message.server.EffectMessage;
import pp.battleship.message.server.GameDetails;
import pp.battleship.message.server.StartBattleMessage;
import pp.battleship.model.Battleship;
import pp.battleship.model.Shot;
import java.util.List;
import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static pp.battleship.model.Battleship.Status.NORMAL;
import static pp.battleship.model.Rotation.DOWN;
import static pp.battleship.model.Rotation.RIGHT;
/**
* Integration test cases for the server game logic in a larger game, called "Game 2", where Player 1 (with id 0) wins.
* The test cases for the players are contained in {@linkplain pp.battleship.game.client.ClientGame2Player1Test}
* and {@linkplain pp.battleship.game.client.ClientGame2Player2Test}.
*
* @see pp.battleship.game.client.ClientGame2Player1Test
* @see pp.battleship.game.client.ClientGame2Player2Test
*/
public class ServerGame2Test extends AbstractServerGameTest {
static {
final Properties props = new Properties();
props.setProperty("map.width", "10");
props.setProperty("map.height", "10");
props.setProperty("ship.nums", "4,3,2,1");
CONFIG.readFrom(props);
}
@Test
public void testRun() {
EffectMessage effectMsg;
GameDetails details;
StartBattleMessage startShooting;
serverLogic.addPlayer(0); // Player 1
serverLogic.addPlayer(1); // Player 2
assertEquals(0, messages.peek().id());
details = (GameDetails) messages.poll().msg();
assertEquals(10, details.getWidth());
assertEquals(10, details.getHeight());
assertEquals(4, details.getShipNums().size());
assertEquals(Integer.valueOf(4), details.getShipNums().get(1));
assertEquals(Integer.valueOf(3), details.getShipNums().get(2));
assertEquals(Integer.valueOf(2), details.getShipNums().get(3));
assertEquals(Integer.valueOf(1), details.getShipNums().get(4));
assertEquals(1, messages.peek().id());
details = (GameDetails) messages.poll().msg();
assertEquals(10, details.getWidth());
assertEquals(10, details.getHeight());
assertEquals(4, details.getShipNums().size());
assertEquals(Integer.valueOf(4), details.getShipNums().get(1));
assertEquals(Integer.valueOf(3), details.getShipNums().get(2));
assertEquals(Integer.valueOf(2), details.getShipNums().get(3));
assertEquals(Integer.valueOf(1), details.getShipNums().get(4));
serverLogic.received(new MapMessage(List.of(new Battleship(3, 2, 3, DOWN), new Battleship(2, 2, 6, DOWN), new Battleship(2, 4, 6, RIGHT), new Battleship(2, 4, 4, RIGHT), new Battleship(1, 7, 6, RIGHT), new Battleship(1, 7, 4, RIGHT), new Battleship(1, 4, 2, RIGHT), new Battleship(1, 6, 2, RIGHT), new Battleship(4, 2, 8, RIGHT), new Battleship(3, 7, 8, RIGHT))), 1);
serverLogic.received(new MapMessage(List.of(new Battleship(4, 0, 5, DOWN), new Battleship(3, 0, 9, DOWN), new Battleship(3, 0, 0, RIGHT), new Battleship(2, 4, 0, RIGHT), new Battleship(2, 2, 9, RIGHT), new Battleship(2, 5, 9, RIGHT), new Battleship(1, 8, 9, RIGHT), new Battleship(1, 7, 0, RIGHT), new Battleship(1, 9, 0, RIGHT), new Battleship(1, 9, 7, RIGHT))), 0);
assertEquals(0, messages.peek().id());
startShooting = (StartBattleMessage) messages.poll().msg();
assertTrue(startShooting.isMyTurn());
assertEquals(1, messages.peek().id());
startShooting = (StartBattleMessage) messages.poll().msg();
assertFalse(startShooting.isMyTurn());
serverLogic.received(new ShootMessage(p(5, 5)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 5, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 5, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 5)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 5, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 5, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 6)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 6, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 6, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(6, 6)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(6, 6, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(6, 6, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 6)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 6, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 6, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(4, 6)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(4, 6, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 4, 6, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(4, 6, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 4, 6, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(4, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(4, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(4, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(6, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(6, 8, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(6, 8, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(3, 7)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(3, 7, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(3, 7, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(3, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(3, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(3, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 8, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 4, 2, 8, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 8, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 4, 2, 8, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(0, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(0, 8, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(0, 8, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 9)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 9, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 9, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(6, 9)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(6, 9, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 5, 9, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(6, 9, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 5, 9, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(7, 7)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(7, 7, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(7, 7, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(0, 6)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(0, 6, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(0, 6, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 5)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 5, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 5, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(7, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(7, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(7, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(8, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(8, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(8, 8, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(9, 8)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(9, 8, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 3, 7, 8, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(9, 8, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 3, 7, 8, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 6)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 6, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 6, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 5)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 5, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 2, 6, DOWN, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 5, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 2, 6, DOWN, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(3, 3)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(3, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(3, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(8, 9)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(8, 9, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 8, 9, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(8, 9, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 8, 9, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 3)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 3, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 3)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 3, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 3, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 2)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 2, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 2, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(2, 1)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(2, 1, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 3, 2, 3, DOWN, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(2, 1, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 3, 2, 3, DOWN, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(4, 4)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(4, 4, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(4, 4, true), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(5, 4)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(5, 4, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 4, 4, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(5, 4, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 2, 4, 4, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(7, 4)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(7, 4, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 7, 4, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(7, 4, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 7, 4, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(9, 4)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(9, 4, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(9, 4, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(8, 4)), 1);
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(8, 4, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(8, 4, false), effectMsg.getShot());
assertNull(effectMsg.getDestroyedShip());
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(7, 6)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(7, 6, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 7, 6, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(7, 6, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 7, 6, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(4, 2)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(4, 2, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 4, 2, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(4, 2, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 4, 2, RIGHT, NORMAL);
assertNull(effectMsg.getRemainingOpponentShips());
serverLogic.received(new ShootMessage(p(6, 2)), 0);
assertEquals(0, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertTrue(effectMsg.isOwnShot());
assertEquals(new Shot(6, 2, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 6, 2, RIGHT, NORMAL);
assertEquals(0, effectMsg.getRemainingOpponentShips().size());
assertEquals(1, messages.peek().id());
effectMsg = (EffectMessage) messages.poll().msg();
assertFalse(effectMsg.isOwnShot());
assertEquals(new Shot(6, 2, true), effectMsg.getShot());
checkShip(effectMsg.getDestroyedShip(), 1, 6, 2, RIGHT, NORMAL);
assertEquals(8, effectMsg.getRemainingOpponentShips().size());
checkShip(effectMsg.getRemainingOpponentShips().get(0), 4, 0, 5, DOWN, NORMAL);
checkShip(effectMsg.getRemainingOpponentShips().get(1), 3, 0, 9, DOWN, NORMAL);
checkShip(effectMsg.getRemainingOpponentShips().get(2), 3, 0, 0, RIGHT, NORMAL);
checkShip(effectMsg.getRemainingOpponentShips().get(3), 2, 4, 0, RIGHT, NORMAL);
checkShip(effectMsg.getRemainingOpponentShips().get(4), 2, 2, 9, RIGHT, NORMAL);
checkShip(effectMsg.getRemainingOpponentShips().get(5), 1, 7, 0, RIGHT, NORMAL);
checkShip(effectMsg.getRemainingOpponentShips().get(6), 1, 9, 0, RIGHT, NORMAL);
checkShip(effectMsg.getRemainingOpponentShips().get(7), 1, 9, 7, RIGHT, NORMAL);
// Player 1 wins
assertEquals(0, messages.size());
}
}

View File

@@ -0,0 +1,122 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.game.server;
import org.junit.Before;
import org.junit.Test;
import pp.battleship.BattleshipConfig;
import pp.battleship.message.client.MapMessage;
import pp.battleship.message.client.ShootMessage;
import pp.battleship.message.server.EffectMessage;
import pp.battleship.message.server.GameDetails;
import pp.battleship.message.server.StartBattleMessage;
import pp.battleship.model.Battleship;
import pp.battleship.model.IntPoint;
import pp.battleship.model.Rotation;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
public class ServerGameLogicTest {
private ServerGameLogic serverGameLogic;
private ServerSender mockServerSender;
@Before
public void setUp() {
mockServerSender = mock(ServerSender.class);
serverGameLogic = new ServerGameLogic(mockServerSender, new BattleshipConfig());
}
@Test
public void testAddPlayer() {
serverGameLogic.addPlayer(1);
serverGameLogic.addPlayer(2);
verify(mockServerSender, times(2)).send(anyInt(), any(GameDetails.class));
assertEquals(ServerState.SET_UP, serverGameLogic.getState());
}
@Test
public void testGetPlayerById() {
final Player player1 = serverGameLogic.addPlayer(1);
final Player player2 = serverGameLogic.addPlayer(2);
assertEquals(player1, serverGameLogic.getPlayerById(1));
assertEquals(player2, serverGameLogic.getPlayerById(2));
}
@Test
public void testReceivedMapMessage() {
serverGameLogic.addPlayer(1);
serverGameLogic.addPlayer(2);
List<Battleship> ships = List.of(new Battleship(3, 2, 2, Rotation.RIGHT));
MapMessage mapMessage = new MapMessage(ships);
serverGameLogic.received(mapMessage, 1);
serverGameLogic.received(mapMessage, 2);
verify(mockServerSender, times(2)).send(anyInt(), any(StartBattleMessage.class));
assertEquals(ServerState.BATTLE, serverGameLogic.getState());
}
@Test
public void testReceivedShootMessage() {
serverGameLogic.addPlayer(1);
serverGameLogic.addPlayer(2);
List<Battleship> ships = List.of(new Battleship(3, 2, 2, Rotation.RIGHT));
MapMessage mapMessage = new MapMessage(ships);
serverGameLogic.received(mapMessage, 1);
serverGameLogic.received(mapMessage, 2);
ShootMessage shootMessage = new ShootMessage(p(2, 2));
serverGameLogic.received(shootMessage, 1);
verify(mockServerSender, times(2)).send(anyInt(), any(EffectMessage.class));
}
@Test
public void testPlayerReady() {
final Player player1 = serverGameLogic.addPlayer(1);
final Player player2 = serverGameLogic.addPlayer(2);
List<Battleship> ships = List.of(new Battleship(3, 2, 2, Rotation.RIGHT));
serverGameLogic.playerReady(player1, ships);
serverGameLogic.playerReady(player2, ships);
verify(mockServerSender, times(2)).send(anyInt(), any(StartBattleMessage.class));
assertEquals(ServerState.BATTLE, serverGameLogic.getState());
}
@Test
public void testShoot() {
final Player player1 = serverGameLogic.addPlayer(1);
final Player player2 = serverGameLogic.addPlayer(2);
List<Battleship> ships = List.of(new Battleship(3, 2, 2, Rotation.RIGHT));
serverGameLogic.playerReady(player1, ships);
serverGameLogic.playerReady(player2, ships);
serverGameLogic.shoot(player1, p(2, 2));
verify(mockServerSender, times(2)).send(anyInt(), any(EffectMessage.class));
}
@Test
public void testSetState() {
serverGameLogic.setState(ServerState.BATTLE);
assertEquals(ServerState.BATTLE, serverGameLogic.getState());
}
@Test
public void testGetOpponent() {
final Player player1 = serverGameLogic.addPlayer(1);
final Player player2 = serverGameLogic.addPlayer(2);
assertEquals(player2, serverGameLogic.getOpponent(player1));
}
static IntPoint p(int x, int y) {
return new IntPoint(x, y);
}
}

View File

@@ -0,0 +1,145 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.model;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class BattleshipTest {
private Battleship ship;
@Before
public void setUp() {
ship = new Battleship(3, 2, 2, Rotation.RIGHT);
}
@Test
public void testDefaultConstructor() {
Battleship defaultShip = new Battleship(1, 0, 0, Rotation.RIGHT);
assertEquals(1, defaultShip.getLength());
assertEquals(0, defaultShip.getX());
assertEquals(0, defaultShip.getY());
assertEquals(Rotation.RIGHT, defaultShip.getRot());
assertEquals(Battleship.Status.NORMAL, defaultShip.getStatus());
}
@Test
public void testConstructorWithParameters() {
assertEquals(3, ship.getLength());
assertEquals(2, ship.getX());
assertEquals(2, ship.getY());
assertEquals(Rotation.RIGHT, ship.getRot());
assertEquals(Battleship.Status.NORMAL, ship.getStatus());
}
@Test
public void testSetPosition() {
ship.moveTo(4, 5);
assertEquals(4, ship.getX());
assertEquals(5, ship.getY());
}
@Test
public void testSetPositionWithIntPosition() {
IntPoint pos = p(5, 6);
ship.moveTo(pos);
assertEquals(5, ship.getX());
assertEquals(6, ship.getY());
}
@Test
public void testGetStatus() {
assertEquals(Battleship.Status.NORMAL, ship.getStatus());
}
@Test
public void testWithStatus() {
ship.setStatus(Battleship.Status.VALID_PREVIEW);
assertEquals(Battleship.Status.VALID_PREVIEW, ship.getStatus());
}
@Test
public void testGetLength() {
assertEquals(3, ship.getLength());
}
@Test
public void testGetMinX() {
assertEquals(2, ship.getMinX());
}
@Test
public void testGetMaxX() {
assertEquals(4, ship.getMaxX());
}
@Test
public void testGetMaxY() {
assertEquals(2, ship.getMaxY());
}
@Test
public void testGetMinY() {
assertEquals(2, ship.getMinY());
}
@Test
public void testGetRotation() {
assertEquals(Rotation.RIGHT, ship.getRot());
}
@Test
public void testSetRotation() {
ship.setRotation(Rotation.DOWN);
assertEquals(Rotation.DOWN, ship.getRot());
}
@Test
public void testRotated() {
ship.rotated();
assertEquals(Rotation.DOWN, ship.getRot());
}
@Test
public void testHit() {
assertTrue(ship.hit(2, 2));
assertTrue(ship.hit(2, 2));
}
@Test
public void testContains() {
IntPoint pos = p(3, 2);
assertTrue(ship.contains(pos));
}
@Test
public void testIsDestroyed() {
ship.hit(2, 2);
ship.hit(3, 2);
ship.hit(4, 2);
assertTrue(ship.isDestroyed());
}
@Test
public void testCollidesWith() {
Battleship otherShip = new Battleship(3, 3, 2, Rotation.RIGHT);
assertTrue(ship.collidesWith(otherShip));
}
@Test
public void testToString() {
assertEquals("Ship{length=3, x=2, y=2, rot=RIGHT}", ship.toString());
}
static IntPoint p(int x, int y) {
return new IntPoint(x, y);
}
}

View File

@@ -0,0 +1,37 @@
package pp.battleship.model;
import org.junit.Test;
import pp.util.RandomPositionIterator;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.fail;
public class RandomPositionIteratorTest {
@Test
public void testEqualsOccurs() {
final var it = new RandomPositionIterator<>(IntPoint::new, 2, 2);
final Set<IntPoint> positions = new HashSet<>();
positions.add(new IntPoint(0, 0));
positions.add(new IntPoint(1, 1));
int n = 0;
while (it.hasNext() && ++n <= 3) {
if (!positions.add(it.next()))
return;
}
fail("not found");
}
@Test
public void testNoEquals() {
final var it = new RandomPositionIterator<>(IntPoint::new, 2, 2);
final Set<IntPoint> positions = new HashSet<>();
while (it.hasNext()) {
if (!positions.add(it.next()))
fail("not found");
}
}
}

View File

@@ -0,0 +1,116 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.battleship.model;
import org.junit.Before;
import org.junit.Test;
import pp.battleship.notification.GameEventBroker;
import pp.battleship.notification.ItemAddedEvent;
import pp.battleship.notification.ItemRemovedEvent;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static pp.battleship.model.BattleshipTest.p;
public class ShipMapTest {
private ShipMap map;
private GameEventBroker mockBroker;
private Battleship battleship;
@Before
public void setUp() {
mockBroker = mock(GameEventBroker.class);
map = new ShipMap(10, 10, mockBroker);
battleship = new Battleship(3, 2, 2, Rotation.RIGHT);
}
@Test
public void testConstructorWithValidSize() {
assertEquals(10, map.getWidth());
assertEquals(10, map.getHeight());
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithInvalidSize() {
new ShipMap(0, 10, null);
}
@Test
public void testAddItem() {
map.add(battleship);
List<Item> items = map.getItems();
assertTrue(items.contains(battleship));
verify(mockBroker).notifyListeners(any(ItemAddedEvent.class));
}
@Test
public void testRemoveItem() {
map.add(battleship);
map.remove(battleship);
final List<Item> items = map.getItems();
assertFalse(items.contains(battleship));
verify(mockBroker).notifyListeners(any(ItemAddedEvent.class));
verify(mockBroker).notifyListeners(any(ItemRemovedEvent.class));
}
@Test
public void testClear() {
map.add(battleship);
map.clear();
final List<Item> items = map.getItems();
assertTrue(items.isEmpty());
verify(mockBroker).notifyListeners(any(ItemAddedEvent.class));
verify(mockBroker).notifyListeners(any(ItemRemovedEvent.class));
}
@Test
public void testGetRemainingShips() {
map.add(battleship);
final List<Battleship> remainingShips = map.getRemainingShips();
assertTrue(remainingShips.contains(battleship));
}
@Test
public void testGetShots() {
final Shot shot = new Shot(1, 1, false);
map.add(shot);
final List<Shot> shots = map.getShots().toList();
assertTrue(shots.contains(shot));
}
@Test
public void testGetItems() {
map.add(battleship);
final List<Item> items = map.getItems();
assertTrue(items.contains(battleship));
}
@Test
public void testFindShipAt() {
map.add(battleship);
Battleship foundShip = map.findShipAt(2, 2);
assertEquals(battleship, foundShip);
}
@Test
public void testIsValidPosition() {
assertTrue(map.isValid(p(5, 5)));
}
@Test
public void testIsValidCoordinates() {
assertTrue(map.isValid(5, 5));
assertFalse(map.isValid(10, 10));
}
}