From 36a8d5a5c950dcb61ba4432977123bbfe3c642fb Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Wed, 26 Jul 2023 15:23:25 +0900 Subject: [PATCH 01/19] =?UTF-8?q?docs(README):=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29..8c9432b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,53 @@ +# 요구사항 명세서 +## [카테고리] +1. 사용자 +2. 다리 생성기 +3. 이동 검사 +4. 시스템 + +## [카테고리 별 요구사항 내용] +### 1. 사용자 +- 다리의 길이를 입력한다. +- 이동할 칸을 입력한다. +- 게임 재시작 여부를 입력한다. + + +### 2. 다리 생성기 +- 입력한 길이의 다리를 생성한다. +- 다리는 각 칸은 위, 아래 두 칸으로 둘 중 하나의 칸만 건널 수 있도록 해야한다. + + +### 3. 이동 검사 +- 사용자가 이동할 칸을 검사한다. + + +### 4. 시스템 +- 게임을 시작한다. +- 게임 재시작 여부를 체크한다. +- 최종 게임 결과를 출력하고 게임을 종료한다. + + +# 기능 목록 +### 1. 입력 기능 +- 사용자가 입력하는 다리의 길이를 입력 받는 기능 +- 사용자가 입력하는 이동할 칸을 입력 받는 기능 +- 사용자가 입력하는 게임 재시작 여부를 입력 받는 기능 + + +### 2. 출력 기능 +- 사용자가 선택한 칸 출력 기능 +- 최종 게임 결과 출력 기능 + + +### 3. 게임 로직 기능 +- 이동할 수 있는 칸인지 검사하는 기능 +- 게임 시작/ 재시작 기능 +- 시도한 횟수를 세는 기능 + + +### 4. 검증 기능 +- 입력 검증 + - 사용자가 입력한 다리의 길이가 3 이상 20 이하 정수인지 검증 + - 사용자가 입력한 다리의 길이가 숫자 1개인지 검증 + - 사용자가 입력한 이동할 칸이 U와 D 중 하나의 문자인지 검증 + - 사용자가 입력한 재시작 코드가 R와 Q 중 하나의 문자인지 검증 \ No newline at end of file From dba3bf3641d9497748e80c8308a708ad97c12fd1 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Wed, 26 Jul 2023 16:24:37 +0900 Subject: [PATCH 02/19] =?UTF-8?q?chore:=20=EA=B3=84=EC=B8=B5=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/bridge/{ => controller}/BridgeGame.java | 2 +- src/main/java/bridge/{ => model/bridge}/BridgeMaker.java | 2 +- .../java/bridge/{ => model/bridge}/BridgeNumberGenerator.java | 2 +- .../bridge/{ => model/bridge}/BridgeRandomNumberGenerator.java | 2 +- src/main/java/bridge/{ => view}/InputView.java | 2 +- src/main/java/bridge/{ => view}/OutputView.java | 2 +- src/test/java/bridge/ApplicationTest.java | 2 ++ 8 files changed, 9 insertions(+), 7 deletions(-) rename src/main/java/bridge/{ => controller}/BridgeGame.java (95%) rename src/main/java/bridge/{ => model/bridge}/BridgeMaker.java (95%) rename src/main/java/bridge/{ => model/bridge}/BridgeNumberGenerator.java (74%) rename src/main/java/bridge/{ => model/bridge}/BridgeRandomNumberGenerator.java (92%) rename src/main/java/bridge/{ => view}/InputView.java (96%) rename src/main/java/bridge/{ => view}/OutputView.java (96%) diff --git a/README.md b/README.md index 8ab62a9..a8eb9d8 100644 --- a/README.md +++ b/README.md @@ -266,7 +266,7 @@ public class BridgeMaker { ### BridgeRandomNumberGenerator 클래스 -- Random 값 추출은 제공된 `bridge.BridgeRandomNumberGenerator`의 `generate()`를 활용한다. +- Random 값 추출은 제공된 `BridgeRandomNumberGenerator`의 `generate()`를 활용한다. - `BridgeRandomNumberGenerator`, `BridgeNumberGenerator` 클래스의 코드는 변경할 수 없다. #### 사용 예시 diff --git a/src/main/java/bridge/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java similarity index 95% rename from src/main/java/bridge/BridgeGame.java rename to src/main/java/bridge/controller/BridgeGame.java index 834c1c8..33ba29e 100644 --- a/src/main/java/bridge/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.controller; /** * 다리 건너기 게임을 관리하는 클래스 diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/model/bridge/BridgeMaker.java similarity index 95% rename from src/main/java/bridge/BridgeMaker.java rename to src/main/java/bridge/model/bridge/BridgeMaker.java index 27e9f2c..9ee339e 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/model/bridge/BridgeMaker.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.model.bridge; import java.util.List; diff --git a/src/main/java/bridge/BridgeNumberGenerator.java b/src/main/java/bridge/model/bridge/BridgeNumberGenerator.java similarity index 74% rename from src/main/java/bridge/BridgeNumberGenerator.java rename to src/main/java/bridge/model/bridge/BridgeNumberGenerator.java index 56187b7..693f135 100644 --- a/src/main/java/bridge/BridgeNumberGenerator.java +++ b/src/main/java/bridge/model/bridge/BridgeNumberGenerator.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.model.bridge; @FunctionalInterface public interface BridgeNumberGenerator { diff --git a/src/main/java/bridge/BridgeRandomNumberGenerator.java b/src/main/java/bridge/model/bridge/BridgeRandomNumberGenerator.java similarity index 92% rename from src/main/java/bridge/BridgeRandomNumberGenerator.java rename to src/main/java/bridge/model/bridge/BridgeRandomNumberGenerator.java index 4c9cb53..da4a925 100644 --- a/src/main/java/bridge/BridgeRandomNumberGenerator.java +++ b/src/main/java/bridge/model/bridge/BridgeRandomNumberGenerator.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.model.bridge; import camp.nextstep.edu.missionutils.Randoms; diff --git a/src/main/java/bridge/InputView.java b/src/main/java/bridge/view/InputView.java similarity index 96% rename from src/main/java/bridge/InputView.java rename to src/main/java/bridge/view/InputView.java index c3911c8..4571893 100644 --- a/src/main/java/bridge/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.view; /** * 사용자로부터 입력을 받는 역할을 한다. diff --git a/src/main/java/bridge/OutputView.java b/src/main/java/bridge/view/OutputView.java similarity index 96% rename from src/main/java/bridge/OutputView.java rename to src/main/java/bridge/view/OutputView.java index 69a433a..4d8cf04 100644 --- a/src/main/java/bridge/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.view; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. diff --git a/src/test/java/bridge/ApplicationTest.java b/src/test/java/bridge/ApplicationTest.java index 1a163ec..ee6718a 100644 --- a/src/test/java/bridge/ApplicationTest.java +++ b/src/test/java/bridge/ApplicationTest.java @@ -5,6 +5,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.util.Lists.newArrayList; +import bridge.model.bridge.BridgeMaker; +import bridge.model.bridge.BridgeNumberGenerator; import camp.nextstep.edu.missionutils.test.NsTest; import java.util.List; import org.junit.jupiter.api.Test; From d478529b6caad65a3bcc0fbd6b8f0a9bb39d6f60 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Wed, 26 Jul 2023 16:59:19 +0900 Subject: [PATCH 03/19] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20=EC=97=94?= =?UTF-8?q?=ED=84=B0=ED=8B=B0=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 초기 엔터티를 구축, 테스트한다. --- .../java/bridge/model/bridge/BridgeMaker.java | 7 ++++- src/main/java/bridge/model/bridge/Direct.java | 21 +++++++++++++++ src/test/java/bridge/ApplicationTest.java | 13 ++++----- .../bridge/model/bridge/BridgeMakerTest.java | 27 +++++++++++++++++++ 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 src/main/java/bridge/model/bridge/Direct.java create mode 100644 src/test/java/bridge/model/bridge/BridgeMakerTest.java diff --git a/src/main/java/bridge/model/bridge/BridgeMaker.java b/src/main/java/bridge/model/bridge/BridgeMaker.java index 9ee339e..2b4eb51 100644 --- a/src/main/java/bridge/model/bridge/BridgeMaker.java +++ b/src/main/java/bridge/model/bridge/BridgeMaker.java @@ -1,6 +1,8 @@ package bridge.model.bridge; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * 다리의 길이를 입력 받아서 다리를 생성해주는 역할을 한다. @@ -18,6 +20,9 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ public List makeBridge(int size) { - return null; + return IntStream.range(0, size) + .mapToObj(i -> Direct.getDirectBy(bridgeNumberGenerator.generate())) + .map(String::valueOf) + .collect(Collectors.toList()); } } diff --git a/src/main/java/bridge/model/bridge/Direct.java b/src/main/java/bridge/model/bridge/Direct.java new file mode 100644 index 0000000..a96bc4c --- /dev/null +++ b/src/main/java/bridge/model/bridge/Direct.java @@ -0,0 +1,21 @@ +package bridge.model.bridge; + +import java.util.Arrays; + +public enum Direct { + U(1), + D(0); + + public final int directNumber; + + Direct(int directNumber) { + this.directNumber = directNumber; + } + + public static Direct getDirectBy(int directNumber) { + return Arrays.stream(values()) + .filter(Direct -> Direct.directNumber == directNumber) + .findFirst() + .orElseGet(() -> null); + } +} diff --git a/src/test/java/bridge/ApplicationTest.java b/src/test/java/bridge/ApplicationTest.java index ee6718a..bcca907 100644 --- a/src/test/java/bridge/ApplicationTest.java +++ b/src/test/java/bridge/ApplicationTest.java @@ -1,16 +1,17 @@ package bridge; -import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; -import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.util.Lists.newArrayList; - import bridge.model.bridge.BridgeMaker; import bridge.model.bridge.BridgeNumberGenerator; import camp.nextstep.edu.missionutils.test.NsTest; -import java.util.List; import org.junit.jupiter.api.Test; +import java.util.List; + +import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; +import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.util.Lists.newArrayList; + class ApplicationTest extends NsTest { private static final String ERROR_MESSAGE = "[ERROR]"; diff --git a/src/test/java/bridge/model/bridge/BridgeMakerTest.java b/src/test/java/bridge/model/bridge/BridgeMakerTest.java new file mode 100644 index 0000000..1181dd1 --- /dev/null +++ b/src/test/java/bridge/model/bridge/BridgeMakerTest.java @@ -0,0 +1,27 @@ +package bridge.model.bridge; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class BridgeMakerTest { + @Test + @DisplayName("다리 길이를 입력받아 다리를 생성한다.") + void makeBridge() { + // given + BridgeNumberGenerator bridgeNumberGenerator = new BridgeRandomNumberGenerator(); + BridgeMaker bridgeMaker = new BridgeMaker(bridgeNumberGenerator); + int size = 3; + + // when + List bridge = bridgeMaker.makeBridge(size); + + // then + assertThat(bridge.size()).isEqualTo(size); + } +} \ No newline at end of file From 5b8b0893fa8454eda6c5329a9a3248b0e1a77224 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 27 Jul 2023 14:16:19 +0900 Subject: [PATCH 04/19] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *InputView: 기능 구현 --- src/main/java/bridge/view/OutputView.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 4d8cf04..78df643 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -4,6 +4,9 @@ * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ public class OutputView { + public static void printGameStartMessage() { + System.out.println("다리 건너기 게임을 시작합니다."); + } /** * 현재까지 이동한 다리의 상태를 정해진 형식에 맞춰 출력한다. From 46f75a44e996c6a87c83c6c7d4fac65f4df8b77f Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 27 Jul 2023 14:26:29 +0900 Subject: [PATCH 05/19] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EB=8B=A4=EB=A6=AC=20=EA=B8=B8=EC=9D=B4=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *InputView: 기능 구현 --- src/main/java/bridge/view/InputView.java | 28 +++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 4571893..20130c6 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,15 +1,41 @@ package bridge.view; +import camp.nextstep.edu.missionutils.Console; + /** * 사용자로부터 입력을 받는 역할을 한다. */ public class InputView { + private static void printInputLengthMessage() { + System.out.println("다리의 길이를 입력해주세요."); + } /** * 다리의 길이를 입력받는다. */ public int readBridgeSize() { - return 0; + printInputLengthMessage(); + + String length = Console.readLine(); + + validateHasWhiteSpace(length); + validateIsNumeric(length); + + return Integer.parseInt(length); + } + + private void validateHasWhiteSpace(String input) { + if (input.chars().anyMatch(Character::isWhitespace)) { + throw new IllegalArgumentException("공백을 입력할 수 없습니다."); + } + } + + private void validateIsNumeric(String input) { + try { + Integer.valueOf(input); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("정수만 입력 가능합니다."); + } } /** From 70863b9f682370d05bb9bd25cd8311df5faa5eaf Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 27 Jul 2023 14:32:23 +0900 Subject: [PATCH 06/19] =?UTF-8?q?refactor:=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC=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/bridge/view/InputView.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 20130c6..501cb70 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -25,11 +25,15 @@ public int readBridgeSize() { } private void validateHasWhiteSpace(String input) { - if (input.chars().anyMatch(Character::isWhitespace)) { + if (hasWhiteSpace(input)) { throw new IllegalArgumentException("공백을 입력할 수 없습니다."); } } + private static boolean hasWhiteSpace(String input) { + return input.chars().anyMatch(Character::isWhitespace); + } + private void validateIsNumeric(String input) { try { Integer.valueOf(input); From 9cc1aff706f7a5240d8541c8f0827fd86b0bcf3e Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 27 Jul 2023 14:34:20 +0900 Subject: [PATCH 07/19] =?UTF-8?q?docs:=20=EA=B2=8C=EC=9E=84=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=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 --- docs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/README.md b/docs/README.md index 8c9432b..2880a53 100644 --- a/docs/README.md +++ b/docs/README.md @@ -40,6 +40,7 @@ ### 3. 게임 로직 기능 +- 입력 받은 길이의 다리 생성 기능 - 이동할 수 있는 칸인지 검사하는 기능 - 게임 시작/ 재시작 기능 - 시도한 횟수를 세는 기능 From fdb398f7f2a5696c9e648e5723fd86e7345da474 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 27 Jul 2023 14:48:37 +0900 Subject: [PATCH 08/19] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EA=B8=B8=EC=9D=B4=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EB=8A=94=20=EB=8B=A4=EB=A6=AC=20=EC=83=9D=EC=84=B1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/service/BridgeService.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/bridge/service/BridgeService.java diff --git a/src/main/java/bridge/service/BridgeService.java b/src/main/java/bridge/service/BridgeService.java new file mode 100644 index 0000000..64c400a --- /dev/null +++ b/src/main/java/bridge/service/BridgeService.java @@ -0,0 +1,13 @@ +package bridge.service; + +import bridge.model.bridge.BridgeMaker; +import bridge.view.InputView; + +import java.util.List; + +public class BridgeService { + public List createBridge(BridgeMaker bridgeMaker) { + int bridgeSize = InputView.readBridgeSize(); + return bridgeMaker.makeBridge(bridgeSize); + } +} From 08026d06e35487f1dc58099d1a1905cfffa7ff40 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 27 Jul 2023 14:49:10 +0900 Subject: [PATCH 09/19] =?UTF-8?q?feat:=20=EC=9D=B4=EB=8F=99=ED=95=A0=20?= =?UTF-8?q?=EC=B9=B8=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/view/InputView.java | 43 ++++++++++++++---------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 501cb70..44b0e6c 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -9,11 +9,15 @@ public class InputView { private static void printInputLengthMessage() { System.out.println("다리의 길이를 입력해주세요."); } + + private static void printInputDirectMessage() { + System.out.println("이동할 칸을 선택해주세요. (위: U, 아래: D)"); + } /** * 다리의 길이를 입력받는다. */ - public int readBridgeSize() { + public static int readBridgeSize() { printInputLengthMessage(); String length = Console.readLine(); @@ -24,7 +28,26 @@ public int readBridgeSize() { return Integer.parseInt(length); } - private void validateHasWhiteSpace(String input) { + /** + * 사용자가 이동할 칸을 입력받는다. + */ + public String readMoving() { + printInputDirectMessage(); + + String direct = Console.readLine(); + validateHasWhiteSpace(direct); + + return direct; + } + + /** + * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. + */ + public String readGameCommand() { + return null; + } + + private static void validateHasWhiteSpace(String input) { if (hasWhiteSpace(input)) { throw new IllegalArgumentException("공백을 입력할 수 없습니다."); } @@ -34,25 +57,11 @@ private static boolean hasWhiteSpace(String input) { return input.chars().anyMatch(Character::isWhitespace); } - private void validateIsNumeric(String input) { + private static void validateIsNumeric(String input) { try { Integer.valueOf(input); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("정수만 입력 가능합니다."); } } - - /** - * 사용자가 이동할 칸을 입력받는다. - */ - public String readMoving() { - return null; - } - - /** - * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. - */ - public String readGameCommand() { - return null; - } } From c69cd097350156f324d1365e8dc2ac9df462004e Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Fri, 28 Jul 2023 15:05:02 +0900 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20=EC=9D=B4=EB=8F=99=ED=95=A0=20?= =?UTF-8?q?=EC=B9=B8=20=EA=B2=80=EC=82=AC=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *feat: BridgeService 이동 검사 기능 및 테스트 구현 *feat: MoveResult 검사 결과 저장 기능 구현 *feat: UserSquare 사용자 입력 기능 구현 *feat: BridgeGame, InputView, OutputView 컨트롤러 관련 기능 구현 --- src/main/java/bridge/Application.java | 3 + .../java/bridge/controller/BridgeGame.java | 44 ++++++++++- .../java/bridge/model/result/Compare.java | 21 ++++++ .../java/bridge/model/result/MoveResult.java | 22 ++++++ .../java/bridge/model/user/UserSquare.java | 15 ++++ .../java/bridge/service/BridgeService.java | 14 +++- src/main/java/bridge/view/InputView.java | 2 +- src/main/java/bridge/view/OutputView.java | 2 +- .../bridge/model/bridge/BridgeMakerTest.java | 2 - .../bridge/service/BridgeServiceTest.java | 74 +++++++++++++++++++ 10 files changed, 193 insertions(+), 6 deletions(-) create mode 100644 src/main/java/bridge/model/result/Compare.java create mode 100644 src/main/java/bridge/model/result/MoveResult.java create mode 100644 src/main/java/bridge/model/user/UserSquare.java create mode 100644 src/test/java/bridge/service/BridgeServiceTest.java diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 5cb72df..8452337 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,8 +1,11 @@ package bridge; +import bridge.controller.BridgeGame; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + new BridgeGame().run(); } } diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index 33ba29e..4f8e195 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -1,16 +1,58 @@ package bridge.controller; +import bridge.model.bridge.BridgeMaker; +import bridge.model.bridge.BridgeRandomNumberGenerator; +import bridge.model.result.Compare; +import bridge.model.result.MoveResult; +import bridge.model.user.UserSquare; +import bridge.service.BridgeService; + +import java.util.List; + /** * 다리 건너기 게임을 관리하는 클래스 */ public class BridgeGame { + private static BridgeService bridgeService; + private static BridgeMaker bridgeMaker; + + private Compare compare; + + public BridgeGame() { + this.bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); + } + + public void run() { + List bridge = createBridge(); + playGame(bridge); + } + + private List createBridge() { + return BridgeService.createBridge(bridgeMaker); + } + + private void playGame(List bridge) { + MoveResult.initResultHolder(); + List moveResult = MoveResult.getMoveResult(); + // while + for (String bridgeSquare : bridge) { + move(bridgeSquare, moveResult); + + if(compare == Compare.DIFF) break; + } + } /** * 사용자가 칸을 이동할 때 사용하는 메서드 *

* 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void move() { + public void move(String bridgeSquare, List moveResult) { + UserSquare userSquare = new UserSquare(); + boolean eachResult = BridgeService.checkMove(userSquare.getSquare(), bridgeSquare); + + compare = Compare.getCompareBy(eachResult); + BridgeService.move(moveResult, eachResult); } /** diff --git a/src/main/java/bridge/model/result/Compare.java b/src/main/java/bridge/model/result/Compare.java new file mode 100644 index 0000000..a70e768 --- /dev/null +++ b/src/main/java/bridge/model/result/Compare.java @@ -0,0 +1,21 @@ +package bridge.model.result; + +import java.util.Arrays; + +public enum Compare { + SAME(true), + DIFF(false); + + private final boolean isSame; + + Compare(boolean isSame) { + this.isSame = isSame; + } + + public static Compare getCompareBy(boolean EachResult) { + return Arrays.stream(values()) + .filter(Compare -> Compare.isSame == EachResult) + .findFirst() + .orElseGet(() -> null); + } +} diff --git a/src/main/java/bridge/model/result/MoveResult.java b/src/main/java/bridge/model/result/MoveResult.java new file mode 100644 index 0000000..da074d7 --- /dev/null +++ b/src/main/java/bridge/model/result/MoveResult.java @@ -0,0 +1,22 @@ +package bridge.model.result; + +import java.util.ArrayList; +import java.util.List; + +public class MoveResult { + + private static List moveResult; + private MoveResult() { + } + + public static void initResultHolder() { + moveResult = null; + } + + public static List getMoveResult() { + if (moveResult == null) { + moveResult = new ArrayList<>(); + } + return moveResult; + } +} diff --git a/src/main/java/bridge/model/user/UserSquare.java b/src/main/java/bridge/model/user/UserSquare.java new file mode 100644 index 0000000..246f8c5 --- /dev/null +++ b/src/main/java/bridge/model/user/UserSquare.java @@ -0,0 +1,15 @@ +package bridge.model.user; + +import bridge.view.InputView; + +public class UserSquare { + private String square; + + public UserSquare() { + this.square = InputView.readMoving(); + } + + public String getSquare() { + return square; + } +} diff --git a/src/main/java/bridge/service/BridgeService.java b/src/main/java/bridge/service/BridgeService.java index 64c400a..4aa6c27 100644 --- a/src/main/java/bridge/service/BridgeService.java +++ b/src/main/java/bridge/service/BridgeService.java @@ -2,12 +2,24 @@ import bridge.model.bridge.BridgeMaker; import bridge.view.InputView; +import bridge.view.OutputView; import java.util.List; public class BridgeService { - public List createBridge(BridgeMaker bridgeMaker) { + public static List createBridge(BridgeMaker bridgeMaker) { + OutputView.printGameStartMessage(); int bridgeSize = InputView.readBridgeSize(); return bridgeMaker.makeBridge(bridgeSize); } + + public static void move(List resultHolder, boolean eachResult) { + resultHolder.add(eachResult); + + // eachResult 주면서 outpur view 호출 + } + + public static boolean checkMove(String bridgeSquare, String userSquare) { + return userSquare.equals(bridgeSquare); + } } diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 44b0e6c..92ea642 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -31,7 +31,7 @@ public static int readBridgeSize() { /** * 사용자가 이동할 칸을 입력받는다. */ - public String readMoving() { + public static String readMoving() { printInputDirectMessage(); String direct = Console.readLine(); diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 78df643..dc3763d 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -5,7 +5,7 @@ */ public class OutputView { public static void printGameStartMessage() { - System.out.println("다리 건너기 게임을 시작합니다."); + System.out.println("다리 건너기 게임을 시작합니다.\n"); } /** diff --git a/src/test/java/bridge/model/bridge/BridgeMakerTest.java b/src/test/java/bridge/model/bridge/BridgeMakerTest.java index 1181dd1..b444c08 100644 --- a/src/test/java/bridge/model/bridge/BridgeMakerTest.java +++ b/src/test/java/bridge/model/bridge/BridgeMakerTest.java @@ -1,13 +1,11 @@ package bridge.model.bridge; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; class BridgeMakerTest { @Test diff --git a/src/test/java/bridge/service/BridgeServiceTest.java b/src/test/java/bridge/service/BridgeServiceTest.java new file mode 100644 index 0000000..d566cc3 --- /dev/null +++ b/src/test/java/bridge/service/BridgeServiceTest.java @@ -0,0 +1,74 @@ +package bridge.service; + +import bridge.model.result.MoveResult; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class BridgeServiceTest { + @BeforeEach + void beforeEach() { + MoveResult.initResultHolder(); + } + + @Test + @DisplayName("모두 정답이면 끝까지 이동할 수 있다.") + void moveEnd() { + // given + List caseA = List.of("U", "U", "U"); + List bridge = List.of("U", "U", "U"); + + // when + List moveResult = MoveResult.getMoveResult(); + moveProcess(moveResult, caseA, bridge); + + // then + assertThat(moveResult.size()).isEqualTo(3); + } + + @Test + @DisplayName("중간에 틀리면 중간까지 이동할 수 있다.") + void moveMiddle() { + // given + List caseA = List.of("U", "U", "U"); + List bridge = List.of("U", "D", "U"); + + // when + List moveResult = MoveResult.getMoveResult(); + moveProcess(moveResult, caseA, bridge); + + // then + assertThat(moveResult.size()).isEqualTo(2); + } + + @Test + @DisplayName("처음부터 틀리면 이동할 수 없다.") + void notMove() { + // given + List caseA = List.of("U", "U", "U"); + List bridge = List.of("D", "U", "U"); + + // when + List moveResult = MoveResult.getMoveResult(); + moveProcess(moveResult, caseA, bridge); + + // then + assertThat(moveResult.size()).isEqualTo(1); + } + + // 어플리케이션 시나리오 + private static void moveProcess(List moveResult, List caseA, List bridge) { + for (int i = 0; i < bridge.size(); i++) { + boolean eachResult = BridgeService.checkMove(bridge.get(i), caseA.get(i)); + BridgeService.move(moveResult, eachResult); + + if (eachResult == false) { + break; + } + } + } +} \ No newline at end of file From 2cd6b2266043da759f3b1de18047e009bbdf29e7 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Fri, 28 Jul 2023 16:04:14 +0900 Subject: [PATCH 11/19] =?UTF-8?q?refactor:=20=EC=9D=B4=EB=8F=99=ED=95=A0?= =?UTF-8?q?=20=EC=B9=B8=20=EC=9E=85=EB=A0=A5=20=EA=B2=80=EC=A6=9D=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/bridge/model/user/UserSquare.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/model/user/UserSquare.java b/src/main/java/bridge/model/user/UserSquare.java index 246f8c5..7319a42 100644 --- a/src/main/java/bridge/model/user/UserSquare.java +++ b/src/main/java/bridge/model/user/UserSquare.java @@ -6,7 +6,20 @@ public class UserSquare { private String square; public UserSquare() { - this.square = InputView.readMoving(); + String moving = InputView.readMoving(); + validateCharacter(moving); + + this.square = moving; + } + + private static void validateCharacter(String moving) { + if (isInvalidCharacter(moving)) { + throw new IllegalArgumentException("윗 칸은 [U], 아래 칸은 [D]를 눌러주세요"); + } + } + + private static boolean isInvalidCharacter(String moving) { + return !moving.equals("U") && !moving.equals("D"); } public String getSquare() { From 10f36f221d2896d3c73bd796a21d1d827fd896c1 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 29 Jul 2023 17:23:35 +0900 Subject: [PATCH 12/19] =?UTF-8?q?refactor:=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=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/bridge/service/BridgeService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/bridge/service/BridgeService.java b/src/main/java/bridge/service/BridgeService.java index 4aa6c27..a9c281b 100644 --- a/src/main/java/bridge/service/BridgeService.java +++ b/src/main/java/bridge/service/BridgeService.java @@ -7,19 +7,19 @@ import java.util.List; public class BridgeService { - public static List createBridge(BridgeMaker bridgeMaker) { + public List createBridge(BridgeMaker bridgeMaker) { OutputView.printGameStartMessage(); int bridgeSize = InputView.readBridgeSize(); return bridgeMaker.makeBridge(bridgeSize); } - public static void move(List resultHolder, boolean eachResult) { + public void move(List resultHolder, boolean eachResult, List bridge) { resultHolder.add(eachResult); // eachResult 주면서 outpur view 호출 } - public static boolean checkMove(String bridgeSquare, String userSquare) { + public boolean checkMove(String bridgeSquare, String userSquare) { return userSquare.equals(bridgeSquare); } } From 60b6c1755767c45ccf475f615f9e243f5eada1a8 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 29 Jul 2023 17:32:55 +0900 Subject: [PATCH 13/19] =?UTF-8?q?feat:=20=EC=A4=91=EA=B0=84=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *feat: BridgeService 중간 결과 출력 기능 구현 *feat: OutputView 중간 결과 출력 기능 구현 *feat: BridgeGame 컨트롤러 관련 기능 구현 *refactor: CompareResult 클래스 이름을 결과와 관련되도록 변경 --- .../java/bridge/controller/BridgeGame.java | 45 +++++++++++----- .../{Compare.java => CompareResult.java} | 6 +-- .../java/bridge/service/BridgeService.java | 3 +- src/main/java/bridge/view/OutputView.java | 52 ++++++++++++++++++- 4 files changed, 85 insertions(+), 21 deletions(-) rename src/main/java/bridge/model/result/{Compare.java => CompareResult.java} (73%) diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index 4f8e195..1ed4a9f 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -1,8 +1,9 @@ package bridge.controller; +import bridge.model.RestartStatus; import bridge.model.bridge.BridgeMaker; import bridge.model.bridge.BridgeRandomNumberGenerator; -import bridge.model.result.Compare; +import bridge.model.result.CompareResult; import bridge.model.result.MoveResult; import bridge.model.user.UserSquare; import bridge.service.BridgeService; @@ -16,10 +17,14 @@ public class BridgeGame { private static BridgeService bridgeService; private static BridgeMaker bridgeMaker; - private Compare compare; + private CompareResult compare; + + private RestartStatus restartStatus; public BridgeGame() { this.bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); + restartStatus = RestartStatus.RESTART; + bridgeService = new BridgeService(); } public void run() { @@ -28,31 +33,39 @@ public void run() { } private List createBridge() { - return BridgeService.createBridge(bridgeMaker); + return bridgeService.createBridge(bridgeMaker); } private void playGame(List bridge) { + while (true) { + List moveResult = createResultHolder(); + for (String bridgeSquare : bridge) { + move(bridgeSquare, moveResult, bridge); + + if (isDifferent()) { + break; + } + } + } + } + + private static List createResultHolder() { MoveResult.initResultHolder(); List moveResult = MoveResult.getMoveResult(); - // while - for (String bridgeSquare : bridge) { - move(bridgeSquare, moveResult); - - if(compare == Compare.DIFF) break; - } + return moveResult; } - + /** * 사용자가 칸을 이동할 때 사용하는 메서드 *

* 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void move(String bridgeSquare, List moveResult) { + public void move(String bridgeSquare, List moveResult, List bridge) { UserSquare userSquare = new UserSquare(); - boolean eachResult = BridgeService.checkMove(userSquare.getSquare(), bridgeSquare); + boolean eachResult = bridgeService.checkMove(userSquare.getSquare(), bridgeSquare); - compare = Compare.getCompareBy(eachResult); - BridgeService.move(moveResult, eachResult); + compare = CompareResult.getCompareBy(eachResult); + bridgeService.move(moveResult, eachResult, bridge); } /** @@ -62,4 +75,8 @@ public void move(String bridgeSquare, List moveResult) { */ public void retry() { } + + private boolean isDifferent() { + return compare == CompareResult.DIFF; + } } diff --git a/src/main/java/bridge/model/result/Compare.java b/src/main/java/bridge/model/result/CompareResult.java similarity index 73% rename from src/main/java/bridge/model/result/Compare.java rename to src/main/java/bridge/model/result/CompareResult.java index a70e768..3e90de0 100644 --- a/src/main/java/bridge/model/result/Compare.java +++ b/src/main/java/bridge/model/result/CompareResult.java @@ -2,17 +2,17 @@ import java.util.Arrays; -public enum Compare { +public enum CompareResult { SAME(true), DIFF(false); private final boolean isSame; - Compare(boolean isSame) { + CompareResult(boolean isSame) { this.isSame = isSame; } - public static Compare getCompareBy(boolean EachResult) { + public static CompareResult getCompareBy(boolean EachResult) { return Arrays.stream(values()) .filter(Compare -> Compare.isSame == EachResult) .findFirst() diff --git a/src/main/java/bridge/service/BridgeService.java b/src/main/java/bridge/service/BridgeService.java index a9c281b..37fd0fe 100644 --- a/src/main/java/bridge/service/BridgeService.java +++ b/src/main/java/bridge/service/BridgeService.java @@ -15,8 +15,7 @@ public List createBridge(BridgeMaker bridgeMaker) { public void move(List resultHolder, boolean eachResult, List bridge) { resultHolder.add(eachResult); - - // eachResult 주면서 outpur view 호출 + OutputView.printMap(bridge, resultHolder); } public boolean checkMove(String bridgeSquare, String userSquare) { diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index dc3763d..54177de 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,5 +1,7 @@ package bridge.view; +import java.util.List; + /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ @@ -13,9 +15,55 @@ public static void printGameStartMessage() { *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void printMap() { + public static void printMap(List bridge, List moveResult) { + StringBuilder upSquares = new StringBuilder("["); + StringBuilder downSquares = new StringBuilder("["); + + for (int i = 0; i < moveResult.size(); i++) { + if (i > 0) { + upSquares.append("|"); + downSquares.append("|"); + } + + if (isSameUpDirect(bridge, moveResult, i)) { + upSquares.append(" O "); + downSquares.append(" "); + } + if (isDifferentUpDirect(bridge, moveResult, i)) { + upSquares.append(" "); + downSquares.append(" X "); + } + if (isSameDownDirect(bridge, moveResult, i)) { + upSquares.append(" "); + downSquares.append(" O "); + } + if (isDifferentDownDirect(bridge, moveResult, i)) { + upSquares.append(" X "); + downSquares.append(" "); + } + } + + upSquares.append("]\n"); + downSquares.append("]"); + System.out.println(upSquares.append(downSquares)); } - + + private static boolean isDifferentDownDirect(List bridge, List moveResult, int i) { + return bridge.get(i).equals("D") && moveResult.get(i) == false; + } + + private static boolean isDifferentUpDirect(List bridge, List moveResult, int i) { + return bridge.get(i).equals("U") && moveResult.get(i) == false; + } + + private static boolean isSameDownDirect(List bridge, List moveResult, int i) { + return bridge.get(i).equals("D") && moveResult.get(i) == true; + } + + private static boolean isSameUpDirect(List bridge, List moveResult, int i) { + return bridge.get(i).equals("U") && moveResult.get(i) == true; + } + /** * 게임의 최종 결과를 정해진 형식에 맞춰 출력한다. *

From 5a4292fba3d9e33a87296911edd31f8d7ddcdf11 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 29 Jul 2023 17:55:10 +0900 Subject: [PATCH 14/19] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *feat: BridgeService 재시작 신호 입력 기능 구현 *feat: RestartStatus 재시작 기능 및 테스트 구현 *feat: InputView 재시작 신호 입력 기능 구현 *feat: BridgeGame 컨트롤러 관련 기능 구현 --- .../java/bridge/controller/BridgeGame.java | 18 +++++++--- src/main/java/bridge/model/RestartStatus.java | 35 ++++++++++++++++++ .../java/bridge/service/BridgeService.java | 6 ++++ src/main/java/bridge/view/InputView.java | 13 +++++-- .../java/bridge/model/RestartStatusTest.java | 36 +++++++++++++++++++ .../bridge/service/BridgeServiceTest.java | 16 +++++---- 6 files changed, 111 insertions(+), 13 deletions(-) create mode 100644 src/main/java/bridge/model/RestartStatus.java create mode 100644 src/test/java/bridge/model/RestartStatusTest.java diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index 1ed4a9f..2a81bb4 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -7,6 +7,7 @@ import bridge.model.result.MoveResult; import bridge.model.user.UserSquare; import bridge.service.BridgeService; +import bridge.view.InputView; import java.util.List; @@ -37,16 +38,17 @@ private List createBridge() { } private void playGame(List bridge) { - while (true) { + do { List moveResult = createResultHolder(); for (String bridgeSquare : bridge) { move(bridgeSquare, moveResult, bridge); - + if (isDifferent()) { break; } } - } + + } while (!isQuit()); } private static List createResultHolder() { @@ -66,6 +68,7 @@ public void move(String bridgeSquare, List moveResult, List bri compare = CompareResult.getCompareBy(eachResult); bridgeService.move(moveResult, eachResult, bridge); + retry(eachResult); } /** @@ -73,10 +76,17 @@ public void move(String bridgeSquare, List moveResult, List bri *

* 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void retry() { + public void retry(boolean eachResult) { + if (eachResult == false) { + restartStatus = bridgeService.retry(); + } } private boolean isDifferent() { return compare == CompareResult.DIFF; } + + private boolean isQuit() { + return restartStatus == RestartStatus.QUIT; + } } diff --git a/src/main/java/bridge/model/RestartStatus.java b/src/main/java/bridge/model/RestartStatus.java new file mode 100644 index 0000000..2440abc --- /dev/null +++ b/src/main/java/bridge/model/RestartStatus.java @@ -0,0 +1,35 @@ +package bridge.model; + +import bridge.view.InputView; + +import java.util.Arrays; + +public enum RestartStatus { + RESTART("R"), + QUIT("Q"); + + public final String signal; + + RestartStatus(String signal) { + this.signal = signal; + } + + public static RestartStatus getRestartStatusBy(String signal) { + validateCharacter(signal); + + return Arrays.stream(values()) + .filter(RestartStatus -> RestartStatus.signal.equals(signal)) + .findFirst() + .orElseGet(() -> null); + } + + private static void validateCharacter(String signal) { + if (isInvalidCharacter(signal)) { + throw new IllegalArgumentException("재시작 [R], 종료 [Q]를 눌러주세요"); + } + } + + private static boolean isInvalidCharacter(String signal) { + return !signal.equals("R") && !signal.equals("Q"); + } +} diff --git a/src/main/java/bridge/service/BridgeService.java b/src/main/java/bridge/service/BridgeService.java index 37fd0fe..3e80aaf 100644 --- a/src/main/java/bridge/service/BridgeService.java +++ b/src/main/java/bridge/service/BridgeService.java @@ -1,5 +1,6 @@ package bridge.service; +import bridge.model.RestartStatus; import bridge.model.bridge.BridgeMaker; import bridge.view.InputView; import bridge.view.OutputView; @@ -21,4 +22,9 @@ public void move(List resultHolder, boolean eachResult, List br public boolean checkMove(String bridgeSquare, String userSquare) { return userSquare.equals(bridgeSquare); } + + public RestartStatus retry() { + String signal = InputView.readGameCommand(); + return RestartStatus.getRestartStatusBy(signal); + } } diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 92ea642..ef912d6 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -13,6 +13,10 @@ private static void printInputLengthMessage() { private static void printInputDirectMessage() { System.out.println("이동할 칸을 선택해주세요. (위: U, 아래: D)"); } + + private static void printInputRestartStatusMessage() { + System.out.println("게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"); + } /** * 다리의 길이를 입력받는다. @@ -43,8 +47,13 @@ public static String readMoving() { /** * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. */ - public String readGameCommand() { - return null; + public static String readGameCommand() { + printInputRestartStatusMessage(); + + String command = Console.readLine(); + validateHasWhiteSpace(command); + + return command; } private static void validateHasWhiteSpace(String input) { diff --git a/src/test/java/bridge/model/RestartStatusTest.java b/src/test/java/bridge/model/RestartStatusTest.java new file mode 100644 index 0000000..e9b864c --- /dev/null +++ b/src/test/java/bridge/model/RestartStatusTest.java @@ -0,0 +1,36 @@ +package bridge.model; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class RestartStatusTest { + @Test + @DisplayName("게임을 재시작한다.") + void restart() { + // given + String signal = "R"; + + // when + RestartStatus restartStatus = RestartStatus.getRestartStatusBy(signal); + + // then + assertThat(RestartStatus.RESTART).isEqualTo(restartStatus); + } + + @Test + @DisplayName("게임을 종료한다.") + void quit() { + // given + String signal = "Q"; + + // when + RestartStatus restartStatus = RestartStatus.getRestartStatusBy(signal); + + // then + assertThat(RestartStatus.QUIT).isEqualTo(restartStatus); + } +} \ No newline at end of file diff --git a/src/test/java/bridge/service/BridgeServiceTest.java b/src/test/java/bridge/service/BridgeServiceTest.java index d566cc3..d25fabd 100644 --- a/src/test/java/bridge/service/BridgeServiceTest.java +++ b/src/test/java/bridge/service/BridgeServiceTest.java @@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test; import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; class BridgeServiceTest { @@ -21,10 +20,11 @@ void moveEnd() { // given List caseA = List.of("U", "U", "U"); List bridge = List.of("U", "U", "U"); + BridgeService bridgeService = new BridgeService(); // when List moveResult = MoveResult.getMoveResult(); - moveProcess(moveResult, caseA, bridge); + moveProcess(bridgeService, moveResult, caseA, bridge); // then assertThat(moveResult.size()).isEqualTo(3); @@ -36,10 +36,11 @@ void moveMiddle() { // given List caseA = List.of("U", "U", "U"); List bridge = List.of("U", "D", "U"); + BridgeService bridgeService = new BridgeService(); // when List moveResult = MoveResult.getMoveResult(); - moveProcess(moveResult, caseA, bridge); + moveProcess(bridgeService, moveResult, caseA, bridge); // then assertThat(moveResult.size()).isEqualTo(2); @@ -51,20 +52,21 @@ void notMove() { // given List caseA = List.of("U", "U", "U"); List bridge = List.of("D", "U", "U"); + BridgeService bridgeService = new BridgeService(); // when List moveResult = MoveResult.getMoveResult(); - moveProcess(moveResult, caseA, bridge); + moveProcess(bridgeService, moveResult, caseA, bridge); // then assertThat(moveResult.size()).isEqualTo(1); } // 어플리케이션 시나리오 - private static void moveProcess(List moveResult, List caseA, List bridge) { + private static void moveProcess(BridgeService bridgeService, List moveResult, List caseA, List bridge) { for (int i = 0; i < bridge.size(); i++) { - boolean eachResult = BridgeService.checkMove(bridge.get(i), caseA.get(i)); - BridgeService.move(moveResult, eachResult); + boolean eachResult = bridgeService.checkMove(bridge.get(i), caseA.get(i)); + bridgeService.move(moveResult, eachResult, bridge); if (eachResult == false) { break; From 8f122733ae0b34d2dfe76d2794af03c040a95779 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sun, 30 Jul 2023 11:17:35 +0900 Subject: [PATCH 15/19] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A2=85=EB=A3=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *feat: BridgeService 종료 기능 구현 *feat: FinalResult 종료 기능 구현 *feat: RestartStatus 종료 기능 및 테스트 구현 *feat: OutputView 최종 결과 출력 기능 구현 --- .../java/bridge/controller/BridgeGame.java | 45 +++++++++++++++---- src/main/java/bridge/model/RestartStatus.java | 2 - .../java/bridge/model/result/FinalResult.java | 6 +++ .../java/bridge/service/BridgeService.java | 21 +++++---- src/main/java/bridge/view/OutputView.java | 44 +++++++++++++----- .../java/bridge/model/RestartStatusTest.java | 2 - .../bridge/service/BridgeServiceTest.java | 1 + 7 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 src/main/java/bridge/model/result/FinalResult.java diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index 2a81bb4..6e883b5 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -4,10 +4,10 @@ import bridge.model.bridge.BridgeMaker; import bridge.model.bridge.BridgeRandomNumberGenerator; import bridge.model.result.CompareResult; +import bridge.model.result.FinalResult; import bridge.model.result.MoveResult; import bridge.model.user.UserSquare; import bridge.service.BridgeService; -import bridge.view.InputView; import java.util.List; @@ -16,21 +16,27 @@ */ public class BridgeGame { private static BridgeService bridgeService; + private static BridgeMaker bridgeMaker; - private CompareResult compare; + private static int count; + + private static CompareResult compare; - private RestartStatus restartStatus; + private static RestartStatus restartStatus; + + private static FinalResult finalResult; public BridgeGame() { - this.bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); - restartStatus = RestartStatus.RESTART; + bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); bridgeService = new BridgeService(); + count = 0; } public void run() { List bridge = createBridge(); playGame(bridge); + endGame(); } private List createBridge() { @@ -40,6 +46,7 @@ private List createBridge() { private void playGame(List bridge) { do { List moveResult = createResultHolder(); + count += 1; for (String bridgeSquare : bridge) { move(bridgeSquare, moveResult, bridge); @@ -47,14 +54,17 @@ private void playGame(List bridge) { break; } } - + gameOver(); } while (!isQuit()); } + private void endGame() { + bridgeService.end(count, finalResult); + } + private static List createResultHolder() { MoveResult.initResultHolder(); - List moveResult = MoveResult.getMoveResult(); - return moveResult; + return MoveResult.getMoveResult(); } /** @@ -70,6 +80,17 @@ public void move(String bridgeSquare, List moveResult, List bri bridgeService.move(moveResult, eachResult, bridge); retry(eachResult); } + + private static void gameOver() { + if (isSuccess()) { + restartStatus = RestartStatus.QUIT; + finalResult = FinalResult.SUCCESS; + } + + if (isFail()) { + finalResult = FinalResult.FAIL; + } + } /** * 사용자가 게임을 다시 시도할 때 사용하는 메서드 @@ -89,4 +110,12 @@ private boolean isDifferent() { private boolean isQuit() { return restartStatus == RestartStatus.QUIT; } + + private static boolean isSuccess() { + return compare == CompareResult.SAME; + } + + private static boolean isFail() { + return compare == CompareResult.DIFF && restartStatus == RestartStatus.QUIT; + } } diff --git a/src/main/java/bridge/model/RestartStatus.java b/src/main/java/bridge/model/RestartStatus.java index 2440abc..a7c478e 100644 --- a/src/main/java/bridge/model/RestartStatus.java +++ b/src/main/java/bridge/model/RestartStatus.java @@ -1,7 +1,5 @@ package bridge.model; -import bridge.view.InputView; - import java.util.Arrays; public enum RestartStatus { diff --git a/src/main/java/bridge/model/result/FinalResult.java b/src/main/java/bridge/model/result/FinalResult.java new file mode 100644 index 0000000..b40511b --- /dev/null +++ b/src/main/java/bridge/model/result/FinalResult.java @@ -0,0 +1,6 @@ +package bridge.model.result; + +public enum FinalResult { + SUCCESS, + FAIL; +} diff --git a/src/main/java/bridge/service/BridgeService.java b/src/main/java/bridge/service/BridgeService.java index 3e80aaf..4a3e3e0 100644 --- a/src/main/java/bridge/service/BridgeService.java +++ b/src/main/java/bridge/service/BridgeService.java @@ -2,6 +2,7 @@ import bridge.model.RestartStatus; import bridge.model.bridge.BridgeMaker; +import bridge.model.result.FinalResult; import bridge.view.InputView; import bridge.view.OutputView; @@ -10,21 +11,23 @@ public class BridgeService { public List createBridge(BridgeMaker bridgeMaker) { OutputView.printGameStartMessage(); - int bridgeSize = InputView.readBridgeSize(); - return bridgeMaker.makeBridge(bridgeSize); - } - - public void move(List resultHolder, boolean eachResult, List bridge) { - resultHolder.add(eachResult); - OutputView.printMap(bridge, resultHolder); + return bridgeMaker.makeBridge(InputView.readBridgeSize()); } public boolean checkMove(String bridgeSquare, String userSquare) { return userSquare.equals(bridgeSquare); } + public void move(List moveResult, boolean eachResult, List bridge) { + moveResult.add(eachResult); + OutputView.printMap(bridge, moveResult); + } + public RestartStatus retry() { - String signal = InputView.readGameCommand(); - return RestartStatus.getRestartStatusBy(signal); + return RestartStatus.getRestartStatusBy(InputView.readGameCommand()); + } + + public void end(int count, FinalResult finalResult) { + OutputView.printResult(count, finalResult); } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 54177de..d8e1367 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,14 +1,22 @@ package bridge.view; +import bridge.model.result.FinalResult; + import java.util.List; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ public class OutputView { + private static String finalSquares; + public static void printGameStartMessage() { System.out.println("다리 건너기 게임을 시작합니다.\n"); } + + private static void printResultMessage() { + System.out.println("최종 게임 결과"); + } /** * 현재까지 이동한 다리의 상태를 정해진 형식에 맞춰 출력한다. @@ -18,49 +26,51 @@ public static void printGameStartMessage() { public static void printMap(List bridge, List moveResult) { StringBuilder upSquares = new StringBuilder("["); StringBuilder downSquares = new StringBuilder("["); - + for (int i = 0; i < moveResult.size(); i++) { if (i > 0) { upSquares.append("|"); downSquares.append("|"); } - if (isSameUpDirect(bridge, moveResult, i)) { + if (isUpDirectSame(bridge, moveResult, i)) { upSquares.append(" O "); downSquares.append(" "); } - if (isDifferentUpDirect(bridge, moveResult, i)) { + if (isUpDirectNotSame(bridge, moveResult, i)) { upSquares.append(" "); downSquares.append(" X "); } - if (isSameDownDirect(bridge, moveResult, i)) { + if (isDownDirectSame(bridge, moveResult, i)) { upSquares.append(" "); downSquares.append(" O "); } - if (isDifferentDownDirect(bridge, moveResult, i)) { + if (isDownDirectNotSame(bridge, moveResult, i)) { upSquares.append(" X "); downSquares.append(" "); } } upSquares.append("]\n"); - downSquares.append("]"); - System.out.println(upSquares.append(downSquares)); + downSquares.append("]\n"); + + finalSquares = upSquares.append(downSquares).toString(); + System.out.println(finalSquares); } - private static boolean isDifferentDownDirect(List bridge, List moveResult, int i) { + private static boolean isDownDirectNotSame(List bridge, List moveResult, int i) { return bridge.get(i).equals("D") && moveResult.get(i) == false; } - private static boolean isDifferentUpDirect(List bridge, List moveResult, int i) { + private static boolean isUpDirectNotSame(List bridge, List moveResult, int i) { return bridge.get(i).equals("U") && moveResult.get(i) == false; } - private static boolean isSameDownDirect(List bridge, List moveResult, int i) { + private static boolean isDownDirectSame(List bridge, List moveResult, int i) { return bridge.get(i).equals("D") && moveResult.get(i) == true; } - private static boolean isSameUpDirect(List bridge, List moveResult, int i) { + private static boolean isUpDirectSame(List bridge, List moveResult, int i) { return bridge.get(i).equals("U") && moveResult.get(i) == true; } @@ -69,6 +79,16 @@ private static boolean isSameUpDirect(List bridge, List moveRes *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void printResult() { + public static void printResult(int count, FinalResult finalResult) { + String result = "성공"; + printResultMessage(); + System.out.println(finalSquares); + + if (finalResult == FinalResult.FAIL) { + result = "실패"; + } + + System.out.println("게임 성공 여부: " + result); + System.out.println("총 시도한 횟수: " + count); } } diff --git a/src/test/java/bridge/model/RestartStatusTest.java b/src/test/java/bridge/model/RestartStatusTest.java index e9b864c..04894df 100644 --- a/src/test/java/bridge/model/RestartStatusTest.java +++ b/src/test/java/bridge/model/RestartStatusTest.java @@ -1,11 +1,9 @@ package bridge.model; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; class RestartStatusTest { @Test diff --git a/src/test/java/bridge/service/BridgeServiceTest.java b/src/test/java/bridge/service/BridgeServiceTest.java index d25fabd..b0d8015 100644 --- a/src/test/java/bridge/service/BridgeServiceTest.java +++ b/src/test/java/bridge/service/BridgeServiceTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.Test; import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; class BridgeServiceTest { From 65aab2d61926a845224df76bf97bd2fae2d447f2 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sun, 30 Jul 2023 12:51:05 +0900 Subject: [PATCH 16/19] =?UTF-8?q?fix:=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자가 잘못된 값을 입력할 경우 다시 그 부분을 입력 받도록 예외 처리 구현 --- .../exception/HasWhiteSpaceException.java | 7 ++++++ .../InvalidInputRestartStatusException.java | 7 ++++++ .../InvalidInputSquareException.java | 7 ++++++ .../NotInRangeBridgeSizeException.java | 7 ++++++ .../bridge/exception/NotNumericException.java | 7 ++++++ .../java/bridge/model/user/UserSquare.java | 22 ++++++++++++----- .../java/bridge/service/BridgeService.java | 19 ++++++++++++--- .../java/bridge/utils/ExceptionMessage.java | 24 +++++++++++++++++++ 8 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 src/main/java/bridge/exception/HasWhiteSpaceException.java create mode 100644 src/main/java/bridge/exception/InvalidInputRestartStatusException.java create mode 100644 src/main/java/bridge/exception/InvalidInputSquareException.java create mode 100644 src/main/java/bridge/exception/NotInRangeBridgeSizeException.java create mode 100644 src/main/java/bridge/exception/NotNumericException.java create mode 100644 src/main/java/bridge/utils/ExceptionMessage.java diff --git a/src/main/java/bridge/exception/HasWhiteSpaceException.java b/src/main/java/bridge/exception/HasWhiteSpaceException.java new file mode 100644 index 0000000..995c4eb --- /dev/null +++ b/src/main/java/bridge/exception/HasWhiteSpaceException.java @@ -0,0 +1,7 @@ +package bridge.exception; + +public class HasWhiteSpaceException extends IllegalArgumentException{ + public HasWhiteSpaceException(final String message) { + super(message); + } +} diff --git a/src/main/java/bridge/exception/InvalidInputRestartStatusException.java b/src/main/java/bridge/exception/InvalidInputRestartStatusException.java new file mode 100644 index 0000000..dfe0f9c --- /dev/null +++ b/src/main/java/bridge/exception/InvalidInputRestartStatusException.java @@ -0,0 +1,7 @@ +package bridge.exception; + +public class InvalidInputRestartStatusException extends IllegalArgumentException{ + public InvalidInputRestartStatusException(final String message) { + super(message); + } +} diff --git a/src/main/java/bridge/exception/InvalidInputSquareException.java b/src/main/java/bridge/exception/InvalidInputSquareException.java new file mode 100644 index 0000000..b567a6c --- /dev/null +++ b/src/main/java/bridge/exception/InvalidInputSquareException.java @@ -0,0 +1,7 @@ +package bridge.exception; + +public class InvalidInputSquareException extends IllegalArgumentException{ + public InvalidInputSquareException(final String message) { + super(message); + } +} diff --git a/src/main/java/bridge/exception/NotInRangeBridgeSizeException.java b/src/main/java/bridge/exception/NotInRangeBridgeSizeException.java new file mode 100644 index 0000000..c849d93 --- /dev/null +++ b/src/main/java/bridge/exception/NotInRangeBridgeSizeException.java @@ -0,0 +1,7 @@ +package bridge.exception; + +public class NotInRangeBridgeSizeException extends IllegalArgumentException{ + public NotInRangeBridgeSizeException(final String message) { + super(message); + } +} diff --git a/src/main/java/bridge/exception/NotNumericException.java b/src/main/java/bridge/exception/NotNumericException.java new file mode 100644 index 0000000..6893764 --- /dev/null +++ b/src/main/java/bridge/exception/NotNumericException.java @@ -0,0 +1,7 @@ +package bridge.exception; + +public class NotNumericException extends IllegalArgumentException{ + public NotNumericException(final String message) { + super(message); + } +} diff --git a/src/main/java/bridge/model/user/UserSquare.java b/src/main/java/bridge/model/user/UserSquare.java index 7319a42..428c7a1 100644 --- a/src/main/java/bridge/model/user/UserSquare.java +++ b/src/main/java/bridge/model/user/UserSquare.java @@ -1,25 +1,35 @@ package bridge.model.user; +import bridge.utils.BridgeConstant; import bridge.view.InputView; +import static bridge.utils.ExceptionMessage.Input_Exception.INVALID_INPUT_SQUARE_EXCEPTION; + public class UserSquare { private String square; public UserSquare() { - String moving = InputView.readMoving(); - validateCharacter(moving); - - this.square = moving; + while (true) { + try { + String moving = InputView.readMoving(); + validateCharacter(moving); + this.square = moving; + + break; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } } private static void validateCharacter(String moving) { if (isInvalidCharacter(moving)) { - throw new IllegalArgumentException("윗 칸은 [U], 아래 칸은 [D]를 눌러주세요"); + throw new IllegalArgumentException(INVALID_INPUT_SQUARE_EXCEPTION.getMessage()); } } private static boolean isInvalidCharacter(String moving) { - return !moving.equals("U") && !moving.equals("D"); + return !moving.equals(BridgeConstant.UP_SQUARE) && !moving.equals(BridgeConstant.DOWN_SQUARE); } public String getSquare() { diff --git a/src/main/java/bridge/service/BridgeService.java b/src/main/java/bridge/service/BridgeService.java index 4a3e3e0..0ebb9f1 100644 --- a/src/main/java/bridge/service/BridgeService.java +++ b/src/main/java/bridge/service/BridgeService.java @@ -10,8 +10,15 @@ public class BridgeService { public List createBridge(BridgeMaker bridgeMaker) { - OutputView.printGameStartMessage(); - return bridgeMaker.makeBridge(InputView.readBridgeSize()); + while (true) { + try { + OutputView.printGameStartMessage(); + + return bridgeMaker.makeBridge(InputView.readBridgeSize()); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } } public boolean checkMove(String bridgeSquare, String userSquare) { @@ -24,7 +31,13 @@ public void move(List moveResult, boolean eachResult, List brid } public RestartStatus retry() { - return RestartStatus.getRestartStatusBy(InputView.readGameCommand()); + while (true) { + try { + return RestartStatus.getRestartStatusBy(InputView.readGameCommand()); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } } public void end(int count, FinalResult finalResult) { diff --git a/src/main/java/bridge/utils/ExceptionMessage.java b/src/main/java/bridge/utils/ExceptionMessage.java new file mode 100644 index 0000000..9b66097 --- /dev/null +++ b/src/main/java/bridge/utils/ExceptionMessage.java @@ -0,0 +1,24 @@ +package bridge.utils; + +public interface ExceptionMessage { + + String ERROR = "[ERROR] "; + + enum Input_Exception { + INVALID_BRIDGE_RANGE_EXCEPTION("다리 길이는 3부터 20 사이의 숫자여야 합니다."), + INVALID_INPUT_SQUARE_EXCEPTION("윗 칸은 [U], 아래 칸은 [D]를 눌러주세요."), + INVALID_INPUT_RESTART_STATUS_EXCEPTION("재시작 [R], 종료 [Q]를 눌러주세요."), + HAS_WHITESPACE_EXCEPTION("공백을 입력할 수 없습니다."), + IS_NOT_NUMERIC_EXCEPTION("정수만 입력 가능합니다."); + + private final String message; + + Input_Exception(String message) { + this.message = message; + } + + public String getMessage() { + return ERROR + message; + } + } +} From 984e0111985f2107d8b03af203331cd87901a9da Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sun, 30 Jul 2023 12:52:58 +0900 Subject: [PATCH 17/19] =?UTF-8?q?refactor:=20=ED=95=98=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=94=A9=20=ED=96=88=EB=8D=98=20=EA=B2=83=EC=9D=84=20=EC=83=81?= =?UTF-8?q?=EC=88=98=EB=A1=9C=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 *fix: BridgeMaker 입력 범위 검증 메서드 추가 --- src/main/java/bridge/model/RestartStatus.java | 10 ++- .../java/bridge/model/bridge/BridgeMaker.java | 14 +++- .../java/bridge/utils/BridgeConstant.java | 6 ++ src/main/java/bridge/view/InputView.java | 20 +++-- src/main/java/bridge/view/OutputView.java | 77 +++++++++++-------- 5 files changed, 87 insertions(+), 40 deletions(-) create mode 100644 src/main/java/bridge/utils/BridgeConstant.java diff --git a/src/main/java/bridge/model/RestartStatus.java b/src/main/java/bridge/model/RestartStatus.java index a7c478e..b1268c7 100644 --- a/src/main/java/bridge/model/RestartStatus.java +++ b/src/main/java/bridge/model/RestartStatus.java @@ -2,11 +2,15 @@ import java.util.Arrays; +import static bridge.utils.ExceptionMessage.Input_Exception.INVALID_INPUT_RESTART_STATUS_EXCEPTION; + public enum RestartStatus { RESTART("R"), QUIT("Q"); - public final String signal; + private static final String QUIT_SIGN = "Q"; + private static final String RESTART_SIGN = "R"; + private final String signal; RestartStatus(String signal) { this.signal = signal; @@ -23,11 +27,11 @@ public static RestartStatus getRestartStatusBy(String signal) { private static void validateCharacter(String signal) { if (isInvalidCharacter(signal)) { - throw new IllegalArgumentException("재시작 [R], 종료 [Q]를 눌러주세요"); + throw new IllegalArgumentException(INVALID_INPUT_RESTART_STATUS_EXCEPTION.getMessage()); } } private static boolean isInvalidCharacter(String signal) { - return !signal.equals("R") && !signal.equals("Q"); + return !signal.equals(RESTART_SIGN) && !signal.equals(QUIT_SIGN); } } diff --git a/src/main/java/bridge/model/bridge/BridgeMaker.java b/src/main/java/bridge/model/bridge/BridgeMaker.java index 2b4eb51..f5b2d63 100644 --- a/src/main/java/bridge/model/bridge/BridgeMaker.java +++ b/src/main/java/bridge/model/bridge/BridgeMaker.java @@ -4,11 +4,15 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import static bridge.utils.ExceptionMessage.Input_Exception.INVALID_BRIDGE_RANGE_EXCEPTION; + /** * 다리의 길이를 입력 받아서 다리를 생성해주는 역할을 한다. */ public class BridgeMaker { - + + private static final int MIN_SIZE = 3; + private static final int MAX_SIZE = 20; private final BridgeNumberGenerator bridgeNumberGenerator; public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { @@ -20,9 +24,17 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ public List makeBridge(int size) { + validateBridgeRange(size); + return IntStream.range(0, size) .mapToObj(i -> Direct.getDirectBy(bridgeNumberGenerator.generate())) .map(String::valueOf) .collect(Collectors.toList()); } + + private void validateBridgeRange(int size) { + if (size < MIN_SIZE || size > MAX_SIZE) { + throw new IllegalArgumentException(INVALID_BRIDGE_RANGE_EXCEPTION.getMessage()); + } + } } diff --git a/src/main/java/bridge/utils/BridgeConstant.java b/src/main/java/bridge/utils/BridgeConstant.java new file mode 100644 index 0000000..5ec8614 --- /dev/null +++ b/src/main/java/bridge/utils/BridgeConstant.java @@ -0,0 +1,6 @@ +package bridge.utils; + +public abstract class BridgeConstant { + public static final String DOWN_SQUARE = "D"; + public static final String UP_SQUARE = "U"; +} diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index ef912d6..4b547a7 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -2,20 +2,28 @@ import camp.nextstep.edu.missionutils.Console; +import static bridge.utils.ExceptionMessage.Input_Exception.HAS_WHITESPACE_EXCEPTION; +import static bridge.utils.ExceptionMessage.Input_Exception.IS_NOT_NUMERIC_EXCEPTION; + /** * 사용자로부터 입력을 받는 역할을 한다. */ public class InputView { + + private static final String INPUT_BRIDGE_LENGTH_MESSAGE = "다리의 길이를 입력해주세요."; + private static final String INPUT_USER_SQUARE_MESSAGE = "이동할 칸을 선택해주세요. (위: U, 아래: D)"; + private static final String INPUT_RESTART_MESSAGE = "게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"; + private static void printInputLengthMessage() { - System.out.println("다리의 길이를 입력해주세요."); + System.out.println(INPUT_BRIDGE_LENGTH_MESSAGE); } private static void printInputDirectMessage() { - System.out.println("이동할 칸을 선택해주세요. (위: U, 아래: D)"); + System.out.println(INPUT_USER_SQUARE_MESSAGE); } private static void printInputRestartStatusMessage() { - System.out.println("게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"); + System.out.println(INPUT_RESTART_MESSAGE); } /** @@ -25,7 +33,7 @@ public static int readBridgeSize() { printInputLengthMessage(); String length = Console.readLine(); - + validateHasWhiteSpace(length); validateIsNumeric(length); @@ -58,7 +66,7 @@ public static String readGameCommand() { private static void validateHasWhiteSpace(String input) { if (hasWhiteSpace(input)) { - throw new IllegalArgumentException("공백을 입력할 수 없습니다."); + throw new IllegalArgumentException(HAS_WHITESPACE_EXCEPTION.getMessage()); } } @@ -70,7 +78,7 @@ private static void validateIsNumeric(String input) { try { Integer.valueOf(input); } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("정수만 입력 가능합니다."); + throw new IllegalArgumentException(IS_NOT_NUMERIC_EXCEPTION.getMessage()); } } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index d8e1367..6a89ef2 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -4,19 +4,33 @@ import java.util.List; +import static bridge.utils.BridgeConstant.DOWN_SQUARE; +import static bridge.utils.BridgeConstant.UP_SQUARE; + /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ public class OutputView { + private static final String GAME_START_MESSAGE = "다리 건너기 게임을 시작합니다."; + private static final String GAME_OVER_MESSAGE = "최종 게임 결과"; + private static final String OPEN_BRACKETS = "["; + private static final String CLOSE_BRACKETS = "]"; + private static final String SEPARATOR = "|"; + private static final String COLLECT_SIGN = " O "; + private static final String GAP = " "; + private static final String NEW_LINE = "\n"; + private static final String WRONG_SIGN = " X "; + private static final String SUCCESS = "성공"; + private static final String FAIL = "실패"; + private static final String GAME_SUCCESS_WHETHER = "게임 성공 여부: "; + private static final String TYR_COUNT = "총 시도한 횟수: "; + private static final int START_NUMBER = 0; private static String finalSquares; public static void printGameStartMessage() { - System.out.println("다리 건너기 게임을 시작합니다.\n"); + System.out.println(GAME_START_MESSAGE + NEW_LINE); } - private static void printResultMessage() { - System.out.println("최종 게임 결과"); - } /** * 현재까지 이동한 다리의 상태를 정해진 형식에 맞춰 출력한다. @@ -24,54 +38,54 @@ private static void printResultMessage() { * 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public static void printMap(List bridge, List moveResult) { - StringBuilder upSquares = new StringBuilder("["); - StringBuilder downSquares = new StringBuilder("["); + StringBuilder upSquares = new StringBuilder(OPEN_BRACKETS); + StringBuilder downSquares = new StringBuilder(OPEN_BRACKETS); for (int i = 0; i < moveResult.size(); i++) { - if (i > 0) { - upSquares.append("|"); - downSquares.append("|"); + if (i > START_NUMBER) { + upSquares.append(SEPARATOR); + downSquares.append(SEPARATOR); } if (isUpDirectSame(bridge, moveResult, i)) { - upSquares.append(" O "); - downSquares.append(" "); + upSquares.append(COLLECT_SIGN); + downSquares.append(GAP); } if (isUpDirectNotSame(bridge, moveResult, i)) { - upSquares.append(" "); - downSquares.append(" X "); + upSquares.append(GAP); + downSquares.append(WRONG_SIGN); } if (isDownDirectSame(bridge, moveResult, i)) { - upSquares.append(" "); - downSquares.append(" O "); + upSquares.append(GAP); + downSquares.append(COLLECT_SIGN); } if (isDownDirectNotSame(bridge, moveResult, i)) { - upSquares.append(" X "); - downSquares.append(" "); + upSquares.append(WRONG_SIGN); + downSquares.append(GAP); } } - upSquares.append("]\n"); - downSquares.append("]\n"); + upSquares.append(CLOSE_BRACKETS + NEW_LINE); + downSquares.append(CLOSE_BRACKETS + NEW_LINE); finalSquares = upSquares.append(downSquares).toString(); System.out.println(finalSquares); } private static boolean isDownDirectNotSame(List bridge, List moveResult, int i) { - return bridge.get(i).equals("D") && moveResult.get(i) == false; + return bridge.get(i).equals(DOWN_SQUARE) && moveResult.get(i) == false; } private static boolean isUpDirectNotSame(List bridge, List moveResult, int i) { - return bridge.get(i).equals("U") && moveResult.get(i) == false; + return bridge.get(i).equals(UP_SQUARE) && moveResult.get(i) == false; } private static boolean isDownDirectSame(List bridge, List moveResult, int i) { - return bridge.get(i).equals("D") && moveResult.get(i) == true; + return bridge.get(i).equals(DOWN_SQUARE) && moveResult.get(i) == true; } private static boolean isUpDirectSame(List bridge, List moveResult, int i) { - return bridge.get(i).equals("U") && moveResult.get(i) == true; + return bridge.get(i).equals(UP_SQUARE) && moveResult.get(i) == true; } /** @@ -80,15 +94,18 @@ private static boolean isUpDirectSame(List bridge, List moveRes * 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public static void printResult(int count, FinalResult finalResult) { - String result = "성공"; - printResultMessage(); - System.out.println(finalSquares); - + StringBuilder finalMessage = new StringBuilder(); + String result = SUCCESS; + if (finalResult == FinalResult.FAIL) { - result = "실패"; + result = FAIL; } - System.out.println("게임 성공 여부: " + result); - System.out.println("총 시도한 횟수: " + count); + finalMessage.append(GAME_OVER_MESSAGE + NEW_LINE) + .append(finalSquares + NEW_LINE) + .append(GAME_SUCCESS_WHETHER + result + NEW_LINE) + .append(TYR_COUNT + count + NEW_LINE); + + System.out.println(finalMessage); } } From 4b85e3d2e5398c714e358212fa956be4b104bec2 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sun, 30 Jul 2023 13:00:14 +0900 Subject: [PATCH 18/19] =?UTF-8?q?refactor:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/controller/BridgeGame.java | 14 +++++++------- src/main/java/bridge/model/RestartStatus.java | 6 +++--- .../java/bridge/model/bridge/BridgeMaker.java | 4 ++-- src/main/java/bridge/model/bridge/Direct.java | 2 +- .../java/bridge/model/result/CompareResult.java | 2 +- src/main/java/bridge/model/user/UserSquare.java | 6 +++--- src/main/java/bridge/service/BridgeService.java | 8 ++++---- src/main/java/bridge/view/InputView.java | 16 ++++++++-------- src/main/java/bridge/view/OutputView.java | 12 ++++++------ 9 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index 6e883b5..4872847 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -34,7 +34,7 @@ public BridgeGame() { } public void run() { - List bridge = createBridge(); + final List bridge = createBridge(); playGame(bridge); endGame(); } @@ -43,11 +43,11 @@ private List createBridge() { return bridgeService.createBridge(bridgeMaker); } - private void playGame(List bridge) { + private void playGame(final List bridge) { do { List moveResult = createResultHolder(); count += 1; - for (String bridgeSquare : bridge) { + for (final String bridgeSquare : bridge) { move(bridgeSquare, moveResult, bridge); if (isDifferent()) { @@ -72,9 +72,9 @@ private static List createResultHolder() { *

* 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void move(String bridgeSquare, List moveResult, List bridge) { - UserSquare userSquare = new UserSquare(); - boolean eachResult = bridgeService.checkMove(userSquare.getSquare(), bridgeSquare); + public void move(final String bridgeSquare, List moveResult, final List bridge) { + final UserSquare userSquare = new UserSquare(); + final boolean eachResult = bridgeService.checkMove(userSquare.getSquare(), bridgeSquare); compare = CompareResult.getCompareBy(eachResult); bridgeService.move(moveResult, eachResult, bridge); @@ -97,7 +97,7 @@ private static void gameOver() { *

* 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void retry(boolean eachResult) { + public void retry(final boolean eachResult) { if (eachResult == false) { restartStatus = bridgeService.retry(); } diff --git a/src/main/java/bridge/model/RestartStatus.java b/src/main/java/bridge/model/RestartStatus.java index b1268c7..34530c8 100644 --- a/src/main/java/bridge/model/RestartStatus.java +++ b/src/main/java/bridge/model/RestartStatus.java @@ -16,7 +16,7 @@ public enum RestartStatus { this.signal = signal; } - public static RestartStatus getRestartStatusBy(String signal) { + public static RestartStatus getRestartStatusBy(final String signal) { validateCharacter(signal); return Arrays.stream(values()) @@ -25,13 +25,13 @@ public static RestartStatus getRestartStatusBy(String signal) { .orElseGet(() -> null); } - private static void validateCharacter(String signal) { + private static void validateCharacter(final String signal) { if (isInvalidCharacter(signal)) { throw new IllegalArgumentException(INVALID_INPUT_RESTART_STATUS_EXCEPTION.getMessage()); } } - private static boolean isInvalidCharacter(String signal) { + private static boolean isInvalidCharacter(final String signal) { return !signal.equals(RESTART_SIGN) && !signal.equals(QUIT_SIGN); } } diff --git a/src/main/java/bridge/model/bridge/BridgeMaker.java b/src/main/java/bridge/model/bridge/BridgeMaker.java index f5b2d63..0523d59 100644 --- a/src/main/java/bridge/model/bridge/BridgeMaker.java +++ b/src/main/java/bridge/model/bridge/BridgeMaker.java @@ -23,7 +23,7 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @param size 다리의 길이 * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ - public List makeBridge(int size) { + public List makeBridge(final int size) { validateBridgeRange(size); return IntStream.range(0, size) @@ -32,7 +32,7 @@ public List makeBridge(int size) { .collect(Collectors.toList()); } - private void validateBridgeRange(int size) { + private void validateBridgeRange(final int size) { if (size < MIN_SIZE || size > MAX_SIZE) { throw new IllegalArgumentException(INVALID_BRIDGE_RANGE_EXCEPTION.getMessage()); } diff --git a/src/main/java/bridge/model/bridge/Direct.java b/src/main/java/bridge/model/bridge/Direct.java index a96bc4c..8f2d581 100644 --- a/src/main/java/bridge/model/bridge/Direct.java +++ b/src/main/java/bridge/model/bridge/Direct.java @@ -12,7 +12,7 @@ public enum Direct { this.directNumber = directNumber; } - public static Direct getDirectBy(int directNumber) { + public static Direct getDirectBy(final int directNumber) { return Arrays.stream(values()) .filter(Direct -> Direct.directNumber == directNumber) .findFirst() diff --git a/src/main/java/bridge/model/result/CompareResult.java b/src/main/java/bridge/model/result/CompareResult.java index 3e90de0..0873737 100644 --- a/src/main/java/bridge/model/result/CompareResult.java +++ b/src/main/java/bridge/model/result/CompareResult.java @@ -12,7 +12,7 @@ public enum CompareResult { this.isSame = isSame; } - public static CompareResult getCompareBy(boolean EachResult) { + public static CompareResult getCompareBy(final boolean EachResult) { return Arrays.stream(values()) .filter(Compare -> Compare.isSame == EachResult) .findFirst() diff --git a/src/main/java/bridge/model/user/UserSquare.java b/src/main/java/bridge/model/user/UserSquare.java index 428c7a1..803dea5 100644 --- a/src/main/java/bridge/model/user/UserSquare.java +++ b/src/main/java/bridge/model/user/UserSquare.java @@ -11,7 +11,7 @@ public class UserSquare { public UserSquare() { while (true) { try { - String moving = InputView.readMoving(); + final String moving = InputView.readMoving(); validateCharacter(moving); this.square = moving; @@ -22,13 +22,13 @@ public UserSquare() { } } - private static void validateCharacter(String moving) { + private static void validateCharacter(final String moving) { if (isInvalidCharacter(moving)) { throw new IllegalArgumentException(INVALID_INPUT_SQUARE_EXCEPTION.getMessage()); } } - private static boolean isInvalidCharacter(String moving) { + private static boolean isInvalidCharacter(final String moving) { return !moving.equals(BridgeConstant.UP_SQUARE) && !moving.equals(BridgeConstant.DOWN_SQUARE); } diff --git a/src/main/java/bridge/service/BridgeService.java b/src/main/java/bridge/service/BridgeService.java index 0ebb9f1..239d0c0 100644 --- a/src/main/java/bridge/service/BridgeService.java +++ b/src/main/java/bridge/service/BridgeService.java @@ -9,7 +9,7 @@ import java.util.List; public class BridgeService { - public List createBridge(BridgeMaker bridgeMaker) { + public List createBridge(final BridgeMaker bridgeMaker) { while (true) { try { OutputView.printGameStartMessage(); @@ -21,11 +21,11 @@ public List createBridge(BridgeMaker bridgeMaker) { } } - public boolean checkMove(String bridgeSquare, String userSquare) { + public boolean checkMove(final String bridgeSquare, final String userSquare) { return userSquare.equals(bridgeSquare); } - public void move(List moveResult, boolean eachResult, List bridge) { + public void move(List moveResult, final boolean eachResult, final List bridge) { moveResult.add(eachResult); OutputView.printMap(bridge, moveResult); } @@ -40,7 +40,7 @@ public RestartStatus retry() { } } - public void end(int count, FinalResult finalResult) { + public void end(final int count, final FinalResult finalResult) { OutputView.printResult(count, finalResult); } } diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 4b547a7..ee6d048 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -31,8 +31,8 @@ private static void printInputRestartStatusMessage() { */ public static int readBridgeSize() { printInputLengthMessage(); - - String length = Console.readLine(); + + final String length = Console.readLine(); validateHasWhiteSpace(length); validateIsNumeric(length); @@ -46,7 +46,7 @@ public static int readBridgeSize() { public static String readMoving() { printInputDirectMessage(); - String direct = Console.readLine(); + final String direct = Console.readLine(); validateHasWhiteSpace(direct); return direct; @@ -57,24 +57,24 @@ public static String readMoving() { */ public static String readGameCommand() { printInputRestartStatusMessage(); - - String command = Console.readLine(); + + final String command = Console.readLine(); validateHasWhiteSpace(command); return command; } - private static void validateHasWhiteSpace(String input) { + private static void validateHasWhiteSpace(final String input) { if (hasWhiteSpace(input)) { throw new IllegalArgumentException(HAS_WHITESPACE_EXCEPTION.getMessage()); } } - private static boolean hasWhiteSpace(String input) { + private static boolean hasWhiteSpace(final String input) { return input.chars().anyMatch(Character::isWhitespace); } - private static void validateIsNumeric(String input) { + private static void validateIsNumeric(final String input) { try { Integer.valueOf(input); } catch (IllegalArgumentException e) { diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 6a89ef2..754cd3b 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -37,7 +37,7 @@ public static void printGameStartMessage() { *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public static void printMap(List bridge, List moveResult) { + public static void printMap(final List bridge, final List moveResult) { StringBuilder upSquares = new StringBuilder(OPEN_BRACKETS); StringBuilder downSquares = new StringBuilder(OPEN_BRACKETS); @@ -72,19 +72,19 @@ public static void printMap(List bridge, List moveResult) { System.out.println(finalSquares); } - private static boolean isDownDirectNotSame(List bridge, List moveResult, int i) { + private static boolean isDownDirectNotSame(final List bridge, final List moveResult, final int i) { return bridge.get(i).equals(DOWN_SQUARE) && moveResult.get(i) == false; } - private static boolean isUpDirectNotSame(List bridge, List moveResult, int i) { + private static boolean isUpDirectNotSame(final List bridge, final List moveResult, final int i) { return bridge.get(i).equals(UP_SQUARE) && moveResult.get(i) == false; } - private static boolean isDownDirectSame(List bridge, List moveResult, int i) { + private static boolean isDownDirectSame(final List bridge, final List moveResult, final int i) { return bridge.get(i).equals(DOWN_SQUARE) && moveResult.get(i) == true; } - private static boolean isUpDirectSame(List bridge, List moveResult, int i) { + private static boolean isUpDirectSame(final List bridge, final List moveResult, final int i) { return bridge.get(i).equals(UP_SQUARE) && moveResult.get(i) == true; } @@ -93,7 +93,7 @@ private static boolean isUpDirectSame(List bridge, List moveRes *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public static void printResult(int count, FinalResult finalResult) { + public static void printResult(final int count, final FinalResult finalResult) { StringBuilder finalMessage = new StringBuilder(); String result = SUCCESS; From 41558b5e14241c22d2739f57d16e7c293d385c9e Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sun, 30 Jul 2023 13:15:04 +0900 Subject: [PATCH 19/19] =?UTF-8?q?refactor:=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/model/RestartStatusTest.java | 20 +++++++++++++++++++ .../bridge/model/bridge/BridgeMakerTest.java | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/test/java/bridge/model/RestartStatusTest.java b/src/test/java/bridge/model/RestartStatusTest.java index 04894df..7b803df 100644 --- a/src/test/java/bridge/model/RestartStatusTest.java +++ b/src/test/java/bridge/model/RestartStatusTest.java @@ -1,11 +1,31 @@ package bridge.model; +import bridge.model.bridge.BridgeMaker; +import bridge.model.bridge.BridgeNumberGenerator; +import bridge.model.bridge.BridgeRandomNumberGenerator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import static bridge.utils.ExceptionMessage.Input_Exception.INVALID_BRIDGE_RANGE_EXCEPTION; +import static bridge.utils.ExceptionMessage.Input_Exception.INVALID_INPUT_RESTART_STATUS_EXCEPTION; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class RestartStatusTest { + @Test + @DisplayName("올바르지 않은 문자를 입력하면 예외가 발생한다.") + void throwException_InvalidCharacter() { + // given + String signal = "G"; + + // then + assertThatThrownBy(() -> RestartStatus.getRestartStatusBy(signal)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(INVALID_INPUT_RESTART_STATUS_EXCEPTION.getMessage()); + } + @Test @DisplayName("게임을 재시작한다.") void restart() { diff --git a/src/test/java/bridge/model/bridge/BridgeMakerTest.java b/src/test/java/bridge/model/bridge/BridgeMakerTest.java index b444c08..a84bcbf 100644 --- a/src/test/java/bridge/model/bridge/BridgeMakerTest.java +++ b/src/test/java/bridge/model/bridge/BridgeMakerTest.java @@ -1,13 +1,33 @@ package bridge.model.bridge; +import bridge.utils.ExceptionMessage; +import org.assertj.core.api.Assertions; 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 java.util.List; +import static bridge.utils.ExceptionMessage.Input_Exception.INVALID_BRIDGE_RANGE_EXCEPTION; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class BridgeMakerTest { + @ParameterizedTest + @ValueSource(ints = {2, 21}) + @DisplayName("범위에 맞지 않은 다리 길이를 입력하지 않으면 예외가 발생한다.") + void throwException_NotInRangeBridgeSize(int size) { + // given + BridgeNumberGenerator bridgeNumberGenerator = new BridgeRandomNumberGenerator(); + BridgeMaker bridgeMaker = new BridgeMaker(bridgeNumberGenerator); + + // then + assertThatThrownBy(() -> bridgeMaker.makeBridge(size)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(INVALID_BRIDGE_RANGE_EXCEPTION.getMessage()); + } + @Test @DisplayName("다리 길이를 입력받아 다리를 생성한다.") void makeBridge() {