From 1f05aa0948ec4cdf415f96f0670b84888e34ed44 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 00:35:55 +0900 Subject: [PATCH 01/44] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 7c9722c..7c87b5a 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,28 @@ - 규칙 8: 일급 콜렉션을 쓴다. ## 힌트 + - 로또 자동 생성은 Collections.shuffle() 메소드 활용한다. - Collections.sort() 메소드를 활용해 정렬 가능하다. - ArrayList의 contains() 메소드를 활용하면 어떤 값이 존재하는지 유무를 판단할 수 있다. + +___ + +### 기능 목록 + +- [ ] 구입금액 입력 +- [ ] 구입한 로또 개수 출력 +- [ ] 개수만큼 로또 번호 출력 + - [ ] 번호 자동 생성 +- [ ] 지난주 당첨 번호와 보너스 볼 입력 +- [ ] 번호 비교 +- [ ] 수익률 계산 및 출력 + +### 예외 + +- 구입금액이 0원 이하인 경우 +- 구입금액에 숫자 이외의 값이 들어온 경우 +- 지난 주 당첨 번호가 중복되었을 경우 +- 당첨 번호가 1-45가 아닐 경우 +- 당첨 번호 구분자가 (,)가 아닐 경우 +- 당첨 번호 개수가 6개가 아닐 경우 From d30dc74f852e27b3f3e94e15fa9518a16c10aadb Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 00:44:28 +0900 Subject: [PATCH 02/44] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=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 --- README.md | 20 ++++++++++++-------- src/main/java/Application.java | 8 ++++++++ src/main/java/empty.txt | 0 src/main/java/ui/Printer.java | 10 ++++++++++ src/main/java/ui/Receiver.java | 29 +++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 src/main/java/Application.java delete mode 100644 src/main/java/empty.txt create mode 100644 src/main/java/ui/Printer.java create mode 100644 src/main/java/ui/Receiver.java diff --git a/README.md b/README.md index 7c87b5a..9a1c252 100644 --- a/README.md +++ b/README.md @@ -60,19 +60,23 @@ ___ ### 기능 목록 -- [ ] 구입금액 입력 +- [x] 구입금액 입력 + - [ ] 예외 - [ ] 구입한 로또 개수 출력 - [ ] 개수만큼 로또 번호 출력 - [ ] 번호 자동 생성 -- [ ] 지난주 당첨 번호와 보너스 볼 입력 +- [x] 지난주 당첨 번호와 보너스 볼 입력 + - [ ] 예외 - [ ] 번호 비교 - [ ] 수익률 계산 및 출력 ### 예외 -- 구입금액이 0원 이하인 경우 -- 구입금액에 숫자 이외의 값이 들어온 경우 -- 지난 주 당첨 번호가 중복되었을 경우 -- 당첨 번호가 1-45가 아닐 경우 -- 당첨 번호 구분자가 (,)가 아닐 경우 -- 당첨 번호 개수가 6개가 아닐 경우 +- 구입 금액 입력 + - [ ] 구입금액이 0원 이하인 경우 + - [ ] 구입금액에 숫자 이외의 값이 들어온 경우 +- 당첨 번호와 보너스 볼 입력 + - [ ] 지난 주 당첨 번호가 중복되었을 경우 + - [ ] 당첨 번호가 1-45가 아닐 경우 + - [ ] 당첨 번호 구분자가 (,)가 아닐 경우 + - [ ] 당첨 번호 개수가 6개가 아닐 경우 diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 0000000..4b0f296 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,8 @@ +import ui.Receiver; + +public class Application { + public static void main(String[] args) { + Receiver receiver = new Receiver(); + receiver.receiveAmount(); + } +} diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java new file mode 100644 index 0000000..9197f91 --- /dev/null +++ b/src/main/java/ui/Printer.java @@ -0,0 +1,10 @@ +package ui; + +import domain.Lotteries; + +public class Printer { + + public void printLotteries(Lotteries lotteries) { + + } +} diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/Receiver.java new file mode 100644 index 0000000..fa10c47 --- /dev/null +++ b/src/main/java/ui/Receiver.java @@ -0,0 +1,29 @@ +package ui; + +import java.util.Scanner; + +public class Receiver { + private static final Scanner SCANNER = new Scanner(System.in); + private static final String 구입금액_입력 = "구입금액을 입력해 주세요."; + private static final String 구매했습니다 = "개를 구매했습니다."; + private static final String 지난주당첨번호 = "지난 주 당첨 번호를 입력해 주세요."; + private static final String 보너스볼 = "보너스 볼을 입력해 주세요."; + + public int receiveAmount() { + System.out.println(구입금액_입력); + int amount = SCANNER.nextInt(); + int count = amount / 1000; + System.out.println(count + 구매했습니다); + return count; + } + + public String receiveWinningNumbers() { + System.out.println(지난주당첨번호); + return SCANNER.nextLine(); + } + + public int receiveBonusNumber() { + System.out.println(보너스볼); + return SCANNER.nextInt(); + } +} From fab2251776a57d42db3a18ddd896ea9401692ac6 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 00:45:17 +0900 Subject: [PATCH 03/44] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8,=20=EB=A1=9C=EB=98=90=20=EB=B2=88=ED=98=B8?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=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/domain/Lotteries.java | 15 +++++++++++ src/main/java/domain/Lottery.java | 13 ++++++++++ src/main/java/domain/LotteryStore.java | 35 ++++++++++++++++++++++++++ src/main/java/domain/Numbers.java | 11 ++++++++ 4 files changed, 74 insertions(+) create mode 100644 src/main/java/domain/Lotteries.java create mode 100644 src/main/java/domain/Lottery.java create mode 100644 src/main/java/domain/LotteryStore.java create mode 100644 src/main/java/domain/Numbers.java diff --git a/src/main/java/domain/Lotteries.java b/src/main/java/domain/Lotteries.java new file mode 100644 index 0000000..a437f37 --- /dev/null +++ b/src/main/java/domain/Lotteries.java @@ -0,0 +1,15 @@ +package domain; + +import java.util.List; + +public class Lotteries { + private final List lotteries; + + public Lotteries(List lotteries) { + this.lotteries = lotteries; + } + + public List getLotteries() { + return lotteries; + } +} diff --git a/src/main/java/domain/Lottery.java b/src/main/java/domain/Lottery.java new file mode 100644 index 0000000..9e8f706 --- /dev/null +++ b/src/main/java/domain/Lottery.java @@ -0,0 +1,13 @@ +package domain; + +public class Lottery { + private final Numbers numbers; + + public Lottery(Numbers numbers) { + this.numbers = numbers; + } + + public Numbers getNumbers() { + return numbers; + } +} diff --git a/src/main/java/domain/LotteryStore.java b/src/main/java/domain/LotteryStore.java new file mode 100644 index 0000000..0d02110 --- /dev/null +++ b/src/main/java/domain/LotteryStore.java @@ -0,0 +1,35 @@ +package domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class LotteryStore { + private List numbers = new ArrayList<>(); + + public LotteryStore() { + initNumbers(); + } + + private void initNumbers() { + for (int i = 1; i <= 45; i++) { + numbers.add(i); + } + } + + public Lotteries createLotteries(int count) { + List lotteries = new ArrayList<>(); + while (count-- > 0) { + lotteries.add(createLottery()); + } + + return new Lotteries(lotteries); + } + + private Lottery createLottery() { + Collections.shuffle(numbers); + Numbers numbers1 = new Numbers(numbers.stream().limit(6).collect(Collectors.toList())); + return new Lottery(numbers1); + } +} diff --git a/src/main/java/domain/Numbers.java b/src/main/java/domain/Numbers.java new file mode 100644 index 0000000..32e471a --- /dev/null +++ b/src/main/java/domain/Numbers.java @@ -0,0 +1,11 @@ +package domain; + +import java.util.List; + +public class Numbers { + private final List numbers; + + public Numbers(List numbers) { + this.numbers = numbers; + } +} From 6b8c6e4a0a14b818f9e6806b1ff5c0d344023eb4 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 01:32:58 +0900 Subject: [PATCH 04/44] =?UTF-8?q?feat:=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=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/domain/Message.java | 18 ++++++++++++++ src/test/java/domain/LotteryStoreTest.java | 28 ++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/domain/Message.java create mode 100644 src/test/java/domain/LotteryStoreTest.java diff --git a/src/main/java/domain/Message.java b/src/main/java/domain/Message.java new file mode 100644 index 0000000..9e4027a --- /dev/null +++ b/src/main/java/domain/Message.java @@ -0,0 +1,18 @@ +package domain; + +public enum Message { + INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), + INPUT_LAST_WEEK_WINNING_NUMBERS("지난 주 당첨 번호를 입력해 주세요."), + INPUT_BONUS_BALL("보너스 볼을 입력해 주세요."), + PURCHASED_COUNT("개를 구매했습니다."); + + private String message; + + Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/test/java/domain/LotteryStoreTest.java b/src/test/java/domain/LotteryStoreTest.java new file mode 100644 index 0000000..1e72d53 --- /dev/null +++ b/src/test/java/domain/LotteryStoreTest.java @@ -0,0 +1,28 @@ +package domain; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class LotteryStoreTest { + + private LotteryStore lotteryStore; + + @BeforeEach + void setUp() { + lotteryStore = new LotteryStore(); + } + + @Test + public void 공_6개를_뽑는다() throws Exception { + //given + int sizeOfLottery = 6; + + //when + Lotteries lotteries = lotteryStore.createLotteries(1); + + //then + assertThat(lotteries.getLotteries().get(0).getNumbers().getNumbers().size()).isEqualTo(sizeOfLottery); + } +} \ No newline at end of file From 0e5b374a64452d2a59227af174dd251f7e58860d Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 01:36:25 +0900 Subject: [PATCH 05/44] =?UTF-8?q?feat:=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC,=20=EA=B5=AC=EC=9E=85=EA=B8=88=EC=95=A1,=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 4 +++- src/main/java/ui/Printer.java | 7 +++++++ src/main/java/ui/Receiver.java | 19 +++++++------------ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 4b0f296..2ef8af5 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,8 +1,10 @@ +import ui.Printer; import ui.Receiver; public class Application { public static void main(String[] args) { Receiver receiver = new Receiver(); - receiver.receiveAmount(); + Printer printer = new Printer(); + int purchasedCount = printer.printPurchasedCount(receiver.receivePurchasePrice()); } } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 9197f91..5976f9a 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -1,9 +1,16 @@ package ui; import domain.Lotteries; +import domain.Message; public class Printer { + public int printPurchasedCount(int purchasePrice) { + int purchasedCount = purchasePrice / 1000; + System.out.println(purchasedCount + Message.PURCHASED_COUNT.getMessage()); + return purchasedCount; + } + public void printLotteries(Lotteries lotteries) { } diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/Receiver.java index fa10c47..a5cf444 100644 --- a/src/main/java/ui/Receiver.java +++ b/src/main/java/ui/Receiver.java @@ -2,28 +2,23 @@ import java.util.Scanner; +import domain.Message; + public class Receiver { private static final Scanner SCANNER = new Scanner(System.in); - private static final String 구입금액_입력 = "구입금액을 입력해 주세요."; - private static final String 구매했습니다 = "개를 구매했습니다."; - private static final String 지난주당첨번호 = "지난 주 당첨 번호를 입력해 주세요."; - private static final String 보너스볼 = "보너스 볼을 입력해 주세요."; - public int receiveAmount() { - System.out.println(구입금액_입력); - int amount = SCANNER.nextInt(); - int count = amount / 1000; - System.out.println(count + 구매했습니다); - return count; + public int receivePurchasePrice() { + System.out.println(Message.INPUT_PURCHASE_PRICE.getMessage()); + return SCANNER.nextInt(); } public String receiveWinningNumbers() { - System.out.println(지난주당첨번호); + System.out.println(Message.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); return SCANNER.nextLine(); } public int receiveBonusNumber() { - System.out.println(보너스볼); + System.out.println(Message.INPUT_BONUS_BALL.getMessage()); return SCANNER.nextInt(); } } From 487ebd5c7ff7fd38f89c473eccf74ff4271ceb46 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 02:09:11 +0900 Subject: [PATCH 06/44] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=83=9D=EC=84=B1,=20=EA=B5=AC=EC=9E=85=ED=95=9C?= =?UTF-8?q?=20=EB=A1=9C=EB=98=90=EC=9D=98=20=EB=B2=88=ED=98=B8=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- src/main/java/Application.java | 6 ++++++ src/main/java/domain/LotteryStore.java | 14 ++++++++------ src/main/java/domain/Numbers.java | 4 ++++ src/main/java/ui/Printer.java | 7 +++++-- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9a1c252..331fb4b 100644 --- a/README.md +++ b/README.md @@ -62,9 +62,9 @@ ___ - [x] 구입금액 입력 - [ ] 예외 -- [ ] 구입한 로또 개수 출력 -- [ ] 개수만큼 로또 번호 출력 - - [ ] 번호 자동 생성 +- [x] 구입한 로또 개수 출력 +- [x] 개수만큼 로또 번호 출력 + - [x] 번호 자동 생성 - [x] 지난주 당첨 번호와 보너스 볼 입력 - [ ] 예외 - [ ] 번호 비교 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 2ef8af5..87a2977 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,3 +1,5 @@ +import domain.Lotteries; +import domain.LotteryStore; import ui.Printer; import ui.Receiver; @@ -6,5 +8,9 @@ public static void main(String[] args) { Receiver receiver = new Receiver(); Printer printer = new Printer(); int purchasedCount = printer.printPurchasedCount(receiver.receivePurchasePrice()); + + LotteryStore lotteryStore = new LotteryStore(); + Lotteries lotteries = lotteryStore.createLotteries(purchasedCount); + printer.printPurchasedLotteries(lotteries); } } diff --git a/src/main/java/domain/LotteryStore.java b/src/main/java/domain/LotteryStore.java index 0d02110..797566a 100644 --- a/src/main/java/domain/LotteryStore.java +++ b/src/main/java/domain/LotteryStore.java @@ -6,7 +6,7 @@ import java.util.stream.Collectors; public class LotteryStore { - private List numbers = new ArrayList<>(); + private final List targetNumbers = new ArrayList<>(); public LotteryStore() { initNumbers(); @@ -14,7 +14,7 @@ public LotteryStore() { private void initNumbers() { for (int i = 1; i <= 45; i++) { - numbers.add(i); + targetNumbers.add(i); } } @@ -23,13 +23,15 @@ public Lotteries createLotteries(int count) { while (count-- > 0) { lotteries.add(createLottery()); } - return new Lotteries(lotteries); } private Lottery createLottery() { - Collections.shuffle(numbers); - Numbers numbers1 = new Numbers(numbers.stream().limit(6).collect(Collectors.toList())); - return new Lottery(numbers1); + Collections.shuffle(targetNumbers); + Numbers numbers = new Numbers( + targetNumbers.stream() + .limit(6) + .collect(Collectors.toList())); + return new Lottery(numbers); } } diff --git a/src/main/java/domain/Numbers.java b/src/main/java/domain/Numbers.java index 32e471a..37e42a4 100644 --- a/src/main/java/domain/Numbers.java +++ b/src/main/java/domain/Numbers.java @@ -8,4 +8,8 @@ public class Numbers { public Numbers(List numbers) { this.numbers = numbers; } + + public List getNumbers() { + return numbers; + } } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 5976f9a..c9b83ee 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -11,7 +11,10 @@ public int printPurchasedCount(int purchasePrice) { return purchasedCount; } - public void printLotteries(Lotteries lotteries) { - + public void printPurchasedLotteries(Lotteries lotteries) { + lotteries.getLotteries() + .stream() + .map(lottery -> lottery.getNumbers().getNumbers()) + .forEach(System.out::println); } } From ee52f11e66eaff7a20ce1b13dd9d919ad054e06f Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 03:25:37 +0900 Subject: [PATCH 07/44] =?UTF-8?q?feat:=20=EC=A7=80=EB=82=9C=EC=A3=BC=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EB=B2=88=ED=98=B8=EC=99=80=20=EB=B3=B4?= =?UTF-8?q?=EB=84=88=EC=8A=A4=20=EB=B3=BC=20=EC=9E=85=EB=A0=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 4 ++++ src/main/java/ui/Printer.java | 1 + src/main/java/ui/Receiver.java | 1 + 3 files changed, 6 insertions(+) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 87a2977..83810aa 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,4 +1,5 @@ import domain.Lotteries; +import domain.LotteryMachine; import domain.LotteryStore; import ui.Printer; import ui.Receiver; @@ -12,5 +13,8 @@ public static void main(String[] args) { LotteryStore lotteryStore = new LotteryStore(); Lotteries lotteries = lotteryStore.createLotteries(purchasedCount); printer.printPurchasedLotteries(lotteries); + + LotteryMachine lotteryMachine = new LotteryMachine(receiver.receiveWinningNumbers(), + receiver.receiveBonusNumber()); } } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index c9b83ee..0b03621 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -16,5 +16,6 @@ public void printPurchasedLotteries(Lotteries lotteries) { .stream() .map(lottery -> lottery.getNumbers().getNumbers()) .forEach(System.out::println); + System.out.println(); } } diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/Receiver.java index a5cf444..9d04158 100644 --- a/src/main/java/ui/Receiver.java +++ b/src/main/java/ui/Receiver.java @@ -14,6 +14,7 @@ public int receivePurchasePrice() { public String receiveWinningNumbers() { System.out.println(Message.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); + SCANNER.nextLine(); return SCANNER.nextLine(); } From f54c6074bbd7c85fedb0804b913999f10979c7bf Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 04:07:57 +0900 Subject: [PATCH 08/44] =?UTF-8?q?feat:=20=EC=B4=9D=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=EA=B3=BC=20=EC=B4=9D=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 - 일치하는 숫자의 개수에 따른 당첨금을 가지고 있는 enum --- src/main/java/domain/PrizeMoney.java | 29 ++++++++++++++++++++++++ src/test/java/domain/PrizeMoneyTest.java | 24 ++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/main/java/domain/PrizeMoney.java create mode 100644 src/test/java/domain/PrizeMoneyTest.java diff --git a/src/main/java/domain/PrizeMoney.java b/src/main/java/domain/PrizeMoney.java new file mode 100644 index 0000000..769b30d --- /dev/null +++ b/src/main/java/domain/PrizeMoney.java @@ -0,0 +1,29 @@ +package domain; + +import java.util.List; + +public enum PrizeMoney { + THREE(3, 5000), + FOUR(4, 50000), + FIVE(5, 1500000), + FIVE_BONUS(5, 30000000), + SIX(6, 2000000000); + + private final int matchingCount; + private final int prizeMoney; + + PrizeMoney(int matchingCount, int prizeMoney) { + this.matchingCount = matchingCount; + this.prizeMoney = prizeMoney; + } + + public static float calculateEarningsRate(Result result, int purchasePrice) { + List matchingCounts = result.getResult(); + int totalPrizeMoney = 0; + for (int i = 0; i < 5; i++) { + totalPrizeMoney += matchingCounts.get(i) * (PrizeMoney.values())[i].prizeMoney; + } + + return (float)totalPrizeMoney / purchasePrice; + } +} diff --git a/src/test/java/domain/PrizeMoneyTest.java b/src/test/java/domain/PrizeMoneyTest.java new file mode 100644 index 0000000..e22f14b --- /dev/null +++ b/src/test/java/domain/PrizeMoneyTest.java @@ -0,0 +1,24 @@ +package domain; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +class PrizeMoneyTest { + + @Test + void 총수익률을_계산한다() { + // given + Result result = new Result(Arrays.asList(3, 4, 0, 2, 1)); + int purchasePrice = 15000; + + // when + float earningsRate = PrizeMoney.calculateEarningsRate(result, purchasePrice); + + // then + assertThat(earningsRate).isEqualTo( + (float)(3 * 5000 + 4 * 50000 + 0 * 1500000 + 2 * 30000000 + 1 * 2000000000) / purchasePrice); + } +} \ No newline at end of file From 6ef3d82c41eafb2b2da3cee9e1ad1ea6b3a2824e Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 05:08:01 +0900 Subject: [PATCH 09/44] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=ED=86=B5?= =?UTF-8?q?=EA=B3=84,=20=EC=88=98=EC=9D=B5=EB=A5=A0=20=EC=B6=9C=EB=A0=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 --- README.md | 4 ++-- src/main/java/domain/Message.java | 13 ++++++++-- src/main/java/domain/PrizeMoney.java | 8 +++++++ src/main/java/ui/Printer.java | 36 +++++++++++++++++++++++++++- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 331fb4b..743f0a2 100644 --- a/README.md +++ b/README.md @@ -68,13 +68,13 @@ ___ - [x] 지난주 당첨 번호와 보너스 볼 입력 - [ ] 예외 - [ ] 번호 비교 -- [ ] 수익률 계산 및 출력 +- [x] 당첨 통계 출력 +- [x] 수익률 계산 및 출력 ### 예외 - 구입 금액 입력 - [ ] 구입금액이 0원 이하인 경우 - - [ ] 구입금액에 숫자 이외의 값이 들어온 경우 - 당첨 번호와 보너스 볼 입력 - [ ] 지난 주 당첨 번호가 중복되었을 경우 - [ ] 당첨 번호가 1-45가 아닐 경우 diff --git a/src/main/java/domain/Message.java b/src/main/java/domain/Message.java index 9e4027a..e9849ce 100644 --- a/src/main/java/domain/Message.java +++ b/src/main/java/domain/Message.java @@ -2,9 +2,18 @@ public enum Message { INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), - INPUT_LAST_WEEK_WINNING_NUMBERS("지난 주 당첨 번호를 입력해 주세요."), + INPUT_LAST_WEEK_WINNING_NUMBERS("\n지난 주 당첨 번호를 입력해 주세요."), INPUT_BONUS_BALL("보너스 볼을 입력해 주세요."), - PURCHASED_COUNT("개를 구매했습니다."); + + PURCHASED_COUNT("개를 구매했습니다."), + WINNING_STATISTICS("\n당첨 통계\n"), + BOUNDARY_LINE("---------\n"), + MATCH_COUNT("개 일치 ("), + MATCH_COUNT_BONUS("개 일치, 보너스 볼 일치("), + WON("원)- "), + COUNT("개\n"), + TOTAL_EARNINGS_RATE("총 수익률은 "), + CLOSING_MENTION("입니다.(1 기준)"); private String message; diff --git a/src/main/java/domain/PrizeMoney.java b/src/main/java/domain/PrizeMoney.java index 769b30d..8125c97 100644 --- a/src/main/java/domain/PrizeMoney.java +++ b/src/main/java/domain/PrizeMoney.java @@ -26,4 +26,12 @@ public static float calculateEarningsRate(Result result, int purchasePrice) { return (float)totalPrizeMoney / purchasePrice; } + + public int getMatchingCount() { + return matchingCount; + } + + public int getPrizeMoney() { + return prizeMoney; + } } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 0b03621..ac29ef0 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -1,7 +1,11 @@ package ui; +import java.util.List; + import domain.Lotteries; import domain.Message; +import domain.PrizeMoney; +import domain.Result; public class Printer { @@ -16,6 +20,36 @@ public void printPurchasedLotteries(Lotteries lotteries) { .stream() .map(lottery -> lottery.getNumbers().getNumbers()) .forEach(System.out::println); - System.out.println(); + } + + public void printWinningStatistics(Result result) { + StringBuilder builder = new StringBuilder(); + PrizeMoney[] prizeMonies = PrizeMoney.values(); + List results = result.getResult(); + + builder.append(Message.WINNING_STATISTICS.getMessage()).append(Message.BOUNDARY_LINE.getMessage()); + for (int i = 0; i < 5; i++) { + printWinningStatisticsDetails(builder, prizeMonies[i], results.get(i), i); + } + System.out.print(builder); + } + + private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney prizeMoney, Integer result, int i) { + builder.append(prizeMoney.getMatchingCount()); + if (i == 3) { + builder.append(Message.MATCH_COUNT_BONUS.getMessage()); + } + if (i != 3) { + builder.append(Message.MATCH_COUNT.getMessage()); + } + builder.append(prizeMoney.getPrizeMoney()) + .append(Message.WON.getMessage()) + .append(result) + .append(Message.COUNT.getMessage()); + } + + public void printTotalEarningsRate(float totalEarningsRate) { + System.out.println(Message.TOTAL_EARNINGS_RATE.getMessage() + String.format("%.2f", totalEarningsRate) + + Message.CLOSING_MENTION.getMessage()); } } From 8bf6bbb48b1db256bcff4c2ecfc91401e48281af Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 05:11:12 +0900 Subject: [PATCH 10/44] =?UTF-8?q?test:=20=EB=8B=B9=EC=B2=A8=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Result.java | 15 +++++++ src/test/java/domain/LotteryMachineTest.java | 44 ++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/main/java/domain/Result.java create mode 100644 src/test/java/domain/LotteryMachineTest.java diff --git a/src/main/java/domain/Result.java b/src/main/java/domain/Result.java new file mode 100644 index 0000000..3bd3421 --- /dev/null +++ b/src/main/java/domain/Result.java @@ -0,0 +1,15 @@ +package domain; + +import java.util.List; + +public class Result { + private final List result; + + public Result(List result) { + this.result = result; + } + + public List getResult() { + return result; + } +} diff --git a/src/test/java/domain/LotteryMachineTest.java b/src/test/java/domain/LotteryMachineTest.java new file mode 100644 index 0000000..9dccfb0 --- /dev/null +++ b/src/test/java/domain/LotteryMachineTest.java @@ -0,0 +1,44 @@ +package domain; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Arrays; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class LotteryMachineTest { + + private LotteryMachine lotteryMachine; + private int purchasedCount = 6; + private Lotteries lotteries = new Lotteries(Arrays.asList( + new Lottery(new Numbers(Arrays.asList(8, 2, 23, 41, 4, 5))), + new Lottery(new Numbers(Arrays.asList(3, 5, 29, 6, 2, 38))), + new Lottery(new Numbers(Arrays.asList(4, 31, 5, 40, 2, 1))), + new Lottery(new Numbers(Arrays.asList(4, 1, 3, 45, 5, 2))), + new Lottery(new Numbers(Arrays.asList(7, 1, 2, 3, 4, 5))), + new Lottery(new Numbers(Arrays.asList(1, 2, 3, 4, 5, 6))) + )); + + @BeforeEach + void setUp() { + } + + @Test + public void 당첨_번호를_확인한다() throws Exception { + //given + String winningNumbers = "1, 2, 3, 4, 5, 6"; + int bonusNumber = 7; + lotteryMachine = new LotteryMachine(winningNumbers, bonusNumber); + + //when + Result result = lotteryMachine.compareNumbers(lotteries, purchasedCount); + + //then + assertThat(result.getResult().get(0)).isEqualTo(1); + assertThat(result.getResult().get(1)).isEqualTo(2); + assertThat(result.getResult().get(2)).isEqualTo(1); + assertThat(result.getResult().get(3)).isEqualTo(1); + assertThat(result.getResult().get(4)).isEqualTo(1); + } +} \ No newline at end of file From 341061992607acfa19268557bd301f6052671cb0 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 05:29:28 +0900 Subject: [PATCH 11/44] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PrizeMoney -> WinningStatistics 으로 이름 변경 --- src/main/java/Application.java | 8 ++++---- .../domain/{ => lotteryStore}/Lotteries.java | 2 +- .../java/domain/{ => lotteryStore}/Lottery.java | 2 +- .../domain/{ => lotteryStore}/LotteryStore.java | 2 +- .../java/domain/{ => lotteryStore}/Numbers.java | 2 +- src/main/java/domain/{ => prize}/Result.java | 2 +- .../WinningStatistics.java} | 8 ++++---- src/main/java/{domain => ui}/Message.java | 2 +- src/main/java/ui/Printer.java | 16 ++++++++-------- src/main/java/ui/{ => receiver}/Receiver.java | 4 ++-- src/test/java/domain/LotteryMachineTest.java | 6 ++++++ src/test/java/domain/LotteryStoreTest.java | 3 +++ ...MoneyTest.java => WinningStatisticsTest.java} | 7 +++++-- 13 files changed, 38 insertions(+), 26 deletions(-) rename src/main/java/domain/{ => lotteryStore}/Lotteries.java (90%) rename src/main/java/domain/{ => lotteryStore}/Lottery.java (87%) rename src/main/java/domain/{ => lotteryStore}/LotteryStore.java (96%) rename src/main/java/domain/{ => lotteryStore}/Numbers.java (89%) rename src/main/java/domain/{ => prize}/Result.java (91%) rename src/main/java/domain/{PrizeMoney.java => prize/WinningStatistics.java} (77%) rename src/main/java/{domain => ui}/Message.java (97%) rename src/main/java/ui/{ => receiver}/Receiver.java (93%) rename src/test/java/domain/{PrizeMoneyTest.java => WinningStatisticsTest.java} (71%) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 83810aa..5939840 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,8 +1,8 @@ -import domain.Lotteries; -import domain.LotteryMachine; -import domain.LotteryStore; +import domain.lotteryService.LotteryMachine; +import domain.lotteryStore.Lotteries; +import domain.lotteryStore.LotteryStore; import ui.Printer; -import ui.Receiver; +import ui.receiver.Receiver; public class Application { public static void main(String[] args) { diff --git a/src/main/java/domain/Lotteries.java b/src/main/java/domain/lotteryStore/Lotteries.java similarity index 90% rename from src/main/java/domain/Lotteries.java rename to src/main/java/domain/lotteryStore/Lotteries.java index a437f37..295536d 100644 --- a/src/main/java/domain/Lotteries.java +++ b/src/main/java/domain/lotteryStore/Lotteries.java @@ -1,4 +1,4 @@ -package domain; +package domain.lotteryStore; import java.util.List; diff --git a/src/main/java/domain/Lottery.java b/src/main/java/domain/lotteryStore/Lottery.java similarity index 87% rename from src/main/java/domain/Lottery.java rename to src/main/java/domain/lotteryStore/Lottery.java index 9e8f706..c02c9fb 100644 --- a/src/main/java/domain/Lottery.java +++ b/src/main/java/domain/lotteryStore/Lottery.java @@ -1,4 +1,4 @@ -package domain; +package domain.lotteryStore; public class Lottery { private final Numbers numbers; diff --git a/src/main/java/domain/LotteryStore.java b/src/main/java/domain/lotteryStore/LotteryStore.java similarity index 96% rename from src/main/java/domain/LotteryStore.java rename to src/main/java/domain/lotteryStore/LotteryStore.java index 797566a..d7b9077 100644 --- a/src/main/java/domain/LotteryStore.java +++ b/src/main/java/domain/lotteryStore/LotteryStore.java @@ -1,4 +1,4 @@ -package domain; +package domain.lotteryStore; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/domain/Numbers.java b/src/main/java/domain/lotteryStore/Numbers.java similarity index 89% rename from src/main/java/domain/Numbers.java rename to src/main/java/domain/lotteryStore/Numbers.java index 37e42a4..4750bec 100644 --- a/src/main/java/domain/Numbers.java +++ b/src/main/java/domain/lotteryStore/Numbers.java @@ -1,4 +1,4 @@ -package domain; +package domain.lotteryStore; import java.util.List; diff --git a/src/main/java/domain/Result.java b/src/main/java/domain/prize/Result.java similarity index 91% rename from src/main/java/domain/Result.java rename to src/main/java/domain/prize/Result.java index 3bd3421..62a4fc5 100644 --- a/src/main/java/domain/Result.java +++ b/src/main/java/domain/prize/Result.java @@ -1,4 +1,4 @@ -package domain; +package domain.prize; import java.util.List; diff --git a/src/main/java/domain/PrizeMoney.java b/src/main/java/domain/prize/WinningStatistics.java similarity index 77% rename from src/main/java/domain/PrizeMoney.java rename to src/main/java/domain/prize/WinningStatistics.java index 8125c97..d2da446 100644 --- a/src/main/java/domain/PrizeMoney.java +++ b/src/main/java/domain/prize/WinningStatistics.java @@ -1,8 +1,8 @@ -package domain; +package domain.prize; import java.util.List; -public enum PrizeMoney { +public enum WinningStatistics { THREE(3, 5000), FOUR(4, 50000), FIVE(5, 1500000), @@ -12,7 +12,7 @@ public enum PrizeMoney { private final int matchingCount; private final int prizeMoney; - PrizeMoney(int matchingCount, int prizeMoney) { + WinningStatistics(int matchingCount, int prizeMoney) { this.matchingCount = matchingCount; this.prizeMoney = prizeMoney; } @@ -21,7 +21,7 @@ public static float calculateEarningsRate(Result result, int purchasePrice) { List matchingCounts = result.getResult(); int totalPrizeMoney = 0; for (int i = 0; i < 5; i++) { - totalPrizeMoney += matchingCounts.get(i) * (PrizeMoney.values())[i].prizeMoney; + totalPrizeMoney += matchingCounts.get(i) * (WinningStatistics.values())[i].prizeMoney; } return (float)totalPrizeMoney / purchasePrice; diff --git a/src/main/java/domain/Message.java b/src/main/java/ui/Message.java similarity index 97% rename from src/main/java/domain/Message.java rename to src/main/java/ui/Message.java index e9849ce..69227fb 100644 --- a/src/main/java/domain/Message.java +++ b/src/main/java/ui/Message.java @@ -1,4 +1,4 @@ -package domain; +package ui; public enum Message { INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index ac29ef0..adbc3d4 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -2,10 +2,9 @@ import java.util.List; -import domain.Lotteries; -import domain.Message; -import domain.PrizeMoney; -import domain.Result; +import domain.lotteryStore.Lotteries; +import domain.prize.Result; +import domain.prize.WinningStatistics; public class Printer { @@ -24,7 +23,7 @@ public void printPurchasedLotteries(Lotteries lotteries) { public void printWinningStatistics(Result result) { StringBuilder builder = new StringBuilder(); - PrizeMoney[] prizeMonies = PrizeMoney.values(); + WinningStatistics[] prizeMonies = WinningStatistics.values(); List results = result.getResult(); builder.append(Message.WINNING_STATISTICS.getMessage()).append(Message.BOUNDARY_LINE.getMessage()); @@ -34,15 +33,16 @@ public void printWinningStatistics(Result result) { System.out.print(builder); } - private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney prizeMoney, Integer result, int i) { - builder.append(prizeMoney.getMatchingCount()); + private void printWinningStatisticsDetails(StringBuilder builder, WinningStatistics winningStatistics, + Integer result, int i) { + builder.append(winningStatistics.getMatchingCount()); if (i == 3) { builder.append(Message.MATCH_COUNT_BONUS.getMessage()); } if (i != 3) { builder.append(Message.MATCH_COUNT.getMessage()); } - builder.append(prizeMoney.getPrizeMoney()) + builder.append(winningStatistics.getPrizeMoney()) .append(Message.WON.getMessage()) .append(result) .append(Message.COUNT.getMessage()); diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/receiver/Receiver.java similarity index 93% rename from src/main/java/ui/Receiver.java rename to src/main/java/ui/receiver/Receiver.java index 9d04158..3f6aac2 100644 --- a/src/main/java/ui/Receiver.java +++ b/src/main/java/ui/receiver/Receiver.java @@ -1,8 +1,8 @@ -package ui; +package ui.receiver; import java.util.Scanner; -import domain.Message; +import ui.Message; public class Receiver { private static final Scanner SCANNER = new Scanner(System.in); diff --git a/src/test/java/domain/LotteryMachineTest.java b/src/test/java/domain/LotteryMachineTest.java index 9dccfb0..6664c1b 100644 --- a/src/test/java/domain/LotteryMachineTest.java +++ b/src/test/java/domain/LotteryMachineTest.java @@ -7,6 +7,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import domain.lotteryService.LotteryMachine; +import domain.lotteryStore.Lotteries; +import domain.lotteryStore.Lottery; +import domain.lotteryStore.Numbers; +import domain.prize.Result; + class LotteryMachineTest { private LotteryMachine lotteryMachine; diff --git a/src/test/java/domain/LotteryStoreTest.java b/src/test/java/domain/LotteryStoreTest.java index 1e72d53..2f3f9e1 100644 --- a/src/test/java/domain/LotteryStoreTest.java +++ b/src/test/java/domain/LotteryStoreTest.java @@ -5,6 +5,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import domain.lotteryStore.Lotteries; +import domain.lotteryStore.LotteryStore; + class LotteryStoreTest { private LotteryStore lotteryStore; diff --git a/src/test/java/domain/PrizeMoneyTest.java b/src/test/java/domain/WinningStatisticsTest.java similarity index 71% rename from src/test/java/domain/PrizeMoneyTest.java rename to src/test/java/domain/WinningStatisticsTest.java index e22f14b..331f815 100644 --- a/src/test/java/domain/PrizeMoneyTest.java +++ b/src/test/java/domain/WinningStatisticsTest.java @@ -6,7 +6,10 @@ import org.junit.jupiter.api.Test; -class PrizeMoneyTest { +import domain.prize.Result; +import domain.prize.WinningStatistics; + +class WinningStatisticsTest { @Test void 총수익률을_계산한다() { @@ -15,7 +18,7 @@ class PrizeMoneyTest { int purchasePrice = 15000; // when - float earningsRate = PrizeMoney.calculateEarningsRate(result, purchasePrice); + float earningsRate = WinningStatistics.calculateEarningsRate(result, purchasePrice); // then assertThat(earningsRate).isEqualTo( From 93200f91429555566dc811f7daf35fade34a6df8 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 05:51:28 +0900 Subject: [PATCH 12/44] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5,=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5,=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=84=B8=EC=A7=80?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC,=20=EA=B5=AC=EC=9E=85=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- src/main/java/Application.java | 6 +- src/main/java/ui/Message.java | 71 +++++++++++++------ src/main/java/ui/Printer.java | 18 ++--- src/main/java/ui/receiver/InputValidator.java | 11 +++ src/main/java/ui/receiver/Receiver.java | 6 +- 6 files changed, 81 insertions(+), 35 deletions(-) create mode 100644 src/main/java/ui/receiver/InputValidator.java diff --git a/README.md b/README.md index 743f0a2..8a00a15 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ ___ ### 기능 목록 - [x] 구입금액 입력 - - [ ] 예외 + - [x] 예외 - [x] 구입한 로또 개수 출력 - [x] 개수만큼 로또 번호 출력 - [x] 번호 자동 생성 @@ -74,7 +74,7 @@ ___ ### 예외 - 구입 금액 입력 - - [ ] 구입금액이 0원 이하인 경우 + - [x] 구입금액이 0원 이하인 경우 - 당첨 번호와 보너스 볼 입력 - [ ] 지난 주 당첨 번호가 중복되었을 경우 - [ ] 당첨 번호가 1-45가 아닐 경우 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 5939840..4c2978a 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -2,13 +2,17 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.LotteryStore; import ui.Printer; +import ui.receiver.InputValidator; import ui.receiver.Receiver; public class Application { public static void main(String[] args) { Receiver receiver = new Receiver(); Printer printer = new Printer(); - int purchasedCount = printer.printPurchasedCount(receiver.receivePurchasePrice()); + + int purchasePrice = receiver.receivePurchasePrice(); + InputValidator.validatePurchasePrice(purchasePrice); + int purchasedCount = printer.printPurchasedCount(purchasePrice); LotteryStore lotteryStore = new LotteryStore(); Lotteries lotteries = lotteryStore.createLotteries(purchasedCount); diff --git a/src/main/java/ui/Message.java b/src/main/java/ui/Message.java index 69227fb..46f6ece 100644 --- a/src/main/java/ui/Message.java +++ b/src/main/java/ui/Message.java @@ -1,27 +1,56 @@ package ui; -public enum Message { - INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), - INPUT_LAST_WEEK_WINNING_NUMBERS("\n지난 주 당첨 번호를 입력해 주세요."), - INPUT_BONUS_BALL("보너스 볼을 입력해 주세요."), - - PURCHASED_COUNT("개를 구매했습니다."), - WINNING_STATISTICS("\n당첨 통계\n"), - BOUNDARY_LINE("---------\n"), - MATCH_COUNT("개 일치 ("), - MATCH_COUNT_BONUS("개 일치, 보너스 볼 일치("), - WON("원)- "), - COUNT("개\n"), - TOTAL_EARNINGS_RATE("총 수익률은 "), - CLOSING_MENTION("입니다.(1 기준)"); - - private String message; - - Message(String message) { - this.message = message; +public class Message { + + public enum InputMessage { + INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), + INPUT_LAST_WEEK_WINNING_NUMBERS("\n지난 주 당첨 번호를 입력해 주세요."), + INPUT_BONUS_BALL("보너스 볼을 입력해 주세요."); + + private String message; + + InputMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + } + + public enum OutputMessage { + PURCHASED_COUNT("개를 구매했습니다."), + WINNING_STATISTICS("\n당첨 통계\n"), + BOUNDARY_LINE("---------\n"), + MATCH_COUNT("개 일치 ("), + MATCH_COUNT_BONUS("개 일치, 보너스 볼 일치("), + WON("원)- "), + COUNT("개\n"), + TOTAL_EARNINGS_RATE("총 수익률은 "), + CLOSING_MENTION("입니다.(1 기준)"); + + private String message; + + OutputMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } } - public String getMessage() { - return message; + public enum ExceptionMessage { + MUST_BUY_MORE_THAN_ONE_TICKET("한 장 이상 구매하셔야 합니다."); + + private String message; + + ExceptionMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } } } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index adbc3d4..bd158c0 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -10,7 +10,7 @@ public class Printer { public int printPurchasedCount(int purchasePrice) { int purchasedCount = purchasePrice / 1000; - System.out.println(purchasedCount + Message.PURCHASED_COUNT.getMessage()); + System.out.println(purchasedCount + Message.OutputMessage.PURCHASED_COUNT.getMessage()); return purchasedCount; } @@ -26,7 +26,8 @@ public void printWinningStatistics(Result result) { WinningStatistics[] prizeMonies = WinningStatistics.values(); List results = result.getResult(); - builder.append(Message.WINNING_STATISTICS.getMessage()).append(Message.BOUNDARY_LINE.getMessage()); + builder.append(Message.OutputMessage.WINNING_STATISTICS.getMessage()) + .append(Message.OutputMessage.BOUNDARY_LINE.getMessage()); for (int i = 0; i < 5; i++) { printWinningStatisticsDetails(builder, prizeMonies[i], results.get(i), i); } @@ -37,19 +38,20 @@ private void printWinningStatisticsDetails(StringBuilder builder, WinningStatist Integer result, int i) { builder.append(winningStatistics.getMatchingCount()); if (i == 3) { - builder.append(Message.MATCH_COUNT_BONUS.getMessage()); + builder.append(Message.OutputMessage.MATCH_COUNT_BONUS.getMessage()); } if (i != 3) { - builder.append(Message.MATCH_COUNT.getMessage()); + builder.append(Message.OutputMessage.MATCH_COUNT.getMessage()); } builder.append(winningStatistics.getPrizeMoney()) - .append(Message.WON.getMessage()) + .append(Message.OutputMessage.WON.getMessage()) .append(result) - .append(Message.COUNT.getMessage()); + .append(Message.OutputMessage.COUNT.getMessage()); } public void printTotalEarningsRate(float totalEarningsRate) { - System.out.println(Message.TOTAL_EARNINGS_RATE.getMessage() + String.format("%.2f", totalEarningsRate) - + Message.CLOSING_MENTION.getMessage()); + System.out.println( + Message.OutputMessage.TOTAL_EARNINGS_RATE.getMessage() + String.format("%.2f", totalEarningsRate) + + Message.OutputMessage.CLOSING_MENTION.getMessage()); } } diff --git a/src/main/java/ui/receiver/InputValidator.java b/src/main/java/ui/receiver/InputValidator.java new file mode 100644 index 0000000..befb712 --- /dev/null +++ b/src/main/java/ui/receiver/InputValidator.java @@ -0,0 +1,11 @@ +package ui.receiver; + +import ui.Message; + +public class InputValidator { + public static void validatePurchasePrice(int purchasePrice) { + if (purchasePrice < 1000) { + throw new IllegalArgumentException(Message.ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); + } + } +} diff --git a/src/main/java/ui/receiver/Receiver.java b/src/main/java/ui/receiver/Receiver.java index 3f6aac2..79189b1 100644 --- a/src/main/java/ui/receiver/Receiver.java +++ b/src/main/java/ui/receiver/Receiver.java @@ -8,18 +8,18 @@ public class Receiver { private static final Scanner SCANNER = new Scanner(System.in); public int receivePurchasePrice() { - System.out.println(Message.INPUT_PURCHASE_PRICE.getMessage()); + System.out.println(Message.InputMessage.INPUT_PURCHASE_PRICE.getMessage()); return SCANNER.nextInt(); } public String receiveWinningNumbers() { - System.out.println(Message.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); + System.out.println(Message.InputMessage.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); SCANNER.nextLine(); return SCANNER.nextLine(); } public int receiveBonusNumber() { - System.out.println(Message.INPUT_BONUS_BALL.getMessage()); + System.out.println(Message.InputMessage.INPUT_BONUS_BALL.getMessage()); return SCANNER.nextInt(); } } From a2a7041b7c59241babdeb23fced8cff7e328a8fb Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 06:06:29 +0900 Subject: [PATCH 13/44] =?UTF-8?q?feat:=201-45=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=20targetNumbers=20=EC=9D=BC=EA=B8=89=20=EC=BB=AC?= =?UTF-8?q?=EB=A0=89=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 3 ++- .../domain/lotteryStore/LotteryStore.java | 18 +++++-------- .../domain/lotteryStore/TargetNumbers.java | 27 +++++++++++++++++++ src/test/java/domain/LotteryStoreTest.java | 3 ++- 4 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 src/main/java/domain/lotteryStore/TargetNumbers.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 4c2978a..6a28792 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,6 +1,7 @@ import domain.lotteryService.LotteryMachine; import domain.lotteryStore.Lotteries; import domain.lotteryStore.LotteryStore; +import domain.lotteryStore.TargetNumbers; import ui.Printer; import ui.receiver.InputValidator; import ui.receiver.Receiver; @@ -14,7 +15,7 @@ public static void main(String[] args) { InputValidator.validatePurchasePrice(purchasePrice); int purchasedCount = printer.printPurchasedCount(purchasePrice); - LotteryStore lotteryStore = new LotteryStore(); + LotteryStore lotteryStore = new LotteryStore(new TargetNumbers()); Lotteries lotteries = lotteryStore.createLotteries(purchasedCount); printer.printPurchasedLotteries(lotteries); diff --git a/src/main/java/domain/lotteryStore/LotteryStore.java b/src/main/java/domain/lotteryStore/LotteryStore.java index d7b9077..c027e47 100644 --- a/src/main/java/domain/lotteryStore/LotteryStore.java +++ b/src/main/java/domain/lotteryStore/LotteryStore.java @@ -1,21 +1,14 @@ package domain.lotteryStore; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; public class LotteryStore { - private final List targetNumbers = new ArrayList<>(); + private final TargetNumbers targetNumbers; - public LotteryStore() { - initNumbers(); - } - - private void initNumbers() { - for (int i = 1; i <= 45; i++) { - targetNumbers.add(i); - } + public LotteryStore(TargetNumbers targetNumbers) { + this.targetNumbers = targetNumbers; } public Lotteries createLotteries(int count) { @@ -27,9 +20,10 @@ public Lotteries createLotteries(int count) { } private Lottery createLottery() { - Collections.shuffle(targetNumbers); + targetNumbers.shuffle(); Numbers numbers = new Numbers( - targetNumbers.stream() + targetNumbers.getTargetNumbers() + .stream() .limit(6) .collect(Collectors.toList())); return new Lottery(numbers); diff --git a/src/main/java/domain/lotteryStore/TargetNumbers.java b/src/main/java/domain/lotteryStore/TargetNumbers.java new file mode 100644 index 0000000..7c4ec1d --- /dev/null +++ b/src/main/java/domain/lotteryStore/TargetNumbers.java @@ -0,0 +1,27 @@ +package domain.lotteryStore; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class TargetNumbers { + private final List targetNumbers = new ArrayList<>(); + + public TargetNumbers() { + initNumbers(); + } + + private void initNumbers() { + for (int i = 1; i <= 45; i++) { + targetNumbers.add(i); + } + } + + public void shuffle() { + Collections.shuffle(targetNumbers); + } + + public List getTargetNumbers() { + return targetNumbers; + } +} diff --git a/src/test/java/domain/LotteryStoreTest.java b/src/test/java/domain/LotteryStoreTest.java index 2f3f9e1..e46d0e4 100644 --- a/src/test/java/domain/LotteryStoreTest.java +++ b/src/test/java/domain/LotteryStoreTest.java @@ -7,6 +7,7 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.LotteryStore; +import domain.lotteryStore.TargetNumbers; class LotteryStoreTest { @@ -14,7 +15,7 @@ class LotteryStoreTest { @BeforeEach void setUp() { - lotteryStore = new LotteryStore(); + lotteryStore = new LotteryStore(new TargetNumbers()); } @Test From ebd447018cdfc1dd42fcdda15409d80bf66c7018 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 06:16:46 +0900 Subject: [PATCH 14/44] =?UTF-8?q?refactor:=20target=20number=2045=EA=B0=9C?= =?UTF-8?q?=20=EC=A4=91=20=EC=95=9E=206=EA=B0=9C=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=EC=97=AD=ED=95=A0=20Tar?= =?UTF-8?q?getNumbers=EC=97=90=EA=B2=8C=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/lotteryStore/LotteryStore.java | 7 +------ src/main/java/domain/lotteryStore/TargetNumbers.java | 7 +++++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/domain/lotteryStore/LotteryStore.java b/src/main/java/domain/lotteryStore/LotteryStore.java index c027e47..6db4142 100644 --- a/src/main/java/domain/lotteryStore/LotteryStore.java +++ b/src/main/java/domain/lotteryStore/LotteryStore.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; public class LotteryStore { private final TargetNumbers targetNumbers; @@ -21,11 +20,7 @@ public Lotteries createLotteries(int count) { private Lottery createLottery() { targetNumbers.shuffle(); - Numbers numbers = new Numbers( - targetNumbers.getTargetNumbers() - .stream() - .limit(6) - .collect(Collectors.toList())); + Numbers numbers = new Numbers(targetNumbers.getSixNumbersFromTheFront()); return new Lottery(numbers); } } diff --git a/src/main/java/domain/lotteryStore/TargetNumbers.java b/src/main/java/domain/lotteryStore/TargetNumbers.java index 7c4ec1d..334be9e 100644 --- a/src/main/java/domain/lotteryStore/TargetNumbers.java +++ b/src/main/java/domain/lotteryStore/TargetNumbers.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class TargetNumbers { private final List targetNumbers = new ArrayList<>(); @@ -21,7 +22,9 @@ public void shuffle() { Collections.shuffle(targetNumbers); } - public List getTargetNumbers() { - return targetNumbers; + public List getSixNumbersFromTheFront() { + return targetNumbers.stream() + .limit(6) + .collect(Collectors.toList()); } } From 05f3a93843d0ded19063072158e1311b3b46f970 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 16:36:31 +0900 Subject: [PATCH 15/44] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=ED=8B=B0?= =?UTF-8?q?=EC=BC=93=20=ED=95=98=EB=82=98=EC=9D=98=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88=ED=98=B8,=20?= =?UTF-8?q?=EB=B3=B4=EB=84=88=EC=8A=A4=20=EB=B2=88=ED=98=B8=EC=99=80=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=ED=95=98=EB=8A=94=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 - 일치 개수와 그에 따른 상금을 가지고 있는 클래스 WinningStatistics -> PrizeMoney 로 변경 - --- .../domain/lotteryService/BonusNumber.java | 13 ++++++ .../domain/lotteryService/LotteryMachine.java | 44 +++++++++++++++++++ .../domain/lotteryService/WinningNumbers.java | 42 ++++++++++++++++++ .../java/domain/lotteryStore/Lottery.java | 4 ++ src/main/java/domain/prize/PrizeMoney.java | 37 ++++++++++++++++ src/main/java/domain/prize/Result.java | 18 +++++--- .../java/domain/prize/WinningStatistics.java | 34 +++----------- src/main/java/ui/Printer.java | 14 +++--- src/test/java/domain/LotteryMachineTest.java | 14 +++--- ...tatisticsTest.java => PrizeMoneyTest.java} | 8 ++-- 10 files changed, 175 insertions(+), 53 deletions(-) create mode 100644 src/main/java/domain/lotteryService/BonusNumber.java create mode 100644 src/main/java/domain/lotteryService/LotteryMachine.java create mode 100644 src/main/java/domain/lotteryService/WinningNumbers.java create mode 100644 src/main/java/domain/prize/PrizeMoney.java rename src/test/java/domain/{WinningStatisticsTest.java => PrizeMoneyTest.java} (64%) diff --git a/src/main/java/domain/lotteryService/BonusNumber.java b/src/main/java/domain/lotteryService/BonusNumber.java new file mode 100644 index 0000000..30fae50 --- /dev/null +++ b/src/main/java/domain/lotteryService/BonusNumber.java @@ -0,0 +1,13 @@ +package domain.lotteryService; + +public class BonusNumber { + private final int bonusNumber; + + public BonusNumber(int bonusNumber) { + this.bonusNumber = bonusNumber; + } + + public int getBonusNumber() { + return bonusNumber; + } +} diff --git a/src/main/java/domain/lotteryService/LotteryMachine.java b/src/main/java/domain/lotteryService/LotteryMachine.java new file mode 100644 index 0000000..92bd759 --- /dev/null +++ b/src/main/java/domain/lotteryService/LotteryMachine.java @@ -0,0 +1,44 @@ +package domain.lotteryService; + +import domain.lotteryStore.Lotteries; +import domain.lotteryStore.Lottery; +import domain.prize.Result; +import domain.prize.WinningStatistics; + +public class LotteryMachine { + private final WinningNumbers winningNumbers; + private final BonusNumber bonusNumber; + + public LotteryMachine(String winningNumbers, int bonusNumber) { + // winningNumbers의 생성자에 bonusNumber를 넘겨주는 것은 좋지 않다고 생각하지만 그럼 어디서 validate? + this.winningNumbers = new WinningNumbers(winningNumbers, bonusNumber); + this.bonusNumber = new BonusNumber(bonusNumber); + } + + public WinningStatistics compareNumbers(Lotteries lotteries, int purchasedCount) { + return null; + } + + private Result compareOneTicketNumbers(Lottery lottery) { + int matchingCount = 0; + boolean hasBonusNumber = false; + + for (int i = 0; i < 6; i++) { + matchingCount += matchWinningNumbers(lottery, i); + hasBonusNumber = hasBonusNumber(lottery); + } + + return new Result(matchingCount, hasBonusNumber); + } + + private int matchWinningNumbers(Lottery lottery, int i) { + if (lottery.contains(winningNumbers.get(i))) { + return 1; + } + return 0; + } + + private boolean hasBonusNumber(Lottery lottery) { + return lottery.contains(bonusNumber.getBonusNumber()); + } +} diff --git a/src/main/java/domain/lotteryService/WinningNumbers.java b/src/main/java/domain/lotteryService/WinningNumbers.java new file mode 100644 index 0000000..b380548 --- /dev/null +++ b/src/main/java/domain/lotteryService/WinningNumbers.java @@ -0,0 +1,42 @@ +package domain.lotteryService; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class WinningNumbers { + private static final String COMMA = ","; + private static final String BLANK = " "; + private static final String EMPTY_STRING = ""; + + final List winningNumbers; + + public WinningNumbers(String winningNumbers, int bonusNumber) { + this.winningNumbers = splitWinningNumbers(winningNumbers); + // TODO: bonusNumber와 겹치는 winningNumbers가 있는지 확인 -> 여기서 해야하나? + } + + private List splitWinningNumbers(String input) { + // TODO: validate 숫자와 쉼표 이외의 문자 포함 + + List splittedInput = Arrays.stream(input.replaceAll(BLANK, EMPTY_STRING) + .split(COMMA)) + .map(Integer::parseInt) + .collect(Collectors.toList()); + + // TODO: validate winningNumbers가 6개인지 + // TODO: validate 중복된 번호가 있는 경우 + // TODO: validate 1-45 사이의 숫자가 아닐 경우 + + return splittedInput; + } + + public int get(int index) { + return winningNumbers.get(index); + } + + public List getWinningNumbers() { + return winningNumbers; + } + +} diff --git a/src/main/java/domain/lotteryStore/Lottery.java b/src/main/java/domain/lotteryStore/Lottery.java index c02c9fb..fbe8292 100644 --- a/src/main/java/domain/lotteryStore/Lottery.java +++ b/src/main/java/domain/lotteryStore/Lottery.java @@ -7,6 +7,10 @@ public Lottery(Numbers numbers) { this.numbers = numbers; } + public boolean contains(int number) { + return numbers.getNumbers().contains(number); + } + public Numbers getNumbers() { return numbers; } diff --git a/src/main/java/domain/prize/PrizeMoney.java b/src/main/java/domain/prize/PrizeMoney.java new file mode 100644 index 0000000..7e864df --- /dev/null +++ b/src/main/java/domain/prize/PrizeMoney.java @@ -0,0 +1,37 @@ +package domain.prize; + +import java.util.List; + +public enum PrizeMoney { + THREE(3, 5000), + FOUR(4, 50000), + FIVE(5, 1500000), + FIVE_BONUS(5, 30000000), + SIX(6, 2000000000); + + private final int matchingCount; + private final int prizeMoney; + + PrizeMoney(int matchingCount, int prizeMoney) { + this.matchingCount = matchingCount; + this.prizeMoney = prizeMoney; + } + + public static float calculateEarningsRate(WinningStatistics winningStatistics, int purchasePrice) { + List matchingCounts = winningStatistics.getMatchingCounts(); + int totalPrizeMoney = 0; + for (int i = 0; i < 5; i++) { + totalPrizeMoney += matchingCounts.get(i) * (PrizeMoney.values())[i].prizeMoney; + } + + return (float)totalPrizeMoney / purchasePrice; + } + + public int getMatchingCount() { + return matchingCount; + } + + public int getPrizeMoney() { + return prizeMoney; + } +} diff --git a/src/main/java/domain/prize/Result.java b/src/main/java/domain/prize/Result.java index 62a4fc5..1fe94ab 100644 --- a/src/main/java/domain/prize/Result.java +++ b/src/main/java/domain/prize/Result.java @@ -1,15 +1,19 @@ package domain.prize; -import java.util.List; - public class Result { - private final List result; + private final int matchingCount; + private final boolean havingBonusNumber; + + public Result(int matchingCount, boolean havingBonusNumber) { + this.matchingCount = matchingCount; + this.havingBonusNumber = havingBonusNumber; + } - public Result(List result) { - this.result = result; + public int getMatchingCount() { + return matchingCount; } - public List getResult() { - return result; + public boolean isHavingBonusNumber() { + return havingBonusNumber; } } diff --git a/src/main/java/domain/prize/WinningStatistics.java b/src/main/java/domain/prize/WinningStatistics.java index d2da446..754b5d2 100644 --- a/src/main/java/domain/prize/WinningStatistics.java +++ b/src/main/java/domain/prize/WinningStatistics.java @@ -2,36 +2,14 @@ import java.util.List; -public enum WinningStatistics { - THREE(3, 5000), - FOUR(4, 50000), - FIVE(5, 1500000), - FIVE_BONUS(5, 30000000), - SIX(6, 2000000000); +public class WinningStatistics { + private final List matchingCounts; - private final int matchingCount; - private final int prizeMoney; - - WinningStatistics(int matchingCount, int prizeMoney) { - this.matchingCount = matchingCount; - this.prizeMoney = prizeMoney; - } - - public static float calculateEarningsRate(Result result, int purchasePrice) { - List matchingCounts = result.getResult(); - int totalPrizeMoney = 0; - for (int i = 0; i < 5; i++) { - totalPrizeMoney += matchingCounts.get(i) * (WinningStatistics.values())[i].prizeMoney; - } - - return (float)totalPrizeMoney / purchasePrice; - } - - public int getMatchingCount() { - return matchingCount; + public WinningStatistics(List matchingCounts) { + this.matchingCounts = matchingCounts; } - public int getPrizeMoney() { - return prizeMoney; + public List getMatchingCounts() { + return matchingCounts; } } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index bd158c0..4af3ec5 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -3,7 +3,7 @@ import java.util.List; import domain.lotteryStore.Lotteries; -import domain.prize.Result; +import domain.prize.PrizeMoney; import domain.prize.WinningStatistics; public class Printer { @@ -21,10 +21,10 @@ public void printPurchasedLotteries(Lotteries lotteries) { .forEach(System.out::println); } - public void printWinningStatistics(Result result) { + public void printWinningStatistics(WinningStatistics winningStatistics) { StringBuilder builder = new StringBuilder(); - WinningStatistics[] prizeMonies = WinningStatistics.values(); - List results = result.getResult(); + PrizeMoney[] prizeMonies = PrizeMoney.values(); + List results = winningStatistics.getMatchingCounts(); builder.append(Message.OutputMessage.WINNING_STATISTICS.getMessage()) .append(Message.OutputMessage.BOUNDARY_LINE.getMessage()); @@ -34,16 +34,16 @@ public void printWinningStatistics(Result result) { System.out.print(builder); } - private void printWinningStatisticsDetails(StringBuilder builder, WinningStatistics winningStatistics, + private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney prizeMoney, Integer result, int i) { - builder.append(winningStatistics.getMatchingCount()); + builder.append(prizeMoney.getMatchingCount()); if (i == 3) { builder.append(Message.OutputMessage.MATCH_COUNT_BONUS.getMessage()); } if (i != 3) { builder.append(Message.OutputMessage.MATCH_COUNT.getMessage()); } - builder.append(winningStatistics.getPrizeMoney()) + builder.append(prizeMoney.getPrizeMoney()) .append(Message.OutputMessage.WON.getMessage()) .append(result) .append(Message.OutputMessage.COUNT.getMessage()); diff --git a/src/test/java/domain/LotteryMachineTest.java b/src/test/java/domain/LotteryMachineTest.java index 6664c1b..9ae161e 100644 --- a/src/test/java/domain/LotteryMachineTest.java +++ b/src/test/java/domain/LotteryMachineTest.java @@ -11,7 +11,7 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; import domain.lotteryStore.Numbers; -import domain.prize.Result; +import domain.prize.WinningStatistics; class LotteryMachineTest { @@ -38,13 +38,13 @@ void setUp() { lotteryMachine = new LotteryMachine(winningNumbers, bonusNumber); //when - Result result = lotteryMachine.compareNumbers(lotteries, purchasedCount); + WinningStatistics winningStatistics = lotteryMachine.compareNumbers(lotteries, purchasedCount); //then - assertThat(result.getResult().get(0)).isEqualTo(1); - assertThat(result.getResult().get(1)).isEqualTo(2); - assertThat(result.getResult().get(2)).isEqualTo(1); - assertThat(result.getResult().get(3)).isEqualTo(1); - assertThat(result.getResult().get(4)).isEqualTo(1); + assertThat(winningStatistics.getMatchingCounts().get(0)).isEqualTo(1); + assertThat(winningStatistics.getMatchingCounts().get(1)).isEqualTo(2); + assertThat(winningStatistics.getMatchingCounts().get(2)).isEqualTo(1); + assertThat(winningStatistics.getMatchingCounts().get(3)).isEqualTo(1); + assertThat(winningStatistics.getMatchingCounts().get(4)).isEqualTo(1); } } \ No newline at end of file diff --git a/src/test/java/domain/WinningStatisticsTest.java b/src/test/java/domain/PrizeMoneyTest.java similarity index 64% rename from src/test/java/domain/WinningStatisticsTest.java rename to src/test/java/domain/PrizeMoneyTest.java index 331f815..c207fe6 100644 --- a/src/test/java/domain/WinningStatisticsTest.java +++ b/src/test/java/domain/PrizeMoneyTest.java @@ -6,19 +6,19 @@ import org.junit.jupiter.api.Test; -import domain.prize.Result; +import domain.prize.PrizeMoney; import domain.prize.WinningStatistics; -class WinningStatisticsTest { +class PrizeMoneyTest { @Test void 총수익률을_계산한다() { // given - Result result = new Result(Arrays.asList(3, 4, 0, 2, 1)); + WinningStatistics winningStatistics = new WinningStatistics(Arrays.asList(3, 4, 0, 2, 1)); int purchasePrice = 15000; // when - float earningsRate = WinningStatistics.calculateEarningsRate(result, purchasePrice); + float earningsRate = PrizeMoney.calculateEarningsRate(winningStatistics, purchasePrice); // then assertThat(earningsRate).isEqualTo( From 7f1f4e15ca38c0f24bedeb34862369bd477a6ef1 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 31 Mar 2021 17:50:56 +0900 Subject: [PATCH 16/44] =?UTF-8?q?feat:=20=EC=A7=80=EB=82=9C=EC=A3=BC=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EB=B2=88=ED=98=B8=20=EB=B3=B4=EB=84=88?= =?UTF-8?q?=EC=8A=A4=EB=B3=BC=20=EC=9E=85=EB=A0=A5=20=EA=B2=80=EC=A6=9D=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 --- src/main/java/ui/Message.java | 7 ++- src/main/java/ui/receiver/InputValidator.java | 52 ++++++++++++++++++- .../java/ui/receiver/InputValidatorTest.java | 22 ++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/test/java/ui/receiver/InputValidatorTest.java diff --git a/src/main/java/ui/Message.java b/src/main/java/ui/Message.java index 46f6ece..04cf6c6 100644 --- a/src/main/java/ui/Message.java +++ b/src/main/java/ui/Message.java @@ -41,7 +41,12 @@ public String getMessage() { } public enum ExceptionMessage { - MUST_BUY_MORE_THAN_ONE_TICKET("한 장 이상 구매하셔야 합니다."); + MUST_BUY_MORE_THAN_ONE_TICKET("한 장 이상 구매하셔야 합니다."), + DUPLICATE_NUMBERS("중복 번호를 입력할 수 없습니다."), + BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS("당첨 번호와 일치하는 보너스 번호는 입력할 수 없습니다."), + MUST_INPUT_NUMBERS_IN_VALID_RANGE("1과 45 사이 번호를 입력해야 합니다."), + MUST_INPUT_SIX_WINNING_NUMBERS("6개의 당첨 번호를 입력해야 합니다."), + INPUT_ONLY_NUMBERS_AND_COMMA("숫자와 , 이외의 문자는 입력할 수 없습니다."); private String message; diff --git a/src/main/java/ui/receiver/InputValidator.java b/src/main/java/ui/receiver/InputValidator.java index befb712..aa96670 100644 --- a/src/main/java/ui/receiver/InputValidator.java +++ b/src/main/java/ui/receiver/InputValidator.java @@ -1,11 +1,61 @@ package ui.receiver; +import java.util.HashSet; +import java.util.Set; + +import domain.lotteryService.BonusNumber; +import domain.lotteryService.WinningNumbers; import ui.Message; public class InputValidator { + private static final int MINIMUM_PURCHASE_PRICE = 1000; + private static final int MINIMUM_WINNING_NUMBER = 1; + private static final int MAXIMUM_WINNING_NUMBER = 45; + private static final int SIZE_OF_WINNING_NUMBERS = 6; + public static void validatePurchasePrice(int purchasePrice) { - if (purchasePrice < 1000) { + if (purchasePrice < MINIMUM_PURCHASE_PRICE) { throw new IllegalArgumentException(Message.ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); } } + + public static void validateOtherCharacterSymbols() { + // TODO: ,나 숫자 외의 입력이 있을 경우 + } + + public static void validateSizeOfWinningNumbers(WinningNumbers winningNumbers) { + if (winningNumbers.size() != 6) { + throw new IllegalArgumentException(Message.ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); + } + } + + public static void validateRangeOfWinningNumbers(WinningNumbers winningNumbers) { + if (winningNumbers.getWinningNumbers() + .stream() + .anyMatch( + winningNumber -> winningNumber < MINIMUM_WINNING_NUMBER || winningNumber > MAXIMUM_WINNING_NUMBER)) { + throw new IllegalArgumentException(Message.ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } + } + + public static void validateRangeOfBonusNumber(BonusNumber bonusNumber) { + if (bonusNumber.getBonusNumber() < MINIMUM_WINNING_NUMBER + || bonusNumber.getBonusNumber() > MAXIMUM_WINNING_NUMBER) { + throw new IllegalArgumentException(Message.ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } + } + + public static void validateDuplicateWinningNumbers(WinningNumbers winningNumbers) { + Set numbers = new HashSet<>(winningNumbers.getWinningNumbers()); + if (numbers.size() != SIZE_OF_WINNING_NUMBERS) { + throw new IllegalArgumentException(Message.ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); + } + } + + public static void validateBonusNumber(WinningNumbers winningNumbers, BonusNumber bonusNumber) { + if (winningNumbers.contains(bonusNumber.getBonusNumber())) { + throw new IllegalArgumentException( + Message.ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); + } + } } diff --git a/src/test/java/ui/receiver/InputValidatorTest.java b/src/test/java/ui/receiver/InputValidatorTest.java new file mode 100644 index 0000000..560e837 --- /dev/null +++ b/src/test/java/ui/receiver/InputValidatorTest.java @@ -0,0 +1,22 @@ +package ui.receiver; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import domain.lotteryService.WinningNumbers; +import ui.Message; + +class InputValidatorTest { + + @Test + public void 당첨번호_중복_입력을_검증한다() throws Exception { + //given + String input = "1, 6, 3, 4, 5, 6"; + WinningNumbers winningNumbers = new WinningNumbers(input); + + //then + Assertions.assertThatThrownBy(() -> InputValidator.validateDuplicateWinningNumbers(winningNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(Message.ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); + } +} \ No newline at end of file From 121c3fae56edba90d3df12825c5c14d852a8e4b3 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Thu, 1 Apr 2021 01:02:16 +0900 Subject: [PATCH 17/44] =?UTF-8?q?feat:=20=EA=B5=AC=EB=A7=A4=ED=95=9C=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=ED=8B=B0=EC=BC=93=EB=93=A4=EA=B3=BC=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EB=B2=88=ED=98=B8=EB=A5=BC=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=ED=95=98=EB=8A=94=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 --- .../domain/lotteryService/LotteryMachine.java | 25 ++++++++----- src/test/java/domain/LotteryMachineTest.java | 36 ++++++++++--------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/main/java/domain/lotteryService/LotteryMachine.java b/src/main/java/domain/lotteryService/LotteryMachine.java index 92bd759..22b5d81 100644 --- a/src/main/java/domain/lotteryService/LotteryMachine.java +++ b/src/main/java/domain/lotteryService/LotteryMachine.java @@ -1,32 +1,41 @@ package domain.lotteryService; +import java.util.ArrayList; +import java.util.List; + import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; import domain.prize.Result; -import domain.prize.WinningStatistics; +import domain.prize.Results; public class LotteryMachine { + private static final int SIZE_OF_WINNING_NUMBERS = 6; + private final WinningNumbers winningNumbers; private final BonusNumber bonusNumber; public LotteryMachine(String winningNumbers, int bonusNumber) { - // winningNumbers의 생성자에 bonusNumber를 넘겨주는 것은 좋지 않다고 생각하지만 그럼 어디서 validate? - this.winningNumbers = new WinningNumbers(winningNumbers, bonusNumber); + this.winningNumbers = new WinningNumbers(winningNumbers); this.bonusNumber = new BonusNumber(bonusNumber); } - public WinningStatistics compareNumbers(Lotteries lotteries, int purchasedCount) { - return null; + public Results compareNumbers(Lotteries lotteries, int purchasedCount) { + List results = new ArrayList<>(); + for (int i = 0; i < purchasedCount; i++) { + results.add(compareOneTicketNumbers(lotteries.get(i))); + } + + return new Results(results); } private Result compareOneTicketNumbers(Lottery lottery) { int matchingCount = 0; - boolean hasBonusNumber = false; + boolean hasBonusNumber; - for (int i = 0; i < 6; i++) { + for (int i = 0; i < SIZE_OF_WINNING_NUMBERS; i++) { matchingCount += matchWinningNumbers(lottery, i); - hasBonusNumber = hasBonusNumber(lottery); } + hasBonusNumber = hasBonusNumber(lottery); return new Result(matchingCount, hasBonusNumber); } diff --git a/src/test/java/domain/LotteryMachineTest.java b/src/test/java/domain/LotteryMachineTest.java index 9ae161e..b17b2d9 100644 --- a/src/test/java/domain/LotteryMachineTest.java +++ b/src/test/java/domain/LotteryMachineTest.java @@ -3,21 +3,19 @@ import static org.assertj.core.api.Assertions.*; import java.util.Arrays; +import java.util.List; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import domain.lotteryService.LotteryMachine; import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; import domain.lotteryStore.Numbers; -import domain.prize.WinningStatistics; +import domain.prize.Result; class LotteryMachineTest { - private LotteryMachine lotteryMachine; - private int purchasedCount = 6; - private Lotteries lotteries = new Lotteries(Arrays.asList( + private final Lotteries lotteries = new Lotteries(Arrays.asList( new Lottery(new Numbers(Arrays.asList(8, 2, 23, 41, 4, 5))), new Lottery(new Numbers(Arrays.asList(3, 5, 29, 6, 2, 38))), new Lottery(new Numbers(Arrays.asList(4, 31, 5, 40, 2, 1))), @@ -26,25 +24,29 @@ class LotteryMachineTest { new Lottery(new Numbers(Arrays.asList(1, 2, 3, 4, 5, 6))) )); - @BeforeEach - void setUp() { - } - @Test - public void 당첨_번호를_확인한다() throws Exception { + public void 각_티켓의_당첨_번호와_일치한_개수와_보너스_숫자를_확인한다() throws Exception { //given String winningNumbers = "1, 2, 3, 4, 5, 6"; int bonusNumber = 7; - lotteryMachine = new LotteryMachine(winningNumbers, bonusNumber); + LotteryMachine lotteryMachine = new LotteryMachine(winningNumbers, bonusNumber); //when - WinningStatistics winningStatistics = lotteryMachine.compareNumbers(lotteries, purchasedCount); + int purchasedCount = 6; + List results = lotteryMachine.compareNumbers(lotteries, purchasedCount).getResults(); //then - assertThat(winningStatistics.getMatchingCounts().get(0)).isEqualTo(1); - assertThat(winningStatistics.getMatchingCounts().get(1)).isEqualTo(2); - assertThat(winningStatistics.getMatchingCounts().get(2)).isEqualTo(1); - assertThat(winningStatistics.getMatchingCounts().get(3)).isEqualTo(1); - assertThat(winningStatistics.getMatchingCounts().get(4)).isEqualTo(1); + assertThat(results.get(0).getMatchingCount()).isEqualTo(3); + assertThat(results.get(0).isHavingBonusNumber()).isEqualTo(false); + assertThat(results.get(1).getMatchingCount()).isEqualTo(4); + assertThat(results.get(1).isHavingBonusNumber()).isEqualTo(false); + assertThat(results.get(2).getMatchingCount()).isEqualTo(4); + assertThat(results.get(2).isHavingBonusNumber()).isEqualTo(false); + assertThat(results.get(3).getMatchingCount()).isEqualTo(5); + assertThat(results.get(3).isHavingBonusNumber()).isEqualTo(false); + assertThat(results.get(4).getMatchingCount()).isEqualTo(5); + assertThat(results.get(4).isHavingBonusNumber()).isEqualTo(true); + assertThat(results.get(5).getMatchingCount()).isEqualTo(6); + assertThat(results.get(5).isHavingBonusNumber()).isEqualTo(false); } } \ No newline at end of file From 69abefa713399a0ebeddfa99c8f167cade59a108 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Thu, 1 Apr 2021 01:13:39 +0900 Subject: [PATCH 18/44] =?UTF-8?q?chore:=20=EA=B0=81=20parameter=EB=AA=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95,=20=EC=88=AB=EC=9E=90=20=EC=83=81?= =?UTF-8?q?=EC=88=98=ED=99=94,=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/lotteryStore/Lotteries.java | 4 +++ .../java/domain/lotteryStore/Lottery.java | 4 +-- src/main/java/ui/Printer.java | 13 ++++++--- src/test/java/domain/PrizeMoneyTest.java | 27 ------------------- .../LotteryMachineTest.java | 3 +-- .../{ => lotteryStore}/LotteryStoreTest.java | 6 +---- 6 files changed, 17 insertions(+), 40 deletions(-) delete mode 100644 src/test/java/domain/PrizeMoneyTest.java rename src/test/java/domain/{ => lotteryService}/LotteryMachineTest.java (97%) rename src/test/java/domain/{ => lotteryStore}/LotteryStoreTest.java (81%) diff --git a/src/main/java/domain/lotteryStore/Lotteries.java b/src/main/java/domain/lotteryStore/Lotteries.java index 295536d..bc659f9 100644 --- a/src/main/java/domain/lotteryStore/Lotteries.java +++ b/src/main/java/domain/lotteryStore/Lotteries.java @@ -9,6 +9,10 @@ public Lotteries(List lotteries) { this.lotteries = lotteries; } + public Lottery get(int index) { + return lotteries.get(index); + } + public List getLotteries() { return lotteries; } diff --git a/src/main/java/domain/lotteryStore/Lottery.java b/src/main/java/domain/lotteryStore/Lottery.java index fbe8292..a2588c4 100644 --- a/src/main/java/domain/lotteryStore/Lottery.java +++ b/src/main/java/domain/lotteryStore/Lottery.java @@ -7,8 +7,8 @@ public Lottery(Numbers numbers) { this.numbers = numbers; } - public boolean contains(int number) { - return numbers.getNumbers().contains(number); + public boolean contains(int numberToCompare) { + return numbers.getNumbers().contains(numberToCompare); } public Numbers getNumbers() { diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 4af3ec5..93048e7 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -7,9 +7,13 @@ import domain.prize.WinningStatistics; public class Printer { + private static final int PRICE_OF_ONE_LOTTERY_TICKET = 1000; + private static final int SIZE_OF_LOTTERY_RANK = 5; + private static final int WIN_WITH_BONUS_NUMBER = 3; + private static final String LIMIT_OF_DECIMAL_PLACE = "%.2f"; public int printPurchasedCount(int purchasePrice) { - int purchasedCount = purchasePrice / 1000; + int purchasedCount = purchasePrice / PRICE_OF_ONE_LOTTERY_TICKET; System.out.println(purchasedCount + Message.OutputMessage.PURCHASED_COUNT.getMessage()); return purchasedCount; } @@ -37,10 +41,10 @@ public void printWinningStatistics(WinningStatistics winningStatistics) { private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney prizeMoney, Integer result, int i) { builder.append(prizeMoney.getMatchingCount()); - if (i == 3) { + if (i == WIN_WITH_BONUS_NUMBER) { builder.append(Message.OutputMessage.MATCH_COUNT_BONUS.getMessage()); } - if (i != 3) { + if (i != WIN_WITH_BONUS_NUMBER) { builder.append(Message.OutputMessage.MATCH_COUNT.getMessage()); } builder.append(prizeMoney.getPrizeMoney()) @@ -51,7 +55,8 @@ private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney pri public void printTotalEarningsRate(float totalEarningsRate) { System.out.println( - Message.OutputMessage.TOTAL_EARNINGS_RATE.getMessage() + String.format("%.2f", totalEarningsRate) + Message.OutputMessage.TOTAL_EARNINGS_RATE.getMessage() + String.format(LIMIT_OF_DECIMAL_PLACE, + totalEarningsRate) + Message.OutputMessage.CLOSING_MENTION.getMessage()); } } diff --git a/src/test/java/domain/PrizeMoneyTest.java b/src/test/java/domain/PrizeMoneyTest.java deleted file mode 100644 index c207fe6..0000000 --- a/src/test/java/domain/PrizeMoneyTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package domain; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Arrays; - -import org.junit.jupiter.api.Test; - -import domain.prize.PrizeMoney; -import domain.prize.WinningStatistics; - -class PrizeMoneyTest { - - @Test - void 총수익률을_계산한다() { - // given - WinningStatistics winningStatistics = new WinningStatistics(Arrays.asList(3, 4, 0, 2, 1)); - int purchasePrice = 15000; - - // when - float earningsRate = PrizeMoney.calculateEarningsRate(winningStatistics, purchasePrice); - - // then - assertThat(earningsRate).isEqualTo( - (float)(3 * 5000 + 4 * 50000 + 0 * 1500000 + 2 * 30000000 + 1 * 2000000000) / purchasePrice); - } -} \ No newline at end of file diff --git a/src/test/java/domain/LotteryMachineTest.java b/src/test/java/domain/lotteryService/LotteryMachineTest.java similarity index 97% rename from src/test/java/domain/LotteryMachineTest.java rename to src/test/java/domain/lotteryService/LotteryMachineTest.java index b17b2d9..970edf0 100644 --- a/src/test/java/domain/LotteryMachineTest.java +++ b/src/test/java/domain/lotteryService/LotteryMachineTest.java @@ -1,4 +1,4 @@ -package domain; +package domain.lotteryService; import static org.assertj.core.api.Assertions.*; @@ -7,7 +7,6 @@ import org.junit.jupiter.api.Test; -import domain.lotteryService.LotteryMachine; import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; import domain.lotteryStore.Numbers; diff --git a/src/test/java/domain/LotteryStoreTest.java b/src/test/java/domain/lotteryStore/LotteryStoreTest.java similarity index 81% rename from src/test/java/domain/LotteryStoreTest.java rename to src/test/java/domain/lotteryStore/LotteryStoreTest.java index e46d0e4..22d5400 100644 --- a/src/test/java/domain/LotteryStoreTest.java +++ b/src/test/java/domain/lotteryStore/LotteryStoreTest.java @@ -1,14 +1,10 @@ -package domain; +package domain.lotteryStore; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import domain.lotteryStore.Lotteries; -import domain.lotteryStore.LotteryStore; -import domain.lotteryStore.TargetNumbers; - class LotteryStoreTest { private LotteryStore lotteryStore; From 0c75edc69a10c66934a588b46220a9e8e27fb8e1 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Thu, 1 Apr 2021 01:17:22 +0900 Subject: [PATCH 19/44] =?UTF-8?q?feat:=20=EA=B0=81=20=ED=8B=B0=EC=BC=93?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20=EA=B2=B0=EA=B3=BC=EB=A1=9C=EB=B6=80?= =?UTF-8?q?=ED=84=B0=20=EB=8B=B9=EC=B2=A8=20=ED=86=B5=EA=B3=84=20=EB=82=B4?= =?UTF-8?q?=EB=8A=94=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 - WinningStatistics 가 당첨 통계만 가지고 있도록 수정 --- README.md | 2 +- .../domain/lotteryService/WinningNumbers.java | 10 ++- src/main/java/domain/prize/PrizeMoney.java | 8 +-- src/main/java/domain/prize/Ranking.java | 19 ++++++ src/main/java/domain/prize/Results.java | 15 +++++ .../java/domain/prize/WinningStatistics.java | 65 +++++++++++++++++-- src/main/java/ui/Printer.java | 6 +- .../java/domain/prize/PrizeMoneyTest.java | 35 ++++++++++ .../domain/prize/WinningStatisticsTest.java | 37 +++++++++++ 9 files changed, 183 insertions(+), 14 deletions(-) create mode 100644 src/main/java/domain/prize/Ranking.java create mode 100644 src/main/java/domain/prize/Results.java create mode 100644 src/test/java/domain/prize/PrizeMoneyTest.java create mode 100644 src/test/java/domain/prize/WinningStatisticsTest.java diff --git a/README.md b/README.md index 8a00a15..ad3656c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ ___ - [x] 번호 자동 생성 - [x] 지난주 당첨 번호와 보너스 볼 입력 - [ ] 예외 -- [ ] 번호 비교 +- [x] 번호 비교 - [x] 당첨 통계 출력 - [x] 수익률 계산 및 출력 diff --git a/src/main/java/domain/lotteryService/WinningNumbers.java b/src/main/java/domain/lotteryService/WinningNumbers.java index b380548..e6450fa 100644 --- a/src/main/java/domain/lotteryService/WinningNumbers.java +++ b/src/main/java/domain/lotteryService/WinningNumbers.java @@ -11,7 +11,7 @@ public class WinningNumbers { final List winningNumbers; - public WinningNumbers(String winningNumbers, int bonusNumber) { + public WinningNumbers(String winningNumbers) { this.winningNumbers = splitWinningNumbers(winningNumbers); // TODO: bonusNumber와 겹치는 winningNumbers가 있는지 확인 -> 여기서 해야하나? } @@ -35,6 +35,14 @@ public int get(int index) { return winningNumbers.get(index); } + public int size() { + return winningNumbers.size(); + } + + public boolean contains(int numberToCompare) { + return winningNumbers.contains(numberToCompare); + } + public List getWinningNumbers() { return winningNumbers; } diff --git a/src/main/java/domain/prize/PrizeMoney.java b/src/main/java/domain/prize/PrizeMoney.java index 7e864df..774222d 100644 --- a/src/main/java/domain/prize/PrizeMoney.java +++ b/src/main/java/domain/prize/PrizeMoney.java @@ -17,14 +17,14 @@ public enum PrizeMoney { this.prizeMoney = prizeMoney; } - public static float calculateEarningsRate(WinningStatistics winningStatistics, int purchasePrice) { - List matchingCounts = winningStatistics.getMatchingCounts(); + public static float calculateEarningsRate(WinningStatistics winningStatistics, int purchasedCount) { + List sizeOfWinnersPerRank = winningStatistics.getRankings(); int totalPrizeMoney = 0; for (int i = 0; i < 5; i++) { - totalPrizeMoney += matchingCounts.get(i) * (PrizeMoney.values())[i].prizeMoney; + totalPrizeMoney += sizeOfWinnersPerRank.get(i) * (PrizeMoney.values())[i].prizeMoney; } - return (float)totalPrizeMoney / purchasePrice; + return (float)totalPrizeMoney / (purchasedCount * 1000); } public int getMatchingCount() { diff --git a/src/main/java/domain/prize/Ranking.java b/src/main/java/domain/prize/Ranking.java new file mode 100644 index 0000000..b2f2358 --- /dev/null +++ b/src/main/java/domain/prize/Ranking.java @@ -0,0 +1,19 @@ +package domain.prize; + +import java.util.List; + +public class Ranking { + private final List sizeOfRanks; + + public Ranking(List sizeOfRanks) { + this.sizeOfRanks = sizeOfRanks; + } + + public void increase(int index) { + sizeOfRanks.set(index, sizeOfRanks.get(index) + 1); + } + + public List getSizeOfRanks() { + return sizeOfRanks; + } +} diff --git a/src/main/java/domain/prize/Results.java b/src/main/java/domain/prize/Results.java new file mode 100644 index 0000000..fc60cfc --- /dev/null +++ b/src/main/java/domain/prize/Results.java @@ -0,0 +1,15 @@ +package domain.prize; + +import java.util.List; + +public class Results { + private final List results; + + public Results(List results) { + this.results = results; + } + + public List getResults() { + return results; + } +} diff --git a/src/main/java/domain/prize/WinningStatistics.java b/src/main/java/domain/prize/WinningStatistics.java index 754b5d2..e0973ab 100644 --- a/src/main/java/domain/prize/WinningStatistics.java +++ b/src/main/java/domain/prize/WinningStatistics.java @@ -1,15 +1,70 @@ package domain.prize; +import java.util.Arrays; import java.util.List; public class WinningStatistics { - private final List matchingCounts; + private static final int FIFTH_PLACE_INDEX = 0; + private static final int FOURTH_PLACE_INDEX = 1; + private static final int THIRD_PLACE_INDEX = 2; + private static final int SECOND_PLACE_INDEX = 3; + private static final int FIRST_PLACE_INDEX = 4; - public WinningStatistics(List matchingCounts) { - this.matchingCounts = matchingCounts; + // 1~5등을 한 로또 티켓들이 각각 몇개인지 + private final Ranking rankings; + + public WinningStatistics(Results results) { + rankings = new Ranking(Arrays.asList(0, 0, 0, 0, 0)); + findWinningLotteriesFromResults(results); + } + + private void findWinningLotteriesFromResults(Results results) { + for (Result result : results.getResults()) { + findFifthPlaces(result); + findFourthPlaces(result); + findSecondAndThirdPlaces(result); + findFirstPlaces(result); + } + } + + private void findFifthPlaces(Result result) { + if (result.getMatchingCount() == PrizeMoney.THREE.getMatchingCount()) { + rankings.increase(FIFTH_PLACE_INDEX); + } + } + + private void findFourthPlaces(Result result) { + if (result.getMatchingCount() == PrizeMoney.FOUR.getMatchingCount()) { + rankings.increase(FOURTH_PLACE_INDEX); + } + } + + private void findSecondAndThirdPlaces(Result result) { + if (result.getMatchingCount() == PrizeMoney.FIVE.getMatchingCount()) { + findLotteriesNotHavingBonusNumber(result); + findLotteriesHavingBonusNumber(result); + } + } + + private void findLotteriesNotHavingBonusNumber(Result result) { + if (!result.isHavingBonusNumber()) { + rankings.increase(THIRD_PLACE_INDEX); + } + } + + private void findLotteriesHavingBonusNumber(Result result) { + if (result.isHavingBonusNumber()) { + rankings.increase(SECOND_PLACE_INDEX); + } + } + + private void findFirstPlaces(Result result) { + if (result.getMatchingCount() == PrizeMoney.SIX.getMatchingCount()) { + rankings.increase(FIRST_PLACE_INDEX); + } } - public List getMatchingCounts() { - return matchingCounts; + public List getRankings() { + return rankings.getSizeOfRanks(); } } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 93048e7..ed61f25 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -28,12 +28,12 @@ public void printPurchasedLotteries(Lotteries lotteries) { public void printWinningStatistics(WinningStatistics winningStatistics) { StringBuilder builder = new StringBuilder(); PrizeMoney[] prizeMonies = PrizeMoney.values(); - List results = winningStatistics.getMatchingCounts(); + List sizeOfWinnersPerRank = winningStatistics.getRankings(); builder.append(Message.OutputMessage.WINNING_STATISTICS.getMessage()) .append(Message.OutputMessage.BOUNDARY_LINE.getMessage()); - for (int i = 0; i < 5; i++) { - printWinningStatisticsDetails(builder, prizeMonies[i], results.get(i), i); + for (int i = 0; i < SIZE_OF_LOTTERY_RANK; i++) { + printWinningStatisticsDetails(builder, prizeMonies[i], sizeOfWinnersPerRank.get(i), i); } System.out.print(builder); } diff --git a/src/test/java/domain/prize/PrizeMoneyTest.java b/src/test/java/domain/prize/PrizeMoneyTest.java new file mode 100644 index 0000000..c22bef1 --- /dev/null +++ b/src/test/java/domain/prize/PrizeMoneyTest.java @@ -0,0 +1,35 @@ +package domain.prize; + +import static org.assertj.core.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +class PrizeMoneyTest { + + @Test + void 총수익률을_계산한다() { + // given + int purchasedCount = 7; + List results = new ArrayList<>(Arrays.asList( + new Result(3, false), + new Result(4, false), + new Result(0, false), + new Result(2, true), + new Result(5, true), + new Result(1, false), + new Result(3, true) + )); + WinningStatistics winningStatistics = new WinningStatistics(new Results(results)); + + // when + float earningsRate = PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount); + + // then + assertThat(earningsRate).isEqualTo( + (float)(2 * 5000 + 1 * 50000 + 0 * 1500000 + 1 * 30000000 + 0 * 2000000000) / (purchasedCount * 1000)); + } +} \ No newline at end of file diff --git a/src/test/java/domain/prize/WinningStatisticsTest.java b/src/test/java/domain/prize/WinningStatisticsTest.java new file mode 100644 index 0000000..6bc6eed --- /dev/null +++ b/src/test/java/domain/prize/WinningStatisticsTest.java @@ -0,0 +1,37 @@ +package domain.prize; + +import static org.assertj.core.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +class WinningStatisticsTest { + + @Test + void 각_티켓들의_결과들로부터_당첨된_티켓을_골라낸다() { + // given + List results = new ArrayList<>(Arrays.asList( + new Result(3, false), + new Result(4, false), + new Result(0, false), + new Result(2, true), + new Result(5, true), + new Result(1, false), + new Result(3, true) + )); + + // when + WinningStatistics winningStatistics = new WinningStatistics(new Results(results)); + List rankings = winningStatistics.getRankings(); + + // then + assertThat(rankings.get(0)).isEqualTo(2); + assertThat(rankings.get(1)).isEqualTo(1); + assertThat(rankings.get(2)).isEqualTo(0); + assertThat(rankings.get(3)).isEqualTo(1); + assertThat(rankings.get(4)).isEqualTo(0); + } +} \ No newline at end of file From 402125c9385a3e940607aa26a38dfc68b1075321 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Thu, 1 Apr 2021 23:05:30 +0900 Subject: [PATCH 20/44] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD,=20Message=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/lotteryService/LotteryMachine.java | 2 - .../{prize => lotteryService}/Result.java | 2 +- .../{prize => lotteryService}/Results.java | 2 +- .../java/domain/prize/WinningStatistics.java | 3 + src/main/java/ui/Message.java | 61 ------------------- src/main/java/ui/Printer.java | 19 +++--- .../java/ui/message/ExceptionMessage.java | 20 ++++++ src/main/java/ui/message/InputMessage.java | 17 ++++++ src/main/java/ui/message/OutputMessage.java | 23 +++++++ src/main/java/ui/receiver/InputValidator.java | 14 ++--- src/main/java/ui/receiver/Receiver.java | 8 +-- .../lotteryService/LotteryMachineTest.java | 1 - .../java/domain/prize/PrizeMoneyTest.java | 3 + .../domain/prize/WinningStatisticsTest.java | 3 + .../java/ui/receiver/InputValidatorTest.java | 4 +- 15 files changed, 94 insertions(+), 88 deletions(-) rename src/main/java/domain/{prize => lotteryService}/Result.java (93%) rename src/main/java/domain/{prize => lotteryService}/Results.java (88%) delete mode 100644 src/main/java/ui/Message.java create mode 100644 src/main/java/ui/message/ExceptionMessage.java create mode 100644 src/main/java/ui/message/InputMessage.java create mode 100644 src/main/java/ui/message/OutputMessage.java diff --git a/src/main/java/domain/lotteryService/LotteryMachine.java b/src/main/java/domain/lotteryService/LotteryMachine.java index 22b5d81..a8f34e9 100644 --- a/src/main/java/domain/lotteryService/LotteryMachine.java +++ b/src/main/java/domain/lotteryService/LotteryMachine.java @@ -5,8 +5,6 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; -import domain.prize.Result; -import domain.prize.Results; public class LotteryMachine { private static final int SIZE_OF_WINNING_NUMBERS = 6; diff --git a/src/main/java/domain/prize/Result.java b/src/main/java/domain/lotteryService/Result.java similarity index 93% rename from src/main/java/domain/prize/Result.java rename to src/main/java/domain/lotteryService/Result.java index 1fe94ab..21bc3cb 100644 --- a/src/main/java/domain/prize/Result.java +++ b/src/main/java/domain/lotteryService/Result.java @@ -1,4 +1,4 @@ -package domain.prize; +package domain.lotteryService; public class Result { private final int matchingCount; diff --git a/src/main/java/domain/prize/Results.java b/src/main/java/domain/lotteryService/Results.java similarity index 88% rename from src/main/java/domain/prize/Results.java rename to src/main/java/domain/lotteryService/Results.java index fc60cfc..998a2f3 100644 --- a/src/main/java/domain/prize/Results.java +++ b/src/main/java/domain/lotteryService/Results.java @@ -1,4 +1,4 @@ -package domain.prize; +package domain.lotteryService; import java.util.List; diff --git a/src/main/java/domain/prize/WinningStatistics.java b/src/main/java/domain/prize/WinningStatistics.java index e0973ab..b6dd503 100644 --- a/src/main/java/domain/prize/WinningStatistics.java +++ b/src/main/java/domain/prize/WinningStatistics.java @@ -3,6 +3,9 @@ import java.util.Arrays; import java.util.List; +import domain.lotteryService.Result; +import domain.lotteryService.Results; + public class WinningStatistics { private static final int FIFTH_PLACE_INDEX = 0; private static final int FOURTH_PLACE_INDEX = 1; diff --git a/src/main/java/ui/Message.java b/src/main/java/ui/Message.java deleted file mode 100644 index 04cf6c6..0000000 --- a/src/main/java/ui/Message.java +++ /dev/null @@ -1,61 +0,0 @@ -package ui; - -public class Message { - - public enum InputMessage { - INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), - INPUT_LAST_WEEK_WINNING_NUMBERS("\n지난 주 당첨 번호를 입력해 주세요."), - INPUT_BONUS_BALL("보너스 볼을 입력해 주세요."); - - private String message; - - InputMessage(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - } - - public enum OutputMessage { - PURCHASED_COUNT("개를 구매했습니다."), - WINNING_STATISTICS("\n당첨 통계\n"), - BOUNDARY_LINE("---------\n"), - MATCH_COUNT("개 일치 ("), - MATCH_COUNT_BONUS("개 일치, 보너스 볼 일치("), - WON("원)- "), - COUNT("개\n"), - TOTAL_EARNINGS_RATE("총 수익률은 "), - CLOSING_MENTION("입니다.(1 기준)"); - - private String message; - - OutputMessage(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - } - - public enum ExceptionMessage { - MUST_BUY_MORE_THAN_ONE_TICKET("한 장 이상 구매하셔야 합니다."), - DUPLICATE_NUMBERS("중복 번호를 입력할 수 없습니다."), - BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS("당첨 번호와 일치하는 보너스 번호는 입력할 수 없습니다."), - MUST_INPUT_NUMBERS_IN_VALID_RANGE("1과 45 사이 번호를 입력해야 합니다."), - MUST_INPUT_SIX_WINNING_NUMBERS("6개의 당첨 번호를 입력해야 합니다."), - INPUT_ONLY_NUMBERS_AND_COMMA("숫자와 , 이외의 문자는 입력할 수 없습니다."); - - private String message; - - ExceptionMessage(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - } -} diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index ed61f25..afaba93 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -5,6 +5,7 @@ import domain.lotteryStore.Lotteries; import domain.prize.PrizeMoney; import domain.prize.WinningStatistics; +import ui.message.OutputMessage; public class Printer { private static final int PRICE_OF_ONE_LOTTERY_TICKET = 1000; @@ -14,7 +15,7 @@ public class Printer { public int printPurchasedCount(int purchasePrice) { int purchasedCount = purchasePrice / PRICE_OF_ONE_LOTTERY_TICKET; - System.out.println(purchasedCount + Message.OutputMessage.PURCHASED_COUNT.getMessage()); + System.out.println(purchasedCount + OutputMessage.PURCHASED_COUNT.getMessage()); return purchasedCount; } @@ -30,8 +31,8 @@ public void printWinningStatistics(WinningStatistics winningStatistics) { PrizeMoney[] prizeMonies = PrizeMoney.values(); List sizeOfWinnersPerRank = winningStatistics.getRankings(); - builder.append(Message.OutputMessage.WINNING_STATISTICS.getMessage()) - .append(Message.OutputMessage.BOUNDARY_LINE.getMessage()); + builder.append(OutputMessage.WINNING_STATISTICS.getMessage()) + .append(OutputMessage.BOUNDARY_LINE.getMessage()); for (int i = 0; i < SIZE_OF_LOTTERY_RANK; i++) { printWinningStatisticsDetails(builder, prizeMonies[i], sizeOfWinnersPerRank.get(i), i); } @@ -42,21 +43,21 @@ private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney pri Integer result, int i) { builder.append(prizeMoney.getMatchingCount()); if (i == WIN_WITH_BONUS_NUMBER) { - builder.append(Message.OutputMessage.MATCH_COUNT_BONUS.getMessage()); + builder.append(OutputMessage.MATCH_COUNT_BONUS.getMessage()); } if (i != WIN_WITH_BONUS_NUMBER) { - builder.append(Message.OutputMessage.MATCH_COUNT.getMessage()); + builder.append(OutputMessage.MATCH_COUNT.getMessage()); } builder.append(prizeMoney.getPrizeMoney()) - .append(Message.OutputMessage.WON.getMessage()) + .append(OutputMessage.WON.getMessage()) .append(result) - .append(Message.OutputMessage.COUNT.getMessage()); + .append(OutputMessage.COUNT.getMessage()); } public void printTotalEarningsRate(float totalEarningsRate) { System.out.println( - Message.OutputMessage.TOTAL_EARNINGS_RATE.getMessage() + String.format(LIMIT_OF_DECIMAL_PLACE, + OutputMessage.TOTAL_EARNINGS_RATE.getMessage() + String.format(LIMIT_OF_DECIMAL_PLACE, totalEarningsRate) - + Message.OutputMessage.CLOSING_MENTION.getMessage()); + + OutputMessage.CLOSING_MENTION.getMessage()); } } diff --git a/src/main/java/ui/message/ExceptionMessage.java b/src/main/java/ui/message/ExceptionMessage.java new file mode 100644 index 0000000..1efe9cf --- /dev/null +++ b/src/main/java/ui/message/ExceptionMessage.java @@ -0,0 +1,20 @@ +package ui.message; + +public enum ExceptionMessage { + MUST_BUY_MORE_THAN_ONE_TICKET("한 장 이상 구매하셔야 합니다."), + DUPLICATE_NUMBERS("중복 번호를 입력할 수 없습니다."), + BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS("당첨 번호와 일치하는 보너스 번호는 입력할 수 없습니다."), + MUST_INPUT_NUMBERS_IN_VALID_RANGE("1과 45 사이 번호를 입력해야 합니다."), + MUST_INPUT_SIX_WINNING_NUMBERS("6개의 당첨 번호를 입력해야 합니다."), + INPUT_ONLY_NUMBERS_AND_COMMA("숫자와 , 이외의 문자는 입력할 수 없습니다."); + + private String message; + + ExceptionMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/ui/message/InputMessage.java b/src/main/java/ui/message/InputMessage.java new file mode 100644 index 0000000..0725533 --- /dev/null +++ b/src/main/java/ui/message/InputMessage.java @@ -0,0 +1,17 @@ +package ui.message; + +public enum InputMessage { + INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), + INPUT_LAST_WEEK_WINNING_NUMBERS("\n지난 주 당첨 번호를 입력해 주세요."), + INPUT_BONUS_BALL("보너스 볼을 입력해 주세요."); + + private String message; + + InputMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/ui/message/OutputMessage.java b/src/main/java/ui/message/OutputMessage.java new file mode 100644 index 0000000..1d4485a --- /dev/null +++ b/src/main/java/ui/message/OutputMessage.java @@ -0,0 +1,23 @@ +package ui.message; + +public enum OutputMessage { + PURCHASED_COUNT("개를 구매했습니다."), + WINNING_STATISTICS("\n당첨 통계\n"), + BOUNDARY_LINE("---------\n"), + MATCH_COUNT("개 일치 ("), + MATCH_COUNT_BONUS("개 일치, 보너스 볼 일치("), + WON("원)- "), + COUNT("개\n"), + TOTAL_EARNINGS_RATE("총 수익률은 "), + CLOSING_MENTION("입니다.(1 기준)"); + + private String message; + + OutputMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/ui/receiver/InputValidator.java b/src/main/java/ui/receiver/InputValidator.java index aa96670..32e9165 100644 --- a/src/main/java/ui/receiver/InputValidator.java +++ b/src/main/java/ui/receiver/InputValidator.java @@ -5,7 +5,7 @@ import domain.lotteryService.BonusNumber; import domain.lotteryService.WinningNumbers; -import ui.Message; +import ui.message.ExceptionMessage; public class InputValidator { private static final int MINIMUM_PURCHASE_PRICE = 1000; @@ -15,7 +15,7 @@ public class InputValidator { public static void validatePurchasePrice(int purchasePrice) { if (purchasePrice < MINIMUM_PURCHASE_PRICE) { - throw new IllegalArgumentException(Message.ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); + throw new IllegalArgumentException(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); } } @@ -25,7 +25,7 @@ public static void validateOtherCharacterSymbols() { public static void validateSizeOfWinningNumbers(WinningNumbers winningNumbers) { if (winningNumbers.size() != 6) { - throw new IllegalArgumentException(Message.ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); + throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); } } @@ -34,28 +34,28 @@ public static void validateRangeOfWinningNumbers(WinningNumbers winningNumbers) .stream() .anyMatch( winningNumber -> winningNumber < MINIMUM_WINNING_NUMBER || winningNumber > MAXIMUM_WINNING_NUMBER)) { - throw new IllegalArgumentException(Message.ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); } } public static void validateRangeOfBonusNumber(BonusNumber bonusNumber) { if (bonusNumber.getBonusNumber() < MINIMUM_WINNING_NUMBER || bonusNumber.getBonusNumber() > MAXIMUM_WINNING_NUMBER) { - throw new IllegalArgumentException(Message.ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); } } public static void validateDuplicateWinningNumbers(WinningNumbers winningNumbers) { Set numbers = new HashSet<>(winningNumbers.getWinningNumbers()); if (numbers.size() != SIZE_OF_WINNING_NUMBERS) { - throw new IllegalArgumentException(Message.ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); + throw new IllegalArgumentException(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); } } public static void validateBonusNumber(WinningNumbers winningNumbers, BonusNumber bonusNumber) { if (winningNumbers.contains(bonusNumber.getBonusNumber())) { throw new IllegalArgumentException( - Message.ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); + ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); } } } diff --git a/src/main/java/ui/receiver/Receiver.java b/src/main/java/ui/receiver/Receiver.java index 79189b1..8ecaff2 100644 --- a/src/main/java/ui/receiver/Receiver.java +++ b/src/main/java/ui/receiver/Receiver.java @@ -2,24 +2,24 @@ import java.util.Scanner; -import ui.Message; +import ui.message.InputMessage; public class Receiver { private static final Scanner SCANNER = new Scanner(System.in); public int receivePurchasePrice() { - System.out.println(Message.InputMessage.INPUT_PURCHASE_PRICE.getMessage()); + System.out.println(InputMessage.INPUT_PURCHASE_PRICE.getMessage()); return SCANNER.nextInt(); } public String receiveWinningNumbers() { - System.out.println(Message.InputMessage.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); + System.out.println(InputMessage.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); SCANNER.nextLine(); return SCANNER.nextLine(); } public int receiveBonusNumber() { - System.out.println(Message.InputMessage.INPUT_BONUS_BALL.getMessage()); + System.out.println(InputMessage.INPUT_BONUS_BALL.getMessage()); return SCANNER.nextInt(); } } diff --git a/src/test/java/domain/lotteryService/LotteryMachineTest.java b/src/test/java/domain/lotteryService/LotteryMachineTest.java index 970edf0..0f347d5 100644 --- a/src/test/java/domain/lotteryService/LotteryMachineTest.java +++ b/src/test/java/domain/lotteryService/LotteryMachineTest.java @@ -10,7 +10,6 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; import domain.lotteryStore.Numbers; -import domain.prize.Result; class LotteryMachineTest { diff --git a/src/test/java/domain/prize/PrizeMoneyTest.java b/src/test/java/domain/prize/PrizeMoneyTest.java index c22bef1..1eb6c42 100644 --- a/src/test/java/domain/prize/PrizeMoneyTest.java +++ b/src/test/java/domain/prize/PrizeMoneyTest.java @@ -8,6 +8,9 @@ import org.junit.jupiter.api.Test; +import domain.lotteryService.Result; +import domain.lotteryService.Results; + class PrizeMoneyTest { @Test diff --git a/src/test/java/domain/prize/WinningStatisticsTest.java b/src/test/java/domain/prize/WinningStatisticsTest.java index 6bc6eed..03eeac0 100644 --- a/src/test/java/domain/prize/WinningStatisticsTest.java +++ b/src/test/java/domain/prize/WinningStatisticsTest.java @@ -8,6 +8,9 @@ import org.junit.jupiter.api.Test; +import domain.lotteryService.Result; +import domain.lotteryService.Results; + class WinningStatisticsTest { @Test diff --git a/src/test/java/ui/receiver/InputValidatorTest.java b/src/test/java/ui/receiver/InputValidatorTest.java index 560e837..6801515 100644 --- a/src/test/java/ui/receiver/InputValidatorTest.java +++ b/src/test/java/ui/receiver/InputValidatorTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import domain.lotteryService.WinningNumbers; -import ui.Message; +import ui.message.ExceptionMessage; class InputValidatorTest { @@ -17,6 +17,6 @@ class InputValidatorTest { //then Assertions.assertThatThrownBy(() -> InputValidator.validateDuplicateWinningNumbers(winningNumbers)) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining(Message.ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); + .hasMessageContaining(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); } } \ No newline at end of file From 2fe4dd3ec16f392cf6920b7084230ffbd5e707c4 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Fri, 2 Apr 2021 05:28:24 +0900 Subject: [PATCH 21/44] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++-- src/main/java/Application.java | 27 ++++-- .../domain/lotteryService/BonusNumber.java | 13 --- .../domain/lotteryService/LotteryMachine.java | 51 ------------ .../java/domain/lotteryService/Results.java | 15 ---- .../java/domain/lotteryStore/Lottery.java | 4 - .../domain/lotteryStore/LotteryStore.java | 6 +- .../java/domain/lotteryStore/Numbers.java | 15 ++++ .../domain/lotteryStore/TargetNumbers.java | 4 +- src/main/java/domain/prize/Ranking.java | 19 ----- .../java/domain/prize/WinningStatistics.java | 73 ----------------- src/main/java/domain/value/BonusNumber.java | 23 ++++++ src/main/java/domain/value/PurchasePrice.java | 18 ++++ .../WinningNumbers.java | 31 ++++--- .../value/validator/BonusNumberValidator.java | 20 +++++ .../validator/PurchasePriceValidator.java | 13 +++ .../validator/WinningNumbersValidator.java | 42 ++++++++++ .../ComparisonResult.java} | 6 +- .../winningStatistics/LotteryComparator.java | 36 ++++++++ .../PrizeMoney.java | 4 +- .../domain/winningStatistics/Rankings.java | 21 +++++ .../winningStatistics/WinningStatistics.java | 66 +++++++++++++++ src/main/java/ui/Printer.java | 15 ++-- src/main/java/ui/{receiver => }/Receiver.java | 2 +- src/main/java/ui/receiver/InputValidator.java | 61 -------------- .../lotteryService/LotteryMachineTest.java | 50 ----------- .../domain/lotteryStore/LotteryStoreTest.java | 2 +- .../java/domain/prize/PrizeMoneyTest.java | 38 --------- .../domain/prize/WinningStatisticsTest.java | 40 --------- .../validator/BonusNumberValidatorTest.java | 41 ++++++++++ .../validator/PurchasePriceValidatorTest.java | 28 +++++++ .../WinningNumbersValidatorTest.java | 82 +++++++++++++++++++ .../LotteryComparatorTest.java | 65 +++++++++++++++ .../winningStatistics/PrizeMoneyTest.java | 45 ++++++++++ .../winningStatistics/RankingsTest.java | 30 +++++++ .../WinningStatisticsTest.java | 43 ++++++++++ src/test/java/empty.txt | 0 .../java/ui/receiver/InputValidatorTest.java | 22 ----- 38 files changed, 652 insertions(+), 439 deletions(-) delete mode 100644 src/main/java/domain/lotteryService/BonusNumber.java delete mode 100644 src/main/java/domain/lotteryService/LotteryMachine.java delete mode 100644 src/main/java/domain/lotteryService/Results.java delete mode 100644 src/main/java/domain/prize/Ranking.java delete mode 100644 src/main/java/domain/prize/WinningStatistics.java create mode 100644 src/main/java/domain/value/BonusNumber.java create mode 100644 src/main/java/domain/value/PurchasePrice.java rename src/main/java/domain/{lotteryService => value}/WinningNumbers.java (52%) create mode 100644 src/main/java/domain/value/validator/BonusNumberValidator.java create mode 100644 src/main/java/domain/value/validator/PurchasePriceValidator.java create mode 100644 src/main/java/domain/value/validator/WinningNumbersValidator.java rename src/main/java/domain/{lotteryService/Result.java => winningStatistics/ComparisonResult.java} (70%) create mode 100644 src/main/java/domain/winningStatistics/LotteryComparator.java rename src/main/java/domain/{prize => winningStatistics}/PrizeMoney.java (90%) create mode 100644 src/main/java/domain/winningStatistics/Rankings.java create mode 100644 src/main/java/domain/winningStatistics/WinningStatistics.java rename src/main/java/ui/{receiver => }/Receiver.java (96%) delete mode 100644 src/main/java/ui/receiver/InputValidator.java delete mode 100644 src/test/java/domain/lotteryService/LotteryMachineTest.java delete mode 100644 src/test/java/domain/prize/PrizeMoneyTest.java delete mode 100644 src/test/java/domain/prize/WinningStatisticsTest.java create mode 100644 src/test/java/domain/validator/BonusNumberValidatorTest.java create mode 100644 src/test/java/domain/validator/PurchasePriceValidatorTest.java create mode 100644 src/test/java/domain/validator/WinningNumbersValidatorTest.java create mode 100644 src/test/java/domain/winningStatistics/LotteryComparatorTest.java create mode 100644 src/test/java/domain/winningStatistics/PrizeMoneyTest.java create mode 100644 src/test/java/domain/winningStatistics/RankingsTest.java create mode 100644 src/test/java/domain/winningStatistics/WinningStatisticsTest.java delete mode 100644 src/test/java/empty.txt delete mode 100644 src/test/java/ui/receiver/InputValidatorTest.java diff --git a/README.md b/README.md index ad3656c..fcc52b8 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ ___ - [x] 개수만큼 로또 번호 출력 - [x] 번호 자동 생성 - [x] 지난주 당첨 번호와 보너스 볼 입력 - - [ ] 예외 + - [x] 예외 - [x] 번호 비교 - [x] 당첨 통계 출력 - [x] 수익률 계산 및 출력 @@ -76,7 +76,17 @@ ___ - 구입 금액 입력 - [x] 구입금액이 0원 이하인 경우 - 당첨 번호와 보너스 볼 입력 - - [ ] 지난 주 당첨 번호가 중복되었을 경우 - - [ ] 당첨 번호가 1-45가 아닐 경우 - - [ ] 당첨 번호 구분자가 (,)가 아닐 경우 - - [ ] 당첨 번호 개수가 6개가 아닐 경우 + - [x] 지난 주 당첨 번호가 중복되었을 경우 + - [x] 당첨 번호가 1-45가 아닐 경우 + - [x] 당첨 번호 입력에 숫자와 쉼표가 아닌 글자가 들어간 경우 + - [x] 당첨 번호 개수가 6개가 아닐 경우 + +### 논의거리 + +- 일급컬렉션, 원시값 래핑 잘 했는지 +- 테스트 커버리지 + +- BonusNumber 생성자에 winningNumbers가 들어가는거 +- validate 메서드들 try-catch 해주기 +- WinningStatistics if분기 어떻게 처리할건지 +- enum에서 값을 변경해도 되는지 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 6a28792..abe7168 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,25 +1,34 @@ -import domain.lotteryService.LotteryMachine; import domain.lotteryStore.Lotteries; import domain.lotteryStore.LotteryStore; -import domain.lotteryStore.TargetNumbers; +import domain.value.BonusNumber; +import domain.value.PurchasePrice; +import domain.value.WinningNumbers; +import domain.winningStatistics.LotteryComparator; +import domain.winningStatistics.PrizeMoney; +import domain.winningStatistics.WinningStatistics; import ui.Printer; -import ui.receiver.InputValidator; -import ui.receiver.Receiver; +import ui.Receiver; public class Application { public static void main(String[] args) { Receiver receiver = new Receiver(); Printer printer = new Printer(); - int purchasePrice = receiver.receivePurchasePrice(); - InputValidator.validatePurchasePrice(purchasePrice); + PurchasePrice purchasePrice = new PurchasePrice(receiver.receivePurchasePrice()); int purchasedCount = printer.printPurchasedCount(purchasePrice); - LotteryStore lotteryStore = new LotteryStore(new TargetNumbers()); + LotteryStore lotteryStore = new LotteryStore(); Lotteries lotteries = lotteryStore.createLotteries(purchasedCount); printer.printPurchasedLotteries(lotteries); - LotteryMachine lotteryMachine = new LotteryMachine(receiver.receiveWinningNumbers(), - receiver.receiveBonusNumber()); + WinningNumbers winningNumbers = new WinningNumbers(receiver.receiveWinningNumbers()); + BonusNumber bonusNumber = new BonusNumber(receiver.receiveBonusNumber(), winningNumbers); + + LotteryComparator lotteryComparator = new LotteryComparator(); + lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries, purchasedCount); + WinningStatistics winningStatistics = lotteryComparator.getWinningStatistics(); + + printer.printWinningStatistics(winningStatistics); + printer.printTotalEarningsRate(PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount)); } } diff --git a/src/main/java/domain/lotteryService/BonusNumber.java b/src/main/java/domain/lotteryService/BonusNumber.java deleted file mode 100644 index 30fae50..0000000 --- a/src/main/java/domain/lotteryService/BonusNumber.java +++ /dev/null @@ -1,13 +0,0 @@ -package domain.lotteryService; - -public class BonusNumber { - private final int bonusNumber; - - public BonusNumber(int bonusNumber) { - this.bonusNumber = bonusNumber; - } - - public int getBonusNumber() { - return bonusNumber; - } -} diff --git a/src/main/java/domain/lotteryService/LotteryMachine.java b/src/main/java/domain/lotteryService/LotteryMachine.java deleted file mode 100644 index a8f34e9..0000000 --- a/src/main/java/domain/lotteryService/LotteryMachine.java +++ /dev/null @@ -1,51 +0,0 @@ -package domain.lotteryService; - -import java.util.ArrayList; -import java.util.List; - -import domain.lotteryStore.Lotteries; -import domain.lotteryStore.Lottery; - -public class LotteryMachine { - private static final int SIZE_OF_WINNING_NUMBERS = 6; - - private final WinningNumbers winningNumbers; - private final BonusNumber bonusNumber; - - public LotteryMachine(String winningNumbers, int bonusNumber) { - this.winningNumbers = new WinningNumbers(winningNumbers); - this.bonusNumber = new BonusNumber(bonusNumber); - } - - public Results compareNumbers(Lotteries lotteries, int purchasedCount) { - List results = new ArrayList<>(); - for (int i = 0; i < purchasedCount; i++) { - results.add(compareOneTicketNumbers(lotteries.get(i))); - } - - return new Results(results); - } - - private Result compareOneTicketNumbers(Lottery lottery) { - int matchingCount = 0; - boolean hasBonusNumber; - - for (int i = 0; i < SIZE_OF_WINNING_NUMBERS; i++) { - matchingCount += matchWinningNumbers(lottery, i); - } - hasBonusNumber = hasBonusNumber(lottery); - - return new Result(matchingCount, hasBonusNumber); - } - - private int matchWinningNumbers(Lottery lottery, int i) { - if (lottery.contains(winningNumbers.get(i))) { - return 1; - } - return 0; - } - - private boolean hasBonusNumber(Lottery lottery) { - return lottery.contains(bonusNumber.getBonusNumber()); - } -} diff --git a/src/main/java/domain/lotteryService/Results.java b/src/main/java/domain/lotteryService/Results.java deleted file mode 100644 index 998a2f3..0000000 --- a/src/main/java/domain/lotteryService/Results.java +++ /dev/null @@ -1,15 +0,0 @@ -package domain.lotteryService; - -import java.util.List; - -public class Results { - private final List results; - - public Results(List results) { - this.results = results; - } - - public List getResults() { - return results; - } -} diff --git a/src/main/java/domain/lotteryStore/Lottery.java b/src/main/java/domain/lotteryStore/Lottery.java index a2588c4..c02c9fb 100644 --- a/src/main/java/domain/lotteryStore/Lottery.java +++ b/src/main/java/domain/lotteryStore/Lottery.java @@ -7,10 +7,6 @@ public Lottery(Numbers numbers) { this.numbers = numbers; } - public boolean contains(int numberToCompare) { - return numbers.getNumbers().contains(numberToCompare); - } - public Numbers getNumbers() { return numbers; } diff --git a/src/main/java/domain/lotteryStore/LotteryStore.java b/src/main/java/domain/lotteryStore/LotteryStore.java index 6db4142..3fef773 100644 --- a/src/main/java/domain/lotteryStore/LotteryStore.java +++ b/src/main/java/domain/lotteryStore/LotteryStore.java @@ -4,11 +4,7 @@ import java.util.List; public class LotteryStore { - private final TargetNumbers targetNumbers; - - public LotteryStore(TargetNumbers targetNumbers) { - this.targetNumbers = targetNumbers; - } + private final TargetNumbers targetNumbers = new TargetNumbers(); public Lotteries createLotteries(int count) { List lotteries = new ArrayList<>(); diff --git a/src/main/java/domain/lotteryStore/Numbers.java b/src/main/java/domain/lotteryStore/Numbers.java index 4750bec..b77d1f3 100644 --- a/src/main/java/domain/lotteryStore/Numbers.java +++ b/src/main/java/domain/lotteryStore/Numbers.java @@ -1,14 +1,29 @@ package domain.lotteryStore; +import java.util.Collections; import java.util.List; +import domain.value.WinningNumbers; + public class Numbers { private final List numbers; public Numbers(List numbers) { + Collections.sort(numbers); this.numbers = numbers; } + public int countMatchingNumbers(WinningNumbers winningNumbers) { + return (int)winningNumbers.getWinningNumbers() + .stream() + .filter(this::contains) + .count(); + } + + public boolean contains(int compareToNumber) { + return numbers.contains(compareToNumber); + } + public List getNumbers() { return numbers; } diff --git a/src/main/java/domain/lotteryStore/TargetNumbers.java b/src/main/java/domain/lotteryStore/TargetNumbers.java index 334be9e..a042f95 100644 --- a/src/main/java/domain/lotteryStore/TargetNumbers.java +++ b/src/main/java/domain/lotteryStore/TargetNumbers.java @@ -9,10 +9,10 @@ public class TargetNumbers { private final List targetNumbers = new ArrayList<>(); public TargetNumbers() { - initNumbers(); + initiateNumbers(); } - private void initNumbers() { + private void initiateNumbers() { for (int i = 1; i <= 45; i++) { targetNumbers.add(i); } diff --git a/src/main/java/domain/prize/Ranking.java b/src/main/java/domain/prize/Ranking.java deleted file mode 100644 index b2f2358..0000000 --- a/src/main/java/domain/prize/Ranking.java +++ /dev/null @@ -1,19 +0,0 @@ -package domain.prize; - -import java.util.List; - -public class Ranking { - private final List sizeOfRanks; - - public Ranking(List sizeOfRanks) { - this.sizeOfRanks = sizeOfRanks; - } - - public void increase(int index) { - sizeOfRanks.set(index, sizeOfRanks.get(index) + 1); - } - - public List getSizeOfRanks() { - return sizeOfRanks; - } -} diff --git a/src/main/java/domain/prize/WinningStatistics.java b/src/main/java/domain/prize/WinningStatistics.java deleted file mode 100644 index b6dd503..0000000 --- a/src/main/java/domain/prize/WinningStatistics.java +++ /dev/null @@ -1,73 +0,0 @@ -package domain.prize; - -import java.util.Arrays; -import java.util.List; - -import domain.lotteryService.Result; -import domain.lotteryService.Results; - -public class WinningStatistics { - private static final int FIFTH_PLACE_INDEX = 0; - private static final int FOURTH_PLACE_INDEX = 1; - private static final int THIRD_PLACE_INDEX = 2; - private static final int SECOND_PLACE_INDEX = 3; - private static final int FIRST_PLACE_INDEX = 4; - - // 1~5등을 한 로또 티켓들이 각각 몇개인지 - private final Ranking rankings; - - public WinningStatistics(Results results) { - rankings = new Ranking(Arrays.asList(0, 0, 0, 0, 0)); - findWinningLotteriesFromResults(results); - } - - private void findWinningLotteriesFromResults(Results results) { - for (Result result : results.getResults()) { - findFifthPlaces(result); - findFourthPlaces(result); - findSecondAndThirdPlaces(result); - findFirstPlaces(result); - } - } - - private void findFifthPlaces(Result result) { - if (result.getMatchingCount() == PrizeMoney.THREE.getMatchingCount()) { - rankings.increase(FIFTH_PLACE_INDEX); - } - } - - private void findFourthPlaces(Result result) { - if (result.getMatchingCount() == PrizeMoney.FOUR.getMatchingCount()) { - rankings.increase(FOURTH_PLACE_INDEX); - } - } - - private void findSecondAndThirdPlaces(Result result) { - if (result.getMatchingCount() == PrizeMoney.FIVE.getMatchingCount()) { - findLotteriesNotHavingBonusNumber(result); - findLotteriesHavingBonusNumber(result); - } - } - - private void findLotteriesNotHavingBonusNumber(Result result) { - if (!result.isHavingBonusNumber()) { - rankings.increase(THIRD_PLACE_INDEX); - } - } - - private void findLotteriesHavingBonusNumber(Result result) { - if (result.isHavingBonusNumber()) { - rankings.increase(SECOND_PLACE_INDEX); - } - } - - private void findFirstPlaces(Result result) { - if (result.getMatchingCount() == PrizeMoney.SIX.getMatchingCount()) { - rankings.increase(FIRST_PLACE_INDEX); - } - } - - public List getRankings() { - return rankings.getSizeOfRanks(); - } -} diff --git a/src/main/java/domain/value/BonusNumber.java b/src/main/java/domain/value/BonusNumber.java new file mode 100644 index 0000000..bc31837 --- /dev/null +++ b/src/main/java/domain/value/BonusNumber.java @@ -0,0 +1,23 @@ +package domain.value; + +import domain.value.validator.BonusNumberValidator; + +public class BonusNumber { + private final int bonusNumber; + private final BonusNumberValidator validator; + + public BonusNumber(int bonusNumber, WinningNumbers winningNumbers) { + validator = new BonusNumberValidator(); + validateBonusNumber(bonusNumber, winningNumbers); + this.bonusNumber = bonusNumber; + } + + private void validateBonusNumber(int bonusNumber, WinningNumbers winningNumbers) { + validator.validateRangeOfBonusNumber(bonusNumber); + validator.validateBonusNumber(bonusNumber, winningNumbers); + } + + public int getBonusNumber() { + return bonusNumber; + } +} diff --git a/src/main/java/domain/value/PurchasePrice.java b/src/main/java/domain/value/PurchasePrice.java new file mode 100644 index 0000000..bcc14be --- /dev/null +++ b/src/main/java/domain/value/PurchasePrice.java @@ -0,0 +1,18 @@ +package domain.value; + +import domain.value.validator.PurchasePriceValidator; + +public class PurchasePrice { + private final int purchasePrice; + private final PurchasePriceValidator purchasePriceValidator; + + public PurchasePrice(int purchasePrice) { + purchasePriceValidator = new PurchasePriceValidator(); + purchasePriceValidator.validateSmallerThanPurchasePrice(purchasePrice); + this.purchasePrice = purchasePrice; + } + + public int getPurchasePrice() { + return purchasePrice; + } +} diff --git a/src/main/java/domain/lotteryService/WinningNumbers.java b/src/main/java/domain/value/WinningNumbers.java similarity index 52% rename from src/main/java/domain/lotteryService/WinningNumbers.java rename to src/main/java/domain/value/WinningNumbers.java index e6450fa..436569b 100644 --- a/src/main/java/domain/lotteryService/WinningNumbers.java +++ b/src/main/java/domain/value/WinningNumbers.java @@ -1,42 +1,40 @@ -package domain.lotteryService; +package domain.value; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import domain.value.validator.WinningNumbersValidator; + public class WinningNumbers { private static final String COMMA = ","; private static final String BLANK = " "; private static final String EMPTY_STRING = ""; - final List winningNumbers; + private final List winningNumbers; + private final WinningNumbersValidator validator; public WinningNumbers(String winningNumbers) { + validator = new WinningNumbersValidator(); this.winningNumbers = splitWinningNumbers(winningNumbers); - // TODO: bonusNumber와 겹치는 winningNumbers가 있는지 확인 -> 여기서 해야하나? } private List splitWinningNumbers(String input) { - // TODO: validate 숫자와 쉼표 이외의 문자 포함 + validator.validateOtherCharacterSymbols(input); - List splittedInput = Arrays.stream(input.replaceAll(BLANK, EMPTY_STRING) + List splitInput = Arrays.stream(input.replaceAll(BLANK, EMPTY_STRING) .split(COMMA)) .map(Integer::parseInt) .collect(Collectors.toList()); - // TODO: validate winningNumbers가 6개인지 - // TODO: validate 중복된 번호가 있는 경우 - // TODO: validate 1-45 사이의 숫자가 아닐 경우 - - return splittedInput; + validateSplitInput(splitInput); + return splitInput; } - public int get(int index) { - return winningNumbers.get(index); - } - - public int size() { - return winningNumbers.size(); + private void validateSplitInput(List splitInput) { + validator.validateSizeOfWinningNumbers(splitInput); + validator.validateRangeOfWinningNumbers(splitInput); + validator.validateDuplicateWinningNumbers(splitInput); } public boolean contains(int numberToCompare) { @@ -46,5 +44,4 @@ public boolean contains(int numberToCompare) { public List getWinningNumbers() { return winningNumbers; } - } diff --git a/src/main/java/domain/value/validator/BonusNumberValidator.java b/src/main/java/domain/value/validator/BonusNumberValidator.java new file mode 100644 index 0000000..d62d08b --- /dev/null +++ b/src/main/java/domain/value/validator/BonusNumberValidator.java @@ -0,0 +1,20 @@ +package domain.value.validator; + +import domain.value.WinningNumbers; +import ui.message.ExceptionMessage; + +public class BonusNumberValidator { + public void validateRangeOfBonusNumber(int bonusNumber) { + if (bonusNumber < WinningNumbersValidator.MINIMUM_WINNING_NUMBER + || bonusNumber > WinningNumbersValidator.MAXIMUM_WINNING_NUMBER) { + throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } + } + + public void validateBonusNumber(int bonusNumber, WinningNumbers winningNumbers) { + if (winningNumbers.contains(bonusNumber)) { + throw new IllegalArgumentException( + ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); + } + } +} diff --git a/src/main/java/domain/value/validator/PurchasePriceValidator.java b/src/main/java/domain/value/validator/PurchasePriceValidator.java new file mode 100644 index 0000000..c9362f9 --- /dev/null +++ b/src/main/java/domain/value/validator/PurchasePriceValidator.java @@ -0,0 +1,13 @@ +package domain.value.validator; + +import ui.message.ExceptionMessage; + +public class PurchasePriceValidator { + private static final int MINIMUM_PURCHASE_PRICE = 1000; + + public void validateSmallerThanPurchasePrice(int purchasePrice) { + if (purchasePrice < MINIMUM_PURCHASE_PRICE) { + throw new IllegalArgumentException(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); + } + } +} diff --git a/src/main/java/domain/value/validator/WinningNumbersValidator.java b/src/main/java/domain/value/validator/WinningNumbersValidator.java new file mode 100644 index 0000000..e768624 --- /dev/null +++ b/src/main/java/domain/value/validator/WinningNumbersValidator.java @@ -0,0 +1,42 @@ +package domain.value.validator; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +import ui.message.ExceptionMessage; + +public class WinningNumbersValidator { + public static final int MINIMUM_WINNING_NUMBER = 1; + public static final int MAXIMUM_WINNING_NUMBER = 45; + private static final String CHARACTERS_CONTAINING_NUMBER_COMMA = "^[0-9,\\s]+$"; + private static final int SIZE_OF_WINNING_NUMBERS = 6; + + public void validateOtherCharacterSymbols(String input) { + if (!Pattern.matches(CHARACTERS_CONTAINING_NUMBER_COMMA, input)) { + throw new IllegalArgumentException(ExceptionMessage.INPUT_ONLY_NUMBERS_AND_COMMA.getMessage()); + } + } + + public void validateSizeOfWinningNumbers(List splitWinningNumbers) { + if (splitWinningNumbers.size() != SIZE_OF_WINNING_NUMBERS) { + throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); + } + } + + public void validateRangeOfWinningNumbers(List splitWinningNumbers) { + if (splitWinningNumbers.stream() + .anyMatch( + winningNumber -> winningNumber < MINIMUM_WINNING_NUMBER || winningNumber > MAXIMUM_WINNING_NUMBER)) { + throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } + } + + public void validateDuplicateWinningNumbers(List splitWinningNumbers) { + Set numbers = new HashSet<>(splitWinningNumbers); + if (numbers.size() != SIZE_OF_WINNING_NUMBERS) { + throw new IllegalArgumentException(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); + } + } +} diff --git a/src/main/java/domain/lotteryService/Result.java b/src/main/java/domain/winningStatistics/ComparisonResult.java similarity index 70% rename from src/main/java/domain/lotteryService/Result.java rename to src/main/java/domain/winningStatistics/ComparisonResult.java index 21bc3cb..f4d4bb5 100644 --- a/src/main/java/domain/lotteryService/Result.java +++ b/src/main/java/domain/winningStatistics/ComparisonResult.java @@ -1,10 +1,10 @@ -package domain.lotteryService; +package domain.winningStatistics; -public class Result { +public class ComparisonResult { private final int matchingCount; private final boolean havingBonusNumber; - public Result(int matchingCount, boolean havingBonusNumber) { + public ComparisonResult(int matchingCount, boolean havingBonusNumber) { this.matchingCount = matchingCount; this.havingBonusNumber = havingBonusNumber; } diff --git a/src/main/java/domain/winningStatistics/LotteryComparator.java b/src/main/java/domain/winningStatistics/LotteryComparator.java new file mode 100644 index 0000000..67a90a2 --- /dev/null +++ b/src/main/java/domain/winningStatistics/LotteryComparator.java @@ -0,0 +1,36 @@ +package domain.winningStatistics; + +import domain.lotteryStore.Lotteries; +import domain.lotteryStore.Lottery; +import domain.value.BonusNumber; +import domain.value.WinningNumbers; + +public class LotteryComparator { + private final WinningStatistics winningStatistics = new WinningStatistics(); + + public void compareNumbers(WinningNumbers winningNumbers, BonusNumber bonusNumber, Lotteries lotteries, + int purchasedCount) { + for (int i = 0; i < purchasedCount; i++) { + ComparisonResult comparisonResult = compareOneTicketNumbers(winningNumbers, bonusNumber, lotteries.get(i)); + winningStatistics.checkRanking(comparisonResult); + } + } + + public ComparisonResult compareOneTicketNumbers(WinningNumbers winningNumbers, BonusNumber bonusNumber, + Lottery lottery) { + return new ComparisonResult(getCountOfMatchingWinningNumbers(lottery, winningNumbers), + hasBonusNumber(lottery, bonusNumber)); + } + + private int getCountOfMatchingWinningNumbers(Lottery lottery, WinningNumbers winningNumbers) { + return lottery.getNumbers().countMatchingNumbers(winningNumbers); + } + + private boolean hasBonusNumber(Lottery lottery, BonusNumber bonusNumber) { + return lottery.getNumbers().contains(bonusNumber.getBonusNumber()); + } + + public WinningStatistics getWinningStatistics() { + return winningStatistics; + } +} diff --git a/src/main/java/domain/prize/PrizeMoney.java b/src/main/java/domain/winningStatistics/PrizeMoney.java similarity index 90% rename from src/main/java/domain/prize/PrizeMoney.java rename to src/main/java/domain/winningStatistics/PrizeMoney.java index 774222d..000064c 100644 --- a/src/main/java/domain/prize/PrizeMoney.java +++ b/src/main/java/domain/winningStatistics/PrizeMoney.java @@ -1,4 +1,4 @@ -package domain.prize; +package domain.winningStatistics; import java.util.List; @@ -20,7 +20,7 @@ public enum PrizeMoney { public static float calculateEarningsRate(WinningStatistics winningStatistics, int purchasedCount) { List sizeOfWinnersPerRank = winningStatistics.getRankings(); int totalPrizeMoney = 0; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < sizeOfWinnersPerRank.size(); i++) { totalPrizeMoney += sizeOfWinnersPerRank.get(i) * (PrizeMoney.values())[i].prizeMoney; } diff --git a/src/main/java/domain/winningStatistics/Rankings.java b/src/main/java/domain/winningStatistics/Rankings.java new file mode 100644 index 0000000..5028e7e --- /dev/null +++ b/src/main/java/domain/winningStatistics/Rankings.java @@ -0,0 +1,21 @@ +package domain.winningStatistics; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Rankings { + private final List rankings; + + public Rankings() { + this.rankings = new ArrayList<>(Arrays.asList(0, 0, 0, 0, 0)); + } + + public void increase(int index) { + rankings.set(index, rankings.get(index) + 1); + } + + public List getRankings() { + return rankings; + } +} diff --git a/src/main/java/domain/winningStatistics/WinningStatistics.java b/src/main/java/domain/winningStatistics/WinningStatistics.java new file mode 100644 index 0000000..daffd76 --- /dev/null +++ b/src/main/java/domain/winningStatistics/WinningStatistics.java @@ -0,0 +1,66 @@ +package domain.winningStatistics; + +import java.util.List; + +public class WinningStatistics { + private static final int FIFTH_PLACE_INDEX = 0; + private static final int FOURTH_PLACE_INDEX = 1; + private static final int THIRD_PLACE_INDEX = 2; + private static final int SECOND_PLACE_INDEX = 3; + private static final int FIRST_PLACE_INDEX = 4; + + // 1~5등을 한 로또 티켓들이 각각 몇개인지 + private final Rankings rankings; + + public WinningStatistics() { + rankings = new Rankings(); + } + + public void checkRanking(ComparisonResult comparisonResult) { + findFifthPlaces(comparisonResult); + findFourthPlaces(comparisonResult); + findSecondOrThirdPlaces(comparisonResult); + findFirstPlaces(comparisonResult); + } + + private void findFifthPlaces(ComparisonResult comparisonResult) { + if (comparisonResult.getMatchingCount() == PrizeMoney.THREE.getMatchingCount()) { + rankings.increase(FIFTH_PLACE_INDEX); + } + } + + private void findFourthPlaces(ComparisonResult comparisonResult) { + if (comparisonResult.getMatchingCount() == PrizeMoney.FOUR.getMatchingCount()) { + rankings.increase(FOURTH_PLACE_INDEX); + } + } + + private void findSecondOrThirdPlaces(ComparisonResult comparisonResult) { + if (comparisonResult.getMatchingCount() == PrizeMoney.FIVE.getMatchingCount()) { + findLotteriesNotHavingBonusNumber(comparisonResult); + findLotteriesHavingBonusNumber(comparisonResult); + } + } + + private void findLotteriesNotHavingBonusNumber(ComparisonResult comparisonResult) { + if (!comparisonResult.isHavingBonusNumber()) { + rankings.increase(THIRD_PLACE_INDEX); + } + } + + private void findLotteriesHavingBonusNumber(ComparisonResult comparisonResult) { + if (comparisonResult.isHavingBonusNumber()) { + rankings.increase(SECOND_PLACE_INDEX); + } + } + + private void findFirstPlaces(ComparisonResult comparisonResult) { + if (comparisonResult.getMatchingCount() == PrizeMoney.SIX.getMatchingCount()) { + rankings.increase(FIRST_PLACE_INDEX); + } + } + + public List getRankings() { + return rankings.getRankings(); + } +} diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index afaba93..0f1d964 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -3,8 +3,9 @@ import java.util.List; import domain.lotteryStore.Lotteries; -import domain.prize.PrizeMoney; -import domain.prize.WinningStatistics; +import domain.value.PurchasePrice; +import domain.winningStatistics.PrizeMoney; +import domain.winningStatistics.WinningStatistics; import ui.message.OutputMessage; public class Printer { @@ -13,8 +14,8 @@ public class Printer { private static final int WIN_WITH_BONUS_NUMBER = 3; private static final String LIMIT_OF_DECIMAL_PLACE = "%.2f"; - public int printPurchasedCount(int purchasePrice) { - int purchasedCount = purchasePrice / PRICE_OF_ONE_LOTTERY_TICKET; + public int printPurchasedCount(PurchasePrice purchasePrice) { + int purchasedCount = purchasePrice.getPurchasePrice() / PRICE_OF_ONE_LOTTERY_TICKET; System.out.println(purchasedCount + OutputMessage.PURCHASED_COUNT.getMessage()); return purchasedCount; } @@ -39,8 +40,7 @@ public void printWinningStatistics(WinningStatistics winningStatistics) { System.out.print(builder); } - private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney prizeMoney, - Integer result, int i) { + private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney prizeMoney, Integer result, int i) { builder.append(prizeMoney.getMatchingCount()); if (i == WIN_WITH_BONUS_NUMBER) { builder.append(OutputMessage.MATCH_COUNT_BONUS.getMessage()); @@ -56,8 +56,7 @@ private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney pri public void printTotalEarningsRate(float totalEarningsRate) { System.out.println( - OutputMessage.TOTAL_EARNINGS_RATE.getMessage() + String.format(LIMIT_OF_DECIMAL_PLACE, - totalEarningsRate) + OutputMessage.TOTAL_EARNINGS_RATE.getMessage() + String.format(LIMIT_OF_DECIMAL_PLACE, totalEarningsRate) + OutputMessage.CLOSING_MENTION.getMessage()); } } diff --git a/src/main/java/ui/receiver/Receiver.java b/src/main/java/ui/Receiver.java similarity index 96% rename from src/main/java/ui/receiver/Receiver.java rename to src/main/java/ui/Receiver.java index 8ecaff2..38520b7 100644 --- a/src/main/java/ui/receiver/Receiver.java +++ b/src/main/java/ui/Receiver.java @@ -1,4 +1,4 @@ -package ui.receiver; +package ui; import java.util.Scanner; diff --git a/src/main/java/ui/receiver/InputValidator.java b/src/main/java/ui/receiver/InputValidator.java deleted file mode 100644 index 32e9165..0000000 --- a/src/main/java/ui/receiver/InputValidator.java +++ /dev/null @@ -1,61 +0,0 @@ -package ui.receiver; - -import java.util.HashSet; -import java.util.Set; - -import domain.lotteryService.BonusNumber; -import domain.lotteryService.WinningNumbers; -import ui.message.ExceptionMessage; - -public class InputValidator { - private static final int MINIMUM_PURCHASE_PRICE = 1000; - private static final int MINIMUM_WINNING_NUMBER = 1; - private static final int MAXIMUM_WINNING_NUMBER = 45; - private static final int SIZE_OF_WINNING_NUMBERS = 6; - - public static void validatePurchasePrice(int purchasePrice) { - if (purchasePrice < MINIMUM_PURCHASE_PRICE) { - throw new IllegalArgumentException(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); - } - } - - public static void validateOtherCharacterSymbols() { - // TODO: ,나 숫자 외의 입력이 있을 경우 - } - - public static void validateSizeOfWinningNumbers(WinningNumbers winningNumbers) { - if (winningNumbers.size() != 6) { - throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); - } - } - - public static void validateRangeOfWinningNumbers(WinningNumbers winningNumbers) { - if (winningNumbers.getWinningNumbers() - .stream() - .anyMatch( - winningNumber -> winningNumber < MINIMUM_WINNING_NUMBER || winningNumber > MAXIMUM_WINNING_NUMBER)) { - throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); - } - } - - public static void validateRangeOfBonusNumber(BonusNumber bonusNumber) { - if (bonusNumber.getBonusNumber() < MINIMUM_WINNING_NUMBER - || bonusNumber.getBonusNumber() > MAXIMUM_WINNING_NUMBER) { - throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); - } - } - - public static void validateDuplicateWinningNumbers(WinningNumbers winningNumbers) { - Set numbers = new HashSet<>(winningNumbers.getWinningNumbers()); - if (numbers.size() != SIZE_OF_WINNING_NUMBERS) { - throw new IllegalArgumentException(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); - } - } - - public static void validateBonusNumber(WinningNumbers winningNumbers, BonusNumber bonusNumber) { - if (winningNumbers.contains(bonusNumber.getBonusNumber())) { - throw new IllegalArgumentException( - ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); - } - } -} diff --git a/src/test/java/domain/lotteryService/LotteryMachineTest.java b/src/test/java/domain/lotteryService/LotteryMachineTest.java deleted file mode 100644 index 0f347d5..0000000 --- a/src/test/java/domain/lotteryService/LotteryMachineTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package domain.lotteryService; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Arrays; -import java.util.List; - -import org.junit.jupiter.api.Test; - -import domain.lotteryStore.Lotteries; -import domain.lotteryStore.Lottery; -import domain.lotteryStore.Numbers; - -class LotteryMachineTest { - - private final Lotteries lotteries = new Lotteries(Arrays.asList( - new Lottery(new Numbers(Arrays.asList(8, 2, 23, 41, 4, 5))), - new Lottery(new Numbers(Arrays.asList(3, 5, 29, 6, 2, 38))), - new Lottery(new Numbers(Arrays.asList(4, 31, 5, 40, 2, 1))), - new Lottery(new Numbers(Arrays.asList(4, 1, 3, 45, 5, 2))), - new Lottery(new Numbers(Arrays.asList(7, 1, 2, 3, 4, 5))), - new Lottery(new Numbers(Arrays.asList(1, 2, 3, 4, 5, 6))) - )); - - @Test - public void 각_티켓의_당첨_번호와_일치한_개수와_보너스_숫자를_확인한다() throws Exception { - //given - String winningNumbers = "1, 2, 3, 4, 5, 6"; - int bonusNumber = 7; - LotteryMachine lotteryMachine = new LotteryMachine(winningNumbers, bonusNumber); - - //when - int purchasedCount = 6; - List results = lotteryMachine.compareNumbers(lotteries, purchasedCount).getResults(); - - //then - assertThat(results.get(0).getMatchingCount()).isEqualTo(3); - assertThat(results.get(0).isHavingBonusNumber()).isEqualTo(false); - assertThat(results.get(1).getMatchingCount()).isEqualTo(4); - assertThat(results.get(1).isHavingBonusNumber()).isEqualTo(false); - assertThat(results.get(2).getMatchingCount()).isEqualTo(4); - assertThat(results.get(2).isHavingBonusNumber()).isEqualTo(false); - assertThat(results.get(3).getMatchingCount()).isEqualTo(5); - assertThat(results.get(3).isHavingBonusNumber()).isEqualTo(false); - assertThat(results.get(4).getMatchingCount()).isEqualTo(5); - assertThat(results.get(4).isHavingBonusNumber()).isEqualTo(true); - assertThat(results.get(5).getMatchingCount()).isEqualTo(6); - assertThat(results.get(5).isHavingBonusNumber()).isEqualTo(false); - } -} \ No newline at end of file diff --git a/src/test/java/domain/lotteryStore/LotteryStoreTest.java b/src/test/java/domain/lotteryStore/LotteryStoreTest.java index 22d5400..861d690 100644 --- a/src/test/java/domain/lotteryStore/LotteryStoreTest.java +++ b/src/test/java/domain/lotteryStore/LotteryStoreTest.java @@ -11,7 +11,7 @@ class LotteryStoreTest { @BeforeEach void setUp() { - lotteryStore = new LotteryStore(new TargetNumbers()); + lotteryStore = new LotteryStore(); } @Test diff --git a/src/test/java/domain/prize/PrizeMoneyTest.java b/src/test/java/domain/prize/PrizeMoneyTest.java deleted file mode 100644 index 1eb6c42..0000000 --- a/src/test/java/domain/prize/PrizeMoneyTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package domain.prize; - -import static org.assertj.core.api.Assertions.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.junit.jupiter.api.Test; - -import domain.lotteryService.Result; -import domain.lotteryService.Results; - -class PrizeMoneyTest { - - @Test - void 총수익률을_계산한다() { - // given - int purchasedCount = 7; - List results = new ArrayList<>(Arrays.asList( - new Result(3, false), - new Result(4, false), - new Result(0, false), - new Result(2, true), - new Result(5, true), - new Result(1, false), - new Result(3, true) - )); - WinningStatistics winningStatistics = new WinningStatistics(new Results(results)); - - // when - float earningsRate = PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount); - - // then - assertThat(earningsRate).isEqualTo( - (float)(2 * 5000 + 1 * 50000 + 0 * 1500000 + 1 * 30000000 + 0 * 2000000000) / (purchasedCount * 1000)); - } -} \ No newline at end of file diff --git a/src/test/java/domain/prize/WinningStatisticsTest.java b/src/test/java/domain/prize/WinningStatisticsTest.java deleted file mode 100644 index 03eeac0..0000000 --- a/src/test/java/domain/prize/WinningStatisticsTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package domain.prize; - -import static org.assertj.core.api.Assertions.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.junit.jupiter.api.Test; - -import domain.lotteryService.Result; -import domain.lotteryService.Results; - -class WinningStatisticsTest { - - @Test - void 각_티켓들의_결과들로부터_당첨된_티켓을_골라낸다() { - // given - List results = new ArrayList<>(Arrays.asList( - new Result(3, false), - new Result(4, false), - new Result(0, false), - new Result(2, true), - new Result(5, true), - new Result(1, false), - new Result(3, true) - )); - - // when - WinningStatistics winningStatistics = new WinningStatistics(new Results(results)); - List rankings = winningStatistics.getRankings(); - - // then - assertThat(rankings.get(0)).isEqualTo(2); - assertThat(rankings.get(1)).isEqualTo(1); - assertThat(rankings.get(2)).isEqualTo(0); - assertThat(rankings.get(3)).isEqualTo(1); - assertThat(rankings.get(4)).isEqualTo(0); - } -} \ No newline at end of file diff --git a/src/test/java/domain/validator/BonusNumberValidatorTest.java b/src/test/java/domain/validator/BonusNumberValidatorTest.java new file mode 100644 index 0000000..4486a12 --- /dev/null +++ b/src/test/java/domain/validator/BonusNumberValidatorTest.java @@ -0,0 +1,41 @@ +package domain.validator; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import domain.value.WinningNumbers; +import domain.value.validator.BonusNumberValidator; +import ui.message.ExceptionMessage; + +public class BonusNumberValidatorTest { + private BonusNumberValidator bonusNumberValidator; + + @BeforeEach + void setUp() { + bonusNumberValidator = new BonusNumberValidator(); + } + + @Test + public void 범위_초과하는_수를_검증한다() { + //given + int bonusNumber = 46; + + //then + Assertions.assertThatThrownBy(() -> bonusNumberValidator.validateRangeOfBonusNumber(bonusNumber)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } + + @Test + public void 중복을_검사한다() { + //given + WinningNumbers winningNumbers = new WinningNumbers("1, 2, 3, 4, 5, 6"); + int bonusNumber = 6; + + //then + Assertions.assertThatThrownBy(() -> bonusNumberValidator.validateBonusNumber(bonusNumber, winningNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); + } +} diff --git a/src/test/java/domain/validator/PurchasePriceValidatorTest.java b/src/test/java/domain/validator/PurchasePriceValidatorTest.java new file mode 100644 index 0000000..e1010d5 --- /dev/null +++ b/src/test/java/domain/validator/PurchasePriceValidatorTest.java @@ -0,0 +1,28 @@ +package domain.validator; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import domain.value.validator.PurchasePriceValidator; +import ui.message.ExceptionMessage; + +class PurchasePriceValidatorTest { + private PurchasePriceValidator purchasePriceValidator; + + @BeforeEach + void setUp() { + purchasePriceValidator = new PurchasePriceValidator(); + } + + @Test + public void 최소_입력값을_만족하는지_검증한다() { + //given + int purchasePrice = 60; + + //then + Assertions.assertThatThrownBy(() -> purchasePriceValidator.validateSmallerThanPurchasePrice(purchasePrice)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/domain/validator/WinningNumbersValidatorTest.java b/src/test/java/domain/validator/WinningNumbersValidatorTest.java new file mode 100644 index 0000000..5e4e911 --- /dev/null +++ b/src/test/java/domain/validator/WinningNumbersValidatorTest.java @@ -0,0 +1,82 @@ +package domain.validator; + +import java.util.ArrayList; +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import domain.value.validator.WinningNumbersValidator; +import ui.message.ExceptionMessage; + +public class WinningNumbersValidatorTest { + private WinningNumbersValidator winningNumbersValidator; + + @BeforeEach + void setUp() { + winningNumbersValidator = new WinningNumbersValidator(); + } + + @Test + public void 숫자와_콤마_이외의_값을_검증한다() { + //given + String input = "Hello"; + + //then + Assertions.assertThatThrownBy(() -> winningNumbersValidator.validateOtherCharacterSymbols(input)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.INPUT_ONLY_NUMBERS_AND_COMMA.getMessage()); + } + + @Test + public void 당첨번호_갯수를_검증한다() { + //given + List splitWinningNumbers = new ArrayList<>(); + splitWinningNumbers.add(1); + splitWinningNumbers.add(2); + splitWinningNumbers.add(3); + splitWinningNumbers.add(4); + splitWinningNumbers.add(5); + + //then + Assertions.assertThatThrownBy(() -> winningNumbersValidator.validateSizeOfWinningNumbers(splitWinningNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); + } + + @Test + public void 입력_범위안에_들어오는지_검증한다() { + //given + List splitWinningNumbers = new ArrayList<>(); + splitWinningNumbers.add(46); + splitWinningNumbers.add(2); + splitWinningNumbers.add(3); + splitWinningNumbers.add(4); + splitWinningNumbers.add(5); + splitWinningNumbers.add(6); + + //then + Assertions.assertThatThrownBy(() -> winningNumbersValidator.validateRangeOfWinningNumbers(splitWinningNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } + + @Test + public void 중복_입력된_수를_검증한다() { + //given + List splitWinningNumbers = new ArrayList<>(); + splitWinningNumbers.add(1); + splitWinningNumbers.add(1); + splitWinningNumbers.add(3); + splitWinningNumbers.add(4); + splitWinningNumbers.add(5); + splitWinningNumbers.add(6); + + //then + Assertions.assertThatThrownBy( + () -> winningNumbersValidator.validateDuplicateWinningNumbers(splitWinningNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); + } +} diff --git a/src/test/java/domain/winningStatistics/LotteryComparatorTest.java b/src/test/java/domain/winningStatistics/LotteryComparatorTest.java new file mode 100644 index 0000000..919c07e --- /dev/null +++ b/src/test/java/domain/winningStatistics/LotteryComparatorTest.java @@ -0,0 +1,65 @@ +package domain.winningStatistics; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import domain.lotteryStore.Lotteries; +import domain.lotteryStore.Lottery; +import domain.lotteryStore.Numbers; +import domain.value.BonusNumber; +import domain.value.WinningNumbers; + +class LotteryComparatorTest { + + private final WinningNumbers winningNumbers = new WinningNumbers("1, 2, 3, 4, 5, 6"); + private final BonusNumber bonusNumber = new BonusNumber(7, winningNumbers); + private final Lotteries lotteries = new Lotteries(Arrays.asList( + new Lottery(new Numbers(Arrays.asList(8, 2, 23, 41, 4, 5))), + new Lottery(new Numbers(Arrays.asList(3, 5, 29, 6, 2, 38))), + new Lottery(new Numbers(Arrays.asList(4, 31, 5, 40, 2, 1))), + new Lottery(new Numbers(Arrays.asList(4, 1, 3, 45, 5, 2))), + new Lottery(new Numbers(Arrays.asList(7, 1, 2, 3, 4, 5))), + new Lottery(new Numbers(Arrays.asList(1, 2, 3, 4, 5, 6))) + )); + + @Test + public void 로또_티켓_하나의_비교_결과를_확인한다() { + //given + LotteryComparator lotteryComparator = new LotteryComparator(); + + //when + ComparisonResult result1 = lotteryComparator.compareOneTicketNumbers(winningNumbers, bonusNumber, + lotteries.get(1)); + ComparisonResult result2 = lotteryComparator.compareOneTicketNumbers(winningNumbers, bonusNumber, + lotteries.get(4)); + + //then + assertThat(result1.getMatchingCount()).isEqualTo(4); + assertThat(result1.isHavingBonusNumber()).isEqualTo(false); + assertThat(result2.getMatchingCount()).isEqualTo(5); + assertThat(result2.isHavingBonusNumber()).isEqualTo(true); + } + + @Test + public void 당첨_통계를_확인한다() throws Exception { + //given + LotteryComparator lotteryComparator = new LotteryComparator(); + int purchasedCount = 6; + + //when + lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries, purchasedCount); + WinningStatistics winningStatistics = lotteryComparator.getWinningStatistics(); + List rankings = winningStatistics.getRankings(); + + //then + assertThat(rankings.get(0)).isEqualTo(1); + assertThat(rankings.get(1)).isEqualTo(2); + assertThat(rankings.get(2)).isEqualTo(1); + assertThat(rankings.get(3)).isEqualTo(1); + assertThat(rankings.get(4)).isEqualTo(1); + } +} \ No newline at end of file diff --git a/src/test/java/domain/winningStatistics/PrizeMoneyTest.java b/src/test/java/domain/winningStatistics/PrizeMoneyTest.java new file mode 100644 index 0000000..18fae9c --- /dev/null +++ b/src/test/java/domain/winningStatistics/PrizeMoneyTest.java @@ -0,0 +1,45 @@ +package domain.winningStatistics; + +import static org.assertj.core.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +class PrizeMoneyTest { + + @Test + void 총수익률을_계산한다() { + // given + List results = new ArrayList<>(Arrays.asList( + new ComparisonResult(3, false), + new ComparisonResult(4, false), + new ComparisonResult(0, false), + new ComparisonResult(2, true), + new ComparisonResult(5, true), + new ComparisonResult(1, false), + new ComparisonResult(3, true) + )); + int purchasedCount = 7; + + WinningStatistics winningStatistics = new WinningStatistics(); + + for (ComparisonResult result : results) { + winningStatistics.checkRanking(result); + } + + PrizeMoney[] values = PrizeMoney.values(); + + // when + float earningsRate = PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount); + List rankings = winningStatistics.getRankings(); + + // then + assertThat(earningsRate).isEqualTo( + (float)(rankings.get(0) * values[0].getPrizeMoney() + rankings.get(1) * values[1].getPrizeMoney() + + rankings.get(2) * values[2].getPrizeMoney() + rankings.get(3) * values[3].getPrizeMoney() + + rankings.get(4) * values[4].getPrizeMoney()) / (purchasedCount * 1000)); + } +} \ No newline at end of file diff --git a/src/test/java/domain/winningStatistics/RankingsTest.java b/src/test/java/domain/winningStatistics/RankingsTest.java new file mode 100644 index 0000000..1adb347 --- /dev/null +++ b/src/test/java/domain/winningStatistics/RankingsTest.java @@ -0,0 +1,30 @@ +package domain.winningStatistics; + +import static org.assertj.core.api.Assertions.*; + +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class RankingsTest { + + private Rankings rankings; + + @BeforeEach + void setUp() { + rankings = new Rankings(); + } + + @Test + void 당첨자_수를_증가시킨다() { + rankings.increase(1); + List sizeOfWinners = rankings.getRankings(); + + assertThat(sizeOfWinners.get(0)).isEqualTo(0); + assertThat(sizeOfWinners.get(1)).isEqualTo(1); + assertThat(sizeOfWinners.get(0)).isEqualTo(0); + assertThat(sizeOfWinners.get(0)).isEqualTo(0); + assertThat(sizeOfWinners.get(0)).isEqualTo(0); + } +} \ No newline at end of file diff --git a/src/test/java/domain/winningStatistics/WinningStatisticsTest.java b/src/test/java/domain/winningStatistics/WinningStatisticsTest.java new file mode 100644 index 0000000..e98f0ef --- /dev/null +++ b/src/test/java/domain/winningStatistics/WinningStatisticsTest.java @@ -0,0 +1,43 @@ +package domain.winningStatistics; + +import static org.assertj.core.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +class WinningStatisticsTest { + + @Test + void 각_등수의_당첨자_수를_확인한다() { + // given + List results = new ArrayList<>(Arrays.asList( + new ComparisonResult(3, false), + new ComparisonResult(5, false), + new ComparisonResult(4, false), + new ComparisonResult(0, false), + new ComparisonResult(2, true), + new ComparisonResult(5, true), + new ComparisonResult(1, false), + new ComparisonResult(3, true) + )); + + // when + WinningStatistics winningStatistics = new WinningStatistics(); + + for (ComparisonResult result : results) { + winningStatistics.checkRanking(result); + } + + List rankings = winningStatistics.getRankings(); + + // then + assertThat(rankings.get(0)).isEqualTo(2); + assertThat(rankings.get(1)).isEqualTo(1); + assertThat(rankings.get(2)).isEqualTo(1); + assertThat(rankings.get(3)).isEqualTo(1); + assertThat(rankings.get(4)).isEqualTo(0); + } +} \ No newline at end of file diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/ui/receiver/InputValidatorTest.java b/src/test/java/ui/receiver/InputValidatorTest.java deleted file mode 100644 index 6801515..0000000 --- a/src/test/java/ui/receiver/InputValidatorTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package ui.receiver; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.Test; - -import domain.lotteryService.WinningNumbers; -import ui.message.ExceptionMessage; - -class InputValidatorTest { - - @Test - public void 당첨번호_중복_입력을_검증한다() throws Exception { - //given - String input = "1, 6, 3, 4, 5, 6"; - WinningNumbers winningNumbers = new WinningNumbers(input); - - //then - Assertions.assertThatThrownBy(() -> InputValidator.validateDuplicateWinningNumbers(winningNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); - } -} \ No newline at end of file From e4404d9599b311490e99cd8e3fa8a7e70e690434 Mon Sep 17 00:00:00 2001 From: Gyeongjun Kim Date: Sun, 4 Apr 2021 15:48:52 +0900 Subject: [PATCH 22/44] Update README.md --- README.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/README.md b/README.md index 7c9722c..bf9431b 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,60 @@ 총 수익률은 0.35입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임) ``` +# 🚀 로또 2단계 - 수동 구매 + +## 기능 요구사항 +- 현재 로또 생성기는 자동 생성 기능만 제공한다. 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다. +- 입력한 금액, 자동 생성 숫자, 수동 생성 번호를 입력하도록 해야 한다. + +## 프로그래밍 요구사항 +- 예외가 발생하는 부분에 대해 자바 Exception을 적용해 예외처리한다. +- 사용자가 입력한 값에 대한 예외 처리를 철저히 한다. + +### 실행 결과 +``` +구입금액을 입력해 주세요. +14000 + +수동으로 구매할 로또 수를 입력해 주세요. +3 + +수동으로 구매할 번호를 입력해 주세요. +8, 21, 23, 41, 42, 43 +3, 5, 11, 16, 32, 38 +7, 11, 16, 35, 36, 44 + +수동으로 3장, 자동으로 11개를 구매했습니다. +[8, 21, 23, 41, 42, 43] +[3, 5, 11, 16, 32, 38] +[7, 11, 16, 35, 36, 44] +[1, 8, 11, 31, 41, 42] +[13, 14, 16, 38, 42, 45] +[7, 11, 30, 40, 42, 43] +[2, 13, 22, 32, 38, 45] +[23, 25, 33, 36, 39, 41] +[1, 3, 5, 14, 22, 45] +[5, 9, 38, 41, 43, 44] +[2, 8, 9, 18, 19, 21] +[13, 14, 18, 21, 23, 35] +[17, 21, 29, 37, 42, 45] +[3, 8, 27, 30, 35, 44] + +지난 주 당첨 번호를 입력해 주세요. +1, 2, 3, 4, 5, 6 +보너스 볼을 입력해 주세요. +7 + +당첨 통계 +--------- +3개 일치 (5000원)- 1개 +4개 일치 (50000원)- 0개 +5개 일치 (1500000원)- 0개 +5개 일치, 보너스 볼 일치(30000000원) - 0개 +6개 일치 (2000000000원)- 0개 +총 수익률은 0.35입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임) +``` + ## 프로그래밍 요구사항 - indent(인덴트, 들여쓰기) depth를 2단계에서 1단계로 줄여라. - depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다. From c2d856cad23269b282ebe9bc4093847ada2507b9 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Sun, 4 Apr 2021 21:20:51 +0900 Subject: [PATCH 23/44] =?UTF-8?q?chore:=20=EC=B5=9C=EC=86=8C=20=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=20=EB=A1=9C=EB=98=90=20=EB=B2=88=ED=98=B8=20=EC=83=81?= =?UTF-8?q?=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/lotteryStore/TargetNumbers.java | 5 ++++- .../value/validator/BonusNumberValidator.java | 4 ++-- .../value/validator/PurchasePriceValidator.java | 13 ------------- .../value/validator/WinningNumbersValidator.java | 7 +++---- 4 files changed, 9 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/domain/value/validator/PurchasePriceValidator.java diff --git a/src/main/java/domain/lotteryStore/TargetNumbers.java b/src/main/java/domain/lotteryStore/TargetNumbers.java index a042f95..7d4e982 100644 --- a/src/main/java/domain/lotteryStore/TargetNumbers.java +++ b/src/main/java/domain/lotteryStore/TargetNumbers.java @@ -6,6 +6,9 @@ import java.util.stream.Collectors; public class TargetNumbers { + public static final int MINIMUM_LOTTERY_NUMBER = 1; + public static final int MAXIMUM_LOTTERY_NUMBER = 45; + private final List targetNumbers = new ArrayList<>(); public TargetNumbers() { @@ -13,7 +16,7 @@ public TargetNumbers() { } private void initiateNumbers() { - for (int i = 1; i <= 45; i++) { + for (int i = MINIMUM_LOTTERY_NUMBER; i <= MAXIMUM_LOTTERY_NUMBER; i++) { targetNumbers.add(i); } } diff --git a/src/main/java/domain/value/validator/BonusNumberValidator.java b/src/main/java/domain/value/validator/BonusNumberValidator.java index d62d08b..7118555 100644 --- a/src/main/java/domain/value/validator/BonusNumberValidator.java +++ b/src/main/java/domain/value/validator/BonusNumberValidator.java @@ -1,12 +1,12 @@ package domain.value.validator; +import domain.lotteryStore.TargetNumbers; import domain.value.WinningNumbers; import ui.message.ExceptionMessage; public class BonusNumberValidator { public void validateRangeOfBonusNumber(int bonusNumber) { - if (bonusNumber < WinningNumbersValidator.MINIMUM_WINNING_NUMBER - || bonusNumber > WinningNumbersValidator.MAXIMUM_WINNING_NUMBER) { + if (bonusNumber < TargetNumbers.MINIMUM_LOTTERY_NUMBER || bonusNumber > TargetNumbers.MAXIMUM_LOTTERY_NUMBER) { throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); } } diff --git a/src/main/java/domain/value/validator/PurchasePriceValidator.java b/src/main/java/domain/value/validator/PurchasePriceValidator.java deleted file mode 100644 index c9362f9..0000000 --- a/src/main/java/domain/value/validator/PurchasePriceValidator.java +++ /dev/null @@ -1,13 +0,0 @@ -package domain.value.validator; - -import ui.message.ExceptionMessage; - -public class PurchasePriceValidator { - private static final int MINIMUM_PURCHASE_PRICE = 1000; - - public void validateSmallerThanPurchasePrice(int purchasePrice) { - if (purchasePrice < MINIMUM_PURCHASE_PRICE) { - throw new IllegalArgumentException(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); - } - } -} diff --git a/src/main/java/domain/value/validator/WinningNumbersValidator.java b/src/main/java/domain/value/validator/WinningNumbersValidator.java index e768624..ece3f66 100644 --- a/src/main/java/domain/value/validator/WinningNumbersValidator.java +++ b/src/main/java/domain/value/validator/WinningNumbersValidator.java @@ -5,11 +5,10 @@ import java.util.Set; import java.util.regex.Pattern; +import domain.lotteryStore.TargetNumbers; import ui.message.ExceptionMessage; public class WinningNumbersValidator { - public static final int MINIMUM_WINNING_NUMBER = 1; - public static final int MAXIMUM_WINNING_NUMBER = 45; private static final String CHARACTERS_CONTAINING_NUMBER_COMMA = "^[0-9,\\s]+$"; private static final int SIZE_OF_WINNING_NUMBERS = 6; @@ -27,8 +26,8 @@ public void validateSizeOfWinningNumbers(List splitWinningNumbers) { public void validateRangeOfWinningNumbers(List splitWinningNumbers) { if (splitWinningNumbers.stream() - .anyMatch( - winningNumber -> winningNumber < MINIMUM_WINNING_NUMBER || winningNumber > MAXIMUM_WINNING_NUMBER)) { + .anyMatch(winningNumber -> winningNumber < TargetNumbers.MINIMUM_LOTTERY_NUMBER + || winningNumber > TargetNumbers.MAXIMUM_LOTTERY_NUMBER)) { throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); } } From 55140377573adeb6d484c0e49480aac88581e102 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Tue, 6 Apr 2021 22:34:43 +0900 Subject: [PATCH 24/44] =?UTF-8?q?docs:=202=EB=8B=A8=EA=B3=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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 --- README.md | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b5cfaf..82177dd 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ ___ -### 기능 목록 +### 1단계 기능 목록 - [x] 구입금액 입력 - [x] 예외 @@ -135,6 +135,16 @@ ___ - [x] 당첨 번호 입력에 숫자와 쉼표가 아닌 글자가 들어간 경우 - [x] 당첨 번호 개수가 6개가 아닐 경우 +### 2단계 기능 목록 + +- [x] 숫자를 가진 클래스 분류 +- [ ] 수동으로 구매할 로또 수 입력 +- [ ] 수동으로 구매할 번호 입력 + - [ ] 수동 로또 생성 +- [ ] Printer %s, %f 사용 +- [ ] LotteryComparator를 Lotteries로 합칠 것이냐 +- [ ] PrizeMoney로 당첨 횟수 세기 + ### 논의거리 - 일급컬렉션, 원시값 래핑 잘 했는지 @@ -144,3 +154,27 @@ ___ - validate 메서드들 try-catch 해주기 - WinningStatistics if분기 어떻게 처리할건지 - enum에서 값을 변경해도 되는지 + +### LotteryNumber + +- 최소(1), 최대(45) 값 +- validate range + +### 숫자를 가지는 클래스 + +- Numbers: 6개 List + - Lottery가 만들어질 때 TargetNumbers로부터 받음 + - 당첨 번호 6개와 비교 +- [x] LotteryNumber + - 최댓값, 최솟값, 검증 로직 가지는 부모 클래스 +- [x] TargetNumbers: 45개 -> AutoNumbersGenerator + - 자동 생성 + - shuffle, 앞의 6개 숫자 가져오기 -> Numbers + - 범위 검증 필요 X + - 최댓값, 최솟값 필요 O +- [x] WinningNumbers: 6개 -> ManualNumbersGenerator + - 입력 받음, 수동 생성 + - 범위 검증 필요 +- [x] BonusNumber: 1개 + - 범위 검증 필요 + \ No newline at end of file From df90ac2d03f1f53df21559bf1046b7782cd8c66c Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Tue, 6 Apr 2021 22:36:35 +0900 Subject: [PATCH 25/44] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EC=9E=90=EB=8F=99,=20=EC=88=98=EB=8F=99=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TargetNumbers -> 숫자 자동 생성으로 변경 - WinningNumbers -> 숫자 수동 생성으로 변경 - 상수명 변경 - validators 삭제 --- src/main/java/Application.java | 9 +- .../lotteryStore/AutoNumbersGenerator.java | 32 ++++++++ .../java/domain/lotteryStore/Lotteries.java | 4 + .../domain/lotteryStore/LotteryStore.java | 6 +- .../java/domain/lotteryStore/Numbers.java | 10 +-- .../domain/lotteryStore/TargetNumbers.java | 33 -------- src/main/java/domain/value/BonusNumber.java | 19 +++-- .../java/domain/value/LotteryNumberRange.java | 18 ++++ .../domain/value/ManualNumbersGenerator.java | 70 ++++++++++++++++ src/main/java/domain/value/PurchasePrice.java | 18 +++- .../java/domain/value/WinningNumbers.java | 47 ----------- .../value/validator/BonusNumberValidator.java | 20 ----- .../validator/WinningNumbersValidator.java | 41 ---------- .../winningStatistics/LotteryComparator.java | 16 ++-- src/main/java/ui/Printer.java | 6 +- .../validator/PurchasePriceValidatorTest.java | 28 ------- .../WinningNumbersValidatorTest.java | 82 ------------------- .../BonusNumberTest.java} | 21 ++--- .../domain/value/LotteryNumberRangeTest.java | 25 ++++++ .../value/ManualNumbersGeneratorTest.java | 41 ++++++++++ .../java/domain/value/PurchasePriceTest.java | 19 +++++ .../LotteryComparatorTest.java | 6 +- 22 files changed, 264 insertions(+), 307 deletions(-) create mode 100644 src/main/java/domain/lotteryStore/AutoNumbersGenerator.java delete mode 100644 src/main/java/domain/lotteryStore/TargetNumbers.java create mode 100644 src/main/java/domain/value/LotteryNumberRange.java create mode 100644 src/main/java/domain/value/ManualNumbersGenerator.java delete mode 100644 src/main/java/domain/value/WinningNumbers.java delete mode 100644 src/main/java/domain/value/validator/BonusNumberValidator.java delete mode 100644 src/main/java/domain/value/validator/WinningNumbersValidator.java delete mode 100644 src/test/java/domain/validator/PurchasePriceValidatorTest.java delete mode 100644 src/test/java/domain/validator/WinningNumbersValidatorTest.java rename src/test/java/domain/{validator/BonusNumberValidatorTest.java => value/BonusNumberTest.java} (51%) create mode 100644 src/test/java/domain/value/LotteryNumberRangeTest.java create mode 100644 src/test/java/domain/value/ManualNumbersGeneratorTest.java create mode 100644 src/test/java/domain/value/PurchasePriceTest.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index abe7168..8c993bf 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,8 +1,8 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.LotteryStore; import domain.value.BonusNumber; +import domain.value.ManualNumbersGenerator; import domain.value.PurchasePrice; -import domain.value.WinningNumbers; import domain.winningStatistics.LotteryComparator; import domain.winningStatistics.PrizeMoney; import domain.winningStatistics.WinningStatistics; @@ -15,17 +15,18 @@ public static void main(String[] args) { Printer printer = new Printer(); PurchasePrice purchasePrice = new PurchasePrice(receiver.receivePurchasePrice()); - int purchasedCount = printer.printPurchasedCount(purchasePrice); + int purchasedCount = purchasePrice.getPurchasedCount(); + printer.printPurchasedCount(purchasedCount); LotteryStore lotteryStore = new LotteryStore(); Lotteries lotteries = lotteryStore.createLotteries(purchasedCount); printer.printPurchasedLotteries(lotteries); - WinningNumbers winningNumbers = new WinningNumbers(receiver.receiveWinningNumbers()); + ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator(receiver.receiveWinningNumbers()); BonusNumber bonusNumber = new BonusNumber(receiver.receiveBonusNumber(), winningNumbers); LotteryComparator lotteryComparator = new LotteryComparator(); - lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries, purchasedCount); + lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries); WinningStatistics winningStatistics = lotteryComparator.getWinningStatistics(); printer.printWinningStatistics(winningStatistics); diff --git a/src/main/java/domain/lotteryStore/AutoNumbersGenerator.java b/src/main/java/domain/lotteryStore/AutoNumbersGenerator.java new file mode 100644 index 0000000..2a365ec --- /dev/null +++ b/src/main/java/domain/lotteryStore/AutoNumbersGenerator.java @@ -0,0 +1,32 @@ +package domain.lotteryStore; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import domain.value.LotteryNumberRange; + +public class AutoNumbersGenerator { + private final List autoNumbers = new ArrayList<>(); + + public AutoNumbersGenerator() { + initiateNumbers(); + } + + private void initiateNumbers() { + for (int i = LotteryNumberRange.MINIMUM_LOTTERY_NUMBER; i <= LotteryNumberRange.MAXIMUM_LOTTERY_NUMBER; i++) { + autoNumbers.add(i); + } + } + + public void shuffle() { + Collections.shuffle(autoNumbers); + } + + public List getSixNumbersFromTheFront() { + return autoNumbers.stream() + .limit(6) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/domain/lotteryStore/Lotteries.java b/src/main/java/domain/lotteryStore/Lotteries.java index bc659f9..f82433c 100644 --- a/src/main/java/domain/lotteryStore/Lotteries.java +++ b/src/main/java/domain/lotteryStore/Lotteries.java @@ -13,6 +13,10 @@ public Lottery get(int index) { return lotteries.get(index); } + public int size() { + return lotteries.size(); + } + public List getLotteries() { return lotteries; } diff --git a/src/main/java/domain/lotteryStore/LotteryStore.java b/src/main/java/domain/lotteryStore/LotteryStore.java index 3fef773..d21e721 100644 --- a/src/main/java/domain/lotteryStore/LotteryStore.java +++ b/src/main/java/domain/lotteryStore/LotteryStore.java @@ -4,7 +4,7 @@ import java.util.List; public class LotteryStore { - private final TargetNumbers targetNumbers = new TargetNumbers(); + private final AutoNumbersGenerator autoNumbersGenerator = new AutoNumbersGenerator(); public Lotteries createLotteries(int count) { List lotteries = new ArrayList<>(); @@ -15,8 +15,8 @@ public Lotteries createLotteries(int count) { } private Lottery createLottery() { - targetNumbers.shuffle(); - Numbers numbers = new Numbers(targetNumbers.getSixNumbersFromTheFront()); + autoNumbersGenerator.shuffle(); + Numbers numbers = new Numbers(autoNumbersGenerator.getSixNumbersFromTheFront()); return new Lottery(numbers); } } diff --git a/src/main/java/domain/lotteryStore/Numbers.java b/src/main/java/domain/lotteryStore/Numbers.java index b77d1f3..8f2b50b 100644 --- a/src/main/java/domain/lotteryStore/Numbers.java +++ b/src/main/java/domain/lotteryStore/Numbers.java @@ -3,7 +3,7 @@ import java.util.Collections; import java.util.List; -import domain.value.WinningNumbers; +import domain.value.ManualNumbersGenerator; public class Numbers { private final List numbers; @@ -13,15 +13,15 @@ public Numbers(List numbers) { this.numbers = numbers; } - public int countMatchingNumbers(WinningNumbers winningNumbers) { - return (int)winningNumbers.getWinningNumbers() + public int countMatchingNumbers(ManualNumbersGenerator winningNumbers) { + return (int)winningNumbers.getManualNumbers() .stream() .filter(this::contains) .count(); } - public boolean contains(int compareToNumber) { - return numbers.contains(compareToNumber); + public boolean contains(int numberToCompare) { + return numbers.contains(numberToCompare); } public List getNumbers() { diff --git a/src/main/java/domain/lotteryStore/TargetNumbers.java b/src/main/java/domain/lotteryStore/TargetNumbers.java deleted file mode 100644 index 7d4e982..0000000 --- a/src/main/java/domain/lotteryStore/TargetNumbers.java +++ /dev/null @@ -1,33 +0,0 @@ -package domain.lotteryStore; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -public class TargetNumbers { - public static final int MINIMUM_LOTTERY_NUMBER = 1; - public static final int MAXIMUM_LOTTERY_NUMBER = 45; - - private final List targetNumbers = new ArrayList<>(); - - public TargetNumbers() { - initiateNumbers(); - } - - private void initiateNumbers() { - for (int i = MINIMUM_LOTTERY_NUMBER; i <= MAXIMUM_LOTTERY_NUMBER; i++) { - targetNumbers.add(i); - } - } - - public void shuffle() { - Collections.shuffle(targetNumbers); - } - - public List getSixNumbersFromTheFront() { - return targetNumbers.stream() - .limit(6) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/domain/value/BonusNumber.java b/src/main/java/domain/value/BonusNumber.java index bc31837..d4c51c3 100644 --- a/src/main/java/domain/value/BonusNumber.java +++ b/src/main/java/domain/value/BonusNumber.java @@ -1,20 +1,21 @@ package domain.value; -import domain.value.validator.BonusNumberValidator; +import ui.message.ExceptionMessage; -public class BonusNumber { +public class BonusNumber extends LotteryNumberRange { private final int bonusNumber; - private final BonusNumberValidator validator; - public BonusNumber(int bonusNumber, WinningNumbers winningNumbers) { - validator = new BonusNumberValidator(); - validateBonusNumber(bonusNumber, winningNumbers); + public BonusNumber(int bonusNumber, ManualNumbersGenerator winningNumbers) { + validateRange(bonusNumber); + validateDuplicate(bonusNumber, winningNumbers); this.bonusNumber = bonusNumber; } - private void validateBonusNumber(int bonusNumber, WinningNumbers winningNumbers) { - validator.validateRangeOfBonusNumber(bonusNumber); - validator.validateBonusNumber(bonusNumber, winningNumbers); + public void validateDuplicate(int bonusNumber, ManualNumbersGenerator winningNumbers) { + if (winningNumbers.contains(bonusNumber)) { + throw new IllegalArgumentException( + ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); + } } public int getBonusNumber() { diff --git a/src/main/java/domain/value/LotteryNumberRange.java b/src/main/java/domain/value/LotteryNumberRange.java new file mode 100644 index 0000000..0d89fc9 --- /dev/null +++ b/src/main/java/domain/value/LotteryNumberRange.java @@ -0,0 +1,18 @@ +package domain.value; + +import ui.message.ExceptionMessage; + +public class LotteryNumberRange { + public static final int MINIMUM_LOTTERY_NUMBER = 1; + public static final int MAXIMUM_LOTTERY_NUMBER = 45; + + public void validateRange(int number) { + if (!isInValidRange(number)) { + throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } + } + + private boolean isInValidRange(Integer number) { + return number >= MINIMUM_LOTTERY_NUMBER && number <= MAXIMUM_LOTTERY_NUMBER; + } +} diff --git a/src/main/java/domain/value/ManualNumbersGenerator.java b/src/main/java/domain/value/ManualNumbersGenerator.java new file mode 100644 index 0000000..903a184 --- /dev/null +++ b/src/main/java/domain/value/ManualNumbersGenerator.java @@ -0,0 +1,70 @@ +package domain.value; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import ui.message.ExceptionMessage; + +public class ManualNumbersGenerator extends LotteryNumberRange { + private static final String CHARACTERS_CONTAINING_NUMBER_COMMA = "^[0-9,\\s]+$"; + private static final int SIZE_OF_NUMBERS = 6; + private static final String DELIMITER = ","; + private static final String CHARACTER_BEFORE_REPLACING = " "; + private static final String CHARACTER_AFTER_REPLACING = ""; + + private final List manualNumbers; + + public ManualNumbersGenerator(String manualNumbers) { + validateOtherCharacterSymbols(manualNumbers); + this.manualNumbers = splitWinningNumbers(manualNumbers); + validateSplitInput(); + } + + private void validateOtherCharacterSymbols(String input) { + if (!Pattern.matches(CHARACTERS_CONTAINING_NUMBER_COMMA, input)) { + throw new IllegalArgumentException(ExceptionMessage.INPUT_ONLY_NUMBERS_AND_COMMA.getMessage()); + } + } + + private List splitWinningNumbers(String input) { + return Arrays.stream(input.replaceAll(CHARACTER_BEFORE_REPLACING, CHARACTER_AFTER_REPLACING) + .split(DELIMITER)) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + private void validateSplitInput() { + validateSizeOfWinningNumbers(); + validateRangeOfLotteryNumbers(); + validateDuplicateWinningNumbers(); + } + + private void validateSizeOfWinningNumbers() { + if (manualNumbers.size() != SIZE_OF_NUMBERS) { + throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); + } + } + + private void validateRangeOfLotteryNumbers() { + manualNumbers.forEach(super::validateRange); + } + + private void validateDuplicateWinningNumbers() { + Set numbers = new HashSet<>(manualNumbers); + if (numbers.size() != SIZE_OF_NUMBERS) { + throw new IllegalArgumentException(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); + } + } + + public boolean contains(int numberToCompare) { + return manualNumbers.contains(numberToCompare); + } + + public List getManualNumbers() { + return manualNumbers; + } +} diff --git a/src/main/java/domain/value/PurchasePrice.java b/src/main/java/domain/value/PurchasePrice.java index bcc14be..9f9eff7 100644 --- a/src/main/java/domain/value/PurchasePrice.java +++ b/src/main/java/domain/value/PurchasePrice.java @@ -1,17 +1,27 @@ package domain.value; -import domain.value.validator.PurchasePriceValidator; +import ui.message.ExceptionMessage; public class PurchasePrice { + private static final int PRICE_OF_ONE_LOTTERY_TICKET = 1000; + private final int purchasePrice; - private final PurchasePriceValidator purchasePriceValidator; public PurchasePrice(int purchasePrice) { - purchasePriceValidator = new PurchasePriceValidator(); - purchasePriceValidator.validateSmallerThanPurchasePrice(purchasePrice); + validateSmallerThanPurchasePrice(); this.purchasePrice = purchasePrice; } + private void validateSmallerThanPurchasePrice() { + if (purchasePrice < PRICE_OF_ONE_LOTTERY_TICKET) { + throw new IllegalArgumentException(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); + } + } + + public int getPurchasedCount() { + return purchasePrice / PRICE_OF_ONE_LOTTERY_TICKET; + } + public int getPurchasePrice() { return purchasePrice; } diff --git a/src/main/java/domain/value/WinningNumbers.java b/src/main/java/domain/value/WinningNumbers.java deleted file mode 100644 index 436569b..0000000 --- a/src/main/java/domain/value/WinningNumbers.java +++ /dev/null @@ -1,47 +0,0 @@ -package domain.value; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import domain.value.validator.WinningNumbersValidator; - -public class WinningNumbers { - private static final String COMMA = ","; - private static final String BLANK = " "; - private static final String EMPTY_STRING = ""; - - private final List winningNumbers; - private final WinningNumbersValidator validator; - - public WinningNumbers(String winningNumbers) { - validator = new WinningNumbersValidator(); - this.winningNumbers = splitWinningNumbers(winningNumbers); - } - - private List splitWinningNumbers(String input) { - validator.validateOtherCharacterSymbols(input); - - List splitInput = Arrays.stream(input.replaceAll(BLANK, EMPTY_STRING) - .split(COMMA)) - .map(Integer::parseInt) - .collect(Collectors.toList()); - - validateSplitInput(splitInput); - return splitInput; - } - - private void validateSplitInput(List splitInput) { - validator.validateSizeOfWinningNumbers(splitInput); - validator.validateRangeOfWinningNumbers(splitInput); - validator.validateDuplicateWinningNumbers(splitInput); - } - - public boolean contains(int numberToCompare) { - return winningNumbers.contains(numberToCompare); - } - - public List getWinningNumbers() { - return winningNumbers; - } -} diff --git a/src/main/java/domain/value/validator/BonusNumberValidator.java b/src/main/java/domain/value/validator/BonusNumberValidator.java deleted file mode 100644 index 7118555..0000000 --- a/src/main/java/domain/value/validator/BonusNumberValidator.java +++ /dev/null @@ -1,20 +0,0 @@ -package domain.value.validator; - -import domain.lotteryStore.TargetNumbers; -import domain.value.WinningNumbers; -import ui.message.ExceptionMessage; - -public class BonusNumberValidator { - public void validateRangeOfBonusNumber(int bonusNumber) { - if (bonusNumber < TargetNumbers.MINIMUM_LOTTERY_NUMBER || bonusNumber > TargetNumbers.MAXIMUM_LOTTERY_NUMBER) { - throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); - } - } - - public void validateBonusNumber(int bonusNumber, WinningNumbers winningNumbers) { - if (winningNumbers.contains(bonusNumber)) { - throw new IllegalArgumentException( - ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); - } - } -} diff --git a/src/main/java/domain/value/validator/WinningNumbersValidator.java b/src/main/java/domain/value/validator/WinningNumbersValidator.java deleted file mode 100644 index ece3f66..0000000 --- a/src/main/java/domain/value/validator/WinningNumbersValidator.java +++ /dev/null @@ -1,41 +0,0 @@ -package domain.value.validator; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.regex.Pattern; - -import domain.lotteryStore.TargetNumbers; -import ui.message.ExceptionMessage; - -public class WinningNumbersValidator { - private static final String CHARACTERS_CONTAINING_NUMBER_COMMA = "^[0-9,\\s]+$"; - private static final int SIZE_OF_WINNING_NUMBERS = 6; - - public void validateOtherCharacterSymbols(String input) { - if (!Pattern.matches(CHARACTERS_CONTAINING_NUMBER_COMMA, input)) { - throw new IllegalArgumentException(ExceptionMessage.INPUT_ONLY_NUMBERS_AND_COMMA.getMessage()); - } - } - - public void validateSizeOfWinningNumbers(List splitWinningNumbers) { - if (splitWinningNumbers.size() != SIZE_OF_WINNING_NUMBERS) { - throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); - } - } - - public void validateRangeOfWinningNumbers(List splitWinningNumbers) { - if (splitWinningNumbers.stream() - .anyMatch(winningNumber -> winningNumber < TargetNumbers.MINIMUM_LOTTERY_NUMBER - || winningNumber > TargetNumbers.MAXIMUM_LOTTERY_NUMBER)) { - throw new IllegalArgumentException(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); - } - } - - public void validateDuplicateWinningNumbers(List splitWinningNumbers) { - Set numbers = new HashSet<>(splitWinningNumbers); - if (numbers.size() != SIZE_OF_WINNING_NUMBERS) { - throw new IllegalArgumentException(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); - } - } -} diff --git a/src/main/java/domain/winningStatistics/LotteryComparator.java b/src/main/java/domain/winningStatistics/LotteryComparator.java index 67a90a2..c5a73ec 100644 --- a/src/main/java/domain/winningStatistics/LotteryComparator.java +++ b/src/main/java/domain/winningStatistics/LotteryComparator.java @@ -3,26 +3,26 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; import domain.value.BonusNumber; -import domain.value.WinningNumbers; +import domain.value.ManualNumbersGenerator; public class LotteryComparator { private final WinningStatistics winningStatistics = new WinningStatistics(); - public void compareNumbers(WinningNumbers winningNumbers, BonusNumber bonusNumber, Lotteries lotteries, - int purchasedCount) { - for (int i = 0; i < purchasedCount; i++) { + public void compareNumbers(ManualNumbersGenerator winningNumbers, BonusNumber bonusNumber, Lotteries lotteries) { + for (int i = 0; i < lotteries.size(); i++) { ComparisonResult comparisonResult = compareOneTicketNumbers(winningNumbers, bonusNumber, lotteries.get(i)); winningStatistics.checkRanking(comparisonResult); } } - public ComparisonResult compareOneTicketNumbers(WinningNumbers winningNumbers, BonusNumber bonusNumber, + public ComparisonResult compareOneTicketNumbers(ManualNumbersGenerator winningNumbers, BonusNumber bonusNumber, Lottery lottery) { - return new ComparisonResult(getCountOfMatchingWinningNumbers(lottery, winningNumbers), - hasBonusNumber(lottery, bonusNumber)); + int countOfMatchingNumbers = getCountOfMatchingWinningNumbers(lottery, winningNumbers); + boolean hasBonusNumber = hasBonusNumber(lottery, bonusNumber); + return new ComparisonResult(countOfMatchingNumbers, hasBonusNumber); } - private int getCountOfMatchingWinningNumbers(Lottery lottery, WinningNumbers winningNumbers) { + private int getCountOfMatchingWinningNumbers(Lottery lottery, ManualNumbersGenerator winningNumbers) { return lottery.getNumbers().countMatchingNumbers(winningNumbers); } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 0f1d964..45e72fe 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -3,21 +3,17 @@ import java.util.List; import domain.lotteryStore.Lotteries; -import domain.value.PurchasePrice; import domain.winningStatistics.PrizeMoney; import domain.winningStatistics.WinningStatistics; import ui.message.OutputMessage; public class Printer { - private static final int PRICE_OF_ONE_LOTTERY_TICKET = 1000; private static final int SIZE_OF_LOTTERY_RANK = 5; private static final int WIN_WITH_BONUS_NUMBER = 3; private static final String LIMIT_OF_DECIMAL_PLACE = "%.2f"; - public int printPurchasedCount(PurchasePrice purchasePrice) { - int purchasedCount = purchasePrice.getPurchasePrice() / PRICE_OF_ONE_LOTTERY_TICKET; + public void printPurchasedCount(int purchasedCount) { System.out.println(purchasedCount + OutputMessage.PURCHASED_COUNT.getMessage()); - return purchasedCount; } public void printPurchasedLotteries(Lotteries lotteries) { diff --git a/src/test/java/domain/validator/PurchasePriceValidatorTest.java b/src/test/java/domain/validator/PurchasePriceValidatorTest.java deleted file mode 100644 index e1010d5..0000000 --- a/src/test/java/domain/validator/PurchasePriceValidatorTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package domain.validator; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import domain.value.validator.PurchasePriceValidator; -import ui.message.ExceptionMessage; - -class PurchasePriceValidatorTest { - private PurchasePriceValidator purchasePriceValidator; - - @BeforeEach - void setUp() { - purchasePriceValidator = new PurchasePriceValidator(); - } - - @Test - public void 최소_입력값을_만족하는지_검증한다() { - //given - int purchasePrice = 60; - - //then - Assertions.assertThatThrownBy(() -> purchasePriceValidator.validateSmallerThanPurchasePrice(purchasePrice)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/domain/validator/WinningNumbersValidatorTest.java b/src/test/java/domain/validator/WinningNumbersValidatorTest.java deleted file mode 100644 index 5e4e911..0000000 --- a/src/test/java/domain/validator/WinningNumbersValidatorTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package domain.validator; - -import java.util.ArrayList; -import java.util.List; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import domain.value.validator.WinningNumbersValidator; -import ui.message.ExceptionMessage; - -public class WinningNumbersValidatorTest { - private WinningNumbersValidator winningNumbersValidator; - - @BeforeEach - void setUp() { - winningNumbersValidator = new WinningNumbersValidator(); - } - - @Test - public void 숫자와_콤마_이외의_값을_검증한다() { - //given - String input = "Hello"; - - //then - Assertions.assertThatThrownBy(() -> winningNumbersValidator.validateOtherCharacterSymbols(input)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining(ExceptionMessage.INPUT_ONLY_NUMBERS_AND_COMMA.getMessage()); - } - - @Test - public void 당첨번호_갯수를_검증한다() { - //given - List splitWinningNumbers = new ArrayList<>(); - splitWinningNumbers.add(1); - splitWinningNumbers.add(2); - splitWinningNumbers.add(3); - splitWinningNumbers.add(4); - splitWinningNumbers.add(5); - - //then - Assertions.assertThatThrownBy(() -> winningNumbersValidator.validateSizeOfWinningNumbers(splitWinningNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining(ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); - } - - @Test - public void 입력_범위안에_들어오는지_검증한다() { - //given - List splitWinningNumbers = new ArrayList<>(); - splitWinningNumbers.add(46); - splitWinningNumbers.add(2); - splitWinningNumbers.add(3); - splitWinningNumbers.add(4); - splitWinningNumbers.add(5); - splitWinningNumbers.add(6); - - //then - Assertions.assertThatThrownBy(() -> winningNumbersValidator.validateRangeOfWinningNumbers(splitWinningNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); - } - - @Test - public void 중복_입력된_수를_검증한다() { - //given - List splitWinningNumbers = new ArrayList<>(); - splitWinningNumbers.add(1); - splitWinningNumbers.add(1); - splitWinningNumbers.add(3); - splitWinningNumbers.add(4); - splitWinningNumbers.add(5); - splitWinningNumbers.add(6); - - //then - Assertions.assertThatThrownBy( - () -> winningNumbersValidator.validateDuplicateWinningNumbers(splitWinningNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); - } -} diff --git a/src/test/java/domain/validator/BonusNumberValidatorTest.java b/src/test/java/domain/value/BonusNumberTest.java similarity index 51% rename from src/test/java/domain/validator/BonusNumberValidatorTest.java rename to src/test/java/domain/value/BonusNumberTest.java index 4486a12..0250bc6 100644 --- a/src/test/java/domain/validator/BonusNumberValidatorTest.java +++ b/src/test/java/domain/value/BonusNumberTest.java @@ -1,28 +1,19 @@ -package domain.validator; +package domain.value; import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import domain.value.WinningNumbers; -import domain.value.validator.BonusNumberValidator; import ui.message.ExceptionMessage; -public class BonusNumberValidatorTest { - private BonusNumberValidator bonusNumberValidator; - - @BeforeEach - void setUp() { - bonusNumberValidator = new BonusNumberValidator(); - } - +public class BonusNumberTest { @Test public void 범위_초과하는_수를_검증한다() { //given int bonusNumber = 46; + ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator("1, 2, 3, 4, 5, 6"); //then - Assertions.assertThatThrownBy(() -> bonusNumberValidator.validateRangeOfBonusNumber(bonusNumber)) + Assertions.assertThatThrownBy(() -> new BonusNumber(bonusNumber, winningNumbers)) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); } @@ -30,11 +21,11 @@ void setUp() { @Test public void 중복을_검사한다() { //given - WinningNumbers winningNumbers = new WinningNumbers("1, 2, 3, 4, 5, 6"); int bonusNumber = 6; + ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator("1, 2, 3, 4, 5, 6"); //then - Assertions.assertThatThrownBy(() -> bonusNumberValidator.validateBonusNumber(bonusNumber, winningNumbers)) + Assertions.assertThatThrownBy(() -> new BonusNumber(bonusNumber, winningNumbers)) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining(ExceptionMessage.BONUS_NUMBER_CANNOT_EQUAL_WINNING_NUMBERS.getMessage()); } diff --git a/src/test/java/domain/value/LotteryNumberRangeTest.java b/src/test/java/domain/value/LotteryNumberRangeTest.java new file mode 100644 index 0000000..1f69112 --- /dev/null +++ b/src/test/java/domain/value/LotteryNumberRangeTest.java @@ -0,0 +1,25 @@ +package domain.value; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import ui.message.ExceptionMessage; + +class LotteryNumberRangeTest { + private LotteryNumberRange lotteryNumberRange; + + @BeforeEach + void setUp() { + lotteryNumberRange = new LotteryNumberRange(); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 0, 46, 47, 52, 55}) + public void 입력_범위안에_들어오는지_검증한다(int invalidNumber) { + Assertions.assertThatThrownBy(() -> lotteryNumberRange.validateRange(invalidNumber)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/domain/value/ManualNumbersGeneratorTest.java b/src/test/java/domain/value/ManualNumbersGeneratorTest.java new file mode 100644 index 0000000..2b085ee --- /dev/null +++ b/src/test/java/domain/value/ManualNumbersGeneratorTest.java @@ -0,0 +1,41 @@ +package domain.value; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import ui.message.ExceptionMessage; + +class ManualNumbersGeneratorTest { + @ParameterizedTest + @ValueSource(strings = {"Hello", "3 2 ; 3", "#0, 3"}) + public void 숫자와_콤마_이외의_값을_검증한다(String invalidInput) { + Assertions.assertThatThrownBy(() -> new ManualNumbersGenerator(invalidInput)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.INPUT_ONLY_NUMBERS_AND_COMMA.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {"1, 2, 3, 4, 5", "1, 2, 3, 4", "1, 2, 3,", "1, 2", "1", "1, 2, 3, 4, 5, 6, 7"}) + public void 당첨번호_갯수를_검증한다(String invalidInput) { + Assertions.assertThatThrownBy(() -> new ManualNumbersGenerator(invalidInput)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.MUST_INPUT_SIX_WINNING_NUMBERS.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {"1, 1, 3, 4, 5, 6", "42, 1,34, 26,34, 19"}) + public void 중복_입력된_수를_검증한다(String invalidInput) { + Assertions.assertThatThrownBy(() -> new ManualNumbersGenerator(invalidInput)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.DUPLICATE_NUMBERS.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {"1, 2, 3, 4, 67, 6", "2, 1, 0, 26, 34, 19"}) + public void 입력_범위안에_들어오는지_검증한다(String invalidInput) { + Assertions.assertThatThrownBy(() -> new ManualNumbersGenerator(invalidInput)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.MUST_INPUT_NUMBERS_IN_VALID_RANGE.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/domain/value/PurchasePriceTest.java b/src/test/java/domain/value/PurchasePriceTest.java new file mode 100644 index 0000000..a97624e --- /dev/null +++ b/src/test/java/domain/value/PurchasePriceTest.java @@ -0,0 +1,19 @@ +package domain.value; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import ui.message.ExceptionMessage; + +class PurchasePriceTest { + @Test + public void 최소_입력값을_만족하는지_검증한다() { + //given + int purchasePrice = 900; + + //then + Assertions.assertThatThrownBy(() -> new PurchasePrice(purchasePrice)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/domain/winningStatistics/LotteryComparatorTest.java b/src/test/java/domain/winningStatistics/LotteryComparatorTest.java index 919c07e..ff60291 100644 --- a/src/test/java/domain/winningStatistics/LotteryComparatorTest.java +++ b/src/test/java/domain/winningStatistics/LotteryComparatorTest.java @@ -11,11 +11,11 @@ import domain.lotteryStore.Lottery; import domain.lotteryStore.Numbers; import domain.value.BonusNumber; -import domain.value.WinningNumbers; +import domain.value.ManualNumbersGenerator; class LotteryComparatorTest { - private final WinningNumbers winningNumbers = new WinningNumbers("1, 2, 3, 4, 5, 6"); + private final ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator("1, 2, 3, 4, 5, 6"); private final BonusNumber bonusNumber = new BonusNumber(7, winningNumbers); private final Lotteries lotteries = new Lotteries(Arrays.asList( new Lottery(new Numbers(Arrays.asList(8, 2, 23, 41, 4, 5))), @@ -51,7 +51,7 @@ class LotteryComparatorTest { int purchasedCount = 6; //when - lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries, purchasedCount); + lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries); WinningStatistics winningStatistics = lotteryComparator.getWinningStatistics(); List rankings = winningStatistics.getRankings(); From 1773b1540ecc898ddc434431697b5d067797c85c Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Tue, 6 Apr 2021 22:52:47 +0900 Subject: [PATCH 26/44] =?UTF-8?q?feat:=20=EC=88=98=EB=8F=99=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B5=AC=EB=A7=A4=ED=95=A0=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=88=98=EC=99=80=20=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=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 --- README.md | 4 ++-- src/main/java/Application.java | 6 +++++- src/main/java/domain/value/PurchasePrice.java | 4 ++-- src/main/java/ui/Printer.java | 5 +++-- src/main/java/ui/Receiver.java | 18 +++++++++++++++--- src/main/java/ui/message/OutputMessage.java | 2 +- 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 82177dd..92de8cd 100644 --- a/README.md +++ b/README.md @@ -138,8 +138,8 @@ ___ ### 2단계 기능 목록 - [x] 숫자를 가진 클래스 분류 -- [ ] 수동으로 구매할 로또 수 입력 -- [ ] 수동으로 구매할 번호 입력 +- [x] 수동으로 구매할 로또 수 입력 +- [x] 수동으로 구매할 번호 입력 - [ ] 수동 로또 생성 - [ ] Printer %s, %f 사용 - [ ] LotteryComparator를 Lotteries로 합칠 것이냐 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 8c993bf..438fc5e 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,3 +1,5 @@ +import java.util.List; + import domain.lotteryStore.Lotteries; import domain.lotteryStore.LotteryStore; import domain.value.BonusNumber; @@ -16,7 +18,9 @@ public static void main(String[] args) { PurchasePrice purchasePrice = new PurchasePrice(receiver.receivePurchasePrice()); int purchasedCount = purchasePrice.getPurchasedCount(); - printer.printPurchasedCount(purchasedCount); + int manualCount = receiver.receiveManualCount(); + List manualNumbers = receiver.receiveManualNumbers(manualCount); + printer.printPurchasedCount(manualCount, purchasedCount); LotteryStore lotteryStore = new LotteryStore(); Lotteries lotteries = lotteryStore.createLotteries(purchasedCount); diff --git a/src/main/java/domain/value/PurchasePrice.java b/src/main/java/domain/value/PurchasePrice.java index 9f9eff7..577d410 100644 --- a/src/main/java/domain/value/PurchasePrice.java +++ b/src/main/java/domain/value/PurchasePrice.java @@ -8,11 +8,11 @@ public class PurchasePrice { private final int purchasePrice; public PurchasePrice(int purchasePrice) { - validateSmallerThanPurchasePrice(); + validateSmallerThanPurchasePrice(purchasePrice); this.purchasePrice = purchasePrice; } - private void validateSmallerThanPurchasePrice() { + private void validateSmallerThanPurchasePrice(int purchasePrice) { if (purchasePrice < PRICE_OF_ONE_LOTTERY_TICKET) { throw new IllegalArgumentException(ExceptionMessage.MUST_BUY_MORE_THAN_ONE_TICKET.getMessage()); } diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 45e72fe..7cd861f 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -12,8 +12,9 @@ public class Printer { private static final int WIN_WITH_BONUS_NUMBER = 3; private static final String LIMIT_OF_DECIMAL_PLACE = "%.2f"; - public void printPurchasedCount(int purchasedCount) { - System.out.println(purchasedCount + OutputMessage.PURCHASED_COUNT.getMessage()); + public void printPurchasedCount(int manualCount, int purchasedCount) { + System.out.println( + String.format(OutputMessage.PURCHASED_COUNT.getMessage(), manualCount, purchasedCount - manualCount)); } public void printPurchasedLotteries(Lotteries lotteries) { diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/Receiver.java index 38520b7..8e492ef 100644 --- a/src/main/java/ui/Receiver.java +++ b/src/main/java/ui/Receiver.java @@ -1,5 +1,7 @@ package ui; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; import ui.message.InputMessage; @@ -12,10 +14,20 @@ public int receivePurchasePrice() { return SCANNER.nextInt(); } - public String receiveWinningNumbers() { - System.out.println(InputMessage.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); + public int receiveManualCount() { + System.out.println(InputMessage.INPUT_MANUAL_COUNT.getMessage()); SCANNER.nextLine(); - return SCANNER.nextLine(); + return SCANNER.nextInt(); + } + + public List receiveManualNumbers(int manualCount) { + System.out.println(InputMessage.INPUT_MANUAL_NUMBERS.getMessage()); + SCANNER.nextLine(); + List inputManualNumbers = new ArrayList<>(); + for (int i = 0; i < manualCount; i++) { + inputManualNumbers.add(SCANNER.nextLine()); + } + return inputManualNumbers; } public int receiveBonusNumber() { diff --git a/src/main/java/ui/message/OutputMessage.java b/src/main/java/ui/message/OutputMessage.java index 1d4485a..ca742b9 100644 --- a/src/main/java/ui/message/OutputMessage.java +++ b/src/main/java/ui/message/OutputMessage.java @@ -1,7 +1,7 @@ package ui.message; public enum OutputMessage { - PURCHASED_COUNT("개를 구매했습니다."), + PURCHASED_COUNT("\n수동으로 %d장, 자동으로 %d개를 구매했습니다."), WINNING_STATISTICS("\n당첨 통계\n"), BOUNDARY_LINE("---------\n"), MATCH_COUNT("개 일치 ("), From 9036fc97be62a23dc205f42cc10b32fbbc20e922 Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Tue, 6 Apr 2021 23:12:29 +0900 Subject: [PATCH 27/44] =?UTF-8?q?feat:=20=EC=88=98=EB=8F=99=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EC=9D=80=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A1=9C=20=EC=88=98=EB=8F=99=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/Application.java | 2 +- .../domain/lotteryStore/LotteryStore.java | 33 ++++++++++++++++--- src/main/java/ui/Receiver.java | 6 ++++ src/main/java/ui/message/InputMessage.java | 2 ++ .../domain/lotteryStore/LotteryStoreTest.java | 4 ++- 6 files changed, 41 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 92de8cd..ba0b15a 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ ___ - [x] 숫자를 가진 클래스 분류 - [x] 수동으로 구매할 로또 수 입력 - [x] 수동으로 구매할 번호 입력 - - [ ] 수동 로또 생성 + - [x] 수동 로또 생성 - [ ] Printer %s, %f 사용 - [ ] LotteryComparator를 Lotteries로 합칠 것이냐 - [ ] PrizeMoney로 당첨 횟수 세기 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 438fc5e..00f289f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -23,7 +23,7 @@ public static void main(String[] args) { printer.printPurchasedCount(manualCount, purchasedCount); LotteryStore lotteryStore = new LotteryStore(); - Lotteries lotteries = lotteryStore.createLotteries(purchasedCount); + Lotteries lotteries = lotteryStore.createLotteries(purchasedCount, manualCount, manualNumbers); printer.printPurchasedLotteries(lotteries); ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator(receiver.receiveWinningNumbers()); diff --git a/src/main/java/domain/lotteryStore/LotteryStore.java b/src/main/java/domain/lotteryStore/LotteryStore.java index d21e721..7af3956 100644 --- a/src/main/java/domain/lotteryStore/LotteryStore.java +++ b/src/main/java/domain/lotteryStore/LotteryStore.java @@ -3,18 +3,41 @@ import java.util.ArrayList; import java.util.List; +import domain.value.ManualNumbersGenerator; + public class LotteryStore { private final AutoNumbersGenerator autoNumbersGenerator = new AutoNumbersGenerator(); - public Lotteries createLotteries(int count) { + public Lotteries createLotteries(int purchasedCount, int manualCount, List manualNumbers) { List lotteries = new ArrayList<>(); - while (count-- > 0) { - lotteries.add(createLottery()); - } + List manualLotteries = makeManualLotteries(manualCount, manualNumbers); + List autoLotteries = makeAutoLotteries(purchasedCount, manualCount); + + lotteries.addAll(manualLotteries); + lotteries.addAll(autoLotteries); + return new Lotteries(lotteries); } - private Lottery createLottery() { + private List makeManualLotteries(int manualCount, List manualNumbers) { + List manualLotteries = new ArrayList<>(); + for (int i = 0; i < manualCount; i++) { + Numbers numbers = new Numbers(new ManualNumbersGenerator(manualNumbers.get(i)).getManualNumbers()); + manualLotteries.add(new Lottery(numbers)); + } + return manualLotteries; + } + + private List makeAutoLotteries(int purchasedCount, int manualCount) { + List autoLotteries = new ArrayList<>(); + int autoCount = purchasedCount - manualCount; + while (autoCount-- > 0) { + autoLotteries.add(makeAutoLottery()); + } + return autoLotteries; + } + + private Lottery makeAutoLottery() { autoNumbersGenerator.shuffle(); Numbers numbers = new Numbers(autoNumbersGenerator.getSixNumbersFromTheFront()); return new Lottery(numbers); diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/Receiver.java index 8e492ef..60e1606 100644 --- a/src/main/java/ui/Receiver.java +++ b/src/main/java/ui/Receiver.java @@ -30,6 +30,12 @@ public List receiveManualNumbers(int manualCount) { return inputManualNumbers; } + public String receiveWinningNumbers() { + System.out.println(InputMessage.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); + SCANNER.nextLine(); + return SCANNER.nextLine(); + } + public int receiveBonusNumber() { System.out.println(InputMessage.INPUT_BONUS_BALL.getMessage()); return SCANNER.nextInt(); diff --git a/src/main/java/ui/message/InputMessage.java b/src/main/java/ui/message/InputMessage.java index 0725533..4426b85 100644 --- a/src/main/java/ui/message/InputMessage.java +++ b/src/main/java/ui/message/InputMessage.java @@ -2,6 +2,8 @@ public enum InputMessage { INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), + INPUT_MANUAL_COUNT("\n수동으로 구매할 번호를 입력해주세요."), + INPUT_MANUAL_NUMBERS("\n수동으로 구매할 번호를 입력해 주세요."), INPUT_LAST_WEEK_WINNING_NUMBERS("\n지난 주 당첨 번호를 입력해 주세요."), INPUT_BONUS_BALL("보너스 볼을 입력해 주세요."); diff --git a/src/test/java/domain/lotteryStore/LotteryStoreTest.java b/src/test/java/domain/lotteryStore/LotteryStoreTest.java index 861d690..057424d 100644 --- a/src/test/java/domain/lotteryStore/LotteryStoreTest.java +++ b/src/test/java/domain/lotteryStore/LotteryStoreTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.*; +import java.util.ArrayList; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -20,7 +22,7 @@ void setUp() { int sizeOfLottery = 6; //when - Lotteries lotteries = lotteryStore.createLotteries(1); + Lotteries lotteries = lotteryStore.createLotteries(1, 0, new ArrayList<>()); //then assertThat(lotteries.getLotteries().get(0).getNumbers().getNumbers().size()).isEqualTo(sizeOfLottery); From 2cb46c77251545ea72907d108d19d05d31f80a9b Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Tue, 6 Apr 2021 23:54:39 +0900 Subject: [PATCH 28/44] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD,=20=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=ED=86=B5=EA=B3=84=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20Application=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- src/main/java/Application.java | 26 ++++++++++++++----- .../java/domain/lotteryStore/Lottery.java | 2 ++ .../domain/lotteryStore/LotteryStore.java | 11 ++++---- .../PurchasePrice.java | 2 +- .../{ => numbers}/AutoNumbersGenerator.java | 4 +-- .../numbers}/BonusNumber.java | 2 +- .../numbers}/LotteryNumberRange.java | 2 +- .../numbers}/ManualNumbersGenerator.java | 2 +- .../lotteryStore/{ => numbers}/Numbers.java | 4 +-- .../winningStatistics/LotteryComparator.java | 4 +-- src/main/java/ui/Printer.java | 19 +++++--------- src/main/java/ui/message/OutputMessage.java | 12 +++------ .../java/domain/value/BonusNumberTest.java | 2 ++ .../domain/value/LotteryNumberRangeTest.java | 1 + .../value/ManualNumbersGeneratorTest.java | 1 + .../java/domain/value/PurchasePriceTest.java | 1 + .../LotteryComparatorTest.java | 6 ++--- 18 files changed, 55 insertions(+), 49 deletions(-) rename src/main/java/domain/{value => lotteryStore}/PurchasePrice.java (96%) rename src/main/java/domain/lotteryStore/{ => numbers}/AutoNumbersGenerator.java (91%) rename src/main/java/domain/{value => lotteryStore/numbers}/BonusNumber.java (95%) rename src/main/java/domain/{value => lotteryStore/numbers}/LotteryNumberRange.java (93%) rename src/main/java/domain/{value => lotteryStore/numbers}/ManualNumbersGenerator.java (98%) rename src/main/java/domain/lotteryStore/{ => numbers}/Numbers.java (89%) diff --git a/README.md b/README.md index ba0b15a..45e8f54 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ ___ - [x] 수동으로 구매할 로또 수 입력 - [x] 수동으로 구매할 번호 입력 - [x] 수동 로또 생성 -- [ ] Printer %s, %f 사용 +- [x] Printer %s, %f 사용 - [ ] LotteryComparator를 Lotteries로 합칠 것이냐 - [ ] PrizeMoney로 당첨 횟수 세기 @@ -177,4 +177,3 @@ ___ - 범위 검증 필요 - [x] BonusNumber: 1개 - 범위 검증 필요 - \ No newline at end of file diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 00f289f..57740bf 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -2,9 +2,9 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.LotteryStore; -import domain.value.BonusNumber; -import domain.value.ManualNumbersGenerator; -import domain.value.PurchasePrice; +import domain.lotteryStore.PurchasePrice; +import domain.lotteryStore.numbers.BonusNumber; +import domain.lotteryStore.numbers.ManualNumbersGenerator; import domain.winningStatistics.LotteryComparator; import domain.winningStatistics.PrizeMoney; import domain.winningStatistics.WinningStatistics; @@ -12,24 +12,36 @@ import ui.Receiver; public class Application { + private final Receiver receiver; + private final Printer printer; + private final LotteryStore lotteryStore; + private final LotteryComparator lotteryComparator; + + public Application() { + lotteryStore = new LotteryStore(); + lotteryComparator = new LotteryComparator(); + receiver = new Receiver(); + printer = new Printer(); + } + public static void main(String[] args) { - Receiver receiver = new Receiver(); - Printer printer = new Printer(); + Application application = new Application(); + application.run(); + } + public void run() { PurchasePrice purchasePrice = new PurchasePrice(receiver.receivePurchasePrice()); int purchasedCount = purchasePrice.getPurchasedCount(); int manualCount = receiver.receiveManualCount(); List manualNumbers = receiver.receiveManualNumbers(manualCount); printer.printPurchasedCount(manualCount, purchasedCount); - LotteryStore lotteryStore = new LotteryStore(); Lotteries lotteries = lotteryStore.createLotteries(purchasedCount, manualCount, manualNumbers); printer.printPurchasedLotteries(lotteries); ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator(receiver.receiveWinningNumbers()); BonusNumber bonusNumber = new BonusNumber(receiver.receiveBonusNumber(), winningNumbers); - LotteryComparator lotteryComparator = new LotteryComparator(); lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries); WinningStatistics winningStatistics = lotteryComparator.getWinningStatistics(); diff --git a/src/main/java/domain/lotteryStore/Lottery.java b/src/main/java/domain/lotteryStore/Lottery.java index c02c9fb..11bcb84 100644 --- a/src/main/java/domain/lotteryStore/Lottery.java +++ b/src/main/java/domain/lotteryStore/Lottery.java @@ -1,5 +1,7 @@ package domain.lotteryStore; +import domain.lotteryStore.numbers.Numbers; + public class Lottery { private final Numbers numbers; diff --git a/src/main/java/domain/lotteryStore/LotteryStore.java b/src/main/java/domain/lotteryStore/LotteryStore.java index 7af3956..9d6df26 100644 --- a/src/main/java/domain/lotteryStore/LotteryStore.java +++ b/src/main/java/domain/lotteryStore/LotteryStore.java @@ -3,11 +3,11 @@ import java.util.ArrayList; import java.util.List; -import domain.value.ManualNumbersGenerator; +import domain.lotteryStore.numbers.AutoNumbersGenerator; +import domain.lotteryStore.numbers.ManualNumbersGenerator; +import domain.lotteryStore.numbers.Numbers; public class LotteryStore { - private final AutoNumbersGenerator autoNumbersGenerator = new AutoNumbersGenerator(); - public Lotteries createLotteries(int purchasedCount, int manualCount, List manualNumbers) { List lotteries = new ArrayList<>(); List manualLotteries = makeManualLotteries(manualCount, manualNumbers); @@ -29,15 +29,16 @@ private List makeManualLotteries(int manualCount, List manualNu } private List makeAutoLotteries(int purchasedCount, int manualCount) { + AutoNumbersGenerator autoNumbersGenerator = new AutoNumbersGenerator(); List autoLotteries = new ArrayList<>(); int autoCount = purchasedCount - manualCount; while (autoCount-- > 0) { - autoLotteries.add(makeAutoLottery()); + autoLotteries.add(makeAutoLottery(autoNumbersGenerator)); } return autoLotteries; } - private Lottery makeAutoLottery() { + private Lottery makeAutoLottery(AutoNumbersGenerator autoNumbersGenerator) { autoNumbersGenerator.shuffle(); Numbers numbers = new Numbers(autoNumbersGenerator.getSixNumbersFromTheFront()); return new Lottery(numbers); diff --git a/src/main/java/domain/value/PurchasePrice.java b/src/main/java/domain/lotteryStore/PurchasePrice.java similarity index 96% rename from src/main/java/domain/value/PurchasePrice.java rename to src/main/java/domain/lotteryStore/PurchasePrice.java index 577d410..a192ff1 100644 --- a/src/main/java/domain/value/PurchasePrice.java +++ b/src/main/java/domain/lotteryStore/PurchasePrice.java @@ -1,4 +1,4 @@ -package domain.value; +package domain.lotteryStore; import ui.message.ExceptionMessage; diff --git a/src/main/java/domain/lotteryStore/AutoNumbersGenerator.java b/src/main/java/domain/lotteryStore/numbers/AutoNumbersGenerator.java similarity index 91% rename from src/main/java/domain/lotteryStore/AutoNumbersGenerator.java rename to src/main/java/domain/lotteryStore/numbers/AutoNumbersGenerator.java index 2a365ec..79574da 100644 --- a/src/main/java/domain/lotteryStore/AutoNumbersGenerator.java +++ b/src/main/java/domain/lotteryStore/numbers/AutoNumbersGenerator.java @@ -1,12 +1,10 @@ -package domain.lotteryStore; +package domain.lotteryStore.numbers; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import domain.value.LotteryNumberRange; - public class AutoNumbersGenerator { private final List autoNumbers = new ArrayList<>(); diff --git a/src/main/java/domain/value/BonusNumber.java b/src/main/java/domain/lotteryStore/numbers/BonusNumber.java similarity index 95% rename from src/main/java/domain/value/BonusNumber.java rename to src/main/java/domain/lotteryStore/numbers/BonusNumber.java index d4c51c3..be26e63 100644 --- a/src/main/java/domain/value/BonusNumber.java +++ b/src/main/java/domain/lotteryStore/numbers/BonusNumber.java @@ -1,4 +1,4 @@ -package domain.value; +package domain.lotteryStore.numbers; import ui.message.ExceptionMessage; diff --git a/src/main/java/domain/value/LotteryNumberRange.java b/src/main/java/domain/lotteryStore/numbers/LotteryNumberRange.java similarity index 93% rename from src/main/java/domain/value/LotteryNumberRange.java rename to src/main/java/domain/lotteryStore/numbers/LotteryNumberRange.java index 0d89fc9..681d9c5 100644 --- a/src/main/java/domain/value/LotteryNumberRange.java +++ b/src/main/java/domain/lotteryStore/numbers/LotteryNumberRange.java @@ -1,4 +1,4 @@ -package domain.value; +package domain.lotteryStore.numbers; import ui.message.ExceptionMessage; diff --git a/src/main/java/domain/value/ManualNumbersGenerator.java b/src/main/java/domain/lotteryStore/numbers/ManualNumbersGenerator.java similarity index 98% rename from src/main/java/domain/value/ManualNumbersGenerator.java rename to src/main/java/domain/lotteryStore/numbers/ManualNumbersGenerator.java index 903a184..73ccb63 100644 --- a/src/main/java/domain/value/ManualNumbersGenerator.java +++ b/src/main/java/domain/lotteryStore/numbers/ManualNumbersGenerator.java @@ -1,4 +1,4 @@ -package domain.value; +package domain.lotteryStore.numbers; import java.util.Arrays; import java.util.HashSet; diff --git a/src/main/java/domain/lotteryStore/Numbers.java b/src/main/java/domain/lotteryStore/numbers/Numbers.java similarity index 89% rename from src/main/java/domain/lotteryStore/Numbers.java rename to src/main/java/domain/lotteryStore/numbers/Numbers.java index 8f2b50b..2813a33 100644 --- a/src/main/java/domain/lotteryStore/Numbers.java +++ b/src/main/java/domain/lotteryStore/numbers/Numbers.java @@ -1,10 +1,8 @@ -package domain.lotteryStore; +package domain.lotteryStore.numbers; import java.util.Collections; import java.util.List; -import domain.value.ManualNumbersGenerator; - public class Numbers { private final List numbers; diff --git a/src/main/java/domain/winningStatistics/LotteryComparator.java b/src/main/java/domain/winningStatistics/LotteryComparator.java index c5a73ec..7fd45a8 100644 --- a/src/main/java/domain/winningStatistics/LotteryComparator.java +++ b/src/main/java/domain/winningStatistics/LotteryComparator.java @@ -2,8 +2,8 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; -import domain.value.BonusNumber; -import domain.value.ManualNumbersGenerator; +import domain.lotteryStore.numbers.BonusNumber; +import domain.lotteryStore.numbers.ManualNumbersGenerator; public class LotteryComparator { private final WinningStatistics winningStatistics = new WinningStatistics(); diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 7cd861f..b6c53d5 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -29,8 +29,7 @@ public void printWinningStatistics(WinningStatistics winningStatistics) { PrizeMoney[] prizeMonies = PrizeMoney.values(); List sizeOfWinnersPerRank = winningStatistics.getRankings(); - builder.append(OutputMessage.WINNING_STATISTICS.getMessage()) - .append(OutputMessage.BOUNDARY_LINE.getMessage()); + builder.append(OutputMessage.WINNING_STATISTICS.getMessage()); for (int i = 0; i < SIZE_OF_LOTTERY_RANK; i++) { printWinningStatisticsDetails(builder, prizeMonies[i], sizeOfWinnersPerRank.get(i), i); } @@ -38,22 +37,18 @@ public void printWinningStatistics(WinningStatistics winningStatistics) { } private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney prizeMoney, Integer result, int i) { - builder.append(prizeMoney.getMatchingCount()); if (i == WIN_WITH_BONUS_NUMBER) { - builder.append(OutputMessage.MATCH_COUNT_BONUS.getMessage()); + builder.append( + String.format(OutputMessage.MATCH_COUNT_WITH_BONUS.getMessage(), prizeMoney.getMatchingCount(), + prizeMoney.getPrizeMoney(), result)); } if (i != WIN_WITH_BONUS_NUMBER) { - builder.append(OutputMessage.MATCH_COUNT.getMessage()); + builder.append(String.format(OutputMessage.MATCH_COUNT.getMessage(), prizeMoney.getMatchingCount(), + prizeMoney.getPrizeMoney(), result)); } - builder.append(prizeMoney.getPrizeMoney()) - .append(OutputMessage.WON.getMessage()) - .append(result) - .append(OutputMessage.COUNT.getMessage()); } public void printTotalEarningsRate(float totalEarningsRate) { - System.out.println( - OutputMessage.TOTAL_EARNINGS_RATE.getMessage() + String.format(LIMIT_OF_DECIMAL_PLACE, totalEarningsRate) - + OutputMessage.CLOSING_MENTION.getMessage()); + System.out.println(String.format(OutputMessage.TOTAL_EARNINGS_RATE.getMessage(), totalEarningsRate)); } } diff --git a/src/main/java/ui/message/OutputMessage.java b/src/main/java/ui/message/OutputMessage.java index ca742b9..4e451d0 100644 --- a/src/main/java/ui/message/OutputMessage.java +++ b/src/main/java/ui/message/OutputMessage.java @@ -2,14 +2,10 @@ public enum OutputMessage { PURCHASED_COUNT("\n수동으로 %d장, 자동으로 %d개를 구매했습니다."), - WINNING_STATISTICS("\n당첨 통계\n"), - BOUNDARY_LINE("---------\n"), - MATCH_COUNT("개 일치 ("), - MATCH_COUNT_BONUS("개 일치, 보너스 볼 일치("), - WON("원)- "), - COUNT("개\n"), - TOTAL_EARNINGS_RATE("총 수익률은 "), - CLOSING_MENTION("입니다.(1 기준)"); + WINNING_STATISTICS("\n당첨 통계\n---------\n"), + MATCH_COUNT("%d개 일치 (%d원)- %d개\n"), + MATCH_COUNT_WITH_BONUS("%d개 일치, 보너스 볼 일치 (%d원)- %d개\n"), + TOTAL_EARNINGS_RATE("총 수익률은 %.2f입니다.(1 기준)\n"); private String message; diff --git a/src/test/java/domain/value/BonusNumberTest.java b/src/test/java/domain/value/BonusNumberTest.java index 0250bc6..5d563fb 100644 --- a/src/test/java/domain/value/BonusNumberTest.java +++ b/src/test/java/domain/value/BonusNumberTest.java @@ -3,6 +3,8 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import domain.lotteryStore.numbers.BonusNumber; +import domain.lotteryStore.numbers.ManualNumbersGenerator; import ui.message.ExceptionMessage; public class BonusNumberTest { diff --git a/src/test/java/domain/value/LotteryNumberRangeTest.java b/src/test/java/domain/value/LotteryNumberRangeTest.java index 1f69112..2378c51 100644 --- a/src/test/java/domain/value/LotteryNumberRangeTest.java +++ b/src/test/java/domain/value/LotteryNumberRangeTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import domain.lotteryStore.numbers.LotteryNumberRange; import ui.message.ExceptionMessage; class LotteryNumberRangeTest { diff --git a/src/test/java/domain/value/ManualNumbersGeneratorTest.java b/src/test/java/domain/value/ManualNumbersGeneratorTest.java index 2b085ee..6a2deac 100644 --- a/src/test/java/domain/value/ManualNumbersGeneratorTest.java +++ b/src/test/java/domain/value/ManualNumbersGeneratorTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import domain.lotteryStore.numbers.ManualNumbersGenerator; import ui.message.ExceptionMessage; class ManualNumbersGeneratorTest { diff --git a/src/test/java/domain/value/PurchasePriceTest.java b/src/test/java/domain/value/PurchasePriceTest.java index a97624e..9c30956 100644 --- a/src/test/java/domain/value/PurchasePriceTest.java +++ b/src/test/java/domain/value/PurchasePriceTest.java @@ -3,6 +3,7 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import domain.lotteryStore.PurchasePrice; import ui.message.ExceptionMessage; class PurchasePriceTest { diff --git a/src/test/java/domain/winningStatistics/LotteryComparatorTest.java b/src/test/java/domain/winningStatistics/LotteryComparatorTest.java index ff60291..9050c33 100644 --- a/src/test/java/domain/winningStatistics/LotteryComparatorTest.java +++ b/src/test/java/domain/winningStatistics/LotteryComparatorTest.java @@ -9,9 +9,9 @@ import domain.lotteryStore.Lotteries; import domain.lotteryStore.Lottery; -import domain.lotteryStore.Numbers; -import domain.value.BonusNumber; -import domain.value.ManualNumbersGenerator; +import domain.lotteryStore.numbers.BonusNumber; +import domain.lotteryStore.numbers.ManualNumbersGenerator; +import domain.lotteryStore.numbers.Numbers; class LotteryComparatorTest { From db7795d22532e4de06743d8ccc0ea55d476534ad Mon Sep 17 00:00:00 2001 From: jummi <98qkrwjdal@naver.com> Date: Wed, 7 Apr 2021 00:16:37 +0900 Subject: [PATCH 29/44] =?UTF-8?q?refactor:=20=EA=B5=AC=EB=A7=A4=ED=95=9C?= =?UTF-8?q?=20=EB=A1=9C=EB=98=90=20=EB=B2=88=ED=98=B8=EC=99=80=20=EC=A7=80?= =?UTF-8?q?=EB=82=9C=EC=A3=BC=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=20=EB=A1=9C=EC=A7=81=EC=9D=84=20Lotteries?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/Application.java | 7 +--- .../java/domain/lotteryStore/Lotteries.java | 37 +++++++++++++++++-- .../winningStatistics/LotteryComparator.java | 36 ------------------ .../LotteriesTest.java} | 26 +++++-------- 5 files changed, 45 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/domain/winningStatistics/LotteryComparator.java rename src/test/java/domain/{winningStatistics/LotteryComparatorTest.java => lotteryStore/LotteriesTest.java} (69%) diff --git a/README.md b/README.md index 45e8f54..0f0927a 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ ___ - [x] 수동으로 구매할 번호 입력 - [x] 수동 로또 생성 - [x] Printer %s, %f 사용 -- [ ] LotteryComparator를 Lotteries로 합칠 것이냐 +- [x] LotteryComparator 기능을 Lotteries로 합치기 - [ ] PrizeMoney로 당첨 횟수 세기 ### 논의거리 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 57740bf..45c0608 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -5,7 +5,6 @@ import domain.lotteryStore.PurchasePrice; import domain.lotteryStore.numbers.BonusNumber; import domain.lotteryStore.numbers.ManualNumbersGenerator; -import domain.winningStatistics.LotteryComparator; import domain.winningStatistics.PrizeMoney; import domain.winningStatistics.WinningStatistics; import ui.Printer; @@ -15,11 +14,9 @@ public class Application { private final Receiver receiver; private final Printer printer; private final LotteryStore lotteryStore; - private final LotteryComparator lotteryComparator; public Application() { lotteryStore = new LotteryStore(); - lotteryComparator = new LotteryComparator(); receiver = new Receiver(); printer = new Printer(); } @@ -42,8 +39,8 @@ public void run() { ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator(receiver.receiveWinningNumbers()); BonusNumber bonusNumber = new BonusNumber(receiver.receiveBonusNumber(), winningNumbers); - lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries); - WinningStatistics winningStatistics = lotteryComparator.getWinningStatistics(); + lotteries.compareWithWinningNumbersAndBonusNumber(winningNumbers, bonusNumber); + WinningStatistics winningStatistics = lotteries.getWinningStatistics(); printer.printWinningStatistics(winningStatistics); printer.printTotalEarningsRate(PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount)); diff --git a/src/main/java/domain/lotteryStore/Lotteries.java b/src/main/java/domain/lotteryStore/Lotteries.java index f82433c..178bbf4 100644 --- a/src/main/java/domain/lotteryStore/Lotteries.java +++ b/src/main/java/domain/lotteryStore/Lotteries.java @@ -2,22 +2,51 @@ import java.util.List; +import domain.lotteryStore.numbers.BonusNumber; +import domain.lotteryStore.numbers.ManualNumbersGenerator; +import domain.winningStatistics.ComparisonResult; +import domain.winningStatistics.WinningStatistics; + public class Lotteries { private final List lotteries; + private final WinningStatistics winningStatistics = new WinningStatistics(); public Lotteries(List lotteries) { this.lotteries = lotteries; } - public Lottery get(int index) { - return lotteries.get(index); + public void compareWithWinningNumbersAndBonusNumber(ManualNumbersGenerator winningNumbers, + BonusNumber bonusNumber) { + for (Lottery lottery : lotteries) { + ComparisonResult comparisonResult = compareOneTicketNumbers(winningNumbers, bonusNumber, lottery); + winningStatistics.checkRanking(comparisonResult); + } + } + + public ComparisonResult compareOneTicketNumbers(ManualNumbersGenerator winningNumbers, BonusNumber bonusNumber, + Lottery lottery) { + int countOfMatchingNumbers = getCountOfMatchingWinningNumbers(lottery, winningNumbers); + boolean hasBonusNumber = hasBonusNumber(lottery, bonusNumber); + return new ComparisonResult(countOfMatchingNumbers, hasBonusNumber); + } + + private int getCountOfMatchingWinningNumbers(Lottery lottery, ManualNumbersGenerator winningNumbers) { + return lottery.getNumbers().countMatchingNumbers(winningNumbers); } - public int size() { - return lotteries.size(); + private boolean hasBonusNumber(Lottery lottery, BonusNumber bonusNumber) { + return lottery.getNumbers().contains(bonusNumber.getBonusNumber()); + } + + public Lottery get(int index) { + return lotteries.get(index); } public List getLotteries() { return lotteries; } + + public WinningStatistics getWinningStatistics() { + return winningStatistics; + } } diff --git a/src/main/java/domain/winningStatistics/LotteryComparator.java b/src/main/java/domain/winningStatistics/LotteryComparator.java deleted file mode 100644 index 7fd45a8..0000000 --- a/src/main/java/domain/winningStatistics/LotteryComparator.java +++ /dev/null @@ -1,36 +0,0 @@ -package domain.winningStatistics; - -import domain.lotteryStore.Lotteries; -import domain.lotteryStore.Lottery; -import domain.lotteryStore.numbers.BonusNumber; -import domain.lotteryStore.numbers.ManualNumbersGenerator; - -public class LotteryComparator { - private final WinningStatistics winningStatistics = new WinningStatistics(); - - public void compareNumbers(ManualNumbersGenerator winningNumbers, BonusNumber bonusNumber, Lotteries lotteries) { - for (int i = 0; i < lotteries.size(); i++) { - ComparisonResult comparisonResult = compareOneTicketNumbers(winningNumbers, bonusNumber, lotteries.get(i)); - winningStatistics.checkRanking(comparisonResult); - } - } - - public ComparisonResult compareOneTicketNumbers(ManualNumbersGenerator winningNumbers, BonusNumber bonusNumber, - Lottery lottery) { - int countOfMatchingNumbers = getCountOfMatchingWinningNumbers(lottery, winningNumbers); - boolean hasBonusNumber = hasBonusNumber(lottery, bonusNumber); - return new ComparisonResult(countOfMatchingNumbers, hasBonusNumber); - } - - private int getCountOfMatchingWinningNumbers(Lottery lottery, ManualNumbersGenerator winningNumbers) { - return lottery.getNumbers().countMatchingNumbers(winningNumbers); - } - - private boolean hasBonusNumber(Lottery lottery, BonusNumber bonusNumber) { - return lottery.getNumbers().contains(bonusNumber.getBonusNumber()); - } - - public WinningStatistics getWinningStatistics() { - return winningStatistics; - } -} diff --git a/src/test/java/domain/winningStatistics/LotteryComparatorTest.java b/src/test/java/domain/lotteryStore/LotteriesTest.java similarity index 69% rename from src/test/java/domain/winningStatistics/LotteryComparatorTest.java rename to src/test/java/domain/lotteryStore/LotteriesTest.java index 9050c33..15428a0 100644 --- a/src/test/java/domain/winningStatistics/LotteryComparatorTest.java +++ b/src/test/java/domain/lotteryStore/LotteriesTest.java @@ -1,4 +1,4 @@ -package domain.winningStatistics; +package domain.lotteryStore; import static org.assertj.core.api.Assertions.*; @@ -7,13 +7,13 @@ import org.junit.jupiter.api.Test; -import domain.lotteryStore.Lotteries; -import domain.lotteryStore.Lottery; import domain.lotteryStore.numbers.BonusNumber; import domain.lotteryStore.numbers.ManualNumbersGenerator; import domain.lotteryStore.numbers.Numbers; +import domain.winningStatistics.ComparisonResult; +import domain.winningStatistics.WinningStatistics; -class LotteryComparatorTest { +class LotteriesTest { private final ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator("1, 2, 3, 4, 5, 6"); private final BonusNumber bonusNumber = new BonusNumber(7, winningNumbers); @@ -28,14 +28,9 @@ class LotteryComparatorTest { @Test public void 로또_티켓_하나의_비교_결과를_확인한다() { - //given - LotteryComparator lotteryComparator = new LotteryComparator(); - //when - ComparisonResult result1 = lotteryComparator.compareOneTicketNumbers(winningNumbers, bonusNumber, - lotteries.get(1)); - ComparisonResult result2 = lotteryComparator.compareOneTicketNumbers(winningNumbers, bonusNumber, - lotteries.get(4)); + ComparisonResult result1 = lotteries.compareOneTicketNumbers(winningNumbers, bonusNumber, lotteries.get(1)); + ComparisonResult result2 = lotteries.compareOneTicketNumbers(winningNumbers, bonusNumber, lotteries.get(4)); //then assertThat(result1.getMatchingCount()).isEqualTo(4); @@ -46,13 +41,9 @@ class LotteryComparatorTest { @Test public void 당첨_통계를_확인한다() throws Exception { - //given - LotteryComparator lotteryComparator = new LotteryComparator(); - int purchasedCount = 6; - //when - lotteryComparator.compareNumbers(winningNumbers, bonusNumber, lotteries); - WinningStatistics winningStatistics = lotteryComparator.getWinningStatistics(); + lotteries.compareWithWinningNumbersAndBonusNumber(winningNumbers, bonusNumber); + WinningStatistics winningStatistics = lotteries.getWinningStatistics(); List rankings = winningStatistics.getRankings(); //then @@ -62,4 +53,5 @@ class LotteryComparatorTest { assertThat(rankings.get(3)).isEqualTo(1); assertThat(rankings.get(4)).isEqualTo(1); } + } \ No newline at end of file From ae631a639e6eaf5bbeafc670ed97d8f145b5e14a Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 8 Apr 2021 22:31:38 +0900 Subject: [PATCH 30/44] =?UTF-8?q?refactor:=20validate=20=EC=97=AD=ED=95=A0?= =?UTF-8?q?=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/lotteryStore/Lotteries.java | 12 ++-- .../domain/lotteryStore/PurchasePrice.java | 6 +- .../domain/winningStatistics/Rankings.java | 21 ------- .../winningStatistics/WinningStatistics.java | 63 +++---------------- .../winningStatistics/RankingsTest.java | 30 --------- .../WinningStatisticsTest.java | 49 ++++++--------- 6 files changed, 33 insertions(+), 148 deletions(-) delete mode 100644 src/main/java/domain/winningStatistics/Rankings.java delete mode 100644 src/test/java/domain/winningStatistics/RankingsTest.java diff --git a/src/main/java/domain/lotteryStore/Lotteries.java b/src/main/java/domain/lotteryStore/Lotteries.java index 178bbf4..50f6bd7 100644 --- a/src/main/java/domain/lotteryStore/Lotteries.java +++ b/src/main/java/domain/lotteryStore/Lotteries.java @@ -9,18 +9,20 @@ public class Lotteries { private final List lotteries; - private final WinningStatistics winningStatistics = new WinningStatistics(); public Lotteries(List lotteries) { this.lotteries = lotteries; } - public void compareWithWinningNumbersAndBonusNumber(ManualNumbersGenerator winningNumbers, + public WinningStatistics compareWithWinningNumbersAndBonusNumber(ManualNumbersGenerator winningNumbers, BonusNumber bonusNumber) { + WinningStatistics winningStatistics = new WinningStatistics(); for (Lottery lottery : lotteries) { ComparisonResult comparisonResult = compareOneTicketNumbers(winningNumbers, bonusNumber, lottery); - winningStatistics.checkRanking(comparisonResult); + comparisonResult.checkRanking(winningStatistics); } + + return winningStatistics; } public ComparisonResult compareOneTicketNumbers(ManualNumbersGenerator winningNumbers, BonusNumber bonusNumber, @@ -45,8 +47,4 @@ public Lottery get(int index) { public List getLotteries() { return lotteries; } - - public WinningStatistics getWinningStatistics() { - return winningStatistics; - } } diff --git a/src/main/java/domain/lotteryStore/PurchasePrice.java b/src/main/java/domain/lotteryStore/PurchasePrice.java index a192ff1..80bd8ba 100644 --- a/src/main/java/domain/lotteryStore/PurchasePrice.java +++ b/src/main/java/domain/lotteryStore/PurchasePrice.java @@ -10,7 +10,7 @@ public class PurchasePrice { public PurchasePrice(int purchasePrice) { validateSmallerThanPurchasePrice(purchasePrice); this.purchasePrice = purchasePrice; - } + }g private void validateSmallerThanPurchasePrice(int purchasePrice) { if (purchasePrice < PRICE_OF_ONE_LOTTERY_TICKET) { @@ -21,8 +21,4 @@ private void validateSmallerThanPurchasePrice(int purchasePrice) { public int getPurchasedCount() { return purchasePrice / PRICE_OF_ONE_LOTTERY_TICKET; } - - public int getPurchasePrice() { - return purchasePrice; - } } diff --git a/src/main/java/domain/winningStatistics/Rankings.java b/src/main/java/domain/winningStatistics/Rankings.java deleted file mode 100644 index 5028e7e..0000000 --- a/src/main/java/domain/winningStatistics/Rankings.java +++ /dev/null @@ -1,21 +0,0 @@ -package domain.winningStatistics; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class Rankings { - private final List rankings; - - public Rankings() { - this.rankings = new ArrayList<>(Arrays.asList(0, 0, 0, 0, 0)); - } - - public void increase(int index) { - rankings.set(index, rankings.get(index) + 1); - } - - public List getRankings() { - return rankings; - } -} diff --git a/src/main/java/domain/winningStatistics/WinningStatistics.java b/src/main/java/domain/winningStatistics/WinningStatistics.java index daffd76..5028e7e 100644 --- a/src/main/java/domain/winningStatistics/WinningStatistics.java +++ b/src/main/java/domain/winningStatistics/WinningStatistics.java @@ -1,66 +1,21 @@ package domain.winningStatistics; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -public class WinningStatistics { - private static final int FIFTH_PLACE_INDEX = 0; - private static final int FOURTH_PLACE_INDEX = 1; - private static final int THIRD_PLACE_INDEX = 2; - private static final int SECOND_PLACE_INDEX = 3; - private static final int FIRST_PLACE_INDEX = 4; +public class Rankings { + private final List rankings; - // 1~5등을 한 로또 티켓들이 각각 몇개인지 - private final Rankings rankings; - - public WinningStatistics() { - rankings = new Rankings(); - } - - public void checkRanking(ComparisonResult comparisonResult) { - findFifthPlaces(comparisonResult); - findFourthPlaces(comparisonResult); - findSecondOrThirdPlaces(comparisonResult); - findFirstPlaces(comparisonResult); - } - - private void findFifthPlaces(ComparisonResult comparisonResult) { - if (comparisonResult.getMatchingCount() == PrizeMoney.THREE.getMatchingCount()) { - rankings.increase(FIFTH_PLACE_INDEX); - } - } - - private void findFourthPlaces(ComparisonResult comparisonResult) { - if (comparisonResult.getMatchingCount() == PrizeMoney.FOUR.getMatchingCount()) { - rankings.increase(FOURTH_PLACE_INDEX); - } - } - - private void findSecondOrThirdPlaces(ComparisonResult comparisonResult) { - if (comparisonResult.getMatchingCount() == PrizeMoney.FIVE.getMatchingCount()) { - findLotteriesNotHavingBonusNumber(comparisonResult); - findLotteriesHavingBonusNumber(comparisonResult); - } - } - - private void findLotteriesNotHavingBonusNumber(ComparisonResult comparisonResult) { - if (!comparisonResult.isHavingBonusNumber()) { - rankings.increase(THIRD_PLACE_INDEX); - } - } - - private void findLotteriesHavingBonusNumber(ComparisonResult comparisonResult) { - if (comparisonResult.isHavingBonusNumber()) { - rankings.increase(SECOND_PLACE_INDEX); - } + public Rankings() { + this.rankings = new ArrayList<>(Arrays.asList(0, 0, 0, 0, 0)); } - private void findFirstPlaces(ComparisonResult comparisonResult) { - if (comparisonResult.getMatchingCount() == PrizeMoney.SIX.getMatchingCount()) { - rankings.increase(FIRST_PLACE_INDEX); - } + public void increase(int index) { + rankings.set(index, rankings.get(index) + 1); } public List getRankings() { - return rankings.getRankings(); + return rankings; } } diff --git a/src/test/java/domain/winningStatistics/RankingsTest.java b/src/test/java/domain/winningStatistics/RankingsTest.java deleted file mode 100644 index 1adb347..0000000 --- a/src/test/java/domain/winningStatistics/RankingsTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package domain.winningStatistics; - -import static org.assertj.core.api.Assertions.*; - -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class RankingsTest { - - private Rankings rankings; - - @BeforeEach - void setUp() { - rankings = new Rankings(); - } - - @Test - void 당첨자_수를_증가시킨다() { - rankings.increase(1); - List sizeOfWinners = rankings.getRankings(); - - assertThat(sizeOfWinners.get(0)).isEqualTo(0); - assertThat(sizeOfWinners.get(1)).isEqualTo(1); - assertThat(sizeOfWinners.get(0)).isEqualTo(0); - assertThat(sizeOfWinners.get(0)).isEqualTo(0); - assertThat(sizeOfWinners.get(0)).isEqualTo(0); - } -} \ No newline at end of file diff --git a/src/test/java/domain/winningStatistics/WinningStatisticsTest.java b/src/test/java/domain/winningStatistics/WinningStatisticsTest.java index e98f0ef..1adb347 100644 --- a/src/test/java/domain/winningStatistics/WinningStatisticsTest.java +++ b/src/test/java/domain/winningStatistics/WinningStatisticsTest.java @@ -2,42 +2,29 @@ import static org.assertj.core.api.Assertions.*; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -class WinningStatisticsTest { +class RankingsTest { + + private Rankings rankings; + + @BeforeEach + void setUp() { + rankings = new Rankings(); + } @Test - void 각_등수의_당첨자_수를_확인한다() { - // given - List results = new ArrayList<>(Arrays.asList( - new ComparisonResult(3, false), - new ComparisonResult(5, false), - new ComparisonResult(4, false), - new ComparisonResult(0, false), - new ComparisonResult(2, true), - new ComparisonResult(5, true), - new ComparisonResult(1, false), - new ComparisonResult(3, true) - )); - - // when - WinningStatistics winningStatistics = new WinningStatistics(); - - for (ComparisonResult result : results) { - winningStatistics.checkRanking(result); - } - - List rankings = winningStatistics.getRankings(); - - // then - assertThat(rankings.get(0)).isEqualTo(2); - assertThat(rankings.get(1)).isEqualTo(1); - assertThat(rankings.get(2)).isEqualTo(1); - assertThat(rankings.get(3)).isEqualTo(1); - assertThat(rankings.get(4)).isEqualTo(0); + void 당첨자_수를_증가시킨다() { + rankings.increase(1); + List sizeOfWinners = rankings.getRankings(); + + assertThat(sizeOfWinners.get(0)).isEqualTo(0); + assertThat(sizeOfWinners.get(1)).isEqualTo(1); + assertThat(sizeOfWinners.get(0)).isEqualTo(0); + assertThat(sizeOfWinners.get(0)).isEqualTo(0); + assertThat(sizeOfWinners.get(0)).isEqualTo(0); } } \ No newline at end of file From 8b6f3399da130aad4eb1237c8be729def00f4765 Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 8 Apr 2021 22:33:59 +0900 Subject: [PATCH 31/44] =?UTF-8?q?refactor:=20Printer,=20Receiver=202?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=20=EA=B8=B0=EB=8A=A5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/lotteryStore/PurchasePrice.java | 2 +- src/main/java/ui/message/InputMessage.java | 2 +- src/main/java/ui/message/OutputMessage.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/lotteryStore/PurchasePrice.java b/src/main/java/domain/lotteryStore/PurchasePrice.java index 80bd8ba..fa29a58 100644 --- a/src/main/java/domain/lotteryStore/PurchasePrice.java +++ b/src/main/java/domain/lotteryStore/PurchasePrice.java @@ -10,7 +10,7 @@ public class PurchasePrice { public PurchasePrice(int purchasePrice) { validateSmallerThanPurchasePrice(purchasePrice); this.purchasePrice = purchasePrice; - }g + } private void validateSmallerThanPurchasePrice(int purchasePrice) { if (purchasePrice < PRICE_OF_ONE_LOTTERY_TICKET) { diff --git a/src/main/java/ui/message/InputMessage.java b/src/main/java/ui/message/InputMessage.java index 4426b85..30f282c 100644 --- a/src/main/java/ui/message/InputMessage.java +++ b/src/main/java/ui/message/InputMessage.java @@ -2,7 +2,7 @@ public enum InputMessage { INPUT_PURCHASE_PRICE("구입금액을 입력해 주세요."), - INPUT_MANUAL_COUNT("\n수동으로 구매할 번호를 입력해주세요."), + INPUT_MANUAL_COUNT("\n수동으로 구매할 로또 수를 입력해 주세요."), INPUT_MANUAL_NUMBERS("\n수동으로 구매할 번호를 입력해 주세요."), INPUT_LAST_WEEK_WINNING_NUMBERS("\n지난 주 당첨 번호를 입력해 주세요."), INPUT_BONUS_BALL("보너스 볼을 입력해 주세요."); diff --git a/src/main/java/ui/message/OutputMessage.java b/src/main/java/ui/message/OutputMessage.java index 4e451d0..91b7b30 100644 --- a/src/main/java/ui/message/OutputMessage.java +++ b/src/main/java/ui/message/OutputMessage.java @@ -1,7 +1,7 @@ package ui.message; public enum OutputMessage { - PURCHASED_COUNT("\n수동으로 %d장, 자동으로 %d개를 구매했습니다."), + PURCHASED_COUNT("\n수동으로 %d장, 자동으로 %d장을 구매했습니다.\n"), WINNING_STATISTICS("\n당첨 통계\n---------\n"), MATCH_COUNT("%d개 일치 (%d원)- %d개\n"), MATCH_COUNT_WITH_BONUS("%d개 일치, 보너스 볼 일치 (%d원)- %d개\n"), From bcf2ba55f92281ba1ea605ab347393a8a67311d3 Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 8 Apr 2021 22:34:53 +0900 Subject: [PATCH 32/44] =?UTF-8?q?refactor:=20Rankings=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20WinninggStatistics=EB=A1=9C=20=EB=B3=80=EA=B2=BD,?= =?UTF-8?q?=20=EA=B8=B0=EC=A1=B4=20WinningStatics=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winningStatistics/WinningStatistics.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/winningStatistics/WinningStatistics.java b/src/main/java/domain/winningStatistics/WinningStatistics.java index 5028e7e..512264c 100644 --- a/src/main/java/domain/winningStatistics/WinningStatistics.java +++ b/src/main/java/domain/winningStatistics/WinningStatistics.java @@ -1,21 +1,30 @@ package domain.winningStatistics; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; -public class Rankings { - private final List rankings; +public class WinningStatistics { + private Map winningStatistics = new HashMap<>(); - public Rankings() { - this.rankings = new ArrayList<>(Arrays.asList(0, 0, 0, 0, 0)); + + public WinningStatistics() { + initiate(); + } + + private void initiate() { + for (PrizeMoney value : PrizeMoney.values()) { + winningStatistics.put(value, 0); + } + } + + public void increase(PrizeMoney value) { + winningStatistics.put(value, winningStatistics.get(value) + 1); } - public void increase(int index) { - rankings.set(index, rankings.get(index) + 1); + public int get(PrizeMoney value) { + return winningStatistics.get(value); } - public List getRankings() { - return rankings; + public Map getWinningStatistics() { + return winningStatistics; } } From 7b6046af9f2c424015a0a33e4321ae5360a257a8 Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 8 Apr 2021 22:36:32 +0900 Subject: [PATCH 33/44] =?UTF-8?q?refactor:=20PrizeMoney=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=82=B4=20=EA=B0=92=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=20List=EC=97=90=EC=84=9C=20Map=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/winningStatistics/PrizeMoney.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/winningStatistics/PrizeMoney.java b/src/main/java/domain/winningStatistics/PrizeMoney.java index 000064c..c366489 100644 --- a/src/main/java/domain/winningStatistics/PrizeMoney.java +++ b/src/main/java/domain/winningStatistics/PrizeMoney.java @@ -1,28 +1,29 @@ package domain.winningStatistics; +import java.util.Arrays; import java.util.List; public enum PrizeMoney { - THREE(3, 5000), - FOUR(4, 50000), - FIVE(5, 1500000), - FIVE_BONUS(5, 30000000), - SIX(6, 2000000000); + THREE(3, false, 5000), + FOUR(4, false, 50000), + FIVE(5, false, 1500000), + FIVE_BONUS(5, true, 30000000), + SIX(6, false, 2000000000); private final int matchingCount; + private final boolean isHavingBonusNumber; private final int prizeMoney; - PrizeMoney(int matchingCount, int prizeMoney) { + PrizeMoney(int matchingCount, boolean isHavingBonusNumber, int prizeMoney) { this.matchingCount = matchingCount; + this.isHavingBonusNumber = isHavingBonusNumber; this.prizeMoney = prizeMoney; } public static float calculateEarningsRate(WinningStatistics winningStatistics, int purchasedCount) { - List sizeOfWinnersPerRank = winningStatistics.getRankings(); - int totalPrizeMoney = 0; - for (int i = 0; i < sizeOfWinnersPerRank.size(); i++) { - totalPrizeMoney += sizeOfWinnersPerRank.get(i) * (PrizeMoney.values())[i].prizeMoney; - } + int totalPrizeMoney = Arrays.stream(values()) + .mapToInt(prizeMoney -> winningStatistics.get(prizeMoney) * prizeMoney.getPrizeMoney()) + .sum(); return (float)totalPrizeMoney / (purchasedCount * 1000); } @@ -31,6 +32,10 @@ public int getMatchingCount() { return matchingCount; } + public boolean isHavingBonusNumber() { + return isHavingBonusNumber; + } + public int getPrizeMoney() { return prizeMoney; } From ac27fbd6c0c290863cd3f36f8dccdc7cf54c5f1a Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 8 Apr 2021 22:37:16 +0900 Subject: [PATCH 34/44] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=A1=B4=20WinningS?= =?UTF-8?q?tatics=20=EC=97=AD=ED=95=A0,=20=ED=95=A8=EC=88=98=20=EA=B0=84?= =?UTF-8?q?=EA=B2=B0=ED=95=98=EA=B2=8C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81,=20ComparisonResult=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=97=90=20=EC=97=AD=ED=95=A0=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winningStatistics/ComparisonResult.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/domain/winningStatistics/ComparisonResult.java b/src/main/java/domain/winningStatistics/ComparisonResult.java index f4d4bb5..51ed046 100644 --- a/src/main/java/domain/winningStatistics/ComparisonResult.java +++ b/src/main/java/domain/winningStatistics/ComparisonResult.java @@ -9,6 +9,23 @@ public ComparisonResult(int matchingCount, boolean havingBonusNumber) { this.havingBonusNumber = havingBonusNumber; } + public void checkRanking(WinningStatistics winningStatistics) { + for (PrizeMoney prizeMoney : PrizeMoney.values()) { + checkWinnings(winningStatistics, prizeMoney); + } + } + + private void checkWinnings(WinningStatistics winningStatistics, PrizeMoney prizeMoney) { + if (matchingCount == prizeMoney.getMatchingCount() + && isHavingBonusNumberWithFiveMatchingCount() == prizeMoney.isHavingBonusNumber()) { + winningStatistics.increase(prizeMoney); + } + } + + private boolean isHavingBonusNumberWithFiveMatchingCount() { + return matchingCount == 5 && havingBonusNumber; + } + public int getMatchingCount() { return matchingCount; } From b395cebd087767c54a136b55d0399d87ed0fceb5 Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 8 Apr 2021 22:38:03 +0900 Subject: [PATCH 35/44] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=9E=85/=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/ui/Printer.java | 30 ++++++++++++++---------------- src/main/java/ui/Receiver.java | 1 - 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index b6c53d5..030d7db 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -1,6 +1,7 @@ package ui; import java.util.List; +import java.util.Map; import domain.lotteryStore.Lotteries; import domain.winningStatistics.PrizeMoney; @@ -8,30 +9,28 @@ import ui.message.OutputMessage; public class Printer { - private static final int SIZE_OF_LOTTERY_RANK = 5; + private static final int SIZE_OF_RANK = 5; private static final int WIN_WITH_BONUS_NUMBER = 3; - private static final String LIMIT_OF_DECIMAL_PLACE = "%.2f"; public void printPurchasedCount(int manualCount, int purchasedCount) { - System.out.println( - String.format(OutputMessage.PURCHASED_COUNT.getMessage(), manualCount, purchasedCount - manualCount)); + System.out.printf(OutputMessage.PURCHASED_COUNT.getMessage(), manualCount, purchasedCount - manualCount); } public void printPurchasedLotteries(Lotteries lotteries) { lotteries.getLotteries() - .stream() - .map(lottery -> lottery.getNumbers().getNumbers()) - .forEach(System.out::println); + .stream() + .map(lottery -> lottery.getNumbers().getNumbers()) + .forEach(System.out::println); } public void printWinningStatistics(WinningStatistics winningStatistics) { StringBuilder builder = new StringBuilder(); PrizeMoney[] prizeMonies = PrizeMoney.values(); - List sizeOfWinnersPerRank = winningStatistics.getRankings(); builder.append(OutputMessage.WINNING_STATISTICS.getMessage()); - for (int i = 0; i < SIZE_OF_LOTTERY_RANK; i++) { - printWinningStatisticsDetails(builder, prizeMonies[i], sizeOfWinnersPerRank.get(i), i); + + for (int i = 0; i < SIZE_OF_RANK; i++) { + printWinningStatisticsDetails(builder, prizeMonies[i], winningStatistics.get(prizeMonies[i]), i); } System.out.print(builder); } @@ -39,16 +38,15 @@ public void printWinningStatistics(WinningStatistics winningStatistics) { private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney prizeMoney, Integer result, int i) { if (i == WIN_WITH_BONUS_NUMBER) { builder.append( - String.format(OutputMessage.MATCH_COUNT_WITH_BONUS.getMessage(), prizeMoney.getMatchingCount(), - prizeMoney.getPrizeMoney(), result)); + String.format(OutputMessage.MATCH_COUNT_WITH_BONUS.getMessage(), prizeMoney.getMatchingCount(), + prizeMoney.getPrizeMoney(), result)); + return; } - if (i != WIN_WITH_BONUS_NUMBER) { - builder.append(String.format(OutputMessage.MATCH_COUNT.getMessage(), prizeMoney.getMatchingCount(), + builder.append(String.format(OutputMessage.MATCH_COUNT.getMessage(), prizeMoney.getMatchingCount(), prizeMoney.getPrizeMoney(), result)); - } } public void printTotalEarningsRate(float totalEarningsRate) { - System.out.println(String.format(OutputMessage.TOTAL_EARNINGS_RATE.getMessage(), totalEarningsRate)); + System.out.printf(OutputMessage.TOTAL_EARNINGS_RATE.getMessage(), totalEarningsRate); } } diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/Receiver.java index 60e1606..a4fa092 100644 --- a/src/main/java/ui/Receiver.java +++ b/src/main/java/ui/Receiver.java @@ -32,7 +32,6 @@ public List receiveManualNumbers(int manualCount) { public String receiveWinningNumbers() { System.out.println(InputMessage.INPUT_LAST_WEEK_WINNING_NUMBERS.getMessage()); - SCANNER.nextLine(); return SCANNER.nextLine(); } From 602c1183026df123e18d6e7590fe851e7dcaa52f Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 8 Apr 2021 22:38:31 +0900 Subject: [PATCH 36/44] =?UTF-8?q?refactor:=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20Application?= =?UTF-8?q?=20Class=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/Application.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 45c0608..32d30fc 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -39,8 +39,7 @@ public void run() { ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator(receiver.receiveWinningNumbers()); BonusNumber bonusNumber = new BonusNumber(receiver.receiveBonusNumber(), winningNumbers); - lotteries.compareWithWinningNumbersAndBonusNumber(winningNumbers, bonusNumber); - WinningStatistics winningStatistics = lotteries.getWinningStatistics(); + WinningStatistics winningStatistics = lotteries.compareWithWinningNumbersAndBonusNumber(winningNumbers, bonusNumber); printer.printWinningStatistics(winningStatistics); printer.printTotalEarningsRate(PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount)); From 9c0f645e0340501276f1b5d1cd155221034eb134 Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 8 Apr 2021 22:39:03 +0900 Subject: [PATCH 37/44] =?UTF-8?q?refactor:=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20Test?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/lotteryStore/LotteriesTest.java | 19 ++++----- .../ComparisonResultTest.java | 26 ++++++++++++ .../winningStatistics/PrizeMoneyTest.java | 41 ++++++++----------- .../WinningStatisticsTest.java | 24 ++++++----- 4 files changed, 64 insertions(+), 46 deletions(-) create mode 100644 src/test/java/domain/winningStatistics/ComparisonResultTest.java diff --git a/src/test/java/domain/lotteryStore/LotteriesTest.java b/src/test/java/domain/lotteryStore/LotteriesTest.java index 15428a0..fc5bb72 100644 --- a/src/test/java/domain/lotteryStore/LotteriesTest.java +++ b/src/test/java/domain/lotteryStore/LotteriesTest.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.List; +import domain.winningStatistics.PrizeMoney; import org.junit.jupiter.api.Test; import domain.lotteryStore.numbers.BonusNumber; @@ -14,7 +15,6 @@ import domain.winningStatistics.WinningStatistics; class LotteriesTest { - private final ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator("1, 2, 3, 4, 5, 6"); private final BonusNumber bonusNumber = new BonusNumber(7, winningNumbers); private final Lotteries lotteries = new Lotteries(Arrays.asList( @@ -43,15 +43,14 @@ class LotteriesTest { public void 당첨_통계를_확인한다() throws Exception { //when lotteries.compareWithWinningNumbersAndBonusNumber(winningNumbers, bonusNumber); - WinningStatistics winningStatistics = lotteries.getWinningStatistics(); - List rankings = winningStatistics.getRankings(); + WinningStatistics winningStatistics = lotteries.compareWithWinningNumbersAndBonusNumber(winningNumbers, bonusNumber); + PrizeMoney[] prizeMonies = PrizeMoney.values(); //then - assertThat(rankings.get(0)).isEqualTo(1); - assertThat(rankings.get(1)).isEqualTo(2); - assertThat(rankings.get(2)).isEqualTo(1); - assertThat(rankings.get(3)).isEqualTo(1); - assertThat(rankings.get(4)).isEqualTo(1); + assertThat(winningStatistics.get(prizeMonies[0])).isEqualTo(1); + assertThat(winningStatistics.get(prizeMonies[1])).isEqualTo(2); + assertThat(winningStatistics.get(prizeMonies[2])).isEqualTo(1); + assertThat(winningStatistics.get(prizeMonies[3])).isEqualTo(1); + assertThat(winningStatistics.get(prizeMonies[4])).isEqualTo(1); } - -} \ No newline at end of file +} diff --git a/src/test/java/domain/winningStatistics/ComparisonResultTest.java b/src/test/java/domain/winningStatistics/ComparisonResultTest.java new file mode 100644 index 0000000..f1bacba --- /dev/null +++ b/src/test/java/domain/winningStatistics/ComparisonResultTest.java @@ -0,0 +1,26 @@ +package domain.winningStatistics; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +public class ComparisonResultTest { + + @Test + void 랭킹을_확인한다() { + WinningStatistics winningStatistics = new WinningStatistics(); + int matchingCount = 5; + boolean havingBonusNumber = false; + ComparisonResult comparisonResult = new ComparisonResult(matchingCount, havingBonusNumber); + + comparisonResult.checkRanking(winningStatistics); + Map rankings = winningStatistics.getWinningStatistics(); + + Assertions.assertThat(rankings.get(PrizeMoney.THREE)).isEqualTo(0); + Assertions.assertThat(rankings.get(PrizeMoney.FOUR)).isEqualTo(0); + Assertions.assertThat(rankings.get(PrizeMoney.FIVE)).isEqualTo(1); + Assertions.assertThat(rankings.get(PrizeMoney.FIVE_BONUS)).isEqualTo(0); + Assertions.assertThat(rankings.get(PrizeMoney.SIX)).isEqualTo(0); + } +} diff --git a/src/test/java/domain/winningStatistics/PrizeMoneyTest.java b/src/test/java/domain/winningStatistics/PrizeMoneyTest.java index 18fae9c..66594a9 100644 --- a/src/test/java/domain/winningStatistics/PrizeMoneyTest.java +++ b/src/test/java/domain/winningStatistics/PrizeMoneyTest.java @@ -1,10 +1,9 @@ package domain.winningStatistics; +import static javax.swing.UIManager.put; import static org.assertj.core.api.Assertions.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import org.junit.jupiter.api.Test; @@ -13,33 +12,25 @@ class PrizeMoneyTest { @Test void 총수익률을_계산한다() { // given - List results = new ArrayList<>(Arrays.asList( - new ComparisonResult(3, false), - new ComparisonResult(4, false), - new ComparisonResult(0, false), - new ComparisonResult(2, true), - new ComparisonResult(5, true), - new ComparisonResult(1, false), - new ComparisonResult(3, true) - )); - int purchasedCount = 7; - - WinningStatistics winningStatistics = new WinningStatistics(); - - for (ComparisonResult result : results) { - winningStatistics.checkRanking(result); - } - - PrizeMoney[] values = PrizeMoney.values(); + WinningStatistics winningStatistics = new WinningStatistics() {{ + put(PrizeMoney.THREE, 3); + put(PrizeMoney.FOUR, 1); + put(PrizeMoney.FIVE, 3); + put(PrizeMoney.FIVE_BONUS, 1); + put(PrizeMoney.SIX, 1); + }}; + int purchasedCount = 20; // when float earningsRate = PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount); - List rankings = winningStatistics.getRankings(); + PrizeMoney[] values = PrizeMoney.values(); // then assertThat(earningsRate).isEqualTo( - (float)(rankings.get(0) * values[0].getPrizeMoney() + rankings.get(1) * values[1].getPrizeMoney() - + rankings.get(2) * values[2].getPrizeMoney() + rankings.get(3) * values[3].getPrizeMoney() - + rankings.get(4) * values[4].getPrizeMoney()) / (purchasedCount * 1000)); + (float)(winningStatistics.get(values[0]) * values[0].getPrizeMoney() + + winningStatistics.get(values[1]) * values[1].getPrizeMoney() + + winningStatistics.get(values[2]) * values[2].getPrizeMoney() + + winningStatistics.get(values[3]) * values[3].getPrizeMoney() + + winningStatistics.get(values[4]) * values[4].getPrizeMoney()) / (purchasedCount * 1000)); } } \ No newline at end of file diff --git a/src/test/java/domain/winningStatistics/WinningStatisticsTest.java b/src/test/java/domain/winningStatistics/WinningStatisticsTest.java index 1adb347..debe374 100644 --- a/src/test/java/domain/winningStatistics/WinningStatisticsTest.java +++ b/src/test/java/domain/winningStatistics/WinningStatisticsTest.java @@ -2,29 +2,31 @@ import static org.assertj.core.api.Assertions.*; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -class RankingsTest { +class WinningStatisticsTest { - private Rankings rankings; + private WinningStatistics winningStatistics; @BeforeEach void setUp() { - rankings = new Rankings(); + winningStatistics = new WinningStatistics(); } @Test void 당첨자_수를_증가시킨다() { - rankings.increase(1); - List sizeOfWinners = rankings.getRankings(); - - assertThat(sizeOfWinners.get(0)).isEqualTo(0); - assertThat(sizeOfWinners.get(1)).isEqualTo(1); - assertThat(sizeOfWinners.get(0)).isEqualTo(0); - assertThat(sizeOfWinners.get(0)).isEqualTo(0); - assertThat(sizeOfWinners.get(0)).isEqualTo(0); + winningStatistics.increase(PrizeMoney.THREE); + PrizeMoney[] prizeMonies = PrizeMoney.values(); + + assertThat(winningStatistics.get(prizeMonies[0])).isEqualTo(1); + assertThat(winningStatistics.get(prizeMonies[1])).isEqualTo(0); + assertThat(winningStatistics.get(prizeMonies[2])).isEqualTo(0); + assertThat(winningStatistics.get(prizeMonies[3])).isEqualTo(0); + assertThat(winningStatistics.get(prizeMonies[4])).isEqualTo(0); } } \ No newline at end of file From b230094065af622bd82b02f77ba7fdf0f5103961 Mon Sep 17 00:00:00 2001 From: songpang Date: Wed, 14 Apr 2021 22:45:28 +0900 Subject: [PATCH 38/44] =?UTF-8?q?refactor:=20=EB=94=94=EB=AF=B8=ED=84=B0?= =?UTF-8?q?=20=EB=B2=95=EC=B9=99=20=EC=A0=81=EC=9A=A9=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20Lotteries=20=EC=97=AD=ED=95=A0=20Lottery=EC=97=90?= =?UTF-8?q?=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/lotteryStore/Lotteries.java | 12 ++---------- src/main/java/domain/lotteryStore/Lottery.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/domain/lotteryStore/Lotteries.java b/src/main/java/domain/lotteryStore/Lotteries.java index 50f6bd7..099561a 100644 --- a/src/main/java/domain/lotteryStore/Lotteries.java +++ b/src/main/java/domain/lotteryStore/Lotteries.java @@ -27,19 +27,11 @@ public WinningStatistics compareWithWinningNumbersAndBonusNumber(ManualNumbersGe public ComparisonResult compareOneTicketNumbers(ManualNumbersGenerator winningNumbers, BonusNumber bonusNumber, Lottery lottery) { - int countOfMatchingNumbers = getCountOfMatchingWinningNumbers(lottery, winningNumbers); - boolean hasBonusNumber = hasBonusNumber(lottery, bonusNumber); + int countOfMatchingNumbers = lottery.getCountOfMatchingWinningNumbers(winningNumbers); + boolean hasBonusNumber = lottery.hasBonusNumber(bonusNumber); return new ComparisonResult(countOfMatchingNumbers, hasBonusNumber); } - private int getCountOfMatchingWinningNumbers(Lottery lottery, ManualNumbersGenerator winningNumbers) { - return lottery.getNumbers().countMatchingNumbers(winningNumbers); - } - - private boolean hasBonusNumber(Lottery lottery, BonusNumber bonusNumber) { - return lottery.getNumbers().contains(bonusNumber.getBonusNumber()); - } - public Lottery get(int index) { return lotteries.get(index); } diff --git a/src/main/java/domain/lotteryStore/Lottery.java b/src/main/java/domain/lotteryStore/Lottery.java index 11bcb84..531286a 100644 --- a/src/main/java/domain/lotteryStore/Lottery.java +++ b/src/main/java/domain/lotteryStore/Lottery.java @@ -1,5 +1,7 @@ package domain.lotteryStore; +import domain.lotteryStore.numbers.BonusNumber; +import domain.lotteryStore.numbers.ManualNumbersGenerator; import domain.lotteryStore.numbers.Numbers; public class Lottery { @@ -12,4 +14,12 @@ public Lottery(Numbers numbers) { public Numbers getNumbers() { return numbers; } + + public int getCountOfMatchingWinningNumbers(ManualNumbersGenerator winningNumbers) { + return numbers.countMatchingNumbers(winningNumbers); + } + + public boolean hasBonusNumber(BonusNumber bonusNumber) { + return numbers.contains(bonusNumber.getBonusNumber()); + } } From 9fd72e8e32fca919fe6f6780109f73359e8e65c8 Mon Sep 17 00:00:00 2001 From: songpang Date: Wed, 14 Apr 2021 22:46:06 +0900 Subject: [PATCH 39/44] =?UTF-8?q?refactor:=20BeforeAll=ED=95=A8=EC=88=98?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/lotteryStore/LotteriesTest.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/test/java/domain/lotteryStore/LotteriesTest.java b/src/test/java/domain/lotteryStore/LotteriesTest.java index fc5bb72..a18fddd 100644 --- a/src/test/java/domain/lotteryStore/LotteriesTest.java +++ b/src/test/java/domain/lotteryStore/LotteriesTest.java @@ -6,6 +6,7 @@ import java.util.List; import domain.winningStatistics.PrizeMoney; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import domain.lotteryStore.numbers.BonusNumber; @@ -15,16 +16,23 @@ import domain.winningStatistics.WinningStatistics; class LotteriesTest { - private final ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator("1, 2, 3, 4, 5, 6"); - private final BonusNumber bonusNumber = new BonusNumber(7, winningNumbers); - private final Lotteries lotteries = new Lotteries(Arrays.asList( - new Lottery(new Numbers(Arrays.asList(8, 2, 23, 41, 4, 5))), - new Lottery(new Numbers(Arrays.asList(3, 5, 29, 6, 2, 38))), - new Lottery(new Numbers(Arrays.asList(4, 31, 5, 40, 2, 1))), - new Lottery(new Numbers(Arrays.asList(4, 1, 3, 45, 5, 2))), - new Lottery(new Numbers(Arrays.asList(7, 1, 2, 3, 4, 5))), - new Lottery(new Numbers(Arrays.asList(1, 2, 3, 4, 5, 6))) - )); + private static ManualNumbersGenerator winningNumbers; + private static BonusNumber bonusNumber; + private static Lotteries lotteries; + + @BeforeAll + public static void setup() { + winningNumbers = new ManualNumbersGenerator("1, 2, 3, 4, 5, 6"); + bonusNumber = new BonusNumber(7, winningNumbers); + lotteries = new Lotteries(Arrays.asList( + new Lottery(new Numbers(Arrays.asList(8, 2, 23, 41, 4, 5))), + new Lottery(new Numbers(Arrays.asList(3, 5, 29, 6, 2, 38))), + new Lottery(new Numbers(Arrays.asList(4, 31, 5, 40, 2, 1))), + new Lottery(new Numbers(Arrays.asList(4, 1, 3, 45, 5, 2))), + new Lottery(new Numbers(Arrays.asList(7, 1, 2, 3, 4, 5))), + new Lottery(new Numbers(Arrays.asList(1, 2, 3, 4, 5, 6))) + )); + } @Test public void 로또_티켓_하나의_비교_결과를_확인한다() { From 4599417f3136305c3c76920f722b6a952b57dca7 Mon Sep 17 00:00:00 2001 From: songpang Date: Wed, 14 Apr 2021 22:58:26 +0900 Subject: [PATCH 40/44] =?UTF-8?q?refactor:=20=EC=83=81=ED=83=9C=EA=B0=92?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?LotteryStore=20static=EC=9C=BC=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 4 +--- src/main/java/domain/lotteryStore/LotteryStore.java | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 32d30fc..d6202a0 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -13,10 +13,8 @@ public class Application { private final Receiver receiver; private final Printer printer; - private final LotteryStore lotteryStore; public Application() { - lotteryStore = new LotteryStore(); receiver = new Receiver(); printer = new Printer(); } @@ -33,7 +31,7 @@ public void run() { List manualNumbers = receiver.receiveManualNumbers(manualCount); printer.printPurchasedCount(manualCount, purchasedCount); - Lotteries lotteries = lotteryStore.createLotteries(purchasedCount, manualCount, manualNumbers); + Lotteries lotteries = LotteryStore.createLotteries(purchasedCount, manualCount, manualNumbers); printer.printPurchasedLotteries(lotteries); ManualNumbersGenerator winningNumbers = new ManualNumbersGenerator(receiver.receiveWinningNumbers()); diff --git a/src/main/java/domain/lotteryStore/LotteryStore.java b/src/main/java/domain/lotteryStore/LotteryStore.java index 9d6df26..c509fdd 100644 --- a/src/main/java/domain/lotteryStore/LotteryStore.java +++ b/src/main/java/domain/lotteryStore/LotteryStore.java @@ -8,7 +8,7 @@ import domain.lotteryStore.numbers.Numbers; public class LotteryStore { - public Lotteries createLotteries(int purchasedCount, int manualCount, List manualNumbers) { + public static Lotteries createLotteries(int purchasedCount, int manualCount, List manualNumbers) { List lotteries = new ArrayList<>(); List manualLotteries = makeManualLotteries(manualCount, manualNumbers); List autoLotteries = makeAutoLotteries(purchasedCount, manualCount); @@ -19,7 +19,7 @@ public Lotteries createLotteries(int purchasedCount, int manualCount, List makeManualLotteries(int manualCount, List manualNumbers) { + private static List makeManualLotteries(int manualCount, List manualNumbers) { List manualLotteries = new ArrayList<>(); for (int i = 0; i < manualCount; i++) { Numbers numbers = new Numbers(new ManualNumbersGenerator(manualNumbers.get(i)).getManualNumbers()); @@ -28,7 +28,7 @@ private List makeManualLotteries(int manualCount, List manualNu return manualLotteries; } - private List makeAutoLotteries(int purchasedCount, int manualCount) { + private static List makeAutoLotteries(int purchasedCount, int manualCount) { AutoNumbersGenerator autoNumbersGenerator = new AutoNumbersGenerator(); List autoLotteries = new ArrayList<>(); int autoCount = purchasedCount - manualCount; @@ -38,7 +38,7 @@ private List makeAutoLotteries(int purchasedCount, int manualCount) { return autoLotteries; } - private Lottery makeAutoLottery(AutoNumbersGenerator autoNumbersGenerator) { + private static Lottery makeAutoLottery(AutoNumbersGenerator autoNumbersGenerator) { autoNumbersGenerator.shuffle(); Numbers numbers = new Numbers(autoNumbersGenerator.getSixNumbersFromTheFront()); return new Lottery(numbers); From 81dabd039ae0e06abd2640ec0b1a84cea62f97fd Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 15 Apr 2021 00:16:57 +0900 Subject: [PATCH 41/44] =?UTF-8?q?refactor:=20float=ED=98=95=20double?= =?UTF-8?q?=ED=98=95=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/winningStatistics/PrizeMoney.java | 4 ++-- src/main/java/ui/Printer.java | 2 +- src/test/java/domain/winningStatistics/PrizeMoneyTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/winningStatistics/PrizeMoney.java b/src/main/java/domain/winningStatistics/PrizeMoney.java index c366489..2e885b3 100644 --- a/src/main/java/domain/winningStatistics/PrizeMoney.java +++ b/src/main/java/domain/winningStatistics/PrizeMoney.java @@ -20,12 +20,12 @@ public enum PrizeMoney { this.prizeMoney = prizeMoney; } - public static float calculateEarningsRate(WinningStatistics winningStatistics, int purchasedCount) { + public static double calculateEarningsRate(WinningStatistics winningStatistics, int purchasedCount) { int totalPrizeMoney = Arrays.stream(values()) .mapToInt(prizeMoney -> winningStatistics.get(prizeMoney) * prizeMoney.getPrizeMoney()) .sum(); - return (float)totalPrizeMoney / (purchasedCount * 1000); + return (double)totalPrizeMoney / (purchasedCount * 1000); } public int getMatchingCount() { diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index 030d7db..87ae2b2 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -46,7 +46,7 @@ private void printWinningStatisticsDetails(StringBuilder builder, PrizeMoney pri prizeMoney.getPrizeMoney(), result)); } - public void printTotalEarningsRate(float totalEarningsRate) { + public void printTotalEarningsRate(double totalEarningsRate) { System.out.printf(OutputMessage.TOTAL_EARNINGS_RATE.getMessage(), totalEarningsRate); } } diff --git a/src/test/java/domain/winningStatistics/PrizeMoneyTest.java b/src/test/java/domain/winningStatistics/PrizeMoneyTest.java index 66594a9..ef312b7 100644 --- a/src/test/java/domain/winningStatistics/PrizeMoneyTest.java +++ b/src/test/java/domain/winningStatistics/PrizeMoneyTest.java @@ -22,7 +22,7 @@ class PrizeMoneyTest { int purchasedCount = 20; // when - float earningsRate = PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount); + double earningsRate = PrizeMoney.calculateEarningsRate(winningStatistics, purchasedCount); PrizeMoney[] values = PrizeMoney.values(); // then From c3126e9daa4aa5204265293164680880253fbdc0 Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 15 Apr 2021 00:21:22 +0900 Subject: [PATCH 42/44] =?UTF-8?q?refactor:=20PrizeMoney=20=EB=82=B4?= =?UTF-8?q?=EB=B6=80=EC=97=90=20=EC=9E=88=EB=8D=98=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EC=9E=AC=EC=82=AC=EC=9A=A9=EC=9D=84=20=EC=9C=84=ED=95=B4=20imp?= =?UTF-8?q?ort?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/lotteryStore/PurchasePrice.java | 2 +- src/main/java/domain/winningStatistics/PrizeMoney.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/lotteryStore/PurchasePrice.java b/src/main/java/domain/lotteryStore/PurchasePrice.java index fa29a58..aeefe66 100644 --- a/src/main/java/domain/lotteryStore/PurchasePrice.java +++ b/src/main/java/domain/lotteryStore/PurchasePrice.java @@ -3,7 +3,7 @@ import ui.message.ExceptionMessage; public class PurchasePrice { - private static final int PRICE_OF_ONE_LOTTERY_TICKET = 1000; + public static final int PRICE_OF_ONE_LOTTERY_TICKET = 1000; private final int purchasePrice; diff --git a/src/main/java/domain/winningStatistics/PrizeMoney.java b/src/main/java/domain/winningStatistics/PrizeMoney.java index 2e885b3..c190a95 100644 --- a/src/main/java/domain/winningStatistics/PrizeMoney.java +++ b/src/main/java/domain/winningStatistics/PrizeMoney.java @@ -1,8 +1,12 @@ package domain.winningStatistics; +import domain.lotteryStore.PurchasePrice; + import java.util.Arrays; import java.util.List; +import static domain.lotteryStore.PurchasePrice.PRICE_OF_ONE_LOTTERY_TICKET; + public enum PrizeMoney { THREE(3, false, 5000), FOUR(4, false, 50000), @@ -25,7 +29,7 @@ public static double calculateEarningsRate(WinningStatistics winningStatistics, .mapToInt(prizeMoney -> winningStatistics.get(prizeMoney) * prizeMoney.getPrizeMoney()) .sum(); - return (double)totalPrizeMoney / (purchasedCount * 1000); + return (double)totalPrizeMoney / (purchasedCount * PRICE_OF_ONE_LOTTERY_TICKET); } public int getMatchingCount() { From 7d3da153c9b09777614dfc143daf2915f9d92f0a Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 15 Apr 2021 00:26:12 +0900 Subject: [PATCH 43/44] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20getter=EC=82=AC=EC=9A=A9=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EB=84=A4=EC=9D=B4=EB=B0=8D=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/domain/winningStatistics/PrizeMoney.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/winningStatistics/PrizeMoney.java b/src/main/java/domain/winningStatistics/PrizeMoney.java index c190a95..088d7bb 100644 --- a/src/main/java/domain/winningStatistics/PrizeMoney.java +++ b/src/main/java/domain/winningStatistics/PrizeMoney.java @@ -26,7 +26,7 @@ public enum PrizeMoney { public static double calculateEarningsRate(WinningStatistics winningStatistics, int purchasedCount) { int totalPrizeMoney = Arrays.stream(values()) - .mapToInt(prizeMoney -> winningStatistics.get(prizeMoney) * prizeMoney.getPrizeMoney()) + .mapToInt(money -> winningStatistics.get(money) * money.prizeMoney) .sum(); return (double)totalPrizeMoney / (purchasedCount * PRICE_OF_ONE_LOTTERY_TICKET); From 2b80b877687e9a48256c44ad8c3ddf8cd7f89326 Mon Sep 17 00:00:00 2001 From: songpang Date: Thu, 15 Apr 2021 00:31:48 +0900 Subject: [PATCH 44/44] =?UTF-8?q?refactor:=20=EB=94=94=EB=AF=B8=ED=84=B0?= =?UTF-8?q?=EC=9D=98=20=EB=B2=95=EC=B9=99!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/winningStatistics/ComparisonResult.java | 2 +- src/main/java/domain/winningStatistics/PrizeMoney.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/winningStatistics/ComparisonResult.java b/src/main/java/domain/winningStatistics/ComparisonResult.java index 51ed046..85fbfee 100644 --- a/src/main/java/domain/winningStatistics/ComparisonResult.java +++ b/src/main/java/domain/winningStatistics/ComparisonResult.java @@ -16,7 +16,7 @@ public void checkRanking(WinningStatistics winningStatistics) { } private void checkWinnings(WinningStatistics winningStatistics, PrizeMoney prizeMoney) { - if (matchingCount == prizeMoney.getMatchingCount() + if (prizeMoney.isSameMatchingCount(matchingCount) && isHavingBonusNumberWithFiveMatchingCount() == prizeMoney.isHavingBonusNumber()) { winningStatistics.increase(prizeMoney); } diff --git a/src/main/java/domain/winningStatistics/PrizeMoney.java b/src/main/java/domain/winningStatistics/PrizeMoney.java index 088d7bb..44cb9a6 100644 --- a/src/main/java/domain/winningStatistics/PrizeMoney.java +++ b/src/main/java/domain/winningStatistics/PrizeMoney.java @@ -43,4 +43,8 @@ public boolean isHavingBonusNumber() { public int getPrizeMoney() { return prizeMoney; } + + public boolean isSameMatchingCount(int matchingCount) { + return this.matchingCount == matchingCount; + } }