diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba4..7319a3c4ab 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,10 @@ package lotto; +import lotto.controller.LottoController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + final LottoController lottoController = new LottoController(); + lottoController.runMachine(); } } diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java deleted file mode 100644 index 519793d1f7..0000000000 --- a/src/main/java/lotto/Lotto.java +++ /dev/null @@ -1,20 +0,0 @@ -package lotto; - -import java.util.List; - -public class Lotto { - private final List numbers; - - public Lotto(List numbers) { - validate(numbers); - this.numbers = numbers; - } - - private void validate(List numbers) { - if (numbers.size() != 6) { - throw new IllegalArgumentException(); - } - } - - // TODO: 추가 기능 구현 -} diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java new file mode 100644 index 0000000000..f1cfccf1c2 --- /dev/null +++ b/src/main/java/lotto/controller/LottoController.java @@ -0,0 +1,73 @@ +package lotto.controller; + +import lotto.view.InputView; +import lotto.domain.Lotto; +import lotto.domain.*; +import lotto.domain.strategy.LottoGenerateStrategy; +import lotto.domain.strategy.LottoGenerator; +import lotto.domain.strategy.UserLottoGenerateStrategy; +import lotto.domain.strategy.WinningLottoGenerateStrategy; +import lotto.view.OutputView; + +public class LottoController { + private final LottoGenerator lottoGenerator = new LottoGenerator(); + private Budget budget; + + public void runMachine() { + final Lottos userLottos = buyLotto(); + final WinningLotto winningLotto = drawLotto(); + final WinningStatistics winningStatistics = makeStatistics(userLottos, winningLotto); + OutputView.printWinningStaticstics(winningStatistics); + } + + private Lottos buyLotto() { + try { + budget = Budget.from(InputView.getBudgetInput()); + setLottoGeneratorStrategy(new UserLottoGenerateStrategy()); + Lottos userMultipleLottos = lottoGenerator.generateLottosByBudget(budget); + return userMultipleLottos; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return buyLotto(); + } + } + + private WinningLotto drawLotto() { + try { + final Lotto lotto = getWinningLotto(); + final Bonus bonus = getBonus(); + return WinningLotto.of(lotto, bonus); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return drawLotto(); + } + } + + private Lotto getWinningLotto() { + try { + InputView.printRequireWinningNumbersMessage(); + setLottoGeneratorStrategy(new WinningLottoGenerateStrategy()); + return lottoGenerator.generateLotto(); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return getWinningLotto(); + } + } + + private Bonus getBonus(){ + try { + return Bonus.from(InputView.getBonusInput()); + } catch (IllegalArgumentException e){ + System.out.println(e.getMessage()); + return getBonus(); + } + } + + private WinningStatistics makeStatistics(final Lottos userLottos, final WinningLotto winningLotto) { + return WinningStatistics.of(userLottos, winningLotto, budget); + } + + public void setLottoGeneratorStrategy(final LottoGenerateStrategy lottoGenerateStrategy) { + this.lottoGenerator.setLottoGenerateStrategy(lottoGenerateStrategy); + } +} diff --git a/src/main/java/lotto/domain/Bonus.java b/src/main/java/lotto/domain/Bonus.java new file mode 100644 index 0000000000..ed8ae8624e --- /dev/null +++ b/src/main/java/lotto/domain/Bonus.java @@ -0,0 +1,38 @@ +package lotto.domain; + +public class Bonus { + private final int bonus; + private static final String NUMBER_FORMAT_EXCEPTION_MESSAGE = "[ERROR] 보너스 번호는 숫자만 입력할 수 있습니다."; + private static final String NUMBER_PARSE_EXCEPTION_MESSAGE = "[ERROR] 보너스 번호는 1부터 45 사이의 숫자를 입력해야 합니다."; + private static final int MAX_NUMBER = 45; + private static final int MIN_NUMBER = 1; + + private Bonus(int bonus) { + validateOutOfRange(bonus); + this.bonus = bonus; + } + + public static Bonus from(String bonus) { + return new Bonus(convertBonusNumber(bonus)); + } + + private static int convertBonusNumber(String bonusNumber) { + try { + Integer.parseInt(bonusNumber); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(NUMBER_FORMAT_EXCEPTION_MESSAGE); + } + return Integer.parseInt(bonusNumber); + } + + public void validateOutOfRange(int bonus) { + if (bonus < MIN_NUMBER || bonus > MAX_NUMBER) { + throw new IllegalArgumentException(NUMBER_PARSE_EXCEPTION_MESSAGE); + } + } + + public int getBonus() { + return bonus; + } +} + diff --git a/src/main/java/lotto/domain/Budget.java b/src/main/java/lotto/domain/Budget.java new file mode 100644 index 0000000000..cb7c083cd9 --- /dev/null +++ b/src/main/java/lotto/domain/Budget.java @@ -0,0 +1,48 @@ +package lotto.domain; + +public class Budget { + private static final String NUMBER_FORMAT_EXCEPTION_MESSAGE = "[ERROR] 구입 금액은 숫자만 입력할 수 있습니다."; + private static final String DIVIDE_EXCEPTION_MESSAGE = "[ERROR] 구입 금액은 %d원 단위로 나누어 떨어져야합니다."; + private static final String MINIMUM_PRICE_EXCEPTION_MESSAGE = "[ERROR] 로또 구입 최소 금액은 %d원 입니다."; + private static final int LOTTO_UNIT_PRICE = 1000; + private static final int ZERO = 0; + private final int budget; + + private Budget(final int budget) { + this.budget = budget; + } + + public static Budget from(final String inputBudget) { + validateNumeric(inputBudget); + int budget = Integer.parseInt(inputBudget); + return new Budget(budget); + } + + private static void validateNumeric(final String inputBudget) { + try { + Integer.parseInt(inputBudget); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(NUMBER_FORMAT_EXCEPTION_MESSAGE, e); + } + } + + private static void validateDivideResultIsZero(final int inputBudget) { + if(inputBudget % LOTTO_UNIT_PRICE != ZERO) { + throw new IllegalArgumentException(String.format(DIVIDE_EXCEPTION_MESSAGE, LOTTO_UNIT_PRICE)); + } + } + + private static void validateLowerPrice(final int inputBudget) { + if(inputBudget < LOTTO_UNIT_PRICE) { + throw new IllegalArgumentException(String.format(MINIMUM_PRICE_EXCEPTION_MESSAGE, LOTTO_UNIT_PRICE)); + } + } + + public int getCountOfLottoLines() { + return budget / LOTTO_UNIT_PRICE; + } + + public int getBudget() { + return budget; + } +} diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java new file mode 100644 index 0000000000..09f44971f6 --- /dev/null +++ b/src/main/java/lotto/domain/Lotto.java @@ -0,0 +1,56 @@ +package lotto.domain; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class Lotto { + private final List numbers; + private static final String SPLIT_CHAR = ", "; + private static final int LOTTO_SIZE = 6; + private static final int MAX_NUMBER = 45; + private static final int MIN_NUMBER = 1; + private static final String OUT_OF_RANGE_EXCEPTION_MESSAGE = "[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."; + private static final String DUPLICATION_EXCEPTION_MESSAGE = "[ERROR] 로또 번호는 중복없이 6개의 번호들로 구성되어야 합니다."; + private static final String LOTTO_SIZE_EXCEPTION_MESSAGE = "[ERROR] 로또는 6개의 숫자로 구성되어야 합니다."; + + public Lotto(List numbers) { + validate(numbers); + validateRange(numbers); + validateDuplication(numbers); + this.numbers = numbers; + } + + private void validate(List numbers) { + if (numbers.size() != LOTTO_SIZE) { + throw new IllegalArgumentException(LOTTO_SIZE_EXCEPTION_MESSAGE); + } + } + + private void validateRange(List numbers) { + if (numbers.stream().anyMatch(number -> number < MIN_NUMBER || number > MAX_NUMBER)) { + throw new IllegalArgumentException(OUT_OF_RANGE_EXCEPTION_MESSAGE); + } + } + + private void validateDuplication(List numbers) { + if (numbers.stream().distinct().count() != numbers.size()) { + throw new IllegalArgumentException(DUPLICATION_EXCEPTION_MESSAGE); + } + } + + @Override + public String toString() { + return numbers.stream() + .sorted().map(Objects::toString) + .collect(Collectors.joining(SPLIT_CHAR)); + } + + public boolean isContain(int bonusNumber) { + return numbers.contains(bonusNumber); + } + + public List getNumbers() { + return numbers; + } +} diff --git a/src/main/java/lotto/domain/Lottos.java b/src/main/java/lotto/domain/Lottos.java new file mode 100644 index 0000000000..426cd7775a --- /dev/null +++ b/src/main/java/lotto/domain/Lottos.java @@ -0,0 +1,19 @@ +package lotto.domain; + +import java.util.List; + +public class Lottos { + private final List lottos; + + private Lottos(final List lottos) { + this.lottos = lottos; + } + + public static Lottos from(List lottos) { + return new Lottos(lottos); + } + + public List getLottos() { + return lottos; + } +} diff --git a/src/main/java/lotto/domain/WinningLotto.java b/src/main/java/lotto/domain/WinningLotto.java new file mode 100644 index 0000000000..f54af6ef96 --- /dev/null +++ b/src/main/java/lotto/domain/WinningLotto.java @@ -0,0 +1,31 @@ +package lotto.domain; + +public class WinningLotto { + private final Lotto lotto; + private final Bonus bonus; + private static final String BONUS_NUMBER_DUPLICATE_ERROR_MESSAGE = "[ERROR] 보너스 번호는 당첨 번호와 중복될 수 없습니다."; + + private WinningLotto(Lotto lotto, Bonus bonus) { + this.lotto = lotto; + this.bonus = bonus; + } + + public static WinningLotto of(Lotto lotto, Bonus bonus) { + validateBonusNumberDuplicate(lotto, bonus.getBonus()); + return new WinningLotto(lotto, bonus); + } + + private static void validateBonusNumberDuplicate(Lotto lotto, int bonusNumber) { + if (lotto.isContain(bonusNumber)) { + throw new IllegalArgumentException(BONUS_NUMBER_DUPLICATE_ERROR_MESSAGE); + } + } + + public Lotto getLotto() { + return lotto; + } + + public Bonus getBonus() { + return bonus; + } +} diff --git a/src/main/java/lotto/domain/WinningRank.java b/src/main/java/lotto/domain/WinningRank.java new file mode 100644 index 0000000000..687843bc04 --- /dev/null +++ b/src/main/java/lotto/domain/WinningRank.java @@ -0,0 +1,40 @@ +package lotto.domain; + +import java.util.Arrays; + +public enum WinningRank { + FIRST(6, false, 2000000000, "6개 일치"), + SECOND(5, true, 30000000, "5개 일치, 보너스 볼 일치"), + THIRD(5, false, 1500000, "5개 일치"), + FOURTH(4, false, 50000, "4개 일치"), + FIFTH(3, false, 5000, "3개 일치"), + NOTHING(0, false, 0, ""); + + private final int match; + private final boolean isBonus; + private final int prize; + private final String message; + + WinningRank(int match, boolean isBonus, int prize, String message) { + this.match = match; + this.isBonus = isBonus; + this.prize = prize; + this.message = message; + } + + public static WinningRank from(int match, boolean isBonus) { + return Arrays.stream(WinningRank.values()) + .filter(rank -> rank.match == match) + .filter(rank -> rank.isBonus == isBonus) + .findAny() + .orElse(NOTHING); + } + + public int getPrize() { + return prize; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/lotto/domain/WinningStatistics.java b/src/main/java/lotto/domain/WinningStatistics.java new file mode 100644 index 0000000000..b0654aa599 --- /dev/null +++ b/src/main/java/lotto/domain/WinningStatistics.java @@ -0,0 +1,78 @@ +package lotto.domain; + +import java.math.BigDecimal; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +public class WinningStatistics { + private Map winningStatistics = new EnumMap<>(WinningRank.class); + private BigDecimal revenueRate = BigDecimal.ZERO; + + private WinningStatistics(Lottos userLottos, WinningLotto winningLotto, Budget budget) { + setWinningStatistics(userLottos, winningLotto); + setRevenueRate(budget); + } + + public static WinningStatistics of(Lottos userLottos, WinningLotto winningLotto, Budget budget) { + return new WinningStatistics(userLottos, winningLotto, budget); + } + + private void setWinningStatistics(Lottos userLottos, WinningLotto winningLotto) { + for (final Lotto userLotto : userLottos.getLottos()) { + final WinningRank winningResult = createWinningRank(userLotto.getNumbers(), winningLotto); + updateWinningStatistics(winningResult); + } + } + + private WinningRank createWinningRank(List userLottoNumbers, WinningLotto winningLotto) { + int matchesCount = getEachMatchesCount(userLottoNumbers, winningLotto.getLotto().getNumbers()); + boolean isBonus = getHasBonus(userLottoNumbers, winningLotto.getBonus()); + return WinningRank.from(matchesCount, isBonus); + } + + private int getEachMatchesCount(List userLottoNumbers, List winNumbers) { + return (int) userLottoNumbers.stream() + .filter(winNumbers::contains).count(); + } + + private void updateWinningStatistics(WinningRank winningRank) { + winningStatistics.put(winningRank, winningStatistics.getOrDefault(winningRank, 0) + 1); + } + + private boolean getHasBonus(List userLottoNumbers, Bonus bonus) { + return userLottoNumbers.contains(bonus.getBonus()); + } + + private void setRevenueRate(Budget budget) { + BigDecimal totalAmounts = getTotalAmounts(); + BigDecimal count = getBudget(budget); + this.revenueRate = calculateRevenueRate(totalAmounts, count); + } + + private BigDecimal getTotalAmounts() { + BigDecimal totalAmounts = BigDecimal.ZERO; + for (Map.Entry winningInfo : winningStatistics.entrySet()) { + BigDecimal amount = BigDecimal.valueOf(winningInfo.getKey().getPrize() * winningInfo.getValue()); + totalAmounts = totalAmounts.add(amount); + } + return totalAmounts; + } + + private BigDecimal getBudget(Budget budget) { + return new BigDecimal(budget.getBudget()); + } + + private BigDecimal calculateRevenueRate(BigDecimal totalAmounts, BigDecimal counts) { + BigDecimal rate = totalAmounts.divide(counts, 3, BigDecimal.ROUND_HALF_EVEN); + return rate.multiply(new BigDecimal("100")); + } + + public Map getWinningStatistics() { + return winningStatistics; + } + + public BigDecimal getRevenueRate() { + return revenueRate; + } +} diff --git a/src/main/java/lotto/domain/strategy/LottoGenerateStrategy.java b/src/main/java/lotto/domain/strategy/LottoGenerateStrategy.java new file mode 100644 index 0000000000..2a0d0810e8 --- /dev/null +++ b/src/main/java/lotto/domain/strategy/LottoGenerateStrategy.java @@ -0,0 +1,10 @@ +package lotto.domain.strategy; + +import lotto.domain.Lotto; + +public interface LottoGenerateStrategy { + int MIN_NUMBER = 1; + int MAX_NUMBER = 45; + int SIZE = 6; + Lotto generate(); +} diff --git a/src/main/java/lotto/domain/strategy/LottoGenerator.java b/src/main/java/lotto/domain/strategy/LottoGenerator.java new file mode 100644 index 0000000000..8b83177a9f --- /dev/null +++ b/src/main/java/lotto/domain/strategy/LottoGenerator.java @@ -0,0 +1,29 @@ +package lotto.domain.strategy; + +import lotto.domain.Lotto; +import lotto.domain.Budget; +import lotto.domain.Lottos; + +import java.util.ArrayList; +import java.util.List; + +public class LottoGenerator { + private LottoGenerateStrategy lottoGenerateStrategy; + + public Lotto generateLotto() { + return lottoGenerateStrategy.generate(); + } + + public Lottos generateLottosByBudget(Budget budget) { + final int countOfLottoLine = budget.getCountOfLottoLines(); + final List lottos = new ArrayList<>(); + for (int i = 0; i < countOfLottoLine; i++) { + lottos.add(generateLotto()); + } + return Lottos.from(lottos); + } + + public void setLottoGenerateStrategy(LottoGenerateStrategy lottoGenerateStrategy) { + this.lottoGenerateStrategy = lottoGenerateStrategy; + } +} diff --git a/src/main/java/lotto/domain/strategy/UserLottoGenerateStrategy.java b/src/main/java/lotto/domain/strategy/UserLottoGenerateStrategy.java new file mode 100644 index 0000000000..e570dde634 --- /dev/null +++ b/src/main/java/lotto/domain/strategy/UserLottoGenerateStrategy.java @@ -0,0 +1,11 @@ +package lotto.domain.strategy; + +import camp.nextstep.edu.missionutils.Randoms; +import lotto.domain.Lotto; + +public class UserLottoGenerateStrategy implements LottoGenerateStrategy { + @Override + public Lotto generate() { + return new Lotto(Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, SIZE)); + } +} diff --git a/src/main/java/lotto/domain/strategy/WinningLottoGenerateStrategy.java b/src/main/java/lotto/domain/strategy/WinningLottoGenerateStrategy.java new file mode 100644 index 0000000000..45e425ae21 --- /dev/null +++ b/src/main/java/lotto/domain/strategy/WinningLottoGenerateStrategy.java @@ -0,0 +1,12 @@ +package lotto.domain.strategy; + +import camp.nextstep.edu.missionutils.Console; +import lotto.domain.Lotto; +import lotto.util.LottoParser; + +public class WinningLottoGenerateStrategy implements LottoGenerateStrategy { + @Override + public Lotto generate() { + return new Lotto(LottoParser.parseWinningInputs(Console.readLine())); + } +} diff --git a/src/main/java/lotto/util/LottoParser.java b/src/main/java/lotto/util/LottoParser.java new file mode 100644 index 0000000000..ebed5d23c2 --- /dev/null +++ b/src/main/java/lotto/util/LottoParser.java @@ -0,0 +1,40 @@ +package lotto.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class LottoParser { + private static final String SPLIT_CHAR = ","; + private static final int LOTTO_MIN_NUMBER = 1; + private static final int LOTTO_MAX_NUMBER = 45; + private static final String LOTTO_PARSE_ERROR_MESSAGE = "[ERROR] 로또 번호는 숫자만 입력할 수 있습니다."; + private static final String LOTTO_RANGE_ERROR_MESSAGE = "[ERROR] 로또 번호는 %d부터 %d까지의 수만 입력할 수 있습니다."; + + public static List parseWinningInputs(String input) { + List lottoNumbers = new ArrayList<>(); + Arrays.stream(input.split(SPLIT_CHAR)).forEach(digit -> { + int numberConvert = covertDigitToNumber(digit); + validateNumberRange(numberConvert); + lottoNumbers.add(numberConvert); + }); + return lottoNumbers; + } + + private static int covertDigitToNumber(String digit) { + try { + Integer.parseInt(digit); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(LOTTO_PARSE_ERROR_MESSAGE); + } + return Integer.parseInt(digit); + } + + private static void validateNumberRange(int number) { + if (number < LOTTO_MIN_NUMBER || number > LOTTO_MAX_NUMBER) { + throw new IllegalArgumentException( + String.format(LOTTO_RANGE_ERROR_MESSAGE, LOTTO_MIN_NUMBER, LOTTO_MAX_NUMBER)); + } + } +} + diff --git a/src/main/java/lotto/util/StringFormatter.java b/src/main/java/lotto/util/StringFormatter.java new file mode 100644 index 0000000000..e5143055e2 --- /dev/null +++ b/src/main/java/lotto/util/StringFormatter.java @@ -0,0 +1,56 @@ +package lotto.util; + +import lotto.domain.WinningRank; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class StringFormatter { + public enum Format { + REWARD_RATE_FORMAT("#,##0.0"), + STATISTICS_RESULT_FORMAT("%s (%,d원) - %d개\n"); + + private final String format; + + Format(String format) { + this.format = format; + } + + public String toString() { + return this.format; + } + } + + public static String mapToWinningStatisticsToString(Map winningStatistics) { + StringBuilder result = new StringBuilder(); + addStatistics(winningStatistics, result); + return result.toString(); + } + + private static void addStatistics(Map winningStatistics, StringBuilder result) { + List winningResults = getBasicWinningResults(); + for (WinningRank winningResult : winningResults) { + result.append( + String.format(Format.STATISTICS_RESULT_FORMAT.toString(), + winningResult.getMessage(), + winningResult.getPrize(), + winningStatistics.getOrDefault(winningResult, 0))); + } + } + + private static List getBasicWinningResults() { + return Arrays.stream(WinningRank.values()) + .filter(rank -> rank != WinningRank.NOTHING) + .sorted(Comparator.naturalOrder()) + .collect(Collectors.toList()); + } + + public static String mapRewardRateToString(BigDecimal rewardDate) { + return new DecimalFormat(Format.REWARD_RATE_FORMAT.format).format(rewardDate); + } +} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 0000000000..fbef7618c3 --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,23 @@ +package lotto.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + private static final String REQUIRE_BUDGET_MESSAGE = "구입금액을 입력해 주세요."; + private static final String REQUIRE_BONUS_MESSAGE = "\n보너스 번호를 입력해 주세요."; + private static final String REQUIRE_WINNING_NUMBERS_MESSAGE = "\n당첨 번호를 입력해 주세요."; + + public static String getBudgetInput() { + System.out.println(REQUIRE_BUDGET_MESSAGE); + return Console.readLine(); + } + public static String getBonusInput() { + System.out.println(REQUIRE_BONUS_MESSAGE); + return Console.readLine(); + } + + public static void printRequireWinningNumbersMessage() { + System.out.println(REQUIRE_WINNING_NUMBERS_MESSAGE); + } + +} diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java new file mode 100644 index 0000000000..fd579b8124 --- /dev/null +++ b/src/main/java/lotto/view/OutputView.java @@ -0,0 +1,54 @@ +package lotto.view; + +import lotto.domain.Budget; +import lotto.domain.Lotto; +import lotto.domain.Lottos; +import lotto.domain.WinningStatistics; +import lotto.util.StringFormatter; + +import java.math.BigDecimal; + +public class OutputView { + private static final String COUNT_OF_USER_LOTTOS_MESSAGE = "\n%d개를 구매했습니다."; + + public static void printUserLottos(Lottos lottos, Budget budget) { + printCountOfUserLottos(budget); + printLottoNumbers(lottos); + } + + private static void printLottoNumbers(Lottos lottos) { + for (Lotto lotto : lottos.getLottos()) { + printEachLottoNumbers(lotto); + } + } + + private static void printEachLottoNumbers(Lotto lotto) { + System.out.println("[" + lotto.toString() + "]"); + } + + private static void printCountOfUserLottos(Budget budget) { + System.out.println(String.format(COUNT_OF_USER_LOTTOS_MESSAGE, budget.getCountOfLottoLines())); + } + + public static void printWinningStaticstics(WinningStatistics winningStatistics) { + printWinningStatisticsHeader(); + String resultStatistics = StringFormatter.mapToWinningStatisticsToString( + winningStatistics.getWinningStatistics()); + printWinningStaticstics(resultStatistics); + printRevenueRate(winningStatistics.getRevenueRate()); + } + + private static void printWinningStatisticsHeader() { + System.out.println("\n당첨 통계"); + System.out.println("---"); + } + + private static void printRevenueRate(BigDecimal revenueRate) { + String rate = StringFormatter.mapRewardRateToString(revenueRate); + System.out.println(String.format("총 수익률은 %s%%입니다.%n", rate)); + } + + public static void printWinningStaticstics(String resultStatistics) { + System.out.println(resultStatistics); + } +} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 0f3af0f6c4..d2bca39cc0 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.domain.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;