From a60c702306a41733c410d6a2a7d576f515582b1f Mon Sep 17 00:00:00 2001 From: lieght <49651652+BAFGdeJong@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:47:17 +0100 Subject: [PATCH] Tests and better instantiation --- app/src/main/java/org/toop/app/App.java | 11 --- .../gameControllers/ReversiBitController.java | 3 +- .../TicTacToeBitController.java | 3 +- .../org/toop/framework/game/BitboardGame.java | 12 ++- .../game/games/reversi/BitboardReversi.java | 9 +- .../games/tictactoe/BitboardTicTacToe.java | 10 ++- .../model/game/TurnBasedGame.java | 3 + .../gameFramework/model/player/Player.java | 4 +- .../framework/networking/server/Server.java | 25 ++++-- .../networking/server/ServerTest.java | 90 ++++++++++++++++++- 10 files changed, 136 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/org/toop/app/App.java b/app/src/main/java/org/toop/app/App.java index 2bce12a..aa2e704 100644 --- a/app/src/main/java/org/toop/app/App.java +++ b/app/src/main/java/org/toop/app/App.java @@ -141,17 +141,6 @@ public final class App extends Application { } stage.show(); - - var games = new ConcurrentHashMap>(); - games.put("tictactoe", BitboardReversi.class); - games.put("reversi", BitboardReversi.class); - var s = new MasterServer(6666, games); - try { - s.start(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } private void setKeybinds(StackPane root) { diff --git a/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java b/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java index 1ef96dc..9cd62f3 100644 --- a/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java +++ b/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java @@ -10,7 +10,8 @@ import org.toop.framework.game.players.OnlinePlayer; public class ReversiBitController extends GenericGameController { public ReversiBitController(Player[] players) { - BitboardReversi game = new BitboardReversi(players); + BitboardReversi game = new BitboardReversi(); + game.init(players); ThreadBehaviour thread = new LocalThreadBehaviour(game); for (Player player : players) { if (player instanceof OnlinePlayer){ diff --git a/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java b/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java index 1c431b1..18acdfc 100644 --- a/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java +++ b/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java @@ -10,7 +10,8 @@ import org.toop.framework.game.players.OnlinePlayer; public class TicTacToeBitController extends GenericGameController { public TicTacToeBitController(Player[] players) { - BitboardTicTacToe game = new BitboardTicTacToe(players); + BitboardTicTacToe game = new BitboardTicTacToe(); + game.init(players); ThreadBehaviour thread = new LocalThreadBehaviour(game); for (Player player : players) { if (player instanceof OnlinePlayer){ diff --git a/framework/src/main/java/org/toop/framework/game/BitboardGame.java b/framework/src/main/java/org/toop/framework/game/BitboardGame.java index 4cd92a4..f2781cd 100644 --- a/framework/src/main/java/org/toop/framework/game/BitboardGame.java +++ b/framework/src/main/java/org/toop/framework/game/BitboardGame.java @@ -13,13 +13,19 @@ public abstract class BitboardGame implements TurnBasedGame { private Player[] players; // long is 64 bits. Every game has a limit of 64 cells maximum. - private final long[] playerBitboard; + private long[] playerBitboard; private int currentTurn = 0; + private int playerCount; - public BitboardGame(int columnSize, int rowSize, int playerCount, Player[] players) { + public BitboardGame(int columnSize, int rowSize, int playerCount) { this.columnSize = columnSize; this.rowSize = rowSize; - this.players = players; + this.playerCount = playerCount; + } + + @Override + public void init(Player[] players) { + this.players = players; this.playerBitboard = new long[playerCount]; Arrays.fill(playerBitboard, 0L); diff --git a/framework/src/main/java/org/toop/framework/game/games/reversi/BitboardReversi.java b/framework/src/main/java/org/toop/framework/game/games/reversi/BitboardReversi.java index d3661ac..c36f236 100644 --- a/framework/src/main/java/org/toop/framework/game/games/reversi/BitboardReversi.java +++ b/framework/src/main/java/org/toop/framework/game/games/reversi/BitboardReversi.java @@ -13,8 +13,8 @@ public class BitboardReversi extends BitboardGame { private final long notAFile = 0xfefefefefefefefeL; private final long notHFile = 0x7f7f7f7f7f7f7f7fL; - public BitboardReversi(Player[] players) { - super(8, 8, 2, players); + public BitboardReversi() { + super(8, 8, 2); // Black (player 0) setPlayerBitboard(0, (1L << (3 + 4 * 8)) | (1L << (4 + 3 * 8))); @@ -23,6 +23,11 @@ public class BitboardReversi extends BitboardGame { setPlayerBitboard(1, (1L << (3 + 3 * 8)) | (1L << (4 + 4 * 8))); } + @Override + public void init(Player[] players) { + super.init(players); + } + public BitboardReversi(BitboardReversi other) { super(other); } diff --git a/framework/src/main/java/org/toop/framework/game/games/tictactoe/BitboardTicTacToe.java b/framework/src/main/java/org/toop/framework/game/games/tictactoe/BitboardTicTacToe.java index 378db7d..7115ccc 100644 --- a/framework/src/main/java/org/toop/framework/game/games/tictactoe/BitboardTicTacToe.java +++ b/framework/src/main/java/org/toop/framework/game/games/tictactoe/BitboardTicTacToe.java @@ -17,9 +17,15 @@ public class BitboardTicTacToe extends BitboardGame { 0b001010100L // anti-diagonal }; - public BitboardTicTacToe(Player[] players) { - super(3, 3, 2, players); + public BitboardTicTacToe() { + super(3, 3, 2); } + + @Override + public void init(Player[] players) { + super.init(players); + } + public BitboardTicTacToe(BitboardTicTacToe other) { super(other); } diff --git a/framework/src/main/java/org/toop/framework/gameFramework/model/game/TurnBasedGame.java b/framework/src/main/java/org/toop/framework/gameFramework/model/game/TurnBasedGame.java index dae192d..1e6642d 100644 --- a/framework/src/main/java/org/toop/framework/gameFramework/model/game/TurnBasedGame.java +++ b/framework/src/main/java/org/toop/framework/gameFramework/model/game/TurnBasedGame.java @@ -1,6 +1,9 @@ package org.toop.framework.gameFramework.model.game; +import org.toop.framework.gameFramework.model.player.Player; + public interface TurnBasedGame extends Playable, PlayerProvider, BoardProvider, DeepCopyable { + void init(Player[] players); int getCurrentTurn(); int getPlayerCount(); int getWinner(); diff --git a/framework/src/main/java/org/toop/framework/gameFramework/model/player/Player.java b/framework/src/main/java/org/toop/framework/gameFramework/model/player/Player.java index a3f1b32..35ea2b2 100644 --- a/framework/src/main/java/org/toop/framework/gameFramework/model/player/Player.java +++ b/framework/src/main/java/org/toop/framework/gameFramework/model/player/Player.java @@ -1,7 +1,5 @@ package org.toop.framework.gameFramework.model.player; import org.toop.framework.gameFramework.model.game.DeepCopyable; -import org.toop.framework.gameFramework.model.game.TurnBasedGame; -public interface Player extends NameProvider, MoveProvider, DeepCopyable { -} +public interface Player extends NameProvider, MoveProvider, DeepCopyable {} diff --git a/framework/src/main/java/org/toop/framework/networking/server/Server.java b/framework/src/main/java/org/toop/framework/networking/server/Server.java index d2cc414..deb3d99 100644 --- a/framework/src/main/java/org/toop/framework/networking/server/Server.java +++ b/framework/src/main/java/org/toop/framework/networking/server/Server.java @@ -1,7 +1,9 @@ package org.toop.framework.networking.server; import org.toop.framework.game.BitboardGame; +import org.toop.framework.game.players.LocalPlayer; import org.toop.framework.gameFramework.model.game.TurnBasedGame; +import org.toop.framework.gameFramework.model.player.Player; import java.util.ArrayList; import java.util.List; @@ -11,7 +13,7 @@ import java.util.concurrent.ConcurrentHashMap; public class Server implements GameServer { final private Map> gameTypes; - public List> games = new ArrayList<>(); + final private List> games = new ArrayList<>(); final private Map users = new ConcurrentHashMap<>(); public Server(Map> gameTypes) { @@ -30,20 +32,25 @@ public class Server implements GameServer { return gameTypes.keySet().toArray(new String[0]); } -// public List>> ongoingGames() { -// return List.of(); -// } + public List> ongoingGames() { + return games; + } public void startGame(String gameType, User... users) { if (!gameTypes.containsKey(gameType)) return; try { - var game = new Game(gameTypes.get(gameType).getDeclaredConstructor().newInstance(), users); - games.addLast(game); - } catch (Exception e) { - throw new RuntimeException(e); - } + Player[] players = new Player[users.length]; + for (int i = 0; i < users.length; i++) { + players[i] = new LocalPlayer(users[i].name()); + } + + var game = new Game(gameTypes.get(gameType).getDeclaredConstructor().newInstance(), users); + game.game().init(players); + games.addLast(game); + + } catch (Exception ignored) {} } public String[] onlineUsers() { diff --git a/framework/src/test/java/org/toop/framework/networking/server/ServerTest.java b/framework/src/test/java/org/toop/framework/networking/server/ServerTest.java index 0f473f4..c85674c 100644 --- a/framework/src/test/java/org/toop/framework/networking/server/ServerTest.java +++ b/framework/src/test/java/org/toop/framework/networking/server/ServerTest.java @@ -1,11 +1,97 @@ package org.toop.framework.networking.server; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.toop.framework.gameFramework.model.game.PlayResult; +import org.toop.framework.gameFramework.model.game.TurnBasedGame; +import org.toop.framework.gameFramework.model.player.Player; + +import java.util.Arrays; +import java.util.concurrent.ConcurrentHashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class ServerTest { + static class TurnBasedGameMock implements TurnBasedGame { + private Player[] players; + + public TurnBasedGameMock() {} + + @Override + public void init(Player[] players) { + this.players = players; + } + + @Override + public int getCurrentTurn() { + return 0; + } + + @Override + public int getPlayerCount() { + return 0; + } + + @Override + public int getWinner() { + return 0; + } + + @Override + public long[] getBoard() { + return new long[0]; + } + + @Override + public TurnBasedGame deepCopy() { + return null; + } + + @Override + public long getLegalMoves() { + return 0; + } + + @Override + public PlayResult play(long move) { + return null; + } + + @Override + public Player getPlayer(int index) { + return null; + } + + } + + private Server server; + @BeforeEach - public void setup() { - new Server(); + void setup() { + + var games = new ConcurrentHashMap>(); + games.put("tictactoe", TurnBasedGameMock.class); + games.put("reversi", TurnBasedGameMock.class); + + server = new Server(games); + } + + @Test + void testGameTypes() { + String[] expected = {"tictactoe", "reversi"}; + String[] actual = server.gameTypes(); + + Arrays.sort(expected); + Arrays.sort(actual); + + Assertions.assertArrayEquals(expected, actual); + } + + @Test + void testStartGame() { + server.startGame("tictactoe", new User(0, "A"), new User(1, "B")); + Assertions.assertEquals(1, server.ongoingGames().size()); } }