From ceb411e15cde24e91a94a72e3cc650cbce5853ec Mon Sep 17 00:00:00 2001 From: Chloe Date: Tue, 13 Jul 2021 13:49:40 +0900 Subject: [PATCH 01/22] =?UTF-8?q?refactor=20:=20=20=ED=8B=B0=EC=BC=93=20?= =?UTF-8?q?=EC=9E=A5=20=EC=88=98=20=EA=B3=84=EC=82=B0=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95,=20static=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=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/lotto/LottoApplication.java | 3 +-- .../lotto/controller/LottoController.java | 10 ++++----- src/main/java/lotto/domain/BuyingPrice.java | 22 +++++++++---------- .../java/lotto/domain/LottoGenerator.java | 6 ++--- .../domain/LottoTicketVendingMachine.java | 8 +++---- .../java/lotto/domain/WinningStatistics.java | 2 +- src/main/java/lotto/view/OutputView.java | 3 +++ src/test/java/lotto/BuyingPriceTest.java | 3 +-- 8 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 0abe19f7..8af025ba 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -4,7 +4,6 @@ public class LottoApplication { public static void main(String[] args) { - LottoController lottoController = new LottoController(); - lottoController.run(); + LottoController.run(); } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 67d8961f..3635866a 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -8,16 +8,16 @@ import java.util.Map; import java.util.stream.Collectors; -import static lotto.domain.LottoTicketVendingMachine.TICKET_PRICE; - public class LottoController { - public void run() { + + private static LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); + + public static void run() { String inputPrice = InputView.getBuyingPrice(); BuyingPrice buyingPrice = new BuyingPrice(inputPrice); - int ticketAmount = buyingPrice.divide(TICKET_PRICE); + int ticketAmount = buyingPrice.ticketAmount(); OutputView.printTicketAmount(ticketAmount); - LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); List lottoTickets = lottoTicketVendingMachine.issueTickets(buyingPrice); OutputView.printLottoTickets(lottoTickets); diff --git a/src/main/java/lotto/domain/BuyingPrice.java b/src/main/java/lotto/domain/BuyingPrice.java index 3213e64d..ec80425a 100644 --- a/src/main/java/lotto/domain/BuyingPrice.java +++ b/src/main/java/lotto/domain/BuyingPrice.java @@ -3,6 +3,8 @@ import java.util.Objects; public class BuyingPrice { + public static final int TICKET_PRICE = 1000; + private final int buyingPrice; public BuyingPrice(final int buyingPrice) { @@ -16,27 +18,23 @@ public BuyingPrice(String buyingPrice) { private void validate(int buyingPrice) { validateMinimum(buyingPrice); - validateFactor(buyingPrice); + validateDivisible(buyingPrice); } private void validateMinimum(int buyingPrice) { - if (buyingPrice < LottoTicketVendingMachine.TICKET_PRICE) { - throw new IllegalArgumentException("구입 금액은 1,000원 이상이여야 합니다."); + if (buyingPrice < TICKET_PRICE) { + throw new IllegalArgumentException("구입 금액은 "+ TICKET_PRICE +"원 이상이여야 합니다."); } } - private void validateFactor(int buyingPrice) { - if ((buyingPrice % LottoTicketVendingMachine.TICKET_PRICE) != 0) { - throw new IllegalArgumentException("구입 금액은 1,000원 단위여야 합니다."); + private void validateDivisible(int buyingPrice) { + if ((buyingPrice % TICKET_PRICE) != 0) { + throw new IllegalArgumentException("구입 금액은 "+ TICKET_PRICE +"원 단위여야 합니다."); } } - public int value() { - return buyingPrice; - } - - public int divide(final int ticketPrice) { - return buyingPrice / ticketPrice; + public int ticketAmount() { + return buyingPrice / TICKET_PRICE; } @Override diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java index b19398f2..07d4625a 100644 --- a/src/main/java/lotto/domain/LottoGenerator.java +++ b/src/main/java/lotto/domain/LottoGenerator.java @@ -11,7 +11,7 @@ public class LottoGenerator { - private static final List lottoNumberContainer = create(); + private static final List LOTTO_NUMBER_CONTAINER = create(); private static List create() { return IntStream.rangeClosed(MIN_LOTTO_BOUND, MAX_LOTTO_BOUND) @@ -20,8 +20,8 @@ private static List create() { } public List issueAutoLottoNumbers() { - Collections.shuffle(lottoNumberContainer); - return lottoNumberContainer.subList(0, 6).stream() + Collections.shuffle(LOTTO_NUMBER_CONTAINER); + return LOTTO_NUMBER_CONTAINER.subList(0, 6).stream() .sorted(Comparator.comparing(LottoNumber::value)) .collect(Collectors.toList()); } diff --git a/src/main/java/lotto/domain/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/LottoTicketVendingMachine.java index c513367b..f2bb71cd 100644 --- a/src/main/java/lotto/domain/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/LottoTicketVendingMachine.java @@ -5,12 +5,12 @@ import java.util.stream.IntStream; public class LottoTicketVendingMachine { - public static final int TICKET_PRICE = 1000; - private static final LottoGenerator lottoGenerator = new LottoGenerator(); + + private static final LottoGenerator LOTTO_GENERATOR = new LottoGenerator(); public List issueTickets(BuyingPrice buyingPrice) { - return IntStream.range(0, buyingPrice.divide(TICKET_PRICE)) - .mapToObj(i -> lottoGenerator.issueAutoLottoNumbers()) + return IntStream.range(0, buyingPrice.ticketAmount()) + .mapToObj(i -> LOTTO_GENERATOR.issueAutoLottoNumbers()) .map(LottoTicket::new) .collect(Collectors.toList()); } diff --git a/src/main/java/lotto/domain/WinningStatistics.java b/src/main/java/lotto/domain/WinningStatistics.java index 9a5c3a65..77ebcbf1 100644 --- a/src/main/java/lotto/domain/WinningStatistics.java +++ b/src/main/java/lotto/domain/WinningStatistics.java @@ -3,8 +3,8 @@ import java.util.*; import java.util.stream.Collectors; +import static lotto.domain.BuyingPrice.TICKET_PRICE; import static lotto.domain.LottoPrize.*; -import static lotto.domain.LottoTicketVendingMachine.TICKET_PRICE; public class WinningStatistics { private final WinningNumbers winningNumbers; diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index c47306d4..30dde5e4 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -8,6 +8,9 @@ import java.util.stream.Collectors; public class OutputView { + private OutputView() { + } + public static void printLottoTickets(List lottoTickets) { for (LottoTicket lottoTicket : lottoTickets) { List lottoNumbers = lottoNumberToString(lottoTicket); diff --git a/src/test/java/lotto/BuyingPriceTest.java b/src/test/java/lotto/BuyingPriceTest.java index 273820b9..9c0367df 100644 --- a/src/test/java/lotto/BuyingPriceTest.java +++ b/src/test/java/lotto/BuyingPriceTest.java @@ -47,11 +47,10 @@ void validate_factor() { @DisplayName("입력받은 티켓 금액으로 나눈 값을 반환한다") void divide_ticket_price() { //given - int ticketPrice = 1000; BuyingPrice buyingPrice = new BuyingPrice(10000); //when - int ticketAmount = buyingPrice.divide(ticketPrice); + int ticketAmount = buyingPrice.ticketAmount(); //then assertThat(ticketAmount).isEqualTo(10); From 250b0a0526d4bcd72b283811c8b7674ab1423ea9 Mon Sep 17 00:00:00 2001 From: Chloe Date: Tue, 13 Jul 2021 23:31:30 +0900 Subject: [PATCH 02/22] =?UTF-8?q?refactor=20:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EC=88=9C=EC=9C=84=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EB=B3=80=EA=B2=BD=20(LottoPrize=20->=20Lo?= =?UTF-8?q?ttoRank),=20=EC=BD=94=EB=93=9C=20=EC=9D=B4=EB=8F=99=20=EB=B0=8F?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- .../lotto/controller/LottoController.java | 2 +- src/main/java/lotto/domain/LottoPrize.java | 55 -------------- src/main/java/lotto/domain/LottoRank.java | 42 +++++++++++ .../java/lotto/domain/WinningNumbers.java | 29 ++++---- .../java/lotto/domain/WinningStatistics.java | 64 ++++++++--------- src/main/java/lotto/view/OutputView.java | 16 ++--- src/test/java/lotto/BuyingPriceTest.java | 15 ++-- src/test/java/lotto/LottoNumberTest.java | 9 ++- src/test/java/lotto/LottoPrizeTest.java | 24 ------- src/test/java/lotto/LottoRankTest.java | 24 +++++++ .../lotto/LottoTicketVendingMachineTest.java | 2 +- src/test/java/lotto/WinningNumbersTest.java | 48 +------------ .../java/lotto/WinningStatisticsTest.java | 71 +++++++++++++++---- 14 files changed, 192 insertions(+), 215 deletions(-) delete mode 100644 src/main/java/lotto/domain/LottoPrize.java create mode 100644 src/main/java/lotto/domain/LottoRank.java delete mode 100644 src/test/java/lotto/LottoPrizeTest.java create mode 100644 src/test/java/lotto/LottoRankTest.java diff --git a/README.md b/README.md index c3b57585..eef16d1f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ - [x] 지난 주 당첨 번호를 입력한다. - [x] 보너스 볼을 입력한다. -- [] 출력 +- [x] 출력 - [x] 구매 금액에 따른 로또 티켓 장수를 출력한다. - [x] 구매 금액에 따른 각 로또 티켓의 번호를 출력한다. - [x] 당첨 번호와 일치하는 로또 티켓 개수를 출력한다. @@ -35,8 +35,8 @@ - [x] 당첨 번호와 중복되지 않는 1 ~ 45 중 하나는 보너스 볼이다. - [x] 당첨 번호와 일치하는 로또 번호 개수를 반환한다. -- [x] 로또 상금 - - [x] 로또 티켓의 당첨 순위에 따른 당첨 금액을 반환한다. +- [x] 로또 당첨 순위 + - [x] 로또 티켓의 당첨 갯수에 따른 순위를 반환한다. - [x] 로또 통계 - [x] 당첨 번호 개수가 같은 로또 티켓 개수를 반환한다. diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 3635866a..f523505c 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -31,7 +31,7 @@ public static void run() { WinningNumbers winningNumbers = new WinningNumbers(splitWinningNumbers, bonusNumber); WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - Map ranks = winningStatistics.groupByWinningNumber(lottoTickets); + Map ranks = winningStatistics.groupByHitCount(lottoTickets); OutputView.printWinningStatistics(ranks); float profitRate = winningStatistics.profitRate(ticketAmount, ranks); diff --git a/src/main/java/lotto/domain/LottoPrize.java b/src/main/java/lotto/domain/LottoPrize.java deleted file mode 100644 index d8dcf0b8..00000000 --- a/src/main/java/lotto/domain/LottoPrize.java +++ /dev/null @@ -1,55 +0,0 @@ -package lotto.domain; - -import java.util.Arrays; - -public enum LottoPrize { - FIRST(6, false, 2_000_000_000), - SECOND(5, true, 30_000_000), // 보너스볼 일치 - THIRD(5, false, 1_500_000), - FOURTH(4, false, 50_000), - FIFTH(3, false, 5_000), - NONE(0, false, 0); - - private final int matchedWinningNumberCount; - private final boolean matchedBonusNumber; - private final int prizeMoney; - - LottoPrize(int matchedWinningNumberCount, boolean matchedBonusNumber, int prizeMoney) { - this.matchedWinningNumberCount = matchedWinningNumberCount; - this.matchedBonusNumber = matchedBonusNumber; - this.prizeMoney = prizeMoney; - } - - public static int prize(int matchedWinningNumberCount, boolean isMatchedBonusNumber) { - return Arrays.stream(values()) - .filter(lottoPrize -> lottoPrize.isMatchedWith(matchedWinningNumberCount, isMatchedBonusNumber)) - .mapToInt(LottoPrize::prizeMoney) - .findFirst() - .orElse(NONE.prizeMoney); - } - - public static LottoPrize findBy(int matchedCount) { - return Arrays.stream(values()) - .filter(lottoPrize -> lottoPrize.matchedWinningNumberCount == matchedCount) - .findFirst() - .orElse(NONE); - } - - private boolean isMatchedWith(int matchedWinningNumberCount, boolean matchedBonusNumber) { - return (this.matchedWinningNumberCount == matchedWinningNumberCount) - && (this.matchedBonusNumber == matchedBonusNumber); - } - - public int prizeMoney() { - return prizeMoney; - } - - public int matchedWinningNumberCount() { - return matchedWinningNumberCount; - } - - public boolean isMatchedBonusNumber() { - return matchedBonusNumber; - } -} - diff --git a/src/main/java/lotto/domain/LottoRank.java b/src/main/java/lotto/domain/LottoRank.java new file mode 100644 index 00000000..00f7f7e0 --- /dev/null +++ b/src/main/java/lotto/domain/LottoRank.java @@ -0,0 +1,42 @@ +package lotto.domain; + +import java.util.Arrays; + +public enum LottoRank { + FIRST(6, 0, 2_000_000_000), + SECOND(5, 1, 30_000_000), // 보너스볼 일치 + THIRD(5, 0, 1_500_000), + FOURTH(4, 0, 50_000), + FIFTH(3, 0, 5_000), + LOSE(0, 0, 0); + + private final int hitCount; + private final int hitBonus; + private final int prizeMoney; + + LottoRank(int hitCount, int hitBonus, int prizeMoney) { + this.hitCount = hitCount; + this.hitBonus = hitBonus; + this.prizeMoney = prizeMoney; + } + + public static LottoRank findBy(int hitCount, int hitBonus) { + return Arrays.asList(values()).stream() + .filter(rank -> (rank.hitCount == hitCount) && (rank.hitBonus == hitBonus)) + .findFirst() + .orElse(LottoRank.LOSE); + } + + public int getHitCount() { + return hitCount; + } + + public int getHitBonus() { + return hitBonus; + } + + public int getPrizeMoney() { + return prizeMoney; + } +} + diff --git a/src/main/java/lotto/domain/WinningNumbers.java b/src/main/java/lotto/domain/WinningNumbers.java index 469db5ad..2153c3dc 100644 --- a/src/main/java/lotto/domain/WinningNumbers.java +++ b/src/main/java/lotto/domain/WinningNumbers.java @@ -1,6 +1,9 @@ package lotto.domain; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; public class WinningNumbers { @@ -9,18 +12,18 @@ public class WinningNumbers { private final List winningNumbers; private final LottoNumber bonusNumber; - public WinningNumbers(List winningNumbers, int bonusNumber) { - this(winningNumbers.stream() - .map(LottoNumber::new) - .collect(Collectors.toList()), new LottoNumber(bonusNumber)); - } - public WinningNumbers(List winningNumbers, LottoNumber bonusNumber) { validateDuplication(winningNumbers, bonusNumber); this.winningNumbers = winningNumbers; this.bonusNumber = bonusNumber; } + public WinningNumbers(List winningNumbers, int bonusNumber) { + this(winningNumbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList()), new LottoNumber(bonusNumber)); + } + private void validateDuplication(List winningNumbers, LottoNumber bonusNumber) { Set lottoNumbers = new HashSet<>(winningNumbers); @@ -29,14 +32,12 @@ private void validateDuplication(List winningNumbers, LottoNumber b } } - public int matchedWinningNumberCount(LottoTicket lottoTicket) { - return (int) winningNumbers.stream() - .filter(winningNumber -> lottoTicket.contains(winningNumber)) - .count(); + public List getWinningNumbers() { + return winningNumbers; } - public boolean isMatchedBonusNumber(LottoTicket lottoTicket) { - return lottoTicket.contains(bonusNumber); + public LottoNumber getBonusNumber() { + return bonusNumber; } @Override @@ -48,9 +49,9 @@ public boolean equals(Object o) { Objects.equals(bonusNumber, that.bonusNumber); } - @Override public int hashCode() { return Objects.hash(winningNumbers, bonusNumber); } + } diff --git a/src/main/java/lotto/domain/WinningStatistics.java b/src/main/java/lotto/domain/WinningStatistics.java index 77ebcbf1..f670f059 100644 --- a/src/main/java/lotto/domain/WinningStatistics.java +++ b/src/main/java/lotto/domain/WinningStatistics.java @@ -1,62 +1,54 @@ package lotto.domain; import java.util.*; -import java.util.stream.Collectors; import static lotto.domain.BuyingPrice.TICKET_PRICE; -import static lotto.domain.LottoPrize.*; public class WinningStatistics { private final WinningNumbers winningNumbers; - private final Map ranks = new LinkedHashMap<>(); + private final Map ranks = new LinkedHashMap<>(); public WinningStatistics(WinningNumbers winningNumbers) { this.winningNumbers = winningNumbers; - initRanks(); + initRank(); } - private void initRanks() { - Arrays.stream(values()).sorted(Comparator.reverseOrder()) - .filter(v -> v.matchedWinningNumberCount() > NONE.matchedWinningNumberCount()) - .forEach(v -> ranks.put(v, 0)); + private void initRank() { + Arrays.stream(LottoRank.values()) + .sorted(Comparator.reverseOrder()) + .filter(v -> v.getHitCount() > LottoRank.LOSE.getHitCount()) + .forEach(rank -> ranks.put(rank, 0)); } - public Map groupByWinningNumber(List lottoTickets) { - List matchedCounts = matchedCountList(lottoTickets); - - for (int i = 0; i < matchedCounts.size(); i++) { - int matchedCount = matchedCounts.get(i); - - if (matchedCount < FIFTH.matchedWinningNumberCount()) { - continue; - } - - if (matchedCount == SECOND.matchedWinningNumberCount() && winningNumbers.isMatchedBonusNumber(lottoTickets.get(i))) { - ranks.put(SECOND, ranks.get(SECOND) + 1); - continue; - } - - LottoPrize matchedLottoPrize = findBy(matchedCount); - ranks.put(matchedLottoPrize, ranks.get(matchedLottoPrize) + 1); - } + public int hitCount(LottoTicket lottoTicket) { + return (int) winningNumbers.getWinningNumbers().stream() + .filter(winningNumber -> lottoTicket.contains(winningNumber)) + .count(); + } - return ranks; + public int hitBonus(LottoTicket lottoTicket) { + return lottoTicket.contains(winningNumbers.getBonusNumber()) ? 1 : 0; } - private List matchedCountList(List lottoTickets) { - return lottoTickets.stream() - .map(lottoTicket -> winningNumbers.matchedWinningNumberCount(lottoTicket)) - .collect(Collectors.toList()); + public Map groupByHitCount(List lottoTickets) { + lottoTickets.stream() + .filter(lottoTicket -> hitCount(lottoTicket) >= LottoRank.FIFTH.getHitCount()) + .forEach(lottoTicket -> { + LottoRank key = LottoRank.findBy(hitCount(lottoTicket), hitBonus(lottoTicket)); + ranks.put(key, ranks.get(key) + 1); + }); + return ranks; } - public float profitRate(int ticketAmount, Map lottoPrize) { - int totalPrize = totalPrize(lottoPrize); + public float profitRate(int ticketAmount, Map ranks) { + int totalPrize = totalPrize(ranks); return (float) totalPrize / (ticketAmount * TICKET_PRICE); } - private int totalPrize(Map lottoPrizes) { - return lottoPrizes.keySet().stream() - .mapToInt(lottoPrize -> lottoPrize.prizeMoney() * lottoPrizes.get(lottoPrize)) + private int totalPrize(Map ranks) { + return ranks.keySet().stream() + .mapToInt(lottoRank -> lottoRank.getPrizeMoney() * ranks.get(lottoRank)) .sum(); } + } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 30dde5e4..81d4d294 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,6 +1,6 @@ package lotto.view; -import lotto.domain.LottoPrize; +import lotto.domain.LottoRank; import lotto.domain.LottoTicket; import java.util.List; @@ -32,16 +32,16 @@ public static void printProfitRate(float profitRate) { System.out.printf("총 수익률은 %.2f 입니다.%n", profitRate); } - public static void printWinningStatistics(Map ranks) { + public static void printWinningStatistics(Map ranks) { System.out.println("당첨 통계\n---------"); - for (LottoPrize lottoPrize : ranks.keySet()) { - if (lottoPrize.isMatchedBonusNumber()) { - System.out.printf("%d개 일치, 보너스 볼 일치 (%d원) - %d개%n", lottoPrize.matchedWinningNumberCount(), - lottoPrize.prizeMoney(), ranks.get(lottoPrize)); + for (LottoRank rank : ranks.keySet()) { + if ((rank.getHitCount() == 5 ) && (rank.getHitBonus() == 1)) { + System.out.printf("%d개 일치, 보너스 볼 일치 (%d원) - %d개%n", rank.getHitCount(), + rank.getPrizeMoney(), ranks.get(rank)); continue; } - System.out.printf("%d개 일치 (%d원) - %d개%n", lottoPrize.matchedWinningNumberCount(), - lottoPrize.prizeMoney(), ranks.get(lottoPrize)); + System.out.printf("%d개 일치 (%d원) - %d개%n", rank.getHitCount(), + rank.getPrizeMoney(), ranks.get(rank)); } } } diff --git a/src/test/java/lotto/BuyingPriceTest.java b/src/test/java/lotto/BuyingPriceTest.java index 9c0367df..d1176903 100644 --- a/src/test/java/lotto/BuyingPriceTest.java +++ b/src/test/java/lotto/BuyingPriceTest.java @@ -4,13 +4,12 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.*; public class BuyingPriceTest { @Test - @DisplayName("구입 금액을 인자로 받아 구입 금액 객체를 생성한다") + @DisplayName("구입 금액 값 객체를 생성한다") void create() { //given //when BuyingPrice buyingPrice = new BuyingPrice(1000); @@ -26,9 +25,8 @@ void validate_minimum() { int invalidPrice = 999; //when //then - assertThatIllegalArgumentException() - .isThrownBy(() -> new BuyingPrice(invalidPrice)) - .withMessage("구입 금액은 1,000원 이상이여야 합니다."); + assertThatThrownBy(() -> new BuyingPrice(invalidPrice)) + .isInstanceOf(IllegalArgumentException.class); } @Test @@ -38,9 +36,8 @@ void validate_factor() { int invalidPrice = 1001; //when //then - assertThatIllegalArgumentException() - .isThrownBy(() -> new BuyingPrice(invalidPrice)) - .withMessage("구입 금액은 1,000원 단위여야 합니다."); + assertThatThrownBy(() -> new BuyingPrice(invalidPrice)) + .isInstanceOf(IllegalArgumentException.class); } @Test diff --git a/src/test/java/lotto/LottoNumberTest.java b/src/test/java/lotto/LottoNumberTest.java index cea197ee..1cbdea48 100644 --- a/src/test/java/lotto/LottoNumberTest.java +++ b/src/test/java/lotto/LottoNumberTest.java @@ -1,18 +1,18 @@ package lotto; import lotto.domain.LottoNumber; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class LottoNumberTest { @Test - @DisplayName("로또 번호를 생성한다.") + @DisplayName("로또 번호 값 객체를 생성한다") void create() { //given LottoNumber lottoNumber = new LottoNumber(1); @@ -26,8 +26,7 @@ void create() { @DisplayName("로또 번호가 1 ~ 45이 아닐 경우 예외가 발생한다") void validate_lotto_number(int invalidLottoNumber) { //given //when //then - Assertions.assertThatIllegalArgumentException() - .isThrownBy(() -> new LottoNumber(invalidLottoNumber)) - .withMessage("로또 번호는 1 ~ 45 까지 입니다."); + assertThatThrownBy(() -> new LottoNumber(invalidLottoNumber)) + .isInstanceOf(IllegalArgumentException.class); } } \ No newline at end of file diff --git a/src/test/java/lotto/LottoPrizeTest.java b/src/test/java/lotto/LottoPrizeTest.java deleted file mode 100644 index 9fceb103..00000000 --- a/src/test/java/lotto/LottoPrizeTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package lotto; - -import lotto.domain.LottoPrize; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; - -import static org.assertj.core.api.Assertions.assertThat; - -public class LottoPrizeTest { - - @ParameterizedTest - @CsvSource(value = {"6, false, 2000000000", "5, true, 30000000", "5, false, 1500000", "4, false, 50000", "3, false, 5000"}) - @DisplayName("로또 당첨 순위를 확인한다") - void lotto_prizes(int matchedWinningNumberCount, boolean isMatchedBonusNumber, int prizeMoney) { - //given - - //when - int prize = LottoPrize.prize(matchedWinningNumberCount, isMatchedBonusNumber); - - //then - assertThat(prize).isEqualTo(prizeMoney); - } -} diff --git a/src/test/java/lotto/LottoRankTest.java b/src/test/java/lotto/LottoRankTest.java new file mode 100644 index 00000000..b04db7d4 --- /dev/null +++ b/src/test/java/lotto/LottoRankTest.java @@ -0,0 +1,24 @@ +package lotto; + +import lotto.domain.LottoRank; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoRankTest { + + @ParameterizedTest + @CsvSource(value = {"6, 0, FIRST", "5, 1, SECOND", "5, 0, THIRD", "4, 0, FOURTH", "3, 0, FIFTH"}) + @DisplayName("로또 티켓의 당첨 갯수에 따른 순위를 반환한다") + void lotto_hit_count_rank(int hitCount, int hitBonus, String ranking) { + //given + + //when + LottoRank rank = LottoRank.findBy(hitCount, hitBonus); + + //then + assertThat(rank).isEqualTo(LottoRank.valueOf(ranking)); + } +} diff --git a/src/test/java/lotto/LottoTicketVendingMachineTest.java b/src/test/java/lotto/LottoTicketVendingMachineTest.java index 35521cbe..689c65ed 100644 --- a/src/test/java/lotto/LottoTicketVendingMachineTest.java +++ b/src/test/java/lotto/LottoTicketVendingMachineTest.java @@ -13,7 +13,7 @@ public class LottoTicketVendingMachineTest { @Test - @DisplayName("로또 티켓 장수만큼 로또 티켓을 생성한다.") + @DisplayName("구입 금액에 따라 로또 티켓을 여러 장 생성한다") void issue_tickets_from_buying_price() { //given BuyingPrice buyingPrice = new BuyingPrice(5000); diff --git a/src/test/java/lotto/WinningNumbersTest.java b/src/test/java/lotto/WinningNumbersTest.java index ba41c512..1c7c4623 100644 --- a/src/test/java/lotto/WinningNumbersTest.java +++ b/src/test/java/lotto/WinningNumbersTest.java @@ -1,23 +1,18 @@ package lotto; -import lotto.domain.LottoTicket; import lotto.domain.WinningNumbers; 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.Arrays; import java.util.List; -import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; public class WinningNumbersTest { @Test - @DisplayName("6개의 로또 당첨 번호를 입력받아 당첨 번호를 객체를 생성한다") + @DisplayName("6개의 로또 당첨 번호를 입력받아 당첨 번호 값 객체를 생성한다") void create() { //given List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); @@ -55,45 +50,4 @@ void validate_duplication_bonus_number() { .isThrownBy(() -> new WinningNumbers(inputNumbers, bonusNumber)) .withMessage("당첨 번호가 중복됩니다."); } - - @ParameterizedTest - @MethodSource("generateLottoTicket") - @DisplayName("당첨 번호와 일치하는 로또 번호 개수를 반환한다") - void matched_winning_numbers_count(int[] numbers, int expectedCount) { - //given - LottoTicket lottoTicket = new LottoTicket(numbers); - WinningNumbers winningNumbers = new WinningNumbers(Arrays.asList(1, 2, 3, 4, 5, 6), 45); - - //when - int matchedWinningNumber = winningNumbers.matchedWinningNumberCount(lottoTicket); - - //then - assertThat(matchedWinningNumber).isEqualTo(expectedCount); - } - - @Test - @DisplayName("보너스 번호와 일치하는 로또 번호가 있는지 확인한다") - void matched_bonus_number() { - //given - LottoTicket lottoTicket = new LottoTicket(1, 2, 3, 4, 5, 6); - WinningNumbers winningNumbers = new WinningNumbers(Arrays.asList(4, 5, 6, 7, 8, 9), 1); - - //when - boolean isMatchedBonusNumber = winningNumbers.isMatchedBonusNumber(lottoTicket); - - //then - assertThat(isMatchedBonusNumber).isTrue(); - } - - private static Stream generateLottoTicket() { - return Stream.of( - Arguments.of(new int[]{1, 2, 3, 4, 5, 6}, 6), - Arguments.of(new int[]{1, 2, 3, 4, 5, 7}, 5), - Arguments.of(new int[]{1, 2, 3, 4, 7, 8}, 4), - Arguments.of(new int[]{1, 2, 3, 7, 8, 9}, 3), - Arguments.of(new int[]{1, 2, 7, 8, 9, 10}, 2), - Arguments.of(new int[]{1, 7, 8, 9, 10, 11}, 1), - Arguments.of(new int[]{8, 9, 10, 11, 12, 13}, 0) - ); - } } diff --git a/src/test/java/lotto/WinningStatisticsTest.java b/src/test/java/lotto/WinningStatisticsTest.java index 9f801d0e..10fd2a7a 100644 --- a/src/test/java/lotto/WinningStatisticsTest.java +++ b/src/test/java/lotto/WinningStatisticsTest.java @@ -1,16 +1,20 @@ package lotto; -import lotto.domain.LottoPrize; +import lotto.domain.LottoRank; import lotto.domain.LottoTicket; import lotto.domain.WinningNumbers; import lotto.domain.WinningStatistics; 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.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @@ -23,21 +27,64 @@ private WinningNumbers generateWinningNumber() { return new WinningNumbers(inputNumbers, bonusNumber); } + @ParameterizedTest + @MethodSource("generateLottoTicket") + @DisplayName("당첨 번호와 일치하는 로또 번호 개수를 반환한다") + void hit_winning_numbers_count(int[] numbers, int expectedCount) { + //given + LottoTicket lottoTicket = new LottoTicket(numbers); + WinningNumbers winningNumbers = new WinningNumbers(Arrays.asList(1, 2, 3, 4, 5, 6), 45); + + //when + WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); + int hitCount = winningStatistics.hitCount(lottoTicket); + + //then + assertThat(hitCount).isEqualTo(expectedCount); + } + + @Test + @DisplayName("보너스 번호와 일치하는 로또 번호가 있는지 확인한다") + void hit_bonus_number_count() { + //given + LottoTicket lottoTicket = new LottoTicket(1, 2, 3, 4, 5, 6); + WinningNumbers winningNumbers = new WinningNumbers(Arrays.asList(4, 5, 6, 7, 8, 9), 1); + + //when + WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); + int hitBonus = winningStatistics.hitBonus(lottoTicket); + + //then + assertThat(hitBonus).isEqualTo(1); + } + + private static Stream generateLottoTicket() { + return Stream.of( + Arguments.of(new int[]{1, 2, 3, 4, 5, 6}, 6), + Arguments.of(new int[]{1, 2, 3, 4, 5, 7}, 5), + Arguments.of(new int[]{1, 2, 3, 4, 7, 8}, 4), + Arguments.of(new int[]{1, 2, 3, 7, 8, 9}, 3), + Arguments.of(new int[]{1, 2, 7, 8, 9, 10}, 2), + Arguments.of(new int[]{1, 7, 8, 9, 10, 11}, 1), + Arguments.of(new int[]{8, 9, 10, 11, 12, 13}, 0) + ); + } + @Test @DisplayName("당첨 번호 개수가 같은 로또 티켓 개수를 반환한다") void group_by_matched_count() { //given WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - List lottoTickets = generateLottoTicketList(); + List lottoTickets = generateLottoTickets(); //when - Map ranks = winningStatistics.groupByWinningNumber(lottoTickets); + Map ranks = winningStatistics.groupByHitCount(lottoTickets); - //then - assertThat(ranks.get(LottoPrize.FIFTH)).isEqualTo(1); - assertThat(ranks.get(LottoPrize.FOURTH)).isEqualTo(1); - assertThat(ranks.get(LottoPrize.THIRD)).isZero(); - assertThat(ranks.get(LottoPrize.FIRST)).isZero(); + //thenR + assertThat(ranks.get(LottoRank.FIFTH)).isEqualTo(1); + assertThat(ranks.get(LottoRank.FOURTH)).isEqualTo(1); + assertThat(ranks.get(LottoRank.THIRD)).isZero(); + assertThat(ranks.get(LottoRank.FIRST)).isZero(); } @Test @@ -45,7 +92,7 @@ void group_by_matched_count() { void profit_rate() { //given WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - Map ranks = winningStatistics.groupByWinningNumber(generateLottoTicketList()); + Map ranks = winningStatistics.groupByHitCount(generateLottoTickets()); //when float profit = winningStatistics.profitRate(5, ranks); @@ -54,10 +101,10 @@ void profit_rate() { assertThat(profit).isEqualTo(11.0f); } - private ArrayList generateLottoTicketList() { + private ArrayList generateLottoTickets() { ArrayList lottoTicketList = new ArrayList<>(); - lottoTicketList.add(new LottoTicket(3, 4, 5, 6, 7, 8)); // 4개 일치 - 1 - lottoTicketList.add(new LottoTicket(4, 5, 6, 7, 8, 9)); // 3개 일치 - 1 + lottoTicketList.add(new LottoTicket(3, 4, 5, 6, 7, 8)); // 4개 일치 + lottoTicketList.add(new LottoTicket(4, 5, 6, 7, 8, 9)); // 3개 일치 lottoTicketList.add(new LottoTicket(5, 6, 7, 8, 9, 10)); // 2개 일치 lottoTicketList.add(new LottoTicket(6, 7, 8, 9, 10, 11)); // 1개 일치 lottoTicketList.add(new LottoTicket(7, 8, 9, 10, 11, 12)); // 0개 일치 From 5079c3de94dd7267677bc5f30ed2966fa88adfa2 Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 14 Jul 2021 18:02:43 +0900 Subject: [PATCH 03/22] =?UTF-8?q?docs=20:=20=EA=B5=AC=ED=98=84=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index eef16d1f..76ff3e8f 100644 --- a/README.md +++ b/README.md @@ -2,26 +2,31 @@ - [x] 입력 - [x] 구입 금액을 입력한다. + - [] 수동으로 구매할 로또 수를 입력한다. + - [] 수동으로 구매할 번호를 입력한다. - [x] 지난 주 당첨 번호를 입력한다. - [x] 보너스 볼을 입력한다. - [x] 출력 - - [x] 구매 금액에 따른 로또 티켓 장수를 출력한다. + - [] 구입 금액에 따라 수동 구매 장수와 자동 구매 장수를 출력한다. - [x] 구매 금액에 따른 각 로또 티켓의 번호를 출력한다. - [x] 당첨 번호와 일치하는 로또 티켓 개수를 출력한다. - [x] 총 수익률을 출력한다. + +*** - [x] 구입 금액 + - [x] 구입 금액은 1000원 단위의 정수값이다. - [x] ERROR : 음수일 경우 예외가 발생한다. - [x] ERROR : 1000원 단위가 아닐 경우 예외가 발생한다. - - [x] 로또 티켓 금액으로 나눈 티켓 장수로 반환한다. - -- [x] 로또 티켓 머신 - - [x] 구입 금액을 1000원 단위로 나누어 로또 티켓 장수를 반환한다. - - [x] 로또 티켓 장수만큼 로또 티켓을 생성한다. + +- [] 티켓 장수 + - [] 구입 금액을 1000원 단위로 나누어 로또 티켓 장수를 반환한다. -- [x] 로또 티켓 - - [x] 6개의 로또 번호를 가진다. +- [] 로또 게임 + - [] 전체 로또 티켓을 생성한다. + +*** - [x] 로또 번호 생성기 - [x] 1 ~ 45 사이의 난수로 로또 번호를 생성한다. @@ -29,12 +34,25 @@ - [x] 로또 번호 - [x] ERROR : 1 ~ 45가 아닐 경우 예외가 발생한다. + +- [x] 로또 티켓 + - [x] 6개의 로또 번호를 가진다. + +- [x] 로또 티켓 머신 + - [] 수동으로 로또 티켓을 생성한다. + - [x] 자동으로 로또 티켓을 생성한다. + +*** - [x] 당첨 번호 - [x] ERROR: 중복되는 로또 번호가 있을 경우 예외가 발생한다. - [x] 당첨 번호와 중복되지 않는 1 ~ 45 중 하나는 보너스 볼이다. - [x] 당첨 번호와 일치하는 로또 번호 개수를 반환한다. +- [] 당첨 결과 + - [] 당첨 번호와 일치하는 갯수를 반환한다. + - [] 보너스 번호 일치 여부를 반환하다. + - [x] 로또 당첨 순위 - [x] 로또 티켓의 당첨 갯수에 따른 순위를 반환한다. From 76114b589c6a55fe63dcbdc93c68217b328bd367 Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 14 Jul 2021 20:10:15 +0900 Subject: [PATCH 04/22] =?UTF-8?q?style=20:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/LottoController.java | 7 ++++++- src/main/java/lotto/domain/{ => lotto}/LottoGenerator.java | 6 +++--- src/main/java/lotto/domain/{ => lotto}/LottoNumber.java | 2 +- src/main/java/lotto/domain/{ => lotto}/LottoTicket.java | 2 +- src/main/java/lotto/domain/{ => vending}/BuyingPrice.java | 2 +- .../domain/{ => vending}/LottoTicketVendingMachine.java | 5 ++++- src/main/java/lotto/domain/vending/TicketAmount.java | 4 ++++ src/main/java/lotto/domain/{ => winning}/LottoRank.java | 2 +- .../java/lotto/domain/{ => winning}/WinningNumbers.java | 4 +++- .../java/lotto/domain/{ => winning}/WinningStatistics.java | 6 ++++-- src/main/java/lotto/view/OutputView.java | 4 ++-- .../java/lotto/{ => domain/lotto}/LottoGeneratorTest.java | 4 +--- .../java/lotto/{ => domain/lotto}/LottoNumberTest.java | 3 +-- .../java/lotto/{ => domain/lotto}/LottoTicketTest.java | 5 +---- .../java/lotto/{ => domain/vending}/BuyingPriceTest.java | 3 +-- .../vending}/LottoTicketVendingMachineTest.java | 6 ++---- .../java/lotto/{ => domain/winning}/LottoRankTest.java | 3 +-- .../lotto/{ => domain/winning}/WinningNumbersTest.java | 3 +-- .../lotto/{ => domain/winning}/WinningStatisticsTest.java | 7 ++----- 19 files changed, 40 insertions(+), 38 deletions(-) rename src/main/java/lotto/domain/{ => lotto}/LottoGenerator.java (83%) rename src/main/java/lotto/domain/{ => lotto}/LottoNumber.java (97%) rename src/main/java/lotto/domain/{ => lotto}/LottoTicket.java (96%) rename src/main/java/lotto/domain/{ => vending}/BuyingPrice.java (97%) rename src/main/java/lotto/domain/{ => vending}/LottoTicketVendingMachine.java (82%) create mode 100644 src/main/java/lotto/domain/vending/TicketAmount.java rename src/main/java/lotto/domain/{ => winning}/LottoRank.java (97%) rename src/main/java/lotto/domain/{ => winning}/WinningNumbers.java (96%) rename src/main/java/lotto/domain/{ => winning}/WinningStatistics.java (93%) rename src/test/java/lotto/{ => domain/lotto}/LottoGeneratorTest.java (86%) rename src/test/java/lotto/{ => domain/lotto}/LottoNumberTest.java (95%) rename src/test/java/lotto/{ => domain/lotto}/LottoTicketTest.java (84%) rename src/test/java/lotto/{ => domain/vending}/BuyingPriceTest.java (96%) rename src/test/java/lotto/{ => domain/vending}/LottoTicketVendingMachineTest.java (84%) rename src/test/java/lotto/{ => domain/winning}/LottoRankTest.java (93%) rename src/test/java/lotto/{ => domain/winning}/WinningNumbersTest.java (97%) rename src/test/java/lotto/{ => domain/winning}/WinningStatisticsTest.java (96%) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index f523505c..57401f75 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,6 +1,11 @@ package lotto.controller; -import lotto.domain.*; +import lotto.domain.lotto.LottoTicket; +import lotto.domain.vending.BuyingPrice; +import lotto.domain.vending.LottoTicketVendingMachine; +import lotto.domain.winning.LottoRank; +import lotto.domain.winning.WinningNumbers; +import lotto.domain.winning.WinningStatistics; import lotto.view.InputView; import lotto.view.OutputView; diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/lotto/LottoGenerator.java similarity index 83% rename from src/main/java/lotto/domain/LottoGenerator.java rename to src/main/java/lotto/domain/lotto/LottoGenerator.java index 07d4625a..b406425f 100644 --- a/src/main/java/lotto/domain/LottoGenerator.java +++ b/src/main/java/lotto/domain/lotto/LottoGenerator.java @@ -1,4 +1,4 @@ -package lotto.domain; +package lotto.domain.lotto; import java.util.Collections; import java.util.Comparator; @@ -6,8 +6,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import static lotto.domain.LottoNumber.MAX_LOTTO_BOUND; -import static lotto.domain.LottoNumber.MIN_LOTTO_BOUND; +import static lotto.domain.lotto.LottoNumber.MAX_LOTTO_BOUND; +import static lotto.domain.lotto.LottoNumber.MIN_LOTTO_BOUND; public class LottoGenerator { diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/lotto/LottoNumber.java similarity index 97% rename from src/main/java/lotto/domain/LottoNumber.java rename to src/main/java/lotto/domain/lotto/LottoNumber.java index 6ec92237..07d51614 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.Objects; diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/lotto/LottoTicket.java similarity index 96% rename from src/main/java/lotto/domain/LottoTicket.java rename to src/main/java/lotto/domain/lotto/LottoTicket.java index 8d8ef393..aba8bfbb 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.Arrays; diff --git a/src/main/java/lotto/domain/BuyingPrice.java b/src/main/java/lotto/domain/vending/BuyingPrice.java similarity index 97% rename from src/main/java/lotto/domain/BuyingPrice.java rename to src/main/java/lotto/domain/vending/BuyingPrice.java index ec80425a..d67d533f 100644 --- a/src/main/java/lotto/domain/BuyingPrice.java +++ b/src/main/java/lotto/domain/vending/BuyingPrice.java @@ -1,4 +1,4 @@ -package lotto.domain; +package lotto.domain.vending; import java.util.Objects; diff --git a/src/main/java/lotto/domain/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java similarity index 82% rename from src/main/java/lotto/domain/LottoTicketVendingMachine.java rename to src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java index f2bb71cd..ad1806f0 100644 --- a/src/main/java/lotto/domain/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java @@ -1,4 +1,7 @@ -package lotto.domain; +package lotto.domain.vending; + +import lotto.domain.lotto.LottoGenerator; +import lotto.domain.lotto.LottoTicket; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/lotto/domain/vending/TicketAmount.java b/src/main/java/lotto/domain/vending/TicketAmount.java new file mode 100644 index 00000000..8ecf0ba3 --- /dev/null +++ b/src/main/java/lotto/domain/vending/TicketAmount.java @@ -0,0 +1,4 @@ +package lotto.domain.vending; + +public class TicketAmount { +} diff --git a/src/main/java/lotto/domain/LottoRank.java b/src/main/java/lotto/domain/winning/LottoRank.java similarity index 97% rename from src/main/java/lotto/domain/LottoRank.java rename to src/main/java/lotto/domain/winning/LottoRank.java index 00f7f7e0..4bb44d80 100644 --- a/src/main/java/lotto/domain/LottoRank.java +++ b/src/main/java/lotto/domain/winning/LottoRank.java @@ -1,4 +1,4 @@ -package lotto.domain; +package lotto.domain.winning; import java.util.Arrays; diff --git a/src/main/java/lotto/domain/WinningNumbers.java b/src/main/java/lotto/domain/winning/WinningNumbers.java similarity index 96% rename from src/main/java/lotto/domain/WinningNumbers.java rename to src/main/java/lotto/domain/winning/WinningNumbers.java index 2153c3dc..b96e352a 100644 --- a/src/main/java/lotto/domain/WinningNumbers.java +++ b/src/main/java/lotto/domain/winning/WinningNumbers.java @@ -1,4 +1,6 @@ -package lotto.domain; +package lotto.domain.winning; + +import lotto.domain.lotto.LottoNumber; import java.util.HashSet; import java.util.List; diff --git a/src/main/java/lotto/domain/WinningStatistics.java b/src/main/java/lotto/domain/winning/WinningStatistics.java similarity index 93% rename from src/main/java/lotto/domain/WinningStatistics.java rename to src/main/java/lotto/domain/winning/WinningStatistics.java index f670f059..7d24772a 100644 --- a/src/main/java/lotto/domain/WinningStatistics.java +++ b/src/main/java/lotto/domain/winning/WinningStatistics.java @@ -1,8 +1,10 @@ -package lotto.domain; +package lotto.domain.winning; + +import lotto.domain.lotto.LottoTicket; import java.util.*; -import static lotto.domain.BuyingPrice.TICKET_PRICE; +import static lotto.domain.vending.BuyingPrice.TICKET_PRICE; public class WinningStatistics { private final WinningNumbers winningNumbers; diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 81d4d294..ec9d6471 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,7 +1,7 @@ package lotto.view; -import lotto.domain.LottoRank; -import lotto.domain.LottoTicket; +import lotto.domain.winning.LottoRank; +import lotto.domain.lotto.LottoTicket; import java.util.List; import java.util.Map; diff --git a/src/test/java/lotto/LottoGeneratorTest.java b/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java similarity index 86% rename from src/test/java/lotto/LottoGeneratorTest.java rename to src/test/java/lotto/domain/lotto/LottoGeneratorTest.java index b7805796..4a3b81f7 100644 --- a/src/test/java/lotto/LottoGeneratorTest.java +++ b/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java @@ -1,7 +1,5 @@ -package lotto; +package lotto.domain.lotto; -import lotto.domain.LottoGenerator; -import lotto.domain.LottoNumber; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/LottoNumberTest.java b/src/test/java/lotto/domain/lotto/LottoNumberTest.java similarity index 95% rename from src/test/java/lotto/LottoNumberTest.java rename to src/test/java/lotto/domain/lotto/LottoNumberTest.java index 1cbdea48..0e62e32f 100644 --- a/src/test/java/lotto/LottoNumberTest.java +++ b/src/test/java/lotto/domain/lotto/LottoNumberTest.java @@ -1,6 +1,5 @@ -package lotto; +package lotto.domain.lotto; -import lotto.domain.LottoNumber; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/lotto/LottoTicketTest.java b/src/test/java/lotto/domain/lotto/LottoTicketTest.java similarity index 84% rename from src/test/java/lotto/LottoTicketTest.java rename to src/test/java/lotto/domain/lotto/LottoTicketTest.java index e11140bc..2e7450bf 100644 --- a/src/test/java/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/domain/lotto/LottoTicketTest.java @@ -1,8 +1,5 @@ -package lotto; +package lotto.domain.lotto; -import lotto.domain.LottoGenerator; -import lotto.domain.LottoNumber; -import lotto.domain.LottoTicket; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/BuyingPriceTest.java b/src/test/java/lotto/domain/vending/BuyingPriceTest.java similarity index 96% rename from src/test/java/lotto/BuyingPriceTest.java rename to src/test/java/lotto/domain/vending/BuyingPriceTest.java index d1176903..e1557628 100644 --- a/src/test/java/lotto/BuyingPriceTest.java +++ b/src/test/java/lotto/domain/vending/BuyingPriceTest.java @@ -1,6 +1,5 @@ -package lotto; +package lotto.domain.vending; -import lotto.domain.BuyingPrice; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/LottoTicketVendingMachineTest.java b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java similarity index 84% rename from src/test/java/lotto/LottoTicketVendingMachineTest.java rename to src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java index 689c65ed..20345de4 100644 --- a/src/test/java/lotto/LottoTicketVendingMachineTest.java +++ b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java @@ -1,8 +1,6 @@ -package lotto; +package lotto.domain.vending; -import lotto.domain.BuyingPrice; -import lotto.domain.LottoTicket; -import lotto.domain.LottoTicketVendingMachine; +import lotto.domain.lotto.LottoTicket; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/LottoRankTest.java b/src/test/java/lotto/domain/winning/LottoRankTest.java similarity index 93% rename from src/test/java/lotto/LottoRankTest.java rename to src/test/java/lotto/domain/winning/LottoRankTest.java index b04db7d4..0e511fae 100644 --- a/src/test/java/lotto/LottoRankTest.java +++ b/src/test/java/lotto/domain/winning/LottoRankTest.java @@ -1,6 +1,5 @@ -package lotto; +package lotto.domain.winning; -import lotto.domain.LottoRank; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/lotto/WinningNumbersTest.java b/src/test/java/lotto/domain/winning/WinningNumbersTest.java similarity index 97% rename from src/test/java/lotto/WinningNumbersTest.java rename to src/test/java/lotto/domain/winning/WinningNumbersTest.java index 1c7c4623..bcdc071a 100644 --- a/src/test/java/lotto/WinningNumbersTest.java +++ b/src/test/java/lotto/domain/winning/WinningNumbersTest.java @@ -1,6 +1,5 @@ -package lotto; +package lotto.domain.winning; -import lotto.domain.WinningNumbers; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/WinningStatisticsTest.java b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java similarity index 96% rename from src/test/java/lotto/WinningStatisticsTest.java rename to src/test/java/lotto/domain/winning/WinningStatisticsTest.java index 10fd2a7a..010227d9 100644 --- a/src/test/java/lotto/WinningStatisticsTest.java +++ b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java @@ -1,9 +1,6 @@ -package lotto; +package lotto.domain.winning; -import lotto.domain.LottoRank; -import lotto.domain.LottoTicket; -import lotto.domain.WinningNumbers; -import lotto.domain.WinningStatistics; +import lotto.domain.lotto.LottoTicket; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; From 7889a2cf14dd844d996dcf6731ca181f3ba3d43c Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 14 Jul 2021 20:52:58 +0900 Subject: [PATCH 05/22] =?UTF-8?q?feat=20:=20=ED=8B=B0=EC=BC=93=20=EC=9E=A5?= =?UTF-8?q?=20=EC=88=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84,=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=86=8C=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 8 ++++-- .../vending/LottoTicketVendingMachine.java | 4 +-- .../lotto/domain/vending/TicketAmount.java | 25 +++++++++++++++++++ .../domain/winning/WinningStatistics.java | 7 +++--- src/main/java/lotto/view/InputView.java | 12 +++++++++ src/main/java/lotto/view/OutputView.java | 9 ++++--- .../lotto/domain/vending/BuyingPriceTest.java | 15 ++--------- .../LottoTicketVendingMachineTest.java | 5 ++-- .../domain/vending/TicketAmountTest.java | 25 +++++++++++++++++++ .../domain/winning/WinningStatisticsTest.java | 15 ++++++++--- 10 files changed, 95 insertions(+), 30 deletions(-) create mode 100644 src/test/java/lotto/domain/vending/TicketAmountTest.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 57401f75..7265a159 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -3,6 +3,7 @@ import lotto.domain.lotto.LottoTicket; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.LottoTicketVendingMachine; +import lotto.domain.vending.TicketAmount; import lotto.domain.winning.LottoRank; import lotto.domain.winning.WinningNumbers; import lotto.domain.winning.WinningStatistics; @@ -20,10 +21,13 @@ public class LottoController { public static void run() { String inputPrice = InputView.getBuyingPrice(); BuyingPrice buyingPrice = new BuyingPrice(inputPrice); - int ticketAmount = buyingPrice.ticketAmount(); + + String inputManualCount = InputView.getManualCount(); + TicketAmount ticketAmount = new TicketAmount(buyingPrice, inputManualCount); + OutputView.printTicketAmount(ticketAmount); - List lottoTickets = lottoTicketVendingMachine.issueTickets(buyingPrice); + List lottoTickets = lottoTicketVendingMachine.autoIssueTickets(ticketAmount); OutputView.printLottoTickets(lottoTickets); String inputWinningNumbers = InputView.getWinningNumber(); diff --git a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java index ad1806f0..21fce995 100644 --- a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java @@ -11,8 +11,8 @@ public class LottoTicketVendingMachine { private static final LottoGenerator LOTTO_GENERATOR = new LottoGenerator(); - public List issueTickets(BuyingPrice buyingPrice) { - return IntStream.range(0, buyingPrice.ticketAmount()) + public List autoIssueTickets(TicketAmount ticketAmount) { + return IntStream.range(0, ticketAmount.auto()) .mapToObj(i -> LOTTO_GENERATOR.issueAutoLottoNumbers()) .map(LottoTicket::new) .collect(Collectors.toList()); diff --git a/src/main/java/lotto/domain/vending/TicketAmount.java b/src/main/java/lotto/domain/vending/TicketAmount.java index 8ecf0ba3..34ad59b6 100644 --- a/src/main/java/lotto/domain/vending/TicketAmount.java +++ b/src/main/java/lotto/domain/vending/TicketAmount.java @@ -1,4 +1,29 @@ package lotto.domain.vending; public class TicketAmount { + public static final int TICKET_PRICE = 1000; + + private final int manualCount; + private final int autoCount; + + public TicketAmount(BuyingPrice buyingPrice, int manualCount) { + this.manualCount = manualCount; + this.autoCount = (buyingPrice.value() / TICKET_PRICE) - manualCount; + } + + public TicketAmount(BuyingPrice buyingPrice, String manualCount) { + this(buyingPrice, Integer.parseInt(manualCount)); + } + + public int manual() { + return manualCount; + } + + public int auto() { + return autoCount; + } + + public float total() { + return manualCount + autoCount; + } } diff --git a/src/main/java/lotto/domain/winning/WinningStatistics.java b/src/main/java/lotto/domain/winning/WinningStatistics.java index 7d24772a..4e3bc62a 100644 --- a/src/main/java/lotto/domain/winning/WinningStatistics.java +++ b/src/main/java/lotto/domain/winning/WinningStatistics.java @@ -1,10 +1,11 @@ package lotto.domain.winning; import lotto.domain.lotto.LottoTicket; +import lotto.domain.vending.TicketAmount; import java.util.*; -import static lotto.domain.vending.BuyingPrice.TICKET_PRICE; +import static lotto.domain.vending.TicketAmount.TICKET_PRICE; public class WinningStatistics { private final WinningNumbers winningNumbers; @@ -42,9 +43,9 @@ public Map groupByHitCount(List lottoTickets) { return ranks; } - public float profitRate(int ticketAmount, Map ranks) { + public float profitRate(TicketAmount ticketAmount, Map ranks) { int totalPrize = totalPrize(ranks); - return (float) totalPrize / (ticketAmount * TICKET_PRICE); + return (float) totalPrize / (ticketAmount.total() * TICKET_PRICE); } private int totalPrize(Map ranks) { diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 26e8175a..82666695 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -8,6 +8,8 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); private static final String BUYING_PRICE_MESSAGE = "구입금액을 입력해 주세요."; + private static final String MANUAL_COUNT_MESSAGE = "수동으로 구매할 로또 수를 입력해 주세요."; + public static final String MANUAL_NUMBER_MESSAGE = "수동으로 구매할 번호를 입력해 주세요."; private static final String WINNING_NUMBER_MESSAGE = "지난 주 당첨 번호를 입력해 주세요."; private static final String BONUS_NUMBER_MESSAGE = "보너스 볼을 입력해 주세요."; private static final String DELIMITER = ","; @@ -20,6 +22,16 @@ public static String getBuyingPrice() { return scanner.nextLine().trim(); } + public static String getManualCount() { + System.out.println(MANUAL_COUNT_MESSAGE); + return scanner.nextLine().trim(); + } + + public static String getManualNumber() { + System.out.println(MANUAL_NUMBER_MESSAGE); + return scanner.nextLine().trim(); + } + public static String getWinningNumber() { System.out.println(WINNING_NUMBER_MESSAGE); return scanner.nextLine().trim(); diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index ec9d6471..998a39d6 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,7 +1,8 @@ package lotto.view; -import lotto.domain.winning.LottoRank; import lotto.domain.lotto.LottoTicket; +import lotto.domain.vending.TicketAmount; +import lotto.domain.winning.LottoRank; import java.util.List; import java.util.Map; @@ -24,8 +25,8 @@ private static List lottoNumberToString(LottoTicket lottoTicket) { .collect(Collectors.toList()); } - public static void printTicketAmount(int ticketAmount) { - System.out.printf("%s개를 구매했습니다.%n", ticketAmount); + public static void printTicketAmount(TicketAmount ticketAmount) { + System.out.printf("수동으로 %d장, 자동으로 %d장 구매했습니다.%n", ticketAmount.manual(), ticketAmount.auto()); } public static void printProfitRate(float profitRate) { @@ -35,7 +36,7 @@ public static void printProfitRate(float profitRate) { public static void printWinningStatistics(Map ranks) { System.out.println("당첨 통계\n---------"); for (LottoRank rank : ranks.keySet()) { - if ((rank.getHitCount() == 5 ) && (rank.getHitBonus() == 1)) { + if ((rank.getHitCount() == 5) && (rank.getHitBonus() == 1)) { System.out.printf("%d개 일치, 보너스 볼 일치 (%d원) - %d개%n", rank.getHitCount(), rank.getPrizeMoney(), ranks.get(rank)); continue; diff --git a/src/test/java/lotto/domain/vending/BuyingPriceTest.java b/src/test/java/lotto/domain/vending/BuyingPriceTest.java index e1557628..6c51bcd2 100644 --- a/src/test/java/lotto/domain/vending/BuyingPriceTest.java +++ b/src/test/java/lotto/domain/vending/BuyingPriceTest.java @@ -3,7 +3,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class BuyingPriceTest { @@ -39,16 +40,4 @@ void validate_factor() { .isInstanceOf(IllegalArgumentException.class); } - @Test - @DisplayName("입력받은 티켓 금액으로 나눈 값을 반환한다") - void divide_ticket_price() { - //given - BuyingPrice buyingPrice = new BuyingPrice(10000); - - //when - int ticketAmount = buyingPrice.ticketAmount(); - - //then - assertThat(ticketAmount).isEqualTo(10); - } } diff --git a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java index 20345de4..d919da74 100644 --- a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java +++ b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java @@ -11,14 +11,15 @@ public class LottoTicketVendingMachineTest { @Test - @DisplayName("구입 금액에 따라 로또 티켓을 여러 장 생성한다") + @DisplayName("자동으로 로또 티켓을 생성한다") void issue_tickets_from_buying_price() { //given BuyingPrice buyingPrice = new BuyingPrice(5000); + TicketAmount ticketAmount = new TicketAmount(buyingPrice, 0); LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); //when - List tickets = lottoTicketVendingMachine.issueTickets(buyingPrice); + List tickets = lottoTicketVendingMachine.autoIssueTickets(ticketAmount); //then assertThat(tickets).hasSize(5); diff --git a/src/test/java/lotto/domain/vending/TicketAmountTest.java b/src/test/java/lotto/domain/vending/TicketAmountTest.java new file mode 100644 index 00000000..95a0fa66 --- /dev/null +++ b/src/test/java/lotto/domain/vending/TicketAmountTest.java @@ -0,0 +1,25 @@ +package lotto.domain.vending; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TicketAmountTest { + + @ParameterizedTest + @CsvSource(value = {"5000, 1, 4", "10000, 3, 7", "12000, 2, 10"}) + @DisplayName("구입 금액과 수동 로또 티켓 개수를 인자로 받아 로또 티켓 장수를 반환한다") + void ticket_amount(int price, int manualCount, int exceptedAutoCount) { + //given + BuyingPrice buyingPrice = new BuyingPrice(price); + + //when + TicketAmount ticketAmount = new TicketAmount(buyingPrice, manualCount); + + //then + assertThat(ticketAmount.manual()).isEqualTo(manualCount); + assertThat(ticketAmount.auto()).isEqualTo(exceptedAutoCount); + } +} diff --git a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java index 010227d9..81a5ceae 100644 --- a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java +++ b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java @@ -1,6 +1,8 @@ package lotto.domain.winning; import lotto.domain.lotto.LottoTicket; +import lotto.domain.vending.BuyingPrice; +import lotto.domain.vending.TicketAmount; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -13,6 +15,7 @@ import java.util.Map; import java.util.stream.Stream; +import static lotto.domain.vending.TicketAmount.TICKET_PRICE; import static org.assertj.core.api.Assertions.assertThat; public class WinningStatisticsTest { @@ -88,18 +91,22 @@ void group_by_matched_count() { @DisplayName("당첨 순위의 수익률을 계산한다") void profit_rate() { //given + List lottoTickets = generateLottoTickets(); + BuyingPrice buyingPrice = new BuyingPrice(lottoTickets.size() * TICKET_PRICE); + TicketAmount ticketAmount = new TicketAmount(buyingPrice, lottoTickets.size()); + WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - Map ranks = winningStatistics.groupByHitCount(generateLottoTickets()); + Map ranks = winningStatistics.groupByHitCount(lottoTickets); //when - float profit = winningStatistics.profitRate(5, ranks); + float profit = winningStatistics.profitRate(ticketAmount, ranks); //then assertThat(profit).isEqualTo(11.0f); } - private ArrayList generateLottoTickets() { - ArrayList lottoTicketList = new ArrayList<>(); + private List generateLottoTickets() { + List lottoTicketList = new ArrayList<>(); lottoTicketList.add(new LottoTicket(3, 4, 5, 6, 7, 8)); // 4개 일치 lottoTicketList.add(new LottoTicket(4, 5, 6, 7, 8, 9)); // 3개 일치 lottoTicketList.add(new LottoTicket(5, 6, 7, 8, 9, 10)); // 2개 일치 From 3ce097626e8373062638bcc55839f143db60915e Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 14 Jul 2021 21:39:15 +0900 Subject: [PATCH 06/22] =?UTF-8?q?feat=20:=20InputView=20=EC=88=98=EB=8F=99?= =?UTF-8?q?=20=ED=8B=B0=EC=BC=93=20=EC=9E=85=EB=A0=A5,=20=ED=8B=B0?= =?UTF-8?q?=EC=BC=93=20=EC=9E=A5=20=EC=88=98=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++---- .../java/lotto/controller/LottoController.java | 17 +++++++++++++++-- .../java/lotto/domain/lotto/LottoNumber.java | 4 ++++ .../java/lotto/domain/vending/BuyingPrice.java | 12 ++++++------ .../vending/LottoTicketVendingMachine.java | 8 ++++++++ .../java/lotto/domain/vending/TicketAmount.java | 7 +++++++ src/main/java/lotto/view/InputView.java | 11 +++++++++-- .../lotto/domain/vending/TicketAmountTest.java | 14 ++++++++++++++ 8 files changed, 68 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 76ff3e8f..fe286bca 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ - [x] 입력 - [x] 구입 금액을 입력한다. - - [] 수동으로 구매할 로또 수를 입력한다. - - [] 수동으로 구매할 번호를 입력한다. + - [x] 수동으로 구매할 로또 수를 입력한다. + - [x] 수동으로 구매할 번호를 입력한다. - [x] 지난 주 당첨 번호를 입력한다. - [x] 보너스 볼을 입력한다. @@ -20,8 +20,9 @@ - [x] ERROR : 음수일 경우 예외가 발생한다. - [x] ERROR : 1000원 단위가 아닐 경우 예외가 발생한다. -- [] 티켓 장수 - - [] 구입 금액을 1000원 단위로 나누어 로또 티켓 장수를 반환한다. +- [x] 티켓 장수 + - [x] 구입 금액을 1000원 단위로 나누어 로또 티켓 장수를 반환한다. + - [x] ERROR : 전체 티켓 장수 보다 수동 구매 장수가 많은 경우 예외가 발생한다. - [] 로또 게임 - [] 전체 로또 티켓을 생성한다. diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 7265a159..e786ee1c 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,5 +1,6 @@ package lotto.controller; +import lotto.domain.lotto.LottoNumber; import lotto.domain.lotto.LottoTicket; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.LottoTicketVendingMachine; @@ -10,9 +11,11 @@ import lotto.view.InputView; import lotto.view.OutputView; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; public class LottoController { @@ -25,10 +28,20 @@ public static void run() { String inputManualCount = InputView.getManualCount(); TicketAmount ticketAmount = new TicketAmount(buyingPrice, inputManualCount); + List manualNumbers = InputView.getManualNumbers(ticketAmount); + List manualLottoTickets = new ArrayList<>(); + for (String manualNumber : manualNumbers) { + List manualLottoNumbers = InputView.split(manualNumber).stream() + .map(LottoNumber::new) + .collect(Collectors.toList()); + manualLottoTickets.add(new LottoTicket(manualLottoNumbers)); + } + + List autoLottoTickets = lottoTicketVendingMachine.autoIssueTickets(ticketAmount); OutputView.printTicketAmount(ticketAmount); - List lottoTickets = lottoTicketVendingMachine.autoIssueTickets(ticketAmount); - OutputView.printLottoTickets(lottoTickets); + List lottoTickets = Stream.concat(manualLottoTickets.stream(), autoLottoTickets.stream()) + .collect(Collectors.toList()); String inputWinningNumbers = InputView.getWinningNumber(); List splitWinningNumbers = InputView.split(inputWinningNumbers) diff --git a/src/main/java/lotto/domain/lotto/LottoNumber.java b/src/main/java/lotto/domain/lotto/LottoNumber.java index 07d51614..36ac7012 100644 --- a/src/main/java/lotto/domain/lotto/LottoNumber.java +++ b/src/main/java/lotto/domain/lotto/LottoNumber.java @@ -13,6 +13,10 @@ public LottoNumber(final int lottoNumber) { this.lottoNumber = lottoNumber; } + public LottoNumber(String lottoNumber) { + this(Integer.parseInt(lottoNumber)); + } + private void validateBound(int lottoNumber) { if (lottoNumber < MIN_LOTTO_BOUND || lottoNumber > MAX_LOTTO_BOUND) { throw new IllegalArgumentException("로또 번호는 1 ~ 45 까지 입니다."); diff --git a/src/main/java/lotto/domain/vending/BuyingPrice.java b/src/main/java/lotto/domain/vending/BuyingPrice.java index d67d533f..298d5460 100644 --- a/src/main/java/lotto/domain/vending/BuyingPrice.java +++ b/src/main/java/lotto/domain/vending/BuyingPrice.java @@ -2,9 +2,9 @@ import java.util.Objects; -public class BuyingPrice { - public static final int TICKET_PRICE = 1000; +import static lotto.domain.vending.TicketAmount.TICKET_PRICE; +public class BuyingPrice { private final int buyingPrice; public BuyingPrice(final int buyingPrice) { @@ -23,18 +23,18 @@ private void validate(int buyingPrice) { private void validateMinimum(int buyingPrice) { if (buyingPrice < TICKET_PRICE) { - throw new IllegalArgumentException("구입 금액은 "+ TICKET_PRICE +"원 이상이여야 합니다."); + throw new IllegalArgumentException("구입 금액은 " + TICKET_PRICE + "원 이상이여야 합니다."); } } private void validateDivisible(int buyingPrice) { if ((buyingPrice % TICKET_PRICE) != 0) { - throw new IllegalArgumentException("구입 금액은 "+ TICKET_PRICE +"원 단위여야 합니다."); + throw new IllegalArgumentException("구입 금액은 " + TICKET_PRICE + "원 단위여야 합니다."); } } - public int ticketAmount() { - return buyingPrice / TICKET_PRICE; + public int value() { + return buyingPrice; } @Override diff --git a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java index 21fce995..39cc37de 100644 --- a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java @@ -1,6 +1,7 @@ package lotto.domain.vending; import lotto.domain.lotto.LottoGenerator; +import lotto.domain.lotto.LottoNumber; import lotto.domain.lotto.LottoTicket; import java.util.List; @@ -17,4 +18,11 @@ public List autoIssueTickets(TicketAmount ticketAmount) { .map(LottoTicket::new) .collect(Collectors.toList()); } + + public List manualIssueTickets(List manualNumbers) { + return IntStream.range(0, manualNumbers.size()) + .mapToObj(i -> manualNumbers) + .map(LottoTicket::new) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/lotto/domain/vending/TicketAmount.java b/src/main/java/lotto/domain/vending/TicketAmount.java index 34ad59b6..6dd9eff1 100644 --- a/src/main/java/lotto/domain/vending/TicketAmount.java +++ b/src/main/java/lotto/domain/vending/TicketAmount.java @@ -7,10 +7,17 @@ public class TicketAmount { private final int autoCount; public TicketAmount(BuyingPrice buyingPrice, int manualCount) { + validation(buyingPrice, manualCount); this.manualCount = manualCount; this.autoCount = (buyingPrice.value() / TICKET_PRICE) - manualCount; } + private void validation(BuyingPrice buyingPrice, int manualCount) { + if ((buyingPrice.value() / TICKET_PRICE) < manualCount) { + throw new IllegalArgumentException("수동 구매 티켓이 전체 티켓 보다 많습니다."); + } + } + public TicketAmount(BuyingPrice buyingPrice, String manualCount) { this(buyingPrice, Integer.parseInt(manualCount)); } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 82666695..c0a03eee 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,5 +1,8 @@ package lotto.view; +import lotto.domain.vending.TicketAmount; + +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -27,9 +30,13 @@ public static String getManualCount() { return scanner.nextLine().trim(); } - public static String getManualNumber() { + public static List getManualNumbers(TicketAmount ticketAmount) { System.out.println(MANUAL_NUMBER_MESSAGE); - return scanner.nextLine().trim(); + List manualNumbers = new ArrayList<>(); + for (int i = 0; i < ticketAmount.manual(); i++) { + manualNumbers.add(scanner.nextLine().trim()); + } + return manualNumbers; } public static String getWinningNumber() { diff --git a/src/test/java/lotto/domain/vending/TicketAmountTest.java b/src/test/java/lotto/domain/vending/TicketAmountTest.java index 95a0fa66..5cc59ce3 100644 --- a/src/test/java/lotto/domain/vending/TicketAmountTest.java +++ b/src/test/java/lotto/domain/vending/TicketAmountTest.java @@ -1,10 +1,12 @@ package lotto.domain.vending; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TicketAmountTest { @@ -22,4 +24,16 @@ void ticket_amount(int price, int manualCount, int exceptedAutoCount) { assertThat(ticketAmount.manual()).isEqualTo(manualCount); assertThat(ticketAmount.auto()).isEqualTo(exceptedAutoCount); } + + @Test + @DisplayName("전체 티켓 장수 보다 수동 구매 장수가 많은 경우 예외가 발생한다") + void manual_ticket_amount_more_than_total_amount() { + //given + BuyingPrice buyingPrice = new BuyingPrice(5000); + int manualTicketCount = 10; + + //when //then + assertThatThrownBy(() -> new TicketAmount(buyingPrice, manualTicketCount)) + .isInstanceOf(IllegalArgumentException.class); + } } From 0f9d2a0a5c018411fa4c1eb4437efe19d15fc633 Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 14 Jul 2021 23:21:38 +0900 Subject: [PATCH 07/22] =?UTF-8?q?feat=20:=20=EB=A1=9C=EB=98=90=20=EC=88=98?= =?UTF-8?q?=EB=8F=99=20=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=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 --- README.md | 2 +- .../lotto/controller/LottoController.java | 18 ++++------ .../vending/LottoTicketVendingMachine.java | 9 +++-- .../LottoTicketVendingMachineTest.java | 36 ++++++++++++++++++- 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index fe286bca..558288a4 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ - [x] 6개의 로또 번호를 가진다. - [x] 로또 티켓 머신 - - [] 수동으로 로또 티켓을 생성한다. + - [x] 수동으로 로또 티켓을 생성한다. - [x] 자동으로 로또 티켓을 생성한다. *** diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index e786ee1c..3e0f3bc2 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,6 +1,5 @@ package lotto.controller; -import lotto.domain.lotto.LottoNumber; import lotto.domain.lotto.LottoTicket; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.LottoTicketVendingMachine; @@ -11,7 +10,6 @@ import lotto.view.InputView; import lotto.view.OutputView; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -28,21 +26,17 @@ public static void run() { String inputManualCount = InputView.getManualCount(); TicketAmount ticketAmount = new TicketAmount(buyingPrice, inputManualCount); - List manualNumbers = InputView.getManualNumbers(ticketAmount); - List manualLottoTickets = new ArrayList<>(); - for (String manualNumber : manualNumbers) { - List manualLottoNumbers = InputView.split(manualNumber).stream() - .map(LottoNumber::new) - .collect(Collectors.toList()); - manualLottoTickets.add(new LottoTicket(manualLottoNumbers)); - } + List inputManualNumbers = InputView.getManualNumbers(ticketAmount); + List manualLottoTickets = inputManualNumbers.stream() + .map(InputView::split) + .map(lottoTicketVendingMachine::manualIssueTicket) + .collect(Collectors.toList()); List autoLottoTickets = lottoTicketVendingMachine.autoIssueTickets(ticketAmount); - OutputView.printTicketAmount(ticketAmount); - List lottoTickets = Stream.concat(manualLottoTickets.stream(), autoLottoTickets.stream()) .collect(Collectors.toList()); + OutputView.printTicketAmount(ticketAmount); String inputWinningNumbers = InputView.getWinningNumber(); List splitWinningNumbers = InputView.split(inputWinningNumbers) .stream() diff --git a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java index 39cc37de..ba575639 100644 --- a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java @@ -19,10 +19,9 @@ public List autoIssueTickets(TicketAmount ticketAmount) { .collect(Collectors.toList()); } - public List manualIssueTickets(List manualNumbers) { - return IntStream.range(0, manualNumbers.size()) - .mapToObj(i -> manualNumbers) - .map(LottoTicket::new) - .collect(Collectors.toList()); + public LottoTicket manualIssueTicket(List manualLottoNumbers) { + return new LottoTicket(manualLottoNumbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList())); } } diff --git a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java index d919da74..52762189 100644 --- a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java +++ b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java @@ -1,10 +1,15 @@ package lotto.domain.vending; import lotto.domain.lotto.LottoTicket; +import lotto.view.InputView; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; @@ -12,7 +17,7 @@ public class LottoTicketVendingMachineTest { @Test @DisplayName("자동으로 로또 티켓을 생성한다") - void issue_tickets_from_buying_price() { + void auto_issue_tickets() { //given BuyingPrice buyingPrice = new BuyingPrice(5000); TicketAmount ticketAmount = new TicketAmount(buyingPrice, 0); @@ -25,4 +30,33 @@ void issue_tickets_from_buying_price() { assertThat(tickets).hasSize(5); } + @ParameterizedTest + @ValueSource(ints = {0, 1, 2}) + @DisplayName("수동으로 로또 티켓을 생성한다") + void manual_issue_tickets(int index) { + //given + BuyingPrice buyingPrice = new BuyingPrice(5000); + int manualCount = 3; + LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); + List manualNumbers = generateManualNumbers(manualCount); + + //when + List lottoTickets = manualNumbers.stream() + .map(InputView::split) + .map(lottoTicketVendingMachine::manualIssueTicket) + .collect(Collectors.toList()); + + //then + assertThat(lottoTickets.get(index).lottoNumbers()).isEqualTo(generateLottoTicket(index).lottoNumbers()); + } + + private List generateManualNumbers(int manualCount) { + return IntStream.range(0, manualCount) + .mapToObj(i -> String.format("%d, %d, %d, %d, %d, %d", i + 1, i + 2, i + 3, i + 4, i + 5, i + 6)) + .collect(Collectors.toList()); + } + + private LottoTicket generateLottoTicket(int i) { + return new LottoTicket(i + 1, i + 2, i + 3, i + 4, i + 5, i + 6); + } } From 7f7ae6c0b3fa5e9dfc63b813bb43c4f5e90dc710 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 15 Jul 2021 00:23:02 +0900 Subject: [PATCH 08/22] =?UTF-8?q?feat=20:=20=EC=A0=84=EC=B2=B4=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=ED=8B=B0=EC=BC=93=20=EC=83=9D=EC=84=B1=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EA=B4=80=EB=A0=A8=20=EC=86=8C=EC=8A=A4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++-- .../lotto/controller/LottoController.java | 15 +++------- .../java/lotto/domain/lotto/LottoTickets.java | 28 +++++++++++++++++++ .../java/lotto/domain/util/StringUtil.java | 15 ++++++++++ .../vending/LottoTicketVendingMachine.java | 23 +++++++++++++-- .../lotto/domain/vending/TicketAmount.java | 2 +- .../domain/winning/WinningStatistics.java | 5 ++-- src/main/java/lotto/view/InputView.java | 9 ------ .../LottoTicketVendingMachineTest.java | 24 ++++++++++++---- .../domain/winning/WinningStatisticsTest.java | 21 +++++++------- 10 files changed, 103 insertions(+), 45 deletions(-) create mode 100644 src/main/java/lotto/domain/lotto/LottoTickets.java create mode 100644 src/main/java/lotto/domain/util/StringUtil.java diff --git a/README.md b/README.md index 558288a4..b658b7c8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ - [x] 보너스 볼을 입력한다. - [x] 출력 - - [] 구입 금액에 따라 수동 구매 장수와 자동 구매 장수를 출력한다. + - [x] 구입 금액에 따라 수동 구매 장수와 자동 구매 장수를 출력한다. - [x] 구매 금액에 따른 각 로또 티켓의 번호를 출력한다. - [x] 당첨 번호와 일치하는 로또 티켓 개수를 출력한다. - [x] 총 수익률을 출력한다. @@ -23,9 +23,6 @@ - [x] 티켓 장수 - [x] 구입 금액을 1000원 단위로 나누어 로또 티켓 장수를 반환한다. - [x] ERROR : 전체 티켓 장수 보다 수동 구매 장수가 많은 경우 예외가 발생한다. - -- [] 로또 게임 - - [] 전체 로또 티켓을 생성한다. *** @@ -42,6 +39,7 @@ - [x] 로또 티켓 머신 - [x] 수동으로 로또 티켓을 생성한다. - [x] 자동으로 로또 티켓을 생성한다. + - [x] 전체 로또 티켓을 생성한다. *** diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 3e0f3bc2..7b1e70d9 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,6 +1,7 @@ package lotto.controller; -import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; +import lotto.domain.util.StringUtil; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.LottoTicketVendingMachine; import lotto.domain.vending.TicketAmount; @@ -13,7 +14,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import java.util.stream.Stream; public class LottoController { @@ -27,18 +27,11 @@ public static void run() { TicketAmount ticketAmount = new TicketAmount(buyingPrice, inputManualCount); List inputManualNumbers = InputView.getManualNumbers(ticketAmount); - List manualLottoTickets = inputManualNumbers.stream() - .map(InputView::split) - .map(lottoTicketVendingMachine::manualIssueTicket) - .collect(Collectors.toList()); - - List autoLottoTickets = lottoTicketVendingMachine.autoIssueTickets(ticketAmount); - List lottoTickets = Stream.concat(manualLottoTickets.stream(), autoLottoTickets.stream()) - .collect(Collectors.toList()); + LottoTickets lottoTickets = lottoTicketVendingMachine.issueTickets(ticketAmount, inputManualNumbers); OutputView.printTicketAmount(ticketAmount); String inputWinningNumbers = InputView.getWinningNumber(); - List splitWinningNumbers = InputView.split(inputWinningNumbers) + List splitWinningNumbers = StringUtil.split(inputWinningNumbers) .stream() .map(Integer::parseInt) .collect(Collectors.toList()); diff --git a/src/main/java/lotto/domain/lotto/LottoTickets.java b/src/main/java/lotto/domain/lotto/LottoTickets.java new file mode 100644 index 00000000..90312d35 --- /dev/null +++ b/src/main/java/lotto/domain/lotto/LottoTickets.java @@ -0,0 +1,28 @@ +package lotto.domain.lotto; + +import java.util.ArrayList; +import java.util.List; + +public class LottoTickets { + private List lottoTickets; + + public LottoTickets() { + this.lottoTickets = new ArrayList<>(); + } + + public LottoTickets(List lottoTickets) { + this.lottoTickets = new ArrayList<>(lottoTickets); + } + + public void add(List lottoTickets) { + this.lottoTickets.addAll(lottoTickets); + } + + public int size() { + return lottoTickets.size(); + } + + public List values() { + return lottoTickets; + } +} diff --git a/src/main/java/lotto/domain/util/StringUtil.java b/src/main/java/lotto/domain/util/StringUtil.java new file mode 100644 index 00000000..d1d15248 --- /dev/null +++ b/src/main/java/lotto/domain/util/StringUtil.java @@ -0,0 +1,15 @@ +package lotto.domain.util; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class StringUtil { + private static final String DELIMITER = ","; + + public static List split(String input) { + return Arrays.stream(input.split(DELIMITER)) + .map(String::trim) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java index ba575639..2e2fbd14 100644 --- a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java @@ -3,6 +3,8 @@ import lotto.domain.lotto.LottoGenerator; import lotto.domain.lotto.LottoNumber; import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; +import lotto.domain.util.StringUtil; import java.util.List; import java.util.stream.Collectors; @@ -19,9 +21,24 @@ public List autoIssueTickets(TicketAmount ticketAmount) { .collect(Collectors.toList()); } - public LottoTicket manualIssueTicket(List manualLottoNumbers) { - return new LottoTicket(manualLottoNumbers.stream() + public List manualIssueTickets(List inputNumbers) { + return inputNumbers.stream() + .map(StringUtil::split) + .map(manualNumbers -> manualLottoTicket(manualNumbers)) + .collect(Collectors.toList()); + } + + private LottoTicket manualLottoTicket(List manualNumbers) { + List lottoNumbers = manualNumbers.stream() .map(LottoNumber::new) - .collect(Collectors.toList())); + .collect(Collectors.toList()); + return new LottoTicket(lottoNumbers); + } + + public LottoTickets issueTickets(TicketAmount ticketAmount, List inputManualNumbers) { + LottoTickets lottoTickets = new LottoTickets(); + lottoTickets.add(manualIssueTickets(inputManualNumbers)); + lottoTickets.add(autoIssueTickets(ticketAmount)); + return lottoTickets; } } diff --git a/src/main/java/lotto/domain/vending/TicketAmount.java b/src/main/java/lotto/domain/vending/TicketAmount.java index 6dd9eff1..839ae0fd 100644 --- a/src/main/java/lotto/domain/vending/TicketAmount.java +++ b/src/main/java/lotto/domain/vending/TicketAmount.java @@ -30,7 +30,7 @@ public int auto() { return autoCount; } - public float total() { + public int total() { return manualCount + autoCount; } } diff --git a/src/main/java/lotto/domain/winning/WinningStatistics.java b/src/main/java/lotto/domain/winning/WinningStatistics.java index 4e3bc62a..15204a75 100644 --- a/src/main/java/lotto/domain/winning/WinningStatistics.java +++ b/src/main/java/lotto/domain/winning/WinningStatistics.java @@ -1,6 +1,7 @@ package lotto.domain.winning; import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; import lotto.domain.vending.TicketAmount; import java.util.*; @@ -33,8 +34,8 @@ public int hitBonus(LottoTicket lottoTicket) { return lottoTicket.contains(winningNumbers.getBonusNumber()) ? 1 : 0; } - public Map groupByHitCount(List lottoTickets) { - lottoTickets.stream() + public Map groupByHitCount(LottoTickets lottoTickets) { + lottoTickets.values().stream() .filter(lottoTicket -> hitCount(lottoTicket) >= LottoRank.FIFTH.getHitCount()) .forEach(lottoTicket -> { LottoRank key = LottoRank.findBy(hitCount(lottoTicket), hitBonus(lottoTicket)); diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index c0a03eee..b775886b 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -3,10 +3,8 @@ import lotto.domain.vending.TicketAmount; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Scanner; -import java.util.stream.Collectors; public class InputView { private static final Scanner scanner = new Scanner(System.in); @@ -15,7 +13,6 @@ public class InputView { public static final String MANUAL_NUMBER_MESSAGE = "수동으로 구매할 번호를 입력해 주세요."; private static final String WINNING_NUMBER_MESSAGE = "지난 주 당첨 번호를 입력해 주세요."; private static final String BONUS_NUMBER_MESSAGE = "보너스 볼을 입력해 주세요."; - private static final String DELIMITER = ","; private InputView() { } @@ -48,10 +45,4 @@ public static String getBonusNumber() { System.out.println(BONUS_NUMBER_MESSAGE); return scanner.nextLine().trim(); } - - public static List split(String input) { - return Arrays.stream(input.split(DELIMITER)) - .map(String::trim) - .collect(Collectors.toList()); - } } diff --git a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java index 52762189..62d02b37 100644 --- a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java +++ b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java @@ -1,7 +1,7 @@ package lotto.domain.vending; import lotto.domain.lotto.LottoTicket; -import lotto.view.InputView; +import lotto.domain.lotto.LottoTickets; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -41,15 +41,29 @@ void manual_issue_tickets(int index) { List manualNumbers = generateManualNumbers(manualCount); //when - List lottoTickets = manualNumbers.stream() - .map(InputView::split) - .map(lottoTicketVendingMachine::manualIssueTicket) - .collect(Collectors.toList()); + List lottoTickets = lottoTicketVendingMachine.manualIssueTickets(manualNumbers); //then assertThat(lottoTickets.get(index).lottoNumbers()).isEqualTo(generateLottoTicket(index).lottoNumbers()); } + @Test + @DisplayName("전체 로또 티켓을 생성한다") + void total_lotto_tickets() { + //given + BuyingPrice buyingPrice = new BuyingPrice(8000); + int manualCount = 3; + TicketAmount ticketAmount = new TicketAmount(buyingPrice, manualCount); + List manualNumbers = generateManualNumbers(ticketAmount.manual()); + + //when + LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); + LottoTickets lottoTickets = lottoTicketVendingMachine.issueTickets(ticketAmount, manualNumbers); + + //then + assertThat(lottoTickets.size()).isEqualTo(ticketAmount.total()); + } + private List generateManualNumbers(int manualCount) { return IntStream.range(0, manualCount) .mapToObj(i -> String.format("%d, %d, %d, %d, %d, %d", i + 1, i + 2, i + 3, i + 4, i + 5, i + 6)) diff --git a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java index 81a5ceae..235e67d0 100644 --- a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java +++ b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java @@ -1,6 +1,7 @@ package lotto.domain.winning; import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.TicketAmount; import org.junit.jupiter.api.DisplayName; @@ -75,7 +76,7 @@ private static Stream generateLottoTicket() { void group_by_matched_count() { //given WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - List lottoTickets = generateLottoTickets(); + LottoTickets lottoTickets = generateLottoTickets(); //when Map ranks = winningStatistics.groupByHitCount(lottoTickets); @@ -91,7 +92,7 @@ void group_by_matched_count() { @DisplayName("당첨 순위의 수익률을 계산한다") void profit_rate() { //given - List lottoTickets = generateLottoTickets(); + LottoTickets lottoTickets = generateLottoTickets(); BuyingPrice buyingPrice = new BuyingPrice(lottoTickets.size() * TICKET_PRICE); TicketAmount ticketAmount = new TicketAmount(buyingPrice, lottoTickets.size()); @@ -105,13 +106,13 @@ void profit_rate() { assertThat(profit).isEqualTo(11.0f); } - private List generateLottoTickets() { - List lottoTicketList = new ArrayList<>(); - lottoTicketList.add(new LottoTicket(3, 4, 5, 6, 7, 8)); // 4개 일치 - lottoTicketList.add(new LottoTicket(4, 5, 6, 7, 8, 9)); // 3개 일치 - lottoTicketList.add(new LottoTicket(5, 6, 7, 8, 9, 10)); // 2개 일치 - lottoTicketList.add(new LottoTicket(6, 7, 8, 9, 10, 11)); // 1개 일치 - lottoTicketList.add(new LottoTicket(7, 8, 9, 10, 11, 12)); // 0개 일치 - return lottoTicketList; + private LottoTickets generateLottoTickets() { + List lottoTickets = new ArrayList<>(); + lottoTickets.add(new LottoTicket(3, 4, 5, 6, 7, 8)); // 4개 일치 + lottoTickets.add(new LottoTicket(4, 5, 6, 7, 8, 9)); // 3개 일치 + lottoTickets.add(new LottoTicket(5, 6, 7, 8, 9, 10)); // 2개 일치 + lottoTickets.add(new LottoTicket(6, 7, 8, 9, 10, 11)); // 1개 일치 + lottoTickets.add(new LottoTicket(7, 8, 9, 10, 11, 12)); // 0개 일치 + return new LottoTickets(lottoTickets); } } From 4f4b103623fdaa5c060006269604adb6ec5b6c52 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 15 Jul 2021 02:16:25 +0900 Subject: [PATCH 09/22] =?UTF-8?q?refactor=20:=20OutputView=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 | 1 + src/main/java/lotto/controller/LottoController.java | 8 +++----- src/main/java/lotto/domain/util/StringUtil.java | 6 ++++++ src/main/java/lotto/view/OutputView.java | 5 +++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b658b7c8..4dc3e0b1 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ - [x] 6개의 로또 번호를 반환한다. - [x] 로또 번호 + - [x] 로또 번호는 1 ~ 45 까지의 숫자만 가능하다. - [x] ERROR : 1 ~ 45가 아닐 경우 예외가 발생한다. - [x] 로또 티켓 diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 7b1e70d9..6f740105 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Map; -import java.util.stream.Collectors; public class LottoController { @@ -30,11 +29,10 @@ public static void run() { LottoTickets lottoTickets = lottoTicketVendingMachine.issueTickets(ticketAmount, inputManualNumbers); OutputView.printTicketAmount(ticketAmount); + OutputView.printLottoTickets(lottoTickets); + String inputWinningNumbers = InputView.getWinningNumber(); - List splitWinningNumbers = StringUtil.split(inputWinningNumbers) - .stream() - .map(Integer::parseInt) - .collect(Collectors.toList()); + List splitWinningNumbers = StringUtil.splitParseInt(inputWinningNumbers); int bonusNumber = Integer.parseInt(InputView.getBonusNumber()); WinningNumbers winningNumbers = new WinningNumbers(splitWinningNumbers, bonusNumber); diff --git a/src/main/java/lotto/domain/util/StringUtil.java b/src/main/java/lotto/domain/util/StringUtil.java index d1d15248..73b73b76 100644 --- a/src/main/java/lotto/domain/util/StringUtil.java +++ b/src/main/java/lotto/domain/util/StringUtil.java @@ -12,4 +12,10 @@ public static List split(String input) { .map(String::trim) .collect(Collectors.toList()); } + + public static List splitParseInt(String input) { + return split(input).stream() + .map(Integer::parseInt) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 998a39d6..82474fd0 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,6 +1,7 @@ package lotto.view; import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; import lotto.domain.vending.TicketAmount; import lotto.domain.winning.LottoRank; @@ -12,8 +13,8 @@ public class OutputView { private OutputView() { } - public static void printLottoTickets(List lottoTickets) { - for (LottoTicket lottoTicket : lottoTickets) { + public static void printLottoTickets(LottoTickets lottoTickets) { + for (LottoTicket lottoTicket : lottoTickets.values()) { List lottoNumbers = lottoNumberToString(lottoTicket); System.out.println("[" + String.join(",", lottoNumbers) + "]"); } From 1fe76e0ed4f435c10381f4fb9bf0bd36c238af99 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 15 Jul 2021 14:16:33 +0900 Subject: [PATCH 10/22] =?UTF-8?q?feat=20:=20=EB=A1=9C=EB=98=90=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EA=B0=80=20=EC=A4=91=EB=B3=B5=EB=90=A0=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EC=98=88=EC=99=B8=20=EB=B0=9C=EC=83=9D=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../java/lotto/controller/LottoController.java | 4 ++-- .../java/lotto/domain/lotto/LottoTicket.java | 16 ++++++++++++---- .../java/lotto/domain/lotto/LottoTicketTest.java | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4dc3e0b1..8db6cb1b 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ - [x] 로또 티켓 - [x] 6개의 로또 번호를 가진다. + - [x] ERROR : 로또 번호가 중복될 경우 예외가 발생한다. - [x] 로또 티켓 머신 - [x] 수동으로 로또 티켓을 생성한다. diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 6f740105..4e7ae335 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,11 +1,11 @@ package lotto.controller; +import lotto.domain.lotto.LottoRank; import lotto.domain.lotto.LottoTickets; import lotto.domain.util.StringUtil; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.LottoTicketVendingMachine; import lotto.domain.vending.TicketAmount; -import lotto.domain.winning.LottoRank; import lotto.domain.winning.WinningNumbers; import lotto.domain.winning.WinningStatistics; import lotto.view.InputView; @@ -16,7 +16,7 @@ public class LottoController { - private static LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); + private static final LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); public static void run() { String inputPrice = InputView.getBuyingPrice(); diff --git a/src/main/java/lotto/domain/lotto/LottoTicket.java b/src/main/java/lotto/domain/lotto/LottoTicket.java index aba8bfbb..9391d213 100644 --- a/src/main/java/lotto/domain/lotto/LottoTicket.java +++ b/src/main/java/lotto/domain/lotto/LottoTicket.java @@ -1,18 +1,26 @@ package lotto.domain.lotto; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; public class LottoTicket { + public static final int LOTTO_NUMBER_SIZE = 6; + private final List lottoNumbers; public LottoTicket(final List lottoNumbers) { + validateDuplication(lottoNumbers); this.lottoNumbers = new ArrayList<>(lottoNumbers); } + private void validateDuplication(List lottoNumbers) { + Set lottoNumberSet = new HashSet<>(lottoNumbers); + + if (lottoNumberSet.size() < LOTTO_NUMBER_SIZE) { + throw new IllegalArgumentException("로또 번호가 중복됩니다."); + } + } + public LottoTicket(int... lottoNumbers) { this(Arrays.stream(lottoNumbers) .mapToObj(LottoNumber::new) diff --git a/src/test/java/lotto/domain/lotto/LottoTicketTest.java b/src/test/java/lotto/domain/lotto/LottoTicketTest.java index 2e7450bf..75c357a4 100644 --- a/src/test/java/lotto/domain/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/domain/lotto/LottoTicketTest.java @@ -4,8 +4,11 @@ import org.junit.jupiter.api.Test; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LottoTicketTest { @@ -22,4 +25,17 @@ void create() { //then assertThat(lottoTicket.lottoNumbers()).hasSize(6); } + + @Test + @DisplayName("로또 번호가 중복될 경우 예외가 발생한다") + void duplicate_lotto_numbers() { + //given + List lottoNumbers = Stream.of(1, 1, 2, 3, 4, 5) + .map(LottoNumber::new) + .collect(Collectors.toList()); + + //when //then + assertThatThrownBy(() -> new LottoTicket(lottoNumbers)) + .isInstanceOf(IllegalArgumentException.class); + } } From 6983ea508f73897d8718a14c93fea3a68875dc38 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 15 Jul 2021 16:44:29 +0900 Subject: [PATCH 11/22] =?UTF-8?q?feat=20:=20=EB=8B=B9=EC=B2=A8=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84,=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EC=88=98=EC=A0=95,=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 31 +++--- .../lotto/controller/LottoController.java | 12 +-- .../domain/{winning => lotto}/LottoRank.java | 10 +- .../java/lotto/domain/lotto/LottoTickets.java | 7 +- .../domain/winning/WinningLottoRank.java | 52 ++++++++++ .../lotto/domain/winning/WinningNumbers.java | 15 --- .../domain/winning/WinningStatistics.java | 51 ++-------- src/main/java/lotto/view/OutputView.java | 18 ++-- .../{winning => lotto}/LottoRankTest.java | 4 +- .../lotto/domain/vending/BuyingPriceTest.java | 2 +- .../domain/winning/WinningLottoRankTest.java | 98 +++++++++++++++++++ .../domain/winning/WinningNumbersTest.java | 27 +---- .../domain/winning/WinningStatisticsTest.java | 77 +-------------- 13 files changed, 212 insertions(+), 192 deletions(-) rename src/main/java/lotto/domain/{winning => lotto}/LottoRank.java (82%) create mode 100644 src/main/java/lotto/domain/winning/WinningLottoRank.java rename src/test/java/lotto/domain/{winning => lotto}/LottoRankTest.java (87%) create mode 100644 src/test/java/lotto/domain/winning/WinningLottoRankTest.java diff --git a/README.md b/README.md index 8db6cb1b..fa3924c3 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,14 @@ - [x] ERROR : 1000원 단위가 아닐 경우 예외가 발생한다. - [x] 티켓 장수 - - [x] 구입 금액을 1000원 단위로 나누어 로또 티켓 장수를 반환한다. + - [x] 구입 금액과 수동 로또 티켓 개수를 인자로 받아 로또 티켓 장수를 반환한다. - [x] ERROR : 전체 티켓 장수 보다 수동 구매 장수가 많은 경우 예외가 발생한다. + + +- [x] 로또 티켓 머신 + - [x] 수동으로 로또 티켓을 생성한다. + - [x] 자동으로 로또 티켓을 생성한다. + - [x] 전체 로또 티켓을 생성한다. *** @@ -31,17 +37,15 @@ - [x] 6개의 로또 번호를 반환한다. - [x] 로또 번호 - - [x] 로또 번호는 1 ~ 45 까지의 숫자만 가능하다. + - [x] 로또 번호는 1 ~ 45 사이의 값으로 로또 번호를 생성한다. - [x] ERROR : 1 ~ 45가 아닐 경우 예외가 발생한다. - [x] 로또 티켓 - [x] 6개의 로또 번호를 가진다. - [x] ERROR : 로또 번호가 중복될 경우 예외가 발생한다. - -- [x] 로또 티켓 머신 - - [x] 수동으로 로또 티켓을 생성한다. - - [x] 자동으로 로또 티켓을 생성한다. - - [x] 전체 로또 티켓을 생성한다. + +- [x] 로또 순위 + - [x] 로또 티켓의 당첨 수에 따른 순위를 반환한다. *** @@ -49,14 +53,11 @@ - [x] ERROR: 중복되는 로또 번호가 있을 경우 예외가 발생한다. - [x] 당첨 번호와 중복되지 않는 1 ~ 45 중 하나는 보너스 볼이다. - [x] 당첨 번호와 일치하는 로또 번호 개수를 반환한다. - -- [] 당첨 결과 - - [] 당첨 번호와 일치하는 갯수를 반환한다. - - [] 보너스 번호 일치 여부를 반환하다. - -- [x] 로또 당첨 순위 - - [x] 로또 티켓의 당첨 갯수에 따른 순위를 반환한다. -- [x] 로또 통계 +- [x] 당첨 결과 + - [x] 당첨 번호와 일치하는 로또 번호 개수를 반환한다. + - [x] 보너스 번호 일치하는 로또 번호 개수를 반환한다. - [x] 당첨 번호 개수가 같은 로또 티켓 개수를 반환한다. + +- [x] 당첨 통계 - [x] 당첨 순위의 수익률을 계산한다. diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 4e7ae335..a8735dab 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,18 +1,17 @@ package lotto.controller; -import lotto.domain.lotto.LottoRank; import lotto.domain.lotto.LottoTickets; import lotto.domain.util.StringUtil; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.LottoTicketVendingMachine; import lotto.domain.vending.TicketAmount; +import lotto.domain.winning.WinningLottoRank; import lotto.domain.winning.WinningNumbers; import lotto.domain.winning.WinningStatistics; import lotto.view.InputView; import lotto.view.OutputView; import java.util.List; -import java.util.Map; public class LottoController { @@ -36,12 +35,11 @@ public static void run() { int bonusNumber = Integer.parseInt(InputView.getBonusNumber()); WinningNumbers winningNumbers = new WinningNumbers(splitWinningNumbers, bonusNumber); - WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + OutputView.printWinningStatistics(winningLottoRank); - Map ranks = winningStatistics.groupByHitCount(lottoTickets); - OutputView.printWinningStatistics(ranks); - - float profitRate = winningStatistics.profitRate(ticketAmount, ranks); + WinningStatistics winningStatistics = new WinningStatistics(winningLottoRank); + float profitRate = winningStatistics.profitRate(ticketAmount); OutputView.printProfitRate(profitRate); } } diff --git a/src/main/java/lotto/domain/winning/LottoRank.java b/src/main/java/lotto/domain/lotto/LottoRank.java similarity index 82% rename from src/main/java/lotto/domain/winning/LottoRank.java rename to src/main/java/lotto/domain/lotto/LottoRank.java index 4bb44d80..ff55595d 100644 --- a/src/main/java/lotto/domain/winning/LottoRank.java +++ b/src/main/java/lotto/domain/lotto/LottoRank.java @@ -1,4 +1,4 @@ -package lotto.domain.winning; +package lotto.domain.lotto; import java.util.Arrays; @@ -21,21 +21,21 @@ public enum LottoRank { } public static LottoRank findBy(int hitCount, int hitBonus) { - return Arrays.asList(values()).stream() + return Arrays.stream(values()) .filter(rank -> (rank.hitCount == hitCount) && (rank.hitBonus == hitBonus)) .findFirst() .orElse(LottoRank.LOSE); } - public int getHitCount() { + public int hitCount() { return hitCount; } - public int getHitBonus() { + public int hitBonus() { return hitBonus; } - public int getPrizeMoney() { + public int prizeMoney() { return prizeMoney; } } diff --git a/src/main/java/lotto/domain/lotto/LottoTickets.java b/src/main/java/lotto/domain/lotto/LottoTickets.java index 90312d35..354a00f7 100644 --- a/src/main/java/lotto/domain/lotto/LottoTickets.java +++ b/src/main/java/lotto/domain/lotto/LottoTickets.java @@ -1,10 +1,11 @@ package lotto.domain.lotto; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class LottoTickets { - private List lottoTickets; + private final List lottoTickets; public LottoTickets() { this.lottoTickets = new ArrayList<>(); @@ -14,6 +15,10 @@ public LottoTickets(List lottoTickets) { this.lottoTickets = new ArrayList<>(lottoTickets); } + public LottoTickets(LottoTicket lottoTicket) { + this.lottoTickets = Collections.singletonList(lottoTicket); + } + public void add(List lottoTickets) { this.lottoTickets.addAll(lottoTickets); } diff --git a/src/main/java/lotto/domain/winning/WinningLottoRank.java b/src/main/java/lotto/domain/winning/WinningLottoRank.java new file mode 100644 index 00000000..d4911d98 --- /dev/null +++ b/src/main/java/lotto/domain/winning/WinningLottoRank.java @@ -0,0 +1,52 @@ +package lotto.domain.winning; + +import lotto.domain.lotto.LottoRank; +import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.Map; + +public class WinningLottoRank { + private final WinningNumbers winningNumbers; + private final Map winningLottoRank; + + public WinningLottoRank(LottoTickets lottoTickets, WinningNumbers winningNumbers) { + this.winningNumbers = winningNumbers; + this.winningLottoRank = new LinkedHashMap<>(); + initRank(lottoTickets); + } + + private void initRank(LottoTickets lottoTickets) { + Arrays.stream(LottoRank.values()) + .sorted(Comparator.reverseOrder()) + .forEach(rank -> winningLottoRank.put(rank, 0)); + groupByWinningCount(lottoTickets); + } + + + public int hitCount(LottoTicket lottoTicket) { + return (int) winningNumbers.getWinningNumbers().stream() + .filter(winningNumber -> lottoTicket.contains(winningNumber)) + .count(); + } + + public int hitBonus(LottoTicket lottoTicket) { + return lottoTicket.contains(winningNumbers.getBonusNumber()) ? 1 : 0; + } + + public void groupByWinningCount(LottoTickets lottoTickets) { + lottoTickets.values().stream() + .filter(lottoTicket -> hitCount(lottoTicket) >= LottoRank.FIFTH.hitCount()) + .forEach(lottoTicket -> { + LottoRank key = LottoRank.findBy(hitCount(lottoTicket), hitBonus(lottoTicket)); + winningLottoRank.put(key, winningLottoRank.get(key) + 1); + }); + } + + public int count(LottoRank lottoRank) { + return winningLottoRank.get(lottoRank); + } +} diff --git a/src/main/java/lotto/domain/winning/WinningNumbers.java b/src/main/java/lotto/domain/winning/WinningNumbers.java index b96e352a..5505cd28 100644 --- a/src/main/java/lotto/domain/winning/WinningNumbers.java +++ b/src/main/java/lotto/domain/winning/WinningNumbers.java @@ -4,7 +4,6 @@ import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -42,18 +41,4 @@ public LottoNumber getBonusNumber() { return bonusNumber; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - WinningNumbers that = (WinningNumbers) o; - return Objects.equals(winningNumbers, that.winningNumbers) && - Objects.equals(bonusNumber, that.bonusNumber); - } - - @Override - public int hashCode() { - return Objects.hash(winningNumbers, bonusNumber); - } - } diff --git a/src/main/java/lotto/domain/winning/WinningStatistics.java b/src/main/java/lotto/domain/winning/WinningStatistics.java index 15204a75..1527a867 100644 --- a/src/main/java/lotto/domain/winning/WinningStatistics.java +++ b/src/main/java/lotto/domain/winning/WinningStatistics.java @@ -1,58 +1,27 @@ package lotto.domain.winning; -import lotto.domain.lotto.LottoTicket; -import lotto.domain.lotto.LottoTickets; +import lotto.domain.lotto.LottoRank; import lotto.domain.vending.TicketAmount; -import java.util.*; +import java.util.Arrays; import static lotto.domain.vending.TicketAmount.TICKET_PRICE; public class WinningStatistics { - private final WinningNumbers winningNumbers; - private final Map ranks = new LinkedHashMap<>(); + private final WinningLottoRank winningLottoRank; - public WinningStatistics(WinningNumbers winningNumbers) { - this.winningNumbers = winningNumbers; - initRank(); + public WinningStatistics(WinningLottoRank winningLottoRank) { + this.winningLottoRank = winningLottoRank; } - private void initRank() { - Arrays.stream(LottoRank.values()) - .sorted(Comparator.reverseOrder()) - .filter(v -> v.getHitCount() > LottoRank.LOSE.getHitCount()) - .forEach(rank -> ranks.put(rank, 0)); - } - - public int hitCount(LottoTicket lottoTicket) { - return (int) winningNumbers.getWinningNumbers().stream() - .filter(winningNumber -> lottoTicket.contains(winningNumber)) - .count(); - } - - public int hitBonus(LottoTicket lottoTicket) { - return lottoTicket.contains(winningNumbers.getBonusNumber()) ? 1 : 0; - } - - public Map groupByHitCount(LottoTickets lottoTickets) { - lottoTickets.values().stream() - .filter(lottoTicket -> hitCount(lottoTicket) >= LottoRank.FIFTH.getHitCount()) - .forEach(lottoTicket -> { - LottoRank key = LottoRank.findBy(hitCount(lottoTicket), hitBonus(lottoTicket)); - ranks.put(key, ranks.get(key) + 1); - }); - return ranks; - } - - public float profitRate(TicketAmount ticketAmount, Map ranks) { - int totalPrize = totalPrize(ranks); + public float profitRate(TicketAmount ticketAmount) { + int totalPrize = totalPrize(); return (float) totalPrize / (ticketAmount.total() * TICKET_PRICE); } - private int totalPrize(Map ranks) { - return ranks.keySet().stream() - .mapToInt(lottoRank -> lottoRank.getPrizeMoney() * ranks.get(lottoRank)) + private int totalPrize() { + return Arrays.stream(LottoRank.values()) + .mapToInt(rank -> rank.prizeMoney() * winningLottoRank.count(rank)) .sum(); } - } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 82474fd0..0ad87381 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,12 +1,12 @@ package lotto.view; +import lotto.domain.lotto.LottoRank; import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; import lotto.domain.vending.TicketAmount; -import lotto.domain.winning.LottoRank; +import lotto.domain.winning.WinningLottoRank; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; public class OutputView { @@ -34,16 +34,12 @@ public static void printProfitRate(float profitRate) { System.out.printf("총 수익률은 %.2f 입니다.%n", profitRate); } - public static void printWinningStatistics(Map ranks) { + public static void printWinningStatistics(WinningLottoRank winningLottoRank) { System.out.println("당첨 통계\n---------"); - for (LottoRank rank : ranks.keySet()) { - if ((rank.getHitCount() == 5) && (rank.getHitBonus() == 1)) { - System.out.printf("%d개 일치, 보너스 볼 일치 (%d원) - %d개%n", rank.getHitCount(), - rank.getPrizeMoney(), ranks.get(rank)); - continue; - } - System.out.printf("%d개 일치 (%d원) - %d개%n", rank.getHitCount(), - rank.getPrizeMoney(), ranks.get(rank)); + for (LottoRank rank : LottoRank.values()) { + String message = (rank == LottoRank.SECOND) ? "%d개 일치, 보너스 볼 일치 (%d원) - %d개%n" + : "%d개 일치 (%d원) - %d개%n"; + System.out.printf(message, rank.hitCount(), rank.prizeMoney(), winningLottoRank.count(rank)); } } } diff --git a/src/test/java/lotto/domain/winning/LottoRankTest.java b/src/test/java/lotto/domain/lotto/LottoRankTest.java similarity index 87% rename from src/test/java/lotto/domain/winning/LottoRankTest.java rename to src/test/java/lotto/domain/lotto/LottoRankTest.java index 0e511fae..cc76490d 100644 --- a/src/test/java/lotto/domain/winning/LottoRankTest.java +++ b/src/test/java/lotto/domain/lotto/LottoRankTest.java @@ -1,4 +1,4 @@ -package lotto.domain.winning; +package lotto.domain.lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; @@ -10,7 +10,7 @@ public class LottoRankTest { @ParameterizedTest @CsvSource(value = {"6, 0, FIRST", "5, 1, SECOND", "5, 0, THIRD", "4, 0, FOURTH", "3, 0, FIFTH"}) - @DisplayName("로또 티켓의 당첨 갯수에 따른 순위를 반환한다") + @DisplayName("로또 티의 당첨 갯수개에 따른 순위를 반환한다") void lotto_hit_count_rank(int hitCount, int hitBonus, String ranking) { //given diff --git a/src/test/java/lotto/domain/vending/BuyingPriceTest.java b/src/test/java/lotto/domain/vending/BuyingPriceTest.java index 6c51bcd2..b74dcdc6 100644 --- a/src/test/java/lotto/domain/vending/BuyingPriceTest.java +++ b/src/test/java/lotto/domain/vending/BuyingPriceTest.java @@ -30,7 +30,7 @@ void validate_minimum() { } @Test - @DisplayName("1000 단위가 아닐 경우 예외가 발생한다") + @DisplayName("1000원 단위가 아닐 경우 예외가 발생한다") void validate_factor() { //given int invalidPrice = 1001; diff --git a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java new file mode 100644 index 00000000..6b150f37 --- /dev/null +++ b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java @@ -0,0 +1,98 @@ +package lotto.domain.winning; + +import lotto.domain.lotto.LottoRank; +import lotto.domain.lotto.LottoTicket; +import lotto.domain.lotto.LottoTickets; +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.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +public class WinningLottoRankTest { + + private WinningNumbers generateWinningNumber(int bonusNumber) { + List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + return new WinningNumbers(inputNumbers, bonusNumber); + } + + @ParameterizedTest + @MethodSource("hitLottoNumbers") + @DisplayName("당첨 번호와 일치하는 로또 번호 개수를 반환한다") + void hit_winning_numbers_count(int[] numbers, int expectedCount) { + //given + LottoTicket lottoTicket = new LottoTicket(numbers); + LottoTickets lottoTickets = new LottoTickets(lottoTicket); + WinningNumbers winningNumbers = generateWinningNumber(45); + + //when + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + int hitCount = winningLottoRank.hitCount(lottoTicket); + + //then + assertThat(hitCount).isEqualTo(expectedCount); + } + + @Test + @DisplayName("보너스 번호 일치하는 로또 번호 개수를 반환한다") + void hit_bonus_number_count() { + //given + LottoTicket lottoTicket = new LottoTicket(5, 10, 15, 20, 25, 30); + LottoTickets lottoTickets = new LottoTickets(lottoTicket); + WinningNumbers winningNumbers = generateWinningNumber(30); + + //when + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + int hitBonus = winningLottoRank.hitBonus(lottoTicket); + + //then + assertThat(hitBonus).isEqualTo(1); + } + + @Test + @DisplayName("당첨 번호 개수가 같은 로또 티켓 개수를 반환한다") + void group_by_rank_count() { + //given + WinningNumbers winningNumbers = generateWinningNumber(45); + LottoTickets lottoTickets = generateLottoTickets(); + + //when + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + + //thenR + assertThat(winningLottoRank.count(LottoRank.FIFTH)).isEqualTo(1); + assertThat(winningLottoRank.count(LottoRank.FOURTH)).isEqualTo(1); + assertThat(winningLottoRank.count(LottoRank.THIRD)).isZero(); + assertThat(winningLottoRank.count(LottoRank.FIRST)).isZero(); + } + + private LottoTickets generateLottoTickets() { + List lottoTickets = new ArrayList<>(); + lottoTickets.add(new LottoTicket(3, 4, 5, 6, 7, 8)); // 4개 일치 + lottoTickets.add(new LottoTicket(4, 5, 6, 7, 8, 9)); // 3개 일치 + lottoTickets.add(new LottoTicket(5, 6, 7, 8, 9, 10)); // 2개 일치 + lottoTickets.add(new LottoTicket(6, 7, 8, 9, 10, 11)); // 1개 일치 + lottoTickets.add(new LottoTicket(7, 8, 9, 10, 11, 12)); // 0개 일치 + return new LottoTickets(lottoTickets); + } + + private static Stream hitLottoNumbers() { + return Stream.of( + Arguments.of(new int[]{1, 2, 3, 4, 5, 6}, 6), + Arguments.of(new int[]{1, 2, 3, 4, 5, 7}, 5), + Arguments.of(new int[]{1, 2, 3, 4, 7, 8}, 4), + Arguments.of(new int[]{1, 2, 3, 7, 8, 9}, 3), + Arguments.of(new int[]{1, 2, 7, 8, 9, 10}, 2), + Arguments.of(new int[]{1, 7, 8, 9, 10, 11}, 1), + Arguments.of(new int[]{8, 9, 10, 11, 12, 13}, 0) + ); + } +} diff --git a/src/test/java/lotto/domain/winning/WinningNumbersTest.java b/src/test/java/lotto/domain/winning/WinningNumbersTest.java index bcdc071a..66f705ed 100644 --- a/src/test/java/lotto/domain/winning/WinningNumbersTest.java +++ b/src/test/java/lotto/domain/winning/WinningNumbersTest.java @@ -6,24 +6,9 @@ import java.util.Arrays; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class WinningNumbersTest { - @Test - @DisplayName("6개의 로또 당첨 번호를 입력받아 당첨 번호 값 객체를 생성한다") - void create() { - //given - List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); - int bonusNumber = 7; - - //when - WinningNumbers winningNumbers = new WinningNumbers(inputNumbers, bonusNumber); - - //then - assertThat(winningNumbers).isEqualTo(new WinningNumbers(inputNumbers, bonusNumber)); - } - @Test @DisplayName("당첨 번호가 중복되는 경우 예외가 발생한다") void validate_duplication_winning_number() { @@ -32,9 +17,8 @@ void validate_duplication_winning_number() { int bonusNumber = 6; //when //then - assertThatIllegalArgumentException() - .isThrownBy(() -> new WinningNumbers(inputNumbers, bonusNumber)) - .withMessage("당첨 번호가 중복됩니다."); + assertThatThrownBy(() -> new WinningNumbers(inputNumbers, bonusNumber)) + .isInstanceOf(IllegalArgumentException.class); } @Test @@ -45,8 +29,7 @@ void validate_duplication_bonus_number() { int bonusNumber = 6; //when //then - assertThatIllegalArgumentException() - .isThrownBy(() -> new WinningNumbers(inputNumbers, bonusNumber)) - .withMessage("당첨 번호가 중복됩니다."); + assertThatThrownBy(() -> new WinningNumbers(inputNumbers, bonusNumber)) + .isInstanceOf(IllegalArgumentException.class); } } diff --git a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java index 235e67d0..200bd4cb 100644 --- a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java +++ b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java @@ -6,88 +6,20 @@ import lotto.domain.vending.TicketAmount; 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.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; -import java.util.stream.Stream; import static lotto.domain.vending.TicketAmount.TICKET_PRICE; import static org.assertj.core.api.Assertions.assertThat; public class WinningStatisticsTest { - private WinningNumbers winningNumbers = generateWinningNumber(); - - private WinningNumbers generateWinningNumber() { + private WinningNumbers generateWinningNumber(int bonusNumber) { List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); - int bonusNumber = 45; return new WinningNumbers(inputNumbers, bonusNumber); } - @ParameterizedTest - @MethodSource("generateLottoTicket") - @DisplayName("당첨 번호와 일치하는 로또 번호 개수를 반환한다") - void hit_winning_numbers_count(int[] numbers, int expectedCount) { - //given - LottoTicket lottoTicket = new LottoTicket(numbers); - WinningNumbers winningNumbers = new WinningNumbers(Arrays.asList(1, 2, 3, 4, 5, 6), 45); - - //when - WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - int hitCount = winningStatistics.hitCount(lottoTicket); - - //then - assertThat(hitCount).isEqualTo(expectedCount); - } - - @Test - @DisplayName("보너스 번호와 일치하는 로또 번호가 있는지 확인한다") - void hit_bonus_number_count() { - //given - LottoTicket lottoTicket = new LottoTicket(1, 2, 3, 4, 5, 6); - WinningNumbers winningNumbers = new WinningNumbers(Arrays.asList(4, 5, 6, 7, 8, 9), 1); - - //when - WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - int hitBonus = winningStatistics.hitBonus(lottoTicket); - - //then - assertThat(hitBonus).isEqualTo(1); - } - - private static Stream generateLottoTicket() { - return Stream.of( - Arguments.of(new int[]{1, 2, 3, 4, 5, 6}, 6), - Arguments.of(new int[]{1, 2, 3, 4, 5, 7}, 5), - Arguments.of(new int[]{1, 2, 3, 4, 7, 8}, 4), - Arguments.of(new int[]{1, 2, 3, 7, 8, 9}, 3), - Arguments.of(new int[]{1, 2, 7, 8, 9, 10}, 2), - Arguments.of(new int[]{1, 7, 8, 9, 10, 11}, 1), - Arguments.of(new int[]{8, 9, 10, 11, 12, 13}, 0) - ); - } - - @Test - @DisplayName("당첨 번호 개수가 같은 로또 티켓 개수를 반환한다") - void group_by_matched_count() { - //given - WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - LottoTickets lottoTickets = generateLottoTickets(); - - //when - Map ranks = winningStatistics.groupByHitCount(lottoTickets); - - //thenR - assertThat(ranks.get(LottoRank.FIFTH)).isEqualTo(1); - assertThat(ranks.get(LottoRank.FOURTH)).isEqualTo(1); - assertThat(ranks.get(LottoRank.THIRD)).isZero(); - assertThat(ranks.get(LottoRank.FIRST)).isZero(); - } - @Test @DisplayName("당첨 순위의 수익률을 계산한다") void profit_rate() { @@ -96,11 +28,12 @@ void profit_rate() { BuyingPrice buyingPrice = new BuyingPrice(lottoTickets.size() * TICKET_PRICE); TicketAmount ticketAmount = new TicketAmount(buyingPrice, lottoTickets.size()); - WinningStatistics winningStatistics = new WinningStatistics(winningNumbers); - Map ranks = winningStatistics.groupByHitCount(lottoTickets); + WinningNumbers winningNumbers = generateWinningNumber(45); + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); //when - float profit = winningStatistics.profitRate(ticketAmount, ranks); + WinningStatistics winningStatistics = new WinningStatistics(winningLottoRank); + float profit = winningStatistics.profitRate(ticketAmount); //then assertThat(profit).isEqualTo(11.0f); From 2094b2905a3ef3b3dbbd8fc52993f97157bdadda Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 15 Jul 2021 18:34:53 +0900 Subject: [PATCH 12/22] =?UTF-8?q?fix=20:=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=20=EC=9D=BC=EC=B9=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=8B=B9=EC=B2=A8=20=EC=88=9C?= =?UTF-8?q?=EC=9C=84=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=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/lotto/LottoRank.java | 28 ++++---- .../domain/winning/WinningLottoRank.java | 29 ++++---- .../domain/winning/WinningStatistics.java | 5 +- src/main/java/lotto/view/InputView.java | 13 ++-- src/main/java/lotto/view/OutputView.java | 2 +- .../lotto/domain/lotto/LottoRankTest.java | 4 +- .../domain/winning/WinningLottoRankTest.java | 71 +++++++++++++++---- 7 files changed, 99 insertions(+), 53 deletions(-) diff --git a/src/main/java/lotto/domain/lotto/LottoRank.java b/src/main/java/lotto/domain/lotto/LottoRank.java index ff55595d..9af4a353 100644 --- a/src/main/java/lotto/domain/lotto/LottoRank.java +++ b/src/main/java/lotto/domain/lotto/LottoRank.java @@ -3,26 +3,28 @@ import java.util.Arrays; public enum LottoRank { - FIRST(6, 0, 2_000_000_000), - SECOND(5, 1, 30_000_000), // 보너스볼 일치 - THIRD(5, 0, 1_500_000), - FOURTH(4, 0, 50_000), - FIFTH(3, 0, 5_000), - LOSE(0, 0, 0); + LOSE(0, 0), + FIFTH(3, 5_000), + FOURTH(4, 50_000), + THIRD(5, 1_500_000), + SECOND(5, 30_000_000), // 보너스볼 일치 + FIRST(6, 2_000_000_000); private final int hitCount; - private final int hitBonus; private final int prizeMoney; - LottoRank(int hitCount, int hitBonus, int prizeMoney) { + LottoRank(int hitCount, int prizeMoney) { this.hitCount = hitCount; - this.hitBonus = hitBonus; this.prizeMoney = prizeMoney; } - public static LottoRank findBy(int hitCount, int hitBonus) { + public static LottoRank findBy(int hitCount, boolean isBonus) { + if (hitCount == 5) { + return isBonus ? LottoRank.SECOND : LottoRank.THIRD; + } + return Arrays.stream(values()) - .filter(rank -> (rank.hitCount == hitCount) && (rank.hitBonus == hitBonus)) + .filter(rank -> rank.hitCount == hitCount) .findFirst() .orElse(LottoRank.LOSE); } @@ -31,10 +33,6 @@ public int hitCount() { return hitCount; } - public int hitBonus() { - return hitBonus; - } - public int prizeMoney() { return prizeMoney; } diff --git a/src/main/java/lotto/domain/winning/WinningLottoRank.java b/src/main/java/lotto/domain/winning/WinningLottoRank.java index d4911d98..878d4341 100644 --- a/src/main/java/lotto/domain/winning/WinningLottoRank.java +++ b/src/main/java/lotto/domain/winning/WinningLottoRank.java @@ -4,10 +4,7 @@ import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; -import java.util.Arrays; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; public class WinningLottoRank { private final WinningNumbers winningNumbers; @@ -21,11 +18,15 @@ public WinningLottoRank(LottoTickets lottoTickets, WinningNumbers winningNumbers private void initRank(LottoTickets lottoTickets) { Arrays.stream(LottoRank.values()) - .sorted(Comparator.reverseOrder()) .forEach(rank -> winningLottoRank.put(rank, 0)); groupByWinningCount(lottoTickets); } + private void groupByWinningCount(LottoTickets lottoTickets) { + lottoTickets.values().stream() + .forEach(lottoTicket -> addWinningCount(lottoTicket)); + winningLottoRank.remove(LottoRank.LOSE); + } public int hitCount(LottoTicket lottoTicket) { return (int) winningNumbers.getWinningNumbers().stream() @@ -33,20 +34,20 @@ public int hitCount(LottoTicket lottoTicket) { .count(); } - public int hitBonus(LottoTicket lottoTicket) { - return lottoTicket.contains(winningNumbers.getBonusNumber()) ? 1 : 0; + public boolean hitBonus(LottoTicket lottoTicket) { + return lottoTicket.contains(winningNumbers.getBonusNumber()); } - public void groupByWinningCount(LottoTickets lottoTickets) { - lottoTickets.values().stream() - .filter(lottoTicket -> hitCount(lottoTicket) >= LottoRank.FIFTH.hitCount()) - .forEach(lottoTicket -> { - LottoRank key = LottoRank.findBy(hitCount(lottoTicket), hitBonus(lottoTicket)); - winningLottoRank.put(key, winningLottoRank.get(key) + 1); - }); + private void addWinningCount(LottoTicket lottoTicket) { + LottoRank key = LottoRank.findBy(hitCount(lottoTicket), hitBonus(lottoTicket)); + winningLottoRank.put(key, winningLottoRank.get(key) + 1); } public int count(LottoRank lottoRank) { return winningLottoRank.get(lottoRank); } + + public Set keys() { + return winningLottoRank.keySet(); + } } diff --git a/src/main/java/lotto/domain/winning/WinningStatistics.java b/src/main/java/lotto/domain/winning/WinningStatistics.java index 1527a867..a6f56b54 100644 --- a/src/main/java/lotto/domain/winning/WinningStatistics.java +++ b/src/main/java/lotto/domain/winning/WinningStatistics.java @@ -1,10 +1,7 @@ package lotto.domain.winning; -import lotto.domain.lotto.LottoRank; import lotto.domain.vending.TicketAmount; -import java.util.Arrays; - import static lotto.domain.vending.TicketAmount.TICKET_PRICE; public class WinningStatistics { @@ -20,7 +17,7 @@ public float profitRate(TicketAmount ticketAmount) { } private int totalPrize() { - return Arrays.stream(LottoRank.values()) + return winningLottoRank.keys().stream() .mapToInt(rank -> rank.prizeMoney() * winningLottoRank.count(rank)) .sum(); } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index b775886b..94ca1fce 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -5,6 +5,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class InputView { private static final Scanner scanner = new Scanner(System.in); @@ -28,12 +30,13 @@ public static String getManualCount() { } public static List getManualNumbers(TicketAmount ticketAmount) { - System.out.println(MANUAL_NUMBER_MESSAGE); - List manualNumbers = new ArrayList<>(); - for (int i = 0; i < ticketAmount.manual(); i++) { - manualNumbers.add(scanner.nextLine().trim()); + if (ticketAmount.manual() == 0) { + return new ArrayList<>(); } - return manualNumbers; + System.out.println(MANUAL_NUMBER_MESSAGE); + return IntStream.range(0, ticketAmount.manual()) + .mapToObj(i -> scanner.nextLine().trim()) + .collect(Collectors.toList()); } public static String getWinningNumber() { diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 0ad87381..80749609 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -36,7 +36,7 @@ public static void printProfitRate(float profitRate) { public static void printWinningStatistics(WinningLottoRank winningLottoRank) { System.out.println("당첨 통계\n---------"); - for (LottoRank rank : LottoRank.values()) { + for (LottoRank rank : winningLottoRank.keys()) { String message = (rank == LottoRank.SECOND) ? "%d개 일치, 보너스 볼 일치 (%d원) - %d개%n" : "%d개 일치 (%d원) - %d개%n"; System.out.printf(message, rank.hitCount(), rank.prizeMoney(), winningLottoRank.count(rank)); diff --git a/src/test/java/lotto/domain/lotto/LottoRankTest.java b/src/test/java/lotto/domain/lotto/LottoRankTest.java index cc76490d..75f1c30e 100644 --- a/src/test/java/lotto/domain/lotto/LottoRankTest.java +++ b/src/test/java/lotto/domain/lotto/LottoRankTest.java @@ -9,9 +9,9 @@ public class LottoRankTest { @ParameterizedTest - @CsvSource(value = {"6, 0, FIRST", "5, 1, SECOND", "5, 0, THIRD", "4, 0, FOURTH", "3, 0, FIFTH"}) + @CsvSource(value = {"6, false, FIRST", "5, true, SECOND", "5, false, THIRD", "4, false, FOURTH", "3, false, FIFTH"}) @DisplayName("로또 티의 당첨 갯수개에 따른 순위를 반환한다") - void lotto_hit_count_rank(int hitCount, int hitBonus, String ranking) { + void lotto_hit_count_rank(int hitCount, boolean hitBonus, String ranking) { //given //when diff --git a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java index 6b150f37..e2db7694 100644 --- a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java +++ b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java @@ -12,7 +12,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @@ -27,9 +26,8 @@ private WinningNumbers generateWinningNumber(int bonusNumber) { @ParameterizedTest @MethodSource("hitLottoNumbers") @DisplayName("당첨 번호와 일치하는 로또 번호 개수를 반환한다") - void hit_winning_numbers_count(int[] numbers, int expectedCount) { + void hit_winning_numbers_count(LottoTicket lottoTicket, int expectedCount) { //given - LottoTicket lottoTicket = new LottoTicket(numbers); LottoTickets lottoTickets = new LottoTickets(lottoTicket); WinningNumbers winningNumbers = generateWinningNumber(45); @@ -51,10 +49,10 @@ void hit_bonus_number_count() { //when WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); - int hitBonus = winningLottoRank.hitBonus(lottoTicket); + boolean isBonus = winningLottoRank.hitBonus(lottoTicket); //then - assertThat(hitBonus).isEqualTo(1); + assertThat(isBonus).isTrue(); } @Test @@ -74,6 +72,35 @@ void group_by_rank_count() { assertThat(winningLottoRank.count(LottoRank.FIRST)).isZero(); } + @ParameterizedTest + @MethodSource("matchedBonusTickets") + @DisplayName("보너스 번호가 일치하는 로또 순위를 반환한다") + void matched_bonus_tickets(LottoTicket lottoTicket, LottoRank lottoRank) { + //given + LottoTickets lottoTickets = new LottoTickets(lottoTicket); + + //when + WinningNumbers winningNumbers = generateWinningNumber(45); + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + + //then + assertThat(winningLottoRank.count(lottoRank)).isEqualTo(1); + } + + @MethodSource("notMatchedBonusTickets") + @DisplayName("보너스 번호가 일치하지 않는 로또 순위를 반환한다") + void not_matched_bonus_tickets(LottoTicket lottoTicket, LottoRank lottoRank) { + //given + LottoTickets lottoTickets = new LottoTickets(lottoTicket); + + //when + WinningNumbers winningNumbers = generateWinningNumber(45); + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + + //then + assertThat(winningLottoRank.count(lottoRank)).isEqualTo(1); + } + private LottoTickets generateLottoTickets() { List lottoTickets = new ArrayList<>(); lottoTickets.add(new LottoTicket(3, 4, 5, 6, 7, 8)); // 4개 일치 @@ -86,13 +113,33 @@ private LottoTickets generateLottoTickets() { private static Stream hitLottoNumbers() { return Stream.of( - Arguments.of(new int[]{1, 2, 3, 4, 5, 6}, 6), - Arguments.of(new int[]{1, 2, 3, 4, 5, 7}, 5), - Arguments.of(new int[]{1, 2, 3, 4, 7, 8}, 4), - Arguments.of(new int[]{1, 2, 3, 7, 8, 9}, 3), - Arguments.of(new int[]{1, 2, 7, 8, 9, 10}, 2), - Arguments.of(new int[]{1, 7, 8, 9, 10, 11}, 1), - Arguments.of(new int[]{8, 9, 10, 11, 12, 13}, 0) + Arguments.of(new LottoTicket(1, 2, 3, 4, 5, 6), 6), + Arguments.of(new LottoTicket(2, 3, 4, 5, 6, 7), 5), + Arguments.of(new LottoTicket(3, 4, 5, 6, 7, 8), 4), + Arguments.of(new LottoTicket(4, 5, 6, 7, 8, 9), 3), + Arguments.of(new LottoTicket(5, 6, 7, 8, 9, 10), 2), + Arguments.of(new LottoTicket(6, 7, 8, 9, 10, 11), 1), + Arguments.of(new LottoTicket(7, 8, 9, 10, 11, 12), 0) + ); + } + + private static Stream matchedBonusTickets() { + return Stream.of( + Arguments.of(new LottoTicket(1, 2, 3, 4, 5, 6), LottoRank.FIRST), + Arguments.of(new LottoTicket(1, 2, 3, 4, 5, 45), LottoRank.SECOND), + Arguments.of(new LottoTicket(2, 3, 4, 5, 6, 7), LottoRank.THIRD), + Arguments.of(new LottoTicket(3, 4, 5, 6, 7, 45), LottoRank.FOURTH), + Arguments.of(new LottoTicket(4, 5, 6, 7, 8, 45), LottoRank.FIFTH) + ); + } + + private static Stream notMatchedBonusTickets() { + return Stream.of( + Arguments.of(new LottoTicket(1, 2, 3, 4, 5, 6), LottoRank.FIRST), + Arguments.of(new LottoTicket(1, 2, 3, 4, 5, 45), LottoRank.SECOND), + Arguments.of(new LottoTicket(2, 3, 4, 5, 6, 7), LottoRank.THIRD), + Arguments.of(new LottoTicket(3, 4, 5, 6, 7, 8), LottoRank.FOURTH), + Arguments.of(new LottoTicket(4, 5, 6, 7, 8, 9), LottoRank.FIFTH) ); } } From 4089514ce7d8887d93a1256b4870afb9e9fe49c5 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 15 Jul 2021 18:53:23 +0900 Subject: [PATCH 13/22] =?UTF-8?q?refactor=20:=20=EC=9A=94=EC=86=8C?= =?UTF-8?q?=EA=B0=80=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20Collectio?= =?UTF-8?q?ns.emptyList()=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 94ca1fce..e2fd3fb7 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -3,6 +3,7 @@ import lotto.domain.vending.TicketAmount; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Scanner; import java.util.stream.Collectors; @@ -31,7 +32,7 @@ public static String getManualCount() { public static List getManualNumbers(TicketAmount ticketAmount) { if (ticketAmount.manual() == 0) { - return new ArrayList<>(); + return Collections.emptyList(); } System.out.println(MANUAL_NUMBER_MESSAGE); return IntStream.range(0, ticketAmount.manual()) From ab32b7c34f223e985ccb5a0ad5da56327553fb64 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 15 Jul 2021 19:50:33 +0900 Subject: [PATCH 14/22] =?UTF-8?q?feat=20:=20=EB=A1=9C=EB=98=90=20=ED=8B=B0?= =?UTF-8?q?=EC=BC=93=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../java/lotto/domain/lotto/LottoTicket.java | 27 +++++++++----- src/main/java/lotto/view/InputView.java | 1 - .../lotto/domain/lotto/LottoTicketTest.java | 37 ++++++++++--------- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index fa3924c3..39e2ad1e 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,8 @@ - [x] 로또 티켓 - [x] 6개의 로또 번호를 가진다. - - [x] ERROR : 로또 번호가 중복될 경우 예외가 발생한다. + - [x] ERROR : 로또 번호가 6개 보다 작거나 많은 경우 예외가 발생한다. + - [x] ERROR : 로또 번호가 중복될 경우 예외가 발생한다. - [x] 로또 순위 - [x] 로또 티켓의 당첨 수에 따른 순위를 반환한다. diff --git a/src/main/java/lotto/domain/lotto/LottoTicket.java b/src/main/java/lotto/domain/lotto/LottoTicket.java index 9391d213..4cab55e3 100644 --- a/src/main/java/lotto/domain/lotto/LottoTicket.java +++ b/src/main/java/lotto/domain/lotto/LottoTicket.java @@ -9,24 +9,33 @@ public class LottoTicket { private final List lottoNumbers; public LottoTicket(final List lottoNumbers) { - validateDuplication(lottoNumbers); + validation(lottoNumbers); this.lottoNumbers = new ArrayList<>(lottoNumbers); } - private void validateDuplication(List lottoNumbers) { - Set lottoNumberSet = new HashSet<>(lottoNumbers); - - if (lottoNumberSet.size() < LOTTO_NUMBER_SIZE) { - throw new IllegalArgumentException("로또 번호가 중복됩니다."); - } - } - public LottoTicket(int... lottoNumbers) { this(Arrays.stream(lottoNumbers) .mapToObj(LottoNumber::new) .collect(Collectors.toList())); } + private void validation(List lottoNumbers) { + validateSize(lottoNumbers); + validateDuplication(new HashSet<>(lottoNumbers)); + } + + private void validateSize(List lottoNumberSet) { + if (lottoNumberSet.size() != LOTTO_NUMBER_SIZE) { + throw new IllegalArgumentException("로또 번호는 6개 입니다."); + } + } + + private void validateDuplication(Set lottoNumberSet) { + if (lottoNumberSet.size() < LOTTO_NUMBER_SIZE) { + throw new IllegalArgumentException("로또 번호가 중복됩니다."); + } + } + public List lottoNumbers() { return Collections.unmodifiableList(lottoNumbers); } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index e2fd3fb7..b62016f6 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -2,7 +2,6 @@ import lotto.domain.vending.TicketAmount; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; diff --git a/src/test/java/lotto/domain/lotto/LottoTicketTest.java b/src/test/java/lotto/domain/lotto/LottoTicketTest.java index 75c357a4..3f5e0ce1 100644 --- a/src/test/java/lotto/domain/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/domain/lotto/LottoTicketTest.java @@ -3,10 +3,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -15,27 +11,34 @@ public class LottoTicketTest { @Test @DisplayName("로또 넘버 6개를 인자로 받아 로또 티켓 객체를 생성한다") void create() { - //given - LottoGenerator lottoGenerator = new LottoGenerator(); - List lottoNumbers = lottoGenerator.issueAutoLottoNumbers(); - - //when - LottoTicket lottoTicket = new LottoTicket(lottoNumbers); + //given //when + LottoTicket lottoTicket = new LottoTicket(1, 2, 3, 4, 5, 6); //then assertThat(lottoTicket.lottoNumbers()).hasSize(6); } + @Test + @DisplayName("로또 넘버가 6개 보다 적은 경우 예외가 발생한다.") + void less_then_lotto_size() { + //given //when //then + assertThatThrownBy(() -> new LottoTicket(1, 2, 3, 4, 5)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("로또 넘버가 6개 보다 많은 경우 예외가 발생한다.") + void more_then_lotto_size() { + //given //when //then + assertThatThrownBy(() -> new LottoTicket(1, 2, 3, 4, 5, 6, 7)) + .isInstanceOf(IllegalArgumentException.class); + } + @Test @DisplayName("로또 번호가 중복될 경우 예외가 발생한다") void duplicate_lotto_numbers() { - //given - List lottoNumbers = Stream.of(1, 1, 2, 3, 4, 5) - .map(LottoNumber::new) - .collect(Collectors.toList()); - - //when //then - assertThatThrownBy(() -> new LottoTicket(lottoNumbers)) + //given //when //then + assertThatThrownBy(() -> new LottoTicket(1, 1, 2, 3, 4, 5)) .isInstanceOf(IllegalArgumentException.class); } } From b2792af2bc66a128859ee458057e9f040fe930b3 Mon Sep 17 00:00:00 2001 From: Chloe Date: Mon, 2 Aug 2021 02:01:19 +0900 Subject: [PATCH 15/22] =?UTF-8?q?refactor=20:=20static=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=A0=9C=EA=B1=B0,=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=A3=BC=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoApplication.java | 3 +- .../lotto/controller/LottoController.java | 42 ++++++++++--------- .../vending/LottoTicketVendingMachine.java | 10 +++-- src/main/java/lotto/service/LottoService.java | 37 ++++++++++++++++ 4 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 src/main/java/lotto/service/LottoService.java diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 8af025ba..0abe19f7 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -4,6 +4,7 @@ public class LottoApplication { public static void main(String[] args) { - LottoController.run(); + LottoController lottoController = new LottoController(); + lottoController.run(); } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index a8735dab..9b3e803a 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -8,38 +8,40 @@ import lotto.domain.winning.WinningLottoRank; import lotto.domain.winning.WinningNumbers; import lotto.domain.winning.WinningStatistics; +import lotto.service.LottoService; import lotto.view.InputView; import lotto.view.OutputView; import java.util.List; public class LottoController { + private LottoService lottoService = new LottoService(); - private static final LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); + public void run() { + try { + String inputPrice = InputView.getBuyingPrice(); + String inputManualCount = InputView.getManualCount(); - public static void run() { - String inputPrice = InputView.getBuyingPrice(); - BuyingPrice buyingPrice = new BuyingPrice(inputPrice); + BuyingPrice buyingPrice = new BuyingPrice(inputPrice); + TicketAmount ticketAmount = new TicketAmount(buyingPrice, inputManualCount); - String inputManualCount = InputView.getManualCount(); - TicketAmount ticketAmount = new TicketAmount(buyingPrice, inputManualCount); + List inputManualNumbers = InputView.getManualNumbers(ticketAmount); + LottoTickets lottoTickets = lottoService.issueTickets(ticketAmount, inputManualNumbers); - List inputManualNumbers = InputView.getManualNumbers(ticketAmount); - LottoTickets lottoTickets = lottoTicketVendingMachine.issueTickets(ticketAmount, inputManualNumbers); + OutputView.printTicketAmount(ticketAmount); + OutputView.printLottoTickets(lottoTickets); - OutputView.printTicketAmount(ticketAmount); - OutputView.printLottoTickets(lottoTickets); + String inputWinningNumbers = InputView.getWinningNumber(); + List splitWinningNumbers = StringUtil.splitParseInt(inputWinningNumbers); - String inputWinningNumbers = InputView.getWinningNumber(); - List splitWinningNumbers = StringUtil.splitParseInt(inputWinningNumbers); + WinningLottoRank winningLottoRank = lottoService.getWinningLottoRank(lottoTickets, splitWinningNumbers); + float profitRate = lottoService.getProfitRate(ticketAmount, winningLottoRank); - int bonusNumber = Integer.parseInt(InputView.getBonusNumber()); - WinningNumbers winningNumbers = new WinningNumbers(splitWinningNumbers, bonusNumber); - WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); - OutputView.printWinningStatistics(winningLottoRank); - - WinningStatistics winningStatistics = new WinningStatistics(winningLottoRank); - float profitRate = winningStatistics.profitRate(ticketAmount); - OutputView.printProfitRate(profitRate); + OutputView.printProfitRate(profitRate); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } } + + } diff --git a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java index 2e2fbd14..cfa3e1ed 100644 --- a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java @@ -12,16 +12,20 @@ public class LottoTicketVendingMachine { - private static final LottoGenerator LOTTO_GENERATOR = new LottoGenerator(); + private final LottoGenerator lottoGenerator; + + public LottoTicketVendingMachine() { + this.lottoGenerator = new LottoGenerator(); + } public List autoIssueTickets(TicketAmount ticketAmount) { return IntStream.range(0, ticketAmount.auto()) - .mapToObj(i -> LOTTO_GENERATOR.issueAutoLottoNumbers()) + .mapToObj(i -> lottoGenerator.issueAutoLottoNumbers()) .map(LottoTicket::new) .collect(Collectors.toList()); } - public List manualIssueTickets(List inputNumbers) { + public List manualIssueTickets(List inputNumbers) { return inputNumbers.stream() .map(StringUtil::split) .map(manualNumbers -> manualLottoTicket(manualNumbers)) diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java new file mode 100644 index 00000000..f7eed4eb --- /dev/null +++ b/src/main/java/lotto/service/LottoService.java @@ -0,0 +1,37 @@ +package lotto.service; + +import lotto.domain.lotto.LottoTickets; +import lotto.domain.vending.LottoTicketVendingMachine; +import lotto.domain.vending.TicketAmount; +import lotto.domain.winning.WinningLottoRank; +import lotto.domain.winning.WinningNumbers; +import lotto.domain.winning.WinningStatistics; +import lotto.view.InputView; +import lotto.view.OutputView; + +import java.util.List; + +public class LottoService { + private final LottoTicketVendingMachine lottoTicketVendingMachine; + + public LottoService() { + this.lottoTicketVendingMachine = new LottoTicketVendingMachine(); + } + public LottoTickets issueTickets(TicketAmount ticketAmount, List inputManualNumbers) { + return lottoTicketVendingMachine.issueTickets(ticketAmount, inputManualNumbers); + } + + public float getProfitRate(TicketAmount ticketAmount, WinningLottoRank winningLottoRank) { + WinningStatistics winningStatistics = new WinningStatistics(winningLottoRank); + float profitRate = winningStatistics.profitRate(ticketAmount); + return profitRate; + } + + public WinningLottoRank getWinningLottoRank(LottoTickets lottoTickets, List splitWinningNumbers) { + int bonusNumber = Integer.parseInt(InputView.getBonusNumber()); + WinningNumbers winningNumbers = new WinningNumbers(splitWinningNumbers, bonusNumber); + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + OutputView.printWinningStatistics(winningLottoRank); + return winningLottoRank; + } +} From 2a6e9d8633ea14f6e8b0a42bad419fcb10d18093 Mon Sep 17 00:00:00 2001 From: Chloe Date: Tue, 3 Aug 2021 03:17:40 +0900 Subject: [PATCH 16/22] =?UTF-8?q?refactor=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=EC=97=90=EB=9F=AC=EB=A5=BC=20?= =?UTF-8?q?Controller=20=EA=B0=80=20=EB=8B=B4=EB=8B=B9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95,=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=EB=A5=BC=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=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/lotto/LottoApplication.java | 28 +++++++++- .../lotto/controller/LottoController.java | 49 ++++++++++-------- .../lotto/domain/lotto/LottoGenerator.java | 12 +++-- .../java/lotto/domain/lotto/LottoNumber.java | 4 -- .../java/lotto/domain/lotto/LottoTickets.java | 3 ++ .../java/lotto/domain/util/StringUtil.java | 5 +- .../lotto/domain/vending/BuyingPrice.java | 14 ++--- .../vending/LottoTicketVendingMachine.java | 35 +++++-------- .../lotto/domain/vending/TicketAmount.java | 28 ++++------ .../domain/winning/WinningLottoRank.java | 10 ++-- .../lotto/domain/winning/WinningNumbers.java | 7 +++ .../domain/winning/WinningStatistics.java | 8 ++- src/main/java/lotto/service/LottoService.java | 51 +++++++++++++------ src/main/java/lotto/view/InputView.java | 21 ++++---- src/main/java/lotto/view/OutputView.java | 4 +- .../domain/lotto/LottoGeneratorTest.java | 2 +- .../lotto/domain/lotto/LottoRankTest.java | 2 +- .../lotto/domain/lotto/LottoTicketTest.java | 2 +- .../lotto/domain/vending/BuyingPriceTest.java | 2 +- .../LottoTicketVendingMachineTest.java | 28 +++++----- .../domain/vending/TicketAmountTest.java | 8 +-- .../domain/winning/WinningLottoRankTest.java | 2 +- .../domain/winning/WinningNumbersTest.java | 2 +- .../domain/winning/WinningStatisticsTest.java | 8 +-- 24 files changed, 192 insertions(+), 143 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 0abe19f7..0642d3d2 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -1,10 +1,34 @@ package lotto; import lotto.controller.LottoController; +import lotto.domain.lotto.LottoTickets; +import lotto.domain.vending.BuyingPrice; +import lotto.domain.vending.TicketAmount; +import lotto.domain.winning.WinningNumbers; +import lotto.view.InputView; +import lotto.view.OutputView; public class LottoApplication { public static void main(String[] args) { - LottoController lottoController = new LottoController(); - lottoController.run(); + try { + LottoController lottoController = new LottoController(); + + BuyingPrice buyingPrice = lottoController.getBuyingPrice(InputView.getBuyingPrice()); + TicketAmount ticketAmount = lottoController.getTicketAmount(buyingPrice.totalTicketAmount(), InputView.getManualCount()); + + LottoTickets lottoTickets = lottoController.issueTickets(ticketAmount); + OutputView.printTicketAmount(ticketAmount); + OutputView.printLottoTickets(lottoTickets); + + String winningNumber = InputView.getWinningNumber(); + String bonusNumber = InputView.getBonusNumber(); + WinningNumbers winningNumbers = lottoController.validateWinningLottoNumbers(winningNumber, bonusNumber); + float profitRate = lottoController.calculateProfitRate(ticketAmount.total(), lottoTickets, winningNumbers); + OutputView.printProfitRate(profitRate); + + } catch (RuntimeException e) { + System.out.println("=====> Error Message : " + e.getMessage()); + } } } + diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 9b3e803a..29427071 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -3,45 +3,52 @@ import lotto.domain.lotto.LottoTickets; import lotto.domain.util.StringUtil; import lotto.domain.vending.BuyingPrice; -import lotto.domain.vending.LottoTicketVendingMachine; import lotto.domain.vending.TicketAmount; import lotto.domain.winning.WinningLottoRank; import lotto.domain.winning.WinningNumbers; -import lotto.domain.winning.WinningStatistics; import lotto.service.LottoService; import lotto.view.InputView; -import lotto.view.OutputView; import java.util.List; public class LottoController { - private LottoService lottoService = new LottoService(); + private final LottoService lottoService = new LottoService(); - public void run() { + public BuyingPrice getBuyingPrice(String price) throws NumberFormatException { try { - String inputPrice = InputView.getBuyingPrice(); - String inputManualCount = InputView.getManualCount(); + return new BuyingPrice(Integer.parseInt(price)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("구매 금액은 숫자로 입력해 주세요."); + } + } - BuyingPrice buyingPrice = new BuyingPrice(inputPrice); - TicketAmount ticketAmount = new TicketAmount(buyingPrice, inputManualCount); + public TicketAmount getTicketAmount(int totalTicketAmount, String manualTicketAmount) { + try { + return new TicketAmount(totalTicketAmount, Integer.parseInt(manualTicketAmount)); - List inputManualNumbers = InputView.getManualNumbers(ticketAmount); - LottoTickets lottoTickets = lottoService.issueTickets(ticketAmount, inputManualNumbers); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("수동 티켓 개수는 숫자로 입력해 주세요."); + } + } - OutputView.printTicketAmount(ticketAmount); - OutputView.printLottoTickets(lottoTickets); + public LottoTickets issueTickets(TicketAmount ticketAmount) { + List inputManualNumbers = InputView.getManualNumbers(ticketAmount.manual()); + return lottoService.issueTickets(ticketAmount.auto(), inputManualNumbers); + } - String inputWinningNumbers = InputView.getWinningNumber(); + public WinningNumbers validateWinningLottoNumbers(String inputWinningNumbers, String inputBonusNumber) { + try { List splitWinningNumbers = StringUtil.splitParseInt(inputWinningNumbers); + int bonusNumber = Integer.parseInt(inputBonusNumber); + return new WinningNumbers(splitWinningNumbers, bonusNumber); - WinningLottoRank winningLottoRank = lottoService.getWinningLottoRank(lottoTickets, splitWinningNumbers); - float profitRate = lottoService.getProfitRate(ticketAmount, winningLottoRank); - - OutputView.printProfitRate(profitRate); - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("수동 로또 번호는은 숫자로 입력해 주세요."); } } - + public float calculateProfitRate(int totalTicketAmount, LottoTickets lottoTickets, WinningNumbers winningNumbers) { + WinningLottoRank winningLottoRank = lottoService.getWinningLottoRank(lottoTickets, winningNumbers); + return lottoService.getProfitRate(totalTicketAmount, winningLottoRank); + } } diff --git a/src/main/java/lotto/domain/lotto/LottoGenerator.java b/src/main/java/lotto/domain/lotto/LottoGenerator.java index b406425f..457eab1e 100644 --- a/src/main/java/lotto/domain/lotto/LottoGenerator.java +++ b/src/main/java/lotto/domain/lotto/LottoGenerator.java @@ -8,20 +8,24 @@ import static lotto.domain.lotto.LottoNumber.MAX_LOTTO_BOUND; import static lotto.domain.lotto.LottoNumber.MIN_LOTTO_BOUND; +import static lotto.domain.lotto.LottoTicket.LOTTO_NUMBER_SIZE; public class LottoGenerator { + private final List lottoNumberBox; - private static final List LOTTO_NUMBER_CONTAINER = create(); + public LottoGenerator() { + this.lottoNumberBox = create(); + Collections.shuffle(lottoNumberBox); + } - private static List create() { + private List create() { return IntStream.rangeClosed(MIN_LOTTO_BOUND, MAX_LOTTO_BOUND) .mapToObj(LottoNumber::new) .collect(Collectors.toList()); } public List issueAutoLottoNumbers() { - Collections.shuffle(LOTTO_NUMBER_CONTAINER); - return LOTTO_NUMBER_CONTAINER.subList(0, 6).stream() + return lottoNumberBox.subList(0, LOTTO_NUMBER_SIZE).stream() .sorted(Comparator.comparing(LottoNumber::value)) .collect(Collectors.toList()); } diff --git a/src/main/java/lotto/domain/lotto/LottoNumber.java b/src/main/java/lotto/domain/lotto/LottoNumber.java index 36ac7012..07d51614 100644 --- a/src/main/java/lotto/domain/lotto/LottoNumber.java +++ b/src/main/java/lotto/domain/lotto/LottoNumber.java @@ -13,10 +13,6 @@ public LottoNumber(final int lottoNumber) { this.lottoNumber = lottoNumber; } - public LottoNumber(String lottoNumber) { - this(Integer.parseInt(lottoNumber)); - } - private void validateBound(int lottoNumber) { if (lottoNumber < MIN_LOTTO_BOUND || lottoNumber > MAX_LOTTO_BOUND) { throw new IllegalArgumentException("로또 번호는 1 ~ 45 까지 입니다."); diff --git a/src/main/java/lotto/domain/lotto/LottoTickets.java b/src/main/java/lotto/domain/lotto/LottoTickets.java index 354a00f7..496873d0 100644 --- a/src/main/java/lotto/domain/lotto/LottoTickets.java +++ b/src/main/java/lotto/domain/lotto/LottoTickets.java @@ -20,6 +20,9 @@ public LottoTickets(LottoTicket lottoTicket) { } public void add(List lottoTickets) { + if (lottoTickets == null) { + throw new NullPointerException("로또 티켓이 비어 있습니다."); + } this.lottoTickets.addAll(lottoTickets); } diff --git a/src/main/java/lotto/domain/util/StringUtil.java b/src/main/java/lotto/domain/util/StringUtil.java index 73b73b76..4bed3e75 100644 --- a/src/main/java/lotto/domain/util/StringUtil.java +++ b/src/main/java/lotto/domain/util/StringUtil.java @@ -5,7 +5,10 @@ import java.util.stream.Collectors; public class StringUtil { - private static final String DELIMITER = ","; + public static final String DELIMITER = ","; + + private StringUtil() { + } public static List split(String input) { return Arrays.stream(input.split(DELIMITER)) diff --git a/src/main/java/lotto/domain/vending/BuyingPrice.java b/src/main/java/lotto/domain/vending/BuyingPrice.java index 298d5460..93ad7d87 100644 --- a/src/main/java/lotto/domain/vending/BuyingPrice.java +++ b/src/main/java/lotto/domain/vending/BuyingPrice.java @@ -2,20 +2,16 @@ import java.util.Objects; -import static lotto.domain.vending.TicketAmount.TICKET_PRICE; - public class BuyingPrice { + public static final int TICKET_PRICE = 1000; + private final int buyingPrice; - public BuyingPrice(final int buyingPrice) { + public BuyingPrice(int buyingPrice) { validate(buyingPrice); this.buyingPrice = buyingPrice; } - public BuyingPrice(String buyingPrice) { - this(Integer.parseInt(buyingPrice)); - } - private void validate(int buyingPrice) { validateMinimum(buyingPrice); validateDivisible(buyingPrice); @@ -33,8 +29,8 @@ private void validateDivisible(int buyingPrice) { } } - public int value() { - return buyingPrice; + public int totalTicketAmount() { + return buyingPrice / TICKET_PRICE; } @Override diff --git a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java index cfa3e1ed..412c7635 100644 --- a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java @@ -4,45 +4,36 @@ import lotto.domain.lotto.LottoNumber; import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; -import lotto.domain.util.StringUtil; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class LottoTicketVendingMachine { - private final LottoGenerator lottoGenerator; public LottoTicketVendingMachine() { this.lottoGenerator = new LottoGenerator(); } - public List autoIssueTickets(TicketAmount ticketAmount) { - return IntStream.range(0, ticketAmount.auto()) - .mapToObj(i -> lottoGenerator.issueAutoLottoNumbers()) - .map(LottoTicket::new) - .collect(Collectors.toList()); + public LottoTickets issueTickets(int autoTicketAmount, List> manualLottoNumbers) { + LottoTickets lottoTickets = new LottoTickets(); + lottoTickets.add(manualLottoTickets(manualLottoNumbers)); + lottoTickets.add(autoIssueTickets(autoTicketAmount)); + return lottoTickets; } - public List manualIssueTickets(List inputNumbers) { - return inputNumbers.stream() - .map(StringUtil::split) - .map(manualNumbers -> manualLottoTicket(manualNumbers)) + public List autoIssueTickets(int autoTicketAmount) { + return IntStream.range(0, autoTicketAmount) + .mapToObj(i -> lottoGenerator.issueAutoLottoNumbers()) + .map(LottoTicket::new) .collect(Collectors.toList()); } - private LottoTicket manualLottoTicket(List manualNumbers) { - List lottoNumbers = manualNumbers.stream() - .map(LottoNumber::new) + public List manualLottoTickets(List> manualLottoNumbers) { + return manualLottoNumbers.stream() + .map(manualNumbers -> manualNumbers.stream().map(LottoNumber::new).collect(Collectors.toList())) + .map(LottoTicket::new) .collect(Collectors.toList()); - return new LottoTicket(lottoNumbers); - } - - public LottoTickets issueTickets(TicketAmount ticketAmount, List inputManualNumbers) { - LottoTickets lottoTickets = new LottoTickets(); - lottoTickets.add(manualIssueTickets(inputManualNumbers)); - lottoTickets.add(autoIssueTickets(ticketAmount)); - return lottoTickets; } } diff --git a/src/main/java/lotto/domain/vending/TicketAmount.java b/src/main/java/lotto/domain/vending/TicketAmount.java index 839ae0fd..3ac1ecaf 100644 --- a/src/main/java/lotto/domain/vending/TicketAmount.java +++ b/src/main/java/lotto/domain/vending/TicketAmount.java @@ -1,36 +1,30 @@ package lotto.domain.vending; public class TicketAmount { - public static final int TICKET_PRICE = 1000; + private final int manualTicketAmount; + private final int autoTicketAmount; - private final int manualCount; - private final int autoCount; - - public TicketAmount(BuyingPrice buyingPrice, int manualCount) { - validation(buyingPrice, manualCount); - this.manualCount = manualCount; - this.autoCount = (buyingPrice.value() / TICKET_PRICE) - manualCount; + public TicketAmount(int totalTicketAmount, int manualTicketAmount) { + validation(totalTicketAmount, manualTicketAmount); + this.manualTicketAmount = manualTicketAmount; + this.autoTicketAmount = totalTicketAmount - manualTicketAmount; } - private void validation(BuyingPrice buyingPrice, int manualCount) { - if ((buyingPrice.value() / TICKET_PRICE) < manualCount) { + private void validation(int totalTicketAmount, int manualCount) { + if (totalTicketAmount < manualCount) { throw new IllegalArgumentException("수동 구매 티켓이 전체 티켓 보다 많습니다."); } } - public TicketAmount(BuyingPrice buyingPrice, String manualCount) { - this(buyingPrice, Integer.parseInt(manualCount)); - } - public int manual() { - return manualCount; + return manualTicketAmount; } public int auto() { - return autoCount; + return autoTicketAmount; } public int total() { - return manualCount + autoCount; + return manualTicketAmount + autoTicketAmount; } } diff --git a/src/main/java/lotto/domain/winning/WinningLottoRank.java b/src/main/java/lotto/domain/winning/WinningLottoRank.java index 878d4341..5d9c3d0c 100644 --- a/src/main/java/lotto/domain/winning/WinningLottoRank.java +++ b/src/main/java/lotto/domain/winning/WinningLottoRank.java @@ -4,7 +4,10 @@ import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; -import java.util.*; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; public class WinningLottoRank { private final WinningNumbers winningNumbers; @@ -23,14 +26,13 @@ private void initRank(LottoTickets lottoTickets) { } private void groupByWinningCount(LottoTickets lottoTickets) { - lottoTickets.values().stream() - .forEach(lottoTicket -> addWinningCount(lottoTicket)); + lottoTickets.values().forEach(this::addWinningCount); winningLottoRank.remove(LottoRank.LOSE); } public int hitCount(LottoTicket lottoTicket) { return (int) winningNumbers.getWinningNumbers().stream() - .filter(winningNumber -> lottoTicket.contains(winningNumber)) + .filter(lottoTicket::contains) .count(); } diff --git a/src/main/java/lotto/domain/winning/WinningNumbers.java b/src/main/java/lotto/domain/winning/WinningNumbers.java index 5505cd28..e9eac531 100644 --- a/src/main/java/lotto/domain/winning/WinningNumbers.java +++ b/src/main/java/lotto/domain/winning/WinningNumbers.java @@ -14,6 +14,7 @@ public class WinningNumbers { private final LottoNumber bonusNumber; public WinningNumbers(List winningNumbers, LottoNumber bonusNumber) { + validateSize(winningNumbers.size()); validateDuplication(winningNumbers, bonusNumber); this.winningNumbers = winningNumbers; this.bonusNumber = bonusNumber; @@ -25,6 +26,12 @@ public WinningNumbers(List winningNumbers, int bonusNumber) { .collect(Collectors.toList()), new LottoNumber(bonusNumber)); } + private void validateSize(int winningNumberSize) { + if (winningNumberSize > WINNING_NUMBER_SIZE) { + throw new IllegalArgumentException("수동 로또 번호 입력 개수는 6개 입니다."); + } + } + private void validateDuplication(List winningNumbers, LottoNumber bonusNumber) { Set lottoNumbers = new HashSet<>(winningNumbers); diff --git a/src/main/java/lotto/domain/winning/WinningStatistics.java b/src/main/java/lotto/domain/winning/WinningStatistics.java index a6f56b54..d5defaf5 100644 --- a/src/main/java/lotto/domain/winning/WinningStatistics.java +++ b/src/main/java/lotto/domain/winning/WinningStatistics.java @@ -1,8 +1,6 @@ package lotto.domain.winning; -import lotto.domain.vending.TicketAmount; - -import static lotto.domain.vending.TicketAmount.TICKET_PRICE; +import static lotto.domain.vending.BuyingPrice.TICKET_PRICE; public class WinningStatistics { private final WinningLottoRank winningLottoRank; @@ -11,9 +9,9 @@ public WinningStatistics(WinningLottoRank winningLottoRank) { this.winningLottoRank = winningLottoRank; } - public float profitRate(TicketAmount ticketAmount) { + public float profitRate(int totalTicketAmount) { int totalPrize = totalPrize(); - return (float) totalPrize / (ticketAmount.total() * TICKET_PRICE); + return (float) totalPrize / (totalTicketAmount * TICKET_PRICE); } private int totalPrize() { diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index f7eed4eb..829e7cc2 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -1,37 +1,58 @@ package lotto.service; import lotto.domain.lotto.LottoTickets; +import lotto.domain.util.StringUtil; import lotto.domain.vending.LottoTicketVendingMachine; -import lotto.domain.vending.TicketAmount; import lotto.domain.winning.WinningLottoRank; import lotto.domain.winning.WinningNumbers; import lotto.domain.winning.WinningStatistics; -import lotto.view.InputView; import lotto.view.OutputView; import java.util.List; +import java.util.stream.Collectors; public class LottoService { - private final LottoTicketVendingMachine lottoTicketVendingMachine; + private final LottoTicketVendingMachine vendingMachine; public LottoService() { - this.lottoTicketVendingMachine = new LottoTicketVendingMachine(); + this.vendingMachine = new LottoTicketVendingMachine(); } - public LottoTickets issueTickets(TicketAmount ticketAmount, List inputManualNumbers) { - return lottoTicketVendingMachine.issueTickets(ticketAmount, inputManualNumbers); + + public LottoTickets issueTickets(int autoTicketAmount, List inputManualNumbers) { + List> manualLottoNumbers = manualLottoNumbers(inputManualNumbers); + return vendingMachine.issueTickets(autoTicketAmount, manualLottoNumbers); + } + + public List> manualLottoNumbers(List inputManualNumbers) { + return inputManualNumbers.stream() + .map(StringUtil::split) + .map(this::parseLottoNumbers) + .collect(Collectors.toList()); } - public float getProfitRate(TicketAmount ticketAmount, WinningLottoRank winningLottoRank) { + private List parseLottoNumbers(List inputManualNumbers) { + try { + return inputManualNumbers.stream() + .map(Integer::parseInt) + .collect(Collectors.toList()); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("로또 번호는 1 ~ 45 사이의 숫자를 입력해 주세요."); + } + } + + public float getProfitRate(int totalTicketAmount, WinningLottoRank winningLottoRank) { WinningStatistics winningStatistics = new WinningStatistics(winningLottoRank); - float profitRate = winningStatistics.profitRate(ticketAmount); - return profitRate; + return winningStatistics.profitRate(totalTicketAmount); } - public WinningLottoRank getWinningLottoRank(LottoTickets lottoTickets, List splitWinningNumbers) { - int bonusNumber = Integer.parseInt(InputView.getBonusNumber()); - WinningNumbers winningNumbers = new WinningNumbers(splitWinningNumbers, bonusNumber); - WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); - OutputView.printWinningStatistics(winningLottoRank); - return winningLottoRank; + public WinningLottoRank getWinningLottoRank(LottoTickets lottoTickets, WinningNumbers winningNumbers) { + try { + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + OutputView.printWinningStatistics(winningLottoRank); + return winningLottoRank; + + } catch (NumberFormatException e) { + throw new IllegalArgumentException("로또 번호는 1 ~ 45 사이의 숫자를 입력해 주세요."); + } } } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index b62016f6..bda7d6fb 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,7 +1,5 @@ package lotto.view; -import lotto.domain.vending.TicketAmount; - import java.util.Collections; import java.util.List; import java.util.Scanner; @@ -9,13 +7,14 @@ import java.util.stream.IntStream; public class InputView { - private static final Scanner scanner = new Scanner(System.in); - private static final String BUYING_PRICE_MESSAGE = "구입금액을 입력해 주세요."; - private static final String MANUAL_COUNT_MESSAGE = "수동으로 구매할 로또 수를 입력해 주세요."; - public static final String MANUAL_NUMBER_MESSAGE = "수동으로 구매할 번호를 입력해 주세요."; - private static final String WINNING_NUMBER_MESSAGE = "지난 주 당첨 번호를 입력해 주세요."; + private static final String BUYING_PRICE_MESSAGE = "\n구입금액을 입력해 주세요."; + private static final String MANUAL_COUNT_MESSAGE = "\n수동으로 구매할 로또 수를 입력해 주세요."; + private static final String MANUAL_NUMBER_MESSAGE = "\n수동으로 구매할 번호를 입력해 주세요."; + private static final String WINNING_NUMBER_MESSAGE = "\n지난 주 당첨 번호를 입력해 주세요."; private static final String BONUS_NUMBER_MESSAGE = "보너스 볼을 입력해 주세요."; + private static final Scanner scanner = new Scanner(System.in); + private InputView() { } @@ -29,12 +28,12 @@ public static String getManualCount() { return scanner.nextLine().trim(); } - public static List getManualNumbers(TicketAmount ticketAmount) { - if (ticketAmount.manual() == 0) { - return Collections.emptyList(); + public static List getManualNumbers(int manualTicketAmount) { + if (manualTicketAmount == 0) { + return Collections.emptyList(); } System.out.println(MANUAL_NUMBER_MESSAGE); - return IntStream.range(0, ticketAmount.manual()) + return IntStream.range(0, manualTicketAmount) .mapToObj(i -> scanner.nextLine().trim()) .collect(Collectors.toList()); } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 80749609..b5ea6bf2 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -27,7 +27,7 @@ private static List lottoNumberToString(LottoTicket lottoTicket) { } public static void printTicketAmount(TicketAmount ticketAmount) { - System.out.printf("수동으로 %d장, 자동으로 %d장 구매했습니다.%n", ticketAmount.manual(), ticketAmount.auto()); + System.out.printf("%n수동으로 %d장, 자동으로 %d장 구매했습니다.%n", ticketAmount.manual(), ticketAmount.auto()); } public static void printProfitRate(float profitRate) { @@ -35,7 +35,7 @@ public static void printProfitRate(float profitRate) { } public static void printWinningStatistics(WinningLottoRank winningLottoRank) { - System.out.println("당첨 통계\n---------"); + System.out.println("\n당첨 통계\n---------"); for (LottoRank rank : winningLottoRank.keys()) { String message = (rank == LottoRank.SECOND) ? "%d개 일치, 보너스 볼 일치 (%d원) - %d개%n" : "%d개 일치 (%d원) - %d개%n"; diff --git a/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java b/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java index 4a3b81f7..6e67a144 100644 --- a/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java +++ b/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java @@ -7,7 +7,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class LottoGeneratorTest { +class LottoGeneratorTest { @Test @DisplayName("6개의 로또 번호를 반환한다") diff --git a/src/test/java/lotto/domain/lotto/LottoRankTest.java b/src/test/java/lotto/domain/lotto/LottoRankTest.java index 75f1c30e..4bbdea81 100644 --- a/src/test/java/lotto/domain/lotto/LottoRankTest.java +++ b/src/test/java/lotto/domain/lotto/LottoRankTest.java @@ -6,7 +6,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class LottoRankTest { +class LottoRankTest { @ParameterizedTest @CsvSource(value = {"6, false, FIRST", "5, true, SECOND", "5, false, THIRD", "4, false, FOURTH", "3, false, FIFTH"}) diff --git a/src/test/java/lotto/domain/lotto/LottoTicketTest.java b/src/test/java/lotto/domain/lotto/LottoTicketTest.java index 3f5e0ce1..720af5ca 100644 --- a/src/test/java/lotto/domain/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/domain/lotto/LottoTicketTest.java @@ -6,7 +6,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class LottoTicketTest { +class LottoTicketTest { @Test @DisplayName("로또 넘버 6개를 인자로 받아 로또 티켓 객체를 생성한다") diff --git a/src/test/java/lotto/domain/vending/BuyingPriceTest.java b/src/test/java/lotto/domain/vending/BuyingPriceTest.java index b74dcdc6..d7603889 100644 --- a/src/test/java/lotto/domain/vending/BuyingPriceTest.java +++ b/src/test/java/lotto/domain/vending/BuyingPriceTest.java @@ -6,7 +6,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class BuyingPriceTest { +class BuyingPriceTest { @Test @DisplayName("구입 금액 값 객체를 생성한다") diff --git a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java index 62d02b37..53fae6ad 100644 --- a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java +++ b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java @@ -2,6 +2,7 @@ import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; +import lotto.service.LottoService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -13,18 +14,20 @@ import static org.assertj.core.api.Assertions.assertThat; -public class LottoTicketVendingMachineTest { +class LottoTicketVendingMachineTest { + + private final LottoService lottoService = new LottoService(); + private final LottoTicketVendingMachine vendingMachine = new LottoTicketVendingMachine(); @Test @DisplayName("자동으로 로또 티켓을 생성한다") void auto_issue_tickets() { //given BuyingPrice buyingPrice = new BuyingPrice(5000); - TicketAmount ticketAmount = new TicketAmount(buyingPrice, 0); - LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); + TicketAmount ticketAmount = new TicketAmount(buyingPrice.totalTicketAmount(), 0); //when - List tickets = lottoTicketVendingMachine.autoIssueTickets(ticketAmount); + List tickets = vendingMachine.autoIssueTickets(ticketAmount.auto()); //then assertThat(tickets).hasSize(5); @@ -35,13 +38,12 @@ void auto_issue_tickets() { @DisplayName("수동으로 로또 티켓을 생성한다") void manual_issue_tickets(int index) { //given - BuyingPrice buyingPrice = new BuyingPrice(5000); int manualCount = 3; - LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); - List manualNumbers = generateManualNumbers(manualCount); + List inputManualLottoNumbers = generateManualNumbers(manualCount); + List> manualLottoNumbers = lottoService.manualLottoNumbers(inputManualLottoNumbers); //when - List lottoTickets = lottoTicketVendingMachine.manualIssueTickets(manualNumbers); + List lottoTickets = vendingMachine.manualLottoTickets(manualLottoNumbers); //then assertThat(lottoTickets.get(index).lottoNumbers()).isEqualTo(generateLottoTicket(index).lottoNumbers()); @@ -53,12 +55,12 @@ void total_lotto_tickets() { //given BuyingPrice buyingPrice = new BuyingPrice(8000); int manualCount = 3; - TicketAmount ticketAmount = new TicketAmount(buyingPrice, manualCount); - List manualNumbers = generateManualNumbers(ticketAmount.manual()); + TicketAmount ticketAmount = new TicketAmount(buyingPrice.totalTicketAmount(), manualCount); + List inputManualNumbers = generateManualNumbers(manualCount); + List> manualLottoNumbers = lottoService.manualLottoNumbers(inputManualNumbers); - //when - LottoTicketVendingMachine lottoTicketVendingMachine = new LottoTicketVendingMachine(); - LottoTickets lottoTickets = lottoTicketVendingMachine.issueTickets(ticketAmount, manualNumbers); + //when\ + LottoTickets lottoTickets = vendingMachine.issueTickets(ticketAmount.auto(), manualLottoNumbers); //then assertThat(lottoTickets.size()).isEqualTo(ticketAmount.total()); diff --git a/src/test/java/lotto/domain/vending/TicketAmountTest.java b/src/test/java/lotto/domain/vending/TicketAmountTest.java index 5cc59ce3..937cf61e 100644 --- a/src/test/java/lotto/domain/vending/TicketAmountTest.java +++ b/src/test/java/lotto/domain/vending/TicketAmountTest.java @@ -8,7 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class TicketAmountTest { +class TicketAmountTest { @ParameterizedTest @CsvSource(value = {"5000, 1, 4", "10000, 3, 7", "12000, 2, 10"}) @@ -18,7 +18,7 @@ void ticket_amount(int price, int manualCount, int exceptedAutoCount) { BuyingPrice buyingPrice = new BuyingPrice(price); //when - TicketAmount ticketAmount = new TicketAmount(buyingPrice, manualCount); + TicketAmount ticketAmount = new TicketAmount(buyingPrice.totalTicketAmount(), manualCount); //then assertThat(ticketAmount.manual()).isEqualTo(manualCount); @@ -30,10 +30,12 @@ void ticket_amount(int price, int manualCount, int exceptedAutoCount) { void manual_ticket_amount_more_than_total_amount() { //given BuyingPrice buyingPrice = new BuyingPrice(5000); + int totalTicketAmount = buyingPrice.totalTicketAmount(); int manualTicketCount = 10; //when //then - assertThatThrownBy(() -> new TicketAmount(buyingPrice, manualTicketCount)) + assertThatThrownBy(() -> new TicketAmount(totalTicketAmount, manualTicketCount)) .isInstanceOf(IllegalArgumentException.class); + } } diff --git a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java index e2db7694..bdba79c0 100644 --- a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java +++ b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java @@ -16,7 +16,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class WinningLottoRankTest { +class WinningLottoRankTest { private WinningNumbers generateWinningNumber(int bonusNumber) { List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); diff --git a/src/test/java/lotto/domain/winning/WinningNumbersTest.java b/src/test/java/lotto/domain/winning/WinningNumbersTest.java index 66f705ed..ac73b20e 100644 --- a/src/test/java/lotto/domain/winning/WinningNumbersTest.java +++ b/src/test/java/lotto/domain/winning/WinningNumbersTest.java @@ -8,7 +8,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class WinningNumbersTest { +class WinningNumbersTest { @Test @DisplayName("당첨 번호가 중복되는 경우 예외가 발생한다") void validate_duplication_winning_number() { diff --git a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java index 200bd4cb..1cd0731f 100644 --- a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java +++ b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java @@ -11,10 +11,10 @@ import java.util.Arrays; import java.util.List; -import static lotto.domain.vending.TicketAmount.TICKET_PRICE; +import static lotto.domain.vending.BuyingPrice.TICKET_PRICE; import static org.assertj.core.api.Assertions.assertThat; -public class WinningStatisticsTest { +class WinningStatisticsTest { private WinningNumbers generateWinningNumber(int bonusNumber) { List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); return new WinningNumbers(inputNumbers, bonusNumber); @@ -26,14 +26,14 @@ void profit_rate() { //given LottoTickets lottoTickets = generateLottoTickets(); BuyingPrice buyingPrice = new BuyingPrice(lottoTickets.size() * TICKET_PRICE); - TicketAmount ticketAmount = new TicketAmount(buyingPrice, lottoTickets.size()); + TicketAmount ticketAmount = new TicketAmount(buyingPrice.totalTicketAmount(), lottoTickets.size()); WinningNumbers winningNumbers = generateWinningNumber(45); WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); //when WinningStatistics winningStatistics = new WinningStatistics(winningLottoRank); - float profit = winningStatistics.profitRate(ticketAmount); + float profit = winningStatistics.profitRate(ticketAmount.total()); //then assertThat(profit).isEqualTo(11.0f); From af61ec9750f609ee4b817ab988615b83110d335a Mon Sep 17 00:00:00 2001 From: Chloe Date: Tue, 3 Aug 2021 22:29:33 +0900 Subject: [PATCH 17/22] =?UTF-8?q?refactor=20:=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=9D=BC=EC=B9=98=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20WinningLottoRank=20->=20WinningNumbers=20?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/winning/WinningLottoRank.java | 12 +--- .../lotto/domain/winning/WinningNumbers.java | 26 ++++----- .../domain/winning/WinningLottoRankTest.java | 55 ++----------------- .../domain/winning/WinningNumbersTest.java | 51 +++++++++++++++++ 4 files changed, 70 insertions(+), 74 deletions(-) diff --git a/src/main/java/lotto/domain/winning/WinningLottoRank.java b/src/main/java/lotto/domain/winning/WinningLottoRank.java index 5d9c3d0c..62f4891f 100644 --- a/src/main/java/lotto/domain/winning/WinningLottoRank.java +++ b/src/main/java/lotto/domain/winning/WinningLottoRank.java @@ -30,18 +30,8 @@ private void groupByWinningCount(LottoTickets lottoTickets) { winningLottoRank.remove(LottoRank.LOSE); } - public int hitCount(LottoTicket lottoTicket) { - return (int) winningNumbers.getWinningNumbers().stream() - .filter(lottoTicket::contains) - .count(); - } - - public boolean hitBonus(LottoTicket lottoTicket) { - return lottoTicket.contains(winningNumbers.getBonusNumber()); - } - private void addWinningCount(LottoTicket lottoTicket) { - LottoRank key = LottoRank.findBy(hitCount(lottoTicket), hitBonus(lottoTicket)); + LottoRank key = LottoRank.findBy(winningNumbers.hitCount(lottoTicket), winningNumbers.hitBonus(lottoTicket)); winningLottoRank.put(key, winningLottoRank.get(key) + 1); } diff --git a/src/main/java/lotto/domain/winning/WinningNumbers.java b/src/main/java/lotto/domain/winning/WinningNumbers.java index e9eac531..c8ddaac3 100644 --- a/src/main/java/lotto/domain/winning/WinningNumbers.java +++ b/src/main/java/lotto/domain/winning/WinningNumbers.java @@ -1,21 +1,22 @@ package lotto.domain.winning; import lotto.domain.lotto.LottoNumber; +import lotto.domain.lotto.LottoTicket; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -public class WinningNumbers { - private static final int WINNING_NUMBER_SIZE = 6; +import static lotto.domain.lotto.LottoTicket.LOTTO_NUMBER_SIZE; +public class WinningNumbers { private final List winningNumbers; private final LottoNumber bonusNumber; public WinningNumbers(List winningNumbers, LottoNumber bonusNumber) { validateSize(winningNumbers.size()); - validateDuplication(winningNumbers, bonusNumber); + validateDuplication(new HashSet<>(winningNumbers), bonusNumber); this.winningNumbers = winningNumbers; this.bonusNumber = bonusNumber; } @@ -27,25 +28,24 @@ public WinningNumbers(List winningNumbers, int bonusNumber) { } private void validateSize(int winningNumberSize) { - if (winningNumberSize > WINNING_NUMBER_SIZE) { + if (winningNumberSize != LOTTO_NUMBER_SIZE) { throw new IllegalArgumentException("수동 로또 번호 입력 개수는 6개 입니다."); } } - private void validateDuplication(List winningNumbers, LottoNumber bonusNumber) { - Set lottoNumbers = new HashSet<>(winningNumbers); - - if (lottoNumbers.size() < WINNING_NUMBER_SIZE || winningNumbers.contains(bonusNumber)) { + private void validateDuplication(Set winningNumbers, LottoNumber bonusNumber) { + if (winningNumbers.size() < LOTTO_NUMBER_SIZE || winningNumbers.contains(bonusNumber)) { throw new IllegalArgumentException("당첨 번호가 중복됩니다."); } } - public List getWinningNumbers() { - return winningNumbers; + public int hitCount(LottoTicket lottoTicket) { + return (int) winningNumbers.stream() + .filter(lottoTicket::contains) + .count(); } - public LottoNumber getBonusNumber() { - return bonusNumber; + public boolean hitBonus(LottoTicket lottoTicket) { + return lottoTicket.contains(bonusNumber); } - } diff --git a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java index bdba79c0..36e91a9e 100644 --- a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java +++ b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java @@ -17,44 +17,6 @@ import static org.assertj.core.api.Assertions.assertThat; class WinningLottoRankTest { - - private WinningNumbers generateWinningNumber(int bonusNumber) { - List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); - return new WinningNumbers(inputNumbers, bonusNumber); - } - - @ParameterizedTest - @MethodSource("hitLottoNumbers") - @DisplayName("당첨 번호와 일치하는 로또 번호 개수를 반환한다") - void hit_winning_numbers_count(LottoTicket lottoTicket, int expectedCount) { - //given - LottoTickets lottoTickets = new LottoTickets(lottoTicket); - WinningNumbers winningNumbers = generateWinningNumber(45); - - //when - WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); - int hitCount = winningLottoRank.hitCount(lottoTicket); - - //then - assertThat(hitCount).isEqualTo(expectedCount); - } - - @Test - @DisplayName("보너스 번호 일치하는 로또 번호 개수를 반환한다") - void hit_bonus_number_count() { - //given - LottoTicket lottoTicket = new LottoTicket(5, 10, 15, 20, 25, 30); - LottoTickets lottoTickets = new LottoTickets(lottoTicket); - WinningNumbers winningNumbers = generateWinningNumber(30); - - //when - WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); - boolean isBonus = winningLottoRank.hitBonus(lottoTicket); - - //then - assertThat(isBonus).isTrue(); - } - @Test @DisplayName("당첨 번호 개수가 같은 로또 티켓 개수를 반환한다") void group_by_rank_count() { @@ -101,6 +63,11 @@ void not_matched_bonus_tickets(LottoTicket lottoTicket, LottoRank lottoRank) { assertThat(winningLottoRank.count(lottoRank)).isEqualTo(1); } + private WinningNumbers generateWinningNumber(int bonusNumber) { + List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + return new WinningNumbers(inputNumbers, bonusNumber); + } + private LottoTickets generateLottoTickets() { List lottoTickets = new ArrayList<>(); lottoTickets.add(new LottoTicket(3, 4, 5, 6, 7, 8)); // 4개 일치 @@ -111,18 +78,6 @@ private LottoTickets generateLottoTickets() { return new LottoTickets(lottoTickets); } - private static Stream hitLottoNumbers() { - return Stream.of( - Arguments.of(new LottoTicket(1, 2, 3, 4, 5, 6), 6), - Arguments.of(new LottoTicket(2, 3, 4, 5, 6, 7), 5), - Arguments.of(new LottoTicket(3, 4, 5, 6, 7, 8), 4), - Arguments.of(new LottoTicket(4, 5, 6, 7, 8, 9), 3), - Arguments.of(new LottoTicket(5, 6, 7, 8, 9, 10), 2), - Arguments.of(new LottoTicket(6, 7, 8, 9, 10, 11), 1), - Arguments.of(new LottoTicket(7, 8, 9, 10, 11, 12), 0) - ); - } - private static Stream matchedBonusTickets() { return Stream.of( Arguments.of(new LottoTicket(1, 2, 3, 4, 5, 6), LottoRank.FIRST), diff --git a/src/test/java/lotto/domain/winning/WinningNumbersTest.java b/src/test/java/lotto/domain/winning/WinningNumbersTest.java index ac73b20e..fca8f6e1 100644 --- a/src/test/java/lotto/domain/winning/WinningNumbersTest.java +++ b/src/test/java/lotto/domain/winning/WinningNumbersTest.java @@ -1,11 +1,17 @@ package lotto.domain.winning; +import lotto.domain.lotto.LottoTicket; 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.Arrays; import java.util.List; +import java.util.stream.Stream; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; class WinningNumbersTest { @@ -32,4 +38,49 @@ void validate_duplication_bonus_number() { assertThatThrownBy(() -> new WinningNumbers(inputNumbers, bonusNumber)) .isInstanceOf(IllegalArgumentException.class); } + + @ParameterizedTest + @MethodSource("hitLottoNumbers") + @DisplayName("당첨 번호와 일치하는 로또 번호 개수를 반환한다") + void hit_winning_numbers_count(LottoTicket lottoTicket, int expectedCount) { + //given + WinningNumbers winningNumbers = generateWinningNumber(45); + + //when + int hitCount = winningNumbers.hitCount(lottoTicket); + + //then + assertThat(hitCount).isEqualTo(expectedCount); + } + + @Test + @DisplayName("보너스 번호 일치하는 로또 번호 개수를 반환한다") + void hit_bonus_number_count() { + //given + LottoTicket lottoTicket = new LottoTicket(5, 10, 15, 20, 25, 30); + WinningNumbers winningNumbers = generateWinningNumber(30); + + //when + boolean isBonus = winningNumbers.hitBonus(lottoTicket); + + //then + assertThat(isBonus).isTrue(); + } + + private WinningNumbers generateWinningNumber(int bonusNumber) { + List inputNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + return new WinningNumbers(inputNumbers, bonusNumber); + } + + private static Stream hitLottoNumbers() { + return Stream.of( + Arguments.of(new LottoTicket(1, 2, 3, 4, 5, 6), 6), + Arguments.of(new LottoTicket(2, 3, 4, 5, 6, 7), 5), + Arguments.of(new LottoTicket(3, 4, 5, 6, 7, 8), 4), + Arguments.of(new LottoTicket(4, 5, 6, 7, 8, 9), 3), + Arguments.of(new LottoTicket(5, 6, 7, 8, 9, 10), 2), + Arguments.of(new LottoTicket(6, 7, 8, 9, 10, 11), 1), + Arguments.of(new LottoTicket(7, 8, 9, 10, 11, 12), 0) + ); + } } From 75f5df1456d8c91f9e7131032b3997ca9879ed0c Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 18 Aug 2021 03:27:18 +0900 Subject: [PATCH 18/22] =?UTF-8?q?refactor=20:=20LottoNumber=20=EC=BA=90?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/domain/lotto/LottoGenerator.java | 32 ---------------- .../java/lotto/domain/lotto/LottoNumber.java | 38 +++++++++---------- .../java/lotto/domain/lotto/LottoTicket.java | 31 +++++++++------ .../vending/LottoTicketVendingMachine.java | 28 +++++++++----- .../lotto/domain/winning/WinningNumbers.java | 4 +- .../domain/lotto/LottoGeneratorTest.java | 24 ------------ .../lotto/domain/lotto/LottoNumberTest.java | 6 +-- .../LottoTicketVendingMachineTest.java | 32 +++++++++++----- 8 files changed, 83 insertions(+), 112 deletions(-) delete mode 100644 src/main/java/lotto/domain/lotto/LottoGenerator.java delete mode 100644 src/test/java/lotto/domain/lotto/LottoGeneratorTest.java diff --git a/src/main/java/lotto/domain/lotto/LottoGenerator.java b/src/main/java/lotto/domain/lotto/LottoGenerator.java deleted file mode 100644 index 457eab1e..00000000 --- a/src/main/java/lotto/domain/lotto/LottoGenerator.java +++ /dev/null @@ -1,32 +0,0 @@ -package lotto.domain.lotto; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static lotto.domain.lotto.LottoNumber.MAX_LOTTO_BOUND; -import static lotto.domain.lotto.LottoNumber.MIN_LOTTO_BOUND; -import static lotto.domain.lotto.LottoTicket.LOTTO_NUMBER_SIZE; - -public class LottoGenerator { - private final List lottoNumberBox; - - public LottoGenerator() { - this.lottoNumberBox = create(); - Collections.shuffle(lottoNumberBox); - } - - private List create() { - return IntStream.rangeClosed(MIN_LOTTO_BOUND, MAX_LOTTO_BOUND) - .mapToObj(LottoNumber::new) - .collect(Collectors.toList()); - } - - public List issueAutoLottoNumbers() { - return lottoNumberBox.subList(0, LOTTO_NUMBER_SIZE).stream() - .sorted(Comparator.comparing(LottoNumber::value)) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/lotto/domain/lotto/LottoNumber.java b/src/main/java/lotto/domain/lotto/LottoNumber.java index 07d51614..d65bf67c 100644 --- a/src/main/java/lotto/domain/lotto/LottoNumber.java +++ b/src/main/java/lotto/domain/lotto/LottoNumber.java @@ -1,38 +1,36 @@ package lotto.domain.lotto; -import java.util.Objects; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class LottoNumber { public static final int MIN_LOTTO_BOUND = 1; public static final int MAX_LOTTO_BOUND = 45; + private static final Map LOTTO_NUMBER_BOX = generate(); private final int lottoNumber; - public LottoNumber(final int lottoNumber) { - validateBound(lottoNumber); + private LottoNumber(int lottoNumber) { this.lottoNumber = lottoNumber; } - private void validateBound(int lottoNumber) { - if (lottoNumber < MIN_LOTTO_BOUND || lottoNumber > MAX_LOTTO_BOUND) { - throw new IllegalArgumentException("로또 번호는 1 ~ 45 까지 입니다."); - } + public static LottoNumber from(int number) { + Optional lottoNumber = Optional.ofNullable(LOTTO_NUMBER_BOX.get(number)); + return lottoNumber.orElseThrow(() -> new IllegalArgumentException("로또 번호는 1 ~ 45 까지 입니다.")); } - public int value() { - 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; + private static Map generate() { + return IntStream.rangeClosed(MIN_LOTTO_BOUND, MAX_LOTTO_BOUND) + .mapToObj(LottoNumber::new) + .collect(Collectors.toMap( + LottoNumber::value, Function.identity() + )); } - @Override - public int hashCode() { - return Objects.hash(lottoNumber); + public int value() { + return lottoNumber; } } diff --git a/src/main/java/lotto/domain/lotto/LottoTicket.java b/src/main/java/lotto/domain/lotto/LottoTicket.java index 4cab55e3..7bf0c74c 100644 --- a/src/main/java/lotto/domain/lotto/LottoTicket.java +++ b/src/main/java/lotto/domain/lotto/LottoTicket.java @@ -1,43 +1,50 @@ package lotto.domain.lotto; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import java.util.stream.Collectors; public class LottoTicket { public static final int LOTTO_NUMBER_SIZE = 6; - private final List lottoNumbers; + private final Set lottoNumbers; - public LottoTicket(final List lottoNumbers) { + private LottoTicket(Set lottoNumbers) { validation(lottoNumbers); - this.lottoNumbers = new ArrayList<>(lottoNumbers); + this.lottoNumbers = lottoNumbers; } public LottoTicket(int... lottoNumbers) { this(Arrays.stream(lottoNumbers) - .mapToObj(LottoNumber::new) - .collect(Collectors.toList())); + .mapToObj(LottoNumber::from) + .collect(Collectors.toSet())); } - private void validation(List lottoNumbers) { + public static LottoTicket from(Set lottoNumbers) { + return new LottoTicket(lottoNumbers); + } + + private static void validation(Set lottoNumbers) { validateSize(lottoNumbers); validateDuplication(new HashSet<>(lottoNumbers)); } - private void validateSize(List lottoNumberSet) { - if (lottoNumberSet.size() != LOTTO_NUMBER_SIZE) { + private static void validateSize(Set lottoNumberSet) { + if (lottoNumberSet.size() > LOTTO_NUMBER_SIZE) { throw new IllegalArgumentException("로또 번호는 6개 입니다."); } } - private void validateDuplication(Set lottoNumberSet) { + private static void validateDuplication(Set lottoNumberSet) { if (lottoNumberSet.size() < LOTTO_NUMBER_SIZE) { throw new IllegalArgumentException("로또 번호가 중복됩니다."); } } - public List lottoNumbers() { - return Collections.unmodifiableList(lottoNumbers); + public Set lottoNumbers() { + return Collections.unmodifiableSet(lottoNumbers); } public boolean contains(LottoNumber lottoNumber) { diff --git a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java index 412c7635..26f57949 100644 --- a/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java +++ b/src/main/java/lotto/domain/vending/LottoTicketVendingMachine.java @@ -1,20 +1,18 @@ package lotto.domain.vending; -import lotto.domain.lotto.LottoGenerator; import lotto.domain.lotto.LottoNumber; import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; import java.util.List; +import java.util.Random; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; -public class LottoTicketVendingMachine { - private final LottoGenerator lottoGenerator; +import static lotto.domain.lotto.LottoTicket.LOTTO_NUMBER_SIZE; - public LottoTicketVendingMachine() { - this.lottoGenerator = new LottoGenerator(); - } +public class LottoTicketVendingMachine { public LottoTickets issueTickets(int autoTicketAmount, List> manualLottoNumbers) { LottoTickets lottoTickets = new LottoTickets(); @@ -25,15 +23,25 @@ public LottoTickets issueTickets(int autoTicketAmount, List> manua public List autoIssueTickets(int autoTicketAmount) { return IntStream.range(0, autoTicketAmount) - .mapToObj(i -> lottoGenerator.issueAutoLottoNumbers()) - .map(LottoTicket::new) + .mapToObj(i -> issueAutoLottoNumbers()) + .map(LottoTicket::from) .collect(Collectors.toList()); } + public Set issueAutoLottoNumbers() { + return new Random().ints(1, 46) + .distinct() + .limit(LOTTO_NUMBER_SIZE) + .mapToObj(LottoNumber::from) + .collect(Collectors.toSet()); + } + public List manualLottoTickets(List> manualLottoNumbers) { return manualLottoNumbers.stream() - .map(manualNumbers -> manualNumbers.stream().map(LottoNumber::new).collect(Collectors.toList())) - .map(LottoTicket::new) + .map(manualNumbers -> manualNumbers.stream() + .map(LottoNumber::from) + .collect(Collectors.toSet())) + .map(LottoTicket::from) .collect(Collectors.toList()); } } diff --git a/src/main/java/lotto/domain/winning/WinningNumbers.java b/src/main/java/lotto/domain/winning/WinningNumbers.java index c8ddaac3..222b2daa 100644 --- a/src/main/java/lotto/domain/winning/WinningNumbers.java +++ b/src/main/java/lotto/domain/winning/WinningNumbers.java @@ -23,8 +23,8 @@ public WinningNumbers(List winningNumbers, LottoNumber bonusNumber) public WinningNumbers(List winningNumbers, int bonusNumber) { this(winningNumbers.stream() - .map(LottoNumber::new) - .collect(Collectors.toList()), new LottoNumber(bonusNumber)); + .map(LottoNumber::from) + .collect(Collectors.toList()), LottoNumber.from(bonusNumber)); } private void validateSize(int winningNumberSize) { diff --git a/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java b/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java deleted file mode 100644 index 6e67a144..00000000 --- a/src/test/java/lotto/domain/lotto/LottoGeneratorTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package lotto.domain.lotto; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -class LottoGeneratorTest { - - @Test - @DisplayName("6개의 로또 번호를 반환한다") - void lotto_generator() { - //given - LottoGenerator lottoGenerator = new LottoGenerator(); - - //when - List lottoNumbers = lottoGenerator.issueAutoLottoNumbers(); - - //then - assertThat(lottoNumbers).hasSize(6); - } -} diff --git a/src/test/java/lotto/domain/lotto/LottoNumberTest.java b/src/test/java/lotto/domain/lotto/LottoNumberTest.java index 0e62e32f..fefdb14c 100644 --- a/src/test/java/lotto/domain/lotto/LottoNumberTest.java +++ b/src/test/java/lotto/domain/lotto/LottoNumberTest.java @@ -14,10 +14,10 @@ class LottoNumberTest { @DisplayName("로또 번호 값 객체를 생성한다") void create() { //given - LottoNumber lottoNumber = new LottoNumber(1); + LottoNumber lottoNumber = LottoNumber.from(1); //when //then - assertThat(lottoNumber).isEqualTo(new LottoNumber(1)); + assertThat(lottoNumber).isEqualTo(LottoNumber.from(1)); } @ParameterizedTest() @@ -25,7 +25,7 @@ void create() { @DisplayName("로또 번호가 1 ~ 45이 아닐 경우 예외가 발생한다") void validate_lotto_number(int invalidLottoNumber) { //given //when //then - assertThatThrownBy(() -> new LottoNumber(invalidLottoNumber)) + assertThatThrownBy(() -> LottoNumber.from(invalidLottoNumber)) .isInstanceOf(IllegalArgumentException.class); } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java index 53fae6ad..d8916f41 100644 --- a/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java +++ b/src/test/java/lotto/domain/vending/LottoTicketVendingMachineTest.java @@ -1,5 +1,6 @@ package lotto.domain.vending; +import lotto.domain.lotto.LottoNumber; import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; import lotto.service.LottoService; @@ -8,7 +9,9 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -19,6 +22,18 @@ class LottoTicketVendingMachineTest { private final LottoService lottoService = new LottoService(); private final LottoTicketVendingMachine vendingMachine = new LottoTicketVendingMachine(); + @Test + @DisplayName("6개의 로또 번호를 반환한다") + void lotto_generator() { + //given + + //when + Set lottoNumbers = vendingMachine.issueAutoLottoNumbers(); + + //then + assertThat(lottoNumbers).hasSize(6); + } + @Test @DisplayName("자동으로 로또 티켓을 생성한다") void auto_issue_tickets() { @@ -39,16 +54,16 @@ void auto_issue_tickets() { void manual_issue_tickets(int index) { //given int manualCount = 3; - List inputManualLottoNumbers = generateManualNumbers(manualCount); - List> manualLottoNumbers = lottoService.manualLottoNumbers(inputManualLottoNumbers); + List> manualNumbers = generateManualNumbers(manualCount); //when - List lottoTickets = vendingMachine.manualLottoTickets(manualLottoNumbers); + List lottoTickets = vendingMachine.manualLottoTickets(manualNumbers); //then assertThat(lottoTickets.get(index).lottoNumbers()).isEqualTo(generateLottoTicket(index).lottoNumbers()); } + @Test @DisplayName("전체 로또 티켓을 생성한다") void total_lotto_tickets() { @@ -56,19 +71,18 @@ void total_lotto_tickets() { BuyingPrice buyingPrice = new BuyingPrice(8000); int manualCount = 3; TicketAmount ticketAmount = new TicketAmount(buyingPrice.totalTicketAmount(), manualCount); - List inputManualNumbers = generateManualNumbers(manualCount); - List> manualLottoNumbers = lottoService.manualLottoNumbers(inputManualNumbers); + List> manualNumbers = generateManualNumbers(manualCount); - //when\ - LottoTickets lottoTickets = vendingMachine.issueTickets(ticketAmount.auto(), manualLottoNumbers); + //when + LottoTickets lottoTickets = vendingMachine.issueTickets(ticketAmount.auto(), manualNumbers); //then assertThat(lottoTickets.size()).isEqualTo(ticketAmount.total()); } - private List generateManualNumbers(int manualCount) { + private List> generateManualNumbers(int manualCount) { return IntStream.range(0, manualCount) - .mapToObj(i -> String.format("%d, %d, %d, %d, %d, %d", i + 1, i + 2, i + 3, i + 4, i + 5, i + 6)) + .mapToObj(i -> Arrays.asList(i + 1, i + 2, i + 3, i + 4, i + 5, i + 6)) .collect(Collectors.toList()); } From 491f190a1851325b70da619cd7e9d01c24e22ff7 Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 18 Aug 2021 04:07:06 +0900 Subject: [PATCH 19/22] =?UTF-8?q?refactor=20:=20LottoService,=20LottoContr?= =?UTF-8?q?oller,=20StringUtil=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 23 +++++----- .../java/lotto/domain/util/StringUtil.java | 24 ----------- src/main/java/lotto/service/LottoService.java | 35 +++------------ src/main/java/lotto/util/StringUtil.java | 43 +++++++++++++++++++ 4 files changed, 60 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/lotto/domain/util/StringUtil.java create mode 100644 src/main/java/lotto/util/StringUtil.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 29427071..5b4cfcd7 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,15 +1,16 @@ package lotto.controller; import lotto.domain.lotto.LottoTickets; -import lotto.domain.util.StringUtil; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.TicketAmount; import lotto.domain.winning.WinningLottoRank; import lotto.domain.winning.WinningNumbers; import lotto.service.LottoService; +import lotto.util.StringUtil; import lotto.view.InputView; import java.util.List; +import java.util.stream.Collectors; public class LottoController { private final LottoService lottoService = new LottoService(); @@ -17,6 +18,7 @@ public class LottoController { public BuyingPrice getBuyingPrice(String price) throws NumberFormatException { try { return new BuyingPrice(Integer.parseInt(price)); + } catch (NumberFormatException e) { throw new IllegalArgumentException("구매 금액은 숫자로 입력해 주세요."); } @@ -27,26 +29,25 @@ public TicketAmount getTicketAmount(int totalTicketAmount, String manualTicketAm return new TicketAmount(totalTicketAmount, Integer.parseInt(manualTicketAmount)); } catch (NumberFormatException e) { - throw new IllegalArgumentException("수동 티켓 개수는 숫자로 입력해 주세요."); + throw new IllegalArgumentException("수동으로 구매할 티켓 개수를 확인해 주세요."); } } public LottoTickets issueTickets(TicketAmount ticketAmount) { List inputManualNumbers = InputView.getManualNumbers(ticketAmount.manual()); - return lottoService.issueTickets(ticketAmount.auto(), inputManualNumbers); + List> manualNumbers = inputManualNumbers.stream() + .map(StringUtil::splitParseInt) + .collect(Collectors.toList()); + return lottoService.issueTickets(ticketAmount.auto(), manualNumbers); } public WinningNumbers validateWinningLottoNumbers(String inputWinningNumbers, String inputBonusNumber) { - try { - List splitWinningNumbers = StringUtil.splitParseInt(inputWinningNumbers); - int bonusNumber = Integer.parseInt(inputBonusNumber); - return new WinningNumbers(splitWinningNumbers, bonusNumber); - - } catch (NumberFormatException e) { - throw new IllegalArgumentException("수동 로또 번호는은 숫자로 입력해 주세요."); - } + List splitWinningNumbers = StringUtil.splitParseInt(inputWinningNumbers); + int bonusNumber = StringUtil.parseInt(inputBonusNumber); + return new WinningNumbers(splitWinningNumbers, bonusNumber); } + public float calculateProfitRate(int totalTicketAmount, LottoTickets lottoTickets, WinningNumbers winningNumbers) { WinningLottoRank winningLottoRank = lottoService.getWinningLottoRank(lottoTickets, winningNumbers); return lottoService.getProfitRate(totalTicketAmount, winningLottoRank); diff --git a/src/main/java/lotto/domain/util/StringUtil.java b/src/main/java/lotto/domain/util/StringUtil.java deleted file mode 100644 index 4bed3e75..00000000 --- a/src/main/java/lotto/domain/util/StringUtil.java +++ /dev/null @@ -1,24 +0,0 @@ -package lotto.domain.util; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class StringUtil { - public static final String DELIMITER = ","; - - private StringUtil() { - } - - public static List split(String input) { - return Arrays.stream(input.split(DELIMITER)) - .map(String::trim) - .collect(Collectors.toList()); - } - - public static List splitParseInt(String input) { - return split(input).stream() - .map(Integer::parseInt) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 829e7cc2..aa88f8a9 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -1,7 +1,6 @@ package lotto.service; import lotto.domain.lotto.LottoTickets; -import lotto.domain.util.StringUtil; import lotto.domain.vending.LottoTicketVendingMachine; import lotto.domain.winning.WinningLottoRank; import lotto.domain.winning.WinningNumbers; @@ -9,7 +8,6 @@ import lotto.view.OutputView; import java.util.List; -import java.util.stream.Collectors; public class LottoService { private final LottoTicketVendingMachine vendingMachine; @@ -18,26 +16,8 @@ public LottoService() { this.vendingMachine = new LottoTicketVendingMachine(); } - public LottoTickets issueTickets(int autoTicketAmount, List inputManualNumbers) { - List> manualLottoNumbers = manualLottoNumbers(inputManualNumbers); - return vendingMachine.issueTickets(autoTicketAmount, manualLottoNumbers); - } - - public List> manualLottoNumbers(List inputManualNumbers) { - return inputManualNumbers.stream() - .map(StringUtil::split) - .map(this::parseLottoNumbers) - .collect(Collectors.toList()); - } - - private List parseLottoNumbers(List inputManualNumbers) { - try { - return inputManualNumbers.stream() - .map(Integer::parseInt) - .collect(Collectors.toList()); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("로또 번호는 1 ~ 45 사이의 숫자를 입력해 주세요."); - } + public LottoTickets issueTickets(int autoTicketAmount, List> manualNumbers) { + return vendingMachine.issueTickets(autoTicketAmount, manualNumbers); } public float getProfitRate(int totalTicketAmount, WinningLottoRank winningLottoRank) { @@ -46,13 +26,8 @@ public float getProfitRate(int totalTicketAmount, WinningLottoRank winningLottoR } public WinningLottoRank getWinningLottoRank(LottoTickets lottoTickets, WinningNumbers winningNumbers) { - try { - WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); - OutputView.printWinningStatistics(winningLottoRank); - return winningLottoRank; - - } catch (NumberFormatException e) { - throw new IllegalArgumentException("로또 번호는 1 ~ 45 사이의 숫자를 입력해 주세요."); - } + WinningLottoRank winningLottoRank = new WinningLottoRank(lottoTickets, winningNumbers); + OutputView.printWinningStatistics(winningLottoRank); + return winningLottoRank; } } diff --git a/src/main/java/lotto/util/StringUtil.java b/src/main/java/lotto/util/StringUtil.java new file mode 100644 index 00000000..0dd5939c --- /dev/null +++ b/src/main/java/lotto/util/StringUtil.java @@ -0,0 +1,43 @@ +package lotto.util; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class StringUtil { + public static final String DELIMITER = ","; + public static final int LOTTO_NUMBER_SIZE = 6; + + private StringUtil() { + } + + public static List split(String input) { + List splitStrings = Arrays.stream(input.split(DELIMITER)) + .map(String::trim) + .collect(Collectors.toList()); + if (splitStrings.size() > LOTTO_NUMBER_SIZE) { + throw new IllegalArgumentException("로또 번호는 6개 입니다."); + } + return splitStrings; + } + + public static int parseInt(String input) { + try { + return Integer.parseInt(input); + + } catch (NumberFormatException e) { + throw new IllegalArgumentException("로또 번호는 1 ~ 45 사이의 숫자를 입력해 주세요."); + } + } + + public static List splitParseInt(String input) { + try { + return split(input).stream() + .map(Integer::parseInt) + .collect(Collectors.toList()); + + } catch (NumberFormatException e) { + throw new IllegalArgumentException("로또 번호는 1 ~ 45 사이의 숫자를 입력해 주세요."); + } + } +} From a01d40a1ad1e2dda58b9377fd9723926b1bbee19 Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 18 Aug 2021 04:09:59 +0900 Subject: [PATCH 20/22] =?UTF-8?q?style=20:=20rank=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20Rank=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/LottoController.java | 2 +- src/main/java/lotto/domain/{lotto => rank}/LottoRank.java | 2 +- .../java/lotto/domain/{winning => rank}/WinningLottoRank.java | 4 ++-- src/main/java/lotto/domain/winning/WinningStatistics.java | 2 ++ src/main/java/lotto/service/LottoService.java | 2 +- src/main/java/lotto/view/OutputView.java | 4 ++-- src/test/java/lotto/domain/lotto/LottoRankTest.java | 1 + src/test/java/lotto/domain/winning/WinningLottoRankTest.java | 3 ++- src/test/java/lotto/domain/winning/WinningStatisticsTest.java | 1 + 9 files changed, 13 insertions(+), 8 deletions(-) rename src/main/java/lotto/domain/{lotto => rank}/LottoRank.java (96%) rename src/main/java/lotto/domain/{winning => rank}/WinningLottoRank.java (95%) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 5b4cfcd7..fb2c94f7 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,9 +1,9 @@ package lotto.controller; import lotto.domain.lotto.LottoTickets; +import lotto.domain.rank.WinningLottoRank; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.TicketAmount; -import lotto.domain.winning.WinningLottoRank; import lotto.domain.winning.WinningNumbers; import lotto.service.LottoService; import lotto.util.StringUtil; diff --git a/src/main/java/lotto/domain/lotto/LottoRank.java b/src/main/java/lotto/domain/rank/LottoRank.java similarity index 96% rename from src/main/java/lotto/domain/lotto/LottoRank.java rename to src/main/java/lotto/domain/rank/LottoRank.java index 9af4a353..1f1a7855 100644 --- a/src/main/java/lotto/domain/lotto/LottoRank.java +++ b/src/main/java/lotto/domain/rank/LottoRank.java @@ -1,4 +1,4 @@ -package lotto.domain.lotto; +package lotto.domain.rank; import java.util.Arrays; diff --git a/src/main/java/lotto/domain/winning/WinningLottoRank.java b/src/main/java/lotto/domain/rank/WinningLottoRank.java similarity index 95% rename from src/main/java/lotto/domain/winning/WinningLottoRank.java rename to src/main/java/lotto/domain/rank/WinningLottoRank.java index 62f4891f..f6abf382 100644 --- a/src/main/java/lotto/domain/winning/WinningLottoRank.java +++ b/src/main/java/lotto/domain/rank/WinningLottoRank.java @@ -1,8 +1,8 @@ -package lotto.domain.winning; +package lotto.domain.rank; -import lotto.domain.lotto.LottoRank; import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; +import lotto.domain.winning.WinningNumbers; import java.util.Arrays; import java.util.LinkedHashMap; diff --git a/src/main/java/lotto/domain/winning/WinningStatistics.java b/src/main/java/lotto/domain/winning/WinningStatistics.java index d5defaf5..87db4ecf 100644 --- a/src/main/java/lotto/domain/winning/WinningStatistics.java +++ b/src/main/java/lotto/domain/winning/WinningStatistics.java @@ -1,5 +1,7 @@ package lotto.domain.winning; +import lotto.domain.rank.WinningLottoRank; + import static lotto.domain.vending.BuyingPrice.TICKET_PRICE; public class WinningStatistics { diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index aa88f8a9..573a3357 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -1,8 +1,8 @@ package lotto.service; import lotto.domain.lotto.LottoTickets; +import lotto.domain.rank.WinningLottoRank; import lotto.domain.vending.LottoTicketVendingMachine; -import lotto.domain.winning.WinningLottoRank; import lotto.domain.winning.WinningNumbers; import lotto.domain.winning.WinningStatistics; import lotto.view.OutputView; diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index b5ea6bf2..f5b872e7 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,10 +1,10 @@ package lotto.view; -import lotto.domain.lotto.LottoRank; import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; +import lotto.domain.rank.LottoRank; +import lotto.domain.rank.WinningLottoRank; import lotto.domain.vending.TicketAmount; -import lotto.domain.winning.WinningLottoRank; import java.util.List; import java.util.stream.Collectors; diff --git a/src/test/java/lotto/domain/lotto/LottoRankTest.java b/src/test/java/lotto/domain/lotto/LottoRankTest.java index 4bbdea81..8cbd1f2c 100644 --- a/src/test/java/lotto/domain/lotto/LottoRankTest.java +++ b/src/test/java/lotto/domain/lotto/LottoRankTest.java @@ -1,5 +1,6 @@ package lotto.domain.lotto; +import lotto.domain.rank.LottoRank; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java index 36e91a9e..5a7806dc 100644 --- a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java +++ b/src/test/java/lotto/domain/winning/WinningLottoRankTest.java @@ -1,8 +1,9 @@ package lotto.domain.winning; -import lotto.domain.lotto.LottoRank; import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; +import lotto.domain.rank.LottoRank; +import lotto.domain.rank.WinningLottoRank; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java index 1cd0731f..76b3c42f 100644 --- a/src/test/java/lotto/domain/winning/WinningStatisticsTest.java +++ b/src/test/java/lotto/domain/winning/WinningStatisticsTest.java @@ -2,6 +2,7 @@ import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; +import lotto.domain.rank.WinningLottoRank; import lotto.domain.vending.BuyingPrice; import lotto.domain.vending.TicketAmount; import org.junit.jupiter.api.DisplayName; From db7c747a54b8825f0798e97eea1aff79aab06d38 Mon Sep 17 00:00:00 2001 From: Chloe Date: Fri, 20 Aug 2021 10:03:56 +0900 Subject: [PATCH 21/22] =?UTF-8?q?refactor=20:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99,=20Rank=202=EB=93=B1=EC=9D=B8=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++++++++--------- src/main/java/lotto/domain/rank/LottoRank.java | 6 +++--- src/main/java/lotto/view/OutputView.java | 2 +- .../domain/{lotto => rank}/LottoRankTest.java | 3 +-- .../WinningLottoRankTest.java | 5 ++--- 5 files changed, 16 insertions(+), 18 deletions(-) rename src/test/java/lotto/domain/{lotto => rank}/LottoRankTest.java (91%) rename src/test/java/lotto/domain/{winning => rank}/WinningLottoRankTest.java (97%) diff --git a/README.md b/README.md index 39e2ad1e..10802ddf 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,23 @@ - [x] 입력 - [x] 구입 금액을 입력한다. - [x] 수동으로 구매할 로또 수를 입력한다. - - [x] 수동으로 구매할 번호를 입력한다. + - [x] 수동으로 구매할 번호를 입력한다. - [x] 지난 주 당첨 번호를 입력한다. - [x] 보너스 볼을 입력한다. - [x] 출력 - - [x] 구입 금액에 따라 수동 구매 장수와 자동 구매 장수를 출력한다. + - [x] 구입 금액에 따라 수동 구매 장수와 자동 구매 장수를 출력한다. - [x] 구매 금액에 따른 각 로또 티켓의 번호를 출력한다. - [x] 당첨 번호와 일치하는 로또 티켓 개수를 출력한다. - [x] 총 수익률을 출력한다. - + *** - [x] 구입 금액 - [x] 구입 금액은 1000원 단위의 정수값이다. - [x] ERROR : 음수일 경우 예외가 발생한다. - [x] ERROR : 1000원 단위가 아닐 경우 예외가 발생한다. - + - [x] 티켓 장수 - [x] 구입 금액과 수동 로또 티켓 개수를 인자로 받아 로또 티켓 장수를 반환한다. - [x] ERROR : 전체 티켓 장수 보다 수동 구매 장수가 많은 경우 예외가 발생한다. @@ -29,7 +29,7 @@ - [x] 수동으로 로또 티켓을 생성한다. - [x] 자동으로 로또 티켓을 생성한다. - [x] 전체 로또 티켓을 생성한다. - + *** - [x] 로또 번호 생성기 @@ -39,7 +39,7 @@ - [x] 로또 번호 - [x] 로또 번호는 1 ~ 45 사이의 값으로 로또 번호를 생성한다. - [x] ERROR : 1 ~ 45가 아닐 경우 예외가 발생한다. - + - [x] 로또 티켓 - [x] 6개의 로또 번호를 가진다. - [x] ERROR : 로또 번호가 6개 보다 작거나 많은 경우 예외가 발생한다. @@ -47,18 +47,18 @@ - [x] 로또 순위 - [x] 로또 티켓의 당첨 수에 따른 순위를 반환한다. - + *** - [x] 당첨 번호 - [x] ERROR: 중복되는 로또 번호가 있을 경우 예외가 발생한다. - [x] 당첨 번호와 중복되지 않는 1 ~ 45 중 하나는 보너스 볼이다. - [x] 당첨 번호와 일치하는 로또 번호 개수를 반환한다. - + - [x] 당첨 결과 - [x] 당첨 번호와 일치하는 로또 번호 개수를 반환한다. - [x] 보너스 번호 일치하는 로또 번호 개수를 반환한다. - [x] 당첨 번호 개수가 같은 로또 티켓 개수를 반환한다. - + - [x] 당첨 통계 - [x] 당첨 순위의 수익률을 계산한다. diff --git a/src/main/java/lotto/domain/rank/LottoRank.java b/src/main/java/lotto/domain/rank/LottoRank.java index 1f1a7855..b6b130f7 100644 --- a/src/main/java/lotto/domain/rank/LottoRank.java +++ b/src/main/java/lotto/domain/rank/LottoRank.java @@ -7,7 +7,7 @@ public enum LottoRank { FIFTH(3, 5_000), FOURTH(4, 50_000), THIRD(5, 1_500_000), - SECOND(5, 30_000_000), // 보너스볼 일치 + SECOND(5, 30_000_000), FIRST(6, 2_000_000_000); private final int hitCount; @@ -19,8 +19,8 @@ public enum LottoRank { } public static LottoRank findBy(int hitCount, boolean isBonus) { - if (hitCount == 5) { - return isBonus ? LottoRank.SECOND : LottoRank.THIRD; + if (hitCount == 5 && isBonus) { + return LottoRank.SECOND; } return Arrays.stream(values()) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index f5b872e7..ac908f7c 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -38,7 +38,7 @@ public static void printWinningStatistics(WinningLottoRank winningLottoRank) { System.out.println("\n당첨 통계\n---------"); for (LottoRank rank : winningLottoRank.keys()) { String message = (rank == LottoRank.SECOND) ? "%d개 일치, 보너스 볼 일치 (%d원) - %d개%n" - : "%d개 일치 (%d원) - %d개%n"; + : "%d개 일치 (%d원) - %d개%n"; System.out.printf(message, rank.hitCount(), rank.prizeMoney(), winningLottoRank.count(rank)); } } diff --git a/src/test/java/lotto/domain/lotto/LottoRankTest.java b/src/test/java/lotto/domain/rank/LottoRankTest.java similarity index 91% rename from src/test/java/lotto/domain/lotto/LottoRankTest.java rename to src/test/java/lotto/domain/rank/LottoRankTest.java index 8cbd1f2c..59092517 100644 --- a/src/test/java/lotto/domain/lotto/LottoRankTest.java +++ b/src/test/java/lotto/domain/rank/LottoRankTest.java @@ -1,6 +1,5 @@ -package lotto.domain.lotto; +package lotto.domain.rank; -import lotto.domain.rank.LottoRank; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java b/src/test/java/lotto/domain/rank/WinningLottoRankTest.java similarity index 97% rename from src/test/java/lotto/domain/winning/WinningLottoRankTest.java rename to src/test/java/lotto/domain/rank/WinningLottoRankTest.java index 5a7806dc..02887887 100644 --- a/src/test/java/lotto/domain/winning/WinningLottoRankTest.java +++ b/src/test/java/lotto/domain/rank/WinningLottoRankTest.java @@ -1,9 +1,8 @@ -package lotto.domain.winning; +package lotto.domain.rank; import lotto.domain.lotto.LottoTicket; import lotto.domain.lotto.LottoTickets; -import lotto.domain.rank.LottoRank; -import lotto.domain.rank.WinningLottoRank; +import lotto.domain.winning.WinningNumbers; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; From 7bb61e012186fe9551538b624af3d7380d3081db Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 4 Nov 2021 02:23:16 +0900 Subject: [PATCH 22/22] =?UTF-8?q?chore:=20root=20project=20name=20=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 4b94a0e2..1daa39f3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -rootProject.name = 'java-racingcar' +rootProject.name = 'java-lotto'