From 1756707787457ac1b5cd995a043ae697049d5092 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Mon, 29 Mar 2021 18:57:30 +0900 Subject: [PATCH 01/35] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 7c9722c..03a3d72 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,17 @@ # ๐Ÿš€ ๋กœ๋˜ 1๋‹จ๊ณ„ - ์ž๋™ +## ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก +- [ ] ๊ตฌ๋งค ๊ธˆ์•ก ์ž…๋ ฅ ์š”๊ตฌ๋ฌธ ์ถœ๋ ฅ + - [ ] ์ž…๋ ฅ ๊ธˆ์•ก ์˜ˆ์™ธ ์ฒ˜๋ฆฌ +- [ ] ๊ตฌ๋งค ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ +- [ ] ๊ตฌ๋งค ๊ฐœ์ˆ˜ ์ถœ๋ ฅ +- [ ] ๋กœ๋˜ ์ถœ๋ ฅ +- [ ] ์ง€๋‚œ์ฃผ ๋‹น์ฒจ๋ฒˆํ˜ธ ์ž…๋ ฅ ์š”๊ตฌ๋ฌธ ์ถœ๋ ฅ +- [ ] ๋ณด๋„ˆ์Šค๋ณผ ์ž…๋ ฅ ์š”๊ตฌ๋ฌธ ์ถœ๋ ฅ +- [ ] ๋‹น์ฒจ ํ†ต๊ณ„ ๊ณ„์‚ฐ +- [ ] ๊ฒฐ๊ณผ ์ถœ๋ ฅ + + ## ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ - ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ์ž… ๊ธˆ์•ก์— ํ•ด๋‹นํ•˜๋Š” ๋กœ๋˜๋ฅผ ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•œ๋‹ค. - ๋กœ๋˜ 1์žฅ์˜ ๊ฐ€๊ฒฉ์€ 1000์›์ด๋‹ค. From db1647ded75720133718832d3186ad1a7446b3b1 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Mon, 29 Mar 2021 19:01:09 +0900 Subject: [PATCH 02/35] =?UTF-8?q?docs:=20=EC=9E=85=EB=A0=A5=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EC=98=88=EC=99=B8=20=EC=82=AC=ED=95=AD=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 03a3d72..e8d448f 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ - [ ] ๋‹น์ฒจ ํ†ต๊ณ„ ๊ณ„์‚ฐ - [ ] ๊ฒฐ๊ณผ ์ถœ๋ ฅ +## ์ž…๋ ฅ ๊ธˆ์•ก ์˜ˆ์™ธ ์‚ฌํ•ญ +- [ ] 1000์› ์ดํ•˜์ผ ๊ฒฝ์šฐ +- [ ] 1000์› ๋‹จ์œ„๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ + ## ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ - ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ์ž… ๊ธˆ์•ก์— ํ•ด๋‹นํ•˜๋Š” ๋กœ๋˜๋ฅผ ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•œ๋‹ค. From 673ac2ec65c15389e7a17aa4838748bf48d3137a Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Wed, 31 Mar 2021 18:33:59 +0900 Subject: [PATCH 03/35] =?UTF-8?q?docs:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index e8d448f..7a3d21e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,14 @@ - [ ] 1000์› ์ดํ•˜์ผ ๊ฒฝ์šฐ - [ ] 1000์› ๋‹จ์œ„๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ +## ํด๋ž˜์Šค ๋ฐ ๋งค์†Œ๋“œ +- Application +- lottoMachine +- Generator +- Printer +- Receiver + + ## ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ - ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ์ž… ๊ธˆ์•ก์— ํ•ด๋‹นํ•˜๋Š” ๋กœ๋˜๋ฅผ ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•œ๋‹ค. From 5e627909b3489e3aaa39662183e3a97e6e9d50c2 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Wed, 31 Mar 2021 21:54:12 +0900 Subject: [PATCH 04/35] =?UTF-8?q?feat:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- src/main/java/Application.java | 12 ++++++++++++ src/main/java/LottoMachine.java | 4 ++++ src/main/java/LottoNumber.java | 9 +++++++++ src/main/java/Printer.java | 7 +++++++ src/main/java/Receiver.java | 9 +++++++++ 6 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/LottoMachine.java create mode 100644 src/main/java/LottoNumber.java create mode 100644 src/main/java/Printer.java create mode 100644 src/main/java/Receiver.java diff --git a/README.md b/README.md index 7a3d21e..31fc7ba 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,8 @@ ## ํด๋ž˜์Šค ๋ฐ ๋งค์†Œ๋“œ - Application -- lottoMachine +- LottoMachine +- LottoNumber - Generator - Printer - Receiver diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 0000000..1d2f484 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,12 @@ +public class Application { + + public void run(){ + + } + + public static void main(String[] args) { + Application application = new Application(); + application.run(); + + } +} diff --git a/src/main/java/LottoMachine.java b/src/main/java/LottoMachine.java new file mode 100644 index 0000000..8989f4d --- /dev/null +++ b/src/main/java/LottoMachine.java @@ -0,0 +1,4 @@ +public class LottoMachine { + + +} diff --git a/src/main/java/LottoNumber.java b/src/main/java/LottoNumber.java new file mode 100644 index 0000000..e63d342 --- /dev/null +++ b/src/main/java/LottoNumber.java @@ -0,0 +1,9 @@ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class LottoNumber { + private final List lottoNumber = new ArrayList<>(); + + +} diff --git a/src/main/java/Printer.java b/src/main/java/Printer.java new file mode 100644 index 0000000..3e63322 --- /dev/null +++ b/src/main/java/Printer.java @@ -0,0 +1,7 @@ +public class Printer { + private static final String PRICE_REQUEST_MESSAGE = ("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."); + + public void requestPrice(){ + System.out.println(PRICE_REQUEST_MESSAGE); + } +} diff --git a/src/main/java/Receiver.java b/src/main/java/Receiver.java new file mode 100644 index 0000000..efb41c0 --- /dev/null +++ b/src/main/java/Receiver.java @@ -0,0 +1,9 @@ +import java.util.Scanner; + +public class Receiver { + Scanner scanner = new Scanner(System.in); + + public Integer receiveInt(){ + return scanner.nextInt(); + } +} From 73db742ed05295ea8568cce0999670f4665652da Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Thu, 1 Apr 2021 17:04:29 +0900 Subject: [PATCH 05/35] =?UTF-8?q?feat:=20lotto=20=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/{ => Domain}/Application.java | 2 ++ src/main/java/Domain/Lotto.java | 34 +++++++++++++++++++++ src/main/java/Domain/Lottos.java | 19 ++++++++++++ src/main/java/LottoMachine.java | 4 --- src/main/java/LottoNumber.java | 9 ------ src/main/java/{ => UI}/Printer.java | 2 ++ src/main/java/{ => UI}/Receiver.java | 2 ++ src/main/java/empty.txt | 0 src/test/java/empty.txt | 0 9 files changed, 59 insertions(+), 13 deletions(-) rename src/main/java/{ => Domain}/Application.java (91%) create mode 100644 src/main/java/Domain/Lotto.java create mode 100644 src/main/java/Domain/Lottos.java delete mode 100644 src/main/java/LottoMachine.java delete mode 100644 src/main/java/LottoNumber.java rename src/main/java/{ => UI}/Printer.java (94%) rename src/main/java/{ => UI}/Receiver.java (93%) delete mode 100644 src/main/java/empty.txt delete mode 100644 src/test/java/empty.txt diff --git a/src/main/java/Application.java b/src/main/java/Domain/Application.java similarity index 91% rename from src/main/java/Application.java rename to src/main/java/Domain/Application.java index 1d2f484..ec18986 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Domain/Application.java @@ -1,3 +1,5 @@ +package Domain; + public class Application { public void run(){ diff --git a/src/main/java/Domain/Lotto.java b/src/main/java/Domain/Lotto.java new file mode 100644 index 0000000..e34c6a2 --- /dev/null +++ b/src/main/java/Domain/Lotto.java @@ -0,0 +1,34 @@ +package Domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public class Lotto { + private static final int RANDOM_LOTTO_NUMBER_COUNT = 6; + private final Random random = new Random(); + private final List lottoNumber; + + public Lotto(){ + this.lottoNumber = new ArrayList<>(generateRandomLottoNumber()); + + } + + public List generateRandomLottoNumber(){ + List number; + number = ThreadLocalRandom.current() + .ints(1, 45) + .distinct() + .limit(6) + .boxed() + .collect(Collectors.toList()); + return number; + } + + public List getLottoNumber(){ + return lottoNumber; + } +} diff --git a/src/main/java/Domain/Lottos.java b/src/main/java/Domain/Lottos.java new file mode 100644 index 0000000..291cc81 --- /dev/null +++ b/src/main/java/Domain/Lottos.java @@ -0,0 +1,19 @@ +package Domain; + +import java.util.ArrayList; +import java.util.List; + +public class Lottos { + List lottos; + + public Lottos(int lottoTicketCount){ + lottos = new ArrayList<>(lottoTicketCount); + for(int count = 0; count getLottos() { + return lottos; + } +} diff --git a/src/main/java/LottoMachine.java b/src/main/java/LottoMachine.java deleted file mode 100644 index 8989f4d..0000000 --- a/src/main/java/LottoMachine.java +++ /dev/null @@ -1,4 +0,0 @@ -public class LottoMachine { - - -} diff --git a/src/main/java/LottoNumber.java b/src/main/java/LottoNumber.java deleted file mode 100644 index e63d342..0000000 --- a/src/main/java/LottoNumber.java +++ /dev/null @@ -1,9 +0,0 @@ -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class LottoNumber { - private final List lottoNumber = new ArrayList<>(); - - -} diff --git a/src/main/java/Printer.java b/src/main/java/UI/Printer.java similarity index 94% rename from src/main/java/Printer.java rename to src/main/java/UI/Printer.java index 3e63322..2073710 100644 --- a/src/main/java/Printer.java +++ b/src/main/java/UI/Printer.java @@ -1,3 +1,5 @@ +package UI; + public class Printer { private static final String PRICE_REQUEST_MESSAGE = ("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."); diff --git a/src/main/java/Receiver.java b/src/main/java/UI/Receiver.java similarity index 93% rename from src/main/java/Receiver.java rename to src/main/java/UI/Receiver.java index efb41c0..085145e 100644 --- a/src/main/java/Receiver.java +++ b/src/main/java/UI/Receiver.java @@ -1,3 +1,5 @@ +package UI; + import java.util.Scanner; public class Receiver { 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/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29..0000000 From b74d509859e8654fc9b6b4cc97b6f5b40f8a2eff Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Thu, 1 Apr 2021 18:28:17 +0900 Subject: [PATCH 06/35] =?UTF-8?q?refactor:=20=EB=82=9C=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=86=8C=EB=93=9C=20stream?= =?UTF-8?q?=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/Lotto.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/Domain/Lotto.java b/src/main/java/Domain/Lotto.java index e34c6a2..b17b60b 100644 --- a/src/main/java/Domain/Lotto.java +++ b/src/main/java/Domain/Lotto.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; -import java.util.function.Supplier; import java.util.stream.Collectors; public class Lotto { From 5863fc872394a99d25ca597ded44a20aec433770 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Thu, 1 Apr 2021 19:38:38 +0900 Subject: [PATCH 07/35] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=B0=9C?= =?UTF-8?q?=EA=B6=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Domain/Application.java | 9 +++++++++ src/main/java/Domain/TicketBooth.java | 13 +++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/main/java/Domain/TicketBooth.java diff --git a/src/main/java/Domain/Application.java b/src/main/java/Domain/Application.java index ec18986..4ccdef3 100644 --- a/src/main/java/Domain/Application.java +++ b/src/main/java/Domain/Application.java @@ -1,8 +1,17 @@ package Domain; +import UI.Printer; +import UI.Receiver; + public class Application { + private final Printer printer = new Printer(); + private final Receiver receiver = new Receiver(); + private final TicketBooth ticketBooth = new TicketBooth(); + private Lottos lottos; public void run(){ + printer.requestPrice(); + lottos = ticketBooth.issueTicket(receiver.receiveLine()); } diff --git a/src/main/java/Domain/TicketBooth.java b/src/main/java/Domain/TicketBooth.java new file mode 100644 index 0000000..01fe961 --- /dev/null +++ b/src/main/java/Domain/TicketBooth.java @@ -0,0 +1,13 @@ +package Domain; + +import java.util.ArrayList; +import java.util.List; + +public class TicketBooth { + private int ticketCount; + + public Lottos issueTicket(String price){ + ticketCount = Integer.parseInt(price)/1000; + return new Lottos(ticketCount); + } +} From 3406e4a6fec07ee947182b7f3c3027d87fdc45f1 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Thu, 1 Apr 2021 19:39:03 +0900 Subject: [PATCH 08/35] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20String=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/UI/Receiver.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/UI/Receiver.java b/src/main/java/UI/Receiver.java index 085145e..7551de7 100644 --- a/src/main/java/UI/Receiver.java +++ b/src/main/java/UI/Receiver.java @@ -5,7 +5,7 @@ public class Receiver { Scanner scanner = new Scanner(System.in); - public Integer receiveInt(){ - return scanner.nextInt(); + public String receiveLine(){ + return scanner.nextLine(); } } From 1318d7aea2a9cfb7617e6b3427471264c1182a65 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 04:33:56 +0900 Subject: [PATCH 09/35] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Domain/TicketBooth.java | 14 ++++++++++++-- src/main/java/UI/Printer.java | 12 ++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/Domain/TicketBooth.java b/src/main/java/Domain/TicketBooth.java index 01fe961..26e8a19 100644 --- a/src/main/java/Domain/TicketBooth.java +++ b/src/main/java/Domain/TicketBooth.java @@ -1,13 +1,23 @@ package Domain; +import UI.Printer; + import java.util.ArrayList; import java.util.List; public class TicketBooth { + private static final int LOTTO_PRICE = 1000; private int ticketCount; - public Lottos issueTicket(String price){ - ticketCount = Integer.parseInt(price)/1000; + public Lottos issueTicket(String price, Printer printer){ + ticketCount = Integer.parseInt(price)/LOTTO_PRICE; + printer.printTicketCount(ticketCount); return new Lottos(ticketCount); } + + public void printLottoNumber(Lottos lottos, Printer printer){ + for(int count = 0; count Date: Fri, 2 Apr 2021 04:39:42 +0900 Subject: [PATCH 10/35] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 31fc7ba..b0b4ed9 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,24 @@ # ๐Ÿš€ ๋กœ๋˜ 1๋‹จ๊ณ„ - ์ž๋™ -## ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก -- [ ] ๊ตฌ๋งค ๊ธˆ์•ก ์ž…๋ ฅ ์š”๊ตฌ๋ฌธ ์ถœ๋ ฅ - - [ ] ์ž…๋ ฅ ๊ธˆ์•ก ์˜ˆ์™ธ ์ฒ˜๋ฆฌ -- [ ] ๊ตฌ๋งค ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ -- [ ] ๊ตฌ๋งค ๊ฐœ์ˆ˜ ์ถœ๋ ฅ -- [ ] ๋กœ๋˜ ์ถœ๋ ฅ -- [ ] ์ง€๋‚œ์ฃผ ๋‹น์ฒจ๋ฒˆํ˜ธ ์ž…๋ ฅ ์š”๊ตฌ๋ฌธ ์ถœ๋ ฅ -- [ ] ๋ณด๋„ˆ์Šค๋ณผ ์ž…๋ ฅ ์š”๊ตฌ๋ฌธ ์ถœ๋ ฅ -- [ ] ๋‹น์ฒจ ํ†ต๊ณ„ ๊ณ„์‚ฐ -- [ ] ๊ฒฐ๊ณผ ์ถœ๋ ฅ +## ๐Ÿ“‹๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก +* **UI ๋กœ์ง** + - [ ] ๊ตฌ๋งค ๊ธˆ์•ก ์ž…๋ ฅ + - [ ] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ(๋ณด๋„ˆ์Šค ๋ณผ) + - [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ถœ๋ ฅ + - [ ] ๋‹น์ฒจ ๊ธˆ์•ก ์ถœ๋ ฅ + - [ ] ์ˆ˜์ต๋ฅ  ์ถœ๋ ฅ + +* **๋น„์ง€๋‹ˆ์Šค ๋กœ์ง** + - [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 45๊นŒ์ง€ ํ—ˆ์šฉ + - [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ + - [ ] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” 1๊ฐœ + - [ ] ๋กœ๋˜ ํ•œ ์žฅ ๋‹น ๊ฐ€๊ฒฉ์€ 1000์› + - [ ] ๋กœ๋˜ ํ‹ฐ์ผ“ ๊ฐฏ์ˆ˜ ๊ณ„์‚ฐ + - [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ + - [ ] ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ + - [ ] ๋‹น์ฒจ ๊ธˆ์•ก ๊ณ„์‚ฐ + - [ ] ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ + ## ์ž…๋ ฅ ๊ธˆ์•ก ์˜ˆ์™ธ ์‚ฌํ•ญ - [ ] 1000์› ์ดํ•˜์ผ ๊ฒฝ์šฐ From 380b00e6f6cbf59909bb3e6e25a2077f9ac5f86a Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 04:40:37 +0900 Subject: [PATCH 11/35] =?UTF-8?q?docs:=20=EC=98=88=EC=99=B8=20=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=AA=A9=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b0b4ed9..8f2b8fc 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,17 @@ - [ ] ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ -## ์ž…๋ ฅ ๊ธˆ์•ก ์˜ˆ์™ธ ์‚ฌํ•ญ -- [ ] 1000์› ์ดํ•˜์ผ ๊ฒฝ์šฐ -- [ ] 1000์› ๋‹จ์œ„๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ +## ๐ŸŽฏ์˜ˆ์™ธ ์‚ฌํ•ญ ๋ชฉ๋ก +* **๊ตฌ๋งค ๊ธˆ์•ก ์ž…๋ ฅ** + - [ ] 1000์› ์ดํ•˜์ผ ๊ฒฝ์šฐ + - [ ] 1000์› ๋‹จ์œ„๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ + +* **๋กœ๋˜ ๋ฒˆํ˜ธ ์ž…๋ ฅ** + - [ ] 46 ์ด์ƒ์˜ ์ž…๋ ฅ์ด ์žˆ์„ ๊ฒฝ์šฐ + - [ ] ์ค‘๋ณต๋œ ์ˆ˜๊ฐ€ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ + - [ ] 6๊ฐœ ์ด์ƒ ์ž…๋ ฅ ๋  ๊ฒฝ์šฐ + - [ ] ๋ณด๋„ˆ์Šค ๋ณผ์ด 1๊ฐœ ์ด์ƒ ์ž…๋ ฅ ๋  ๊ฒฝ์šฐ + ## ํด๋ž˜์Šค ๋ฐ ๋งค์†Œ๋“œ - Application From 6aea022891161048b8fc997cdbc31471df3fd0b9 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 04:42:13 +0900 Subject: [PATCH 12/35] =?UTF-8?q?docs:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8f2b8fc..b3b25a4 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,9 @@ ## ํด๋ž˜์Šค ๋ฐ ๋งค์†Œ๋“œ - Application -- LottoMachine -- LottoNumber -- Generator +- Lotto +- Lottos +- WinningNumber - Printer - Receiver From 2e761cf60c8a99ebc53f7310b642f72f9629e4cc Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:45:20 +0900 Subject: [PATCH 13/35] =?UTF-8?q?refactor:=20LottoTicket=20=EA=B5=AC?= =?UTF-8?q?=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 --- src/main/java/Domain/Lotto.java | 33 ------------------- src/main/java/lotto/domain/LottoTicket.java | 29 ++++++++++++++++ .../java/lotto/domain/LottoTicketTest.java | 33 +++++++++++++++++++ 3 files changed, 62 insertions(+), 33 deletions(-) delete mode 100644 src/main/java/Domain/Lotto.java create mode 100644 src/main/java/lotto/domain/LottoTicket.java create mode 100644 src/test/java/lotto/domain/LottoTicketTest.java diff --git a/src/main/java/Domain/Lotto.java b/src/main/java/Domain/Lotto.java deleted file mode 100644 index b17b60b..0000000 --- a/src/main/java/Domain/Lotto.java +++ /dev/null @@ -1,33 +0,0 @@ -package Domain; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; - -public class Lotto { - private static final int RANDOM_LOTTO_NUMBER_COUNT = 6; - private final Random random = new Random(); - private final List lottoNumber; - - public Lotto(){ - this.lottoNumber = new ArrayList<>(generateRandomLottoNumber()); - - } - - public List generateRandomLottoNumber(){ - List number; - number = ThreadLocalRandom.current() - .ints(1, 45) - .distinct() - .limit(6) - .boxed() - .collect(Collectors.toList()); - return number; - } - - public List getLottoNumber(){ - return lottoNumber; - } -} diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java new file mode 100644 index 0000000..d068c0a --- /dev/null +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -0,0 +1,29 @@ +package lotto.domain; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +public class LottoTicket { + private static final int NUMBER_OF_LOTTO_NUMBERS = 6; + private final List lottoNumbers; + public LottoTicket() { + List lottoNumbers = LottoNumber.range(); + lottoNumbers = generateLottoNumbers(lottoNumbers); + this.lottoNumbers = new ArrayList<>(lottoNumbers); + } + private List generateLottoNumbers(List lottoNumbers) { + Collections.shuffle(lottoNumbers); + lottoNumbers = lottoNumbers.stream() + .limit(NUMBER_OF_LOTTO_NUMBERS) + .sorted(Comparator.comparing(LottoNumber::getLottoNumber)) + .collect(Collectors.toList()); + return lottoNumbers; + } + public boolean contains(LottoNumber lottoNumber) { + return lottoNumbers.contains(lottoNumber); + } + public List getLottoNumbers() { + return lottoNumbers; + } +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoTicketTest.java b/src/test/java/lotto/domain/LottoTicketTest.java new file mode 100644 index 0000000..e1072aa --- /dev/null +++ b/src/test/java/lotto/domain/LottoTicketTest.java @@ -0,0 +1,33 @@ +package lotto.domain; +import org.junit.jupiter.api.Test; +import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; +class LottoTicketTest { + @Test + void numberOfLottoNumbers() { + //given + int expected = 6; + //when + LottoTicket lottoTicket = new LottoTicket(); + List lottoNumbers = lottoTicket.getLottoNumbers(); + int actual = lottoNumbers.size(); + //then + assertThat(actual).isEqualTo(expected); + } + @Test + void rangeOfLottoNumbers() { + //given + final int UPPER_BOUND = 45; + final int LOWER_BOUND = 1; + //when + LottoTicket lottoTicket = new LottoTicket(); + List lottoNumbers = lottoTicket.getLottoNumbers(); + //then + lottoNumbers.forEach( + lottoNumber -> assertThat(lottoNumber.getLottoNumber()) + .isGreaterThanOrEqualTo(LOWER_BOUND) + .isLessThanOrEqualTo(UPPER_BOUND) + ); + } +} \ No newline at end of file From 40543c850fb880a4aafba7a98d1505ad69d739e5 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:46:36 +0900 Subject: [PATCH 14/35] =?UTF-8?q?feat:=20LottoApplication=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/Domain/Application.java | 23 ------------ src/main/java/lotto/LottoApplication.java | 46 +++++++++++++++++++++++ 2 files changed, 46 insertions(+), 23 deletions(-) delete mode 100644 src/main/java/Domain/Application.java create mode 100644 src/main/java/lotto/LottoApplication.java diff --git a/src/main/java/Domain/Application.java b/src/main/java/Domain/Application.java deleted file mode 100644 index 4ccdef3..0000000 --- a/src/main/java/Domain/Application.java +++ /dev/null @@ -1,23 +0,0 @@ -package Domain; - -import UI.Printer; -import UI.Receiver; - -public class Application { - private final Printer printer = new Printer(); - private final Receiver receiver = new Receiver(); - private final TicketBooth ticketBooth = new TicketBooth(); - private Lottos lottos; - - public void run(){ - printer.requestPrice(); - lottos = ticketBooth.issueTicket(receiver.receiveLine()); - - } - - public static void main(String[] args) { - Application application = new Application(); - application.run(); - - } -} diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java new file mode 100644 index 0000000..2279106 --- /dev/null +++ b/src/main/java/lotto/LottoApplication.java @@ -0,0 +1,46 @@ +package lotto; +import lotto.domain.*; +import lotto.ui.Printer; +import lotto.ui.Receiver; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +public class LottoApplication { + private static final String WINNING_NUMBER_INPUT_DELIMITER = ", "; + private final Printer printer; + private final Receiver receiver; + public LottoApplication(Printer printer, Receiver receiver) { + this.printer = printer; + this.receiver = receiver; + } + public void run() { + int purchaseAmount = receivePurchaseAmount(); + LottoTickets lottoTickets = Issuer.issueLottoTickets(purchaseAmount); + printer.printIssuedTickets(lottoTickets); + WinningNumber winningNumber = new WinningNumber(receiveWinningNumber(), receiveBonusNumber()); + GameResults gameResults = lottoTickets.matchNumbers(winningNumber); + Statistics statistics = new Statistics(gameResults, purchaseAmount); + printer.printStatistics(statistics); + } + private int receivePurchaseAmount() { + printer.requestPurchaseAmount(); + String purchaseAmount = receiver.receiveLine(); + return Integer.parseInt(purchaseAmount); + } + private List receiveWinningNumber() { + printer.requestWinningNumber(); + String winningNumber = receiver.receiveLine(); + return Arrays.stream(winningNumber.split(WINNING_NUMBER_INPUT_DELIMITER)) + .map(Integer::valueOf) + .collect(Collectors.toList()); + } + private int receiveBonusNumber() { + printer.requestBonusNumber(); + String bonusNumber = receiver.receiveLine(); + return Integer.parseInt(bonusNumber); + } + public static void main(String[] args) { + LottoApplication app = new LottoApplication(new Printer(), new Receiver()); + app.run(); + } +} \ No newline at end of file From 983c002f31dde15d60652a03a2a45daf7ee47586 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:47:21 +0900 Subject: [PATCH 15/35] =?UTF-8?q?feat:=20Printer=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/UI/Printer.java | 21 ---------- src/main/java/lotto/ui/Printer.java | 64 +++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/UI/Printer.java create mode 100644 src/main/java/lotto/ui/Printer.java diff --git a/src/main/java/UI/Printer.java b/src/main/java/UI/Printer.java deleted file mode 100644 index e9b8d6e..0000000 --- a/src/main/java/UI/Printer.java +++ /dev/null @@ -1,21 +0,0 @@ -package UI; - -import Domain.Lotto; -import Domain.Lottos; - -public class Printer { - private static final String PRICE_REQUEST_MESSAGE = ("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."); - private static final String TICKET_COUNT_MESSAGE = ("๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค."); - - public void requestPrice(){ - System.out.println(PRICE_REQUEST_MESSAGE); - } - - public void printTicketCount(int count){ - System.out.println(count + TICKET_COUNT_MESSAGE); - } - - public void printLottoNumber(Lotto lotto){ - System.out.println(lotto.getLottoNumber()); - } -} diff --git a/src/main/java/lotto/ui/Printer.java b/src/main/java/lotto/ui/Printer.java new file mode 100644 index 0000000..2de33c7 --- /dev/null +++ b/src/main/java/lotto/ui/Printer.java @@ -0,0 +1,64 @@ +package lotto.ui; +import lotto.domain.*; +import java.util.List; +import java.util.stream.Collectors; +public class Printer { + private static final String PURCHASE_AMOUNT_REQUEST_MESSAGE = "๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; + private static final String PURCHASE_MESSAGE = "๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค."; + private static final String LOTTO_NUMBER_DELIMITER = ", "; + private static final String LEFT_CLOSER = "["; + private static final String RIGHT_CLOSER = "]"; + private static final String WINNING_NUMBER_REQUEST_MESSAGE = "์ง€๋‚œ ์ฃผ ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; + private static final String BONUS_NUMBER_REQUEST_MESSAGE = "๋ณด๋„ˆ์Šค ๋ณผ์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; + private static final String WINNING_STATISTICS_MESSAGE = "๋‹น์ฒจ ํ†ต๊ณ„"; + private static final String DIVIDER_LINE = "----------"; + private static final String WINNING_RESULT_MESSAGE = "%s (%d์›) - %d๊ฐœ\n"; + private static final String EARNING_RATE_MESSAGE = "์ด ์ˆ˜์ต๋ฅ ์€ %2f์ž…๋‹ˆ๋‹ค.(๊ธฐ์ค€์ด 1์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ %s๋ผ๋Š” ์˜๋ฏธ์ž„)"; + private static final String PROFIT_MESSAGE = "์ด์ต"; + private static final String LOSS_MESSAGE = "์†ํ•ด"; + public void requestPurchaseAmount() { + System.out.println(PURCHASE_AMOUNT_REQUEST_MESSAGE); + } + public void printIssuedTickets(LottoTickets lottoTickets) { + List tickets = lottoTickets.getLottoTickets(); + printNumberOfTickets(tickets); + printLottoTickets(tickets); + } + private void printNumberOfTickets(List tickets) { + int numberOfTickets = tickets.size(); + System.out.println(numberOfTickets + PURCHASE_MESSAGE); + } + private void printLottoTickets(List tickets) { + for (LottoTicket ticket : tickets) { + String lottoNumbers = ticket.getLottoNumbers() + .stream() + .map(LottoNumber::getLottoNumber) + .map(String::valueOf) + .collect(Collectors.joining(LOTTO_NUMBER_DELIMITER)); + System.out.println(LEFT_CLOSER + lottoNumbers + RIGHT_CLOSER); + } + } + public void requestWinningNumber() { + System.out.println(WINNING_NUMBER_REQUEST_MESSAGE); + } + public void requestBonusNumber() { + System.out.println(BONUS_NUMBER_REQUEST_MESSAGE); + } + public void printStatistics(Statistics statistics) { + System.out.println(WINNING_STATISTICS_MESSAGE); + System.out.println(DIVIDER_LINE); + for (WinningResult winningResult : statistics.winningDTOs()) { + GameResult gameResult = winningResult.getGameResult(); + System.out.printf(WINNING_RESULT_MESSAGE, gameResult.getDescription(), gameResult.getPrize(), winningResult.getNumberOfWinners()); + } + System.out.println(); + double earningRate = statistics.calculateEarningRate(); + System.out.printf(EARNING_RATE_MESSAGE, earningRate, profitAndLossMessage(statistics.isProfit(earningRate))); + } + private String profitAndLossMessage(boolean isProfit) { + if (isProfit) { + return PROFIT_MESSAGE; + } + return LOSS_MESSAGE; + } +} \ No newline at end of file From e1efbaf0a75634bb0011d3fa093255cb2f686a5d Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:48:03 +0900 Subject: [PATCH 16/35] =?UTF-8?q?refactor:=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?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 --- src/main/java/UI/Receiver.java | 11 ----------- src/main/java/lotto/ui/Receiver.java | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 src/main/java/UI/Receiver.java create mode 100644 src/main/java/lotto/ui/Receiver.java diff --git a/src/main/java/UI/Receiver.java b/src/main/java/UI/Receiver.java deleted file mode 100644 index 7551de7..0000000 --- a/src/main/java/UI/Receiver.java +++ /dev/null @@ -1,11 +0,0 @@ -package UI; - -import java.util.Scanner; - -public class Receiver { - Scanner scanner = new Scanner(System.in); - - public String receiveLine(){ - return scanner.nextLine(); - } -} diff --git a/src/main/java/lotto/ui/Receiver.java b/src/main/java/lotto/ui/Receiver.java new file mode 100644 index 0000000..9b03ded --- /dev/null +++ b/src/main/java/lotto/ui/Receiver.java @@ -0,0 +1,11 @@ +package lotto.ui; +import java.util.Scanner; +public class Receiver { + private final Scanner scanner; + public Receiver() { + scanner = new Scanner(System.in); + } + public String receiveLine() { + return scanner.nextLine(); + } +} \ No newline at end of file From b0db442a207352533d1a1da38d4914271af13b18 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:49:31 +0900 Subject: [PATCH 17/35] =?UTF-8?q?fix:=20language=20level=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 --- README.md | 40 ++++++++++++++++++++-------------------- build.gradle | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index b3b25a4..591cf11 100644 --- a/README.md +++ b/README.md @@ -2,34 +2,34 @@ ## ๐Ÿ“‹๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ชฉ๋ก * **UI ๋กœ์ง** - - [ ] ๊ตฌ๋งค ๊ธˆ์•ก ์ž…๋ ฅ - - [ ] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ(๋ณด๋„ˆ์Šค ๋ณผ) - - [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ถœ๋ ฅ - - [ ] ๋‹น์ฒจ ๊ธˆ์•ก ์ถœ๋ ฅ - - [ ] ์ˆ˜์ต๋ฅ  ์ถœ๋ ฅ + - [x] ๊ตฌ๋งค ๊ธˆ์•ก ์ž…๋ ฅ + - [x] ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ(๋ณด๋„ˆ์Šค ๋ณผ) + - [x] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ถœ๋ ฅ + - [x] ๋‹น์ฒจ ๊ธˆ์•ก ์ถœ๋ ฅ + - [x] ์ˆ˜์ต๋ฅ  ์ถœ๋ ฅ * **๋น„์ง€๋‹ˆ์Šค ๋กœ์ง** - - [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 45๊นŒ์ง€ ํ—ˆ์šฉ - - [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ - - [ ] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” 1๊ฐœ - - [ ] ๋กœ๋˜ ํ•œ ์žฅ ๋‹น ๊ฐ€๊ฒฉ์€ 1000์› - - [ ] ๋กœ๋˜ ํ‹ฐ์ผ“ ๊ฐฏ์ˆ˜ ๊ณ„์‚ฐ - - [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ - - [ ] ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ - - [ ] ๋‹น์ฒจ ๊ธˆ์•ก ๊ณ„์‚ฐ - - [ ] ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ + - [x] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 45๊นŒ์ง€ ํ—ˆ์šฉ + - [x] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ + - [x] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” 1๊ฐœ + - [x] ๋กœ๋˜ ํ•œ ์žฅ ๋‹น ๊ฐ€๊ฒฉ์€ 1000์› + - [x] ๋กœ๋˜ ํ‹ฐ์ผ“ ๊ฐฏ์ˆ˜ ๊ณ„์‚ฐ + - [x] ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ + - [x] ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ + - [x] ๋‹น์ฒจ ๊ธˆ์•ก ๊ณ„์‚ฐ + - [x] ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ ## ๐ŸŽฏ์˜ˆ์™ธ ์‚ฌํ•ญ ๋ชฉ๋ก * **๊ตฌ๋งค ๊ธˆ์•ก ์ž…๋ ฅ** - - [ ] 1000์› ์ดํ•˜์ผ ๊ฒฝ์šฐ - - [ ] 1000์› ๋‹จ์œ„๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ + - [x] 1000์› ์ดํ•˜์ผ ๊ฒฝ์šฐ + - [x] 1000์› ๋‹จ์œ„๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ * **๋กœ๋˜ ๋ฒˆํ˜ธ ์ž…๋ ฅ** - - [ ] 46 ์ด์ƒ์˜ ์ž…๋ ฅ์ด ์žˆ์„ ๊ฒฝ์šฐ - - [ ] ์ค‘๋ณต๋œ ์ˆ˜๊ฐ€ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ - - [ ] 6๊ฐœ ์ด์ƒ ์ž…๋ ฅ ๋  ๊ฒฝ์šฐ - - [ ] ๋ณด๋„ˆ์Šค ๋ณผ์ด 1๊ฐœ ์ด์ƒ ์ž…๋ ฅ ๋  ๊ฒฝ์šฐ + - [x] 46 ์ด์ƒ์˜ ์ž…๋ ฅ์ด ์žˆ์„ ๊ฒฝ์šฐ + - [x] ์ค‘๋ณต๋œ ์ˆ˜๊ฐ€ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ + - [x] 6๊ฐœ ์ด์ƒ ์ž…๋ ฅ ๋  ๊ฒฝ์šฐ + - [x] ๋ณด๋„ˆ์Šค ๋ณผ์ด 1๊ฐœ ์ด์ƒ ์ž…๋ ฅ ๋  ๊ฒฝ์šฐ ## ํด๋ž˜์Šค ๋ฐ ๋งค์†Œ๋“œ diff --git a/build.gradle b/build.gradle index db8d2fd..81a4222 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'java' apply plugin: 'eclipse' version = '1.0.0' -sourceCompatibility = 1.8 +sourceCompatibility = 14 repositories { mavenCentral() From f5c957781a00afc127208b0d8facbb10fbc3a12d Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:49:57 +0900 Subject: [PATCH 18/35] =?UTF-8?q?feat:=20GameResult=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/GameResult.java | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/lotto/domain/GameResult.java diff --git a/src/main/java/lotto/domain/GameResult.java b/src/main/java/lotto/domain/GameResult.java new file mode 100644 index 0000000..333569c --- /dev/null +++ b/src/main/java/lotto/domain/GameResult.java @@ -0,0 +1,39 @@ +package lotto.domain; +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; +public enum GameResult { + UNDER_THREE_MATCHED(MatchCount::isUnderThree, "2๊ฐœ ์ดํ•˜ ์ผ์น˜", 0), + THREE_MATCHED(MatchCount::isMatchThree, "3๊ฐœ ์ผ์น˜", 5_000), + FOUR_MATCHED(MatchCount::isMatchFour, "4๊ฐœ ์ผ์น˜", 50_000), + FIVE_MATCHED_WITHOUT_BONUS(MatchCount::isMatchFiveWithoutBonus, "5๊ฐœ ์ผ์น˜", 1_500_000), + FIVE_MATCHED_WITH_BONUS(MatchCount::isMatchFiveWithBonus, "5๊ฐœ ์ผ์น˜, ๋ณด๋„ˆ์Šค ๋ณผ ์ผ์น˜", 30_000_000), + ALL_MATCHED(MatchCount::isAllMatch, "6๊ฐœ ์ผ์น˜", 2_000_000_000); + private static final String UNSUPPORTED_MATCH_COUNT_EXCEPTION_MESSAGE = "์ผ์น˜ํ•˜๋Š” ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."; + private final Predicate matchPredicate; + private final String description; + private final int prize; + GameResult(Predicate matchPredicate, String description, int prize) { + this.matchPredicate = matchPredicate; + this.description = description; + this.prize = prize; + } + public static GameResult evaluate(MatchCount matchCount) { + return Arrays.stream(GameResult.values()) + .filter(gameResult -> gameResult.matchPredicate.test(matchCount)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(UNSUPPORTED_MATCH_COUNT_EXCEPTION_MESSAGE)); + } + public static List valuesWithoutUnderThreeMatched() { + return Arrays.stream(GameResult.values()) + .filter(gameResult -> !gameResult.equals(GameResult.UNDER_THREE_MATCHED)) + .collect(Collectors.toList()); + } + public String getDescription() { + return description; + } + public int getPrize() { + return prize; + } +} \ No newline at end of file From 4b04a8b20aba54b0598a69f843d02fca3034b0a2 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:50:25 +0900 Subject: [PATCH 19/35] =?UTF-8?q?refactor:=20LottoTickets=20=EA=B5=AC?= =?UTF-8?q?=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 --- src/main/java/Domain/Lottos.java | 19 ------------------- src/main/java/lotto/domain/LottoTickets.java | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 19 deletions(-) delete mode 100644 src/main/java/Domain/Lottos.java create mode 100644 src/main/java/lotto/domain/LottoTickets.java diff --git a/src/main/java/Domain/Lottos.java b/src/main/java/Domain/Lottos.java deleted file mode 100644 index 291cc81..0000000 --- a/src/main/java/Domain/Lottos.java +++ /dev/null @@ -1,19 +0,0 @@ -package Domain; - -import java.util.ArrayList; -import java.util.List; - -public class Lottos { - List lottos; - - public Lottos(int lottoTicketCount){ - lottos = new ArrayList<>(lottoTicketCount); - for(int count = 0; count getLottos() { - return lottos; - } -} diff --git a/src/main/java/lotto/domain/LottoTickets.java b/src/main/java/lotto/domain/LottoTickets.java new file mode 100644 index 0000000..796f583 --- /dev/null +++ b/src/main/java/lotto/domain/LottoTickets.java @@ -0,0 +1,20 @@ +package lotto.domain; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +public class LottoTickets { + private final List lottoTickets; + public LottoTickets(List lottoTickets) { + this.lottoTickets = new ArrayList<>(lottoTickets); + } + public GameResults matchNumbers(WinningNumber winningNumber) { + List results = lottoTickets.stream() + .map(winningNumber::matchNumbers) + .map(GameResult::evaluate) + .collect(Collectors.toList()); + return new GameResults(results); + } + public List getLottoTickets() { + return lottoTickets; + } +} \ No newline at end of file From c0d628154986492cea9dfd4561e84ab44cdf7672 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:51:11 +0900 Subject: [PATCH 20/35] =?UTF-8?q?refactor:=20Issuer=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=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/Domain/TicketBooth.java | 23 ----------------------- src/main/java/lotto/domain/Issuer.java | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 23 deletions(-) delete mode 100644 src/main/java/Domain/TicketBooth.java create mode 100644 src/main/java/lotto/domain/Issuer.java diff --git a/src/main/java/Domain/TicketBooth.java b/src/main/java/Domain/TicketBooth.java deleted file mode 100644 index 26e8a19..0000000 --- a/src/main/java/Domain/TicketBooth.java +++ /dev/null @@ -1,23 +0,0 @@ -package Domain; - -import UI.Printer; - -import java.util.ArrayList; -import java.util.List; - -public class TicketBooth { - private static final int LOTTO_PRICE = 1000; - private int ticketCount; - - public Lottos issueTicket(String price, Printer printer){ - ticketCount = Integer.parseInt(price)/LOTTO_PRICE; - printer.printTicketCount(ticketCount); - return new Lottos(ticketCount); - } - - public void printLottoNumber(Lottos lottos, Printer printer){ - for(int count = 0; count lottoTickets = new ArrayList<>(); + for (int i = 0; i < numberOfTickets; i++) { + lottoTickets.add(new LottoTicket()); + } + return new LottoTickets(lottoTickets); + } + private static void validate(int numberOfTickets) { + if (numberOfTickets < MINIMUM_NUMBER_OF_TICKETS) { + throw new IllegalArgumentException(MONEY_AMOUNT_EXCEPTION_MESSAGE); + } + } +} \ No newline at end of file From 60fc2a09c64b58a519e40408f66fb1c16d3ce7c0 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:51:33 +0900 Subject: [PATCH 21/35] =?UTF-8?q?feat:=20Statistics=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Statistics.java | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/lotto/domain/Statistics.java diff --git a/src/main/java/lotto/domain/Statistics.java b/src/main/java/lotto/domain/Statistics.java new file mode 100644 index 0000000..8b47ad0 --- /dev/null +++ b/src/main/java/lotto/domain/Statistics.java @@ -0,0 +1,23 @@ +package lotto.domain; +import java.util.List; +import java.util.stream.Collectors; +public class Statistics { + private final GameResults gameResults; + private final int purchaseAmount; + public Statistics(GameResults gameResults, int purchaseAmount) { + this.gameResults = gameResults; + this.purchaseAmount = purchaseAmount; + } + public List winningDTOs() { + return GameResult.valuesWithoutUnderThreeMatched() + .stream() + .map(gameResult -> new WinningResult(gameResults.count(gameResult), gameResult)) + .collect(Collectors.toList()); + } + public double calculateEarningRate() { + return gameResults.calculatePrize() / purchaseAmount; + } + public boolean isProfit(double earningRate) { + return earningRate > 1; + } +} \ No newline at end of file From a01c323ef5770db84717dab2d064d1044fc94266 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:51:48 +0900 Subject: [PATCH 22/35] =?UTF-8?q?feat:=20MatchCount=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/MatchCount.java | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/lotto/domain/MatchCount.java diff --git a/src/main/java/lotto/domain/MatchCount.java b/src/main/java/lotto/domain/MatchCount.java new file mode 100644 index 0000000..5347988 --- /dev/null +++ b/src/main/java/lotto/domain/MatchCount.java @@ -0,0 +1,27 @@ +package lotto.domain; +public class MatchCount { + private final int matchCount; + private final boolean isBonusMatch; + public MatchCount(int matchCount, boolean isBonusMatch) { + this.matchCount = matchCount; + this.isBonusMatch = isBonusMatch; + } + public boolean isUnderThree() { + return matchCount < 3; + } + public boolean isMatchThree() { + return matchCount == 3; + } + public boolean isMatchFour() { + return matchCount == 4; + } + public boolean isMatchFiveWithoutBonus() { + return matchCount == 5 && !isBonusMatch; + } + public boolean isMatchFiveWithBonus() { + return matchCount == 5 && isBonusMatch; + } + public boolean isAllMatch() { + return matchCount == 6; + } +} \ No newline at end of file From 77cddd718421b44c2cf4ceb9406a24b773e8aea7 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:52:08 +0900 Subject: [PATCH 23/35] =?UTF-8?q?feat:=20LottoNumber=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoNumber.java | 44 +++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoNumber.java diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/LottoNumber.java new file mode 100644 index 0000000..42c55cf --- /dev/null +++ b/src/main/java/lotto/domain/LottoNumber.java @@ -0,0 +1,44 @@ +package lotto.domain; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +public class LottoNumber { + private static final int LOTTO_NUMBER_LOWER_BOUND = 1; + private static final int LOTTO_NUMBER_UPPER_BOUND = 45; + private static final String LOTTO_NUMBER_RANGE_EXCEPTION_MESSAGE = + "๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” " + LOTTO_NUMBER_LOWER_BOUND + " ์ด์ƒ, " + LOTTO_NUMBER_UPPER_BOUND + " ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."; + private final int lottoNumber; + public LottoNumber(int lottoNumber) { + validate(lottoNumber); + this.lottoNumber = lottoNumber; + } + private void validate(int lottoNumber) { + if (!isInRange(lottoNumber)) { + throw new IllegalArgumentException(LOTTO_NUMBER_RANGE_EXCEPTION_MESSAGE); + } + } + private boolean isInRange(int lottoNumber) { + return lottoNumber >= LOTTO_NUMBER_LOWER_BOUND && lottoNumber <= LOTTO_NUMBER_UPPER_BOUND; + } + public static List range() { + return IntStream.range(LOTTO_NUMBER_LOWER_BOUND, LOTTO_NUMBER_UPPER_BOUND + 1) + .boxed() + .map(LottoNumber::new) + .collect(Collectors.toList()); + } + public int getLottoNumber() { + return lottoNumber; + } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoNumber that = (LottoNumber) o; + return lottoNumber == that.lottoNumber; + } + @Override + public int hashCode() { + return Objects.hash(lottoNumber); + } +} \ No newline at end of file From f2068d15aea50326c6a33f6bd3b5fc0b9ee63257 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:52:30 +0900 Subject: [PATCH 24/35] =?UTF-8?q?feat:=20WinningNumber=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/lotto/domain/WinningNumber.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/lotto/domain/WinningNumber.java diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/WinningNumber.java new file mode 100644 index 0000000..1192eda --- /dev/null +++ b/src/main/java/lotto/domain/WinningNumber.java @@ -0,0 +1,29 @@ +package lotto.domain; +import java.util.List; +import java.util.stream.Collectors; +public class WinningNumber { + private static final String BONUS_NUMBER_EXCEPTION_MESSAGE = "๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."; + private final List winningNumbers; + private final LottoNumber bonusNumber; + public WinningNumber(List winningNumbers, int bonusNumber) { + validate(winningNumbers, bonusNumber); + this.winningNumbers = winningNumbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toUnmodifiableList()); + this.bonusNumber = new LottoNumber(bonusNumber); + } + private void validate(List winningNumbers, int bonusNumber) { + if (winningNumbers.contains(bonusNumber)) { + throw new IllegalArgumentException(BONUS_NUMBER_EXCEPTION_MESSAGE); + } + } + public MatchCount matchNumbers(LottoTicket lottoTicket) { + int matchCount = Long.valueOf( + winningNumbers.stream() + .filter(lottoTicket::contains) + .count() + ).intValue(); + boolean isBonusMatch = lottoTicket.contains(bonusNumber); + return new MatchCount(matchCount, isBonusMatch); + } +} \ No newline at end of file From 1e16e0db6233841b9d8a3822de840aecfa4aa424 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:52:44 +0900 Subject: [PATCH 25/35] =?UTF-8?q?feat:=20WinningResult=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/lotto/domain/WinningResult.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/lotto/domain/WinningResult.java diff --git a/src/main/java/lotto/domain/WinningResult.java b/src/main/java/lotto/domain/WinningResult.java new file mode 100644 index 0000000..55eb347 --- /dev/null +++ b/src/main/java/lotto/domain/WinningResult.java @@ -0,0 +1,15 @@ +package lotto.domain; +public class WinningResult { + private final int numberOfWinners; + private final GameResult gameResult; + public WinningResult(int numberOfWinners, GameResult gameResult) { + this.numberOfWinners = numberOfWinners; + this.gameResult = gameResult; + } + public int getNumberOfWinners() { + return numberOfWinners; + } + public GameResult getGameResult() { + return gameResult; + } +} \ No newline at end of file From f13151d3ef6f5f07a30cfed73990718e96204190 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:53:07 +0900 Subject: [PATCH 26/35] =?UTF-8?q?feat:=20GameResults=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/GameResults.java | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/lotto/domain/GameResults.java diff --git a/src/main/java/lotto/domain/GameResults.java b/src/main/java/lotto/domain/GameResults.java new file mode 100644 index 0000000..12969f0 --- /dev/null +++ b/src/main/java/lotto/domain/GameResults.java @@ -0,0 +1,24 @@ +package lotto.domain; +import java.util.ArrayList; +import java.util.List; +public class GameResults { + private static final double NO_PRIZE = 0; + private final List results; + public GameResults(List results) { + this.results = new ArrayList<>(results); + } + public double calculatePrize() { + return results.stream() + .map(GameResult::getPrize) + .mapToDouble(Double::valueOf) + .reduce(Double::sum) + .orElse(NO_PRIZE); + } + public int count(GameResult gameResult) { + return Long.valueOf( + results.stream() + .filter(gameResult::equals) + .count() + ).intValue(); + } +} \ No newline at end of file From 0f8bc095b218f65dd83839c88c24ac917c2378a4 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:53:31 +0900 Subject: [PATCH 27/35] =?UTF-8?q?test:=20GameResultTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/domain/GameResultTest.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/test/java/lotto/domain/GameResultTest.java diff --git a/src/test/java/lotto/domain/GameResultTest.java b/src/test/java/lotto/domain/GameResultTest.java new file mode 100644 index 0000000..3080212 --- /dev/null +++ b/src/test/java/lotto/domain/GameResultTest.java @@ -0,0 +1,49 @@ +package lotto.domain; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import java.util.stream.Stream; +import static org.assertj.core.api.Assertions.*; +class GameResultTest { + @DisplayName("์ผ์น˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ GameResult ์ƒ์„ฑ ํ…Œ์ŠคํŠธ") + @MethodSource(value = "provideEvaluate") + @ParameterizedTest(name = "matchCount = {0}, isBonusMatch = {1}, expected = {2}") + void evaluate(int count, boolean isBonusMatch, GameResult expected) { + //given + MatchCount matchCount = new MatchCount(count, isBonusMatch); + //when + GameResult gameResult = GameResult.evaluate(matchCount); + //then + assertThat(gameResult).isEqualTo(expected); + } + private static Stream provideEvaluate() { + return Stream.of( + Arguments.of(0, true, GameResult.UNDER_THREE_MATCHED), + Arguments.of(0, false, GameResult.UNDER_THREE_MATCHED), + Arguments.of(1, true, GameResult.UNDER_THREE_MATCHED), + Arguments.of(1, false, GameResult.UNDER_THREE_MATCHED), + Arguments.of(2, true, GameResult.UNDER_THREE_MATCHED), + Arguments.of(2, false, GameResult.UNDER_THREE_MATCHED), + Arguments.of(3, true, GameResult.THREE_MATCHED), + Arguments.of(3, false, GameResult.THREE_MATCHED), + Arguments.of(4, true, GameResult.FOUR_MATCHED), + Arguments.of(4, false, GameResult.FOUR_MATCHED), + Arguments.of(5, true, GameResult.FIVE_MATCHED_WITH_BONUS), + Arguments.of(5, false, GameResult.FIVE_MATCHED_WITHOUT_BONUS), + Arguments.of(6, false, GameResult.ALL_MATCHED) + ); + } + @DisplayName("๋น„์ •์ƒ์ ์ธ ์ผ์น˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ์˜ˆ์™ธ ๋ฐœ์ƒ") + @Test + void evaluateException() { + //given + MatchCount matchCount = new MatchCount(7, true); + //when + //then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> GameResult.evaluate(matchCount)) + .withMessage("์ผ์น˜ํ•˜๋Š” ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + } +} \ No newline at end of file From 09c6fb4a7ae1b107db5992ad2bd2bbc22f91d9ef Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:53:50 +0900 Subject: [PATCH 28/35] =?UTF-8?q?test:=20IssuerTest=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/domain/IssuerTest.java | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/test/java/lotto/domain/IssuerTest.java diff --git a/src/test/java/lotto/domain/IssuerTest.java b/src/test/java/lotto/domain/IssuerTest.java new file mode 100644 index 0000000..e9ca82a --- /dev/null +++ b/src/test/java/lotto/domain/IssuerTest.java @@ -0,0 +1,38 @@ +package lotto.domain; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +class IssuerTest { + @Test + void issueLottoTickets() { + //given + int money = 10000; + int expected = 10; + //when + LottoTickets lottoTickets = Issuer.issueLottoTickets(money); + //then + int actual = lottoTickets.getLottoTickets().size(); + assertThat(actual).isEqualTo(expected); + } + @Test + void moneyNotUnitOfLottoPrice() { + //given + int money = 14500; + int expected = 14; + //when + LottoTickets lottoTickets = Issuer.issueLottoTickets(money); + //then + int actual = lottoTickets.getLottoTickets().size(); + assertThat(actual).isEqualTo(expected); + } + @ValueSource(ints = {999, 0, -1000}) + @ParameterizedTest + void invalidMoney(int money) { + //when then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> Issuer.issueLottoTickets(money)) + .withMessage("๊ธˆ์•ก์€ 1000์› ์ด์ƒ์œผ๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + } +} \ No newline at end of file From eef113db3c5b43c74f0eaf99c15d7636f633e203 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:54:12 +0900 Subject: [PATCH 29/35] =?UTF-8?q?test:=20LottoNumberTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/domain/LottoNumberTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/test/java/lotto/domain/LottoNumberTest.java diff --git a/src/test/java/lotto/domain/LottoNumberTest.java b/src/test/java/lotto/domain/LottoNumberTest.java new file mode 100644 index 0000000..8c229f1 --- /dev/null +++ b/src/test/java/lotto/domain/LottoNumberTest.java @@ -0,0 +1,36 @@ +package lotto.domain; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +class LottoNumberTest { + @DisplayName("LottoNumber๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ํ›„๋ณด ์ˆซ์ž๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด") + @Test + void range() { + //given + List numbers = LottoNumber.range(); + //when then + for (int containedNumber = 1; containedNumber <= 45; containedNumber++) { + assertThat(numbers.contains(new LottoNumber(containedNumber))).isTrue(); + } + } + @DisplayName("๋น„์ •์ƒ์ ์ธ ์ธ์ˆ˜๋กœ LottoNumber ์ƒ์„ฑ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ") + @Test + void constructorException() { + //given + int lottoNumber = 46; + //when then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> new LottoNumber(lottoNumber)) + .withMessage("๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1 ์ด์ƒ, 45 ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + @DisplayName("ํ•ด์‹œ์ฝ”๋“œ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์ปค") + @Test + void testCoverage() { + //given when then + LottoNumber lottoNumber = new LottoNumber(10); + int hashCode = lottoNumber.hashCode(); + assertThat(hashCode).isEqualTo(lottoNumber.hashCode()); + } +} \ No newline at end of file From f9638c71c6162d80cb85edb7481db8c29adb090d Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:54:32 +0900 Subject: [PATCH 30/35] =?UTF-8?q?test:=20MatchCountTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/domain/MatchCountTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/test/java/lotto/domain/MatchCountTest.java diff --git a/src/test/java/lotto/domain/MatchCountTest.java b/src/test/java/lotto/domain/MatchCountTest.java new file mode 100644 index 0000000..4d499ea --- /dev/null +++ b/src/test/java/lotto/domain/MatchCountTest.java @@ -0,0 +1,32 @@ +package lotto.domain; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class MatchCountTest { + + @Test + void isUnderThree() { + } + + @Test + void isMatchThree() { + } + + @Test + void isMatchFour() { + } + + @Test + void isMatchFiveWithoutBonus() { + } + + @Test + void isMatchFiveWithBonus() { + } + + @Test + void isAllMatch() { + } +} \ No newline at end of file From 13f3aac4800db44781db87c3edd29febd1999899 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:54:46 +0900 Subject: [PATCH 31/35] =?UTF-8?q?test:=20StatisticsTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/domain/StatisticsTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/test/java/lotto/domain/StatisticsTest.java diff --git a/src/test/java/lotto/domain/StatisticsTest.java b/src/test/java/lotto/domain/StatisticsTest.java new file mode 100644 index 0000000..9caac6c --- /dev/null +++ b/src/test/java/lotto/domain/StatisticsTest.java @@ -0,0 +1,12 @@ +package lotto.domain; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class StatisticsTest { + + @Test + void winningDTOs() { + } +} \ No newline at end of file From ac4f5f2a556ce8dd7d90949124983af01be5eb7a Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:55:06 +0900 Subject: [PATCH 32/35] =?UTF-8?q?test:=20WinningNumberTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/domain/WinningNumberTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/java/lotto/domain/WinningNumberTest.java diff --git a/src/test/java/lotto/domain/WinningNumberTest.java b/src/test/java/lotto/domain/WinningNumberTest.java new file mode 100644 index 0000000..273d37e --- /dev/null +++ b/src/test/java/lotto/domain/WinningNumberTest.java @@ -0,0 +1,20 @@ +package lotto.domain; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.List; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.jupiter.api.Assertions.*; +class WinningNumberTest { + @DisplayName("๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ๋‹น์ฒจ ๋ฒˆํ˜ธ์— ํฌํ•จ๋˜๋Š” ์ˆซ์ž์—ฌ์„œ๋Š” ์•ˆ๋œ๋‹ค.") + @Test + void notWinningNumberContainsBonus() { + //given + List lottoNumbers = Arrays.asList(1, 2, 3, 4, 10, 30); + int bonusNumber = 10; + //when then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> new WinningNumber(lottoNumbers, bonusNumber)) + .withMessage("๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } +} \ No newline at end of file From a87480f58c89af893d2e180aeb2714495c1dffe6 Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Fri, 2 Apr 2021 23:55:33 +0900 Subject: [PATCH 33/35] =?UTF-8?q?test:=20WinningResultTest=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/domain/WinningResultTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/test/java/lotto/domain/WinningResultTest.java diff --git a/src/test/java/lotto/domain/WinningResultTest.java b/src/test/java/lotto/domain/WinningResultTest.java new file mode 100644 index 0000000..81088e9 --- /dev/null +++ b/src/test/java/lotto/domain/WinningResultTest.java @@ -0,0 +1,12 @@ +package lotto.domain; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class WinningResultTest { + + @Test + void getNumberOfWinners() { + } +} \ No newline at end of file From 7cfa8591f775ed998ebfb3e1b65f2bc3cde027fc Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Sat, 3 Apr 2021 00:48:05 +0900 Subject: [PATCH 34/35] =?UTF-8?q?feat:=20=EC=BD=94=EB=93=9C=20=EB=B3=91?= =?UTF-8?q?=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoApplication.java | 20 ++++- src/main/java/lotto/domain/Statistics.java | 18 ++++- .../lotto/domain/{ => dto}/WinningResult.java | 5 +- .../lotto/domain/{ => factory}/Issuer.java | 5 +- .../lotto/domain/{ => lotto}/LottoNumber.java | 2 +- .../lotto/domain/{ => lotto}/LottoTicket.java | 2 +- .../domain/{ => lotto}/LottoTickets.java | 5 +- .../domain/{ => lotto}/WinningNumber.java | 4 +- .../lotto/domain/{ => result}/GameResult.java | 4 +- .../domain/{ => result}/GameResults.java | 2 +- src/main/java/lotto/ui/Printer.java | 30 +++++-- src/main/java/lotto/ui/Receiver.java | 11 ++- src/test/java/lotto/LottoApplicationTest.java | 31 ++++++++ .../java/lotto/domain/StatisticsTest.java | 78 ++++++++++++++++++- .../domain/{ => dto}/WinningResultTest.java | 2 +- .../domain/{ => factory}/IssuerTest.java | 4 +- .../domain/{ => lotto}/LottoNumberTest.java | 3 +- .../domain/{ => lotto}/LottoTicketTest.java | 6 +- .../domain/{ => lotto}/WinningNumberTest.java | 5 +- .../domain/{ => result}/GameResultTest.java | 12 ++- .../lotto/domain/result/GameResultsTest.java | 40 ++++++++++ src/test/java/lotto/ui/PrinterTest.java | 29 +++++++ 22 files changed, 285 insertions(+), 33 deletions(-) rename src/main/java/lotto/domain/{ => dto}/WinningResult.java (86%) rename src/main/java/lotto/domain/{ => factory}/Issuer.java (89%) rename src/main/java/lotto/domain/{ => lotto}/LottoNumber.java (98%) rename src/main/java/lotto/domain/{ => lotto}/LottoTicket.java (97%) rename src/main/java/lotto/domain/{ => lotto}/LottoTickets.java (86%) rename src/main/java/lotto/domain/{ => lotto}/WinningNumber.java (95%) rename src/main/java/lotto/domain/{ => result}/GameResult.java (96%) rename src/main/java/lotto/domain/{ => result}/GameResults.java (96%) create mode 100644 src/test/java/lotto/LottoApplicationTest.java rename src/test/java/lotto/domain/{ => dto}/WinningResultTest.java (86%) rename src/test/java/lotto/domain/{ => factory}/IssuerTest.java (92%) rename src/test/java/lotto/domain/{ => lotto}/LottoNumberTest.java (95%) rename src/test/java/lotto/domain/{ => lotto}/LottoTicketTest.java (90%) rename src/test/java/lotto/domain/{ => lotto}/WinningNumberTest.java (91%) rename src/test/java/lotto/domain/{ => result}/GameResultTest.java (86%) create mode 100644 src/test/java/lotto/domain/result/GameResultsTest.java create mode 100644 src/test/java/lotto/ui/PrinterTest.java diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 2279106..cd0dab6 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -1,46 +1,62 @@ package lotto; + import lotto.domain.*; +import lotto.domain.factory.Issuer; +import lotto.domain.lotto.LottoTickets; +import lotto.domain.lotto.WinningNumber; +import lotto.domain.result.GameResults; import lotto.ui.Printer; import lotto.ui.Receiver; + import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; + public class LottoApplication { private static final String WINNING_NUMBER_INPUT_DELIMITER = ", "; + private final Printer printer; private final Receiver receiver; + public LottoApplication(Printer printer, Receiver receiver) { this.printer = printer; this.receiver = receiver; } + public void run() { int purchaseAmount = receivePurchaseAmount(); LottoTickets lottoTickets = Issuer.issueLottoTickets(purchaseAmount); printer.printIssuedTickets(lottoTickets); + WinningNumber winningNumber = new WinningNumber(receiveWinningNumber(), receiveBonusNumber()); GameResults gameResults = lottoTickets.matchNumbers(winningNumber); Statistics statistics = new Statistics(gameResults, purchaseAmount); printer.printStatistics(statistics); } + private int receivePurchaseAmount() { printer.requestPurchaseAmount(); String purchaseAmount = receiver.receiveLine(); return Integer.parseInt(purchaseAmount); } + private List receiveWinningNumber() { printer.requestWinningNumber(); String winningNumber = receiver.receiveLine(); + return Arrays.stream(winningNumber.split(WINNING_NUMBER_INPUT_DELIMITER)) .map(Integer::valueOf) .collect(Collectors.toList()); } + private int receiveBonusNumber() { printer.requestBonusNumber(); String bonusNumber = receiver.receiveLine(); return Integer.parseInt(bonusNumber); } + public static void main(String[] args) { - LottoApplication app = new LottoApplication(new Printer(), new Receiver()); + LottoApplication app = new LottoApplication(new Printer(), new Receiver(System.in)); app.run(); } -} \ No newline at end of file +} diff --git a/src/main/java/lotto/domain/Statistics.java b/src/main/java/lotto/domain/Statistics.java index 8b47ad0..d90f9f2 100644 --- a/src/main/java/lotto/domain/Statistics.java +++ b/src/main/java/lotto/domain/Statistics.java @@ -1,23 +1,35 @@ package lotto.domain; + +import lotto.domain.dto.WinningResult; +import lotto.domain.result.GameResult; +import lotto.domain.result.GameResults; + import java.util.List; import java.util.stream.Collectors; + public class Statistics { + private static final int IS_EQUAL_RATE = 1; + private final GameResults gameResults; private final int purchaseAmount; + public Statistics(GameResults gameResults, int purchaseAmount) { this.gameResults = gameResults; this.purchaseAmount = purchaseAmount; } - public List winningDTOs() { + + public List winningResults() { return GameResult.valuesWithoutUnderThreeMatched() .stream() .map(gameResult -> new WinningResult(gameResults.count(gameResult), gameResult)) .collect(Collectors.toList()); } + public double calculateEarningRate() { return gameResults.calculatePrize() / purchaseAmount; } + public boolean isProfit(double earningRate) { - return earningRate > 1; + return earningRate > IS_EQUAL_RATE; } -} \ No newline at end of file +} diff --git a/src/main/java/lotto/domain/WinningResult.java b/src/main/java/lotto/domain/dto/WinningResult.java similarity index 86% rename from src/main/java/lotto/domain/WinningResult.java rename to src/main/java/lotto/domain/dto/WinningResult.java index 55eb347..46f64b1 100644 --- a/src/main/java/lotto/domain/WinningResult.java +++ b/src/main/java/lotto/domain/dto/WinningResult.java @@ -1,4 +1,7 @@ -package lotto.domain; +package lotto.domain.dto; + +import lotto.domain.result.GameResult; + public class WinningResult { private final int numberOfWinners; private final GameResult gameResult; diff --git a/src/main/java/lotto/domain/Issuer.java b/src/main/java/lotto/domain/factory/Issuer.java similarity index 89% rename from src/main/java/lotto/domain/Issuer.java rename to src/main/java/lotto/domain/factory/Issuer.java index 98e6cef..6c16277 100644 --- a/src/main/java/lotto/domain/Issuer.java +++ b/src/main/java/lotto/domain/factory/Issuer.java @@ -1,4 +1,7 @@ -package lotto.domain; +package lotto.domain.factory; +import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; + import java.util.ArrayList; import java.util.List; public class Issuer { diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/lotto/LottoNumber.java similarity index 98% rename from src/main/java/lotto/domain/LottoNumber.java rename to src/main/java/lotto/domain/lotto/LottoNumber.java index 42c55cf..4649818 100644 --- a/src/main/java/lotto/domain/LottoNumber.java +++ b/src/main/java/lotto/domain/lotto/LottoNumber.java @@ -1,4 +1,4 @@ -package lotto.domain; +package lotto.domain.lotto; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/lotto/LottoTicket.java similarity index 97% rename from src/main/java/lotto/domain/LottoTicket.java rename to src/main/java/lotto/domain/lotto/LottoTicket.java index d068c0a..8a1fd89 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/lotto/LottoTicket.java @@ -1,4 +1,4 @@ -package lotto.domain; +package lotto.domain.lotto; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; diff --git a/src/main/java/lotto/domain/LottoTickets.java b/src/main/java/lotto/domain/lotto/LottoTickets.java similarity index 86% rename from src/main/java/lotto/domain/LottoTickets.java rename to src/main/java/lotto/domain/lotto/LottoTickets.java index 796f583..7dfdd84 100644 --- a/src/main/java/lotto/domain/LottoTickets.java +++ b/src/main/java/lotto/domain/lotto/LottoTickets.java @@ -1,4 +1,7 @@ -package lotto.domain; +package lotto.domain.lotto; +import lotto.domain.result.GameResult; +import lotto.domain.result.GameResults; + import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/lotto/WinningNumber.java similarity index 95% rename from src/main/java/lotto/domain/WinningNumber.java rename to src/main/java/lotto/domain/lotto/WinningNumber.java index 1192eda..d6c084a 100644 --- a/src/main/java/lotto/domain/WinningNumber.java +++ b/src/main/java/lotto/domain/lotto/WinningNumber.java @@ -1,4 +1,6 @@ -package lotto.domain; +package lotto.domain.lotto; +import lotto.domain.MatchCount; + import java.util.List; import java.util.stream.Collectors; public class WinningNumber { diff --git a/src/main/java/lotto/domain/GameResult.java b/src/main/java/lotto/domain/result/GameResult.java similarity index 96% rename from src/main/java/lotto/domain/GameResult.java rename to src/main/java/lotto/domain/result/GameResult.java index 333569c..bb87e59 100644 --- a/src/main/java/lotto/domain/GameResult.java +++ b/src/main/java/lotto/domain/result/GameResult.java @@ -1,4 +1,6 @@ -package lotto.domain; +package lotto.domain.result; +import lotto.domain.MatchCount; + import java.util.Arrays; import java.util.List; import java.util.function.Predicate; diff --git a/src/main/java/lotto/domain/GameResults.java b/src/main/java/lotto/domain/result/GameResults.java similarity index 96% rename from src/main/java/lotto/domain/GameResults.java rename to src/main/java/lotto/domain/result/GameResults.java index 12969f0..c386efa 100644 --- a/src/main/java/lotto/domain/GameResults.java +++ b/src/main/java/lotto/domain/result/GameResults.java @@ -1,4 +1,4 @@ -package lotto.domain; +package lotto.domain.result; import java.util.ArrayList; import java.util.List; public class GameResults { diff --git a/src/main/java/lotto/ui/Printer.java b/src/main/java/lotto/ui/Printer.java index 2de33c7..aa45206 100644 --- a/src/main/java/lotto/ui/Printer.java +++ b/src/main/java/lotto/ui/Printer.java @@ -1,33 +1,45 @@ package lotto.ui; + import lotto.domain.*; +import lotto.domain.dto.WinningResult; +import lotto.domain.lotto.LottoNumber; +import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; +import lotto.domain.result.GameResult; + import java.util.List; import java.util.stream.Collectors; + public class Printer { + private static final String PURCHASE_AMOUNT_REQUEST_MESSAGE = "๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; private static final String PURCHASE_MESSAGE = "๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค."; private static final String LOTTO_NUMBER_DELIMITER = ", "; - private static final String LEFT_CLOSER = "["; - private static final String RIGHT_CLOSER = "]"; + private static final String LOTTO_NUMBERS_MESSAGE = "[%s]\n"; private static final String WINNING_NUMBER_REQUEST_MESSAGE = "์ง€๋‚œ ์ฃผ ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; private static final String BONUS_NUMBER_REQUEST_MESSAGE = "๋ณด๋„ˆ์Šค ๋ณผ์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; private static final String WINNING_STATISTICS_MESSAGE = "๋‹น์ฒจ ํ†ต๊ณ„"; private static final String DIVIDER_LINE = "----------"; private static final String WINNING_RESULT_MESSAGE = "%s (%d์›) - %d๊ฐœ\n"; - private static final String EARNING_RATE_MESSAGE = "์ด ์ˆ˜์ต๋ฅ ์€ %2f์ž…๋‹ˆ๋‹ค.(๊ธฐ์ค€์ด 1์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ %s๋ผ๋Š” ์˜๋ฏธ์ž„)"; + private static final String EARNING_RATE_MESSAGE = "์ด ์ˆ˜์ต๋ฅ ์€ %.2f์ž…๋‹ˆ๋‹ค.(๊ธฐ์ค€์ด 1์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ %s๋ผ๋Š” ์˜๋ฏธ์ž„)"; private static final String PROFIT_MESSAGE = "์ด์ต"; private static final String LOSS_MESSAGE = "์†ํ•ด"; + public void requestPurchaseAmount() { System.out.println(PURCHASE_AMOUNT_REQUEST_MESSAGE); } + public void printIssuedTickets(LottoTickets lottoTickets) { List tickets = lottoTickets.getLottoTickets(); printNumberOfTickets(tickets); printLottoTickets(tickets); } + private void printNumberOfTickets(List tickets) { int numberOfTickets = tickets.size(); System.out.println(numberOfTickets + PURCHASE_MESSAGE); } + private void printLottoTickets(List tickets) { for (LottoTicket ticket : tickets) { String lottoNumbers = ticket.getLottoNumbers() @@ -35,30 +47,36 @@ private void printLottoTickets(List tickets) { .map(LottoNumber::getLottoNumber) .map(String::valueOf) .collect(Collectors.joining(LOTTO_NUMBER_DELIMITER)); - System.out.println(LEFT_CLOSER + lottoNumbers + RIGHT_CLOSER); + + System.out.printf(LOTTO_NUMBERS_MESSAGE, lottoNumbers); } } + public void requestWinningNumber() { System.out.println(WINNING_NUMBER_REQUEST_MESSAGE); } + public void requestBonusNumber() { System.out.println(BONUS_NUMBER_REQUEST_MESSAGE); } + public void printStatistics(Statistics statistics) { System.out.println(WINNING_STATISTICS_MESSAGE); System.out.println(DIVIDER_LINE); - for (WinningResult winningResult : statistics.winningDTOs()) { + for (WinningResult winningResult : statistics.winningResults()) { GameResult gameResult = winningResult.getGameResult(); System.out.printf(WINNING_RESULT_MESSAGE, gameResult.getDescription(), gameResult.getPrize(), winningResult.getNumberOfWinners()); } System.out.println(); + double earningRate = statistics.calculateEarningRate(); System.out.printf(EARNING_RATE_MESSAGE, earningRate, profitAndLossMessage(statistics.isProfit(earningRate))); } + private String profitAndLossMessage(boolean isProfit) { if (isProfit) { return PROFIT_MESSAGE; } return LOSS_MESSAGE; } -} \ No newline at end of file +} diff --git a/src/main/java/lotto/ui/Receiver.java b/src/main/java/lotto/ui/Receiver.java index 9b03ded..b026746 100644 --- a/src/main/java/lotto/ui/Receiver.java +++ b/src/main/java/lotto/ui/Receiver.java @@ -1,11 +1,16 @@ package lotto.ui; + +import java.io.InputStream; import java.util.Scanner; + public class Receiver { private final Scanner scanner; - public Receiver() { - scanner = new Scanner(System.in); + + public Receiver(InputStream in) { + scanner = new Scanner(in); } + public String receiveLine() { return scanner.nextLine(); } -} \ No newline at end of file +} diff --git a/src/test/java/lotto/LottoApplicationTest.java b/src/test/java/lotto/LottoApplicationTest.java new file mode 100644 index 0000000..d84b4b1 --- /dev/null +++ b/src/test/java/lotto/LottoApplicationTest.java @@ -0,0 +1,31 @@ +package lotto; + +import lotto.domain.*; +import lotto.ui.Printer; +import lotto.ui.Receiver; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.util.*; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoApplicationTest { + + @DisplayName("ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์œ„ํ•œ ApplicationTest") + @Test + void application() { + //given + String input = "3000000\n1, 10, 25, 30, 31, 38\n44"; + LottoApplication app = new LottoApplication( + new Printer(), new Receiver(new ByteArrayInputStream(input.getBytes())) + ); + + //when + app.run(); + + //then + assertThat(true).isTrue(); + } +} diff --git a/src/test/java/lotto/domain/StatisticsTest.java b/src/test/java/lotto/domain/StatisticsTest.java index 9caac6c..a3f0151 100644 --- a/src/test/java/lotto/domain/StatisticsTest.java +++ b/src/test/java/lotto/domain/StatisticsTest.java @@ -1,12 +1,84 @@ package lotto.domain; +import lotto.domain.Statistics; +import lotto.domain.dto.WinningResult; +import lotto.domain.result.GameResult; +import lotto.domain.result.GameResults; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; class StatisticsTest { + private final Statistics statistics; + + public StatisticsTest() { + List results = Arrays.asList(GameResult.THREE_MATCHED, GameResult.UNDER_THREE_MATCHED, GameResult.THREE_MATCHED, GameResult.ALL_MATCHED, + GameResult.THREE_MATCHED, GameResult.FOUR_MATCHED, GameResult.UNDER_THREE_MATCHED); + + GameResults gameResults = new GameResults(results); + statistics = new Statistics(gameResults, 7000); + } + + @DisplayName("์ถœ๋ ฅ์šฉ WinningResult dto ํ…Œ์ŠคํŠธ") @Test - void winningDTOs() { + void winningResults() { + //given + //when + List winningResults = statistics.winningResults(); + + //then + assertThat(winningResults.get(0).getGameResult()).isEqualTo(GameResult.THREE_MATCHED); + assertThat(winningResults.get(0).getNumberOfWinners()).isEqualTo(3); + + assertThat(winningResults.get(1).getGameResult()).isEqualTo(GameResult.FOUR_MATCHED); + assertThat(winningResults.get(1).getNumberOfWinners()).isEqualTo(1); + + assertThat(winningResults.get(2).getGameResult()).isEqualTo(GameResult.FIVE_MATCHED_WITHOUT_BONUS); + assertThat(winningResults.get(2).getNumberOfWinners()).isEqualTo(0); + + assertThat(winningResults.get(3).getGameResult()).isEqualTo(GameResult.FIVE_MATCHED_WITH_BONUS); + assertThat(winningResults.get(3).getNumberOfWinners()).isEqualTo(0); + + assertThat(winningResults.get(4).getGameResult()).isEqualTo(GameResult.ALL_MATCHED); + assertThat(winningResults.get(4).getNumberOfWinners()).isEqualTo(1); + } + + @DisplayName("์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ") + @Test + void calculateEarningRate() { + //given + double expected = (double) 2_000_065_000 / 7000; + + //when + double actual = statistics.calculateEarningRate(); + + //then + assertThat(actual).isEqualTo(expected); + } + + @DisplayName("์ด๋“์ธ ๊ฒฝ์šฐ ๊ฒ€์ฆ") + @Test + void isProfit() { + //given when then + assertThat(statistics.isProfit(statistics.calculateEarningRate())).isTrue(); + } + + @DisplayName("์†ํ•ด์ธ ๊ฒฝ์šฐ ๊ฒ€์ฆ") + @Test + void isLoss() { + //given + List results = Arrays.asList(GameResult.THREE_MATCHED, GameResult.UNDER_THREE_MATCHED, GameResult.UNDER_THREE_MATCHED, + GameResult.UNDER_THREE_MATCHED, GameResult.UNDER_THREE_MATCHED, GameResult.UNDER_THREE_MATCHED, GameResult.UNDER_THREE_MATCHED); + + GameResults gameResults = new GameResults(results); + Statistics lossStatistics = new Statistics(gameResults, 7000); + + //when then + assertThat(lossStatistics.isProfit(lossStatistics.calculateEarningRate())).isFalse(); } -} \ No newline at end of file +} diff --git a/src/test/java/lotto/domain/WinningResultTest.java b/src/test/java/lotto/domain/dto/WinningResultTest.java similarity index 86% rename from src/test/java/lotto/domain/WinningResultTest.java rename to src/test/java/lotto/domain/dto/WinningResultTest.java index 81088e9..020f260 100644 --- a/src/test/java/lotto/domain/WinningResultTest.java +++ b/src/test/java/lotto/domain/dto/WinningResultTest.java @@ -1,4 +1,4 @@ -package lotto.domain; +package lotto.domain.dto; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/domain/IssuerTest.java b/src/test/java/lotto/domain/factory/IssuerTest.java similarity index 92% rename from src/test/java/lotto/domain/IssuerTest.java rename to src/test/java/lotto/domain/factory/IssuerTest.java index e9ca82a..a540be7 100644 --- a/src/test/java/lotto/domain/IssuerTest.java +++ b/src/test/java/lotto/domain/factory/IssuerTest.java @@ -1,4 +1,6 @@ -package lotto.domain; +package lotto.domain.factory; +import lotto.domain.factory.Issuer; +import lotto.domain.lotto.LottoTickets; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/src/test/java/lotto/domain/LottoNumberTest.java b/src/test/java/lotto/domain/lotto/LottoNumberTest.java similarity index 95% rename from src/test/java/lotto/domain/LottoNumberTest.java rename to src/test/java/lotto/domain/lotto/LottoNumberTest.java index 8c229f1..b00d2a9 100644 --- a/src/test/java/lotto/domain/LottoNumberTest.java +++ b/src/test/java/lotto/domain/lotto/LottoNumberTest.java @@ -1,4 +1,5 @@ -package lotto.domain; +package lotto.domain.lotto; +import lotto.domain.lotto.LottoNumber; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/src/test/java/lotto/domain/LottoTicketTest.java b/src/test/java/lotto/domain/lotto/LottoTicketTest.java similarity index 90% rename from src/test/java/lotto/domain/LottoTicketTest.java rename to src/test/java/lotto/domain/lotto/LottoTicketTest.java index e1072aa..986e318 100644 --- a/src/test/java/lotto/domain/LottoTicketTest.java +++ b/src/test/java/lotto/domain/lotto/LottoTicketTest.java @@ -1,8 +1,10 @@ -package lotto.domain; +package lotto.domain.lotto; +import lotto.domain.lotto.LottoNumber; +import lotto.domain.lotto.LottoTicket; import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; + class LottoTicketTest { @Test void numberOfLottoNumbers() { diff --git a/src/test/java/lotto/domain/WinningNumberTest.java b/src/test/java/lotto/domain/lotto/WinningNumberTest.java similarity index 91% rename from src/test/java/lotto/domain/WinningNumberTest.java rename to src/test/java/lotto/domain/lotto/WinningNumberTest.java index 273d37e..c49c455 100644 --- a/src/test/java/lotto/domain/WinningNumberTest.java +++ b/src/test/java/lotto/domain/lotto/WinningNumberTest.java @@ -1,10 +1,11 @@ -package lotto.domain; +package lotto.domain.lotto; +import lotto.domain.lotto.WinningNumber; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.junit.jupiter.api.Assertions.*; + class WinningNumberTest { @DisplayName("๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ๋‹น์ฒจ ๋ฒˆํ˜ธ์— ํฌํ•จ๋˜๋Š” ์ˆซ์ž์—ฌ์„œ๋Š” ์•ˆ๋œ๋‹ค.") @Test diff --git a/src/test/java/lotto/domain/GameResultTest.java b/src/test/java/lotto/domain/result/GameResultTest.java similarity index 86% rename from src/test/java/lotto/domain/GameResultTest.java rename to src/test/java/lotto/domain/result/GameResultTest.java index 3080212..4d95878 100644 --- a/src/test/java/lotto/domain/GameResultTest.java +++ b/src/test/java/lotto/domain/result/GameResultTest.java @@ -1,4 +1,6 @@ -package lotto.domain; +package lotto.domain.result; +import lotto.domain.MatchCount; +import lotto.domain.result.GameResult; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -46,4 +48,12 @@ void evaluateException() { .isThrownBy(() -> GameResult.evaluate(matchCount)) .withMessage("์ผ์น˜ํ•˜๋Š” ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); } + @DisplayName("description getter ํ…Œ์ŠคํŠธ") + @Test + void getDescription() { + //given + GameResult gameResult = GameResult.ALL_MATCHED; + //when then + assertThat(gameResult.getDescription()).isEqualTo("6๊ฐœ ์ผ์น˜"); + } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/result/GameResultsTest.java b/src/test/java/lotto/domain/result/GameResultsTest.java new file mode 100644 index 0000000..6a79b5a --- /dev/null +++ b/src/test/java/lotto/domain/result/GameResultsTest.java @@ -0,0 +1,40 @@ +package lotto.domain.result; +import lotto.domain.result.GameResult; +import lotto.domain.result.GameResults; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; + +class GameResultsTest { + @DisplayName("๋ชจ๋“  ์ƒ๊ธˆ ๋”ํ•˜๊ธฐ") + @Test + void calculatePrize() { + //given + List results = Arrays.asList(GameResult.UNDER_THREE_MATCHED, GameResult.THREE_MATCHED, + GameResult.FOUR_MATCHED, GameResult.FIVE_MATCHED_WITH_BONUS, GameResult.FIVE_MATCHED_WITHOUT_BONUS, GameResult.ALL_MATCHED); + GameResults gameResults = new GameResults(results); + double expected = 2_031_555_000; + //when + double totalPrize = gameResults.calculatePrize(); + //then + assertThat(totalPrize).isEqualTo(expected); + } + @DisplayName("๋ชจ๋“  GameResult ๊ฒฝ์šฐ์— ๋Œ€ํ•ด count") + @Test + void count() { + //given + List results = Arrays.asList(GameResult.UNDER_THREE_MATCHED, GameResult.THREE_MATCHED, + GameResult.FOUR_MATCHED, GameResult.FIVE_MATCHED_WITH_BONUS, GameResult.FIVE_MATCHED_WITHOUT_BONUS, GameResult.ALL_MATCHED); + GameResults gameResults = new GameResults(results); + //when + //then + assertThat(gameResults.count(GameResult.UNDER_THREE_MATCHED)).isEqualTo(1); + assertThat(gameResults.count(GameResult.THREE_MATCHED)).isEqualTo(1); + assertThat(gameResults.count(GameResult.FOUR_MATCHED)).isEqualTo(1); + assertThat(gameResults.count(GameResult.FIVE_MATCHED_WITHOUT_BONUS)).isEqualTo(1); + assertThat(gameResults.count(GameResult.FIVE_MATCHED_WITH_BONUS)).isEqualTo(1); + assertThat(gameResults.count(GameResult.ALL_MATCHED)).isEqualTo(1); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/ui/PrinterTest.java b/src/test/java/lotto/ui/PrinterTest.java new file mode 100644 index 0000000..6d0740e --- /dev/null +++ b/src/test/java/lotto/ui/PrinterTest.java @@ -0,0 +1,29 @@ +package lotto.ui; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PrinterTest { + + @Test + void requestPurchaseAmount() { + + } + + @Test + void printIssuedTickets() { + } + + @Test + void requestWinningNumber() { + } + + @Test + void requestBonusNumber() { + } + + @Test + void printStatistics() { + } +} \ No newline at end of file From 2e40f105de298aa74e2655229f37b6c8b4818c6b Mon Sep 17 00:00:00 2001 From: Chae hee chan Date: Sat, 10 Apr 2021 06:52:33 +0900 Subject: [PATCH 35/35] =?UTF-8?q?feat:=20=EC=88=98=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoApplication.java | 50 +++++++++++++++---- .../java/lotto/domain/factory/Issuer.java | 14 +++++- .../java/lotto/domain/lotto/LottoNumber.java | 8 +++ .../java/lotto/domain/lotto/LottoTicket.java | 8 ++- .../java/lotto/domain/lotto/LottoTickets.java | 3 ++ src/main/java/lotto/ui/Printer.java | 22 +++++--- .../java/lotto/domain/factory/IssuerTest.java | 14 +++--- 7 files changed, 93 insertions(+), 26 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index cd0dab6..4de7857 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -1,6 +1,6 @@ -package lotto; + package lotto; -import lotto.domain.*; +import lotto.domain.Statistics; import lotto.domain.factory.Issuer; import lotto.domain.lotto.LottoTickets; import lotto.domain.lotto.WinningNumber; @@ -8,12 +8,16 @@ import lotto.ui.Printer; import lotto.ui.Receiver; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class LottoApplication { - private static final String WINNING_NUMBER_INPUT_DELIMITER = ", "; + private static final String LOTTO_NUMBER_INPUT_DELIMITER = ", "; + private static final int LOTTO_TICKET_PRICE = 1000; + private static final String LOTTO_TICKET_PRICE_RANGE_EXCEPTION_MESSAGE = + "์ˆ˜๋™ ๊ตฌ๋งค ํ‹ฐ์ผ“์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค."; private final Printer printer; private final Receiver receiver; @@ -23,10 +27,17 @@ public LottoApplication(Printer printer, Receiver receiver) { this.receiver = receiver; } + public static void main(String[] args) { + LottoApplication app = new LottoApplication(new Printer(), new Receiver(System.in)); + app.run(); + } + public void run() { int purchaseAmount = receivePurchaseAmount(); - LottoTickets lottoTickets = Issuer.issueLottoTickets(purchaseAmount); - printer.printIssuedTickets(lottoTickets); + int manualTicketCount = receiveManualTicketCount(purchaseAmount); + LottoTickets lottoTickets = Issuer.issueManualLottoTickets(manualTicketCount, receiveManualTicketNumber(manualTicketCount)); + lottoTickets.addTickets(Issuer.issueLottoTickets(purchaseAmount, manualTicketCount)); + printer.printIssuedTickets(lottoTickets, manualTicketCount); WinningNumber winningNumber = new WinningNumber(receiveWinningNumber(), receiveBonusNumber()); GameResults gameResults = lottoTickets.matchNumbers(winningNumber); @@ -40,11 +51,33 @@ private int receivePurchaseAmount() { return Integer.parseInt(purchaseAmount); } + private int receiveManualTicketCount(int purchaseAmount) { + printer.requestManualTicketCount(); + int manualTicketCount = Integer.parseInt(receiver.receiveLine()); + if(manualTicketCount > purchaseAmount/LOTTO_TICKET_PRICE){ + throw new IllegalArgumentException(LOTTO_TICKET_PRICE_RANGE_EXCEPTION_MESSAGE); + } + return manualTicketCount; + } + + private List> receiveManualTicketNumber(int manualTicketCount) { + printer.requestManualTicketNumber(); + List> manualTickets = new ArrayList<>(); + for(int count = 0; count receiveWinningNumber() { printer.requestWinningNumber(); String winningNumber = receiver.receiveLine(); - return Arrays.stream(winningNumber.split(WINNING_NUMBER_INPUT_DELIMITER)) + return Arrays.stream(winningNumber.split(LOTTO_NUMBER_INPUT_DELIMITER)) .map(Integer::valueOf) .collect(Collectors.toList()); } @@ -54,9 +87,4 @@ private int receiveBonusNumber() { String bonusNumber = receiver.receiveLine(); return Integer.parseInt(bonusNumber); } - - public static void main(String[] args) { - LottoApplication app = new LottoApplication(new Printer(), new Receiver(System.in)); - app.run(); - } } diff --git a/src/main/java/lotto/domain/factory/Issuer.java b/src/main/java/lotto/domain/factory/Issuer.java index 6c16277..426f9de 100644 --- a/src/main/java/lotto/domain/factory/Issuer.java +++ b/src/main/java/lotto/domain/factory/Issuer.java @@ -8,8 +8,18 @@ public class Issuer { private static final int TICKET_PRICE = 1000; private static final int MINIMUM_NUMBER_OF_TICKETS = 1; private static final String MONEY_AMOUNT_EXCEPTION_MESSAGE = "๊ธˆ์•ก์€ " + TICKET_PRICE + "์› ์ด์ƒ์œผ๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."; - public static LottoTickets issueLottoTickets(int money) { - int numberOfTickets = money / TICKET_PRICE; + + public static LottoTickets issueManualLottoTickets(int manualTicketCount, List> manualLottoTicketNumbers){ + validate(manualTicketCount); + List manualLottoTickets = new ArrayList<>(); + for(int i = 0; i lottoTickets = new ArrayList<>(); for (int i = 0; i < numberOfTickets; i++) { diff --git a/src/main/java/lotto/domain/lotto/LottoNumber.java b/src/main/java/lotto/domain/lotto/LottoNumber.java index 4649818..a6f1a48 100644 --- a/src/main/java/lotto/domain/lotto/LottoNumber.java +++ b/src/main/java/lotto/domain/lotto/LottoNumber.java @@ -1,4 +1,5 @@ package lotto.domain.lotto; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -27,6 +28,13 @@ public static List range() { .map(LottoNumber::new) .collect(Collectors.toList()); } + public static List setManualNumber(List manualNumber){ + List lottoNumberManualNumber = new ArrayList<>(); + for (Integer integer : manualNumber) { + lottoNumberManualNumber.add(new LottoNumber(integer)); + } + return lottoNumberManualNumber; + } public int getLottoNumber() { return lottoNumber; } diff --git a/src/main/java/lotto/domain/lotto/LottoTicket.java b/src/main/java/lotto/domain/lotto/LottoTicket.java index 8a1fd89..865b3e6 100644 --- a/src/main/java/lotto/domain/lotto/LottoTicket.java +++ b/src/main/java/lotto/domain/lotto/LottoTicket.java @@ -6,12 +6,18 @@ import java.util.stream.Collectors; public class LottoTicket { private static final int NUMBER_OF_LOTTO_NUMBERS = 6; - private final List lottoNumbers; + private List lottoNumbers; + public LottoTicket() { List lottoNumbers = LottoNumber.range(); lottoNumbers = generateLottoNumbers(lottoNumbers); this.lottoNumbers = new ArrayList<>(lottoNumbers); } + public LottoTicket(List manualLottoNumbers){ + List lottoNumbers = LottoNumber.setManualNumber(manualLottoNumbers); + this.lottoNumbers = new ArrayList<>(lottoNumbers); + } + private List generateLottoNumbers(List lottoNumbers) { Collections.shuffle(lottoNumbers); lottoNumbers = lottoNumbers.stream() diff --git a/src/main/java/lotto/domain/lotto/LottoTickets.java b/src/main/java/lotto/domain/lotto/LottoTickets.java index 7dfdd84..305c052 100644 --- a/src/main/java/lotto/domain/lotto/LottoTickets.java +++ b/src/main/java/lotto/domain/lotto/LottoTickets.java @@ -10,6 +10,9 @@ public class LottoTickets { public LottoTickets(List lottoTickets) { this.lottoTickets = new ArrayList<>(lottoTickets); } + public void addTickets(LottoTickets lottoTickets){ + this.lottoTickets.addAll(lottoTickets.getLottoTickets()); + } public GameResults matchNumbers(WinningNumber winningNumber) { List results = lottoTickets.stream() .map(winningNumber::matchNumbers) diff --git a/src/main/java/lotto/ui/Printer.java b/src/main/java/lotto/ui/Printer.java index aa45206..d2bcae0 100644 --- a/src/main/java/lotto/ui/Printer.java +++ b/src/main/java/lotto/ui/Printer.java @@ -13,7 +13,9 @@ public class Printer { private static final String PURCHASE_AMOUNT_REQUEST_MESSAGE = "๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; - private static final String PURCHASE_MESSAGE = "๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค."; + private static final String MANUAL_TICKET_COUNT_REQUEST_MESSAGE = "์ˆ˜๋™์œผ๋กœ ๊ตฌ๋งคํ•  ๋กœ๋˜ ์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."; + private static final String MANUAL_TICKET_NUMBER_REQUEST_MESSAGE = "์ˆ˜๋™์œผ๋กœ ๊ตฌ๋งคํ•  ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; + private static final String PURCHASE_MESSAGE = "์ˆ˜๋™์œผ๋กœ %d์žฅ, ์ž๋™์œผ๋กœ %d๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค."; private static final String LOTTO_NUMBER_DELIMITER = ", "; private static final String LOTTO_NUMBERS_MESSAGE = "[%s]\n"; private static final String WINNING_NUMBER_REQUEST_MESSAGE = "์ง€๋‚œ ์ฃผ ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; @@ -29,15 +31,23 @@ public void requestPurchaseAmount() { System.out.println(PURCHASE_AMOUNT_REQUEST_MESSAGE); } - public void printIssuedTickets(LottoTickets lottoTickets) { + public void printIssuedTickets(LottoTickets lottoTickets, int manualTicketCount) { List tickets = lottoTickets.getLottoTickets(); - printNumberOfTickets(tickets); + printNumberOfTickets(tickets, manualTicketCount); printLottoTickets(tickets); } - private void printNumberOfTickets(List tickets) { - int numberOfTickets = tickets.size(); - System.out.println(numberOfTickets + PURCHASE_MESSAGE); + public void requestManualTicketCount(){ + System.out.println(MANUAL_TICKET_COUNT_REQUEST_MESSAGE); + } + + public void requestManualTicketNumber(){ + System.out.println(MANUAL_TICKET_NUMBER_REQUEST_MESSAGE); + } + + private void printNumberOfTickets(List tickets, int manualTicketCount) { + int numberOfTickets = tickets.size() - manualTicketCount; + System.out.printf((PURCHASE_MESSAGE) + "%n", manualTicketCount, numberOfTickets); } private void printLottoTickets(List tickets) { diff --git a/src/test/java/lotto/domain/factory/IssuerTest.java b/src/test/java/lotto/domain/factory/IssuerTest.java index a540be7..1d61f38 100644 --- a/src/test/java/lotto/domain/factory/IssuerTest.java +++ b/src/test/java/lotto/domain/factory/IssuerTest.java @@ -11,9 +11,10 @@ class IssuerTest { void issueLottoTickets() { //given int money = 10000; - int expected = 10; + int manualTicketCount = 2; + int expected = 8; //when - LottoTickets lottoTickets = Issuer.issueLottoTickets(money); + LottoTickets lottoTickets = Issuer.issueLottoTickets(money, manualTicketCount); //then int actual = lottoTickets.getLottoTickets().size(); assertThat(actual).isEqualTo(expected); @@ -22,19 +23,20 @@ void issueLottoTickets() { void moneyNotUnitOfLottoPrice() { //given int money = 14500; - int expected = 14; + int manualTicketCount = 2; + int expected = 12; //when - LottoTickets lottoTickets = Issuer.issueLottoTickets(money); + LottoTickets lottoTickets = Issuer.issueLottoTickets(money, manualTicketCount); //then int actual = lottoTickets.getLottoTickets().size(); assertThat(actual).isEqualTo(expected); } @ValueSource(ints = {999, 0, -1000}) @ParameterizedTest - void invalidMoney(int money) { + void invalidMoney(int money, int manualTicketCount) { //when then assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> Issuer.issueLottoTickets(money)) + .isThrownBy(() -> Issuer.issueLottoTickets(money, manualTicketCount)) .withMessage("๊ธˆ์•ก์€ 1000์› ์ด์ƒ์œผ๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); } } \ No newline at end of file