diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index fc78e6043c2..1c48f259730 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -1,16 +1,19 @@ package lotto; +import java.util.List; import lotto.domain.LottoConsumer; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; +import lotto.domain.purchaseStrategy.AutoStrategy; +import lotto.domain.purchaseStrategy.ManualStrategy; +import lotto.dto.LottoPurchaseDto; import lotto.factory.LottoApplicationFactory; import lotto.service.LottoService; import lotto.view.InputView; import lotto.view.OutputView; -import java.util.List; - public class LottoApplication { + private final InputView inputView; private final OutputView outputView; @@ -26,12 +29,32 @@ public LottoApplication(InputView inputView, OutputView outputView, LottoService public void run() { LottoConsumer consumer = new LottoConsumer(); - // 로또 구매 금액 입력 및 구매 + // 로또 구매 금액 입력 int money = inputView.insertMoney(); - lottoService.buyLotto(consumer, money); + + // 수동 구매 로또 수 입력 + int manuallyPurchasedLottoTicketCount = inputView.inputManuallyPurchasedLottoTicketCount(); + + // 수동 로또 번호 입력 + List manuallyPurchasedLottoNumbers = inputView.inputManuallyPurchasedLottoTicketNumbers(manuallyPurchasedLottoTicketCount); + + // 구매 정보 DTO + LottoPurchaseDto purchaseDto = new LottoPurchaseDto(money, manuallyPurchasedLottoNumbers); + + // 수동 구매로 전략 변경 + lottoService.setPurchaseStrategy(new ManualStrategy()); + + // 수동 로또 티켓 구매 + lottoService.buyLottoTicket(consumer, purchaseDto); + + // 자동 구매로 전략 변경 + lottoService.setPurchaseStrategy(new AutoStrategy()); + + // 자동 로또 티켓 구매 + lottoService.buyLottoTicket(consumer, purchaseDto); // 로또 구매 정보 출력 - outputView.printLottoTicketsInformation(consumer.getLottoTickets()); + outputView.printLottoTicketsInformation(consumer); // 지난 주 당첨번호 입력 String[] LastWeekWinningNumbers = inputView.inputLastWeekWinningLottoNumbers(); @@ -40,7 +63,7 @@ public void run() { int bonusNumber = inputView.inputBonusNumber(); // 지난 주 당첨 티켓 생성 - LottoTicket winningTicket = lottoService.winningNumberToTicket(LastWeekWinningNumbers); + LottoTicket winningTicket = lottoService.lottoNumberToTicket(LastWeekWinningNumbers); // 맞춘 번호 개수와 맞춘 보너스 번호 결과 List winningResult = lottoService.calculate(consumer.getLottoTickets(), winningTicket, bonusNumber); diff --git a/src/main/java/lotto/domain/LottoCalculator.java b/src/main/java/lotto/domain/LottoCalculator.java index fec51631437..ffe935c1e7c 100644 --- a/src/main/java/lotto/domain/LottoCalculator.java +++ b/src/main/java/lotto/domain/LottoCalculator.java @@ -3,16 +3,17 @@ import java.util.List; public class LottoCalculator { + /** * 전달받은 수 만큼 맞은 로또의 개수를 반환합니다. * - * @param prizes 로또 티켓의 결과 목록 + * @param prizes 로또 티켓의 결과 목록 * @param checkedPrize 확인할 로또 티켓 + * * @return int - * */ + */ public int getCountOfWin(List prizes, LottoPrize checkedPrize) { - return (int) prizes - .stream() + return (int) prizes.stream() .filter(prize -> LottoPrize.isMatched(prize, checkedPrize.getMatches(), checkedPrize.getIsWonBonusNumber())) .count(); } @@ -21,8 +22,9 @@ public int getCountOfWin(List prizes, LottoPrize checkedPrize) { * 당첨금을 계산하여 반환 합니다. * * @param prizes 로또 결과 객체 + * * @return int - * */ + */ public int getPrizeMoney(List prizes) { int prizeMoney = 0; @@ -37,9 +39,10 @@ public int getPrizeMoney(List prizes) { * 로또 수익률을 계산하여 반환 합니다. * * @param prizeMoney 당첨금 - * @param money 로또 구매 금액 + * @param money 로또 구매 금액 + * * @return double - * */ + */ public double getProfit(int prizeMoney, int money) { double rateOfReturn = (double) prizeMoney / (double) money; diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index a3b6f87fb8b..358a2667e50 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -3,32 +3,65 @@ import java.util.ArrayList; import java.util.List; -import static lotto.domain.LottoTicket.LOTTO_PRICE; - public class LottoConsumer { - /** 구매한 로또 티켓 목록 */ - private final List lottoTickets = new ArrayList<>(); + + /** 자동 로또 티켓 목록 */ + private final List lottoTicketsByAuto; + + /** 수동 로또 티켓 목록 */ + private final List lottoTicketsByManual; + + public LottoConsumer() { + this.lottoTicketsByAuto = new ArrayList<>(); + this.lottoTicketsByManual = new ArrayList<>(); + } + + /** + * 자동 로또 티켓을 추가합니다. + * + * @param lottoTickets 로또 티켓 목록 + */ + public void addAutoLottoTickets(List lottoTickets) { + this.lottoTicketsByAuto.addAll(lottoTickets); + } /** - * 로또 번호 생성하고 반환 합니다. + * 수동 로또 티켓을 추가합니다. * - * @param money 구매할 금액 - * */ - public void buyLotto(int money) { - int purchasedCount = money / LOTTO_PRICE; - - for (int i = 0; i < purchasedCount; i++) { - LottoGenerator generator = new LottoGenerator(); - lottoTickets.add(new LottoTicket(generator.generate())); - } + * @param lottoTickets 로또 티켓 목록 + */ + public void addManualLottoTickets(List lottoTickets) { + this.lottoTicketsByManual.addAll(lottoTickets); } /** - * 구매한 로또 티켓 목록을 반환 합니다. + * 전체 로또 티켓 목록을 반환 합니다. * * @return List - * */ + */ public List getLottoTickets() { + List lottoTickets = new ArrayList<>(); + lottoTickets.addAll(lottoTicketsByAuto); + lottoTickets.addAll(lottoTicketsByManual); + return lottoTickets; } + + /** + * 자동 로또 티켓 개수를 반환합니다. + * + * @return int + */ + public int getAutoTicketCount() { + return lottoTicketsByAuto.size(); + } + + /** + * 수동 로또 티켓 개수를 반환합니다. + * + * @return int + */ + public int getManualTicketCount() { + return lottoTicketsByManual.size(); + } } diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java deleted file mode 100644 index ee7936da84a..00000000000 --- a/src/main/java/lotto/domain/LottoGenerator.java +++ /dev/null @@ -1,34 +0,0 @@ -package lotto.domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class LottoGenerator { - /** 로또 숫자의 최솟값 */ - public static final int MIN_LOTTO_NUMBER = 1; - - /** 로또 숫자의 최댓값 */ - public static final int MAX_LOTTO_NUMBER = 45; - - /** - * 로또 번호를 생성하고 반환합니다. - * - * @return List 생성된 로또 티켓 목록 - * */ - public List generate() { - List numbers = new ArrayList<>(); - - for (int i = MIN_LOTTO_NUMBER ; i <= MAX_LOTTO_NUMBER ; i++) { - numbers.add(i); - } - - Collections.shuffle(numbers); - - List shuffledNumber = numbers.subList(0, 6); - - Collections.sort(shuffledNumber); - - return shuffledNumber; - } -} diff --git a/src/main/java/lotto/domain/LottoPrize.java b/src/main/java/lotto/domain/LottoPrize.java index bb80e506b55..cfedea9f512 100644 --- a/src/main/java/lotto/domain/LottoPrize.java +++ b/src/main/java/lotto/domain/LottoPrize.java @@ -35,10 +35,11 @@ public boolean getIsWonBonusNumber() { /** * matches 와 bonus 에 맞는 값을 반환 합니다. * - * @param matches 맞춘 개수 + * @param matches 맞춘 개수 * @param isWonBonusNumber 보너스 번호 맞춘 여부 + * * @return LottoPrize - * */ + */ public static LottoPrize findByMatchesAndBonus(int matches, boolean isWonBonusNumber) { return Arrays.stream(values()) .filter(prize -> isMatched(prize, matches, isWonBonusNumber)) @@ -49,11 +50,12 @@ public static LottoPrize findByMatchesAndBonus(int matches, boolean isWonBonusNu /** * 로또 티켓을 확인 합니다. * - * @param prize 로또 티켓의 결과 - * @param checkedCount 확인할 맞춘 개수 + * @param prize 로또 티켓의 결과 + * @param checkedCount 확인할 맞춘 개수 * @param isWonBonusNumber 보너스 번호 맞춘 여부 + * * @return boolean - * */ + */ public static boolean isMatched(LottoPrize prize, int checkedCount, boolean isWonBonusNumber) { if (checkedCount == SECOND_MATCHED_COUNT) { return checkSecond(prize, checkedCount, isWonBonusNumber); @@ -65,11 +67,12 @@ public static boolean isMatched(LottoPrize prize, int checkedCount, boolean isWo /** * 로또 티켓의 2등을 확인합니다. * - * @param prize 로또 티켓의 결과 - * @param checkedCount 확인할 맞춘 개수 + * @param prize 로또 티켓의 결과 + * @param checkedCount 확인할 맞춘 개수 * @param isMatchedBonusNumber 보너스 번호 맞춘 여부 + * * @return boolean - * */ + */ private static boolean checkSecond(LottoPrize prize, int checkedCount, boolean isMatchedBonusNumber) { if (isMatchedBonusNumber) { return prize.getIsWonBonusNumber() && prize.getMatches() == checkedCount; diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index 897d62b76bd..13ff5c933a8 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -6,11 +6,18 @@ /** * 로또 티켓을 관리하는 클래스 입니다. - * */ + */ public class LottoTicket { + /** 로또 가격 */ public static final int LOTTO_PRICE = 1000; + /** 로또 숫자의 최솟값 */ + public static final int MIN_LOTTO_NUMBER = 1; + + /** 로또 숫자의 최댓값 */ + public static final int MAX_LOTTO_NUMBER = 45; + /** 로또 번호 */ private final List numbers; @@ -22,7 +29,7 @@ public LottoTicket(List numbers) { * 로또 티켓을 반환 합니다. * * @return List - * */ + */ public List get() { return numbers; } @@ -31,9 +38,10 @@ public List get() { * 맞춘 결과를 반환 합니다. * * @param winningLottoTicket 당첨된 로또 티켓 - * @param bonusNumber 보너스 번호 + * @param bonusNumber 보너스 번호 + * * @return LottoPrize - * */ + */ public LottoPrize win(LottoTicket winningLottoTicket, int bonusNumber) { Set intersection = new HashSet<>(numbers); intersection.retainAll(winningLottoTicket.get()); diff --git a/src/main/java/lotto/domain/LottoTicketGenerator.java b/src/main/java/lotto/domain/LottoTicketGenerator.java new file mode 100644 index 00000000000..250288a8307 --- /dev/null +++ b/src/main/java/lotto/domain/LottoTicketGenerator.java @@ -0,0 +1,53 @@ +package lotto.domain; + +import static lotto.domain.LottoTicket.MAX_LOTTO_NUMBER; +import static lotto.domain.LottoTicket.MIN_LOTTO_NUMBER; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class LottoTicketGenerator { + + /** + * 자동 로또 번호를 생성하고 반환합니다. + * + * @return List 생성된 로또 티켓 목록 + */ + public LottoTicket autoGenerate() { + List numbers = new ArrayList<>(); + + for (int i = MIN_LOTTO_NUMBER ; i <= MAX_LOTTO_NUMBER ; i++) { + numbers.add(i); + } + + Collections.shuffle(numbers); + + List shuffledNumber = numbers.subList(0, 6); + + Collections.sort(shuffledNumber); + + return new LottoTicket(shuffledNumber); + } + + /** + * 수동 로또 번호를 전달 받아 LottoTicket 객체로 반환 합니다. + * + * @param numbers 로또 번호 + * + * @return LottoTicket + */ + public LottoTicket manualGenerate(String[] numbers) { + List lottoNumbers = Arrays.stream(numbers) + .map(Integer::parseInt) + .collect(Collectors.toList()); + + // 유효성 체크 + LottoValidator validator = new LottoValidator(); + validator.winningNumbersValidation(lottoNumbers); + + return new LottoTicket(lottoNumbers); + } +} diff --git a/src/main/java/lotto/domain/LastWeekLottoValidator.java b/src/main/java/lotto/domain/LottoValidator.java similarity index 52% rename from src/main/java/lotto/domain/LastWeekLottoValidator.java rename to src/main/java/lotto/domain/LottoValidator.java index d121a99573b..29c1be46aea 100644 --- a/src/main/java/lotto/domain/LastWeekLottoValidator.java +++ b/src/main/java/lotto/domain/LottoValidator.java @@ -1,34 +1,36 @@ package lotto.domain; +import static lotto.domain.LottoTicket.MAX_LOTTO_NUMBER; +import static lotto.domain.LottoTicket.MIN_LOTTO_NUMBER; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import static lotto.domain.LottoGenerator.MAX_LOTTO_NUMBER; -import static lotto.domain.LottoGenerator.MIN_LOTTO_NUMBER; - /** - * 지난 주 로또 번호의 유효성을 체크하는 클래스입니다. - * */ -public class LastWeekLottoValidator { + * 로또 번호의 유효성을 체크하는 클래스입니다. + */ +public class LottoValidator { + /** 로또 티켓의 숫자 개수 */ public static final int LOTTO_NUMBER_SIZE = 6; - private static final String COMMA_SEPARATED_NUMBERS = "당첨번호는 콤마로 구분된 숫자 6개이어야 합니다."; - private static final String AN_INTEGER_BETWEEN_1_AND_45 = "당첨번호는 1과 45 사이의 정수이어야 합니다."; - private static final String NOT_DUPLICATE_NUMBERS = "당첨번호에 중복된 숫자가 없어야 합니다."; + private static final String COMMA_SEPARATED_NUMBERS = "로또 번호는 콤마로 구분된 숫자 6개이어야 합니다."; + private static final String AN_INTEGER_BETWEEN_1_AND_45 = "로또 번호는 1과 45 사이의 정수이어야 합니다."; + private static final String NOT_DUPLICATE_NUMBERS = "로또 번호에 중복된 숫자가 없어야 합니다."; /** - * 지난 주 당첨 번호에 대한 유효성을 확인 합니다. + * 로또 번호에 대한 유효성을 확인 합니다. *

1. 번호가 6개 인지

*

2. 숫자로 되어있는지

*

3. 중복된 수가 없는지

* * @param numbers 지난 주 당첨 번호 - * @exception IllegalArgumentException 당첨번호는 콤마로 구분된 숫자 6개이어야 합니다. - * @exception IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. - * @exception IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. - * */ + * + * @throws IllegalArgumentException 로또 번호는 콤마로 구분된 숫자 6개이어야 합니다. + * @throws IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. + * @throws IllegalArgumentException 로또 번호에 중복된 숫자가 없어야 합니다. + */ public void winningNumbersValidation(List numbers) { // 숫자 개수 검사 this.checkCorrectLottoFormat(numbers); @@ -43,11 +45,12 @@ public void winningNumbersValidation(List numbers) { /** * 보너스 번호의 유효성을 검사합니다. * - * @param numbers 지난 주 당첨 번호 + * @param numbers 지난 주 당첨 번호 * @param bonusNumber 보너스 번호 - * @exception IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. - * @exception IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. - * */ + * + * @throws IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. + * @throws IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. + */ public void bonusNumberValidation(List numbers, int bonusNumber) { // 범위 검사 this.checkCorrectRange(bonusNumber); @@ -59,10 +62,11 @@ public void bonusNumberValidation(List numbers, int bonusNumber) { } /** - * 지난 주 당첨 번호는 6개의 숫자이어야 합니다. + * 로또 번호는 6개의 숫자이어야 합니다. * - * @param numbers 지난 주 당첨 번호 - * @exception IllegalArgumentException 당첨번호는 콤마로 구분된 숫자 6개이어야 합니다. + * @param numbers 로또 번호 + * + * @throws IllegalArgumentException 로또 번호는 콤마로 구분된 숫자 6개이어야 합니다. */ private void checkCorrectLottoFormat(List numbers) { if (numbers.size() != LOTTO_NUMBER_SIZE) { @@ -71,11 +75,12 @@ private void checkCorrectLottoFormat(List numbers) { } /** - * 당첨 번호가 1 ~ 45 사이의 수 인지 확인합니다. + * 로또 번호가 1 ~ 45 사이의 수 인지 확인합니다. + * + * @param number 로또 번호 * - * @param number 당첨 번호 - * @exception IllegalArgumentException 당첨번호는 1과 45 사이의 정수이어야 합니다. - * */ + * @throws IllegalArgumentException 로또 번호는 1과 45 사이의 정수이어야 합니다. + */ private void checkCorrectRange(int number) { if (number > MAX_LOTTO_NUMBER || number < MIN_LOTTO_NUMBER) { throw new IllegalArgumentException(AN_INTEGER_BETWEEN_1_AND_45); @@ -85,9 +90,10 @@ private void checkCorrectRange(int number) { /** * 중복된 번호가 없는지 확인합니다. * - * @param numbers 당첨 번호 - * @exception IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. - * */ + * @param numbers 로또 번호 + * + * @throws IllegalArgumentException 로또 번호에 중복된 숫자가 없어야 합니다. + */ private void checkUniqueNumber(List numbers) { int numberSize = new HashSet<>(numbers).size(); diff --git a/src/main/java/lotto/domain/purchaseStrategy/AutoStrategy.java b/src/main/java/lotto/domain/purchaseStrategy/AutoStrategy.java new file mode 100644 index 00000000000..ede3edc002b --- /dev/null +++ b/src/main/java/lotto/domain/purchaseStrategy/AutoStrategy.java @@ -0,0 +1,28 @@ +package lotto.domain.purchaseStrategy; + +import static lotto.domain.LottoTicket.LOTTO_PRICE; + +import java.util.ArrayList; +import java.util.List; +import lotto.domain.LottoConsumer; +import lotto.domain.LottoTicket; +import lotto.domain.LottoTicketGenerator; +import lotto.dto.LottoPurchaseDto; + +public class AutoStrategy implements PurchaseStrategy { + + @Override + public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator) { + List lottoTickets = new ArrayList<>(); + + int purchasedCount = purchaseDto.getMoney() / LOTTO_PRICE; + int autoPurchasedCount = purchasedCount - consumer.getManualTicketCount(); + + for (int i = 0 ; i < autoPurchasedCount ; i++) { + lottoTickets.add(generator.autoGenerate()); + } + + // 로또 티켓 추가 + consumer.addAutoLottoTickets(lottoTickets); + } +} diff --git a/src/main/java/lotto/domain/purchaseStrategy/ManualStrategy.java b/src/main/java/lotto/domain/purchaseStrategy/ManualStrategy.java new file mode 100644 index 00000000000..7386f0b1aaf --- /dev/null +++ b/src/main/java/lotto/domain/purchaseStrategy/ManualStrategy.java @@ -0,0 +1,23 @@ +package lotto.domain.purchaseStrategy; + +import java.util.ArrayList; +import java.util.List; +import lotto.domain.LottoConsumer; +import lotto.domain.LottoTicket; +import lotto.domain.LottoTicketGenerator; +import lotto.dto.LottoPurchaseDto; + +public class ManualStrategy implements PurchaseStrategy { + + @Override + public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator) { + List lottoTickets = new ArrayList<>(); + + for (String[] lottoNumber : purchaseDto.getLottoNumbers()) { + lottoTickets.add(generator.manualGenerate(lottoNumber)); + } + + // 로또 티켓 추가 + consumer.addManualLottoTickets(lottoTickets); + } +} diff --git a/src/main/java/lotto/domain/purchaseStrategy/PurchaseStrategy.java b/src/main/java/lotto/domain/purchaseStrategy/PurchaseStrategy.java new file mode 100644 index 00000000000..d223879e217 --- /dev/null +++ b/src/main/java/lotto/domain/purchaseStrategy/PurchaseStrategy.java @@ -0,0 +1,10 @@ +package lotto.domain.purchaseStrategy; + +import lotto.domain.LottoConsumer; +import lotto.domain.LottoTicketGenerator; +import lotto.dto.LottoPurchaseDto; + +public interface PurchaseStrategy { + + void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator); +} diff --git a/src/main/java/lotto/dto/LottoPurchaseDto.java b/src/main/java/lotto/dto/LottoPurchaseDto.java new file mode 100644 index 00000000000..a2f1ad6243e --- /dev/null +++ b/src/main/java/lotto/dto/LottoPurchaseDto.java @@ -0,0 +1,28 @@ +package lotto.dto; + +import java.util.ArrayList; +import java.util.List; + +public class LottoPurchaseDto { + + private final int money; + + private final List lottoNumbers; + + public LottoPurchaseDto(int money, List lottoNumbers) { + this.money = money; + this.lottoNumbers = new ArrayList<>(); + + if (lottoNumbers != null) { + this.lottoNumbers.addAll(lottoNumbers); + } + } + + public int getMoney() { + return money; + } + + public List getLottoNumbers() { + return lottoNumbers; + } +} diff --git a/src/main/java/lotto/factory/LottoApplicationFactory.java b/src/main/java/lotto/factory/LottoApplicationFactory.java index 8a91356e27d..a159eeae55c 100644 --- a/src/main/java/lotto/factory/LottoApplicationFactory.java +++ b/src/main/java/lotto/factory/LottoApplicationFactory.java @@ -1,13 +1,14 @@ package lotto.factory; import lotto.LottoApplication; -import lotto.domain.LastWeekLottoValidator; import lotto.domain.LottoCalculator; +import lotto.domain.LottoTicketGenerator; import lotto.service.LottoService; import lotto.view.InputView; import lotto.view.OutputView; public class LottoApplicationFactory { + private InputView createInputView() { return new InputView(); } @@ -18,9 +19,9 @@ private OutputView createOutputView() { private LottoService createLottoService() { LottoCalculator calculator = new LottoCalculator(); - LastWeekLottoValidator validator = new LastWeekLottoValidator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); - return new LottoService(calculator, validator); + return new LottoService(calculator, generator); } /** LottoApplication 파라미터 생성을 위한 Factory */ diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 3a1e5a83041..25b59723198 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -1,61 +1,72 @@ package lotto.service; -import lotto.domain.*; -import lotto.view.OutputView; - import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; +import lotto.domain.LottoCalculator; +import lotto.domain.LottoConsumer; +import lotto.domain.LottoPrize; +import lotto.domain.LottoTicket; +import lotto.domain.LottoTicketGenerator; +import lotto.domain.purchaseStrategy.PurchaseStrategy; +import lotto.dto.LottoPurchaseDto; +import lotto.view.OutputView; public class LottoService { + /** 로또 계산기 */ private final LottoCalculator calculator; - /** 지난 주 당첨 번호 유효성 검사기 */ - private final LastWeekLottoValidator validator; + /** 로또 번호 생성기 */ + private final LottoTicketGenerator generator; - public LottoService(LottoCalculator calculator, LastWeekLottoValidator validator) { + /** 로또 구매 전략 */ + private PurchaseStrategy strategy; + + public LottoService(LottoCalculator calculator, LottoTicketGenerator generator) { this.calculator = calculator; - this.validator = validator; + this.generator = generator; + } + + /** + * 구매 전략 세팅 + * + * @param strategy 구매 전략 (방법) + */ + public void setPurchaseStrategy(PurchaseStrategy strategy) { + this.strategy = strategy; } /** * 로또 티켓을 구매합니다. * - * @param consumer 로또 구매자 객체 - * @param money 구매 금액 - * */ - public void buyLotto(LottoConsumer consumer, int money) { - consumer.buyLotto(money); + * @param consumer 구매자 + * @param dto 구매정보 DTO + */ + public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto dto) { + strategy.buyLottoTicket(consumer, dto, generator); } /** - * 지난 주 당첨 로또를 가공하여 LottoTicket 으로 만듭니다. + * 로또 번호를 가공하여 LottoTicket 으로 만듭니다. + * + * @param numbers 로또 번호 * - * @param numbers 지난 주 당첨 번호 * @return LottoTicket - * */ - public LottoTicket winningNumberToTicket(String[] numbers) { - List lottoNumbers = Arrays.stream(numbers) - .map(Integer::parseInt) - .collect(Collectors.toList()); - - // 유효성 체크 - validator.winningNumbersValidation(lottoNumbers); - - return new LottoTicket(lottoNumbers); + */ + public LottoTicket lottoNumberToTicket(String[] numbers) { + return generator.manualGenerate(numbers); } /** * 로또를 계산하여 일치하는 개수의 목록을 반환합니다. * - * @param lottoTickets 구매한 로또 티켓 + * @param lottoTickets 구매한 로또 티켓 * @param winningTicket 지난 주 당첨 로또 티켓 - * @param bonusNumber 보너스 번호 + * @param bonusNumber 보너스 번호 + * * @return List - * */ + */ public List calculate(List lottoTickets, LottoTicket winningTicket, int bonusNumber) { List winningResult = new ArrayList<>(); @@ -73,7 +84,7 @@ public List calculate(List lottoTickets, LottoTicket wi * List 에서 null 값을 제거 합니다. * * @param lottoPrizes 로또 맞춘 결과 목록 - * */ + */ private void removeNullList(List lottoPrizes) { lottoPrizes.removeIf(Objects::isNull); } @@ -83,8 +94,8 @@ private void removeNullList(List lottoPrizes) { * 반복하여 view 에 결과를 전달하여 텍스트를 출력합니다. * * @param prizes 로또 결과 객체 목록 - * @param view 결과 view instance - * */ + * @param view 결과 view instance + */ public void printWinningInformation(List prizes, OutputView view) { for (LottoPrize prize : LottoPrize.values()) { view.printWinningInformation(prize, calculator.getCountOfWin(prizes, prize)); @@ -95,8 +106,8 @@ public void printWinningInformation(List prizes, OutputView view) { * 로또 수익률을 계산 합니다. * * @param prizes 로또 결과 객체 목록 - * @param money 구매 금액 - * */ + * @param money 구매 금액 + */ public Double getProfit(List prizes, int money) { int prizeMoney = calculator.getPrizeMoney(prizes); diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 2a1e3f34546..2f150c8061d 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,16 +1,19 @@ package lotto.view; +import static lotto.domain.LottoTicket.LOTTO_PRICE; + +import java.util.ArrayList; import java.util.InputMismatchException; +import java.util.List; import java.util.Scanner; -import static lotto.domain.LottoTicket.LOTTO_PRICE; - public class InputView { + /** * 구매할 금액을 입력 받아 반환합니다. * * @return int - * */ + */ public int insertMoney() { int scanValue; @@ -34,15 +37,14 @@ public int insertMoney() { * 지난 주 당첨 번호를 입력 받아 반환 합니다. * * @return String[] - * */ + */ public String[] inputLastWeekWinningLottoNumbers() { System.out.println("지난 주 당첨 번호를 입력해 주세요."); Scanner scanner = new Scanner(System.in); String scanValue = scanner.nextLine(); - return scanValue - .replace(" ", "") + return scanValue.replace(" ", "") .split(","); } @@ -50,11 +52,57 @@ public String[] inputLastWeekWinningLottoNumbers() { * 보너스 볼을 입력 받아 반환 합니다. * * @return int - * */ + */ public int inputBonusNumber() { System.out.println("보너스 볼을 입력해 주세요."); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } + + /** + * 수동으로 구매할 로또 수를 입력 받아 반환 합니다. + * + * @return int + */ + public int inputManuallyPurchasedLottoTicketCount() { + int scanValue; + + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + + try { + Scanner scanner = new Scanner(System.in); + scanValue = scanner.nextInt(); + } catch (InputMismatchException e) { + throw new IllegalArgumentException("숫자만 입력할 수 있습니다."); + } + + return scanValue; + } + + /** + * 수동으로 구매할 로또 번호를 입력 받아 반환 합니다. + * + * @param purchasedCount 수동 로또 구매 수 + * + * @return List + */ + public List inputManuallyPurchasedLottoTicketNumbers(int purchasedCount) { + if (purchasedCount < 1) { + return null; + } + + List numbers = new ArrayList<>(); + + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + Scanner scanner = new Scanner(System.in); + + for (int i = 0 ; i < purchasedCount ; i++) { + String scanValue = scanner.nextLine(); + numbers.add(scanValue.replace(" ", "") + .split(",")); + } + + return numbers; + } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index c0cf084bbed..759108760e2 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,20 +1,20 @@ package lotto.view; +import lotto.domain.LottoConsumer; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; -import java.util.List; - public class OutputView { + /** * 로또 구매 개수와 로또 번호를 출력합니다. * - * @param lottoTickets 로또 티켓 목록 - * */ - public void printLottoTicketsInformation(List lottoTickets) { - System.out.println(lottoTickets.size() + "개를 구매했습니다."); + * @param consumer 로또 구매자 + */ + public void printLottoTicketsInformation(LottoConsumer consumer) { + System.out.println("수동으로 " + consumer.getManualTicketCount() + "개, 자동으로 " + consumer.getAutoTicketCount() + "를 구매했습니다."); - for (LottoTicket lottoTicket : lottoTickets) { + for (LottoTicket lottoTicket : consumer.getLottoTickets()) { System.out.println(lottoTicket.get()); } } @@ -32,23 +32,22 @@ public void printResultTitle() { * * @param prize 로또 결과 * @param count 일치하는 개수 - * */ + */ public void printWinningInformation(LottoPrize prize, int count) { - System.out.print(prize.getMatches() +"개 일치"); + System.out.print(prize.getMatches() + "개 일치"); if (prize.getMatches() == 5 && prize.getIsWonBonusNumber()) { System.out.print(", 보너스 볼 일치"); } - System.out.println(" ("+ prize.getPrize() +"원) - " + count + "개"); - + System.out.println(" (" + prize.getPrize() + "원) - " + count + "개"); } /** * 수익률을 출력합니다. * * @param rate 수익률 - * */ + */ public void printProfit(Double rate) { System.out.println("총 수익률은 " + rate + "입니다."); } diff --git a/src/test/java/lotto/domain/LottoCalculatorTest.java b/src/test/java/lotto/domain/LottoCalculatorTest.java index 3a26862b53c..4ee55b01778 100644 --- a/src/test/java/lotto/domain/LottoCalculatorTest.java +++ b/src/test/java/lotto/domain/LottoCalculatorTest.java @@ -1,50 +1,39 @@ package lotto.domain; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import java.util.ArrayList; import java.util.List; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class LottoCalculatorTest { + @Test @DisplayName("로또_티켓의_당첨_결과를_반환합니다") void 로또_티켓의_당첨_결과를_반환합니다() { // given - List result = new ArrayList<>(); - result.add(LottoPrize.findByMatchesAndBonus(3, false)); - result.add(LottoPrize.findByMatchesAndBonus(3, false)); - result.add(LottoPrize.findByMatchesAndBonus(3, true)); - result.add(LottoPrize.findByMatchesAndBonus(4, false)); - result.add(LottoPrize.findByMatchesAndBonus(5, true)); - result.add(LottoPrize.findByMatchesAndBonus(5, false)); + List result = List.of(LottoPrize.THREE_MATCHES, LottoPrize.THREE_MATCHES, LottoPrize.FIVE_MATCHES); // when LottoCalculator calculator = new LottoCalculator(); int count = calculator.getCountOfWin(result, LottoPrize.THREE_MATCHES); // then - assertThat(count).isEqualTo(3); + assertThat(count).isEqualTo(2); } @Test @DisplayName("당첨금을_계산하여_반환합니다") void 당첨금을_계산하여_반환합니다() { // given - List result = new ArrayList<>(); - result.add(LottoPrize.findByMatchesAndBonus(3, false)); - result.add(LottoPrize.findByMatchesAndBonus(3, false)); - result.add(LottoPrize.findByMatchesAndBonus(3, true)); - result.add(LottoPrize.findByMatchesAndBonus(4, false)); + List result = List.of(LottoPrize.THREE_MATCHES, LottoPrize.FOUR_MATCHES); // when LottoCalculator calculator = new LottoCalculator(); int prizeMoney = calculator.getPrizeMoney(result); // then - assertThat(prizeMoney).isEqualTo(65000); + assertThat(prizeMoney).isEqualTo(55_000); } @Test diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index 69edd76e832..808c8ff85d9 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -1,25 +1,45 @@ package lotto.domain; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +import java.util.Arrays; +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.List; +class LottoConsumerTest { -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + @Test + @DisplayName("자동_로또_티켓을_추가합니다") + void 자동_로또_티켓을_추가합니다() { + // given + LottoTicket lottoTicket1 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket2 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + List lottoTickets = Arrays.asList(lottoTicket1, lottoTicket2); + + LottoConsumer consumer = new LottoConsumer(); + + // when + consumer.addAutoLottoTickets(lottoTickets); + + // then + assertThat(consumer.getAutoTicketCount()).isEqualTo(2); + } -class LottoConsumerTest { @Test - @DisplayName("전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다") - void 전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다() { + @DisplayName("수동_로또_티켓을_구매_합니다") + void 수동_로또_티켓을_구매_합니다() { // given - int moeny = 2000; + LottoTicket lottoTicket1 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket2 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + List lottoTickets = Arrays.asList(lottoTicket1, lottoTicket2); + + LottoConsumer consumer = new LottoConsumer(); // when - LottoConsumer consumer = new LottoConsumer(); - consumer.buyLotto(moeny); - List LottoTickets = consumer.getLottoTickets(); + consumer.addManualLottoTickets(lottoTickets); // then - assertThat(LottoTickets).hasSize(2); + assertThat(consumer.getManualTicketCount()).isEqualTo(2); } } diff --git a/src/test/java/lotto/domain/LastWeekLottoValidatorTest.java b/src/test/java/lotto/domain/LottoNumberValidatorTest.java similarity index 61% rename from src/test/java/lotto/domain/LastWeekLottoValidatorTest.java rename to src/test/java/lotto/domain/LottoNumberValidatorTest.java index 16f8f010a0d..4327e08dc46 100644 --- a/src/test/java/lotto/domain/LastWeekLottoValidatorTest.java +++ b/src/test/java/lotto/domain/LottoNumberValidatorTest.java @@ -1,15 +1,15 @@ package lotto.domain; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import java.util.Arrays; import java.util.List; - -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; @DisplayName("지난 주 당첨 로또 번호의 유효성을 테스트 합니다.") -class LastWeekLottoValidatorTest { +class LottoNumberValidatorTest { + @Test @DisplayName("지난_주_당첨_번호는_6개의_숫자입니다") void 지난_주_당첨_번호는_6개의_숫자입니다() { @@ -17,11 +17,10 @@ class LastWeekLottoValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5); // when - LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); + LottoValidator lottoNumberValidator = new LottoValidator(); // then - assertThatIllegalArgumentException() - .isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); } @Test @@ -31,11 +30,10 @@ class LastWeekLottoValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5, 70); // when - LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); + LottoValidator lottoNumberValidator = new LottoValidator(); // then - assertThatIllegalArgumentException() - .isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); } @Test @@ -45,11 +43,10 @@ class LastWeekLottoValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5, 5); // when - LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); + LottoValidator lottoNumberValidator = new LottoValidator(); // then - assertThatIllegalArgumentException() - .isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); } @Test @@ -60,10 +57,9 @@ class LastWeekLottoValidatorTest { int bonusNumber = 6; // when - LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); + LottoValidator lottoNumberValidator = new LottoValidator(); // then - assertThatIllegalArgumentException() - .isThrownBy(() -> lastWeekLottoValidator.bonusNumberValidation(numbers, bonusNumber)); + assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.bonusNumberValidation(numbers, bonusNumber)); } } diff --git a/src/test/java/lotto/domain/LottoPrizeTest.java b/src/test/java/lotto/domain/LottoPrizeTest.java new file mode 100644 index 00000000000..30299afc248 --- /dev/null +++ b/src/test/java/lotto/domain/LottoPrizeTest.java @@ -0,0 +1,25 @@ +package lotto.domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.Arrays; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class LottoPrizeTest { + + @Test + @DisplayName("이등_당첨을_확인합니다") + void 이등_당첨을_확인합니다() { + // given + LottoTicket purchasedLottoTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket winningLottoTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 10)); + int bonusNumber = 10; + + // when + LottoPrize result = purchasedLottoTicket.win(winningLottoTicket, bonusNumber); + + // then + assertThat(result.getMatches()).isEqualTo(5); + } +} diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoTicketGeneratorTest.java similarity index 61% rename from src/test/java/lotto/domain/LottoGeneratorTest.java rename to src/test/java/lotto/domain/LottoTicketGeneratorTest.java index c937ce6025b..74d98104a33 100644 --- a/src/test/java/lotto/domain/LottoGeneratorTest.java +++ b/src/test/java/lotto/domain/LottoTicketGeneratorTest.java @@ -1,35 +1,36 @@ package lotto.domain; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.List; +class LottoTicketGeneratorTest { -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - -class LottoGeneratorTest { @Test @DisplayName("로또_번호는_6개_입니다") void 로또_번호는_6개_입니다() { // given - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); // when - List numbers = generator.generate(); + LottoTicket lottoTicket = generator.autoGenerate(); // then - assertThat(numbers).hasSize(6); + assertThat(lottoTicket.get() + .size()).isEqualTo(6); } @Test @DisplayName("로또_번호는_중복되지_않습니다") void 로또_번호는_중복되지_않습니다() { // given - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); // when - List numbers = generator.generate(); - long count = numbers + LottoTicket lottoTicket = generator.autoGenerate(); + + long count = lottoTicket.get() .stream() .distinct() .count(); diff --git a/src/test/java/lotto/domain/LottoTicketTest.java b/src/test/java/lotto/domain/LottoTicketTest.java index c9da698da8d..0158037b227 100644 --- a/src/test/java/lotto/domain/LottoTicketTest.java +++ b/src/test/java/lotto/domain/LottoTicketTest.java @@ -1,15 +1,15 @@ package lotto.domain; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import java.util.Arrays; import java.util.List; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; @DisplayName("로또 티켓에 대한 테스트 코드") class LottoTicketTest { + @Test @DisplayName("로또_번호로_로또_티켓을_생성합니다") void 로또_번호로_로또_티켓을_생성합니다() { @@ -25,7 +25,7 @@ class LottoTicketTest { @Test @DisplayName("맞춘_결과를_반환_합니다") - void 맞춘_결과를_반환_합니다(){ + void 맞춘_결과를_반환_합니다() { // given LottoTicket purchasedLottoTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); LottoTicket winningLottoTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 9, 10)); @@ -38,4 +38,4 @@ class LottoTicketTest { assertThat(result.getMatches()).isEqualTo(4); assertThat(result.getIsWonBonusNumber()).isFalse(); } -} \ No newline at end of file +} diff --git a/src/test/java/lotto/service/LottoServiceTest.java b/src/test/java/lotto/service/LottoServiceTest.java new file mode 100644 index 00000000000..661597e5d2c --- /dev/null +++ b/src/test/java/lotto/service/LottoServiceTest.java @@ -0,0 +1,127 @@ +package lotto.service; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import lotto.domain.LottoCalculator; +import lotto.domain.LottoConsumer; +import lotto.domain.LottoPrize; +import lotto.domain.LottoTicket; +import lotto.domain.LottoTicketGenerator; +import lotto.domain.purchaseStrategy.AutoStrategy; +import lotto.domain.purchaseStrategy.ManualStrategy; +import lotto.dto.LottoPurchaseDto; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class LottoServiceTest { + + @Test + @DisplayName("자동_로또_티켓을_구매합니다") + void 자동_로또_티켓을_구매합니다() { + // given + int money = 4_000; + + LottoConsumer consumer = new LottoConsumer(); + LottoCalculator calculator = new LottoCalculator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + LottoPurchaseDto purchaseDto = new LottoPurchaseDto(money, null); + lottoService.setPurchaseStrategy(new AutoStrategy()); + + // when + lottoService.buyLottoTicket(consumer, purchaseDto); + + // then + assertThat(consumer.getLottoTickets() + .size()).isEqualTo(4); + } + + @Test + @DisplayName("수동_로또_티켓을_구매합니다") + void 수동_로또_티켓을_구매합니다() { + // given + int money = 2_000; + + String[] lottoNumber1 = {"1", "2", "3", "4", "5", "6"}; + String[] lottoNumber2 = {"1", "2", "3", "4", "5", "6"}; + + List LottoTickets = new ArrayList<>(); + LottoTickets.add(lottoNumber1); + LottoTickets.add(lottoNumber2); + + LottoConsumer consumer = new LottoConsumer(); + LottoCalculator calculator = new LottoCalculator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + LottoPurchaseDto purchaseDto = new LottoPurchaseDto(money, LottoTickets); + lottoService.setPurchaseStrategy(new ManualStrategy()); + + // when + lottoService.buyLottoTicket(consumer, purchaseDto); + + // then + assertThat(consumer.getLottoTickets() + .size()).isEqualTo(2); + } + + @Test + @DisplayName("로또_번호를_가공하여_로또_티켓을_만듭니다.") + void 로또_번호를_가공하여_로또_티켓을_만듭니다() { + // given + String[] lottoNumber = {"1", "2", "3", "4", "5", "6"}; + + LottoCalculator calculator = new LottoCalculator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + + // when + LottoTicket lottoTicket = lottoService.lottoNumberToTicket(lottoNumber); + + // then + assertThat(lottoTicket.get()).isNotNull(); + } + + @Test + @DisplayName("로또를_계산하여_일치하는_개수의_목록을_반환합니다") + void 로또를_계산하여_일치하는_개수의_목록을_반환합니다() { + // given + int bonusNumber = 24; + + LottoCalculator calculator = new LottoCalculator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + + LottoTicket winningTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + + List lottoTickets = new ArrayList<>(); + LottoTicket lottoTicket_1 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket_2 = new LottoTicket(Arrays.asList(11, 12, 13, 14, 15, 16)); + lottoTickets.add(lottoTicket_1); + lottoTickets.add(lottoTicket_2); + + // when + List lottoPrizes = lottoService.calculate(lottoTickets, winningTicket, bonusNumber); + + // then + assertThat(lottoPrizes).hasSize(1); + assertThat(lottoPrizes.get(0)).isEqualTo(LottoPrize.SIX_MATCHES); + } + + @Test + @DisplayName("로또_수익률을_계산_합니다") + void 로또_수익률을_계산_합니다() { + // given + LottoCalculator calculator = new LottoCalculator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + + // when + Double profit = lottoService.getProfit(List.of(LottoPrize.THREE_MATCHES), 1_000); + + // then + assertThat(profit).isEqualTo(5.0); + } +}