Nouvel exercice OOP sur l'observer pattern
Il faudrait passer tous les comments en anglais. Dans l'entête, il faut expliquer aux étudiants ce qu'ils doivent implémenter dans la classe. Il ne faut pas de System.out.println dans les actions subscribe, etc de ton code. Pas de side effect silencieux. Pas de "instance of", c'est un mauvais design si tu as besoin de ça.
Tout a été traduit en anglais, j'ai ajouté une nouvelle classe message pour gérer les messages sans print et un log par user sous forme de ArrayList.
Il n'y a plus de instance of
Ce qu'il faut implémenter a été davantage détaillé
C'est toujours pas OK Edouard, l'API n'est pas bonne.
Il y a une mauvaise utilisation des classes internes (statiques alors qu'elles ne devraient pas par exemple).
Le ChatMessage doit juste contenir le message. Le reste se fait avec les appels à des méthodes. On fait de l'OO objet ici, pas une API rest. Tout doit être statiquement typé et compile safe.
ChatApp.ChatRoom room = new ChatApp.ChatRoom("general");
ChatApp.ChatUser alice = new ChatApp.ChatUser("Alice");
ChatApp.ChatUser bob = new ChatApp.ChatUser("Bob");
ChatApp.ChatUser john = new ChatApp.ChatUser("John");
// Subscriptions
room.subscribe(alice);
room.subscribe(bob);
// Alice sends message
ChatApp.ChatMessage msg = new ChatApp.ChatMessage("post", "general", "Alice", "Salut tout le monde !");
alice.sendMessage(room, msg);
List<ChatApp.ChatMessage> aliceLog = alice.getLog();
List<ChatApp.ChatMessage> bobLog = bob.getLog();
List<ChatApp.ChatMessage> johnLog = john.getLog();
// Subscription logs: check type and user fields
assertTrue(aliceLog.stream().anyMatch(m -> m.getType().equals("join") && m.getUser().equals("Alice")));
assertTrue(bobLog.stream().anyMatch(m -> m.getType().equals("join") && m.getUser().equals("Bob")));
// Alice's post should be logged
assertTrue(aliceLog.stream().anyMatch(m ->
m.getType().equals("post") && m.getUser().equals("Alice") &&
m.getChannel().equals("general") &&
m.getContent().contains("Salut tout le monde !")));
// Bob should have received the message
assertTrue(bobLog.stream().anyMatch(m ->
m.getType().equals("receive") && m.getUser().equals("Alice") &&
m.getChannel().equals("general") &&
m.getContent().contains("Salut tout le monde !")));
// John should have empty log
assertTrue(johnLog.isEmpty());