From 89bb9d40b2a633e36715701c32f5b308b070b808 Mon Sep 17 00:00:00 2001 From: park0503 Date: Tue, 20 Dec 2022 14:33:21 +0900 Subject: [PATCH 01/19] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index fcf3f057..dce8c148 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,12 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 구현할 기능 목록 +- 숫자 입력 +- 입력값 검증 (1 ~ 9 사이의 숫자 3개) +- 값 Parsing ("234" => [2, 3, 4]) +- 값 비교 ([2, 3, 4] vs [4, 5, 6] => 1개 겹침) +- 결과 판단 (1 => 1 스트라이크 2 볼) +- 결과 출력 +- 게임 반복 진행 가능 From e1198a24c2cf65d11563488f9744b356925cda00 Mon Sep 17 00:00:00 2001 From: park0503 Date: Tue, 20 Dec 2022 18:38:24 +0900 Subject: [PATCH 02/19] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EA=B0=92=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 정규식을 이용한 포맷 검증 메소드 - 중복 숫자 검증 메소드 --- src/main/java/study/baseball/App.java | 15 ++++++++++++ .../java/study/baseball/engine/Baseball.java | 14 +++++++++++ .../study/baseball/engine/InputValidator.java | 24 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/main/java/study/baseball/App.java create mode 100644 src/main/java/study/baseball/engine/Baseball.java create mode 100644 src/main/java/study/baseball/engine/InputValidator.java diff --git a/src/main/java/study/baseball/App.java b/src/main/java/study/baseball/App.java new file mode 100644 index 00000000..418aaff6 --- /dev/null +++ b/src/main/java/study/baseball/App.java @@ -0,0 +1,15 @@ +package study.baseball; + +import java.util.regex.Pattern; +import study.baseball.engine.Baseball; +import study.baseball.engine.InputValidator; + +public class App { + public static void main(String[] args) { + Pattern regex = Pattern.compile("[0-9]{3}"); + InputValidator validator = new InputValidator(regex); + Baseball baseball = new Baseball(validator); + + baseball.run(); + } +} diff --git a/src/main/java/study/baseball/engine/Baseball.java b/src/main/java/study/baseball/engine/Baseball.java new file mode 100644 index 00000000..a2c8f3b2 --- /dev/null +++ b/src/main/java/study/baseball/engine/Baseball.java @@ -0,0 +1,14 @@ +package study.baseball.engine; + +public class Baseball implements Runnable { + private final InputValidator inputValidator; + + public Baseball(InputValidator inputValidator) { + this.inputValidator = inputValidator; + } + + @Override + public void run() { + + } +} diff --git a/src/main/java/study/baseball/engine/InputValidator.java b/src/main/java/study/baseball/engine/InputValidator.java new file mode 100644 index 00000000..53d164e7 --- /dev/null +++ b/src/main/java/study/baseball/engine/InputValidator.java @@ -0,0 +1,24 @@ +package study.baseball.engine; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +public class InputValidator { + + private final Pattern regex; + + public InputValidator(Pattern regex) { + this.regex = regex; + } + + public boolean isValidFormat(String input) { + return regex.matcher(input).matches(); + } + + public boolean hasDuplicateNumber(List input) { + Set inputSet = new HashSet(input); + return input.size() == inputSet.size(); + } +} From 324cef0869e15cdb33d1cf38d0527b8f0628113a Mon Sep 17 00:00:00 2001 From: park0503 Date: Tue, 20 Dec 2022 18:40:20 +0900 Subject: [PATCH 03/19] =?UTF-8?q?docs:=20README.md=20=EC=B2=B4=ED=81=AC?= =?UTF-8?q?=EB=B0=95=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index dce8c148..1deb6f3e 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,10 @@ * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) ## 구현할 기능 목록 -- 숫자 입력 -- 입력값 검증 (1 ~ 9 사이의 숫자 3개) -- 값 Parsing ("234" => [2, 3, 4]) -- 값 비교 ([2, 3, 4] vs [4, 5, 6] => 1개 겹침) -- 결과 판단 (1 => 1 스트라이크 2 볼) -- 결과 출력 -- 게임 반복 진행 가능 +- [ ] 숫자 입력 +- [x] 입력값 검증 (1 ~ 9 사이의 숫자 3개, 숫자 중복 검사) +- [ ] 값 Parsing ("234" => [2, 3, 4]) +- [ ] 값 비교 ([2, 3, 4] vs [4, 5, 6] => 1개 겹침) +- [ ] 결과 판단 (1 => 1 스트라이크 2 볼) +- [ ] 결과 출력 +- [ ] 게임 반복 진행 가능 From bc67ade20d9136428a06de8f0d173a733d66d1d7 Mon Sep 17 00:00:00 2001 From: park0503 Date: Tue, 20 Dec 2022 18:59:14 +0900 Subject: [PATCH 04/19] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EA=B0=92=20?= =?UTF-8?q?=ED=8C=8C=EC=8B=B1=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 문자열 -> 정수 List 변환 메소드 구현 --- src/main/java/study/baseball/App.java | 4 +++- src/main/java/study/baseball/engine/Baseball.java | 4 +++- .../java/study/baseball/engine/InputParser.java | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 src/main/java/study/baseball/engine/InputParser.java diff --git a/src/main/java/study/baseball/App.java b/src/main/java/study/baseball/App.java index 418aaff6..a384b42c 100644 --- a/src/main/java/study/baseball/App.java +++ b/src/main/java/study/baseball/App.java @@ -2,13 +2,15 @@ import java.util.regex.Pattern; import study.baseball.engine.Baseball; +import study.baseball.engine.InputParser; import study.baseball.engine.InputValidator; public class App { public static void main(String[] args) { Pattern regex = Pattern.compile("[0-9]{3}"); InputValidator validator = new InputValidator(regex); - Baseball baseball = new Baseball(validator); + InputParser parser = new InputParser(); + Baseball baseball = new Baseball(validator, parser); baseball.run(); } diff --git a/src/main/java/study/baseball/engine/Baseball.java b/src/main/java/study/baseball/engine/Baseball.java index a2c8f3b2..9bc52413 100644 --- a/src/main/java/study/baseball/engine/Baseball.java +++ b/src/main/java/study/baseball/engine/Baseball.java @@ -2,9 +2,11 @@ public class Baseball implements Runnable { private final InputValidator inputValidator; + private final InputParser inputParser; - public Baseball(InputValidator inputValidator) { + public Baseball(InputValidator inputValidator, InputParser inputParser) { this.inputValidator = inputValidator; + this.inputParser = inputParser; } @Override diff --git a/src/main/java/study/baseball/engine/InputParser.java b/src/main/java/study/baseball/engine/InputParser.java new file mode 100644 index 00000000..23e5d2cc --- /dev/null +++ b/src/main/java/study/baseball/engine/InputParser.java @@ -0,0 +1,15 @@ +package study.baseball.engine; + +import java.util.ArrayList; +import java.util.List; + +public class InputParser { + public List parseStringToIntegerList(String input) throws NumberFormatException { + String[] inputArray = input.split(""); + List result = new ArrayList<>(); + for (String number:inputArray) { + result.add(Integer.parseInt(number)); + } + return result; + } +} From f71a699877683334ce4b951c5b8c28231fc09d9d Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 02:57:32 +0900 Subject: [PATCH 05/19] =?UTF-8?q?refactor:=20parsing=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EB=82=B4=20=EC=A4=91=EB=B3=B5=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputParser의 parsing 메소드 내 중복검사 로직 추가 - InputValidator 내의 기존 중복검사 메소드 제거 --- src/main/java/study/baseball/engine/InputParser.java | 3 +++ src/main/java/study/baseball/engine/InputValidator.java | 5 ----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/study/baseball/engine/InputParser.java b/src/main/java/study/baseball/engine/InputParser.java index 23e5d2cc..0cea71b1 100644 --- a/src/main/java/study/baseball/engine/InputParser.java +++ b/src/main/java/study/baseball/engine/InputParser.java @@ -10,6 +10,9 @@ public List parseStringToIntegerList(String input) throws NumberFormatE for (String number:inputArray) { result.add(Integer.parseInt(number)); } + if (input.length() != result.size()) { + throw new RuntimeException("중복된 숫자가 존재합니다."); + } return result; } } diff --git a/src/main/java/study/baseball/engine/InputValidator.java b/src/main/java/study/baseball/engine/InputValidator.java index 53d164e7..095b1f7a 100644 --- a/src/main/java/study/baseball/engine/InputValidator.java +++ b/src/main/java/study/baseball/engine/InputValidator.java @@ -16,9 +16,4 @@ public InputValidator(Pattern regex) { public boolean isValidFormat(String input) { return regex.matcher(input).matches(); } - - public boolean hasDuplicateNumber(List input) { - Set inputSet = new HashSet(input); - return input.size() == inputSet.size(); - } } From a630a56ff0db95886dffbb21d707a94ba71fb905 Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 02:58:47 +0900 Subject: [PATCH 06/19] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NumberGenerator 클래스 내 랜덤 숫자 생성 메소드 구현 - Numbers model 생성 --- README.md | 3 ++- .../study/baseball/engine/NumberGenerator.java | 17 +++++++++++++++++ .../study/baseball/engine/model/Numbers.java | 11 +++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/main/java/study/baseball/engine/NumberGenerator.java create mode 100644 src/main/java/study/baseball/engine/model/Numbers.java diff --git a/README.md b/README.md index 1deb6f3e..0c80534e 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,8 @@ ## 구현할 기능 목록 - [ ] 숫자 입력 - [x] 입력값 검증 (1 ~ 9 사이의 숫자 3개, 숫자 중복 검사) -- [ ] 값 Parsing ("234" => [2, 3, 4]) +- [x] 값 Parsing ("234" => [2, 3, 4]) +- [x] 랜덤 숫자 생성 - [ ] 값 비교 ([2, 3, 4] vs [4, 5, 6] => 1개 겹침) - [ ] 결과 판단 (1 => 1 스트라이크 2 볼) - [ ] 결과 출력 diff --git a/src/main/java/study/baseball/engine/NumberGenerator.java b/src/main/java/study/baseball/engine/NumberGenerator.java new file mode 100644 index 00000000..f13af339 --- /dev/null +++ b/src/main/java/study/baseball/engine/NumberGenerator.java @@ -0,0 +1,17 @@ +package study.baseball.engine; + +import java.util.LinkedHashSet; +import java.util.Random; +import java.util.Set; +import study.baseball.engine.model.Numbers; + +public class NumberGenerator { + private final Random random = new Random(); + public Numbers generateRandomNumber() { + Set randomNumbers = new LinkedHashSet<>(); + while(randomNumbers.size() < 3) { + randomNumbers.add(random.nextInt(10)); + } + return new Numbers(randomNumbers); + } +} diff --git a/src/main/java/study/baseball/engine/model/Numbers.java b/src/main/java/study/baseball/engine/model/Numbers.java new file mode 100644 index 00000000..ee163e16 --- /dev/null +++ b/src/main/java/study/baseball/engine/model/Numbers.java @@ -0,0 +1,11 @@ +package study.baseball.engine.model; + +import java.util.Set; + +public class Numbers { + + private final Set numbers; + public Numbers(Set numbers) { + this.numbers = numbers; + } +} From 06dc8e976d7058375f263d029dad49ceb500bcdd Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 03:18:40 +0900 Subject: [PATCH 07/19] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5,=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EB=8B=B4=EB=8B=B9=20=EC=BD=98=EC=86=94=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Input 인터페이스 구현 - Output 인터페이스 구현 - Console 구현체 구현 --- src/main/java/study/baseball/Console.java | 25 +++++++++++++++++++ .../java/study/baseball/engine/io/Input.java | 5 ++++ .../java/study/baseball/engine/io/Output.java | 7 ++++++ 3 files changed, 37 insertions(+) create mode 100644 src/main/java/study/baseball/Console.java create mode 100644 src/main/java/study/baseball/engine/io/Input.java create mode 100644 src/main/java/study/baseball/engine/io/Output.java diff --git a/src/main/java/study/baseball/Console.java b/src/main/java/study/baseball/Console.java new file mode 100644 index 00000000..f68513ea --- /dev/null +++ b/src/main/java/study/baseball/Console.java @@ -0,0 +1,25 @@ +package study.baseball; + +import java.util.Scanner; +import study.baseball.engine.io.Input; +import study.baseball.engine.io.Output; + +public class Console implements Input, Output { + private final Scanner scanner = new Scanner(System.in); + + @Override + public String input(String message) { + System.out.print(message); + return scanner.nextLine(); + } + + @Override + public void printError(String message) { + System.out.println("[ERROR] : " + message); + } + + @Override + public void printOutput(String message) { + System.out.println(message); + } +} diff --git a/src/main/java/study/baseball/engine/io/Input.java b/src/main/java/study/baseball/engine/io/Input.java new file mode 100644 index 00000000..0004c54b --- /dev/null +++ b/src/main/java/study/baseball/engine/io/Input.java @@ -0,0 +1,5 @@ +package study.baseball.engine.io; + +public interface Input { + String input(String s); +} diff --git a/src/main/java/study/baseball/engine/io/Output.java b/src/main/java/study/baseball/engine/io/Output.java new file mode 100644 index 00000000..aeee3d0a --- /dev/null +++ b/src/main/java/study/baseball/engine/io/Output.java @@ -0,0 +1,7 @@ +package study.baseball.engine.io; + +public interface Output { + void printError(String s); + + void printOutput(String s); +} From abcc6ee290ad66419815b337d6687febfebc8f8c Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 03:19:25 +0900 Subject: [PATCH 08/19] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20-=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/study/baseball/App.java | 5 +++- .../java/study/baseball/engine/Baseball.java | 28 +++++++++++++++---- .../study/baseball/engine/InputValidator.java | 6 ++-- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0c80534e..50431b62 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) ## 구현할 기능 목록 -- [ ] 숫자 입력 +- [x] 숫자 입력 - [x] 입력값 검증 (1 ~ 9 사이의 숫자 3개, 숫자 중복 검사) - [x] 값 Parsing ("234" => [2, 3, 4]) - [x] 랜덤 숫자 생성 diff --git a/src/main/java/study/baseball/App.java b/src/main/java/study/baseball/App.java index a384b42c..d0160c6c 100644 --- a/src/main/java/study/baseball/App.java +++ b/src/main/java/study/baseball/App.java @@ -4,13 +4,16 @@ import study.baseball.engine.Baseball; import study.baseball.engine.InputParser; import study.baseball.engine.InputValidator; +import study.baseball.engine.NumberGenerator; public class App { public static void main(String[] args) { + Console console = new Console(); Pattern regex = Pattern.compile("[0-9]{3}"); InputValidator validator = new InputValidator(regex); InputParser parser = new InputParser(); - Baseball baseball = new Baseball(validator, parser); + NumberGenerator numberGenerator = new NumberGenerator(); + Baseball baseball = new Baseball(console, validator, parser, numberGenerator); baseball.run(); } diff --git a/src/main/java/study/baseball/engine/Baseball.java b/src/main/java/study/baseball/engine/Baseball.java index 9bc52413..b48905d7 100644 --- a/src/main/java/study/baseball/engine/Baseball.java +++ b/src/main/java/study/baseball/engine/Baseball.java @@ -1,16 +1,34 @@ package study.baseball.engine; +import study.baseball.Console; +import study.baseball.engine.model.Numbers; + public class Baseball implements Runnable { - private final InputValidator inputValidator; - private final InputParser inputParser; + private final Console console; + private final InputValidator validator; + private final InputParser parser; + private final NumberGenerator numberGenerator; - public Baseball(InputValidator inputValidator, InputParser inputParser) { - this.inputValidator = inputValidator; - this.inputParser = inputParser; + public Baseball(Console console, InputValidator inputValidator, InputParser inputParser, + NumberGenerator numberGenerator) { + this.console = console; + this.validator = inputValidator; + this.parser = inputParser; + this.numberGenerator = numberGenerator; } @Override public void run() { + try { + proceedGame(); + } catch (RuntimeException exception) { + console.printError(exception.getMessage()); + } + } + private void proceedGame() { + String input = console.input("숫자를 입력해주세요 : "); + validator.checkValidFormat(input); + Numbers answer = numberGenerator.generateRandomNumber(); } } diff --git a/src/main/java/study/baseball/engine/InputValidator.java b/src/main/java/study/baseball/engine/InputValidator.java index 095b1f7a..341b0f97 100644 --- a/src/main/java/study/baseball/engine/InputValidator.java +++ b/src/main/java/study/baseball/engine/InputValidator.java @@ -13,7 +13,9 @@ public InputValidator(Pattern regex) { this.regex = regex; } - public boolean isValidFormat(String input) { - return regex.matcher(input).matches(); + public void checkValidFormat(String input) { + if(!regex.matcher(input).matches()) { + throw new RuntimeException("입력의 형식이 잘못되었습니다."); + } } } From 39f4e89ed7be71768b16665fd09cf04d3787e43e Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 03:33:27 +0900 Subject: [PATCH 09/19] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EA=B0=92=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BallCount 모델 생성 - Numbers 모델 내 ball 수 판단 메소드 구현 - Numbers 모델 내 strike 수 판단 메소드 구현 --- .../java/study/baseball/engine/Baseball.java | 4 ++++ .../baseball/engine/model/BallCount.java | 18 +++++++++++++++ .../study/baseball/engine/model/Numbers.java | 22 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 src/main/java/study/baseball/engine/model/BallCount.java diff --git a/src/main/java/study/baseball/engine/Baseball.java b/src/main/java/study/baseball/engine/Baseball.java index b48905d7..146b8fd8 100644 --- a/src/main/java/study/baseball/engine/Baseball.java +++ b/src/main/java/study/baseball/engine/Baseball.java @@ -1,6 +1,8 @@ package study.baseball.engine; +import java.util.List; import study.baseball.Console; +import study.baseball.engine.model.BallCount; import study.baseball.engine.model.Numbers; public class Baseball implements Runnable { @@ -29,6 +31,8 @@ public void run() { private void proceedGame() { String input = console.input("숫자를 입력해주세요 : "); validator.checkValidFormat(input); + List parsedInput = parser.parseStringToIntegerList(input); Numbers answer = numberGenerator.generateRandomNumber(); + BallCount result = new BallCount(answer.getStrike(parsedInput), answer.getBall(parsedInput)); } } diff --git a/src/main/java/study/baseball/engine/model/BallCount.java b/src/main/java/study/baseball/engine/model/BallCount.java new file mode 100644 index 00000000..d71ca184 --- /dev/null +++ b/src/main/java/study/baseball/engine/model/BallCount.java @@ -0,0 +1,18 @@ +package study.baseball.engine.model; + +public class BallCount { + private int strike; + private int ball; + public BallCount(int strike, int ball) { + this.strike = strike; + this.ball = ball; + } + + public int getStrike() { + return strike; + } + + public int getBall() { + return ball; + } +} diff --git a/src/main/java/study/baseball/engine/model/Numbers.java b/src/main/java/study/baseball/engine/model/Numbers.java index ee163e16..933cdc60 100644 --- a/src/main/java/study/baseball/engine/model/Numbers.java +++ b/src/main/java/study/baseball/engine/model/Numbers.java @@ -1,5 +1,9 @@ package study.baseball.engine.model; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; import java.util.Set; public class Numbers { @@ -8,4 +12,22 @@ public class Numbers { public Numbers(Set numbers) { this.numbers = numbers; } + + public Integer getBall(List input) { + Set sum = new HashSet<>(input); + sum.addAll(numbers); + return input.size() + numbers.size() - sum.size(); + } + + public Integer getStrike(List input) { + Iterator numbersIterator = numbers.iterator(); + int index = 0; + int strike = 0; + while (numbersIterator.hasNext()) { + if (Objects.equals(numbersIterator.next(), input.get(index++))) { + strike++; + } + } + return strike; + } } From 5b0338a601c74ab981bcee4946067ba0d34caba5 Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 03:54:27 +0900 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EA=B5=AC=EC=A1=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기본적인 게임 flow 구현 - 반복 가능하게 설계 --- README.md | 4 +- .../java/study/baseball/engine/Baseball.java | 40 +++++++++++++++++-- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 50431b62..6a0f7c4f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ - [x] 입력값 검증 (1 ~ 9 사이의 숫자 3개, 숫자 중복 검사) - [x] 값 Parsing ("234" => [2, 3, 4]) - [x] 랜덤 숫자 생성 -- [ ] 값 비교 ([2, 3, 4] vs [4, 5, 6] => 1개 겹침) +- [x] 값 비교 ([2, 3, 4] vs [4, 5, 6] => 1개 겹침) - [ ] 결과 판단 (1 => 1 스트라이크 2 볼) - [ ] 결과 출력 -- [ ] 게임 반복 진행 가능 +- [x] 게임 반복 진행 가능 diff --git a/src/main/java/study/baseball/engine/Baseball.java b/src/main/java/study/baseball/engine/Baseball.java index 146b8fd8..45f4d78a 100644 --- a/src/main/java/study/baseball/engine/Baseball.java +++ b/src/main/java/study/baseball/engine/Baseball.java @@ -21,18 +21,52 @@ public Baseball(Console console, InputValidator inputValidator, InputParser inpu @Override public void run() { + while (true) { + Numbers answer = numberGenerator.generateRandomNumber(); + while (saveGame(answer)); + if (askContinue()) { + continue; + } + break; + } + } + + private boolean saveGame(Numbers answer) { try { - proceedGame(); + return proceedGame(answer); } catch (RuntimeException exception) { console.printError(exception.getMessage()); + return true; } } - private void proceedGame() { + private boolean proceedGame(Numbers answer) { String input = console.input("숫자를 입력해주세요 : "); validator.checkValidFormat(input); List parsedInput = parser.parseStringToIntegerList(input); - Numbers answer = numberGenerator.generateRandomNumber(); BallCount result = new BallCount(answer.getStrike(parsedInput), answer.getBall(parsedInput)); + if (result.getStrike() == 3) { + console.printOutput("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + return false; + } + showResult(result); + return true; + } + + private boolean askContinue() { + while (true) { + String input = console.input("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + if (input.equals("1")) { + return true; + } + if (input.equals("2")) { + return false; + } + console.printError("잘못된 입력입니다."); + } + } + + private void showResult(BallCount ballCount) { + } } From c7656667136a821155420c7fe14894ce4307a04b Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 04:00:53 +0900 Subject: [PATCH 11/19] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=20=EB=B0=8F=20=EC=B6=9C=EB=A0=A5=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/study/baseball/engine/Baseball.java | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6a0f7c4f..8dd2a2d3 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,6 @@ - [x] 값 Parsing ("234" => [2, 3, 4]) - [x] 랜덤 숫자 생성 - [x] 값 비교 ([2, 3, 4] vs [4, 5, 6] => 1개 겹침) -- [ ] 결과 판단 (1 => 1 스트라이크 2 볼) -- [ ] 결과 출력 +- [x] 결과 판단 (1 => 1 스트라이크 2 볼) +- [x] 결과 출력 - [x] 게임 반복 진행 가능 diff --git a/src/main/java/study/baseball/engine/Baseball.java b/src/main/java/study/baseball/engine/Baseball.java index 45f4d78a..c43aa2f8 100644 --- a/src/main/java/study/baseball/engine/Baseball.java +++ b/src/main/java/study/baseball/engine/Baseball.java @@ -67,6 +67,13 @@ private boolean askContinue() { } private void showResult(BallCount ballCount) { - + StringBuilder output = new StringBuilder(); + if (ballCount.getStrike() > 0) { + output.append(ballCount.getStrike()).append(" 스트라이크 "); + } + if (ballCount.getBall() > 0) { + output.append(ballCount.getBall()).append(" 볼 "); + } + console.printOutput(output.toString()); } } From 8d8f4a6dd0d8b0780fc57a3e1cd280294d3b2061 Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 04:09:59 +0900 Subject: [PATCH 12/19] =?UTF-8?q?fix:=20ball=20=EC=88=98=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ball 수 판단 로직 수정 - 일치 수 0개일 시 출력 추가 - 기타 출력 일부 수정 --- README.md | 1 + src/main/java/study/baseball/engine/Baseball.java | 4 ++-- src/main/java/study/baseball/engine/model/Numbers.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8dd2a2d3..be09e5a6 100644 --- a/README.md +++ b/README.md @@ -15,3 +15,4 @@ - [x] 결과 판단 (1 => 1 스트라이크 2 볼) - [x] 결과 출력 - [x] 게임 반복 진행 가능 +- [ ] 테스트 구현 diff --git a/src/main/java/study/baseball/engine/Baseball.java b/src/main/java/study/baseball/engine/Baseball.java index c43aa2f8..9896dba3 100644 --- a/src/main/java/study/baseball/engine/Baseball.java +++ b/src/main/java/study/baseball/engine/Baseball.java @@ -55,7 +55,7 @@ private boolean proceedGame(Numbers answer) { private boolean askContinue() { while (true) { - String input = console.input("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String input = console.input("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n"); if (input.equals("1")) { return true; } @@ -74,6 +74,6 @@ private void showResult(BallCount ballCount) { if (ballCount.getBall() > 0) { output.append(ballCount.getBall()).append(" 볼 "); } - console.printOutput(output.toString()); + console.printOutput(output.toString().length() > 0 ? output.toString() : "낫싱"); } } diff --git a/src/main/java/study/baseball/engine/model/Numbers.java b/src/main/java/study/baseball/engine/model/Numbers.java index 933cdc60..27f1cca2 100644 --- a/src/main/java/study/baseball/engine/model/Numbers.java +++ b/src/main/java/study/baseball/engine/model/Numbers.java @@ -16,7 +16,7 @@ public Numbers(Set numbers) { public Integer getBall(List input) { Set sum = new HashSet<>(input); sum.addAll(numbers); - return input.size() + numbers.size() - sum.size(); + return input.size() + numbers.size() - sum.size() - getStrike(input); } public Integer getStrike(List input) { From 635ad9f17251cbbdee28eee07694b9a52ffa18ea Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 04:40:16 +0900 Subject: [PATCH 13/19] =?UTF-8?q?test:=20InputValidator=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 올바른 format의 input 테스트 - 올바르지 않은 format의 input 테스트 --- .../study/baseball/engine/InputValidator.java | 6 ++--- .../baseball/engine/InputValidatorTest.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 src/test/java/study/baseball/engine/InputValidatorTest.java diff --git a/src/main/java/study/baseball/engine/InputValidator.java b/src/main/java/study/baseball/engine/InputValidator.java index 341b0f97..3727fb27 100644 --- a/src/main/java/study/baseball/engine/InputValidator.java +++ b/src/main/java/study/baseball/engine/InputValidator.java @@ -1,8 +1,5 @@ package study.baseball.engine; -import java.util.HashSet; -import java.util.List; -import java.util.Set; import java.util.regex.Pattern; public class InputValidator { @@ -13,9 +10,10 @@ public InputValidator(Pattern regex) { this.regex = regex; } - public void checkValidFormat(String input) { + public boolean checkValidFormat(String input) { if(!regex.matcher(input).matches()) { throw new RuntimeException("입력의 형식이 잘못되었습니다."); } + return true; } } diff --git a/src/test/java/study/baseball/engine/InputValidatorTest.java b/src/test/java/study/baseball/engine/InputValidatorTest.java new file mode 100644 index 00000000..91c98cb5 --- /dev/null +++ b/src/test/java/study/baseball/engine/InputValidatorTest.java @@ -0,0 +1,25 @@ +package study.baseball.engine; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.regex.Pattern; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class InputValidatorTest { + Pattern regex = Pattern.compile("[0-9]{3}"); + private final InputValidator validator = new InputValidator(regex); + + @ParameterizedTest + @ValueSource(strings = {"123", "076", "234", "543", "932"}) + public void testValidInput(String input) { + assertThat(validator.checkValidFormat(input)).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = {"321312", "", " ", "dsfjasdflk", "fdf dfd !@#!@ d"}) + public void testInvalidFormatInput(String input) { + assertThatThrownBy(() -> {validator.checkValidFormat(input);}).isInstanceOf(RuntimeException.class).hasMessage("입력의 형식이 잘못되었습니다."); + } +} \ No newline at end of file From d48a06f6d14c6bfe365419b8df333c43ae58debe Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 04:49:57 +0900 Subject: [PATCH 14/19] =?UTF-8?q?test:=20InputParser=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputParser 테스트 구현 - 입력값 중복처리 제거 --- README.md | 2 +- .../study/baseball/engine/InputParser.java | 5 +---- .../baseball/engine/InputParserTest.java | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 src/test/java/study/baseball/engine/InputParserTest.java diff --git a/README.md b/README.md index be09e5a6..228d0d77 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## 구현할 기능 목록 - [x] 숫자 입력 -- [x] 입력값 검증 (1 ~ 9 사이의 숫자 3개, 숫자 중복 검사) +- [x] 입력값 검증 (1 ~ 9 사이의 숫자 3개) - [x] 값 Parsing ("234" => [2, 3, 4]) - [x] 랜덤 숫자 생성 - [x] 값 비교 ([2, 3, 4] vs [4, 5, 6] => 1개 겹침) diff --git a/src/main/java/study/baseball/engine/InputParser.java b/src/main/java/study/baseball/engine/InputParser.java index 0cea71b1..542c489d 100644 --- a/src/main/java/study/baseball/engine/InputParser.java +++ b/src/main/java/study/baseball/engine/InputParser.java @@ -4,15 +4,12 @@ import java.util.List; public class InputParser { - public List parseStringToIntegerList(String input) throws NumberFormatException { + public List parseStringToIntegerList(String input) { String[] inputArray = input.split(""); List result = new ArrayList<>(); for (String number:inputArray) { result.add(Integer.parseInt(number)); } - if (input.length() != result.size()) { - throw new RuntimeException("중복된 숫자가 존재합니다."); - } return result; } } diff --git a/src/test/java/study/baseball/engine/InputParserTest.java b/src/test/java/study/baseball/engine/InputParserTest.java new file mode 100644 index 00000000..d6b9d358 --- /dev/null +++ b/src/test/java/study/baseball/engine/InputParserTest.java @@ -0,0 +1,19 @@ +package study.baseball.engine; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class InputParserTest { + private final InputParser parser = new InputParser(); + + @ParameterizedTest + @ValueSource(strings = {"123", "076", "234", "543", "932"}) + public void testParseValidInput(String input) { + List numbers = parser.parseStringToIntegerList(input); + assertThat(numbers).hasSize(3); + } +} \ No newline at end of file From 77ccdf0cd1dd7a626b5e821cba86fcc7a3f75d64 Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 04:57:16 +0900 Subject: [PATCH 15/19] =?UTF-8?q?test:=20NumberGenerator=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../study/baseball/engine/model/Numbers.java | 4 ++++ .../baseball/engine/NumberGeneratorTest.java | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/test/java/study/baseball/engine/NumberGeneratorTest.java diff --git a/src/main/java/study/baseball/engine/model/Numbers.java b/src/main/java/study/baseball/engine/model/Numbers.java index 27f1cca2..b71c44fa 100644 --- a/src/main/java/study/baseball/engine/model/Numbers.java +++ b/src/main/java/study/baseball/engine/model/Numbers.java @@ -13,6 +13,10 @@ public Numbers(Set numbers) { this.numbers = numbers; } + public Set getNumbers() { + return numbers; + } + public Integer getBall(List input) { Set sum = new HashSet<>(input); sum.addAll(numbers); diff --git a/src/test/java/study/baseball/engine/NumberGeneratorTest.java b/src/test/java/study/baseball/engine/NumberGeneratorTest.java new file mode 100644 index 00000000..008ab5ba --- /dev/null +++ b/src/test/java/study/baseball/engine/NumberGeneratorTest.java @@ -0,0 +1,24 @@ +package study.baseball.engine; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Iterator; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import study.baseball.engine.model.Numbers; + +class NumberGeneratorTest { + private final NumberGenerator numberGenerator = new NumberGenerator(); + + @Test + public void testGenerateRandomNumbers() { + for (int i = 0; i < 10; i++) { + Numbers random = numberGenerator.generateRandomNumber(); + assertThat(random.getNumbers()).hasSize(3); + for (Integer integer : random.getNumbers()) { + assertThat(integer).isLessThan(10).isGreaterThanOrEqualTo(0); + } + } + } +} \ No newline at end of file From a05606d8bd8c144265aa7a39101a547ffee35263 Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 04:58:59 +0900 Subject: [PATCH 16/19] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/study/baseball/engine/Baseball.java | 3 ++- src/main/java/study/baseball/engine/InputParser.java | 2 +- src/main/java/study/baseball/engine/InputValidator.java | 2 +- src/main/java/study/baseball/engine/NumberGenerator.java | 3 ++- src/main/java/study/baseball/engine/model/BallCount.java | 1 + src/main/java/study/baseball/engine/model/Numbers.java | 1 + src/test/java/study/baseball/engine/InputParserTest.java | 1 - src/test/java/study/baseball/engine/InputValidatorTest.java | 4 +++- src/test/java/study/baseball/engine/NumberGeneratorTest.java | 3 --- 9 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/study/baseball/engine/Baseball.java b/src/main/java/study/baseball/engine/Baseball.java index 9896dba3..efca3b54 100644 --- a/src/main/java/study/baseball/engine/Baseball.java +++ b/src/main/java/study/baseball/engine/Baseball.java @@ -23,7 +23,8 @@ public Baseball(Console console, InputValidator inputValidator, InputParser inpu public void run() { while (true) { Numbers answer = numberGenerator.generateRandomNumber(); - while (saveGame(answer)); + while (saveGame(answer)) + ; if (askContinue()) { continue; } diff --git a/src/main/java/study/baseball/engine/InputParser.java b/src/main/java/study/baseball/engine/InputParser.java index 542c489d..0b2877fb 100644 --- a/src/main/java/study/baseball/engine/InputParser.java +++ b/src/main/java/study/baseball/engine/InputParser.java @@ -7,7 +7,7 @@ public class InputParser { public List parseStringToIntegerList(String input) { String[] inputArray = input.split(""); List result = new ArrayList<>(); - for (String number:inputArray) { + for (String number : inputArray) { result.add(Integer.parseInt(number)); } return result; diff --git a/src/main/java/study/baseball/engine/InputValidator.java b/src/main/java/study/baseball/engine/InputValidator.java index 3727fb27..ebb56d93 100644 --- a/src/main/java/study/baseball/engine/InputValidator.java +++ b/src/main/java/study/baseball/engine/InputValidator.java @@ -11,7 +11,7 @@ public InputValidator(Pattern regex) { } public boolean checkValidFormat(String input) { - if(!regex.matcher(input).matches()) { + if (!regex.matcher(input).matches()) { throw new RuntimeException("입력의 형식이 잘못되었습니다."); } return true; diff --git a/src/main/java/study/baseball/engine/NumberGenerator.java b/src/main/java/study/baseball/engine/NumberGenerator.java index f13af339..b306d83c 100644 --- a/src/main/java/study/baseball/engine/NumberGenerator.java +++ b/src/main/java/study/baseball/engine/NumberGenerator.java @@ -7,9 +7,10 @@ public class NumberGenerator { private final Random random = new Random(); + public Numbers generateRandomNumber() { Set randomNumbers = new LinkedHashSet<>(); - while(randomNumbers.size() < 3) { + while (randomNumbers.size() < 3) { randomNumbers.add(random.nextInt(10)); } return new Numbers(randomNumbers); diff --git a/src/main/java/study/baseball/engine/model/BallCount.java b/src/main/java/study/baseball/engine/model/BallCount.java index d71ca184..75db768f 100644 --- a/src/main/java/study/baseball/engine/model/BallCount.java +++ b/src/main/java/study/baseball/engine/model/BallCount.java @@ -3,6 +3,7 @@ public class BallCount { private int strike; private int ball; + public BallCount(int strike, int ball) { this.strike = strike; this.ball = ball; diff --git a/src/main/java/study/baseball/engine/model/Numbers.java b/src/main/java/study/baseball/engine/model/Numbers.java index b71c44fa..c5dc0415 100644 --- a/src/main/java/study/baseball/engine/model/Numbers.java +++ b/src/main/java/study/baseball/engine/model/Numbers.java @@ -9,6 +9,7 @@ public class Numbers { private final Set numbers; + public Numbers(Set numbers) { this.numbers = numbers; } diff --git a/src/test/java/study/baseball/engine/InputParserTest.java b/src/test/java/study/baseball/engine/InputParserTest.java index d6b9d358..c9ff5a2e 100644 --- a/src/test/java/study/baseball/engine/InputParserTest.java +++ b/src/test/java/study/baseball/engine/InputParserTest.java @@ -1,7 +1,6 @@ package study.baseball.engine; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.List; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/study/baseball/engine/InputValidatorTest.java b/src/test/java/study/baseball/engine/InputValidatorTest.java index 91c98cb5..fc835570 100644 --- a/src/test/java/study/baseball/engine/InputValidatorTest.java +++ b/src/test/java/study/baseball/engine/InputValidatorTest.java @@ -20,6 +20,8 @@ public void testValidInput(String input) { @ParameterizedTest @ValueSource(strings = {"321312", "", " ", "dsfjasdflk", "fdf dfd !@#!@ d"}) public void testInvalidFormatInput(String input) { - assertThatThrownBy(() -> {validator.checkValidFormat(input);}).isInstanceOf(RuntimeException.class).hasMessage("입력의 형식이 잘못되었습니다."); + assertThatThrownBy(() -> { + validator.checkValidFormat(input); + }).isInstanceOf(RuntimeException.class).hasMessage("입력의 형식이 잘못되었습니다."); } } \ No newline at end of file diff --git a/src/test/java/study/baseball/engine/NumberGeneratorTest.java b/src/test/java/study/baseball/engine/NumberGeneratorTest.java index 008ab5ba..e1bb1711 100644 --- a/src/test/java/study/baseball/engine/NumberGeneratorTest.java +++ b/src/test/java/study/baseball/engine/NumberGeneratorTest.java @@ -1,10 +1,7 @@ package study.baseball.engine; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import java.util.Iterator; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import study.baseball.engine.model.Numbers; From ddf2796fe868786e9511bcf0a61535d06c7d6ada Mon Sep 17 00:00:00 2001 From: park0503 Date: Thu, 22 Dec 2022 05:18:06 +0900 Subject: [PATCH 17/19] =?UTF-8?q?test:=20Numbers=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모든 스트라이크-볼 조합 테스트 --- .../baseball/engine/model/NumbersTest.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/test/java/study/baseball/engine/model/NumbersTest.java diff --git a/src/test/java/study/baseball/engine/model/NumbersTest.java b/src/test/java/study/baseball/engine/model/NumbersTest.java new file mode 100644 index 00000000..85b48fda --- /dev/null +++ b/src/test/java/study/baseball/engine/model/NumbersTest.java @@ -0,0 +1,95 @@ +package study.baseball.engine.model; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class NumbersTest { + @Test + public void testNothing() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(4, 5, 6)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(0); + assertThat(numbers.getBall(input)).isEqualTo(0); + } + + @Test + public void testOneBall() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(4, 1, 6)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(0); + assertThat(numbers.getBall(input)).isEqualTo(1); + } + + @Test + public void testTwoBall() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(2, 1, 6)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(0); + assertThat(numbers.getBall(input)).isEqualTo(2); + } + + @Test + public void testThreeBall() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(3, 1, 2)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(0); + assertThat(numbers.getBall(input)).isEqualTo(3); + } + + @Test + public void testOneStrike() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(1, 5, 6)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(1); + assertThat(numbers.getBall(input)).isEqualTo(0); + } + + @Test + public void testOneStrikeOneBall() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(1, 5, 2)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(1); + assertThat(numbers.getBall(input)).isEqualTo(1); + } + + @Test + public void testOneStrikeTwoBall() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(1, 3, 2)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(1); + assertThat(numbers.getBall(input)).isEqualTo(2); + } + + @Test + public void testTwoStrike() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(1, 2, 4)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(2); + assertThat(numbers.getBall(input)).isEqualTo(0); + } + + @Test + public void testThreeStrike() { + List input = Arrays.asList(1, 2, 3); + Set answer = new LinkedHashSet<>(Arrays.asList(1, 2, 3)); + Numbers numbers = new Numbers(answer); + assertThat(numbers.getStrike(input)).isEqualTo(3); + assertThat(numbers.getBall(input)).isEqualTo(0); + } +} \ No newline at end of file From 59be189abf6ed27ecb72721f297af7acf682ad99 Mon Sep 17 00:00:00 2001 From: park0503 Date: Mon, 26 Dec 2022 11:17:36 +0900 Subject: [PATCH 18/19] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EA=B0=92=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=EA=B2=80=EC=82=AC=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputParser의 parsing 메소드에 중복된 숫자 검사 로직 추가 --- src/main/java/study/baseball/engine/InputParser.java | 9 +++++++-- src/test/java/study/baseball/engine/InputParserTest.java | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/study/baseball/engine/InputParser.java b/src/main/java/study/baseball/engine/InputParser.java index 0b2877fb..37c12a6f 100644 --- a/src/main/java/study/baseball/engine/InputParser.java +++ b/src/main/java/study/baseball/engine/InputParser.java @@ -1,15 +1,20 @@ package study.baseball.engine; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; public class InputParser { public List parseStringToIntegerList(String input) { String[] inputArray = input.split(""); - List result = new ArrayList<>(); + Set result = new LinkedHashSet<>(); for (String number : inputArray) { result.add(Integer.parseInt(number)); } - return result; + if (result.size() < 3) { + throw new RuntimeException("중복된 숫자가 존재합니다."); + } + return new ArrayList<>(result); } } diff --git a/src/test/java/study/baseball/engine/InputParserTest.java b/src/test/java/study/baseball/engine/InputParserTest.java index c9ff5a2e..0abde42e 100644 --- a/src/test/java/study/baseball/engine/InputParserTest.java +++ b/src/test/java/study/baseball/engine/InputParserTest.java @@ -1,6 +1,7 @@ package study.baseball.engine; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.List; import org.junit.jupiter.params.ParameterizedTest; @@ -15,4 +16,12 @@ public void testParseValidInput(String input) { List numbers = parser.parseStringToIntegerList(input); assertThat(numbers).hasSize(3); } + + @ParameterizedTest + @ValueSource(strings = {"777", "112", "911", "707"}) + public void testParseDuplicatedInput(String input) { + assertThatThrownBy(() -> { + List numbers = parser.parseStringToIntegerList(input); + }).isInstanceOf(RuntimeException.class).hasMessage("중복된 숫자가 존재합니다."); + } } \ No newline at end of file From 0f0b6f2c49a789757a858a87eceb3b57f9df54f2 Mon Sep 17 00:00:00 2001 From: park0503 Date: Mon, 26 Dec 2022 11:20:19 +0900 Subject: [PATCH 19/19] =?UTF-8?q?refactor:=20Numbers=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=20=EC=9E=90=EB=A3=8C=EA=B5=AC=EC=A1=B0=20List=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/study/baseball/engine/model/Numbers.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/study/baseball/engine/model/Numbers.java b/src/main/java/study/baseball/engine/model/Numbers.java index c5dc0415..548a2de8 100644 --- a/src/main/java/study/baseball/engine/model/Numbers.java +++ b/src/main/java/study/baseball/engine/model/Numbers.java @@ -1,5 +1,6 @@ package study.baseball.engine.model; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -8,13 +9,13 @@ public class Numbers { - private final Set numbers; + private final List numbers; public Numbers(Set numbers) { - this.numbers = numbers; + this.numbers = new ArrayList<>(numbers); } - public Set getNumbers() { + public List getNumbers() { return numbers; }