From bc64174dd5bd63a4df0bb1970c1c5747c7b6fa9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:04:20 +0900 Subject: [PATCH 01/28] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=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 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb..3688365e9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,18 @@ +## 기능 목록 +- [ ] 시작 메시지 출력 +- [ ] 코치 이름 입력 요청 메시지 출력 +- [ ] 코치 이름 입력 + - [ ] 코치 이름 입력값 쉼표로 구분됐는지 검증 + - [ ] 코치 이름 길이 2 ~ 4 사이인지 검증 + - [ ] 코치 5명 이하인지 검증 + - [ ] 잘못된 입력시 에러 메시지 출력 및 재시도 +- [ ] 코치별 못 먹는 메뉴 입력 요청 메시지 출력 +- [ ] 코치별 못 먹는 메뉴 입력 + - [ ] 개수 0 ~ 2개 사이인지 검증 + - [ ] 메뉴 목록에 포함된 메뉴인지 검증 + - [ ] 잘못된 입력시 에러 메시지 출력 및 재시도 +- [ ] 메뉴 추천 + - [ ] 랜덤 메뉴 생성 + - [ ] 한 주에 같은 카테고리 최대 2회인지 검증 + - [ ] 각 코치에게 중복된 메뉴가 없는지 검증 +- [ ] 추천 완료 메시지 출력 From 724c6855a556f6aeaedc3707d958b0e47041c865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:09:15 +0900 Subject: [PATCH 02/28] =?UTF-8?q?feat(GameMessage):=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EC=97=B4=EA=B1=B0=ED=98=95=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/menu/constant/GameMessage.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/menu/constant/GameMessage.java diff --git a/src/main/java/menu/constant/GameMessage.java b/src/main/java/menu/constant/GameMessage.java new file mode 100644 index 000000000..bc4b7eba9 --- /dev/null +++ b/src/main/java/menu/constant/GameMessage.java @@ -0,0 +1,15 @@ +package menu.constant; + +public enum GameMessage { + START("점심 메뉴 추천을 시작합니다."); + + private final String message; + + GameMessage(final String message) { + this.message = message; + } + + public String getMessage() { + return this.message; + } +} From 3eecde0debcd6332d81112a9db888d699088588d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:09:50 +0900 Subject: [PATCH 03/28] =?UTF-8?q?feat(OutputView):=20=EC=8B=9C=EC=9E=91=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/menu/io/OutputView.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/menu/io/OutputView.java diff --git a/src/main/java/menu/io/OutputView.java b/src/main/java/menu/io/OutputView.java new file mode 100644 index 000000000..9a71c8659 --- /dev/null +++ b/src/main/java/menu/io/OutputView.java @@ -0,0 +1,10 @@ +package menu.io; + +import menu.constant.GameMessage; + +public class OutputView { + + public void printStart() { + System.out.println(GameMessage.START.getMessage()); + } +} From d26a2559c81be84fa752a252d62d61c2867ee9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:10:59 +0900 Subject: [PATCH 04/28] =?UTF-8?q?feat(MenuController):=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=ED=81=B4=EB=9E=98=EC=8A=A4=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 --- docs/README.md | 11 +++++++++++ src/main/java/menu/Application.java | 4 +++- src/main/java/menu/controller/MenuController.java | 12 ++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/main/java/menu/controller/MenuController.java diff --git a/docs/README.md b/docs/README.md index 3688365e9..5b58ec7ef 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,3 +16,14 @@ - [ ] 한 주에 같은 카테고리 최대 2회인지 검증 - [ ] 각 코치에게 중복된 메뉴가 없는지 검증 - [ ] 추천 완료 메시지 출력 + +## 구현 클래스 + +- MenuController + - run() + +- OutputView + - printStart() + +## 열거형 목록 +- GameMessage diff --git a/src/main/java/menu/Application.java b/src/main/java/menu/Application.java index 6340b6f33..78489c916 100644 --- a/src/main/java/menu/Application.java +++ b/src/main/java/menu/Application.java @@ -1,7 +1,9 @@ package menu; +import menu.controller.MenuController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + new MenuController().run(); } } diff --git a/src/main/java/menu/controller/MenuController.java b/src/main/java/menu/controller/MenuController.java new file mode 100644 index 000000000..f3bc66dec --- /dev/null +++ b/src/main/java/menu/controller/MenuController.java @@ -0,0 +1,12 @@ +package menu.controller; + +import menu.io.OutputView; + +public class MenuController { + + private final OutputView outputView = new OutputView(); + + public void run() { + outputView.printStart(); + } +} From 46b1f06c770b9a9198d42a9354e8cc9b9cf95fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:13:25 +0900 Subject: [PATCH 05/28] =?UTF-8?q?feat:=20=EC=BD=94=EC=B9=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EC=9A=94=EC=B2=AD=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 +++-- src/main/java/menu/constant/GameMessage.java | 3 ++- src/main/java/menu/controller/MenuController.java | 5 +++++ src/main/java/menu/io/OutputView.java | 4 ++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 5b58ec7ef..559188602 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ ## 기능 목록 -- [ ] 시작 메시지 출력 -- [ ] 코치 이름 입력 요청 메시지 출력 +- [x] 시작 메시지 출력 +- [x] 코치 이름 입력 요청 메시지 출력 - [ ] 코치 이름 입력 - [ ] 코치 이름 입력값 쉼표로 구분됐는지 검증 - [ ] 코치 이름 길이 2 ~ 4 사이인지 검증 @@ -24,6 +24,7 @@ - OutputView - printStart() + - printCoachNameRequest() ## 열거형 목록 - GameMessage diff --git a/src/main/java/menu/constant/GameMessage.java b/src/main/java/menu/constant/GameMessage.java index bc4b7eba9..08e218fc9 100644 --- a/src/main/java/menu/constant/GameMessage.java +++ b/src/main/java/menu/constant/GameMessage.java @@ -1,7 +1,8 @@ package menu.constant; public enum GameMessage { - START("점심 메뉴 추천을 시작합니다."); + START("점심 메뉴 추천을 시작합니다."), + COACH_NAME_REQUEST("코치의 이름을 입력해 주세요. (, 로 구분)"); private final String message; diff --git a/src/main/java/menu/controller/MenuController.java b/src/main/java/menu/controller/MenuController.java index f3bc66dec..58bfc17e7 100644 --- a/src/main/java/menu/controller/MenuController.java +++ b/src/main/java/menu/controller/MenuController.java @@ -8,5 +8,10 @@ public class MenuController { public void run() { outputView.printStart(); + createCoach(); + } + + private void createCoach() { + outputView.printCoachNameRequest(); } } diff --git a/src/main/java/menu/io/OutputView.java b/src/main/java/menu/io/OutputView.java index 9a71c8659..b5d44fc41 100644 --- a/src/main/java/menu/io/OutputView.java +++ b/src/main/java/menu/io/OutputView.java @@ -7,4 +7,8 @@ public class OutputView { public void printStart() { System.out.println(GameMessage.START.getMessage()); } + + public void printCoachNameRequest() { + System.out.println(GameMessage.COACH_NAME_REQUEST.getMessage()); + } } From 2db41aec61e565f550090239a201a6f801344d04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:20:04 +0900 Subject: [PATCH 06/28] =?UTF-8?q?feat(ErrorMessage):=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=97=B4=EA=B1=B0=ED=98=95=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 --- docs/README.md | 1 + src/main/java/menu/constant/ErrorMessage.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 src/main/java/menu/constant/ErrorMessage.java diff --git a/docs/README.md b/docs/README.md index 559188602..294d0e2a9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,3 +28,4 @@ ## 열거형 목록 - GameMessage +- ErrorMessage diff --git a/src/main/java/menu/constant/ErrorMessage.java b/src/main/java/menu/constant/ErrorMessage.java new file mode 100644 index 000000000..3b86a6bfe --- /dev/null +++ b/src/main/java/menu/constant/ErrorMessage.java @@ -0,0 +1,16 @@ +package menu.constant; + +public enum ErrorMessage { + INVALID_COACH_NAME_LENGTH("코치 이름 길이가 잘못되었습니다."); + + private static final String ERROR_PREFIX = "[ERROR] "; + private final String message; + + ErrorMessage(final String message) { + this.message = message; + } + + public String getMessage() { + return ERROR_PREFIX + this.message; + } +} From 657b23cdf0d566c88ddb7e0aec7e5e71362f362a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:28:10 +0900 Subject: [PATCH 07/28] =?UTF-8?q?feat(Coach):=20=EC=BD=94=EC=B9=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EA=B2=80=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=B0=8F=20=EB=8F=84=EB=A9=94=EC=9D=B8=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/menu/domain/Coach.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/menu/domain/Coach.java diff --git a/src/main/java/menu/domain/Coach.java b/src/main/java/menu/domain/Coach.java new file mode 100644 index 000000000..1eecd2cb1 --- /dev/null +++ b/src/main/java/menu/domain/Coach.java @@ -0,0 +1,22 @@ +package menu.domain; + +import menu.constant.ErrorMessage; + +public class Coach { + + private static final int MIN_NAME_LENGTH = 2; + private static final int MAX_NAME_LENGTH = 4; + private final String name; + + public Coach(final String name) { + validateName(name); + this.name = name; + } + + private void validateName(final String name) { + final int length = name.length(); + if (MIN_NAME_LENGTH > length || length > MAX_NAME_LENGTH) { + throw new IllegalArgumentException(ErrorMessage.INVALID_COACH_NAME_LENGTH.getMessage()); + } + } +} From 28b10f2b0b586543832cb6095bbd35919d267f9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:28:32 +0900 Subject: [PATCH 08/28] =?UTF-8?q?feat(Coaches):=20=EC=BD=94=EC=B9=98=20?= =?UTF-8?q?=EC=9D=B8=EC=9B=90=EC=88=98=20=EA=B2=80=EC=A6=9D=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=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/main/java/menu/domain/Coaches.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/menu/domain/Coaches.java diff --git a/src/main/java/menu/domain/Coaches.java b/src/main/java/menu/domain/Coaches.java new file mode 100644 index 000000000..d7e4af140 --- /dev/null +++ b/src/main/java/menu/domain/Coaches.java @@ -0,0 +1,25 @@ +package menu.domain; + +import menu.constant.ErrorMessage; + +import java.util.Collections; +import java.util.List; + +public class Coaches { + + private static final int MIN_COACH_NUM = 2; + private static final int MAX_COACH_NUM = 5; + private final List coaches; + + public Coaches(final List coaches) { + validateSize(coaches); + this.coaches = Collections.unmodifiableList(coaches); + } + + private void validateSize(final List coaches) { + final int size = coaches.size(); + if (size < MIN_COACH_NUM || size > MAX_COACH_NUM) { + throw new IllegalArgumentException(ErrorMessage.INVALID_COACH_NUM.getMessage()); + } + } +} From cadf4c78bbceff0d2cfa6a54955a259c6758bd3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:29:46 +0900 Subject: [PATCH 09/28] =?UTF-8?q?feat(InputValidator):=20=EC=89=BC?= =?UTF-8?q?=ED=91=9C=20=EA=B5=AC=EB=B6=84=EC=9E=90=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 7 +++++++ src/main/java/menu/io/InputValidator.java | 14 ++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/java/menu/io/InputValidator.java diff --git a/docs/README.md b/docs/README.md index 294d0e2a9..b3ce3796a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -26,6 +26,13 @@ - printStart() - printCoachNameRequest() +- Coach + +- Coaches + +- InputValidator + - validateInputDelimiter() + ## 열거형 목록 - GameMessage - ErrorMessage diff --git a/src/main/java/menu/io/InputValidator.java b/src/main/java/menu/io/InputValidator.java new file mode 100644 index 000000000..e7ea42246 --- /dev/null +++ b/src/main/java/menu/io/InputValidator.java @@ -0,0 +1,14 @@ +package menu.io; + +import menu.constant.ErrorMessage; + +public class InputValidator { + + private static final String INPUT_DELIMITER = ","; + + public void validateInputDelimiter(final String input) { + if (input.startsWith(INPUT_DELIMITER) || input.endsWith(INPUT_DELIMITER)) { + throw new IllegalArgumentException(ErrorMessage.INVALID_INPUT_DELIMITER_USAGE.getMessage()); + } + } +} From c125095a1a1226c17efbb8fb64d55a2c3dce26cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:30:03 +0900 Subject: [PATCH 10/28] =?UTF-8?q?feat(InputView):=20=EC=BD=94=EC=B9=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/menu/io/InputView.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/menu/io/InputView.java diff --git a/src/main/java/menu/io/InputView.java b/src/main/java/menu/io/InputView.java new file mode 100644 index 000000000..1fd069a9f --- /dev/null +++ b/src/main/java/menu/io/InputView.java @@ -0,0 +1,14 @@ +package menu.io; + +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + + private final InputValidator inputValidator = new InputValidator(); + + public String readCoachNames() { + final String input = Console.readLine(); + inputValidator.validateInputDelimiter(input); + return input; + } +} From a2192b87f4a2a8e6a0e17509b4438b2f1ed11191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:31:10 +0900 Subject: [PATCH 11/28] =?UTF-8?q?feat(InputManager):=20=EC=BD=94=EC=B9=98?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EC=9E=AC=EC=8B=9C=EB=8F=84=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 --- docs/README.md | 6 ++++ src/main/java/menu/constant/ErrorMessage.java | 4 ++- src/main/java/menu/io/InputManager.java | 33 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/java/menu/io/InputManager.java diff --git a/docs/README.md b/docs/README.md index b3ce3796a..29891668c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -33,6 +33,12 @@ - InputValidator - validateInputDelimiter() +- InputView + - readCoachNames() + +- InputManager + - readCoachNames() + ## 열거형 목록 - GameMessage - ErrorMessage diff --git a/src/main/java/menu/constant/ErrorMessage.java b/src/main/java/menu/constant/ErrorMessage.java index 3b86a6bfe..5607474da 100644 --- a/src/main/java/menu/constant/ErrorMessage.java +++ b/src/main/java/menu/constant/ErrorMessage.java @@ -1,7 +1,9 @@ package menu.constant; public enum ErrorMessage { - INVALID_COACH_NAME_LENGTH("코치 이름 길이가 잘못되었습니다."); + INVALID_COACH_NAME_LENGTH("코치 이름 길이가 잘못되었습니다."), + INVALID_COACH_NUM("코치의 인원수가 잘못되었습니다."), + INVALID_INPUT_DELIMITER_USAGE("쉼표는 맨 처음이나 끝에 올 수 없습니다."); private static final String ERROR_PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/menu/io/InputManager.java b/src/main/java/menu/io/InputManager.java new file mode 100644 index 000000000..f585ff7b8 --- /dev/null +++ b/src/main/java/menu/io/InputManager.java @@ -0,0 +1,33 @@ +package menu.io; + +import menu.domain.Coach; +import menu.domain.Coaches; + +import java.util.Arrays; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public class InputManager { + + private static final String INPUT_DELIMITER = ","; + private final InputView inputView = new InputView(); + + public Coaches readCoachNames() { + return read(() -> { + final String input = inputView.readCoachNames(); + return new Coaches(Arrays.stream(input.split(INPUT_DELIMITER)) + .map(Coach::new) + .collect(Collectors.toList())); + }); + } + + private T read(final Supplier supplier) { + while (true) { + try { + return supplier.get(); + } catch (final IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } +} From 350d75210f286ddf2069e7d73796f60632cecf39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:34:16 +0900 Subject: [PATCH 12/28] =?UTF-8?q?feat(MenuService):=20=EC=BD=94=EC=B9=98?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=81=B4=EB=9E=98=EC=8A=A4=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 --- docs/README.md | 6 ++++++ src/main/java/menu/service/MenuService.java | 13 +++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 src/main/java/menu/service/MenuService.java diff --git a/docs/README.md b/docs/README.md index 29891668c..033ebdc63 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,6 +39,12 @@ - InputManager - readCoachNames() +- MenuService + - saveCoaches() + +- MenuRepository + - saveCoaches() + ## 열거형 목록 - GameMessage - ErrorMessage diff --git a/src/main/java/menu/service/MenuService.java b/src/main/java/menu/service/MenuService.java new file mode 100644 index 000000000..7dd441410 --- /dev/null +++ b/src/main/java/menu/service/MenuService.java @@ -0,0 +1,13 @@ +package menu.service; + +import menu.domain.Coaches; +import menu.repository.MenuRepository; + +public class MenuService { + + private final MenuRepository menuRepository = new MenuRepository(); + + public void saveCoaches(final Coaches coaches) { + menuRepository.saveCoaches(coaches); + } +} From c76f95a5dc2f56d4dc695493bb05430d5c2bc4c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:34:36 +0900 Subject: [PATCH 13/28] =?UTF-8?q?feat(MenuRepository):=20=EC=BD=94?= =?UTF-8?q?=EC=B9=98=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=EC=86=8C=20=ED=81=B4=EB=9E=98=EC=8A=A4=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 --- src/main/java/menu/repository/MenuRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/menu/repository/MenuRepository.java diff --git a/src/main/java/menu/repository/MenuRepository.java b/src/main/java/menu/repository/MenuRepository.java new file mode 100644 index 000000000..c4912060e --- /dev/null +++ b/src/main/java/menu/repository/MenuRepository.java @@ -0,0 +1,12 @@ +package menu.repository; + +import menu.domain.Coaches; + +public class MenuRepository { + + private Coaches coaches; + + public void saveCoaches(final Coaches coaches) { + this.coaches = coaches; + } +} From f6482f03b4021532983c8d61e2b893f3fb0a9343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:35:16 +0900 Subject: [PATCH 14/28] =?UTF-8?q?feat:=20=EC=BD=94=EC=B9=98=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EA=B0=92=20=EC=A0=80=EC=9E=A5=EC=86=8C=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++++----- src/main/java/menu/controller/MenuController.java | 7 +++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index 033ebdc63..e9f7b612c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,11 +1,11 @@ ## 기능 목록 - [x] 시작 메시지 출력 - [x] 코치 이름 입력 요청 메시지 출력 -- [ ] 코치 이름 입력 - - [ ] 코치 이름 입력값 쉼표로 구분됐는지 검증 - - [ ] 코치 이름 길이 2 ~ 4 사이인지 검증 - - [ ] 코치 5명 이하인지 검증 - - [ ] 잘못된 입력시 에러 메시지 출력 및 재시도 +- [x] 코치 이름 입력 + - [x] 코치 이름 입력값 쉼표로 구분됐는지 검증 + - [x] 코치 이름 길이 2 ~ 4 사이인지 검증 + - [x] 코치 5명 이하인지 검증 + - [x] 잘못된 입력시 에러 메시지 출력 및 재시도 - [ ] 코치별 못 먹는 메뉴 입력 요청 메시지 출력 - [ ] 코치별 못 먹는 메뉴 입력 - [ ] 개수 0 ~ 2개 사이인지 검증 diff --git a/src/main/java/menu/controller/MenuController.java b/src/main/java/menu/controller/MenuController.java index 58bfc17e7..6467e7d33 100644 --- a/src/main/java/menu/controller/MenuController.java +++ b/src/main/java/menu/controller/MenuController.java @@ -1,10 +1,15 @@ package menu.controller; +import menu.domain.Coaches; +import menu.io.InputManager; import menu.io.OutputView; +import menu.service.MenuService; public class MenuController { private final OutputView outputView = new OutputView(); + private final InputManager inputManager = new InputManager(); + private final MenuService menuService = new MenuService(); public void run() { outputView.printStart(); @@ -13,5 +18,7 @@ public void run() { private void createCoach() { outputView.printCoachNameRequest(); + final Coaches coaches = inputManager.readCoachNames(); + menuService.saveCoaches(coaches); } } From b1e4ced128b94650ded093bbae99095464f6c53e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:43:06 +0900 Subject: [PATCH 15/28] =?UTF-8?q?feat:=20=EC=BD=94=EC=B9=98=EB=B3=84=20?= =?UTF-8?q?=EB=AA=BB=EB=A8=B9=EB=8A=94=20=EB=A9=94=EB=89=B4=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=9A=94=EC=B2=AD=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 ++++- src/main/java/menu/constant/GameMessage.java | 3 ++- .../java/menu/controller/MenuController.java | 14 +++++++++++--- src/main/java/menu/domain/Coach.java | 4 ++++ src/main/java/menu/domain/Coaches.java | 16 ++++++++++++++++ src/main/java/menu/io/OutputView.java | 4 ++++ .../java/menu/repository/MenuRepository.java | 3 ++- src/main/java/menu/service/MenuService.java | 4 ++-- 8 files changed, 45 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index e9f7b612c..aced2ed19 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,7 +6,7 @@ - [x] 코치 이름 길이 2 ~ 4 사이인지 검증 - [x] 코치 5명 이하인지 검증 - [x] 잘못된 입력시 에러 메시지 출력 및 재시도 -- [ ] 코치별 못 먹는 메뉴 입력 요청 메시지 출력 +- [x] 코치별 못 먹는 메뉴 입력 요청 메시지 출력 - [ ] 코치별 못 먹는 메뉴 입력 - [ ] 개수 0 ~ 2개 사이인지 검증 - [ ] 메뉴 목록에 포함된 메뉴인지 검증 @@ -27,8 +27,11 @@ - printCoachNameRequest() - Coach + - getName() - Coaches + - getNextCoachName() + - hasNext() - InputValidator - validateInputDelimiter() diff --git a/src/main/java/menu/constant/GameMessage.java b/src/main/java/menu/constant/GameMessage.java index 08e218fc9..b19b09ce9 100644 --- a/src/main/java/menu/constant/GameMessage.java +++ b/src/main/java/menu/constant/GameMessage.java @@ -2,7 +2,8 @@ public enum GameMessage { START("점심 메뉴 추천을 시작합니다."), - COACH_NAME_REQUEST("코치의 이름을 입력해 주세요. (, 로 구분)"); + COACH_NAME_REQUEST("코치의 이름을 입력해 주세요. (, 로 구분)"), + COACH_HATE_MENU_REQUEST("%s(이)가 못 먹는 메뉴를 입력해 주세요."); private final String message; diff --git a/src/main/java/menu/controller/MenuController.java b/src/main/java/menu/controller/MenuController.java index 6467e7d33..192c1ca5b 100644 --- a/src/main/java/menu/controller/MenuController.java +++ b/src/main/java/menu/controller/MenuController.java @@ -13,12 +13,20 @@ public class MenuController { public void run() { outputView.printStart(); - createCoach(); + final Coaches coaches = createCoach(); + createHateMenu(coaches); } - private void createCoach() { + private void createHateMenu(final Coaches coaches) { + while (coaches.hasNext()) { + final String coachName = coaches.getNextCoachName(); + outputView.printCoachHateMenuRequest(coachName); + } + } + + private Coaches createCoach() { outputView.printCoachNameRequest(); final Coaches coaches = inputManager.readCoachNames(); - menuService.saveCoaches(coaches); + return menuService.saveCoaches(coaches); } } diff --git a/src/main/java/menu/domain/Coach.java b/src/main/java/menu/domain/Coach.java index 1eecd2cb1..f07dd0790 100644 --- a/src/main/java/menu/domain/Coach.java +++ b/src/main/java/menu/domain/Coach.java @@ -19,4 +19,8 @@ private void validateName(final String name) { throw new IllegalArgumentException(ErrorMessage.INVALID_COACH_NAME_LENGTH.getMessage()); } } + + public String getName() { + return this.name; + } } diff --git a/src/main/java/menu/domain/Coaches.java b/src/main/java/menu/domain/Coaches.java index d7e4af140..6c959b527 100644 --- a/src/main/java/menu/domain/Coaches.java +++ b/src/main/java/menu/domain/Coaches.java @@ -10,6 +10,7 @@ public class Coaches { private static final int MIN_COACH_NUM = 2; private static final int MAX_COACH_NUM = 5; private final List coaches; + private int currentIndex = 0; public Coaches(final List coaches) { validateSize(coaches); @@ -22,4 +23,19 @@ private void validateSize(final List coaches) { throw new IllegalArgumentException(ErrorMessage.INVALID_COACH_NUM.getMessage()); } } + + public String getNextCoachName() { + checkCurrentIndex(); + return coaches.get(currentIndex++).getName(); + } + + private void checkCurrentIndex() { + if (hasNext()) { + currentIndex = 0; + } + } + + public boolean hasNext() { + return currentIndex == coaches.size(); + } } diff --git a/src/main/java/menu/io/OutputView.java b/src/main/java/menu/io/OutputView.java index b5d44fc41..1977df814 100644 --- a/src/main/java/menu/io/OutputView.java +++ b/src/main/java/menu/io/OutputView.java @@ -11,4 +11,8 @@ public void printStart() { public void printCoachNameRequest() { System.out.println(GameMessage.COACH_NAME_REQUEST.getMessage()); } + + public void printCoachHateMenuRequest(final String coachName) { + System.out.println(String.format(GameMessage.COACH_HATE_MENU_REQUEST.getMessage())); + } } diff --git a/src/main/java/menu/repository/MenuRepository.java b/src/main/java/menu/repository/MenuRepository.java index c4912060e..1d256fab5 100644 --- a/src/main/java/menu/repository/MenuRepository.java +++ b/src/main/java/menu/repository/MenuRepository.java @@ -6,7 +6,8 @@ public class MenuRepository { private Coaches coaches; - public void saveCoaches(final Coaches coaches) { + public Coaches saveCoaches(final Coaches coaches) { this.coaches = coaches; + return this.coaches; } } diff --git a/src/main/java/menu/service/MenuService.java b/src/main/java/menu/service/MenuService.java index 7dd441410..c3a776a75 100644 --- a/src/main/java/menu/service/MenuService.java +++ b/src/main/java/menu/service/MenuService.java @@ -7,7 +7,7 @@ public class MenuService { private final MenuRepository menuRepository = new MenuRepository(); - public void saveCoaches(final Coaches coaches) { - menuRepository.saveCoaches(coaches); + public Coaches saveCoaches(final Coaches coaches) { + return menuRepository.saveCoaches(coaches); } } From 4c83baa2c89ca8e6ec189e8c79f46404e6258c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:53:14 +0900 Subject: [PATCH 16/28] =?UTF-8?q?feat(Menu):=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=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/menu/domain/Menu.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/menu/domain/Menu.java diff --git a/src/main/java/menu/domain/Menu.java b/src/main/java/menu/domain/Menu.java new file mode 100644 index 000000000..d850ae3b5 --- /dev/null +++ b/src/main/java/menu/domain/Menu.java @@ -0,0 +1,9 @@ +package menu.domain; + +public class Menu { + private final String name; + + public Menu(final String name) { + this.name = name; + } +} From b9b916eb4c03c3fca64c8fb8b6e624320cf09656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:54:06 +0900 Subject: [PATCH 17/28] =?UTF-8?q?feat(HateMenus):=20=EC=BD=94=EC=B9=98?= =?UTF-8?q?=EC=9D=98=20=EB=AA=BB=EB=A8=B9=EB=8A=94=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EA=B2=80=EC=A6=9D=20=EB=B0=8F=20=EC=9D=BC?= =?UTF-8?q?=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=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 | 8 ++++++-- src/main/java/menu/domain/HateMenus.java | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/main/java/menu/domain/HateMenus.java diff --git a/docs/README.md b/docs/README.md index aced2ed19..7ddc5e217 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,9 +8,9 @@ - [x] 잘못된 입력시 에러 메시지 출력 및 재시도 - [x] 코치별 못 먹는 메뉴 입력 요청 메시지 출력 - [ ] 코치별 못 먹는 메뉴 입력 - - [ ] 개수 0 ~ 2개 사이인지 검증 + - [x] 개수 0 ~ 2개 사이인지 검증 - [ ] 메뉴 목록에 포함된 메뉴인지 검증 - - [ ] 잘못된 입력시 에러 메시지 출력 및 재시도 + - [x] 잘못된 입력시 에러 메시지 출력 및 재시도 - [ ] 메뉴 추천 - [ ] 랜덤 메뉴 생성 - [ ] 한 주에 같은 카테고리 최대 2회인지 검증 @@ -48,6 +48,10 @@ - MenuRepository - saveCoaches() +- Menu + +- HateMenus + ## 열거형 목록 - GameMessage - ErrorMessage diff --git a/src/main/java/menu/domain/HateMenus.java b/src/main/java/menu/domain/HateMenus.java new file mode 100644 index 000000000..b03699f1e --- /dev/null +++ b/src/main/java/menu/domain/HateMenus.java @@ -0,0 +1,23 @@ +package menu.domain; + +import menu.constant.ErrorMessage; + +import java.util.List; +import java.util.stream.Collectors; + +public class HateMenus { + + private static final int MAX_HATE_MENU_SIZE = 2; + private final List menus; + + public HateMenus(final List menus) { + validateSize(menus); + this.menus = menus.stream().map(Menu::new).collect(Collectors.toList()); + } + + private void validateSize(final List menus) { + if (menus.size() > MAX_HATE_MENU_SIZE) { + throw new IllegalArgumentException(ErrorMessage.INVALID_MENU_SIZE.getMessage()); + } + } +} From 7a31f14135022dab92d07ceab67d8674b13a7d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 18 Sep 2023 23:54:21 +0900 Subject: [PATCH 18/28] =?UTF-8?q?feat:=20=EC=BD=94=EC=B9=98=20=EB=AA=BB?= =?UTF-8?q?=EB=A8=B9=EB=8A=94=20=EC=9D=8C=EC=8B=9D=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/menu/constant/ErrorMessage.java | 3 ++- src/main/java/menu/controller/MenuController.java | 2 ++ src/main/java/menu/io/InputManager.java | 5 +++++ src/main/java/menu/io/InputValidator.java | 7 +++++++ src/main/java/menu/io/InputView.java | 6 ++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/menu/constant/ErrorMessage.java b/src/main/java/menu/constant/ErrorMessage.java index 5607474da..42c76d6cc 100644 --- a/src/main/java/menu/constant/ErrorMessage.java +++ b/src/main/java/menu/constant/ErrorMessage.java @@ -3,7 +3,8 @@ public enum ErrorMessage { INVALID_COACH_NAME_LENGTH("코치 이름 길이가 잘못되었습니다."), INVALID_COACH_NUM("코치의 인원수가 잘못되었습니다."), - INVALID_INPUT_DELIMITER_USAGE("쉼표는 맨 처음이나 끝에 올 수 없습니다."); + INVALID_INPUT_DELIMITER_USAGE("쉼표는 맨 처음이나 끝에 올 수 없습니다."), + INVALID_MENU_SIZE("못 먹는 메뉴의 개수가 잘못되었습니다."); private static final String ERROR_PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/menu/controller/MenuController.java b/src/main/java/menu/controller/MenuController.java index 192c1ca5b..0ace1cbb7 100644 --- a/src/main/java/menu/controller/MenuController.java +++ b/src/main/java/menu/controller/MenuController.java @@ -1,6 +1,7 @@ package menu.controller; import menu.domain.Coaches; +import menu.domain.HateMenus; import menu.io.InputManager; import menu.io.OutputView; import menu.service.MenuService; @@ -21,6 +22,7 @@ private void createHateMenu(final Coaches coaches) { while (coaches.hasNext()) { final String coachName = coaches.getNextCoachName(); outputView.printCoachHateMenuRequest(coachName); + final HateMenus hateMenus = inputManager.readCoachHateMenu(); } } diff --git a/src/main/java/menu/io/InputManager.java b/src/main/java/menu/io/InputManager.java index f585ff7b8..131300e89 100644 --- a/src/main/java/menu/io/InputManager.java +++ b/src/main/java/menu/io/InputManager.java @@ -2,6 +2,7 @@ import menu.domain.Coach; import menu.domain.Coaches; +import menu.domain.HateMenus; import java.util.Arrays; import java.util.function.Supplier; @@ -21,6 +22,10 @@ public Coaches readCoachNames() { }); } + public HateMenus readCoachHateMenu() { + return read(() -> new HateMenus(Arrays.asList(inputView.readHateMenus().split(INPUT_DELIMITER)))); + } + private T read(final Supplier supplier) { while (true) { try { diff --git a/src/main/java/menu/io/InputValidator.java b/src/main/java/menu/io/InputValidator.java index e7ea42246..38905c259 100644 --- a/src/main/java/menu/io/InputValidator.java +++ b/src/main/java/menu/io/InputValidator.java @@ -6,6 +6,13 @@ public class InputValidator { private static final String INPUT_DELIMITER = ","; + public void validateHateMenus(final String input) { + if (input.isEmpty()) { + return; + } + validateInputDelimiter(input); + } + public void validateInputDelimiter(final String input) { if (input.startsWith(INPUT_DELIMITER) || input.endsWith(INPUT_DELIMITER)) { throw new IllegalArgumentException(ErrorMessage.INVALID_INPUT_DELIMITER_USAGE.getMessage()); diff --git a/src/main/java/menu/io/InputView.java b/src/main/java/menu/io/InputView.java index 1fd069a9f..15c6d1d2b 100644 --- a/src/main/java/menu/io/InputView.java +++ b/src/main/java/menu/io/InputView.java @@ -11,4 +11,10 @@ public String readCoachNames() { inputValidator.validateInputDelimiter(input); return input; } + + public String readHateMenus() { + final String input = Console.readLine(); + inputValidator.validateHateMenus(input); + return input; + } } From 59c2de3b7568daf8abf1ccd6acad0cb75a97093e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 00:04:07 +0900 Subject: [PATCH 19/28] =?UTF-8?q?feat(MenuCategory):=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=97=B4=EA=B1=B0?= =?UTF-8?q?=ED=98=95=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 + src/main/java/menu/constant/MenuCategory.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/main/java/menu/constant/MenuCategory.java diff --git a/docs/README.md b/docs/README.md index 7ddc5e217..0ca61ceec 100644 --- a/docs/README.md +++ b/docs/README.md @@ -55,3 +55,4 @@ ## 열거형 목록 - GameMessage - ErrorMessage +- MenuCategory diff --git a/src/main/java/menu/constant/MenuCategory.java b/src/main/java/menu/constant/MenuCategory.java new file mode 100644 index 000000000..920d7c77c --- /dev/null +++ b/src/main/java/menu/constant/MenuCategory.java @@ -0,0 +1,25 @@ +package menu.constant; + +import java.util.Arrays; +import java.util.List; + +public enum MenuCategory { + JAPANESE_FOOD("일식", List.of("규동", "우동", "미소시루", "스시", "가츠동", "오니기리", "하이라이스", "라멘", "오코노미야끼")), + KOREAN_FOOD("한식", List.of("김밥", "김치찌개", "쌈밥", "된장찌개", "비빔밥", "칼국수", "불고기", "떡볶이", "제육볶음")), + CHINESE_FOOD("중식", List.of("깐풍기", "볶음면", "동파육", "짜장면", "짬뽕", "마파두부", "탕수육", "토마토 달걀볶음", "고추잡채")), + ASIAN_FOOD("아시안", List.of("팟타이", "카오 팟", "나시고렝", "파인애플 볶음밥", "쌀국수", "똠얌꿍", "반미", "월남쌈", "분짜")), + WESTERN_FOOD("양식", List.of("라자냐", "그라탱", "뇨끼", "끼슈", "프렌치 토스트", "바게트", "스파게티", "피자", "파니니")); + + private final String category; + private final List menus; + + MenuCategory(final String category, final List menus) { + this.category = category; + this.menus = menus; + } + + public static boolean isNotExistMenu(final String menuName) { + return Arrays.stream(values()) + .noneMatch(mc -> mc.menus.contains(menuName)); + } +} From f283e6b118c4fbcdeaf7492dfb055d3af2f78115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 00:04:45 +0900 Subject: [PATCH 20/28] =?UTF-8?q?feat:=20=EC=A1=B4=EC=9E=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EB=89=B4=EC=9D=B8=EC=A7=80=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- src/main/java/menu/constant/ErrorMessage.java | 3 ++- src/main/java/menu/domain/Menu.java | 10 ++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0ca61ceec..d592445d6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,9 +7,9 @@ - [x] 코치 5명 이하인지 검증 - [x] 잘못된 입력시 에러 메시지 출력 및 재시도 - [x] 코치별 못 먹는 메뉴 입력 요청 메시지 출력 -- [ ] 코치별 못 먹는 메뉴 입력 +- [x] 코치별 못 먹는 메뉴 입력 - [x] 개수 0 ~ 2개 사이인지 검증 - - [ ] 메뉴 목록에 포함된 메뉴인지 검증 + - [x] 메뉴 목록에 포함된 메뉴인지 검증 - [x] 잘못된 입력시 에러 메시지 출력 및 재시도 - [ ] 메뉴 추천 - [ ] 랜덤 메뉴 생성 diff --git a/src/main/java/menu/constant/ErrorMessage.java b/src/main/java/menu/constant/ErrorMessage.java index 42c76d6cc..125f70768 100644 --- a/src/main/java/menu/constant/ErrorMessage.java +++ b/src/main/java/menu/constant/ErrorMessage.java @@ -4,7 +4,8 @@ public enum ErrorMessage { INVALID_COACH_NAME_LENGTH("코치 이름 길이가 잘못되었습니다."), INVALID_COACH_NUM("코치의 인원수가 잘못되었습니다."), INVALID_INPUT_DELIMITER_USAGE("쉼표는 맨 처음이나 끝에 올 수 없습니다."), - INVALID_MENU_SIZE("못 먹는 메뉴의 개수가 잘못되었습니다."); + INVALID_MENU_SIZE("못 먹는 메뉴의 개수가 잘못되었습니다."), + INVALID_MENU_NAME("존재하지 않는 메뉴입니다."); private static final String ERROR_PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/menu/domain/Menu.java b/src/main/java/menu/domain/Menu.java index d850ae3b5..c5a69d4be 100644 --- a/src/main/java/menu/domain/Menu.java +++ b/src/main/java/menu/domain/Menu.java @@ -1,9 +1,19 @@ package menu.domain; +import menu.constant.ErrorMessage; +import menu.constant.MenuCategory; + public class Menu { private final String name; public Menu(final String name) { + validateName(name); this.name = name; } + + private void validateName(final String name) { + if (MenuCategory.isNotExistMenu(name)) { + throw new IllegalArgumentException(ErrorMessage.INVALID_MENU_NAME.getMessage()); + } + } } From bf2a11bedcc32991054e23dbfb09044d492f7bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 00:11:13 +0900 Subject: [PATCH 21/28] =?UTF-8?q?feat:=20=EC=BD=94=EC=B9=98=20=EB=AA=BB?= =?UTF-8?q?=EB=A8=B9=EB=8A=94=20=EB=A9=94=EB=89=B4=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 3 +++ src/main/java/menu/constant/ErrorMessage.java | 3 ++- src/main/java/menu/controller/MenuController.java | 1 + src/main/java/menu/domain/Coach.java | 9 +++++++++ src/main/java/menu/domain/Coaches.java | 7 +++++++ src/main/java/menu/repository/MenuRepository.java | 4 ++++ src/main/java/menu/service/MenuService.java | 7 +++++++ 7 files changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index d592445d6..edeb7ec0f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,10 +28,13 @@ - Coach - getName() + - hasName() + - updateHateMenus() - Coaches - getNextCoachName() - hasNext() + - findByName() - InputValidator - validateInputDelimiter() diff --git a/src/main/java/menu/constant/ErrorMessage.java b/src/main/java/menu/constant/ErrorMessage.java index 125f70768..47813329d 100644 --- a/src/main/java/menu/constant/ErrorMessage.java +++ b/src/main/java/menu/constant/ErrorMessage.java @@ -5,7 +5,8 @@ public enum ErrorMessage { INVALID_COACH_NUM("코치의 인원수가 잘못되었습니다."), INVALID_INPUT_DELIMITER_USAGE("쉼표는 맨 처음이나 끝에 올 수 없습니다."), INVALID_MENU_SIZE("못 먹는 메뉴의 개수가 잘못되었습니다."), - INVALID_MENU_NAME("존재하지 않는 메뉴입니다."); + INVALID_MENU_NAME("존재하지 않는 메뉴입니다."), + INVALID_COACH_NAME("존재하지 않는 코치 이름입니다."); private static final String ERROR_PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/menu/controller/MenuController.java b/src/main/java/menu/controller/MenuController.java index 0ace1cbb7..7a962b04f 100644 --- a/src/main/java/menu/controller/MenuController.java +++ b/src/main/java/menu/controller/MenuController.java @@ -23,6 +23,7 @@ private void createHateMenu(final Coaches coaches) { final String coachName = coaches.getNextCoachName(); outputView.printCoachHateMenuRequest(coachName); final HateMenus hateMenus = inputManager.readCoachHateMenu(); + menuService.updateHateMenus(coachName, hateMenus); } } diff --git a/src/main/java/menu/domain/Coach.java b/src/main/java/menu/domain/Coach.java index f07dd0790..3c721c23f 100644 --- a/src/main/java/menu/domain/Coach.java +++ b/src/main/java/menu/domain/Coach.java @@ -7,6 +7,7 @@ public class Coach { private static final int MIN_NAME_LENGTH = 2; private static final int MAX_NAME_LENGTH = 4; private final String name; + private HateMenus hateMenus; public Coach(final String name) { validateName(name); @@ -23,4 +24,12 @@ private void validateName(final String name) { public String getName() { return this.name; } + + public boolean hasName(final String coachName) { + return this.name.equals(coachName); + } + + public void updateHateMenus(final HateMenus hateMenus) { + this.hateMenus = hateMenus; + } } diff --git a/src/main/java/menu/domain/Coaches.java b/src/main/java/menu/domain/Coaches.java index 6c959b527..768471d76 100644 --- a/src/main/java/menu/domain/Coaches.java +++ b/src/main/java/menu/domain/Coaches.java @@ -38,4 +38,11 @@ private void checkCurrentIndex() { public boolean hasNext() { return currentIndex == coaches.size(); } + + public Coach findByName(final String coachName) { + return this.coaches.stream() + .filter(coach -> coach.hasName(coachName)) + .findAny() + .orElseThrow(() -> new IllegalStateException(ErrorMessage.INVALID_COACH_NAME.getMessage())); + } } diff --git a/src/main/java/menu/repository/MenuRepository.java b/src/main/java/menu/repository/MenuRepository.java index 1d256fab5..5f11f6974 100644 --- a/src/main/java/menu/repository/MenuRepository.java +++ b/src/main/java/menu/repository/MenuRepository.java @@ -10,4 +10,8 @@ public Coaches saveCoaches(final Coaches coaches) { this.coaches = coaches; return this.coaches; } + + public Coaches findCoaches() { + return this.coaches; + } } diff --git a/src/main/java/menu/service/MenuService.java b/src/main/java/menu/service/MenuService.java index c3a776a75..aa93d84de 100644 --- a/src/main/java/menu/service/MenuService.java +++ b/src/main/java/menu/service/MenuService.java @@ -1,6 +1,8 @@ package menu.service; +import menu.domain.Coach; import menu.domain.Coaches; +import menu.domain.HateMenus; import menu.repository.MenuRepository; public class MenuService { @@ -10,4 +12,9 @@ public class MenuService { public Coaches saveCoaches(final Coaches coaches) { return menuRepository.saveCoaches(coaches); } + + public void updateHateMenus(final String coachName, final HateMenus hateMenus) { + final Coach coach = menuRepository.findCoaches().findByName(coachName); + coach.updateHateMenus(hateMenus); + } } From e0e44c1f133395b5a1f344d753f998707fca2ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 00:56:59 +0900 Subject: [PATCH 22/28] =?UTF-8?q?feat(RandomMenuGenerator):=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=20=EB=A9=94=EB=89=B4=20=EC=83=9D=EC=84=B1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/menu/utils/RandomMenuGenerator.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/main/java/menu/utils/RandomMenuGenerator.java diff --git a/src/main/java/menu/utils/RandomMenuGenerator.java b/src/main/java/menu/utils/RandomMenuGenerator.java new file mode 100644 index 000000000..bc38ab1f9 --- /dev/null +++ b/src/main/java/menu/utils/RandomMenuGenerator.java @@ -0,0 +1,47 @@ +package menu.utils; + +import camp.nextstep.edu.missionutils.Randoms; +import menu.constant.MenuCategory; +import menu.domain.*; + +import java.util.List; + +public class RandomMenuGenerator { + + private static final int MIN_CATEGORY_INDEX = 1; + private static final int MAX_CATEGORY_INDEX = 5; + private static final int RECOMMEND_INDEX = 0; + + public RecommendResult generateMenus(final Coaches coaches) { + final MenuCategories menuCategories = new MenuCategories(); + recommendAllDay(coaches, menuCategories); + return new RecommendResult(coaches, menuCategories); + } + + private void recommendAllDay(final Coaches coaches, final MenuCategories menuCategories) { + while (menuCategories.needNext()) { + final MenuCategory menuCategory = generateRandomCategory(); + if (!menuCategories.hasMaxNum(menuCategory)) { + recommendAllCoaches(coaches, menuCategory, menuCategories); + } + } + } + + private void recommendAllCoaches(final Coaches coaches, final MenuCategory menuCategory, final MenuCategories menuCategories) { + while(coaches.hasNext()) { + final Coach coach = coaches.getNextCoach(); + final HateMenus hateMenus = coach.getHateMenus(); + final List menus = menuCategory.getMenusFiltered(hateMenus); + final String recommendedMenu = getRecommendedMenu(menus); + menuCategories.addRecommendedMenu(coach, recommendedMenu, menuCategory); + } + } + + private String getRecommendedMenu(final List menus) { + return Randoms.shuffle(menus).get(RECOMMEND_INDEX); + } + + private MenuCategory generateRandomCategory() { + return MenuCategory.getByIndex(Randoms.pickNumberInRange(MIN_CATEGORY_INDEX, MAX_CATEGORY_INDEX)); + } +} From b48eea2152244ada073664e72c9e223bb0112fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 00:57:30 +0900 Subject: [PATCH 23/28] =?UTF-8?q?feat(MenuCategories):=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EB=90=9C=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EC=9D=BC=EA=B8=89=20=EC=BB=AC=EB=A0=89?= =?UTF-8?q?=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/menu/domain/MenuCategories.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/menu/domain/MenuCategories.java diff --git a/src/main/java/menu/domain/MenuCategories.java b/src/main/java/menu/domain/MenuCategories.java new file mode 100644 index 000000000..6b78f1d48 --- /dev/null +++ b/src/main/java/menu/domain/MenuCategories.java @@ -0,0 +1,30 @@ +package menu.domain; + +import menu.constant.MenuCategory; + +import java.util.ArrayList; +import java.util.List; + +public class MenuCategories { + + private static final Long MAX_COUNT = 2L; + private static final Integer DAY_COUNT = 5; + private final List menuCategories = new ArrayList<>(); + + public boolean hasMaxNum(final MenuCategory menuCategory) { + return menuCategories.stream() + .filter(menuCategory::equals) + .count() == MAX_COUNT; + } + + public void addRecommendedMenu(final Coach coach, final String menus, final MenuCategory menuCategory) { + if (!menuCategories.contains(menuCategory)) { + menuCategories.add(menuCategory); + } + coach.updateRecommendedMenus(menus); + } + + public boolean needNext() { + return menuCategories.size() < DAY_COUNT; + } +} From 774a8c060f0feba762ca396985b28f5c2bb2f5b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 00:58:52 +0900 Subject: [PATCH 24/28] =?UTF-8?q?feat:=20=EC=B6=94=EC=B2=9C=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=8F=84=EB=A9=94=EC=9D=B8=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 | 17 +++++++++++++++++ src/main/java/menu/domain/Coach.java | 11 +++++++++++ src/main/java/menu/domain/Coaches.java | 8 +++++++- src/main/java/menu/domain/RecommendedMenus.java | 16 ++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/main/java/menu/domain/RecommendedMenus.java diff --git a/docs/README.md b/docs/README.md index edeb7ec0f..0adb0351d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,11 +30,15 @@ - getName() - hasName() - updateHateMenus() + - getHateMenus() + - updateRecommendedMenus() - Coaches - getNextCoachName() - hasNext() - findByName() + - initIndex() + - getNextCoach() - InputValidator - validateInputDelimiter() @@ -55,6 +59,19 @@ - HateMenus +- RandomMenuGenerator + +- RecommendedMenus + - addMenu() + +- MenuCategories + - hasMaxNum() + - addRecommendedMenus() + - needNext() + +- RecommendResult + - getResult() + ## 열거형 목록 - GameMessage - ErrorMessage diff --git a/src/main/java/menu/domain/Coach.java b/src/main/java/menu/domain/Coach.java index 3c721c23f..69c572d14 100644 --- a/src/main/java/menu/domain/Coach.java +++ b/src/main/java/menu/domain/Coach.java @@ -2,12 +2,15 @@ import menu.constant.ErrorMessage; +import java.util.List; + public class Coach { private static final int MIN_NAME_LENGTH = 2; private static final int MAX_NAME_LENGTH = 4; private final String name; private HateMenus hateMenus; + private RecommendedMenus recommendedMenus; public Coach(final String name) { validateName(name); @@ -32,4 +35,12 @@ public boolean hasName(final String coachName) { public void updateHateMenus(final HateMenus hateMenus) { this.hateMenus = hateMenus; } + + public HateMenus getHateMenus() { + return this.hateMenus; + } + + public void updateRecommendedMenus(final String menus) { + this.recommendedMenus.addMenu(menus); + } } diff --git a/src/main/java/menu/domain/Coaches.java b/src/main/java/menu/domain/Coaches.java index 768471d76..2666958a5 100644 --- a/src/main/java/menu/domain/Coaches.java +++ b/src/main/java/menu/domain/Coaches.java @@ -10,11 +10,12 @@ public class Coaches { private static final int MIN_COACH_NUM = 2; private static final int MAX_COACH_NUM = 5; private final List coaches; - private int currentIndex = 0; + private int currentIndex; public Coaches(final List coaches) { validateSize(coaches); this.coaches = Collections.unmodifiableList(coaches); + this.currentIndex = 0; } private void validateSize(final List coaches) { @@ -45,4 +46,9 @@ public Coach findByName(final String coachName) { .findAny() .orElseThrow(() -> new IllegalStateException(ErrorMessage.INVALID_COACH_NAME.getMessage())); } + + public Coach getNextCoach() { + checkCurrentIndex(); + return this.coaches.get(currentIndex++); + } } diff --git a/src/main/java/menu/domain/RecommendedMenus.java b/src/main/java/menu/domain/RecommendedMenus.java new file mode 100644 index 000000000..8e7604745 --- /dev/null +++ b/src/main/java/menu/domain/RecommendedMenus.java @@ -0,0 +1,16 @@ +package menu.domain; + +import java.util.ArrayList; +import java.util.List; + +public class RecommendedMenus { + private final List recommendedMenus; + + public RecommendedMenus() { + this.recommendedMenus = new ArrayList<>(); + } + + public void addMenu(final String menuName) { + recommendedMenus.add(new Menu(menuName)); + } +} From a48497e688b8dfae2f6ed3a464c0430d3f08df3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 00:59:26 +0900 Subject: [PATCH 25/28] =?UTF-8?q?feat(RecommendResult):=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=8F=84=EB=A9=94=EC=9D=B8=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/menu/domain/RecommendResult.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/menu/domain/RecommendResult.java diff --git a/src/main/java/menu/domain/RecommendResult.java b/src/main/java/menu/domain/RecommendResult.java new file mode 100644 index 000000000..ee5673812 --- /dev/null +++ b/src/main/java/menu/domain/RecommendResult.java @@ -0,0 +1,15 @@ +package menu.domain; + +public class RecommendResult { + private final Coaches coaches; + private final MenuCategories menuCategories; + + public RecommendResult(final Coaches coaches, final MenuCategories menuCategories) { + this.coaches = coaches; + this.menuCategories = menuCategories; + } + + public String getResult() { + return ""; + } +} From 96e1f8f074618c1e2786b1f945c49c61954f6807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 00:59:50 +0900 Subject: [PATCH 26/28] =?UTF-8?q?feat:=20=EB=A9=94=EB=89=B4=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 1 + src/main/java/menu/constant/ErrorMessage.java | 3 +- src/main/java/menu/constant/MenuCategory.java | 30 +++++++++++++++---- .../java/menu/controller/MenuController.java | 7 +++++ src/main/java/menu/domain/HateMenus.java | 6 ++++ src/main/java/menu/domain/Menu.java | 4 +++ src/main/java/menu/service/MenuService.java | 11 +++++-- 7 files changed, 52 insertions(+), 10 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0adb0351d..d2451b0a7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -56,6 +56,7 @@ - saveCoaches() - Menu + - getName() - HateMenus diff --git a/src/main/java/menu/constant/ErrorMessage.java b/src/main/java/menu/constant/ErrorMessage.java index 47813329d..cd72fae24 100644 --- a/src/main/java/menu/constant/ErrorMessage.java +++ b/src/main/java/menu/constant/ErrorMessage.java @@ -6,7 +6,8 @@ public enum ErrorMessage { INVALID_INPUT_DELIMITER_USAGE("쉼표는 맨 처음이나 끝에 올 수 없습니다."), INVALID_MENU_SIZE("못 먹는 메뉴의 개수가 잘못되었습니다."), INVALID_MENU_NAME("존재하지 않는 메뉴입니다."), - INVALID_COACH_NAME("존재하지 않는 코치 이름입니다."); + INVALID_COACH_NAME("존재하지 않는 코치 이름입니다."), + INVALID_CATEGORY_INDEX("카테고리 인덱스가 잘못되었습니다."); private static final String ERROR_PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/menu/constant/MenuCategory.java b/src/main/java/menu/constant/MenuCategory.java index 920d7c77c..96e9c894a 100644 --- a/src/main/java/menu/constant/MenuCategory.java +++ b/src/main/java/menu/constant/MenuCategory.java @@ -1,19 +1,24 @@ package menu.constant; +import menu.domain.HateMenus; + import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public enum MenuCategory { - JAPANESE_FOOD("일식", List.of("규동", "우동", "미소시루", "스시", "가츠동", "오니기리", "하이라이스", "라멘", "오코노미야끼")), - KOREAN_FOOD("한식", List.of("김밥", "김치찌개", "쌈밥", "된장찌개", "비빔밥", "칼국수", "불고기", "떡볶이", "제육볶음")), - CHINESE_FOOD("중식", List.of("깐풍기", "볶음면", "동파육", "짜장면", "짬뽕", "마파두부", "탕수육", "토마토 달걀볶음", "고추잡채")), - ASIAN_FOOD("아시안", List.of("팟타이", "카오 팟", "나시고렝", "파인애플 볶음밥", "쌀국수", "똠얌꿍", "반미", "월남쌈", "분짜")), - WESTERN_FOOD("양식", List.of("라자냐", "그라탱", "뇨끼", "끼슈", "프렌치 토스트", "바게트", "스파게티", "피자", "파니니")); + JAPANESE_FOOD(1, "일식", List.of("규동", "우동", "미소시루", "스시", "가츠동", "오니기리", "하이라이스", "라멘", "오코노미야끼")), + KOREAN_FOOD(2, "한식", List.of("김밥", "김치찌개", "쌈밥", "된장찌개", "비빔밥", "칼국수", "불고기", "떡볶이", "제육볶음")), + CHINESE_FOOD(3, "중식", List.of("깐풍기", "볶음면", "동파육", "짜장면", "짬뽕", "마파두부", "탕수육", "토마토 달걀볶음", "고추잡채")), + ASIAN_FOOD(4, "아시안", List.of("팟타이", "카오 팟", "나시고렝", "파인애플 볶음밥", "쌀국수", "똠얌꿍", "반미", "월남쌈", "분짜")), + WESTERN_FOOD(5, "양식", List.of("라자냐", "그라탱", "뇨끼", "끼슈", "프렌치 토스트", "바게트", "스파게티", "피자", "파니니")); + private final int index; private final String category; private final List menus; - MenuCategory(final String category, final List menus) { + MenuCategory(final int index, final String category, final List menus) { + this.index = index; this.category = category; this.menus = menus; } @@ -22,4 +27,17 @@ public static boolean isNotExistMenu(final String menuName) { return Arrays.stream(values()) .noneMatch(mc -> mc.menus.contains(menuName)); } + + public List getMenusFiltered(final HateMenus hateMenus) { + return this.menus.stream() + .filter(hateMenus::hasNoSameMenu) + .collect(Collectors.toList()); + } + + public static MenuCategory getByIndex(final int index) { + return Arrays.stream(values()) + .filter(mc -> mc.index == index) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_CATEGORY_INDEX.getMessage())); + } } diff --git a/src/main/java/menu/controller/MenuController.java b/src/main/java/menu/controller/MenuController.java index 7a962b04f..c4d6e8698 100644 --- a/src/main/java/menu/controller/MenuController.java +++ b/src/main/java/menu/controller/MenuController.java @@ -2,6 +2,8 @@ import menu.domain.Coaches; import menu.domain.HateMenus; +import menu.domain.MenuCategories; +import menu.domain.RecommendResult; import menu.io.InputManager; import menu.io.OutputView; import menu.service.MenuService; @@ -16,6 +18,11 @@ public void run() { outputView.printStart(); final Coaches coaches = createCoach(); createHateMenu(coaches); + recommendMenu(); + } + + private void recommendMenu() { + final RecommendResult recommendResult = menuService.recommendMenu(); } private void createHateMenu(final Coaches coaches) { diff --git a/src/main/java/menu/domain/HateMenus.java b/src/main/java/menu/domain/HateMenus.java index b03699f1e..da62bda93 100644 --- a/src/main/java/menu/domain/HateMenus.java +++ b/src/main/java/menu/domain/HateMenus.java @@ -20,4 +20,10 @@ private void validateSize(final List menus) { throw new IllegalArgumentException(ErrorMessage.INVALID_MENU_SIZE.getMessage()); } } + + public boolean hasNoSameMenu(final String menuName) { + return menus.stream() + .map(Menu::getName) + .noneMatch(menuName::equals); + } } diff --git a/src/main/java/menu/domain/Menu.java b/src/main/java/menu/domain/Menu.java index c5a69d4be..a26e61cbc 100644 --- a/src/main/java/menu/domain/Menu.java +++ b/src/main/java/menu/domain/Menu.java @@ -16,4 +16,8 @@ private void validateName(final String name) { throw new IllegalArgumentException(ErrorMessage.INVALID_MENU_NAME.getMessage()); } } + + public String getName() { + return this.name; + } } diff --git a/src/main/java/menu/service/MenuService.java b/src/main/java/menu/service/MenuService.java index aa93d84de..e24c77c00 100644 --- a/src/main/java/menu/service/MenuService.java +++ b/src/main/java/menu/service/MenuService.java @@ -1,13 +1,13 @@ package menu.service; -import menu.domain.Coach; -import menu.domain.Coaches; -import menu.domain.HateMenus; +import menu.domain.*; import menu.repository.MenuRepository; +import menu.utils.RandomMenuGenerator; public class MenuService { private final MenuRepository menuRepository = new MenuRepository(); + private final RandomMenuGenerator randomMenuGenerator = new RandomMenuGenerator(); public Coaches saveCoaches(final Coaches coaches) { return menuRepository.saveCoaches(coaches); @@ -17,4 +17,9 @@ public void updateHateMenus(final String coachName, final HateMenus hateMenus) { final Coach coach = menuRepository.findCoaches().findByName(coachName); coach.updateHateMenus(hateMenus); } + + public RecommendResult recommendMenu() { + final Coaches coaches = menuRepository.findCoaches(); + return randomMenuGenerator.generateMenus(coaches); + } } From 8fb7e51974edc19db55a43657faa81dfb60a9123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 01:57:25 +0900 Subject: [PATCH 27/28] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++---- src/main/java/menu/constant/ErrorMessage.java | 2 +- src/main/java/menu/constant/GameMessage.java | 5 +++- src/main/java/menu/constant/MenuCategory.java | 4 +++ .../java/menu/controller/MenuController.java | 8 +++--- src/main/java/menu/domain/Coach.java | 22 ++++++++++++++++ src/main/java/menu/domain/Coaches.java | 26 +++++++++++++------ src/main/java/menu/domain/MenuCategories.java | 17 ++++++------ .../java/menu/domain/RecommendResult.java | 17 +++++++++++- .../java/menu/domain/RecommendedMenus.java | 4 +++ src/main/java/menu/io/OutputView.java | 10 ++++++- src/main/java/menu/service/MenuService.java | 6 ++--- ...enuGenerator.java => MenuRecommender.java} | 24 ++++++++++------- 13 files changed, 114 insertions(+), 41 deletions(-) rename src/main/java/menu/utils/{RandomMenuGenerator.java => MenuRecommender.java} (62%) diff --git a/docs/README.md b/docs/README.md index d2451b0a7..cfe9a93b1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,11 +11,11 @@ - [x] 개수 0 ~ 2개 사이인지 검증 - [x] 메뉴 목록에 포함된 메뉴인지 검증 - [x] 잘못된 입력시 에러 메시지 출력 및 재시도 -- [ ] 메뉴 추천 - - [ ] 랜덤 메뉴 생성 - - [ ] 한 주에 같은 카테고리 최대 2회인지 검증 - - [ ] 각 코치에게 중복된 메뉴가 없는지 검증 -- [ ] 추천 완료 메시지 출력 +- [x] 메뉴 추천 + - [x] 랜덤 메뉴 생성 + - [x] 한 주에 같은 카테고리 최대 2회인지 검증 + - [x] 각 코치에게 중복된 메뉴가 없는지 검증 +- [x] 추천 완료 메시지 출력 ## 구현 클래스 diff --git a/src/main/java/menu/constant/ErrorMessage.java b/src/main/java/menu/constant/ErrorMessage.java index cd72fae24..a0c843349 100644 --- a/src/main/java/menu/constant/ErrorMessage.java +++ b/src/main/java/menu/constant/ErrorMessage.java @@ -2,7 +2,7 @@ public enum ErrorMessage { INVALID_COACH_NAME_LENGTH("코치 이름 길이가 잘못되었습니다."), - INVALID_COACH_NUM("코치의 인원수가 잘못되었습니다."), + INVALID_COACH_NUM("코치의 인원수가 잘못되었거나 중복 코치이름이 있습니다."), INVALID_INPUT_DELIMITER_USAGE("쉼표는 맨 처음이나 끝에 올 수 없습니다."), INVALID_MENU_SIZE("못 먹는 메뉴의 개수가 잘못되었습니다."), INVALID_MENU_NAME("존재하지 않는 메뉴입니다."), diff --git a/src/main/java/menu/constant/GameMessage.java b/src/main/java/menu/constant/GameMessage.java index b19b09ce9..a00b7eb14 100644 --- a/src/main/java/menu/constant/GameMessage.java +++ b/src/main/java/menu/constant/GameMessage.java @@ -3,7 +3,10 @@ public enum GameMessage { START("점심 메뉴 추천을 시작합니다."), COACH_NAME_REQUEST("코치의 이름을 입력해 주세요. (, 로 구분)"), - COACH_HATE_MENU_REQUEST("%s(이)가 못 먹는 메뉴를 입력해 주세요."); + COACH_HATE_MENU_REQUEST("%s(이)가 못 먹는 메뉴를 입력해 주세요."), + MENU_RECOMMEND_RESULT("메뉴 추천 결과입니다."), + RECOMMEND_DAYS("[ 구분 | 월요일 | 화요일 | 수요일 | 목요일 | 금요일 ]"), + RECOMMEND_FINISH("추천을 완료했습니다."); private final String message; diff --git a/src/main/java/menu/constant/MenuCategory.java b/src/main/java/menu/constant/MenuCategory.java index 96e9c894a..7a3e86b55 100644 --- a/src/main/java/menu/constant/MenuCategory.java +++ b/src/main/java/menu/constant/MenuCategory.java @@ -40,4 +40,8 @@ public static MenuCategory getByIndex(final int index) { .findAny() .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_CATEGORY_INDEX.getMessage())); } + + public String getCategoryName() { + return this.category; + } } diff --git a/src/main/java/menu/controller/MenuController.java b/src/main/java/menu/controller/MenuController.java index c4d6e8698..579b63eba 100644 --- a/src/main/java/menu/controller/MenuController.java +++ b/src/main/java/menu/controller/MenuController.java @@ -2,7 +2,6 @@ import menu.domain.Coaches; import menu.domain.HateMenus; -import menu.domain.MenuCategories; import menu.domain.RecommendResult; import menu.io.InputManager; import menu.io.OutputView; @@ -16,17 +15,18 @@ public class MenuController { public void run() { outputView.printStart(); - final Coaches coaches = createCoach(); + final Coaches coaches = createCoaches(); createHateMenu(coaches); recommendMenu(); } private void recommendMenu() { final RecommendResult recommendResult = menuService.recommendMenu(); + outputView.printRecommendResult(recommendResult); } private void createHateMenu(final Coaches coaches) { - while (coaches.hasNext()) { + while (!coaches.isLast()) { final String coachName = coaches.getNextCoachName(); outputView.printCoachHateMenuRequest(coachName); final HateMenus hateMenus = inputManager.readCoachHateMenu(); @@ -34,7 +34,7 @@ private void createHateMenu(final Coaches coaches) { } } - private Coaches createCoach() { + private Coaches createCoaches() { outputView.printCoachNameRequest(); final Coaches coaches = inputManager.readCoachNames(); return menuService.saveCoaches(coaches); diff --git a/src/main/java/menu/domain/Coach.java b/src/main/java/menu/domain/Coach.java index 69c572d14..9498a8470 100644 --- a/src/main/java/menu/domain/Coach.java +++ b/src/main/java/menu/domain/Coach.java @@ -3,6 +3,8 @@ import menu.constant.ErrorMessage; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; public class Coach { @@ -15,6 +17,7 @@ public class Coach { public Coach(final String name) { validateName(name); this.name = name; + this.recommendedMenus = new RecommendedMenus(); } private void validateName(final String name) { @@ -43,4 +46,23 @@ public HateMenus getHateMenus() { public void updateRecommendedMenus(final String menus) { this.recommendedMenus.addMenu(menus); } + + public List getRecommendedMenus() { + return this.recommendedMenus.getMenus().stream() + .map(Menu::getName) + .collect(Collectors.toList()); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final Coach coach = (Coach) o; + return Objects.equals(name, coach.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } diff --git a/src/main/java/menu/domain/Coaches.java b/src/main/java/menu/domain/Coaches.java index 2666958a5..0b767ca0a 100644 --- a/src/main/java/menu/domain/Coaches.java +++ b/src/main/java/menu/domain/Coaches.java @@ -3,24 +3,26 @@ import menu.constant.ErrorMessage; import java.util.Collections; +import java.util.HashSet; import java.util.List; public class Coaches { private static final int MIN_COACH_NUM = 2; private static final int MAX_COACH_NUM = 5; + private static final int INIT_INDEX = 0; private final List coaches; private int currentIndex; public Coaches(final List coaches) { - validateSize(coaches); + validate(coaches); this.coaches = Collections.unmodifiableList(coaches); - this.currentIndex = 0; + this.currentIndex = INIT_INDEX; } - private void validateSize(final List coaches) { + private void validate(final List coaches) { final int size = coaches.size(); - if (size < MIN_COACH_NUM || size > MAX_COACH_NUM) { + if (size < MIN_COACH_NUM || size > MAX_COACH_NUM || new HashSet<>(coaches).size() != coaches.size()) { throw new IllegalArgumentException(ErrorMessage.INVALID_COACH_NUM.getMessage()); } } @@ -31,13 +33,17 @@ public String getNextCoachName() { } private void checkCurrentIndex() { - if (hasNext()) { - currentIndex = 0; + if (currentIndex == coaches.size()) { + currentIndex = INIT_INDEX; } } - public boolean hasNext() { - return currentIndex == coaches.size(); + public boolean isLast() { + final boolean flag = currentIndex == coaches.size(); + if (flag) { + currentIndex = INIT_INDEX; + } + return flag; } public Coach findByName(final String coachName) { @@ -51,4 +57,8 @@ public Coach getNextCoach() { checkCurrentIndex(); return this.coaches.get(currentIndex++); } + + public List getCoaches() { + return this.coaches; + } } diff --git a/src/main/java/menu/domain/MenuCategories.java b/src/main/java/menu/domain/MenuCategories.java index 6b78f1d48..978fdcc70 100644 --- a/src/main/java/menu/domain/MenuCategories.java +++ b/src/main/java/menu/domain/MenuCategories.java @@ -13,18 +13,19 @@ public class MenuCategories { public boolean hasMaxNum(final MenuCategory menuCategory) { return menuCategories.stream() - .filter(menuCategory::equals) + .filter(mc -> mc == menuCategory) .count() == MAX_COUNT; } - public void addRecommendedMenu(final Coach coach, final String menus, final MenuCategory menuCategory) { - if (!menuCategories.contains(menuCategory)) { - menuCategories.add(menuCategory); - } - coach.updateRecommendedMenus(menus); - } - public boolean needNext() { return menuCategories.size() < DAY_COUNT; } + + public List getMenuCategories() { + return this.menuCategories; + } + + public void addMenuCategory(final MenuCategory menuCategory) { + menuCategories.add(menuCategory); + } } diff --git a/src/main/java/menu/domain/RecommendResult.java b/src/main/java/menu/domain/RecommendResult.java index ee5673812..78f987653 100644 --- a/src/main/java/menu/domain/RecommendResult.java +++ b/src/main/java/menu/domain/RecommendResult.java @@ -1,6 +1,16 @@ package menu.domain; +import menu.constant.MenuCategory; + +import java.util.stream.Collectors; + public class RecommendResult { + + private static final String START_TAG = "[ "; + private static final String DELIMITER_TAG = " | "; + private static final String END_TAG = " ]"; + private static final String NEW_LINE = "\n"; + private static final String CATEGORY = "카테고리"; private final Coaches coaches; private final MenuCategories menuCategories; @@ -10,6 +20,11 @@ public RecommendResult(final Coaches coaches, final MenuCategories menuCategorie } public String getResult() { - return ""; + return START_TAG + CATEGORY + DELIMITER_TAG + menuCategories.getMenuCategories().stream() + .map(MenuCategory::getCategoryName) + .collect(Collectors.joining(DELIMITER_TAG)) + END_TAG + NEW_LINE + + coaches.getCoaches().stream() + .map(coach -> START_TAG + coach.getName() + DELIMITER_TAG + String.join(DELIMITER_TAG, coach.getRecommendedMenus()) + END_TAG) + .collect(Collectors.joining(NEW_LINE)) + NEW_LINE; } } diff --git a/src/main/java/menu/domain/RecommendedMenus.java b/src/main/java/menu/domain/RecommendedMenus.java index 8e7604745..f77f57f74 100644 --- a/src/main/java/menu/domain/RecommendedMenus.java +++ b/src/main/java/menu/domain/RecommendedMenus.java @@ -13,4 +13,8 @@ public RecommendedMenus() { public void addMenu(final String menuName) { recommendedMenus.add(new Menu(menuName)); } + + public List getMenus() { + return this.recommendedMenus; + } } diff --git a/src/main/java/menu/io/OutputView.java b/src/main/java/menu/io/OutputView.java index 1977df814..9ed5edae2 100644 --- a/src/main/java/menu/io/OutputView.java +++ b/src/main/java/menu/io/OutputView.java @@ -1,6 +1,7 @@ package menu.io; import menu.constant.GameMessage; +import menu.domain.RecommendResult; public class OutputView { @@ -13,6 +14,13 @@ public void printCoachNameRequest() { } public void printCoachHateMenuRequest(final String coachName) { - System.out.println(String.format(GameMessage.COACH_HATE_MENU_REQUEST.getMessage())); + System.out.println(String.format(GameMessage.COACH_HATE_MENU_REQUEST.getMessage(), coachName)); + } + + public void printRecommendResult(final RecommendResult recommendResult) { + System.out.println(GameMessage.MENU_RECOMMEND_RESULT.getMessage()); + System.out.println(GameMessage.RECOMMEND_DAYS.getMessage()); + System.out.println(recommendResult.getResult()); + System.out.println(GameMessage.RECOMMEND_FINISH.getMessage()); } } diff --git a/src/main/java/menu/service/MenuService.java b/src/main/java/menu/service/MenuService.java index e24c77c00..56023dd84 100644 --- a/src/main/java/menu/service/MenuService.java +++ b/src/main/java/menu/service/MenuService.java @@ -2,12 +2,12 @@ import menu.domain.*; import menu.repository.MenuRepository; -import menu.utils.RandomMenuGenerator; +import menu.utils.MenuRecommender; public class MenuService { private final MenuRepository menuRepository = new MenuRepository(); - private final RandomMenuGenerator randomMenuGenerator = new RandomMenuGenerator(); + private final MenuRecommender menuRecommender = new MenuRecommender(); public Coaches saveCoaches(final Coaches coaches) { return menuRepository.saveCoaches(coaches); @@ -20,6 +20,6 @@ public void updateHateMenus(final String coachName, final HateMenus hateMenus) { public RecommendResult recommendMenu() { final Coaches coaches = menuRepository.findCoaches(); - return randomMenuGenerator.generateMenus(coaches); + return menuRecommender.recommendMenus(coaches); } } diff --git a/src/main/java/menu/utils/RandomMenuGenerator.java b/src/main/java/menu/utils/MenuRecommender.java similarity index 62% rename from src/main/java/menu/utils/RandomMenuGenerator.java rename to src/main/java/menu/utils/MenuRecommender.java index bc38ab1f9..5d37348b7 100644 --- a/src/main/java/menu/utils/RandomMenuGenerator.java +++ b/src/main/java/menu/utils/MenuRecommender.java @@ -6,13 +6,13 @@ import java.util.List; -public class RandomMenuGenerator { +public class MenuRecommender { private static final int MIN_CATEGORY_INDEX = 1; private static final int MAX_CATEGORY_INDEX = 5; private static final int RECOMMEND_INDEX = 0; - public RecommendResult generateMenus(final Coaches coaches) { + public RecommendResult recommendMenus(final Coaches coaches) { final MenuCategories menuCategories = new MenuCategories(); recommendAllDay(coaches, menuCategories); return new RecommendResult(coaches, menuCategories); @@ -22,23 +22,29 @@ private void recommendAllDay(final Coaches coaches, final MenuCategories menuCat while (menuCategories.needNext()) { final MenuCategory menuCategory = generateRandomCategory(); if (!menuCategories.hasMaxNum(menuCategory)) { - recommendAllCoaches(coaches, menuCategory, menuCategories); + menuCategories.addMenuCategory(menuCategory); + recommendAllCoaches(coaches, menuCategory); } } } - private void recommendAllCoaches(final Coaches coaches, final MenuCategory menuCategory, final MenuCategories menuCategories) { - while(coaches.hasNext()) { + private void recommendAllCoaches(final Coaches coaches, final MenuCategory menuCategory) { + while(!coaches.isLast()) { final Coach coach = coaches.getNextCoach(); final HateMenus hateMenus = coach.getHateMenus(); final List menus = menuCategory.getMenusFiltered(hateMenus); - final String recommendedMenu = getRecommendedMenu(menus); - menuCategories.addRecommendedMenu(coach, recommendedMenu, menuCategory); + final String recommendedMenu = getRecommendedMenu(menus, coach.getRecommendedMenus()); + coach.updateRecommendedMenus(recommendedMenu); } } - private String getRecommendedMenu(final List menus) { - return Randoms.shuffle(menus).get(RECOMMEND_INDEX); + private String getRecommendedMenu(final List menus, final List recommended) { + while (true) { + final String menu = Randoms.shuffle(menus).get(RECOMMEND_INDEX); + if (!recommended.contains(menu)) { + return menu; + } + } } private MenuCategory generateRandomCategory() { From 36e516234e2bf2e0f567da8db56838dfb9c5c399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Tue, 19 Sep 2023 02:10:08 +0900 Subject: [PATCH 28/28] =?UTF-8?q?test:=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 --- src/main/java/menu/domain/MenuCategories.java | 6 +++- src/test/java/menu/domain/CoachTest.java | 23 +++++++++++++ src/test/java/menu/domain/CoachesTest.java | 18 ++++++++++ src/test/java/menu/domain/HateMenusTest.java | 18 ++++++++++ src/test/java/menu/domain/MenuTest.java | 16 +++++++++ src/test/java/menu/io/InputValidatorTest.java | 34 +++++++++++++++++++ 6 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 src/test/java/menu/domain/CoachTest.java create mode 100644 src/test/java/menu/domain/CoachesTest.java create mode 100644 src/test/java/menu/domain/HateMenusTest.java create mode 100644 src/test/java/menu/domain/MenuTest.java create mode 100644 src/test/java/menu/io/InputValidatorTest.java diff --git a/src/main/java/menu/domain/MenuCategories.java b/src/main/java/menu/domain/MenuCategories.java index 978fdcc70..c4a7ba665 100644 --- a/src/main/java/menu/domain/MenuCategories.java +++ b/src/main/java/menu/domain/MenuCategories.java @@ -9,7 +9,11 @@ public class MenuCategories { private static final Long MAX_COUNT = 2L; private static final Integer DAY_COUNT = 5; - private final List menuCategories = new ArrayList<>(); + private final List menuCategories; + + public MenuCategories() { + this.menuCategories = new ArrayList<>(); + } public boolean hasMaxNum(final MenuCategory menuCategory) { return menuCategories.stream() diff --git a/src/test/java/menu/domain/CoachTest.java b/src/test/java/menu/domain/CoachTest.java new file mode 100644 index 000000000..9bae8d939 --- /dev/null +++ b/src/test/java/menu/domain/CoachTest.java @@ -0,0 +1,23 @@ +package menu.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("코치 도메인에서") +class CoachTest { + + @Test + @DisplayName("생성시 이름의 길이가 4보다 크면 예외를 던진다.") + void createLongName() { + Assertions.assertThatThrownBy(() -> new Coach("가나다라마")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("생성시 이름의 길이가 2보다 작으면 예외를 던진다.") + void createShortName() { + Assertions.assertThatThrownBy(() -> new Coach("가")) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file diff --git a/src/test/java/menu/domain/CoachesTest.java b/src/test/java/menu/domain/CoachesTest.java new file mode 100644 index 000000000..9de781830 --- /dev/null +++ b/src/test/java/menu/domain/CoachesTest.java @@ -0,0 +1,18 @@ +package menu.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +@DisplayName("코치 일급컬렉션에서") +class CoachesTest { + + @Test + @DisplayName("생성시 중복되는 코치의 이름이 있으면 예외를 던진다.") + void create() { + Assertions.assertThatThrownBy(() -> new Coaches(List.of(new Coach("가나다"), new Coach("가나다")))) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/menu/domain/HateMenusTest.java b/src/test/java/menu/domain/HateMenusTest.java new file mode 100644 index 000000000..d7d382629 --- /dev/null +++ b/src/test/java/menu/domain/HateMenusTest.java @@ -0,0 +1,18 @@ +package menu.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +@DisplayName("못먹는 메뉴 도메인에서") +class HateMenusTest { + + @Test + @DisplayName("생성시 리스트의 원소 개수가 5개보다 많으면 예외를 던진다.") + void create() { + Assertions.assertThatThrownBy(() -> new HateMenus(List.of("", "", "", "", "", ""))) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/menu/domain/MenuTest.java b/src/test/java/menu/domain/MenuTest.java new file mode 100644 index 000000000..ec2dbc81c --- /dev/null +++ b/src/test/java/menu/domain/MenuTest.java @@ -0,0 +1,16 @@ +package menu.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("메뉴 도메인에서") +class MenuTest { + + @Test + @DisplayName("생성시 없는 메뉴이름으로 생성하면 예외를 던진다.") + void create() { + Assertions.assertThatThrownBy(() -> new Menu("가나다")) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/menu/io/InputValidatorTest.java b/src/test/java/menu/io/InputValidatorTest.java new file mode 100644 index 000000000..b1a058a76 --- /dev/null +++ b/src/test/java/menu/io/InputValidatorTest.java @@ -0,0 +1,34 @@ +package menu.io; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("입력값 검증 중에") +class InputValidatorTest { + + private final InputValidator inputValidator = new InputValidator(); + + @Test + @DisplayName("쉼표로 시작하면 예외를 던진다.") + void validateInputDelimiter() { + Assertions.assertThatThrownBy(() -> inputValidator.validateInputDelimiter(",abc,ase")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("공백에 대해 예외를 던지지 않는다.") + void validateHateMenusBlank() { + inputValidator.validateHateMenus(""); + Assertions.assertThatNoException(); + } + + @Test + @DisplayName("쉼표로 끝나면 예외를 던진다.") + void validateHateMenus() { + Assertions.assertThatThrownBy(() -> inputValidator.validateHateMenus("abc,ase,")) + .isInstanceOf(IllegalArgumentException.class); + } +}