diff --git a/src/main/java/JavaLottoApplication.java b/src/main/java/JavaLottoApplication.java index 8f8a9f7f6eb..514b62cf09f 100644 --- a/src/main/java/JavaLottoApplication.java +++ b/src/main/java/JavaLottoApplication.java @@ -1,8 +1,8 @@ -import ui.AutoResultView; +import ui.ManualResultView; import ui.common.ResultView; public class JavaLottoApplication { public static void main(String... args) { - ResultView.lottoResult(new AutoResultView()); + ResultView.lottoResult(new ManualResultView()); } } diff --git a/src/main/java/constant/Rank.java b/src/main/java/constant/Rank.java index d7b55f3aa59..0e8652618c1 100644 --- a/src/main/java/constant/Rank.java +++ b/src/main/java/constant/Rank.java @@ -1,19 +1,28 @@ package constant; +import java.util.Arrays; +import java.util.stream.Collectors; + public enum Rank { - FIRST(2000000000L), - SECOND(1500000L), - SECOND_WITH_BONUS(30000000L), - THIRD(50000L), - FOURTH(5000L), - UNKNOWN(0L); + FIRST(6, 2000000000L), + SECOND(5, 1500000L), + SECOND_WITH_BONUS(7, 30000000L), + THIRD(4, 50000L), + FOURTH(3, 5000L), + UNKNOWN(0, 0L); + private final int countOfMatchedNumber; private final long reward; - Rank(long reward) { + Rank(int countOfMatchedNumber, long reward) { + this.countOfMatchedNumber = countOfMatchedNumber; this.reward = reward; } + public static Rank findRank(int countOfMatchedNumber) { + return Arrays.stream(Rank.values()).filter(rank -> rank.countOfMatchedNumber == countOfMatchedNumber).collect(Collectors.toList()).get(0); + } + public long findReward() { return reward; } diff --git a/src/main/java/domain/lottery/LotteryNumber.java b/src/main/java/domain/lottery/LotteryNumber.java new file mode 100644 index 00000000000..0a8357242db --- /dev/null +++ b/src/main/java/domain/lottery/LotteryNumber.java @@ -0,0 +1,38 @@ +package domain.lottery; + +import java.util.Objects; + +public class LotteryNumber { + private static final int MIN_NUMBER = 1; + private static final int MAX_NUMBER = 45; + private final int number; + + private LotteryNumber(int number) { + this.number = number; + + if (number < MIN_NUMBER || number > MAX_NUMBER) { + throw new IllegalArgumentException("유효하지 않은 번호입니다."); + } + } + + public static LotteryNumber of(int number) { + return new LotteryNumber(number); + } + + public int number() { + return number; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LotteryNumber that = (LotteryNumber) o; + return number == that.number; + } + + @Override + public int hashCode() { + return Objects.hash(number); + } +} diff --git a/src/main/java/domain/lottery/LotteryTicket.java b/src/main/java/domain/lottery/LotteryTicket.java index a87ec6202b1..f826043b79d 100644 --- a/src/main/java/domain/lottery/LotteryTicket.java +++ b/src/main/java/domain/lottery/LotteryTicket.java @@ -1,15 +1,33 @@ package domain.lottery; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; public class LotteryTicket { - private final List ticketNumbers; + private final List ticketNumbers; - public LotteryTicket(List ticketNumbers) { + private static final int COUNT_OF_LOTTERY_NUMBERS = 6; + + private LotteryTicket(List ticketNumbers) { this.ticketNumbers = ticketNumbers; + + ticketNumbers = ticketNumbers.stream().distinct().collect(Collectors.toList()); + + if (ticketNumbers.size() < COUNT_OF_LOTTERY_NUMBERS) { + throw new IllegalArgumentException("복권번호가 중복됩니다."); + } } - public List getTicketNumbers() { + public static LotteryTicket of(List ticketNumbers) { + return new LotteryTicket(Optional.ofNullable(ticketNumbers).get()); + } + + public List getTicketNumbers() { return ticketNumbers; } + + public void add(LotteryNumber lotteryNumber) { + ticketNumbers.add(lotteryNumber); + } } diff --git a/src/main/java/domain/lottery/LotteryTickets.java b/src/main/java/domain/lottery/LotteryTickets.java index 8f2a1c9ee43..2c5d24a91ad 100644 --- a/src/main/java/domain/lottery/LotteryTickets.java +++ b/src/main/java/domain/lottery/LotteryTickets.java @@ -15,7 +15,14 @@ public LotteryTickets(long amount) { int countOfLotteryTickets = (int) Calculator.divide(amount, DEFAULT_LOTTERY_TICKET_PRICE); lotteryTickets = new ArrayList<>(countOfLotteryTickets); for (long count = 1; count <= countOfLotteryTickets; count++) { - lotteryTickets.add(new LotteryTicket(RandomNumberGenerator.generateNumbers())); + lotteryTickets.add(LotteryTicket.of(RandomNumberGenerator.generateNumbers())); + } + } + + public LotteryTickets(int numberOfLotteryTickets) { + lotteryTickets = new ArrayList<>(numberOfLotteryTickets); + for (long count = 1; count <= numberOfLotteryTickets; count++) { + lotteryTickets.add(LotteryTicket.of(RandomNumberGenerator.generateNumbers())); } } @@ -23,6 +30,10 @@ public LotteryTickets(List lotteryTickets) { this.lotteryTickets = lotteryTickets; } + public void add(LotteryTicket lotteryTicket) { + lotteryTickets.add(lotteryTicket); + } + public List getLotteryTickets() { return lotteryTickets; } diff --git a/src/main/java/domain/lottery/RewardLotteryTickets.java b/src/main/java/domain/lottery/RewardLotteryTickets.java index 38aa4783dce..c9828dbdcda 100644 --- a/src/main/java/domain/lottery/RewardLotteryTickets.java +++ b/src/main/java/domain/lottery/RewardLotteryTickets.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.List; -import static constant.LotteryRules.*; public class RewardLotteryTickets { private final List ranks; @@ -22,20 +21,7 @@ public RewardLotteryTickets(LotteryTickets lotteryTickets, WinnerLotteryTicket w } public long countOfRank(int countOfMatchedNumber) { - switch (countOfMatchedNumber) { - case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FOURTH_PLACE: - return ranks.stream().filter(rank -> rank == Rank.FOURTH).count(); - case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_THIRD_PLACE: - return ranks.stream().filter(rank -> rank == Rank.THIRD).count(); - case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_PLACE: - return ranks.stream().filter(rank -> rank == Rank.SECOND).count(); - case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_WITH_BONUS_PLACE: - return ranks.stream().filter(rank -> rank == Rank.SECOND_WITH_BONUS).count(); - case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FIRST_PLACE: - return ranks.stream().filter(rank -> rank == Rank.FIRST).count(); - default: - return ranks.stream().filter(rank -> rank == Rank.UNKNOWN).count(); - } + return ranks.stream().filter(rank -> rank == Rank.findRank(countOfMatchedNumber)).count(); } public long sumAllRewards() { diff --git a/src/main/java/domain/lottery/WinnerLotteryTicket.java b/src/main/java/domain/lottery/WinnerLotteryTicket.java index ec172b65b48..8c6c5e702d4 100644 --- a/src/main/java/domain/lottery/WinnerLotteryTicket.java +++ b/src/main/java/domain/lottery/WinnerLotteryTicket.java @@ -6,20 +6,25 @@ public class WinnerLotteryTicket { private final LotteryTicket winnerLotteryTicket; - private final int bonusTicketNumber; + private final LotteryNumber bonusTicketNumber; - public WinnerLotteryTicket(LotteryTicket winnerTicket, int bonusTicketNumber) { + public WinnerLotteryTicket(LotteryTicket winnerTicket, LotteryNumber bonusTicketNumber) { this.winnerLotteryTicket = winnerTicket; this.bonusTicketNumber = bonusTicketNumber; + + if (winnerLotteryTicket.getTicketNumbers().contains(bonusTicketNumber)) { + throw new IllegalArgumentException("당첨번호와 보너스 번호가 중복됩니다."); + } } public boolean hasBonusTicketNumber(LotteryTicket lotteryTicket) { - return lotteryTicket.getTicketNumbers().stream().anyMatch(number -> number == bonusTicketNumber); + return lotteryTicket.getTicketNumbers().stream().anyMatch(lotteryNumber -> lotteryNumber.equals(bonusTicketNumber)); } public Rank findRank(LotteryTicket lotteryTicket) { int countOfMatchedNumber = (int) lotteryTicket.getTicketNumbers().stream().filter(winnerLotteryTicket.getTicketNumbers()::contains).count(); - if (lotteryTicket.getTicketNumbers().contains(bonusTicketNumber) && countOfMatchedNumber < NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FIRST_PLACE) countOfMatchedNumber += 2; + if (lotteryTicket.getTicketNumbers().contains(bonusTicketNumber) && countOfMatchedNumber == NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_PLACE) + countOfMatchedNumber += 2; switch (countOfMatchedNumber) { case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FOURTH_PLACE: return Rank.FOURTH; diff --git a/src/main/java/ui/AutoResultView.java b/src/main/java/ui/AutoResultView.java index 1806a67567a..3946b5d84d9 100644 --- a/src/main/java/ui/AutoResultView.java +++ b/src/main/java/ui/AutoResultView.java @@ -1,12 +1,9 @@ package ui; -import domain.lottery.RewardLotteryTickets; +import domain.lottery.*; import service.LotteryService; import ui.common.InputView; import ui.common.Result; -import domain.lottery.LotteryTicket; -import domain.lottery.LotteryTickets; -import domain.lottery.WinnerLotteryTicket; import util.Calculator; import util.Converter; @@ -45,7 +42,7 @@ public void printTicketNumbers() { System.out.println("보너스 볼을 입력해 주세요."); int bonusTicketNumber = InputView.inputInteger(); - winnerLotteryTicket = new WinnerLotteryTicket(winnerTicket, bonusTicketNumber); + winnerLotteryTicket = new WinnerLotteryTicket(winnerTicket, LotteryNumber.of(bonusTicketNumber)); rewardLotteryTickets = new RewardLotteryTickets(lotteryTickets, winnerLotteryTicket); } diff --git a/src/main/java/ui/ManualResultView.java b/src/main/java/ui/ManualResultView.java new file mode 100644 index 00000000000..a8eebcf419d --- /dev/null +++ b/src/main/java/ui/ManualResultView.java @@ -0,0 +1,74 @@ +package ui; + +import domain.lottery.*; +import service.LotteryService; +import ui.common.InputView; +import ui.common.Result; +import util.Calculator; +import util.Converter; + +import static constant.LotteryRules.DEFAULT_LOTTERY_TICKET_PRICE; + +public class ManualResultView implements Result { + private final String DELIMITER = ", "; + private LotteryTickets lotteryTickets; + private WinnerLotteryTicket winnerLotteryTicket; + private RewardLotteryTickets rewardLotteryTickets; + + @Override + public void printAll() { + LotteryService lotteryService = new LotteryService(); + + printTicketNumbers(); + printLotteryResult(lotteryService); + } + + @Override + public void printTicketNumbers() { + System.out.println("구입금액을 입력해 주세요."); + + long amount = InputView.inputInteger(); + int totalNumberOfLotteryTickets = (int) Calculator.divide(amount, DEFAULT_LOTTERY_TICKET_PRICE); + + System.out.println(); + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + int numberOfManualLotteryTickets = InputView.inputInteger(); + + lotteryTickets = new LotteryTickets(totalNumberOfLotteryTickets - numberOfManualLotteryTickets); + + System.out.println(); + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + for (int count = 1; count <= numberOfManualLotteryTickets; count++) { + lotteryTickets.add(Converter.convertStringToLotteryTicket(InputView.inputString().split(DELIMITER))); + } + + System.out.println(); + System.out.println("수동으로 " + numberOfManualLotteryTickets + "장, 자동으로 " + (totalNumberOfLotteryTickets - numberOfManualLotteryTickets) + "개를 구매했습니다."); + for (LotteryTicket lotteryTicket : lotteryTickets.getLotteryTickets()) { + System.out.println(lotteryTicket.getTicketNumbers()); + } + + System.out.println(); + System.out.println("지난 주 당첨 번호를 입력해 주세요."); + LotteryTicket winnerTicket = Converter.convertStringToLotteryTicket(InputView.inputString().split(DELIMITER)); + + System.out.println("보너스 볼을 입력해 주세요."); + int bonusTicketNumber = InputView.inputInteger(); + winnerLotteryTicket = new WinnerLotteryTicket(winnerTicket, LotteryNumber.of(bonusTicketNumber)); + rewardLotteryTickets = new RewardLotteryTickets(lotteryTickets, winnerLotteryTicket); + } + + @Override + public void printLotteryResult(LotteryService lotteryService) { + System.out.println(); + System.out.println("당첨 통계"); + System.out.println("---------"); + + System.out.println("3개 일치 (5000원)- " + lotteryService.countOfLotteryWinners(3, rewardLotteryTickets) + "개"); + System.out.println("4개 일치 (50000원)- " + lotteryService.countOfLotteryWinners(4, rewardLotteryTickets) + "개"); + System.out.println("5개 일치 (1500000원)- " + lotteryService.countOfLotteryWinners(5, rewardLotteryTickets) + "개"); + System.out.println("5개 일치, 보너스 볼 일치(30000000원)- " + lotteryService.countOfLotteryWinners(7, rewardLotteryTickets) + "개"); + System.out.println("6개 일치 (2000000000원)- " + lotteryService.countOfLotteryWinners(6, rewardLotteryTickets) + "개"); + System.out.println("총 수익률은 " + Calculator.rateOfProfit((long) lotteryTickets.getLotteryTickets().size() * DEFAULT_LOTTERY_TICKET_PRICE, lotteryService.findTotalRewards(new RewardLotteryTickets(lotteryTickets, winnerLotteryTicket))) + "입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임)"); + } +} diff --git a/src/main/java/util/Converter.java b/src/main/java/util/Converter.java index 6af0ebc7803..fca0519dfd1 100644 --- a/src/main/java/util/Converter.java +++ b/src/main/java/util/Converter.java @@ -1,17 +1,18 @@ package util; +import domain.lottery.LotteryNumber; import domain.lottery.LotteryTicket; import java.util.ArrayList; -import java.util.List; public class Converter { public static LotteryTicket convertStringToLotteryTicket(String[] numbers) { - List lotteryTicketNumbers = new ArrayList<>(); + + LotteryTicket lotteryTicket = LotteryTicket.of(new ArrayList<>()); for (String number : numbers) { - lotteryTicketNumbers.add(Integer.parseInt(number)); + lotteryTicket.add(LotteryNumber.of(Integer.parseInt(number))); } - return new LotteryTicket(lotteryTicketNumbers); + return lotteryTicket; } } diff --git a/src/main/java/util/RandomNumberGenerator.java b/src/main/java/util/RandomNumberGenerator.java index fce0903786f..c553d210669 100644 --- a/src/main/java/util/RandomNumberGenerator.java +++ b/src/main/java/util/RandomNumberGenerator.java @@ -1,20 +1,22 @@ package util; +import domain.lottery.LotteryNumber; + import java.util.ArrayList; import java.util.Collections; import java.util.List; public class RandomNumberGenerator { - public static List generateNumbers() { - List numberCandidates = new ArrayList<>(); + public static List generateNumbers() { + List numberCandidates = new ArrayList<>(); for (int number = 1; number <= 45; number++) { - numberCandidates.add(number); + numberCandidates.add(LotteryNumber.of(number)); } Collections.shuffle(numberCandidates); - List ticketNumbers = new ArrayList<>(); + List ticketNumbers = new ArrayList<>(); for (int index = 0; index < 6; index++) { ticketNumbers.add(numberCandidates.get(index)); } diff --git a/src/test/java/ConverterTest.java b/src/test/java/ConverterTest.java index fd40721967e..454d5eb45d4 100644 --- a/src/test/java/ConverterTest.java +++ b/src/test/java/ConverterTest.java @@ -1,3 +1,4 @@ +import domain.lottery.LotteryNumber; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import util.Converter; @@ -14,7 +15,9 @@ public class ConverterTest { @Order(1) public void 복권변환_성공() { String[] numbers = {"1", "2", "3", "4", "5", "6"}; - List expected = Arrays.asList(1, 2, 3, 4, 5, 6); + List expected = Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6)); assertThat(Converter.convertStringToLotteryTicket(numbers).getTicketNumbers()).isEqualTo(expected); } diff --git a/src/test/java/LotteryNumberTest.java b/src/test/java/LotteryNumberTest.java new file mode 100644 index 00000000000..f7fc8fccb9f --- /dev/null +++ b/src/test/java/LotteryNumberTest.java @@ -0,0 +1,41 @@ +import domain.lottery.LotteryNumber; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +public class LotteryNumberTest { + + @Test + @Order(1) + public void 유효하지_않은_로또넘버_1미만() { + assertThatThrownBy( + () -> LotteryNumber.of(0) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("유효하지 않은 번호입니다."); + } + + @Test + @Order(2) + public void 유효하지_않은_로또넘버_45초과() { + assertThatThrownBy( + () -> LotteryNumber.of(46) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("유효하지 않은 번호입니다."); + } + + @Test + @Order(3) + public void 유효한_로또넘버() { + LotteryNumber numberOne = LotteryNumber.of(1); + LotteryNumber numberTen = LotteryNumber.of(10); + + assertAll( + () -> assertThat(numberOne.number()).isEqualTo(1), + () -> assertThat(numberTen.number()).isEqualTo(10) + ); + } + +} diff --git a/src/test/java/LotteryServiceTest.java b/src/test/java/LotteryServiceTest.java index 2f0b899631e..50c07f158fc 100644 --- a/src/test/java/LotteryServiceTest.java +++ b/src/test/java/LotteryServiceTest.java @@ -1,11 +1,8 @@ -import domain.lottery.RewardLotteryTickets; -import service.LotteryService; -import domain.lottery.LotteryTicket; -import domain.lottery.LotteryTickets; -import domain.lottery.WinnerLotteryTicket; +import domain.lottery.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import service.LotteryService; import java.util.Arrays; import java.util.List; @@ -25,12 +22,22 @@ public class LotteryServiceTest { public void init() { lotteryService = new LotteryService(); - firstPrizeLotteryTickets = new LotteryTickets(List.of(new LotteryTicket(Arrays.asList(1, 2, 3, 4, 5, 6)))); - secondPrizeLotteryTickets = new LotteryTickets(List.of(new LotteryTicket(Arrays.asList(2, 3, 4, 6, 1, 10)))); - secondPrizeWithBonusNumberLotteryTickets = new LotteryTickets(List.of(new LotteryTicket(Arrays.asList(2, 3, 4, 6, 5, 7)))); - noPrizeLotteryTickets = new LotteryTickets(List.of(new LotteryTicket(Arrays.asList(11, 21, 31, 41, 15, 16)))); - LotteryTicket winnerTicketNumbers = new LotteryTicket(List.of(1, 2, 3, 4, 5, 6)); - winnerTicket = new WinnerLotteryTicket(winnerTicketNumbers, 7); + firstPrizeLotteryTickets = new LotteryTickets(List.of(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))))); + secondPrizeLotteryTickets = new LotteryTickets(List.of(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(2), LotteryNumber.of(3), LotteryNumber.of(4), + LotteryNumber.of(6), LotteryNumber.of(1), LotteryNumber.of(10))))); + secondPrizeWithBonusNumberLotteryTickets = new LotteryTickets(List.of(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(2), LotteryNumber.of(3), LotteryNumber.of(4), + LotteryNumber.of(6), LotteryNumber.of(5), LotteryNumber.of(7))))); + noPrizeLotteryTickets = new LotteryTickets(List.of(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(11), LotteryNumber.of(21), LotteryNumber.of(31), + LotteryNumber.of(41), LotteryNumber.of(15), LotteryNumber.of(16))))); + LotteryTicket winnerTicketNumbers = LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))); + winnerTicket = new WinnerLotteryTicket(winnerTicketNumbers, LotteryNumber.of(7)); } @Test diff --git a/src/test/java/LotteryTicketTest.java b/src/test/java/LotteryTicketTest.java new file mode 100644 index 00000000000..5e3e9749aee --- /dev/null +++ b/src/test/java/LotteryTicketTest.java @@ -0,0 +1,43 @@ +import domain.lottery.LotteryNumber; +import domain.lottery.LotteryTicket; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class LotteryTicketTest { + @Test + @Order(0) + public void 당첨번호생성_복권번호_중복() { + assertThatThrownBy( + () -> LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(3), LotteryNumber.of(5), LotteryNumber.of(7))) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("복권번호가 중복됩니다."); + } + + @Test + @Order(1) + public void 당첨번호생성_유효하지않은_복권번호_1미만() { + assertThatThrownBy( + () -> LotteryTicket.of(Arrays.asList( + LotteryNumber.of(0), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(7))) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("유효하지 않은 번호입니다."); + } + + @Test + @Order(2) + public void 당첨번호생성_유효하지않은_복권번호_45초과() { + assertThatThrownBy( + () -> LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(47))) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("유효하지 않은 번호입니다."); + } +} diff --git a/src/test/java/LotteryTicketsTest.java b/src/test/java/LotteryTicketsTest.java index 0ec7b830367..75914ad4280 100644 --- a/src/test/java/LotteryTicketsTest.java +++ b/src/test/java/LotteryTicketsTest.java @@ -1,8 +1,11 @@ +import domain.lottery.LotteryNumber; import domain.lottery.LotteryTicket; import domain.lottery.LotteryTickets; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import java.util.Arrays; + import static org.assertj.core.api.Assertions.assertThat; public class LotteryTicketsTest { @@ -11,19 +14,28 @@ public class LotteryTicketsTest { @Order(1) public void 복권번호생성_1개() { LotteryTickets lotteryTickets = new LotteryTickets(1000L); - - for (LotteryTicket lotteryTicket : lotteryTickets.getLotteryTickets()) { - assertThat(lotteryTicket.getTicketNumbers().stream().filter(number -> number >= 1 && number <= 45)).hasSize(lotteryTicket.getTicketNumbers().size()); - } + assertThat(lotteryTickets.getLotteryTickets()).hasSize(1); } @Test @Order(2) public void 복권번호생성_10개() { LotteryTickets lotteryTickets = new LotteryTickets(10000L); + assertThat(lotteryTickets.getLotteryTickets()).hasSize(10); + } + + @Test + @Order(3) + public void 복권번호생성_수동2_자동12() { + LotteryTickets lotteryTickets = new LotteryTickets(12); + assertThat(lotteryTickets.getLotteryTickets()).hasSize(12); - for (LotteryTicket lotteryTicket : lotteryTickets.getLotteryTickets()) { - assertThat(lotteryTicket.getTicketNumbers().stream().filter(number -> number >= 1 && number <= 45)).hasSize(lotteryTicket.getTicketNumbers().size()); - } + lotteryTickets.add(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(7)))); + lotteryTickets.add(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(10)))); + assertThat(lotteryTickets.getLotteryTickets()).hasSize(14); } } diff --git a/src/test/java/RandomNumberGeneratorTest.java b/src/test/java/RandomNumberGeneratorTest.java index f47bf0fde9f..f3f3ef6f54e 100644 --- a/src/test/java/RandomNumberGeneratorTest.java +++ b/src/test/java/RandomNumberGeneratorTest.java @@ -9,6 +9,6 @@ public class RandomNumberGeneratorTest { @Test @Order(1) public void 랜덤복권번호생성_성공() { - assertThat(RandomNumberGenerator.generateNumbers()).filteredOn(number -> number >= 1 && number <= 45).hasSize(6); + assertThat(RandomNumberGenerator.generateNumbers()).hasSize(6); } } diff --git a/src/test/java/RewardLotteryTicketTest.java b/src/test/java/RewardLotteryTicketTest.java new file mode 100644 index 00000000000..96111cc20e4 --- /dev/null +++ b/src/test/java/RewardLotteryTicketTest.java @@ -0,0 +1,54 @@ +import domain.lottery.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +public class RewardLotteryTicketTest { + + private RewardLotteryTickets rewardLotteryTickets; + + @BeforeEach + public void init() { + LotteryTickets lotteryTickets = new LotteryTickets(List.of( + LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))), + LotteryTicket.of(Arrays.asList( + LotteryNumber.of(6), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(10))), + LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(11), LotteryNumber.of(5), LotteryNumber.of(6))), + LotteryTicket.of(Arrays.asList( + LotteryNumber.of(11), LotteryNumber.of(12), LotteryNumber.of(13), + LotteryNumber.of(14), LotteryNumber.of(15), LotteryNumber.of(17))) + )); + WinnerLotteryTicket winnerLotteryTicket = new WinnerLotteryTicket(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))), LotteryNumber.of(10)); + rewardLotteryTickets = new RewardLotteryTickets(lotteryTickets, winnerLotteryTicket); + } + + @Test + @Order(0) + public void 모든로또티켓_등수확인() { + assertAll( + () -> assertThat(rewardLotteryTickets.countOfRank(6)).isEqualTo(1), + () -> assertThat(rewardLotteryTickets.countOfRank(5)).isEqualTo(1), + () -> assertThat(rewardLotteryTickets.countOfRank(7)).isEqualTo(1), + () -> assertThat(rewardLotteryTickets.countOfRank(0)).isEqualTo(1) + ); + } + + @Test + @Order(1) + public void 모든로또티켓_당첨금액확인() { + assertThat(rewardLotteryTickets.sumAllRewards()).isEqualTo(2031500000L); + } +} diff --git a/src/test/java/WinnerLotteryTicketTest.java b/src/test/java/WinnerLotteryTicketTest.java index 8ccdfd6a3ad..31110fffa3f 100644 --- a/src/test/java/WinnerLotteryTicketTest.java +++ b/src/test/java/WinnerLotteryTicketTest.java @@ -1,49 +1,115 @@ import constant.Rank; +import domain.lottery.LotteryNumber; import domain.lottery.LotteryTicket; import domain.lottery.WinnerLotteryTicket; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; -import java.util.List; +import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class WinnerLotteryTicketTest { - private LotteryTicket firstPrizeLotteryTicket; - private LotteryTicket noPrizeLotteryTicket; private WinnerLotteryTicket matchedWinnerLotteryTicket; private WinnerLotteryTicket unmatchedWinnerLotteryTicket; @BeforeEach public void init() { - firstPrizeLotteryTicket = new LotteryTicket(List.of(1, 2, 3, 4, 5, 6)); - noPrizeLotteryTicket = new LotteryTicket(List.of(11, 21, 31, 41, 15, 16)); - matchedWinnerLotteryTicket = new WinnerLotteryTicket(new LotteryTicket(List.of(1, 2, 3, 4, 5, 6)), 5); - unmatchedWinnerLotteryTicket = new WinnerLotteryTicket(new LotteryTicket(List.of(1, 2, 3, 4, 5, 6)), 7); + matchedWinnerLotteryTicket = new WinnerLotteryTicket(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))), LotteryNumber.of(11)); + unmatchedWinnerLotteryTicket = new WinnerLotteryTicket(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))), LotteryNumber.of(7)); + } + + @Test + @Order(0) + public void 당첨번호확인_당첨번호_보너스번호_중복() { + assertThatThrownBy( + () -> new WinnerLotteryTicket(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))), LotteryNumber.of(3)) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("당첨번호와 보너스 번호가 중복됩니다."); } @Test @Order(1) + public void 당첨번호확인_보너스번호_1미만() { + assertThatThrownBy( + () -> new WinnerLotteryTicket(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))), LotteryNumber.of(0)) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("유효하지 않은 번호입니다."); + } + + @Test + @Order(2) + public void 당첨번호확인_보너스번호_45초과() { + assertThatThrownBy( + () -> new WinnerLotteryTicket(LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))), LotteryNumber.of(46)) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("유효하지 않은 번호입니다."); + } + + @Test + @Order(3) public void 당첨등수확인_1등_당첨() { + LotteryTicket firstPrizeLotteryTicket = LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6))); assertThat(matchedWinnerLotteryTicket.findRank(firstPrizeLotteryTicket)).isEqualTo(Rank.FIRST); } @Test - @Order(2) + @Order(4) + public void 당첨등수확인_2등_당첨() { + LotteryTicket secondPrizeLotteryTicket = LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(6), LotteryNumber.of(10))); + assertThat(matchedWinnerLotteryTicket.findRank(secondPrizeLotteryTicket)).isEqualTo(Rank.SECOND); + } + + @Test + @Order(5) + public void 당첨등수확인_2등_보너스번호_당첨() { + LotteryTicket secondPrizeWithBonusLotteryTicket = LotteryTicket.of(Arrays.asList( + LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3), + LotteryNumber.of(4), LotteryNumber.of(6), LotteryNumber.of(11))); + assertThat(matchedWinnerLotteryTicket.findRank(secondPrizeWithBonusLotteryTicket)).isEqualTo(Rank.SECOND_WITH_BONUS); + } + + + @Test + @Order(6) public void 당첨등수확인_꼴등_당첨() { + LotteryTicket noPrizeLotteryTicket = LotteryTicket.of(Arrays.asList( + LotteryNumber.of(11), LotteryNumber.of(12), LotteryNumber.of(13), + LotteryNumber.of(14), LotteryNumber.of(15), LotteryNumber.of(17))); assertThat(unmatchedWinnerLotteryTicket.findRank(noPrizeLotteryTicket)).isEqualTo(Rank.UNKNOWN); } @Test - @Order(3) + @Order(7) public void 보너스번호일치여부_일치() { - assertThat(matchedWinnerLotteryTicket.hasBonusTicketNumber(firstPrizeLotteryTicket)).isTrue(); + LotteryTicket withBonusNumber = LotteryTicket.of(Arrays.asList( + LotteryNumber.of(11), LotteryNumber.of(21), LotteryNumber.of(31), + LotteryNumber.of(41), LotteryNumber.of(12), LotteryNumber.of(22))); + assertThat(matchedWinnerLotteryTicket.hasBonusTicketNumber(withBonusNumber)).isTrue(); } @Test - @Order(4) + @Order(8) public void 보너스번호일치여부_불일치() { - assertThat(unmatchedWinnerLotteryTicket.hasBonusTicketNumber(firstPrizeLotteryTicket)).isFalse(); + LotteryTicket withoutBonusNumber = LotteryTicket.of(Arrays.asList( + LotteryNumber.of(17), LotteryNumber.of(27), LotteryNumber.of(37), + LotteryNumber.of(18), LotteryNumber.of(28), LotteryNumber.of(38))); + assertThat(unmatchedWinnerLotteryTicket.hasBonusTicketNumber(withoutBonusNumber)).isFalse(); } }