diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java new file mode 100644 index 00000000000..0b0d63898ea --- /dev/null +++ b/src/main/java/step4/LottoApplication.java @@ -0,0 +1,29 @@ +package step4; + +import step4.domain.*; +import step4.view.InputView; +import step4.view.OutputView; + +import java.util.List; + +public class LottoApplication { + + public static void main(String[] args) { + final int inputMoney = InputView.askMoneyToInput(); + final int numberOfManualTickets = InputView.askNumberOfManualTicket(); + final int numberOfAutoTickets = LottoSeller.countAutoTickets(inputMoney, numberOfManualTickets); + + List manualTickets = InputView.askNumbersForManualTickets(numberOfManualTickets); + OutputView.printNumberOfTickets(numberOfManualTickets, numberOfAutoTickets); + + LottoTickets lottoTickets = LottoSeller.issueLottoTicket(manualTickets, numberOfAutoTickets); + OutputView.printLottoTickets(lottoTickets); + + LuckyTicket luckyTicket = LottoSeller + .getLuckyNumber(InputView.askLuckyNumber(), InputView.askBonusNumber()); + + ResultSheet result = ResultSheet.getResult(lottoTickets, luckyTicket); + OutputView.printResult(result); + } +} + diff --git a/src/main/java/step4/domain/LottoBalls.java b/src/main/java/step4/domain/LottoBalls.java new file mode 100644 index 00000000000..53f61d205c9 --- /dev/null +++ b/src/main/java/step4/domain/LottoBalls.java @@ -0,0 +1,17 @@ +package step4.domain; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class LottoBalls { + + private static List lottoBalls = IntStream + .rangeClosed(LottoNumber.MINIMUM_LOTTO_NUMBER, LottoNumber.MAXIMUM_LOTTO_NUMBER) + .boxed() + .collect(Collectors.toList()); + + static List getLottoBalls() { + return lottoBalls; + } +} diff --git a/src/main/java/step4/domain/LottoNumber.java b/src/main/java/step4/domain/LottoNumber.java new file mode 100644 index 00000000000..04a33a9605c --- /dev/null +++ b/src/main/java/step4/domain/LottoNumber.java @@ -0,0 +1,47 @@ +package step4.domain; + +import java.util.Objects; + +public class LottoNumber { + static final String ALERT_OUT_OF_RANGE_OF_LOTTO_NUMBER = "로또번호는 1부터 45까지의 자연수만 가능합니다."; + static final int MINIMUM_LOTTO_NUMBER = 1; + static final int MAXIMUM_LOTTO_NUMBER = 45; + private int number; + + private LottoNumber(int number) { + if (isOutOfRange(number)) { + throw new IllegalArgumentException(ALERT_OUT_OF_RANGE_OF_LOTTO_NUMBER); + } + this.number = number; + } + + public static LottoNumber from(Integer number) { + return new LottoNumber(number); + } + + private boolean isOutOfRange(int number) { + return number < MINIMUM_LOTTO_NUMBER || number > MAXIMUM_LOTTO_NUMBER; + } + + public int getNumber() { + return number; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoNumber that = (LottoNumber) o; + return number == that.number; + } + + @Override + public int hashCode() { + return Objects.hash(number); + } + + @Override + public String toString() { + return number + ""; + } +} diff --git a/src/main/java/step4/domain/LottoRank.java b/src/main/java/step4/domain/LottoRank.java new file mode 100644 index 00000000000..85dbff5aaf4 --- /dev/null +++ b/src/main/java/step4/domain/LottoRank.java @@ -0,0 +1,44 @@ +package step4.domain; + +import java.util.Arrays; + +public enum LottoRank { + + FIRST_PLACE(6, 2_000_000_000), + SECOND_PLACE(5, 30_000_000), + THIRD_PLACE(5, 1_500_000), + FOURTH_PLACE(4, 50_000), + FIFTH_PLACE(3, 5_000), + LOSER(0, 0); + + private int numberOfMatchedToLuckyNumber; + private int prizeMoney; + + LottoRank(int numberOfMatchedToLuckyNumber, int prizeMoney) { + this.numberOfMatchedToLuckyNumber = numberOfMatchedToLuckyNumber; + this.prizeMoney = prizeMoney; + } + + public static LottoRank from(LottoTicket lottoTicket, LuckyTicket luckyTicket) { + int countMatchedNumbers = lottoTicket.getNumberOfMatchedToLuckyNumber(luckyTicket); + boolean isMatchedToBonusNumber = lottoTicket.isBonusNumberMatched(luckyTicket); + + if ((countMatchedNumbers == SECOND_PLACE.numberOfMatchedToLuckyNumber) && isMatchedToBonusNumber) { + return LottoRank.SECOND_PLACE; + } + return Arrays.stream(LottoRank.values()) + .filter(lottoRank -> lottoRank.numberOfMatchedToLuckyNumber == countMatchedNumbers) + .filter(lottoRank -> lottoRank.prizeMoney != SECOND_PLACE.prizeMoney) + .findFirst() + .orElse(LOSER); + } + + public int getNumberOfMatchingNumber() { + return numberOfMatchedToLuckyNumber; + } + + public int getPrizeMoney() { + return prizeMoney; + } + +} diff --git a/src/main/java/step4/domain/LottoSeller.java b/src/main/java/step4/domain/LottoSeller.java new file mode 100644 index 00000000000..a594c9dfdbc --- /dev/null +++ b/src/main/java/step4/domain/LottoSeller.java @@ -0,0 +1,59 @@ +package step4.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class LottoSeller { + static final int PRICE_OF_A_LOTTO_TICKET = 1000; + static final String ALERT_MISSING_MONEY = "돈을 넣어주세요. 로또복권은 한 장당 1000원 입니다."; + private static final String ALERT_SHORT_OF_MONEY = "돈이 모자랍니다."; + private static final String ALERT_NEGATIVE_NUMBER = "구매할 수동로또 개수는 음수가 될 수 없습니다."; + static final String NUMBER_SEPARATOR = ","; + + public static int countAutoTickets(int inputMoney, int numberOfManualTickets) { + validationInputData(inputMoney, numberOfManualTickets); + return (inputMoney / PRICE_OF_A_LOTTO_TICKET) - numberOfManualTickets; + } + + public static LottoTickets issueLottoTicket(List manualTickets, int numberOfAutoTickets) { + List lottoTickets = new ArrayList<>(); + + for (String manualTicket : manualTickets) { + List parsedManualTicket = parseToNumbers(manualTicket); + lottoTickets.add(LottoTicketGenerator.issueManualTickets(parsedManualTicket)); + } + for (int i = 0; i < numberOfAutoTickets; i++) { //TODO: index i가 사용되지 않고 있음 + lottoTickets.add(LottoTicketGenerator.issueAutoTickets()); + } + return LottoTickets.from(lottoTickets); + } + + private static List parseToNumbers(String manualTicket) { + return Arrays.stream(manualTicket.split(NUMBER_SEPARATOR)) + .map(String::trim) + .mapToInt(Integer::parseInt) + .boxed() + .collect(Collectors.toList()); + } + + public static LuckyTicket getLuckyNumber(List inputLuckyNumber, int bonusNumber) { + List luckyTicket = inputLuckyNumber.stream() + .map(LottoNumber::from) + .collect(Collectors.toList()); + return LuckyTicket.of(luckyTicket, LottoNumber.from(bonusNumber)); + } + + private static void validationInputData(int inputMoney, int numberOfManualTickets) { + if (inputMoney < PRICE_OF_A_LOTTO_TICKET) { + throw new IllegalArgumentException(ALERT_MISSING_MONEY); + } + if (numberOfManualTickets < 0) { + throw new IllegalArgumentException(ALERT_NEGATIVE_NUMBER); + } + if (numberOfManualTickets * PRICE_OF_A_LOTTO_TICKET > inputMoney) { + throw new IllegalArgumentException(ALERT_SHORT_OF_MONEY); + } + } +} diff --git a/src/main/java/step4/domain/LottoTicket.java b/src/main/java/step4/domain/LottoTicket.java new file mode 100644 index 00000000000..0d87a481767 --- /dev/null +++ b/src/main/java/step4/domain/LottoTicket.java @@ -0,0 +1,69 @@ +package step4.domain; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class LottoTicket { + static final String ALERT_NUMBER_OVERLAP = "중복된 로또 번호가 존재합니다."; + static final String AlERT_DIFFERENT_SIZE_OF_NUMBERS = "로또번호의 개수가 6개가 아닙니다."; + + private final List lottoTicket; + + LottoTicket(List lottoTicket) { + validationNumberSize(lottoTicket); + validationNumberOverlap(lottoTicket); + this.lottoTicket = lottoTicket; + } + + public int getNumberOfMatchedToLuckyNumber(LuckyTicket luckyTicket) { + return (int) luckyTicket.getLuckyNumber().stream() + .filter(lottoTicket::contains) + .count(); + } + + boolean isBonusNumberMatched(LuckyTicket luckyTicket) { + return luckyTicket.checkBonusNumber(lottoTicket); + } + + private void validationNumberSize(List lottoTicket) { + if (lottoTicket.size() != LottoTicketGenerator.BASIC_LOTTO_SIZE) { + throw new IllegalArgumentException(AlERT_DIFFERENT_SIZE_OF_NUMBERS); + } + } + + private void validationNumberOverlap(List lottoTicket) { + long SizeOfLottoTicket = lottoTicket.stream() + .mapToLong(LottoNumber::getNumber) + .distinct() + .count(); + + if (SizeOfLottoTicket != LottoTicketGenerator.BASIC_LOTTO_SIZE) { + throw new IllegalArgumentException(ALERT_NUMBER_OVERLAP); + } + } + + public List getLottoTicket() { + return Collections.unmodifiableList(lottoTicket); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoTicket that = (LottoTicket) o; + return Objects.equals(lottoTicket, that.lottoTicket); + } + + @Override + public int hashCode() { + return Objects.hash(lottoTicket); + } + + @Override + public String toString() { + return "LottoTicket{" + + "lottoTicket=" + lottoTicket + + '}'; + } +} diff --git a/src/main/java/step4/domain/LottoTicketGenerator.java b/src/main/java/step4/domain/LottoTicketGenerator.java new file mode 100644 index 00000000000..3c764ab28ed --- /dev/null +++ b/src/main/java/step4/domain/LottoTicketGenerator.java @@ -0,0 +1,34 @@ +package step4.domain; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class LottoTicketGenerator { + static final int BASIC_LOTTO_SIZE = 6; + + static LottoTicket issueAutoTickets() { + return new LottoTicket(pickLottoBalls(LottoBalls.getLottoBalls())); + } + + static LottoTicket issueManualTickets(List manualTicket) { + return new LottoTicket(manualTicket.stream() + .sorted() + .map(LottoNumber::from) + .collect(Collectors.toList())); + } + + static List pickLottoBalls(List lottoBalls) { + shuffleLottoBalls(lottoBalls); + return lottoBalls.stream() + .limit(BASIC_LOTTO_SIZE) + .sorted() + .map(LottoNumber::from) + .collect(Collectors.toList()); + } + + static void shuffleLottoBalls(List lottoBalls) { + Collections.shuffle(lottoBalls); + } + +} diff --git a/src/main/java/step4/domain/LottoTickets.java b/src/main/java/step4/domain/LottoTickets.java new file mode 100644 index 00000000000..04c22756942 --- /dev/null +++ b/src/main/java/step4/domain/LottoTickets.java @@ -0,0 +1,20 @@ +package step4.domain; + +import java.util.Collections; +import java.util.List; + +public class LottoTickets { + private final List lottoTickets; + + private LottoTickets(List lottoTickets) { + this.lottoTickets = lottoTickets; + } + + public static LottoTickets from(List lottoTickets) { + return new LottoTickets(lottoTickets); + } + + public List getLottoTickets() { + return Collections.unmodifiableList(lottoTickets); + } +} diff --git a/src/main/java/step4/domain/LuckyTicket.java b/src/main/java/step4/domain/LuckyTicket.java new file mode 100644 index 00000000000..27721411bd6 --- /dev/null +++ b/src/main/java/step4/domain/LuckyTicket.java @@ -0,0 +1,26 @@ +package step4.domain; + +import java.util.Collections; +import java.util.List; + +public class LuckyTicket { + private final List luckyNumber; + private final LottoNumber bonusNumber; + + private LuckyTicket(List luckyNumber, LottoNumber bonusNumber) { + this.luckyNumber = luckyNumber; + this.bonusNumber = bonusNumber; + } + + static LuckyTicket of(List luckyNumber, LottoNumber bonusNumber) { + return new LuckyTicket(luckyNumber, bonusNumber); + } + + public List getLuckyNumber() { + return Collections.unmodifiableList(luckyNumber); + } + + boolean checkBonusNumber(List lottoTicket) { + return lottoTicket.contains(bonusNumber); + } +} diff --git a/src/main/java/step4/domain/ResultSheet.java b/src/main/java/step4/domain/ResultSheet.java new file mode 100644 index 00000000000..208f1173dda --- /dev/null +++ b/src/main/java/step4/domain/ResultSheet.java @@ -0,0 +1,59 @@ +package step4.domain; + +import java.util.HashMap; +import java.util.Map; + +public class ResultSheet { + private static final int LOTTO_TICKET_PRICE = 1000; + + private Map resultSheet; + + private ResultSheet(Map resultSheet) { + this.resultSheet = resultSheet; + } + + public static ResultSheet getResult(LottoTickets lottoTickets, LuckyTicket luckyTicket) { + Map lottoResultMap = new HashMap<>(); + + for (LottoTicket lottoTicket : lottoTickets.getLottoTickets()) { + LottoRank lottoRank = LottoRank.from(lottoTicket, luckyTicket); + int numberOfTicketsCorrespondingToRank = lottoResultMap.getOrDefault(lottoRank, 0); + lottoResultMap.put(lottoRank, ++numberOfTicketsCorrespondingToRank); + } + return new ResultSheet(lottoResultMap); + } + + private int getTotalTicketsBought() { + return resultSheet.values() + .stream() + .reduce(Integer::sum) + .orElse(0); + } + + private int totalMoneySpentForTickets() { + return getTotalTicketsBought() * LOTTO_TICKET_PRICE; + } + + private int getNumberOfTicketsCorrespondingToRank(LottoRank lottoRank) { + return resultSheet.getOrDefault(lottoRank, 0); + } + + private int getEachPrizeMoney(LottoRank lottoRank) { + return lottoRank.getPrizeMoney() * this.getNumberOfTicketsCorrespondingToRank(lottoRank); + } + + private int getTotalPrizeMoney() { + return resultSheet.keySet() + .stream() + .mapToInt(this::getEachPrizeMoney) + .sum(); + } + + public double getEarningRate() { + return (double) getTotalPrizeMoney() / totalMoneySpentForTickets(); + } + + public Map getResultMap() { + return resultSheet; + } +} diff --git a/src/main/java/step4/view/InputView.java b/src/main/java/step4/view/InputView.java new file mode 100644 index 00000000000..3b78af00835 --- /dev/null +++ b/src/main/java/step4/view/InputView.java @@ -0,0 +1,61 @@ +package step4.view; + +import step4.domain.LottoSeller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + static final String NUMBER_SEPARATOR = ","; + private static Scanner scanner = new Scanner(System.in); + + public static int askMoneyToInput() { + System.out.println("구입금액을 입력해 주세요."); + return scanner.nextInt(); + } + + public static int askNumberOfManualTicket() { + printBlackLine(); + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + return scanner.nextInt(); + } + + public static List askNumbersForManualTickets(int numberOfManualTickets) { + printBlackLine(); + scanner.nextLine(); + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + List manualTickets = new ArrayList<>(); + + for (int i = 0; i < numberOfManualTickets; i++) { + String inputString = scanner.nextLine(); + manualTickets.add(inputString); + } + printBlackLine(); + return manualTickets; + } + + public static List askLuckyNumber() { + printBlackLine(); + System.out.println("지난 주 당첨 번호를 입력해주세요."); + String inputLuckyNumber = scanner.nextLine(); + printBlackLine(); + + return Arrays.stream(inputLuckyNumber.split(NUMBER_SEPARATOR)) + .map(String::trim) + .mapToInt(Integer::parseInt) + .boxed() + .collect(Collectors.toList()); + } + + public static int askBonusNumber() { + System.out.println("보너스 볼을 입력해 주세요."); + return scanner.nextInt(); + } + + private static void printBlackLine() { + System.out.println(); + } +} diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java new file mode 100644 index 00000000000..7260be5ca76 --- /dev/null +++ b/src/main/java/step4/view/OutputView.java @@ -0,0 +1,42 @@ +package step4.view; + +import step4.domain.LottoRank; +import step4.domain.LottoTicket; +import step4.domain.LottoTickets; +import step4.domain.ResultSheet; + +public class OutputView { + private static final String MESSAGE_FOR_TOTAL_NUMBER_OF_LOTTO_BOUGHT = "수동으로 %d개, 자동으로 %d개를 구매했습니다."; + private static final String MESSAGE_FOR_ALL_PLACE = "%d개 일치 (%d원) - %d개"; + private static final String MESSAGE_FOR_SECOND_PLACE = "%d개 일치, 보너스 볼 일치 (%d원) - %d개"; + private static final String MESSAGE_FOR_EARNING_RATE = "총 수익률은 %.2f 입니다."; + private static final int PRIZE_FOR_LOSER = 0; + private static final int SECOND_PLACE_PRIZE = 30_000_000; + + public static void printNumberOfTickets(int numberOfManualTickets, int numberOfAutoTickets) { + System.out.println(String.format(MESSAGE_FOR_TOTAL_NUMBER_OF_LOTTO_BOUGHT, + numberOfManualTickets, + numberOfAutoTickets)); + } + + public static void printLottoTickets(LottoTickets lottoTickets) { + lottoTickets.getLottoTickets().stream() + .map(LottoTicket::getLottoTicket) + .forEach(System.out::println); + } + + public static void printResult(ResultSheet result) { + System.out.println("당첨 통계"); + System.out.println("---------"); + for (LottoRank rank : LottoRank.values()) { + String messageFormat = + (rank.getPrizeMoney() == SECOND_PLACE_PRIZE) ? MESSAGE_FOR_SECOND_PLACE : MESSAGE_FOR_ALL_PLACE; + System.out.println(String.format(messageFormat, + rank.getNumberOfMatchingNumber(), + rank.getPrizeMoney(), + result.getResultMap().getOrDefault(rank, PRIZE_FOR_LOSER))); + } + System.out.println(String.format(MESSAGE_FOR_EARNING_RATE, result.getEarningRate())); + } + +} diff --git a/src/test/java/step4/domain/LottoNumberTest.java b/src/test/java/step4/domain/LottoNumberTest.java new file mode 100644 index 00000000000..72a60a90649 --- /dev/null +++ b/src/test/java/step4/domain/LottoNumberTest.java @@ -0,0 +1,33 @@ +package step4.domain; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class LottoNumberTest { + @Test + void 로또번호_객체를_생성한다() { + //Given + int randomNumber = 39; + LottoNumber lottoNumber = LottoNumber.from(randomNumber); + + //When + //Then + assertThat(lottoNumber.getNumber()).isEqualTo(39); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 0, 46}) + void 로또번호가_1보다_작고_45_보다_크면_예외가_발생한다(int num) { + //Given + //When + //Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + LottoNumber.from(num); + }).withMessageContaining(LottoNumber.ALERT_OUT_OF_RANGE_OF_LOTTO_NUMBER); + } +} diff --git a/src/test/java/step4/domain/LottoSellerTest.java b/src/test/java/step4/domain/LottoSellerTest.java new file mode 100644 index 00000000000..7877bfb18f8 --- /dev/null +++ b/src/test/java/step4/domain/LottoSellerTest.java @@ -0,0 +1,96 @@ +package step4.domain; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class LottoSellerTest { + @Test + void 입력받은_금액에_따라_구입하는_로또복권의_개수를_반환한다() { + //Given + int inputMoney = 14000; + + //When + int lottoTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); + + //Then + assertThat(lottoTicketsToBuy).isEqualTo(inputMoney / LottoSeller.PRICE_OF_A_LOTTO_TICKET); + } + + @Test + void 입력받은_금액이_로또복권_한_장_가격보다_낮을_경우_예외가_발생한다() { + //Given + int inputInsufficientMoney = 900; + int inputNegativeNumber = -1; + + //When + //Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + LottoSeller.countLottoTickets(inputInsufficientMoney); + LottoSeller.countLottoTickets(inputNegativeNumber); + }).withMessage(LottoSeller.ALERT_MISSING_MONEY); + } + + @Test + void 구입할_개수만큼_로또복권을_발행한다() { + //Given + int inputMoney = 14000; + int numberOfTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); + + //When + LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); + + //Then + assertThat(lottoTickets.getLottoTickets().size()).isEqualTo(numberOfTicketsToBuy); + } + + @Test + void 당첨번호와_일치한_번호_개수를_반환한다() { + //Given + List testLuckyNumber = Arrays.asList(1, 2, 3, 4, 5, 6); + int bonusNumber = 7; + LuckyTicket luckyTicket = LottoSeller.getLuckyNumber(testLuckyNumber, bonusNumber); + + List matchesThreeNumbers = Arrays.asList(1, 3, 5, 7, 9, 11); + LottoTicket ticketMatchesThreeNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(matchesThreeNumbers)); + + //When + long result = ticketMatchesThreeNumbers.getNumberOfMatchedToLuckyNumber(luckyTicket); + + //Then + assertThat(result).isEqualTo(3); + } + + @Test + void 당첨통계를_반환한다() { + //Given + List testLuckyNumber = Arrays.asList(1, 2, 3, 4, 5, 6); + int bonusNumber = 7; + LuckyTicket luckyTicket = LottoSeller.getLuckyNumber(testLuckyNumber, bonusNumber); + + List matchesFourNumbers = Arrays.asList(1, 2, 3, 4, 7, 8); + List matchesFiveNumbers = Arrays.asList(1, 2, 3, 4, 5, 8); + LottoTicket ticketMatchesFourNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(matchesFourNumbers)); + LottoTicket ticketMatchesFiveNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(matchesFiveNumbers)); + LottoTicket ticketMatchesSixNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(testLuckyNumber)); + + List lottoTickets = new ArrayList<>(); + lottoTickets.add(ticketMatchesFourNumbers); + lottoTickets.add(ticketMatchesFiveNumbers); + lottoTickets.add(ticketMatchesSixNumbers); + + //When + ResultSheet resultMap = ResultSheet.getResult(LottoTickets.from(lottoTickets), luckyTicket); + + //Then + assertThat(resultMap.getResultMap().get(LottoRank.FIRST_PLACE)).isEqualTo(1); + assertThat(resultMap.getResultMap().get(LottoRank.SECOND_PLACE)).isEqualTo(1); + assertThat(resultMap.getResultMap().get(LottoRank.THIRD_PLACE)).isEqualTo(1); + } +} diff --git a/src/test/java/step4/domain/LottoTicketGeneratorTest.java b/src/test/java/step4/domain/LottoTicketGeneratorTest.java new file mode 100644 index 00000000000..b3c20d94e38 --- /dev/null +++ b/src/test/java/step4/domain/LottoTicketGeneratorTest.java @@ -0,0 +1,52 @@ +package step4.domain; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoTicketGeneratorTest { + @Test + void 로또복권을_생성한다() { + //Given + LottoTicket lottoTicket = LottoTicketGenerator.issue(); + //When + //Then + assertThat(lottoTicket.getLottoTicket().size()).isEqualTo(LottoTicketGenerator.BASIC_LOTTO_SIZE); + } + + @Test + void 로또번호_1부터_45까지를_생성하여_리스트에_담는다() { + //Given + List lottoBalls = LottoBalls.getLottoBalls(); + + //When + //Then + assertThat(lottoBalls.size()).isEqualTo(LottoNumber.MAXIMUM_LOTTO_NUMBER); + } + + @Test + void 로또번호가_담긴_리스트로부터_6개의_숫자를_추출하여_리스트에_담는다() { + //Given + List lottoBalls = LottoBalls.getLottoBalls(); + + //When + List lotto = LottoTicketGenerator.pickLottoBalls(lottoBalls); + + //Then + assertThat(lotto.size()).isEqualTo(LottoTicketGenerator.BASIC_LOTTO_SIZE); + } + + @Test + void 추출된_6개의_숫자를_오름차순으로_정렬한다() { + //Given + List lottoBalls = LottoBalls.getLottoBalls(); + + //When + List lotto = LottoTicketGenerator.pickLottoBalls(lottoBalls); + + //Then + assertThat(lotto.get(LottoTicketGenerator.BASIC_LOTTO_SIZE - 1).getNumber()).isGreaterThan(lotto.get(0).getNumber()); + } +} diff --git a/src/test/java/step4/domain/LottoTicketTest.java b/src/test/java/step4/domain/LottoTicketTest.java new file mode 100644 index 00000000000..a5147776d91 --- /dev/null +++ b/src/test/java/step4/domain/LottoTicketTest.java @@ -0,0 +1,47 @@ +package step4.domain; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class LottoTicketTest { + + @Test + void 로또복권의_로또번호가_중복될_경우_예외가_발생한다() { + //Given + List overlapNumbers = Arrays.asList(1, 1, 3, 4, 5, 6); + + //When + //Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + new LottoTicket(overlapNumbers + .stream() + .map(LottoNumber::from) + .collect(Collectors.toList())); + }).withMessageContaining(LottoTicket.ALERT_NUMBER_OVERLAP); + } + + @Test + void 로또복권의_로또번호가_6개보다_작거나_클_경우_예외가_발생한다() { + //Given + List lackOfNumbers = Arrays.asList(1, 2, 3, 4, 5); + List excessOfNumbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + + //When + //Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + new LottoTicket(lackOfNumbers.stream() + .map(LottoNumber::from) + .collect(Collectors.toList())); + new LottoTicket(excessOfNumbers.stream() + .map(LottoNumber::from) + .collect(Collectors.toList())); + }).withMessageContaining(LottoTicket.AlERT_DIFFERENT_SIZE_OF_NUMBERS); + } +}