diff --git a/docs/README.md b/docs/README.md index e69de29bb2..e043b6adea 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,86 @@ +# 기능 목록 + +--- + +## 입력 +- [ ] 구입 금액 입력 + - [ ] (예외처리) 숫자 여부 확인 + - [ ] (예외처리) 1,000원 단위 확인 +- [ ] 당첨 번호 입력 + - [ ] (예외처리) 쉼표 기준 6개 확인 + - [ ] (예외처리) 숫자 여부 확인 + - [ ] (예외처리) 숫자 범위 1~45 확인 +- [ ] 보너스 번호 입력 + - [ ] (예외처리) 숫자 여부 확인 + - [ ] (예외처리) 숫자 범위 1~45 확인 + +## 출력 +- [ ] 발행 로또 수량 & 번호 출력 + - [ ] 오름차순 정렬 +- [ ] 당첨 내역 출력 +- [ ] 수익률 출력 + - [ ] 소수점 둘째 자리에서 반올림 + + + +## Application +- [x] 로또 프로그램 작동 + + +### controller +## PlayController +- [x] 구입 금액 입력 + + +## LottoAnswerController +- [x] 당첨 번호 입력 +- [x] 보너스 번호 + + +### dto +- [x] 로또 번호 6개 & 보너스 번호 + + +### service +## PlayLottoService +- [x] 로또 번호 6개 & 보너스 번호 -> 하나의 DTO로 병합 +- [x] 로또 추첨 로직 실행 +- [x] 수익률 출력 + +## LottoTicketService +- [x] 구입 금액에 따른 로또 개수 계산 + - [x] 구입 금액 1000원 단위 검증 +- [x] 로또 구입 개수 출력 +- [x] 로또 개수만큼 LottoNumberGenerator 호출 +- [x] 로또 티켓 번호 출력 + +## OutcomeService +- [x] 일치 개수 계산 +- [x] 3개 이상 일치한 로또 필터링 +- [x] 총 수익금 계산 + + + +### repository +## LottoNumberGenerator +- [x] 로또 번호 생성 + +## Lotto +- [x] (예외처리) 숫자 6개 확인 +- [x] (예외처리) 숫자 중복 없음 확인 +- [x] (예외처리) 숫자 범위 1~45 확인 + +## BonusLotto +- [x] (예외처리) 숫자 범위 1~45 확인 +- [x] (예외처리) 기존 6개 당첨 번호와 중복 없음 확인 + +## InputProcessor +- [x] 로또 구입 금액 & 보너스 번호 정수 변환 +- [x] 당첨 번호 6개 정수 리스트 변환 + +## PrizeResult +- [x] 일치 개수 별 상금 +- [x] 일치 개수 별 당첨 로또 개수 + + + diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba4..4f172d2c65 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,10 @@ package lotto; +import lotto.controller.PlayController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + PlayController playController = new PlayController(); + playController.start(); } } diff --git a/src/main/java/lotto/ErrorMessage.java b/src/main/java/lotto/ErrorMessage.java new file mode 100644 index 0000000000..5a46597747 --- /dev/null +++ b/src/main/java/lotto/ErrorMessage.java @@ -0,0 +1,24 @@ +package lotto; + +public enum ErrorMessage { + NOT_SIX_NUMBERS("[ERROR] 당첨 번호는 6개를 입력해 주세요."), + DUPLICATED_NUMBERS("[ERROR] 당첨 번호의 중복을 제거해 주세요."), + OUT_OF_RANGE_NUMBER("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."), + NOT_NUMBER("[ERROR] 정확한 숫자를 입력해 주세요."), + INVALID_OF_MONEY_UNIT("[ERROR] 구입 금액은 1000원 단위로 입력해 주세요."); + + + private final String message; + + ErrorMessage(final String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void print() { + System.out.println(message); + } +} 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/PrizeMoney.java b/src/main/java/lotto/PrizeMoney.java new file mode 100644 index 0000000000..a5547a96ac --- /dev/null +++ b/src/main/java/lotto/PrizeMoney.java @@ -0,0 +1,20 @@ +package lotto; + +public enum PrizeMoney { + THREE_EQUAL_MONEY(5_000L), + FOUR_EQUAL_MONEY(50_000L), + FIVE_EQUAL_MONEY(1_500_000L), + BONUS_EQUAL_MONEY(30_000_000L), + SIX_EQUAL_MONEY(2_000_000_000L); + + private final long number; + + PrizeMoney(final long number) { + this.number = number; + } + + public long getNumber() { + return number; + } + +} diff --git a/src/main/java/lotto/PrizeResult.java b/src/main/java/lotto/PrizeResult.java new file mode 100644 index 0000000000..497f219087 --- /dev/null +++ b/src/main/java/lotto/PrizeResult.java @@ -0,0 +1,66 @@ +package lotto; + +import lotto.dto.AllLottoes; +import lotto.repositroy.BonusLotto; +import lotto.repositroy.LottoTicket; +import lotto.service.MatchNum; + +import java.util.*; + +public class PrizeResult { + private static final int ZERO = 0; + private final Map playResult = new EnumMap<>(MatchNum.class); + private final Map prizeMoneyMap = new EnumMap<>(MatchNum.class); + + public void initialize() { + initializePlayResult(); + initializePrizeMoneyMap(); + } + + private void initializePlayResult() { + Arrays.stream(MatchNum.values()).forEach(m -> playResult.put(m, ZERO)); + } + + private void initializePrizeMoneyMap() { + Iterator prizeMoneyIterator = Arrays.stream(PrizeMoney.values()).iterator(); + for (MatchNum matchNum : MatchNum.values()) { + prizeMoneyMap.put(matchNum, prizeMoneyIterator.next()); + } + } + + public void makeResult(AllLottoes allLottoes, List tickets) { + for (LottoTicket ticket : tickets) { + MatchNum match = checkTicket(ticket.toList(), allLottoes); + if (match != null) { + playResult.put(match, playResult.get(match) + 1); + } + } + } + + private MatchNum checkTicket(List ticket, AllLottoes allLottoes) { + int count = (int) ticket.stream().filter(num -> allLottoes.getLotto().getNumbers().contains(num)).count(); + if (count == MatchNum.FIVE_MATCH.getNum()) { + return checkBonusLotto(ticket, allLottoes.getBonusLotto()); + } + return MatchNum.getOf(count); + } + + private MatchNum checkBonusLotto(List ticket, BonusLotto bonusLotto) { + if (isBonusLotto(ticket, bonusLotto)) { + return MatchNum.BONUS_MATCH; + } + return MatchNum.FIVE_MATCH; + } + + private boolean isBonusLotto(List ticket, BonusLotto bonusLotto) { + return ticket.contains(bonusLotto.getNumber()); + } + + public Map getPlayResult() { + return playResult; + } + + public Map getPrizeMoneyMap() { + return prizeMoneyMap; + } +} diff --git a/src/main/java/lotto/controller/InputGuide.java b/src/main/java/lotto/controller/InputGuide.java new file mode 100644 index 0000000000..e8e93c750c --- /dev/null +++ b/src/main/java/lotto/controller/InputGuide.java @@ -0,0 +1,17 @@ +package lotto.controller; + +public enum InputGuide { + INPUT_MONEY("구입금액을 입력해 주세요."), + INPUT_LOTTO_ANSWER("당첨 번호를 입력해 주세요."), + INPUT_BONUS_ANSWER("보너스 번호를 입력해 주세요."); + + private final String content; + + InputGuide(final String content) { + this.content = content; + } + + public String getContent() { + return content; + } +} diff --git a/src/main/java/lotto/controller/InputProcessor.java b/src/main/java/lotto/controller/InputProcessor.java new file mode 100644 index 0000000000..a76760833a --- /dev/null +++ b/src/main/java/lotto/controller/InputProcessor.java @@ -0,0 +1,26 @@ +package lotto.controller; + +import lotto.ErrorMessage; + +import java.util.Arrays; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; + +public class InputProcessor { + private static final String CRITERIA = ","; + + public int changeToInt(String money) { + try { + return Integer.parseInt(money); + } catch (NumberFormatException e) { + ErrorMessage.NOT_NUMBER.print(); + throw new NoSuchElementException(ErrorMessage.NOT_NUMBER.getMessage()); + } + } + + public List changeToIntegerList(String s) { + return Arrays.stream(s.split(CRITERIA)) + .map(Integer::parseInt).collect(Collectors.toList()); + } +} diff --git a/src/main/java/lotto/controller/LottoAnswerController.java b/src/main/java/lotto/controller/LottoAnswerController.java new file mode 100644 index 0000000000..011af02fb0 --- /dev/null +++ b/src/main/java/lotto/controller/LottoAnswerController.java @@ -0,0 +1,39 @@ +package lotto.controller; + +import camp.nextstep.edu.missionutils.Console; +import lotto.dto.AllLottoes; +import lotto.repositroy.LottoTicket; +import lotto.service.PlayLottoService; + +import java.util.List; + +public class LottoAnswerController { + private final InputProcessor inputProcessor; + private final PlayLottoService playLottoService; + + public LottoAnswerController() { + this.inputProcessor = new InputProcessor(); + this.playLottoService = new PlayLottoService(); + } + + public void playLotto(List tickets, double paidMoney) { + List lottoAnswers = inputAnswerNumber(); + int bonusAnswer = intputBonusNumber(); + + AllLottoes allLottoes = playLottoService.getAllLottoes(lottoAnswers, bonusAnswer); + long totalPrizeMoney = playLottoService.playLotto(allLottoes, tickets); + + playLottoService.printEarningRate(totalPrizeMoney / paidMoney); + } + + private List inputAnswerNumber() { + System.out.println(InputGuide.INPUT_LOTTO_ANSWER.getContent()); + return inputProcessor.changeToIntegerList(Console.readLine()); + } + + private int intputBonusNumber() { + System.out.println(InputGuide.INPUT_BONUS_ANSWER.getContent()); + return inputProcessor.changeToInt(Console.readLine()); + } + +} diff --git a/src/main/java/lotto/controller/PlayController.java b/src/main/java/lotto/controller/PlayController.java new file mode 100644 index 0000000000..7025234392 --- /dev/null +++ b/src/main/java/lotto/controller/PlayController.java @@ -0,0 +1,30 @@ +package lotto.controller; + +import camp.nextstep.edu.missionutils.Console; +import lotto.repositroy.LottoTicket; +import lotto.service.LottoTicketService; + +import java.util.List; + +public class PlayController { + private final LottoTicketService ticketService; + private final InputProcessor inputProcessor; + private final LottoAnswerController answerController; + + public PlayController() { + this.ticketService = new LottoTicketService(); + this.inputProcessor = new InputProcessor(); + this.answerController = new LottoAnswerController(); + } + + public void start() { + int money = inputMoney(); + List tickets = ticketService.createLottoTickets(money); + answerController.playLotto(tickets, money); + } + + private int inputMoney() { + System.out.println(InputGuide.INPUT_MONEY.getContent()); + return inputProcessor.changeToInt(Console.readLine()); + } +} diff --git a/src/main/java/lotto/dto/AllLottoes.java b/src/main/java/lotto/dto/AllLottoes.java new file mode 100644 index 0000000000..18b0e3d072 --- /dev/null +++ b/src/main/java/lotto/dto/AllLottoes.java @@ -0,0 +1,22 @@ +package lotto.dto; + +import lotto.repositroy.BonusLotto; +import lotto.repositroy.Lotto; + +public class AllLottoes { + private final Lotto lotto; + private final BonusLotto bonusLotto; + + public AllLottoes(Lotto lotto, BonusLotto bonusLotto) { + this.lotto = lotto; + this.bonusLotto = bonusLotto; + } + + public Lotto getLotto() { + return lotto; + } + + public BonusLotto getBonusLotto() { + return bonusLotto; + } +} diff --git a/src/main/java/lotto/repositroy/BonusLotto.java b/src/main/java/lotto/repositroy/BonusLotto.java new file mode 100644 index 0000000000..f251a45979 --- /dev/null +++ b/src/main/java/lotto/repositroy/BonusLotto.java @@ -0,0 +1,37 @@ +package lotto.repositroy; + +import lotto.ErrorMessage; + +import java.util.List; + +public class BonusLotto { + private final int number; + + public BonusLotto(int number, List winNumbers) { + validate(number, winNumbers); + this.number = number; + } + + private void validate(int number, List winNumbers) { + checkInRage(number); + checkNotDuplicated(number, winNumbers); + } + + private void checkInRage(int number) { + if (number > LottoRangeNumber.MAX_LOTTO_NUM.getNum() || number < LottoRangeNumber.MIN_LOTTO_NUM.getNum()) { + ErrorMessage.OUT_OF_RANGE_NUMBER.print(); + throw new IllegalArgumentException(ErrorMessage.OUT_OF_RANGE_NUMBER.getMessage()); + } + } + + private void checkNotDuplicated(int number, List winNumbers) { + if (winNumbers.contains(number)) { + ErrorMessage.DUPLICATED_NUMBERS.print(); + throw new IllegalArgumentException(ErrorMessage.DUPLICATED_NUMBERS.getMessage()); + } + } + + public int getNumber() { + return number; + } +} diff --git a/src/main/java/lotto/repositroy/Lotto.java b/src/main/java/lotto/repositroy/Lotto.java new file mode 100644 index 0000000000..596609e19b --- /dev/null +++ b/src/main/java/lotto/repositroy/Lotto.java @@ -0,0 +1,46 @@ +package lotto.repositroy; + +import lotto.ErrorMessage; + +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) { + checkSixNumbers(numbers); + checkNotDuplicated(numbers); + checkInRange(numbers); + } + + private void checkSixNumbers(List numbers) { + if (numbers.size() != LottoRangeNumber.NUM_OF_LOTTO_NUMS.getNum()) { + ErrorMessage.NOT_SIX_NUMBERS.print(); + throw new IllegalArgumentException(ErrorMessage.NOT_SIX_NUMBERS.getMessage()); + } + } + + private void checkNotDuplicated(List numbers) { + if (numbers.size() != numbers.stream().distinct().count()) { + ErrorMessage.DUPLICATED_NUMBERS.print(); + throw new IllegalArgumentException(ErrorMessage.DUPLICATED_NUMBERS.getMessage()); + } + } + + private void checkInRange(List numbers) { + if (!numbers.stream().allMatch(n -> n <= LottoRangeNumber.MAX_LOTTO_NUM.getNum() + && n >= LottoRangeNumber.MIN_LOTTO_NUM.getNum())) { + ErrorMessage.OUT_OF_RANGE_NUMBER.print(); + throw new IllegalArgumentException(ErrorMessage.OUT_OF_RANGE_NUMBER.getMessage()); + } + } + + public List getNumbers() { + return numbers; + } +} diff --git a/src/main/java/lotto/repositroy/LottoRangeNumber.java b/src/main/java/lotto/repositroy/LottoRangeNumber.java new file mode 100644 index 0000000000..5279c5b35a --- /dev/null +++ b/src/main/java/lotto/repositroy/LottoRangeNumber.java @@ -0,0 +1,17 @@ +package lotto.repositroy; + +public enum LottoRangeNumber { + MIN_LOTTO_NUM(1), + MAX_LOTTO_NUM(45), + NUM_OF_LOTTO_NUMS(6); + + private int num; + + LottoRangeNumber(int num) { + this.num = num; + } + + public int getNum() { + return num; + } +} diff --git a/src/main/java/lotto/repositroy/LottoTicket.java b/src/main/java/lotto/repositroy/LottoTicket.java new file mode 100644 index 0000000000..df6a57954e --- /dev/null +++ b/src/main/java/lotto/repositroy/LottoTicket.java @@ -0,0 +1,25 @@ +package lotto.repositroy; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +public class LottoTicket { + private final List ticket; + + public LottoTicket() { + this.ticket = Randoms.pickUniqueNumbersInRange(LottoRangeNumber.MIN_LOTTO_NUM.getNum() + , LottoRangeNumber.MAX_LOTTO_NUM.getNum(), LottoRangeNumber.NUM_OF_LOTTO_NUMS.getNum()); + } + + public List getSorted() { + return ticket.stream().sorted().collect(Collectors.toList()); + } + + public List toList() { + return ticket; + } +} diff --git a/src/main/java/lotto/repositroy/LottoTicketGenerator.java b/src/main/java/lotto/repositroy/LottoTicketGenerator.java new file mode 100644 index 0000000000..4b0a713cca --- /dev/null +++ b/src/main/java/lotto/repositroy/LottoTicketGenerator.java @@ -0,0 +1,29 @@ +package lotto.repositroy; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class LottoTicketGenerator { + private final List tickets; + + public LottoTicketGenerator() { + tickets = new ArrayList<>(); + } + + public void generateTicket(int ticketNum) { + for (int i = 0; i < ticketNum; i++) { + tickets.add(new LottoTicket()); + } + } + + public List> getSortedTickets() { + return tickets.stream().map(LottoTicket::getSorted).collect(Collectors.toList()); + } + + public List getTickets() { + return tickets; + } +} diff --git a/src/main/java/lotto/service/LottoTicketService.java b/src/main/java/lotto/service/LottoTicketService.java new file mode 100644 index 0000000000..b7bc4ae668 --- /dev/null +++ b/src/main/java/lotto/service/LottoTicketService.java @@ -0,0 +1,48 @@ +package lotto.service; + +import lotto.ErrorMessage; +import lotto.repositroy.LottoTicket; +import lotto.repositroy.LottoTicketGenerator; + +import java.util.Arrays; +import java.util.List; + +public class LottoTicketService { + private static final int ZERO = 0; + private static final int MONEY_UNIT = 1000; + private final LottoTicketGenerator ticketGenerator; + + public LottoTicketService() { + this.ticketGenerator = new LottoTicketGenerator(); + } + + public List createLottoTickets(int money) { + validate(money); + ticketGenerator.generateTicket(getTicketNum(money)); + printTickets(); + + return ticketGenerator.getTickets(); + } + + private void validate(int money) { + if (money % MONEY_UNIT != ZERO) { + ErrorMessage.INVALID_OF_MONEY_UNIT.print(); + throw new IllegalArgumentException(ErrorMessage.INVALID_OF_MONEY_UNIT.getMessage()); + } + } + + private int getTicketNum(int money) { + int ticketNum = money / MONEY_UNIT; + printTicketNum(ticketNum); + return ticketNum; + } + + private void printTicketNum(int num) { + System.out.println(num + OutputGuide.NUMBER_OF_PURCHASE.getContent()); + } + + private void printTickets() { + ticketGenerator.getSortedTickets().forEach(t -> + System.out.println(Arrays.toString(t.stream().sorted().toArray()))); + } +} diff --git a/src/main/java/lotto/service/MatchNum.java b/src/main/java/lotto/service/MatchNum.java new file mode 100644 index 0000000000..37e57c4df4 --- /dev/null +++ b/src/main/java/lotto/service/MatchNum.java @@ -0,0 +1,30 @@ +package lotto.service; + + +public enum MatchNum { + THREE_MATCH(3), + FOUR_MATCH(4), + FIVE_MATCH(5), + BONUS_MATCH(7), + SIX_MATCH(6); + + private final int num; + + MatchNum(int num) { + this.num = num; + } + + public int getNum() { + return num; + } + + public static MatchNum getOf(int check) { + for (MatchNum matchNum : MatchNum.values()) { + if (check == matchNum.getNum()) { + return matchNum; + } + } + return null; + } + +} diff --git a/src/main/java/lotto/service/OutcomeService.java b/src/main/java/lotto/service/OutcomeService.java new file mode 100644 index 0000000000..80e2a071c2 --- /dev/null +++ b/src/main/java/lotto/service/OutcomeService.java @@ -0,0 +1,73 @@ +package lotto.service; + +import lotto.PrizeMoney; +import lotto.PrizeResult; +import lotto.dto.AllLottoes; +import lotto.repositroy.LottoTicket; + +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class OutcomeService { + DecimalFormat formatter = new DecimalFormat("#,###"); + + private final PrizeResult prizeResult; + + public OutcomeService() { + this.prizeResult = new PrizeResult(); + } + + public long getTotalPrizeMoney(final AllLottoes allLottoes, final List tickets) { + prizeResult.initialize(); + prizeResult.makeResult(allLottoes, tickets); + printResult(); + + return calculateTotalMoney(); + } + + + private void printResult() { + Map prizeMoneyMap = prizeResult.getPrizeMoneyMap(); + Map playResult = prizeResult.getPlayResult(); + System.out.println(OutputGuide.RESULT_STATISTICS.getContent()); + Arrays.stream(MatchNum.values()).forEach(m -> { + printEqualNum(m); + printPrizeMoney(prizeMoneyMap.get(m)); + printLottoNumResult(playResult.get(m)); + }); + } + + + private void printEqualNum(MatchNum matchNum) { + if (matchNum.equals(MatchNum.BONUS_MATCH)) { + System.out.print(OutputGuide.BONUS_NUM_GUIDE.getContent()); + return; + } + System.out.print(matchNum.getNum() + OutputGuide.EQUAL_NUM_GUIDE.getContent()); + } + + private void printPrizeMoney(PrizeMoney prizeMoney) { + String formatMoney = formatter.format(prizeMoney.getNumber()); + System.out.print(formatMoney + OutputGuide.PRIZE_MONEY_GUIDE.getContent()); + } + + + private void printLottoNumResult(Integer result) { + System.out.println(result + OutputGuide.LOTTO_NUM.getContent()); + } + + + private long calculateTotalMoney() { + long totalMoney = 0; + Map prizeMoneyMap = prizeResult.getPrizeMoneyMap(); + Map playResult = prizeResult.getPlayResult(); + + for (MatchNum matchNum : MatchNum.values()) { + totalMoney += prizeMoneyMap.get(matchNum).getNumber() * playResult.get(matchNum).longValue(); + } + return totalMoney; + } + +} diff --git a/src/main/java/lotto/service/OutputGuide.java b/src/main/java/lotto/service/OutputGuide.java new file mode 100644 index 0000000000..47ed8a1ac9 --- /dev/null +++ b/src/main/java/lotto/service/OutputGuide.java @@ -0,0 +1,26 @@ +package lotto.service; + +public enum OutputGuide { + NUMBER_OF_PURCHASE("개를 구매했습니다."), + RESULT_STATISTICS("당첨 통계\n---"), + + EQUAL_NUM_GUIDE("개 일치 ("), + BONUS_NUM_GUIDE("5개 일치, 보너스 볼 일치 ("), + PRIZE_MONEY_GUIDE("원) - "), + LOTTO_NUM("개"), + + TOTAL_EARNING_FRONT("총 수익률은 "), + TOTAL_EARNING_BACK("%입니다."); + + private final String content; + + OutputGuide(final String content) { + this.content = content; + } + + public String getContent() { + return content; + } + + +} diff --git a/src/main/java/lotto/service/PlayLottoService.java b/src/main/java/lotto/service/PlayLottoService.java new file mode 100644 index 0000000000..3ab0995ba5 --- /dev/null +++ b/src/main/java/lotto/service/PlayLottoService.java @@ -0,0 +1,34 @@ +package lotto.service; + + +import lotto.dto.AllLottoes; +import lotto.repositroy.BonusLotto; +import lotto.repositroy.Lotto; +import lotto.repositroy.LottoTicket; + +import java.util.List; + +public class PlayLottoService { + private static final int HUNDRED = 100; + private final OutcomeService outcomeService; + + public PlayLottoService() { + this.outcomeService = new OutcomeService(); + } + + public AllLottoes getAllLottoes(List lottoAnswers, int bonusAnswer) { + Lotto lotto = new Lotto(lottoAnswers); + BonusLotto bonusLotto = new BonusLotto(bonusAnswer, lotto.getNumbers()); + return new AllLottoes(lotto, bonusLotto); + } + + public long playLotto(AllLottoes allLottoes, List tickets) { + return outcomeService.getTotalPrizeMoney(allLottoes, tickets); + } + + public void printEarningRate(double earningRate) { + String earningPercent = String.format("%.1f", earningRate * HUNDRED); + System.out.println(OutputGuide.TOTAL_EARNING_FRONT.getContent() + earningPercent + + OutputGuide.TOTAL_EARNING_BACK.getContent()); + } +} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 0f3af0f6c4..c73d3cbbf4 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.repositroy.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,5 +24,10 @@ void createLottoByDuplicatedNumber() { .isInstanceOf(IllegalArgumentException.class); } - // 아래에 추가 테스트 작성 가능 + @DisplayName("로또 번호가 1 ~ 45 사이의 숫자가 아니면 예외가 발생한다.") + @Test + void createLottoByOutOfRangeNumber() { + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 46, 3, 4, 5))) + .isInstanceOf(IllegalArgumentException.class); + } } diff --git a/src/test/java/lotto/repositroy/BonusLottoTest.java b/src/test/java/lotto/repositroy/BonusLottoTest.java new file mode 100644 index 0000000000..a8acc94f89 --- /dev/null +++ b/src/test/java/lotto/repositroy/BonusLottoTest.java @@ -0,0 +1,24 @@ +package lotto.repositroy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class BonusLottoTest { + @DisplayName("보너스 번호가 1 ~ 45 사이의 숫자가 아니면 예외가 발생한다.") + @Test + void createBonusLottoByOutOfRange() { + assertThatThrownBy(() -> new BonusLotto(46, List.of(1, 2, 3, 4, 5, 6))) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("보너스 번호와 기존 6개의 당첨 번호가 중복되면 예외가 발생한다.") + @Test + void createBonusLottoByDuplicated() { + assertThatThrownBy(() -> new BonusLotto(1, List.of(1, 2, 3, 4, 5, 6))) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/service/LottoTicketServiceTest.java b/src/test/java/lotto/service/LottoTicketServiceTest.java new file mode 100644 index 0000000000..76af4692fd --- /dev/null +++ b/src/test/java/lotto/service/LottoTicketServiceTest.java @@ -0,0 +1,21 @@ +package lotto.service; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LottoTicketServiceTest { + private final LottoTicketService lottoTicketService = new LottoTicketService(); + + @DisplayName("구매 금액을 1000원 단위로 입력하지 않으면 예외가 발생한다.") + @Test + void createLottoTicketsByInvalidMoneyUnit() { + //given + int testMoney = 1001; + + //when, then + assertThatThrownBy(() -> lottoTicketService.createLottoTickets(testMoney)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file