From 5358309e1af42e81e3ffc50e5627dfb89c04209a Mon Sep 17 00:00:00 2001 From: Mathis Ginkel Date: Sun, 26 Apr 2026 23:36:50 +0200 Subject: [PATCH] Test: Add test for ChatController --- .../client/chat/ChatClientInterface.java | 16 ++ .../casono/client/chat/ChatController.java | 35 ++++- .../casono/client/network/ChatClient.java | 3 +- .../casono/client/chat/ChatClientTest.java | 41 +++++ .../client/chat/ChatControllerTest.java | 145 +++++++++++++++++- 5 files changed, 229 insertions(+), 11 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientInterface.java create mode 100644 src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientTest.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientInterface.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientInterface.java new file mode 100644 index 0000000..0ec15de --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientInterface.java @@ -0,0 +1,16 @@ +package ch.unibas.dmi.dbis.cs108.casono.client.chat; + +import java.util.List; + +/** + * Interface used to create test instances of the ChatClient + */ +public interface ChatClientInterface { + + List getMessages(); + + void sendMessage(Message message); + + List getUsers(); + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatController.java index 09d7838..3a8c969 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatController.java @@ -33,9 +33,9 @@ public class ChatController { private volatile String username; - private final ClientService clientService; + private ClientService clientService; - private final ChatClient chatClient; + private final ChatClientInterface chatClient; public ChatBoxController getChatBoxController() { return chatBoxController; @@ -112,6 +112,37 @@ public class ChatController { REFRESH_TIME); } + /** + * Another constructor to give the ChatClient directly instead of the Client Service used only for test purposes + * @param username + */ + public ChatController(String username, ChatClientInterface chatClient) { + this.username = username; + this.chatClient = chatClient; + chatModelMap = new LinkedHashMap<>(); + localUserList = new ArrayList<>(); + this.chatBoxController = new ChatBoxController(username, this); + this.logger = LogManager.getLogger(ChatController.class); + this.serverEventListener = this::handleServerEvent; + this.activeChatControllers = new HashMap<>(); + + this.timer = new Timer(true); + timer.schedule( + new TimerTask() { + @Override + public void run() { + try { + receiveMessage(); + checkWhisperUsers(); + } catch (RuntimeException e) { + logger.warn("Chat refresh failed: {}", e.getMessage()); + } + } + }, + 0, + REFRESH_TIME); + } + private void registerAsActiveController(ClientService clientService) { synchronized (ACTIVE_CONTROLLERS) { ChatController oldController = ACTIVE_CONTROLLERS.get(clientService); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ChatClient.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ChatClient.java index 298e557..d46ce22 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ChatClient.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ChatClient.java @@ -1,5 +1,6 @@ package ch.unibas.dmi.dbis.cs108.casono.client.network; +import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatClientInterface; import ch.unibas.dmi.dbis.cs108.casono.client.chat.Message; import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.RequestParameter; import java.util.ArrayList; @@ -12,7 +13,7 @@ import org.apache.logging.log4j.Logger; * from the server. It uses the ClientService to send commands and receive responses from the * server. */ -public class ChatClient { +public class ChatClient implements ChatClientInterface { private final ClientService clientService; private final Logger logger; diff --git a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientTest.java b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientTest.java new file mode 100644 index 0000000..f55e904 --- /dev/null +++ b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientTest.java @@ -0,0 +1,41 @@ +package ch.unibas.dmi.dbis.cs108.casono.client.chat; + +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +public class ChatClientTest implements ChatClientInterface { + + private ChatClientTest otherChatClient; + + public final Queue messageQueue; + + public ChatClientTest() { + this.messageQueue = new LinkedList<>(); + } + + public ChatClientTest(ChatClientTest otherChatClient) { + this.otherChatClient = otherChatClient; + this.messageQueue = new LinkedList<>(); + } + + @Override + public void sendMessage(Message message) { + otherChatClient.messageQueue.add(message); + } + + @Override + public List getMessages() { + List messages = new LinkedList<>(); + while (!messageQueue.isEmpty()) { + Message message = messageQueue.poll(); + messages.add(message); + } + return messages; + } + + @Override + public List getUsers() { + return List.of(); + } +} diff --git a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatControllerTest.java b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatControllerTest.java index 18990b1..10ad882 100644 --- a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatControllerTest.java +++ b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatControllerTest.java @@ -2,20 +2,149 @@ package ch.unibas.dmi.dbis.cs108.casono.client.chat; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; public class ChatControllerTest { + ChatController chatController1; + ChatController chatController2; + + String name1 = "testperson1"; + String name2 = "testperson1"; + @BeforeEach - public void setup() {} + public void setup() { + ChatClientTest receivingChatClient = new ChatClientTest(); + ChatClientTest sendingChatClient = new ChatClientTest(receivingChatClient); + this.chatController1 = new ChatController(name1, sendingChatClient); + this.chatController2 = new ChatController(name2, receivingChatClient); + } @AfterEach public void teardown() {} - /* - * @Test - * public void testChatController() { - * Client client = new Client("user1"); - * client.startApplication(); - * } - */ + @Test + public void sendGlobalMessage() { + ChatModel global = new ChatModel(ChatType.GLOBAL, name2, -1, null); + chatController2.getChatModelMap().put(new ChatController.ChatKey(ChatType.GLOBAL), global); + + Message msg1 = new Message(ChatType.GLOBAL, -1, name1, null, "Hallo Welt"); + Message msg2 = new Message(ChatType.GLOBAL, -1, name1, null, "$$Hallo$$Welt$$"); + Message msg3 = new Message(ChatType.GLOBAL, -1, name1, null, "_*'=(&%$/§&%"); + Message msg4 = new Message(ChatType.LOBBY, -1, name1, null, "Guten Tag"); + Message msg5 = new Message(ChatType.LOBBY, -1, name1, null, "$/&)$)(&=)$="); + Message msg6 = new Message(ChatType.GLOBAL, -1, name1, null, "NAME=ANDERER_NUTZER"); + Message msg7 = new Message(ChatType.GLOBAL, -1, name1, null, "________"); + + ArrayList messages = new ArrayList<>(); + messages.add(msg1); + messages.add(msg2); + messages.add(msg3); + messages.add(msg4); + messages.add(msg5); + messages.add(msg6); + messages.add(msg7); + + chatController1.onSendToNetwork(msg1); + chatController1.onSendToNetwork(msg2); + chatController1.onSendToNetwork(msg3); + chatController1.onSendToNetwork(msg4); + chatController1.onSendToNetwork(msg5); + chatController1.onSendToNetwork(msg6); + chatController1.onSendToNetwork(msg7); + + chatController2.receiveMessage(); + + assertEquals(5, global.messages.size()); + + assertEquals(messages.get(0), global.messages.get(0)); + assertEquals(messages.get(1), global.messages.get(1)); + assertEquals(messages.get(2), global.messages.get(2)); + + assertNotEquals(messages.get(3), global.messages.get(3)); + assertNotEquals(messages.get(4), global.messages.get(4)); + + assertEquals(messages.get(5), global.messages.get(3)); + assertEquals(messages.get(6), global.messages.get(4)); + } + + @Test + public void sendLobbyMessage() { + ChatModel lobby = new ChatModel(ChatType.LOBBY, name2, 1, null); + chatController2.getChatModelMap().put(new ChatController.ChatKey(ChatType.LOBBY), lobby); + + Message msg1 = new Message(ChatType.LOBBY, 1, name1, null, "Hallo Welt"); + Message msg2 = new Message(ChatType.LOBBY, 1, name1, null, "$$Hallo$$Welt$$"); + Message msg3 = new Message(ChatType.LOBBY, 1, name1, null, "_*'=(&%$/§&%"); + Message msg4 = new Message(ChatType.LOBBY, 4, name1, null, "Guten Tag"); + Message msg5 = new Message(ChatType.LOBBY, 5, name1, null, "$/&)$)(&=)$="); + Message msg6 = new Message(ChatType.LOBBY, 1, name1, null, "NAME=ANDERER_NUTZER"); + Message msg7 = new Message(ChatType.LOBBY, 1, name1, null, "________"); + + ArrayList messages = new ArrayList<>(); + messages.add(msg1); + messages.add(msg2); + messages.add(msg3); + messages.add(msg4); + messages.add(msg5); + messages.add(msg6); + messages.add(msg7); + + for (Message msg : messages) { + chatController1.onSendToNetwork(msg); + } + + chatController2.receiveMessage(); + + assertEquals(5, lobby.messages.size()); + + assertEquals(messages.get(0), lobby.messages.get(0)); + assertEquals(messages.get(1), lobby.messages.get(1)); + assertEquals(messages.get(2), lobby.messages.get(2)); + + assertNotEquals(messages.get(3), lobby.messages.get(3)); + assertNotEquals(messages.get(4), lobby.messages.get(4)); + + assertEquals(messages.get(5), lobby.messages.get(3)); + assertEquals(messages.get(6), lobby.messages.get(4)); + } + + @Test + public void sendWhisperMessage() { + ChatModel whisper = new ChatModel(ChatType.WHISPER, name2, -1, name1); + chatController2.getChatModelMap().put(new ChatController.ChatKey(ChatType.WHISPER, name1), whisper); + + Message msg1 = new Message(ChatType.WHISPER, -1, name1, name2, "Hallo Welt"); + Message msg2 = new Message(ChatType.WHISPER, -1, name1, name2, "$$Hallo$$Welt$$"); + Message msg3 = new Message(ChatType.WHISPER, -1, name1, name2, "_*'=(&%$/§&%"); + Message msg4 = new Message(ChatType.WHISPER, -1, name1, name2, "NAME=ANDERER_NUTZER"); + Message msg5 = new Message(ChatType.WHISPER, -1, name1, name2, "________"); + + ArrayList messages = new ArrayList<>(); + messages.add(msg1); + messages.add(msg2); + messages.add(msg3); + messages.add(msg4); + messages.add(msg5); + + for (Message msg : messages) { + chatController1.onSendToNetwork(msg); + } + + chatController2.receiveMessage(); + + assertEquals(5, whisper.messages.size()); + + assertEquals(messages.get(0), whisper.messages.get(0)); + assertEquals(messages.get(1), whisper.messages.get(1)); + assertEquals(messages.get(2), whisper.messages.get(2)); + + assertEquals(messages.get(3), whisper.messages.get(3)); + assertEquals(messages.get(4), whisper.messages.get(4)); + } }