From 4c2f777cd6742fc3543679568c6aafc0d34b55a8 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Thu, 19 Oct 2023 21:01:08 +0900 Subject: [PATCH 01/45] =?UTF-8?q?docs:=20docs/README.md=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2..91897c3c30 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,44 @@ +# [ 구현할 기능 목록 ] + +1. 게임 시작 문구 출력 + - "숫자 야구 게임을 시작합니다." 출력 + + +2. 1~9 의 서로 다른 숫자 3개 생성 (컴퓨터숫자 생성) + + +3. 사용자로부터 숫자 입력 받기 + + +4. 입력 받은 숫자 Validation 진행 + - (1) 1부터 9 까지의 (2) 서로 다른 (3) 숫자 (4) 3개여야 함 + - 예외 처리 : 0, 숫자가 아닌 값, 서로 다른 숫자 3개가 아닌 경우 + + +5. 입력 받은 숫자와 컴퓨터 숫자를 비교 + - 낫싱 여부, 볼 개수, 스트라이크 개수 계산 + + +6. 비교한 값을 전달 받아 결과 문자열 생성 + - (ex) 낫싱, 1볼, 2스트라이크, 1볼 1스트라이크 + + +7. 결과 문자열 출력 + + +8. 게임 종료 여부 체크 + - 3개의 숫자를 모두 맞추면 (3 스트라이크) true, 아니면 false + - true 인 경우, 아래 내용 출력 + - "3개의 숫자를 모두 맞히셨습니다! 게임 종료" + - "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요." + - false 인 경우 + - 3번 (사용자로부터 숫자 입력받기) 으로 돌아가서 값이 true일 때까지 반복 + + +9. 입력 값 Validation 진행 + - 1 또는 2 가 아닌 값이면 예외 처리 + + +10. 입력 값에 따라 다시 시작, 완전 종료 진행 + - 1 -> 다시 시작 (2번 부터 반복) + - 2 -> 완전 종료 (반복 종료) \ No newline at end of file From ed77363b7c6e0fb1da87bb2567f174794c34c6cd Mon Sep 17 00:00:00 2001 From: jisu-om Date: Thu, 19 Oct 2023 21:24:35 +0900 Subject: [PATCH 02/45] =?UTF-8?q?docs:=20docs/README.md=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=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 --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 91897c3c30..5ff90a903b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,10 +35,10 @@ - 3번 (사용자로부터 숫자 입력받기) 으로 돌아가서 값이 true일 때까지 반복 -9. 입력 값 Validation 진행 +9. 8번이 true인 경우, 8번에 대한 입력 값 Validation 진행 - 1 또는 2 가 아닌 값이면 예외 처리 10. 입력 값에 따라 다시 시작, 완전 종료 진행 - 1 -> 다시 시작 (2번 부터 반복) - - 2 -> 완전 종료 (반복 종료) \ No newline at end of file + - 2 -> 완전 종료 (프로그램 종료) \ No newline at end of file From 2776639068ef472d1d8668cdeb217027dd6d53fb Mon Sep 17 00:00:00 2001 From: jisu-om Date: Thu, 19 Oct 2023 22:27:28 +0900 Subject: [PATCH 03/45] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/ApplicationTest.java | 1 + src/test/java/baseball/BaseballGameTest.java | 112 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 src/test/java/baseball/BaseballGameTest.java diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java index 3fa29fa67b..c65d069d28 100644 --- a/src/test/java/baseball/ApplicationTest.java +++ b/src/test/java/baseball/ApplicationTest.java @@ -32,4 +32,5 @@ class ApplicationTest extends NsTest { public void runMain() { Application.main(new String[]{}); } + } diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java new file mode 100644 index 0000000000..b1c87c21bd --- /dev/null +++ b/src/test/java/baseball/BaseballGameTest.java @@ -0,0 +1,112 @@ +package baseball; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class BaseballGameTest { + + @DisplayName("1~9의 서로 다른 숫자 3개를 생성한다.") + @Test + void generateComputerNumber(){ + + } + + + @DisplayName("입력 받은 숫자가 1~9의 서로 다른 숫자 3개인 경우 정상 처리 된다.") + @Test + void validatePlayerNumber_o(){ + + } + + @DisplayName("입력 받은 값에 0이 포함된 경우 예외가 발생한다.") + @Test + void validatePlayerNumber_ex1(){ + + } + + @DisplayName("입력 받은 값이 1~9의 서로 다른 숫자 3개가 아니면 예외가 발생한다.") + @Test + void validatePlayerNumber_ex2(){ + + } + + //입력 받은 숫자와 컴퓨터 숫자 비교 + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 낫싱") + @Test + void generateResult1() { + + } + + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 1볼") + @Test + void generateResult2() { + + } + + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 2볼") + @Test + void generateResult3() { + + } + + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 3볼") + @Test + void generateResult4() { + + } + + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 1스트라이크") + @Test + void generateResult5() { + + } + + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 2스트라이크") + @Test + void generateResult6() { + + } + + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 3스트라이크") + @Test + void generateResult7() { + + } + + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 1볼 1스트라이크") + @Test + void generateResult8() { + + } + + @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 2볼 1스트라이크") + @Test + void generateResult9() { + + } + + @DisplayName("결과 문자열 생성") + @Test + void printResult() { + + } + +// @DisplayName("3스트라이크인 경우, 게임 종료 문구 출력") +// @Test +// void printWinningResult() { +// +// } +// +// @DisplayName("게임 종료(3스트라이크)가 아닌 경우, 사용자로부터 숫자 입력 받기 진행") +// @Test +// void printNextRoundResult() { +// +// } + + @DisplayName("게임 종료 문구에 대한 입력값 검증 - 1 이나 2 가 아니면 예외가 발생한다.") + @Test + void validateInput_ex() { + + } + +} From 8117e54b4f94f123c276b5bfa06eae156fe8eac1 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Thu, 19 Oct 2023 22:51:40 +0900 Subject: [PATCH 04/45] =?UTF-8?q?feat:=20OutputView=EC=97=90=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=8B=9C=EC=9E=91,=20=EA=B2=B0=EA=B3=BC,=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=20=EB=AC=B8=EA=B5=AC=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/InputView.java | 4 +++ src/main/java/baseball/view/OutputView.java | 40 +++++++++++++++++++++ 2 files changed, 44 insertions(+) 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/view/InputView.java b/src/main/java/baseball/view/InputView.java new file mode 100644 index 0000000000..6474b6e42b --- /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 0000000000..f8300d511c --- /dev/null +++ b/src/main/java/baseball/view/OutputView.java @@ -0,0 +1,40 @@ +package baseball.view; + +public class OutputView { + private static final String START_MESSAGE = "숫자 야구 게임을 시작합니다."; + private static final String GET_INPUT_MESSAGE = "숫자를 입력해주세요 : "; + private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료\n게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + private static final String NOTHING = "낫싱"; + private static final String BALL_FORMAT = "%d볼 "; + private static final String STRIKE_FORMAT = "%d스트라이크"; + + + public static void printStart() { + System.out.println(START_MESSAGE); + } + + public static void printGetInput() { + System.out.println(GET_INPUT_MESSAGE); + } + + public static void printResult(boolean isNothing, int ballCount, int strikeCount) { + if (isNothing) { + System.out.println(NOTHING); + return; + } + String resultString = ""; + if (ballCount != 0) { + resultString = String.format(BALL_FORMAT, ballCount); + } + if (strikeCount != 0) { + resultString += String.format(STRIKE_FORMAT, strikeCount); + } + System.out.println(resultString); + } + + public static void printEnd() { + System.out.println(END_MESSAGE); + } + + +} From 1dc44e4383627035607d6b6ea468a8c0a41bb2fb Mon Sep 17 00:00:00 2001 From: jisu-om Date: Thu, 19 Oct 2023 23:13:47 +0900 Subject: [PATCH 05/45] =?UTF-8?q?feat:=20InputView=EC=97=90=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=9E=85=EB=A0=A5=EA=B0=92=EC=9D=84=20?= =?UTF-8?q?=EB=B0=9B=EC=95=84=EB=93=A4=EC=9D=B4=EB=8A=94=20readInput=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/InputView.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 6474b6e42b..cceb8ed854 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,4 +1,10 @@ package baseball.view; +import camp.nextstep.edu.missionutils.Console; + public class InputView { + + public static String readInput() { + return Console.readLine(); + } } From 7b565a1c1a825ebaa4151453c65c5922dce87445 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Thu, 19 Oct 2023 23:20:59 +0900 Subject: [PATCH 06/45] =?UTF-8?q?feat:=20OutputView=20printGetInput=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/OutputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index f8300d511c..c53e84e3f5 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -14,7 +14,7 @@ public static void printStart() { } public static void printGetInput() { - System.out.println(GET_INPUT_MESSAGE); + System.out.print(GET_INPUT_MESSAGE); } public static void printResult(boolean isNothing, int ballCount, int strikeCount) { From 649738ce6d84553853006ed852de7e9c0c01f5dc Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 20 Oct 2023 21:23:09 +0900 Subject: [PATCH 07/45] =?UTF-8?q?feat:=20=EC=BB=B4=ED=93=A8=ED=84=B0=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=20ComputerNumber=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/model/ComputerNumber.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/baseball/model/ComputerNumber.java diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java new file mode 100644 index 0000000000..5cf35ddc42 --- /dev/null +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -0,0 +1,36 @@ +package baseball.model; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class ComputerNumber { + private final List numbers; + + private ComputerNumber() { + this.numbers = generateNumbers(); + } + + public static ComputerNumber createComputerNumber () { + return new ComputerNumber(); + } + + /** + * 1 ~ 9 의 서로 다른 숫자 3개 생성 + */ + private List generateNumbers() { + List numbers = new ArrayList<>(); + while (numbers.size() != 3) { + int number = Randoms.pickNumberInRange(1, 9); + if (!numbers.contains(number)) { + numbers.add(number); + } + } + return numbers; + } + + public List getNumbers() { + return numbers; + } +} From 820420d3e04e8958424e635fa93824e1a0d087b3 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 20 Oct 2023 22:30:53 +0900 Subject: [PATCH 08/45] =?UTF-8?q?feat:=20PlayerNumber=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?(=EC=82=AC=EC=9A=A9=EC=9E=90=EB=A1=9C=EB=B6=80=ED=84=B0=20?= =?UTF-8?q?=EA=B0=92=EC=9D=84=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EC=95=84=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=ED=9B=84=20PlayerNumber=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/model/PlayerNumber.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/main/java/baseball/model/PlayerNumber.java diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/PlayerNumber.java new file mode 100644 index 0000000000..e1418f520c --- /dev/null +++ b/src/main/java/baseball/model/PlayerNumber.java @@ -0,0 +1,73 @@ +package baseball.model; + +import baseball.view.InputView; +import baseball.view.OutputView; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + + +public class PlayerNumber { + private final List numbers; + private static final int NUMBERS_SIZE = 3; + + private PlayerNumber(List numbers) { + this.numbers = numbers; + } + + public static PlayerNumber createPlayerNumber(String input) { + validateNonNumeric(input); + List numbers = convertToIntegerList(input); + validateNonZero(numbers); + validateDuplicateAndSize(numbers); + + return new PlayerNumber(numbers); + } + + /** + * String 을 List 로 변환 + */ + private static List convertToIntegerList(String str) { + List intList = new ArrayList<>(); + for (int i = 0; i < str.length(); i++) { + intList.add(Integer.parseInt(str.substring(i, i+1))); + } + return intList; + } + + /** + * 숫자가 아닌 값이 있는지 검증 + */ + private static void validateNonNumeric(String input) { + try { + Integer.parseInt(input); + } catch(NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 숫자를 입력해주세요."); + } + } + + /** + * 0 이 있는지 검증 + */ + private static void validateNonZero(List numbers) { + if (numbers.contains(0)) { + throw new IllegalArgumentException("0이 아닌 숫자 3개를 입력해주세요."); + } + } + + /** + * 서로 다른 숫자 NUMBERS_SIZE 개 인지 검증 + */ + private static void validateDuplicateAndSize(List numbers) { + Set set = new HashSet<>(numbers); + if (set.size() != NUMBERS_SIZE) { + throw new IllegalArgumentException("서로 다른 숫자 3개를 입력해주세요."); + } + } + + public List getNumbers() { + return numbers; + } +} From 70b1e5e1303292f014fe044f1c66735487526884 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 20 Oct 2023 23:16:06 +0900 Subject: [PATCH 09/45] =?UTF-8?q?feat:=20PlayerNumber=EC=9D=98=20validatio?= =?UTF-8?q?n=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95,=20GameResultGenera?= =?UTF-8?q?tor=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/model/GameResultGenerator.java | 52 +++++++++++++++++++ .../java/baseball/model/PlayerNumber.java | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/main/java/baseball/model/GameResultGenerator.java diff --git a/src/main/java/baseball/model/GameResultGenerator.java b/src/main/java/baseball/model/GameResultGenerator.java new file mode 100644 index 0000000000..5ca78e8040 --- /dev/null +++ b/src/main/java/baseball/model/GameResultGenerator.java @@ -0,0 +1,52 @@ +package baseball.model; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public class GameResultGenerator { + private boolean isNothing = false; + private int ballCount = 0; + private int strikeCount = 0; + + public GameResultGenerator(ComputerNumber computerNumber, PlayerNumber playerNumber) { + calculateResult(computerNumber.getNumbers(), playerNumber.getNumbers()); + } + + + private void calculateResult(List computerNumber, List playerNumber) { + if (computerNumber.equals(playerNumber)) { + strikeCount = 3; + return; + } + + for (int i = 0; i < playerNumber.size(); i++) { + if (computerNumber.contains(playerNumber.get(i))) { //같은 숫자가 존재하고 + if (computerNumber.get(i).equals(playerNumber.get(i))) { //같은 위치에 있으면 + strikeCount++; + continue; + } + ballCount++; + } + } + if ((ballCount == 0) && (strikeCount == 0)) { + isNothing = true; + } + } + + public boolean isNothing() { + return isNothing; + } + + public int getBallCount() { + return ballCount; + } + + public int getStrikeCount() { + return strikeCount; + } + + public boolean isThreeStrike() { + return strikeCount == 3; + } +} diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/PlayerNumber.java index e1418f520c..27e62c49a6 100644 --- a/src/main/java/baseball/model/PlayerNumber.java +++ b/src/main/java/baseball/model/PlayerNumber.java @@ -12,7 +12,7 @@ public class PlayerNumber { private final List numbers; private static final int NUMBERS_SIZE = 3; - + private PlayerNumber(List numbers) { this.numbers = numbers; } From 256677260cd0758f0ed21b5bff3d173d81b48c36 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sat, 21 Oct 2023 01:28:44 +0900 Subject: [PATCH 10/45] =?UTF-8?q?feat:=20PlayerChoice(=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=20=EC=8B=9C=20=EB=B0=9B=EB=8A=94=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=9E=85=EB=A0=A5=EA=B0=92=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4)=20=EC=83=9D=EC=84=B1,=20=EC=8B=AC=ED=8C=90=EA=B4=80?= =?UTF-8?q?=20=EC=97=AD=ED=95=A0=EC=9D=84=20=ED=95=98=EB=8A=94=20GameContr?= =?UTF-8?q?oller=20=EC=83=9D=EC=84=B1,=20=EB=B0=98=EB=B3=B5=EB=AC=B8=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EB=9E=A8=20=EB=8F=8C=EC=95=84=EA=B0=80=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1=20Application.main()=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 9 ++- .../baseball/controller/GameController.java | 58 +++++++++++++++++++ .../java/baseball/model/PlayerChoice.java | 21 +++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/main/java/baseball/controller/GameController.java create mode 100644 src/main/java/baseball/model/PlayerChoice.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..7969e4b926 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,14 @@ package baseball; +import baseball.controller.GameController; +import baseball.view.OutputView; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + OutputView.printStart(); + do { + GameController.run(); + } + while (GameController.run()); } } diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java new file mode 100644 index 0000000000..129f881257 --- /dev/null +++ b/src/main/java/baseball/controller/GameController.java @@ -0,0 +1,58 @@ +package baseball.controller; + +import baseball.model.ComputerNumber; +import baseball.model.GameResultGenerator; +import baseball.model.PlayerChoice; +import baseball.model.PlayerNumber; +import baseball.view.InputView; +import baseball.view.OutputView; + +public class GameController { + + public static boolean run() { + //심판관은 한명이어야 하니 static 메서드로 만들었는데 추가 생각 필요 TODO + ComputerNumber computerNumber = createComputerNumber(); + do { + play(computerNumber); + } + while (play(computerNumber)); + return doRestart(); + } + + /** + * ComputerNumber 생성 + */ + public static ComputerNumber createComputerNumber() { + return ComputerNumber.createComputerNumber(); + } + + /** + * 게임 결과가 3스트라이크 인 경우 : false 리턴 + */ + public static boolean play(ComputerNumber computerNumber) { + + OutputView.printGetInput(); //사용자로부터 값 입력 받는 문구 출력 + String input = InputView.readInput(); //사용자로부터 값을 입력 받기 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber(input); //PlayerNumber 객체 생성 + + //게임 결과 계산 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + + //게임 결과 출력 + OutputView.printResult(gameResultGenerator.isNothing(), gameResultGenerator.getBallCount(), gameResultGenerator.getStrikeCount()); + + //게임 종료 여부 리턴 (종료면 false 리턴) + return !gameResultGenerator.isThreeStrike(); + } + + /** + * 게임 종료 시 재시작 or 종료 판단 + * @return 재시작:true, 종료:false + */ + public static boolean doRestart() { + OutputView.printEnd(); + String input = InputView.readInput(); + PlayerChoice playerChoice = new PlayerChoice(input); + return playerChoice.getValue() == 1; + } +} diff --git a/src/main/java/baseball/model/PlayerChoice.java b/src/main/java/baseball/model/PlayerChoice.java new file mode 100644 index 0000000000..086a480672 --- /dev/null +++ b/src/main/java/baseball/model/PlayerChoice.java @@ -0,0 +1,21 @@ +package baseball.model; + +public class PlayerChoice { + private int value; + + public PlayerChoice(String input) { + validateChoice(input); + value = Integer.parseInt(input); + } + + private void validateChoice(String input) { + int choice = Integer.parseInt(input); + if ((choice != 1) && (choice != 2)) { + throw new IllegalArgumentException("1 또는 2 를 입력해주세요."); + } + } + + public int getValue() { + return value; + } +} From 30c184107ed4fe86981c11a1e9775f44af57a06c Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sat, 21 Oct 2023 01:51:47 +0900 Subject: [PATCH 11/45] =?UTF-8?q?Refactor:=20GameController.run(),=20Appli?= =?UTF-8?q?cation.main()=20=20=EB=B0=98=EB=B3=B5=EB=AC=B8=20=EB=A1=9C?= =?UTF-8?q?=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 --- src/main/java/baseball/Application.java | 7 ++++--- .../baseball/controller/GameController.java | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 7969e4b926..485bbf9bb4 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -6,9 +6,10 @@ public class Application { public static void main(String[] args) { OutputView.printStart(); - do { - GameController.run(); + boolean continueRunning = true; + + while (continueRunning) { + continueRunning = GameController.run(); } - while (GameController.run()); } } diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 129f881257..5b63e968aa 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -10,26 +10,31 @@ public class GameController { public static boolean run() { - //심판관은 한명이어야 하니 static 메서드로 만들었는데 추가 생각 필요 TODO + //심판관은 한명이어도 되니까 static 으로 만듦 + + //컴퓨터넘버 생성 ComputerNumber computerNumber = createComputerNumber(); - do { - play(computerNumber); + + boolean needNextRound = true; //게임 라운드 계속 진행 여부 + while (needNextRound) { + needNextRound = play(computerNumber); //3스트라이크 이면 false 리턴 } - while (play(computerNumber)); + + //게임 종료 이후 재시작, 완전 종료 여부 리턴 return doRestart(); } /** * ComputerNumber 생성 */ - public static ComputerNumber createComputerNumber() { + private static ComputerNumber createComputerNumber() { return ComputerNumber.createComputerNumber(); } /** * 게임 결과가 3스트라이크 인 경우 : false 리턴 */ - public static boolean play(ComputerNumber computerNumber) { + private static boolean play(ComputerNumber computerNumber) { OutputView.printGetInput(); //사용자로부터 값 입력 받는 문구 출력 String input = InputView.readInput(); //사용자로부터 값을 입력 받기 @@ -49,7 +54,7 @@ public static boolean play(ComputerNumber computerNumber) { * 게임 종료 시 재시작 or 종료 판단 * @return 재시작:true, 종료:false */ - public static boolean doRestart() { + private static boolean doRestart() { OutputView.printEnd(); String input = InputView.readInput(); PlayerChoice playerChoice = new PlayerChoice(input); From 591e16af2f5479a6fccd6d154808d52b3b8e9b09 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sat, 21 Oct 2023 23:36:32 +0900 Subject: [PATCH 12/45] =?UTF-8?q?Refactor:=20GameController=20=EC=8B=B1?= =?UTF-8?q?=EA=B8=80=ED=86=A4=20=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9(st?= =?UTF-8?q?atic=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EA=B8=B0=20=EB=B3=B4=EB=8B=A4=EB=8A=94=20?= =?UTF-8?q?=ED=95=AD=EC=83=81=20=EA=B0=99=EC=9D=80=20=EC=9D=B8=EC=8A=A4?= =?UTF-8?q?=ED=84=B4=EC=8A=A4=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=A9=B0=20=EA=B2=8C=EC=9E=84=EC=9D=98=20=ED=9D=90=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20=EC=A1=B0=EC=A0=88=ED=95=98=EB=8A=94=20=EB=82=B4?= =?UTF-8?q?=EB=B6=80=20=ED=95=84=EB=93=9C=EB=A5=BC=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=84=9C=20=EA=B0=9D=EC=B2=B4=EA=B0=80=20=EC=9E=90=EC=9C=A8?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EA=B0=96=EA=B8=B0=20=EC=9C=84=ED=95=B4)?= =?UTF-8?q?=20=EA=B5=B3=EC=9D=B4=20=EC=8B=B1=EA=B8=80=ED=86=A4=EC=9D=84=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=ED=95=A0=20=ED=95=84=EC=9A=94=EA=B0=80=20?= =?UTF-8?q?=EC=9E=88=EC=97=88=EB=8A=94=EC=A7=80=EB=8A=94=20=EC=9D=98?= =?UTF-8?q?=EB=AC=B8.=20utility=20class=EB=A1=9C=20=EB=82=A8=EA=B2=A8?= =?UTF-8?q?=EB=86=A8=EC=96=B4=EB=8F=84=20=EB=90=98=EC=97=88=EC=9D=84=20?= =?UTF-8?q?=EA=B2=83=20=EA=B0=99=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 6 +-- .../baseball/controller/GameController.java | 48 +++++++++++-------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 485bbf9bb4..59eabd0164 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -6,10 +6,10 @@ public class Application { public static void main(String[] args) { OutputView.printStart(); - boolean continueRunning = true; + GameController gameController = GameController.getInstance(); - while (continueRunning) { - continueRunning = GameController.run(); + while (gameController.isWantRestart()) { + gameController.run(); } } } diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 5b63e968aa..bd8ad240f7 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -8,34 +8,38 @@ import baseball.view.OutputView; public class GameController { + private boolean continueGame = true; //게임(다음 라운드) 계속 진행 여부 (3스트라이크가 아닌 경우) (3스트라이크 이면 false) + private boolean wantRestart = true; //재시작 여부 - public static boolean run() { - //심판관은 한명이어도 되니까 static 으로 만듦 + private static GameController gameController = new GameController(); - //컴퓨터넘버 생성 - ComputerNumber computerNumber = createComputerNumber(); + private GameController() { + } - boolean needNextRound = true; //게임 라운드 계속 진행 여부 - while (needNextRound) { - needNextRound = play(computerNumber); //3스트라이크 이면 false 리턴 - } + public static GameController getInstance() { + return gameController; + } + + + public void run() { + ComputerNumber computerNumber = createComputerNumber(); //컴퓨터넘버 생성 - //게임 종료 이후 재시작, 완전 종료 여부 리턴 - return doRestart(); + //3스트라이크 나올 때까지 게임 계속 진행 + while (continueGame) { + play(computerNumber); + } + doRestart(); //3스트라이크 인 경우, 게임 재시작 or 종료 여부 체크 } /** * ComputerNumber 생성 */ - private static ComputerNumber createComputerNumber() { + private ComputerNumber createComputerNumber() { return ComputerNumber.createComputerNumber(); } - /** - * 게임 결과가 3스트라이크 인 경우 : false 리턴 - */ - private static boolean play(ComputerNumber computerNumber) { + private void play(ComputerNumber computerNumber) { OutputView.printGetInput(); //사용자로부터 값 입력 받는 문구 출력 String input = InputView.readInput(); //사용자로부터 값을 입력 받기 PlayerNumber playerNumber = PlayerNumber.createPlayerNumber(input); //PlayerNumber 객체 생성 @@ -46,18 +50,22 @@ private static boolean play(ComputerNumber computerNumber) { //게임 결과 출력 OutputView.printResult(gameResultGenerator.isNothing(), gameResultGenerator.getBallCount(), gameResultGenerator.getStrikeCount()); - //게임 종료 여부 리턴 (종료면 false 리턴) - return !gameResultGenerator.isThreeStrike(); + //게임(다음 라운드) 진행 여부를 변수에 재할당 + continueGame = !gameResultGenerator.isThreeStrike(); } /** * 게임 종료 시 재시작 or 종료 판단 - * @return 재시작:true, 종료:false */ - private static boolean doRestart() { + private void doRestart() { OutputView.printEnd(); String input = InputView.readInput(); PlayerChoice playerChoice = new PlayerChoice(input); - return playerChoice.getValue() == 1; + wantRestart = (playerChoice.getValue() == 1); + continueGame = true; + } + + public boolean isWantRestart() { + return wantRestart; } } From 053079a2b5ae4bd32aff20a45999a539ecb05a90 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 23 Oct 2023 22:04:13 +0900 Subject: [PATCH 13/45] =?UTF-8?q?Refactor:=20GameController=20=EC=8B=B1?= =?UTF-8?q?=EA=B8=80=ED=86=A4=EC=97=90=EC=84=9C=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD(?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EA=B3=BC=ED=95=9C=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EB=A5=BC=20=EB=8A=98=EB=A6=AC=EB=8A=94=20?= =?UTF-8?q?=EA=B2=83=20=EA=B0=99=EA=B3=A0,=20ApplicationTest=EC=9D=98=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=5F=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20-=20=EC=9B=90=EC=9D=B8=20=EC=B0=BE=EC=95=84?= =?UTF-8?q?=EB=B3=BC=20=EA=B2=83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 6 +-- .../baseball/controller/GameController.java | 51 ++++++++----------- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 59eabd0164..485bbf9bb4 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -6,10 +6,10 @@ public class Application { public static void main(String[] args) { OutputView.printStart(); - GameController gameController = GameController.getInstance(); + boolean continueRunning = true; - while (gameController.isWantRestart()) { - gameController.run(); + while (continueRunning) { + continueRunning = GameController.run(); } } } diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index bd8ad240f7..de6d103856 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -8,38 +8,32 @@ import baseball.view.OutputView; public class GameController { - private boolean continueGame = true; //게임(다음 라운드) 계속 진행 여부 (3스트라이크가 아닌 경우) (3스트라이크 이면 false) - private boolean wantRestart = true; //재시작 여부 - - private static GameController gameController = new GameController(); - - private GameController() { - } - - public static GameController getInstance() { - return gameController; - } - - - public void run() { - ComputerNumber computerNumber = createComputerNumber(); //컴퓨터넘버 생성 - - //3스트라이크 나올 때까지 게임 계속 진행 - while (continueGame) { - play(computerNumber); + //심판관은 누구라도 괜찮으니까 모든 메서드를 static 으로 만듦 + public static boolean run() { + //컴퓨터넘버 생성 + ComputerNumber computerNumber = createComputerNumber(); + + boolean needNextRound = true; //게임 라운드 계속 진행 여부 + while (needNextRound) { + needNextRound = play(computerNumber); //3스트라이크 이면 false 리턴 } - doRestart(); //3스트라이크 인 경우, 게임 재시작 or 종료 여부 체크 + + //게임 종료 이후 재시작, 완전 종료 여부 리턴 + return doRestart(); } /** * ComputerNumber 생성 */ - private ComputerNumber createComputerNumber() { + private static ComputerNumber createComputerNumber() { return ComputerNumber.createComputerNumber(); } + /** + * 게임 결과가 3스트라이크 인 경우 : false 리턴 + */ + private static boolean play(ComputerNumber computerNumber) { - private void play(ComputerNumber computerNumber) { OutputView.printGetInput(); //사용자로부터 값 입력 받는 문구 출력 String input = InputView.readInput(); //사용자로부터 값을 입력 받기 PlayerNumber playerNumber = PlayerNumber.createPlayerNumber(input); //PlayerNumber 객체 생성 @@ -50,22 +44,17 @@ private void play(ComputerNumber computerNumber) { //게임 결과 출력 OutputView.printResult(gameResultGenerator.isNothing(), gameResultGenerator.getBallCount(), gameResultGenerator.getStrikeCount()); - //게임(다음 라운드) 진행 여부를 변수에 재할당 - continueGame = !gameResultGenerator.isThreeStrike(); + //게임 종료 여부 리턴 (종료면 false 리턴) + return !gameResultGenerator.isThreeStrike(); } /** * 게임 종료 시 재시작 or 종료 판단 */ - private void doRestart() { + private static boolean doRestart() { OutputView.printEnd(); String input = InputView.readInput(); PlayerChoice playerChoice = new PlayerChoice(input); - wantRestart = (playerChoice.getValue() == 1); - continueGame = true; - } - - public boolean isWantRestart() { - return wantRestart; + return playerChoice.getValue() == 1; } } From 1b3245e96c00caeacd79024d329dc6cf7447af74 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 23 Oct 2023 22:10:27 +0900 Subject: [PATCH 14/45] =?UTF-8?q?Refactor:=20PlayerNumber=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20validation=20=EB=B3=80=EA=B2=BD(=EA=B0=99?= =?UTF-8?q?=EC=9D=80=20=EC=88=AB=EC=9E=90=EA=B0=80=20=EB=91=90=EB=B2=88=20?= =?UTF-8?q?=EB=93=A4=EC=96=B4=EC=98=A4=EA=B3=A0=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=EA=B0=80=203=EA=B0=9C=EA=B0=80=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=20=EA=B2=BD=EC=9A=B0=20=EA=B2=80=EC=A6=9D=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=20ex.?= =?UTF-8?q?1232)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/model/PlayerChoice.java | 4 ++-- src/main/java/baseball/model/PlayerNumber.java | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/baseball/model/PlayerChoice.java b/src/main/java/baseball/model/PlayerChoice.java index 086a480672..d1d2b27df4 100644 --- a/src/main/java/baseball/model/PlayerChoice.java +++ b/src/main/java/baseball/model/PlayerChoice.java @@ -8,10 +8,10 @@ public PlayerChoice(String input) { value = Integer.parseInt(input); } - private void validateChoice(String input) { + private void validateChoice(String input) {g int choice = Integer.parseInt(input); if ((choice != 1) && (choice != 2)) { - throw new IllegalArgumentException("1 또는 2 를 입력해주세요."); + throw new IllegalArgumentException("[ERROR] 1 또는 2 를 입력해주세요."); } } diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/PlayerNumber.java index 27e62c49a6..9fcc29dfb0 100644 --- a/src/main/java/baseball/model/PlayerNumber.java +++ b/src/main/java/baseball/model/PlayerNumber.java @@ -21,7 +21,8 @@ public static PlayerNumber createPlayerNumber(String input) { validateNonNumeric(input); List numbers = convertToIntegerList(input); validateNonZero(numbers); - validateDuplicateAndSize(numbers); + validateDuplicate(numbers); + validateSize(numbers); return new PlayerNumber(numbers); } @@ -53,17 +54,23 @@ private static void validateNonNumeric(String input) { */ private static void validateNonZero(List numbers) { if (numbers.contains(0)) { - throw new IllegalArgumentException("0이 아닌 숫자 3개를 입력해주세요."); + throw new IllegalArgumentException("[ERROR] 0이 아닌 숫자 3개를 입력해주세요."); } } /** * 서로 다른 숫자 NUMBERS_SIZE 개 인지 검증 */ - private static void validateDuplicateAndSize(List numbers) { + private static void validateDuplicate(List numbers) { Set set = new HashSet<>(numbers); - if (set.size() != NUMBERS_SIZE) { - throw new IllegalArgumentException("서로 다른 숫자 3개를 입력해주세요."); + if (set.size() != numbers.size()) { + throw new IllegalArgumentException("[ERROR] 서로 다른 숫자 3개를 입력해주세요."); + } + } + + private static void validateSize(List numbers) { + if (numbers.size() != NUMBERS_SIZE) { + throw new IllegalArgumentException("[ERROR] 서로 다른 숫자 3개를 입력해주세요."); } } From 9ca14ab308c4eb20f737f93d1cbef6bf487ca245 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Tue, 24 Oct 2023 00:30:05 +0900 Subject: [PATCH 15/45] =?UTF-8?q?Test:=20BaseballGameTest=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1(TDD?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EA=B3=B5=EB=B6=80=20=ED=95=84=EC=9A=94?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/model/PlayerChoice.java | 2 +- src/test/java/baseball/BaseballGameTest.java | 178 ++++++++++++++---- 2 files changed, 139 insertions(+), 41 deletions(-) diff --git a/src/main/java/baseball/model/PlayerChoice.java b/src/main/java/baseball/model/PlayerChoice.java index d1d2b27df4..4b427654b2 100644 --- a/src/main/java/baseball/model/PlayerChoice.java +++ b/src/main/java/baseball/model/PlayerChoice.java @@ -8,7 +8,7 @@ public PlayerChoice(String input) { value = Integer.parseInt(input); } - private void validateChoice(String input) {g + private void validateChoice(String input) { int choice = Integer.parseInt(input); if ((choice != 1) && (choice != 2)) { throw new IllegalArgumentException("[ERROR] 1 또는 2 를 입력해주세요."); diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index b1c87c21bd..efec6d0a63 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -1,112 +1,210 @@ package baseball; +import baseball.controller.GameController; +import baseball.model.ComputerNumber; +import baseball.model.GameResultGenerator; +import baseball.model.PlayerChoice; +import baseball.model.PlayerNumber; +import camp.nextstep.edu.missionutils.Randoms; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.exceptions.base.MockitoException; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.given; public class BaseballGameTest { @DisplayName("1~9의 서로 다른 숫자 3개를 생성한다.") @Test void generateComputerNumber(){ - + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); + assertThat(computerNumber.getNumbers().size()).isEqualTo(3); } @DisplayName("입력 받은 숫자가 1~9의 서로 다른 숫자 3개인 경우 정상 처리 된다.") @Test void validatePlayerNumber_o(){ - + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("123"); + assertThat(playerNumber.getNumbers().size()).isEqualTo(3); } @DisplayName("입력 받은 값에 0이 포함된 경우 예외가 발생한다.") @Test void validatePlayerNumber_ex1(){ - + assertThatThrownBy(() -> PlayerNumber.createPlayerNumber("012")) + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("입력 받은 값이 1~9의 서로 다른 숫자 3개가 아니면 예외가 발생한다.") @Test void validatePlayerNumber_ex2(){ - + assertThatThrownBy(() -> PlayerNumber.createPlayerNumber("144")) + .isInstanceOf(IllegalArgumentException.class); } //입력 받은 숫자와 컴퓨터 숫자 비교 - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 낫싱") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 낫싱") @Test void generateResult1() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("456"); + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isTrue(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(0); + } } - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 1볼") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 숫자 1개가 같고 다른 자리에 있으면 - 1볼") @Test void generateResult2() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("451"); //4,5,1 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isFalse(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(1); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(0); + } } - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 2볼") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼") @Test void generateResult3() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("351"); //3,5,1 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isFalse(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(2); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(0); + } } - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 3볼") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3볼") @Test void generateResult4() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("231"); //2,3,1 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isFalse(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(3); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(0); + } } - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 1스트라이크") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1스트라이크") @Test void generateResult5() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("145"); //1,4,5 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isFalse(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(1); + } } - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 2스트라이크") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2스트라이크") @Test void generateResult6() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("125"); //1,2,5 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isFalse(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(2); + } } - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 3스트라이크") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3스트라이크") @Test void generateResult7() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("123"); //1,4,5 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isFalse(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(3); + } } - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 1볼 1스트라이크") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1볼 1스트라이크") @Test void generateResult8() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("142"); //1,4,2 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isFalse(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(1); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(1); + } } - @DisplayName("입력받은 숫자와 컴퓨터 숫자 비교 - 2볼 1스트라이크") + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼 1스트라이크") @Test void generateResult9() { - + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); + //computerNumber 가 1,2,3이 되도록 mocking + + ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("132"); //1,3,2 + GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + assertThat(gameResultGenerator.isNothing()).isFalse(); + assertThat(gameResultGenerator.getBallCount()).isEqualTo(2); + assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(1); + } } - @DisplayName("결과 문자열 생성") + @DisplayName("게임 종료 문구에 대한 입력값 검증 - 1 이나 2 가 아닌 문자를 넣으면 예외가 발생한다.") @Test - void printResult() { - + void validateInput_ex1() { + assertThatThrownBy(() -> new PlayerChoice("x")) + .isInstanceOf(IllegalArgumentException.class); } -// @DisplayName("3스트라이크인 경우, 게임 종료 문구 출력") -// @Test -// void printWinningResult() { -// -// } -// -// @DisplayName("게임 종료(3스트라이크)가 아닌 경우, 사용자로부터 숫자 입력 받기 진행") -// @Test -// void printNextRoundResult() { -// -// } - - @DisplayName("게임 종료 문구에 대한 입력값 검증 - 1 이나 2 가 아니면 예외가 발생한다.") + @DisplayName("게임 종료 문구에 대한 입력값 검증 - 1 이나 2 가 아닌 다른 숫자를 넣으면 예외가 발생한다.") @Test - void validateInput_ex() { - + void validateInput_ex2() { + assertThatThrownBy(() -> new PlayerChoice("5")) + .isInstanceOf(IllegalArgumentException.class); } } From a6c52db61b80fd153c19795fad53253c16800a1d Mon Sep 17 00:00:00 2001 From: jisu-om Date: Tue, 24 Oct 2023 23:27:42 +0900 Subject: [PATCH 16/45] =?UTF-8?q?Refactor:=20static=20factory=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 4 +- .../java/baseball/model/ComputerNumber.java | 2 +- .../java/baseball/model/PlayerNumber.java | 5 +- src/test/java/baseball/BaseballGameTest.java | 49 +++++++++---------- 4 files changed, 26 insertions(+), 34 deletions(-) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index de6d103856..b48112e544 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -26,7 +26,7 @@ public static boolean run() { * ComputerNumber 생성 */ private static ComputerNumber createComputerNumber() { - return ComputerNumber.createComputerNumber(); + return ComputerNumber.create(); } /** @@ -36,7 +36,7 @@ private static boolean play(ComputerNumber computerNumber) { OutputView.printGetInput(); //사용자로부터 값 입력 받는 문구 출력 String input = InputView.readInput(); //사용자로부터 값을 입력 받기 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber(input); //PlayerNumber 객체 생성 + PlayerNumber playerNumber = PlayerNumber.create(input); //PlayerNumber 객체 생성 //게임 결과 계산 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java index 5cf35ddc42..d6de120232 100644 --- a/src/main/java/baseball/model/ComputerNumber.java +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -12,7 +12,7 @@ private ComputerNumber() { this.numbers = generateNumbers(); } - public static ComputerNumber createComputerNumber () { + public static ComputerNumber create() { return new ComputerNumber(); } diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/PlayerNumber.java index 9fcc29dfb0..f9bc66f479 100644 --- a/src/main/java/baseball/model/PlayerNumber.java +++ b/src/main/java/baseball/model/PlayerNumber.java @@ -1,8 +1,5 @@ package baseball.model; -import baseball.view.InputView; -import baseball.view.OutputView; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -17,7 +14,7 @@ private PlayerNumber(List numbers) { this.numbers = numbers; } - public static PlayerNumber createPlayerNumber(String input) { + public static PlayerNumber create(String input) { validateNonNumeric(input); List numbers = convertToIntegerList(input); validateNonZero(numbers); diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index efec6d0a63..aeed26fe66 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -1,6 +1,5 @@ package baseball; -import baseball.controller.GameController; import baseball.model.ComputerNumber; import baseball.model.GameResultGenerator; import baseball.model.PlayerChoice; @@ -8,21 +7,17 @@ import camp.nextstep.edu.missionutils.Randoms; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.Mockito; -import org.mockito.exceptions.base.MockitoException; import static org.assertj.core.api.Assertions.*; -import static org.mockito.BDDMockito.given; public class BaseballGameTest { @DisplayName("1~9의 서로 다른 숫자 3개를 생성한다.") @Test void generateComputerNumber(){ - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); + ComputerNumber computerNumber = ComputerNumber.create(); assertThat(computerNumber.getNumbers().size()).isEqualTo(3); } @@ -30,21 +25,21 @@ void generateComputerNumber(){ @DisplayName("입력 받은 숫자가 1~9의 서로 다른 숫자 3개인 경우 정상 처리 된다.") @Test void validatePlayerNumber_o(){ - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("123"); + PlayerNumber playerNumber = PlayerNumber.create("123"); assertThat(playerNumber.getNumbers().size()).isEqualTo(3); } @DisplayName("입력 받은 값에 0이 포함된 경우 예외가 발생한다.") @Test void validatePlayerNumber_ex1(){ - assertThatThrownBy(() -> PlayerNumber.createPlayerNumber("012")) + assertThatThrownBy(() -> PlayerNumber.create("012")) .isInstanceOf(IllegalArgumentException.class); } @DisplayName("입력 받은 값이 1~9의 서로 다른 숫자 3개가 아니면 예외가 발생한다.") @Test void validatePlayerNumber_ex2(){ - assertThatThrownBy(() -> PlayerNumber.createPlayerNumber("144")) + assertThatThrownBy(() -> PlayerNumber.create("144")) .isInstanceOf(IllegalArgumentException.class); } @@ -56,8 +51,8 @@ void generateResult1() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("456"); + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("456"); GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isTrue(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); @@ -72,8 +67,8 @@ void generateResult2() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("451"); //4,5,1 + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("451"); //4,5,1 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isFalse(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(1); @@ -88,8 +83,8 @@ void generateResult3() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("351"); //3,5,1 + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("351"); //3,5,1 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isFalse(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(2); @@ -104,8 +99,8 @@ void generateResult4() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("231"); //2,3,1 + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("231"); //2,3,1 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isFalse(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(3); @@ -120,8 +115,8 @@ void generateResult5() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("145"); //1,4,5 + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("145"); //1,4,5 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isFalse(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); @@ -136,8 +131,8 @@ void generateResult6() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("125"); //1,2,5 + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("125"); //1,2,5 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isFalse(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); @@ -152,8 +147,8 @@ void generateResult7() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("123"); //1,4,5 + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("123"); //1,4,5 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isFalse(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); @@ -168,8 +163,8 @@ void generateResult8() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("142"); //1,4,2 + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("142"); //1,4,2 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isFalse(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(1); @@ -184,8 +179,8 @@ void generateResult9() { randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); //computerNumber 가 1,2,3이 되도록 mocking - ComputerNumber computerNumber = ComputerNumber.createComputerNumber(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.createPlayerNumber("132"); //1,3,2 + ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 + PlayerNumber playerNumber = PlayerNumber.create("132"); //1,3,2 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); assertThat(gameResultGenerator.isNothing()).isFalse(); assertThat(gameResultGenerator.getBallCount()).isEqualTo(2); From 06f4fc1559068aa5ac48262532277d93ebc36708 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Wed, 25 Oct 2023 00:50:22 +0900 Subject: [PATCH 17/45] =?UTF-8?q?Refactor:=20GameResultGenerator=EC=9D=98?= =?UTF-8?q?=20calculateResult=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/model/GameResultGenerator.java | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/src/main/java/baseball/model/GameResultGenerator.java b/src/main/java/baseball/model/GameResultGenerator.java index 5ca78e8040..c21969ebbe 100644 --- a/src/main/java/baseball/model/GameResultGenerator.java +++ b/src/main/java/baseball/model/GameResultGenerator.java @@ -1,8 +1,6 @@ package baseball.model; -import java.util.Arrays; import java.util.List; -import java.util.Objects; public class GameResultGenerator { private boolean isNothing = false; @@ -13,40 +11,60 @@ public GameResultGenerator(ComputerNumber computerNumber, PlayerNumber playerNum calculateResult(computerNumber.getNumbers(), playerNumber.getNumbers()); } + public boolean isNothing() { + return isNothing; + } + + public int getBallCount() { + return ballCount; + } + + public int getStrikeCount() { + return strikeCount; + } + + public boolean isThreeStrike() { + return strikeCount == 3; + } private void calculateResult(List computerNumber, List playerNumber) { - if (computerNumber.equals(playerNumber)) { + if (isEqualNumbers(computerNumber, playerNumber)) { strikeCount = 3; return; } + calculateBallAndStrikeCount(computerNumber, playerNumber); + + if (isBallAndStrikeZero()) { + isNothing = true; + } + } + + private boolean isEqualNumbers(List computerNumber, List playerNumber) { + return computerNumber.equals(playerNumber); + } + + private void calculateBallAndStrikeCount(List computerNumber, List playerNumber) { for (int i = 0; i < playerNumber.size(); i++) { - if (computerNumber.contains(playerNumber.get(i))) { //같은 숫자가 존재하고 - if (computerNumber.get(i).equals(playerNumber.get(i))) { //같은 위치에 있으면 + if (isSameNumberExist(computerNumber, playerNumber.get(i))) { + if (isSamePosition(computerNumber.get(i), playerNumber.get(i))) { strikeCount++; continue; } ballCount++; } } - if ((ballCount == 0) && (strikeCount == 0)) { - isNothing = true; - } } - public boolean isNothing() { - return isNothing; + private boolean isSameNumberExist(List computerNumber, Integer playerNumber) { + return computerNumber.contains(playerNumber); } - public int getBallCount() { - return ballCount; - } - - public int getStrikeCount() { - return strikeCount; + private boolean isSamePosition(Integer computerNumber, Integer playerNumber) { + return computerNumber.equals(playerNumber); } - public boolean isThreeStrike() { - return strikeCount == 3; + private boolean isBallAndStrikeZero() { + return ballCount == 0 && strikeCount == 0; } } From 037572c4f211c8910dc774ce4ce732c88fc1f2fc Mon Sep 17 00:00:00 2001 From: jisu-om Date: Thu, 26 Oct 2023 21:30:21 +0900 Subject: [PATCH 18/45] =?UTF-8?q?feat:=20PlayerChoice=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80(=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EC=9D=84=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=EC=97=90=20=EB=8C=80=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=ED=95=98=EC=A7=80=20=EC=95=8A=EC=95=84?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EA=B0=80=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/model/PlayerChoice.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/model/PlayerChoice.java b/src/main/java/baseball/model/PlayerChoice.java index 4b427654b2..97ea3906cc 100644 --- a/src/main/java/baseball/model/PlayerChoice.java +++ b/src/main/java/baseball/model/PlayerChoice.java @@ -4,13 +4,23 @@ public class PlayerChoice { private int value; public PlayerChoice(String input) { - validateChoice(input); - value = Integer.parseInt(input); + int inputToIntValue = validateNumeric(input); + validateInput(inputToIntValue); + value = inputToIntValue; } - private void validateChoice(String input) { - int choice = Integer.parseInt(input); - if ((choice != 1) && (choice != 2)) { + private int validateNumeric(String input) { + int intInputValue; + try { + intInputValue = Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 1 또는 2를 입력해주세요."); + } + return intInputValue; + } + + private void validateInput(int input) { + if ((input != 1) && (input != 2)) { throw new IllegalArgumentException("[ERROR] 1 또는 2 를 입력해주세요."); } } From 3e1c9eaa35435ffcf76341ba88b7b8aa97c1a986 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Thu, 26 Oct 2023 23:30:45 +0900 Subject: [PATCH 19/45] =?UTF-8?q?Refactor:=20PlayerNumber=EC=9D=98=20gette?= =?UTF-8?q?r()=EC=97=90=20=EB=B0=A9=EC=96=B4=EC=A0=81=20=EB=B3=B5=EC=82=AC?= =?UTF-8?q?=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/model/PlayerNumber.java | 2 +- src/test/java/baseball/study/copyTest.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/test/java/baseball/study/copyTest.java diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/PlayerNumber.java index f9bc66f479..e5e0bb946e 100644 --- a/src/main/java/baseball/model/PlayerNumber.java +++ b/src/main/java/baseball/model/PlayerNumber.java @@ -72,6 +72,6 @@ private static void validateSize(List numbers) { } public List getNumbers() { - return numbers; + return new ArrayList<>(numbers); } } diff --git a/src/test/java/baseball/study/copyTest.java b/src/test/java/baseball/study/copyTest.java new file mode 100644 index 0000000000..6abcc227f1 --- /dev/null +++ b/src/test/java/baseball/study/copyTest.java @@ -0,0 +1,18 @@ +package baseball.study; + +import baseball.model.PlayerNumber; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class copyTest { + @DisplayName("방어적 복사") + @Test + void copy() { + String inputStr = "123"; +// List numbersArr = Arrays.asList(1, 2, 3); + PlayerNumber playerNumber = PlayerNumber.create(inputStr); + playerNumber.getNumbers().add(6); + System.out.println("playerNumber.getNumbers() = " + playerNumber.getNumbers()); + + } +} From 8e0b1051a24dfb2207756e5b210792f9f25b99d2 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 27 Oct 2023 00:49:43 +0900 Subject: [PATCH 20/45] =?UTF-8?q?refactor:=20getNumbers()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B0=A9=EC=96=B4=EC=A0=81=20=EB=B3=B5?= =?UTF-8?q?=EC=82=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/model/PlayerNumber.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/PlayerNumber.java index e5e0bb946e..be6b79f206 100644 --- a/src/main/java/baseball/model/PlayerNumber.java +++ b/src/main/java/baseball/model/PlayerNumber.java @@ -1,9 +1,6 @@ package baseball.model; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class PlayerNumber { @@ -72,6 +69,7 @@ private static void validateSize(List numbers) { } public List getNumbers() { - return new ArrayList<>(numbers); +// return new ArrayList<>(numbers); + return Collections.unmodifiableList(numbers); //변경하려 하면 예외 발생시키니까 이 방식이 더 좋겠다. (방어적 복사) } } From e5d24eccb78e3cdca583bdb551b756ea0d8966f3 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 17 Nov 2023 22:48:46 +0900 Subject: [PATCH 21/45] =?UTF-8?q?Refactor:=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 26 ++++--------------- .../java/baseball/model/ComputerNumber.java | 3 --- .../java/baseball/model/PlayerNumber.java | 15 +---------- src/main/java/baseball/view/InputView.java | 1 - 4 files changed, 6 insertions(+), 39 deletions(-) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index b48112e544..1caa28a476 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -8,49 +8,33 @@ import baseball.view.OutputView; public class GameController { - //심판관은 누구라도 괜찮으니까 모든 메서드를 static 으로 만듦 public static boolean run() { - //컴퓨터넘버 생성 ComputerNumber computerNumber = createComputerNumber(); - boolean needNextRound = true; //게임 라운드 계속 진행 여부 + boolean needNextRound = true; while (needNextRound) { - needNextRound = play(computerNumber); //3스트라이크 이면 false 리턴 + needNextRound = play(computerNumber); } - - //게임 종료 이후 재시작, 완전 종료 여부 리턴 return doRestart(); } - /** - * ComputerNumber 생성 - */ private static ComputerNumber createComputerNumber() { return ComputerNumber.create(); } - /** - * 게임 결과가 3스트라이크 인 경우 : false 리턴 - */ private static boolean play(ComputerNumber computerNumber) { - OutputView.printGetInput(); //사용자로부터 값 입력 받는 문구 출력 - String input = InputView.readInput(); //사용자로부터 값을 입력 받기 - PlayerNumber playerNumber = PlayerNumber.create(input); //PlayerNumber 객체 생성 + OutputView.printGetInput(); + String input = InputView.readInput(); + PlayerNumber playerNumber = PlayerNumber.create(input); - //게임 결과 계산 GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - //게임 결과 출력 OutputView.printResult(gameResultGenerator.isNothing(), gameResultGenerator.getBallCount(), gameResultGenerator.getStrikeCount()); - //게임 종료 여부 리턴 (종료면 false 리턴) return !gameResultGenerator.isThreeStrike(); } - /** - * 게임 종료 시 재시작 or 종료 판단 - */ private static boolean doRestart() { OutputView.printEnd(); String input = InputView.readInput(); diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java index d6de120232..85559857e4 100644 --- a/src/main/java/baseball/model/ComputerNumber.java +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -16,9 +16,6 @@ public static ComputerNumber create() { return new ComputerNumber(); } - /** - * 1 ~ 9 의 서로 다른 숫자 3개 생성 - */ private List generateNumbers() { List numbers = new ArrayList<>(); while (numbers.size() != 3) { diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/PlayerNumber.java index be6b79f206..d1c2cdd647 100644 --- a/src/main/java/baseball/model/PlayerNumber.java +++ b/src/main/java/baseball/model/PlayerNumber.java @@ -21,9 +21,6 @@ public static PlayerNumber create(String input) { return new PlayerNumber(numbers); } - /** - * String 을 List 로 변환 - */ private static List convertToIntegerList(String str) { List intList = new ArrayList<>(); for (int i = 0; i < str.length(); i++) { @@ -32,9 +29,6 @@ private static List convertToIntegerList(String str) { return intList; } - /** - * 숫자가 아닌 값이 있는지 검증 - */ private static void validateNonNumeric(String input) { try { Integer.parseInt(input); @@ -43,18 +37,12 @@ private static void validateNonNumeric(String input) { } } - /** - * 0 이 있는지 검증 - */ private static void validateNonZero(List numbers) { if (numbers.contains(0)) { throw new IllegalArgumentException("[ERROR] 0이 아닌 숫자 3개를 입력해주세요."); } } - /** - * 서로 다른 숫자 NUMBERS_SIZE 개 인지 검증 - */ private static void validateDuplicate(List numbers) { Set set = new HashSet<>(numbers); if (set.size() != numbers.size()) { @@ -69,7 +57,6 @@ private static void validateSize(List numbers) { } public List getNumbers() { -// return new ArrayList<>(numbers); - return Collections.unmodifiableList(numbers); //변경하려 하면 예외 발생시키니까 이 방식이 더 좋겠다. (방어적 복사) + return Collections.unmodifiableList(numbers); } } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index cceb8ed854..8adcae0b9e 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -3,7 +3,6 @@ import camp.nextstep.edu.missionutils.Console; public class InputView { - public static String readInput() { return Console.readLine(); } From d41fd8fb3ee40d7b2276add8e2f20c8131112250 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 17 Nov 2023 22:58:51 +0900 Subject: [PATCH 22/45] =?UTF-8?q?Refactor(computerNumber#getNumbers):=20?= =?UTF-8?q?=EB=B6=88=EB=B3=80=EA=B0=9D=EC=B2=B4=20=EB=A6=AC=ED=84=B4?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/model/ComputerNumber.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java index 85559857e4..4f016777ed 100644 --- a/src/main/java/baseball/model/ComputerNumber.java +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -28,6 +28,6 @@ private List generateNumbers() { } public List getNumbers() { - return numbers; + return List.copyOf(numbers); } } From 9eb5ee278e2caff51060965c009375a8c89180f2 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 17 Nov 2023 23:09:15 +0900 Subject: [PATCH 23/45] =?UTF-8?q?Rename(gameResultService):=20service=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=ED=95=98=EC=9C=84=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99,=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 8 +- .../GameResultService.java} | 9 ++- src/test/java/baseball/BaseballGameTest.java | 74 +++++++++---------- 3 files changed, 47 insertions(+), 44 deletions(-) rename src/main/java/baseball/{model/GameResultGenerator.java => service/GameResultService.java} (89%) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 1caa28a476..3e404fb9ce 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -1,7 +1,7 @@ package baseball.controller; import baseball.model.ComputerNumber; -import baseball.model.GameResultGenerator; +import baseball.service.GameResultService; import baseball.model.PlayerChoice; import baseball.model.PlayerNumber; import baseball.view.InputView; @@ -28,11 +28,11 @@ private static boolean play(ComputerNumber computerNumber) { String input = InputView.readInput(); PlayerNumber playerNumber = PlayerNumber.create(input); - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); - OutputView.printResult(gameResultGenerator.isNothing(), gameResultGenerator.getBallCount(), gameResultGenerator.getStrikeCount()); + OutputView.printResult(gameResultService.isNothing(), gameResultService.getBallCount(), gameResultService.getStrikeCount()); - return !gameResultGenerator.isThreeStrike(); + return !gameResultService.isThreeStrike(); } private static boolean doRestart() { diff --git a/src/main/java/baseball/model/GameResultGenerator.java b/src/main/java/baseball/service/GameResultService.java similarity index 89% rename from src/main/java/baseball/model/GameResultGenerator.java rename to src/main/java/baseball/service/GameResultService.java index c21969ebbe..5d9293c7ca 100644 --- a/src/main/java/baseball/model/GameResultGenerator.java +++ b/src/main/java/baseball/service/GameResultService.java @@ -1,13 +1,16 @@ -package baseball.model; +package baseball.service; + +import baseball.model.ComputerNumber; +import baseball.model.PlayerNumber; import java.util.List; -public class GameResultGenerator { +public class GameResultService { private boolean isNothing = false; private int ballCount = 0; private int strikeCount = 0; - public GameResultGenerator(ComputerNumber computerNumber, PlayerNumber playerNumber) { + public GameResultService(ComputerNumber computerNumber, PlayerNumber playerNumber) { calculateResult(computerNumber.getNumbers(), playerNumber.getNumbers()); } diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index aeed26fe66..94b286d1e0 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -1,7 +1,7 @@ package baseball; import baseball.model.ComputerNumber; -import baseball.model.GameResultGenerator; +import baseball.service.GameResultService; import baseball.model.PlayerChoice; import baseball.model.PlayerNumber; import camp.nextstep.edu.missionutils.Randoms; @@ -53,10 +53,10 @@ void generateResult1() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("456"); - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isTrue(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(0); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isTrue(); + assertThat(gameResultService.getBallCount()).isEqualTo(0); + assertThat(gameResultService.getStrikeCount()).isEqualTo(0); } } @@ -69,10 +69,10 @@ void generateResult2() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("451"); //4,5,1 - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isFalse(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(1); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(0); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isFalse(); + assertThat(gameResultService.getBallCount()).isEqualTo(1); + assertThat(gameResultService.getStrikeCount()).isEqualTo(0); } } @@ -85,10 +85,10 @@ void generateResult3() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("351"); //3,5,1 - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isFalse(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(2); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(0); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isFalse(); + assertThat(gameResultService.getBallCount()).isEqualTo(2); + assertThat(gameResultService.getStrikeCount()).isEqualTo(0); } } @@ -101,10 +101,10 @@ void generateResult4() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("231"); //2,3,1 - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isFalse(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(3); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(0); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isFalse(); + assertThat(gameResultService.getBallCount()).isEqualTo(3); + assertThat(gameResultService.getStrikeCount()).isEqualTo(0); } } @@ -117,10 +117,10 @@ void generateResult5() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("145"); //1,4,5 - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isFalse(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(1); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isFalse(); + assertThat(gameResultService.getBallCount()).isEqualTo(0); + assertThat(gameResultService.getStrikeCount()).isEqualTo(1); } } @@ -133,10 +133,10 @@ void generateResult6() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("125"); //1,2,5 - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isFalse(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(2); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isFalse(); + assertThat(gameResultService.getBallCount()).isEqualTo(0); + assertThat(gameResultService.getStrikeCount()).isEqualTo(2); } } @@ -149,10 +149,10 @@ void generateResult7() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("123"); //1,4,5 - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isFalse(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(0); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(3); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isFalse(); + assertThat(gameResultService.getBallCount()).isEqualTo(0); + assertThat(gameResultService.getStrikeCount()).isEqualTo(3); } } @@ -165,10 +165,10 @@ void generateResult8() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("142"); //1,4,2 - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isFalse(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(1); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(1); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isFalse(); + assertThat(gameResultService.getBallCount()).isEqualTo(1); + assertThat(gameResultService.getStrikeCount()).isEqualTo(1); } } @@ -181,10 +181,10 @@ void generateResult9() { ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 PlayerNumber playerNumber = PlayerNumber.create("132"); //1,3,2 - GameResultGenerator gameResultGenerator = new GameResultGenerator(computerNumber, playerNumber); - assertThat(gameResultGenerator.isNothing()).isFalse(); - assertThat(gameResultGenerator.getBallCount()).isEqualTo(2); - assertThat(gameResultGenerator.getStrikeCount()).isEqualTo(1); + GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + assertThat(gameResultService.isNothing()).isFalse(); + assertThat(gameResultService.getBallCount()).isEqualTo(2); + assertThat(gameResultService.getStrikeCount()).isEqualTo(1); } } From 4e95bd04f6324426d377125a31e85d0bc6b7da9b Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 17 Nov 2023 23:27:34 +0900 Subject: [PATCH 24/45] =?UTF-8?q?Refactor(gameController,=20application):?= =?UTF-8?q?=20gameController=20=EC=9D=98=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20=EC=8B=B1=EA=B8=80=ED=86=A4=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 | 10 +++--- .../baseball/controller/GameController.java | 34 +++++++++++++------ 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 485bbf9bb4..d8e663726c 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -2,14 +2,12 @@ import baseball.controller.GameController; import baseball.view.OutputView; +import camp.nextstep.edu.missionutils.Console; public class Application { public static void main(String[] args) { - OutputView.printStart(); - boolean continueRunning = true; - - while (continueRunning) { - continueRunning = GameController.run(); - } + GameController gameController = GameController.getInstance(); + gameController.run(); + Console.close(); } } diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 3e404fb9ce..20afba1079 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -6,32 +6,46 @@ import baseball.model.PlayerNumber; import baseball.view.InputView; import baseball.view.OutputView; +import camp.nextstep.edu.missionutils.Console; public class GameController { - public static boolean run() { + public static GameController instance = new GameController(); + + private GameController() { + } + + public static GameController getInstance() { + return instance; + } + + public void run() { + boolean continuePlaying = true; + while (continuePlaying) { + continuePlaying = play(); + } + } + + private boolean play() { + OutputView.printStart(); ComputerNumber computerNumber = createComputerNumber(); - boolean needNextRound = true; - while (needNextRound) { - needNextRound = play(computerNumber); + boolean needsNextRound = true; + while (needsNextRound) { + needsNextRound = playRound(computerNumber); } return doRestart(); } - private static ComputerNumber createComputerNumber() { + private ComputerNumber createComputerNumber() { return ComputerNumber.create(); } - private static boolean play(ComputerNumber computerNumber) { - + private boolean playRound(ComputerNumber computerNumber) { OutputView.printGetInput(); String input = InputView.readInput(); PlayerNumber playerNumber = PlayerNumber.create(input); - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); - OutputView.printResult(gameResultService.isNothing(), gameResultService.getBallCount(), gameResultService.getStrikeCount()); - return !gameResultService.isThreeStrike(); } From f0d5f4b674031e90702920537d4cc3f2303997d5 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 17 Nov 2023 23:30:45 +0900 Subject: [PATCH 25/45] =?UTF-8?q?Refactor(inputView,=20outputView,=20userN?= =?UTF-8?q?umber):=20inputView,=20outputView=20=EB=B3=80=EA=B2=BD,=20playe?= =?UTF-8?q?rNumber=EC=97=90=EC=84=9C=20userNumber=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 10 ++-- .../{PlayerNumber.java => UserNumber.java} | 8 ++-- .../baseball/service/GameResultService.java | 6 +-- src/main/java/baseball/view/InputView.java | 5 +- src/main/java/baseball/view/OutputView.java | 5 -- src/test/java/baseball/BaseballGameTest.java | 46 +++++++++---------- src/test/java/baseball/study/copyTest.java | 8 ++-- 7 files changed, 42 insertions(+), 46 deletions(-) rename src/main/java/baseball/model/{PlayerNumber.java => UserNumber.java} (90%) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 20afba1079..bb0262d78e 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -1,12 +1,11 @@ package baseball.controller; import baseball.model.ComputerNumber; +import baseball.model.UserNumber; import baseball.service.GameResultService; import baseball.model.PlayerChoice; -import baseball.model.PlayerNumber; import baseball.view.InputView; import baseball.view.OutputView; -import camp.nextstep.edu.missionutils.Console; public class GameController { public static GameController instance = new GameController(); @@ -41,10 +40,9 @@ private ComputerNumber createComputerNumber() { } private boolean playRound(ComputerNumber computerNumber) { - OutputView.printGetInput(); - String input = InputView.readInput(); - PlayerNumber playerNumber = PlayerNumber.create(input); - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + String input = InputView.readUserNumber(); + UserNumber userNumber = UserNumber.create(input); + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); OutputView.printResult(gameResultService.isNothing(), gameResultService.getBallCount(), gameResultService.getStrikeCount()); return !gameResultService.isThreeStrike(); } diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/UserNumber.java similarity index 90% rename from src/main/java/baseball/model/PlayerNumber.java rename to src/main/java/baseball/model/UserNumber.java index d1c2cdd647..9eda0e36a8 100644 --- a/src/main/java/baseball/model/PlayerNumber.java +++ b/src/main/java/baseball/model/UserNumber.java @@ -3,22 +3,22 @@ import java.util.*; -public class PlayerNumber { +public class UserNumber { private final List numbers; private static final int NUMBERS_SIZE = 3; - private PlayerNumber(List numbers) { + private UserNumber(List numbers) { this.numbers = numbers; } - public static PlayerNumber create(String input) { + public static UserNumber create(String input) { validateNonNumeric(input); List numbers = convertToIntegerList(input); validateNonZero(numbers); validateDuplicate(numbers); validateSize(numbers); - return new PlayerNumber(numbers); + return new UserNumber(numbers); } private static List convertToIntegerList(String str) { diff --git a/src/main/java/baseball/service/GameResultService.java b/src/main/java/baseball/service/GameResultService.java index 5d9293c7ca..0efd9daf51 100644 --- a/src/main/java/baseball/service/GameResultService.java +++ b/src/main/java/baseball/service/GameResultService.java @@ -1,7 +1,7 @@ package baseball.service; import baseball.model.ComputerNumber; -import baseball.model.PlayerNumber; +import baseball.model.UserNumber; import java.util.List; @@ -10,8 +10,8 @@ public class GameResultService { private int ballCount = 0; private int strikeCount = 0; - public GameResultService(ComputerNumber computerNumber, PlayerNumber playerNumber) { - calculateResult(computerNumber.getNumbers(), playerNumber.getNumbers()); + public GameResultService(ComputerNumber computerNumber, UserNumber userNumber) { + calculateResult(computerNumber.getNumbers(), userNumber.getNumbers()); } public boolean isNothing() { diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 8adcae0b9e..8233f0d6f0 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -3,7 +3,10 @@ import camp.nextstep.edu.missionutils.Console; public class InputView { - public static String readInput() { + private static final String GET_INPUT_MESSAGE = "숫자를 입력해주세요 : "; + + public static String readUserNumber() { + System.out.print(GET_INPUT_MESSAGE); return Console.readLine(); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index c53e84e3f5..aa94804d68 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -2,7 +2,6 @@ public class OutputView { private static final String START_MESSAGE = "숫자 야구 게임을 시작합니다."; - private static final String GET_INPUT_MESSAGE = "숫자를 입력해주세요 : "; private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료\n게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; private static final String NOTHING = "낫싱"; private static final String BALL_FORMAT = "%d볼 "; @@ -13,10 +12,6 @@ public static void printStart() { System.out.println(START_MESSAGE); } - public static void printGetInput() { - System.out.print(GET_INPUT_MESSAGE); - } - public static void printResult(boolean isNothing, int ballCount, int strikeCount) { if (isNothing) { System.out.println(NOTHING); diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index 94b286d1e0..33a3969f04 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -1,9 +1,9 @@ package baseball; import baseball.model.ComputerNumber; +import baseball.model.UserNumber; import baseball.service.GameResultService; import baseball.model.PlayerChoice; -import baseball.model.PlayerNumber; import camp.nextstep.edu.missionutils.Randoms; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -25,21 +25,21 @@ void generateComputerNumber(){ @DisplayName("입력 받은 숫자가 1~9의 서로 다른 숫자 3개인 경우 정상 처리 된다.") @Test void validatePlayerNumber_o(){ - PlayerNumber playerNumber = PlayerNumber.create("123"); - assertThat(playerNumber.getNumbers().size()).isEqualTo(3); + UserNumber userNumber = UserNumber.create("123"); + assertThat(userNumber.getNumbers().size()).isEqualTo(3); } @DisplayName("입력 받은 값에 0이 포함된 경우 예외가 발생한다.") @Test void validatePlayerNumber_ex1(){ - assertThatThrownBy(() -> PlayerNumber.create("012")) + assertThatThrownBy(() -> UserNumber.create("012")) .isInstanceOf(IllegalArgumentException.class); } @DisplayName("입력 받은 값이 1~9의 서로 다른 숫자 3개가 아니면 예외가 발생한다.") @Test void validatePlayerNumber_ex2(){ - assertThatThrownBy(() -> PlayerNumber.create("144")) + assertThatThrownBy(() -> UserNumber.create("144")) .isInstanceOf(IllegalArgumentException.class); } @@ -52,8 +52,8 @@ void generateResult1() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("456"); - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("456"); + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isTrue(); assertThat(gameResultService.getBallCount()).isEqualTo(0); assertThat(gameResultService.getStrikeCount()).isEqualTo(0); @@ -68,8 +68,8 @@ void generateResult2() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("451"); //4,5,1 - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("451"); //4,5,1 + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(1); assertThat(gameResultService.getStrikeCount()).isEqualTo(0); @@ -84,8 +84,8 @@ void generateResult3() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("351"); //3,5,1 - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("351"); //3,5,1 + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(2); assertThat(gameResultService.getStrikeCount()).isEqualTo(0); @@ -100,8 +100,8 @@ void generateResult4() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("231"); //2,3,1 - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("231"); //2,3,1 + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(3); assertThat(gameResultService.getStrikeCount()).isEqualTo(0); @@ -116,8 +116,8 @@ void generateResult5() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("145"); //1,4,5 - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("145"); //1,4,5 + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); assertThat(gameResultService.getStrikeCount()).isEqualTo(1); @@ -132,8 +132,8 @@ void generateResult6() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("125"); //1,2,5 - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("125"); //1,2,5 + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); assertThat(gameResultService.getStrikeCount()).isEqualTo(2); @@ -148,8 +148,8 @@ void generateResult7() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("123"); //1,4,5 - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("123"); //1,4,5 + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); assertThat(gameResultService.getStrikeCount()).isEqualTo(3); @@ -164,8 +164,8 @@ void generateResult8() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("142"); //1,4,2 - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("142"); //1,4,2 + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(1); assertThat(gameResultService.getStrikeCount()).isEqualTo(1); @@ -180,8 +180,8 @@ void generateResult9() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - PlayerNumber playerNumber = PlayerNumber.create("132"); //1,3,2 - GameResultService gameResultService = new GameResultService(computerNumber, playerNumber); + UserNumber userNumber = UserNumber.create("132"); //1,3,2 + GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(2); assertThat(gameResultService.getStrikeCount()).isEqualTo(1); diff --git a/src/test/java/baseball/study/copyTest.java b/src/test/java/baseball/study/copyTest.java index 6abcc227f1..c9210948df 100644 --- a/src/test/java/baseball/study/copyTest.java +++ b/src/test/java/baseball/study/copyTest.java @@ -1,6 +1,6 @@ package baseball.study; -import baseball.model.PlayerNumber; +import baseball.model.UserNumber; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,9 +10,9 @@ public class copyTest { void copy() { String inputStr = "123"; // List numbersArr = Arrays.asList(1, 2, 3); - PlayerNumber playerNumber = PlayerNumber.create(inputStr); - playerNumber.getNumbers().add(6); - System.out.println("playerNumber.getNumbers() = " + playerNumber.getNumbers()); + UserNumber userNumber = UserNumber.create(inputStr); + userNumber.getNumbers().add(6); + System.out.println("userNumber.getNumbers() = " + userNumber.getNumbers()); } } From 94f2e068ca9c28535ded6d43330f3e8fc44419da Mon Sep 17 00:00:00 2001 From: jisu-om Date: Fri, 17 Nov 2023 23:36:15 +0900 Subject: [PATCH 26/45] =?UTF-8?q?Refactor(inputView,=20outputView,=20playA?= =?UTF-8?q?gainInput):=20playAgainInput=20=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=EB=90=9C=20=EB=B7=B0=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 --- src/main/java/baseball/controller/GameController.java | 8 ++++---- .../model/{PlayerChoice.java => PlayAgainInput.java} | 4 ++-- src/main/java/baseball/view/InputView.java | 10 ++++++++-- src/main/java/baseball/view/OutputView.java | 4 +--- src/test/java/baseball/BaseballGameTest.java | 6 +++--- 5 files changed, 18 insertions(+), 14 deletions(-) rename src/main/java/baseball/model/{PlayerChoice.java => PlayAgainInput.java} (91%) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index bb0262d78e..29a75a9531 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -3,7 +3,7 @@ import baseball.model.ComputerNumber; import baseball.model.UserNumber; import baseball.service.GameResultService; -import baseball.model.PlayerChoice; +import baseball.model.PlayAgainInput; import baseball.view.InputView; import baseball.view.OutputView; @@ -49,8 +49,8 @@ private boolean playRound(ComputerNumber computerNumber) { private static boolean doRestart() { OutputView.printEnd(); - String input = InputView.readInput(); - PlayerChoice playerChoice = new PlayerChoice(input); - return playerChoice.getValue() == 1; + String input = InputView.readPlayAgainInput(); + PlayAgainInput playAgainInput = new PlayAgainInput(input); + return playAgainInput.getValue() == 1; } } diff --git a/src/main/java/baseball/model/PlayerChoice.java b/src/main/java/baseball/model/PlayAgainInput.java similarity index 91% rename from src/main/java/baseball/model/PlayerChoice.java rename to src/main/java/baseball/model/PlayAgainInput.java index 97ea3906cc..d3059e77d2 100644 --- a/src/main/java/baseball/model/PlayerChoice.java +++ b/src/main/java/baseball/model/PlayAgainInput.java @@ -1,9 +1,9 @@ package baseball.model; -public class PlayerChoice { +public class PlayAgainInput { private int value; - public PlayerChoice(String input) { + public PlayAgainInput(String input) { int inputToIntValue = validateNumeric(input); validateInput(inputToIntValue); value = inputToIntValue; diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 8233f0d6f0..c381830224 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -3,10 +3,16 @@ import camp.nextstep.edu.missionutils.Console; public class InputView { - private static final String GET_INPUT_MESSAGE = "숫자를 입력해주세요 : "; + private static final String ASK_USER_NUMBER_MESSAGE = "숫자를 입력해주세요 : "; + private static final String ASK_PLAY_AGAIN_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; public static String readUserNumber() { - System.out.print(GET_INPUT_MESSAGE); + System.out.print(ASK_USER_NUMBER_MESSAGE); + return Console.readLine(); + } + + public static String readPlayAgainInput() { + System.out.println(ASK_PLAY_AGAIN_MESSAGE); return Console.readLine(); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index aa94804d68..b8d6a1e977 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -2,7 +2,7 @@ public class OutputView { private static final String START_MESSAGE = "숫자 야구 게임을 시작합니다."; - private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료\n게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; private static final String NOTHING = "낫싱"; private static final String BALL_FORMAT = "%d볼 "; private static final String STRIKE_FORMAT = "%d스트라이크"; @@ -30,6 +30,4 @@ public static void printResult(boolean isNothing, int ballCount, int strikeCount public static void printEnd() { System.out.println(END_MESSAGE); } - - } diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index 33a3969f04..ce7745c9f2 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -3,7 +3,7 @@ import baseball.model.ComputerNumber; import baseball.model.UserNumber; import baseball.service.GameResultService; -import baseball.model.PlayerChoice; +import baseball.model.PlayAgainInput; import camp.nextstep.edu.missionutils.Randoms; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -191,14 +191,14 @@ void generateResult9() { @DisplayName("게임 종료 문구에 대한 입력값 검증 - 1 이나 2 가 아닌 문자를 넣으면 예외가 발생한다.") @Test void validateInput_ex1() { - assertThatThrownBy(() -> new PlayerChoice("x")) + assertThatThrownBy(() -> new PlayAgainInput("x")) .isInstanceOf(IllegalArgumentException.class); } @DisplayName("게임 종료 문구에 대한 입력값 검증 - 1 이나 2 가 아닌 다른 숫자를 넣으면 예외가 발생한다.") @Test void validateInput_ex2() { - assertThatThrownBy(() -> new PlayerChoice("5")) + assertThatThrownBy(() -> new PlayAgainInput("5")) .isInstanceOf(IllegalArgumentException.class); } From 3611304ecc1e878a870400ab19a1116ffd72616a Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sat, 18 Nov 2023 00:03:06 +0900 Subject: [PATCH 27/45] =?UTF-8?q?Refactor:=20userNumber=20=EB=B0=9B?= =?UTF-8?q?=EA=B3=A0=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 10 ++++-- .../java/baseball/exception/ErrorMessage.java | 18 ++++++++++ .../java/baseball/model/PlayAgainInput.java | 2 +- src/main/java/baseball/model/UserNumber.java | 33 +++++-------------- .../validator/UserNumberInputValidator.java | 23 +++++++++++++ src/main/java/baseball/view/InputView.java | 9 +++-- src/test/java/baseball/BaseballGameTest.java | 24 +++++++------- src/test/java/baseball/study/copyTest.java | 2 +- 8 files changed, 79 insertions(+), 42 deletions(-) create mode 100644 src/main/java/baseball/exception/ErrorMessage.java create mode 100644 src/main/java/baseball/validator/UserNumberInputValidator.java diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 29a75a9531..0916597c98 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -7,6 +7,8 @@ import baseball.view.InputView; import baseball.view.OutputView; +import java.util.List; + public class GameController { public static GameController instance = new GameController(); @@ -40,13 +42,17 @@ private ComputerNumber createComputerNumber() { } private boolean playRound(ComputerNumber computerNumber) { - String input = InputView.readUserNumber(); - UserNumber userNumber = UserNumber.create(input); + UserNumber userNumber = readUserNumber(); GameResultService gameResultService = new GameResultService(computerNumber, userNumber); OutputView.printResult(gameResultService.isNothing(), gameResultService.getBallCount(), gameResultService.getStrikeCount()); return !gameResultService.isThreeStrike(); } + private static UserNumber readUserNumber() { + List numbers = InputView.readUserNumber(); + return UserNumber.from(numbers); + } + private static boolean doRestart() { OutputView.printEnd(); String input = InputView.readPlayAgainInput(); diff --git a/src/main/java/baseball/exception/ErrorMessage.java b/src/main/java/baseball/exception/ErrorMessage.java new file mode 100644 index 0000000000..34358da837 --- /dev/null +++ b/src/main/java/baseball/exception/ErrorMessage.java @@ -0,0 +1,18 @@ +package baseball.exception; + +public enum ErrorMessage { + ERROR_CAPTION("[ERROR] "), + INVALID_USER_NUMBER_INPUT_FORMAT("숫자를 입력해 주세요."), + INVALID_USER_NUMBER_CONTAINS_ZERO("0이 아닌 숫자 3개를 입력해주세요."), + DUPLICATED_USER_NUMBER("서로 다른 숫자 3개를 입력해주세요."); + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return ERROR_CAPTION.message + message; + } +} diff --git a/src/main/java/baseball/model/PlayAgainInput.java b/src/main/java/baseball/model/PlayAgainInput.java index d3059e77d2..305b376ad6 100644 --- a/src/main/java/baseball/model/PlayAgainInput.java +++ b/src/main/java/baseball/model/PlayAgainInput.java @@ -1,7 +1,7 @@ package baseball.model; public class PlayAgainInput { - private int value; + private final int value; public PlayAgainInput(String input) { int inputToIntValue = validateNumeric(input); diff --git a/src/main/java/baseball/model/UserNumber.java b/src/main/java/baseball/model/UserNumber.java index 9eda0e36a8..fccbec2dfe 100644 --- a/src/main/java/baseball/model/UserNumber.java +++ b/src/main/java/baseball/model/UserNumber.java @@ -1,6 +1,10 @@ package baseball.model; import java.util.*; +import java.util.stream.Collectors; + +import static baseball.exception.ErrorMessage.DUPLICATED_USER_NUMBER; +import static baseball.exception.ErrorMessage.INVALID_USER_NUMBER_CONTAINS_ZERO; public class UserNumber { @@ -11,52 +15,33 @@ private UserNumber(List numbers) { this.numbers = numbers; } - public static UserNumber create(String input) { - validateNonNumeric(input); - List numbers = convertToIntegerList(input); + public static UserNumber from(List numbers) { validateNonZero(numbers); validateDuplicate(numbers); validateSize(numbers); - return new UserNumber(numbers); } - private static List convertToIntegerList(String str) { - List intList = new ArrayList<>(); - for (int i = 0; i < str.length(); i++) { - intList.add(Integer.parseInt(str.substring(i, i+1))); - } - return intList; - } - - private static void validateNonNumeric(String input) { - try { - Integer.parseInt(input); - } catch(NumberFormatException e) { - throw new IllegalArgumentException("[ERROR] 숫자를 입력해주세요."); - } - } - private static void validateNonZero(List numbers) { if (numbers.contains(0)) { - throw new IllegalArgumentException("[ERROR] 0이 아닌 숫자 3개를 입력해주세요."); + throw new IllegalArgumentException(INVALID_USER_NUMBER_CONTAINS_ZERO.getMessage()); } } private static void validateDuplicate(List numbers) { Set set = new HashSet<>(numbers); if (set.size() != numbers.size()) { - throw new IllegalArgumentException("[ERROR] 서로 다른 숫자 3개를 입력해주세요."); + throw new IllegalArgumentException(DUPLICATED_USER_NUMBER.getMessage()); } } private static void validateSize(List numbers) { if (numbers.size() != NUMBERS_SIZE) { - throw new IllegalArgumentException("[ERROR] 서로 다른 숫자 3개를 입력해주세요."); + throw new IllegalArgumentException(DUPLICATED_USER_NUMBER.getMessage()); } } public List getNumbers() { - return Collections.unmodifiableList(numbers); + return List.copyOf(numbers); } } diff --git a/src/main/java/baseball/validator/UserNumberInputValidator.java b/src/main/java/baseball/validator/UserNumberInputValidator.java new file mode 100644 index 0000000000..1bc2989c09 --- /dev/null +++ b/src/main/java/baseball/validator/UserNumberInputValidator.java @@ -0,0 +1,23 @@ +package baseball.validator; + +import java.util.List; +import java.util.stream.Collectors; + +import static baseball.exception.ErrorMessage.INVALID_USER_NUMBER_INPUT_FORMAT; + +public class UserNumberInputValidator { + public static void validateNumeric(String input) { + try { + Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(INVALID_USER_NUMBER_INPUT_FORMAT.getMessage()); + } + } + + public static List convertToIntegerList(String input) { + return input.chars() + .map(Character::getNumericValue) + .boxed() + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index c381830224..37b92137f4 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,14 +1,19 @@ package baseball.view; +import baseball.validator.UserNumberInputValidator; import camp.nextstep.edu.missionutils.Console; +import java.util.List; + public class InputView { private static final String ASK_USER_NUMBER_MESSAGE = "숫자를 입력해주세요 : "; private static final String ASK_PLAY_AGAIN_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; - public static String readUserNumber() { + public static List readUserNumber() { System.out.print(ASK_USER_NUMBER_MESSAGE); - return Console.readLine(); + String input = Console.readLine(); + UserNumberInputValidator.validateNumeric(input); + return UserNumberInputValidator.convertToIntegerList(input); } public static String readPlayAgainInput() { diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index ce7745c9f2..ccab357a13 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -25,21 +25,21 @@ void generateComputerNumber(){ @DisplayName("입력 받은 숫자가 1~9의 서로 다른 숫자 3개인 경우 정상 처리 된다.") @Test void validatePlayerNumber_o(){ - UserNumber userNumber = UserNumber.create("123"); + UserNumber userNumber = UserNumber.from("123"); assertThat(userNumber.getNumbers().size()).isEqualTo(3); } @DisplayName("입력 받은 값에 0이 포함된 경우 예외가 발생한다.") @Test void validatePlayerNumber_ex1(){ - assertThatThrownBy(() -> UserNumber.create("012")) + assertThatThrownBy(() -> UserNumber.from("012")) .isInstanceOf(IllegalArgumentException.class); } @DisplayName("입력 받은 값이 1~9의 서로 다른 숫자 3개가 아니면 예외가 발생한다.") @Test void validatePlayerNumber_ex2(){ - assertThatThrownBy(() -> UserNumber.create("144")) + assertThatThrownBy(() -> UserNumber.from("144")) .isInstanceOf(IllegalArgumentException.class); } @@ -52,7 +52,7 @@ void generateResult1() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("456"); + UserNumber userNumber = UserNumber.from("456"); GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isTrue(); assertThat(gameResultService.getBallCount()).isEqualTo(0); @@ -68,7 +68,7 @@ void generateResult2() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("451"); //4,5,1 + UserNumber userNumber = UserNumber.from("451"); //4,5,1 GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(1); @@ -84,7 +84,7 @@ void generateResult3() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("351"); //3,5,1 + UserNumber userNumber = UserNumber.from("351"); //3,5,1 GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(2); @@ -100,7 +100,7 @@ void generateResult4() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("231"); //2,3,1 + UserNumber userNumber = UserNumber.from("231"); //2,3,1 GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(3); @@ -116,7 +116,7 @@ void generateResult5() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("145"); //1,4,5 + UserNumber userNumber = UserNumber.from("145"); //1,4,5 GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); @@ -132,7 +132,7 @@ void generateResult6() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("125"); //1,2,5 + UserNumber userNumber = UserNumber.from("125"); //1,2,5 GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); @@ -148,7 +148,7 @@ void generateResult7() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("123"); //1,4,5 + UserNumber userNumber = UserNumber.from("123"); //1,4,5 GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); @@ -164,7 +164,7 @@ void generateResult8() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("142"); //1,4,2 + UserNumber userNumber = UserNumber.from("142"); //1,4,2 GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(1); @@ -180,7 +180,7 @@ void generateResult9() { //computerNumber 가 1,2,3이 되도록 mocking ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.create("132"); //1,3,2 + UserNumber userNumber = UserNumber.from("132"); //1,3,2 GameResultService gameResultService = new GameResultService(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(2); diff --git a/src/test/java/baseball/study/copyTest.java b/src/test/java/baseball/study/copyTest.java index c9210948df..7ffc6d57e8 100644 --- a/src/test/java/baseball/study/copyTest.java +++ b/src/test/java/baseball/study/copyTest.java @@ -10,7 +10,7 @@ public class copyTest { void copy() { String inputStr = "123"; // List numbersArr = Arrays.asList(1, 2, 3); - UserNumber userNumber = UserNumber.create(inputStr); + UserNumber userNumber = UserNumber.from(inputStr); userNumber.getNumbers().add(6); System.out.println("userNumber.getNumbers() = " + userNumber.getNumbers()); From d17cf9be81395b0b9f3b9b25fe587ffa0cdb1e01 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sat, 18 Nov 2023 00:38:15 +0900 Subject: [PATCH 28/45] =?UTF-8?q?Refactor:=20playAgainDecision=20=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81,=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 20 ++- .../java/baseball/exception/ErrorMessage.java | 3 +- .../baseball/model/PlayAgainDecision.java | 38 +++++ .../java/baseball/model/PlayAgainInput.java | 31 ----- .../baseball/service/GameResultService.java | 6 +- .../validator/PlayAgainInputValidator.java | 13 ++ src/main/java/baseball/view/InputView.java | 6 +- src/test/java/baseball/BaseballGameTest.java | 131 +++++++----------- .../baseball/model/PlayAgainDecisionTest.java | 16 +++ .../java/baseball/model/UserNumberTest.java | 37 +++++ .../service/GameResultServiceTest.java | 14 ++ src/test/java/baseball/study/copyTest.java | 18 --- 12 files changed, 190 insertions(+), 143 deletions(-) create mode 100644 src/main/java/baseball/model/PlayAgainDecision.java delete mode 100644 src/main/java/baseball/model/PlayAgainInput.java create mode 100644 src/main/java/baseball/validator/PlayAgainInputValidator.java create mode 100644 src/test/java/baseball/model/PlayAgainDecisionTest.java create mode 100644 src/test/java/baseball/model/UserNumberTest.java create mode 100644 src/test/java/baseball/service/GameResultServiceTest.java delete mode 100644 src/test/java/baseball/study/copyTest.java diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 0916597c98..301be638f3 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -3,7 +3,7 @@ import baseball.model.ComputerNumber; import baseball.model.UserNumber; import baseball.service.GameResultService; -import baseball.model.PlayAgainInput; +import baseball.model.PlayAgainDecision; import baseball.view.InputView; import baseball.view.OutputView; @@ -11,6 +11,7 @@ public class GameController { public static GameController instance = new GameController(); + private GameResultService gameResultService; private GameController() { } @@ -34,7 +35,7 @@ private boolean play() { while (needsNextRound) { needsNextRound = playRound(computerNumber); } - return doRestart(); + return wantsRestart(); } private ComputerNumber createComputerNumber() { @@ -43,7 +44,8 @@ private ComputerNumber createComputerNumber() { private boolean playRound(ComputerNumber computerNumber) { UserNumber userNumber = readUserNumber(); - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + //computerNumber, userNumber 가 최대한 일을 하게 하자. 그리고 둘이 같이 필요한 경우 GameResultService 이용 + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); OutputView.printResult(gameResultService.isNothing(), gameResultService.getBallCount(), gameResultService.getStrikeCount()); return !gameResultService.isThreeStrike(); } @@ -53,10 +55,14 @@ private static UserNumber readUserNumber() { return UserNumber.from(numbers); } - private static boolean doRestart() { + private static boolean wantsRestart() { OutputView.printEnd(); - String input = InputView.readPlayAgainInput(); - PlayAgainInput playAgainInput = new PlayAgainInput(input); - return playAgainInput.getValue() == 1; + PlayAgainDecision playAgainDecision = readPlayAgainInput(); + return playAgainDecision.isAgain(); + } + + private static PlayAgainDecision readPlayAgainInput() { + int input = InputView.readPlayAgainInput(); + return PlayAgainDecision.of(input); } } diff --git a/src/main/java/baseball/exception/ErrorMessage.java b/src/main/java/baseball/exception/ErrorMessage.java index 34358da837..004e2a020f 100644 --- a/src/main/java/baseball/exception/ErrorMessage.java +++ b/src/main/java/baseball/exception/ErrorMessage.java @@ -4,7 +4,8 @@ public enum ErrorMessage { ERROR_CAPTION("[ERROR] "), INVALID_USER_NUMBER_INPUT_FORMAT("숫자를 입력해 주세요."), INVALID_USER_NUMBER_CONTAINS_ZERO("0이 아닌 숫자 3개를 입력해주세요."), - DUPLICATED_USER_NUMBER("서로 다른 숫자 3개를 입력해주세요."); + DUPLICATED_USER_NUMBER("서로 다른 숫자 3개를 입력해주세요."), + INVALID_PLAY_AGAIN("1 또는 2를 입력해주세요."); private final String message; diff --git a/src/main/java/baseball/model/PlayAgainDecision.java b/src/main/java/baseball/model/PlayAgainDecision.java new file mode 100644 index 0000000000..816633baeb --- /dev/null +++ b/src/main/java/baseball/model/PlayAgainDecision.java @@ -0,0 +1,38 @@ +package baseball.model; + +import static baseball.exception.ErrorMessage.INVALID_PLAY_AGAIN; +import static baseball.model.PlayAgainDecision.PlayAgainConstants.*; + +public class PlayAgainDecision { + private final int value; + + private PlayAgainDecision(int input) { + value = input; + } + + public static PlayAgainDecision of(int input) { + validate(input); + return new PlayAgainDecision(input); + } + + private static void validate(int input) { + if ((input != YES.value) && (input != NO.value)) { + throw new IllegalArgumentException(INVALID_PLAY_AGAIN.getMessage()); + } + } + + public boolean isAgain() { + return value == YES.value; + } + + enum PlayAgainConstants { + YES(1), + NO(2); + + private final int value; + + PlayAgainConstants(int value) { + this.value = value; + } + } +} diff --git a/src/main/java/baseball/model/PlayAgainInput.java b/src/main/java/baseball/model/PlayAgainInput.java deleted file mode 100644 index 305b376ad6..0000000000 --- a/src/main/java/baseball/model/PlayAgainInput.java +++ /dev/null @@ -1,31 +0,0 @@ -package baseball.model; - -public class PlayAgainInput { - private final int value; - - public PlayAgainInput(String input) { - int inputToIntValue = validateNumeric(input); - validateInput(inputToIntValue); - value = inputToIntValue; - } - - private int validateNumeric(String input) { - int intInputValue; - try { - intInputValue = Integer.parseInt(input); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("[ERROR] 1 또는 2를 입력해주세요."); - } - return intInputValue; - } - - private void validateInput(int input) { - if ((input != 1) && (input != 2)) { - throw new IllegalArgumentException("[ERROR] 1 또는 2 를 입력해주세요."); - } - } - - public int getValue() { - return value; - } -} diff --git a/src/main/java/baseball/service/GameResultService.java b/src/main/java/baseball/service/GameResultService.java index 0efd9daf51..6fe66b1178 100644 --- a/src/main/java/baseball/service/GameResultService.java +++ b/src/main/java/baseball/service/GameResultService.java @@ -10,10 +10,14 @@ public class GameResultService { private int ballCount = 0; private int strikeCount = 0; - public GameResultService(ComputerNumber computerNumber, UserNumber userNumber) { + private GameResultService(ComputerNumber computerNumber, UserNumber userNumber) { calculateResult(computerNumber.getNumbers(), userNumber.getNumbers()); } + public static GameResultService of(ComputerNumber computerNumber, UserNumber userNumber) { + return new GameResultService(computerNumber, userNumber); + } + public boolean isNothing() { return isNothing; } diff --git a/src/main/java/baseball/validator/PlayAgainInputValidator.java b/src/main/java/baseball/validator/PlayAgainInputValidator.java new file mode 100644 index 0000000000..7afe95bbd2 --- /dev/null +++ b/src/main/java/baseball/validator/PlayAgainInputValidator.java @@ -0,0 +1,13 @@ +package baseball.validator; + +import static baseball.exception.ErrorMessage.INVALID_PLAY_AGAIN; + +public class PlayAgainInputValidator { + public static int safeParseInt(String input) { + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(INVALID_PLAY_AGAIN.getMessage()); + } + } +} diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 37b92137f4..47b64e6169 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.validator.PlayAgainInputValidator; import baseball.validator.UserNumberInputValidator; import camp.nextstep.edu.missionutils.Console; @@ -16,8 +17,9 @@ public static List readUserNumber() { return UserNumberInputValidator.convertToIntegerList(input); } - public static String readPlayAgainInput() { + public static int readPlayAgainInput() { System.out.println(ASK_PLAY_AGAIN_MESSAGE); - return Console.readLine(); + String input = Console.readLine(); + return PlayAgainInputValidator.safeParseInt(input); } } diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index ccab357a13..f2c47c9616 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -1,59 +1,40 @@ package baseball; import baseball.model.ComputerNumber; +import baseball.model.PlayAgainDecision; import baseball.model.UserNumber; import baseball.service.GameResultService; -import baseball.model.PlayAgainInput; import camp.nextstep.edu.missionutils.Randoms; 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 org.mockito.MockedStatic; import org.mockito.Mockito; -import static org.assertj.core.api.Assertions.*; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class BaseballGameTest { @DisplayName("1~9의 서로 다른 숫자 3개를 생성한다.") @Test - void generateComputerNumber(){ + void generateComputerNumber() { ComputerNumber computerNumber = ComputerNumber.create(); assertThat(computerNumber.getNumbers().size()).isEqualTo(3); } - - @DisplayName("입력 받은 숫자가 1~9의 서로 다른 숫자 3개인 경우 정상 처리 된다.") - @Test - void validatePlayerNumber_o(){ - UserNumber userNumber = UserNumber.from("123"); - assertThat(userNumber.getNumbers().size()).isEqualTo(3); - } - - @DisplayName("입력 받은 값에 0이 포함된 경우 예외가 발생한다.") - @Test - void validatePlayerNumber_ex1(){ - assertThatThrownBy(() -> UserNumber.from("012")) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("입력 받은 값이 1~9의 서로 다른 숫자 3개가 아니면 예외가 발생한다.") - @Test - void validatePlayerNumber_ex2(){ - assertThatThrownBy(() -> UserNumber.from("144")) - .isInstanceOf(IllegalArgumentException.class); - } - - //입력 받은 숫자와 컴퓨터 숫자 비교 @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 낫싱") @Test void generateResult1() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("456"); - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(4, 5, 6)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isTrue(); assertThat(gameResultService.getBallCount()).isEqualTo(0); assertThat(gameResultService.getStrikeCount()).isEqualTo(0); @@ -64,12 +45,11 @@ void generateResult1() { @Test void generateResult2() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("451"); //4,5,1 - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(4, 5, 1)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(1); assertThat(gameResultService.getStrikeCount()).isEqualTo(0); @@ -80,12 +60,11 @@ void generateResult2() { @Test void generateResult3() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("351"); //3,5,1 - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(3, 5, 1)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(2); assertThat(gameResultService.getStrikeCount()).isEqualTo(0); @@ -96,12 +75,11 @@ void generateResult3() { @Test void generateResult4() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("231"); //2,3,1 - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(2, 3, 1)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(3); assertThat(gameResultService.getStrikeCount()).isEqualTo(0); @@ -112,12 +90,11 @@ void generateResult4() { @Test void generateResult5() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("145"); //1,4,5 - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); assertThat(gameResultService.getStrikeCount()).isEqualTo(1); @@ -128,12 +105,11 @@ void generateResult5() { @Test void generateResult6() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("125"); //1,2,5 - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 2, 5)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); assertThat(gameResultService.getStrikeCount()).isEqualTo(2); @@ -144,12 +120,11 @@ void generateResult6() { @Test void generateResult7() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("123"); //1,4,5 - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(0); assertThat(gameResultService.getStrikeCount()).isEqualTo(3); @@ -160,12 +135,11 @@ void generateResult7() { @Test void generateResult8() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("142"); //1,4,2 - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 4, 2)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(1); assertThat(gameResultService.getStrikeCount()).isEqualTo(1); @@ -176,30 +150,21 @@ void generateResult8() { @Test void generateResult9() { try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1,9)).thenReturn(1).thenReturn(2).thenReturn(3); - //computerNumber 가 1,2,3이 되도록 mocking + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - ComputerNumber computerNumber = ComputerNumber.create(); //1,2,3 - UserNumber userNumber = UserNumber.from("132"); //1,3,2 - GameResultService gameResultService = new GameResultService(computerNumber, userNumber); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 3, 2)); + GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); assertThat(gameResultService.isNothing()).isFalse(); assertThat(gameResultService.getBallCount()).isEqualTo(2); assertThat(gameResultService.getStrikeCount()).isEqualTo(1); } } - @DisplayName("게임 종료 문구에 대한 입력값 검증 - 1 이나 2 가 아닌 문자를 넣으면 예외가 발생한다.") - @Test - void validateInput_ex1() { - assertThatThrownBy(() -> new PlayAgainInput("x")) + @ParameterizedTest(name = "[{index}] {0} 을 넣으면 예외가 발생한다.") + @ValueSource(ints = {-1, 0, 3, 5, 100}) + void validateInput_ex(int element) { + assertThatThrownBy(() -> PlayAgainDecision.of(element)) .isInstanceOf(IllegalArgumentException.class); } - - @DisplayName("게임 종료 문구에 대한 입력값 검증 - 1 이나 2 가 아닌 다른 숫자를 넣으면 예외가 발생한다.") - @Test - void validateInput_ex2() { - assertThatThrownBy(() -> new PlayAgainInput("5")) - .isInstanceOf(IllegalArgumentException.class); - } - } diff --git a/src/test/java/baseball/model/PlayAgainDecisionTest.java b/src/test/java/baseball/model/PlayAgainDecisionTest.java new file mode 100644 index 0000000000..2cb2534233 --- /dev/null +++ b/src/test/java/baseball/model/PlayAgainDecisionTest.java @@ -0,0 +1,16 @@ +package baseball.model; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class PlayAgainDecisionTest { + + @ParameterizedTest(name = "[{index}] {0} 을 넣으면 예외가 발생한다.") + @ValueSource(ints = {-1, 0, 3, 5, 100}) + void validateInput_ex(int element) { + assertThatThrownBy(() -> PlayAgainDecision.of(element)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file diff --git a/src/test/java/baseball/model/UserNumberTest.java b/src/test/java/baseball/model/UserNumberTest.java new file mode 100644 index 0000000000..bb7098911a --- /dev/null +++ b/src/test/java/baseball/model/UserNumberTest.java @@ -0,0 +1,37 @@ +package baseball.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class UserNumberTest { + @DisplayName("입력 받은 숫자가 1~9의 서로 다른 숫자 3개인 경우 정상 처리 된다.") + @Test + void validatePlayerNumber_o() { + UserNumber userNumber = UserNumber.from(List.of(1, 2, 3)); + assertThat(userNumber.getNumbers().size()).isEqualTo(3); + } + + @ParameterizedTest(name = "[{index}] {0} 입력 시 예외가 발생한다.") + @MethodSource("generateData") + void validatePlayerNumber_ex(List numbers) { + assertThatThrownBy(() -> UserNumber.from(numbers)) + .isInstanceOf(IllegalArgumentException.class); + } + + static Stream generateData() { + return Stream.of( + Arguments.of(List.of(0, 1, 2)), + Arguments.of(List.of(1, 1, 2)), + Arguments.of(List.of(1, 2, 10)) + ); + } +} \ No newline at end of file diff --git a/src/test/java/baseball/service/GameResultServiceTest.java b/src/test/java/baseball/service/GameResultServiceTest.java new file mode 100644 index 0000000000..fc6140078d --- /dev/null +++ b/src/test/java/baseball/service/GameResultServiceTest.java @@ -0,0 +1,14 @@ +package baseball.service; + + +class GameResultServiceTest { + + //computerNumber, userNumber 비교하여 나오는 결과 테스트 시 사용 가능 +// static Stream generateData() { +// return Stream.of( +// Arguments.of(Arrays.asList(1, 2, 3), Arrays.asList(1, 3, 2), 0), +// Arguments.of(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), 1) +// ); +// } + +} \ No newline at end of file diff --git a/src/test/java/baseball/study/copyTest.java b/src/test/java/baseball/study/copyTest.java deleted file mode 100644 index 7ffc6d57e8..0000000000 --- a/src/test/java/baseball/study/copyTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package baseball.study; - -import baseball.model.UserNumber; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -public class copyTest { - @DisplayName("방어적 복사") - @Test - void copy() { - String inputStr = "123"; -// List numbersArr = Arrays.asList(1, 2, 3); - UserNumber userNumber = UserNumber.from(inputStr); - userNumber.getNumbers().add(6); - System.out.println("userNumber.getNumbers() = " + userNumber.getNumbers()); - - } -} From a55fef3f3ac2aaa7cadde02d66232c1a612bbeee Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 19 Nov 2023 00:01:37 +0900 Subject: [PATCH 29/45] =?UTF-8?q?Refactor:=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20-=20=EA=B0=9D=EC=B2=B4=EA=B0=80=20=EB=8A=A5?= =?UTF-8?q?=EB=8F=99=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=9D=BC=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 1 - .../baseball/controller/GameController.java | 64 ++++++++------- .../java/baseball/dto/RoundResultDto.java | 32 ++++++++ .../java/baseball/model/ComputerNumber.java | 27 +++---- .../baseball/model/PlayAgainDecision.java | 3 +- src/main/java/baseball/model/RoundResult.java | 52 +++++++++++++ src/main/java/baseball/model/UserNumber.java | 32 ++------ .../java/baseball/service/GameManager.java | 28 +++++++ .../baseball/service/GameResultService.java | 77 ------------------- src/main/java/baseball/utils/Constants.java | 6 ++ .../java/baseball/utils/NumbersGenerator.java | 19 +++++ .../validator/PlayAgainInputValidator.java | 2 +- .../utils/validator/UserNumberValidator.java | 48 ++++++++++++ .../validator/UserNumberInputValidator.java | 23 ------ src/main/java/baseball/view/InputView.java | 8 +- src/test/java/baseball/BaseballGameTest.java | 74 +++++++++--------- 16 files changed, 279 insertions(+), 217 deletions(-) create mode 100644 src/main/java/baseball/dto/RoundResultDto.java create mode 100644 src/main/java/baseball/model/RoundResult.java create mode 100644 src/main/java/baseball/service/GameManager.java delete mode 100644 src/main/java/baseball/service/GameResultService.java create mode 100644 src/main/java/baseball/utils/Constants.java create mode 100644 src/main/java/baseball/utils/NumbersGenerator.java rename src/main/java/baseball/{ => utils}/validator/PlayAgainInputValidator.java (91%) create mode 100644 src/main/java/baseball/utils/validator/UserNumberValidator.java delete mode 100644 src/main/java/baseball/validator/UserNumberInputValidator.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index d8e663726c..a5bd9d2c5e 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,6 @@ package baseball; import baseball.controller.GameController; -import baseball.view.OutputView; import camp.nextstep.edu.missionutils.Console; public class Application { diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 301be638f3..1d6c63b790 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -1,9 +1,10 @@ package baseball.controller; +import baseball.dto.RoundResultDto; import baseball.model.ComputerNumber; -import baseball.model.UserNumber; -import baseball.service.GameResultService; import baseball.model.PlayAgainDecision; +import baseball.model.UserNumber; +import baseball.service.GameManager; import baseball.view.InputView; import baseball.view.OutputView; @@ -11,7 +12,7 @@ public class GameController { public static GameController instance = new GameController(); - private GameResultService gameResultService; + private GameManager gameManager; private GameController() { } @@ -20,6 +21,22 @@ public static GameController getInstance() { return instance; } + private static UserNumber readUserNumber() { + List numbers = InputView.readUserNumber(); + return UserNumber.from(numbers); + } + + private static boolean wantsRestart() { + OutputView.printEnd(); + PlayAgainDecision playAgainDecision = readPlayAgainInput(); + return playAgainDecision.isAgain(); + } + + private static PlayAgainDecision readPlayAgainInput() { + int input = InputView.readPlayAgainInput(); + return PlayAgainDecision.of(input); + } + public void run() { boolean continuePlaying = true; while (continuePlaying) { @@ -29,40 +46,29 @@ public void run() { private boolean play() { OutputView.printStart(); - ComputerNumber computerNumber = createComputerNumber(); - + initializeGameManager(); boolean needsNextRound = true; while (needsNextRound) { - needsNextRound = playRound(computerNumber); + UserNumber userNumber = readUserNumber(); + needsNextRound = playRound(userNumber); + printRoundResult(); } return wantsRestart(); } - private ComputerNumber createComputerNumber() { - return ComputerNumber.create(); - } - - private boolean playRound(ComputerNumber computerNumber) { - UserNumber userNumber = readUserNumber(); - //computerNumber, userNumber 가 최대한 일을 하게 하자. 그리고 둘이 같이 필요한 경우 GameResultService 이용 - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - OutputView.printResult(gameResultService.isNothing(), gameResultService.getBallCount(), gameResultService.getStrikeCount()); - return !gameResultService.isThreeStrike(); - } - - private static UserNumber readUserNumber() { - List numbers = InputView.readUserNumber(); - return UserNumber.from(numbers); + private void initializeGameManager() { + ComputerNumber computerNumber = ComputerNumber.create(); + gameManager = GameManager.from(computerNumber); } - private static boolean wantsRestart() { - OutputView.printEnd(); - PlayAgainDecision playAgainDecision = readPlayAgainInput(); - return playAgainDecision.isAgain(); + private boolean playRound(UserNumber userNumber) { + boolean needsNextRound; + needsNextRound = gameManager.playRound(userNumber); + return needsNextRound; } - private static PlayAgainDecision readPlayAgainInput() { - int input = InputView.readPlayAgainInput(); - return PlayAgainDecision.of(input); + private void printRoundResult() { + RoundResultDto resultDto = gameManager.createResultDto(); + OutputView.printResult(resultDto.isNothing(), resultDto.getBallCount(), resultDto.getStrikeCount()); } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/dto/RoundResultDto.java b/src/main/java/baseball/dto/RoundResultDto.java new file mode 100644 index 0000000000..147c26d001 --- /dev/null +++ b/src/main/java/baseball/dto/RoundResultDto.java @@ -0,0 +1,32 @@ +package baseball.dto; + +import baseball.model.RoundResult; + +public class RoundResultDto { + public boolean isNothing; + public int ballCount; + public int strikeCount; + + private RoundResultDto() { + } + + public static RoundResultDto from(RoundResult roundResult) { + RoundResultDto dto = new RoundResultDto(); + dto.isNothing = roundResult.isNothing(); + dto.ballCount = roundResult.provideBallCount(); + dto.strikeCount = roundResult.provideStrikeCount(); + return dto; + } + + public boolean isNothing() { + return isNothing; + } + + public int getBallCount() { + return ballCount; + } + + public int getStrikeCount() { + return strikeCount; + } +} \ No newline at end of file diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java index 4f016777ed..4ededa9013 100644 --- a/src/main/java/baseball/model/ComputerNumber.java +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -1,33 +1,26 @@ package baseball.model; -import camp.nextstep.edu.missionutils.Randoms; +import baseball.utils.NumbersGenerator; -import java.util.ArrayList; import java.util.List; public class ComputerNumber { private final List numbers; - private ComputerNumber() { - this.numbers = generateNumbers(); + private ComputerNumber(List numbers) { + this.numbers = numbers; } public static ComputerNumber create() { - return new ComputerNumber(); + List numbers = NumbersGenerator.generate(); + return new ComputerNumber(numbers); } - private List generateNumbers() { - List numbers = new ArrayList<>(); - while (numbers.size() != 3) { - int number = Randoms.pickNumberInRange(1, 9); - if (!numbers.contains(number)) { - numbers.add(number); - } - } - return numbers; + public boolean containsNumber(int number) { + return numbers.contains(number); } - public List getNumbers() { - return List.copyOf(numbers); + public int findNumberByPosition(int position) { + return numbers.get(position); } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/model/PlayAgainDecision.java b/src/main/java/baseball/model/PlayAgainDecision.java index 816633baeb..2c42ab58ed 100644 --- a/src/main/java/baseball/model/PlayAgainDecision.java +++ b/src/main/java/baseball/model/PlayAgainDecision.java @@ -1,7 +1,8 @@ package baseball.model; import static baseball.exception.ErrorMessage.INVALID_PLAY_AGAIN; -import static baseball.model.PlayAgainDecision.PlayAgainConstants.*; +import static baseball.model.PlayAgainDecision.PlayAgainConstants.NO; +import static baseball.model.PlayAgainDecision.PlayAgainConstants.YES; public class PlayAgainDecision { private final int value; diff --git a/src/main/java/baseball/model/RoundResult.java b/src/main/java/baseball/model/RoundResult.java new file mode 100644 index 0000000000..120be543e2 --- /dev/null +++ b/src/main/java/baseball/model/RoundResult.java @@ -0,0 +1,52 @@ +package baseball.model; + +import java.util.stream.IntStream; + +import static baseball.utils.Constants.NUMBERS_SIZE; +import static baseball.utils.Constants.START_INDEX; + +public class RoundResult { + private int ballCount = 0; + private int strikeCount = 0; + + private RoundResult(ComputerNumber computerNumber, UserNumber userNumber) { + processRound(computerNumber, userNumber); + } + + public static RoundResult create(ComputerNumber computerNumber, UserNumber userNumber) { + return new RoundResult(computerNumber, userNumber); + } + + private void processRound(ComputerNumber computerNumber, UserNumber userNumber) { + IntStream.range(START_INDEX, NUMBERS_SIZE).forEach(position -> { + int number = userNumber.findNumberByPosition(position); + calculateBallAndStrike(computerNumber, number, position); + }); + + } + + private void calculateBallAndStrike(ComputerNumber computerNumber, int number, int position) { + if (computerNumber.containsNumber(number)) { + if (computerNumber.findNumberByPosition(position) == number) { + strikeCount++; + } + ballCount++; + } + } + + public boolean isNothing() { + return ballCount == 0 && strikeCount == 0; + } + + public boolean needsNextRound() { + return strikeCount != 3; + } + + public int provideBallCount() { + return ballCount; + } + + public int provideStrikeCount() { + return strikeCount; + } +} \ No newline at end of file diff --git a/src/main/java/baseball/model/UserNumber.java b/src/main/java/baseball/model/UserNumber.java index fccbec2dfe..57cd7b2207 100644 --- a/src/main/java/baseball/model/UserNumber.java +++ b/src/main/java/baseball/model/UserNumber.java @@ -1,15 +1,12 @@ package baseball.model; -import java.util.*; -import java.util.stream.Collectors; +import java.util.List; -import static baseball.exception.ErrorMessage.DUPLICATED_USER_NUMBER; -import static baseball.exception.ErrorMessage.INVALID_USER_NUMBER_CONTAINS_ZERO; +import static baseball.utils.validator.UserNumberValidator.*; public class UserNumber { private final List numbers; - private static final int NUMBERS_SIZE = 3; private UserNumber(List numbers) { this.numbers = numbers; @@ -22,26 +19,7 @@ public static UserNumber from(List numbers) { return new UserNumber(numbers); } - private static void validateNonZero(List numbers) { - if (numbers.contains(0)) { - throw new IllegalArgumentException(INVALID_USER_NUMBER_CONTAINS_ZERO.getMessage()); - } + public int findNumberByPosition(int position) { + return numbers.get(position); } - - private static void validateDuplicate(List numbers) { - Set set = new HashSet<>(numbers); - if (set.size() != numbers.size()) { - throw new IllegalArgumentException(DUPLICATED_USER_NUMBER.getMessage()); - } - } - - private static void validateSize(List numbers) { - if (numbers.size() != NUMBERS_SIZE) { - throw new IllegalArgumentException(DUPLICATED_USER_NUMBER.getMessage()); - } - } - - public List getNumbers() { - return List.copyOf(numbers); - } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/service/GameManager.java b/src/main/java/baseball/service/GameManager.java new file mode 100644 index 0000000000..a233caa9ac --- /dev/null +++ b/src/main/java/baseball/service/GameManager.java @@ -0,0 +1,28 @@ +package baseball.service; + +import baseball.dto.RoundResultDto; +import baseball.model.ComputerNumber; +import baseball.model.RoundResult; +import baseball.model.UserNumber; + +public class GameManager { + private final ComputerNumber computerNumber; + private RoundResult roundResult; + + private GameManager(ComputerNumber computerNumber) { + this.computerNumber = computerNumber; + } + + public static GameManager from(ComputerNumber computerNumber) { + return new GameManager(computerNumber); + } + + public boolean playRound(UserNumber userNumber) { + roundResult = RoundResult.create(computerNumber, userNumber); + return roundResult.needsNextRound(); + } + + public RoundResultDto createResultDto() { + return RoundResultDto.from(roundResult); + } +} \ No newline at end of file diff --git a/src/main/java/baseball/service/GameResultService.java b/src/main/java/baseball/service/GameResultService.java deleted file mode 100644 index 6fe66b1178..0000000000 --- a/src/main/java/baseball/service/GameResultService.java +++ /dev/null @@ -1,77 +0,0 @@ -package baseball.service; - -import baseball.model.ComputerNumber; -import baseball.model.UserNumber; - -import java.util.List; - -public class GameResultService { - private boolean isNothing = false; - private int ballCount = 0; - private int strikeCount = 0; - - private GameResultService(ComputerNumber computerNumber, UserNumber userNumber) { - calculateResult(computerNumber.getNumbers(), userNumber.getNumbers()); - } - - public static GameResultService of(ComputerNumber computerNumber, UserNumber userNumber) { - return new GameResultService(computerNumber, userNumber); - } - - public boolean isNothing() { - return isNothing; - } - - public int getBallCount() { - return ballCount; - } - - public int getStrikeCount() { - return strikeCount; - } - - public boolean isThreeStrike() { - return strikeCount == 3; - } - - private void calculateResult(List computerNumber, List playerNumber) { - if (isEqualNumbers(computerNumber, playerNumber)) { - strikeCount = 3; - return; - } - - calculateBallAndStrikeCount(computerNumber, playerNumber); - - if (isBallAndStrikeZero()) { - isNothing = true; - } - } - - private boolean isEqualNumbers(List computerNumber, List playerNumber) { - return computerNumber.equals(playerNumber); - } - - private void calculateBallAndStrikeCount(List computerNumber, List playerNumber) { - for (int i = 0; i < playerNumber.size(); i++) { - if (isSameNumberExist(computerNumber, playerNumber.get(i))) { - if (isSamePosition(computerNumber.get(i), playerNumber.get(i))) { - strikeCount++; - continue; - } - ballCount++; - } - } - } - - private boolean isSameNumberExist(List computerNumber, Integer playerNumber) { - return computerNumber.contains(playerNumber); - } - - private boolean isSamePosition(Integer computerNumber, Integer playerNumber) { - return computerNumber.equals(playerNumber); - } - - private boolean isBallAndStrikeZero() { - return ballCount == 0 && strikeCount == 0; - } -} diff --git a/src/main/java/baseball/utils/Constants.java b/src/main/java/baseball/utils/Constants.java new file mode 100644 index 0000000000..d2c0530a34 --- /dev/null +++ b/src/main/java/baseball/utils/Constants.java @@ -0,0 +1,6 @@ +package baseball.utils; + +public class Constants { + public static final int START_INDEX = 0; + public static final int NUMBERS_SIZE = 3; +} diff --git a/src/main/java/baseball/utils/NumbersGenerator.java b/src/main/java/baseball/utils/NumbersGenerator.java new file mode 100644 index 0000000000..6a51e3542d --- /dev/null +++ b/src/main/java/baseball/utils/NumbersGenerator.java @@ -0,0 +1,19 @@ +package baseball.utils; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class NumbersGenerator { + public static List generate() { + List numbers = new ArrayList<>(); + while (numbers.size() != 3) { + int number = Randoms.pickNumberInRange(1, 9); + if (!numbers.contains(number)) { + numbers.add(number); + } + } + return numbers; + } +} diff --git a/src/main/java/baseball/validator/PlayAgainInputValidator.java b/src/main/java/baseball/utils/validator/PlayAgainInputValidator.java similarity index 91% rename from src/main/java/baseball/validator/PlayAgainInputValidator.java rename to src/main/java/baseball/utils/validator/PlayAgainInputValidator.java index 7afe95bbd2..d8e0ef914c 100644 --- a/src/main/java/baseball/validator/PlayAgainInputValidator.java +++ b/src/main/java/baseball/utils/validator/PlayAgainInputValidator.java @@ -1,4 +1,4 @@ -package baseball.validator; +package baseball.utils.validator; import static baseball.exception.ErrorMessage.INVALID_PLAY_AGAIN; diff --git a/src/main/java/baseball/utils/validator/UserNumberValidator.java b/src/main/java/baseball/utils/validator/UserNumberValidator.java new file mode 100644 index 0000000000..8181dc2336 --- /dev/null +++ b/src/main/java/baseball/utils/validator/UserNumberValidator.java @@ -0,0 +1,48 @@ +package baseball.utils.validator; + +import baseball.utils.Constants; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static baseball.exception.ErrorMessage.*; + +public class UserNumberValidator { + private static final int INVALID_NUMBER = 0; + + public static void validateNumeric(String input) { + try { + Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(INVALID_USER_NUMBER_INPUT_FORMAT.getMessage()); + } + } + + public static List convertToIntegerList(String input) { + return input.chars() + .map(Character::getNumericValue) + .boxed() + .collect(Collectors.toList()); + } + + public static void validateNonZero(List numbers) { + if (numbers.contains(INVALID_NUMBER)) { + throw new IllegalArgumentException(INVALID_USER_NUMBER_CONTAINS_ZERO.getMessage()); + } + } + + public static void validateDuplicate(List numbers) { + Set set = new HashSet<>(numbers); + if (set.size() != numbers.size()) { + throw new IllegalArgumentException(DUPLICATED_USER_NUMBER.getMessage()); + } + } + + public static void validateSize(List numbers) { + if (numbers.size() != Constants.NUMBERS_SIZE) { + throw new IllegalArgumentException(DUPLICATED_USER_NUMBER.getMessage()); + } + } +} diff --git a/src/main/java/baseball/validator/UserNumberInputValidator.java b/src/main/java/baseball/validator/UserNumberInputValidator.java deleted file mode 100644 index 1bc2989c09..0000000000 --- a/src/main/java/baseball/validator/UserNumberInputValidator.java +++ /dev/null @@ -1,23 +0,0 @@ -package baseball.validator; - -import java.util.List; -import java.util.stream.Collectors; - -import static baseball.exception.ErrorMessage.INVALID_USER_NUMBER_INPUT_FORMAT; - -public class UserNumberInputValidator { - public static void validateNumeric(String input) { - try { - Integer.parseInt(input); - } catch (NumberFormatException e) { - throw new IllegalArgumentException(INVALID_USER_NUMBER_INPUT_FORMAT.getMessage()); - } - } - - public static List convertToIntegerList(String input) { - return input.chars() - .map(Character::getNumericValue) - .boxed() - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 47b64e6169..3e3241b468 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,7 +1,7 @@ package baseball.view; -import baseball.validator.PlayAgainInputValidator; -import baseball.validator.UserNumberInputValidator; +import baseball.utils.validator.PlayAgainInputValidator; +import baseball.utils.validator.UserNumberValidator; import camp.nextstep.edu.missionutils.Console; import java.util.List; @@ -13,8 +13,8 @@ public class InputView { public static List readUserNumber() { System.out.print(ASK_USER_NUMBER_MESSAGE); String input = Console.readLine(); - UserNumberInputValidator.validateNumeric(input); - return UserNumberInputValidator.convertToIntegerList(input); + UserNumberValidator.validateNumeric(input); + return UserNumberValidator.convertToIntegerList(input); } public static int readPlayAgainInput() { diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index f2c47c9616..655584a16f 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -3,7 +3,7 @@ import baseball.model.ComputerNumber; import baseball.model.PlayAgainDecision; import baseball.model.UserNumber; -import baseball.service.GameResultService; +import baseball.service.GameManager; import camp.nextstep.edu.missionutils.Randoms; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -34,10 +34,10 @@ void generateResult1() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(4, 5, 6)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isTrue(); - assertThat(gameResultService.getBallCount()).isEqualTo(0); - assertThat(gameResultService.getStrikeCount()).isEqualTo(0); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isTrue(); + assertThat(gameManager.getBallCount()).isEqualTo(0); + assertThat(gameManager.getStrikeCount()).isEqualTo(0); } } @@ -49,10 +49,10 @@ void generateResult2() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(4, 5, 1)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isFalse(); - assertThat(gameResultService.getBallCount()).isEqualTo(1); - assertThat(gameResultService.getStrikeCount()).isEqualTo(0); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isFalse(); + assertThat(gameManager.getBallCount()).isEqualTo(1); + assertThat(gameManager.getStrikeCount()).isEqualTo(0); } } @@ -64,10 +64,10 @@ void generateResult3() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(3, 5, 1)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isFalse(); - assertThat(gameResultService.getBallCount()).isEqualTo(2); - assertThat(gameResultService.getStrikeCount()).isEqualTo(0); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isFalse(); + assertThat(gameManager.getBallCount()).isEqualTo(2); + assertThat(gameManager.getStrikeCount()).isEqualTo(0); } } @@ -79,10 +79,10 @@ void generateResult4() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(2, 3, 1)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isFalse(); - assertThat(gameResultService.getBallCount()).isEqualTo(3); - assertThat(gameResultService.getStrikeCount()).isEqualTo(0); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isFalse(); + assertThat(gameManager.getBallCount()).isEqualTo(3); + assertThat(gameManager.getStrikeCount()).isEqualTo(0); } } @@ -94,10 +94,10 @@ void generateResult5() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isFalse(); - assertThat(gameResultService.getBallCount()).isEqualTo(0); - assertThat(gameResultService.getStrikeCount()).isEqualTo(1); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isFalse(); + assertThat(gameManager.getBallCount()).isEqualTo(0); + assertThat(gameManager.getStrikeCount()).isEqualTo(1); } } @@ -109,10 +109,10 @@ void generateResult6() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(1, 2, 5)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isFalse(); - assertThat(gameResultService.getBallCount()).isEqualTo(0); - assertThat(gameResultService.getStrikeCount()).isEqualTo(2); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isFalse(); + assertThat(gameManager.getBallCount()).isEqualTo(0); + assertThat(gameManager.getStrikeCount()).isEqualTo(2); } } @@ -124,10 +124,10 @@ void generateResult7() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isFalse(); - assertThat(gameResultService.getBallCount()).isEqualTo(0); - assertThat(gameResultService.getStrikeCount()).isEqualTo(3); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isFalse(); + assertThat(gameManager.getBallCount()).isEqualTo(0); + assertThat(gameManager.getStrikeCount()).isEqualTo(3); } } @@ -139,10 +139,10 @@ void generateResult8() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(1, 4, 2)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isFalse(); - assertThat(gameResultService.getBallCount()).isEqualTo(1); - assertThat(gameResultService.getStrikeCount()).isEqualTo(1); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isFalse(); + assertThat(gameManager.getBallCount()).isEqualTo(1); + assertThat(gameManager.getStrikeCount()).isEqualTo(1); } } @@ -154,10 +154,10 @@ void generateResult9() { ComputerNumber computerNumber = ComputerNumber.create(); UserNumber userNumber = UserNumber.from(List.of(1, 3, 2)); - GameResultService gameResultService = GameResultService.of(computerNumber, userNumber); - assertThat(gameResultService.isNothing()).isFalse(); - assertThat(gameResultService.getBallCount()).isEqualTo(2); - assertThat(gameResultService.getStrikeCount()).isEqualTo(1); + GameManager gameManager = GameManager.of(computerNumber, userNumber); + assertThat(gameManager.isNothing()).isFalse(); + assertThat(gameManager.getBallCount()).isEqualTo(2); + assertThat(gameManager.getStrikeCount()).isEqualTo(1); } } From 5298702ed14977d39ec223a5a0e96201d4ef8892 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 19 Nov 2023 00:12:19 +0900 Subject: [PATCH 30/45] =?UTF-8?q?Refactor(gameController):=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 1d6c63b790..9d42bcbe1a 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -21,22 +21,6 @@ public static GameController getInstance() { return instance; } - private static UserNumber readUserNumber() { - List numbers = InputView.readUserNumber(); - return UserNumber.from(numbers); - } - - private static boolean wantsRestart() { - OutputView.printEnd(); - PlayAgainDecision playAgainDecision = readPlayAgainInput(); - return playAgainDecision.isAgain(); - } - - private static PlayAgainDecision readPlayAgainInput() { - int input = InputView.readPlayAgainInput(); - return PlayAgainDecision.of(input); - } - public void run() { boolean continuePlaying = true; while (continuePlaying) { @@ -61,6 +45,11 @@ private void initializeGameManager() { gameManager = GameManager.from(computerNumber); } + private static UserNumber readUserNumber() { + List numbers = InputView.readUserNumber(); + return UserNumber.from(numbers); + } + private boolean playRound(UserNumber userNumber) { boolean needsNextRound; needsNextRound = gameManager.playRound(userNumber); @@ -71,4 +60,15 @@ private void printRoundResult() { RoundResultDto resultDto = gameManager.createResultDto(); OutputView.printResult(resultDto.isNothing(), resultDto.getBallCount(), resultDto.getStrikeCount()); } + + private static boolean wantsRestart() { + OutputView.printEnd(); + PlayAgainDecision playAgainDecision = readPlayAgainInput(); + return playAgainDecision.isAgain(); + } + + private static PlayAgainDecision readPlayAgainInput() { + int input = InputView.readPlayAgainInput(); + return PlayAgainDecision.of(input); + } } \ No newline at end of file From 91852d0a48fe2a0d26fe10bcd3ebf6c3a5da1ebf Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 19 Nov 2023 00:36:42 +0900 Subject: [PATCH 31/45] =?UTF-8?q?Refactor(roundResult#processRound,=20outp?= =?UTF-8?q?utView#printResult):=20=EB=8F=99=EC=9E=91=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95,=20outputView=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/model/RoundResult.java | 18 +- src/main/java/baseball/view/OutputView.java | 22 +- src/test/java/baseball/BaseballGameTest.java | 302 +++++++++--------- .../baseball/model/ComputerNumberTest.java | 5 + .../java/baseball/model/RoundResultTest.java | 7 + .../java/baseball/model/UserNumberTest.java | 2 +- 6 files changed, 186 insertions(+), 170 deletions(-) create mode 100644 src/test/java/baseball/model/ComputerNumberTest.java create mode 100644 src/test/java/baseball/model/RoundResultTest.java diff --git a/src/main/java/baseball/model/RoundResult.java b/src/main/java/baseball/model/RoundResult.java index 120be543e2..dabdeaec09 100644 --- a/src/main/java/baseball/model/RoundResult.java +++ b/src/main/java/baseball/model/RoundResult.java @@ -18,19 +18,15 @@ public static RoundResult create(ComputerNumber computerNumber, UserNumber userN } private void processRound(ComputerNumber computerNumber, UserNumber userNumber) { - IntStream.range(START_INDEX, NUMBERS_SIZE).forEach(position -> { + for (int position = START_INDEX; position < NUMBERS_SIZE; position++) { int number = userNumber.findNumberByPosition(position); - calculateBallAndStrike(computerNumber, number, position); - }); - - } - - private void calculateBallAndStrike(ComputerNumber computerNumber, int number, int position) { - if (computerNumber.containsNumber(number)) { - if (computerNumber.findNumberByPosition(position) == number) { - strikeCount++; + if (computerNumber.containsNumber(number)) { + if (computerNumber.findNumberByPosition(position) == number) { + strikeCount++; + continue; + } + ballCount++; } - ballCount++; } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index b8d6a1e977..72febebd0b 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -2,10 +2,10 @@ public class OutputView { private static final String START_MESSAGE = "숫자 야구 게임을 시작합니다."; - private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; - private static final String NOTHING = "낫싱"; + private static final String NOTHING_MESSAGE = "낫싱"; private static final String BALL_FORMAT = "%d볼 "; private static final String STRIKE_FORMAT = "%d스트라이크"; + private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; public static void printStart() { @@ -14,17 +14,25 @@ public static void printStart() { public static void printResult(boolean isNothing, int ballCount, int strikeCount) { if (isNothing) { - System.out.println(NOTHING); + printNothing(); return; } - String resultString = ""; + printBallAndStrike(ballCount, strikeCount); + } + + private static void printNothing() { + System.out.println(NOTHING_MESSAGE); + } + + private static void printBallAndStrike(int ballCount, int strikeCount) { + StringBuilder resultMessage = new StringBuilder(); if (ballCount != 0) { - resultString = String.format(BALL_FORMAT, ballCount); + resultMessage.append(String.format(BALL_FORMAT, ballCount)); } if (strikeCount != 0) { - resultString += String.format(STRIKE_FORMAT, strikeCount); + resultMessage.append(String.format(STRIKE_FORMAT, strikeCount)); } - System.out.println(resultString); + System.out.println(resultMessage); } public static void printEnd() { diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index 655584a16f..4ea7e060cd 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -17,154 +17,154 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class BaseballGameTest { - - @DisplayName("1~9의 서로 다른 숫자 3개를 생성한다.") - @Test - void generateComputerNumber() { - ComputerNumber computerNumber = ComputerNumber.create(); - assertThat(computerNumber.getNumbers().size()).isEqualTo(3); - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 낫싱") - @Test - void generateResult1() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(4, 5, 6)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isTrue(); - assertThat(gameManager.getBallCount()).isEqualTo(0); - assertThat(gameManager.getStrikeCount()).isEqualTo(0); - } - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 숫자 1개가 같고 다른 자리에 있으면 - 1볼") - @Test - void generateResult2() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(4, 5, 1)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isFalse(); - assertThat(gameManager.getBallCount()).isEqualTo(1); - assertThat(gameManager.getStrikeCount()).isEqualTo(0); - } - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼") - @Test - void generateResult3() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(3, 5, 1)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isFalse(); - assertThat(gameManager.getBallCount()).isEqualTo(2); - assertThat(gameManager.getStrikeCount()).isEqualTo(0); - } - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3볼") - @Test - void generateResult4() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(2, 3, 1)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isFalse(); - assertThat(gameManager.getBallCount()).isEqualTo(3); - assertThat(gameManager.getStrikeCount()).isEqualTo(0); - } - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1스트라이크") - @Test - void generateResult5() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isFalse(); - assertThat(gameManager.getBallCount()).isEqualTo(0); - assertThat(gameManager.getStrikeCount()).isEqualTo(1); - } - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2스트라이크") - @Test - void generateResult6() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(1, 2, 5)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isFalse(); - assertThat(gameManager.getBallCount()).isEqualTo(0); - assertThat(gameManager.getStrikeCount()).isEqualTo(2); - } - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3스트라이크") - @Test - void generateResult7() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isFalse(); - assertThat(gameManager.getBallCount()).isEqualTo(0); - assertThat(gameManager.getStrikeCount()).isEqualTo(3); - } - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1볼 1스트라이크") - @Test - void generateResult8() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(1, 4, 2)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isFalse(); - assertThat(gameManager.getBallCount()).isEqualTo(1); - assertThat(gameManager.getStrikeCount()).isEqualTo(1); - } - } - - @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼 1스트라이크") - @Test - void generateResult9() { - try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { - randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); - - ComputerNumber computerNumber = ComputerNumber.create(); - UserNumber userNumber = UserNumber.from(List.of(1, 3, 2)); - GameManager gameManager = GameManager.of(computerNumber, userNumber); - assertThat(gameManager.isNothing()).isFalse(); - assertThat(gameManager.getBallCount()).isEqualTo(2); - assertThat(gameManager.getStrikeCount()).isEqualTo(1); - } - } - - @ParameterizedTest(name = "[{index}] {0} 을 넣으면 예외가 발생한다.") - @ValueSource(ints = {-1, 0, 3, 5, 100}) - void validateInput_ex(int element) { - assertThatThrownBy(() -> PlayAgainDecision.of(element)) - .isInstanceOf(IllegalArgumentException.class); - } -} +//public class BaseballGameTest { +// +// @DisplayName("1~9의 서로 다른 숫자 3개를 생성한다.") +// @Test +// void generateComputerNumber() { +// ComputerNumber computerNumber = ComputerNumber.create(); +// assertThat(computerNumber.getNumbers().size()).isEqualTo(3); +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 낫싱") +// @Test +// void generateResult1() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(4, 5, 6)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isTrue(); +// assertThat(gameManager.getBallCount()).isEqualTo(0); +// assertThat(gameManager.getStrikeCount()).isEqualTo(0); +// } +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 숫자 1개가 같고 다른 자리에 있으면 - 1볼") +// @Test +// void generateResult2() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(4, 5, 1)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isFalse(); +// assertThat(gameManager.getBallCount()).isEqualTo(1); +// assertThat(gameManager.getStrikeCount()).isEqualTo(0); +// } +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼") +// @Test +// void generateResult3() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(3, 5, 1)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isFalse(); +// assertThat(gameManager.getBallCount()).isEqualTo(2); +// assertThat(gameManager.getStrikeCount()).isEqualTo(0); +// } +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3볼") +// @Test +// void generateResult4() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(2, 3, 1)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isFalse(); +// assertThat(gameManager.getBallCount()).isEqualTo(3); +// assertThat(gameManager.getStrikeCount()).isEqualTo(0); +// } +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1스트라이크") +// @Test +// void generateResult5() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isFalse(); +// assertThat(gameManager.getBallCount()).isEqualTo(0); +// assertThat(gameManager.getStrikeCount()).isEqualTo(1); +// } +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2스트라이크") +// @Test +// void generateResult6() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(1, 2, 5)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isFalse(); +// assertThat(gameManager.getBallCount()).isEqualTo(0); +// assertThat(gameManager.getStrikeCount()).isEqualTo(2); +// } +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3스트라이크") +// @Test +// void generateResult7() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isFalse(); +// assertThat(gameManager.getBallCount()).isEqualTo(0); +// assertThat(gameManager.getStrikeCount()).isEqualTo(3); +// } +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1볼 1스트라이크") +// @Test +// void generateResult8() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(1, 4, 2)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isFalse(); +// assertThat(gameManager.getBallCount()).isEqualTo(1); +// assertThat(gameManager.getStrikeCount()).isEqualTo(1); +// } +// } +// +// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼 1스트라이크") +// @Test +// void generateResult9() { +// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { +// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); +// +// ComputerNumber computerNumber = ComputerNumber.create(); +// UserNumber userNumber = UserNumber.from(List.of(1, 3, 2)); +// GameManager gameManager = GameManager.of(computerNumber, userNumber); +// assertThat(gameManager.isNothing()).isFalse(); +// assertThat(gameManager.getBallCount()).isEqualTo(2); +// assertThat(gameManager.getStrikeCount()).isEqualTo(1); +// } +// } +// +// @ParameterizedTest(name = "[{index}] {0} 을 넣으면 예외가 발생한다.") +// @ValueSource(ints = {-1, 0, 3, 5, 100}) +// void validateInput_ex(int element) { +// assertThatThrownBy(() -> PlayAgainDecision.of(element)) +// .isInstanceOf(IllegalArgumentException.class); +// } +//} diff --git a/src/test/java/baseball/model/ComputerNumberTest.java b/src/test/java/baseball/model/ComputerNumberTest.java new file mode 100644 index 0000000000..de011cca97 --- /dev/null +++ b/src/test/java/baseball/model/ComputerNumberTest.java @@ -0,0 +1,5 @@ +package baseball.model; + +class ComputerNumberTest { + +} \ No newline at end of file diff --git a/src/test/java/baseball/model/RoundResultTest.java b/src/test/java/baseball/model/RoundResultTest.java new file mode 100644 index 0000000000..266c284efc --- /dev/null +++ b/src/test/java/baseball/model/RoundResultTest.java @@ -0,0 +1,7 @@ +package baseball.model; + +import static org.junit.jupiter.api.Assertions.*; + +class RoundResultTest { + +} \ No newline at end of file diff --git a/src/test/java/baseball/model/UserNumberTest.java b/src/test/java/baseball/model/UserNumberTest.java index bb7098911a..c500ff20c8 100644 --- a/src/test/java/baseball/model/UserNumberTest.java +++ b/src/test/java/baseball/model/UserNumberTest.java @@ -17,7 +17,7 @@ class UserNumberTest { @Test void validatePlayerNumber_o() { UserNumber userNumber = UserNumber.from(List.of(1, 2, 3)); - assertThat(userNumber.getNumbers().size()).isEqualTo(3); + assertThat(userNumber).isNotNull(); } @ParameterizedTest(name = "[{index}] {0} 입력 시 예외가 발생한다.") From 7f624262e787f8c835197610f66024eeab3aa24e Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 19 Nov 2023 00:50:38 +0900 Subject: [PATCH 32/45] =?UTF-8?q?Test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/BaseballGameTest.java | 17 --- .../baseball/model/ComputerNumberTest.java | 16 ++ .../baseball/model/PlayAgainDecisionTest.java | 7 + .../java/baseball/model/RoundResultTest.java | 144 +++++++++++++++++- .../java/baseball/model/UserNumberTest.java | 16 +- 5 files changed, 174 insertions(+), 26 deletions(-) diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index 4ea7e060cd..b4fd1c5233 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -1,22 +1,5 @@ package baseball; -import baseball.model.ComputerNumber; -import baseball.model.PlayAgainDecision; -import baseball.model.UserNumber; -import baseball.service.GameManager; -import camp.nextstep.edu.missionutils.Randoms; -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 org.mockito.MockedStatic; -import org.mockito.Mockito; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - //public class BaseballGameTest { // // @DisplayName("1~9의 서로 다른 숫자 3개를 생성한다.") diff --git a/src/test/java/baseball/model/ComputerNumberTest.java b/src/test/java/baseball/model/ComputerNumberTest.java index de011cca97..9d0e1a316a 100644 --- a/src/test/java/baseball/model/ComputerNumberTest.java +++ b/src/test/java/baseball/model/ComputerNumberTest.java @@ -1,5 +1,21 @@ package baseball.model; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + class ComputerNumberTest { + @DisplayName("1 이상 9 이하의 숫자 3개가 생성된다.") + @Test + void create() { + // given + ComputerNumber computerNumber = ComputerNumber.create(); + + // when, then + assertThat(computerNumber.findNumberByPosition(0)).isBetween(1, 9); + assertThat(computerNumber.findNumberByPosition(1)).isBetween(1, 9); + assertThat(computerNumber.findNumberByPosition(2)).isBetween(1, 9); + } } \ No newline at end of file diff --git a/src/test/java/baseball/model/PlayAgainDecisionTest.java b/src/test/java/baseball/model/PlayAgainDecisionTest.java index 2cb2534233..9c3b16bda3 100644 --- a/src/test/java/baseball/model/PlayAgainDecisionTest.java +++ b/src/test/java/baseball/model/PlayAgainDecisionTest.java @@ -3,9 +3,16 @@ 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; class PlayAgainDecisionTest { + @ParameterizedTest(name = "[{index}] {0} 을 넣으면 정상 생성된다") + @ValueSource(ints = {1, 2}) + void create(int element) { + PlayAgainDecision playAgainDecision = PlayAgainDecision.of(element); + assertThat(playAgainDecision).isNotNull(); + } @ParameterizedTest(name = "[{index}] {0} 을 넣으면 예외가 발생한다.") @ValueSource(ints = {-1, 0, 3, 5, 100}) diff --git a/src/test/java/baseball/model/RoundResultTest.java b/src/test/java/baseball/model/RoundResultTest.java index 266c284efc..21964a8d92 100644 --- a/src/test/java/baseball/model/RoundResultTest.java +++ b/src/test/java/baseball/model/RoundResultTest.java @@ -1,7 +1,149 @@ package baseball.model; -import static org.junit.jupiter.api.Assertions.*; + +import camp.nextstep.edu.missionutils.Randoms; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; class RoundResultTest { + @DisplayName("두 숫자를 비교하여 결과를 출력한다 - 낫싱") + @Test + void create() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(4, 5, 6)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isTrue(); + assertThat(roundResult.provideBallCount()).isEqualTo(0); + assertThat(roundResult.provideStrikeCount()).isEqualTo(0); + } + } + + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 숫자 1개가 같고 다른 자리에 있으면 - 1볼") + @Test + void generateResult2() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(4, 5, 1)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isFalse(); + assertThat(roundResult.provideBallCount()).isEqualTo(1); + assertThat(roundResult.provideStrikeCount()).isEqualTo(0); + } + } + + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼") + @Test + void generateResult3() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(3, 5, 1)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isFalse(); + assertThat(roundResult.provideBallCount()).isEqualTo(2); + assertThat(roundResult.provideStrikeCount()).isEqualTo(0); + } + } + + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3볼") + @Test + void generateResult4() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(2, 3, 1)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isFalse(); + assertThat(roundResult.provideBallCount()).isEqualTo(3); + assertThat(roundResult.provideStrikeCount()).isEqualTo(0); + } + } + + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1스트라이크") + @Test + void generateResult5() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isFalse(); + assertThat(roundResult.provideBallCount()).isEqualTo(0); + assertThat(roundResult.provideStrikeCount()).isEqualTo(1); + } + } + + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2스트라이크") + @Test + void generateResult6() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 2, 5)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isFalse(); + assertThat(roundResult.provideBallCount()).isEqualTo(0); + assertThat(roundResult.provideStrikeCount()).isEqualTo(2); + } + } + + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3스트라이크") + @Test + void generateResult7() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isFalse(); + assertThat(roundResult.provideBallCount()).isEqualTo(0); + assertThat(roundResult.provideStrikeCount()).isEqualTo(3); + } + } + + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1볼 1스트라이크") + @Test + void generateResult8() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 4, 2)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isFalse(); + assertThat(roundResult.provideBallCount()).isEqualTo(1); + assertThat(roundResult.provideStrikeCount()).isEqualTo(1); + } + } + + @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼 1스트라이크") + @Test + void generateResult9() { + try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { + randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); + ComputerNumber computerNumber = ComputerNumber.create(); + UserNumber userNumber = UserNumber.from(List.of(1, 3, 2)); + RoundResult roundResult = RoundResult.create(computerNumber, userNumber); + assertThat(roundResult.isNothing()).isFalse(); + assertThat(roundResult.provideBallCount()).isEqualTo(2); + assertThat(roundResult.provideStrikeCount()).isEqualTo(1); + } + } } \ No newline at end of file diff --git a/src/test/java/baseball/model/UserNumberTest.java b/src/test/java/baseball/model/UserNumberTest.java index c500ff20c8..c4f3639210 100644 --- a/src/test/java/baseball/model/UserNumberTest.java +++ b/src/test/java/baseball/model/UserNumberTest.java @@ -13,6 +13,14 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; class UserNumberTest { + static Stream generateData() { + return Stream.of( + Arguments.of(List.of(0, 1, 2)), + Arguments.of(List.of(1, 1, 2)), + Arguments.of(List.of(1, 2, 3, 4)) + ); + } + @DisplayName("입력 받은 숫자가 1~9의 서로 다른 숫자 3개인 경우 정상 처리 된다.") @Test void validatePlayerNumber_o() { @@ -26,12 +34,4 @@ void validatePlayerNumber_ex(List numbers) { assertThatThrownBy(() -> UserNumber.from(numbers)) .isInstanceOf(IllegalArgumentException.class); } - - static Stream generateData() { - return Stream.of( - Arguments.of(List.of(0, 1, 2)), - Arguments.of(List.of(1, 1, 2)), - Arguments.of(List.of(1, 2, 10)) - ); - } } \ No newline at end of file From f88292ffa1a82c9a98dc064520c01bf10f546ef3 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 19 Nov 2023 00:51:41 +0900 Subject: [PATCH 33/45] =?UTF-8?q?Remove:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/BaseballGameTest.java | 153 ------------------- 1 file changed, 153 deletions(-) delete mode 100644 src/test/java/baseball/BaseballGameTest.java diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java deleted file mode 100644 index b4fd1c5233..0000000000 --- a/src/test/java/baseball/BaseballGameTest.java +++ /dev/null @@ -1,153 +0,0 @@ -package baseball; - -//public class BaseballGameTest { -// -// @DisplayName("1~9의 서로 다른 숫자 3개를 생성한다.") -// @Test -// void generateComputerNumber() { -// ComputerNumber computerNumber = ComputerNumber.create(); -// assertThat(computerNumber.getNumbers().size()).isEqualTo(3); -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 낫싱") -// @Test -// void generateResult1() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(4, 5, 6)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isTrue(); -// assertThat(gameManager.getBallCount()).isEqualTo(0); -// assertThat(gameManager.getStrikeCount()).isEqualTo(0); -// } -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 숫자 1개가 같고 다른 자리에 있으면 - 1볼") -// @Test -// void generateResult2() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(4, 5, 1)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isFalse(); -// assertThat(gameManager.getBallCount()).isEqualTo(1); -// assertThat(gameManager.getStrikeCount()).isEqualTo(0); -// } -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼") -// @Test -// void generateResult3() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(3, 5, 1)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isFalse(); -// assertThat(gameManager.getBallCount()).isEqualTo(2); -// assertThat(gameManager.getStrikeCount()).isEqualTo(0); -// } -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3볼") -// @Test -// void generateResult4() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(2, 3, 1)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isFalse(); -// assertThat(gameManager.getBallCount()).isEqualTo(3); -// assertThat(gameManager.getStrikeCount()).isEqualTo(0); -// } -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1스트라이크") -// @Test -// void generateResult5() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isFalse(); -// assertThat(gameManager.getBallCount()).isEqualTo(0); -// assertThat(gameManager.getStrikeCount()).isEqualTo(1); -// } -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2스트라이크") -// @Test -// void generateResult6() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(1, 2, 5)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isFalse(); -// assertThat(gameManager.getBallCount()).isEqualTo(0); -// assertThat(gameManager.getStrikeCount()).isEqualTo(2); -// } -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 3스트라이크") -// @Test -// void generateResult7() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(1, 4, 5)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isFalse(); -// assertThat(gameManager.getBallCount()).isEqualTo(0); -// assertThat(gameManager.getStrikeCount()).isEqualTo(3); -// } -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 1볼 1스트라이크") -// @Test -// void generateResult8() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(1, 4, 2)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isFalse(); -// assertThat(gameManager.getBallCount()).isEqualTo(1); -// assertThat(gameManager.getStrikeCount()).isEqualTo(1); -// } -// } -// -// @DisplayName("입력 받은 숫자와 컴퓨터 숫자 비교 - 2볼 1스트라이크") -// @Test -// void generateResult9() { -// try (MockedStatic randoms = Mockito.mockStatic(Randoms.class)) { -// randoms.when(() -> Randoms.pickNumberInRange(1, 9)).thenReturn(1).thenReturn(2).thenReturn(3); -// -// ComputerNumber computerNumber = ComputerNumber.create(); -// UserNumber userNumber = UserNumber.from(List.of(1, 3, 2)); -// GameManager gameManager = GameManager.of(computerNumber, userNumber); -// assertThat(gameManager.isNothing()).isFalse(); -// assertThat(gameManager.getBallCount()).isEqualTo(2); -// assertThat(gameManager.getStrikeCount()).isEqualTo(1); -// } -// } -// -// @ParameterizedTest(name = "[{index}] {0} 을 넣으면 예외가 발생한다.") -// @ValueSource(ints = {-1, 0, 3, 5, 100}) -// void validateInput_ex(int element) { -// assertThatThrownBy(() -> PlayAgainDecision.of(element)) -// .isInstanceOf(IllegalArgumentException.class); -// } -//} From be3545f2a1c4d2a16320c4a0aff4af40c6e2cf97 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 19 Nov 2023 00:52:38 +0900 Subject: [PATCH 34/45] =?UTF-8?q?Test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/model/RoundResultTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/baseball/model/RoundResultTest.java b/src/test/java/baseball/model/RoundResultTest.java index 21964a8d92..a3445fb22a 100644 --- a/src/test/java/baseball/model/RoundResultTest.java +++ b/src/test/java/baseball/model/RoundResultTest.java @@ -113,7 +113,7 @@ void generateResult7() { RoundResult roundResult = RoundResult.create(computerNumber, userNumber); assertThat(roundResult.isNothing()).isFalse(); assertThat(roundResult.provideBallCount()).isEqualTo(0); - assertThat(roundResult.provideStrikeCount()).isEqualTo(3); + assertThat(roundResult.provideStrikeCount()).isEqualTo(1); } } From 30aee384b3d49120cf0b83070651919c43a78d71 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:01:21 +0900 Subject: [PATCH 35/45] =?UTF-8?q?Refactor:=20inputView,=20outputView=20?= =?UTF-8?q?=EC=8B=B1=EA=B8=80=ED=86=A4=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 24 +++++++++++-------- src/main/java/baseball/view/InputView.java | 12 ++++++++-- src/main/java/baseball/view/OutputView.java | 17 +++++++++---- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index 9d42bcbe1a..ba1c00d122 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -11,10 +11,14 @@ import java.util.List; public class GameController { - public static GameController instance = new GameController(); + public static GameController instance = new GameController(InputView.getInstance(), OutputView.getInstance()); + private final InputView inputView; + private final OutputView outputView; private GameManager gameManager; - private GameController() { + private GameController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; } public static GameController getInstance() { @@ -29,7 +33,7 @@ public void run() { } private boolean play() { - OutputView.printStart(); + outputView.printStart(); initializeGameManager(); boolean needsNextRound = true; while (needsNextRound) { @@ -45,8 +49,8 @@ private void initializeGameManager() { gameManager = GameManager.from(computerNumber); } - private static UserNumber readUserNumber() { - List numbers = InputView.readUserNumber(); + private UserNumber readUserNumber() { + List numbers = inputView.readUserNumber(); return UserNumber.from(numbers); } @@ -58,17 +62,17 @@ private boolean playRound(UserNumber userNumber) { private void printRoundResult() { RoundResultDto resultDto = gameManager.createResultDto(); - OutputView.printResult(resultDto.isNothing(), resultDto.getBallCount(), resultDto.getStrikeCount()); + outputView.printResult(resultDto.isNothing(), resultDto.getBallCount(), resultDto.getStrikeCount()); } - private static boolean wantsRestart() { - OutputView.printEnd(); + private boolean wantsRestart() { + outputView.printEnd(); PlayAgainDecision playAgainDecision = readPlayAgainInput(); return playAgainDecision.isAgain(); } - private static PlayAgainDecision readPlayAgainInput() { - int input = InputView.readPlayAgainInput(); + private PlayAgainDecision readPlayAgainInput() { + int input = inputView.readPlayAgainInput(); return PlayAgainDecision.of(input); } } \ No newline at end of file diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 3e3241b468..fe5335cfad 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -7,17 +7,25 @@ import java.util.List; public class InputView { + public static InputView instance = new InputView(); private static final String ASK_USER_NUMBER_MESSAGE = "숫자를 입력해주세요 : "; private static final String ASK_PLAY_AGAIN_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; - public static List readUserNumber() { + private InputView() { + } + + public static InputView getInstance() { + return instance; + } + + public List readUserNumber() { System.out.print(ASK_USER_NUMBER_MESSAGE); String input = Console.readLine(); UserNumberValidator.validateNumeric(input); return UserNumberValidator.convertToIntegerList(input); } - public static int readPlayAgainInput() { + public int readPlayAgainInput() { System.out.println(ASK_PLAY_AGAIN_MESSAGE); String input = Console.readLine(); return PlayAgainInputValidator.safeParseInt(input); diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 72febebd0b..1102a1af1b 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,18 +1,25 @@ package baseball.view; public class OutputView { + public static OutputView instance = new OutputView(); private static final String START_MESSAGE = "숫자 야구 게임을 시작합니다."; private static final String NOTHING_MESSAGE = "낫싱"; private static final String BALL_FORMAT = "%d볼 "; private static final String STRIKE_FORMAT = "%d스트라이크"; private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; + private OutputView() { + } + + public static OutputView getInstance() { + return instance; + } - public static void printStart() { + public void printStart() { System.out.println(START_MESSAGE); } - public static void printResult(boolean isNothing, int ballCount, int strikeCount) { + public void printResult(boolean isNothing, int ballCount, int strikeCount) { if (isNothing) { printNothing(); return; @@ -20,11 +27,11 @@ public static void printResult(boolean isNothing, int ballCount, int strikeCount printBallAndStrike(ballCount, strikeCount); } - private static void printNothing() { + private void printNothing() { System.out.println(NOTHING_MESSAGE); } - private static void printBallAndStrike(int ballCount, int strikeCount) { + private void printBallAndStrike(int ballCount, int strikeCount) { StringBuilder resultMessage = new StringBuilder(); if (ballCount != 0) { resultMessage.append(String.format(BALL_FORMAT, ballCount)); @@ -35,7 +42,7 @@ private static void printBallAndStrike(int ballCount, int strikeCount) { System.out.println(resultMessage); } - public static void printEnd() { + public void printEnd() { System.out.println(END_MESSAGE); } } From 6d784f0b61be9dadc4a94435bfc637d9607fe0e7 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:06:39 +0900 Subject: [PATCH 36/45] =?UTF-8?q?Refactor(gameRestartController):=20gameCo?= =?UTF-8?q?ntroller=EC=9D=98=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=AA=BC?= =?UTF-8?q?=EA=B0=9C=EC=84=9C=20=EB=B6=84=EB=8B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/GameController.java | 19 +++--------- .../controller/GameRestartController.java | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 src/main/java/baseball/controller/GameRestartController.java diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index ba1c00d122..2208122e76 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -11,14 +11,16 @@ import java.util.List; public class GameController { - public static GameController instance = new GameController(InputView.getInstance(), OutputView.getInstance()); + public static GameController instance = new GameController(InputView.getInstance(), OutputView.getInstance(), GameRestartController.getInstance()); private final InputView inputView; private final OutputView outputView; + private final GameRestartController gameRestartController; private GameManager gameManager; - private GameController(InputView inputView, OutputView outputView) { + private GameController(InputView inputView, OutputView outputView, GameRestartController gameRestartController) { this.inputView = inputView; this.outputView = outputView; + this.gameRestartController = gameRestartController; } public static GameController getInstance() { @@ -41,7 +43,7 @@ private boolean play() { needsNextRound = playRound(userNumber); printRoundResult(); } - return wantsRestart(); + return gameRestartController.wantsRestart(); } private void initializeGameManager() { @@ -64,15 +66,4 @@ private void printRoundResult() { RoundResultDto resultDto = gameManager.createResultDto(); outputView.printResult(resultDto.isNothing(), resultDto.getBallCount(), resultDto.getStrikeCount()); } - - private boolean wantsRestart() { - outputView.printEnd(); - PlayAgainDecision playAgainDecision = readPlayAgainInput(); - return playAgainDecision.isAgain(); - } - - private PlayAgainDecision readPlayAgainInput() { - int input = inputView.readPlayAgainInput(); - return PlayAgainDecision.of(input); - } } \ No newline at end of file diff --git a/src/main/java/baseball/controller/GameRestartController.java b/src/main/java/baseball/controller/GameRestartController.java new file mode 100644 index 0000000000..bf9388788c --- /dev/null +++ b/src/main/java/baseball/controller/GameRestartController.java @@ -0,0 +1,31 @@ +package baseball.controller; + +import baseball.model.PlayAgainDecision; +import baseball.view.InputView; +import baseball.view.OutputView; + +public class GameRestartController { + public static GameRestartController instance = new GameRestartController(InputView.getInstance(), OutputView.getInstance()); + private final InputView inputView; + private final OutputView outputView; + + public GameRestartController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public static GameRestartController getInstance() { + return instance; + } + + public boolean wantsRestart() { + outputView.printEnd(); + PlayAgainDecision playAgainDecision = readPlayAgainInput(); + return playAgainDecision.isAgain(); + } + + private PlayAgainDecision readPlayAgainInput() { + int input = inputView.readPlayAgainInput(); + return PlayAgainDecision.of(input); + } +} From 129fdbedabff3bc3dfc924aeb6447a73b4ef2967 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:07:17 +0900 Subject: [PATCH 37/45] =?UTF-8?q?Rename(mainController):=20gameController?= =?UTF-8?q?=20=EC=97=90=EC=84=9C=20mainController=20=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 6 +++--- .../{GameController.java => MainController.java} | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) rename src/main/java/baseball/controller/{GameController.java => MainController.java} (89%) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index a5bd9d2c5e..5bfaba7f88 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,12 +1,12 @@ package baseball; -import baseball.controller.GameController; +import baseball.controller.MainController; import camp.nextstep.edu.missionutils.Console; public class Application { public static void main(String[] args) { - GameController gameController = GameController.getInstance(); - gameController.run(); + MainController mainController = MainController.getInstance(); + mainController.run(); Console.close(); } } diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/MainController.java similarity index 89% rename from src/main/java/baseball/controller/GameController.java rename to src/main/java/baseball/controller/MainController.java index 2208122e76..ef9c4d4174 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/MainController.java @@ -2,7 +2,6 @@ import baseball.dto.RoundResultDto; import baseball.model.ComputerNumber; -import baseball.model.PlayAgainDecision; import baseball.model.UserNumber; import baseball.service.GameManager; import baseball.view.InputView; @@ -10,20 +9,20 @@ import java.util.List; -public class GameController { - public static GameController instance = new GameController(InputView.getInstance(), OutputView.getInstance(), GameRestartController.getInstance()); +public class MainController { + public static MainController instance = new MainController(InputView.getInstance(), OutputView.getInstance(), GameRestartController.getInstance()); private final InputView inputView; private final OutputView outputView; private final GameRestartController gameRestartController; private GameManager gameManager; - private GameController(InputView inputView, OutputView outputView, GameRestartController gameRestartController) { + private MainController(InputView inputView, OutputView outputView, GameRestartController gameRestartController) { this.inputView = inputView; this.outputView = outputView; this.gameRestartController = gameRestartController; } - public static GameController getInstance() { + public static MainController getInstance() { return instance; } From 59da69ccbd587a08a67888ad3c80314458d1653e Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:21:47 +0900 Subject: [PATCH 38/45] =?UTF-8?q?Refactor(gamePlayController):=20mainContr?= =?UTF-8?q?oller=EC=9D=98=20play=20=EC=97=AD=ED=95=A0=EC=9D=84=20gamePlayC?= =?UTF-8?q?ontroller=20=EA=B0=80=20=ED=95=98=EA=B2=8C=20=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/GamePlayController.java | 59 +++++++++++++++++++ .../baseball/controller/MainController.java | 49 +++------------ 2 files changed, 67 insertions(+), 41 deletions(-) create mode 100644 src/main/java/baseball/controller/GamePlayController.java diff --git a/src/main/java/baseball/controller/GamePlayController.java b/src/main/java/baseball/controller/GamePlayController.java new file mode 100644 index 0000000000..4934034900 --- /dev/null +++ b/src/main/java/baseball/controller/GamePlayController.java @@ -0,0 +1,59 @@ +package baseball.controller; + +import baseball.dto.RoundResultDto; +import baseball.model.ComputerNumber; +import baseball.model.UserNumber; +import baseball.service.GameManager; +import baseball.view.InputView; +import baseball.view.OutputView; + +import java.util.List; + +public class GamePlayController { + private static GamePlayController instance = new GamePlayController(InputView.getInstance(), OutputView.getInstance()); + private final InputView inputView; + private final OutputView outputView; + private GameManager gameManager; + + public GamePlayController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public static GamePlayController getInstance() { + return instance; + } + + public boolean play() { + outputView.printStart(); + initializeGameManager(); + boolean needsNextRound = true; + while (needsNextRound) { + UserNumber userNumber = readUserNumber(); + needsNextRound = playRound(userNumber); + printRoundResult(); + } + return needsNextRound; + } + + private void initializeGameManager() { + ComputerNumber computerNumber = ComputerNumber.create(); + gameManager = GameManager.from(computerNumber); + } + + private UserNumber readUserNumber() { + List numbers = inputView.readUserNumber(); + return UserNumber.from(numbers); + } + + private boolean playRound(UserNumber userNumber) { + boolean needsNextRound; + needsNextRound = gameManager.playRound(userNumber); + return needsNextRound; + } + + private void printRoundResult() { + RoundResultDto resultDto = gameManager.createResultDto(); + outputView.printResult(resultDto.isNothing(), resultDto.getBallCount(), resultDto.getStrikeCount()); + } +} diff --git a/src/main/java/baseball/controller/MainController.java b/src/main/java/baseball/controller/MainController.java index ef9c4d4174..c65d3ba5e0 100644 --- a/src/main/java/baseball/controller/MainController.java +++ b/src/main/java/baseball/controller/MainController.java @@ -10,16 +10,13 @@ import java.util.List; public class MainController { - public static MainController instance = new MainController(InputView.getInstance(), OutputView.getInstance(), GameRestartController.getInstance()); - private final InputView inputView; - private final OutputView outputView; + public static MainController instance = new MainController(GameRestartController.getInstance(), GamePlayController.getInstance()); private final GameRestartController gameRestartController; - private GameManager gameManager; + private final GamePlayController gamePlayController; - private MainController(InputView inputView, OutputView outputView, GameRestartController gameRestartController) { - this.inputView = inputView; - this.outputView = outputView; + private MainController(GameRestartController gameRestartController, GamePlayController gamePlayController) { this.gameRestartController = gameRestartController; + this.gamePlayController = gamePlayController; } public static MainController getInstance() { @@ -29,40 +26,10 @@ public static MainController getInstance() { public void run() { boolean continuePlaying = true; while (continuePlaying) { - continuePlaying = play(); + continuePlaying = gamePlayController.play(); + if (continuePlaying) { + continuePlaying = gameRestartController.wantsRestart(); + } } } - - private boolean play() { - outputView.printStart(); - initializeGameManager(); - boolean needsNextRound = true; - while (needsNextRound) { - UserNumber userNumber = readUserNumber(); - needsNextRound = playRound(userNumber); - printRoundResult(); - } - return gameRestartController.wantsRestart(); - } - - private void initializeGameManager() { - ComputerNumber computerNumber = ComputerNumber.create(); - gameManager = GameManager.from(computerNumber); - } - - private UserNumber readUserNumber() { - List numbers = inputView.readUserNumber(); - return UserNumber.from(numbers); - } - - private boolean playRound(UserNumber userNumber) { - boolean needsNextRound; - needsNextRound = gameManager.playRound(userNumber); - return needsNextRound; - } - - private void printRoundResult() { - RoundResultDto resultDto = gameManager.createResultDto(); - outputView.printResult(resultDto.isNothing(), resultDto.getBallCount(), resultDto.getStrikeCount()); - } } \ No newline at end of file From 117baf9287e5c5e91b17048fdc3e1120521a94f0 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:23:14 +0900 Subject: [PATCH 39/45] =?UTF-8?q?Refactor(gameManager):=20computerNumber?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=9D=84=20gameManager=EA=B0=80=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EB=90=A0=20=EB=95=8C=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=A8?= =?UTF-8?q?=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/GamePlayController.java | 3 +-- src/main/java/baseball/service/GameManager.java | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/controller/GamePlayController.java b/src/main/java/baseball/controller/GamePlayController.java index 4934034900..cff18adde9 100644 --- a/src/main/java/baseball/controller/GamePlayController.java +++ b/src/main/java/baseball/controller/GamePlayController.java @@ -37,8 +37,7 @@ public boolean play() { } private void initializeGameManager() { - ComputerNumber computerNumber = ComputerNumber.create(); - gameManager = GameManager.from(computerNumber); + gameManager = GameManager.create(); } private UserNumber readUserNumber() { diff --git a/src/main/java/baseball/service/GameManager.java b/src/main/java/baseball/service/GameManager.java index a233caa9ac..6323dad37a 100644 --- a/src/main/java/baseball/service/GameManager.java +++ b/src/main/java/baseball/service/GameManager.java @@ -13,7 +13,8 @@ private GameManager(ComputerNumber computerNumber) { this.computerNumber = computerNumber; } - public static GameManager from(ComputerNumber computerNumber) { + public static GameManager create() { + ComputerNumber computerNumber = ComputerNumber.create(); return new GameManager(computerNumber); } From 99f06afed6823c3903632484edcdea563d1daf7e Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:28:23 +0900 Subject: [PATCH 40/45] =?UTF-8?q?Refactor(mainController#run):=20=EB=A1=9C?= =?UTF-8?q?=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 --- src/main/java/baseball/controller/MainController.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/controller/MainController.java b/src/main/java/baseball/controller/MainController.java index c65d3ba5e0..39549c6302 100644 --- a/src/main/java/baseball/controller/MainController.java +++ b/src/main/java/baseball/controller/MainController.java @@ -26,10 +26,11 @@ public static MainController getInstance() { public void run() { boolean continuePlaying = true; while (continuePlaying) { - continuePlaying = gamePlayController.play(); - if (continuePlaying) { - continuePlaying = gameRestartController.wantsRestart(); + boolean needsNextRound = true; + while (needsNextRound) { + needsNextRound = gamePlayController.play(); } + continuePlaying = gameRestartController.wantsRestart(); } } } \ No newline at end of file From 9128a6f59ff8eae60cd2109ef43d11fc85498dbd Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:30:15 +0900 Subject: [PATCH 41/45] =?UTF-8?q?Style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/MainController.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/baseball/controller/MainController.java b/src/main/java/baseball/controller/MainController.java index 39549c6302..302e59de1b 100644 --- a/src/main/java/baseball/controller/MainController.java +++ b/src/main/java/baseball/controller/MainController.java @@ -1,14 +1,5 @@ package baseball.controller; -import baseball.dto.RoundResultDto; -import baseball.model.ComputerNumber; -import baseball.model.UserNumber; -import baseball.service.GameManager; -import baseball.view.InputView; -import baseball.view.OutputView; - -import java.util.List; - public class MainController { public static MainController instance = new MainController(GameRestartController.getInstance(), GamePlayController.getInstance()); private final GameRestartController gameRestartController; From 26531df184f384da252f3cbae2328f3e8859e9d4 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:32:54 +0900 Subject: [PATCH 42/45] =?UTF-8?q?Style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/GamePlayController.java | 3 +-- src/main/java/baseball/controller/GameRestartController.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/controller/GamePlayController.java b/src/main/java/baseball/controller/GamePlayController.java index cff18adde9..618eab30af 100644 --- a/src/main/java/baseball/controller/GamePlayController.java +++ b/src/main/java/baseball/controller/GamePlayController.java @@ -1,7 +1,6 @@ package baseball.controller; import baseball.dto.RoundResultDto; -import baseball.model.ComputerNumber; import baseball.model.UserNumber; import baseball.service.GameManager; import baseball.view.InputView; @@ -55,4 +54,4 @@ private void printRoundResult() { RoundResultDto resultDto = gameManager.createResultDto(); outputView.printResult(resultDto.isNothing(), resultDto.getBallCount(), resultDto.getStrikeCount()); } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/controller/GameRestartController.java b/src/main/java/baseball/controller/GameRestartController.java index bf9388788c..d056351284 100644 --- a/src/main/java/baseball/controller/GameRestartController.java +++ b/src/main/java/baseball/controller/GameRestartController.java @@ -28,4 +28,4 @@ private PlayAgainDecision readPlayAgainInput() { int input = inputView.readPlayAgainInput(); return PlayAgainDecision.of(input); } -} +} \ No newline at end of file From 972900102b1f184ba450669db8b2f9f88b311681 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:37:36 +0900 Subject: [PATCH 43/45] =?UTF-8?q?Refactor(mainController#run):=20run?= =?UTF-8?q?=EC=9D=98=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/MainController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/controller/MainController.java b/src/main/java/baseball/controller/MainController.java index 302e59de1b..7a967bd9b6 100644 --- a/src/main/java/baseball/controller/MainController.java +++ b/src/main/java/baseball/controller/MainController.java @@ -17,11 +17,9 @@ public static MainController getInstance() { public void run() { boolean continuePlaying = true; while (continuePlaying) { - boolean needsNextRound = true; - while (needsNextRound) { - needsNextRound = gamePlayController.play(); + if (!gamePlayController.play()) { + continuePlaying = gameRestartController.wantsRestart(); } - continuePlaying = gameRestartController.wantsRestart(); } } } \ No newline at end of file From baf4a3c41ecd7f61ddd7c7bf9f8a149d0c862de6 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 20 Nov 2023 21:39:12 +0900 Subject: [PATCH 44/45] =?UTF-8?q?Refactor(gamePlayController#playRound):?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD(play=20->=20playRound)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/GamePlayController.java | 2 +- src/main/java/baseball/controller/MainController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/controller/GamePlayController.java b/src/main/java/baseball/controller/GamePlayController.java index 618eab30af..1568f9163e 100644 --- a/src/main/java/baseball/controller/GamePlayController.java +++ b/src/main/java/baseball/controller/GamePlayController.java @@ -23,7 +23,7 @@ public static GamePlayController getInstance() { return instance; } - public boolean play() { + public boolean playRound() { outputView.printStart(); initializeGameManager(); boolean needsNextRound = true; diff --git a/src/main/java/baseball/controller/MainController.java b/src/main/java/baseball/controller/MainController.java index 7a967bd9b6..9a7a21f153 100644 --- a/src/main/java/baseball/controller/MainController.java +++ b/src/main/java/baseball/controller/MainController.java @@ -17,7 +17,7 @@ public static MainController getInstance() { public void run() { boolean continuePlaying = true; while (continuePlaying) { - if (!gamePlayController.play()) { + if (!gamePlayController.playRound()) { continuePlaying = gameRestartController.wantsRestart(); } } From 47f179b8c15e59612fa56d5d29f65cb432c04e34 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Tue, 21 Nov 2023 11:49:33 +0900 Subject: [PATCH 45/45] =?UTF-8?q?Refactor(mainController):=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/MainController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/controller/MainController.java b/src/main/java/baseball/controller/MainController.java index 9a7a21f153..ab24ed2513 100644 --- a/src/main/java/baseball/controller/MainController.java +++ b/src/main/java/baseball/controller/MainController.java @@ -1,13 +1,13 @@ package baseball.controller; public class MainController { - public static MainController instance = new MainController(GameRestartController.getInstance(), GamePlayController.getInstance()); - private final GameRestartController gameRestartController; + public static MainController instance = new MainController(GamePlayController.getInstance(), GameRestartController.getInstance()); private final GamePlayController gamePlayController; + private final GameRestartController gameRestartController; - private MainController(GameRestartController gameRestartController, GamePlayController gamePlayController) { - this.gameRestartController = gameRestartController; + private MainController(GamePlayController gamePlayController, GameRestartController gameRestartController) { this.gamePlayController = gamePlayController; + this.gameRestartController = gameRestartController; } public static MainController getInstance() {