project test is done

main
Obai Albek 2025-09-14 04:49:11 +02:00
parent 3a1414187b
commit 02400869f7
13 changed files with 386 additions and 134 deletions

View File

@ -1,16 +1,17 @@
package app;
import fassade.ChatService;
import server.ChatServer;
import ui.Chat;
public class Main {
public static void main(String[] args) {
new Thread(() -> ChatServer.startServer()).start();
public static void main(String[] args) {
ChatService service = new ChatService();
// Zwei Fenster erstellen
Chat omarChat = new Chat("Omar", "Obai", service, 550, 100);
Chat obaiChat = new Chat("Obai", "Omar", service, 100, 100);
}
try { Thread.sleep(1000); } catch (InterruptedException e) {}
javax.swing.SwingUtilities.invokeLater(() -> {
new Chat("Obai", 100, 100);
new Chat("Omar", 550, 100);
});
}
}

View File

@ -3,6 +3,7 @@ package domain;
import java.util.List;
public class User {
private static int nextUserId = 1000;
private int userId;
private final String username;
@ -12,6 +13,7 @@ public class User {
private UserChatRoom chatRoom;
private UserGruppenRoom gruppenRoom;
public User(String username) {
this.userId = nextUserId++;
this.username = username;

View File

@ -5,12 +5,13 @@ import java.util.List;
import java.util.Objects;
public class UserChatRoom {
private List<ChatRoom> chatRooms; // Bessere Namensgebung: chatRooms statt chatsRooms
private List<ChatRoom> chatRooms;
public UserChatRoom() {
this.chatRooms = new ArrayList<>();
}
public boolean addChat(ChatRoom chatRoom) {
Objects.requireNonNull(chatRoom, "ChatRoom darf nicht null sein");

View File

@ -19,13 +19,14 @@ public class ChatService {
usersById = new HashMap<>();
}
public void createUser(String userName) {
public boolean createUser(String userName) {
if (users.containsKey(userName))
throw new IllegalArgumentException("User existiert bereits: " + userName);
User tempUser = new User(userName);
users.put(userName, tempUser);
usersById.put(tempUser.getUserId(), tempUser);
return true;
}
private User getUser(String userName) {

View File

@ -0,0 +1,69 @@
package server;
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
private static List<PrintWriter> clientWriters = new ArrayList<>();
public static void startServer() {
System.out.println("🚀 Starte LocalChat server...");
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("✅ server läuft auf Port 12345");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("🔗 Neuer Client verbunden");
new Thread(new ClientHandler(clientSocket)).start();
}
} catch (IOException e) {
System.out.println("❌ server Fehler: " + e.getMessage());
}
}
private static class ClientHandler implements Runnable {
private Socket socket;
private PrintWriter out;
private String username;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// Username vom Client empfangen
username = in.readLine();
System.out.println("👤 " + username + " ist beigetreten");
clientWriters.add(out);
broadcast("🌟 " + username + " hat den Chat betreten");
// Nachrichten empfangen und verteilen
String message;
while ((message = in.readLine()) != null) {
System.out.println("📩 " + username + ": " + message);
broadcast(username + ": " + message);
}
} catch (IOException e) {
System.out.println("❌ " + username + " hat den Chat verlassen");
} finally {
clientWriters.remove(out);
broadcast("👋 " + username + " hat den Chat verlassen");
try { socket.close(); } catch (IOException e) {}
}
}
}
private static void broadcast(String message) {
for (PrintWriter writer : clientWriters) {
writer.println(message);
}
}
}

View File

@ -3,54 +3,67 @@ package ui;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import fassade.ChatService;
import java.io.*;
import java.net.*;
public class Chat extends JFrame {
private ChatService service;
private PrintWriter out;
private String username;
private int roomId;
private JTextArea chatArea;
private JTextField messageField;
private JButton sendButton;
public Chat(String username, String otherUser, ChatService service, int x, int y) {
this.service = service;
public Chat(String username, int x, int y) {
this.username = username;
// User erstellen
service.createUser(username);
service.createUser(otherUser);
// Chatroom erstellen
this.roomId = service.createChatRoom(username, otherUser);
setupGUI();
connectToServer();
setLocation(x, y);
setVisible(true);
}
private void connectToServer() {
try {
Socket socket = new Socket("localhost", 12345);
out = new PrintWriter(socket.getOutputStream(), true);
// Username zum Server senden
out.println(username);
// Thread für eingehende Nachrichten
new Thread(() -> {
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String message;
while ((message = in.readLine()) != null) {
chatArea.append(message + "\n");
}
} catch (IOException e) {
chatArea.append("❌ Verbindung zum Server verloren\n");
}
}).start();
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "❌ Server nicht erreichbar!");
}
}
private void setupGUI() {
setTitle("Chat - " + username);
setTitle("💬 " + username);
setSize(400, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// Chat-Anzeige
chatArea = new JTextArea();
chatArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatArea);
add(scrollPane, BorderLayout.CENTER);
add(new JScrollPane(chatArea), BorderLayout.CENTER);
// Eingabe-Bereich
JPanel inputPanel = new JPanel(new BorderLayout());
messageField = new JTextField();
sendButton = new JButton("Senden");
JButton sendButton = new JButton("📤");
// Send-Button Action
sendButton.addActionListener(e -> sendMessage());
// Enter-Taste zum Senden
messageField.addActionListener(e -> sendMessage());
inputPanel.add(messageField, BorderLayout.CENTER);
@ -58,32 +71,13 @@ public class Chat extends JFrame {
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
add(inputPanel, BorderLayout.SOUTH);
// Initiale Nachricht
chatArea.append("Chat gestartet mit " + username + "\n");
}
private void sendMessage() {
String message = messageField.getText().trim();
if (!message.isEmpty()) {
try {
service.sendMessage(roomId, username, message);
messageField.setText("");
refreshChat();
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "Fehler: " + e.getMessage());
}
}
}
private void refreshChat() {
try {
chatArea.setText("");
for (String message : service.showMessage(roomId)) {
chatArea.append(message + "\n");
}
} catch (Exception e) {
chatArea.append("Fehler beim Laden: " + e.getMessage() + "\n");
if (!message.isEmpty() && out != null) {
out.println(message);
messageField.setText("");
}
}
}

View File

@ -15,10 +15,9 @@ public class ChatRoomTest {
User user2 = new User("User2");
ChatRoom room = new ChatRoom(user1, user2);
assertNotNull(room.getCreatedAt());
assertTrue(room.getRoomId() >= 1000);
assertEquals(user1, room.getUser1());
assertEquals(user2, room.getUser2());
assertTrue(room.getMessages().isEmpty());
}
@Test
@ -27,7 +26,7 @@ public class ChatRoomTest {
User user2 = new User("User2");
ChatRoom room = new ChatRoom(user1, user2);
Message message = new Message(user1, "Hallo!");
Message message = new Message(user1, "Hello");
room.addMessage(message);
assertEquals(1, room.getMessages().size());
@ -40,33 +39,12 @@ public class ChatRoomTest {
User user2 = new User("User2");
ChatRoom room = new ChatRoom(user1, user2);
room.addMessage(new Message(user1, "Nachricht 1"));
room.addMessage(new Message(user2, "Nachricht 2"));
room.addMessage(new Message(user1, "Hi"));
room.addMessage(new Message(user2, "Hello"));
List<String> messages = room.showMessages();
assertEquals(2, messages.size());
assertTrue(messages.get(0).contains("Nachricht 1"));
assertTrue(messages.get(1).contains("Nachricht 2"));
assertTrue(messages.get(0).contains("Hi"));
assertTrue(messages.get(1).contains("Hello"));
}
@Test
public void testAddParticipant() {
User user1 = new User("User1");
User user2 = new User("User2");
User user3 = new User("User3");
ChatRoom room = new ChatRoom(user1, user2);
}
@Test
public void testAddDuplicateParticipant() {
User user1 = new User("User1");
User user2 = new User("User2");
ChatRoom room = new ChatRoom(user1, user2);
}
}

View File

@ -0,0 +1,70 @@
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.Before;
import domain.*;
import fassade.ChatService;
import java.util.List;
public class ChatServiceTest {
private ChatService service;
@Before
public void setUp() {
service = new ChatService();
}
@Test
public void testCreateUser() {
assertTrue(service.createUser("TestUser"));
}
@Test(expected = IllegalArgumentException.class)
public void testCreateDuplicateUser() {
service.createUser("TestUser");
service.createUser("TestUser"); // Should throw exception
}
@Test
public void testCreateChatRoom() {
service.createUser("User1");
service.createUser("User2");
int roomId = service.createChatRoom("User1", "User2");
assertTrue(roomId > 0);
}
@Test(expected = IllegalArgumentException.class)
public void testCreateChatRoomNonExistentUsers() {
service.createChatRoom("NonExistent1", "NonExistent2");
}
@Test
public void testSendAndReceiveMessages() {
service.createUser("User1");
service.createUser("User2");
int roomId = service.createChatRoom("User1", "User2");
service.sendMessage(roomId, "User1", "Hello");
service.sendMessage(roomId, "User2", "Hi there");
List<String> messages = service.showMessage(roomId);
assertEquals(2, messages.size());
assertTrue(messages.get(0).contains("Hello"));
assertTrue(messages.get(1).contains("Hi there"));
}
@Test
public void testAddContact() {
service.createUser("User1");
service.createUser("User2");
assertTrue(service.addContact("User2", "User1"));
List<String> contacts = service.getUserContacts("User1");
assertEquals(1, contacts.size());
assertTrue(contacts.get(0).contains("User2"));
}
}

View File

@ -0,0 +1,39 @@
package test;
import org.junit.Test;
import org.junit.Before;
import fassade.ChatService;
public class ExceptionTest {
private ChatService service;
@Before
public void setUp() {
service = new ChatService();
}
@Test(expected = IllegalArgumentException.class)
public void testSendMessageToNonExistentRoom() {
service.sendMessage(9999, "User1", "Test");
}
@Test(expected = IllegalArgumentException.class)
public void testSendMessageNonExistentUser() {
service.createUser("User1");
service.createUser("User2");
int roomId = service.createChatRoom("User1", "User2");
service.sendMessage(roomId, "NonExistent", "Test");
}
@Test(expected = IllegalArgumentException.class)
public void testAddNonExistentContact() {
service.createUser("User1");
service.addContact("NonExistent", "User1");
}
@Test(expected = IllegalArgumentException.class)
public void testGetUserContactsNonExistentUser() {
service.getUserContacts("NonExistent");
}
}

View File

@ -0,0 +1,48 @@
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import domain.*;
public class GruppenRoomTest {
@Test
public void testGruppenRoomCreation() {
User creator = new User("Creator");
GruppenRoom group = new GruppenRoom(creator, "TestGroup", "Description");
assertEquals("TestGroup", group.getName());
assertEquals("Description", group.getDescription());
assertEquals(creator, group.getCreator());
assertTrue(group.getParticipants().contains(creator));
}
@Test
public void testAddParticipant() {
User creator = new User("Creator");
User newUser = new User("NewUser");
GruppenRoom group = new GruppenRoom(creator, "TestGroup", "Description");
assertTrue(group.addParticipant(newUser));
assertTrue(group.getParticipants().contains(newUser));
}
@Test(expected = IllegalArgumentException.class)
public void testAddDuplicateParticipant() {
User creator = new User("Creator");
GruppenRoom group = new GruppenRoom(creator, "TestGroup", "Description");
group.addParticipant(creator); // Should throw exception
}
@Test
public void testAddAdmin() {
User creator = new User("Creator");
User admin = new User("Admin");
GruppenRoom group = new GruppenRoom(creator, "TestGroup", "Description");
group.addParticipant(admin);
assertTrue(group.addAdmin(creator, admin));
assertTrue(group.getAdmins().contains(admin));
}
}

View File

@ -0,0 +1,66 @@
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import fassade.ChatService;
import domain.*;
import java.util.List;
public class IntegrationTest {
@Test
public void testCompleteChatWorkflow() {
ChatService service = new ChatService();
// Create users
service.createUser("Alice");
service.createUser("Bob");
// Create chat room
int roomId = service.createChatRoom("Alice", "Bob");
// Exchange messages
service.sendMessage(roomId, "Alice", "Hi Bob!");
service.sendMessage(roomId, "Bob", "Hello Alice!");
service.sendMessage(roomId, "Alice", "How are you?");
// Verify messages
List<String> messages = service.showMessage(roomId);
assertEquals(3, messages.size());
assertTrue(messages.get(0).contains("Hi Bob"));
assertTrue(messages.get(1).contains("Hello Alice"));
assertTrue(messages.get(2).contains("How are you"));
// Test contacts
service.addContact("Bob", "Alice");
List<String> contacts = service.getUserContacts("Alice");
assertEquals(1, contacts.size());
assertTrue(contacts.get(0).contains("Bob"));
}
@Test
public void testGroupChatWorkflow() {
ChatService service = new ChatService();
service.createUser("Admin");
service.createUser("User1");
service.createUser("User2");
// Create group
int groupId = service.createGruppenRoom("Admin", "DevTeam", "Development Team");
// Add participants
service.addParticipantToGroup(groupId, "Admin", "User1");
service.addParticipantToGroup(groupId, "Admin", "User2");
// Send group messages
service.sendGroupMessage(groupId, "Admin", "Welcome everyone!");
service.sendGroupMessage(groupId, "User1", "Thanks for adding me!");
// Verify group messages
List<String> messages = service.getGroupMessages(groupId);
assertEquals(2, messages.size());
assertTrue(messages.get(0).contains("Welcome"));
assertTrue(messages.get(1).contains("Thanks"));
}
}

View File

@ -2,22 +2,30 @@ package test;
import static org.junit.Assert.*;
import org.junit.Test;
import java.time.LocalDateTime;
import domain.*;
import domain.*;
public class MessageTest {
@Test
public void testMessageCreation() {
User sender = new User("Sender");
Message message = new Message(sender, "Testnachricht");
Message message = new Message(sender, "Test message");
assertEquals(sender, message.getSender());
assertEquals("Testnachricht", message.getContent());
assertEquals("Test message", message.getContent());
assertNotNull(message.getTimestamp());
assertTrue(message.getTimestamp().isBefore(LocalDateTime.now().plusSeconds(1)));
assertTrue(message.getTimestamp().isAfter(LocalDateTime.now().minusSeconds(1)));
}
@Test
public void testMessageToString() {
User sender = new User("TestUser");
Message message = new Message(sender, "Hello World");
String result = message.toString();
assertTrue(result.contains("TestUser"));
assertTrue(result.contains("Hello World"));
assertTrue(result.contains(":"));
}
@Test
@ -27,25 +35,9 @@ public class MessageTest {
Message message = new Message(sender1, "Original");
message.setSender(sender2);
message.setContent("Geändert");
message.setContent("Changed");
assertEquals(sender2, message.getSender());
assertEquals("Geändert", message.getContent());
}
@Test
public void testMessageToString() {
User sender = new User("TestSender");
Message message = new Message(sender, "Testinhalt");
String toString = message.toString();
assertTrue(toString.contains("TestSender"));
assertTrue(toString.contains("Testinhalt"));
assertTrue(toString.contains("timestamp"));
}
@Test(expected = IllegalArgumentException.class)
public void testMessageWithNullSender() {
new Message(null, "Test");
assertEquals("Changed", message.getContent());
}
}

View File

@ -1,17 +1,10 @@
package test;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.Assert.*;
import org.junit.Test;
import domain.*;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class UserTest {
@Test
@ -20,11 +13,10 @@ public class UserTest {
assertEquals("TestUser", user.getUsername());
assertTrue(user.isOnline());
assertEquals(UserInfo.VERFÜGBAR, user.getUserInfo());
assertTrue(user.getUserId() >= 1000);
}
@Test
public void testUserStatusChange() {
public void testUserStatusChanges() {
User user = new User("TestUser");
user.setOnline(false);
assertFalse(user.isOnline());
@ -34,21 +26,20 @@ public class UserTest {
}
@Test
public void testUserIdUniqueness() {
public void testUserContacts() {
User user1 = new User("User1");
User user2 = new User("User2");
User user3 = new User("User3");
assertNotEquals(user1.getUserId(), user2.getUserId());
assertNotEquals(user2.getUserId(), user3.getUserId());
assertNotEquals(user1.getUserId(), user3.getUserId());
assertTrue(user1.getUserContacts().addContact(user2));
assertEquals(1, user1.getUserContacts().showAllContacts().size());
}
@Test
public void testUserToString() {
User user = new User("TestUser");
String toString = user.toString();
assertTrue(toString.contains("TestUser"));
assertTrue(toString.contains("VERFÜGBAR"));
public void testUserEquals() {
User user1 = new User("SameUser");
User user2 = new User("SameUser");
assertNotEquals(user1, user2); // Different objects
assertEquals(user1, user1); // Same object
}
}