From df6174584c6fb963d0243f12c742e06f5db47a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sat, 5 Aug 2023 21:56:13 +0900 Subject: [PATCH 01/61] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=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 | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2..633d52db95 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,51 @@ +## 3주차 미션 로또 기능 정의 + +### 로또 게임 진행 (LottoController) +[ ] 게임 시작 + +### 로또 개수 계산 (LottoCounter) +[ ] 금액에 맞는 로또 개수 계산 + +### 로또 구매 (LottoGenerator) +[ ] 로또 번호 랜덤 생성 + +### 로또 당첨 판별 (LottoResult) +[ ] 로또 당첨 여부 판별 + +[ ] 수익률 계산 + + +### 입력 (InputFactory) + +[ ] 로또 구입 금액 입력 기능 + +[ ] 당첨 번호 입력 기능 + +[ ] 보너스 번호 입력 기능 + +### 로또 구매 안내 출력 (OutputView) + +[ ] 구입 금액 입력 안내 + +[ ] 로또 구매 개수 안내 + +[ ] 당첨 번호 입력 안내 + +[ ] 보너스 번호 입력 안내 + +[ ] 당첨 통계 안내 + +### 예외 처리(InputValidator) +[ ] 당첨 번호를 6개 이상 입력한 경우 + +[ ] 보너스 번호를 하나 이상 입력한 경우 + +[ ] 구입 금액이 1000원 단위가 아닌 경우 + +[ ] 구입 금액 입력이 숫자가 아닌 경우 + +[ ] 잘못된 형식으로 당첨 번호를 입력한 경우 (쉼표가 없는 경우 등) + +[ ] 중복된 수를 입력한 경우 + + From 248b5496318bac70375dba6e2e62fb2593480bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sat, 5 Aug 2023 22:08:31 +0900 Subject: [PATCH 02/61] =?UTF-8?q?feat(LottoController):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=8B=9C=EC=9E=91=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 --- docs/README.md | 3 ++- src/main/java/lotto/Application.java | 5 ++++- src/main/java/lotto/controller/LottoController.java | 8 ++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/main/java/lotto/controller/LottoController.java diff --git a/docs/README.md b/docs/README.md index 633d52db95..9cf3f18e64 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,8 @@ ## 3주차 미션 로또 기능 정의 ### 로또 게임 진행 (LottoController) -[ ] 게임 시작 +[x] 게임 시작 +[ ] 게임 진행 ### 로또 개수 계산 (LottoCounter) [ ] 금액에 맞는 로또 개수 계산 diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba4..40fb6ddbc8 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,10 @@ package lotto; +import lotto.controller.LottoController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + LottoController lottoController = new LottoController(); + lottoController.start(); } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java new file mode 100644 index 0000000000..86616c9a00 --- /dev/null +++ b/src/main/java/lotto/controller/LottoController.java @@ -0,0 +1,8 @@ +package lotto.controller; + +public class LottoController { + + public void start() { + System.out.println("구입 금액을 입력해주세요."); + } +} From b1d0b9b6bff89c90221ed8ac1be8a590adc8455a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sat, 5 Aug 2023 22:28:46 +0900 Subject: [PATCH 03/61] =?UTF-8?q?feat(InputFactory):=20=EA=B5=AC=EC=9E=85?= =?UTF-8?q?=20=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 3 ++- src/main/java/lotto/Application.java | 4 +++- .../java/lotto/controller/LottoController.java | 14 +++++++++++++- src/main/java/lotto/view/InputFactory.java | 11 +++++++++++ src/main/java/lotto/view/OutputMessage.java | 17 +++++++++++++++++ src/main/java/lotto/view/OutputView.java | 8 ++++++++ 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/main/java/lotto/view/InputFactory.java create mode 100644 src/main/java/lotto/view/OutputMessage.java create mode 100644 src/main/java/lotto/view/OutputView.java diff --git a/docs/README.md b/docs/README.md index 9cf3f18e64..0e13de658e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,6 +2,7 @@ ### 로또 게임 진행 (LottoController) [x] 게임 시작 + [ ] 게임 진행 ### 로또 개수 계산 (LottoCounter) @@ -18,7 +19,7 @@ ### 입력 (InputFactory) -[ ] 로또 구입 금액 입력 기능 +[x] 로또 구입 금액 입력 기능 [ ] 당첨 번호 입력 기능 diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 40fb6ddbc8..7c6901cc7f 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,10 +1,12 @@ package lotto; import lotto.controller.LottoController; +import lotto.view.InputFactory; +import lotto.view.OutputView; public class Application { public static void main(String[] args) { - LottoController lottoController = new LottoController(); + LottoController lottoController = new LottoController(new OutputView(), new InputFactory()); lottoController.start(); } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 86616c9a00..45299464db 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,8 +1,20 @@ package lotto.controller; +import lotto.view.InputFactory; +import lotto.view.OutputView; + public class LottoController { + private final OutputView outputView; + private final InputFactory inputFactory; + + public LottoController(OutputView outputView, InputFactory inputFactory) { + this.outputView = outputView; + this.inputFactory = inputFactory; + } + public void start() { - System.out.println("구입 금액을 입력해주세요."); + outputView.guidePurchaseLotto(); + int purchaseAmount = inputFactory.readPurchaseAmount(); } } diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java new file mode 100644 index 0000000000..a30a0d47d5 --- /dev/null +++ b/src/main/java/lotto/view/InputFactory.java @@ -0,0 +1,11 @@ +package lotto.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputFactory { + + public int readPurchaseAmount() { + String userInput = Console.readLine(); + return Integer.parseInt(userInput); + } +} diff --git a/src/main/java/lotto/view/OutputMessage.java b/src/main/java/lotto/view/OutputMessage.java new file mode 100644 index 0000000000..e3d3a4447b --- /dev/null +++ b/src/main/java/lotto/view/OutputMessage.java @@ -0,0 +1,17 @@ +package lotto.view; + +public enum OutputMessage { + + GUIDE_PURCHASE("구입 금액을 입력해주세요."); + + private final String message; + + OutputMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return this.message; + } +} diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java new file mode 100644 index 0000000000..3f9fc3383a --- /dev/null +++ b/src/main/java/lotto/view/OutputView.java @@ -0,0 +1,8 @@ +package lotto.view; + +public class OutputView { + + public void guidePurchaseLotto() { + System.out.println(OutputMessage.GUIDE_PURCHASE); + } +} From a72eec368be3804e680703e9a30c0656cb1a7caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sat, 5 Aug 2023 22:46:00 +0900 Subject: [PATCH 04/61] =?UTF-8?q?feat(LottoCounter):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=EA=B8=88=EC=95=A1=EC=97=90=20=EB=A7=9E=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EA=B0=9C=EC=88=98=20=EA=B3=84=EC=82=B0=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 --- docs/README.md | 4 ++-- src/main/java/lotto/Model/LottoCounter.java | 19 +++++++++++++++++++ .../lotto/controller/LottoController.java | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/main/java/lotto/Model/LottoCounter.java diff --git a/docs/README.md b/docs/README.md index 0e13de658e..54548bfba8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,9 +6,9 @@ [ ] 게임 진행 ### 로또 개수 계산 (LottoCounter) -[ ] 금액에 맞는 로또 개수 계산 +[x] 금액에 맞는 로또 개수 계산 -### 로또 구매 (LottoGenerator) +### 로또 번호 생성기 (LottoGenerator) [ ] 로또 번호 랜덤 생성 ### 로또 당첨 판별 (LottoResult) diff --git a/src/main/java/lotto/Model/LottoCounter.java b/src/main/java/lotto/Model/LottoCounter.java new file mode 100644 index 0000000000..897f6a3bb1 --- /dev/null +++ b/src/main/java/lotto/Model/LottoCounter.java @@ -0,0 +1,19 @@ +package lotto.Model; + +public class LottoCounter { + + private final int lotteryTicket; + private static final Integer LOTTO_PRICE = 1000; + + public LottoCounter(int payment) { + this.lotteryTicket = calculateLotteryTicket(payment); + } + + public int calculateLotteryTicket(int payment) { + return payment / LOTTO_PRICE; + } + + public int getLotteryTicket() { + return lotteryTicket; + } +} diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 45299464db..2594161054 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,5 +1,6 @@ package lotto.controller; +import lotto.Model.LottoCounter; import lotto.view.InputFactory; import lotto.view.OutputView; @@ -16,5 +17,6 @@ public LottoController(OutputView outputView, InputFactory inputFactory) { public void start() { outputView.guidePurchaseLotto(); int purchaseAmount = inputFactory.readPurchaseAmount(); + LottoCounter lottoCounter = new LottoCounter(purchaseAmount); } } From a2e4933a1332cb1a7cce4358c2c2adbc8b72c353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 00:34:09 +0900 Subject: [PATCH 05/61] =?UTF-8?q?docs:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90,=20=EB=8B=B9=EC=B2=A8=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 54548bfba8..d2988d0aae 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,8 +8,11 @@ ### 로또 개수 계산 (LottoCounter) [x] 금액에 맞는 로또 개수 계산 -### 로또 번호 생성기 (LottoGenerator) -[ ] 로또 번호 랜덤 생성 +### 사용자 생성 로또 (Lotto) +[ ] 로또 생성 (랜덤 번호 6개) + +### 당첨 로또 (WinningLotto) +[ ] 입력받은 당첨 로또 관리 ### 로또 당첨 판별 (LottoResult) [ ] 로또 당첨 여부 판별 From b99af57cf091f4d450674a8f104897b58550581e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 01:08:29 +0900 Subject: [PATCH 06/61] =?UTF-8?q?feat(InputFactory):=20=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++------- .../java/lotto/controller/LottoController.java | 2 ++ src/main/java/lotto/view/InputFactory.java | 14 ++++++++++++++ src/main/java/lotto/view/OutputMessage.java | 3 ++- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index d2988d0aae..b3e0550904 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,10 +8,10 @@ ### 로또 개수 계산 (LottoCounter) [x] 금액에 맞는 로또 개수 계산 -### 사용자 생성 로또 (Lotto) +### 사용자 생성 로또 (PlayerLotto) [ ] 로또 생성 (랜덤 번호 6개) -### 당첨 로또 (WinningLotto) +### 당첨 로또 (Lotto) [ ] 입력받은 당첨 로또 관리 ### 로또 당첨 판별 (LottoResult) @@ -24,7 +24,7 @@ [x] 로또 구입 금액 입력 기능 -[ ] 당첨 번호 입력 기능 +[x] 당첨 번호 입력 기능 [ ] 보너스 번호 입력 기능 @@ -34,10 +34,6 @@ [ ] 로또 구매 개수 안내 -[ ] 당첨 번호 입력 안내 - -[ ] 보너스 번호 입력 안내 - [ ] 당첨 통계 안내 ### 예외 처리(InputValidator) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 2594161054..ffdc187bb3 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,5 +1,6 @@ package lotto.controller; +import lotto.Lotto; import lotto.Model.LottoCounter; import lotto.view.InputFactory; import lotto.view.OutputView; @@ -18,5 +19,6 @@ public void start() { outputView.guidePurchaseLotto(); int purchaseAmount = inputFactory.readPurchaseAmount(); LottoCounter lottoCounter = new LottoCounter(purchaseAmount); + Lotto lotto = inputFactory.readWinningNumber(); } } diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index a30a0d47d5..8d9a9e67ab 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -1,6 +1,11 @@ package lotto.view; import camp.nextstep.edu.missionutils.Console; +import lotto.Lotto; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class InputFactory { @@ -8,4 +13,13 @@ public int readPurchaseAmount() { String userInput = Console.readLine(); return Integer.parseInt(userInput); } + + public Lotto readWinningNumber() { + System.out.println(OutputMessage.WINNING_NUMBER); + String userInput = Console.readLine(); + List winningNumber = Stream.of(userInput.split(",")) + .map(Integer::parseInt) + .collect(Collectors.toList()); + return new Lotto(winningNumber); + } } diff --git a/src/main/java/lotto/view/OutputMessage.java b/src/main/java/lotto/view/OutputMessage.java index e3d3a4447b..ce46a54a62 100644 --- a/src/main/java/lotto/view/OutputMessage.java +++ b/src/main/java/lotto/view/OutputMessage.java @@ -2,7 +2,8 @@ public enum OutputMessage { - GUIDE_PURCHASE("구입 금액을 입력해주세요."); + GUIDE_PURCHASE("구입 금액을 입력해주세요."), + WINNING_NUMBER("당첨 번호를 입력해 주세요."); private final String message; From 4efc0f7159bcf15f8915dbbbec9d8c9d0603fd0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 01:19:48 +0900 Subject: [PATCH 07/61] =?UTF-8?q?docs:=20Lotto=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index b3e0550904..3d521d6cb1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,9 +11,13 @@ ### 사용자 생성 로또 (PlayerLotto) [ ] 로또 생성 (랜덤 번호 6개) -### 당첨 로또 (Lotto) +### 당첨 로또 (WinngLotto) [ ] 입력받은 당첨 로또 관리 +### 로또 생성 (Lotto) +[ ] 입력받은 로또 번호로 로또 생성 +[ ] 랜덤 숫자 6개로 로또 생성 + ### 로또 당첨 판별 (LottoResult) [ ] 로또 당첨 여부 판별 From 7ad77f4e093e3dd296f0c4ab4cf6ea16ec5f4967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 01:21:38 +0900 Subject: [PATCH 08/61] =?UTF-8?q?Revert=20"docs:=20Lotto=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=88=98=EC=A0=95"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 4efc0f7159bcf15f8915dbbbec9d8c9d0603fd0a. --- docs/README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3d521d6cb1..b3e0550904 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,13 +11,9 @@ ### 사용자 생성 로또 (PlayerLotto) [ ] 로또 생성 (랜덤 번호 6개) -### 당첨 로또 (WinngLotto) +### 당첨 로또 (Lotto) [ ] 입력받은 당첨 로또 관리 -### 로또 생성 (Lotto) -[ ] 입력받은 로또 번호로 로또 생성 -[ ] 랜덤 숫자 6개로 로또 생성 - ### 로또 당첨 판별 (LottoResult) [ ] 로또 당첨 여부 판별 From fb95bef8dc75eb5e421a1ba063908f936cea1693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 01:45:00 +0900 Subject: [PATCH 09/61] =?UTF-8?q?docs:=20PlayerLotto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index b3e0550904..1d98ea12db 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,8 +8,11 @@ ### 로또 개수 계산 (LottoCounter) [x] 금액에 맞는 로또 개수 계산 +### 랜덤 로또 생성 (RandomLottoGenerator) +[ ] 랜덤 번호 6개로 로또 생성 + ### 사용자 생성 로또 (PlayerLotto) -[ ] 로또 생성 (랜덤 번호 6개) +[ ] 원하는 개수만큼 로또 생성 ### 당첨 로또 (Lotto) [ ] 입력받은 당첨 로또 관리 From c3bb7bb5bcba6c086673cb3e09a819d2a8621186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 01:46:20 +0900 Subject: [PATCH 10/61] =?UTF-8?q?feat(RandomLottoGenerator):=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=20=EB=B2=88=ED=98=B8=EB=A1=9C=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=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 --- .../lotto/Model/RandomLottoGenerator.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/lotto/Model/RandomLottoGenerator.java diff --git a/src/main/java/lotto/Model/RandomLottoGenerator.java b/src/main/java/lotto/Model/RandomLottoGenerator.java new file mode 100644 index 0000000000..39bfe2cdcb --- /dev/null +++ b/src/main/java/lotto/Model/RandomLottoGenerator.java @@ -0,0 +1,25 @@ +package lotto.Model; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.List; + +public class RandomLottoGenerator { + + private final List numbers; + private static final int MIN_NUMBER = 1; + private static final int MAX_NUMBER = 45; + private static final int LOTTO_SIZE = 6; + + public RandomLottoGenerator() { + this.numbers = generateRandomNumber(); + } + + private List generateRandomNumber() { + return Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, LOTTO_SIZE); + } + + public List getRandomNumber() { + return numbers; + } +} From fbb2df780ab127f18376caaa61be50b002f150a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 02:05:16 +0900 Subject: [PATCH 11/61] =?UTF-8?q?feat(PlayerLottoes):=20=EC=9B=90=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B0=9C=EC=88=98=EB=A7=8C=ED=81=BC=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EC=83=9D=EC=84=B1=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 --- docs/README.md | 4 +-- src/main/java/lotto/Model/PlayerLottoes.java | 28 +++++++++++++++++++ .../lotto/Model/RandomLottoGenerator.java | 11 ++++---- 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 src/main/java/lotto/Model/PlayerLottoes.java diff --git a/docs/README.md b/docs/README.md index 1d98ea12db..1a039e8356 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,10 +9,10 @@ [x] 금액에 맞는 로또 개수 계산 ### 랜덤 로또 생성 (RandomLottoGenerator) -[ ] 랜덤 번호 6개로 로또 생성 +[x] 랜덤 번호 6개로 로또 생성 ### 사용자 생성 로또 (PlayerLotto) -[ ] 원하는 개수만큼 로또 생성 +[x] 원하는 개수만큼 로또 생성 ### 당첨 로또 (Lotto) [ ] 입력받은 당첨 로또 관리 diff --git a/src/main/java/lotto/Model/PlayerLottoes.java b/src/main/java/lotto/Model/PlayerLottoes.java new file mode 100644 index 0000000000..04a5b149dd --- /dev/null +++ b/src/main/java/lotto/Model/PlayerLottoes.java @@ -0,0 +1,28 @@ +package lotto.Model; + +import lotto.Lotto; + +import java.util.ArrayList; +import java.util.List; + +public class PlayerLottoes { + + private final List lottoes; + + public PlayerLottoes(int lotteryTicketsNumber) { + this.lottoes = generateLottoes(lotteryTicketsNumber); + } + + private List generateLottoes(int lotteryTicketsNumber) { + List lottoes = new ArrayList<>(); + for (int i = 0; i < lotteryTicketsNumber; i++) { + RandomLottoGenerator lottoGenerator = new RandomLottoGenerator(); + lottoes.add(lottoGenerator.getRandomNumber()); + } + return lottoes; + } + + public List getLottoes() { + return lottoes; + } +} diff --git a/src/main/java/lotto/Model/RandomLottoGenerator.java b/src/main/java/lotto/Model/RandomLottoGenerator.java index 39bfe2cdcb..9f6f16816b 100644 --- a/src/main/java/lotto/Model/RandomLottoGenerator.java +++ b/src/main/java/lotto/Model/RandomLottoGenerator.java @@ -1,12 +1,11 @@ package lotto.Model; import camp.nextstep.edu.missionutils.Randoms; - -import java.util.List; +import lotto.Lotto; public class RandomLottoGenerator { - private final List numbers; + private final Lotto numbers; private static final int MIN_NUMBER = 1; private static final int MAX_NUMBER = 45; private static final int LOTTO_SIZE = 6; @@ -15,11 +14,11 @@ public RandomLottoGenerator() { this.numbers = generateRandomNumber(); } - private List generateRandomNumber() { - return Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, LOTTO_SIZE); + private Lotto generateRandomNumber() { + return new Lotto(Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, LOTTO_SIZE)); } - public List getRandomNumber() { + public Lotto getRandomNumber() { return numbers; } } From 984162233176a2295741518b85f9734e0ce8eaad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 04:30:53 +0900 Subject: [PATCH 12/61] =?UTF-8?q?feat(WinningLotto):=20=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=20=EB=A1=9C=EB=98=90=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- src/main/java/lotto/Model/WinningLotto.java | 16 ++++++++++++++++ .../java/lotto/controller/LottoController.java | 9 +++++---- 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 src/main/java/lotto/Model/WinningLotto.java diff --git a/docs/README.md b/docs/README.md index 1a039e8356..b403e5e168 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,8 +14,8 @@ ### 사용자 생성 로또 (PlayerLotto) [x] 원하는 개수만큼 로또 생성 -### 당첨 로또 (Lotto) -[ ] 입력받은 당첨 로또 관리 +### 당첨 로또 (WinningLotto) +[x] 입력받은 당첨 로또 관리 ### 로또 당첨 판별 (LottoResult) [ ] 로또 당첨 여부 판별 diff --git a/src/main/java/lotto/Model/WinningLotto.java b/src/main/java/lotto/Model/WinningLotto.java new file mode 100644 index 0000000000..3b61b2bb03 --- /dev/null +++ b/src/main/java/lotto/Model/WinningLotto.java @@ -0,0 +1,16 @@ +package lotto.Model; + +import lotto.Lotto; + +public class WinningLotto { + + private final Lotto lotto; + + public WinningLotto(Lotto lotto) { + this.lotto = lotto; + } + + public Lotto getLotto() { + return lotto; + } +} diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index ffdc187bb3..ff0b303f5d 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,7 +1,8 @@ package lotto.controller; -import lotto.Lotto; import lotto.Model.LottoCounter; +import lotto.Model.PlayerLottoes; +import lotto.Model.WinningLotto; import lotto.view.InputFactory; import lotto.view.OutputView; @@ -17,8 +18,8 @@ public LottoController(OutputView outputView, InputFactory inputFactory) { public void start() { outputView.guidePurchaseLotto(); - int purchaseAmount = inputFactory.readPurchaseAmount(); - LottoCounter lottoCounter = new LottoCounter(purchaseAmount); - Lotto lotto = inputFactory.readWinningNumber(); + LottoCounter lottoCounter = new LottoCounter(inputFactory.readPurchaseAmount()); + WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber()); + PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); } } From ba32447693c75b20579792eedf728d73cf861991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 04:33:05 +0900 Subject: [PATCH 13/61] =?UTF-8?q?docs:=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=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 + 1 file changed, 1 insertion(+) diff --git a/docs/README.md b/docs/README.md index b403e5e168..8263ce3f71 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,6 +16,7 @@ ### 당첨 로또 (WinningLotto) [x] 입력받은 당첨 로또 관리 +[ ] 보너스 숫자 관리 ### 로또 당첨 판별 (LottoResult) [ ] 로또 당첨 여부 판별 From af31536ebe5b6bb8099003a435fc7348f3424167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 04:41:43 +0900 Subject: [PATCH 14/61] =?UTF-8?q?feat(InputFactory):=20=EB=B3=B4=EB=84=88?= =?UTF-8?q?=EC=8A=A4=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=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/lotto/view/InputFactory.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index 8d9a9e67ab..830d495e86 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -2,6 +2,7 @@ import camp.nextstep.edu.missionutils.Console; import lotto.Lotto; +import lotto.Model.BonusNumber; import java.util.List; import java.util.stream.Collectors; @@ -22,4 +23,10 @@ public Lotto readWinningNumber() { .collect(Collectors.toList()); return new Lotto(winningNumber); } + + public BonusNumber readBonusNumber() { + System.out.println(OutputMessage.BONUS_NUMBER); + String userInput = Console.readLine(); + return new BonusNumber(Integer.parseInt(userInput)); + } } From 3bffc0f739f312cc271c6191dee427804444243d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 04:43:17 +0900 Subject: [PATCH 15/61] =?UTF-8?q?feat(WinningLotto):=20=EB=B3=B4=EB=84=88?= =?UTF-8?q?=EC=8A=A4=20=EC=88=AB=EC=9E=90=20=EA=B4=80=EB=A6=AC=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 --- docs/README.md | 4 ++-- src/main/java/lotto/Model/BonusNumber.java | 14 ++++++++++++++ src/main/java/lotto/Model/WinningLotto.java | 8 +++++++- .../java/lotto/controller/LottoController.java | 2 +- src/main/java/lotto/view/OutputMessage.java | 3 ++- 5 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 src/main/java/lotto/Model/BonusNumber.java diff --git a/docs/README.md b/docs/README.md index 8263ce3f71..5b6e1ed84b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,7 +16,7 @@ ### 당첨 로또 (WinningLotto) [x] 입력받은 당첨 로또 관리 -[ ] 보너스 숫자 관리 +[x] 보너스 숫자 관리 ### 로또 당첨 판별 (LottoResult) [ ] 로또 당첨 여부 판별 @@ -30,7 +30,7 @@ [x] 당첨 번호 입력 기능 -[ ] 보너스 번호 입력 기능 +[x] 보너스 번호 입력 기능 ### 로또 구매 안내 출력 (OutputView) diff --git a/src/main/java/lotto/Model/BonusNumber.java b/src/main/java/lotto/Model/BonusNumber.java new file mode 100644 index 0000000000..805d22f76f --- /dev/null +++ b/src/main/java/lotto/Model/BonusNumber.java @@ -0,0 +1,14 @@ +package lotto.Model; + +public class BonusNumber { + + int bonusNumber; + + public BonusNumber(int bonusNumber) { + this.bonusNumber = bonusNumber; + } + + public int getBonus() { + return bonusNumber; + } +} diff --git a/src/main/java/lotto/Model/WinningLotto.java b/src/main/java/lotto/Model/WinningLotto.java index 3b61b2bb03..5e0dd1f94d 100644 --- a/src/main/java/lotto/Model/WinningLotto.java +++ b/src/main/java/lotto/Model/WinningLotto.java @@ -5,12 +5,18 @@ public class WinningLotto { private final Lotto lotto; + private final BonusNumber bonusNumber; - public WinningLotto(Lotto lotto) { + public WinningLotto(Lotto lotto, BonusNumber bonusNumber) { this.lotto = lotto; + this.bonusNumber = bonusNumber; } public Lotto getLotto() { return lotto; } + + public BonusNumber getBonusNumber() { + return bonusNumber; + } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index ff0b303f5d..eb84dcb8b3 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -19,7 +19,7 @@ public LottoController(OutputView outputView, InputFactory inputFactory) { public void start() { outputView.guidePurchaseLotto(); LottoCounter lottoCounter = new LottoCounter(inputFactory.readPurchaseAmount()); - WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber()); + WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); } } diff --git a/src/main/java/lotto/view/OutputMessage.java b/src/main/java/lotto/view/OutputMessage.java index ce46a54a62..b853dc19ad 100644 --- a/src/main/java/lotto/view/OutputMessage.java +++ b/src/main/java/lotto/view/OutputMessage.java @@ -3,7 +3,8 @@ public enum OutputMessage { GUIDE_PURCHASE("구입 금액을 입력해주세요."), - WINNING_NUMBER("당첨 번호를 입력해 주세요."); + WINNING_NUMBER("당첨 번호를 입력해 주세요."), + BONUS_NUMBER("보너스 번호를 입력해 주세요."); private final String message; From d89c8c9cd55d71ced8c7de9b10febf4512383789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 05:01:31 +0900 Subject: [PATCH 16/61] =?UTF-8?q?feat(Ranking):=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=A0=80=EC=9E=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20enum=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/lotto/Model/Ranking.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/lotto/Model/Ranking.java diff --git a/src/main/java/lotto/Model/Ranking.java b/src/main/java/lotto/Model/Ranking.java new file mode 100644 index 0000000000..d33ab01dda --- /dev/null +++ b/src/main/java/lotto/Model/Ranking.java @@ -0,0 +1,21 @@ +package lotto.Model; + +public enum Ranking { + + NONE(0, 0, false), + FIFTH(5000, 3, false), + FOURTH(50000, 4, false), + THIRD(1500000, 5, false), + SECOND(30000000, 5, true), + FIRST(2000000000, 6, false); + + private final int prize; + private final int matchNumber; + private final boolean matchBonus; + + Ranking(int prize, int matchNumber, boolean matchBonus) { + this.prize = prize; + this.matchNumber = matchNumber; + this.matchBonus = matchBonus; + } +} From 12c68039141b2467c59f7835fd61e66521dd751b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 05:58:53 +0900 Subject: [PATCH 17/61] =?UTF-8?q?feat(LottoResult):=20=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 ++-- src/main/java/lotto/Lotto.java | 7 ++++ src/main/java/lotto/Model/BonusNumber.java | 2 +- src/main/java/lotto/Model/LottoResult.java | 39 +++++++++++++++++++ src/main/java/lotto/Model/Ranking.java | 16 ++++++-- .../lotto/controller/LottoController.java | 8 ++-- 6 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 src/main/java/lotto/Model/LottoResult.java diff --git a/docs/README.md b/docs/README.md index 5b6e1ed84b..0a7b0ed191 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,7 +19,7 @@ [x] 보너스 숫자 관리 ### 로또 당첨 판별 (LottoResult) -[ ] 로또 당첨 여부 판별 +[x] 로또 당첨 여부 판별 [ ] 수익률 계산 @@ -34,12 +34,10 @@ ### 로또 구매 안내 출력 (OutputView) -[ ] 구입 금액 입력 안내 - -[ ] 로또 구매 개수 안내 - [ ] 당첨 통계 안내 +[ ] 수익률 안내 + ### 예외 처리(InputValidator) [ ] 당첨 번호를 6개 이상 입력한 경우 diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index 519793d1f7..6b5170096c 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -17,4 +17,11 @@ private void validate(List numbers) { } // TODO: 추가 기능 구현 + + public List getNumbers() { + return numbers; + } + public boolean hasNumber(int number) { + return numbers.contains(number); + } } diff --git a/src/main/java/lotto/Model/BonusNumber.java b/src/main/java/lotto/Model/BonusNumber.java index 805d22f76f..b9b0423f0a 100644 --- a/src/main/java/lotto/Model/BonusNumber.java +++ b/src/main/java/lotto/Model/BonusNumber.java @@ -2,7 +2,7 @@ public class BonusNumber { - int bonusNumber; + private final int bonusNumber; public BonusNumber(int bonusNumber) { this.bonusNumber = bonusNumber; diff --git a/src/main/java/lotto/Model/LottoResult.java b/src/main/java/lotto/Model/LottoResult.java new file mode 100644 index 0000000000..d9ef34db28 --- /dev/null +++ b/src/main/java/lotto/Model/LottoResult.java @@ -0,0 +1,39 @@ +package lotto.Model; + +import lotto.Lotto; + +import java.util.ArrayList; +import java.util.List; + +public class LottoResult { + + private final WinningLotto winningLotto; + private final PlayerLottoes playerLottoes; + + public LottoResult(WinningLotto winningLotto, PlayerLottoes playerLottoes) { + this.winningLotto = winningLotto; + this.playerLottoes = playerLottoes; + } + + public List calculateWinningRank() { + List rankings = new ArrayList<>(); + for (Lotto lotto : playerLottoes.getLottoes()) { + Ranking ranking = Ranking.calculate(calculateMatchNumber(lotto), hasBonusNumber(lotto)); + rankings.add(ranking); + } + return rankings; + } + + private Integer calculateMatchNumber(Lotto lotto) { + Lotto winningLottoNumbers = winningLotto.getLotto(); + return (int) winningLottoNumbers.getNumbers() + .stream() + .filter(lotto::hasNumber) + .count(); + } + + private boolean hasBonusNumber(Lotto lotto) { + BonusNumber bonusNumber = winningLotto.getBonusNumber(); + return lotto.hasNumber(bonusNumber.getBonus()); + } +} diff --git a/src/main/java/lotto/Model/Ranking.java b/src/main/java/lotto/Model/Ranking.java index d33ab01dda..5e9b2baee6 100644 --- a/src/main/java/lotto/Model/Ranking.java +++ b/src/main/java/lotto/Model/Ranking.java @@ -1,5 +1,7 @@ package lotto.Model; +import java.util.Arrays; + public enum Ranking { NONE(0, 0, false), @@ -11,11 +13,19 @@ public enum Ranking { private final int prize; private final int matchNumber; - private final boolean matchBonus; + private final boolean isMatchBonus; - Ranking(int prize, int matchNumber, boolean matchBonus) { + Ranking(int prize, int matchNumber, boolean isMatchBonus) { this.prize = prize; this.matchNumber = matchNumber; - this.matchBonus = matchBonus; + this.isMatchBonus = isMatchBonus; + } + + public static Ranking calculate(int matchNumber, boolean isMatchBonus) { + return Arrays.stream(values()) + .filter(ranking -> ranking.matchNumber == matchNumber) + .filter(ranking -> ranking.isMatchBonus == isMatchBonus) + .findAny() + .orElse(NONE); } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index eb84dcb8b3..dd09256b60 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,11 +1,11 @@ package lotto.controller; -import lotto.Model.LottoCounter; -import lotto.Model.PlayerLottoes; -import lotto.Model.WinningLotto; +import lotto.Model.*; import lotto.view.InputFactory; import lotto.view.OutputView; +import java.util.List; + public class LottoController { private final OutputView outputView; @@ -21,5 +21,7 @@ public void start() { LottoCounter lottoCounter = new LottoCounter(inputFactory.readPurchaseAmount()); WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + List rankings = lottoResult.calculateWinningRank(); } } From 7356fdebb998b05f9a056f97ad1c8886f2db7992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 07:38:22 +0900 Subject: [PATCH 18/61] =?UTF-8?q?feat(YieldCalculator):=20=EC=88=98?= =?UTF-8?q?=EC=9D=B5=EB=A5=A0=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 3 ++- src/main/java/lotto/Model/Ranking.java | 4 +++ .../java/lotto/Model/YieldCalculator.java | 27 +++++++++++++++++++ .../lotto/controller/LottoController.java | 2 ++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/Model/YieldCalculator.java diff --git a/docs/README.md b/docs/README.md index 0a7b0ed191..fd4c2e4a2f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,8 @@ ### 로또 당첨 판별 (LottoResult) [x] 로또 당첨 여부 판별 -[ ] 수익률 계산 +### 수익률 계산 (YieldCalculator) +[x] 수익률 계산 ### 입력 (InputFactory) diff --git a/src/main/java/lotto/Model/Ranking.java b/src/main/java/lotto/Model/Ranking.java index 5e9b2baee6..7e854c62e3 100644 --- a/src/main/java/lotto/Model/Ranking.java +++ b/src/main/java/lotto/Model/Ranking.java @@ -28,4 +28,8 @@ public static Ranking calculate(int matchNumber, boolean isMatchBonus) { .findAny() .orElse(NONE); } + + public int getPrize() { + return prize; + } } diff --git a/src/main/java/lotto/Model/YieldCalculator.java b/src/main/java/lotto/Model/YieldCalculator.java new file mode 100644 index 0000000000..da12340c49 --- /dev/null +++ b/src/main/java/lotto/Model/YieldCalculator.java @@ -0,0 +1,27 @@ +package lotto.Model; + +import java.util.List; + +public class YieldCalculator { + + private final List rankings; + private final int lotteryTickets; + private static final int LOTTO_PRICE = 1000; + private static final int PERCENTAGE = 100; + + public YieldCalculator(List rankings, int lotteryTickets) { + this.rankings = rankings; + this.lotteryTickets = lotteryTickets; + } + + public double calculateYield() { + double totalPrize = calculateTotalPrize(); + return (totalPrize / (LOTTO_PRICE * lotteryTickets)) * PERCENTAGE; + } + + private int calculateTotalPrize() { + return rankings.stream() + .mapToInt(Ranking::getPrize) + .sum(); + } +} diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index dd09256b60..092ffdff38 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -23,5 +23,7 @@ public void start() { PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); List rankings = lottoResult.calculateWinningRank(); + YieldCalculator yieldCalculator = new YieldCalculator(rankings, lottoCounter.getLotteryTicket()); + yieldCalculator.calculateYield(); } } From dbef4cbd0c02a2ad733d44c72523c292ca613ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 21:57:54 +0900 Subject: [PATCH 19/61] =?UTF-8?q?docs:=20=EB=A1=9C=EB=98=90=20=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=20=EA=B3=84=EC=82=B0=20=EC=97=AD=ED=95=A0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index fd4c2e4a2f..3533b3e1c3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,12 +16,12 @@ ### 당첨 로또 (WinningLotto) [x] 입력받은 당첨 로또 관리 + [x] 보너스 숫자 관리 -### 로또 당첨 판별 (LottoResult) +### 로또 당첨 계산 (LottoResult) [x] 로또 당첨 여부 판별 -### 수익률 계산 (YieldCalculator) [x] 수익률 계산 From 7eadde7703bc5635fcf1d422cb80c7337d858f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 22:02:26 +0900 Subject: [PATCH 20/61] =?UTF-8?q?feat(LottoResult):=20=EC=88=98=EC=9D=B5?= =?UTF-8?q?=EB=A5=A0=20=EA=B3=84=EC=82=B0=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/lotto/Model/LottoResult.java | 36 +++++++++++++++---- src/main/java/lotto/Model/PlayerLottoes.java | 3 ++ .../java/lotto/Model/YieldCalculator.java | 27 -------------- .../lotto/controller/LottoController.java | 7 ++-- 4 files changed, 35 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/lotto/Model/YieldCalculator.java diff --git a/src/main/java/lotto/Model/LottoResult.java b/src/main/java/lotto/Model/LottoResult.java index d9ef34db28..ed68f2b8bf 100644 --- a/src/main/java/lotto/Model/LottoResult.java +++ b/src/main/java/lotto/Model/LottoResult.java @@ -2,26 +2,28 @@ import lotto.Lotto; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; public class LottoResult { private final WinningLotto winningLotto; private final PlayerLottoes playerLottoes; + private final Map rankings; + private static final int LOTTO_PRICE = 1000; + private static final int PERCENTAGE = 100; public LottoResult(WinningLotto winningLotto, PlayerLottoes playerLottoes) { this.winningLotto = winningLotto; this.playerLottoes = playerLottoes; + this.rankings = new HashMap<>(); } - public List calculateWinningRank() { - List rankings = new ArrayList<>(); + public void calculateWinningRank() { for (Lotto lotto : playerLottoes.getLottoes()) { Ranking ranking = Ranking.calculate(calculateMatchNumber(lotto), hasBonusNumber(lotto)); - rankings.add(ranking); + rankings.put(ranking, getPlus(ranking)); } - return rankings; } private Integer calculateMatchNumber(Lotto lotto) { @@ -32,8 +34,30 @@ private Integer calculateMatchNumber(Lotto lotto) { .count(); } + private Integer getPlus(Ranking ranking) { + return rankings.getOrDefault(ranking, 0) + 1; + } + private boolean hasBonusNumber(Lotto lotto) { BonusNumber bonusNumber = winningLotto.getBonusNumber(); return lotto.hasNumber(bonusNumber.getBonus()); } + + public Map getRankingsResult() { + return rankings; + } + + public double calculateYield() { + double totalPrize = calculateTotalPrize(); + int lotteryTickets = playerLottoes.size(); + return (totalPrize / (LOTTO_PRICE * lotteryTickets)) * PERCENTAGE; + } + + private double calculateTotalPrize() { + double sum = 0; + for(Ranking ranking: rankings.keySet()) { + sum += ranking.getPrize() * rankings.get(ranking); + } + return sum; + } } diff --git a/src/main/java/lotto/Model/PlayerLottoes.java b/src/main/java/lotto/Model/PlayerLottoes.java index 04a5b149dd..9656122508 100644 --- a/src/main/java/lotto/Model/PlayerLottoes.java +++ b/src/main/java/lotto/Model/PlayerLottoes.java @@ -25,4 +25,7 @@ private List generateLottoes(int lotteryTicketsNumber) { public List getLottoes() { return lottoes; } + public int size() { + return lottoes.size(); + } } diff --git a/src/main/java/lotto/Model/YieldCalculator.java b/src/main/java/lotto/Model/YieldCalculator.java deleted file mode 100644 index da12340c49..0000000000 --- a/src/main/java/lotto/Model/YieldCalculator.java +++ /dev/null @@ -1,27 +0,0 @@ -package lotto.Model; - -import java.util.List; - -public class YieldCalculator { - - private final List rankings; - private final int lotteryTickets; - private static final int LOTTO_PRICE = 1000; - private static final int PERCENTAGE = 100; - - public YieldCalculator(List rankings, int lotteryTickets) { - this.rankings = rankings; - this.lotteryTickets = lotteryTickets; - } - - public double calculateYield() { - double totalPrize = calculateTotalPrize(); - return (totalPrize / (LOTTO_PRICE * lotteryTickets)) * PERCENTAGE; - } - - private int calculateTotalPrize() { - return rankings.stream() - .mapToInt(Ranking::getPrize) - .sum(); - } -} diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 092ffdff38..a940bfd2ae 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -4,8 +4,6 @@ import lotto.view.InputFactory; import lotto.view.OutputView; -import java.util.List; - public class LottoController { private final OutputView outputView; @@ -22,8 +20,7 @@ public void start() { WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - List rankings = lottoResult.calculateWinningRank(); - YieldCalculator yieldCalculator = new YieldCalculator(rankings, lottoCounter.getLotteryTicket()); - yieldCalculator.calculateYield(); + lottoResult.calculateWinningRank(); + System.out.println(lottoResult.calculateYield()); } } From 654efd7b34e6e42232aaab046b891ea25877acca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 23:41:06 +0900 Subject: [PATCH 21/61] =?UTF-8?q?feat(OutputView):=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=ED=86=B5=EA=B3=84=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 55 ++++++++----------- src/main/java/lotto/Model/Ranking.java | 21 ++++--- .../lotto/controller/LottoController.java | 3 +- src/main/java/lotto/view/OutputMessage.java | 5 +- src/main/java/lotto/view/OutputView.java | 20 +++++++ 5 files changed, 61 insertions(+), 43 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3533b3e1c3..cbfaef6f28 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,55 +1,44 @@ ## 3주차 미션 로또 기능 정의 ### 로또 게임 진행 (LottoController) -[x] 게임 시작 - -[ ] 게임 진행 +- [X] 게임 시작 +- [ ] 게임 진행 ### 로또 개수 계산 (LottoCounter) -[x] 금액에 맞는 로또 개수 계산 +- [x] 금액에 맞는 로또 개수 계산 ### 랜덤 로또 생성 (RandomLottoGenerator) -[x] 랜덤 번호 6개로 로또 생성 +- [x] 랜덤 번호 6개로 로또 생성 ### 사용자 생성 로또 (PlayerLotto) -[x] 원하는 개수만큼 로또 생성 +- [x] 원하는 개수만큼 로또 생성 ### 당첨 로또 (WinningLotto) -[x] 입력받은 당첨 로또 관리 - -[x] 보너스 숫자 관리 +- [x] 입력받은 당첨 로또 관리 +- [x] 보너스 숫자 관리 ### 로또 당첨 계산 (LottoResult) -[x] 로또 당첨 여부 판별 - -[x] 수익률 계산 +- [x] 로또 당첨 여부 판별 +- [x] 수익률 계산 ### 입력 (InputFactory) - -[x] 로또 구입 금액 입력 기능 - -[x] 당첨 번호 입력 기능 - -[x] 보너스 번호 입력 기능 +- [x] 로또 구입 금액 입력 기능 +- [x] 당첨 번호 입력 기능 +- [x] 보너스 번호 입력 기능 ### 로또 구매 안내 출력 (OutputView) - -[ ] 당첨 통계 안내 - -[ ] 수익률 안내 +- [ ] 구매 개수 안내 +- [ ] 생성된 로또 번호 안내 +- [x] 당첨 통계 안내 +- [ ] 수익률 안내 ### 예외 처리(InputValidator) -[ ] 당첨 번호를 6개 이상 입력한 경우 - -[ ] 보너스 번호를 하나 이상 입력한 경우 - -[ ] 구입 금액이 1000원 단위가 아닌 경우 - -[ ] 구입 금액 입력이 숫자가 아닌 경우 - -[ ] 잘못된 형식으로 당첨 번호를 입력한 경우 (쉼표가 없는 경우 등) - -[ ] 중복된 수를 입력한 경우 +- [ ] 당첨 번호를 6개 이상 입력한 경우 +- [ ] 보너스 번호를 하나 이상 입력한 경우 +- [ ] 구입 금액이 1000원 단위가 아닌 경우 +- [ ] 구입 금액 입력이 숫자가 아닌 경우 +- [ ] 잘못된 형식으로 당첨 번호를 입력한 경우 (쉼표가 없는 경우 등) +- [ ] 중복된 수를 입력한 경우 diff --git a/src/main/java/lotto/Model/Ranking.java b/src/main/java/lotto/Model/Ranking.java index 7e854c62e3..b892c37e23 100644 --- a/src/main/java/lotto/Model/Ranking.java +++ b/src/main/java/lotto/Model/Ranking.java @@ -3,22 +3,23 @@ import java.util.Arrays; public enum Ranking { - - NONE(0, 0, false), - FIFTH(5000, 3, false), - FOURTH(50000, 4, false), - THIRD(1500000, 5, false), - SECOND(30000000, 5, true), - FIRST(2000000000, 6, false); + NONE(0, 0, false, null), + FIFTH(5000, 3, false, "3개 일치 (5,000원) - %d개"), + FOURTH(50000, 4, false, "4개 일치 (50,000원) - %d개"), + THIRD(1500000, 5, false, "5개 일치 (1,500,000원) - %d개"), + SECOND(30000000, 5, true, "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"), + FIRST(2000000000, 6, false, "6개 일치 (2,000,000,000원) - %d개"); private final int prize; private final int matchNumber; private final boolean isMatchBonus; + private final String message; - Ranking(int prize, int matchNumber, boolean isMatchBonus) { + Ranking(int prize, int matchNumber, boolean isMatchBonus, String message) { this.prize = prize; this.matchNumber = matchNumber; this.isMatchBonus = isMatchBonus; + this.message = message; } public static Ranking calculate(int matchNumber, boolean isMatchBonus) { @@ -32,4 +33,8 @@ public static Ranking calculate(int matchNumber, boolean isMatchBonus) { public int getPrize() { return prize; } + + public String getMessage(int result) { + return String.format(message, result); + } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index a940bfd2ae..112cce9eed 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -21,6 +21,7 @@ public void start() { PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); lottoResult.calculateWinningRank(); - System.out.println(lottoResult.calculateYield()); + lottoResult.calculateYield(); + outputView.guideLottoResult(lottoResult.getRankingsResult()); } } diff --git a/src/main/java/lotto/view/OutputMessage.java b/src/main/java/lotto/view/OutputMessage.java index b853dc19ad..a2e81d72fc 100644 --- a/src/main/java/lotto/view/OutputMessage.java +++ b/src/main/java/lotto/view/OutputMessage.java @@ -4,7 +4,10 @@ public enum OutputMessage { GUIDE_PURCHASE("구입 금액을 입력해주세요."), WINNING_NUMBER("당첨 번호를 입력해 주세요."), - BONUS_NUMBER("보너스 번호를 입력해 주세요."); + BONUS_NUMBER("보너스 번호를 입력해 주세요."), + RESULT_MESSAGE("당첨 통계"), + LINE("---"), + BUY_NUMBER("개 구매하였습니다."); private final String message; diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 3f9fc3383a..57aadab6e6 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,8 +1,28 @@ package lotto.view; +import lotto.Model.Ranking; + +import java.util.Arrays; +import java.util.Map; + public class OutputView { + private static final int NONE = 1; + private static final int DEFAULT = 0; + public void guidePurchaseLotto() { System.out.println(OutputMessage.GUIDE_PURCHASE); } + + public void guideLottoResult(Map rankingResult) { + System.out.println(OutputMessage.RESULT_MESSAGE); + System.out.println(OutputMessage.LINE); + Arrays.stream(Ranking.values()) + .skip(NONE) + .forEach(ranking -> printRankingMessage(ranking, rankingResult)); + } + + private void printRankingMessage(Ranking ranking, Map rankingResult) { + System.out.println(ranking.getMessage(rankingResult.getOrDefault(ranking, DEFAULT))); + } } From 25eaa4caefc6d957d15b6b1d2a70765b4a4a8416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Sun, 6 Aug 2023 23:58:46 +0900 Subject: [PATCH 22/61] =?UTF-8?q?feat(OutputView):=20=EA=B5=AC=EB=A7=A4=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/lotto/controller/LottoController.java | 2 ++ src/main/java/lotto/view/OutputMessage.java | 2 +- src/main/java/lotto/view/OutputView.java | 4 ++++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index cbfaef6f28..47d6d32824 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,7 +28,7 @@ - [x] 보너스 번호 입력 기능 ### 로또 구매 안내 출력 (OutputView) -- [ ] 구매 개수 안내 +- [x] 구매 개수 안내 - [ ] 생성된 로또 번호 안내 - [x] 당첨 통계 안내 - [ ] 수익률 안내 diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 112cce9eed..5c01e8f6be 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -17,11 +17,13 @@ public LottoController(OutputView outputView, InputFactory inputFactory) { public void start() { outputView.guidePurchaseLotto(); LottoCounter lottoCounter = new LottoCounter(inputFactory.readPurchaseAmount()); + outputView.printPurchaseCount(lottoCounter.getLotteryTicket()); WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); lottoResult.calculateWinningRank(); lottoResult.calculateYield(); outputView.guideLottoResult(lottoResult.getRankingsResult()); + } } diff --git a/src/main/java/lotto/view/OutputMessage.java b/src/main/java/lotto/view/OutputMessage.java index a2e81d72fc..cdfe2a0b09 100644 --- a/src/main/java/lotto/view/OutputMessage.java +++ b/src/main/java/lotto/view/OutputMessage.java @@ -7,7 +7,7 @@ public enum OutputMessage { BONUS_NUMBER("보너스 번호를 입력해 주세요."), RESULT_MESSAGE("당첨 통계"), LINE("---"), - BUY_NUMBER("개 구매하였습니다."); + BUY_NUMBER("%d개를 구매했습니다.\n"); private final String message; diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 57aadab6e6..2f803ea117 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -25,4 +25,8 @@ public void guideLottoResult(Map rankingResult) { private void printRankingMessage(Ranking ranking, Map rankingResult) { System.out.println(ranking.getMessage(rankingResult.getOrDefault(ranking, DEFAULT))); } + + public void printPurchaseCount(int lottoTicketsNumber) { + System.out.printf(OutputMessage.BUY_NUMBER.toString(), lottoTicketsNumber); + } } From 150ff620b15eeadafe7401a1b59ac64ec7611d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 00:05:26 +0900 Subject: [PATCH 23/61] =?UTF-8?q?feat(OutputView):=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EB=90=9C=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB=EC=9E=90=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=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 --- docs/README.md | 2 +- src/main/java/lotto/controller/LottoController.java | 1 + src/main/java/lotto/view/OutputView.java | 11 +++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 47d6d32824..596ba197e3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -29,7 +29,7 @@ ### 로또 구매 안내 출력 (OutputView) - [x] 구매 개수 안내 -- [ ] 생성된 로또 번호 안내 +- [x] 생성된 로또 번호 안내 - [x] 당첨 통계 안내 - [ ] 수익률 안내 diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 5c01e8f6be..d88c24a87a 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -20,6 +20,7 @@ public void start() { outputView.printPurchaseCount(lottoCounter.getLotteryTicket()); WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); + outputView.printPlayerLottoes(playerLottoes); LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); lottoResult.calculateWinningRank(); lottoResult.calculateYield(); diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 2f803ea117..eca23331df 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,5 +1,7 @@ package lotto.view; +import lotto.Lotto; +import lotto.Model.PlayerLottoes; import lotto.Model.Ranking; import java.util.Arrays; @@ -29,4 +31,13 @@ private void printRankingMessage(Ranking ranking, Map rankingR public void printPurchaseCount(int lottoTicketsNumber) { System.out.printf(OutputMessage.BUY_NUMBER.toString(), lottoTicketsNumber); } + + public void printPlayerLottoes(PlayerLottoes playerLottoes) { + playerLottoes.getLottoes() + .forEach(this::printLottoNumber); + } + + private void printLottoNumber(Lotto lotto) { + System.out.println(lotto.getNumbers()); + } } From 09923943f4bc61132d3fd40eb9126eb0e74a0039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 00:27:50 +0900 Subject: [PATCH 24/61] =?UTF-8?q?feat(OutputView):=20=EC=88=98=EC=9D=B5?= =?UTF-8?q?=EB=A5=A0=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 --- docs/README.md | 2 +- src/main/java/lotto/controller/LottoController.java | 3 +-- src/main/java/lotto/view/OutputMessage.java | 3 ++- src/main/java/lotto/view/OutputView.java | 4 ++++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 596ba197e3..28d8d36ddd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -31,7 +31,7 @@ - [x] 구매 개수 안내 - [x] 생성된 로또 번호 안내 - [x] 당첨 통계 안내 -- [ ] 수익률 안내 +- [x] 수익률 안내 ### 예외 처리(InputValidator) - [ ] 당첨 번호를 6개 이상 입력한 경우 diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index d88c24a87a..9daadaaf93 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -23,8 +23,7 @@ public void start() { outputView.printPlayerLottoes(playerLottoes); LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); lottoResult.calculateWinningRank(); - lottoResult.calculateYield(); outputView.guideLottoResult(lottoResult.getRankingsResult()); - + outputView.printProfit(lottoResult.calculateYield()); } } diff --git a/src/main/java/lotto/view/OutputMessage.java b/src/main/java/lotto/view/OutputMessage.java index cdfe2a0b09..578bec9d68 100644 --- a/src/main/java/lotto/view/OutputMessage.java +++ b/src/main/java/lotto/view/OutputMessage.java @@ -7,7 +7,8 @@ public enum OutputMessage { BONUS_NUMBER("보너스 번호를 입력해 주세요."), RESULT_MESSAGE("당첨 통계"), LINE("---"), - BUY_NUMBER("%d개를 구매했습니다.\n"); + BUY_NUMBER("%d개를 구매했습니다.\n"), + PROFIT_MESSAGE("총 수익률은 %.1f%%입니다.\n"); private final String message; diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index eca23331df..10406f24ff 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -40,4 +40,8 @@ public void printPlayerLottoes(PlayerLottoes playerLottoes) { private void printLottoNumber(Lotto lotto) { System.out.println(lotto.getNumbers()); } + + public void printProfit(Double profit) { + System.out.printf((OutputMessage.PROFIT_MESSAGE.toString()), profit); + } } From c9131a36c88826f9755a144b63142375ada720ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 01:07:21 +0900 Subject: [PATCH 25/61] =?UTF-8?q?feat(InputValidator):=20=EB=B3=B4?= =?UTF-8?q?=EB=84=88=EC=8A=A4=20=EC=88=AB=EC=9E=90=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=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 --- docs/README.md | 5 ++-- .../java/lotto/view/ExceptionMessage.java | 18 ++++++++++++ src/main/java/lotto/view/InputFactory.java | 7 +++++ src/main/java/lotto/view/InputValidator.java | 29 +++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/main/java/lotto/view/ExceptionMessage.java create mode 100644 src/main/java/lotto/view/InputValidator.java diff --git a/docs/README.md b/docs/README.md index 28d8d36ddd..2a9c2807b6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,6 +16,7 @@ ### 당첨 로또 (WinningLotto) - [x] 입력받은 당첨 로또 관리 - [x] 보너스 숫자 관리 +- [ ] 예외) 당첨 로또 숫자와 보너스 숫자가 겹칠 경우 ### 로또 당첨 계산 (LottoResult) - [x] 로또 당첨 여부 판별 @@ -34,8 +35,8 @@ - [x] 수익률 안내 ### 예외 처리(InputValidator) -- [ ] 당첨 번호를 6개 이상 입력한 경우 -- [ ] 보너스 번호를 하나 이상 입력한 경우 +- [x] 보너스 번호를 입력할 때 숫자가 아닌 입력한 경우 +- [x] 범위 이외의 숫자를 보너스 숫자로 입력한 경우 - [ ] 구입 금액이 1000원 단위가 아닌 경우 - [ ] 구입 금액 입력이 숫자가 아닌 경우 - [ ] 잘못된 형식으로 당첨 번호를 입력한 경우 (쉼표가 없는 경우 등) diff --git a/src/main/java/lotto/view/ExceptionMessage.java b/src/main/java/lotto/view/ExceptionMessage.java new file mode 100644 index 0000000000..fa55be4b49 --- /dev/null +++ b/src/main/java/lotto/view/ExceptionMessage.java @@ -0,0 +1,18 @@ +package lotto.view; + +public enum ExceptionMessage { + + NOT_INTEGER("[ERROR] 번호는 숫자만 입력할 수 있습니다.."), + INCORRECT_RANGE("[ERROR] 올바르지 않은 범위의 숫자입니다."); + + private final String message; + + ExceptionMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return this.message; + } +} diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index 830d495e86..3e123baf30 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -10,6 +10,12 @@ public class InputFactory { + private final InputValidator inputValidator; + + public InputFactory() { + this.inputValidator = new InputValidator(); + } + public int readPurchaseAmount() { String userInput = Console.readLine(); return Integer.parseInt(userInput); @@ -27,6 +33,7 @@ public Lotto readWinningNumber() { public BonusNumber readBonusNumber() { System.out.println(OutputMessage.BONUS_NUMBER); String userInput = Console.readLine(); + inputValidator.validateBonusNumber(userInput); return new BonusNumber(Integer.parseInt(userInput)); } } diff --git a/src/main/java/lotto/view/InputValidator.java b/src/main/java/lotto/view/InputValidator.java new file mode 100644 index 0000000000..6cec4c69b3 --- /dev/null +++ b/src/main/java/lotto/view/InputValidator.java @@ -0,0 +1,29 @@ +package lotto.view; + +public class InputValidator { + + private static final int MAX_NUMBER = 45; + private static final int MIN_NUMBER = 1; + + public void validateBonusNumber(String bonusNumber) { + isInteger(bonusNumber); + isCorrectRange(bonusNumber); + } + + private void isInteger(String bonusNumber) { + try { + Integer.parseInt(bonusNumber); + } catch (NumberFormatException e) { + ExceptionMessage exceptionMessage = ExceptionMessage.NOT_INTEGER; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } + + private void isCorrectRange(String bonusNumber) { + int bonus = Integer.parseInt(bonusNumber); + if (bonus < MIN_NUMBER || bonus > MAX_NUMBER) { + ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_RANGE; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } +} From 5a414944222ee6ebb52a1249bfd4a7dc639f0f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 02:40:59 +0900 Subject: [PATCH 26/61] =?UTF-8?q?feat(InputValidator):=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EC=9E=85=EB=A0=A5=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- src/main/java/lotto/view/ExceptionMessage.java | 5 +++-- src/main/java/lotto/view/InputFactory.java | 1 + src/main/java/lotto/view/InputValidator.java | 18 ++++++++++++++++-- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 2a9c2807b6..cb86301422 100644 --- a/docs/README.md +++ b/docs/README.md @@ -37,8 +37,8 @@ ### 예외 처리(InputValidator) - [x] 보너스 번호를 입력할 때 숫자가 아닌 입력한 경우 - [x] 범위 이외의 숫자를 보너스 숫자로 입력한 경우 -- [ ] 구입 금액이 1000원 단위가 아닌 경우 -- [ ] 구입 금액 입력이 숫자가 아닌 경우 +- [x] 구입 금액이 1000원 단위가 아닌 경우 +- [x] 구입 금액 입력이 숫자가 아닌 경우 - [ ] 잘못된 형식으로 당첨 번호를 입력한 경우 (쉼표가 없는 경우 등) - [ ] 중복된 수를 입력한 경우 diff --git a/src/main/java/lotto/view/ExceptionMessage.java b/src/main/java/lotto/view/ExceptionMessage.java index fa55be4b49..7d7b0fa9ed 100644 --- a/src/main/java/lotto/view/ExceptionMessage.java +++ b/src/main/java/lotto/view/ExceptionMessage.java @@ -2,8 +2,9 @@ public enum ExceptionMessage { - NOT_INTEGER("[ERROR] 번호는 숫자만 입력할 수 있습니다.."), - INCORRECT_RANGE("[ERROR] 올바르지 않은 범위의 숫자입니다."); + NOT_INTEGER("[ERROR] 번호는 숫자만 입력할 수 있습니다."), + INCORRECT_RANGE("[ERROR] 올바르지 않은 범위의 숫자입니다."), + INCORRECT_AMOUNT("[ERROR] 금액은 천 원단위로 입력할 수 있습니다."); private final String message; diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index 3e123baf30..b6175f1c85 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -18,6 +18,7 @@ public InputFactory() { public int readPurchaseAmount() { String userInput = Console.readLine(); + inputValidator.validatePurchaseAmount(userInput); return Integer.parseInt(userInput); } diff --git a/src/main/java/lotto/view/InputValidator.java b/src/main/java/lotto/view/InputValidator.java index 6cec4c69b3..a2ce32ed7c 100644 --- a/src/main/java/lotto/view/InputValidator.java +++ b/src/main/java/lotto/view/InputValidator.java @@ -4,15 +4,21 @@ public class InputValidator { private static final int MAX_NUMBER = 45; private static final int MIN_NUMBER = 1; + private static final int Thousand = 1000; public void validateBonusNumber(String bonusNumber) { isInteger(bonusNumber); isCorrectRange(bonusNumber); } - private void isInteger(String bonusNumber) { + public void validatePurchaseAmount(String amount) { + isInteger(amount); + isThousandUnits(amount); + } + + private void isInteger(String number) { try { - Integer.parseInt(bonusNumber); + Integer.parseInt(number); } catch (NumberFormatException e) { ExceptionMessage exceptionMessage = ExceptionMessage.NOT_INTEGER; throw new IllegalArgumentException(exceptionMessage.toString()); @@ -26,4 +32,12 @@ private void isCorrectRange(String bonusNumber) { throw new IllegalArgumentException(exceptionMessage.toString()); } } + + private void isThousandUnits(String userInput) { + int amount = Integer.parseInt(userInput); + if((amount % Thousand) != 0) { + ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_AMOUNT; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } } From 525d50b225bfa77d45b6152ee3e892f899ad43aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 02:55:46 +0900 Subject: [PATCH 27/61] =?UTF-8?q?feat(InputValidator):=20=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=20=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=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 --- docs/README.md | 2 +- src/main/java/lotto/view/ExceptionMessage.java | 3 ++- src/main/java/lotto/view/InputFactory.java | 1 + src/main/java/lotto/view/InputValidator.java | 11 +++++++++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index cb86301422..da27949e20 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,7 +39,7 @@ - [x] 범위 이외의 숫자를 보너스 숫자로 입력한 경우 - [x] 구입 금액이 1000원 단위가 아닌 경우 - [x] 구입 금액 입력이 숫자가 아닌 경우 -- [ ] 잘못된 형식으로 당첨 번호를 입력한 경우 (쉼표가 없는 경우 등) +- [x] 잘못된 형식으로 당첨 번호를 입력한 경우 (쉼표가 없는 경우 등) - [ ] 중복된 수를 입력한 경우 diff --git a/src/main/java/lotto/view/ExceptionMessage.java b/src/main/java/lotto/view/ExceptionMessage.java index 7d7b0fa9ed..018b66b4da 100644 --- a/src/main/java/lotto/view/ExceptionMessage.java +++ b/src/main/java/lotto/view/ExceptionMessage.java @@ -4,7 +4,8 @@ public enum ExceptionMessage { NOT_INTEGER("[ERROR] 번호는 숫자만 입력할 수 있습니다."), INCORRECT_RANGE("[ERROR] 올바르지 않은 범위의 숫자입니다."), - INCORRECT_AMOUNT("[ERROR] 금액은 천 원단위로 입력할 수 있습니다."); + INCORRECT_AMOUNT("[ERROR] 금액은 천 원단위로 입력할 수 있습니다."), + NOT_CONTAIN_COMMA("[ERROR] ','로 숫자를 구분하여 주십시오."); private final String message; diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index b6175f1c85..a83ba770ef 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -25,6 +25,7 @@ public int readPurchaseAmount() { public Lotto readWinningNumber() { System.out.println(OutputMessage.WINNING_NUMBER); String userInput = Console.readLine(); + inputValidator.validateWinningNumbers(userInput); List winningNumber = Stream.of(userInput.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); diff --git a/src/main/java/lotto/view/InputValidator.java b/src/main/java/lotto/view/InputValidator.java index a2ce32ed7c..7de501fdb8 100644 --- a/src/main/java/lotto/view/InputValidator.java +++ b/src/main/java/lotto/view/InputValidator.java @@ -16,6 +16,10 @@ public void validatePurchaseAmount(String amount) { isThousandUnits(amount); } + public void validateWinningNumbers(String winningNumbers) { + isContainComma(winningNumbers); + } + private void isInteger(String number) { try { Integer.parseInt(number); @@ -40,4 +44,11 @@ private void isThousandUnits(String userInput) { throw new IllegalArgumentException(exceptionMessage.toString()); } } + + private void isContainComma(String userInput) { + if (!userInput.contains(",")) { + ExceptionMessage exceptionMessage = ExceptionMessage.NOT_CONTAIN_COMMA; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } } From 6d8a330442741965b1883d0ed3bbe7ea4c44ba23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 02:58:37 +0900 Subject: [PATCH 28/61] =?UTF-8?q?docs:=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index da27949e20..0682645e84 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,6 +22,10 @@ - [x] 로또 당첨 여부 판별 - [x] 수익률 계산 +### 로또 번호 관리(Lotto) +- [ ] 예외) 중복된 수를 입력한 경우 +- [x] 예외) 번호가 6개가 아닌 경우 +- [ ] 예외) 범위 이외의 수인 경우 ### 입력 (InputFactory) - [x] 로또 구입 금액 입력 기능 @@ -40,6 +44,5 @@ - [x] 구입 금액이 1000원 단위가 아닌 경우 - [x] 구입 금액 입력이 숫자가 아닌 경우 - [x] 잘못된 형식으로 당첨 번호를 입력한 경우 (쉼표가 없는 경우 등) -- [ ] 중복된 수를 입력한 경우 From f89612c1940032e6a3f8d9c401ea49e08bc21320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:00:25 +0900 Subject: [PATCH 29/61] =?UTF-8?q?chore:=20Lotto=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/{ => Model}/Lotto.java | 2 +- src/main/java/lotto/Model/LottoResult.java | 2 -- src/main/java/lotto/Model/PlayerLottoes.java | 2 -- src/main/java/lotto/Model/RandomLottoGenerator.java | 1 - src/main/java/lotto/Model/WinningLotto.java | 2 -- src/main/java/lotto/view/InputFactory.java | 2 +- src/main/java/lotto/view/OutputView.java | 2 +- src/test/java/lotto/LottoTest.java | 1 + 8 files changed, 4 insertions(+), 10 deletions(-) rename src/main/java/lotto/{ => Model}/Lotto.java (96%) diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Model/Lotto.java similarity index 96% rename from src/main/java/lotto/Lotto.java rename to src/main/java/lotto/Model/Lotto.java index 6b5170096c..e59f98aede 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Model/Lotto.java @@ -1,4 +1,4 @@ -package lotto; +package lotto.Model; import java.util.List; diff --git a/src/main/java/lotto/Model/LottoResult.java b/src/main/java/lotto/Model/LottoResult.java index ed68f2b8bf..ccc86817d4 100644 --- a/src/main/java/lotto/Model/LottoResult.java +++ b/src/main/java/lotto/Model/LottoResult.java @@ -1,7 +1,5 @@ package lotto.Model; -import lotto.Lotto; - import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/lotto/Model/PlayerLottoes.java b/src/main/java/lotto/Model/PlayerLottoes.java index 9656122508..de54848af4 100644 --- a/src/main/java/lotto/Model/PlayerLottoes.java +++ b/src/main/java/lotto/Model/PlayerLottoes.java @@ -1,7 +1,5 @@ package lotto.Model; -import lotto.Lotto; - import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/lotto/Model/RandomLottoGenerator.java b/src/main/java/lotto/Model/RandomLottoGenerator.java index 9f6f16816b..78a57795f3 100644 --- a/src/main/java/lotto/Model/RandomLottoGenerator.java +++ b/src/main/java/lotto/Model/RandomLottoGenerator.java @@ -1,7 +1,6 @@ package lotto.Model; import camp.nextstep.edu.missionutils.Randoms; -import lotto.Lotto; public class RandomLottoGenerator { diff --git a/src/main/java/lotto/Model/WinningLotto.java b/src/main/java/lotto/Model/WinningLotto.java index 5e0dd1f94d..50a8e844b6 100644 --- a/src/main/java/lotto/Model/WinningLotto.java +++ b/src/main/java/lotto/Model/WinningLotto.java @@ -1,7 +1,5 @@ package lotto.Model; -import lotto.Lotto; - public class WinningLotto { private final Lotto lotto; diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index a83ba770ef..9d834ed94d 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -1,7 +1,7 @@ package lotto.view; import camp.nextstep.edu.missionutils.Console; -import lotto.Lotto; +import lotto.Model.Lotto; import lotto.Model.BonusNumber; import java.util.List; diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 10406f24ff..0e8926291f 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,6 +1,6 @@ package lotto.view; -import lotto.Lotto; +import lotto.Model.Lotto; import lotto.Model.PlayerLottoes; import lotto.Model.Ranking; diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 0f3af0f6c4..2103eca2bf 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.Model.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From ae13c466f7b94abf060f96728a621e61393dbcbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:11:33 +0900 Subject: [PATCH 30/61] =?UTF-8?q?feat(Lotto):=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=9C=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/lotto/Model/Lotto.java | 23 +++++++++++++++---- .../java/lotto/view/ExceptionMessage.java | 2 ++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0682645e84..1530672bb2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,7 +23,7 @@ - [x] 수익률 계산 ### 로또 번호 관리(Lotto) -- [ ] 예외) 중복된 수를 입력한 경우 +- [x] 예외) 중복된 수를 입력한 경우 - [x] 예외) 번호가 6개가 아닌 경우 - [ ] 예외) 범위 이외의 수인 경우 diff --git a/src/main/java/lotto/Model/Lotto.java b/src/main/java/lotto/Model/Lotto.java index e59f98aede..57473b6487 100644 --- a/src/main/java/lotto/Model/Lotto.java +++ b/src/main/java/lotto/Model/Lotto.java @@ -1,22 +1,35 @@ package lotto.Model; +import lotto.view.ExceptionMessage; + +import java.util.HashSet; import java.util.List; +import java.util.Set; public class Lotto { private final List numbers; + private static final int LOTTO_SIZE = 6; public Lotto(List numbers) { - validate(numbers); + validateLottoSize(numbers); + validateDuplicateNumber(numbers); this.numbers = numbers; } - private void validate(List numbers) { - if (numbers.size() != 6) { - throw new IllegalArgumentException(); + private void validateLottoSize(List numbers) { + if (numbers.size() != LOTTO_SIZE) { + ExceptionMessage message = ExceptionMessage.INCORRECT_LOTTO_SIZE; + throw new IllegalArgumentException(message.toString()); } } - // TODO: 추가 기능 구현 + private void validateDuplicateNumber(List numbers) { + Set numberToSet = new HashSet<>(numbers); + if (numberToSet.size() != LOTTO_SIZE) { + ExceptionMessage message = ExceptionMessage.DUPLICATE_NUMBER; + throw new IllegalArgumentException(message.toString()); + } + } public List getNumbers() { return numbers; diff --git a/src/main/java/lotto/view/ExceptionMessage.java b/src/main/java/lotto/view/ExceptionMessage.java index 018b66b4da..7e7f1a238a 100644 --- a/src/main/java/lotto/view/ExceptionMessage.java +++ b/src/main/java/lotto/view/ExceptionMessage.java @@ -5,6 +5,8 @@ public enum ExceptionMessage { NOT_INTEGER("[ERROR] 번호는 숫자만 입력할 수 있습니다."), INCORRECT_RANGE("[ERROR] 올바르지 않은 범위의 숫자입니다."), INCORRECT_AMOUNT("[ERROR] 금액은 천 원단위로 입력할 수 있습니다."), + INCORRECT_LOTTO_SIZE("[ERROR] 6개의 숫자만 입력할 수 있습니다."), + DUPLICATE_NUMBER("[ERROR] 중복된 숫자는 입력할 수 없습니다."), NOT_CONTAIN_COMMA("[ERROR] ','로 숫자를 구분하여 주십시오."); private final String message; From f75f5d4239369d17ba710492baefebbd1ed5c4bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:17:06 +0900 Subject: [PATCH 31/61] =?UTF-8?q?feat(Lotto):=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EC=9D=B4=EC=99=B8=20=EC=88=AB=EC=9E=90=EA=B0=80=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=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 --- docs/README.md | 2 +- src/main/java/lotto/Model/Lotto.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 1530672bb2..84286c7638 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,7 +25,7 @@ ### 로또 번호 관리(Lotto) - [x] 예외) 중복된 수를 입력한 경우 - [x] 예외) 번호가 6개가 아닌 경우 -- [ ] 예외) 범위 이외의 수인 경우 +- [x] 예외) 범위 이외의 수인 경우 ### 입력 (InputFactory) - [x] 로또 구입 금액 입력 기능 diff --git a/src/main/java/lotto/Model/Lotto.java b/src/main/java/lotto/Model/Lotto.java index 57473b6487..6f0bc5589d 100644 --- a/src/main/java/lotto/Model/Lotto.java +++ b/src/main/java/lotto/Model/Lotto.java @@ -9,10 +9,13 @@ public class Lotto { private final List numbers; private static final int LOTTO_SIZE = 6; + private static final int MAX_NUMBER = 45; + private static final int MIN_NUMBER = 1; public Lotto(List numbers) { validateLottoSize(numbers); validateDuplicateNumber(numbers); + validateRange(numbers); this.numbers = numbers; } @@ -31,6 +34,16 @@ private void validateDuplicateNumber(List numbers) { } } + private void validateRange(List numbers) { + numbers.forEach(this::isCorrectRange); + } + private void isCorrectRange(int number) { + if (number < MIN_NUMBER || number > MAX_NUMBER) { + ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_RANGE; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } + public List getNumbers() { return numbers; } From 41b062d2992211bf26502aa94e013c90f9aef639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:21:40 +0900 Subject: [PATCH 32/61] =?UTF-8?q?feat(WinningLotto):=20=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=20=EB=A1=9C=EB=98=90=20=EC=88=AB=EC=9E=90=EC=99=80=20=EB=B3=B4?= =?UTF-8?q?=EB=84=88=EC=8A=A4=20=EC=88=AB=EC=9E=90=EA=B0=80=20=EA=B2=B9?= =?UTF-8?q?=EC=B9=A0=20=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/lotto/Model/WinningLotto.java | 10 ++++++++++ src/main/java/lotto/view/ExceptionMessage.java | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 84286c7638..4c2f67df06 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,7 +16,7 @@ ### 당첨 로또 (WinningLotto) - [x] 입력받은 당첨 로또 관리 - [x] 보너스 숫자 관리 -- [ ] 예외) 당첨 로또 숫자와 보너스 숫자가 겹칠 경우 +- [x] 예외) 당첨 로또 숫자와 보너스 숫자가 겹칠 경우 ### 로또 당첨 계산 (LottoResult) - [x] 로또 당첨 여부 판별 diff --git a/src/main/java/lotto/Model/WinningLotto.java b/src/main/java/lotto/Model/WinningLotto.java index 50a8e844b6..713216aa9d 100644 --- a/src/main/java/lotto/Model/WinningLotto.java +++ b/src/main/java/lotto/Model/WinningLotto.java @@ -1,15 +1,25 @@ package lotto.Model; +import lotto.view.ExceptionMessage; + public class WinningLotto { private final Lotto lotto; private final BonusNumber bonusNumber; public WinningLotto(Lotto lotto, BonusNumber bonusNumber) { + validateLottoAndBonusNumber(lotto, bonusNumber); this.lotto = lotto; this.bonusNumber = bonusNumber; } + private void validateLottoAndBonusNumber(Lotto lotto, BonusNumber bonusNumber) { + if (lotto.hasNumber(bonusNumber.getBonus())) { + ExceptionMessage message = ExceptionMessage.DUPLICATE_WINNING_NUMBER_AND_BONUS; + throw new IllegalArgumentException(message.toString()); + } + } + public Lotto getLotto() { return lotto; } diff --git a/src/main/java/lotto/view/ExceptionMessage.java b/src/main/java/lotto/view/ExceptionMessage.java index 7e7f1a238a..18382a148a 100644 --- a/src/main/java/lotto/view/ExceptionMessage.java +++ b/src/main/java/lotto/view/ExceptionMessage.java @@ -7,6 +7,7 @@ public enum ExceptionMessage { INCORRECT_AMOUNT("[ERROR] 금액은 천 원단위로 입력할 수 있습니다."), INCORRECT_LOTTO_SIZE("[ERROR] 6개의 숫자만 입력할 수 있습니다."), DUPLICATE_NUMBER("[ERROR] 중복된 숫자는 입력할 수 없습니다."), + DUPLICATE_WINNING_NUMBER_AND_BONUS("[ERROR] 당첨 숫자와 보너스 숫자가 중복됩니다."), NOT_CONTAIN_COMMA("[ERROR] ','로 숫자를 구분하여 주십시오."); private final String message; From 319051bf64649807bb0690eb1dfcf0cf11801109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:28:29 +0900 Subject: [PATCH 33/61] =?UTF-8?q?feat(OutputView):=20=EC=98=A4=EB=A5=98=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=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 25 +++++++++++-------- src/main/java/lotto/view/OutputView.java | 4 +++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 9daadaaf93..06baafc0d0 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -15,15 +15,20 @@ public LottoController(OutputView outputView, InputFactory inputFactory) { } public void start() { - outputView.guidePurchaseLotto(); - LottoCounter lottoCounter = new LottoCounter(inputFactory.readPurchaseAmount()); - outputView.printPurchaseCount(lottoCounter.getLotteryTicket()); - WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); - PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); - outputView.printPlayerLottoes(playerLottoes); - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); - outputView.guideLottoResult(lottoResult.getRankingsResult()); - outputView.printProfit(lottoResult.calculateYield()); + try { + outputView.guidePurchaseLotto(); + LottoCounter lottoCounter = new LottoCounter(inputFactory.readPurchaseAmount()); + outputView.printPurchaseCount(lottoCounter.getLotteryTicket()); + WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); + PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); + outputView.printPlayerLottoes(playerLottoes); + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + lottoResult.calculateWinningRank(); + outputView.guideLottoResult(lottoResult.getRankingsResult()); + outputView.printProfit(lottoResult.calculateYield()); + } catch (IllegalArgumentException error) { + outputView.printErrorMessage(error.getMessage()); + } + } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 0e8926291f..1291de958a 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -44,4 +44,8 @@ private void printLottoNumber(Lotto lotto) { public void printProfit(Double profit) { System.out.printf((OutputMessage.PROFIT_MESSAGE.toString()), profit); } + + public void printErrorMessage(String errorMessage) { + System.out.println(errorMessage); + } } From 798e2b4014ed58cf235639850b757e3fd83cc148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:38:08 +0900 Subject: [PATCH 34/61] =?UTF-8?q?feat(LottoController):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A7=84=ED=96=89=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 --- docs/README.md | 2 +- .../lotto/controller/LottoController.java | 31 +++++++++++++------ src/main/java/lotto/view/InputFactory.java | 1 + src/main/java/lotto/view/OutputView.java | 4 --- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/docs/README.md b/docs/README.md index 4c2f67df06..c98deb1eda 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ ### 로또 게임 진행 (LottoController) - [X] 게임 시작 -- [ ] 게임 진행 +- [x] 게임 진행 ### 로또 개수 계산 (LottoCounter) - [x] 금액에 맞는 로또 개수 계산 diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 06baafc0d0..30aac54431 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -16,19 +16,30 @@ public LottoController(OutputView outputView, InputFactory inputFactory) { public void start() { try { - outputView.guidePurchaseLotto(); - LottoCounter lottoCounter = new LottoCounter(inputFactory.readPurchaseAmount()); - outputView.printPurchaseCount(lottoCounter.getLotteryTicket()); - WinningLotto winningLotto = new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); - PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); - outputView.printPlayerLottoes(playerLottoes); - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); - outputView.guideLottoResult(lottoResult.getRankingsResult()); - outputView.printProfit(lottoResult.calculateYield()); + PlayerLottoes playerLottoes = buyLotto(); + WinningLotto winningLotto = createWinningLotto(); + calculateResult(playerLottoes, winningLotto); } catch (IllegalArgumentException error) { outputView.printErrorMessage(error.getMessage()); } + } + + private PlayerLottoes buyLotto() { + LottoCounter lottoCounter = new LottoCounter(inputFactory.readPurchaseAmount()); + PlayerLottoes playerLottoes = new PlayerLottoes(lottoCounter.getLotteryTicket()); + outputView.printPurchaseCount(lottoCounter.getLotteryTicket()); + outputView.printPlayerLottoes(playerLottoes); + return playerLottoes; + } + + private WinningLotto createWinningLotto() { + return new WinningLotto(inputFactory.readWinningNumber(), inputFactory.readBonusNumber()); + } + private void calculateResult(PlayerLottoes playerLottoes, WinningLotto winningLotto) { + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + lottoResult.calculateWinningRank(); + outputView.guideLottoResult(lottoResult.getRankingsResult()); + outputView.printProfit(lottoResult.calculateYield()); } } diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index 9d834ed94d..ec00008999 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -17,6 +17,7 @@ public InputFactory() { } public int readPurchaseAmount() { + System.out.println(OutputMessage.GUIDE_PURCHASE); String userInput = Console.readLine(); inputValidator.validatePurchaseAmount(userInput); return Integer.parseInt(userInput); diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 1291de958a..6b760a7326 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -12,10 +12,6 @@ public class OutputView { private static final int NONE = 1; private static final int DEFAULT = 0; - public void guidePurchaseLotto() { - System.out.println(OutputMessage.GUIDE_PURCHASE); - } - public void guideLottoResult(Map rankingResult) { System.out.println(OutputMessage.RESULT_MESSAGE); System.out.println(OutputMessage.LINE); From 53113e9bc8d258caf0685bb2a4b84c30d4d703a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:47:47 +0900 Subject: [PATCH 35/61] =?UTF-8?q?test(Lotto):=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/LottoTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 2103eca2bf..ace5e12c9b 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -19,10 +19,14 @@ void createLottoByOverSize() { @DisplayName("로또 번호에 중복된 숫자가 있으면 예외가 발생한다.") @Test void createLottoByDuplicatedNumber() { - // TODO: 이 테스트가 통과할 수 있게 구현 코드 작성 assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5))) .isInstanceOf(IllegalArgumentException.class); } - // 아래에 추가 테스트 작성 가능 + @DisplayName("로또 번호에 중복된 숫자가 있으면 예외가 발생한다.") + @Test + void createLottoByIncorrectRange() { + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 47))) + .isInstanceOf(IllegalArgumentException.class); + } } From 0a421284921c1792afbf1a9df818b45f7c63f9fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:54:42 +0900 Subject: [PATCH 36/61] =?UTF-8?q?test(LottoCounter):=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=EA=B0=9C=EC=88=98=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/Model/LottoCounterTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/java/lotto/Model/LottoCounterTest.java diff --git a/src/test/java/lotto/Model/LottoCounterTest.java b/src/test/java/lotto/Model/LottoCounterTest.java new file mode 100644 index 0000000000..90582a65ff --- /dev/null +++ b/src/test/java/lotto/Model/LottoCounterTest.java @@ -0,0 +1,17 @@ +package lotto.Model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoCounterTest { + + @DisplayName("금액을 입력하면 금액에 맞는 로또 개수를 반환한다.") + @Test + void createLottoTickets() { + LottoCounter lottoCounter = new LottoCounter(8000); + assertThat(lottoCounter.getLotteryTicket()).isEqualTo(8); + } +} From 6e29881e081f98f193ae719673f1fbbc09ea707f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 03:57:58 +0900 Subject: [PATCH 37/61] =?UTF-8?q?test(PlayerLottoes):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EB=A1=9C=EB=98=90=20=EC=83=9D=EC=84=B1=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/Model/PlayerLottoesTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/java/lotto/Model/PlayerLottoesTest.java diff --git a/src/test/java/lotto/Model/PlayerLottoesTest.java b/src/test/java/lotto/Model/PlayerLottoesTest.java new file mode 100644 index 0000000000..0d134ffe97 --- /dev/null +++ b/src/test/java/lotto/Model/PlayerLottoesTest.java @@ -0,0 +1,17 @@ +package lotto.Model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PlayerLottoesTest { + + @DisplayName("티켓 개수를 입력하면 갯수에 맞는 로또 번호 리스트가 생성된다.") + @Test + void createPlayerLottoes() { + int ticketNumber = 8; + PlayerLottoes playerLottoes = new PlayerLottoes(ticketNumber); + assertThat(playerLottoes.size()).isEqualTo(ticketNumber); + } +} From 58c28afaf358ffc914832e242b2ab80eadcf75e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 04:11:25 +0900 Subject: [PATCH 38/61] =?UTF-8?q?test(WinningLotto):=20=EC=A0=95=EC=83=81?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5,=20=EB=B9=84=EC=A0=95=EC=83=81=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/Model/WinnigLottoTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/test/java/lotto/Model/WinnigLottoTest.java diff --git a/src/test/java/lotto/Model/WinnigLottoTest.java b/src/test/java/lotto/Model/WinnigLottoTest.java new file mode 100644 index 0000000000..5ebcaf44cf --- /dev/null +++ b/src/test/java/lotto/Model/WinnigLottoTest.java @@ -0,0 +1,30 @@ +package lotto.Model; + +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.assertj.core.api.Assertions.assertThatThrownBy; + +public class WinnigLottoTest { + + @DisplayName("당첨 번호와 보너스 번호를 입력할 경우 당첨 로또가 생성된다.") + @Test + void createWinningLotto() { + Lotto lotto = new Lotto(List.of(1, 2, 3, 4, 5, 6)); + BonusNumber bonusNumber = new BonusNumber(10); + assertThat(new WinningLotto(lotto, bonusNumber)) + .isInstanceOf(WinningLotto.class); + } + + @DisplayName("당첨 번호와 보너스 번호가 중복될 경 예외가 발생한다.") + @Test + void createWinningLottoByDuplicateNumbers() { + Lotto lotto = new Lotto(List.of(1, 2, 3, 4, 5, 6)); + BonusNumber bonusNumber = new BonusNumber(1); + assertThatThrownBy(() -> new WinningLotto(lotto, bonusNumber)) + .isInstanceOf(IllegalArgumentException.class); + } +} From ab5bd93592ad64143e0cea6121a6ee358f2dc38a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 04:22:22 +0900 Subject: [PATCH 39/61] =?UTF-8?q?test(InputFactory):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/InputTest.java | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/test/java/lotto/InputTest.java diff --git a/src/test/java/lotto/InputTest.java b/src/test/java/lotto/InputTest.java new file mode 100644 index 0000000000..cf6b76dd82 --- /dev/null +++ b/src/test/java/lotto/InputTest.java @@ -0,0 +1,45 @@ +package lotto; + +import lotto.view.InputValidator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class InputTest { + + private static final String ERROR_MESSAGE = "[ERROR]"; + private static final InputValidator inputValidator = new InputValidator(); + + @DisplayName("구매 금액 입력에 숫자가 아닌 입력을 하면 오류가 발생한다.") + @Test + void purchaseAmountError() { + assertThatThrownBy(() -> inputValidator.validatePurchaseAmount("1000j")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } + + @DisplayName("보너스 숫자 입력에 숫자가 아닌 입력을 하면 오류가 발생한다.") + @Test + void bonusNumberError() { + assertThatThrownBy(() -> inputValidator.validateBonusNumber("A")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } + + @DisplayName("범위를 벗어나는 보너스 숫자가 입력될 경우 오류가 발생한다.") + @Test + void bonusNumberRangeError() { + assertThatThrownBy(() -> inputValidator.validateBonusNumber("46")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } + + @DisplayName("콤마 이외의 구분자로 숫자를 구분할 경우 예외가 발생한다.") + @Test + void winningNumberSplitError() { + assertThatThrownBy(() -> inputValidator.validateWinningNumbers("1 2 3 4 5 6")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } +} From 51eec34324bd7bb8eb44ed5cbe711875af03537c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 04:54:05 +0900 Subject: [PATCH 40/61] =?UTF-8?q?fix(Ranking):=20=EB=B3=B4=EB=84=88?= =?UTF-8?q?=EC=8A=A4=20=EC=88=AB=EC=9E=90=20=EC=9D=BC=EC=B9=98=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Model/Ranking.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/lotto/Model/Ranking.java b/src/main/java/lotto/Model/Ranking.java index b892c37e23..2a14660c32 100644 --- a/src/main/java/lotto/Model/Ranking.java +++ b/src/main/java/lotto/Model/Ranking.java @@ -1,21 +1,22 @@ package lotto.Model; import java.util.Arrays; +import java.util.List; public enum Ranking { - NONE(0, 0, false, null), - FIFTH(5000, 3, false, "3개 일치 (5,000원) - %d개"), - FOURTH(50000, 4, false, "4개 일치 (50,000원) - %d개"), - THIRD(1500000, 5, false, "5개 일치 (1,500,000원) - %d개"), - SECOND(30000000, 5, true, "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"), - FIRST(2000000000, 6, false, "6개 일치 (2,000,000,000원) - %d개"); + NONE(0, 0, List.of(true, false), null), + FIFTH(5000, 3, List.of(true, false), "3개 일치 (5,000원) - %d개"), + FOURTH(50000, 4, List.of(true, false), "4개 일치 (50,000원) - %d개"), + THIRD(1500000, 5, List.of(false), "5개 일치 (1,500,000원) - %d개"), + SECOND(30000000, 5, List.of(true), "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"), + FIRST(2000000000, 6, List.of(true, false), "6개 일치 (2,000,000,000원) - %d개"); private final int prize; private final int matchNumber; - private final boolean isMatchBonus; + private final List isMatchBonus; private final String message; - Ranking(int prize, int matchNumber, boolean isMatchBonus, String message) { + Ranking(int prize, int matchNumber, List isMatchBonus, String message) { this.prize = prize; this.matchNumber = matchNumber; this.isMatchBonus = isMatchBonus; @@ -25,7 +26,7 @@ public enum Ranking { public static Ranking calculate(int matchNumber, boolean isMatchBonus) { return Arrays.stream(values()) .filter(ranking -> ranking.matchNumber == matchNumber) - .filter(ranking -> ranking.isMatchBonus == isMatchBonus) + .filter(ranking -> ranking.isMatchBonus.contains(isMatchBonus)) .findAny() .orElse(NONE); } From 6372e8fa1653ebac29be6747491735326a55428a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 04:54:37 +0900 Subject: [PATCH 41/61] =?UTF-8?q?test(LottoResult):=20=EC=88=9C=EC=9C=84?= =?UTF-8?q?=20=ED=99=95=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/Model/LottoResultTest.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/test/java/lotto/Model/LottoResultTest.java diff --git a/src/test/java/lotto/Model/LottoResultTest.java b/src/test/java/lotto/Model/LottoResultTest.java new file mode 100644 index 0000000000..4379ae01a4 --- /dev/null +++ b/src/test/java/lotto/Model/LottoResultTest.java @@ -0,0 +1,93 @@ +package lotto.Model; + +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.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.mock; + +public class LottoResultTest { + + PlayerLottoes playerLottoes = mock(PlayerLottoes.class); + + @DisplayName("겹치는 숫자가 0개 ~ 2개일 경우 당첨이 아니다.") + @Test + void checkRankingNone() { + Lotto lotto = new Lotto(List.of(1,2,3,4,5,6)); + given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); + WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(7,8,9,10,11,12)), new BonusNumber(45)); + + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + lottoResult.calculateWinningRank(); + + assertThat(lottoResult.getRankingsResult().get(Ranking.NONE)).isEqualTo(1); + } + + @DisplayName("겹치는 숫자가 3개일 경우 5등 당첨") + @Test + void checkRankingFifth() { + Lotto lotto = new Lotto(List.of(1,2,3,4,5,6)); + given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); + WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,7,8,9)), new BonusNumber(4)); + + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + lottoResult.calculateWinningRank(); + + assertThat(lottoResult.getRankingsResult().get(Ranking.FIFTH)).isEqualTo(1); + } + + @DisplayName("겹치는 숫자가 4개일 경우 4등 당첨") + @Test + void checkRankingFourth() { + Lotto lotto = new Lotto(List.of(1,2,3,4,5,6)); + given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); + WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,8,9)), new BonusNumber(5)); + + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + lottoResult.calculateWinningRank(); + + assertThat(lottoResult.getRankingsResult().get(Ranking.FOURTH)).isEqualTo(1); + } + + @DisplayName("겹치는 숫자가 5개이고 보너스 번호가 겹치지 않을 경우 3등 당첨") + @Test + void checkRankingThird() { + Lotto lotto = new Lotto(List.of(1,2,3,4,5,6)); + given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); + WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,9)), new BonusNumber(45)); + + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + lottoResult.calculateWinningRank(); + + assertThat(lottoResult.getRankingsResult().get(Ranking.THIRD)).isEqualTo(1); + } + + @DisplayName("겹치는 숫자가 5개이고 보너스 번호가 겹칠 경우 3등 당첨") + @Test + void checkRankingSecond() { + Lotto lotto = new Lotto(List.of(1,2,3,4,5,6)); + given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); + WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,8)), new BonusNumber(6)); + + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + lottoResult.calculateWinningRank(); + + assertThat(lottoResult.getRankingsResult().get(Ranking.SECOND)).isEqualTo(1); + } + + @DisplayName("겹치는 숫자가 6개일 경우 1등 당첨") + @Test + void checkRankingFirst() { + Lotto lotto = new Lotto(List.of(1,2,3,4,5,6)); + given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); + WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,6)), new BonusNumber(10)); + + LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); + lottoResult.calculateWinningRank(); + + assertThat(lottoResult.getRankingsResult().get(Ranking.FIRST)).isEqualTo(1); + } +} From 7751db43ddec3090df0cd679e1b1fdf52f9751a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 7 Aug 2023 04:58:37 +0900 Subject: [PATCH 42/61] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/LottoController.java | 2 +- src/main/java/lotto/view/OutputView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 30aac54431..51594758c5 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -39,7 +39,7 @@ private WinningLotto createWinningLotto() { private void calculateResult(PlayerLottoes playerLottoes, WinningLotto winningLotto) { LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); lottoResult.calculateWinningRank(); - outputView.guideLottoResult(lottoResult.getRankingsResult()); + outputView.printLottoResult(lottoResult.getRankingsResult()); outputView.printProfit(lottoResult.calculateYield()); } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 6b760a7326..2c3851407b 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -12,7 +12,7 @@ public class OutputView { private static final int NONE = 1; private static final int DEFAULT = 0; - public void guideLottoResult(Map rankingResult) { + public void printLottoResult(Map rankingResult) { System.out.println(OutputMessage.RESULT_MESSAGE); System.out.println(OutputMessage.LINE); Arrays.stream(Ranking.values()) From b4d0e28f42a1cd1fb3632784ae9c0704b75d9aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 00:09:48 +0900 Subject: [PATCH 43/61] =?UTF-8?q?fix(LottoResult):=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EC=88=9C=EC=9C=84=20=EA=B3=84=EC=82=B0=20=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Model/LottoResult.java | 17 ++++++++++++----- src/main/java/lotto/Model/Ranking.java | 19 +++++++++---------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/main/java/lotto/Model/LottoResult.java b/src/main/java/lotto/Model/LottoResult.java index ccc86817d4..0bd871f610 100644 --- a/src/main/java/lotto/Model/LottoResult.java +++ b/src/main/java/lotto/Model/LottoResult.java @@ -10,6 +10,7 @@ public class LottoResult { private final Map rankings; private static final int LOTTO_PRICE = 1000; private static final int PERCENTAGE = 100; + private static final int THIRD_RANKING_NUMBER = 5; public LottoResult(WinningLotto winningLotto, PlayerLottoes playerLottoes) { this.winningLotto = winningLotto; @@ -19,7 +20,9 @@ public LottoResult(WinningLotto winningLotto, PlayerLottoes playerLottoes) { public void calculateWinningRank() { for (Lotto lotto : playerLottoes.getLottoes()) { - Ranking ranking = Ranking.calculate(calculateMatchNumber(lotto), hasBonusNumber(lotto)); + int matchNumber = calculateMatchNumber(lotto); + boolean matchBonusNumber = hasBonusNumber(matchNumber, lotto); + Ranking ranking = Ranking.calculate(calculateMatchNumber(lotto), matchBonusNumber); rankings.put(ranking, getPlus(ranking)); } } @@ -32,14 +35,18 @@ private Integer calculateMatchNumber(Lotto lotto) { .count(); } + private boolean hasBonusNumber(int matchNumber, Lotto lotto) { + if (matchNumber != THIRD_RANKING_NUMBER) { + return false; + } + BonusNumber bonusNumber = winningLotto.getBonusNumber(); + return lotto.hasNumber(bonusNumber.getBonus()); + } + private Integer getPlus(Ranking ranking) { return rankings.getOrDefault(ranking, 0) + 1; } - private boolean hasBonusNumber(Lotto lotto) { - BonusNumber bonusNumber = winningLotto.getBonusNumber(); - return lotto.hasNumber(bonusNumber.getBonus()); - } public Map getRankingsResult() { return rankings; diff --git a/src/main/java/lotto/Model/Ranking.java b/src/main/java/lotto/Model/Ranking.java index 2a14660c32..b892c37e23 100644 --- a/src/main/java/lotto/Model/Ranking.java +++ b/src/main/java/lotto/Model/Ranking.java @@ -1,22 +1,21 @@ package lotto.Model; import java.util.Arrays; -import java.util.List; public enum Ranking { - NONE(0, 0, List.of(true, false), null), - FIFTH(5000, 3, List.of(true, false), "3개 일치 (5,000원) - %d개"), - FOURTH(50000, 4, List.of(true, false), "4개 일치 (50,000원) - %d개"), - THIRD(1500000, 5, List.of(false), "5개 일치 (1,500,000원) - %d개"), - SECOND(30000000, 5, List.of(true), "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"), - FIRST(2000000000, 6, List.of(true, false), "6개 일치 (2,000,000,000원) - %d개"); + NONE(0, 0, false, null), + FIFTH(5000, 3, false, "3개 일치 (5,000원) - %d개"), + FOURTH(50000, 4, false, "4개 일치 (50,000원) - %d개"), + THIRD(1500000, 5, false, "5개 일치 (1,500,000원) - %d개"), + SECOND(30000000, 5, true, "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"), + FIRST(2000000000, 6, false, "6개 일치 (2,000,000,000원) - %d개"); private final int prize; private final int matchNumber; - private final List isMatchBonus; + private final boolean isMatchBonus; private final String message; - Ranking(int prize, int matchNumber, List isMatchBonus, String message) { + Ranking(int prize, int matchNumber, boolean isMatchBonus, String message) { this.prize = prize; this.matchNumber = matchNumber; this.isMatchBonus = isMatchBonus; @@ -26,7 +25,7 @@ public enum Ranking { public static Ranking calculate(int matchNumber, boolean isMatchBonus) { return Arrays.stream(values()) .filter(ranking -> ranking.matchNumber == matchNumber) - .filter(ranking -> ranking.isMatchBonus.contains(isMatchBonus)) + .filter(ranking -> ranking.isMatchBonus == isMatchBonus) .findAny() .orElse(NONE); } From 40730202d0a23f474cdfdbf9ec61098f8c4d891b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 00:10:50 +0900 Subject: [PATCH 44/61] =?UTF-8?q?refactor:=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EC=96=B8=EB=8D=94=EB=B0=94=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/lotto/Model/Ranking.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/lotto/Model/Ranking.java b/src/main/java/lotto/Model/Ranking.java index b892c37e23..dd7e6fb467 100644 --- a/src/main/java/lotto/Model/Ranking.java +++ b/src/main/java/lotto/Model/Ranking.java @@ -4,11 +4,11 @@ public enum Ranking { NONE(0, 0, false, null), - FIFTH(5000, 3, false, "3개 일치 (5,000원) - %d개"), - FOURTH(50000, 4, false, "4개 일치 (50,000원) - %d개"), - THIRD(1500000, 5, false, "5개 일치 (1,500,000원) - %d개"), - SECOND(30000000, 5, true, "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"), - FIRST(2000000000, 6, false, "6개 일치 (2,000,000,000원) - %d개"); + FIFTH(5_000, 3, false, "3개 일치 (5,000원) - %d개"), + FOURTH(50_000, 4, false, "4개 일치 (50,000원) - %d개"), + THIRD(1_500_000, 5, false, "5개 일치 (1,500,000원) - %d개"), + SECOND(30_000_000, 5, true, "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"), + FIRST(2_000_000_000, 6, false, "6개 일치 (2,000,000,000원) - %d개"); private final int prize; private final int matchNumber; From a4f0d035d65e446aba5945731fc105256c8f839c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 00:12:34 +0900 Subject: [PATCH 45/61] =?UTF-8?q?refactor:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=EC=8B=9C=20=EC=9D=B8?= =?UTF-8?q?=EB=8D=B1=EC=8A=A4=20=EC=82=AC=EC=9A=A9=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/lotto/view/OutputView.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 2c3851407b..2994172684 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -8,15 +8,14 @@ import java.util.Map; public class OutputView { - - private static final int NONE = 1; + private static final int DEFAULT = 0; public void printLottoResult(Map rankingResult) { System.out.println(OutputMessage.RESULT_MESSAGE); System.out.println(OutputMessage.LINE); Arrays.stream(Ranking.values()) - .skip(NONE) + .filter(ranking -> ranking != Ranking.NONE) .forEach(ranking -> printRankingMessage(ranking, rankingResult)); } From 7b918e324626588c75a4c963517adde9a41e5dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 00:47:34 +0900 Subject: [PATCH 46/61] =?UTF-8?q?refactor(InputFactory):=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EB=82=B4=EC=9A=A9=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputFactory.java | 8 +++++--- src/main/java/lotto/view/OutputView.java | 12 ++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index ec00008999..441e6c9261 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -11,20 +11,22 @@ public class InputFactory { private final InputValidator inputValidator; + private final OutputView outputView; public InputFactory() { + this.outputView = new OutputView(); this.inputValidator = new InputValidator(); } public int readPurchaseAmount() { - System.out.println(OutputMessage.GUIDE_PURCHASE); + outputView.printPurchaseMessage(); String userInput = Console.readLine(); inputValidator.validatePurchaseAmount(userInput); return Integer.parseInt(userInput); } public Lotto readWinningNumber() { - System.out.println(OutputMessage.WINNING_NUMBER); + outputView.printWinningNumberMessage(); String userInput = Console.readLine(); inputValidator.validateWinningNumbers(userInput); List winningNumber = Stream.of(userInput.split(",")) @@ -34,7 +36,7 @@ public Lotto readWinningNumber() { } public BonusNumber readBonusNumber() { - System.out.println(OutputMessage.BONUS_NUMBER); + outputView.printBonusNumberMessage(); String userInput = Console.readLine(); inputValidator.validateBonusNumber(userInput); return new BonusNumber(Integer.parseInt(userInput)); diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 2994172684..902ceceb89 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -11,6 +11,18 @@ public class OutputView { private static final int DEFAULT = 0; + public void printPurchaseMessage() { + System.out.println(OutputMessage.GUIDE_PURCHASE); + } + + public void printWinningNumberMessage() { + System.out.println(OutputMessage.WINNING_NUMBER); + } + + public void printBonusNumberMessage() { + System.out.println(OutputMessage.BONUS_NUMBER); + } + public void printLottoResult(Map rankingResult) { System.out.println(OutputMessage.RESULT_MESSAGE); System.out.println(OutputMessage.LINE); From 2b4998982de2682478af5fb859ab90716c592eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 00:53:36 +0900 Subject: [PATCH 47/61] =?UTF-8?q?refactor:=20InputValidator=20=EB=82=B4=20?= =?UTF-8?q?bonusNumber=20=EB=B2=94=EC=9C=84=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Model/BonusNumber.java | 12 ++++++++++++ src/main/java/lotto/view/InputValidator.java | 13 +------------ src/test/java/lotto/InputTest.java | 8 -------- .../java/lotto/Model/BonusNumberTest.java | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 src/test/java/lotto/Model/BonusNumberTest.java diff --git a/src/main/java/lotto/Model/BonusNumber.java b/src/main/java/lotto/Model/BonusNumber.java index b9b0423f0a..07aa5e99c1 100644 --- a/src/main/java/lotto/Model/BonusNumber.java +++ b/src/main/java/lotto/Model/BonusNumber.java @@ -1,14 +1,26 @@ package lotto.Model; +import lotto.view.ExceptionMessage; + public class BonusNumber { private final int bonusNumber; + private static final int MAX_NUMBER = 45; + private static final int MIN_NUMBER = 1; public BonusNumber(int bonusNumber) { + validateCorrectRange(bonusNumber); this.bonusNumber = bonusNumber; } public int getBonus() { return bonusNumber; } + + private void validateCorrectRange(int bonusNumber) { + if (bonusNumber < MIN_NUMBER || bonusNumber > MAX_NUMBER) { + ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_RANGE; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } } diff --git a/src/main/java/lotto/view/InputValidator.java b/src/main/java/lotto/view/InputValidator.java index 7de501fdb8..318b905f49 100644 --- a/src/main/java/lotto/view/InputValidator.java +++ b/src/main/java/lotto/view/InputValidator.java @@ -1,14 +1,11 @@ package lotto.view; public class InputValidator { - - private static final int MAX_NUMBER = 45; - private static final int MIN_NUMBER = 1; + private static final int Thousand = 1000; public void validateBonusNumber(String bonusNumber) { isInteger(bonusNumber); - isCorrectRange(bonusNumber); } public void validatePurchaseAmount(String amount) { @@ -29,14 +26,6 @@ private void isInteger(String number) { } } - private void isCorrectRange(String bonusNumber) { - int bonus = Integer.parseInt(bonusNumber); - if (bonus < MIN_NUMBER || bonus > MAX_NUMBER) { - ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_RANGE; - throw new IllegalArgumentException(exceptionMessage.toString()); - } - } - private void isThousandUnits(String userInput) { int amount = Integer.parseInt(userInput); if((amount % Thousand) != 0) { diff --git a/src/test/java/lotto/InputTest.java b/src/test/java/lotto/InputTest.java index cf6b76dd82..77ae8b3f0c 100644 --- a/src/test/java/lotto/InputTest.java +++ b/src/test/java/lotto/InputTest.java @@ -27,14 +27,6 @@ void bonusNumberError() { .hasMessageContaining(ERROR_MESSAGE); } - @DisplayName("범위를 벗어나는 보너스 숫자가 입력될 경우 오류가 발생한다.") - @Test - void bonusNumberRangeError() { - assertThatThrownBy(() -> inputValidator.validateBonusNumber("46")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining(ERROR_MESSAGE); - } - @DisplayName("콤마 이외의 구분자로 숫자를 구분할 경우 예외가 발생한다.") @Test void winningNumberSplitError() { diff --git a/src/test/java/lotto/Model/BonusNumberTest.java b/src/test/java/lotto/Model/BonusNumberTest.java new file mode 100644 index 0000000000..5a93c14f00 --- /dev/null +++ b/src/test/java/lotto/Model/BonusNumberTest.java @@ -0,0 +1,19 @@ +package lotto.Model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class BonusNumberTest { + + private static final String ERROR_MESSAGE = "[ERROR]"; + + @DisplayName("범위를 벗어나는 보너스 숫자가 입력될 경우 오류가 발생한다.") + @Test + void bonusNumberRangeError() { + assertThatThrownBy(() -> new BonusNumber(47)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } +} From 946ddec6f7aa5fc5283894428d1ffa47e00f40a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 00:57:37 +0900 Subject: [PATCH 48/61] =?UTF-8?q?refactor:=20InputValidator=20=EB=82=B4=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EB=8B=A8=EC=9C=84=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Model/LottoCounter.java | 10 ++++++++++ src/main/java/lotto/view/InputValidator.java | 11 ----------- src/test/java/lotto/Model/LottoCounterTest.java | 11 +++++++++++ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/lotto/Model/LottoCounter.java b/src/main/java/lotto/Model/LottoCounter.java index 897f6a3bb1..65eb450b63 100644 --- a/src/main/java/lotto/Model/LottoCounter.java +++ b/src/main/java/lotto/Model/LottoCounter.java @@ -1,11 +1,14 @@ package lotto.Model; +import lotto.view.ExceptionMessage; + public class LottoCounter { private final int lotteryTicket; private static final Integer LOTTO_PRICE = 1000; public LottoCounter(int payment) { + validateThousandUnits(payment); this.lotteryTicket = calculateLotteryTicket(payment); } @@ -16,4 +19,11 @@ public int calculateLotteryTicket(int payment) { public int getLotteryTicket() { return lotteryTicket; } + + private void validateThousandUnits(Integer amount) { + if((amount % LOTTO_PRICE) != 0) { + ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_AMOUNT; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } } diff --git a/src/main/java/lotto/view/InputValidator.java b/src/main/java/lotto/view/InputValidator.java index 318b905f49..523555daeb 100644 --- a/src/main/java/lotto/view/InputValidator.java +++ b/src/main/java/lotto/view/InputValidator.java @@ -2,15 +2,12 @@ public class InputValidator { - private static final int Thousand = 1000; - public void validateBonusNumber(String bonusNumber) { isInteger(bonusNumber); } public void validatePurchaseAmount(String amount) { isInteger(amount); - isThousandUnits(amount); } public void validateWinningNumbers(String winningNumbers) { @@ -26,14 +23,6 @@ private void isInteger(String number) { } } - private void isThousandUnits(String userInput) { - int amount = Integer.parseInt(userInput); - if((amount % Thousand) != 0) { - ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_AMOUNT; - throw new IllegalArgumentException(exceptionMessage.toString()); - } - } - private void isContainComma(String userInput) { if (!userInput.contains(",")) { ExceptionMessage exceptionMessage = ExceptionMessage.NOT_CONTAIN_COMMA; diff --git a/src/test/java/lotto/Model/LottoCounterTest.java b/src/test/java/lotto/Model/LottoCounterTest.java index 90582a65ff..594d19106d 100644 --- a/src/test/java/lotto/Model/LottoCounterTest.java +++ b/src/test/java/lotto/Model/LottoCounterTest.java @@ -5,13 +5,24 @@ import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LottoCounterTest { + private static final String ERROR_MESSAGE = "[ERROR]"; + @DisplayName("금액을 입력하면 금액에 맞는 로또 개수를 반환한다.") @Test void createLottoTickets() { LottoCounter lottoCounter = new LottoCounter(8000); assertThat(lottoCounter.getLotteryTicket()).isEqualTo(8); } + + @DisplayName("구매 금액이 천원 단위가 아닌 경우 오류가 발생한다.") + @Test + void purchaseAmountError() { + assertThatThrownBy(() -> new LottoCounter(1550)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } } From 0448acbb0d4bcb290c0d9fb0427f048646c96967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 01:37:37 +0900 Subject: [PATCH 49/61] =?UTF-8?q?refactor:=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EC=9E=85=EB=A0=A5=20=EC=A0=95=EA=B7=9C?= =?UTF-8?q?=EC=8B=9D=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/ExceptionMessage.java | 2 +- src/main/java/lotto/view/InputValidator.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/view/ExceptionMessage.java b/src/main/java/lotto/view/ExceptionMessage.java index 18382a148a..d72d7967e7 100644 --- a/src/main/java/lotto/view/ExceptionMessage.java +++ b/src/main/java/lotto/view/ExceptionMessage.java @@ -8,7 +8,7 @@ public enum ExceptionMessage { INCORRECT_LOTTO_SIZE("[ERROR] 6개의 숫자만 입력할 수 있습니다."), DUPLICATE_NUMBER("[ERROR] 중복된 숫자는 입력할 수 없습니다."), DUPLICATE_WINNING_NUMBER_AND_BONUS("[ERROR] 당첨 숫자와 보너스 숫자가 중복됩니다."), - NOT_CONTAIN_COMMA("[ERROR] ','로 숫자를 구분하여 주십시오."); + NOT_CONTAIN_COMMA("[ERROR] 공백없이 ','로 숫자를 구분하여 주십시오."); private final String message; diff --git a/src/main/java/lotto/view/InputValidator.java b/src/main/java/lotto/view/InputValidator.java index 523555daeb..377e2c6557 100644 --- a/src/main/java/lotto/view/InputValidator.java +++ b/src/main/java/lotto/view/InputValidator.java @@ -1,7 +1,11 @@ package lotto.view; +import java.util.regex.Pattern; + public class InputValidator { + String DELIMITER_REGEXP = "(\\d|,)+(\\d)"; + public void validateBonusNumber(String bonusNumber) { isInteger(bonusNumber); } @@ -24,7 +28,7 @@ private void isInteger(String number) { } private void isContainComma(String userInput) { - if (!userInput.contains(",")) { + if (!Pattern.matches(DELIMITER_REGEXP, userInput)) { ExceptionMessage exceptionMessage = ExceptionMessage.NOT_CONTAIN_COMMA; throw new IllegalArgumentException(exceptionMessage.toString()); } From 651b83c63afa9723d3529e5a8b1d10e6f3a4660c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 01:41:22 +0900 Subject: [PATCH 50/61] =?UTF-8?q?refactor:=20=EC=A0=95=EA=B7=9C=EC=8B=9D?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=AB=EC=9E=90=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputValidator.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/lotto/view/InputValidator.java b/src/main/java/lotto/view/InputValidator.java index 377e2c6557..35f287892f 100644 --- a/src/main/java/lotto/view/InputValidator.java +++ b/src/main/java/lotto/view/InputValidator.java @@ -5,6 +5,7 @@ public class InputValidator { String DELIMITER_REGEXP = "(\\d|,)+(\\d)"; + String NUMBER_REGEXP = "^\\d*$"; public void validateBonusNumber(String bonusNumber) { isInteger(bonusNumber); @@ -18,10 +19,8 @@ public void validateWinningNumbers(String winningNumbers) { isContainComma(winningNumbers); } - private void isInteger(String number) { - try { - Integer.parseInt(number); - } catch (NumberFormatException e) { + private void isInteger(String userInput) { + if (!Pattern.matches(NUMBER_REGEXP, userInput)) { ExceptionMessage exceptionMessage = ExceptionMessage.NOT_INTEGER; throw new IllegalArgumentException(exceptionMessage.toString()); } From 1191f885a097491e290fa2eb547c012dd19fde58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 01:42:08 +0900 Subject: [PATCH 51/61] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputValidator.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/lotto/view/InputValidator.java b/src/main/java/lotto/view/InputValidator.java index 35f287892f..5ca17d4829 100644 --- a/src/main/java/lotto/view/InputValidator.java +++ b/src/main/java/lotto/view/InputValidator.java @@ -8,25 +8,25 @@ public class InputValidator { String NUMBER_REGEXP = "^\\d*$"; public void validateBonusNumber(String bonusNumber) { - isInteger(bonusNumber); + validateInteger(bonusNumber); } public void validatePurchaseAmount(String amount) { - isInteger(amount); + validateInteger(amount); } public void validateWinningNumbers(String winningNumbers) { - isContainComma(winningNumbers); + validateContainComma(winningNumbers); } - private void isInteger(String userInput) { + private void validateInteger(String userInput) { if (!Pattern.matches(NUMBER_REGEXP, userInput)) { ExceptionMessage exceptionMessage = ExceptionMessage.NOT_INTEGER; throw new IllegalArgumentException(exceptionMessage.toString()); } } - private void isContainComma(String userInput) { + private void validateContainComma(String userInput) { if (!Pattern.matches(DELIMITER_REGEXP, userInput)) { ExceptionMessage exceptionMessage = ExceptionMessage.NOT_CONTAIN_COMMA; throw new IllegalArgumentException(exceptionMessage.toString()); From 83b0247ce4bc1f07a4e6a0fe444c04f6b692df4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 01:47:53 +0900 Subject: [PATCH 52/61] =?UTF-8?q?refactor:=20LottoResult=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Model/BonusNumber.java | 2 +- src/main/java/lotto/Model/Lotto.java | 2 +- ...Result.java => LottoResultCalculator.java} | 4 +-- .../lotto/controller/LottoController.java | 8 ++--- .../java/lotto/Model/LottoResultTest.java | 36 +++++++++---------- 5 files changed, 26 insertions(+), 26 deletions(-) rename src/main/java/lotto/Model/{LottoResult.java => LottoResultCalculator.java} (94%) diff --git a/src/main/java/lotto/Model/BonusNumber.java b/src/main/java/lotto/Model/BonusNumber.java index 07aa5e99c1..ddb0227be6 100644 --- a/src/main/java/lotto/Model/BonusNumber.java +++ b/src/main/java/lotto/Model/BonusNumber.java @@ -18,7 +18,7 @@ public int getBonus() { } private void validateCorrectRange(int bonusNumber) { - if (bonusNumber < MIN_NUMBER || bonusNumber > MAX_NUMBER) { + if (!(MIN_NUMBER <= bonusNumber && bonusNumber <= MAX_NUMBER)) { ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_RANGE; throw new IllegalArgumentException(exceptionMessage.toString()); } diff --git a/src/main/java/lotto/Model/Lotto.java b/src/main/java/lotto/Model/Lotto.java index 6f0bc5589d..4985222231 100644 --- a/src/main/java/lotto/Model/Lotto.java +++ b/src/main/java/lotto/Model/Lotto.java @@ -38,7 +38,7 @@ private void validateRange(List numbers) { numbers.forEach(this::isCorrectRange); } private void isCorrectRange(int number) { - if (number < MIN_NUMBER || number > MAX_NUMBER) { + if (!(MIN_NUMBER <= number && number <= MAX_NUMBER)) { ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_RANGE; throw new IllegalArgumentException(exceptionMessage.toString()); } diff --git a/src/main/java/lotto/Model/LottoResult.java b/src/main/java/lotto/Model/LottoResultCalculator.java similarity index 94% rename from src/main/java/lotto/Model/LottoResult.java rename to src/main/java/lotto/Model/LottoResultCalculator.java index 0bd871f610..26f78b97f7 100644 --- a/src/main/java/lotto/Model/LottoResult.java +++ b/src/main/java/lotto/Model/LottoResultCalculator.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; -public class LottoResult { +public class LottoResultCalculator { private final WinningLotto winningLotto; private final PlayerLottoes playerLottoes; @@ -12,7 +12,7 @@ public class LottoResult { private static final int PERCENTAGE = 100; private static final int THIRD_RANKING_NUMBER = 5; - public LottoResult(WinningLotto winningLotto, PlayerLottoes playerLottoes) { + public LottoResultCalculator(WinningLotto winningLotto, PlayerLottoes playerLottoes) { this.winningLotto = winningLotto; this.playerLottoes = playerLottoes; this.rankings = new HashMap<>(); diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 51594758c5..b4fd99ee8c 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -37,9 +37,9 @@ private WinningLotto createWinningLotto() { } private void calculateResult(PlayerLottoes playerLottoes, WinningLotto winningLotto) { - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); - outputView.printLottoResult(lottoResult.getRankingsResult()); - outputView.printProfit(lottoResult.calculateYield()); + LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); + lottoResultCalculator.calculateWinningRank(); + outputView.printLottoResult(lottoResultCalculator.getRankingsResult()); + outputView.printProfit(lottoResultCalculator.calculateYield()); } } diff --git a/src/test/java/lotto/Model/LottoResultTest.java b/src/test/java/lotto/Model/LottoResultTest.java index 4379ae01a4..c7810e8cf9 100644 --- a/src/test/java/lotto/Model/LottoResultTest.java +++ b/src/test/java/lotto/Model/LottoResultTest.java @@ -20,10 +20,10 @@ void checkRankingNone() { given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(7,8,9,10,11,12)), new BonusNumber(45)); - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); + LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); + lottoResultCalculator.calculateWinningRank(); - assertThat(lottoResult.getRankingsResult().get(Ranking.NONE)).isEqualTo(1); + assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.NONE)).isEqualTo(1); } @DisplayName("겹치는 숫자가 3개일 경우 5등 당첨") @@ -33,10 +33,10 @@ void checkRankingFifth() { given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,7,8,9)), new BonusNumber(4)); - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); + LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); + lottoResultCalculator.calculateWinningRank(); - assertThat(lottoResult.getRankingsResult().get(Ranking.FIFTH)).isEqualTo(1); + assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.FIFTH)).isEqualTo(1); } @DisplayName("겹치는 숫자가 4개일 경우 4등 당첨") @@ -46,10 +46,10 @@ void checkRankingFourth() { given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,8,9)), new BonusNumber(5)); - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); + LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); + lottoResultCalculator.calculateWinningRank(); - assertThat(lottoResult.getRankingsResult().get(Ranking.FOURTH)).isEqualTo(1); + assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.FOURTH)).isEqualTo(1); } @DisplayName("겹치는 숫자가 5개이고 보너스 번호가 겹치지 않을 경우 3등 당첨") @@ -59,10 +59,10 @@ void checkRankingThird() { given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,9)), new BonusNumber(45)); - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); + LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); + lottoResultCalculator.calculateWinningRank(); - assertThat(lottoResult.getRankingsResult().get(Ranking.THIRD)).isEqualTo(1); + assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.THIRD)).isEqualTo(1); } @DisplayName("겹치는 숫자가 5개이고 보너스 번호가 겹칠 경우 3등 당첨") @@ -72,10 +72,10 @@ void checkRankingSecond() { given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,8)), new BonusNumber(6)); - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); + LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); + lottoResultCalculator.calculateWinningRank(); - assertThat(lottoResult.getRankingsResult().get(Ranking.SECOND)).isEqualTo(1); + assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.SECOND)).isEqualTo(1); } @DisplayName("겹치는 숫자가 6개일 경우 1등 당첨") @@ -85,9 +85,9 @@ void checkRankingFirst() { given(playerLottoes.getLottoes()).willReturn(List.of(lotto)); WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,6)), new BonusNumber(10)); - LottoResult lottoResult = new LottoResult(winningLotto, playerLottoes); - lottoResult.calculateWinningRank(); + LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); + lottoResultCalculator.calculateWinningRank(); - assertThat(lottoResult.getRankingsResult().get(Ranking.FIRST)).isEqualTo(1); + assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.FIRST)).isEqualTo(1); } } From d89ecc92b188b890fe94fec6cd968204f02ea498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 02:05:03 +0900 Subject: [PATCH 53/61] =?UTF-8?q?refactor:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=ED=95=98=EB=8A=94=20LottoResult=20=EC=9D=BC=EA=B8=89?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Model/LottoResult.java | 31 +++++++++++++++++++ .../lotto/Model/LottoResultCalculator.java | 22 +++++-------- .../lotto/controller/LottoController.java | 2 +- 3 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 src/main/java/lotto/Model/LottoResult.java diff --git a/src/main/java/lotto/Model/LottoResult.java b/src/main/java/lotto/Model/LottoResult.java new file mode 100644 index 0000000000..b80719e9f3 --- /dev/null +++ b/src/main/java/lotto/Model/LottoResult.java @@ -0,0 +1,31 @@ +package lotto.Model; + +import java.util.EnumMap; +import java.util.Map; +import java.util.Set; + +public class LottoResult { + + private final Map result; + private static final int DEFAULT = 0; + + public LottoResult() { + this.result = new EnumMap<>(Ranking.class); + } + + public void putResult(Ranking ranking) { + result.put(ranking, result.getOrDefault(ranking, DEFAULT) + 1); + } + + public Set keyset() { + return result.keySet(); + } + + public Integer get(Ranking ranking) { + return result.get(ranking); + } + + public Map getResult() { + return result; + } +} diff --git a/src/main/java/lotto/Model/LottoResultCalculator.java b/src/main/java/lotto/Model/LottoResultCalculator.java index 26f78b97f7..47f3935361 100644 --- a/src/main/java/lotto/Model/LottoResultCalculator.java +++ b/src/main/java/lotto/Model/LottoResultCalculator.java @@ -1,13 +1,10 @@ package lotto.Model; -import java.util.HashMap; -import java.util.Map; - public class LottoResultCalculator { private final WinningLotto winningLotto; private final PlayerLottoes playerLottoes; - private final Map rankings; + private final LottoResult lottoResult; private static final int LOTTO_PRICE = 1000; private static final int PERCENTAGE = 100; private static final int THIRD_RANKING_NUMBER = 5; @@ -15,7 +12,7 @@ public class LottoResultCalculator { public LottoResultCalculator(WinningLotto winningLotto, PlayerLottoes playerLottoes) { this.winningLotto = winningLotto; this.playerLottoes = playerLottoes; - this.rankings = new HashMap<>(); + this.lottoResult = new LottoResult(); } public void calculateWinningRank() { @@ -23,7 +20,7 @@ public void calculateWinningRank() { int matchNumber = calculateMatchNumber(lotto); boolean matchBonusNumber = hasBonusNumber(matchNumber, lotto); Ranking ranking = Ranking.calculate(calculateMatchNumber(lotto), matchBonusNumber); - rankings.put(ranking, getPlus(ranking)); + lottoResult.putResult(ranking); } } @@ -43,13 +40,8 @@ private boolean hasBonusNumber(int matchNumber, Lotto lotto) { return lotto.hasNumber(bonusNumber.getBonus()); } - private Integer getPlus(Ranking ranking) { - return rankings.getOrDefault(ranking, 0) + 1; - } - - - public Map getRankingsResult() { - return rankings; + public LottoResult getRankingsResult() { + return lottoResult; } public double calculateYield() { @@ -60,8 +52,8 @@ public double calculateYield() { private double calculateTotalPrize() { double sum = 0; - for(Ranking ranking: rankings.keySet()) { - sum += ranking.getPrize() * rankings.get(ranking); + for(Ranking ranking: lottoResult.keyset()) { + sum += ranking.getPrize() * lottoResult.get(ranking); } return sum; } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index b4fd99ee8c..630ad6cbbd 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -39,7 +39,7 @@ private WinningLotto createWinningLotto() { private void calculateResult(PlayerLottoes playerLottoes, WinningLotto winningLotto) { LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); lottoResultCalculator.calculateWinningRank(); - outputView.printLottoResult(lottoResultCalculator.getRankingsResult()); + outputView.printLottoResult(lottoResultCalculator.getRankingsResult().getResult()); outputView.printProfit(lottoResultCalculator.calculateYield()); } } From ed93615d8fb489e6073719e68f35d224130d3d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 02:12:42 +0900 Subject: [PATCH 54/61] =?UTF-8?q?refactor(LottoResult):=20result=20map=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Model/LottoResult.java | 6 ++++-- src/main/java/lotto/view/OutputView.java | 4 +--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/lotto/Model/LottoResult.java b/src/main/java/lotto/Model/LottoResult.java index b80719e9f3..03efa70186 100644 --- a/src/main/java/lotto/Model/LottoResult.java +++ b/src/main/java/lotto/Model/LottoResult.java @@ -1,5 +1,6 @@ package lotto.Model; +import java.util.Arrays; import java.util.EnumMap; import java.util.Map; import java.util.Set; @@ -7,14 +8,15 @@ public class LottoResult { private final Map result; - private static final int DEFAULT = 0; public LottoResult() { this.result = new EnumMap<>(Ranking.class); + Arrays.stream(Ranking.values()) + .forEach(ranking -> result.put(ranking, 0)); } public void putResult(Ranking ranking) { - result.put(ranking, result.getOrDefault(ranking, DEFAULT) + 1); + result.put(ranking, result.get(ranking) + 1); } public Set keyset() { diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 902ceceb89..d27abdd024 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -8,8 +8,6 @@ import java.util.Map; public class OutputView { - - private static final int DEFAULT = 0; public void printPurchaseMessage() { System.out.println(OutputMessage.GUIDE_PURCHASE); @@ -32,7 +30,7 @@ public void printLottoResult(Map rankingResult) { } private void printRankingMessage(Ranking ranking, Map rankingResult) { - System.out.println(ranking.getMessage(rankingResult.getOrDefault(ranking, DEFAULT))); + System.out.println(ranking.getMessage(rankingResult.get(ranking))); } public void printPurchaseCount(int lottoTicketsNumber) { From 92d2afdd03fa402946842e53080a1acb5cad50d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 02:19:49 +0900 Subject: [PATCH 55/61] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/LottoController.java | 2 +- src/main/java/lotto/{Model => model}/BonusNumber.java | 2 +- src/main/java/lotto/{Model => model}/Lotto.java | 2 +- src/main/java/lotto/{Model => model}/LottoCounter.java | 2 +- src/main/java/lotto/{Model => model}/LottoResult.java | 4 ++-- .../java/lotto/{Model => model}/LottoResultCalculator.java | 4 ++-- src/main/java/lotto/{Model => model}/PlayerLottoes.java | 2 +- .../java/lotto/{Model => model}/RandomLottoGenerator.java | 2 +- src/main/java/lotto/{Model => model}/Ranking.java | 2 +- src/main/java/lotto/{Model => model}/WinningLotto.java | 2 +- src/main/java/lotto/view/InputFactory.java | 4 ++-- src/main/java/lotto/view/OutputView.java | 6 +++--- src/test/java/lotto/LottoTest.java | 2 +- src/test/java/lotto/{Model => model}/BonusNumberTest.java | 2 +- src/test/java/lotto/{Model => model}/LottoCounterTest.java | 2 +- src/test/java/lotto/{Model => model}/LottoResultTest.java | 2 +- src/test/java/lotto/{Model => model}/PlayerLottoesTest.java | 2 +- src/test/java/lotto/{Model => model}/WinnigLottoTest.java | 2 +- 18 files changed, 23 insertions(+), 23 deletions(-) rename src/main/java/lotto/{Model => model}/BonusNumber.java (97%) rename src/main/java/lotto/{Model => model}/Lotto.java (98%) rename src/main/java/lotto/{Model => model}/LottoCounter.java (97%) rename src/main/java/lotto/{Model => model}/LottoResult.java (92%) rename src/main/java/lotto/{Model => model}/LottoResultCalculator.java (96%) rename src/main/java/lotto/{Model => model}/PlayerLottoes.java (97%) rename src/main/java/lotto/{Model => model}/RandomLottoGenerator.java (96%) rename src/main/java/lotto/{Model => model}/Ranking.java (98%) rename src/main/java/lotto/{Model => model}/WinningLotto.java (97%) rename src/test/java/lotto/{Model => model}/BonusNumberTest.java (96%) rename src/test/java/lotto/{Model => model}/LottoCounterTest.java (97%) rename src/test/java/lotto/{Model => model}/LottoResultTest.java (99%) rename src/test/java/lotto/{Model => model}/PlayerLottoesTest.java (95%) rename src/test/java/lotto/{Model => model}/WinnigLottoTest.java (98%) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 630ad6cbbd..3bc9731d39 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,6 +1,6 @@ package lotto.controller; -import lotto.Model.*; +import lotto.model.*; import lotto.view.InputFactory; import lotto.view.OutputView; diff --git a/src/main/java/lotto/Model/BonusNumber.java b/src/main/java/lotto/model/BonusNumber.java similarity index 97% rename from src/main/java/lotto/Model/BonusNumber.java rename to src/main/java/lotto/model/BonusNumber.java index ddb0227be6..1edb5c6c30 100644 --- a/src/main/java/lotto/Model/BonusNumber.java +++ b/src/main/java/lotto/model/BonusNumber.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import lotto.view.ExceptionMessage; diff --git a/src/main/java/lotto/Model/Lotto.java b/src/main/java/lotto/model/Lotto.java similarity index 98% rename from src/main/java/lotto/Model/Lotto.java rename to src/main/java/lotto/model/Lotto.java index 4985222231..b3d2e756a5 100644 --- a/src/main/java/lotto/Model/Lotto.java +++ b/src/main/java/lotto/model/Lotto.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import lotto.view.ExceptionMessage; diff --git a/src/main/java/lotto/Model/LottoCounter.java b/src/main/java/lotto/model/LottoCounter.java similarity index 97% rename from src/main/java/lotto/Model/LottoCounter.java rename to src/main/java/lotto/model/LottoCounter.java index 65eb450b63..354fcf5357 100644 --- a/src/main/java/lotto/Model/LottoCounter.java +++ b/src/main/java/lotto/model/LottoCounter.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import lotto.view.ExceptionMessage; diff --git a/src/main/java/lotto/Model/LottoResult.java b/src/main/java/lotto/model/LottoResult.java similarity index 92% rename from src/main/java/lotto/Model/LottoResult.java rename to src/main/java/lotto/model/LottoResult.java index 03efa70186..666f61d96c 100644 --- a/src/main/java/lotto/Model/LottoResult.java +++ b/src/main/java/lotto/model/LottoResult.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import java.util.Arrays; import java.util.EnumMap; @@ -19,7 +19,7 @@ public void putResult(Ranking ranking) { result.put(ranking, result.get(ranking) + 1); } - public Set keyset() { + public Set keySet() { return result.keySet(); } diff --git a/src/main/java/lotto/Model/LottoResultCalculator.java b/src/main/java/lotto/model/LottoResultCalculator.java similarity index 96% rename from src/main/java/lotto/Model/LottoResultCalculator.java rename to src/main/java/lotto/model/LottoResultCalculator.java index 47f3935361..cf7d28ef7c 100644 --- a/src/main/java/lotto/Model/LottoResultCalculator.java +++ b/src/main/java/lotto/model/LottoResultCalculator.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; public class LottoResultCalculator { @@ -52,7 +52,7 @@ public double calculateYield() { private double calculateTotalPrize() { double sum = 0; - for(Ranking ranking: lottoResult.keyset()) { + for(Ranking ranking: lottoResult.keySet()) { sum += ranking.getPrize() * lottoResult.get(ranking); } return sum; diff --git a/src/main/java/lotto/Model/PlayerLottoes.java b/src/main/java/lotto/model/PlayerLottoes.java similarity index 97% rename from src/main/java/lotto/Model/PlayerLottoes.java rename to src/main/java/lotto/model/PlayerLottoes.java index de54848af4..e137325d08 100644 --- a/src/main/java/lotto/Model/PlayerLottoes.java +++ b/src/main/java/lotto/model/PlayerLottoes.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/lotto/Model/RandomLottoGenerator.java b/src/main/java/lotto/model/RandomLottoGenerator.java similarity index 96% rename from src/main/java/lotto/Model/RandomLottoGenerator.java rename to src/main/java/lotto/model/RandomLottoGenerator.java index 78a57795f3..c65505ff78 100644 --- a/src/main/java/lotto/Model/RandomLottoGenerator.java +++ b/src/main/java/lotto/model/RandomLottoGenerator.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import camp.nextstep.edu.missionutils.Randoms; diff --git a/src/main/java/lotto/Model/Ranking.java b/src/main/java/lotto/model/Ranking.java similarity index 98% rename from src/main/java/lotto/Model/Ranking.java rename to src/main/java/lotto/model/Ranking.java index dd7e6fb467..1735822117 100644 --- a/src/main/java/lotto/Model/Ranking.java +++ b/src/main/java/lotto/model/Ranking.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import java.util.Arrays; diff --git a/src/main/java/lotto/Model/WinningLotto.java b/src/main/java/lotto/model/WinningLotto.java similarity index 97% rename from src/main/java/lotto/Model/WinningLotto.java rename to src/main/java/lotto/model/WinningLotto.java index 713216aa9d..39643eddcf 100644 --- a/src/main/java/lotto/Model/WinningLotto.java +++ b/src/main/java/lotto/model/WinningLotto.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import lotto.view.ExceptionMessage; diff --git a/src/main/java/lotto/view/InputFactory.java b/src/main/java/lotto/view/InputFactory.java index 441e6c9261..508151fe61 100644 --- a/src/main/java/lotto/view/InputFactory.java +++ b/src/main/java/lotto/view/InputFactory.java @@ -1,8 +1,8 @@ package lotto.view; import camp.nextstep.edu.missionutils.Console; -import lotto.Model.Lotto; -import lotto.Model.BonusNumber; +import lotto.model.Lotto; +import lotto.model.BonusNumber; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index d27abdd024..030e142059 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,8 +1,8 @@ package lotto.view; -import lotto.Model.Lotto; -import lotto.Model.PlayerLottoes; -import lotto.Model.Ranking; +import lotto.model.Lotto; +import lotto.model.PlayerLottoes; +import lotto.model.Ranking; import java.util.Arrays; import java.util.Map; diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index ace5e12c9b..5d48e1acd2 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,6 +1,6 @@ package lotto; -import lotto.Model.Lotto; +import lotto.model.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/Model/BonusNumberTest.java b/src/test/java/lotto/model/BonusNumberTest.java similarity index 96% rename from src/test/java/lotto/Model/BonusNumberTest.java rename to src/test/java/lotto/model/BonusNumberTest.java index 5a93c14f00..6fe6d4564b 100644 --- a/src/test/java/lotto/Model/BonusNumberTest.java +++ b/src/test/java/lotto/model/BonusNumberTest.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/Model/LottoCounterTest.java b/src/test/java/lotto/model/LottoCounterTest.java similarity index 97% rename from src/test/java/lotto/Model/LottoCounterTest.java rename to src/test/java/lotto/model/LottoCounterTest.java index 594d19106d..d47bcc64cd 100644 --- a/src/test/java/lotto/Model/LottoCounterTest.java +++ b/src/test/java/lotto/model/LottoCounterTest.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/Model/LottoResultTest.java b/src/test/java/lotto/model/LottoResultTest.java similarity index 99% rename from src/test/java/lotto/Model/LottoResultTest.java rename to src/test/java/lotto/model/LottoResultTest.java index c7810e8cf9..7b0a8a330a 100644 --- a/src/test/java/lotto/Model/LottoResultTest.java +++ b/src/test/java/lotto/model/LottoResultTest.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/Model/PlayerLottoesTest.java b/src/test/java/lotto/model/PlayerLottoesTest.java similarity index 95% rename from src/test/java/lotto/Model/PlayerLottoesTest.java rename to src/test/java/lotto/model/PlayerLottoesTest.java index 0d134ffe97..108cca312f 100644 --- a/src/test/java/lotto/Model/PlayerLottoesTest.java +++ b/src/test/java/lotto/model/PlayerLottoesTest.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/Model/WinnigLottoTest.java b/src/test/java/lotto/model/WinnigLottoTest.java similarity index 98% rename from src/test/java/lotto/Model/WinnigLottoTest.java rename to src/test/java/lotto/model/WinnigLottoTest.java index 5ebcaf44cf..33e87203c4 100644 --- a/src/test/java/lotto/Model/WinnigLottoTest.java +++ b/src/test/java/lotto/model/WinnigLottoTest.java @@ -1,4 +1,4 @@ -package lotto.Model; +package lotto.model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 54d4d13aae0c38a5635bec8ed9c9f88788548e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 04:27:43 +0900 Subject: [PATCH 56/61] =?UTF-8?q?refactor:=20LottoResultCalculator=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EC=8B=9C=20=EB=8B=B9=EC=B2=A8=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/LottoController.java | 3 +-- src/main/java/lotto/model/LottoResultCalculator.java | 8 +++++--- src/main/java/lotto/view/OutputView.java | 6 +++--- src/test/java/lotto/model/LottoResultTest.java | 9 +-------- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 3bc9731d39..dc3a9f7abf 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -38,8 +38,7 @@ private WinningLotto createWinningLotto() { private void calculateResult(PlayerLottoes playerLottoes, WinningLotto winningLotto) { LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); - lottoResultCalculator.calculateWinningRank(); - outputView.printLottoResult(lottoResultCalculator.getRankingsResult().getResult()); + outputView.printLottoResult(lottoResultCalculator.getRankingsResult()); outputView.printProfit(lottoResultCalculator.calculateYield()); } } diff --git a/src/main/java/lotto/model/LottoResultCalculator.java b/src/main/java/lotto/model/LottoResultCalculator.java index cf7d28ef7c..10cfece47d 100644 --- a/src/main/java/lotto/model/LottoResultCalculator.java +++ b/src/main/java/lotto/model/LottoResultCalculator.java @@ -12,16 +12,18 @@ public class LottoResultCalculator { public LottoResultCalculator(WinningLotto winningLotto, PlayerLottoes playerLottoes) { this.winningLotto = winningLotto; this.playerLottoes = playerLottoes; - this.lottoResult = new LottoResult(); + this.lottoResult = calculateWinningRank(); } - public void calculateWinningRank() { + private LottoResult calculateWinningRank() { + LottoResult result = new LottoResult(); for (Lotto lotto : playerLottoes.getLottoes()) { int matchNumber = calculateMatchNumber(lotto); boolean matchBonusNumber = hasBonusNumber(matchNumber, lotto); Ranking ranking = Ranking.calculate(calculateMatchNumber(lotto), matchBonusNumber); - lottoResult.putResult(ranking); + result.putResult(ranking); } + return result; } private Integer calculateMatchNumber(Lotto lotto) { diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 030e142059..d395827ef4 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,11 +1,11 @@ package lotto.view; import lotto.model.Lotto; +import lotto.model.LottoResult; import lotto.model.PlayerLottoes; import lotto.model.Ranking; import java.util.Arrays; -import java.util.Map; public class OutputView { @@ -21,7 +21,7 @@ public void printBonusNumberMessage() { System.out.println(OutputMessage.BONUS_NUMBER); } - public void printLottoResult(Map rankingResult) { + public void printLottoResult(LottoResult rankingResult) { System.out.println(OutputMessage.RESULT_MESSAGE); System.out.println(OutputMessage.LINE); Arrays.stream(Ranking.values()) @@ -29,7 +29,7 @@ public void printLottoResult(Map rankingResult) { .forEach(ranking -> printRankingMessage(ranking, rankingResult)); } - private void printRankingMessage(Ranking ranking, Map rankingResult) { + private void printRankingMessage(Ranking ranking, LottoResult rankingResult) { System.out.println(ranking.getMessage(rankingResult.get(ranking))); } diff --git a/src/test/java/lotto/model/LottoResultTest.java b/src/test/java/lotto/model/LottoResultTest.java index 7b0a8a330a..e52ffa8c4a 100644 --- a/src/test/java/lotto/model/LottoResultTest.java +++ b/src/test/java/lotto/model/LottoResultTest.java @@ -21,8 +21,6 @@ void checkRankingNone() { WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(7,8,9,10,11,12)), new BonusNumber(45)); LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); - lottoResultCalculator.calculateWinningRank(); - assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.NONE)).isEqualTo(1); } @@ -34,7 +32,6 @@ void checkRankingFifth() { WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,7,8,9)), new BonusNumber(4)); LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); - lottoResultCalculator.calculateWinningRank(); assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.FIFTH)).isEqualTo(1); } @@ -47,7 +44,6 @@ void checkRankingFourth() { WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,8,9)), new BonusNumber(5)); LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); - lottoResultCalculator.calculateWinningRank(); assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.FOURTH)).isEqualTo(1); } @@ -60,7 +56,6 @@ void checkRankingThird() { WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,9)), new BonusNumber(45)); LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); - lottoResultCalculator.calculateWinningRank(); assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.THIRD)).isEqualTo(1); } @@ -73,7 +68,6 @@ void checkRankingSecond() { WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,8)), new BonusNumber(6)); LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); - lottoResultCalculator.calculateWinningRank(); assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.SECOND)).isEqualTo(1); } @@ -86,8 +80,7 @@ void checkRankingFirst() { WinningLotto winningLotto = new WinningLotto(new Lotto(List.of(1,2,3,4,5,6)), new BonusNumber(10)); LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); - lottoResultCalculator.calculateWinningRank(); assertThat(lottoResultCalculator.getRankingsResult().get(Ranking.FIRST)).isEqualTo(1); } -} +} \ No newline at end of file From de443a7561b08801c67bd818580edf864b9ca1e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 04:40:42 +0900 Subject: [PATCH 57/61] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A4=91=20=EB=B0=98=EB=B3=B5=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=83=81=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/Constant.java | 19 +++++++++++++++++++ src/main/java/lotto/model/Lotto.java | 11 +++++------ src/main/java/lotto/model/LottoCounter.java | 5 ++--- .../lotto/model/LottoResultCalculator.java | 3 +-- .../lotto/model/RandomLottoGenerator.java | 8 ++++---- 5 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 src/main/java/lotto/model/Constant.java diff --git a/src/main/java/lotto/model/Constant.java b/src/main/java/lotto/model/Constant.java new file mode 100644 index 0000000000..722e8f9f52 --- /dev/null +++ b/src/main/java/lotto/model/Constant.java @@ -0,0 +1,19 @@ +package lotto.model; + +public enum Constant { + + MAX_NUMBER(45), + MIN_NUMBER(1), + LOTTO_SIZE(6), + LOTTO_PRICE(1000); + + private final Integer constant; + + Constant(Integer constant) { + this.constant = constant; + } + + public Integer getConstant() { + return this.constant; + } +} diff --git a/src/main/java/lotto/model/Lotto.java b/src/main/java/lotto/model/Lotto.java index b3d2e756a5..22577afca5 100644 --- a/src/main/java/lotto/model/Lotto.java +++ b/src/main/java/lotto/model/Lotto.java @@ -8,9 +8,6 @@ public class Lotto { private final List numbers; - private static final int LOTTO_SIZE = 6; - private static final int MAX_NUMBER = 45; - private static final int MIN_NUMBER = 1; public Lotto(List numbers) { validateLottoSize(numbers); @@ -20,7 +17,7 @@ public Lotto(List numbers) { } private void validateLottoSize(List numbers) { - if (numbers.size() != LOTTO_SIZE) { + if (numbers.size() != Constant.LOTTO_SIZE.getConstant()) { ExceptionMessage message = ExceptionMessage.INCORRECT_LOTTO_SIZE; throw new IllegalArgumentException(message.toString()); } @@ -28,7 +25,7 @@ private void validateLottoSize(List numbers) { private void validateDuplicateNumber(List numbers) { Set numberToSet = new HashSet<>(numbers); - if (numberToSet.size() != LOTTO_SIZE) { + if (numberToSet.size() != Constant.LOTTO_SIZE.getConstant()) { ExceptionMessage message = ExceptionMessage.DUPLICATE_NUMBER; throw new IllegalArgumentException(message.toString()); } @@ -38,7 +35,9 @@ private void validateRange(List numbers) { numbers.forEach(this::isCorrectRange); } private void isCorrectRange(int number) { - if (!(MIN_NUMBER <= number && number <= MAX_NUMBER)) { + int maxNumber = Constant.MAX_NUMBER.getConstant(); + int minNumber = Constant.MIN_NUMBER.getConstant(); + if (!(minNumber <= number && number <= maxNumber)) { ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_RANGE; throw new IllegalArgumentException(exceptionMessage.toString()); } diff --git a/src/main/java/lotto/model/LottoCounter.java b/src/main/java/lotto/model/LottoCounter.java index 354fcf5357..eb7ca4c9b0 100644 --- a/src/main/java/lotto/model/LottoCounter.java +++ b/src/main/java/lotto/model/LottoCounter.java @@ -5,7 +5,6 @@ public class LottoCounter { private final int lotteryTicket; - private static final Integer LOTTO_PRICE = 1000; public LottoCounter(int payment) { validateThousandUnits(payment); @@ -13,7 +12,7 @@ public LottoCounter(int payment) { } public int calculateLotteryTicket(int payment) { - return payment / LOTTO_PRICE; + return payment / Constant.LOTTO_PRICE.getConstant(); } public int getLotteryTicket() { @@ -21,7 +20,7 @@ public int getLotteryTicket() { } private void validateThousandUnits(Integer amount) { - if((amount % LOTTO_PRICE) != 0) { + if((amount % Constant.LOTTO_PRICE.getConstant()) != 0) { ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_AMOUNT; throw new IllegalArgumentException(exceptionMessage.toString()); } diff --git a/src/main/java/lotto/model/LottoResultCalculator.java b/src/main/java/lotto/model/LottoResultCalculator.java index 10cfece47d..0d25359e78 100644 --- a/src/main/java/lotto/model/LottoResultCalculator.java +++ b/src/main/java/lotto/model/LottoResultCalculator.java @@ -5,7 +5,6 @@ public class LottoResultCalculator { private final WinningLotto winningLotto; private final PlayerLottoes playerLottoes; private final LottoResult lottoResult; - private static final int LOTTO_PRICE = 1000; private static final int PERCENTAGE = 100; private static final int THIRD_RANKING_NUMBER = 5; @@ -49,7 +48,7 @@ public LottoResult getRankingsResult() { public double calculateYield() { double totalPrize = calculateTotalPrize(); int lotteryTickets = playerLottoes.size(); - return (totalPrize / (LOTTO_PRICE * lotteryTickets)) * PERCENTAGE; + return (totalPrize / (Constant.LOTTO_PRICE.getConstant() * lotteryTickets)) * PERCENTAGE; } private double calculateTotalPrize() { diff --git a/src/main/java/lotto/model/RandomLottoGenerator.java b/src/main/java/lotto/model/RandomLottoGenerator.java index c65505ff78..25177a7c8f 100644 --- a/src/main/java/lotto/model/RandomLottoGenerator.java +++ b/src/main/java/lotto/model/RandomLottoGenerator.java @@ -5,16 +5,16 @@ public class RandomLottoGenerator { private final Lotto numbers; - private static final int MIN_NUMBER = 1; - private static final int MAX_NUMBER = 45; - private static final int LOTTO_SIZE = 6; public RandomLottoGenerator() { this.numbers = generateRandomNumber(); } private Lotto generateRandomNumber() { - return new Lotto(Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, LOTTO_SIZE)); + int maxNumber = Constant.MAX_NUMBER.getConstant(); + int minNumber = Constant.MIN_NUMBER.getConstant(); + int lottoSize = Constant.LOTTO_SIZE.getConstant(); + return new Lotto(Randoms.pickUniqueNumbersInRange(minNumber, maxNumber, lottoSize)); } public Lotto getRandomNumber() { From 673d2bf8da119eb5406d3a3769c1cbfbd72336bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Wed, 9 Aug 2023 04:45:32 +0900 Subject: [PATCH 58/61] =?UTF-8?q?refactor(LottoResultCalculator):=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EA=B2=B0=EA=B3=BC=20=EC=B4=9D=EC=95=A1=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EB=9E=8C=EB=8B=A4=EC=8B=9D=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/LottoResultCalculator.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/lotto/model/LottoResultCalculator.java b/src/main/java/lotto/model/LottoResultCalculator.java index 0d25359e78..e3e5a35e63 100644 --- a/src/main/java/lotto/model/LottoResultCalculator.java +++ b/src/main/java/lotto/model/LottoResultCalculator.java @@ -52,10 +52,9 @@ public double calculateYield() { } private double calculateTotalPrize() { - double sum = 0; - for(Ranking ranking: lottoResult.keySet()) { - sum += ranking.getPrize() * lottoResult.get(ranking); - } - return sum; + return lottoResult.keySet() + .stream() + .mapToInt((ranking -> ranking.getPrize() * lottoResult.get(ranking))) + .sum(); } } From 1d22ec1fe00d6561aa7463d66670d393a3eaaa27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Thu, 10 Aug 2023 21:24:21 +0900 Subject: [PATCH 59/61] =?UTF-8?q?refactor(LottoResult):=20=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/LottoResult.java | 39 +++++++++++++++++++- src/main/java/lotto/model/Ranking.java | 20 +++++----- src/main/java/lotto/model/ResultMessage.java | 20 ++++++++++ src/main/java/lotto/view/OutputView.java | 11 +----- 4 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 src/main/java/lotto/model/ResultMessage.java diff --git a/src/main/java/lotto/model/LottoResult.java b/src/main/java/lotto/model/LottoResult.java index 666f61d96c..c9abf43ede 100644 --- a/src/main/java/lotto/model/LottoResult.java +++ b/src/main/java/lotto/model/LottoResult.java @@ -27,7 +27,42 @@ public Integer get(Ranking ranking) { return result.get(ranking); } - public Map getResult() { - return result; + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + Arrays.stream(Ranking.values()) + .filter(ranking -> ranking != Ranking.NONE) + .forEach(ranking -> { + appendMatchNumberMessage(ranking, stringBuilder); + appendBonusMessage(ranking, stringBuilder); + appendPrizeAmountMessage(ranking, stringBuilder); + appendWinningNumberMessage(ranking, stringBuilder); + stringBuilder.append(ResultMessage.NEW_LINE); + }); + return stringBuilder.toString(); + } + + private void appendMatchNumberMessage(Ranking ranking, StringBuilder stringBuilder) { + ResultMessage resultMessage = ResultMessage.MATCH_NUMBER_MESSAGE; + int matchNumber = ranking.getMatchNumber(); + stringBuilder.append(String.format(resultMessage.toString(), matchNumber)); + } + + private void appendPrizeAmountMessage(Ranking ranking, StringBuilder stringBuilder) { + ResultMessage resultMessage = ResultMessage.AMOUNT_MESSAGE; + int prize = ranking.getPrize(); + stringBuilder.append(String.format(resultMessage.toString(), prize)); + } + + private void appendBonusMessage(Ranking ranking, StringBuilder stringBuilder) { + if (ranking == Ranking.SECOND) { + stringBuilder.append(ResultMessage.BONUS_MESSAGE); + } + } + + private void appendWinningNumberMessage(Ranking ranking, StringBuilder stringBuilder) { + ResultMessage resultMessage = ResultMessage.WINNING_NUMBER_MESSAGE; + int winningNumber = result.get(ranking); + stringBuilder.append(String.format(resultMessage.toString(), winningNumber)); } } diff --git a/src/main/java/lotto/model/Ranking.java b/src/main/java/lotto/model/Ranking.java index 1735822117..364c08734b 100644 --- a/src/main/java/lotto/model/Ranking.java +++ b/src/main/java/lotto/model/Ranking.java @@ -3,23 +3,21 @@ import java.util.Arrays; public enum Ranking { - NONE(0, 0, false, null), - FIFTH(5_000, 3, false, "3개 일치 (5,000원) - %d개"), - FOURTH(50_000, 4, false, "4개 일치 (50,000원) - %d개"), - THIRD(1_500_000, 5, false, "5개 일치 (1,500,000원) - %d개"), - SECOND(30_000_000, 5, true, "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"), - FIRST(2_000_000_000, 6, false, "6개 일치 (2,000,000,000원) - %d개"); + NONE(0, 0, false), + FIFTH(5_000, 3, false), + FOURTH(50_000, 4, false), + THIRD(1_500_000, 5, false), + SECOND(30_000_000, 5, true), + FIRST(2_000_000_000, 6, false); private final int prize; private final int matchNumber; private final boolean isMatchBonus; - private final String message; - Ranking(int prize, int matchNumber, boolean isMatchBonus, String message) { + Ranking(int prize, int matchNumber, boolean isMatchBonus) { this.prize = prize; this.matchNumber = matchNumber; this.isMatchBonus = isMatchBonus; - this.message = message; } public static Ranking calculate(int matchNumber, boolean isMatchBonus) { @@ -34,7 +32,7 @@ public int getPrize() { return prize; } - public String getMessage(int result) { - return String.format(message, result); + public int getMatchNumber() { + return matchNumber; } } diff --git a/src/main/java/lotto/model/ResultMessage.java b/src/main/java/lotto/model/ResultMessage.java new file mode 100644 index 0000000000..b59a9b6e66 --- /dev/null +++ b/src/main/java/lotto/model/ResultMessage.java @@ -0,0 +1,20 @@ +package lotto.model; + +public enum ResultMessage { + + MATCH_NUMBER_MESSAGE("%d개 일치"), + BONUS_MESSAGE(", 보너스 볼 일치"), + AMOUNT_MESSAGE(" (%,d원) - "), + WINNING_NUMBER_MESSAGE("%d개"), + NEW_LINE("\n"); + private final String message; + + ResultMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } +} diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index d395827ef4..5ea4fee3d7 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -3,9 +3,6 @@ import lotto.model.Lotto; import lotto.model.LottoResult; import lotto.model.PlayerLottoes; -import lotto.model.Ranking; - -import java.util.Arrays; public class OutputView { @@ -24,13 +21,7 @@ public void printBonusNumberMessage() { public void printLottoResult(LottoResult rankingResult) { System.out.println(OutputMessage.RESULT_MESSAGE); System.out.println(OutputMessage.LINE); - Arrays.stream(Ranking.values()) - .filter(ranking -> ranking != Ranking.NONE) - .forEach(ranking -> printRankingMessage(ranking, rankingResult)); - } - - private void printRankingMessage(Ranking ranking, LottoResult rankingResult) { - System.out.println(ranking.getMessage(rankingResult.get(ranking))); + System.out.println(rankingResult.toString()); } public void printPurchaseCount(int lottoTicketsNumber) { From fb10ae0d692856df8e03292932b8eb875aaf42ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Thu, 10 Aug 2023 21:30:42 +0900 Subject: [PATCH 60/61] =?UTF-8?q?refactor(LottoResultCalculator):=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EA=B2=B0=EA=B3=BC=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/model/LottoResultCalculator.java | 12 ++++++++++- src/main/java/lotto/model/Ranking.java | 20 +++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/lotto/model/LottoResultCalculator.java b/src/main/java/lotto/model/LottoResultCalculator.java index e3e5a35e63..e745f1b353 100644 --- a/src/main/java/lotto/model/LottoResultCalculator.java +++ b/src/main/java/lotto/model/LottoResultCalculator.java @@ -1,5 +1,7 @@ package lotto.model; +import java.util.Arrays; + public class LottoResultCalculator { private final WinningLotto winningLotto; @@ -19,12 +21,20 @@ private LottoResult calculateWinningRank() { for (Lotto lotto : playerLottoes.getLottoes()) { int matchNumber = calculateMatchNumber(lotto); boolean matchBonusNumber = hasBonusNumber(matchNumber, lotto); - Ranking ranking = Ranking.calculate(calculateMatchNumber(lotto), matchBonusNumber); + Ranking ranking = calculateRanking(matchNumber, matchBonusNumber); result.putResult(ranking); } return result; } + private static Ranking calculateRanking(int matchNumber, boolean isMatchBonus) { + return Arrays.stream(Ranking.values()) + .filter(ranking -> ranking.getMatchNumber() == matchNumber) + .filter(ranking -> ranking.getBonusMatch() == isMatchBonus) + .findAny() + .orElse(Ranking.NONE); + } + private Integer calculateMatchNumber(Lotto lotto) { Lotto winningLottoNumbers = winningLotto.getLotto(); return (int) winningLottoNumbers.getNumbers() diff --git a/src/main/java/lotto/model/Ranking.java b/src/main/java/lotto/model/Ranking.java index 364c08734b..bf6b14d516 100644 --- a/src/main/java/lotto/model/Ranking.java +++ b/src/main/java/lotto/model/Ranking.java @@ -1,7 +1,5 @@ package lotto.model; -import java.util.Arrays; - public enum Ranking { NONE(0, 0, false), FIFTH(5_000, 3, false), @@ -12,20 +10,12 @@ public enum Ranking { private final int prize; private final int matchNumber; - private final boolean isMatchBonus; + private final boolean bonusMatch; - Ranking(int prize, int matchNumber, boolean isMatchBonus) { + Ranking(int prize, int matchNumber, boolean bonusMatch) { this.prize = prize; this.matchNumber = matchNumber; - this.isMatchBonus = isMatchBonus; - } - - public static Ranking calculate(int matchNumber, boolean isMatchBonus) { - return Arrays.stream(values()) - .filter(ranking -> ranking.matchNumber == matchNumber) - .filter(ranking -> ranking.isMatchBonus == isMatchBonus) - .findAny() - .orElse(NONE); + this.bonusMatch = bonusMatch; } public int getPrize() { @@ -35,4 +25,8 @@ public int getPrize() { public int getMatchNumber() { return matchNumber; } + + public boolean getBonusMatch() { + return bonusMatch; + } } From ff698d771953adfe9052d841fd91f1789d908f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Thu, 10 Aug 2023 21:42:59 +0900 Subject: [PATCH 61/61] =?UTF-8?q?refactor(ProfitCalculator):=20=EC=88=98?= =?UTF-8?q?=EC=9D=B5=EB=A5=A0=20=EA=B2=B0=EA=B3=BC=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EC=97=AD=ED=95=A0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 3 +- .../lotto/model/LottoResultCalculator.java | 14 --------- .../java/lotto/model/ProfitCalculator.java | 31 +++++++++++++++++++ 3 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 src/main/java/lotto/model/ProfitCalculator.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index dc3a9f7abf..8c2b13ef5d 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -38,7 +38,8 @@ private WinningLotto createWinningLotto() { private void calculateResult(PlayerLottoes playerLottoes, WinningLotto winningLotto) { LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(winningLotto, playerLottoes); + ProfitCalculator profitCalculator = new ProfitCalculator(lottoResultCalculator.getRankingsResult()); outputView.printLottoResult(lottoResultCalculator.getRankingsResult()); - outputView.printProfit(lottoResultCalculator.calculateYield()); + outputView.printProfit(profitCalculator.getProfit()); } } diff --git a/src/main/java/lotto/model/LottoResultCalculator.java b/src/main/java/lotto/model/LottoResultCalculator.java index e745f1b353..7312394ff6 100644 --- a/src/main/java/lotto/model/LottoResultCalculator.java +++ b/src/main/java/lotto/model/LottoResultCalculator.java @@ -7,7 +7,6 @@ public class LottoResultCalculator { private final WinningLotto winningLotto; private final PlayerLottoes playerLottoes; private final LottoResult lottoResult; - private static final int PERCENTAGE = 100; private static final int THIRD_RANKING_NUMBER = 5; public LottoResultCalculator(WinningLotto winningLotto, PlayerLottoes playerLottoes) { @@ -54,17 +53,4 @@ private boolean hasBonusNumber(int matchNumber, Lotto lotto) { public LottoResult getRankingsResult() { return lottoResult; } - - public double calculateYield() { - double totalPrize = calculateTotalPrize(); - int lotteryTickets = playerLottoes.size(); - return (totalPrize / (Constant.LOTTO_PRICE.getConstant() * lotteryTickets)) * PERCENTAGE; - } - - private double calculateTotalPrize() { - return lottoResult.keySet() - .stream() - .mapToInt((ranking -> ranking.getPrize() * lottoResult.get(ranking))) - .sum(); - } } diff --git a/src/main/java/lotto/model/ProfitCalculator.java b/src/main/java/lotto/model/ProfitCalculator.java new file mode 100644 index 0000000000..8549ec4d99 --- /dev/null +++ b/src/main/java/lotto/model/ProfitCalculator.java @@ -0,0 +1,31 @@ +package lotto.model; + +public class ProfitCalculator { + + private final LottoResult lottoResult; + private static final int PERCENTAGE = 100; + + public ProfitCalculator(LottoResult lottoResult) { + this.lottoResult = lottoResult; + } + + public double getProfit() { + double totalPrize = calculateTotalPrize(); + int ticketCount =calculateTicketCount(); + return (totalPrize / (Constant.LOTTO_PRICE.getConstant() * ticketCount)) * PERCENTAGE; + } + + private double calculateTotalPrize() { + return lottoResult.keySet() + .stream() + .mapToInt((ranking -> ranking.getPrize() * lottoResult.get(ranking))) + .sum(); + } + + private int calculateTicketCount() { + return lottoResult.keySet() + .stream() + .mapToInt(lottoResult::get) + .sum(); + } +}