diff --git "a/docs/\352\270\260\353\212\245\353\252\251\353\241\235.md" "b/docs/\352\270\260\353\212\245\353\252\251\353\241\235.md" index f4b09a34df..dc91d0c35c 100644 --- "a/docs/\352\270\260\353\212\245\353\252\251\353\241\235.md" +++ "b/docs/\352\270\260\353\212\245\353\252\251\353\241\235.md" @@ -26,4 +26,44 @@ - [x] 당첨된 티켓 개수 저장하는 기능 - [x] 수익률을 계산하는 기능 - [x] 당첨된 수익금을 더하는 기능 - - [x] 구입금액 기준 수익률 계산하는 기능 \ No newline at end of file + - [x] 구입금액 기준 수익률 계산하는 기능 + +--- + +## 로또 수동 구매 기능목록 + +- [x] 수동으로 구매할 로또 티켓의 수를 입력 받는 기능 + - [x] 숫자를 입력 받는 기능 + - [x] 숫자인지 확인하는 기능 + - [x] 양의 정수인지 확인하는 기능 + - [x] 보유한 금액에 맞는 티켓을 구매하려는지 확인하는 기능 + +- [x] 수동으로 구매할 번호를 입력 받는 기능 + - [x] `,` 단위로 잘라내는 기능 + - [x] 숫자인지 판별하는 기능 + - [x] 1~45 사이의 숫자인지 판별하는 기능 + - [x] 중복숫자인지 판별하는 기능 + - [x] 잘라낸 숫자의 개수가 6개인지 판별하는 기능 + +- [x] 로또 번호를 정렬하는 기능 + +- [x] 수동으로 구매한 개수, 자동으로 구매한 개수를 출력하는 기능 + - [x] 티켓 뭉치에서 수동이 몇갠지 찾는 기능 + - [x] 티켓 뭉치에서 자동이 몇갠지 찾는 기능 + +- [x] 수동으로 로또 티켓을 구매하는 기능 + +--- + +## 코드리뷰 리팩토링 +- [x] 유틸리티 클래스 없애기 + - [x] 문자열 형태의 로또 번호들을 자르는 역할을 Utils 에서 LottoNumbers로 이관 + +- [x] 로또 수동 번호 입력을 List로 받기 + - [x] view 단에서 시도 횟수 검증하기 + - [x] 로또 수동 번호 입력 받기 + +- [x] 인터페이스로 나눈 LottoTicket 다시 합치기 + - [x] 인자없이 로또 티켓을 만드려고 하면 자동으로 만들기 + - [x] numbers가 인자로 들어오면 수동으로 만들기 + \ No newline at end of file diff --git a/src/main/java/lottogame/controller/LottoGameController.java b/src/main/java/lottogame/controller/LottoGameController.java index 9219561147..7ee5a6569d 100644 --- a/src/main/java/lottogame/controller/LottoGameController.java +++ b/src/main/java/lottogame/controller/LottoGameController.java @@ -14,7 +14,18 @@ public LottoGameController(LottoGame lottoGame) { } public void buyTickets() { - lottoGame.buyTickets(new Money(InputView.getMoneyInput())); + Money money = new Money(InputView.getMoneyInput()); + System.out.println(); + buyManualTickets(money); + buyAutoTickets(money); + } + + private void buyManualTickets(Money money) { + lottoGame.buyManualTickets(money, InputView.getManualLottoNumbers(money)); + } + + private void buyAutoTickets(Money money) { + lottoGame.buyAutoTickets(money); } public void printBroughtLottoTickets() { diff --git a/src/main/java/lottogame/domain/LottoGame.java b/src/main/java/lottogame/domain/LottoGame.java index 96224f3132..1c464369a1 100644 --- a/src/main/java/lottogame/domain/LottoGame.java +++ b/src/main/java/lottogame/domain/LottoGame.java @@ -15,12 +15,18 @@ public class LottoGame { private LottoNumber drawnBonusNumber; private LottoNumbers drawnWinningNumbers; - private LottoTickets lottoTickets; private LottoGameResult lottoGameResult; + private final LottoTickets lottoTickets = new LottoTickets(); private final LottoTicketMachine lottoTicketMachine = new LottoTicketMachine(); - public void buyTickets(final Money money) { - this.lottoTickets = lottoTicketMachine.buyTickets(money); + public void buyManualTickets(final Money money, final List LottoNumbersGroup) { + for (String lottoNumbers : LottoNumbersGroup) { + this.lottoTickets.add(lottoTicketMachine.buyManualTicket(money, lottoNumbers)); + } + } + + public void buyAutoTickets(final Money money) { + this.lottoTickets.concat(lottoTicketMachine.buyAutoTickets(money)); } public void drawWinningNumber(final String winningNumbers, final String bonusNumber) { diff --git a/src/main/java/lottogame/domain/LottoGameResult.java b/src/main/java/lottogame/domain/LottoGameResult.java index 99f73b6135..70a552505f 100644 --- a/src/main/java/lottogame/domain/LottoGameResult.java +++ b/src/main/java/lottogame/domain/LottoGameResult.java @@ -2,7 +2,6 @@ import lottogame.domain.ticket.LottoTicketResult; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -27,7 +26,7 @@ public LottoGameResult(final List winningTickets) { } public Map toMap() { - return Collections.unmodifiableMap(lottoGameResult); + return new LinkedHashMap<>(lottoGameResult); } public double getLottoGameYield(final int ticketCount) { diff --git a/src/main/java/lottogame/domain/Rank.java b/src/main/java/lottogame/domain/Rank.java index 7461f16af8..7174676509 100644 --- a/src/main/java/lottogame/domain/Rank.java +++ b/src/main/java/lottogame/domain/Rank.java @@ -24,11 +24,11 @@ public enum Rank { this.messageFormat = messageFormat; } - public static Rank getRank(LottoTicketResult lottoTicketResult) { + public static Rank getRank(final LottoTicketResult lottoTicketResult) { return Arrays.stream(values()) .filter(rank -> rank.matchCount == lottoTicketResult.getMatchCount()) - .filter(rank -> rank.isBonusMatch == lottoTicketResult.isBonusMatched()) - .findAny() + .filter(rank -> !rank.equals(RANK3) || rank.isBonusMatch == lottoTicketResult.isBonusMatched()) + .findFirst() .orElse(FAIL); } diff --git a/src/main/java/lottogame/domain/machine/LottoTicketMachine.java b/src/main/java/lottogame/domain/machine/LottoTicketMachine.java index 4c596a34c6..d46988d0fe 100644 --- a/src/main/java/lottogame/domain/machine/LottoTicketMachine.java +++ b/src/main/java/lottogame/domain/machine/LottoTicketMachine.java @@ -1,6 +1,7 @@ package lottogame.domain.machine; import lottogame.domain.Money; +import lottogame.domain.number.LottoNumbers; import lottogame.domain.ticket.LottoTicket; import lottogame.domain.ticket.LottoTickets; @@ -8,13 +9,21 @@ public class LottoTicketMachine { public static final int TICKET_PRICE = 1000; - public LottoTickets buyTickets(final Money money) { + public LottoTickets buyAutoTickets(final Money money) { LottoTickets lottoTickets = new LottoTickets(); while (money.isCanBuy(TICKET_PRICE)) { - lottoTickets.add(new LottoTicket()); + lottoTickets.add(LottoTicket.of()); money.use(TICKET_PRICE); } return lottoTickets; } + + public LottoTicket buyManualTicket(final Money money, final String selectedLottoNumbers) { + if (!money.isCanBuy(TICKET_PRICE)) { + throw new IllegalArgumentException("남은 금액이 모자릅니다."); + } + money.use(TICKET_PRICE); + return LottoTicket.of(new LottoNumbers(selectedLottoNumbers)); + } } diff --git a/src/main/java/lottogame/domain/machine/LottoWinningDrawingMachine.java b/src/main/java/lottogame/domain/machine/LottoWinningDrawingMachine.java index e97a2d39a9..9462aff7d6 100644 --- a/src/main/java/lottogame/domain/machine/LottoWinningDrawingMachine.java +++ b/src/main/java/lottogame/domain/machine/LottoWinningDrawingMachine.java @@ -3,31 +3,21 @@ import lottogame.domain.number.LottoNumber; import lottogame.domain.number.LottoNumbers; -import java.util.ArrayList; -import java.util.List; - public class LottoWinningDrawingMachine { - public static final String DELIMITER = ","; private LottoNumbers lottoNumbers; - public LottoNumbers drawing(String drawingNumbers) { - drawingNumbers = drawingNumbers.replaceAll(" ", ""); - final List lottoNumberGroup = new ArrayList<>(); - - for (String number : drawingNumbers.split(DELIMITER)) { - lottoNumberGroup.add(new LottoNumber(number)); - } - return lottoNumbers = new LottoNumbers(lottoNumberGroup); + public LottoNumbers drawing(final String drawingNumbers) { + return lottoNumbers = new LottoNumbers(drawingNumbers); } public LottoNumber bonusDrawing(final String drawingNumber) { validBonusNumber(drawingNumber); - return new LottoNumber(drawingNumber); + return LottoNumber.of(drawingNumber); } private void validBonusNumber(final String bonusNumber) { - if (lottoNumbers.contains(new LottoNumber(bonusNumber))) { + if (lottoNumbers.contains(LottoNumber.of(bonusNumber))) { throw new IllegalArgumentException("보너스 번호가 당첨번호와 중복됩니다."); } } diff --git a/src/main/java/lottogame/domain/number/LottoNumber.java b/src/main/java/lottogame/domain/number/LottoNumber.java index 5891d2f3bf..35f40d8fe5 100644 --- a/src/main/java/lottogame/domain/number/LottoNumber.java +++ b/src/main/java/lottogame/domain/number/LottoNumber.java @@ -1,5 +1,7 @@ package lottogame.domain.number; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; public class LottoNumber { @@ -8,17 +10,29 @@ public class LottoNumber { private static final int FINISH_NUMBER = 45; private final int value; + private static final Map LOTTO_NUMBER_MAP = new HashMap<>(); - public LottoNumber(final String value) { - this(Integer.parseInt(value)); + static { + for (int number = START_NUMBER; number <= FINISH_NUMBER; ++number) { + LOTTO_NUMBER_MAP.put(number, new LottoNumber(number)); + } } - public LottoNumber(final int value) { + private LottoNumber(final int value) { validateRange(value); this.value = value; } - private void validateRange(final int value) { + public static LottoNumber of(final String value) { + return LottoNumber.of(Integer.parseInt(value)); + } + + public static LottoNumber of(final int value) { + validateRange(value); + return LottoNumber.LOTTO_NUMBER_MAP.get(value); + } + + private static void validateRange(final int value) { if (value < START_NUMBER || FINISH_NUMBER < value) { throw new IllegalArgumentException("로또 숫자 범위를 벗어났습니다."); } diff --git a/src/main/java/lottogame/domain/number/LottoNumbers.java b/src/main/java/lottogame/domain/number/LottoNumbers.java index 06a83b7a7c..251db67c9b 100644 --- a/src/main/java/lottogame/domain/number/LottoNumbers.java +++ b/src/main/java/lottogame/domain/number/LottoNumbers.java @@ -1,26 +1,43 @@ package lottogame.domain.number; import java.util.ArrayList; -import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.List; public class LottoNumbers { public static final int DRAWING_COUNT_LIMIT = 6; + public static final String DELIMITER = ","; + private final List lottoNumbers; + public LottoNumbers(final String lottoNumbers) { + this(getSplitLottoNumbersByString(lottoNumbers)); + } + public LottoNumbers(final List lottoNumbers) { validDrawingNumbers(lottoNumbers); + lottoNumbers.sort((Comparator.comparingInt(LottoNumber::getValue))); this.lottoNumbers = new ArrayList<>(lottoNumbers); } + private static List getSplitLottoNumbersByString(String lottoNumbers) { + lottoNumbers = lottoNumbers.replaceAll(" ", ""); + final List lottoNumberGroup = new ArrayList<>(); + + for (String number : lottoNumbers.split(DELIMITER)) { + lottoNumberGroup.add(LottoNumber.of(number)); + } + return lottoNumberGroup; + } + public boolean contains(final LottoNumber lottoNumber) { return lottoNumbers.contains(lottoNumber); } public List toList() { - return Collections.unmodifiableList(new ArrayList<>(this.lottoNumbers)); + return new ArrayList<>(this.lottoNumbers); } private void validDrawingNumbers(final List lottoNumbers) { diff --git a/src/main/java/lottogame/domain/ticket/LottoTicket.java b/src/main/java/lottogame/domain/ticket/LottoTicket.java index 4522b469e3..0b9634c62b 100644 --- a/src/main/java/lottogame/domain/ticket/LottoTicket.java +++ b/src/main/java/lottogame/domain/ticket/LottoTicket.java @@ -9,40 +9,59 @@ public class LottoTicket { - public static final int START_LOTTO_NUMBER = 1; - public static final int FINISH_LOTTO_NUMBER = 45; - public static final int COUNT_LOTTO_NUMBER = 6; + private static final int START_LOTTO_NUMBER = 1; + private static final int FINISH_LOTTO_NUMBER = 45; + private static final int COUNT_LOTTO_NUMBER = 6; private final LottoNumbers lottoNumbers; + private final boolean isAuto; - public LottoTicket() { + + private LottoTicket(final LottoNumbers lottoNumbers, final boolean isAuto) { + this.lottoNumbers = new LottoNumbers(lottoNumbers.toList()); + this.isAuto = isAuto; + } + + public static LottoTicket of() { + return new LottoTicket(getAutoNumbers(), true); + } + + public static LottoTicket of(final LottoNumbers lottoNumbers) { + return new LottoTicket(lottoNumbers, false); + } + + private static LottoNumbers getAutoNumbers() { List lottoNumberGroup = new ArrayList<>(); - for (int number : getShuffledNumbers(new ArrayList<>())) { - lottoNumberGroup.add(new LottoNumber(number)); + for (int number : getShuffledNumbers()) { + lottoNumberGroup.add(LottoNumber.of(number)); } - lottoNumbers = new LottoNumbers(lottoNumberGroup); + return new LottoNumbers(lottoNumberGroup); } - private List getShuffledNumbers(List numbers) { + private static List getShuffledNumbers() { + List numbers = new ArrayList<>(); Collections.shuffle(initNumbers(numbers)); - List shuffledNumbers = numbers.subList(0, COUNT_LOTTO_NUMBER); - Collections.sort(shuffledNumbers); - return shuffledNumbers; + return numbers.subList(0, COUNT_LOTTO_NUMBER); } - private List initNumbers(List numbers) { + private static List initNumbers(final List numbers) { for (int i = START_LOTTO_NUMBER; i <= FINISH_LOTTO_NUMBER; i++) { numbers.add(i); } return numbers; } + public List getLottoNumbers() { - return Collections.unmodifiableList(lottoNumbers.toList()); + return new ArrayList<>(lottoNumbers.toList()); } - public boolean isContainNumber(final LottoNumber lottoNumber){ + public boolean isContainNumber(LottoNumber lottoNumber) { return lottoNumbers.contains(lottoNumber); } + + public boolean isAutoTicket() { + return isAuto; + } } diff --git a/src/main/java/lottogame/domain/ticket/LottoTickets.java b/src/main/java/lottogame/domain/ticket/LottoTickets.java index 706c69f7a9..6561aa2877 100644 --- a/src/main/java/lottogame/domain/ticket/LottoTickets.java +++ b/src/main/java/lottogame/domain/ticket/LottoTickets.java @@ -3,25 +3,41 @@ import lottogame.domain.machine.LottoWinningMachine; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class LottoTickets { public static final int TICKET_PRICE = 1000; + private int autoTicketCount; - List lottoTickets = new ArrayList<>(); + private final List lottoTickets = new ArrayList<>(); public void add(final LottoTicket lottoTicket) { lottoTickets.add(lottoTicket); + countAutoTicket(lottoTicket); + } + + private void countAutoTicket(final LottoTicket lottoTicket) { + if (lottoTicket.isAutoTicket()) { + autoTicketCount++; + } + } + + public void concat(final LottoTickets lottoTickets) { + this.lottoTickets.addAll(lottoTickets.toList()); + this.autoTicketCount += lottoTickets.getAutoTicketsCount(); } public List toList() { - return Collections.unmodifiableList(lottoTickets); + return new ArrayList<>(lottoTickets); + } + + public int getAutoTicketsCount() { + return autoTicketCount; } - public int getTicketsCount() { - return lottoTickets.size(); + public int getManualTicketsCount() { + return lottoTickets.size() - autoTicketCount; } public int getCostUsedToBuy() { diff --git a/src/main/java/lottogame/view/InputView.java b/src/main/java/lottogame/view/InputView.java index 5922a97143..7f5705e3c1 100644 --- a/src/main/java/lottogame/view/InputView.java +++ b/src/main/java/lottogame/view/InputView.java @@ -1,27 +1,53 @@ package lottogame.view; +import lottogame.domain.Money; + +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class InputView { - - public static final String INPUT_REQUEST_WINNING_NUMBERS = "지난 주 당첨 번호를 입력해 주세요."; - public static final String INPUT_REQUEST_BONUS_NUMBER = "보너스 볼을 입력해 주세요."; - private static final String INPUT_REQUEST_MONEY = "구입금액을 입력해 주세요."; - private static final Scanner scanner = new Scanner(System.in); public static String getMoneyInput() { - System.out.println(INPUT_REQUEST_MONEY); + System.out.println("구입금액을 입력해 주세요."); return scanner.nextLine(); } + public static List getManualLottoNumbers(final Money money) { + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + LottoTicketCount lottoTicketCount = new LottoTicketCount(scanner.nextLine(), money); + + if (lottoTicketCount.isRemain()) { + printManualNumbersInputRequestMessage(); + } + return getManualNumbersGroup(lottoTicketCount); + } + + private static String getManualNumbers() { + return scanner.nextLine(); + } + + private static List getManualNumbersGroup(LottoTicketCount lottoTicketCount) { + List manualLottoNumbers = new ArrayList<>(); + while (lottoTicketCount.isRemain()) { + lottoTicketCount.reduce(); + manualLottoNumbers.add(getManualNumbers()); + } + return manualLottoNumbers; + } + + public static void printManualNumbersInputRequestMessage() { + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + } + public static String getWinningNumbersInput() { - System.out.println(INPUT_REQUEST_WINNING_NUMBERS); + System.out.println("지난 주 당첨 번호를 입력해 주세요."); return scanner.nextLine(); } public static String getBonusNumberInput() { - System.out.println(INPUT_REQUEST_BONUS_NUMBER); + System.out.println("보너스 볼을 입력해 주세요."); return scanner.nextLine(); } } diff --git a/src/main/java/lottogame/view/LottoTicketCount.java b/src/main/java/lottogame/view/LottoTicketCount.java new file mode 100644 index 0000000000..03a3e44461 --- /dev/null +++ b/src/main/java/lottogame/view/LottoTicketCount.java @@ -0,0 +1,35 @@ +package lottogame.view; + +import lottogame.domain.Money; + +public class LottoTicketCount { + + public static final int TICKET_PRICE = 1000; + private int value; + + public LottoTicketCount(final String manualTicketCount, final Money money) { + value = Integer.parseInt(manualTicketCount); + positiveValidate(value); + countValidate(value, money); + } + + public void reduce() { + value--; + } + + public boolean isRemain() { + return value > 0; + } + + private void positiveValidate(final int value) { + if (value < 0) { + throw new IllegalArgumentException("시도 횟수는 음수가 될 수 없습니다."); + } + } + + private void countValidate(final int value, final Money money) { + if (!money.isCanBuy(value * TICKET_PRICE)) { + throw new IllegalArgumentException("보유 금액을 넘는 티켓은 구매할 수 없습니다."); + } + } +} diff --git a/src/main/java/lottogame/view/OutputView.java b/src/main/java/lottogame/view/OutputView.java index 7346ca03e3..d79506932d 100644 --- a/src/main/java/lottogame/view/OutputView.java +++ b/src/main/java/lottogame/view/OutputView.java @@ -12,13 +12,13 @@ public class OutputView { - public static final String TICKETS_COUNT_MSG = "개를 구매했습니다."; + public static final String TICKETS_COUNT_MSG = "수동으로 %d장, 자동으로 %d개를 구매했습니다."; public static final String AMOUNT_YIELD_FORMAT = "총 수익률은 %.2f입니다."; public static final String LOTTO_GAME_RESULT_MSG = "당첨 통계"; public static final String SEPARATOR_BAR_NINE = "---------"; public static void printBroughtLottoTickets(final LottoTickets lottoTickets) { - System.out.println(lottoTickets.getTicketsCount() + TICKETS_COUNT_MSG); + System.out.println(String.format(TICKETS_COUNT_MSG, lottoTickets.getManualTicketsCount(), lottoTickets.getAutoTicketsCount())); for (LottoTicket lottoTicket : lottoTickets.toList()) { printLottoNumbers(lottoTicket); } diff --git a/src/test/java/lottogame/domain/LottoTicketCountTest.java b/src/test/java/lottogame/domain/LottoTicketCountTest.java new file mode 100644 index 0000000000..2f8b4245a9 --- /dev/null +++ b/src/test/java/lottogame/domain/LottoTicketCountTest.java @@ -0,0 +1,41 @@ +package lottogame.domain; + +import lottogame.view.LottoTicketCount; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class LottoTicketCountTest { + @Test + @DisplayName("tryCount 입력이 양의 정수가 아니면 예외를 발생시킨다.") + void positiveNumberTest() { + assertThatThrownBy(() -> new LottoTicketCount("a", new Money("1000"))) + .isInstanceOf(IllegalArgumentException.class); + + assertThatThrownBy(() -> new LottoTicketCount("-1", new Money("1000"))) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("돈의 액수보다, 더 많은 티켓을 수동 구매하려 하면 예외를 발생시킨다.") + void validCountTest() { + assertThatThrownBy(() -> new LottoTicketCount("3", new Money("2999"))) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("5000원을 가지고 3개의 로또 티켓 카운트를 만들면 3회 반복된다.") + void getValueTest() { + LottoTicketCount lottoTicketCount = + new LottoTicketCount("3", new Money("5000")); + + int count = 0; + while (lottoTicketCount.isRemain()) { + count++; + lottoTicketCount.reduce(); + } + assertThat(count).isEqualTo(3); + } +} diff --git a/src/test/java/lottogame/domain/RankTest.java b/src/test/java/lottogame/domain/RankTest.java index 9f96229498..034467ac3b 100644 --- a/src/test/java/lottogame/domain/RankTest.java +++ b/src/test/java/lottogame/domain/RankTest.java @@ -1,21 +1,33 @@ package lottogame.domain; -import static org.assertj.core.api.Assertions.assertThat; - import lottogame.domain.ticket.LottoTicketResult; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + public class RankTest { @Test - @DisplayName("상금줘봐") - void getPrice() { + @DisplayName("당첨번호의 개수가 일치하고, 보너스 번호가 틀릴때 원하는 RANK를 가져온다.") + void matchCountTest() { assertThat(Rank.getRank(new LottoTicketResult(6, false))).isEqualTo(Rank.RANK1); - assertThat(Rank.getRank(new LottoTicketResult(5, true))).isEqualTo(Rank.RANK2); assertThat(Rank.getRank(new LottoTicketResult(5, false))).isEqualTo(Rank.RANK3); assertThat(Rank.getRank(new LottoTicketResult(4, false))).isEqualTo(Rank.RANK4); assertThat(Rank.getRank(new LottoTicketResult(3, false))).isEqualTo(Rank.RANK5); assertThat(Rank.getRank(new LottoTicketResult(2, false))).isEqualTo(Rank.FAIL); } + + @Test + @DisplayName("4등 이하에서 당첨번호 당첨번호의 개수가 일치하고, 보너스 번호가 맞을때 원하는 RANK를 가져온다.") + void matchCountAndBonusMatchTest() { + assertThat(Rank.getRank(new LottoTicketResult(3, true))).isEqualTo(Rank.RANK5); + } + + @Test + @DisplayName("2등과 3등의 경우를 구별해서 원하는 RANK를 가져온다.") + void matchSecondThird(){ + assertThat(Rank.getRank(new LottoTicketResult(5, true))).isEqualTo(Rank.RANK2); + assertThat(Rank.getRank(new LottoTicketResult(5, false))).isEqualTo(Rank.RANK3); + } } diff --git a/src/test/java/lottogame/domain/machine/LottoTicketMachineTest.java b/src/test/java/lottogame/domain/machine/LottoTicketMachineTest.java index 6435c840d1..05d6848af5 100644 --- a/src/test/java/lottogame/domain/machine/LottoTicketMachineTest.java +++ b/src/test/java/lottogame/domain/machine/LottoTicketMachineTest.java @@ -1,20 +1,38 @@ package lottogame.domain.machine; -import static org.assertj.core.api.Assertions.assertThat; - +import lottogame.view.LottoTicketCount; import lottogame.domain.Money; +import lottogame.domain.ticket.LottoTickets; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + public class LottoTicketMachineTest { + LottoTicketMachine lottoTicketMachine = new LottoTicketMachine(); + @Test - @DisplayName("구입 금액에 해당하는 만큼 로또 티켓 발급") + @DisplayName("구입 금액에 해당하는 만큼 로또 티켓을 발급한다.") void lottoTicketMachineInsertMoney() { - LottoTicketMachine lottoTicketMachine = new LottoTicketMachine(); - assertThat(lottoTicketMachine.buyTickets(new Money("999")).toList().size()).isEqualTo(0); - assertThat(lottoTicketMachine.buyTickets(new Money("1000")).toList().size()).isEqualTo(1); - assertThat(lottoTicketMachine.buyTickets(new Money("3000")).toList().size()) - .isNotEqualTo(2); + assertThat(lottoTicketMachine.buyAutoTickets(new Money("999")).toList().size()).isEqualTo(0); + assertThat(lottoTicketMachine.buyAutoTickets(new Money("1000")).toList().size()).isEqualTo(1); + assertThat(lottoTicketMachine.buyAutoTickets(new Money("3000")).toList().size()) + .isNotEqualTo(2); + } + + @Test + @DisplayName("수동 2장 자동 3장을 구매해본다") + void manualAndAutoBuy() { + Money money = new Money("5000"); + LottoTicketCount ticketCount = new LottoTicketCount("2", money); + + LottoTickets lottoTickets = new LottoTickets(); + while(ticketCount.isRemain()){ + lottoTickets.add(lottoTicketMachine.buyManualTicket(money, "1,2,3,4,5,6")); + ticketCount.reduce(); + } + assertThat(lottoTickets.toList().size()).isEqualTo(2); + assertThat(lottoTicketMachine.buyAutoTickets(money).toList().size()).isEqualTo(3); } } diff --git a/src/test/java/lottogame/domain/machine/LottoWinningDrawingMachineTest.java b/src/test/java/lottogame/domain/machine/LottoWinningDrawingMachineTest.java index efb5b6586b..9332bf43c4 100644 --- a/src/test/java/lottogame/domain/machine/LottoWinningDrawingMachineTest.java +++ b/src/test/java/lottogame/domain/machine/LottoWinningDrawingMachineTest.java @@ -1,16 +1,16 @@ package lottogame.domain.machine; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import lottogame.domain.number.LottoNumber; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + public class LottoWinningDrawingMachineTest { @Test - @DisplayName("당첨 번호를 문자로 만들려고 할때") + @DisplayName("당첨 번호를 문자로 만들려고 하면 예외가 발생한다.") void insertString() { assertThatThrownBy( () -> new LottoWinningDrawingMachine().drawing("a, b, c, 1, 2, 3") @@ -18,7 +18,7 @@ void insertString() { } @Test - @DisplayName("중복된 번호를 입력했을 때") + @DisplayName("중복된 번호를 입력하면 예외가 발생한다.") void insertDuplication() { assertThatThrownBy( () -> new LottoWinningDrawingMachine().drawing("1, 1, 1, 2, 2, 2") @@ -26,7 +26,7 @@ void insertDuplication() { } @Test - @DisplayName("6개 이외의 당첨번호를 입력했을 때") + @DisplayName("6개 이외의 당첨번호를 입력하면 예외가 발생한다.") void insertInvalidCount() { assertThatThrownBy( () -> new LottoWinningDrawingMachine().drawing("1, 1, 1,") @@ -34,7 +34,7 @@ void insertInvalidCount() { } @Test - @DisplayName("공백을 입력했을 때") + @DisplayName("공백을 입력하면 예외가 발생한다.") void insertBlank() { assertThatThrownBy( () -> new LottoWinningDrawingMachine().drawing(" ,") @@ -54,15 +54,16 @@ void insertBlank() { } @Test - @DisplayName("보너스 번호 생성") + @DisplayName("보너스 번호 생성이 성공하면 통과한다.") void drawingBonus() { - LottoNumber bonusNumber = new LottoWinningDrawingMachine().bonusDrawing("3"); - assertThat(bonusNumber).isEqualTo(new LottoWinningDrawingMachine().bonusDrawing("3")); - assertThat(bonusNumber).isEqualTo(new LottoNumber("3")); + LottoWinningDrawingMachine lottoWinningDrawingMachine = new LottoWinningDrawingMachine(); + lottoWinningDrawingMachine.drawing("1, 2, 33, 4, 5, 6"); + LottoNumber bonusNumber = lottoWinningDrawingMachine.bonusDrawing("3"); + assertThat(bonusNumber).isEqualTo(LottoNumber.of("3")); } @Test - @DisplayName("보너스 번호 생성시 당첨 번호가 중복될 때") + @DisplayName("보너스 번호 생성시 당첨 번호와 중복되면 예외가 발생한다.") void bonusNumberDuplicationCheck() { LottoWinningDrawingMachine lottoWinningDrawingMachine = new LottoWinningDrawingMachine(); lottoWinningDrawingMachine.drawing("1, 2, 3, 4, 5, 6"); diff --git a/src/test/java/lottogame/domain/machine/LottoWinningMachineTest.java b/src/test/java/lottogame/domain/machine/LottoWinningMachineTest.java index 77034df148..efecf8d4e9 100644 --- a/src/test/java/lottogame/domain/machine/LottoWinningMachineTest.java +++ b/src/test/java/lottogame/domain/machine/LottoWinningMachineTest.java @@ -19,10 +19,10 @@ public class LottoWinningMachineTest { @BeforeEach void setUp() { List lottoNumberGroup = new ArrayList<>(); - LottoNumber bonusNumber = new LottoNumber(7); + LottoNumber bonusNumber = LottoNumber.of(7); for (int i = 1; i <= 6; ++i) { - lottoNumberGroup.add(new LottoNumber(i)); + lottoNumberGroup.add(LottoNumber.of(i)); } LottoNumbers winningNumbers = new LottoNumbers(lottoNumberGroup); @@ -32,17 +32,7 @@ void setUp() { @Test @DisplayName("로또 당첨 번호와 티켓 번호 비교 결과가 올바르면 통과한다") void validMatchResult() { - LottoTicket lottoTicket = new LottoTicket() { - @Override - public List getLottoNumbers() { - List lottoNumberGroup = new ArrayList<>(); - for (int i = 1; i <= 6; ++i) { - lottoNumberGroup.add(new LottoNumber(i)); - } - LottoNumbers drawingNumbers = new LottoNumbers(lottoNumberGroup); - return drawingNumbers.toList(); - } - }; + LottoTicket lottoTicket = LottoTicket.of(new LottoNumbers("1,2,3,4,5,6")); assertThat(lottoWinningMachine.countMatchedWinningNumber(lottoTicket)).isEqualTo(6); assertThat(lottoWinningMachine.countMatchedWinningNumber(lottoTicket)).isNotEqualTo(5); @@ -51,19 +41,14 @@ public List getLottoNumbers() { @Test @DisplayName("보너스 번호가 일치할 경우 통과한다") void checkBonusLottoNumber() { - LottoTicket lottoTicket = new LottoTicket() { - @Override - public List getLottoNumbers() { - List lottoNumberGroup = new ArrayList<>(); - for (int i = 1; i <= 5; ++i) { - lottoNumberGroup.add(new LottoNumber(i + "")); - } - lottoNumberGroup.add(new LottoNumber("7")); - LottoNumbers drawingNumbers = new LottoNumbers(lottoNumberGroup); - return drawingNumbers.toList(); - } - }; + List lottoNumberGroup = new ArrayList<>(); + for (int i = 2; i <= 7; ++i) { + lottoNumberGroup.add(LottoNumber.of(i)); + } + + LottoNumbers numbers = new LottoNumbers(lottoNumberGroup); + LottoTicket lottoTicket = LottoTicket.of(numbers); assertThat(lottoWinningMachine.isMatchBonusNumber(lottoTicket)).isTrue(); } diff --git a/src/test/java/lottogame/domain/number/LottoNumberTest.java b/src/test/java/lottogame/domain/number/LottoNumberTest.java index 0b49e11d26..e81a33a92e 100644 --- a/src/test/java/lottogame/domain/number/LottoNumberTest.java +++ b/src/test/java/lottogame/domain/number/LottoNumberTest.java @@ -1,11 +1,11 @@ package lottogame.domain.number; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + public class LottoNumberTest { @Test @@ -13,7 +13,7 @@ public class LottoNumberTest { void lottoNumberValueIsString() { String value = "abc"; assertThatThrownBy(() -> { - LottoNumber lottoNumber = new LottoNumber(value); + LottoNumber lottoNumber = LottoNumber.of(value); }).isInstanceOf(IllegalArgumentException.class); } @@ -22,7 +22,7 @@ void lottoNumberValueIsString() { void lottoNumberValueIsNegativeNumber() { String value = "-1"; assertThatThrownBy(() -> { - LottoNumber lottoNumber = new LottoNumber(value); + LottoNumber lottoNumber = LottoNumber.of(value); }).isInstanceOf(IllegalArgumentException.class); } @@ -30,7 +30,7 @@ void lottoNumberValueIsNegativeNumber() { @DisplayName("LottoNumber를 1로 생성하려 했을 때") void lottoNumberValueIsOne() { String value = "1"; - LottoNumber lottoNumber1 = new LottoNumber(value); - assertThat(lottoNumber1).isEqualTo(new LottoNumber(value)); + LottoNumber lottoNumber1 = LottoNumber.of(value); + assertThat(lottoNumber1).isEqualTo(LottoNumber.of(value)); } } diff --git a/src/test/java/lottogame/domain/number/LottoNumbersTest.java b/src/test/java/lottogame/domain/number/LottoNumbersTest.java index b11537076c..58f11f591b 100644 --- a/src/test/java/lottogame/domain/number/LottoNumbersTest.java +++ b/src/test/java/lottogame/domain/number/LottoNumbersTest.java @@ -17,7 +17,7 @@ public class LottoNumbersTest { @BeforeEach void setUp() { for (int i = 1; i <= 6; ++i) { - lottoNumberGroup.add(new LottoNumber(i)); + lottoNumberGroup.add(LottoNumber.of(i)); } } @@ -26,14 +26,14 @@ void setUp() { void lottoNumbersAddTest() { LottoNumbers lottoNumbers = new LottoNumbers(lottoNumberGroup); assertThat(lottoNumbers.toList()).contains( - new LottoNumber(3) + LottoNumber.of(3) ); } @Test @DisplayName("중복된 번호를 가진 로또 번호가 들어오면 예외가 발생한다.") void duplicateLottoNumber() { - lottoNumberGroup.set(5, new LottoNumber(1)); + lottoNumberGroup.set(5, LottoNumber.of(1)); assertThatThrownBy(() -> new LottoNumbers(lottoNumberGroup)) .isInstanceOf(IllegalArgumentException.class); } @@ -44,15 +44,27 @@ void checkDrawingNumber() { List lottoNumbers = new ArrayList<>(); for (int i = 1; i <= 5; ++i) { - lottoNumbers.add(new LottoNumber(i)); + lottoNumbers.add(LottoNumber.of(i)); } assertThatThrownBy(() -> new LottoNumbers(lottoNumbers)) .isInstanceOf(IllegalArgumentException.class); - lottoNumbers.add(new LottoNumber(6)); - lottoNumbers.add(new LottoNumber(7)); + lottoNumbers.add(LottoNumber.of(6)); + lottoNumbers.add(LottoNumber.of(7)); assertThatThrownBy(() -> new LottoNumbers(lottoNumbers)) .isInstanceOf(IllegalArgumentException.class); } + + @Test + @DisplayName("로또번호가 들어오면 정렬시킨다") + void sortLottoNumbers() { + List lottoNumbers = new ArrayList<>(); + + for (int i = 6; i >= 1; --i) { + lottoNumbers.add(LottoNumber.of(i)); + } + LottoNumbers sortedNumbers = new LottoNumbers(lottoNumbers); + assertThat(sortedNumbers.toList()).isEqualTo(lottoNumberGroup); + } } diff --git a/src/test/java/lottogame/domain/ticket/LottoTicketTest.java b/src/test/java/lottogame/domain/ticket/LottoTicketTest.java index 03f062bca4..d0b8f7e2e4 100644 --- a/src/test/java/lottogame/domain/ticket/LottoTicketTest.java +++ b/src/test/java/lottogame/domain/ticket/LottoTicketTest.java @@ -1,19 +1,23 @@ package lottogame.domain.ticket; -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.HashSet; -import java.util.Set; import lottogame.domain.number.LottoNumber; +import lottogame.domain.number.LottoNumbers; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + public class LottoTicketTest { @Test @DisplayName("뽑힌 LottoNumber가 6개인지") void issueLottoTicket() { - LottoTicket lottoTicket = new LottoTicket(); + LottoTicket lottoTicket = LottoTicket.of(); assertThat(lottoTicket.getLottoNumbers().size()).isNotEqualTo(5); assertThat(lottoTicket.getLottoNumbers().size()).isEqualTo(6); assertThat(lottoTicket.getLottoNumbers().size()).isNotEqualTo(7); @@ -22,8 +26,22 @@ void issueLottoTicket() { @Test @DisplayName("뽑힌 LottoNumber에 중복이 없는지") void issueLottoTicketDuplicate() { - LottoTicket lottoTicket = new LottoTicket(); + LottoTicket lottoTicket = LottoTicket.of(); Set lottoNumberSet = new HashSet<>(lottoTicket.getLottoNumbers()); assertThat(lottoNumberSet.size()).isEqualTo(lottoTicket.getLottoNumbers().size()); } + + @Test + @DisplayName("티켓을 뽑고 맞는 타입인지 확인하면 옳은 결과를 가져온다.") + void checkTicketType() { + LottoTicket lottoAutoTicket = LottoTicket.of(); + assertThat(lottoAutoTicket.isAutoTicket()).isTrue(); + + List lottoNumberGroup = new ArrayList<>(); + for (int i = 1; i <= 6; ++i) { + lottoNumberGroup.add(LottoNumber.of(i)); + } + LottoTicket lottoManualTicket = LottoTicket.of(new LottoNumbers(lottoNumberGroup)); + assertThat(lottoManualTicket.isAutoTicket()).isFalse(); + } } diff --git a/src/test/java/lottogame/domain/ticket/LottoTicketsTest.java b/src/test/java/lottogame/domain/ticket/LottoTicketsTest.java index 6bc697dfef..6762ead877 100644 --- a/src/test/java/lottogame/domain/ticket/LottoTicketsTest.java +++ b/src/test/java/lottogame/domain/ticket/LottoTicketsTest.java @@ -1,20 +1,61 @@ package lottogame.domain.ticket; -import static org.assertj.core.api.Assertions.assertThat; - +import lottogame.domain.number.LottoNumber; +import lottogame.domain.number.LottoNumbers; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + public class LottoTicketsTest { @Test @DisplayName("LottoTicket 삽입 테스트") void lottoTicketsAddTest() { - LottoTicket lottoTicket1 = new LottoTicket(); + LottoTicket lottoTicket1 = LottoTicket.of(); LottoTickets lottoTickets = new LottoTickets(); lottoTickets.add(lottoTicket1); assertThat(lottoTickets.toList().size()).isEqualTo(1); } + + @Test + @DisplayName("수동 티켓이 1개, 자동 티켓이 1개 삽입 되었을때 올바른 결과를 가져온다.") + void lottoTicketCount() { + LottoTicket autoTicket = LottoTicket.of(); + List lottoNumberGroup = new ArrayList<>(); + for (int i = 1; i <= 6; ++i) { + lottoNumberGroup.add(LottoNumber.of(i)); + } + LottoTicket manualTicket = LottoTicket.of(new LottoNumbers(lottoNumberGroup)); + LottoTickets lottoTickets = new LottoTickets(); + lottoTickets.add(manualTicket); + lottoTickets.add(autoTicket); + + assertThat(lottoTickets.getAutoTicketsCount()).isEqualTo(1); + assertThat(lottoTickets.getManualTicketsCount()).isEqualTo(1); + } + + @Test + @DisplayName("수동 티켓 1개 구매, 자동 티켓 2개 구매 후 총 티켓이 3개임을 가져온다.") + void AllLottoTicketsCount() { + List lottoNumberGroup = new ArrayList<>(); + for (int i = 1; i <= 6; ++i) { + lottoNumberGroup.add(LottoNumber.of(i)); + } + LottoTicket manualTicket = LottoTicket.of(new LottoNumbers(lottoNumberGroup)); + LottoTickets lottoTickets = new LottoTickets(); + lottoTickets.add(manualTicket); + + LottoTickets lottoAutoTickets = new LottoTickets(); + lottoAutoTickets.add(LottoTicket.of()); + lottoAutoTickets.add(LottoTicket.of()); + + lottoTickets.concat(lottoAutoTickets); + assertThat(lottoTickets.toList().size()).isEqualTo(3); + } }