From 42d88b12d102bc515f3d54b544ed0ed995c4ba15 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:19:07 +0900 Subject: [PATCH 01/28] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 구현할 기능 목록 추가 --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d7e8aee..256e39a7 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse + +## 구현 기능 목록 +- 상대방 (컴퓨터) 클래스 + - 컴퓨터 클래스를 생성할 때 랜덤 3자리 수 생성 + - 사용자가 다시 게임을 진행할 때 랜덤 3자리 수 다시 생성 +- 클라이언트 (사용자) 클래스 + - 스트라이크 개수 체크하는 함수 + - 볼 개수 체크하는 함수 + - 스트라이크, 볼, 낫싱 정보 출력하는 함수 +- main 클래스 + - 게임 진행 로직 +- Main Test 추가 \ No newline at end of file From baa9b21783ffa7c591ba00ed73ced678df13c046 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:22:04 +0900 Subject: [PATCH 02/28] Add Computer class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Computer (상대방) 클래스 추가 --- src/main/java/computer/Computer.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/computer/Computer.java diff --git a/src/main/java/computer/Computer.java b/src/main/java/computer/Computer.java new file mode 100644 index 00000000..a4999dc8 --- /dev/null +++ b/src/main/java/computer/Computer.java @@ -0,0 +1,4 @@ +package computer; + +public class Computer { +} From f1e78654d3c47465f35601838472d601b0a865da Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:25:33 +0900 Subject: [PATCH 03/28] =?UTF-8?q?Feat=20"Computer=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A9=A4=EB=B2=84=20=EB=B3=80=EC=88=98=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=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 1, createBaseballNumber() - 1~9 까지 수 중 겹치지 않는 3자리 랜덤 수 생성 2. 생성자 - 클래스 생성시 createBaseballNumber() 함수를 이용한 3자리 수 초기화 --- src/main/java/computer/Computer.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/computer/Computer.java b/src/main/java/computer/Computer.java index a4999dc8..f2fdc3a6 100644 --- a/src/main/java/computer/Computer.java +++ b/src/main/java/computer/Computer.java @@ -1,4 +1,31 @@ package computer; +import java.util.HashSet; +import java.util.Random; +import java.util.Set; + public class Computer { + + private String number; + + public Computer() { + number = createBaseballNumber(); + } + + private String createBaseballNumber(){ + Random random = new Random(); + Set numbers = new HashSet<>(); + + while(numbers.size() < 3){ + int randomNumber = random.nextInt(9) + 1; + numbers.add(randomNumber); + } + + String createNumber = ""; + for (Integer num : numbers) { + createNumber += num; + } + + return createNumber; + } } From e55bc72a69b8dabe2d283c3673bb9e5faa8bb041 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:28:25 +0900 Subject: [PATCH 04/28] =?UTF-8?q?Feat=20"=EC=9E=AC=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=9C=203=EC=9E=90=EB=A6=AC=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=EC=9E=AC=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. reGenerateNumber() - createBaseballNumber()를 이용해 3자리 숫자 재할당 --- src/main/java/computer/Computer.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/computer/Computer.java b/src/main/java/computer/Computer.java index f2fdc3a6..28893c97 100644 --- a/src/main/java/computer/Computer.java +++ b/src/main/java/computer/Computer.java @@ -28,4 +28,9 @@ private String createBaseballNumber(){ return createNumber; } + + public void reGenerateNumber(){ + number = createBaseballNumber(); + } + } From 34b3e3939affee046765e314033cc13030f4497a Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:29:33 +0900 Subject: [PATCH 05/28] =?UTF-8?q?Feat=20"getter=20setter=20=EA=B8=B0?= =?UTF-8?q?=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 1. getNumber() : getter 추가 2. changeNumber : Test 에서 사용할 setter 기능 함수 추가 --- src/main/java/computer/Computer.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/computer/Computer.java b/src/main/java/computer/Computer.java index 28893c97..2a83bef5 100644 --- a/src/main/java/computer/Computer.java +++ b/src/main/java/computer/Computer.java @@ -33,4 +33,13 @@ public void reGenerateNumber(){ number = createBaseballNumber(); } + + public String getNumber() { + return number; + } + + public void changeNumber(String number){ + this.number = number; + } + } From 7caf33c21e710689127a4168d3e43030ef0b5dec Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:30:34 +0900 Subject: [PATCH 06/28] =?UTF-8?q?Feat=20"BaseBallGame=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숫자 야구 게임 핵심 로직 가지는 클래스 추가 --- src/main/java/game/BaseBallGame.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/game/BaseBallGame.java diff --git a/src/main/java/game/BaseBallGame.java b/src/main/java/game/BaseBallGame.java new file mode 100644 index 00000000..a34d5082 --- /dev/null +++ b/src/main/java/game/BaseBallGame.java @@ -0,0 +1,4 @@ +package game; + +public class BaseBallGame { +} From ea4b0a5f4b351bbb3d788d9a9686f08c9d72aca5 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:33:56 +0900 Subject: [PATCH 07/28] =?UTF-8?q?Feat=20"=EC=8A=A4=ED=8A=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=81=AC=20=EA=B0=9C=EC=88=98=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - checkStrike : 사용자의 입력을 이용해 스트라이크 수 체크하는 함수 추가 --- src/main/java/game/BaseBallGame.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/game/BaseBallGame.java b/src/main/java/game/BaseBallGame.java index a34d5082..55666c3e 100644 --- a/src/main/java/game/BaseBallGame.java +++ b/src/main/java/game/BaseBallGame.java @@ -1,4 +1,17 @@ package game; public class BaseBallGame { + + public int checkStrike(String computerNumber, String userNumber){ + int strike = 0; + + for(int i=0; i<3; i++){ + if(computerNumber.charAt(i) == userNumber.charAt(i)){ + strike++; + } + } + + return strike; + } + } From 249be99cfbc8932ef0c5c4dee1f5c3ccdacd22d0 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:34:14 +0900 Subject: [PATCH 08/28] =?UTF-8?q?Feat=20"=EB=B3=BC=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - checkBall : 사용자의 입력을 이용해 볼 수 체크하는 함수 추가 --- src/main/java/game/BaseBallGame.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/game/BaseBallGame.java b/src/main/java/game/BaseBallGame.java index 55666c3e..5ab00f77 100644 --- a/src/main/java/game/BaseBallGame.java +++ b/src/main/java/game/BaseBallGame.java @@ -14,4 +14,16 @@ public int checkStrike(String computerNumber, String userNumber){ return strike; } + public int checkBall(String computerNumber, String userNumber){ + int ball = 0; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (i != j && computerNumber.charAt(i) == userNumber.charAt(j)) { + ball++; + } + } + } + return ball; + } + } From 741123aaae1ce9e420d127232fc2d10562b2d147 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:37:45 +0900 Subject: [PATCH 09/28] =?UTF-8?q?Feat=20"=EC=8A=A4=ED=8A=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=81=AC,=20=EB=B3=BC=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - printGameInfo : 스트라이브, 볼, 낫싱 정보 출력하는 함수 --- src/main/java/game/BaseBallGame.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/game/BaseBallGame.java b/src/main/java/game/BaseBallGame.java index 5ab00f77..007a9cfb 100644 --- a/src/main/java/game/BaseBallGame.java +++ b/src/main/java/game/BaseBallGame.java @@ -26,4 +26,17 @@ public int checkBall(String computerNumber, String userNumber){ return ball; } + public void printGameInfo(int strike, int ball){ + if(strike == 0 && ball == 0){ + System.out.println("낫싱"); + } else if(strike > 0 && ball == 0) { + System.out.println(strike+"스트라이크"); + } else if(strike == 0 && ball > 0){ + System.out.println(ball+"볼"); + } + else{ + System.out.println(ball+"볼 "+strike+"스트라이크"); + } + } + } From 97975d66f9bd526a8ce01f93e85eea7de50e8fb0 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 17:40:13 +0900 Subject: [PATCH 10/28] =?UTF-8?q?Feat=20"Application=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숫자 야구 main 함수 추가 --- src/main/java/Application.java | 84 ++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/main/java/Application.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..c1c39bea --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,84 @@ +import computer.Computer; +import game.BaseBallGame; + +import java.util.Scanner; + +public class Application { + private static boolean playGame = true; + private static boolean collectAnswer = false; + public static void main(String[] args) { + + Computer computer = new Computer(); + BaseBallGame baseBallGame = new BaseBallGame(); + Scanner scanner = new Scanner(System.in); + + String number = computer.getNumber(); + + System.out.println(number); + + while(playGame){ + System.out.print("숫자를 입력해 주세요 : "); + String clientNumber = scanner.nextLine(); + + if(!checkNumberValid(clientNumber)){ + throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); + } + + int strike = baseBallGame.checkStrike(computer.getNumber(), clientNumber); + int ball = baseBallGame.checkBall(computer.getNumber(), clientNumber); + + if(strike == 3){ + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + collectAnswer = true; + }else{ + baseBallGame.printGameInfo(strike, ball); + } + + if(collectAnswer){ + checkRestartGame(scanner, computer); + } + } + + scanner.close(); + } + + public static Boolean checkNumberValid(String number){ + if (number.length() != 3) { + return false; + } + + for (int i = 0; i < number.length(); i++) { + char c = number.charAt(i); + + if (!Character.isDigit(c) || c == '0') { + return false; + } + + for (int j = i + 1; j < number.length(); j++) { + if (number.charAt(j) == c) { + return false; + } + } + } + + return true; + } + + public static void checkRestartGame(Scanner scanner, Computer computer){ + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String continueGame = scanner.nextLine(); + + if("1".equals(continueGame)){ + computer.reGenerateNumber(); + collectAnswer = false; + } + else if("2".equals(continueGame)){ + playGame = false; + } + else{ + throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); + } + } + + +} From eba2a7e475954e28e338cac5776c6393901a36a6 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 18:19:44 +0900 Subject: [PATCH 11/28] Update "README.md" --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 256e39a7..38be8df7 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,11 @@ - 상대방 (컴퓨터) 클래스 - 컴퓨터 클래스를 생성할 때 랜덤 3자리 수 생성 - 사용자가 다시 게임을 진행할 때 랜덤 3자리 수 다시 생성 -- 클라이언트 (사용자) 클래스 +- BaseBallGame (게임 진행 로직) 클래스 - 스트라이크 개수 체크하는 함수 - 볼 개수 체크하는 함수 - 스트라이크, 볼, 낫싱 정보 출력하는 함수 - main 클래스 - 게임 진행 로직 +- BaseBallGame 클래스 Test 추가 - Main Test 추가 \ No newline at end of file From 6697507e6d9bca6be043f9d7134a2972c0a1bb9f Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 18:21:38 +0900 Subject: [PATCH 12/28] =?UTF-8?q?Chore=20"=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UTF-8 인코딩 의존성 추가 --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 20a92c9e..54e9815f 100644 --- a/build.gradle +++ b/build.gradle @@ -23,3 +23,7 @@ dependencies { test { useJUnitPlatform() } + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} From 9091b6f4180b6e11d5e0fcb9a261f12e72dd51d1 Mon Sep 17 00:00:00 2001 From: ddglackrp Date: Sun, 5 May 2024 18:25:33 +0900 Subject: [PATCH 13/28] =?UTF-8?q?Test=20"BaseBallGame=20Test=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/game/BaseBallGameTest.java | 103 +++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/test/java/game/BaseBallGameTest.java diff --git a/src/test/java/game/BaseBallGameTest.java b/src/test/java/game/BaseBallGameTest.java new file mode 100644 index 00000000..d38faf3a --- /dev/null +++ b/src/test/java/game/BaseBallGameTest.java @@ -0,0 +1,103 @@ +package game; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class BaseBallGameTest { + + private final BaseBallGame baseBallGame = new BaseBallGame(); + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + + @AfterEach + public void tearDown() { + System.setOut(standardOut); + } + + @Test + @DisplayName("스트라이크 개수 체크 Test") + void checkStrikeTest(){ + String computerNumber = "123"; + String userNumber = "123"; + + int strike = baseBallGame.checkStrike(computerNumber, userNumber); + assertThat(strike).isEqualTo(3); + + userNumber = "523"; + strike = baseBallGame.checkStrike(computerNumber, userNumber); + assertThat(strike).isEqualTo(2); + + userNumber = "563"; + strike = baseBallGame.checkStrike(computerNumber, userNumber); + assertThat(strike).isEqualTo(1); + + userNumber = "564"; + strike = baseBallGame.checkStrike(computerNumber, userNumber); + assertThat(strike).isEqualTo(0); + } + + @Test + @DisplayName("볼 개수 체크 Test") + void checkBallTest(){ + String computerNumber = "123"; + String userNumber = "123"; + + int ball = baseBallGame.checkBall(computerNumber, userNumber); + assertThat(ball).isEqualTo(0); + + userNumber = "312"; + ball = baseBallGame.checkBall(computerNumber, userNumber); + assertThat(ball).isEqualTo(3); + + userNumber = "412"; + ball = baseBallGame.checkBall(computerNumber, userNumber); + assertThat(ball).isEqualTo(2); + + userNumber = "415"; + ball = baseBallGame.checkBall(computerNumber, userNumber); + assertThat(ball).isEqualTo(1); + } + + @Test + @DisplayName("낫싱 테스트") + void 낫싱_출력_TEST(){ + baseBallGame.printGameInfo(0, 0); + assertEquals("낫싱", outputStreamCaptor.toString().trim()); + } + + @Test + @DisplayName("3스트라이크 테스트") + void 쓰리_스트라이크_TEST(){ + baseBallGame.printGameInfo(3, 0); + assertEquals(3+"스트라이크", outputStreamCaptor.toString().trim()); + } + + @Test + @DisplayName("2볼 1스트라이크 테스트") + void 투볼_원스트라이크_TEST(){ + baseBallGame.printGameInfo(1, 2); + assertEquals(2+"볼 "+1+"스트라이크", outputStreamCaptor.toString().trim()); + } + + @Test + @DisplayName("3볼 테스트") + void 쓰리볼_TEST(){ + baseBallGame.printGameInfo(0, 3); + assertEquals(3+"볼", outputStreamCaptor.toString().trim()); + } + +} \ No newline at end of file From 0db15dc5ef8b18ab0c440cd513ffca46fc87120d Mon Sep 17 00:00:00 2001 From: JJY Date: Sun, 5 May 2024 21:53:46 +0900 Subject: [PATCH 14/28] =?UTF-8?q?Refactor=20"checkNumberValid=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 - 숫자 중복 체크 로직 filter 적용 --- src/main/java/Application.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index c1c39bea..9808be5e 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -54,10 +54,9 @@ public static Boolean checkNumberValid(String number){ return false; } - for (int j = i + 1; j < number.length(); j++) { - if (number.charAt(j) == c) { - return false; - } + long count = number.chars().filter(n -> n == c).count(); + if (count > 1){ + return false; } } From 18d416d2ec63dfe06f369b2c1d5b384f6afdc9e1 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 01:26:20 +0900 Subject: [PATCH 15/28] Feat "Add GameCondition class" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - playGame : 게임을 계속 진행하는지에 대한 조건 - collectAnswer : 클라이언트의 대답이 정답인지에 대한 조건 --- src/main/java/game/GameCondition.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/game/GameCondition.java diff --git a/src/main/java/game/GameCondition.java b/src/main/java/game/GameCondition.java new file mode 100644 index 00000000..2b62665e --- /dev/null +++ b/src/main/java/game/GameCondition.java @@ -0,0 +1,27 @@ +package game; + +public class GameCondition { + boolean playGame; + boolean collectAnswer; + + public GameCondition() { + this.playGame = true; + this.collectAnswer = false; + } + + public boolean canPlayGame() { + return playGame; + } + + public boolean canCollectAnswer() { + return collectAnswer; + } + + public void changeCollectAnswer(boolean collectAnswer){ + this.collectAnswer = collectAnswer; + } + + public void changePlayGame(boolean playGame){ + this.playGame = playGame; + } +} From 38b961d444b484a4c1e9b1edb3f9cdc6a35a878a Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 01:28:33 +0900 Subject: [PATCH 16/28] =?UTF-8?q?Refactor=20"BaseBallGameService=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20=EC=A7=84=ED=96=89"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. class 명 변경 : BaseBallGame -> BaseBallGameService 2. printGameInfo : 출력 -> 출력할 내용 return 으로 변경 3. checkNumberValid : 숫자가 유효한 입력인지 확인하는 함수 --- ...BallGame.java => BaseBallGameService.java} | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) rename src/main/java/game/{BaseBallGame.java => BaseBallGameService.java} (52%) diff --git a/src/main/java/game/BaseBallGame.java b/src/main/java/game/BaseBallGameService.java similarity index 52% rename from src/main/java/game/BaseBallGame.java rename to src/main/java/game/BaseBallGameService.java index 007a9cfb..df7b95c3 100644 --- a/src/main/java/game/BaseBallGame.java +++ b/src/main/java/game/BaseBallGameService.java @@ -1,6 +1,6 @@ package game; -public class BaseBallGame { +public class BaseBallGameService { public int checkStrike(String computerNumber, String userNumber){ int strike = 0; @@ -26,17 +26,38 @@ public int checkBall(String computerNumber, String userNumber){ return ball; } - public void printGameInfo(int strike, int ball){ + public String printGameInfo(int strike, int ball){ if(strike == 0 && ball == 0){ - System.out.println("낫싱"); + return "낫싱"; } else if(strike > 0 && ball == 0) { - System.out.println(strike+"스트라이크"); + return strike+"스트라이크"; } else if(strike == 0 && ball > 0){ - System.out.println(ball+"볼"); + return ball+"볼"; } else{ - System.out.println(ball+"볼 "+strike+"스트라이크"); + return ball+"볼 "+strike+"스트라이크"; } } + public Boolean checkNumberValid(String number){ + if (number.length() != 3) { + return false; + } + + for (int i = 0; i < number.length(); i++) { + char c = number.charAt(i); + + if (!Character.isDigit(c) || c == '0') { + return false; + } + + long count = number.chars().filter(n -> n == c).count(); + if (count > 1){ + return false; + } + } + + return true; + } + } From 242d92d160b1e8a23210ba2746064da411cd8c79 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 01:33:11 +0900 Subject: [PATCH 17/28] =?UTF-8?q?Refactor=20"Application=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=EC=A7=84=ED=96=89"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 유효하지 않은 입력에 대해 try-catch 문으로 exception handling 2. static method 추출 --- src/main/java/Application.java | 96 +++++++++++++++++----------------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 9808be5e..14cf1dfb 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,82 +1,84 @@ import computer.Computer; -import game.BaseBallGame; +import game.BaseBallGameService; +import game.GameCondition; import java.util.Scanner; public class Application { - private static boolean playGame = true; - private static boolean collectAnswer = false; - public static void main(String[] args) { + public static void main(String[] args) { Computer computer = new Computer(); - BaseBallGame baseBallGame = new BaseBallGame(); + BaseBallGameService gameService = new BaseBallGameService(); + GameCondition gameCondition = new GameCondition(); + Scanner scanner = new Scanner(System.in); String number = computer.getNumber(); - System.out.println(number); - while(playGame){ + while(gameCondition.canPlayGame()){ System.out.print("숫자를 입력해 주세요 : "); String clientNumber = scanner.nextLine(); - if(!checkNumberValid(clientNumber)){ - throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); + if (inputValidCheck(clientNumber, gameService)) { + scanner.close(); + break; } - int strike = baseBallGame.checkStrike(computer.getNumber(), clientNumber); - int ball = baseBallGame.checkBall(computer.getNumber(), clientNumber); + int strike = gameService.checkStrike(computer.getNumber(), clientNumber); + int ball = gameService.checkBall(computer.getNumber(), clientNumber); - if(strike == 3){ - System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); - collectAnswer = true; - }else{ - baseBallGame.printGameInfo(strike, ball); - } + printGameInfo(strike, ball, gameCondition, gameService); - if(collectAnswer){ - checkRestartGame(scanner, computer); + if(gameCondition.canCollectAnswer()){ + checkRestartGame(scanner, computer, gameCondition); } } scanner.close(); } - public static Boolean checkNumberValid(String number){ - if (number.length() != 3) { - return false; + public static boolean inputValidCheck(String clientNumber, BaseBallGameService gameService) { + try { + if (!gameService.checkNumberValid(clientNumber)) { + throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); + } + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return true; } + return false; + } - for (int i = 0; i < number.length(); i++) { - char c = number.charAt(i); + private static void printGameInfo(int strike, int ball, GameCondition gameCondition, BaseBallGameService gameService) { + if(strike == 3){ + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + gameCondition.changeCollectAnswer(true); + }else{ + String info = gameService.printGameInfo(strike, ball); + System.out.println(info); + } + } - if (!Character.isDigit(c) || c == '0') { - return false; + public static void checkRestartGame(Scanner scanner, Computer computer, GameCondition gameCondition){ + try { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String continueGame = scanner.nextLine(); + if("1".equals(continueGame)){ + computer.reGenerateNumber(); + gameCondition.changeCollectAnswer(false); } - - long count = number.chars().filter(n -> n == c).count(); - if (count > 1){ - return false; + else if("2".equals(continueGame)){ + gameCondition.changePlayGame(false); } + else{ + throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); + } + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + gameCondition.changePlayGame(false); } - return true; - } - - public static void checkRestartGame(Scanner scanner, Computer computer){ - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - String continueGame = scanner.nextLine(); - - if("1".equals(continueGame)){ - computer.reGenerateNumber(); - collectAnswer = false; - } - else if("2".equals(continueGame)){ - playGame = false; - } - else{ - throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); - } } From e801de5918fce7c306502f67dd761724de1257e4 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 01:35:52 +0900 Subject: [PATCH 18/28] =?UTF-8?q?Test=20"=EC=9E=85=EB=A0=A5=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/game/BaseBallGameServiceTest.java | 78 +++++++++++++ src/test/java/game/BaseBallGameTest.java | 103 ------------------ 2 files changed, 78 insertions(+), 103 deletions(-) create mode 100644 src/test/java/game/BaseBallGameServiceTest.java delete mode 100644 src/test/java/game/BaseBallGameTest.java diff --git a/src/test/java/game/BaseBallGameServiceTest.java b/src/test/java/game/BaseBallGameServiceTest.java new file mode 100644 index 00000000..a1208f3a --- /dev/null +++ b/src/test/java/game/BaseBallGameServiceTest.java @@ -0,0 +1,78 @@ +package game; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class BaseBallGameServiceTest { + + private final BaseBallGameService baseBallGameService = new BaseBallGameService(); + + @Test + @DisplayName("스트라이크 개수 체크 Test") + void checkStrikeTest(){ + String computerNumber = "123"; + String userNumber = "123"; + + int strike = baseBallGameService.checkStrike(computerNumber, userNumber); + assertThat(strike).isEqualTo(3); + + userNumber = "523"; + strike = baseBallGameService.checkStrike(computerNumber, userNumber); + assertThat(strike).isEqualTo(2); + + userNumber = "563"; + strike = baseBallGameService.checkStrike(computerNumber, userNumber); + assertThat(strike).isEqualTo(1); + + userNumber = "564"; + strike = baseBallGameService.checkStrike(computerNumber, userNumber); + assertThat(strike).isEqualTo(0); + } + + @Test + @DisplayName("볼 개수 체크 Test") + void checkBallTest(){ + String computerNumber = "123"; + String userNumber = "123"; + + int ball = baseBallGameService.checkBall(computerNumber, userNumber); + assertThat(ball).isEqualTo(0); + + userNumber = "312"; + ball = baseBallGameService.checkBall(computerNumber, userNumber); + assertThat(ball).isEqualTo(3); + + userNumber = "412"; + ball = baseBallGameService.checkBall(computerNumber, userNumber); + assertThat(ball).isEqualTo(2); + + userNumber = "415"; + ball = baseBallGameService.checkBall(computerNumber, userNumber); + assertThat(ball).isEqualTo(1); + } + + @Test + @DisplayName("볼 스트라이크 낫싱 정보 출력") + void printInfoTest(){ + assertThat(baseBallGameService.printGameInfo(0, 0)).isEqualTo("낫싱"); + assertThat(baseBallGameService.printGameInfo(2, 0)).isEqualTo("2스트라이크"); + assertThat(baseBallGameService.printGameInfo(2, 0)).isEqualTo("2스트라이크"); + assertThat(baseBallGameService.printGameInfo(1, 2)).isEqualTo(2+"볼 "+1+"스트라이크"); + assertThat(baseBallGameService.printGameInfo(0, 3)).isEqualTo(3+"볼"); + } + + @Test + @DisplayName("입력 유효성 테스트") + void inputValidTest(){ + assertThat(baseBallGameService.checkNumberValid("123")).isTrue(); + assertThat(baseBallGameService.checkNumberValid("312")).isTrue(); + assertThat(baseBallGameService.checkNumberValid("agb")).isFalse(); + assertThat(baseBallGameService.checkNumberValid("122")).isFalse(); + assertThat(baseBallGameService.checkNumberValid("12")).isFalse(); + assertThat(baseBallGameService.checkNumberValid("120")).isFalse(); + } + + +} \ No newline at end of file diff --git a/src/test/java/game/BaseBallGameTest.java b/src/test/java/game/BaseBallGameTest.java deleted file mode 100644 index d38faf3a..00000000 --- a/src/test/java/game/BaseBallGameTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package game; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - -class BaseBallGameTest { - - private final BaseBallGame baseBallGame = new BaseBallGame(); - private final PrintStream standardOut = System.out; - private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); - - @BeforeEach - public void setUp() { - System.setOut(new PrintStream(outputStreamCaptor)); - } - - @AfterEach - public void tearDown() { - System.setOut(standardOut); - } - - @Test - @DisplayName("스트라이크 개수 체크 Test") - void checkStrikeTest(){ - String computerNumber = "123"; - String userNumber = "123"; - - int strike = baseBallGame.checkStrike(computerNumber, userNumber); - assertThat(strike).isEqualTo(3); - - userNumber = "523"; - strike = baseBallGame.checkStrike(computerNumber, userNumber); - assertThat(strike).isEqualTo(2); - - userNumber = "563"; - strike = baseBallGame.checkStrike(computerNumber, userNumber); - assertThat(strike).isEqualTo(1); - - userNumber = "564"; - strike = baseBallGame.checkStrike(computerNumber, userNumber); - assertThat(strike).isEqualTo(0); - } - - @Test - @DisplayName("볼 개수 체크 Test") - void checkBallTest(){ - String computerNumber = "123"; - String userNumber = "123"; - - int ball = baseBallGame.checkBall(computerNumber, userNumber); - assertThat(ball).isEqualTo(0); - - userNumber = "312"; - ball = baseBallGame.checkBall(computerNumber, userNumber); - assertThat(ball).isEqualTo(3); - - userNumber = "412"; - ball = baseBallGame.checkBall(computerNumber, userNumber); - assertThat(ball).isEqualTo(2); - - userNumber = "415"; - ball = baseBallGame.checkBall(computerNumber, userNumber); - assertThat(ball).isEqualTo(1); - } - - @Test - @DisplayName("낫싱 테스트") - void 낫싱_출력_TEST(){ - baseBallGame.printGameInfo(0, 0); - assertEquals("낫싱", outputStreamCaptor.toString().trim()); - } - - @Test - @DisplayName("3스트라이크 테스트") - void 쓰리_스트라이크_TEST(){ - baseBallGame.printGameInfo(3, 0); - assertEquals(3+"스트라이크", outputStreamCaptor.toString().trim()); - } - - @Test - @DisplayName("2볼 1스트라이크 테스트") - void 투볼_원스트라이크_TEST(){ - baseBallGame.printGameInfo(1, 2); - assertEquals(2+"볼 "+1+"스트라이크", outputStreamCaptor.toString().trim()); - } - - @Test - @DisplayName("3볼 테스트") - void 쓰리볼_TEST(){ - baseBallGame.printGameInfo(0, 3); - assertEquals(3+"볼", outputStreamCaptor.toString().trim()); - } - -} \ No newline at end of file From 822cda444e2afc07d28d4173bc1adc47edd6cb19 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 03:07:57 +0900 Subject: [PATCH 19/28] =?UTF-8?q?Refactor=20"checkNumberValid=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 - 유효하지 않은 입력 : IllegalArgumentException 발생 - 유효한 입력 : return true --- src/main/java/game/BaseBallGameService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/game/BaseBallGameService.java b/src/main/java/game/BaseBallGameService.java index df7b95c3..2bc7175a 100644 --- a/src/main/java/game/BaseBallGameService.java +++ b/src/main/java/game/BaseBallGameService.java @@ -39,21 +39,21 @@ public String printGameInfo(int strike, int ball){ } } - public Boolean checkNumberValid(String number){ + public boolean checkNumberValid(String number){ if (number.length() != 3) { - return false; + throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); } for (int i = 0; i < number.length(); i++) { char c = number.charAt(i); if (!Character.isDigit(c) || c == '0') { - return false; + throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); } long count = number.chars().filter(n -> n == c).count(); if (count > 1){ - return false; + throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); } } From e94181bdbe35c27e67255189e7b9cd2614916f5e Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 03:08:31 +0900 Subject: [PATCH 20/28] =?UTF-8?q?Test=20"inputValidTest=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 --- .../java/game/BaseBallGameServiceTest.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/test/java/game/BaseBallGameServiceTest.java b/src/test/java/game/BaseBallGameServiceTest.java index a1208f3a..6190f96a 100644 --- a/src/test/java/game/BaseBallGameServiceTest.java +++ b/src/test/java/game/BaseBallGameServiceTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class BaseBallGameServiceTest { @@ -66,13 +67,21 @@ void printInfoTest(){ @Test @DisplayName("입력 유효성 테스트") void inputValidTest(){ + assertThatThrownBy(()->baseBallGameService.checkNumberValid("agb")) + .isInstanceOf(IllegalArgumentException.class); + + assertThatThrownBy(()->baseBallGameService.checkNumberValid("122")) + .isInstanceOf(IllegalArgumentException.class); + + assertThatThrownBy(()->baseBallGameService.checkNumberValid("12")) + .isInstanceOf(IllegalArgumentException.class); + + assertThatThrownBy(()->baseBallGameService.checkNumberValid("120")) + .isInstanceOf(IllegalArgumentException.class); + assertThat(baseBallGameService.checkNumberValid("123")).isTrue(); - assertThat(baseBallGameService.checkNumberValid("312")).isTrue(); - assertThat(baseBallGameService.checkNumberValid("agb")).isFalse(); - assertThat(baseBallGameService.checkNumberValid("122")).isFalse(); - assertThat(baseBallGameService.checkNumberValid("12")).isFalse(); - assertThat(baseBallGameService.checkNumberValid("120")).isFalse(); } + } \ No newline at end of file From 955dcf48069002f5d5c74461914d3607c88c551f Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 03:13:44 +0900 Subject: [PATCH 21/28] =?UTF-8?q?Refactor=20"Application=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. static 함수 Application 멤버 함수로 변경 2. 멤버 변수 추가 3. 기존 메인 함수 Application start 함수로 변경 4. 메인 함수 변경 --- src/main/java/Application.java | 100 +++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 14cf1dfb..0f9478eb 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -6,51 +6,38 @@ public class Application { - public static void main(String[] args) { - Computer computer = new Computer(); - BaseBallGameService gameService = new BaseBallGameService(); - GameCondition gameCondition = new GameCondition(); - - Scanner scanner = new Scanner(System.in); - - String number = computer.getNumber(); - System.out.println(number); - - while(gameCondition.canPlayGame()){ - System.out.print("숫자를 입력해 주세요 : "); - String clientNumber = scanner.nextLine(); - - if (inputValidCheck(clientNumber, gameService)) { - scanner.close(); - break; - } - - int strike = gameService.checkStrike(computer.getNumber(), clientNumber); - int ball = gameService.checkBall(computer.getNumber(), clientNumber); - - printGameInfo(strike, ball, gameCondition, gameService); - - if(gameCondition.canCollectAnswer()){ - checkRestartGame(scanner, computer, gameCondition); - } - } + private final Computer computer; + private final BaseBallGameService gameService; + private final GameCondition gameCondition; + + public Application(Computer computer, BaseBallGameService gameService, GameCondition gameCondition) { + this.computer = computer; + this.gameService = gameService; + this.gameCondition = gameCondition; + } - scanner.close(); + public Computer getComputer() { + return computer; } - public static boolean inputValidCheck(String clientNumber, BaseBallGameService gameService) { + private boolean inputValidCheck(String clientNumber) { + gameService.checkNumberValid(clientNumber); + try { - if (!gameService.checkNumberValid(clientNumber)) { - throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); - } + return true; } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); - return true; + return false; } - return false; } - private static void printGameInfo(int strike, int ball, GameCondition gameCondition, BaseBallGameService gameService) { + private void continueInputValidCheck(String continueGame) { + if(!("1".equals(continueGame) || "2".equals(continueGame))){ + throw new IllegalArgumentException("입력이 1과 2가 아닙니다. 애플리케이션을 종료합니다."); + } + } + + private void printGameInfo(int strike, int ball) { if(strike == 3){ System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); gameCondition.changeCollectAnswer(true); @@ -60,10 +47,9 @@ private static void printGameInfo(int strike, int ball, GameCondition gameCondit } } - public static void checkRestartGame(Scanner scanner, Computer computer, GameCondition gameCondition){ + private void checkRestartGame(String continueGame){ + continueInputValidCheck(continueGame); try { - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - String continueGame = scanner.nextLine(); if("1".equals(continueGame)){ computer.reGenerateNumber(); gameCondition.changeCollectAnswer(false); @@ -71,15 +57,45 @@ public static void checkRestartGame(Scanner scanner, Computer computer, GameCond else if("2".equals(continueGame)){ gameCondition.changePlayGame(false); } - else{ - throw new IllegalArgumentException("잘못된 입력입니다. 애플리케이션을 종료합니다."); - } } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); gameCondition.changePlayGame(false); } + } + public void start(){ + Scanner scanner = new Scanner(System.in); + + while(gameCondition.canPlayGame()){ + System.out.print("숫자를 입력해 주세요 : "); + String clientNumber = scanner.nextLine(); + + if (!inputValidCheck(clientNumber)) { + scanner.close(); + break; + } + int strike = gameService.checkStrike(computer.getNumber(), clientNumber); + int ball = gameService.checkBall(computer.getNumber(), clientNumber); + + printGameInfo(strike, ball); + + if(gameCondition.canCollectAnswer()){ + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String continueGame = scanner.nextLine(); + checkRestartGame(continueGame); + } + } + scanner.close(); + System.out.println("안녕히 가세요"); } + public static void main(String[] args) { + Computer computer = new Computer(); + BaseBallGameService gameService = new BaseBallGameService(); + GameCondition gameCondition = new GameCondition(); + + Application app = new Application(computer, gameService, gameCondition); + app.start(); + } } From 0f391212d24d60dc1914892803ff78388b0bf330 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 03:14:05 +0900 Subject: [PATCH 22/28] =?UTF-8?q?Test=20"Application=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20Test=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/ApplicationTest.java | 82 ++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/test/java/ApplicationTest.java diff --git a/src/test/java/ApplicationTest.java b/src/test/java/ApplicationTest.java new file mode 100644 index 00000000..3b1fd98c --- /dev/null +++ b/src/test/java/ApplicationTest.java @@ -0,0 +1,82 @@ +import computer.Computer; +import game.BaseBallGameService; +import game.GameCondition; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Scanner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class ApplicationTest { + + private final Application application = new Application( + new Computer(), + new BaseBallGameService(), + new GameCondition() + ); + + private final InputStream systemIn = System.in; + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream testOut = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(testOut)); + } + @AfterEach + public void restoreSystemInput() { + System.setOut(standardOut); + System.setIn(systemIn); + } + + @Test + @DisplayName("서로다른 1~9 까지의 3자리 수 입력이 아닌 경우") + void userInvalidInputTest(){ + String invalidInput = "a23"; + ByteArrayInputStream testIn = new ByteArrayInputStream(invalidInput.getBytes()); + System.setIn(testIn); + + IllegalArgumentException illegalArgumentException = assertThrows(IllegalArgumentException.class, application::start); + + assertThat(illegalArgumentException.getMessage()).isEqualTo("잘못된 입력입니다. 애플리케이션을 종료합니다."); + } + + @Test + @DisplayName("게임이 종료되고 1과 2의 입력이 아닌 경우") + void userInvalidInputTest2(){ + application.getComputer().changeNumber("123"); + String invalidInput = "123\na\n"; + ByteArrayInputStream testIn = new ByteArrayInputStream(invalidInput.getBytes()); + System.setIn(testIn); + + IllegalArgumentException illegalArgumentException = assertThrows(IllegalArgumentException.class, application::start); + + assertThat(illegalArgumentException.getMessage()).isEqualTo("입력이 1과 2가 아닙니다. 애플리케이션을 종료합니다."); + } + + @Test + @DisplayName("게임 정상 흐름 테스트") + void normalFlowTest(){ + application.getComputer().changeNumber("123"); + String invalidInput = "123\n2\n"; + ByteArrayInputStream testIn = new ByteArrayInputStream(invalidInput.getBytes()); + System.setIn(testIn); + + application.start(); + + assertTrue(testOut.toString().contains("3개의 숫자를 모두 맞히셨습니다! 게임 종료")); + assertTrue(testOut.toString().contains("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.")); + assertTrue(testOut.toString().contains("안녕히 가세요")); + } + +} \ No newline at end of file From f6cf723cd44e8146bd5982fc6cd0b9dc925f5ed9 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 03:35:04 +0900 Subject: [PATCH 23/28] =?UTF-8?q?Refactor=20"Application=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20try=20-=20catch=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - IllegalArgumentException catch 하지 않고 throw --- src/main/java/Application.java | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 0f9478eb..b135bc55 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -21,20 +21,8 @@ public Computer getComputer() { } private boolean inputValidCheck(String clientNumber) { - gameService.checkNumberValid(clientNumber); - - try { + gameService.checkNumberValid(clientNumber); return true; - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); - return false; - } - } - - private void continueInputValidCheck(String continueGame) { - if(!("1".equals(continueGame) || "2".equals(continueGame))){ - throw new IllegalArgumentException("입력이 1과 2가 아닙니다. 애플리케이션을 종료합니다."); - } } private void printGameInfo(int strike, int ball) { @@ -48,19 +36,16 @@ private void printGameInfo(int strike, int ball) { } private void checkRestartGame(String continueGame){ - continueInputValidCheck(continueGame); - try { - if("1".equals(continueGame)){ - computer.reGenerateNumber(); - gameCondition.changeCollectAnswer(false); - } - else if("2".equals(continueGame)){ - gameCondition.changePlayGame(false); - } - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); + if("1".equals(continueGame)){ + computer.reGenerateNumber(); + gameCondition.changeCollectAnswer(false); + } + else if("2".equals(continueGame)){ gameCondition.changePlayGame(false); } + else{ + throw new IllegalArgumentException("입력이 1과 2가 아닙니다. 애플리케이션을 종료합니다."); + } } public void start(){ Scanner scanner = new Scanner(System.in); From a6051f28338b586ec0298bdb7d4c82d8e82342b0 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 10:41:40 +0900 Subject: [PATCH 24/28] =?UTF-8?q?Test=20"=EC=BB=B4=ED=93=A8=ED=84=B0=20(?= =?UTF-8?q?=EC=83=81=EB=8C=80=EB=B0=A9)=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 1~9 까지의 서로다른 3개 수 선택하는지 확인 테스트 추가 --- src/main/java/Application.java | 4 +-- src/test/java/computer/ComputerTest.java | 31 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/test/java/computer/ComputerTest.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index b135bc55..ef3c9e73 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -21,8 +21,8 @@ public Computer getComputer() { } private boolean inputValidCheck(String clientNumber) { - gameService.checkNumberValid(clientNumber); - return true; + gameService.checkNumberValid(clientNumber); + return true; } private void printGameInfo(int strike, int ball) { diff --git a/src/test/java/computer/ComputerTest.java b/src/test/java/computer/ComputerTest.java new file mode 100644 index 00000000..5e9d20b4 --- /dev/null +++ b/src/test/java/computer/ComputerTest.java @@ -0,0 +1,31 @@ +package computer; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class ComputerTest { + + private final Computer computer = new Computer(); + + @Test + @DisplayName("컴퓨터 서로다른 3자리 숫자 생성 테스트") + void computerInitTest(){ + String number = computer.getNumber(); + + Set numbers = new HashSet<>(); + + for(int i=0; i<3; i++){ + numbers.add(Integer.valueOf(number.charAt(i))); + } + + assertThat(numbers.size()).isEqualTo(3); + } + +} \ No newline at end of file From edc93c44e77628eafdb65436662e049d76d28ee6 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 10:50:16 +0900 Subject: [PATCH 25/28] =?UTF-8?q?Refactoring=20"Application=20class=20exce?= =?UTF-8?q?ption=20handler=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - IllegalArgumentException try catch 문 추가 --- src/main/java/Application.java | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index ef3c9e73..6a205169 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -21,8 +21,14 @@ public Computer getComputer() { } private boolean inputValidCheck(String clientNumber) { - gameService.checkNumberValid(clientNumber); - return true; + try{ + gameService.checkNumberValid(clientNumber); + return true; + } + catch (IllegalArgumentException e){ + System.out.println(e.getMessage()); + return false; + } } private void printGameInfo(int strike, int ball) { @@ -36,16 +42,22 @@ private void printGameInfo(int strike, int ball) { } private void checkRestartGame(String continueGame){ - if("1".equals(continueGame)){ - computer.reGenerateNumber(); - gameCondition.changeCollectAnswer(false); + try{ + if("1".equals(continueGame)){ + computer.reGenerateNumber(); + gameCondition.changeCollectAnswer(false); + } + else if("2".equals(continueGame)){ + gameCondition.changePlayGame(false); + } + else{ + throw new IllegalArgumentException("입력이 1과 2가 아닙니다. 애플리케이션을 종료합니다."); + } } - else if("2".equals(continueGame)){ + catch (IllegalArgumentException e){ + System.out.println(e.getMessage()); gameCondition.changePlayGame(false); } - else{ - throw new IllegalArgumentException("입력이 1과 2가 아닙니다. 애플리케이션을 종료합니다."); - } } public void start(){ Scanner scanner = new Scanner(System.in); @@ -71,7 +83,7 @@ public void start(){ } } scanner.close(); - System.out.println("안녕히 가세요"); + System.out.println("안녕히 가세요."); } public static void main(String[] args) { From 93764d1b5aa7615b9cb288b93978b4d42905a95f Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 10:51:11 +0900 Subject: [PATCH 26/28] =?UTF-8?q?Test=20"Application=20Test=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=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 - userInvalidInputTest : 출력값 비교로 변경 - userInvalidInputTest2 : 출력값 비교로 변경 --- src/test/java/ApplicationTest.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/test/java/ApplicationTest.java b/src/test/java/ApplicationTest.java index 3b1fd98c..65e776ab 100644 --- a/src/test/java/ApplicationTest.java +++ b/src/test/java/ApplicationTest.java @@ -46,9 +46,11 @@ void userInvalidInputTest(){ ByteArrayInputStream testIn = new ByteArrayInputStream(invalidInput.getBytes()); System.setIn(testIn); - IllegalArgumentException illegalArgumentException = assertThrows(IllegalArgumentException.class, application::start); + application.start(); + + assertTrue(testOut.toString().contains("잘못된 입력입니다. 애플리케이션을 종료합니다.")); + assertTrue(testOut.toString().contains("안녕히 가세요.")); - assertThat(illegalArgumentException.getMessage()).isEqualTo("잘못된 입력입니다. 애플리케이션을 종료합니다."); } @Test @@ -59,9 +61,9 @@ void userInvalidInputTest2(){ ByteArrayInputStream testIn = new ByteArrayInputStream(invalidInput.getBytes()); System.setIn(testIn); - IllegalArgumentException illegalArgumentException = assertThrows(IllegalArgumentException.class, application::start); - - assertThat(illegalArgumentException.getMessage()).isEqualTo("입력이 1과 2가 아닙니다. 애플리케이션을 종료합니다."); + application.start(); + assertTrue(testOut.toString().contains("입력이 1과 2가 아닙니다. 애플리케이션을 종료합니다.")); + assertTrue(testOut.toString().contains("안녕히 가세요.")); } @Test @@ -76,7 +78,7 @@ void normalFlowTest(){ assertTrue(testOut.toString().contains("3개의 숫자를 모두 맞히셨습니다! 게임 종료")); assertTrue(testOut.toString().contains("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.")); - assertTrue(testOut.toString().contains("안녕히 가세요")); + assertTrue(testOut.toString().contains("안녕히 가세요.")); } } \ No newline at end of file From b03e1c27b5073e8c9fe05634e3f4a8c54391ff04 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 11:39:14 +0900 Subject: [PATCH 27/28] =?UTF-8?q?Chore=20"build.gradle=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B3=80=EA=B2=BD"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build.gradle 기본 상태로 원복 --- build.gradle | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 54e9815f..96126bd0 100644 --- a/build.gradle +++ b/build.gradle @@ -22,8 +22,4 @@ dependencies { test { useJUnitPlatform() -} - -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} +} \ No newline at end of file From 10b11e4bc8f54de66940236f96ccb06110cd8ac5 Mon Sep 17 00:00:00 2001 From: JJY Date: Mon, 6 May 2024 11:59:08 +0900 Subject: [PATCH 28/28] =?UTF-8?q?Chore=20"build.gradle=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B3=80=EA=B2=BD"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UTF-8 관련 설정 추가 --- build.gradle | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 96126bd0..5c00edef 100644 --- a/build.gradle +++ b/build.gradle @@ -22,4 +22,11 @@ dependencies { test { useJUnitPlatform() -} \ No newline at end of file +} + +/* +아래 설정을 추가해 주지 않으면 제 pc에서는 실행이 되지 않아서 추가했습니다. + */ +tasks.withType(JavaCompile){ + options.encoding = "UTF-8" +}