diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 13f852e..64964a9 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,7 +1,39 @@ package com.javabom.lotto; +import com.javabom.lotto.domain.Customer; +import com.javabom.lotto.domain.shop.AutoLottoNumberGenerator; +import com.javabom.lotto.domain.shop.LottoShop; +import com.javabom.lotto.domain.shop.LottoMachine; +import com.javabom.lotto.domain.number.PrizeNumbersBundle; +import com.javabom.lotto.domain.result.LottoResultBundle; +import com.javabom.lotto.domain.ticket.LottoTicketBundle; +import com.javabom.lotto.view.InputView; +import com.javabom.lotto.view.OutputView; + +import java.util.List; +import java.util.Scanner; + public class LottoApplication { + private static final InputView inputView = new InputView(new Scanner(System.in)); + public static void main(String[] args) { + int amount = inputView.inputMoney(); + int manualLottoTicketCount = inputView.inputManualLottoTicketCount(); + List> manualLottoNumbers = inputView.inputManualLottoNumbers(manualLottoTicketCount); + Customer customer = new Customer(amount, manualLottoNumbers); + + LottoShop lottoShop = new LottoShop(new LottoMachine(new AutoLottoNumberGenerator())); + LottoTicketBundle lottoTicketBundle = lottoShop.buy(customer); + + OutputView.printLottoCount(manualLottoNumbers.size(), customer.getAutoLottoTicketCount()); + OutputView.printLottoBundle(lottoTicketBundle); + + PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle( + inputView.inputPrizeNumbers(), inputView.inputBonusNumber()); + + LottoResultBundle lottoResultBundle = lottoTicketBundle.getLottoResults(prizeNumberBundle); + + OutputView.printResults(lottoResultBundle, amount); } } diff --git a/src/main/java/com/javabom/lotto/domain/Customer.java b/src/main/java/com/javabom/lotto/domain/Customer.java new file mode 100644 index 0000000..7b664fc --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/Customer.java @@ -0,0 +1,72 @@ +package com.javabom.lotto.domain; + +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.number.OrderGameNumber; +import com.javabom.lotto.domain.utils.GameNumberConverter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Customer { + private final int amount; + private final List> manualLottoNumbers; + + public Customer(int amount, List> strManualLottoNumbers) { + checkPositive(amount); + checkBuyManualLottoTicket(amount, strManualLottoNumbers.size()); + this.amount = amount; + this.manualLottoNumbers = collet(strManualLottoNumbers); + } + + private void checkPositive(int amount) { + if (amount <= 0) { + throw new IllegalArgumentException(String.format("%d, 0원 이상의 돈을 입력해 주세요.", amount)); + } + } + + private void checkBuyManualLottoTicket(int amount, int ticketCount) { + int requiredAmount = ticketCount * LottoTicket.PRICE; + if (amount < requiredAmount) { + throw new IllegalArgumentException(String.format("현재 보유 금액:%d, 필요한 금액:%d, 금액이 부족합니다.", amount, requiredAmount)); + } + } + + private List> collet(List> strManualLottoNumbers) { + List> manualLottoNumbers = new ArrayList<>(); + for (List eachManualLottoNumbers : strManualLottoNumbers) { + checkCount(eachManualLottoNumbers.size()); + + List orderGameNumbers = GameNumberConverter.convert(eachManualLottoNumbers); + checkDuplicate(orderGameNumbers.size()); + + manualLottoNumbers.add(GameNumberConverter.convert(eachManualLottoNumbers)); + + } + return manualLottoNumbers; + } + + private void checkCount(int numberCount) { + if (numberCount != LottoTicket.COUNT) { + throw new IllegalArgumentException(String.format("%d개의 수동 로또 번호를 입력하셨습니다. 수동 로또 번호는 총 6개여야 합니다.", numberCount)); + } + } + + private void checkDuplicate(int gameNumbersSize) { + if (gameNumbersSize != LottoTicket.COUNT) { + throw new IllegalArgumentException("수동 로또 번호는 모두 달라야 합니다."); + } + } + + public int getAutoLottoTicketCount() { + int curAmount = amount - (manualLottoNumbers.size() * LottoTicket.PRICE); + if (curAmount < LottoTicket.PRICE) { + return 0; + } + return curAmount / LottoTicket.PRICE; + } + + public List> getManualLottoNumbers() { + return Collections.unmodifiableList(this.manualLottoNumbers); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/number/GameNumber.java b/src/main/java/com/javabom/lotto/domain/number/GameNumber.java new file mode 100644 index 0000000..33b8386 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/number/GameNumber.java @@ -0,0 +1,60 @@ +package com.javabom.lotto.domain.number; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class GameNumber { + public static final int MIN_NUMBER = 1; + public static final int MAX_NUMBER = 45; + + private final int gameNumber; + + private GameNumber(int gameNumber) { + this.gameNumber = gameNumber; + } + + public static GameNumber valueOf(int number) { + checkRange(number); + return GameNumberCache.cache.get(number); + } + + public static GameNumber valueOf(String strNumber) { + return GameNumber.valueOf(Integer.parseInt(strNumber)); + } + + private static void checkRange(int number) { + if (number < MIN_NUMBER || number > MAX_NUMBER) { + throw new IllegalArgumentException(String.format("입력값: %d, 당첨 번호는 1-45 숫자만 가능합니다.", number)); + } + } + + public int value() { + return this.gameNumber; + } + + private static class GameNumberCache { + static final List cache; + + static { + cache = new ArrayList<>(); + + for (int idx = MIN_NUMBER - 1; idx <= MAX_NUMBER; idx++) { + cache.add(new GameNumber(idx)); + } + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof GameNumber)) return false; + GameNumber that = (GameNumber) o; + return gameNumber == that.gameNumber; + } + + @Override + public int hashCode() { + return Objects.hash(gameNumber); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/number/OrderGameNumber.java b/src/main/java/com/javabom/lotto/domain/number/OrderGameNumber.java new file mode 100644 index 0000000..596901d --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/number/OrderGameNumber.java @@ -0,0 +1,53 @@ +package com.javabom.lotto.domain.number; + +import java.util.Objects; + +public class OrderGameNumber { + private static final int MIN_ORDER_NUMBER = 1; + private static final int MAX_ORDER_NUMBER = 7; + + private final int order; + private final GameNumber gameNumber; + + private OrderGameNumber(final int order, final GameNumber gameNumber) { + this.order = order; + this.gameNumber = gameNumber; + } + + public static OrderGameNumber of(int order, final GameNumber gameNumber) { + checkOrderRange(order); + return new OrderGameNumber(order, gameNumber); + } + + public static OrderGameNumber of(int order, final String strGameNumber) { + return OrderGameNumber.of(order, GameNumber.valueOf(strGameNumber)); + } + + private static void checkOrderRange(final int order) { + if (order < MIN_ORDER_NUMBER || order > MAX_ORDER_NUMBER) { + throw new IllegalArgumentException(String.format("%d, 게임 숫자의 인덱스 범위는 1-6 이어야 합니다.", order)); + } + } + + public boolean equalsOfNumber(final OrderGameNumber orderGameNumber) { + return this.gameNumber.equals(orderGameNumber.gameNumber); + } + + public GameNumber numberValue() { + return this.gameNumber; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof OrderGameNumber)) return false; + final OrderGameNumber that = (OrderGameNumber) o; + return order == that.order && + Objects.equals(gameNumber, that.gameNumber); + } + + @Override + public int hashCode() { + return Objects.hash(order, gameNumber); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/number/PrizeNumbers.java b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbers.java new file mode 100644 index 0000000..374c9b6 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbers.java @@ -0,0 +1,45 @@ +package com.javabom.lotto.domain.number; + +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.utils.GameNumberConverter; + +import java.util.List; + +public class PrizeNumbers { + + private final List prizeNumbers; + + public PrizeNumbers(List strPrizeNumbers) { + this.prizeNumbers = collect(strPrizeNumbers); + } + + private List collect(final List strPrizeNumbers) { + checkCount(strPrizeNumbers.size()); + List prizeNumbers = GameNumberConverter.convert(strPrizeNumbers); + checkDuplicate(prizeNumbers.size()); + return prizeNumbers; + } + + private static void checkCount(int numberCount) { + if (numberCount != LottoTicket.COUNT) { + throw new IllegalArgumentException(String.format("%d개의 당첨 번호를 입력하셨습니다. 당첨 번호는 총 6개여야 합니다.", numberCount)); + } + } + + private static void checkDuplicate(int gameNumbersSize) { + if (gameNumbersSize != LottoTicket.COUNT) { + throw new IllegalArgumentException("당첨 번호는 모두 달라야 합니다."); + } + } + + public boolean contains(OrderGameNumber orderGameNumber) { + return prizeNumbers.stream() + .anyMatch(number -> number.equalsOfNumber(orderGameNumber)); + } + + public int getMatchedCount(final LottoTicket lottoTicket) { + return (int) prizeNumbers.stream() + .filter(lottoTicket::contains) + .count(); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/number/PrizeNumbersBundle.java b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbersBundle.java new file mode 100644 index 0000000..783057d --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbersBundle.java @@ -0,0 +1,31 @@ +package com.javabom.lotto.domain.number; + +import com.javabom.lotto.domain.result.LottoResult; +import com.javabom.lotto.domain.ticket.LottoTicket; + +import java.util.List; + +public class PrizeNumbersBundle { + private static final int BONUS_ORDER = 7; + + private final PrizeNumbers prizeNumbers; + private final OrderGameNumber bonusNumber; + + public PrizeNumbersBundle(List prizeNumbers, String bonusNumber) { + this.prizeNumbers = new PrizeNumbers(prizeNumbers); + this.bonusNumber = OrderGameNumber.of(BONUS_ORDER, bonusNumber); + checkDuplicate(); + } + + private void checkDuplicate() { + if (prizeNumbers.contains(bonusNumber)) { + throw new IllegalArgumentException("입력하신 보너스 번호는 당첨 번호와 겹칩니다."); + } + } + + public LottoResult getLottoResult(LottoTicket lottoTicket) { + int matchedCount = prizeNumbers.getMatchedCount(lottoTicket); + boolean bonusStatus = lottoTicket.containsBonus(bonusNumber); + return LottoResult.findLottoResult(matchedCount, bonusStatus); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/result/LottoResult.java b/src/main/java/com/javabom/lotto/domain/result/LottoResult.java new file mode 100644 index 0000000..68f17ec --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/result/LottoResult.java @@ -0,0 +1,50 @@ +package com.javabom.lotto.domain.result; + +import java.util.Arrays; + +public enum LottoResult { + FIRST(6, 2_000_000_000), + SECOND(5, 30_000_000), + THIRD(5, 1_500_000), + FOURTH(4, 50_000), + FIFTH(3, 5_000), + FAIL(0, 0); + + LottoResult(int matchedCount, int prize) { + this.matchedCount = matchedCount; + this.prize = prize; + } + + public final int matchedCount; + public final int prize; + + public static LottoResult findLottoResult(int matchedCount, boolean bonusStatus) { + if (matchedCount == 5) { + return findBonus(bonusStatus); + } + return valueOf(matchedCount); + } + + private static LottoResult findBonus(boolean bonusStatus) { + if (bonusStatus) { + return SECOND; + } + return THIRD; + } + + public static LottoResult valueOf(int matchedCount){ + return Arrays.stream(LottoResult.values()) + .filter(lottoResult -> lottoResult.getMatchedCount() == matchedCount) + .filter(lottoResult -> !lottoResult.equals(SECOND)) + .findFirst() + .orElse(FAIL); + } + + private int getMatchedCount(){ + return this.matchedCount; + } + + public int getPrize() { + return this.prize; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/result/LottoResultBundle.java b/src/main/java/com/javabom/lotto/domain/result/LottoResultBundle.java new file mode 100644 index 0000000..b0c46e1 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/result/LottoResultBundle.java @@ -0,0 +1,39 @@ +package com.javabom.lotto.domain.result; + +import java.util.List; + +public class LottoResultBundle { + private final int PERCENT = 100; + + private final List lottoResultBundle; + + public LottoResultBundle(List lottoResultBundle) { + this.lottoResultBundle = lottoResultBundle; + } + + public long calculatePrize() { + long prize = 0; + for (LottoResult lottoResult : lottoResultBundle) { + prize += lottoResult.getPrize(); + } + return prize; + } + + public long getRateOfProfit(int amount) { + long profit = calculatePrize() - amount; + if (profit < 0) { + return 0; + } + return (profit / amount) * PERCENT; + } + + public int getCountOfPrize(LottoResult lottoResult) { + return (int) lottoResultBundle.stream() + .filter(result -> result.equals(lottoResult)) + .count(); + } + + public LottoResult valueOf(int idx){ + return lottoResultBundle.get(idx); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/shop/AutoLottoNumberGenerator.java b/src/main/java/com/javabom/lotto/domain/shop/AutoLottoNumberGenerator.java new file mode 100644 index 0000000..f528253 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/shop/AutoLottoNumberGenerator.java @@ -0,0 +1,28 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; +import com.javabom.lotto.domain.ticket.LottoTicket; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class AutoLottoNumberGenerator implements LottoNumbersGenerator { + public static final List GAME_NUMBERS = IntStream.rangeClosed(GameNumber.MIN_NUMBER, GameNumber.MAX_NUMBER) + .mapToObj(GameNumber::valueOf) + .collect(Collectors.toList()); + + @Override + public List generate() { + final AtomicInteger idx = new AtomicInteger(1); + + Collections.shuffle(GAME_NUMBERS); + return GAME_NUMBERS.stream() + .map(number -> OrderGameNumber.of(idx.getAndIncrement(), number)) + .limit(LottoTicket.COUNT) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/shop/LottoMachine.java b/src/main/java/com/javabom/lotto/domain/shop/LottoMachine.java new file mode 100644 index 0000000..2d86e2c --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/shop/LottoMachine.java @@ -0,0 +1,34 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.number.OrderGameNumber; + +import java.util.ArrayList; +import java.util.List; + +public class LottoMachine { + + private final LottoNumbersGenerator lottoNumbersGenerator; + + public LottoMachine(LottoNumbersGenerator lottoNumbersGenerator) { + this.lottoNumbersGenerator = lottoNumbersGenerator; + } + + public List createManualLottoTicket(List> manualLottoNumbers) { + List manualLottoTickets = new ArrayList<>(); + for (List manualLottoNumber : manualLottoNumbers) { + LottoTicket manualLottoTicket = new LottoTicket(manualLottoNumber); + manualLottoTickets.add(manualLottoTicket); + } + return manualLottoTickets; + } + + public List createAutoLottoTicket(int autoLottoTicketCount) { + List autoLottoTickets = new ArrayList<>(); + for (int count = 1; count <= autoLottoTicketCount; count++) { + LottoTicket autoLottoTicket = new LottoTicket(lottoNumbersGenerator.generate()); + autoLottoTickets.add(autoLottoTicket); + } + return autoLottoTickets; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/shop/LottoNumbersGenerator.java b/src/main/java/com/javabom/lotto/domain/shop/LottoNumbersGenerator.java new file mode 100644 index 0000000..7a5a0cf --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/shop/LottoNumbersGenerator.java @@ -0,0 +1,9 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.number.OrderGameNumber; + +import java.util.List; + +public interface LottoNumbersGenerator { + List generate(); +} diff --git a/src/main/java/com/javabom/lotto/domain/shop/LottoShop.java b/src/main/java/com/javabom/lotto/domain/shop/LottoShop.java new file mode 100644 index 0000000..79ae93f --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/shop/LottoShop.java @@ -0,0 +1,25 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.Customer; +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.ticket.LottoTicketBundle; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class LottoShop { + + private final LottoMachine lottoMachine; + + public LottoShop(LottoMachine lottoMachine) { + this.lottoMachine = lottoMachine; + } + + public LottoTicketBundle buy(Customer customer) { + List manualLottoTickets = lottoMachine.createManualLottoTicket(customer.getManualLottoNumbers()); + List autoLottoTickets = lottoMachine.createAutoLottoTicket(customer.getAutoLottoTicketCount()); + return new LottoTicketBundle(Stream.concat(manualLottoTickets.stream(), autoLottoTickets.stream()) + .collect(Collectors.toList())); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java new file mode 100644 index 0000000..aafc8d2 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -0,0 +1,44 @@ +package com.javabom.lotto.domain.ticket; + +import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; + +import java.util.List; + +public class LottoTicket { + public static final int COUNT = 6; + public static final int PRICE = 1000; + + private final List lottoTicket; + + public LottoTicket(List lottoTicket) { + checkDuplicate(lottoTicket); + this.lottoTicket = lottoTicket; + } + + private void checkDuplicate(List maybeLottoTicket) { + int size = getDeduplicationSize(maybeLottoTicket); + if (size != COUNT) { + throw new IllegalArgumentException(String.format("현재 개수: %d, 로또 번호의 갯수는 6개여야 합니다.", size)); + } + } + + private int getDeduplicationSize(List maybeLottoTicket) { + return (int) maybeLottoTicket.stream() + .distinct() + .count(); + } + + public boolean contains(OrderGameNumber gameNumber) { + return lottoTicket.contains(gameNumber); + } + + public boolean containsBonus(final OrderGameNumber bonusNumber) { + return lottoTicket.stream() + .anyMatch(number -> number.equalsOfNumber(bonusNumber)); + } + + public GameNumber get(final int i) { + return lottoTicket.get(i).numberValue(); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketBundle.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketBundle.java new file mode 100644 index 0000000..7370f36 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketBundle.java @@ -0,0 +1,32 @@ +package com.javabom.lotto.domain.ticket; + +import com.javabom.lotto.domain.number.PrizeNumbersBundle; +import com.javabom.lotto.domain.result.LottoResult; +import com.javabom.lotto.domain.result.LottoResultBundle; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +public class LottoTicketBundle { + + private final List lottoTicketBundle; + + public LottoTicketBundle(List LottoTicketBundle) { + this.lottoTicketBundle = LottoTicketBundle; + } + + public LottoResultBundle getLottoResults(PrizeNumbersBundle prizeNumberBundle) { + List lottoResults = lottoTicketBundle.stream() + .map(prizeNumberBundle::getLottoResult) + .collect(Collectors.toList()); + + return new LottoResultBundle(lottoResults); + } + + public List get() { + return Collections.unmodifiableList(lottoTicketBundle); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java b/src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java new file mode 100644 index 0000000..4d70603 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java @@ -0,0 +1,19 @@ +package com.javabom.lotto.domain.utils; + +import com.javabom.lotto.domain.number.OrderGameNumber; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +public class GameNumberConverter { + + public static List convert(List strGameNumbers) { + final AtomicInteger idx = new AtomicInteger(1); + + return strGameNumbers.stream() + .distinct() + .map(number -> OrderGameNumber.of(idx.getAndIncrement(), number.trim())) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/javabom/lotto/view/InputView.java b/src/main/java/com/javabom/lotto/view/InputView.java new file mode 100644 index 0000000..a26b912 --- /dev/null +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -0,0 +1,64 @@ +package com.javabom.lotto.view; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + + private static final String DELIMITER = ","; + private final Scanner sc; + + public InputView(Scanner sc) { + this.sc = sc; + } + + public int inputManualLottoTicketCount() { + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + String manualLottoTicketCount = sc.nextLine(); + checkEmpty(manualLottoTicketCount); + return Integer.parseInt(manualLottoTicketCount); + } + + public List> inputManualLottoNumbers(int manualLottoTicketCount) { + System.out.println("수동으로 구매할 번호를 입력해 주세요"); + List> manualLottoNumbers = new ArrayList<>(); + for (int ticketCount = 1; ticketCount <= manualLottoTicketCount; ticketCount++) { + String manualLottoNumber = sc.nextLine(); + checkEmpty(manualLottoNumber); + manualLottoNumbers.add(Arrays.asList(manualLottoNumber.split(DELIMITER))); + } + return manualLottoNumbers; + } + + public int inputMoney() { + String FIRST_QUESTION = "구입 금앱을 입력해 주세요."; + System.out.println(FIRST_QUESTION); + String money = sc.nextLine(); + checkEmpty(money); + return Integer.parseInt(money); + } + + public List inputPrizeNumbers() { + String SECOUND_QUESTION = "당첨 번호를 입력해주세요."; + System.out.println(SECOUND_QUESTION); + String prizeNumbers = sc.nextLine(); + checkEmpty(prizeNumbers); + return Arrays.asList(prizeNumbers.split(DELIMITER)); + } + + public String inputBonusNumber() { + String THIRD_QUESTION = "보너스 번호를 입력해주세요."; + System.out.println(THIRD_QUESTION); + String bonusNumber = sc.nextLine(); + checkEmpty(bonusNumber); + return bonusNumber; + } + + private void checkEmpty(String inputValue) { + if (inputValue.isEmpty()) { + throw new NullPointerException("값을 입력하지 않았습니다. 값을 입력해 주세요."); + } + } +} diff --git a/src/main/java/com/javabom/lotto/view/OutputView.java b/src/main/java/com/javabom/lotto/view/OutputView.java new file mode 100644 index 0000000..1e875d8 --- /dev/null +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -0,0 +1,48 @@ +package com.javabom.lotto.view; + +import com.javabom.lotto.domain.result.LottoResult; +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.ticket.LottoTicketBundle; +import com.javabom.lotto.domain.result.LottoResultBundle; + +import java.util.List; + +public class OutputView { + + private static final int BONUS_COUNT = 5; + + public static void printLottoCount(int manualLottoCount, int autoLottoCount) { + System.out.println("수동으로 " + manualLottoCount + "장 자동으로" + autoLottoCount + "개를 구매했습니다."); + } + + public static void printLottoBundle(LottoTicketBundle lottoTickets) { + List lottoTicketBundle = lottoTickets.get(); + for (LottoTicket lottoTicket : lottoTicketBundle) { + System.out.print("["); + for (int i = 0; i < 5; i++) { + System.out.print(lottoTicket.get(i).value() + ", "); + } + System.out.println(lottoTicket.get(5).value() + "]"); + } + } + + public static void printResults(LottoResultBundle lottoResultBundle, int amount) { + System.out.println("당첨 통계"); + System.out.println("----------"); + for (int mathcedCount = 3; mathcedCount <= 6; mathcedCount++) { + printResult(lottoResultBundle, mathcedCount); + } + printRateOfProfit(lottoResultBundle, amount); + } + + private static void printResult(LottoResultBundle lottoResultBundle, int mathcedCount) { + System.out.println(mathcedCount + "개 일치(" + LottoResult.valueOf(mathcedCount).getPrize() + ")- " + lottoResultBundle.getCountOfPrize(LottoResult.valueOf(mathcedCount))); + if (mathcedCount == BONUS_COUNT) { + System.out.println(mathcedCount + "개 일치(" + LottoResult.SECOND.getPrize() + ")- " + lottoResultBundle.getCountOfPrize(LottoResult.SECOND)); + } + } + + private static void printRateOfProfit(LottoResultBundle lottoResultBundle, int amount) { + System.out.println("총 수익률은 " + lottoResultBundle.getRateOfProfit(amount) + "%입니다."); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/CustomerTest.java b/src/test/java/com/javabom/lotto/domain/CustomerTest.java new file mode 100644 index 0000000..db1b7f1 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/CustomerTest.java @@ -0,0 +1,77 @@ +package com.javabom.lotto.domain; + +import com.javabom.lotto.domain.ticket.LottoTicket; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +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.assertThatThrownBy; + +public class CustomerTest { + + @DisplayName("입력한 돈의 값이 0원보다 작으면 IllegalArgumentExceptiion을 발생시킨다.") + @Test + void checkPositive() { + List> manualLottoNumbers = new ArrayList<>(); + int amount = -1; + assertThatThrownBy(() -> new Customer(amount, manualLottoNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(String.format("%d, 0원 이상의 돈을 입력해 주세요.", amount)); + } + + @DisplayName("보유하고 있는 금액이 수동티켓 구입 금액보다 부족하면 IllegalArgumentExceptiion을 발생시킨다.") + @Test + void checkBuyManualLottoTicket() { + List> manualLottoNumbers = new ArrayList<>(); + manualLottoNumbers.add(Arrays.asList("1", "2", "3", "4", "5", "6")); + manualLottoNumbers.add(Arrays.asList("1", "2", "3", "4", "5", "6")); + + int amount = 1500; + int requiredAmount = manualLottoNumbers.size() * LottoTicket.PRICE; + assertThatThrownBy(() -> new Customer(amount, manualLottoNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(String.format("현재 보유 금액:%d, 필요한 금액:%d, 금액이 부족합니다.", amount, requiredAmount)); + } + + @DisplayName("입력한 수동 로또 번호가 6개가 아니면 IllegalArgumentException을 발생시킨다.") + @Test + void checkCount() { + List> manualLottoNumbers = new ArrayList<>(); + List manualLottoNumber = Arrays.asList("1", "2", "3", "4", "5"); + manualLottoNumbers.add(manualLottoNumber); + + assertThatThrownBy(() -> new Customer(1000, manualLottoNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(String.format("%d개의 수동 로또 번호를 입력하셨습니다. 수동 로또 번호는 총 6개여야 합니다.", manualLottoNumber.size())); + } + + @DisplayName("수동으로 구입한 로또 번호가 중복될 시 IllegalArgumentException을 발생시킨다.") + @Test + void checkDuplicate() { + List> manualLottoNumbers = new ArrayList<>(); + List manualLottoNumber = Arrays.asList("1", "2", "3", "4", "5", "5"); + manualLottoNumbers.add(manualLottoNumber); + + assertThatThrownBy(() -> new Customer(1000, manualLottoNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("수동 로또 번호는 모두 달라야 합니다."); + } + + @DisplayName("구입할 수 있는 자동 로또 티켓 갯수를 반환한다.") + @ParameterizedTest + @CsvSource({"10000,8", "4500,2"}) + void getAutoLottoTicketCount(int amount, int expected) { + List> manualLottoNumbers = new ArrayList<>(); + manualLottoNumbers.add(Arrays.asList("1", "2", "3", "4", "5", "6")); + manualLottoNumbers.add(Arrays.asList("1", "2", "3", "4", "5", "6")); + + Customer customer = new Customer(amount, manualLottoNumbers); + assertThat(customer.getAutoLottoTicketCount()).isEqualTo(expected); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/number/GameNumberTest.java b/src/test/java/com/javabom/lotto/domain/number/GameNumberTest.java new file mode 100644 index 0000000..da2b6d8 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/number/GameNumberTest.java @@ -0,0 +1,18 @@ +package com.javabom.lotto.domain.number; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class GameNumberTest { + + @DisplayName("로또 당첨 번호에 사용될 숫자가 1-45 사이의 숫자가 아닐 시 IllegalArgumentException 을 발생시킨다.") + @Test + void checkRange() { + String number = "50"; + assertThatThrownBy(() -> GameNumber.valueOf(number)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(String.format("입력값: %s, 당첨 번호는 1-45 숫자만 가능합니다.", number)); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/number/OrderGameNumberTest.java b/src/test/java/com/javabom/lotto/domain/number/OrderGameNumberTest.java new file mode 100644 index 0000000..d79f3bd --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/number/OrderGameNumberTest.java @@ -0,0 +1,32 @@ +package com.javabom.lotto.domain.number; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.*; + +public class OrderGameNumberTest { + + @DisplayName("인덱스 범위가 넘어가면 IllegalArgumentException을 발생시킨다.") + @Test + void checkOrderRange(){ + int actual = 10; + assertThatThrownBy(() -> OrderGameNumber.of(actual, GameNumber.valueOf(actual))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(String.format("%d, 게임 숫자의 인덱스 범위는 1-6 이어야 합니다.", actual)); + } + + @DisplayName("로또 번호가 같으면 true, 다르면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"10,true", "20,flase"}) + void equalsOfNumber(int inputGameNumber, boolean expected){ + GameNumber gameNumber = GameNumber.valueOf(10); + OrderGameNumber orderGameNumber = OrderGameNumber.of(3, gameNumber); + + OrderGameNumber actualGameNumber = OrderGameNumber.of(7, GameNumber.valueOf(inputGameNumber)); + + assertThat(orderGameNumber.equalsOfNumber(actualGameNumber)).isEqualTo(expected); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersBundleTest.java b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersBundleTest.java new file mode 100644 index 0000000..2ca2209 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersBundleTest.java @@ -0,0 +1,42 @@ +package com.javabom.lotto.domain.number; + +import com.javabom.lotto.domain.result.LottoResult; +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.utils.GameNumberConverter; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class PrizeNumbersBundleTest { + + @DisplayName("당첨 번호와 보너스 번호가 겹치면 IllegalArgumentException 을 발생시킨다") + @Test + void checkDuplicate() { + List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + String bonusNumber = "6"; + assertThatThrownBy(() -> new PrizeNumbersBundle(prizeNumbers, bonusNumber)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("입력하신 보너스 번호는 당첨 번호와 겹칩니다."); + } + + @DisplayName("당첨 번호와 보너스 번호의 일치 갯수의 값을 확인한다.") + @ParameterizedTest + @CsvSource({"10,SECOND", "20,THIRD"}) + void getLottoResult(String bonusNumber, String expected) { + List prizeNumbers = Arrays.asList("1", "3", "5", "7", "9", "11"); + PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle(prizeNumbers, bonusNumber); + + LottoTicket lottoTicket = new LottoTicket( + GameNumberConverter.convert(Arrays.asList("1", "3", "5", "7", "9", "10"))); + + LottoResult lottoResult = prizeNumberBundle.getLottoResult(lottoTicket); + assertThat(lottoResult).isEqualTo(LottoResult.valueOf(expected)); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersTest.java b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersTest.java new file mode 100644 index 0000000..7689814 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersTest.java @@ -0,0 +1,39 @@ +package com.javabom.lotto.domain.number; + +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.utils.GameNumberConverter; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class PrizeNumbersTest { + + @DisplayName("당첨 번호에 들어있는 번호면 true, 들어있지 않는 번호면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"4,true", "7,false"}) + void contains(int number, boolean expected) { + List strPrizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + PrizeNumbers prizeNumbers = new PrizeNumbers(strPrizeNumbers); + OrderGameNumber bonusNumber = OrderGameNumber.of(7, GameNumber.valueOf(number)); + assertThat(prizeNumbers.contains(bonusNumber)).isEqualTo(expected); + } + + @DisplayName("당첨 번호와 로또 티켓의 일치 갯수를 확인한다.") + @Test + void getMatchedCount(){ + List strPrizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + PrizeNumbers prizeNumbers = new PrizeNumbers(strPrizeNumbers); + + List strGameNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); + LottoTicket lottoTicket = new LottoTicket(gameNumbers); + + assertThat(prizeNumbers.getMatchedCount(lottoTicket)).isEqualTo(6); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java b/src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java new file mode 100644 index 0000000..7c6ee18 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java @@ -0,0 +1,41 @@ +package com.javabom.lotto.domain.result; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +class LottoResultBundleTest { + + @DisplayName("로또 결과에 대한 상금을 확인한다.") + @Test + void calculatePrize() { + LottoResultBundle lottoResultBundle = new LottoResultBundle(Arrays.asList( + LottoResult.FIFTH, LottoResult.FIFTH, LottoResult.FAIL, LottoResult.FOURTH)); + assertThat(lottoResultBundle.calculatePrize()).isEqualTo(60000); + } + + @DisplayName("수익률을 계산한다.") + @ParameterizedTest + @CsvSource({"100000,0", "10000,500"}) + void getRateOfProfit(int amount, int expected) { + LottoResultBundle lottoResultBundle = new LottoResultBundle(Arrays.asList( + LottoResult.FAIL, LottoResult.FIFTH, LottoResult.FOURTH, LottoResult.FIFTH)); + + assertThat(lottoResultBundle.getRateOfProfit(amount)).isEqualTo(expected); + } + + @DisplayName("로또 결과에 대한 일치 갯수를 확인한다.") + @Test + void getCountOfPrize() { + LottoResultBundle lottoResultBundle = new LottoResultBundle(Arrays.asList( + LottoResult.FOURTH, LottoResult.FIFTH, LottoResult.FIFTH, LottoResult.FIFTH)); + + assertThat(lottoResultBundle.getCountOfPrize(LottoResult.FIFTH)).isEqualTo(3); + assertThat(lottoResultBundle.getCountOfPrize(LottoResult.FOURTH)).isEqualTo(1); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/result/LottoResultTest.java b/src/test/java/com/javabom/lotto/domain/result/LottoResultTest.java new file mode 100644 index 0000000..26f3cb5 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/result/LottoResultTest.java @@ -0,0 +1,18 @@ +package com.javabom.lotto.domain.result; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class LottoResultTest { + + @DisplayName("로또 결과에 대한 알맞은 상금을 반환하는지 확인한다.") + @ParameterizedTest + @CsvSource({"0,false,FAIL", "3,false,FIFTH", "4,false,FOURTH", "5,false,THIRD", "5,true,SECOND", "6,false,FIRST"}) + void findLottoResult(int matchedCount, boolean bonusStatus, String expected) { + LottoResult actual = LottoResult.findLottoResult(matchedCount, bonusStatus); + assertThat(actual).isEqualTo(LottoResult.valueOf(expected)); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/shop/AutoLottoNumberGeneratorTest.java b/src/test/java/com/javabom/lotto/domain/shop/AutoLottoNumberGeneratorTest.java new file mode 100644 index 0000000..44cc075 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/AutoLottoNumberGeneratorTest.java @@ -0,0 +1,27 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class AutoLottoNumberGeneratorTest { + + @DisplayName("자동으로 생성된 로또 숫자들의 범위를 확인한다.") + @Test + void generate(){ + AutoLottoNumberGenerator autoLottoNumberGenerator = new AutoLottoNumberGenerator(); + List actual = autoLottoNumberGenerator.generate(); + + assertTrue(actual.get(0).numberValue().value() >= GameNumber.MIN_NUMBER && actual.get(0).numberValue().value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(1).numberValue().value() >= GameNumber.MIN_NUMBER && actual.get(1).numberValue().value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(2).numberValue().value() >= GameNumber.MIN_NUMBER && actual.get(2).numberValue().value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(3).numberValue().value() >= GameNumber.MIN_NUMBER && actual.get(3).numberValue().value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(4).numberValue().value() >= GameNumber.MIN_NUMBER && actual.get(4).numberValue().value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(5).numberValue().value() >= GameNumber.MIN_NUMBER && actual.get(5).numberValue().value() <= GameNumber.MAX_NUMBER); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/shop/FixedNumberGenerator.java b/src/test/java/com/javabom/lotto/domain/shop/FixedNumberGenerator.java new file mode 100644 index 0000000..2805785 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/FixedNumberGenerator.java @@ -0,0 +1,18 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; +import com.javabom.lotto.domain.utils.GameNumberConverter; + +import java.util.Arrays; +import java.util.List; + +public class FixedNumberGenerator implements LottoNumbersGenerator{ + + List strGameNumbers = Arrays.asList("1","2","3","4","5","6"); + + @Override + public List generate() { + return GameNumberConverter.convert(strGameNumbers); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/shop/LottoMachineTest.java b/src/test/java/com/javabom/lotto/domain/shop/LottoMachineTest.java new file mode 100644 index 0000000..0c38e45 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/LottoMachineTest.java @@ -0,0 +1,53 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.number.OrderGameNumber; +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.utils.GameNumberConverter; +import org.junit.jupiter.api.DisplayName; +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; + +class LottoMachineTest { + + @DisplayName("수동 로또 번호 값이 잘 들어왔는지 확인한다.") + @Test + void createManualLottoTicket() { + List strGameNumbers = (Arrays.asList("1", "2", "3", "4", "5", "6")); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); + + List> manualLottoNumbers = new ArrayList<>(); + manualLottoNumbers.add(gameNumbers); + + LottoMachine lottoMachine = new LottoMachine(new AutoLottoNumberGenerator()); + List lottoTickets = lottoMachine.createManualLottoTicket(manualLottoNumbers); + LottoTicket actual = lottoTickets.get(0); + + assertThat(actual.get(0)).isEqualTo(GameNumber.valueOf(1)); + assertThat(actual.get(1)).isEqualTo(GameNumber.valueOf(2)); + assertThat(actual.get(2)).isEqualTo(GameNumber.valueOf(3)); + assertThat(actual.get(3)).isEqualTo(GameNumber.valueOf(4)); + assertThat(actual.get(4)).isEqualTo(GameNumber.valueOf(5)); + assertThat(actual.get(5)).isEqualTo(GameNumber.valueOf(6)); + } + + @DisplayName("랜덤 로또 번호 값이 잘 들어왔는지 확인한다.") + @Test + void createAutoLottoTicket() { + LottoMachine lottoMachine = new LottoMachine(new FixedNumberGenerator()); + ListlottoTickets = lottoMachine.createAutoLottoTicket(1); + LottoTicket actual = lottoTickets.get(0); + + assertThat(actual.get(0)).isEqualTo(GameNumber.valueOf(1)); + assertThat(actual.get(1)).isEqualTo(GameNumber.valueOf(2)); + assertThat(actual.get(2)).isEqualTo(GameNumber.valueOf(3)); + assertThat(actual.get(3)).isEqualTo(GameNumber.valueOf(4)); + assertThat(actual.get(4)).isEqualTo(GameNumber.valueOf(5)); + assertThat(actual.get(5)).isEqualTo(GameNumber.valueOf(6)); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/shop/LottoShopTest.java b/src/test/java/com/javabom/lotto/domain/shop/LottoShopTest.java new file mode 100644 index 0000000..6d66117 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/LottoShopTest.java @@ -0,0 +1,36 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.Customer; +import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.ticket.LottoTicketBundle; +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 LottoShopTest { + + @DisplayName("구입한 로또 티켓이 잘 들어왔는지 확인한다.") + @Test + void buy() { + List> manualLottoNumbers = new ArrayList<>(); + + Customer customer = new Customer(1000, manualLottoNumbers); + LottoShop lottoShop = new LottoShop(new LottoMachine(new FixedNumberGenerator())); + LottoTicketBundle lottoTicketBundle = lottoShop.buy(customer); + + List lottoTickets = lottoTicketBundle.get(); + LottoTicket actual = lottoTickets.get(0); + + assertThat(actual.get(0)).isEqualTo(GameNumber.valueOf(1)); + assertThat(actual.get(1)).isEqualTo(GameNumber.valueOf(2)); + assertThat(actual.get(2)).isEqualTo(GameNumber.valueOf(3)); + assertThat(actual.get(3)).isEqualTo(GameNumber.valueOf(4)); + assertThat(actual.get(4)).isEqualTo(GameNumber.valueOf(5)); + assertThat(actual.get(5)).isEqualTo(GameNumber.valueOf(6)); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketBundleTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketBundleTest.java new file mode 100644 index 0000000..56b36f7 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketBundleTest.java @@ -0,0 +1,36 @@ +package com.javabom.lotto.domain.ticket; + +import com.javabom.lotto.domain.number.PrizeNumbersBundle; +import com.javabom.lotto.domain.result.LottoResult; +import com.javabom.lotto.domain.result.LottoResultBundle; +import com.javabom.lotto.domain.utils.GameNumberConverter; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class LottoTicketBundleTest { + + @DisplayName("알맞은 로또 결과를 반환하는지 확인한다.") + @Test + public void getLottoResults() { + LottoTicket lottoTicket1 = new LottoTicket( + GameNumberConverter.convert(Arrays.asList("1", "2", "3", "4", "5", "6"))); + LottoTicket lottoTicket2 = new LottoTicket( + GameNumberConverter.convert(Arrays.asList("1", "3", "5", "7", "9", "11"))); + + List lottoTicketList = Arrays.asList(lottoTicket1, lottoTicket2); + + LottoTicketBundle lottoTicketBundle = new LottoTicketBundle(lottoTicketList); + + List prizeNumbers = Arrays.asList("1", "2", "4", "7", "9", "11"); + PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle(prizeNumbers, "30"); + + LottoResultBundle lottoResultBundle = lottoTicketBundle.getLottoResults(prizeNumberBundle); + assertThat(lottoResultBundle.valueOf(0)).isEqualTo(LottoResult.FAIL); + assertThat(lottoResultBundle.valueOf(1)).isEqualTo(LottoResult.FOURTH); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java new file mode 100644 index 0000000..9bee8bd --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java @@ -0,0 +1,57 @@ +package com.javabom.lotto.domain.ticket; + +import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; +import com.javabom.lotto.domain.number.PrizeNumbersBundle; +import com.javabom.lotto.domain.utils.GameNumberConverter; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LottoTicketTest { + + @DisplayName("티켓이 갖고있는 로또 번호가 중복되면 IllegalArgumentException을 발생시킨다.") + @Test + void checkDuplicate() { + List strGameNumbers = Arrays.asList("1","2","3","4","5"); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); + int expected = 5; + + assertThatThrownBy(() -> new LottoTicket(gameNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(String.format("현재 개수: %d, 로또 번호의 갯수는 6개여야 합니다.", expected)); + } + + @DisplayName("티켓이 갖고있는 로또 번호면 true, 아니면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"1,true", "7,false"}) + void contains(int number, boolean expected) { + List strGameNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); + LottoTicket lottoTicket = new LottoTicket(gameNumbers); + + GameNumber gameNumber = GameNumber.valueOf(number); + + assertThat(lottoTicket.contains(OrderGameNumber.of(number, gameNumber))).isEqualTo(expected); + } + + @DisplayName("티켓이 보너스 번호를 갖고있으면 true, 아니면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"1,true", "7,false"}) + void containsBonus(int number, boolean expected) { + List strGameNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); + LottoTicket lottoTicket = new LottoTicket(gameNumbers); + + GameNumber bonusNumber = GameNumber.valueOf(number); + + assertThat(lottoTicket.containsBonus(OrderGameNumber.of(7, bonusNumber))).isEqualTo(expected); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/utils/GameNumberConverterTest.java b/src/test/java/com/javabom/lotto/domain/utils/GameNumberConverterTest.java new file mode 100644 index 0000000..5e6ab33 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/utils/GameNumberConverterTest.java @@ -0,0 +1,30 @@ +package com.javabom.lotto.domain.utils; + +import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameNumberConverterTest { + + @DisplayName("로또 번호 숫자들을 잘 반환하는지 확인한다.") + @Test + void convert() { + GameNumberConverter gameNumberConverter = new GameNumberConverter(); + + List strGameNumber = Arrays.asList("1", "2", "3", "4", "5", "6"); + List actual = gameNumberConverter.convert(strGameNumber); + + assertThat(actual.get(0).numberValue()).isEqualTo(GameNumber.valueOf(1)); + assertThat(actual.get(1).numberValue()).isEqualTo(GameNumber.valueOf(2)); + assertThat(actual.get(2).numberValue()).isEqualTo(GameNumber.valueOf(3)); + assertThat(actual.get(3).numberValue()).isEqualTo(GameNumber.valueOf(4)); + assertThat(actual.get(4).numberValue()).isEqualTo(GameNumber.valueOf(5)); + assertThat(actual.get(5).numberValue()).isEqualTo(GameNumber.valueOf(6)); + } +} diff --git a/src/test/java/com/javabom/lotto/empty.txt b/src/test/java/com/javabom/lotto/empty.txt deleted file mode 100644 index e69de29..0000000