From ce9b1d66e1bc09b650cf2d16b6c575c10239bc3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sas=CC=8Ca=20Kocic=CC=81?= Date: Sat, 27 Jun 2020 11:55:18 +0200 Subject: [PATCH] Publish subscribe --- src/Event.java | 22 ++++++++++++++++++++++ src/Game.java | 14 +++++++++----- src/GameTest.java | 3 ++- src/Main.java | 5 +++-- src/Out.java | 34 +++++++++------------------------- src/OutTest.java | 16 ++++++---------- src/Pile.java | 8 +++++++- src/Players.java | 11 +++++------ src/PlayersTest.java | 37 +++++++++++++++++++++++++++---------- src/Subscriber.java | 5 +++++ src/Subscribers.java | 4 ++++ 11 files changed, 99 insertions(+), 60 deletions(-) create mode 100644 src/Event.java create mode 100644 src/Subscriber.java create mode 100644 src/Subscribers.java diff --git a/src/Event.java b/src/Event.java new file mode 100644 index 0000000..aebfc29 --- /dev/null +++ b/src/Event.java @@ -0,0 +1,22 @@ +import java.util.HashMap; + +public class Event { + static HashMap channels = new HashMap<>(); + + public static void publish(String channel, String message) { + if (!channels.containsKey(channel)) { + return; + } + Subscribers subscribers = channels.get(channel); + for (Subscriber subscriber : subscribers) { + subscriber.receive(message); + } + } + + public static void subscribe(String channel, Subscriber subscriber) { + if (!channels.containsKey(channel)) { + channels.put(channel, new Subscribers()); + } + channels.get(channel).add(subscriber); + } +} diff --git a/src/Game.java b/src/Game.java index 27e7e63..5063d70 100644 --- a/src/Game.java +++ b/src/Game.java @@ -1,18 +1,22 @@ public class Game { - final Players players = new Players(); + Players players; private Pile deck; /** * @param numberOfCards Total number of cards - * @param numberOfPlayers Total number of players + * @param playerNumber Total number of players */ - public Game(int numberOfCards, int numberOfPlayers) { + public Game(int numberOfCards, int playerNumber, Subscriber subscriber) { + players = new Players(); deck = Pile.createDeck(numberOfCards); - int cardsPerPlayer = deck.size() / numberOfPlayers; - for (int i = 0; i < numberOfPlayers; i++) { + int cardsPerPlayer = deck.size() / playerNumber; + for (int i = 0; i < playerNumber; i++) { Player player = new Player(String.valueOf(i), deck.take(cardsPerPlayer)); players.add(player); } + Event.subscribe("win", subscriber); + Event.subscribe("round", subscriber); + Event.subscribe("roundWin", subscriber); } diff --git a/src/GameTest.java b/src/GameTest.java index b65d8ca..b845823 100644 --- a/src/GameTest.java +++ b/src/GameTest.java @@ -5,12 +5,13 @@ import static org.junit.jupiter.api.Assertions.*; class GameTest { Game game; + Out subscriber = new Out(); @org.junit.jupiter.api.Test @BeforeEach void setUp() { - game = new Game(10, 2); + game = new Game(10, 2, subscriber); } @Test diff --git a/src/Main.java b/src/Main.java index 9a2a480..7b9549f 100644 --- a/src/Main.java +++ b/src/Main.java @@ -9,8 +9,9 @@ public class Main { * @param args the input arguments */ public static void main(String[] args) { - Game game = new Game(10, 2); + Subscriber subscriber = new Out(); + Game game = new Game(10, 2, subscriber); game.players.play(); - System.out.print(Out.get()); + System.out.println(subscriber.toString()); } } diff --git a/src/Out.java b/src/Out.java index f6a0a3b..5952b6e 100644 --- a/src/Out.java +++ b/src/Out.java @@ -3,48 +3,28 @@ import java.util.ArrayList; /** * The type Out. */ -public class Out { +public class Out implements Subscriber { /** * The Output. */ - static final ArrayList output = new ArrayList<>(); - - /** - * Instantiates a new Out. - */ - protected Out() { throw new IllegalStateException("Utility class"); } + final ArrayList output = new ArrayList<>(); /** * Gets output. * * @return the output */ - public static ArrayList getOutput() { + public ArrayList getOutput() { return output; } - /** - * Println. - * - * @param string the string - */ - public static void println(String string) { - output.add(string); - } - - /** - * Println. - */ - public static void println() { - println(""); - } - /** * Get string. * * @return the string */ - public static String get() { + @Override + public String toString() { StringBuilder string = new StringBuilder(); for (String s : output) { string.append(s); @@ -52,4 +32,8 @@ public class Out { } return string.toString(); } + + public void receive(String message) { + output.add(message); + } } diff --git a/src/OutTest.java b/src/OutTest.java index 87fab77..83cec87 100644 --- a/src/OutTest.java +++ b/src/OutTest.java @@ -3,18 +3,14 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class OutTest { + Out out = new Out(); @Test void printlnStoresString() { - Out.getOutput().clear(); - Out.println(); - assertEquals("\n", Out.get()); - Out.println("Hello"); - assertEquals("\nHello\n", Out.get()); - } - - @Test - void throwsException() { - assertThrows(IllegalStateException.class, Out::new); + out.getOutput().clear(); + out.receive(""); + assertEquals("\n", out.toString()); + out.receive("Hello"); + assertEquals("\nHello\n", out.toString()); } } \ No newline at end of file diff --git a/src/Pile.java b/src/Pile.java index 008f109..03c20d6 100644 --- a/src/Pile.java +++ b/src/Pile.java @@ -66,7 +66,13 @@ public class Pile extends ArrayList { * @return the long */ public long occurrences(int max) { - return IntStream.range(0, size()).filter(i -> get(i).number == max).count(); + long count = 0L; + for (int i = 0; i < size(); i++) { + if (get(i).number == max) { + count++; + } + } + return count; } /** diff --git a/src/Players.java b/src/Players.java index ea10b25..55c2fd7 100644 --- a/src/Players.java +++ b/src/Players.java @@ -18,15 +18,15 @@ public class Players extends ArrayList { String output = String.format("Player %s (%d cards)", player.name, player.cardsCount()); Card card = player.draw(); draws.add(card); - Out.println(String.format("%s: %d - %s", output, card.number, card.suit)); + Event.publish("round", String.format("%s: %d - %s", output, card.number, card.suit)); } pot.addAll(draws); givePotOnWin(); } if (size() == 0) { - Out.println("No winner in the game!"); + Event.publish("win", "No winner in the game!"); } else { - Out.println(String.format("Player %s wins the game!", get(0).name)); + Event.publish("win", String.format("Player %s wins the game!", get(0).name)); } } } @@ -44,12 +44,11 @@ public class Players extends ArrayList { Card max = draws.getMax(); if (draws.occurrences(max.number) == 1) { int maxIndex = draws.indexOf(max); - Out.println(String.format("Player %d wins this round", maxIndex)); + Event.publish("roundWin", String.format("Player %d wins this round", maxIndex)); this.get(maxIndex).discardPile.addAll(pot); pot.clear(); } else { - Out.println("No winner in this round"); + Event.publish("roundWin","No winner in this round"); } - Out.println(); } } diff --git a/src/PlayersTest.java b/src/PlayersTest.java index 7bca363..6e6e8fc 100644 --- a/src/PlayersTest.java +++ b/src/PlayersTest.java @@ -4,25 +4,33 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class PlayersTest { + Out subscriber = new Out(); + Players players = new Players(); @BeforeEach void setUp() { - Out.getOutput().clear(); + subscriber.getOutput().clear(); } @Test void playForZeroPlayers() { + Event.subscribe("win", subscriber); + Event.subscribe("round", subscriber); + Event.subscribe("roundWin", subscriber); players.play(); - assertEquals("", Out.get()); + assertEquals("", subscriber.toString()); } @Test void playForOnePlayerMakesHimAWinner() { Player player = new Player("0", Pile.createDeck(1)); players.add(player); + Event.subscribe("win", subscriber); + Event.subscribe("round", subscriber); + Event.subscribe("roundWin", subscriber); players.play(); - assertEquals("Player 0 wins the game!\n", Out.get()); + assertEquals("Player 0 wins the game!\n", subscriber.toString()); } @Test @@ -31,9 +39,12 @@ class PlayersTest { players.add(player); player = new Player("1", Pile.createDeck(1)); players.add(player); + Event.subscribe("win", subscriber); + Event.subscribe("round", subscriber); + Event.subscribe("roundWin", subscriber); players.play(); - assertTrue(Out.get().contains("No winner in this round")); - assertTrue(Out.get().contains("No winner in the game!")); + assertTrue(subscriber.toString().contains("No winner in this round")); + assertTrue(subscriber.toString().contains("No winner in the game!")); } @Test @@ -47,9 +58,12 @@ class PlayersTest { players.add(player); player = new Player("1", deck.take(2)); players.add(player); + Event.subscribe("win", subscriber); + Event.subscribe("round", subscriber); + Event.subscribe("roundWin", subscriber); players.play(); - assertTrue(Out.get().contains("Player 1 wins this round")); - assertTrue(Out.get().contains("Player 1 wins the game!")); + assertTrue(subscriber.toString().contains("Player 1 wins this round")); + assertTrue(subscriber.toString().contains("Player 1 wins the game!")); } @Test @@ -63,10 +77,13 @@ class PlayersTest { players.add(player); player = new Player("1", deck.take(2)); players.add(player); + Event.subscribe("win", subscriber); + Event.subscribe("round", subscriber); + Event.subscribe("roundWin", subscriber); players.play(); - assertTrue(Out.get().contains("No winner in this round")); - assertTrue(Out.get().contains("Player 1 wins this round")); - assertTrue(Out.get().contains("Player 1 wins the game!")); + assertTrue(subscriber.toString().contains("No winner in this round")); + assertTrue(subscriber.toString().contains("Player 1 wins this round")); + assertTrue(subscriber.toString().contains("Player 1 wins the game!")); assertEquals("1", players.get(0).name); assertEquals(4, players.get(0).cardsCount()); } diff --git a/src/Subscriber.java b/src/Subscriber.java new file mode 100644 index 0000000..23c9d67 --- /dev/null +++ b/src/Subscriber.java @@ -0,0 +1,5 @@ +public interface Subscriber { + void receive(String message); + + String toString(); +} diff --git a/src/Subscribers.java b/src/Subscribers.java new file mode 100644 index 0000000..2f23c7b --- /dev/null +++ b/src/Subscribers.java @@ -0,0 +1,4 @@ +import java.util.HashSet; + +public class Subscribers extends HashSet { +}