commit 93008219c285b8778528a872c3bdd4cbf62ad9ef Author: dereklseitz Date: Sun Mar 23 12:55:32 2025 -0500 Add unit tests for generateNumberToBeGuessed() and isCorrectGuess() methods - Verified structure and value bounds of generateNumberToBeGuessed() - Tested correct and incorrect input behavior of isCorrectGuess() - Set up JUnit 5 with @BeforeEach for Game instantiation - Improved test readability with @DisplayName annotations diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e122dea --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a05a537 --- /dev/null +++ b/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + derek.guessinggame + guessing-game-test + 1.0-SNAPSHOT + + + 23 + 23 + UTF-8 + + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + + \ No newline at end of file diff --git a/src/main/java/derek/guessinggametest/Game.java b/src/main/java/derek/guessinggametest/Game.java new file mode 100644 index 0000000..5c7ee19 --- /dev/null +++ b/src/main/java/derek/guessinggametest/Game.java @@ -0,0 +1,103 @@ +package derek.guessinggametest; + +import java.util.Scanner; +import java.util.Random; +import java.util.ArrayList; + +public class Game { + Scanner in = new Scanner(System.in); + + // Method generating a random number ("random") within a specified range ("min" and "max") + public ArrayList generateNumberToBeGuessed() { + int min = 1; + int max = 100; + Random randomNumber = new Random(); + int random = randomNumber.nextInt(max - min + 1) + min; + ArrayList rNumberMinMax = new ArrayList<>(); + rNumberMinMax.add(random); + rNumberMinMax.add(min); + rNumberMinMax.add(max); + + return rNumberMinMax ; + } + + // Method prompting user to guess a number ("guessed") within a specified range + public int makeGuess(int min, int max) { + int guessed = (min - 1); + + do { + System.out.print("Enter a number between " + min + " and " + max + ": "); + String input = in.nextLine(); + if (input.matches("\\d+") && Integer.parseInt(input) >= min + && Integer.parseInt(input) <= max) { + guessed = Integer.parseInt(input); + } else { + System.out.println("That entry is invalid."); + } + } while (guessed < min); + + return guessed; + } + + // Method to check if "guessed" matches "random" + public boolean isCorrectGuess(int random, int guessed) { + return guessed == random; + } + + // Method for displaying the game's title + public void displayWelcomeMessage() { + System.out.println(" Welcome to the Number Guessing Game!! "); + System.out.println("~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~\n"); + } + + // Method to display introduction dialogue + public void displayPleaseGuessMessage(int min, int max) { + System.out.println("I'm thinking of a number from " + min + " to " + max + "."); + System.out.println("Try to guess it.\n"); + } + + // Method to display dialogue if guessed matches random + public void displayCorrectGuessMessage(int counter) { + if (counter <= 3) { + System.out.println("Great work! You are a mathematical wizard."); + } else if (counter > 3 && counter < 7) { + System.out.println("Not too bad! You've got potential.\n"); + } else if (counter >= 7) { + System.out.println("What took you so long?\n"); + } + } + + // Method to display dialogue if guessed != random + public void displayGuessAgainMessage(int random, int guessed) { + if (guessed > (random + 10)) { + System.out.println("Way too high! Guess again: \n"); + } else if ((guessed > random) && (guessed <= (random + 10))) { + System.out.println("Too high! Guess again: \n"); + } else if (guessed < (random - 10)) { + System.out.println("Way too low! Guess again: \n"); + } else if ((guessed < random) && (guessed >= (random - 10))) { + System.out.println("Too low! Guess again: \n"); + } + } + + // Method prompting user to play again or exit + public boolean displayPlayAgainMessage() { + boolean tryAgain = true; + String input; + + do { + System.out.print("Try again? (y/n): "); + input = in.nextLine(); + if (input.equalsIgnoreCase("y")) { + tryAgain = true; + } else if (input.equalsIgnoreCase("n")) { + tryAgain = false; + } else { + System.out.println("Enter 'y' for yes or 'n' for no."); + } + } while (!input.equalsIgnoreCase("y") && !input.equalsIgnoreCase("n")); + System.out.println("~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~\n"); + return tryAgain; + } + +} \ No newline at end of file diff --git a/src/main/java/derek/guessinggametest/GuessingNumberApp.java b/src/main/java/derek/guessinggametest/GuessingNumberApp.java new file mode 100644 index 0000000..6d8f554 --- /dev/null +++ b/src/main/java/derek/guessinggametest/GuessingNumberApp.java @@ -0,0 +1,46 @@ +package derek.guessinggametest; + +import java.util.Scanner; +import java.util.ArrayList; + +public class GuessingNumberApp { + Scanner in = new Scanner(System.in); + public static void main(String[] args) { + + // Instance of Game class + Game game = new Game(); + + // Display welcome message + game.displayWelcomeMessage(); + + // Create main loop that terminates when user enters "n" at "tryAgain" prompt + do { + ArrayList rNumberMinMax = game.generateNumberToBeGuessed(); + // Unpack "rNumber" to use "random", "min", and "max" throughout application + int random = rNumberMinMax.get(0); + int min = rNumberMinMax.get(1); + int max = rNumberMinMax.get(2); + int counter = 0; + boolean correctGuess = false; + // Introduction dialogue + game.displayPleaseGuessMessage(min, max); + // Inner loop that continues until the "random" is guessed + do { + int guessed = game.makeGuess(min, max); + counter++; + correctGuess = game.isCorrectGuess(rNumberMinMax.get(0), guessed); + if (correctGuess){ + // "tryOrTries" enables the use of the word 'try' in the output if "random" is guessed on first attempt + String tryOrTries = (counter == 1) ? "try" : "tries"; + System.out.println("You got it in " + counter + " " + tryOrTries + "."); + game.displayCorrectGuessMessage(counter); + break; + } else { + game.displayGuessAgainMessage(random, guessed); + } + } while (!correctGuess); + // Loops back if user enters "y" or exits if user enters "n" + } while (game.displayPlayAgainMessage()); + System.out.println("Bye!! Come back soon!!"); + } +} \ No newline at end of file diff --git a/src/test/java/derek/guessinggametest/GameTest.java b/src/test/java/derek/guessinggametest/GameTest.java new file mode 100644 index 0000000..9b0a49a --- /dev/null +++ b/src/test/java/derek/guessinggametest/GameTest.java @@ -0,0 +1,45 @@ +package derek.guessinggametest; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +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.assertTrue; +import static org.junit.jupiter.api.Assertions.*; + +public class GameTest { + private Game game; + + @BeforeEach + void instantiateGame() { + game = new Game(); + } + + @Test + @DisplayName("Test that min, max, and random are correct") + public void testGenerateNumberToBeGuessed() { + ArrayList result = game.generateNumberToBeGuessed(); + assertEquals(3, result.size()); + int random = result.get(0); + int min = result.get(1); + int max = result.get(2); + assertEquals(1, min); + assertEquals(100, max); + assertTrue(random >= min && random <= max); + } + + @Test + @DisplayName("Test if same numbers return true") + public void testIsCorrectGuess() { + assertTrue(game.isCorrectGuess(3,3)); + } + + @Test + @DisplayName("Different Numbers return false") + public void testIsCorrectGuessFalse() { + assertFalse(game.isCorrectGuess(3,4)); + } +} diff --git a/src/test/java/derek/guessinggametest/GuessingNumberAppTest.java b/src/test/java/derek/guessinggametest/GuessingNumberAppTest.java new file mode 100644 index 0000000..416b428 --- /dev/null +++ b/src/test/java/derek/guessinggametest/GuessingNumberAppTest.java @@ -0,0 +1,4 @@ +package derek.guessinggametest; + +public class GuessingNumberAppTest { +}