diff --git a/src/main/java/Application/App.java b/src/main/java/Application/App.java new file mode 100644 index 0000000..751218f --- /dev/null +++ b/src/main/java/Application/App.java @@ -0,0 +1,144 @@ +package Application; + +import Game.Game; +import Game.Tictactoe; + +import java.util.ArrayList; +import java.util.Scanner; + +public class App { + + private boolean isRunning = false; + private Cli cli; + + private boolean inMenu = true; + private MenuManager menuManager; + + private Game currentGame; + + public App(Cli cli) { + this.cli = cli; + init(); + } + + private void init() { + menuManager = initMenuManager(); + + goToMenu(); + } + + public void start() { + isRunning = true; + while (isRunning) { + String input = cli.getScanner().nextLine(); + if (input.equals("exit")) { + stop(); + return; + } else { + if (inMenu) { + cli.clearConsole(); + selectMenuItem(input); + } else { + if (input.equals("q")) { + goToMenu(); + continue; + } + cli.clearConsole(); + currentGame.update(input); + currentGame.print(cli); + } + } + } + } + + public void stop() { + isRunning = false; + cli.getPrintStream().println("Stopping application..."); + } + + public boolean isRunning() { + return isRunning; + } + + public Game getCurrentGame() { + return this.currentGame; + } + + private MenuManager initMenuManager() { + MenuManager mm = new MenuManager(); + ArrayList gameList = new ArrayList<>(); + + gameList.add(new Menu("Tic Tac Toe")); + + Menu gameMenu = new Menu("Games"); + + gameMenu.addMenu(new Menu("Back")); + for (Menu game : gameList) { + game.addMenu(new Menu("Back")); + gameMenu.addMenu(game); + } + mm.addMenu(gameMenu); + + return mm; + } + + protected void selectMenuItem(String input) { + Scanner scanner = new Scanner(input); + + if (input.equals("q") && !menuManager.inRootMenu()) { + goToMenu(); + } + + if (scanner.hasNextInt()) { + int index = scanner.nextInt() - 1; + menuManager.select(index); + if (menuManager.getCurrentMenu() != null) { + switch (menuManager.getCurrentMenu().getName()) { + case "Back": + try { + menuManager.back(); + menuManager.back(); + } catch (Exception e) { + e.printStackTrace(); + } + break; + case "Tic Tac Toe": + setCurrentGame(new Tictactoe()); + return; + default: + break; + } + } + } + printMenu(); + } + + private void setCurrentGame(Game game) { + inMenu = false; + currentGame = game; + cli.clearConsole(); + currentGame.print(cli); + } + + private void goToMenu() { + inMenu = true; + currentGame = null; + while (!menuManager.inRootMenu()) { + try { + menuManager.back(); + } catch (Exception e) { + e.printStackTrace(); + } + } + printMenu(); + } + + private void printMenu() { + cli.clearConsole(); + cli.getPrintStream().println("Welcome to the Cli Arcade Service!"); + cli.getPrintStream().println("Type 'exit' at any time to stop the application"); + cli.getPrintStream().println("Select a item by typing the number next to it"); + + cli.getPrintStream().print(menuManager.getFormattedMenuList()); + } +} diff --git a/src/main/java/Application/Cli.java b/src/main/java/Application/Cli.java index 2b93962..0defedf 100644 --- a/src/main/java/Application/Cli.java +++ b/src/main/java/Application/Cli.java @@ -6,6 +6,8 @@ import java.util.Scanner; public class Cli { + private boolean isClearConsoleActive = true; + private PrintStream printStream; private InputStream inputStream; private Scanner scanner; @@ -14,6 +16,7 @@ public class Cli { this.printStream = printStream; this.inputStream = inputStream; this.scanner = new Scanner(inputStream); + isClearConsoleActive = true; } public PrintStream getPrintStream() { @@ -25,6 +28,8 @@ public class Cli { } public void clearConsole(){ + if(!isClearConsoleActive) + return; try{ String operatingSystem = System.getProperty("os.name");//Check the current operating system @@ -42,4 +47,9 @@ public class Cli { this.getPrintStream().println(e); } } + + public void setClearConsoleActive(boolean clearConsoleActive) { + isClearConsoleActive = clearConsoleActive; + } + } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index d286686..7c937c5 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,3 +1,4 @@ +import Application.App; import Application.Cli; import Game.Tictactoe; @@ -6,13 +7,8 @@ import java.util.Scanner; public class Main { public static void main(String[] args) { - Tictactoe ttt = new Tictactoe(); Cli cli = new Cli(System.out, System.in); - Scanner scan = cli.getScanner(); - ttt.print(cli); - while (scan.hasNext()) { - ttt.update(scan.next()); - ttt.print(cli); - } + App app = new App(cli); + app.start(); } } diff --git a/src/test/java/Application/AppTest.java b/src/test/java/Application/AppTest.java new file mode 100644 index 0000000..8593c9d --- /dev/null +++ b/src/test/java/Application/AppTest.java @@ -0,0 +1,53 @@ +package Application; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.*; + +class AppTest { + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final ByteArrayInputStream inContent = new ByteArrayInputStream("1\n2\nexit\n".getBytes()); + + App app; + Cli cli; + + @BeforeEach + void setUp() { + cli = new Cli(new PrintStream(outContent), inContent); + cli.setClearConsoleActive(false); + app = new App(cli); + } + + @AfterEach + void tearDown() { + } + + //inContent has the 'q' at the end, to terminated the loop and set isRunning to false + @Test + void stop() { + ByteArrayInputStream input = new ByteArrayInputStream("1\n2\nexit\n".getBytes()); + cli = new Cli(new PrintStream(outContent), input); + cli.setClearConsoleActive(false); + app = new App(cli); + app.start(); + assertFalse(app.isRunning()); + } + + @Test + void selectMenuItem() { + assertNull(app.getCurrentGame()); + app.selectMenuItem("1"); + assertNull(app.getCurrentGame()); + app.selectMenuItem("2"); + assertNotNull(app.getCurrentGame()); + app.selectMenuItem("q"); + assertNull(app.getCurrentGame()); + } +} \ No newline at end of file