diff --git a/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java b/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java index 0d21e6e..bdc462e 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java +++ b/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java @@ -8,6 +8,14 @@ public class GameController { public GameController(Game model) { this.model = model; } + public GameController() { + } + public Game getModel() { + return model; + } + public void setModel(Game model) { + this.model = model; + } public boolean addPlayer(String username) { return model.addPlayer(new Player(username)); } diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java index d0d1112..4091090 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -60,7 +60,9 @@ public class Game { public int getNPlayers() { return nPlayers; } - public Game(int nPlayers) { + public Game(int nPlayers) throws IllegalArgumentException{ + if(nPlayers < 0||nPlayers > 5) + throw new IllegalArgumentException(); this.nPlayers = nPlayers; board=new Board(nPlayers); slotMap = new LinkedHashMap<>(); @@ -72,8 +74,16 @@ public class Game { playersList = new ArrayList<>(); OptionalCardQueue = new LinkedList<>(); } + public Game() + { + this(0); + } public boolean addPlayer(Player player) { + if(this.nPlayers==0) + { + return false; + } if(currentState.getGameStage()!= GameStages.WAITING) return false; if(playersList.contains(player)) @@ -415,7 +425,13 @@ public class Game { currentState.GameStageUpdate(GameStages.ENDED); } - + public boolean setNPlayer(int nPlayers) + { + if(this.nPlayers!=0) + return false; + this.nPlayers=nPlayers; + return true; + } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/Client/TCP/TCPClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java similarity index 95% rename from src/main/java/it/polimi/ingsw/gc14/Network/Client/TCP/TCPClient.java rename to src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java index 78aea6f..b4cc5ec 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/Client/TCP/TCPClient.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java @@ -1,4 +1,4 @@ -package it.polimi.ingsw.gc14.Network.Client.TCP; +package it.polimi.ingsw.gc14.Network.TCP.Client; import it.polimi.ingsw.gc14.View.IView; diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/EventType.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/EventType.java new file mode 100644 index 0000000..3b63fcb --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/EventType.java @@ -0,0 +1,12 @@ +package it.polimi.ingsw.gc14.Network.TCP; + +public enum EventType { + ADD_PLAYER, + SLOT_CHOICE, + DRAW_UPPER_TRIBE, + DRAW_LOWER_TRIBE, + DRAW_UPPER_BUILD, + DRAW_LOWER_BUILD, + PICK_OPTIONAL_TRIBE, + PICK_OPTIONAL_BUILD +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/NetworkEvent.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/NetworkEvent.java new file mode 100644 index 0000000..addbf74 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/NetworkEvent.java @@ -0,0 +1,10 @@ +package it.polimi.ingsw.gc14.Network.TCP; + +import it.polimi.ingsw.gc14.Controller.GameController; + +import java.io.Serializable; + +public abstract class NetworkEvent implements Serializable { + + public abstract boolean apply(GameController gameController); +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/NetworkEvents/AddPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/NetworkEvents/AddPlayer.java new file mode 100644 index 0000000..0067bcd --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/NetworkEvents/AddPlayer.java @@ -0,0 +1,26 @@ +package it.polimi.ingsw.gc14.Network.TCP.NetworkEvents; + +import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Network.TCP.EventType; +import it.polimi.ingsw.gc14.Network.TCP.NetworkEvent; +import it.polimi.ingsw.gc14.View.IView; + +import java.io.Serializable; + +public class AddPlayer extends NetworkEvent implements Serializable { + private String username; + private EventType eventType; + public AddPlayer(String username) { + this.username = username; + this.eventType = EventType.ADD_PLAYER; + } + @Override + public boolean apply(GameController gameController) + { + return gameController.addPlayer(username); + } + public String apply(IView gameController) + { + return gameController.toString(); + } +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/Server/TCP/ClientHandler.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java similarity index 96% rename from src/main/java/it/polimi/ingsw/gc14/Network/Server/TCP/ClientHandler.java rename to src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java index 9977552..a599d19 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/Server/TCP/ClientHandler.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java @@ -1,4 +1,4 @@ -package it.polimi.ingsw.gc14.Network.Server.TCP; +package it.polimi.ingsw.gc14.Network.TCP.Server; import it.polimi.ingsw.gc14.Controller.GameController; diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/Server/TCP/TCPServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java similarity index 97% rename from src/main/java/it/polimi/ingsw/gc14/Network/Server/TCP/TCPServer.java rename to src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java index a2e6e80..8a4fe3b 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/Server/TCP/TCPServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java @@ -1,4 +1,4 @@ -package it.polimi.ingsw.gc14.Network.Server.TCP; +package it.polimi.ingsw.gc14.Network.TCP.Server; import it.polimi.ingsw.gc14.Controller.GameController; diff --git a/src/test/java/it/polimi/ingsw/gc14/Controller/GameControllerTest.java b/src/test/java/it/polimi/ingsw/gc14/Controller/GameControllerTest.java new file mode 100644 index 0000000..19a845e --- /dev/null +++ b/src/test/java/it/polimi/ingsw/gc14/Controller/GameControllerTest.java @@ -0,0 +1,228 @@ +package it.polimi.ingsw.gc14.Controller; + +import it.polimi.ingsw.gc14.Model.Cards.TribeCard; +import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.GamePackage.GameStages; +import it.polimi.ingsw.gc14.Model.Player; +import org.junit.jupiter.api.Test; + +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +import static org.junit.jupiter.api.Assertions.*; + +class GameControllerTest { + + @Test + void addPlayer() { + Game game = new Game(3); + GameController controller = new GameController(game); + + assertTrue(controller.addPlayer("Giorgio")); + assertTrue(controller.addPlayer("Marco")); + assertTrue(controller.addPlayer("Luca")); + + assertNotNull(game.getPlayerByUsername("Giorgio")); + assertNotNull(game.getPlayerByUsername("Marco")); + assertNotNull(game.getPlayerByUsername("Luca")); + + assertEquals(GameStages.SLOT_CHOICE, game.getCurrentState().getGameStage()); + assertFalse(controller.addPlayer("Extra")); + } + + @Test + void allMethodsShouldReturnFalseForUnknownUsername() { + Game game = new Game(3); + GameController controller = new GameController(game); + + assertFalse(controller.slotChoice("ghost", 0)); + assertFalse(controller.drawUpperTribeCard("ghost", 0)); + assertFalse(controller.drawLowerTribeCard("ghost", 0)); + assertFalse(controller.drawUpperBuildingCard("ghost", 0)); + assertFalse(controller.drawLowerBuildingCard("ghost", 0)); + assertFalse(controller.pickOptionalTribeCard("ghost", 0)); + assertFalse(controller.pickOptionalBuildingCard("ghost", 0)); + } + + @Test + void slotChoice() { + Game game = new Game(3); + GameController controller = new GameController(game); + + assertTrue(controller.addPlayer("Giorgio")); + assertTrue(controller.addPlayer("Marco")); + assertTrue(controller.addPlayer("Luca")); + + String cur = game.getCurrentState().getCurrentPlayer().getUserName(); + String other = cur.equals("Giorgio") ? "Marco" : "Giorgio"; + assertFalse(controller.slotChoice(other, 0)); + + Queue order = new LinkedList<>(); + for (int i = 0; i < 3; i++) { + Player p = game.getCurrentState().getCurrentPlayer(); + order.add(p); + assertTrue(controller.slotChoice(p.getUserName(), i)); + } + + assertEquals(GameStages.RESOLVING_ACTIONS, game.getCurrentState().getGameStage()); + assertEquals(order.poll(), game.getCurrentState().getCurrentPlayer()); + } + + @Test + void drawLowerTribeCard() { + Game game = new Game(3); + GameController controller = new GameController(game); + + assertTrue(controller.addPlayer("Giorgio")); + assertTrue(controller.addPlayer("Marco")); + assertTrue(controller.addPlayer("Luca")); + + Queue order = new LinkedList<>(); + for (int i = 0; i < 3; i++) { + Player p = game.getCurrentState().getCurrentPlayer(); + order.add(p); + assertTrue(controller.slotChoice(p.getUserName(), i)); + } + + Player first = order.poll(); + assertEquals(first, game.getCurrentState().getCurrentPlayer()); + + List cards = game.getLowerListTribeCards(); + int idx = cards.indexOf( + cards.stream() + .filter(c -> !c.IsEventCard()) + .findFirst() + .orElseThrow() + ); + + Player wrongPlayer = order.peek(); + assertNotNull(wrongPlayer); + + int before = first.getTotCharacters(); + assertTrue(controller.drawLowerTribeCard(first.getUserName(), idx)); + assertEquals(before + 1, first.getTotCharacters()); + } + + @Test + void drawUpperTribeCard() { + Game game = new Game(3); + GameController controller = new GameController(game); + + assertTrue(controller.addPlayer("Giorgio")); + assertTrue(controller.addPlayer("Marco")); + assertTrue(controller.addPlayer("Luca")); + + for (int i = 0; i < 3; i++) { + Player p = game.getCurrentState().getCurrentPlayer(); + assertTrue(controller.slotChoice(p.getUserName(), i)); + } + + assertEquals(GameStages.RESOLVING_ACTIONS, game.getCurrentState().getGameStage()); + + while (game.getCurrentState().getNUpper() == 0) { + assertTrue(game.getCurrentState().getNLower() > 0); + + Player current = game.getCurrentState().getCurrentPlayer(); + List lower = game.getLowerListTribeCards(); + int lowerIdx = lower.indexOf( + lower.stream() + .filter(c -> !c.IsEventCard()) + .findFirst() + .orElseThrow() + ); + + assertTrue(controller.drawLowerTribeCard(current.getUserName(), lowerIdx)); + } + + Player current = game.getCurrentState().getCurrentPlayer(); + int beforeTot = current.getTotCharacters(); + + List upper = game.getUpperListTribeCards(); + int upperIdx = upper.indexOf( + upper.stream() + .filter(c -> !c.IsEventCard()) + .findFirst() + .orElseThrow() + ); + + assertTrue(controller.drawUpperTribeCard(current.getUserName(), upperIdx)); + assertEquals(beforeTot + 1, current.getTotCharacters()); + } + + @Test + void drawUpperBuildingCard() { + Game game = new Game(3); + GameController controller = new GameController(game); + + assertTrue(controller.addPlayer("Giacomo")); + assertTrue(controller.addPlayer("Marco")); + assertTrue(controller.addPlayer("Luca")); + + for (int i = 0; i < 3; i++) { + Player p = game.getCurrentState().getCurrentPlayer(); + assertTrue(controller.slotChoice(p.getUserName(), i)); + } + + assertEquals(GameStages.RESOLVING_ACTIONS, game.getCurrentState().getGameStage()); + + while (game.getCurrentState().getNUpper() == 0) { + assertTrue(game.getCurrentState().getNLower() > 0); + + Player current = game.getCurrentState().getCurrentPlayer(); + List lower = game.getLowerListTribeCards(); + int lowerIdx = lower.indexOf( + lower.stream() + .filter(c -> !c.IsEventCard()) + .findFirst() + .orElseThrow() + ); + + assertTrue(controller.drawLowerTribeCard(current.getUserName(), lowerIdx)); + } + + Player current = game.getCurrentState().getCurrentPlayer(); + + assertFalse(controller.drawUpperBuildingCard(current.getUserName(), 0)); + + current.addFood(100); + assertTrue(controller.drawUpperBuildingCard(current.getUserName(), 0)); + } + + @Test + void drawLowerBuildingCard() { + Game game = new Game(3); + GameController controller = new GameController(game); + + assertTrue(controller.addPlayer("Giacomo")); + assertTrue(controller.addPlayer("Marco")); + assertTrue(controller.addPlayer("Luca")); + + for (int i = 0; i < 3; i++) { + Player p = game.getCurrentState().getCurrentPlayer(); + assertTrue(controller.slotChoice(p.getUserName(), i)); + } + + String cur = game.getCurrentState().getCurrentPlayer().getUserName(); + assertFalse(controller.drawLowerBuildingCard(cur, 0)); + } + + @Test + void pickOptionalCards() { + Game game = new Game(3); + GameController controller = new GameController(game); + + assertTrue(controller.addPlayer("Giacomo")); + assertTrue(controller.addPlayer("Marco")); + assertTrue(controller.addPlayer("Luca")); + + for (int i = 0; i < 3; i++) { + Player p = game.getCurrentState().getCurrentPlayer(); + assertTrue(controller.slotChoice(p.getUserName(), i)); + } + + String cur = game.getCurrentState().getCurrentPlayer().getUserName(); + assertFalse(controller.pickOptionalTribeCard(cur, 0)); + assertFalse(controller.pickOptionalBuildingCard(cur, 0)); + } +} diff --git a/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java b/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java index 848f67b..9dcb81a 100644 --- a/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java +++ b/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java @@ -20,6 +20,14 @@ class GameTest { Game game=new Game(nPlayers); assertEquals(nPlayers,game.getNPlayers()); assertEquals(GameStages.WAITING,game.getCurrentState().getGameStage()); + + assertThrows(IllegalArgumentException.class,()->new Game(6)); + game=new Game(); + assertFalse(game.addPlayer(new Player("p1"))); + game.setNPlayer(nPlayers); + assertTrue(game.addPlayer(new Player("p1"))); + assertEquals(nPlayers,game.getNPlayers()); + assertEquals(GameStages.WAITING,game.getCurrentState().getGameStage()); } @Test