From 5387a351736bb5384e263e68b582543f62767b55 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Sun, 11 Dec 2022 17:11:31 +0900 Subject: [PATCH 01/33] =?UTF-8?q?docs:=20=EA=B0=81=EC=A2=85=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기능 요구 사항, 실행 결과 예시, 프로그래밍 요구 사항 pdf 내용 README.md에 추가 --- README.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/README.md b/README.md index fcf3f057..13679ab5 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,63 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + + +## 기능 요구 사항 + +기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. + +- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞히면 승리한다. + - 예시) 상대방(컴퓨터)의 수가 425일 때 + - 123을 제시한 경우 : 1스트라이크 + - 456을 제시한 경우 : 1볼 1스트라이크 + - 789를 제시한 경우 : 낫싱 +- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 + 결과를 출력한다. +- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다. +- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. + +#### 실행 결과 예시 + +``` +숫자를 입력해주세요 : 123 +1스트라이크 1볼 +숫자를 입력해주세요 : 145 +1볼 +숫자를 입력해주세요 : 671 +2볼 +숫자를 입력해주세요 : 216 +1스트라이크 +숫자를 입력해주세요 : 713 +3스트라이크 +3개의 숫자를 모두 맞히셨습니다! 게임 종료 +게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요. +1 +숫자를 입력해주세요 : 123 +1스트라이크 1볼 +... +``` + +--- + +## 프로그래밍 요구 사항 - 메소드 분리 + +- 자바 코드 컨벤션을 지켜가며 프로그래밍한다. + - https://github.com/woowacourse/woowacourse-docs/tree/master/styleguide/java 참고 +- indent(인덴트, 들여쓰기) depth를 2가 넘지 않도록 구현한다. 1까지만 허용한다. + - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. + - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다. +- 자바 8에 추가된 stream api를 사용하지 않고 구현해야 한다. 단, 람다는 사용 가능하다. +- else 예약어를 쓰지 않는다. + - 힌트 : if 절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. + - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데, switch/case도 허용하지 않는다. +- 함수(또는 메소드)의 길이가 10라인을 넘어가지 않도록 구현한다. + - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다. + +## 프로그래밍 요구 사항 - 단위 테스트 + +- 로직에 단위 테스트를 구현한다. 단, UI(System.out, System.in, Scanner) 로직은 제외 + - 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다. + +- JUni5와 AssertJ 사용법에 익숙하지 않은 개발자는 첨부한 "학습테스트를 통해 JUnit 학습하기.pdf" 문서를 참고해 사용법을 익힌 후 JUnit5 기반 단위 테스트를 구현한다. + From dd8e5b25a75beca322c477d44efe63e6c8631f81 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Sun, 11 Dec 2022 17:12:07 +0900 Subject: [PATCH 02/33] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숫자 야구 게임 기능 목록 생성 및 정리 --- docs/README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..99880540 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,32 @@ +## 숫자 야구 게임 기능 목록 + +#### 게임 컨트롤러 `GameController` +- [ ] 최초에 게임 생성 +- [ ] 사용자의 정답 입력에 대해 결과 판정 후 출력 +- [ ] 3 스트라이크인 경우 해당 게임 종료 +- [ ] 게임이 끝난 후 추가 진행 여부 입력이 1인 경우 새 게임 생성 +- [ ] 게임이 끝난 후 추가 진행 여부 입력이 2인 경우 전체 게임 종료 + +#### 숫자 야구 게임 `BaseballGame` +- [ ] 최초 생성시 `NumberGenerator`를 통해 정답 생성 + +#### 컴퓨터 숫자 생성 `BaseballNumbersGenerator` +- [ ] `BaseballNumbers`(1부터 9까지 서로 다른 수로 이루어진 3자리의 수) 생성 + +#### 사용자의 입력 받음 `InputView` +- [ ] 사용자의 정답을 입력 받음 +- [ ] 사용자의 새 게임 진행 여부를 입력 받음 + +#### 메시지 출력 `OutputView` +- [ ] `StrikeBallCount`에 대한 결과 출력 + +#### 사용자의 정답 입력 검증 `InputUserAnswerValidator` +- [ ] 사용자의 정답 입력을 검증 +- [ ] 사용자의 정답 입력을 `BaseballNumbers`로 변환 + +#### 사용자의 새 게임 진행 여부 입력 검증 `InputRestartValidator` +- [ ] 사용자의 새 게임 진행 여부 입력을 검증 + +#### 결과 판정 `Judge` +- [ ] 게임의 정답과 사용자가 입력한 답을 비교하여 `StrikeBallCount` 생성 +- [ ] 각각의 숫자에 대해 포함된 여부, index가 같은 지 확인 From 00ef69c51cb54845703991f7192039ae2a778bb0 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Sun, 11 Dec 2022 17:13:30 +0900 Subject: [PATCH 03/33] =?UTF-8?q?chore:=20=EC=B5=9C=EC=B4=88=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 패키지 및 클래스 구조 생성 --- src/main/java/baseball/Application.java | 7 +++++++ src/main/java/baseball/BaseballNumbersGenerator.java | 4 ++++ src/main/java/baseball/controller/GameController.java | 9 +++++++++ src/main/java/baseball/domain/BaseballGame.java | 4 ++++ src/main/java/baseball/domain/BaseballNumbers.java | 4 ++++ src/main/java/baseball/domain/Judge.java | 4 ++++ src/main/java/baseball/domain/StrikeBallCount.java | 4 ++++ .../java/baseball/validator/InputRestartValidator.java | 4 ++++ .../baseball/validator/InputUserAnswerValidator.java | 4 ++++ src/main/java/baseball/validator/Validator.java | 4 ++++ src/main/java/baseball/view/InputView.java | 4 ++++ src/main/java/baseball/view/OutputView.java | 4 ++++ 12 files changed, 56 insertions(+) create mode 100644 src/main/java/baseball/Application.java create mode 100644 src/main/java/baseball/BaseballNumbersGenerator.java create mode 100644 src/main/java/baseball/controller/GameController.java create mode 100644 src/main/java/baseball/domain/BaseballGame.java create mode 100644 src/main/java/baseball/domain/BaseballNumbers.java create mode 100644 src/main/java/baseball/domain/Judge.java create mode 100644 src/main/java/baseball/domain/StrikeBallCount.java create mode 100644 src/main/java/baseball/validator/InputRestartValidator.java create mode 100644 src/main/java/baseball/validator/InputUserAnswerValidator.java create mode 100644 src/main/java/baseball/validator/Validator.java create mode 100644 src/main/java/baseball/view/InputView.java create mode 100644 src/main/java/baseball/view/OutputView.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java new file mode 100644 index 00000000..604e0559 --- /dev/null +++ b/src/main/java/baseball/Application.java @@ -0,0 +1,7 @@ +package baseball; + +public class Application { + public static void main(String[] args){ + + } +} diff --git a/src/main/java/baseball/BaseballNumbersGenerator.java b/src/main/java/baseball/BaseballNumbersGenerator.java new file mode 100644 index 00000000..7fea93ac --- /dev/null +++ b/src/main/java/baseball/BaseballNumbersGenerator.java @@ -0,0 +1,4 @@ +package baseball; + +public class BaseballNumbersGenerator { +} diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java new file mode 100644 index 00000000..fc63748f --- /dev/null +++ b/src/main/java/baseball/controller/GameController.java @@ -0,0 +1,9 @@ +package baseball.controller; + +import baseball.view.InputView; +import baseball.view.OutputView; + +public class GameController { + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); +} diff --git a/src/main/java/baseball/domain/BaseballGame.java b/src/main/java/baseball/domain/BaseballGame.java new file mode 100644 index 00000000..24a75cbb --- /dev/null +++ b/src/main/java/baseball/domain/BaseballGame.java @@ -0,0 +1,4 @@ +package baseball.domain; + +public class BaseballGame { +} diff --git a/src/main/java/baseball/domain/BaseballNumbers.java b/src/main/java/baseball/domain/BaseballNumbers.java new file mode 100644 index 00000000..a4a634e0 --- /dev/null +++ b/src/main/java/baseball/domain/BaseballNumbers.java @@ -0,0 +1,4 @@ +package baseball.domain; + +public class BaseballNumbers { +} diff --git a/src/main/java/baseball/domain/Judge.java b/src/main/java/baseball/domain/Judge.java new file mode 100644 index 00000000..343256ab --- /dev/null +++ b/src/main/java/baseball/domain/Judge.java @@ -0,0 +1,4 @@ +package baseball.domain; + +public class Judge { +} diff --git a/src/main/java/baseball/domain/StrikeBallCount.java b/src/main/java/baseball/domain/StrikeBallCount.java new file mode 100644 index 00000000..72c97c06 --- /dev/null +++ b/src/main/java/baseball/domain/StrikeBallCount.java @@ -0,0 +1,4 @@ +package baseball.domain; + +public class StrikeBallCount { +} diff --git a/src/main/java/baseball/validator/InputRestartValidator.java b/src/main/java/baseball/validator/InputRestartValidator.java new file mode 100644 index 00000000..70d43adc --- /dev/null +++ b/src/main/java/baseball/validator/InputRestartValidator.java @@ -0,0 +1,4 @@ +package baseball.validator; + +public class InputRestartValidator { +} diff --git a/src/main/java/baseball/validator/InputUserAnswerValidator.java b/src/main/java/baseball/validator/InputUserAnswerValidator.java new file mode 100644 index 00000000..69ed2fa2 --- /dev/null +++ b/src/main/java/baseball/validator/InputUserAnswerValidator.java @@ -0,0 +1,4 @@ +package baseball.validator; + +public class InputUserAnswerValidator { +} diff --git a/src/main/java/baseball/validator/Validator.java b/src/main/java/baseball/validator/Validator.java new file mode 100644 index 00000000..1d9cb38d --- /dev/null +++ b/src/main/java/baseball/validator/Validator.java @@ -0,0 +1,4 @@ +package baseball.validator; + +public class Validator { +} diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java new file mode 100644 index 00000000..6474b6e4 --- /dev/null +++ b/src/main/java/baseball/view/InputView.java @@ -0,0 +1,4 @@ +package baseball.view; + +public class InputView { +} diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java new file mode 100644 index 00000000..7483684f --- /dev/null +++ b/src/main/java/baseball/view/OutputView.java @@ -0,0 +1,4 @@ +package baseball.view; + +public class OutputView { +} From 78bf3a2aeae34d5c4a0e5370abd45dacd14de50f Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Sun, 11 Dec 2022 17:34:50 +0900 Subject: [PATCH 04/33] =?UTF-8?q?feat:=20Application.java=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 - InputView, OutputView, GameController 생성 - gameController 실행 --- src/main/java/baseball/Application.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 604e0559..48ffbc52 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,15 @@ package baseball; +import baseball.controller.GameController; +import baseball.view.InputView; +import baseball.view.OutputView; + public class Application { public static void main(String[] args){ + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + GameController gameController = new GameController(inputView, outputView); + gameController.play(); } } From d6cfe841283e32937d4dde2ee7fa56f93d439b6b Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Sun, 11 Dec 2022 17:44:16 +0900 Subject: [PATCH 05/33] =?UTF-8?q?feat:=20GameController=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 - 생성자를 통해 InputView, OutputView 초기화(final) - play() 메소드 구현 - 게임 초기화 후 실행 - 각 게임 종료 후 재실행 여부에 대한 입력을 받도록 구현 - playGame() 메소드 구현 : 각 게임 내에서의 실행 기능 - 사용자의 입력을 받아 StrikeBallCount 결과 생성 - 결과 출력 - 게임 종료 여부를 확인하여 종료할 때까지 실행 --- .../baseball/controller/GameController.java | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index fc63748f..db7d9355 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -1,9 +1,43 @@ package baseball.controller; +import baseball.BaseballNumbersGenerator; +import baseball.domain.BaseballGame; +import baseball.domain.StrikeBallCount; import baseball.view.InputView; import baseball.view.OutputView; public class GameController { - InputView inputView = new InputView(); - OutputView outputView = new OutputView(); + private final InputView inputView; + private final OutputView outputView; + private final BaseballNumbersGenerator baseballNumbersGenerator; + private BaseballGame baseballGame; + private StrikeBallCount strikeBallCount; + + public GameController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + baseballNumbersGenerator = new BaseballNumbersGenerator(); + } + + public void play() { + do { + initializeGame(); + playGame(); + } while (inputView.readInputRestart()); + } + + private void initializeGame() { + baseballGame = new BaseballGame(baseballNumbersGenerator.generate()); + } + + private void playGame() { + do { + strikeBallCount = baseballGame.getResult(inputView.readInputUserAnswer()); + printResult(); + } while (!strikeBallCount.getIsComplete()); + } + + private void printResult() { + outputView.printResult(strikeBallCount); + } } From d73dccae50de9a324a26b78b6665030602e19853 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Sun, 11 Dec 2022 18:00:39 +0900 Subject: [PATCH 06/33] =?UTF-8?q?feat:=20BaseballGame.java=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 - 생성자로 정답을 입력받고, 이를 활용한 심판 생성 - getResult() 메소드 구현 - userNumbers를 인자로 받아 판정 결과 반환 --- src/main/java/baseball/domain/BaseballGame.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/baseball/domain/BaseballGame.java b/src/main/java/baseball/domain/BaseballGame.java index 24a75cbb..9ac5882a 100644 --- a/src/main/java/baseball/domain/BaseballGame.java +++ b/src/main/java/baseball/domain/BaseballGame.java @@ -1,4 +1,11 @@ package baseball.domain; public class BaseballGame { + private final Judge judge; + public BaseballGame(BaseballNumbers baseballNumbers) { + judge = new Judge(baseballNumbers); + } + public StrikeBallCount getResult(BaseballNumbers userNumbers) { + return judge.judge(userNumbers); + } } From a387c28a718359e91cfd5499305083d841442357 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Sun, 11 Dec 2022 18:28:29 +0900 Subject: [PATCH 07/33] =?UTF-8?q?feat:=20Constant.java=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 게임 전반에서 쓰이는 상수를 관리하는 enum class - getValue() 메소드 생성 --- src/main/java/baseball/constant/Constant.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/baseball/constant/Constant.java diff --git a/src/main/java/baseball/constant/Constant.java b/src/main/java/baseball/constant/Constant.java new file mode 100644 index 00000000..04fad46e --- /dev/null +++ b/src/main/java/baseball/constant/Constant.java @@ -0,0 +1,15 @@ +package baseball.constant; + +public enum Constant { + LENGTH(3), MIN_RANGE(1), MAX_RANGE(9); + + private final int value; + + Constant(int number) { + this.value = number; + } + + public int getValue() { + return value; + } +} From ca86aa39e14245f29faf8083634cef6f4758564a Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Sun, 11 Dec 2022 18:37:28 +0900 Subject: [PATCH 08/33] =?UTF-8?q?feat:=20StrikeBallCount.java=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 - reset() 메소드 : 스트라이크, 볼 카운트 모두 0으로 초기화 - strikeCount, ballCount에 대한 getter 구현 - addStrikeCount(), addBallCount() : strikeCount, ballCount 각각을 1 늘리는 함수 - getIsComplete() : 길이와 strikeCount가 일치하는지 확인 -> 게임이 종료되는지 확인 --- .../java/baseball/domain/StrikeBallCount.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/baseball/domain/StrikeBallCount.java b/src/main/java/baseball/domain/StrikeBallCount.java index 72c97c06..eb7b9cbf 100644 --- a/src/main/java/baseball/domain/StrikeBallCount.java +++ b/src/main/java/baseball/domain/StrikeBallCount.java @@ -1,4 +1,36 @@ package baseball.domain; +import baseball.constant.Constant; + public class StrikeBallCount { + private int strikeCount; + private int ballCount; + private final int length; + + public StrikeBallCount(){ + length = Constant.LENGTH.getValue(); + } + + public void resetCounts(){ + strikeCount = 0; + ballCount = 0; + } + public void addStrikeCount(){ + strikeCount++; + } + public void addBallCount(){ + ballCount++; + } + + public int getStrikeCount(){ + return strikeCount; + } + + public int getBallCount(){ + return ballCount; + } + + public boolean getIsComplete() { + return strikeCount == length; + } } From 04533b29c15a015f03c13597ad14fb032c2a7dda Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 09:27:18 +0900 Subject: [PATCH 09/33] =?UTF-8?q?refactor:=20Judge=20->=20Referee=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 판정하는 메서드 judge()와의 이름 중복을 피하기 위해 클래스 명 수정 --- docs/README.md | 2 +- src/main/java/baseball/domain/BaseballGame.java | 6 +++--- src/main/java/baseball/domain/Judge.java | 4 ---- src/main/java/baseball/domain/Referee.java | 16 ++++++++++++++++ 4 files changed, 20 insertions(+), 8 deletions(-) delete mode 100644 src/main/java/baseball/domain/Judge.java create mode 100644 src/main/java/baseball/domain/Referee.java diff --git a/docs/README.md b/docs/README.md index 99880540..0df9edbf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,6 +27,6 @@ #### 사용자의 새 게임 진행 여부 입력 검증 `InputRestartValidator` - [ ] 사용자의 새 게임 진행 여부 입력을 검증 -#### 결과 판정 `Judge` +#### 결과 판정 `Referee` - [ ] 게임의 정답과 사용자가 입력한 답을 비교하여 `StrikeBallCount` 생성 - [ ] 각각의 숫자에 대해 포함된 여부, index가 같은 지 확인 diff --git a/src/main/java/baseball/domain/BaseballGame.java b/src/main/java/baseball/domain/BaseballGame.java index 9ac5882a..06a97f2d 100644 --- a/src/main/java/baseball/domain/BaseballGame.java +++ b/src/main/java/baseball/domain/BaseballGame.java @@ -1,11 +1,11 @@ package baseball.domain; public class BaseballGame { - private final Judge judge; + private final Referee referee; public BaseballGame(BaseballNumbers baseballNumbers) { - judge = new Judge(baseballNumbers); + referee = new Referee(baseballNumbers); } public StrikeBallCount getResult(BaseballNumbers userNumbers) { - return judge.judge(userNumbers); + return referee.judge(userNumbers); } } diff --git a/src/main/java/baseball/domain/Judge.java b/src/main/java/baseball/domain/Judge.java deleted file mode 100644 index 343256ab..00000000 --- a/src/main/java/baseball/domain/Judge.java +++ /dev/null @@ -1,4 +0,0 @@ -package baseball.domain; - -public class Judge { -} diff --git a/src/main/java/baseball/domain/Referee.java b/src/main/java/baseball/domain/Referee.java new file mode 100644 index 00000000..462250e1 --- /dev/null +++ b/src/main/java/baseball/domain/Referee.java @@ -0,0 +1,16 @@ +package baseball.domain; + +public class Referee { + private final BaseballNumbers answer; + private final StrikeBallCount strikeBallCount; + public Referee(BaseballNumbers answer) { + this.answer = answer; + this.strikeBallCount = new StrikeBallCount(); + } + + public StrikeBallCount judge(BaseballNumbers userNumbers) { + strikeBallCount.resetCounts(); + //구현 필요// + return strikeBallCount; + } +} From d623397e77e89671e00fac6c58f2961143ae8d54 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 13:00:01 +0900 Subject: [PATCH 10/33] =?UTF-8?q?feat:=20BaseballNumbers.java=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의 형태로 숫자 저장 - contains, add, isFull, getIndex 메소드를 구현 --- .../java/baseball/domain/BaseballNumbers.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/baseball/domain/BaseballNumbers.java b/src/main/java/baseball/domain/BaseballNumbers.java index a4a634e0..8629d3f5 100644 --- a/src/main/java/baseball/domain/BaseballNumbers.java +++ b/src/main/java/baseball/domain/BaseballNumbers.java @@ -1,4 +1,34 @@ package baseball.domain; +import baseball.constant.Constant; + +import java.util.ArrayList; +import java.util.List; + public class BaseballNumbers { + private List numbers; + private final int length = Constant.LENGTH.getValue(); + + public BaseballNumbers(){ + List numbers = new ArrayList<>(); + } + + public boolean contains(int number){ + return numbers.contains(number); + } + + public boolean add(int number){ + if (!contains(number)){ + numbers.add(number); + } + return isFull(); + } + + public boolean isFull(){ + return numbers.size() == length; + } + + public int getIndex(int number){ + return numbers.indexOf(number); + } } From 44857ae17832eb31f9b02541a9edbc28ef05c541 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 13:25:01 +0900 Subject: [PATCH 11/33] =?UTF-8?q?feat:=20BaseballNumbersGenerator.java=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 - java.util.Random 클래스 활용 - baseballNumbers.java의 add method 활용 --- .../baseball/BaseballNumbersGenerator.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/baseball/BaseballNumbersGenerator.java b/src/main/java/baseball/BaseballNumbersGenerator.java index 7fea93ac..70579274 100644 --- a/src/main/java/baseball/BaseballNumbersGenerator.java +++ b/src/main/java/baseball/BaseballNumbersGenerator.java @@ -1,4 +1,24 @@ package baseball; +import baseball.constant.Constant; +import baseball.domain.BaseballNumbers; + +import java.util.Random; + public class BaseballNumbersGenerator { + Random random; + private final int MIN = Constant.MIN_RANGE.getValue(); + private final int MAX = Constant.MAX_RANGE.getValue(); + public BaseballNumbersGenerator(){ + random = new Random(); + } + public BaseballNumbers generate() { + BaseballNumbers baseballNumbers = new BaseballNumbers(); + Boolean isFull = false; + while(!isFull) { + int nextNumber = MIN + random.nextInt(MAX-MIN); + isFull = baseballNumbers.add(nextNumber); + } + return baseballNumbers; + } } From 67965dc04c17cb0851bcbfb32771ea135aae5f2b Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 20:48:27 +0900 Subject: [PATCH 12/33] =?UTF-8?q?feat:=20OutputView.java=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 - StringBuilder 활용 - addString() 메서드를 구현하여 스트라이크, 볼을 StringBuilder에 더하는 과정을 한 번에 처리 - 스트라이크, 볼에 대한 문자열을 추가한 이후에도 비어있다면 낫싱을 추가 --- src/main/java/baseball/view/OutputView.java | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 7483684f..33759993 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,4 +1,27 @@ package baseball.view; +import baseball.domain.StrikeBallCount; + public class OutputView { + private final String STRIKE_KOR = "스트라이크 "; + private final String BALL_KOR = "볼"; + private final String NOTHING_KOR = "낫싱"; + private StringBuilder sb; + + public void printResult(StrikeBallCount strikeBallCount) { + sb = new StringBuilder(); + addString(strikeBallCount.getStrikeCount(), STRIKE_KOR); + addString(strikeBallCount.getBallCount(), BALL_KOR); + if (sb.length() == 0){ + sb.append(NOTHING_KOR); + } + System.out.println(sb.toString().trim()); + } + + public void addString(int num, String kor_string){ + if (num > 0){ + sb.append(num); + sb.append(kor_string); + } + } } From b894af08128c14f2090fbadef8199c686dc53115 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 21:06:40 +0900 Subject: [PATCH 13/33] =?UTF-8?q?feat:=20Referee.java=20=ED=8C=90=EC=A0=95?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84,=20BaseballNumbers?= =?UTF-8?q?=EC=9D=98=20=EC=88=AB=EC=9E=90=20getter=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - judge() 메소드 구현 - 길이를 가져오기 위해 length 생성 - 특정 자리 숫자 가져오기 위해 BaseballNumbers.getNumberAt() 메소드 추가 - 역할을 분리하여 각 자리에 따라 판정하는 메소드 분리 : judgeOneNumber() - judgeOneNumber() 메소드 구현 - 포함하는 경우 카운트를 수정하는 메소드 changeCount() 호출 - changeCounte() 메소드 구현 - 인덱스도 일치하는 경우 스트라이크, 아닌 경우 볼 카운트 1 증가 --- .../java/baseball/domain/BaseballNumbers.java | 7 ++++-- src/main/java/baseball/domain/Referee.java | 22 ++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/domain/BaseballNumbers.java b/src/main/java/baseball/domain/BaseballNumbers.java index 8629d3f5..a27a0a29 100644 --- a/src/main/java/baseball/domain/BaseballNumbers.java +++ b/src/main/java/baseball/domain/BaseballNumbers.java @@ -6,11 +6,11 @@ import java.util.List; public class BaseballNumbers { - private List numbers; + private final List numbers; private final int length = Constant.LENGTH.getValue(); public BaseballNumbers(){ - List numbers = new ArrayList<>(); + numbers = new ArrayList<>(); } public boolean contains(int number){ @@ -28,6 +28,9 @@ public boolean isFull(){ return numbers.size() == length; } + public int getNumberAt(int index){ + return numbers.get(index); + } public int getIndex(int number){ return numbers.indexOf(number); } diff --git a/src/main/java/baseball/domain/Referee.java b/src/main/java/baseball/domain/Referee.java index 462250e1..52097273 100644 --- a/src/main/java/baseball/domain/Referee.java +++ b/src/main/java/baseball/domain/Referee.java @@ -1,8 +1,11 @@ package baseball.domain; +import baseball.constant.Constant; + public class Referee { private final BaseballNumbers answer; private final StrikeBallCount strikeBallCount; + private final int length = Constant.LENGTH.getValue(); public Referee(BaseballNumbers answer) { this.answer = answer; this.strikeBallCount = new StrikeBallCount(); @@ -10,7 +13,24 @@ public Referee(BaseballNumbers answer) { public StrikeBallCount judge(BaseballNumbers userNumbers) { strikeBallCount.resetCounts(); - //구현 필요// + for (int index = 0; index < length; index++){ + int number = userNumbers.getNumberAt(index); + judgeOneNumber(index, number); + } return strikeBallCount; } + + private void judgeOneNumber(int index, int number){ + if (answer.contains(number)){ + changeCount(index, number); + } + } + + private void changeCount(int index, int number){ + if (index == answer.getIndex(number)){ + strikeBallCount.addStrikeCount(); + return; + } + strikeBallCount.addBallCount(); + } } From 51300858efb98af95d1a9b0947f27a1df43d3ac3 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 21:47:12 +0900 Subject: [PATCH 14/33] =?UTF-8?q?feat:=20=EC=B6=94=EC=83=81=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20Validator=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - validate() : 검증 후 원하는 변환 값을 반환하는 메소드 - removeSpace() : 공백을 제거하는 메소드 --- src/main/java/baseball/validator/Validator.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/validator/Validator.java b/src/main/java/baseball/validator/Validator.java index 1d9cb38d..ef9a09cd 100644 --- a/src/main/java/baseball/validator/Validator.java +++ b/src/main/java/baseball/validator/Validator.java @@ -1,4 +1,11 @@ package baseball.validator; -public class Validator { +public abstract class Validator { + static Object validate(String input) throws IllegalArgumentException { + return null; + } + + static String removeSpace(String input) { + return input.replaceAll(" ", ""); + } } From 21a8129f8b3211971581328c8408366e9b9e4559 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 21:50:26 +0900 Subject: [PATCH 15/33] =?UTF-8?q?feat:=20InputUserAnswerValidator=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84,=20BaseballNumbers=EC=9D=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 정규표현식을 활용하여 각 자리가 지정 범위 내에 포함되는지 여부와 길이 검증 - Hashset의 길이가 기존과 길이가 같은지 판정하여 중복이 없음을 검증 - BaseballNumbers의 생성자 추가 - 검증된 입력을 문자열 배열로 변환하여 인자로 제공 --- .../java/baseball/domain/BaseballNumbers.java | 7 +++++ .../validator/InputUserAnswerValidator.java | 26 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/domain/BaseballNumbers.java b/src/main/java/baseball/domain/BaseballNumbers.java index a27a0a29..01ebc7f6 100644 --- a/src/main/java/baseball/domain/BaseballNumbers.java +++ b/src/main/java/baseball/domain/BaseballNumbers.java @@ -13,6 +13,13 @@ public BaseballNumbers(){ numbers = new ArrayList<>(); } + public BaseballNumbers(String[] input){ + this(); + for (String num : input){ + this.add(Integer.parseInt(num)); + } + } + public boolean contains(int number){ return numbers.contains(number); } diff --git a/src/main/java/baseball/validator/InputUserAnswerValidator.java b/src/main/java/baseball/validator/InputUserAnswerValidator.java index 69ed2fa2..5e6b870c 100644 --- a/src/main/java/baseball/validator/InputUserAnswerValidator.java +++ b/src/main/java/baseball/validator/InputUserAnswerValidator.java @@ -1,4 +1,28 @@ package baseball.validator; -public class InputUserAnswerValidator { +import baseball.constant.Constant; +import baseball.domain.BaseballNumbers; +import java.util.Arrays; +import java.util.HashSet; +import java.util.regex.Pattern; + +public class InputUserAnswerValidator extends Validator { + private static final int MIN = Constant.MIN_RANGE.getValue(); + private static final int MAX = Constant.MAX_RANGE.getValue(); + private static final int LENGTH = Constant.LENGTH.getValue(); + private static final String ANSWER_REGEX = String.format("^[%d-%d]{%d}$", MIN, MAX, LENGTH); + public static BaseballNumbers validate(String inputAnswer) { + String trimmedInput = removeSpace(inputAnswer); + if (Pattern.matches(ANSWER_REGEX, trimmedInput)){ + return validateUniqueness(trimmedInput); + } + throw new IllegalArgumentException(); + } + + public static BaseballNumbers validateUniqueness(String input){ + if (new HashSet<>(Arrays.asList(input.split(""))).size() == input.length()){ + return new BaseballNumbers(input.split("")); + } + throw new IllegalArgumentException(); + } } From 2f25dabc23c765b83c03dda6bc0a1185414405cb Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 21:51:04 +0900 Subject: [PATCH 16/33] =?UTF-8?q?refactor:=20BaseballNumbersGenerator=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Boolean -> boolean --- src/main/java/baseball/BaseballNumbersGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/BaseballNumbersGenerator.java b/src/main/java/baseball/BaseballNumbersGenerator.java index 70579274..3f890d93 100644 --- a/src/main/java/baseball/BaseballNumbersGenerator.java +++ b/src/main/java/baseball/BaseballNumbersGenerator.java @@ -14,7 +14,7 @@ public BaseballNumbersGenerator(){ } public BaseballNumbers generate() { BaseballNumbers baseballNumbers = new BaseballNumbers(); - Boolean isFull = false; + boolean isFull = false; while(!isFull) { int nextNumber = MIN + random.nextInt(MAX-MIN); isFull = baseballNumbers.add(nextNumber); From 895c3202ff8e1c0a88d94a3efb85a2be3f1307f6 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 21:59:42 +0900 Subject: [PATCH 17/33] =?UTF-8?q?feat:=20InputRestartValidator.java=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 - validate 함수 구현 - 잘못된 입력의 경우 예외 처리 --- .../baseball/validator/InputRestartValidator.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/validator/InputRestartValidator.java b/src/main/java/baseball/validator/InputRestartValidator.java index 70d43adc..bf2ca263 100644 --- a/src/main/java/baseball/validator/InputRestartValidator.java +++ b/src/main/java/baseball/validator/InputRestartValidator.java @@ -1,4 +1,17 @@ package baseball.validator; -public class InputRestartValidator { +public class InputRestartValidator extends Validator{ + private static final String RESTART = "1"; + private static final String QUIT = "2"; + + public static Boolean validate(String input) { + String trimmedInput = removeSpace(input); + if (trimmedInput.equals(RESTART)){ + return true; + } + if (trimmedInput.equals(QUIT)){ + return false; + } + throw new IllegalArgumentException(); + } } From 3ccf51b5786f32c5d41ddd5ba9ab780e75c3ad77 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 22:27:46 +0900 Subject: [PATCH 18/33] =?UTF-8?q?feat:=20InputView.java=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/baseball/view/InputView.java | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 6474b6e4..58754993 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,4 +1,35 @@ package baseball.view; +import baseball.domain.BaseballNumbers; +import baseball.validator.InputRestartValidator; +import baseball.validator.InputUserAnswerValidator; +import java.util.Scanner; + public class InputView { + private final String INPUT_ANSWER_STRING = "숫자를 입력해주세요 : "; + private final String INPUT_RESTART_STRING = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + private final Scanner sc; + + public InputView(){ + sc = new Scanner(System.in); + } + public BaseballNumbers readInputUserAnswer() { + System.out.print(INPUT_ANSWER_STRING); + try { + return InputUserAnswerValidator.validate(sc.next()); + } catch (IllegalArgumentException e){ + System.out.println(e.getMessage()); + return readInputUserAnswer(); + } + } + + public boolean readInputRestart() { + System.out.println(INPUT_RESTART_STRING); + try { + return InputRestartValidator.validate(sc.next()); + } catch (IllegalArgumentException e){ + System.out.println(e.getMessage()); + return readInputRestart(); + } + } } From 2a399bec37ca89150b821ae7ef6c42f630781676 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 22:39:58 +0900 Subject: [PATCH 19/33] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EA=B2=80=EC=A6=9D=20=EA=B3=BC=EC=A0=95?= =?UTF-8?q?=EC=97=90=EC=84=9C=EC=9D=98=20=EC=98=88=EC=99=B8=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/validator/InputRestartValidator.java | 3 ++- .../java/baseball/validator/InputUserAnswerValidator.java | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/validator/InputRestartValidator.java b/src/main/java/baseball/validator/InputRestartValidator.java index bf2ca263..03675ee6 100644 --- a/src/main/java/baseball/validator/InputRestartValidator.java +++ b/src/main/java/baseball/validator/InputRestartValidator.java @@ -3,6 +3,7 @@ public class InputRestartValidator extends Validator{ private static final String RESTART = "1"; private static final String QUIT = "2"; + private static final String INVALID_RESTART_INPUT_ERROR_MESSAGE = "[ERROR] 입력을 확인해주세요."; public static Boolean validate(String input) { String trimmedInput = removeSpace(input); @@ -12,6 +13,6 @@ public static Boolean validate(String input) { if (trimmedInput.equals(QUIT)){ return false; } - throw new IllegalArgumentException(); + throw new IllegalArgumentException(INVALID_RESTART_INPUT_ERROR_MESSAGE); } } diff --git a/src/main/java/baseball/validator/InputUserAnswerValidator.java b/src/main/java/baseball/validator/InputUserAnswerValidator.java index 5e6b870c..43f99698 100644 --- a/src/main/java/baseball/validator/InputUserAnswerValidator.java +++ b/src/main/java/baseball/validator/InputUserAnswerValidator.java @@ -10,19 +10,22 @@ public class InputUserAnswerValidator extends Validator { private static final int MIN = Constant.MIN_RANGE.getValue(); private static final int MAX = Constant.MAX_RANGE.getValue(); private static final int LENGTH = Constant.LENGTH.getValue(); + private static final String REGEX_ERROR_MESSAGE_FORMAT = "[ERROR] 형식에 맞게 입력하세요 : 중복이 없는 %d과 %d 사이의 %d자리 수"; + private static final String DUPLICATE_ERROR_MESSAGE = "[ERROR] 중복이 없어야 합니다."; + private static final String ANSWER_REGEX = String.format("^[%d-%d]{%d}$", MIN, MAX, LENGTH); public static BaseballNumbers validate(String inputAnswer) { String trimmedInput = removeSpace(inputAnswer); if (Pattern.matches(ANSWER_REGEX, trimmedInput)){ return validateUniqueness(trimmedInput); } - throw new IllegalArgumentException(); + throw new IllegalArgumentException(String.format(REGEX_ERROR_MESSAGE_FORMAT, MIN, MAX, LENGTH)); } public static BaseballNumbers validateUniqueness(String input){ if (new HashSet<>(Arrays.asList(input.split(""))).size() == input.length()){ return new BaseballNumbers(input.split("")); } - throw new IllegalArgumentException(); + throw new IllegalArgumentException(DUPLICATE_ERROR_MESSAGE); } } From 98c5dcd5928a7ecc86d817679d83509aa56915a8 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 22:41:11 +0900 Subject: [PATCH 20/33] =?UTF-8?q?refactor:=20=EC=A0=95=EB=8B=B5=20?= =?UTF-8?q?=EC=8B=9C=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=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 - 기존 누락된 "3개의 숫자를 모두 맞히셨습니다! 게임 종료" 문자열 출력 추가 --- src/main/java/baseball/controller/GameController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index db7d9355..29f72a91 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -1,12 +1,15 @@ package baseball.controller; import baseball.BaseballNumbersGenerator; +import baseball.constant.Constant; import baseball.domain.BaseballGame; import baseball.domain.StrikeBallCount; import baseball.view.InputView; import baseball.view.OutputView; public class GameController { + private static final String END_FORMAT = "%d개의 숫자를 모두 맞히셨습니다! 게임 종료"; + private static final String END_MESSAGE = String.format(END_FORMAT, Constant.LENGTH.getValue()); private final InputView inputView; private final OutputView outputView; private final BaseballNumbersGenerator baseballNumbersGenerator; @@ -23,6 +26,7 @@ public void play() { do { initializeGame(); playGame(); + System.out.println(END_MESSAGE); } while (inputView.readInputRestart()); } From 3f378110e8530efc2427894bb64fc5325d9bc5d1 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 22:44:00 +0900 Subject: [PATCH 21/33] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 3 +-- .../baseball/BaseballNumbersGenerator.java | 8 +++++--- src/main/java/baseball/constant/Constant.java | 4 +++- .../java/baseball/domain/BaseballGame.java | 2 ++ .../java/baseball/domain/BaseballNumbers.java | 19 ++++++++++--------- src/main/java/baseball/domain/Referee.java | 11 ++++++----- .../java/baseball/domain/StrikeBallCount.java | 14 ++++++++------ .../validator/InputRestartValidator.java | 6 +++--- .../validator/InputUserAnswerValidator.java | 8 +++++--- src/main/java/baseball/view/InputView.java | 8 +++++--- src/main/java/baseball/view/OutputView.java | 9 +++++---- 11 files changed, 53 insertions(+), 39 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 48ffbc52..157994c7 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -5,10 +5,9 @@ import baseball.view.OutputView; public class Application { - public static void main(String[] args){ + public static void main(String[] args) { InputView inputView = new InputView(); OutputView outputView = new OutputView(); - GameController gameController = new GameController(inputView, outputView); gameController.play(); } diff --git a/src/main/java/baseball/BaseballNumbersGenerator.java b/src/main/java/baseball/BaseballNumbersGenerator.java index 3f890d93..72959dba 100644 --- a/src/main/java/baseball/BaseballNumbersGenerator.java +++ b/src/main/java/baseball/BaseballNumbersGenerator.java @@ -9,14 +9,16 @@ public class BaseballNumbersGenerator { Random random; private final int MIN = Constant.MIN_RANGE.getValue(); private final int MAX = Constant.MAX_RANGE.getValue(); - public BaseballNumbersGenerator(){ + + public BaseballNumbersGenerator() { random = new Random(); } + public BaseballNumbers generate() { BaseballNumbers baseballNumbers = new BaseballNumbers(); boolean isFull = false; - while(!isFull) { - int nextNumber = MIN + random.nextInt(MAX-MIN); + while (!isFull) { + int nextNumber = MIN + random.nextInt(MAX - MIN); isFull = baseballNumbers.add(nextNumber); } return baseballNumbers; diff --git a/src/main/java/baseball/constant/Constant.java b/src/main/java/baseball/constant/Constant.java index 04fad46e..f88b3285 100644 --- a/src/main/java/baseball/constant/Constant.java +++ b/src/main/java/baseball/constant/Constant.java @@ -1,7 +1,9 @@ package baseball.constant; public enum Constant { - LENGTH(3), MIN_RANGE(1), MAX_RANGE(9); + LENGTH(3), + MIN_RANGE(1), + MAX_RANGE(9); private final int value; diff --git a/src/main/java/baseball/domain/BaseballGame.java b/src/main/java/baseball/domain/BaseballGame.java index 06a97f2d..22b79861 100644 --- a/src/main/java/baseball/domain/BaseballGame.java +++ b/src/main/java/baseball/domain/BaseballGame.java @@ -2,9 +2,11 @@ public class BaseballGame { private final Referee referee; + public BaseballGame(BaseballNumbers baseballNumbers) { referee = new Referee(baseballNumbers); } + public StrikeBallCount getResult(BaseballNumbers userNumbers) { return referee.judge(userNumbers); } diff --git a/src/main/java/baseball/domain/BaseballNumbers.java b/src/main/java/baseball/domain/BaseballNumbers.java index 01ebc7f6..b71d8a9b 100644 --- a/src/main/java/baseball/domain/BaseballNumbers.java +++ b/src/main/java/baseball/domain/BaseballNumbers.java @@ -9,36 +9,37 @@ public class BaseballNumbers { private final List numbers; private final int length = Constant.LENGTH.getValue(); - public BaseballNumbers(){ + public BaseballNumbers() { numbers = new ArrayList<>(); } - public BaseballNumbers(String[] input){ + public BaseballNumbers(String[] input) { this(); - for (String num : input){ + for (String num : input) { this.add(Integer.parseInt(num)); } } - public boolean contains(int number){ + public boolean contains(int number) { return numbers.contains(number); } - public boolean add(int number){ - if (!contains(number)){ + public boolean add(int number) { + if (!contains(number)) { numbers.add(number); } return isFull(); } - public boolean isFull(){ + public boolean isFull() { return numbers.size() == length; } - public int getNumberAt(int index){ + public int getNumberAt(int index) { return numbers.get(index); } - public int getIndex(int number){ + + public int getIndex(int number) { return numbers.indexOf(number); } } diff --git a/src/main/java/baseball/domain/Referee.java b/src/main/java/baseball/domain/Referee.java index 52097273..58d388f9 100644 --- a/src/main/java/baseball/domain/Referee.java +++ b/src/main/java/baseball/domain/Referee.java @@ -6,6 +6,7 @@ public class Referee { private final BaseballNumbers answer; private final StrikeBallCount strikeBallCount; private final int length = Constant.LENGTH.getValue(); + public Referee(BaseballNumbers answer) { this.answer = answer; this.strikeBallCount = new StrikeBallCount(); @@ -13,21 +14,21 @@ public Referee(BaseballNumbers answer) { public StrikeBallCount judge(BaseballNumbers userNumbers) { strikeBallCount.resetCounts(); - for (int index = 0; index < length; index++){ + for (int index = 0; index < length; index++) { int number = userNumbers.getNumberAt(index); judgeOneNumber(index, number); } return strikeBallCount; } - private void judgeOneNumber(int index, int number){ - if (answer.contains(number)){ + private void judgeOneNumber(int index, int number) { + if (answer.contains(number)) { changeCount(index, number); } } - private void changeCount(int index, int number){ - if (index == answer.getIndex(number)){ + private void changeCount(int index, int number) { + if (index == answer.getIndex(number)) { strikeBallCount.addStrikeCount(); return; } diff --git a/src/main/java/baseball/domain/StrikeBallCount.java b/src/main/java/baseball/domain/StrikeBallCount.java index eb7b9cbf..610a05ae 100644 --- a/src/main/java/baseball/domain/StrikeBallCount.java +++ b/src/main/java/baseball/domain/StrikeBallCount.java @@ -7,26 +7,28 @@ public class StrikeBallCount { private int ballCount; private final int length; - public StrikeBallCount(){ + public StrikeBallCount() { length = Constant.LENGTH.getValue(); } - public void resetCounts(){ + public void resetCounts() { strikeCount = 0; ballCount = 0; } - public void addStrikeCount(){ + + public void addStrikeCount() { strikeCount++; } - public void addBallCount(){ + + public void addBallCount() { ballCount++; } - public int getStrikeCount(){ + public int getStrikeCount() { return strikeCount; } - public int getBallCount(){ + public int getBallCount() { return ballCount; } diff --git a/src/main/java/baseball/validator/InputRestartValidator.java b/src/main/java/baseball/validator/InputRestartValidator.java index 03675ee6..c9ab54a4 100644 --- a/src/main/java/baseball/validator/InputRestartValidator.java +++ b/src/main/java/baseball/validator/InputRestartValidator.java @@ -1,16 +1,16 @@ package baseball.validator; -public class InputRestartValidator extends Validator{ +public class InputRestartValidator extends Validator { private static final String RESTART = "1"; private static final String QUIT = "2"; private static final String INVALID_RESTART_INPUT_ERROR_MESSAGE = "[ERROR] 입력을 확인해주세요."; public static Boolean validate(String input) { String trimmedInput = removeSpace(input); - if (trimmedInput.equals(RESTART)){ + if (trimmedInput.equals(RESTART)) { return true; } - if (trimmedInput.equals(QUIT)){ + if (trimmedInput.equals(QUIT)) { return false; } throw new IllegalArgumentException(INVALID_RESTART_INPUT_ERROR_MESSAGE); diff --git a/src/main/java/baseball/validator/InputUserAnswerValidator.java b/src/main/java/baseball/validator/InputUserAnswerValidator.java index 43f99698..10cebada 100644 --- a/src/main/java/baseball/validator/InputUserAnswerValidator.java +++ b/src/main/java/baseball/validator/InputUserAnswerValidator.java @@ -2,6 +2,7 @@ import baseball.constant.Constant; import baseball.domain.BaseballNumbers; + import java.util.Arrays; import java.util.HashSet; import java.util.regex.Pattern; @@ -14,16 +15,17 @@ public class InputUserAnswerValidator extends Validator { private static final String DUPLICATE_ERROR_MESSAGE = "[ERROR] 중복이 없어야 합니다."; private static final String ANSWER_REGEX = String.format("^[%d-%d]{%d}$", MIN, MAX, LENGTH); + public static BaseballNumbers validate(String inputAnswer) { String trimmedInput = removeSpace(inputAnswer); - if (Pattern.matches(ANSWER_REGEX, trimmedInput)){ + if (Pattern.matches(ANSWER_REGEX, trimmedInput)) { return validateUniqueness(trimmedInput); } throw new IllegalArgumentException(String.format(REGEX_ERROR_MESSAGE_FORMAT, MIN, MAX, LENGTH)); } - public static BaseballNumbers validateUniqueness(String input){ - if (new HashSet<>(Arrays.asList(input.split(""))).size() == input.length()){ + public static BaseballNumbers validateUniqueness(String input) { + if (new HashSet<>(Arrays.asList(input.split(""))).size() == input.length()) { return new BaseballNumbers(input.split("")); } throw new IllegalArgumentException(DUPLICATE_ERROR_MESSAGE); diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 58754993..10f12bfb 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -3,6 +3,7 @@ import baseball.domain.BaseballNumbers; import baseball.validator.InputRestartValidator; import baseball.validator.InputUserAnswerValidator; + import java.util.Scanner; public class InputView { @@ -10,14 +11,15 @@ public class InputView { private final String INPUT_RESTART_STRING = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; private final Scanner sc; - public InputView(){ + public InputView() { sc = new Scanner(System.in); } + public BaseballNumbers readInputUserAnswer() { System.out.print(INPUT_ANSWER_STRING); try { return InputUserAnswerValidator.validate(sc.next()); - } catch (IllegalArgumentException e){ + } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); return readInputUserAnswer(); } @@ -27,7 +29,7 @@ public boolean readInputRestart() { System.out.println(INPUT_RESTART_STRING); try { return InputRestartValidator.validate(sc.next()); - } catch (IllegalArgumentException e){ + } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); return readInputRestart(); } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 33759993..729ff702 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -12,14 +12,15 @@ public void printResult(StrikeBallCount strikeBallCount) { sb = new StringBuilder(); addString(strikeBallCount.getStrikeCount(), STRIKE_KOR); addString(strikeBallCount.getBallCount(), BALL_KOR); - if (sb.length() == 0){ + if (sb.length() == 0) { sb.append(NOTHING_KOR); } - System.out.println(sb.toString().trim()); + System.out.println(sb.toString() + .trim()); } - public void addString(int num, String kor_string){ - if (num > 0){ + public void addString(int num, String kor_string) { + if (num > 0) { sb.append(num); sb.append(kor_string); } From 543f110f608105d5222314b939be6de6cabfe3cf Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 22:49:49 +0900 Subject: [PATCH 22/33] =?UTF-8?q?docs:=20Readme.md=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Readme.md 기능 목록 추가 - 구현된 기능 체크 --- docs/README.md | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0df9edbf..45b06542 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,32 +1,33 @@ ## 숫자 야구 게임 기능 목록 #### 게임 컨트롤러 `GameController` -- [ ] 최초에 게임 생성 -- [ ] 사용자의 정답 입력에 대해 결과 판정 후 출력 -- [ ] 3 스트라이크인 경우 해당 게임 종료 -- [ ] 게임이 끝난 후 추가 진행 여부 입력이 1인 경우 새 게임 생성 -- [ ] 게임이 끝난 후 추가 진행 여부 입력이 2인 경우 전체 게임 종료 +- [x] 최초에 게임 생성 +- [x] 사용자의 정답 입력에 대해 결과 판정 후 출력 +- [x] 3스트라이크인 경우 해당 게임 종료 +- [x] 게임이 끝난 후 추가 진행 여부 입력이 1인 경우 새 게임 생성 +- [x] 게임이 끝난 후 추가 진행 여부 입력이 2인 경우 전체 게임 종료 #### 숫자 야구 게임 `BaseballGame` -- [ ] 최초 생성시 `NumberGenerator`를 통해 정답 생성 +- [x] 최초 생성시 `BaseballNumbersGenerator`를 통해 정답 생성 #### 컴퓨터 숫자 생성 `BaseballNumbersGenerator` -- [ ] `BaseballNumbers`(1부터 9까지 서로 다른 수로 이루어진 3자리의 수) 생성 +- [x] `BaseballNumbers`(1부터 9까지 서로 다른 수로 이루어진 3자리의 수) 생성 #### 사용자의 입력 받음 `InputView` -- [ ] 사용자의 정답을 입력 받음 -- [ ] 사용자의 새 게임 진행 여부를 입력 받음 +- [x] 사용자의 정답을 입력 받음 +- [x] 사용자의 새 게임 진행 여부를 입력 받음 +- [x] 잘못된 입력이 들어오는 경우 에러메시지 출력 후 다시 입력 받음 #### 메시지 출력 `OutputView` -- [ ] `StrikeBallCount`에 대한 결과 출력 +- [x] `StrikeBallCount`에 대한 결과 출력 #### 사용자의 정답 입력 검증 `InputUserAnswerValidator` -- [ ] 사용자의 정답 입력을 검증 -- [ ] 사용자의 정답 입력을 `BaseballNumbers`로 변환 +- [x] 사용자의 정답 입력을 검증 +- [x] 사용자의 정답 입력을 `BaseballNumbers`로 변환 #### 사용자의 새 게임 진행 여부 입력 검증 `InputRestartValidator` -- [ ] 사용자의 새 게임 진행 여부 입력을 검증 +- [x] 사용자의 새 게임 진행 여부 입력을 검증 #### 결과 판정 `Referee` -- [ ] 게임의 정답과 사용자가 입력한 답을 비교하여 `StrikeBallCount` 생성 -- [ ] 각각의 숫자에 대해 포함된 여부, index가 같은 지 확인 +- [x] 게임의 정답과 사용자가 입력한 답을 비교하여 `StrikeBallCount` 생성 +- [x] 각각의 숫자에 대해 포함된 여부, index가 같은 지 확인하여 볼카운트 판정 From 12332ec000b37af36d73f6caaee0356a9ae40399 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 12 Dec 2022 23:02:52 +0900 Subject: [PATCH 23/33] =?UTF-8?q?refactor:=20Command=20enum=20class=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 - 재시작 여부 command를 enum class로 관리 - 이를 반영하여 InputRestartValidator, InputView 수정 --- src/main/java/baseball/constant/Command.java | 16 ++++++++++++++++ .../validator/InputRestartValidator.java | 10 ++++++---- src/main/java/baseball/view/InputView.java | 11 +++++++---- 3 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 src/main/java/baseball/constant/Command.java diff --git a/src/main/java/baseball/constant/Command.java b/src/main/java/baseball/constant/Command.java new file mode 100644 index 00000000..638885de --- /dev/null +++ b/src/main/java/baseball/constant/Command.java @@ -0,0 +1,16 @@ +package baseball.constant; + +public enum Command { + RESTART("1"), + QUIT("2"); + + private final String value; + + Command(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/baseball/validator/InputRestartValidator.java b/src/main/java/baseball/validator/InputRestartValidator.java index c9ab54a4..f05f2468 100644 --- a/src/main/java/baseball/validator/InputRestartValidator.java +++ b/src/main/java/baseball/validator/InputRestartValidator.java @@ -1,16 +1,18 @@ package baseball.validator; +import baseball.constant.Command; + public class InputRestartValidator extends Validator { - private static final String RESTART = "1"; - private static final String QUIT = "2"; + private static final String restart = Command.RESTART.getValue(); + private static final String quit = Command.QUIT.getValue(); private static final String INVALID_RESTART_INPUT_ERROR_MESSAGE = "[ERROR] 입력을 확인해주세요."; public static Boolean validate(String input) { String trimmedInput = removeSpace(input); - if (trimmedInput.equals(RESTART)) { + if (trimmedInput.equals(restart)) { return true; } - if (trimmedInput.equals(QUIT)) { + if (trimmedInput.equals(quit)) { return false; } throw new IllegalArgumentException(INVALID_RESTART_INPUT_ERROR_MESSAGE); diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 10f12bfb..933901d2 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,5 +1,6 @@ package baseball.view; +import baseball.constant.Command; import baseball.domain.BaseballNumbers; import baseball.validator.InputRestartValidator; import baseball.validator.InputUserAnswerValidator; @@ -7,8 +8,10 @@ import java.util.Scanner; public class InputView { - private final String INPUT_ANSWER_STRING = "숫자를 입력해주세요 : "; - private final String INPUT_RESTART_STRING = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + private final String INPUT_ANSWER_MESSAGE = "숫자를 입력해주세요 : "; + private final String INPUT_RESTART_MESSAGE_FORMAT = "게임을 새로 시작하려면 %s, 종료하려면 %s를 입력하세요."; + private final String INPUT_RESTART_MESSAGE = String.format(INPUT_RESTART_MESSAGE_FORMAT, + Command.RESTART.getValue(), Command.QUIT.getValue()); private final Scanner sc; public InputView() { @@ -16,7 +19,7 @@ public InputView() { } public BaseballNumbers readInputUserAnswer() { - System.out.print(INPUT_ANSWER_STRING); + System.out.print(INPUT_ANSWER_MESSAGE); try { return InputUserAnswerValidator.validate(sc.next()); } catch (IllegalArgumentException e) { @@ -26,7 +29,7 @@ public BaseballNumbers readInputUserAnswer() { } public boolean readInputRestart() { - System.out.println(INPUT_RESTART_STRING); + System.out.println(INPUT_RESTART_MESSAGE); try { return InputRestartValidator.validate(sc.next()); } catch (IllegalArgumentException e) { From 136512cef671c4af75fb97f697c1fd90f109cac0 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Fri, 16 Dec 2022 14:18:44 +0900 Subject: [PATCH 24/33] =?UTF-8?q?test:=20OutputViewTest=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 - 모든 카운트 조합을 담당하는 내부 enum BallCounts 생성 - 모든 조합에 대해 제대로 된 결과가 출력되는지 확인 --- src/test/java/baseball/OutputViewTest.java | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/test/java/baseball/OutputViewTest.java diff --git a/src/test/java/baseball/OutputViewTest.java b/src/test/java/baseball/OutputViewTest.java new file mode 100644 index 00000000..a8b45810 --- /dev/null +++ b/src/test/java/baseball/OutputViewTest.java @@ -0,0 +1,72 @@ +package baseball; + +import baseball.domain.StrikeBallCount; +import baseball.view.OutputView; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.assertj.core.api.Assertions.assertThat; + +public class OutputViewTest { + OutputView outputView = new OutputView(); + private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + private enum BallCounts { + count_00(0, 0, "낫싱"), + count_01(0, 1, "1볼"), + count_02(0, 2, "2볼"), + count_03(0, 3, "3볼"), + count_10(1, 0, "1스트라이크"), + count_11(1, 1, "1스트라이크 1볼"), + count_12(1, 2, "1스트라이크 2볼"), + count_20(2, 0, "2스트라이크"), + count_21(2, 1, "2스트라이크 1볼"), + count_30(3, 0, "3스트라이크"); + private final int strikes; + private final int balls; + private final String result; + + BallCounts(int strikes, int balls, String result) { + this.strikes = strikes; + this.balls = balls; + this.result = result; + } + } + + @BeforeEach + public void setOutStreams() { + System.setOut(new PrintStream(outputStream)); + } + + @AfterEach + public void restoreStreams() { + System.setOut(System.out); + outputStream.reset(); + } + + @ParameterizedTest + @EnumSource(BallCounts.class) + void printResultTest(BallCounts ballcounts) { + StrikeBallCount sb = new StrikeBallCount(); + setStrikeBallCount(sb, ballcounts.strikes, ballcounts.balls); + outputView.printResult(sb); + assertThat(outputStream.toString() + .trim()).isEqualTo(ballcounts.result); + } + + void setStrikeBallCount(StrikeBallCount sb, int strikes, int balls) { + sb.resetCounts(); + for (int i = 0; i < strikes; i++) { + sb.addStrikeCount(); + } + for (int i = 0; i < balls; i++) { + sb.addBallCount(); + } + } +} + From c9b5d5d0f9686fcde0f1d6bae5d3920552820b98 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Fri, 16 Dec 2022 14:41:30 +0900 Subject: [PATCH 25/33] =?UTF-8?q?test:=20InputRestartValidatorTest=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 - Restart 입력에 대한 테스트 코드 --- .../baseball/InputRestartValidatorTest.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/test/java/baseball/InputRestartValidatorTest.java diff --git a/src/test/java/baseball/InputRestartValidatorTest.java b/src/test/java/baseball/InputRestartValidatorTest.java new file mode 100644 index 00000000..2f799bfd --- /dev/null +++ b/src/test/java/baseball/InputRestartValidatorTest.java @@ -0,0 +1,33 @@ +package baseball; + +import baseball.validator.InputRestartValidator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class InputRestartValidatorTest { + private static final String INVALID_RESTART_INPUT_ERROR_MESSAGE = "[ERROR] 입력을 확인해주세요."; + + @DisplayName("재시작 입력이 '1' + 공백인 경우 true, '2'인 경우 false를 return한다.") + @Test + void InputRestart_성공테스트() { + assertThat(InputRestartValidator.validate("1")).isEqualTo(true); + assertThat(InputRestartValidator.validate("1 ")).isEqualTo(true); + assertThat(InputRestartValidator.validate(" 1 ")).isEqualTo(true); + assertThat(InputRestartValidator.validate("2")).isEqualTo(false); + } + + @DisplayName("재시작 입력이 1, 2가 아닌 경우 예외가 발생한다.") + @ValueSource(strings = {"a", "09", "c", "d"}) + @ParameterizedTest + void InputRestart_실패테스트(String inputString) { + assertThatThrownBy(() -> InputRestartValidator.validate(inputString)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(INVALID_RESTART_INPUT_ERROR_MESSAGE); + } +} + From fb4de621fd3323c07d8dad2a400083e8a96ef026 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Fri, 16 Dec 2022 15:04:25 +0900 Subject: [PATCH 26/33] =?UTF-8?q?test:=20InputUserAnswerValidatorTest=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 - UserAnswer 입력에 대한 테스트 코드 - 성공 케이스, 실패 케이스 체크(형식 예외, 중복 예외) --- .../InputUserAnswerValidatorTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/test/java/baseball/InputUserAnswerValidatorTest.java diff --git a/src/test/java/baseball/InputUserAnswerValidatorTest.java b/src/test/java/baseball/InputUserAnswerValidatorTest.java new file mode 100644 index 00000000..62d136b4 --- /dev/null +++ b/src/test/java/baseball/InputUserAnswerValidatorTest.java @@ -0,0 +1,45 @@ +package baseball; + +import baseball.domain.BaseballNumbers; +import baseball.validator.InputUserAnswerValidator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class InputUserAnswerValidatorTest { + private static final String REGEX_ERROR_MESSAGE = "[ERROR] 형식에 맞게 입력하세요 : 중복이 없는 1과 9 사이의 3자리 수"; + private static final String DUPLICATE_ERROR_MESSAGE = "[ERROR] 중복이 없어야 합니다."; + @DisplayName("inputUserAnswer가 1~9로 이루어진 세 자리의 수인 경우 BaseballNumbers를 정상적으로 반환한다.") + @Test + void InputRestart_성공테스트() { + assertThat(InputUserAnswerValidator.validate("123")) + .isEqualTo(new BaseballNumbers(new String[] {"1","2","3"})); + assertThat(InputUserAnswerValidator.validate("1 2 3 ")) + .isEqualTo(new BaseballNumbers(new String[] {"1","2","3"})); + assertThat(InputUserAnswerValidator.validate(" 7 89")) + .isEqualTo(new BaseballNumbers(new String[] {"7","8","9"})); + } + + @DisplayName("inputUserAnswer가 1~9로 이루어진 세 자리의 수가 아닌 경우 예외가 발생한다.") + @ValueSource(strings = {"aab", "세자리", "1234", "53129", "-1", "dㅁㅇㅎ", "100"}) + @ParameterizedTest + void InputUserAnswer_형식_실패테스트(String inputString) { + assertThatThrownBy(() -> InputUserAnswerValidator.validate(inputString)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(REGEX_ERROR_MESSAGE); + } + + @DisplayName("inputUserAnswer가 1~9로 이루어진 세 자리의 수지만 중복이 있는 경우 예외가 발생한다.") + @ValueSource(strings = {"113", "121", "122", "111", "1 13", "1 2 1", " 1 2 2 "}) + @ParameterizedTest + void InputUserAnswer_중복_실패테스트(String inputString) { + assertThatThrownBy(() -> InputUserAnswerValidator.validate(inputString)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(DUPLICATE_ERROR_MESSAGE); + } +} + From 6f6accc0e5c725723198abe48b5a9d03d1c631f2 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Fri, 16 Dec 2022 15:05:20 +0900 Subject: [PATCH 27/33] =?UTF-8?q?refactor:=20BaseballNumbers=EC=9D=98=20eq?= =?UTF-8?q?uals=20method=20override?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가지고 있는 숫자(numbers)를 비교하도록 수정 --- src/main/java/baseball/domain/BaseballNumbers.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/baseball/domain/BaseballNumbers.java b/src/main/java/baseball/domain/BaseballNumbers.java index b71d8a9b..3b17baa8 100644 --- a/src/main/java/baseball/domain/BaseballNumbers.java +++ b/src/main/java/baseball/domain/BaseballNumbers.java @@ -42,4 +42,12 @@ public int getNumberAt(int index) { public int getIndex(int number) { return numbers.indexOf(number); } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BaseballNumbers){ + return numbers.equals(((BaseballNumbers) obj).numbers); + } + return false; + } } From e280813d18af3184278e8410533acc7ddf21a282 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Fri, 16 Dec 2022 15:24:10 +0900 Subject: [PATCH 28/33] =?UTF-8?q?refactor:=20StrikeBallCount=EC=9D=98=20eq?= =?UTF-8?q?uals=20method=20override?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가지고 있는 숫자(strikeCount, ballCount)끼리 비교하도록 수정 --- src/main/java/baseball/domain/StrikeBallCount.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/baseball/domain/StrikeBallCount.java b/src/main/java/baseball/domain/StrikeBallCount.java index 610a05ae..e25578bc 100644 --- a/src/main/java/baseball/domain/StrikeBallCount.java +++ b/src/main/java/baseball/domain/StrikeBallCount.java @@ -35,4 +35,13 @@ public int getBallCount() { public boolean getIsComplete() { return strikeCount == length; } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StrikeBallCount){ + StrikeBallCount strikeBallCount = (StrikeBallCount) obj; + return strikeCount == strikeBallCount.getStrikeCount() && ballCount == strikeBallCount.getBallCount(); + } + return false; + } } From c36bf878b4483ca45b24086c49e88b65a643bdf3 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Fri, 16 Dec 2022 16:37:11 +0900 Subject: [PATCH 29/33] =?UTF-8?q?refactor:=20OutputViewTest=EC=9D=98=20inn?= =?UTF-8?q?er=20enum=20StrikeBallCountCombination=EC=9D=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 다른 테스트에서도 사용하기 위해 inner enum 분리 - StrikeBallCount 생성도 분리된 enum에서 진행 --- src/test/java/baseball/OutputViewTest.java | 43 +++---------------- .../baseball/StrikeBallCountCombination.java | 42 ++++++++++++++++++ 2 files changed, 48 insertions(+), 37 deletions(-) create mode 100644 src/test/java/baseball/StrikeBallCountCombination.java diff --git a/src/test/java/baseball/OutputViewTest.java b/src/test/java/baseball/OutputViewTest.java index a8b45810..53b95300 100644 --- a/src/test/java/baseball/OutputViewTest.java +++ b/src/test/java/baseball/OutputViewTest.java @@ -4,6 +4,7 @@ import baseball.view.OutputView; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; @@ -16,28 +17,6 @@ public class OutputViewTest { OutputView outputView = new OutputView(); private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - private enum BallCounts { - count_00(0, 0, "낫싱"), - count_01(0, 1, "1볼"), - count_02(0, 2, "2볼"), - count_03(0, 3, "3볼"), - count_10(1, 0, "1스트라이크"), - count_11(1, 1, "1스트라이크 1볼"), - count_12(1, 2, "1스트라이크 2볼"), - count_20(2, 0, "2스트라이크"), - count_21(2, 1, "2스트라이크 1볼"), - count_30(3, 0, "3스트라이크"); - private final int strikes; - private final int balls; - private final String result; - - BallCounts(int strikes, int balls, String result) { - this.strikes = strikes; - this.balls = balls; - this.result = result; - } - } - @BeforeEach public void setOutStreams() { System.setOut(new PrintStream(outputStream)); @@ -49,24 +28,14 @@ public void restoreStreams() { outputStream.reset(); } + @DisplayName("모든 StrikeBallCount에 대해 제대로 출력하는지 확인한다.") @ParameterizedTest - @EnumSource(BallCounts.class) - void printResultTest(BallCounts ballcounts) { - StrikeBallCount sb = new StrikeBallCount(); - setStrikeBallCount(sb, ballcounts.strikes, ballcounts.balls); + @EnumSource(StrikeBallCountCombination.class) + void printResultTest(StrikeBallCountCombination countCombination) { + StrikeBallCount sb = countCombination.getStrikeBallCount(); outputView.printResult(sb); assertThat(outputStream.toString() - .trim()).isEqualTo(ballcounts.result); - } - - void setStrikeBallCount(StrikeBallCount sb, int strikes, int balls) { - sb.resetCounts(); - for (int i = 0; i < strikes; i++) { - sb.addStrikeCount(); - } - for (int i = 0; i < balls; i++) { - sb.addBallCount(); - } + .trim()).isEqualTo(countCombination.result); } } diff --git a/src/test/java/baseball/StrikeBallCountCombination.java b/src/test/java/baseball/StrikeBallCountCombination.java new file mode 100644 index 00000000..307cf119 --- /dev/null +++ b/src/test/java/baseball/StrikeBallCountCombination.java @@ -0,0 +1,42 @@ +package baseball; + +import baseball.domain.StrikeBallCount; + +public enum StrikeBallCountCombination { + count_00(0, 0, "낫싱"), + count_01(0, 1, "1볼"), + count_02(0, 2, "2볼"), + count_03(0, 3, "3볼"), + count_10(1, 0, "1스트라이크"), + count_11(1, 1, "1스트라이크 1볼"), + count_12(1, 2, "1스트라이크 2볼"), + count_20(2, 0, "2스트라이크"), + count_21(2, 1, "2스트라이크 1볼"), + count_30(3, 0, "3스트라이크"); + public final int strikes; + public final int balls; + public final String result; + StrikeBallCount sb; + + StrikeBallCountCombination(int strikes, int balls, String result) { + this.strikes = strikes; + this.balls = balls; + this.result = result; + sb = new StrikeBallCount(); + setStrikeBallCount(); + } + + private void setStrikeBallCount() { + sb.resetCounts(); + for (int i = 0; i < strikes; i++) { + sb.addStrikeCount(); + } + for (int i = 0; i < balls; i++) { + sb.addBallCount(); + } + } + + public StrikeBallCount getStrikeBallCount() { + return sb; + } +} From 2caf4778c3b8a337a91c766e020a968dd7ea7c50 Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Fri, 16 Dec 2022 17:19:58 +0900 Subject: [PATCH 30/33] =?UTF-8?q?test:=20BaseballGameTest=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/test/java/baseball/BaseballGameTest.java | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/baseball/BaseballGameTest.java diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java new file mode 100644 index 00000000..c3832b95 --- /dev/null +++ b/src/test/java/baseball/BaseballGameTest.java @@ -0,0 +1,43 @@ +package baseball; + +import baseball.domain.BaseballGame; +import baseball.domain.BaseballNumbers; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BaseballGameTest { + BaseballGame baseballGame = new BaseballGame(createBaseballNumbers("123")); + + @DisplayName("inputUserAnswer가 1~9로 이루어진 세 자리의 수인 경우 BaseballNumbers를 정상적으로 반환한다.") + @Test + void BaseballGame_Judge_테스트() { + assertThat(baseballGame.getResult(createBaseballNumbers("456"))) + .isEqualTo(StrikeBallCountCombination.count_00.getStrikeBallCount()); + assertThat(baseballGame.getResult(createBaseballNumbers("436"))) + .isEqualTo(StrikeBallCountCombination.count_01.getStrikeBallCount()); + assertThat(baseballGame.getResult(createBaseballNumbers("237"))) + .isEqualTo(StrikeBallCountCombination.count_02.getStrikeBallCount()); + assertThat(baseballGame.getResult(createBaseballNumbers("312"))) + .isEqualTo(StrikeBallCountCombination.count_03.getStrikeBallCount()); + assertThat(baseballGame.getResult(createBaseballNumbers("156"))) + .isEqualTo(StrikeBallCountCombination.count_10.getStrikeBallCount()); + assertThat(baseballGame.getResult(createBaseballNumbers("134"))) + .isEqualTo(StrikeBallCountCombination.count_11.getStrikeBallCount()); + assertThat(baseballGame.getResult(createBaseballNumbers("132"))) + .isEqualTo(StrikeBallCountCombination.count_12.getStrikeBallCount()); + assertThat(baseballGame.getResult(createBaseballNumbers("124"))) + .isEqualTo(StrikeBallCountCombination.count_20.getStrikeBallCount()); + //assertThat(baseballGame.getResult(createBaseballNumbers("124"))) + // .isEqualTo(StrikeBallCountCombination.count_21.getStrikeBallCount()); + //2스트라이크 1볼은 불가능 + assertThat(baseballGame.getResult(createBaseballNumbers("123"))) + .isEqualTo(StrikeBallCountCombination.count_30.getStrikeBallCount()); + } + + private BaseballNumbers createBaseballNumbers(String numbers) { + return new BaseballNumbers(numbers.split("")); + } +} + From 343265cdb6111286c2dc8765b3efb0cd2d870b2e Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 19 Dec 2022 15:06:30 +0900 Subject: [PATCH 31/33] =?UTF-8?q?test:=20Readme.md=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존 요구사항과 기능 사항에 대한 서로 다른 Readme 파일을 하나로 통합함 --- README.md | 37 +++++++++++++++++++++++++++++ docs/README.md | 33 ------------------------- src/test/java/study/StringTest.java | 13 ---------- 3 files changed, 37 insertions(+), 46 deletions(-) delete mode 100644 docs/README.md delete mode 100644 src/test/java/study/StringTest.java diff --git a/README.md b/README.md index 13679ab5..bf758ff9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,40 @@ +## 숫자 야구 게임 기능 목록 + +#### 게임 컨트롤러 `GameController` +- [x] 최초에 게임 생성 +- [x] 사용자의 정답 입력에 대해 결과 판정 후 출력 +- [x] 3스트라이크인 경우 해당 게임 종료 +- [x] 게임이 끝난 후 추가 진행 여부 입력이 1인 경우 새 게임 생성 +- [x] 게임이 끝난 후 추가 진행 여부 입력이 2인 경우 전체 게임 종료 + +#### 숫자 야구 게임 `BaseballGame` +- [x] 최초 생성시 `BaseballNumbersGenerator`를 통해 정답 생성 + +#### 컴퓨터 숫자 생성 `BaseballNumbersGenerator` +- [x] `BaseballNumbers`(1부터 9까지 서로 다른 수로 이루어진 3자리의 수) 생성 + +#### 사용자의 입력 받음 `InputView` +- [x] 사용자의 정답을 입력 받음 +- [x] 사용자의 새 게임 진행 여부를 입력 받음 +- [x] 잘못된 입력이 들어오는 경우 에러메시지 출력 후 다시 입력 받음 + +#### 메시지 출력 `OutputView` +- [x] `StrikeBallCount`에 대한 결과 출력 + +#### 사용자의 정답 입력 검증 `InputUserAnswerValidator` +- [x] 사용자의 정답 입력을 검증 +- [x] 사용자의 정답 입력을 `BaseballNumbers`로 변환 + +#### 사용자의 새 게임 진행 여부 입력 검증 `InputRestartValidator` +- [x] 사용자의 새 게임 진행 여부 입력을 검증 + +#### 결과 판정 `Referee` +- [x] 게임의 정답과 사용자가 입력한 답을 비교하여 `StrikeBallCount` 생성 +- [x] 각각의 숫자에 대해 포함된 여부, index가 같은 지 확인하여 볼카운트 판정 + +


+ + # 숫자 야구 게임 ## 진행 방법 * 숫자 야구 게임 요구사항을 파악한다. diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 45b06542..00000000 --- a/docs/README.md +++ /dev/null @@ -1,33 +0,0 @@ -## 숫자 야구 게임 기능 목록 - -#### 게임 컨트롤러 `GameController` -- [x] 최초에 게임 생성 -- [x] 사용자의 정답 입력에 대해 결과 판정 후 출력 -- [x] 3스트라이크인 경우 해당 게임 종료 -- [x] 게임이 끝난 후 추가 진행 여부 입력이 1인 경우 새 게임 생성 -- [x] 게임이 끝난 후 추가 진행 여부 입력이 2인 경우 전체 게임 종료 - -#### 숫자 야구 게임 `BaseballGame` -- [x] 최초 생성시 `BaseballNumbersGenerator`를 통해 정답 생성 - -#### 컴퓨터 숫자 생성 `BaseballNumbersGenerator` -- [x] `BaseballNumbers`(1부터 9까지 서로 다른 수로 이루어진 3자리의 수) 생성 - -#### 사용자의 입력 받음 `InputView` -- [x] 사용자의 정답을 입력 받음 -- [x] 사용자의 새 게임 진행 여부를 입력 받음 -- [x] 잘못된 입력이 들어오는 경우 에러메시지 출력 후 다시 입력 받음 - -#### 메시지 출력 `OutputView` -- [x] `StrikeBallCount`에 대한 결과 출력 - -#### 사용자의 정답 입력 검증 `InputUserAnswerValidator` -- [x] 사용자의 정답 입력을 검증 -- [x] 사용자의 정답 입력을 `BaseballNumbers`로 변환 - -#### 사용자의 새 게임 진행 여부 입력 검증 `InputRestartValidator` -- [x] 사용자의 새 게임 진행 여부 입력을 검증 - -#### 결과 판정 `Referee` -- [x] 게임의 정답과 사용자가 입력한 답을 비교하여 `StrikeBallCount` 생성 -- [x] 각각의 숫자에 대해 포함된 여부, index가 같은 지 확인하여 볼카운트 판정 diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java deleted file mode 100644 index 43e47d90..00000000 --- a/src/test/java/study/StringTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package study; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StringTest { - @Test - void replace() { - String actual = "abc".replace("b", "d"); - assertThat(actual).isEqualTo("adc"); - } -} From 215a041799ff1c4b22919df0f40f52d4eaab0e0b Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Mon, 19 Dec 2022 15:25:00 +0900 Subject: [PATCH 32/33] =?UTF-8?q?chore:=20=EC=9E=90=EB=B0=94=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - import 구문 순서 변경 - 개행 추가 및 삭제 --- .../java/baseball/BaseballNumbersGenerator.java | 1 - src/main/java/baseball/constant/Command.java | 3 +-- src/main/java/baseball/constant/Constant.java | 4 +--- src/main/java/baseball/domain/BaseballNumbers.java | 3 +-- src/main/java/baseball/domain/StrikeBallCount.java | 2 +- .../validator/InputUserAnswerValidator.java | 1 - src/main/java/baseball/view/OutputView.java | 3 +-- src/test/java/baseball/BaseballGameTest.java | 4 ++-- .../java/baseball/InputRestartValidatorTest.java | 6 +++--- .../java/baseball/InputUserAnswerValidatorTest.java | 13 +++++++------ src/test/java/baseball/OutputViewTest.java | 8 +++----- 11 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/main/java/baseball/BaseballNumbersGenerator.java b/src/main/java/baseball/BaseballNumbersGenerator.java index 72959dba..7fcec62c 100644 --- a/src/main/java/baseball/BaseballNumbersGenerator.java +++ b/src/main/java/baseball/BaseballNumbersGenerator.java @@ -2,7 +2,6 @@ import baseball.constant.Constant; import baseball.domain.BaseballNumbers; - import java.util.Random; public class BaseballNumbersGenerator { diff --git a/src/main/java/baseball/constant/Command.java b/src/main/java/baseball/constant/Command.java index 638885de..b9adf048 100644 --- a/src/main/java/baseball/constant/Command.java +++ b/src/main/java/baseball/constant/Command.java @@ -1,8 +1,7 @@ package baseball.constant; public enum Command { - RESTART("1"), - QUIT("2"); + RESTART("1"), QUIT("2"); private final String value; diff --git a/src/main/java/baseball/constant/Constant.java b/src/main/java/baseball/constant/Constant.java index f88b3285..04fad46e 100644 --- a/src/main/java/baseball/constant/Constant.java +++ b/src/main/java/baseball/constant/Constant.java @@ -1,9 +1,7 @@ package baseball.constant; public enum Constant { - LENGTH(3), - MIN_RANGE(1), - MAX_RANGE(9); + LENGTH(3), MIN_RANGE(1), MAX_RANGE(9); private final int value; diff --git a/src/main/java/baseball/domain/BaseballNumbers.java b/src/main/java/baseball/domain/BaseballNumbers.java index 3b17baa8..2383985d 100644 --- a/src/main/java/baseball/domain/BaseballNumbers.java +++ b/src/main/java/baseball/domain/BaseballNumbers.java @@ -1,7 +1,6 @@ package baseball.domain; import baseball.constant.Constant; - import java.util.ArrayList; import java.util.List; @@ -45,7 +44,7 @@ public int getIndex(int number) { @Override public boolean equals(Object obj) { - if (obj instanceof BaseballNumbers){ + if (obj instanceof BaseballNumbers) { return numbers.equals(((BaseballNumbers) obj).numbers); } return false; diff --git a/src/main/java/baseball/domain/StrikeBallCount.java b/src/main/java/baseball/domain/StrikeBallCount.java index e25578bc..5c8c0031 100644 --- a/src/main/java/baseball/domain/StrikeBallCount.java +++ b/src/main/java/baseball/domain/StrikeBallCount.java @@ -38,7 +38,7 @@ public boolean getIsComplete() { @Override public boolean equals(Object obj) { - if (obj instanceof StrikeBallCount){ + if (obj instanceof StrikeBallCount) { StrikeBallCount strikeBallCount = (StrikeBallCount) obj; return strikeCount == strikeBallCount.getStrikeCount() && ballCount == strikeBallCount.getBallCount(); } diff --git a/src/main/java/baseball/validator/InputUserAnswerValidator.java b/src/main/java/baseball/validator/InputUserAnswerValidator.java index 10cebada..ec79a0be 100644 --- a/src/main/java/baseball/validator/InputUserAnswerValidator.java +++ b/src/main/java/baseball/validator/InputUserAnswerValidator.java @@ -2,7 +2,6 @@ import baseball.constant.Constant; import baseball.domain.BaseballNumbers; - import java.util.Arrays; import java.util.HashSet; import java.util.regex.Pattern; diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 729ff702..e18760b7 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -15,8 +15,7 @@ public void printResult(StrikeBallCount strikeBallCount) { if (sb.length() == 0) { sb.append(NOTHING_KOR); } - System.out.println(sb.toString() - .trim()); + System.out.println(sb.toString().trim()); } public void addString(int num, String kor_string) { diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index c3832b95..b2122713 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -1,12 +1,12 @@ package baseball; +import static org.assertj.core.api.Assertions.assertThat; + import baseball.domain.BaseballGame; import baseball.domain.BaseballNumbers; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; - public class BaseballGameTest { BaseballGame baseballGame = new BaseballGame(createBaseballNumbers("123")); diff --git a/src/test/java/baseball/InputRestartValidatorTest.java b/src/test/java/baseball/InputRestartValidatorTest.java index 2f799bfd..2156251f 100644 --- a/src/test/java/baseball/InputRestartValidatorTest.java +++ b/src/test/java/baseball/InputRestartValidatorTest.java @@ -1,14 +1,14 @@ package baseball; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import baseball.validator.InputRestartValidator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - public class InputRestartValidatorTest { private static final String INVALID_RESTART_INPUT_ERROR_MESSAGE = "[ERROR] 입력을 확인해주세요."; diff --git a/src/test/java/baseball/InputUserAnswerValidatorTest.java b/src/test/java/baseball/InputUserAnswerValidatorTest.java index 62d136b4..6fa563d0 100644 --- a/src/test/java/baseball/InputUserAnswerValidatorTest.java +++ b/src/test/java/baseball/InputUserAnswerValidatorTest.java @@ -1,5 +1,8 @@ package baseball; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import baseball.domain.BaseballNumbers; import baseball.validator.InputUserAnswerValidator; import org.junit.jupiter.api.DisplayName; @@ -7,21 +10,19 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - public class InputUserAnswerValidatorTest { private static final String REGEX_ERROR_MESSAGE = "[ERROR] 형식에 맞게 입력하세요 : 중복이 없는 1과 9 사이의 3자리 수"; private static final String DUPLICATE_ERROR_MESSAGE = "[ERROR] 중복이 없어야 합니다."; + @DisplayName("inputUserAnswer가 1~9로 이루어진 세 자리의 수인 경우 BaseballNumbers를 정상적으로 반환한다.") @Test void InputRestart_성공테스트() { assertThat(InputUserAnswerValidator.validate("123")) - .isEqualTo(new BaseballNumbers(new String[] {"1","2","3"})); + .isEqualTo(new BaseballNumbers(new String[]{"1", "2", "3"})); assertThat(InputUserAnswerValidator.validate("1 2 3 ")) - .isEqualTo(new BaseballNumbers(new String[] {"1","2","3"})); + .isEqualTo(new BaseballNumbers(new String[]{"1", "2", "3"})); assertThat(InputUserAnswerValidator.validate(" 7 89")) - .isEqualTo(new BaseballNumbers(new String[] {"7","8","9"})); + .isEqualTo(new BaseballNumbers(new String[]{"7", "8", "9"})); } @DisplayName("inputUserAnswer가 1~9로 이루어진 세 자리의 수가 아닌 경우 예외가 발생한다.") diff --git a/src/test/java/baseball/OutputViewTest.java b/src/test/java/baseball/OutputViewTest.java index 53b95300..54fcd3bd 100644 --- a/src/test/java/baseball/OutputViewTest.java +++ b/src/test/java/baseball/OutputViewTest.java @@ -1,5 +1,7 @@ package baseball; +import static org.assertj.core.api.Assertions.assertThat; + import baseball.domain.StrikeBallCount; import baseball.view.OutputView; import org.junit.jupiter.api.AfterEach; @@ -7,12 +9,9 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; - import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import static org.assertj.core.api.Assertions.assertThat; - public class OutputViewTest { OutputView outputView = new OutputView(); private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); @@ -34,8 +33,7 @@ public void restoreStreams() { void printResultTest(StrikeBallCountCombination countCombination) { StrikeBallCount sb = countCombination.getStrikeBallCount(); outputView.printResult(sb); - assertThat(outputStream.toString() - .trim()).isEqualTo(countCombination.result); + assertThat(outputStream.toString().trim()).isEqualTo(countCombination.result); } } From 9145cbbb582006f5abdfbf59f048c85af6aef2eb Mon Sep 17 00:00:00 2001 From: "kyne.k" Date: Thu, 22 Dec 2022 18:44:11 +0900 Subject: [PATCH 33/33] =?UTF-8?q?chore:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputUserAnswerValidatorTest의 메서드 이름 수정 : InputRestart_성공테스트() -> InputUserAnswer_성공테스트() --- src/test/java/baseball/InputUserAnswerValidatorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/baseball/InputUserAnswerValidatorTest.java b/src/test/java/baseball/InputUserAnswerValidatorTest.java index 6fa563d0..b06df68e 100644 --- a/src/test/java/baseball/InputUserAnswerValidatorTest.java +++ b/src/test/java/baseball/InputUserAnswerValidatorTest.java @@ -16,7 +16,7 @@ public class InputUserAnswerValidatorTest { @DisplayName("inputUserAnswer가 1~9로 이루어진 세 자리의 수인 경우 BaseballNumbers를 정상적으로 반환한다.") @Test - void InputRestart_성공테스트() { + void InputUserAnswer_성공테스트() { assertThat(InputUserAnswerValidator.validate("123")) .isEqualTo(new BaseballNumbers(new String[]{"1", "2", "3"})); assertThat(InputUserAnswerValidator.validate("1 2 3 "))