From 3757768e97c85ae815f979f0c010f03c07b5afe7 Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Mon, 30 Sep 2024 16:30:32 +0900 Subject: [PATCH 01/10] =?UTF-8?q?Test:=20String=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=95=99=EC=8A=B5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/study/StringTest.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java index 43e47d90b..48ff1ee4e 100644 --- a/src/test/java/study/StringTest.java +++ b/src/test/java/study/StringTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; public class StringTest { @Test @@ -10,4 +11,30 @@ void replace() { String actual = "abc".replace("b", "d"); assertThat(actual).isEqualTo("adc"); } + + @Test + void split() { + final String[] actual = "1,2".split(","); + assertThat(actual).contains("1"); + assertThat(actual).contains("2"); + } + + @Test + void split2() { + final String[] actual = "1".split(","); + assertThat(actual).contains("1"); + } + + @Test + void substring() { + final String before = "(1,2)"; + final String actual = before.substring(1,before.length()-1); + assertThat(actual).isEqualTo("1,2"); + } + + @Test + void charAt() { + final String string = "abc"; + assertThrows(IndexOutOfBoundsException.class, () -> string.charAt(4)); + } } From 7f6106e93a1f25bc48c1a3874a4767142c21f55a Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Mon, 30 Sep 2024 16:52:56 +0900 Subject: [PATCH 02/10] =?UTF-8?q?Test:=20Set=20Collection=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=ED=95=99=EC=8A=B5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/study/SetTest.java | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/java/study/SetTest.java diff --git a/src/test/java/study/SetTest.java b/src/test/java/study/SetTest.java new file mode 100644 index 000000000..8e5aae78f --- /dev/null +++ b/src/test/java/study/SetTest.java @@ -0,0 +1,46 @@ +package study; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +public class SetTest { + + private Set numbers; + + @BeforeEach + void setUp() { + numbers = new HashSet<>(); + numbers.add(1); + numbers.add(1); + numbers.add(2); + numbers.add(3); + } + + @Test + void size() { + final int size = numbers.size(); + assertThat(size).isEqualTo(3); + } + + @ParameterizedTest + @ValueSource(ints = {1,1,2,3}) + void contains(int number) { + assertTrue(numbers.contains(number)); + } + + @ParameterizedTest + @CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':') + void contains_isContains_true_or_false(int number, boolean expected) { + assertThat(numbers.contains(number)).isEqualTo(expected); + } +} From e4c999c33ae8e0e31575931d4dc21e36fd6d3b8c Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Tue, 1 Oct 2024 15:57:51 +0900 Subject: [PATCH 03/10] =?UTF-8?q?Test:=20=EB=8B=A8=EC=9C=84=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=8B=A4=EC=8A=B5=20-=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=20=EA=B3=84=EC=82=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/calculator/StringCalculator.java | 48 +++++++++++++++++++ .../java/calculator/StringCalculatorTest.java | 48 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/main/java/calculator/StringCalculator.java create mode 100644 src/test/java/calculator/StringCalculatorTest.java diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java new file mode 100644 index 000000000..8d898f494 --- /dev/null +++ b/src/main/java/calculator/StringCalculator.java @@ -0,0 +1,48 @@ +package calculator; + +import java.util.Scanner; + +public class StringCalculator { + + private final Scanner scanner; + + public StringCalculator(final Scanner scanner) { + this.scanner = scanner; + } + + public String input() { + return scanner.nextLine(); + } + + public int calculatorResult(String input) { + final String[] split = input.split(" "); + int result = Integer.parseInt(split[0]); + String operator; + for (int i = 1; i < split.length; i = i + 2) { // 1,3,5,7,~~ + final int num = Integer.parseInt(split[i + 1]); + operator = split[i]; + result = operation(operator, num, result); + } + return result; + } + + private int operation(final String operator, final int num, int result) { + switch (operator) { + case "+": + result += num; + break; + case "-": + result -= num; + break; + case "*": + result *= num; + break; + case "/": + result /= num; + break; + default: + throw new IllegalArgumentException("잘못된 연산자입니다."); + } + return result; + } +} diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java new file mode 100644 index 000000000..7f4329aa8 --- /dev/null +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -0,0 +1,48 @@ +package calculator; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Scanner; + +import static org.junit.jupiter.api.Assertions.*; + +class StringCalculatorTest { + + private StringCalculator calculator; + + @BeforeEach + void beforeEach() { + calculator = new StringCalculator(new Scanner(System.in)); + } + + @Test + public void calculatorResult() { + String input = "2 + 3 * 4 / 2"; + final int result = calculator.calculatorResult(input); + + Assertions.assertThat(result).isEqualTo(10); + } + @Test + public void calculatorResult2() { + String input = "5 * 8 / 4 + 5 * 2"; + final int result = calculator.calculatorResult(input); + + Assertions.assertThat(result).isEqualTo(30); + } + + @Test + public void calculatorResult_fail_wrong_operator() { + String input = "2 + 3 * 4 ! 5"; + + assertThrows(IllegalArgumentException.class, () -> calculator.calculatorResult(input)); + } + + @Test + public void calculatorResult_fail_wrong_parameter() { + String input = "2 + 3 * 4 ! j"; + + assertThrows(IllegalArgumentException.class, () -> calculator.calculatorResult(input)); + } +} \ No newline at end of file From 0693688f8f302f06aca087aa62cce7c43262fac0 Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Tue, 1 Oct 2024 16:55:04 +0900 Subject: [PATCH 04/10] =?UTF-8?q?Test:=20=EC=88=AB=EC=9E=90=20=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=20=EA=B2=8C=EC=9E=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseballgame/NumberBaseBallGame.java | 49 +++++++++++++++++++ .../baseballgame/NumberBaseBallGameMain.java | 10 ++++ 2 files changed, 59 insertions(+) create mode 100644 src/main/java/baseballgame/NumberBaseBallGame.java create mode 100644 src/main/java/baseballgame/NumberBaseBallGameMain.java diff --git a/src/main/java/baseballgame/NumberBaseBallGame.java b/src/main/java/baseballgame/NumberBaseBallGame.java new file mode 100644 index 000000000..00e26fd0e --- /dev/null +++ b/src/main/java/baseballgame/NumberBaseBallGame.java @@ -0,0 +1,49 @@ +package baseballgame; + +import java.util.Random; +import java.util.Scanner; + +public class NumberBaseBallGame { + + private final Scanner scanner; + private String[] answer; + + public NumberBaseBallGame(final Scanner scanner) { + this.scanner = scanner; + } + + public String[] input() { + System.out.print("숫자를 입력해 주세요 : "); + + final String number = scanner.nextLine(); + + validateInputLength(number); + + return number.split(""); + } + + public void start() { + boolean isCorrect = false; + createRandomNumber(); + + while (!isCorrect) { + final String[] input = input(); + } + } + + private void validateInputLength(final String string) { + if (string.length() != 3) { + throw new RuntimeException("숫자는 반드시 3자리만 입력 해야 합니다."); + } + } + + private void createRandomNumber() { + final Random random = new Random(); + + final int first = random.nextInt(9) + 1; + final int second = random.nextInt(9) + 1; + final int third = random.nextInt(9) + 1; + + answer = new String[]{String.valueOf(first), String.valueOf(second), String.valueOf(third)}; + } +} diff --git a/src/main/java/baseballgame/NumberBaseBallGameMain.java b/src/main/java/baseballgame/NumberBaseBallGameMain.java new file mode 100644 index 000000000..e1e98900e --- /dev/null +++ b/src/main/java/baseballgame/NumberBaseBallGameMain.java @@ -0,0 +1,10 @@ +package baseballgame; + +import java.util.Scanner; + +public class NumberBaseBallGameMain { + + public static void main(String[] args) { + final NumberBaseBallGame game = new NumberBaseBallGame(new Scanner(System.in)); + } +} From 25387169186942cb7a5d7e6e7e7a1342ed0ab88a Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Wed, 2 Oct 2024 11:23:29 +0900 Subject: [PATCH 05/10] =?UTF-8?q?fix:=20Util=20interface=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseballgame/NumberBaseBallGame.java | 26 +++++++------------ .../baseballgame/NumberBaseBallGameMain.java | 2 +- src/main/java/util/BaseballRandomNumber.java | 16 ++++++++++++ src/main/java/util/BaseballScanner.java | 10 +++++++ src/main/java/util/RandomNumberUtil.java | 6 +++++ src/main/java/util/ScannerUtil.java | 6 +++++ .../baseballgame/NumberBaseBallGameTest.java | 21 +++++++++++++++ 7 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 src/main/java/util/BaseballRandomNumber.java create mode 100644 src/main/java/util/BaseballScanner.java create mode 100644 src/main/java/util/RandomNumberUtil.java create mode 100644 src/main/java/util/ScannerUtil.java create mode 100644 src/test/java/baseballgame/NumberBaseBallGameTest.java diff --git a/src/main/java/baseballgame/NumberBaseBallGame.java b/src/main/java/baseballgame/NumberBaseBallGame.java index 00e26fd0e..6601e013e 100644 --- a/src/main/java/baseballgame/NumberBaseBallGame.java +++ b/src/main/java/baseballgame/NumberBaseBallGame.java @@ -1,15 +1,19 @@ package baseballgame; -import java.util.Random; -import java.util.Scanner; +import util.BaseballRandomNumber; +import util.BaseballScanner; +import util.RandomNumberUtil; +import util.ScannerUtil; public class NumberBaseBallGame { - private final Scanner scanner; + private final ScannerUtil scanner; + private final RandomNumberUtil randomNumberCreator; private String[] answer; - public NumberBaseBallGame(final Scanner scanner) { - this.scanner = scanner; + public NumberBaseBallGame() { + this.randomNumberCreator = new BaseballRandomNumber(); + this.scanner = new BaseballScanner(); } public String[] input() { @@ -24,7 +28,7 @@ public String[] input() { public void start() { boolean isCorrect = false; - createRandomNumber(); + randomNumberCreator.createRandomNumber(); while (!isCorrect) { final String[] input = input(); @@ -36,14 +40,4 @@ private void validateInputLength(final String string) { throw new RuntimeException("숫자는 반드시 3자리만 입력 해야 합니다."); } } - - private void createRandomNumber() { - final Random random = new Random(); - - final int first = random.nextInt(9) + 1; - final int second = random.nextInt(9) + 1; - final int third = random.nextInt(9) + 1; - - answer = new String[]{String.valueOf(first), String.valueOf(second), String.valueOf(third)}; - } } diff --git a/src/main/java/baseballgame/NumberBaseBallGameMain.java b/src/main/java/baseballgame/NumberBaseBallGameMain.java index e1e98900e..d0fba1c5e 100644 --- a/src/main/java/baseballgame/NumberBaseBallGameMain.java +++ b/src/main/java/baseballgame/NumberBaseBallGameMain.java @@ -5,6 +5,6 @@ public class NumberBaseBallGameMain { public static void main(String[] args) { - final NumberBaseBallGame game = new NumberBaseBallGame(new Scanner(System.in)); + final NumberBaseBallGame game = new NumberBaseBallGame(); } } diff --git a/src/main/java/util/BaseballRandomNumber.java b/src/main/java/util/BaseballRandomNumber.java new file mode 100644 index 000000000..62cf65606 --- /dev/null +++ b/src/main/java/util/BaseballRandomNumber.java @@ -0,0 +1,16 @@ +package util; + +import java.util.Random; + +public class BaseballRandomNumber implements RandomNumberUtil{ + @Override + public String[] createRandomNumber() { + final Random random = new Random(); + + final int first = random.nextInt(9) + 1; + final int second = random.nextInt(9) + 1; + final int third = random.nextInt(9) + 1; + + return new String[]{String.valueOf(first), String.valueOf(second), String.valueOf(third)}; + } +} diff --git a/src/main/java/util/BaseballScanner.java b/src/main/java/util/BaseballScanner.java new file mode 100644 index 000000000..43acbfcd1 --- /dev/null +++ b/src/main/java/util/BaseballScanner.java @@ -0,0 +1,10 @@ +package util; + +import java.util.Scanner; + +public class BaseballScanner implements ScannerUtil { + @Override + public String nextLine() { + return new Scanner(System.in).nextLine(); + } +} \ No newline at end of file diff --git a/src/main/java/util/RandomNumberUtil.java b/src/main/java/util/RandomNumberUtil.java new file mode 100644 index 000000000..b8647d80b --- /dev/null +++ b/src/main/java/util/RandomNumberUtil.java @@ -0,0 +1,6 @@ +package util; + +public interface RandomNumberUtil { + + String[] createRandomNumber(); +} diff --git a/src/main/java/util/ScannerUtil.java b/src/main/java/util/ScannerUtil.java new file mode 100644 index 000000000..d288729d4 --- /dev/null +++ b/src/main/java/util/ScannerUtil.java @@ -0,0 +1,6 @@ +package util; + +public interface ScannerUtil { + + String nextLine(); +} diff --git a/src/test/java/baseballgame/NumberBaseBallGameTest.java b/src/test/java/baseballgame/NumberBaseBallGameTest.java new file mode 100644 index 000000000..1be3bdeef --- /dev/null +++ b/src/test/java/baseballgame/NumberBaseBallGameTest.java @@ -0,0 +1,21 @@ +package baseballgame; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class NumberBaseBallGameTest { + + @Test + @DisplayName("Edit") + void input() { + // TODO TEST CODE + } + + @Test + @DisplayName("Edit") + void start() { + // TODO TEST CODE + } +} \ No newline at end of file From b69c375e1cf208b84c00a27f38c562c8aca10a01 Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Wed, 2 Oct 2024 17:00:39 +0900 Subject: [PATCH 06/10] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseballgame/InputView.java | 32 +++++++ .../java/baseballgame/NumberBaseBallGame.java | 94 +++++++++++++++---- ...berBaseBallGameMain.java => TestMain.java} | 6 +- src/main/java/util/BaseballRandomNumber.java | 16 +++- 4 files changed, 123 insertions(+), 25 deletions(-) create mode 100644 src/main/java/baseballgame/InputView.java rename src/main/java/baseballgame/{NumberBaseBallGameMain.java => TestMain.java} (69%) diff --git a/src/main/java/baseballgame/InputView.java b/src/main/java/baseballgame/InputView.java new file mode 100644 index 000000000..df84a6c0d --- /dev/null +++ b/src/main/java/baseballgame/InputView.java @@ -0,0 +1,32 @@ +package baseballgame; + +import util.ScannerUtil; + +public class InputView { + + private final ScannerUtil scanner; + + public InputView(ScannerUtil scanner) { + this.scanner = scanner; + } + + public String[] input() { + System.out.print("숫자를 입력해 주세요 : "); + + final String number = scanner.nextLine(); + + validateInputLength(number); + + return number.split(""); + } + + private void validateInputLength(final String string) { + if (string.length() != 3) { + throw new RuntimeException("숫자는 반드시 3자리만 입력 해야 합니다."); + } + } + + public ScannerUtil getScanner() { + return scanner; + } +} diff --git a/src/main/java/baseballgame/NumberBaseBallGame.java b/src/main/java/baseballgame/NumberBaseBallGame.java index 6601e013e..e5259e9d2 100644 --- a/src/main/java/baseballgame/NumberBaseBallGame.java +++ b/src/main/java/baseballgame/NumberBaseBallGame.java @@ -7,37 +7,95 @@ public class NumberBaseBallGame { - private final ScannerUtil scanner; - private final RandomNumberUtil randomNumberCreator; - private String[] answer; + private final InputView inputView; + private String[] randomNumber; public NumberBaseBallGame() { - this.randomNumberCreator = new BaseballRandomNumber(); - this.scanner = new BaseballScanner(); + RandomNumberUtil randomNumberCreator = new BaseballRandomNumber(); + ScannerUtil scanner = new BaseballScanner(); + this.inputView = new InputView(scanner); + randomNumber = randomNumberCreator.createRandomNumber(); } - public String[] input() { - System.out.print("숫자를 입력해 주세요 : "); + public void start() { + boolean isCorrect = false; + + while (!isCorrect) { + final String[] input = inputView.input(); + int strikes = 0, balls = 0; - final String number = scanner.nextLine(); + // 스트라이크 체크 + strikes = checkStrikes(input, strikes); - validateInputLength(number); + // 볼 체크 + balls = checkBalls(input, balls); - return number.split(""); + if (printBallStrikeCount(strikes, balls)) break; + } } - public void start() { - boolean isCorrect = false; - randomNumberCreator.createRandomNumber(); + private boolean printBallStrikeCount(final int strikes, final int balls) { + if (strikes == 3) { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + final String s = inputView.getScanner().nextLine(); - while (!isCorrect) { - final String[] input = input(); + if (resetOrRestart(s)) return true; + } + + if (strikes == 0 && balls == 0) { + System.out.println("낫싱"); + } + + if (strikes > 0 && balls == 0) { + System.out.println(strikes + "스트라이크"); + } + + if(strikes == 0 && balls > 0) { + System.out.println(balls + "볼"); + } + + if (strikes > 0 && balls > 0) { + System.out.println(strikes + "스트라이크 " + balls + " 볼"); + } + return false; + } + + private boolean resetOrRestart(final String s) { + if (s.equals("1")) { + start(); + } + + if (s.equals("2")) { + return true; + } + return false; + } + + private int checkBalls(final String[] input, int balls) { + for (int i = 0; i < 3; i++) { + if (!randomNumber[i].equals(input[i]) && containsNumbers(randomNumber, input[i])) { + balls++; + } + } + return balls; + } + + private int checkStrikes(final String[] input, int strikes) { + for (int i = 0; i < 3; i++) { + if (randomNumber[i].equals(input[i])) { + strikes++; + } } + return strikes; } - private void validateInputLength(final String string) { - if (string.length() != 3) { - throw new RuntimeException("숫자는 반드시 3자리만 입력 해야 합니다."); + private boolean containsNumbers(final String[] randomNumber, final String s) { + for (String e : randomNumber) { + if (e.equals(s)) { + return true; + } } + return false; } } diff --git a/src/main/java/baseballgame/NumberBaseBallGameMain.java b/src/main/java/baseballgame/TestMain.java similarity index 69% rename from src/main/java/baseballgame/NumberBaseBallGameMain.java rename to src/main/java/baseballgame/TestMain.java index d0fba1c5e..840467f14 100644 --- a/src/main/java/baseballgame/NumberBaseBallGameMain.java +++ b/src/main/java/baseballgame/TestMain.java @@ -1,10 +1,10 @@ package baseballgame; -import java.util.Scanner; - -public class NumberBaseBallGameMain { +public class TestMain { public static void main(String[] args) { final NumberBaseBallGame game = new NumberBaseBallGame(); + + game.start(); } } diff --git a/src/main/java/util/BaseballRandomNumber.java b/src/main/java/util/BaseballRandomNumber.java index 62cf65606..6f19b8eea 100644 --- a/src/main/java/util/BaseballRandomNumber.java +++ b/src/main/java/util/BaseballRandomNumber.java @@ -2,14 +2,22 @@ import java.util.Random; -public class BaseballRandomNumber implements RandomNumberUtil{ +public class BaseballRandomNumber implements RandomNumberUtil { @Override public String[] createRandomNumber() { final Random random = new Random(); - final int first = random.nextInt(9) + 1; - final int second = random.nextInt(9) + 1; - final int third = random.nextInt(9) + 1; + int first, second, third; + + first = random.nextInt(9) + 1; + + do { + second = random.nextInt(9) + 1; + } while (first == second); + + do { + third = random.nextInt(9) + 1; + } while (first == third || third == second ); return new String[]{String.valueOf(first), String.valueOf(second), String.valueOf(third)}; } From b830753ff2e9e2e524d4431d4712de492dc2fd98 Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Thu, 3 Oct 2024 20:10:30 +0900 Subject: [PATCH 07/10] =?UTF-8?q?feat:=20validation=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20-=20=EC=88=AB=EC=9E=90=EA=B0=80=201=EC=97=90=EC=84=9C=209=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=9D=B8=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/ValidationUtils.java | 11 +++++++++++ src/test/java/baseball/ValidationUtilTest.java | 15 +++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/main/java/baseball/ValidationUtils.java create mode 100644 src/test/java/baseball/ValidationUtilTest.java diff --git a/src/main/java/baseball/ValidationUtils.java b/src/main/java/baseball/ValidationUtils.java new file mode 100644 index 000000000..f347920bd --- /dev/null +++ b/src/main/java/baseball/ValidationUtils.java @@ -0,0 +1,11 @@ +package baseball; + +public class ValidationUtils { + + public static final int MIN_VALUE = 0; + public static final int MAX_VALUE = 10; + + public static boolean validNo(int no) { + return no > MIN_VALUE && no < MAX_VALUE; + } +} diff --git a/src/test/java/baseball/ValidationUtilTest.java b/src/test/java/baseball/ValidationUtilTest.java new file mode 100644 index 000000000..0d5e312d9 --- /dev/null +++ b/src/test/java/baseball/ValidationUtilTest.java @@ -0,0 +1,15 @@ +package baseball; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class ValidationUtilTest { + @Test + void 숫자_1_9_검증() { + assertThat(ValidationUtils.validNo(9)).isTrue(); + assertThat(ValidationUtils.validNo(1)).isTrue(); + assertThat(ValidationUtils.validNo(0)).isFalse(); + assertThat(ValidationUtils.validNo(10)).isFalse(); + } +} From e4cb00897e25dadbda4836f66ad5d4ca9c650968 Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Thu, 3 Oct 2024 20:34:13 +0900 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20validation=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20-=20=EC=A4=91=EB=B3=B5=EA=B0=92,=20=EC=88=AB=EC=9E=90=203?= =?UTF-8?q?=EC=9E=90=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/ValidationUtils.java | 22 +++++++++++++++++++ .../java/baseball/ValidationUtilTest.java | 17 ++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/main/java/baseball/ValidationUtils.java b/src/main/java/baseball/ValidationUtils.java index f347920bd..6df8e6dc8 100644 --- a/src/main/java/baseball/ValidationUtils.java +++ b/src/main/java/baseball/ValidationUtils.java @@ -1,5 +1,8 @@ package baseball; +import java.util.HashSet; +import java.util.Set; + public class ValidationUtils { public static final int MIN_VALUE = 0; @@ -8,4 +11,23 @@ public class ValidationUtils { public static boolean validNo(int no) { return no > MIN_VALUE && no < MAX_VALUE; } + + public static boolean validNoDuplication(int balls) { + + String numbers = String.valueOf(balls); + Set set = new HashSet<>(); + char[] numbersCharArray = numbers.toCharArray(); + + for (char num : numbersCharArray) { + if (!set.add(num)) { + return false; + } + } + + return true; + } + + public static boolean validLengthThree(int balls) { + return String.valueOf(balls).length() == 3; + } } diff --git a/src/test/java/baseball/ValidationUtilTest.java b/src/test/java/baseball/ValidationUtilTest.java index 0d5e312d9..e07db37ab 100644 --- a/src/test/java/baseball/ValidationUtilTest.java +++ b/src/test/java/baseball/ValidationUtilTest.java @@ -5,6 +5,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class ValidationUtilTest { + @Test void 숫자_1_9_검증() { assertThat(ValidationUtils.validNo(9)).isTrue(); @@ -12,4 +13,20 @@ public class ValidationUtilTest { assertThat(ValidationUtils.validNo(0)).isFalse(); assertThat(ValidationUtils.validNo(10)).isFalse(); } + + @Test + void 중복값_존재하는지_검증() { + assertThat(ValidationUtils.validNoDuplication(123)).isTrue(); + assertThat(ValidationUtils.validNoDuplication(234)).isTrue(); + assertThat(ValidationUtils.validNoDuplication(233)).isFalse(); + assertThat(ValidationUtils.validNoDuplication(777)).isFalse(); + } + + @Test + void 숫자가_3자리인지() { + assertThat(ValidationUtils.validLengthThree(123)).isTrue(); + assertThat(ValidationUtils.validLengthThree(456)).isTrue(); + assertThat(ValidationUtils.validLengthThree(444)).isTrue(); + assertThat(ValidationUtils.validLengthThree(1234)).isFalse(); + } } From cb82b26c0727cd008055f72861bbb49939c23a4c Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Thu, 3 Oct 2024 21:06:07 +0900 Subject: [PATCH 09/10] =?UTF-8?q?feat:=20ballTest=20-=20ball,=20strike,=20?= =?UTF-8?q?nothing=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Ball.java | 43 ++++++++++++++++++++++++++ src/main/java/baseball/BallStatus.java | 7 +++++ src/test/java/baseball/BallTest.java | 34 ++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 src/main/java/baseball/Ball.java create mode 100644 src/main/java/baseball/BallStatus.java create mode 100644 src/test/java/baseball/BallTest.java diff --git a/src/main/java/baseball/Ball.java b/src/main/java/baseball/Ball.java new file mode 100644 index 000000000..278bcd984 --- /dev/null +++ b/src/main/java/baseball/Ball.java @@ -0,0 +1,43 @@ +package baseball; + +import java.util.Objects; + +public class Ball { + + private final int position, ballNo; + + public Ball(int position, int ballNo) { + this.position = position; + this.ballNo = ballNo; + } + + public BallStatus play(Ball ball) { + + if (this.equals(ball)) { + return BallStatus.STRIKE; + } + + if (ball.matchBallNumber(ballNo)) { + return BallStatus.BALL; + } + + return BallStatus.NOTHING; + } + + private boolean matchBallNumber(int ballNo) { + return this.ballNo == ballNo; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Ball)) return false; + Ball ball = (Ball) o; + return position == ball.position && ballNo == ball.ballNo; + } + + @Override + public int hashCode() { + return Objects.hash(position, ballNo); + } +} diff --git a/src/main/java/baseball/BallStatus.java b/src/main/java/baseball/BallStatus.java new file mode 100644 index 000000000..8a8c2dc44 --- /dev/null +++ b/src/main/java/baseball/BallStatus.java @@ -0,0 +1,7 @@ +package baseball; + +public enum BallStatus { + BALL, STRIKE, NOTHING + + +} diff --git a/src/test/java/baseball/BallTest.java b/src/test/java/baseball/BallTest.java new file mode 100644 index 000000000..33ca129d5 --- /dev/null +++ b/src/test/java/baseball/BallTest.java @@ -0,0 +1,34 @@ +package baseball; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class BallTest { + + private Ball com; + + @BeforeEach + void setUp() { + com = new Ball(1,4); + } + + @Test + void nothing() { + BallStatus status = com.play(new Ball(2,5)); + assertThat(status).isEqualTo(BallStatus.NOTHING); + } + + @Test + void ball() { + BallStatus status = com.play(new Ball(2,4)); + assertThat(status).isEqualTo(BallStatus.BALL); + } + + @Test + void strike() { + BallStatus status = com.play(new Ball(1,4)); + assertThat(status).isEqualTo(BallStatus.STRIKE); + } +} From 3b12873e4c1f20d94d015e6633c5750116d836a0 Mon Sep 17 00:00:00 2001 From: kangminhyuk1111 Date: Fri, 4 Oct 2024 01:17:59 +0900 Subject: [PATCH 10/10] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Ball.java | 4 +++ src/main/java/baseball/BallStatus.java | 5 ++- src/main/java/baseball/Balls.java | 37 +++++++++++++++++++ src/main/java/baseball/PlayResult.java | 11 ++++++ src/test/java/baseball/BallTest.java | 13 ++++--- src/test/java/baseball/BallsTest.java | 50 ++++++++++++++++++++++++++ 6 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 src/main/java/baseball/Balls.java create mode 100644 src/main/java/baseball/PlayResult.java create mode 100644 src/test/java/baseball/BallsTest.java diff --git a/src/main/java/baseball/Ball.java b/src/main/java/baseball/Ball.java index 278bcd984..6e581d338 100644 --- a/src/main/java/baseball/Ball.java +++ b/src/main/java/baseball/Ball.java @@ -13,6 +13,10 @@ public Ball(int position, int ballNo) { public BallStatus play(Ball ball) { + // 1,4 - 2,5 / nothing + // 1,4 - 2,4 / ball + // 1,4 - 1,4 / strike + if (this.equals(ball)) { return BallStatus.STRIKE; } diff --git a/src/main/java/baseball/BallStatus.java b/src/main/java/baseball/BallStatus.java index 8a8c2dc44..9a58e6829 100644 --- a/src/main/java/baseball/BallStatus.java +++ b/src/main/java/baseball/BallStatus.java @@ -1,7 +1,10 @@ package baseball; public enum BallStatus { - BALL, STRIKE, NOTHING + BALL, STRIKE, NOTHING; + public boolean isNotNothing() { + return this != NOTHING; + } } diff --git a/src/main/java/baseball/Balls.java b/src/main/java/baseball/Balls.java new file mode 100644 index 000000000..e56a920cb --- /dev/null +++ b/src/main/java/baseball/Balls.java @@ -0,0 +1,37 @@ +package baseball; + +import java.util.ArrayList; +import java.util.List; + +public class Balls { + + private List answers; // 1,2,3 + + public Balls(List answers) { + this.answers = mapBalls(answers); + } + + public BallStatus play(Ball userBall) { + return answers.stream() + .map(answer -> answer.play(userBall)) + .filter(BallStatus::isNotNothing) + .findFirst() + .orElse(BallStatus.NOTHING); + } + + public PlayResult play(List balls) { + PlayResult result = new PlayResult(); + + Balls userBalls = new Balls(balls); + + return result; + } + + private static List mapBalls(List answers) { + List balls = new ArrayList<>(); + for (int i = 0; i < answers.size(); i++) { + balls.add(new Ball(i + 1, answers.get(i))); + } + return balls; + } +} diff --git a/src/main/java/baseball/PlayResult.java b/src/main/java/baseball/PlayResult.java new file mode 100644 index 000000000..aab5353cc --- /dev/null +++ b/src/main/java/baseball/PlayResult.java @@ -0,0 +1,11 @@ +package baseball; + +public class PlayResult { + public int getStrikes() { + return 0; + } + + public int getBalls() { + return 0; + } +} diff --git a/src/test/java/baseball/BallTest.java b/src/test/java/baseball/BallTest.java index 33ca129d5..2718c9961 100644 --- a/src/test/java/baseball/BallTest.java +++ b/src/test/java/baseball/BallTest.java @@ -7,28 +7,31 @@ public class BallTest { - private Ball com; + private Ball computer; @BeforeEach void setUp() { - com = new Ball(1,4); + computer = new Ball(1,4); } @Test void nothing() { - BallStatus status = com.play(new Ball(2,5)); + Ball user = new Ball(2, 5); + BallStatus status = computer.play(user); assertThat(status).isEqualTo(BallStatus.NOTHING); } @Test void ball() { - BallStatus status = com.play(new Ball(2,4)); + Ball user = new Ball(2, 4); + BallStatus status = computer.play(user); assertThat(status).isEqualTo(BallStatus.BALL); } @Test void strike() { - BallStatus status = com.play(new Ball(1,4)); + Ball user = new Ball(1, 4); + BallStatus status = computer.play(user); assertThat(status).isEqualTo(BallStatus.STRIKE); } } diff --git a/src/test/java/baseball/BallsTest.java b/src/test/java/baseball/BallsTest.java new file mode 100644 index 000000000..ac33ebde0 --- /dev/null +++ b/src/test/java/baseball/BallsTest.java @@ -0,0 +1,50 @@ +package baseball; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class BallsTest { + + private Balls answer; + + @BeforeEach + void setUp() { + answer = new Balls(Arrays.asList(1, 2, 3)); + } + + @Test + void play() { + PlayResult result = answer.play(Arrays.asList(4, 5, 6)); + assertThat(result.getStrikes()).isEqualTo(0); + assertThat(result.getBalls()).isEqualTo(0); + } + + @Test + void play_1strike_1ball() { + PlayResult result = answer.play(Arrays.asList(1, 4, 2)); + assertThat(result.getStrikes()).isEqualTo(1); + assertThat(result.getBalls()).isEqualTo(1); + } + + @Test + void nothing() { + BallStatus status = answer.play(new Ball(1, 4)); + assertThat(status).isEqualTo(BallStatus.NOTHING); + } + + @Test + void ball() { + BallStatus status = answer.play(new Ball(1, 3)); + assertThat(status).isEqualTo(BallStatus.BALL); + } + + @Test + void strike() { + BallStatus status = answer.play(new Ball(1, 1)); + assertThat(status).isEqualTo(BallStatus.STRIKE); + } +}