From 7da1a2cd89323edbcd89d22e5527806382eac37c Mon Sep 17 00:00:00 2001 From: BangKiHyun Date: Fri, 22 May 2020 14:14:28 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=EB=A1=9C=EB=98=90=201=EB=8B=A8=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 27 ++++++++ .../com/javabom/lotto/domain/BonusNumber.java | 51 ++++++++++++++++ .../java/com/javabom/lotto/domain/Lotto.java | 24 ++++++++ .../javabom/lotto/domain/MatchedCounts.java | 17 ++++++ .../java/com/javabom/lotto/domain/Money.java | 39 ++++++++++++ .../javabom/lotto/domain/MyLottoBundle.java | 34 +++++++++++ .../com/javabom/lotto/domain/PrizeCounts.java | 43 +++++++++++++ .../com/javabom/lotto/domain/PrizeMoneys.java | 17 ++++++ .../javabom/lotto/domain/PrizeNumbers.java | 56 +++++++++++++++++ .../com/javabom/lotto/domain/PrizeType.java | 57 +++++++++++++++++ .../com/javabom/lotto/util/LottoFactory.java | 17 ++++++ .../lotto/util/PickedLottoNumbers.java | 7 +++ .../lotto/util/ShuffleLottoNumbers.java | 28 +++++++++ .../com/javabom/lotto/view/InputView.java | 42 +++++++++++++ .../com/javabom/lotto/view/OutputView.java | 50 +++++++++++++++ .../javabom/lotto/domain/BonusNumberTest.java | 61 +++++++++++++++++++ .../com/javabom/lotto/domain/LottoTest.java | 38 ++++++++++++ .../lotto/domain/MatchedCountsTest.java | 21 +++++++ .../com/javabom/lotto/domain/MoneyTest.java | 44 +++++++++++++ .../lotto/domain/MyLottoBundleTest.java | 46 ++++++++++++++ .../javabom/lotto/domain/PrizeMoneysTest.java | 24 ++++++++ .../lotto/domain/PrizeNumbersTest.java | 51 ++++++++++++++++ .../javabom/lotto/util/FixedLottoNumber.java | 12 ++++ .../javabom/lotto/util/LottoFactoryTest.java | 20 ++++++ .../lotto/util/ShuffleLottoNumbersTest.java | 28 +++++++++ 25 files changed, 854 insertions(+) create mode 100644 src/main/java/com/javabom/lotto/domain/BonusNumber.java create mode 100644 src/main/java/com/javabom/lotto/domain/Lotto.java create mode 100644 src/main/java/com/javabom/lotto/domain/MatchedCounts.java create mode 100644 src/main/java/com/javabom/lotto/domain/Money.java create mode 100644 src/main/java/com/javabom/lotto/domain/MyLottoBundle.java create mode 100644 src/main/java/com/javabom/lotto/domain/PrizeCounts.java create mode 100644 src/main/java/com/javabom/lotto/domain/PrizeMoneys.java create mode 100644 src/main/java/com/javabom/lotto/domain/PrizeNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/PrizeType.java create mode 100644 src/main/java/com/javabom/lotto/util/LottoFactory.java create mode 100644 src/main/java/com/javabom/lotto/util/PickedLottoNumbers.java create mode 100644 src/main/java/com/javabom/lotto/util/ShuffleLottoNumbers.java create mode 100644 src/main/java/com/javabom/lotto/view/InputView.java create mode 100644 src/main/java/com/javabom/lotto/view/OutputView.java create mode 100644 src/test/java/com/javabom/lotto/domain/BonusNumberTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/LottoTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/MatchedCountsTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/MoneyTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/MyLottoBundleTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/PrizeMoneysTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/PrizeNumbersTest.java create mode 100644 src/test/java/com/javabom/lotto/util/FixedLottoNumber.java create mode 100644 src/test/java/com/javabom/lotto/util/LottoFactoryTest.java create mode 100644 src/test/java/com/javabom/lotto/util/ShuffleLottoNumbersTest.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 13f852e..1a09e4e 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,7 +1,34 @@ package com.javabom.lotto; +import com.javabom.lotto.domain.*; +import com.javabom.lotto.util.LottoFactory; +import com.javabom.lotto.util.ShuffleLottoNumbers; +import com.javabom.lotto.view.InputView; +import com.javabom.lotto.view.OutputView; + +import java.util.Scanner; + public class LottoApplication { + private static final InputView inputView = new InputView(new Scanner(System.in)); + public static void main(String[] args) { + Money money = new Money(inputView.inputMoney()); + OutputView.printLottoCount(money.getLottoCount()); + + MyLottoBundle myLottoBundle = new MyLottoBundle( + LottoFactory.createLotto(money.getLottoCount(), new ShuffleLottoNumbers())); + OutputView.printMyLottoBundle(myLottoBundle); + + PrizeNumbers prizeNumbers = new PrizeNumbers(inputView.inputPrizeNumbers()); + BonusNumber bonusNumber = new BonusNumber(inputView.inputBonusNumber(), prizeNumbers); + + MatchedCounts matchedCounts = new MatchedCounts(myLottoBundle.getMatchedCounts(prizeNumbers, bonusNumber)); + + PrizeCounts prizeCounts = new PrizeCounts(); + prizeCounts.compileStatisticsOfPrize(matchedCounts); + + PrizeMoneys prizeMoneys = new PrizeMoneys(prizeCounts.getPrizeMoneys()); + OutputView.printResult(prizeCounts, money.getRateOfProfit(prizeMoneys.getAmountOfPrize())); } } diff --git a/src/main/java/com/javabom/lotto/domain/BonusNumber.java b/src/main/java/com/javabom/lotto/domain/BonusNumber.java new file mode 100644 index 0000000..9cbc862 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/BonusNumber.java @@ -0,0 +1,51 @@ +package com.javabom.lotto.domain; + +public class BonusNumber { + private int bonusNumber; + + public BonusNumber(String strBonusNumber, PrizeNumbers prizeNumbers) { + int bonusNumber = parseInt(strBonusNumber); + checkDuplicate(bonusNumber, prizeNumbers); + checkRange(bonusNumber); + this.bonusNumber = bonusNumber; + } + + private int parseInt(String strBonusNumber) { + try { + return Integer.parseInt(strBonusNumber); + } catch (NumberFormatException e) { + throw new NumberFormatException("보너스 번호는 숫자만 들어올 수 있습니다."); + } + } + + private void checkDuplicate(int bonusNumber, PrizeNumbers prizeNumbers) { + if (prizeNumbers.has(bonusNumber)) { + throw new IllegalArgumentException("보너스 번호는 이미 당첨 번호에 있는 번호입니다."); + } + } + + private void checkRange(int bonusNumber) { + if (isNotRange(bonusNumber)) { + throw new IllegalArgumentException("보너스 번호는 1부터 45까지만 있을 수 있습니다."); + } + } + + private boolean isNotRange(int bonusNumber) { + return bonusNumber < 1 || bonusNumber > 45; + } + + public boolean isValid(Lotto lotto, int matchedCount) { + if (valid(lotto, matchedCount)) { + return true; + } + return false; + } + + private boolean valid(Lotto lotto, int matchedCount) { + return lotto.has(bonusNumber) && matchedCount == 5; + } + + public int get() { + return bonusNumber; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/Lotto.java b/src/main/java/com/javabom/lotto/domain/Lotto.java new file mode 100644 index 0000000..e392400 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/Lotto.java @@ -0,0 +1,24 @@ +package com.javabom.lotto.domain; + +import java.util.Collections; +import java.util.List; + +public class Lotto { + private List lotto; + + public Lotto(List lotto) { + this.lotto = lotto; + } + + public boolean has(int lottoNumber) { + return lotto.contains(lottoNumber); + } + + public int get(int idx) { + return lotto.get(idx); + } + + public List getLotto() { + return Collections.unmodifiableList(lotto); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/MatchedCounts.java b/src/main/java/com/javabom/lotto/domain/MatchedCounts.java new file mode 100644 index 0000000..00e3de7 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/MatchedCounts.java @@ -0,0 +1,17 @@ +package com.javabom.lotto.domain; + +import java.util.List; + +public class MatchedCounts { + private final List matchedCounts; + + public MatchedCounts(List matchedCounts) { + this.matchedCounts = matchedCounts; + } + + public int getMatchedCount(int key){ + return (int) matchedCounts.stream() + .filter(matchedCount -> matchedCount.equals(key)) + .count(); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/Money.java b/src/main/java/com/javabom/lotto/domain/Money.java new file mode 100644 index 0000000..519a378 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/Money.java @@ -0,0 +1,39 @@ +package com.javabom.lotto.domain; + +public class Money { + private final int LOTTO_PRICE = 1000; + + private int money; + + public Money(String strMoney) { + int money = parseInt(strMoney); + checkCanBuyLotto(money); + this.money = money; + } + + private int parseInt(String money) { + try { + return Integer.parseInt(money); + } catch (NumberFormatException e) { + throw new NumberFormatException("금액은 숫자만 입력이 가능합니다."); + } + } + + private void checkCanBuyLotto(int money) { + if (money < LOTTO_PRICE) { + throw new IllegalArgumentException("돈이 부족합니다. 1000원 이상 금액을 입력해 주세요."); + } + } + + public int getLottoCount() { + return money / LOTTO_PRICE; + } + + public int getRateOfProfit(int amountOfPrize) { + int profit = amountOfPrize - money; + if (profit < 0) { + return 0; + } + return (profit / money) * 100; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/MyLottoBundle.java b/src/main/java/com/javabom/lotto/domain/MyLottoBundle.java new file mode 100644 index 0000000..b2d887f --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/MyLottoBundle.java @@ -0,0 +1,34 @@ +package com.javabom.lotto.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class MyLottoBundle { + private static final int BONUS_COUNT = 45; + + private final List myLottoBundle; + + public MyLottoBundle(List myLottoBundle) { + this.myLottoBundle = myLottoBundle; + } + + private int getMatchedCount(Lotto lotto, int matchedCount, BonusNumber bonusNumber) { + if (bonusNumber.isValid(lotto, matchedCount)) { + return matchedCount + BONUS_COUNT; + } + return matchedCount; + } + + public List getMatchedCounts(PrizeNumbers prizeNumbers, BonusNumber bonusNumber) { + List matchedCounts = new ArrayList<>(); + for (Lotto lotto : myLottoBundle) { + matchedCounts.add(getMatchedCount(lotto, prizeNumbers.getMatchedCount(lotto), bonusNumber)); + } + return matchedCounts; + } + + public List getMyLottoBundle() { + return Collections.unmodifiableList(myLottoBundle); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/PrizeCounts.java b/src/main/java/com/javabom/lotto/domain/PrizeCounts.java new file mode 100644 index 0000000..ed65d10 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/PrizeCounts.java @@ -0,0 +1,43 @@ +package com.javabom.lotto.domain; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PrizeCounts { + private final Map prizeCounts = new HashMap<>(); + + public PrizeCounts() { + init(); + } + + private void init() { + prizeCounts.put(3, 0); + prizeCounts.put(4, 0); + prizeCounts.put(5, 0); + prizeCounts.put(6, 0); + prizeCounts.put(50, 0); + } + + public void compileStatisticsOfPrize(MatchedCounts matchedCounts) { + prizeCounts.replaceAll((k, v) -> matchedCounts.getMatchedCount(k)); + } + + public List getPrizeMoneys() { + List prizeMoneys = new ArrayList<>(); + for (int key : prizeCounts.keySet()) { + PrizeType prizeType = PrizeType.valueOfPrize(key); + prizeMoneys.add(prizeType.calculate(prizeCounts.get(key))); + } + return prizeMoneys; + } + + public int getPrizeCount(int idx) { + return prizeCounts.get(idx); + } + + public boolean containKey(int idx) { + return prizeCounts.containsKey(idx); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/PrizeMoneys.java b/src/main/java/com/javabom/lotto/domain/PrizeMoneys.java new file mode 100644 index 0000000..198fae4 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/PrizeMoneys.java @@ -0,0 +1,17 @@ +package com.javabom.lotto.domain; + +import java.util.List; + +public class PrizeMoneys { + private final List prizeMoneys; + + public PrizeMoneys(List prizeMoneys) { + this.prizeMoneys = prizeMoneys; + } + + public int getAmountOfPrize() { + return prizeMoneys.stream() + .mapToInt(Integer::intValue) + .sum(); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/PrizeNumbers.java b/src/main/java/com/javabom/lotto/domain/PrizeNumbers.java new file mode 100644 index 0000000..1386fa8 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/PrizeNumbers.java @@ -0,0 +1,56 @@ +package com.javabom.lotto.domain; + +import java.util.ArrayList; +import java.util.List; + +public class PrizeNumbers { + private List prizeNumbers; + + public PrizeNumbers(List strPrizeNumbers) { + checkCount(strPrizeNumbers.size()); + List prizeNumbers = new ArrayList<>(); + for (String strPrizeNumber : strPrizeNumbers) { + int prizeNumber = parseInt(strPrizeNumber); + checkRange(parseInt(strPrizeNumber)); + prizeNumbers.add(prizeNumber); + } + this.prizeNumbers = prizeNumbers; + } + + private void checkCount(int numberCount) { + if (numberCount < 6) { + throw new IllegalArgumentException("당첨 번호는 총 6개여야 합니다."); + } + } + + private int parseInt(String strPrizeNumber) { + try { + return Integer.parseInt(strPrizeNumber); + } catch (NumberFormatException e) { + throw new NumberFormatException("당첨 번호는 숫자만 들어올 수 있습니다."); + } + } + + private void checkRange(int prizeNumber) { + if (isNotRange(prizeNumber)) { + throw new IllegalArgumentException("당첨번호는 1부터 45까지만 있을 수 있습니다."); + } + } + + private boolean isNotRange(int prizeNumber) { + return prizeNumber < 1 || prizeNumber > 45; + } + + public int getMatchedCount(Lotto lotto) { + return (int) prizeNumbers.stream() + .filter(lotto::has) + .count(); + } + + public boolean has(int number) { + if (prizeNumbers.contains(number)) { + return true; + } + return false; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/PrizeType.java b/src/main/java/com/javabom/lotto/domain/PrizeType.java new file mode 100644 index 0000000..6540827 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/PrizeType.java @@ -0,0 +1,57 @@ +package com.javabom.lotto.domain; + +import java.util.HashMap; +import java.util.Map; + +public enum PrizeType { + FIRST(6) { + @Override + int calculate(int count) { + return 2000000000 * count; + } + }, + SECOND(50) { + @Override + int calculate(int count) { + return 30000000 * count; + } + }, + THIRD(5) { + @Override + int calculate(int count) { + return 15000000 * count; + } + }, + FOURTH(4) { + @Override + int calculate(int count) { + return 50000 * count; + } + }, + FIFTH(3) { + @Override + int calculate(int count) { + return 5000 * count; + } + }; + + public final int prizeCount; + + PrizeType(int prizeCount) { + this.prizeCount = prizeCount; + } + + private static final Map BY_PRIZE = new HashMap<>(); + + static { + for (PrizeType type : values()) { + BY_PRIZE.put(type.prizeCount, type); + } + } + + public static PrizeType valueOfPrize(int prizeCount) { + return BY_PRIZE.get(prizeCount); + } + + abstract int calculate(int count); +} diff --git a/src/main/java/com/javabom/lotto/util/LottoFactory.java b/src/main/java/com/javabom/lotto/util/LottoFactory.java new file mode 100644 index 0000000..fb4b733 --- /dev/null +++ b/src/main/java/com/javabom/lotto/util/LottoFactory.java @@ -0,0 +1,17 @@ +package com.javabom.lotto.util; + +import com.javabom.lotto.domain.Lotto; + +import java.util.ArrayList; +import java.util.List; + +public class LottoFactory { + + public static List createLotto(int lottoCount, PickedLottoNumbers pikedLottoNumber) { + List lottoBundle = new ArrayList<>(); + for (int curLottoCount = 0; curLottoCount < lottoCount; curLottoCount++) { + lottoBundle.add(new Lotto(pikedLottoNumber.picked())); + } + return lottoBundle; + } +} diff --git a/src/main/java/com/javabom/lotto/util/PickedLottoNumbers.java b/src/main/java/com/javabom/lotto/util/PickedLottoNumbers.java new file mode 100644 index 0000000..f4008d7 --- /dev/null +++ b/src/main/java/com/javabom/lotto/util/PickedLottoNumbers.java @@ -0,0 +1,7 @@ +package com.javabom.lotto.util; + +import java.util.List; + +public interface PickedLottoNumbers { + List picked(); +} diff --git a/src/main/java/com/javabom/lotto/util/ShuffleLottoNumbers.java b/src/main/java/com/javabom/lotto/util/ShuffleLottoNumbers.java new file mode 100644 index 0000000..5b9eeb2 --- /dev/null +++ b/src/main/java/com/javabom/lotto/util/ShuffleLottoNumbers.java @@ -0,0 +1,28 @@ +package com.javabom.lotto.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class ShuffleLottoNumbers implements PickedLottoNumbers { + private static final List lottoNumbers = new ArrayList<>(); + + static { + init(); + } + + private static void init() { + for (int number = 1; number <= 45; number++) { + lottoNumbers.add(number); + } + } + + @Override + public List picked() { + Collections.shuffle(lottoNumbers); + return lottoNumbers.stream() + .limit(6) + .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..0720be9 --- /dev/null +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -0,0 +1,42 @@ +package com.javabom.lotto.view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + private final String FIRST_QUESTION = "구입 금앱을 입력해 주세요."; + private final String SECOUND_QUESTION = "당첨 번호를 입력해주세요."; + private final String THRID_QUESTION = "보너스 번호를 입력해주세요."; + private final String DELIMITER = ", "; + + private final Scanner sc; + + public InputView(Scanner sc) { + this.sc = sc; + } + + public String inputMoney() { + System.out.println(FIRST_QUESTION); + String money = sc.nextLine(); + checkEmpty(money); + return money; + } + + public List inputPrizeNumbers() { + System.out.println(SECOUND_QUESTION); + String prizeNumbers = sc.nextLine(); + checkEmpty(prizeNumbers); + return Arrays.asList(prizeNumbers.split(DELIMITER)); + } + + public String inputBonusNumber() { + System.out.println(THRID_QUESTION); + String bonusNumber = sc.nextLine(); + checkEmpty(bonusNumber); + return bonusNumber; + } + + private void checkEmpty(String inputValue) { + } +} 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..421c5aa --- /dev/null +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -0,0 +1,50 @@ +package com.javabom.lotto.view; + +import com.javabom.lotto.domain.Lotto; +import com.javabom.lotto.domain.MyLottoBundle; +import com.javabom.lotto.domain.PrizeCounts; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class OutputView { + + public static void printLottoCount(int lottoCount) { + System.out.println(lottoCount + "개를 구매했습니다."); + } + + public static void printMyLottoBundle(MyLottoBundle myLottoBundle) { + List lottoBundle = myLottoBundle.getMyLottoBundle(); + for (Lotto lotto : lottoBundle) { + List strLotto = getStrLotto(lotto.getLotto()); + System.out.println("[" + strLotto.stream(). + collect(Collectors.joining(",")) + "]"); + } + } + + private static List getStrLotto(List lotto) { + return lotto.stream() + .map(Objects::toString) + .collect(Collectors.toList()); + } + + public static void printResult(PrizeCounts prizeCounts, int rateOfProfit) { + System.out.println("당첨 통계"); + System.out.println("----------"); + List prizeMoney = Arrays.asList(5000, 50000, 15000000, 2000000000); + for (int idx = 3; idx <= 6; idx++) { + System.out.println(idx + "개 일치 :{" + prizeMoney.get(idx - 3) + "원)- " + prizeCounts.getPrizeCount(idx)); + checkBonus(prizeCounts, idx * 10); + } + + System.out.println("총 수익률은 " + rateOfProfit + "%입니다."); + } + + private static void checkBonus(PrizeCounts prizeCounts, int idx) { + if (prizeCounts.containKey(idx)) { + System.out.println("5개 일치, 보너스 볼 일치(300000000원)- " + prizeCounts.getPrizeCount(idx)); + } + } +} diff --git a/src/test/java/com/javabom/lotto/domain/BonusNumberTest.java b/src/test/java/com/javabom/lotto/domain/BonusNumberTest.java new file mode 100644 index 0000000..73ad69e --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/BonusNumberTest.java @@ -0,0 +1,61 @@ +package com.javabom.lotto.domain; + +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.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class BonusNumberTest { + + @DisplayName("보너스 번호가 숫자가 아니면 NumberFormatException 을 발생시킨다.") + @Test + void parseInt() { + PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); + assertThatThrownBy(() -> new BonusNumber("number", prizeNumbers)) + .isInstanceOf(NumberFormatException.class) + .hasMessage("보너스 번호는 숫자만 들어올 수 있습니다."); + } + + @DisplayName("보너스 번호가 당첨 번호와 겹치면 IllegalArgumentException 을 발생시킨다.") + @Test + void checkDuplicate1() { + PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); + assertThatThrownBy(() -> new BonusNumber("6", prizeNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("보너스 번호는 이미 당첨 번호에 있는 번호입니다."); + } + + @DisplayName("보너스 번호가 당첨 번호와 겹치지 않으면 오류가 나지 않는다.") + @Test + void checkDuplicate2() { + PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); + BonusNumber actual = new BonusNumber("7", prizeNumbers); + assertEquals(7, actual.get()); + + } + + @DisplayName("보너스 번호가 1-45 사이의 숫자가 아니면 IllegalArgumentException 을 발생시킨다.") + @Test + void checkRange() { + PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); + assertThatThrownBy(() -> new BonusNumber("50", prizeNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("보너스 번호는 1부터 45까지만 있을 수 있습니다."); + } + + @DisplayName("로또 번호중 보너스 번호를 갖고 있고 현재 일치하는 갯수가 5개면 true," + + " 번호를 갖고 있지 않거나 현재 일치하는 갯수가 5가 아니면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"4,5,true", "7,5,false", "4,4,false", "7,4,false"}) + void isValid(String bonusNumber, int matchedCount, boolean expected) { + Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); + PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("10", "20", "30", "40", "12", "13")); + BonusNumber bonus = new BonusNumber(bonusNumber, prizeNumbers); + assertEquals(expected, bonus.isValid(lotto, matchedCount)); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/LottoTest.java b/src/test/java/com/javabom/lotto/domain/LottoTest.java new file mode 100644 index 0000000..437f746 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/LottoTest.java @@ -0,0 +1,38 @@ +package com.javabom.lotto.domain; + +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.junit.jupiter.api.Assertions.*; + +class LottoTest { + + @DisplayName("로또번호를 갖고 있으면 true, 갖고 있지 않으면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"1,true", "9,false"}) + void has(int lottoNumber, boolean expected) { + Lotto lotto = new Lotto( + Arrays.asList(1, 2, 3, 4, 5, 6)); + assertEquals(expected, lotto.has(lottoNumber)); + assertEquals(expected, lotto.has(lottoNumber)); + } + + @DisplayName("생성한 로또번호와 값이잘 들어갔는지 확인한다.") + @Test + void get() { + Lotto lotto = new Lotto( + Arrays.asList(1, 2, 3, 4, 5, 6)); + List actual = lotto.getLotto(); + assertEquals(1, actual.get(0)); + assertEquals(2, actual.get(1)); + assertEquals(3, actual.get(2)); + assertEquals(4, actual.get(3)); + assertEquals(5, actual.get(4)); + assertEquals(6, actual.get(5)); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/MatchedCountsTest.java b/src/test/java/com/javabom/lotto/domain/MatchedCountsTest.java new file mode 100644 index 0000000..5fb6316 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/MatchedCountsTest.java @@ -0,0 +1,21 @@ +package com.javabom.lotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class MatchedCountsTest { + + @DisplayName("일치하는 갯수만큼 값을 찾아 반환하는지 확인한다.") + @Test + void getMatchedCount() { + MatchedCounts matchedCounts = new MatchedCounts( + Arrays.asList(3, 3, 5, 5, 3)); + assertEquals(3, matchedCounts.getMatchedCount(3)); + assertEquals(2, matchedCounts.getMatchedCount(5)); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/MoneyTest.java b/src/test/java/com/javabom/lotto/domain/MoneyTest.java new file mode 100644 index 0000000..0238826 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/MoneyTest.java @@ -0,0 +1,44 @@ +package com.javabom.lotto.domain; + +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.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class MoneyTest { + + @DisplayName("숫자가 아닌 값이 들어 왔을 시 NumberFormatException 을 발생시킨다.") + @Test + void parseInt() { + assertThatThrownBy(() -> new Money("I'm String")) + .isInstanceOf(NumberFormatException.class) + .hasMessage("금액은 숫자만 입력이 가능합니다."); + } + + @DisplayName("금액이 1000원 이상 들어오지 않았을 시 IllegalArgumentException 을 발생시킨다.") + @Test + void checkCanBuyLotto() { + assertThatThrownBy(() -> new Money("900")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("돈이 부족합니다. 1000원 이상 금액을 입력해 주세요."); + } + + @DisplayName("금액이 1000원 이상 들어왔을 때 살 수 있는 로또 갯수를 반환한다.") + @ParameterizedTest + @CsvSource({"1000,1", "14000, 14"}) + void getLottoCount(String inputValue, int expected) { + Money money = new Money(inputValue); + assertEquals(expected, money.getLottoCount()); + } + + @DisplayName("수익률을 계산한다.") + @ParameterizedTest + @CsvSource({"5000,10000,0", "20000,10000,100", "100000,10000,900"}) + void getRateOfReturn(int amountOfPrize, String strMoney, int expected) { + Money money = new Money(strMoney); + assertEquals(expected, money.getRateOfProfit(amountOfPrize)); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/MyLottoBundleTest.java b/src/test/java/com/javabom/lotto/domain/MyLottoBundleTest.java new file mode 100644 index 0000000..e0f6e04 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/MyLottoBundleTest.java @@ -0,0 +1,46 @@ +package com.javabom.lotto.domain; + +import com.javabom.lotto.util.FixedLottoNumber; +import com.javabom.lotto.util.LottoFactory; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class MyLottoBundleTest { + + @DisplayName("나의 로또 번호와 당첨번호의 일치 갯수를 잘 반환하는지 확인한다.") + @Test + void getMatchedCounts() { + MyLottoBundle myLottoBundle = new MyLottoBundle( + LottoFactory.createLotto(2, new FixedLottoNumber())); + + PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); + BonusNumber bonusNumber = new BonusNumber("7", prizeNumbers); + + List actual = myLottoBundle.getMatchedCounts(prizeNumbers, bonusNumber); + + assertEquals(6, actual.get(0)); + assertEquals(6, actual.get(1)); + } + + @DisplayName("입력한 로또 값들이 잘 들어왔는지 확인한다.") + @Test + public void getMyLottoBundle() { + MyLottoBundle myLottoBundle = new MyLottoBundle( + LottoFactory.createLotto(1, new FixedLottoNumber())); + + List lottoBundle = myLottoBundle.getMyLottoBundle(); + Lotto lotto = lottoBundle.get(0); + + assertEquals(1, lotto.get(0)); + assertEquals(2, lotto.get(1)); + assertEquals(3, lotto.get(2)); + assertEquals(4, lotto.get(3)); + assertEquals(5, lotto.get(4)); + assertEquals(6, lotto.get(5)); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/PrizeMoneysTest.java b/src/test/java/com/javabom/lotto/domain/PrizeMoneysTest.java new file mode 100644 index 0000000..cb77c27 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/PrizeMoneysTest.java @@ -0,0 +1,24 @@ +package com.javabom.lotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +class PrizeMoneysTest { + + @DisplayName("각 로또 당첨금과 매치되는 당첨 횟수에 따라 가격이 잘 나오는지 확인한다.") + @Test + void getAmountOfPrize() { + PrizeCounts prizeCounts = new PrizeCounts(); + + MatchedCounts matchedCounts = new MatchedCounts( + Arrays.asList(3, 3, 4, 4, 1, 2)); + prizeCounts.compileStatisticsOfPrize(matchedCounts); + + PrizeMoneys prizeMoneys = new PrizeMoneys(prizeCounts.getPrizeMoneys()); + assertEquals(110000, prizeMoneys.getAmountOfPrize()); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/PrizeNumbersTest.java b/src/test/java/com/javabom/lotto/domain/PrizeNumbersTest.java new file mode 100644 index 0000000..d71323e --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/PrizeNumbersTest.java @@ -0,0 +1,51 @@ +package com.javabom.lotto.domain; + +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.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class PrizeNumbersTest { + + @DisplayName("당첨 번호가 6개가 아닐 시 IllegarArgumentException 을 발생시킨다.") + @Test + void checkCount() { + List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5"); + assertThatThrownBy(() -> new PrizeNumbers(prizeNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("당첨 번호는 총 6개여야 합니다."); + } + + @DisplayName("당첨 번호가 숫자가 아닐 시 NumberFormatException 을 발생시킨다.") + @Test + void parseInt() { + List prizeNumbers = Arrays.asList("1", "2", "String", "4", "5", "6"); + assertThatThrownBy(() -> new PrizeNumbers(prizeNumbers)) + .isInstanceOf(NumberFormatException.class) + .hasMessage("당첨 번호는 숫자만 들어올 수 있습니다."); + } + + @DisplayName("당첨 번호가 1-45 사이의 숫자가 아닐 시 IllegalArgumentException 을 발생시킨다.") + @Test + void getMatchedCount() { + List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "46"); + assertThatThrownBy(() -> new PrizeNumbers(prizeNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("당첨번호는 1부터 45까지만 있을 수 있습니다."); + } + + @DisplayName("당첨 번호에 들어있는 번호면 true, 들어있지 않는 번호면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"4,true", "7,false"}) + void has(int number, boolean expected) { + List strPrizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + PrizeNumbers prizeNumbers = new PrizeNumbers(strPrizeNumbers); + assertEquals(expected, prizeNumbers.has(number)); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/util/FixedLottoNumber.java b/src/test/java/com/javabom/lotto/util/FixedLottoNumber.java new file mode 100644 index 0000000..655e1b6 --- /dev/null +++ b/src/test/java/com/javabom/lotto/util/FixedLottoNumber.java @@ -0,0 +1,12 @@ +package com.javabom.lotto.util; + +import java.util.Arrays; +import java.util.List; + +public class FixedLottoNumber implements PickedLottoNumbers { + + @Override + public List picked() { + return Arrays.asList(1, 2, 3, 4, 5, 6); + } +} diff --git a/src/test/java/com/javabom/lotto/util/LottoFactoryTest.java b/src/test/java/com/javabom/lotto/util/LottoFactoryTest.java new file mode 100644 index 0000000..8f6378c --- /dev/null +++ b/src/test/java/com/javabom/lotto/util/LottoFactoryTest.java @@ -0,0 +1,20 @@ +package com.javabom.lotto.util; + +import com.javabom.lotto.domain.Lotto; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoFactoryTest { + + @DisplayName("로또가 입력 갯수만큼 생성되는지 확인한다.") + @Test + void createLotto() { + int expected = 3; + List actual = LottoFactory.createLotto(expected, new FixedLottoNumber()); + assertEquals(expected, actual.size()); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/util/ShuffleLottoNumbersTest.java b/src/test/java/com/javabom/lotto/util/ShuffleLottoNumbersTest.java new file mode 100644 index 0000000..8c15153 --- /dev/null +++ b/src/test/java/com/javabom/lotto/util/ShuffleLottoNumbersTest.java @@ -0,0 +1,28 @@ +package com.javabom.lotto.util; + +import com.javabom.lotto.domain.Lotto; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ShuffleLottoNumbersTest { + + @DisplayName("랜덤으로 값을 뽑았을 때 6개의 값이 잘 나오는지 확인한다.") + @Test + public void picked() { + List expected = Arrays.asList(1, 2, 3, 4, 5, 6); + List lottoBundle = LottoFactory.createLotto(1, new FixedLottoNumber()); + Lotto actual = lottoBundle.get(0); + + assertEquals(expected.get(0), actual.get(0)); + assertEquals(expected.get(1), actual.get(1)); + assertEquals(expected.get(2), actual.get(2)); + assertEquals(expected.get(3), actual.get(3)); + assertEquals(expected.get(4), actual.get(4)); + assertEquals(expected.get(5), actual.get(5)); + } +} \ No newline at end of file From 40ec65008ebfe76c8a79a5a5f818c17c6defe677 Mon Sep 17 00:00:00 2001 From: BangKiHyun Date: Wed, 27 May 2020 16:25:20 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=EC=B2=AB=20=EB=B2=88=EC=A7=B8=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 30 ++++----- .../com/javabom/lotto/domain/BonusNumber.java | 51 ---------------- .../javabom/lotto/domain/MatchedCounts.java | 17 ------ .../java/com/javabom/lotto/domain/Money.java | 39 ------------ .../javabom/lotto/domain/MyLottoBundle.java | 34 ----------- .../com/javabom/lotto/domain/PrizeCounts.java | 43 ------------- .../com/javabom/lotto/domain/PrizeMoneys.java | 17 ------ .../javabom/lotto/domain/PrizeNumbers.java | 56 ----------------- .../lotto/domain/{ => enums}/PrizeType.java | 28 ++++----- .../lotto/domain/info/BonusNumber.java | 21 +++++++ .../lotto/domain/{ => info}/Lotto.java | 8 ++- .../lotto/domain/info/LottoBundle.java | 30 +++++++++ .../lotto/domain/info/PrizeNumberInfo.java | 33 ++++++++++ .../lotto/domain/info/PrizeNumbers.java | 48 +++++++++++++++ .../lotto/domain/result/LottoResult.java | 26 ++++++++ .../domain/result/LottoResultBundle.java | 43 +++++++++++++ .../domain/shop/GenerateLottoNumbers.java | 7 +++ .../javabom/lotto/domain/shop/LottoShop.java | 38 ++++++++++++ .../lotto/domain/shop/RandomMachine.java | 15 +++++ .../shop/ShuffleLottoNumber.java} | 12 ++-- .../lotto/domain/valid/GameNumber.java | 39 ++++++++++++ .../javabom/lotto/domain/valid/Number.java | 21 +++++++ .../com/javabom/lotto/domain/vo/Money.java | 16 +++++ .../com/javabom/lotto/util/LottoFactory.java | 17 ------ .../lotto/util/PickedLottoNumbers.java | 7 --- .../com/javabom/lotto/view/InputView.java | 7 ++- .../com/javabom/lotto/view/OutputView.java | 38 +++++++----- .../javabom/lotto/domain/BonusNumberTest.java | 61 ------------------- .../com/javabom/lotto/domain/LottoTest.java | 38 ------------ .../lotto/domain/MatchedCountsTest.java | 21 ------- .../com/javabom/lotto/domain/MoneyTest.java | 44 ------------- .../lotto/domain/MyLottoBundleTest.java | 46 -------------- .../javabom/lotto/domain/PrizeMoneysTest.java | 24 -------- .../lotto/domain/info/BonusNumberTest.java | 22 +++++++ .../lotto/domain/info/LottoBundleTest.java | 36 +++++++++++ .../javabom/lotto/domain/info/LottoTest.java | 24 ++++++++ .../domain/info/PrizeNumberInfoTest.java | 41 +++++++++++++ .../domain/{ => info}/PrizeNumbersTest.java | 31 +++++----- .../domain/result/LottoResultBundleTest.java | 46 ++++++++++++++ .../lotto/domain/result/LottoResultTest.java | 18 ++++++ .../shop/FixedGenerateLottoNumber.java} | 4 +- .../lotto/domain/shop/LottoShopTest.java | 43 +++++++++++++ .../lotto/domain/shop/RandomMachineTest.java | 24 ++++++++ .../domain/shop/ShuffleLottoNumberTest.java | 24 ++++++++ .../lotto/domain/valid/GameNumberTest.java | 17 ++++++ .../lotto/domain/valid/NumberTest.java | 25 ++++++++ src/test/java/com/javabom/lotto/empty.txt | 0 .../javabom/lotto/util/LottoFactoryTest.java | 20 ------ .../lotto/util/ShuffleLottoNumbersTest.java | 28 --------- 49 files changed, 741 insertions(+), 637 deletions(-) delete mode 100644 src/main/java/com/javabom/lotto/domain/BonusNumber.java delete mode 100644 src/main/java/com/javabom/lotto/domain/MatchedCounts.java delete mode 100644 src/main/java/com/javabom/lotto/domain/Money.java delete mode 100644 src/main/java/com/javabom/lotto/domain/MyLottoBundle.java delete mode 100644 src/main/java/com/javabom/lotto/domain/PrizeCounts.java delete mode 100644 src/main/java/com/javabom/lotto/domain/PrizeMoneys.java delete mode 100644 src/main/java/com/javabom/lotto/domain/PrizeNumbers.java rename src/main/java/com/javabom/lotto/domain/{ => enums}/PrizeType.java (63%) create mode 100644 src/main/java/com/javabom/lotto/domain/info/BonusNumber.java rename src/main/java/com/javabom/lotto/domain/{ => info}/Lotto.java (65%) create mode 100644 src/main/java/com/javabom/lotto/domain/info/LottoBundle.java create mode 100644 src/main/java/com/javabom/lotto/domain/info/PrizeNumberInfo.java create mode 100644 src/main/java/com/javabom/lotto/domain/info/PrizeNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/result/LottoResult.java create mode 100644 src/main/java/com/javabom/lotto/domain/result/LottoResultBundle.java create mode 100644 src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/shop/LottoShop.java create mode 100644 src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java rename src/main/java/com/javabom/lotto/{util/ShuffleLottoNumbers.java => domain/shop/ShuffleLottoNumber.java} (58%) create mode 100644 src/main/java/com/javabom/lotto/domain/valid/GameNumber.java create mode 100644 src/main/java/com/javabom/lotto/domain/valid/Number.java create mode 100644 src/main/java/com/javabom/lotto/domain/vo/Money.java delete mode 100644 src/main/java/com/javabom/lotto/util/LottoFactory.java delete mode 100644 src/main/java/com/javabom/lotto/util/PickedLottoNumbers.java delete mode 100644 src/test/java/com/javabom/lotto/domain/BonusNumberTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/LottoTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/MatchedCountsTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/MoneyTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/MyLottoBundleTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/PrizeMoneysTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/info/BonusNumberTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/info/LottoBundleTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/info/LottoTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/info/PrizeNumberInfoTest.java rename src/test/java/com/javabom/lotto/domain/{ => info}/PrizeNumbersTest.java (52%) create mode 100644 src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/result/LottoResultTest.java rename src/test/java/com/javabom/lotto/{util/FixedLottoNumber.java => domain/shop/FixedGenerateLottoNumber.java} (58%) create mode 100644 src/test/java/com/javabom/lotto/domain/shop/LottoShopTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/shop/ShuffleLottoNumberTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/valid/GameNumberTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/valid/NumberTest.java delete mode 100644 src/test/java/com/javabom/lotto/empty.txt delete mode 100644 src/test/java/com/javabom/lotto/util/LottoFactoryTest.java delete mode 100644 src/test/java/com/javabom/lotto/util/ShuffleLottoNumbersTest.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 1a09e4e..20a37bd 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,8 +1,12 @@ package com.javabom.lotto; -import com.javabom.lotto.domain.*; -import com.javabom.lotto.util.LottoFactory; -import com.javabom.lotto.util.ShuffleLottoNumbers; +import com.javabom.lotto.domain.shop.LottoShop; +import com.javabom.lotto.domain.shop.RandomMachine; +import com.javabom.lotto.domain.shop.ShuffleLottoNumber; +import com.javabom.lotto.domain.info.LottoBundle; +import com.javabom.lotto.domain.info.PrizeNumberInfo; +import com.javabom.lotto.domain.result.LottoResultBundle; +import com.javabom.lotto.domain.vo.Money; import com.javabom.lotto.view.InputView; import com.javabom.lotto.view.OutputView; @@ -13,22 +17,18 @@ public class LottoApplication { public static void main(String[] args) { Money money = new Money(inputView.inputMoney()); - OutputView.printLottoCount(money.getLottoCount()); - MyLottoBundle myLottoBundle = new MyLottoBundle( - LottoFactory.createLotto(money.getLottoCount(), new ShuffleLottoNumbers())); - OutputView.printMyLottoBundle(myLottoBundle); + LottoShop lottoShop = new LottoShop(new RandomMachine(new ShuffleLottoNumber())); + LottoBundle lottoBundle = lottoShop.buyLotto(money); - PrizeNumbers prizeNumbers = new PrizeNumbers(inputView.inputPrizeNumbers()); - BonusNumber bonusNumber = new BonusNumber(inputView.inputBonusNumber(), prizeNumbers); + OutputView.printLottoCount(lottoShop.getLottoCount(money.get())); + OutputView.printMyLottoBundle(lottoBundle); - MatchedCounts matchedCounts = new MatchedCounts(myLottoBundle.getMatchedCounts(prizeNumbers, bonusNumber)); + PrizeNumberInfo prizeNumberInfo = new PrizeNumberInfo( + inputView.inputPrizeNumbers(), inputView.inputBonusNumber()); - PrizeCounts prizeCounts = new PrizeCounts(); - prizeCounts.compileStatisticsOfPrize(matchedCounts); + LottoResultBundle lottoResultBundle = lottoBundle.confirmLottoResult(prizeNumberInfo); - PrizeMoneys prizeMoneys = new PrizeMoneys(prizeCounts.getPrizeMoneys()); - - OutputView.printResult(prizeCounts, money.getRateOfProfit(prizeMoneys.getAmountOfPrize())); + OutputView.printResults(lottoResultBundle, money); } } diff --git a/src/main/java/com/javabom/lotto/domain/BonusNumber.java b/src/main/java/com/javabom/lotto/domain/BonusNumber.java deleted file mode 100644 index 9cbc862..0000000 --- a/src/main/java/com/javabom/lotto/domain/BonusNumber.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.javabom.lotto.domain; - -public class BonusNumber { - private int bonusNumber; - - public BonusNumber(String strBonusNumber, PrizeNumbers prizeNumbers) { - int bonusNumber = parseInt(strBonusNumber); - checkDuplicate(bonusNumber, prizeNumbers); - checkRange(bonusNumber); - this.bonusNumber = bonusNumber; - } - - private int parseInt(String strBonusNumber) { - try { - return Integer.parseInt(strBonusNumber); - } catch (NumberFormatException e) { - throw new NumberFormatException("보너스 번호는 숫자만 들어올 수 있습니다."); - } - } - - private void checkDuplicate(int bonusNumber, PrizeNumbers prizeNumbers) { - if (prizeNumbers.has(bonusNumber)) { - throw new IllegalArgumentException("보너스 번호는 이미 당첨 번호에 있는 번호입니다."); - } - } - - private void checkRange(int bonusNumber) { - if (isNotRange(bonusNumber)) { - throw new IllegalArgumentException("보너스 번호는 1부터 45까지만 있을 수 있습니다."); - } - } - - private boolean isNotRange(int bonusNumber) { - return bonusNumber < 1 || bonusNumber > 45; - } - - public boolean isValid(Lotto lotto, int matchedCount) { - if (valid(lotto, matchedCount)) { - return true; - } - return false; - } - - private boolean valid(Lotto lotto, int matchedCount) { - return lotto.has(bonusNumber) && matchedCount == 5; - } - - public int get() { - return bonusNumber; - } -} diff --git a/src/main/java/com/javabom/lotto/domain/MatchedCounts.java b/src/main/java/com/javabom/lotto/domain/MatchedCounts.java deleted file mode 100644 index 00e3de7..0000000 --- a/src/main/java/com/javabom/lotto/domain/MatchedCounts.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.javabom.lotto.domain; - -import java.util.List; - -public class MatchedCounts { - private final List matchedCounts; - - public MatchedCounts(List matchedCounts) { - this.matchedCounts = matchedCounts; - } - - public int getMatchedCount(int key){ - return (int) matchedCounts.stream() - .filter(matchedCount -> matchedCount.equals(key)) - .count(); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/Money.java b/src/main/java/com/javabom/lotto/domain/Money.java deleted file mode 100644 index 519a378..0000000 --- a/src/main/java/com/javabom/lotto/domain/Money.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.javabom.lotto.domain; - -public class Money { - private final int LOTTO_PRICE = 1000; - - private int money; - - public Money(String strMoney) { - int money = parseInt(strMoney); - checkCanBuyLotto(money); - this.money = money; - } - - private int parseInt(String money) { - try { - return Integer.parseInt(money); - } catch (NumberFormatException e) { - throw new NumberFormatException("금액은 숫자만 입력이 가능합니다."); - } - } - - private void checkCanBuyLotto(int money) { - if (money < LOTTO_PRICE) { - throw new IllegalArgumentException("돈이 부족합니다. 1000원 이상 금액을 입력해 주세요."); - } - } - - public int getLottoCount() { - return money / LOTTO_PRICE; - } - - public int getRateOfProfit(int amountOfPrize) { - int profit = amountOfPrize - money; - if (profit < 0) { - return 0; - } - return (profit / money) * 100; - } -} diff --git a/src/main/java/com/javabom/lotto/domain/MyLottoBundle.java b/src/main/java/com/javabom/lotto/domain/MyLottoBundle.java deleted file mode 100644 index b2d887f..0000000 --- a/src/main/java/com/javabom/lotto/domain/MyLottoBundle.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.javabom.lotto.domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class MyLottoBundle { - private static final int BONUS_COUNT = 45; - - private final List myLottoBundle; - - public MyLottoBundle(List myLottoBundle) { - this.myLottoBundle = myLottoBundle; - } - - private int getMatchedCount(Lotto lotto, int matchedCount, BonusNumber bonusNumber) { - if (bonusNumber.isValid(lotto, matchedCount)) { - return matchedCount + BONUS_COUNT; - } - return matchedCount; - } - - public List getMatchedCounts(PrizeNumbers prizeNumbers, BonusNumber bonusNumber) { - List matchedCounts = new ArrayList<>(); - for (Lotto lotto : myLottoBundle) { - matchedCounts.add(getMatchedCount(lotto, prizeNumbers.getMatchedCount(lotto), bonusNumber)); - } - return matchedCounts; - } - - public List getMyLottoBundle() { - return Collections.unmodifiableList(myLottoBundle); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/PrizeCounts.java b/src/main/java/com/javabom/lotto/domain/PrizeCounts.java deleted file mode 100644 index ed65d10..0000000 --- a/src/main/java/com/javabom/lotto/domain/PrizeCounts.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.javabom.lotto.domain; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class PrizeCounts { - private final Map prizeCounts = new HashMap<>(); - - public PrizeCounts() { - init(); - } - - private void init() { - prizeCounts.put(3, 0); - prizeCounts.put(4, 0); - prizeCounts.put(5, 0); - prizeCounts.put(6, 0); - prizeCounts.put(50, 0); - } - - public void compileStatisticsOfPrize(MatchedCounts matchedCounts) { - prizeCounts.replaceAll((k, v) -> matchedCounts.getMatchedCount(k)); - } - - public List getPrizeMoneys() { - List prizeMoneys = new ArrayList<>(); - for (int key : prizeCounts.keySet()) { - PrizeType prizeType = PrizeType.valueOfPrize(key); - prizeMoneys.add(prizeType.calculate(prizeCounts.get(key))); - } - return prizeMoneys; - } - - public int getPrizeCount(int idx) { - return prizeCounts.get(idx); - } - - public boolean containKey(int idx) { - return prizeCounts.containsKey(idx); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/PrizeMoneys.java b/src/main/java/com/javabom/lotto/domain/PrizeMoneys.java deleted file mode 100644 index 198fae4..0000000 --- a/src/main/java/com/javabom/lotto/domain/PrizeMoneys.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.javabom.lotto.domain; - -import java.util.List; - -public class PrizeMoneys { - private final List prizeMoneys; - - public PrizeMoneys(List prizeMoneys) { - this.prizeMoneys = prizeMoneys; - } - - public int getAmountOfPrize() { - return prizeMoneys.stream() - .mapToInt(Integer::intValue) - .sum(); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/PrizeNumbers.java b/src/main/java/com/javabom/lotto/domain/PrizeNumbers.java deleted file mode 100644 index 1386fa8..0000000 --- a/src/main/java/com/javabom/lotto/domain/PrizeNumbers.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.javabom.lotto.domain; - -import java.util.ArrayList; -import java.util.List; - -public class PrizeNumbers { - private List prizeNumbers; - - public PrizeNumbers(List strPrizeNumbers) { - checkCount(strPrizeNumbers.size()); - List prizeNumbers = new ArrayList<>(); - for (String strPrizeNumber : strPrizeNumbers) { - int prizeNumber = parseInt(strPrizeNumber); - checkRange(parseInt(strPrizeNumber)); - prizeNumbers.add(prizeNumber); - } - this.prizeNumbers = prizeNumbers; - } - - private void checkCount(int numberCount) { - if (numberCount < 6) { - throw new IllegalArgumentException("당첨 번호는 총 6개여야 합니다."); - } - } - - private int parseInt(String strPrizeNumber) { - try { - return Integer.parseInt(strPrizeNumber); - } catch (NumberFormatException e) { - throw new NumberFormatException("당첨 번호는 숫자만 들어올 수 있습니다."); - } - } - - private void checkRange(int prizeNumber) { - if (isNotRange(prizeNumber)) { - throw new IllegalArgumentException("당첨번호는 1부터 45까지만 있을 수 있습니다."); - } - } - - private boolean isNotRange(int prizeNumber) { - return prizeNumber < 1 || prizeNumber > 45; - } - - public int getMatchedCount(Lotto lotto) { - return (int) prizeNumbers.stream() - .filter(lotto::has) - .count(); - } - - public boolean has(int number) { - if (prizeNumbers.contains(number)) { - return true; - } - return false; - } -} diff --git a/src/main/java/com/javabom/lotto/domain/PrizeType.java b/src/main/java/com/javabom/lotto/domain/enums/PrizeType.java similarity index 63% rename from src/main/java/com/javabom/lotto/domain/PrizeType.java rename to src/main/java/com/javabom/lotto/domain/enums/PrizeType.java index 6540827..84ebcfe 100644 --- a/src/main/java/com/javabom/lotto/domain/PrizeType.java +++ b/src/main/java/com/javabom/lotto/domain/enums/PrizeType.java @@ -1,4 +1,4 @@ -package com.javabom.lotto.domain; +package com.javabom.lotto.domain.enums; import java.util.HashMap; import java.util.Map; @@ -6,41 +6,41 @@ public enum PrizeType { FIRST(6) { @Override - int calculate(int count) { - return 2000000000 * count; + public long getPrize() { + return 2_000_000_000; } }, SECOND(50) { @Override - int calculate(int count) { - return 30000000 * count; + public long getPrize() { + return 30_000_000; } }, THIRD(5) { @Override - int calculate(int count) { - return 15000000 * count; + public long getPrize() { + return 1_500_000; } }, FOURTH(4) { @Override - int calculate(int count) { - return 50000 * count; + public long getPrize() { + return 50_000; } }, FIFTH(3) { @Override - int calculate(int count) { - return 5000 * count; + public long getPrize() { + return 5_000; } }; - public final int prizeCount; - PrizeType(int prizeCount) { this.prizeCount = prizeCount; } + public final int prizeCount; + private static final Map BY_PRIZE = new HashMap<>(); static { @@ -53,5 +53,5 @@ public static PrizeType valueOfPrize(int prizeCount) { return BY_PRIZE.get(prizeCount); } - abstract int calculate(int count); + public abstract long getPrize(); } diff --git a/src/main/java/com/javabom/lotto/domain/info/BonusNumber.java b/src/main/java/com/javabom/lotto/domain/info/BonusNumber.java new file mode 100644 index 0000000..687dc96 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/info/BonusNumber.java @@ -0,0 +1,21 @@ +package com.javabom.lotto.domain.info; + +import com.javabom.lotto.domain.valid.GameNumber; + +public class BonusNumber { + private final int VALID_COUNT = 5; + + private GameNumber bonusNumber; + + public BonusNumber(String strBonusNumber) { + this.bonusNumber = new GameNumber(strBonusNumber); + } + + public GameNumber get() { + return bonusNumber; + } + + public boolean isValid(Lotto lotto, int matchedCount) { + return lotto.has(bonusNumber) && matchedCount == VALID_COUNT; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/Lotto.java b/src/main/java/com/javabom/lotto/domain/info/Lotto.java similarity index 65% rename from src/main/java/com/javabom/lotto/domain/Lotto.java rename to src/main/java/com/javabom/lotto/domain/info/Lotto.java index e392400..4f9a7dd 100644 --- a/src/main/java/com/javabom/lotto/domain/Lotto.java +++ b/src/main/java/com/javabom/lotto/domain/info/Lotto.java @@ -1,4 +1,6 @@ -package com.javabom.lotto.domain; +package com.javabom.lotto.domain.info; + +import com.javabom.lotto.domain.valid.GameNumber; import java.util.Collections; import java.util.List; @@ -10,8 +12,8 @@ public Lotto(List lotto) { this.lotto = lotto; } - public boolean has(int lottoNumber) { - return lotto.contains(lottoNumber); + public boolean has(GameNumber gameNumber) { + return lotto.contains(gameNumber.get()); } public int get(int idx) { diff --git a/src/main/java/com/javabom/lotto/domain/info/LottoBundle.java b/src/main/java/com/javabom/lotto/domain/info/LottoBundle.java new file mode 100644 index 0000000..b3887fb --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/info/LottoBundle.java @@ -0,0 +1,30 @@ +package com.javabom.lotto.domain.info; + +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; + +public class LottoBundle { + + private final List lottoBundle; + + public LottoBundle(List myLottoBundle) { + this.lottoBundle = myLottoBundle; + } + + public LottoResultBundle confirmLottoResult(PrizeNumberInfo prizeNumberInfo) { + List lottoResults = new ArrayList<>(); + for (Lotto lotto : lottoBundle) { + LottoResult result = prizeNumberInfo.matchLotto(lotto); + lottoResults.add(result); + } + return new LottoResultBundle(lottoResults); + } + + public List getMyLottoBundle() { + return Collections.unmodifiableList(lottoBundle); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/info/PrizeNumberInfo.java b/src/main/java/com/javabom/lotto/domain/info/PrizeNumberInfo.java new file mode 100644 index 0000000..7b7a400 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/info/PrizeNumberInfo.java @@ -0,0 +1,33 @@ +package com.javabom.lotto.domain.info; + +import com.javabom.lotto.domain.result.LottoResult; + +import java.util.List; + +public class PrizeNumberInfo { + + private final int BONUS_COUNT = 45; + + private PrizeNumbers prizeNumbers; + private BonusNumber bonusNumber; + + public PrizeNumberInfo(List prizeNumbers, String bonusNumber) { + this.prizeNumbers = new PrizeNumbers(prizeNumbers); + this.bonusNumber = new BonusNumber(bonusNumber); + checkDuplicate(); + } + + private void checkDuplicate() { + if (prizeNumbers.has(bonusNumber)) { + throw new IllegalArgumentException("입력하신 보너스 번호는 당첨 번호와 겹칩니다."); + } + } + + public LottoResult matchLotto(Lotto lotto) { + int matchedCount = prizeNumbers.getMatchedCount(lotto); + if (bonusNumber.isValid(lotto, matchedCount)) { + return new LottoResult(matchedCount + BONUS_COUNT); + } + return new LottoResult(matchedCount); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/info/PrizeNumbers.java b/src/main/java/com/javabom/lotto/domain/info/PrizeNumbers.java new file mode 100644 index 0000000..ba41b59 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/info/PrizeNumbers.java @@ -0,0 +1,48 @@ +package com.javabom.lotto.domain.info; + +import com.javabom.lotto.domain.valid.GameNumber; + +import java.util.List; +import java.util.stream.Collectors; + +public class PrizeNumbers { + + private final int PRIZE_COUNT = 6; + + private final List prizeNumbers; + + public PrizeNumbers(List strPrizeNumbers) { + checkCount(strPrizeNumbers.size()); + this.prizeNumbers = collectPrizeNumbers(strPrizeNumbers); + checkDuplicate(); + } + + private void checkCount(int numberCount) { + if (numberCount != PRIZE_COUNT) { + throw new IllegalArgumentException("당첨 번호는 총 6개여야 합니다."); + } + } + + private List collectPrizeNumbers(List strPrizeNumbers) { + return strPrizeNumbers.stream() + .distinct() + .map(GameNumber::new) + .collect(Collectors.toList()); + } + + private void checkDuplicate() { + if (prizeNumbers.size() != PRIZE_COUNT) { + throw new IllegalArgumentException("당첨 번호는 모두 달라야 합니다."); + } + } + + public int getMatchedCount(Lotto lotto) { + return (int) prizeNumbers.stream() + .filter(lotto::has) + .count(); + } + + public boolean has(BonusNumber bonusNumber) { + return prizeNumbers.contains(bonusNumber.get()); + } +} 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..a523640 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/result/LottoResult.java @@ -0,0 +1,26 @@ +package com.javabom.lotto.domain.result; + +import com.javabom.lotto.domain.enums.PrizeType; + +public class LottoResult { + + private final int FAIL = 0; + + private int lottoResult; + + public LottoResult(int lottoResult) { + this.lottoResult = lottoResult; + } + + public long getPrize() { + PrizeType prizeType = PrizeType.valueOfPrize(lottoResult); + if (prizeType != null) { + return prizeType.getPrize(); + } + return FAIL; + } + + public boolean isEquals(int matchedCount) { + return this.lottoResult == matchedCount; + } +} 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..9bc2e78 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/result/LottoResultBundle.java @@ -0,0 +1,43 @@ +package com.javabom.lotto.domain.result; + +import com.javabom.lotto.domain.vo.Money; + +import java.util.Collections; +import java.util.List; + +public class LottoResultBundle { + private final int FAIL = 0; + 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(Money money) { + int amount = money.get(); + long profit = calculatePrize() - amount; + if (profit < FAIL) { + return FAIL; + } + return (profit / amount) * PERCENT; + } + + public int getCountOfPrize(int matchedCount) { + return (int) lottoResultBundle.stream() + .filter(lottoResult -> lottoResult.isEquals(matchedCount)) + .count(); + } + + public List get() { + return Collections.unmodifiableList(lottoResultBundle); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java b/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java new file mode 100644 index 0000000..72e236a --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java @@ -0,0 +1,7 @@ +package com.javabom.lotto.domain.shop; + +import java.util.List; + +public interface GenerateLottoNumbers { + List picked(); +} 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..d9b0475 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/shop/LottoShop.java @@ -0,0 +1,38 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.info.Lotto; +import com.javabom.lotto.domain.info.LottoBundle; +import com.javabom.lotto.domain.vo.Money; + +import java.util.ArrayList; +import java.util.List; + +public class LottoShop { + + private final int LOTTO_PRICE = 1000; + + private final RandomMachine randomMachine; + + public LottoShop(RandomMachine randomMachine) { + this.randomMachine = randomMachine; + } + + public LottoBundle buyLotto(Money money) { + checkCanBuyLotto(money.get()); + List lottoBundle = new ArrayList<>(); + for (int i = 1; i <= getLottoCount(money.get()); i++) { + lottoBundle.add(randomMachine.createLotto()); + } + return new LottoBundle(lottoBundle); + } + + private void checkCanBuyLotto(int money) { + if (money < LOTTO_PRICE) { + throw new IllegalArgumentException("돈이 부족합니다. 1000원 이상 금액을 입력해 주세요."); + } + } + + public int getLottoCount(int money) { + return money / LOTTO_PRICE; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java b/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java new file mode 100644 index 0000000..af6fea6 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java @@ -0,0 +1,15 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.info.Lotto; + +public class RandomMachine { + private final GenerateLottoNumbers generateLottoNumbers; + + public RandomMachine(GenerateLottoNumbers generateLottoNumbers) { + this.generateLottoNumbers = generateLottoNumbers; + } + + public Lotto createLotto() { + return new Lotto(generateLottoNumbers.picked()); + } +} diff --git a/src/main/java/com/javabom/lotto/util/ShuffleLottoNumbers.java b/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java similarity index 58% rename from src/main/java/com/javabom/lotto/util/ShuffleLottoNumbers.java rename to src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java index 5b9eeb2..c137569 100644 --- a/src/main/java/com/javabom/lotto/util/ShuffleLottoNumbers.java +++ b/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java @@ -1,12 +1,12 @@ -package com.javabom.lotto.util; +package com.javabom.lotto.domain.shop; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -public class ShuffleLottoNumbers implements PickedLottoNumbers { - private static final List lottoNumbers = new ArrayList<>(); +public class ShuffleLottoNumber implements GenerateLottoNumbers { + private static final List LOTTO_NUMBER = new ArrayList<>(); static { init(); @@ -14,14 +14,14 @@ public class ShuffleLottoNumbers implements PickedLottoNumbers { private static void init() { for (int number = 1; number <= 45; number++) { - lottoNumbers.add(number); + LOTTO_NUMBER.add(number); } } @Override public List picked() { - Collections.shuffle(lottoNumbers); - return lottoNumbers.stream() + Collections.shuffle(LOTTO_NUMBER); + return LOTTO_NUMBER.stream() .limit(6) .collect(Collectors.toList()); } diff --git a/src/main/java/com/javabom/lotto/domain/valid/GameNumber.java b/src/main/java/com/javabom/lotto/domain/valid/GameNumber.java new file mode 100644 index 0000000..b0dd80f --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/valid/GameNumber.java @@ -0,0 +1,39 @@ +package com.javabom.lotto.domain.valid; + +import java.util.Objects; + +public class GameNumber { + private final int MIN_NUMBER = 1; + private final int MAX_NUMBER = 45; + + private int gameNumber; + + public GameNumber(String strGameNumber) { + Number number = new Number(strGameNumber); + checkRange(number.get()); + this.gameNumber = number.get(); + } + + private void checkRange(int number) { + if (number < MIN_NUMBER || number > MAX_NUMBER) { + throw new IllegalArgumentException("당첨 번호는 1-45 숫자만 가능합니다."); + } + } + + public int get() { + return gameNumber; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof GameNumber)) return false; + GameNumber that = (GameNumber) o; + return get() == that.get(); + } + + @Override + public int hashCode() { + return Objects.hash(get()); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/valid/Number.java b/src/main/java/com/javabom/lotto/domain/valid/Number.java new file mode 100644 index 0000000..c16b29b --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/valid/Number.java @@ -0,0 +1,21 @@ +package com.javabom.lotto.domain.valid; + +public class Number { + private int number; + + public Number(String number) { + this.number = parseInt(number); + } + + private int parseInt(String number) { + try { + return Integer.parseInt(number); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("숫자가 아닌 값이 들어왔습니다."); + } + } + + public int get() { + return number; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/vo/Money.java b/src/main/java/com/javabom/lotto/domain/vo/Money.java new file mode 100644 index 0000000..65f48fa --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/vo/Money.java @@ -0,0 +1,16 @@ +package com.javabom.lotto.domain.vo; + +import com.javabom.lotto.domain.valid.Number; + +public class Money { + private int money; + + public Money(String strMoney) { + Number number = new Number(strMoney); + this.money = number.get(); + } + + public int get() { + return money; + } +} diff --git a/src/main/java/com/javabom/lotto/util/LottoFactory.java b/src/main/java/com/javabom/lotto/util/LottoFactory.java deleted file mode 100644 index fb4b733..0000000 --- a/src/main/java/com/javabom/lotto/util/LottoFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.javabom.lotto.util; - -import com.javabom.lotto.domain.Lotto; - -import java.util.ArrayList; -import java.util.List; - -public class LottoFactory { - - public static List createLotto(int lottoCount, PickedLottoNumbers pikedLottoNumber) { - List lottoBundle = new ArrayList<>(); - for (int curLottoCount = 0; curLottoCount < lottoCount; curLottoCount++) { - lottoBundle.add(new Lotto(pikedLottoNumber.picked())); - } - return lottoBundle; - } -} diff --git a/src/main/java/com/javabom/lotto/util/PickedLottoNumbers.java b/src/main/java/com/javabom/lotto/util/PickedLottoNumbers.java deleted file mode 100644 index f4008d7..0000000 --- a/src/main/java/com/javabom/lotto/util/PickedLottoNumbers.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.javabom.lotto.util; - -import java.util.List; - -public interface PickedLottoNumbers { - List picked(); -} diff --git a/src/main/java/com/javabom/lotto/view/InputView.java b/src/main/java/com/javabom/lotto/view/InputView.java index 0720be9..9dec223 100644 --- a/src/main/java/com/javabom/lotto/view/InputView.java +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -7,7 +7,7 @@ public class InputView { private final String FIRST_QUESTION = "구입 금앱을 입력해 주세요."; private final String SECOUND_QUESTION = "당첨 번호를 입력해주세요."; - private final String THRID_QUESTION = "보너스 번호를 입력해주세요."; + private final String THIRD_QUESTION = "보너스 번호를 입력해주세요."; private final String DELIMITER = ", "; private final Scanner sc; @@ -31,12 +31,15 @@ public List inputPrizeNumbers() { } public String inputBonusNumber() { - System.out.println(THRID_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 index 421c5aa..d12f766 100644 --- a/src/main/java/com/javabom/lotto/view/OutputView.java +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -1,22 +1,26 @@ package com.javabom.lotto.view; -import com.javabom.lotto.domain.Lotto; -import com.javabom.lotto.domain.MyLottoBundle; -import com.javabom.lotto.domain.PrizeCounts; +import com.javabom.lotto.domain.enums.PrizeType; +import com.javabom.lotto.domain.info.Lotto; +import com.javabom.lotto.domain.info.LottoBundle; +import com.javabom.lotto.domain.result.LottoResultBundle; +import com.javabom.lotto.domain.vo.Money; -import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; public class OutputView { + private static final int BONUS_COUNT = 5; + private static final int BONUS_NUMBER = 50; + public static void printLottoCount(int lottoCount) { System.out.println(lottoCount + "개를 구매했습니다."); } - public static void printMyLottoBundle(MyLottoBundle myLottoBundle) { - List lottoBundle = myLottoBundle.getMyLottoBundle(); + public static void printMyLottoBundle(LottoBundle lottoShop) { + List lottoBundle = lottoShop.getMyLottoBundle(); for (Lotto lotto : lottoBundle) { List strLotto = getStrLotto(lotto.getLotto()); System.out.println("[" + strLotto.stream(). @@ -30,21 +34,23 @@ private static List getStrLotto(List lotto) { .collect(Collectors.toList()); } - public static void printResult(PrizeCounts prizeCounts, int rateOfProfit) { + public static void printResults(LottoResultBundle lottoResultBundle, Money money) { System.out.println("당첨 통계"); System.out.println("----------"); - List prizeMoney = Arrays.asList(5000, 50000, 15000000, 2000000000); - for (int idx = 3; idx <= 6; idx++) { - System.out.println(idx + "개 일치 :{" + prizeMoney.get(idx - 3) + "원)- " + prizeCounts.getPrizeCount(idx)); - checkBonus(prizeCounts, idx * 10); + for (int mathcedCount = 3; mathcedCount <= 6; mathcedCount++) { + printResult(lottoResultBundle, mathcedCount); } - - System.out.println("총 수익률은 " + rateOfProfit + "%입니다."); + printRateOfProfit(lottoResultBundle, money); } - private static void checkBonus(PrizeCounts prizeCounts, int idx) { - if (prizeCounts.containKey(idx)) { - System.out.println("5개 일치, 보너스 볼 일치(300000000원)- " + prizeCounts.getPrizeCount(idx)); + private static void printResult(LottoResultBundle lottoResultBundle, int mathcedCount){ + if (mathcedCount == BONUS_COUNT) { + System.out.println(mathcedCount + "개 일치(" + PrizeType.valueOfPrize(BONUS_NUMBER).getPrize() + ")- " + lottoResultBundle.getCountOfPrize(BONUS_NUMBER)); } + System.out.println(mathcedCount + "개 일치(" + PrizeType.valueOfPrize(mathcedCount).getPrize() + ")- " + lottoResultBundle.getCountOfPrize(mathcedCount)); + } + + private static void printRateOfProfit(LottoResultBundle lottoResultBundle, Money money) { + System.out.println("총 수익률은 " + lottoResultBundle.getRateOfProfit(money)+"%입니다."); } } diff --git a/src/test/java/com/javabom/lotto/domain/BonusNumberTest.java b/src/test/java/com/javabom/lotto/domain/BonusNumberTest.java deleted file mode 100644 index 73ad69e..0000000 --- a/src/test/java/com/javabom/lotto/domain/BonusNumberTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.javabom.lotto.domain; - -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.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; - -class BonusNumberTest { - - @DisplayName("보너스 번호가 숫자가 아니면 NumberFormatException 을 발생시킨다.") - @Test - void parseInt() { - PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); - assertThatThrownBy(() -> new BonusNumber("number", prizeNumbers)) - .isInstanceOf(NumberFormatException.class) - .hasMessage("보너스 번호는 숫자만 들어올 수 있습니다."); - } - - @DisplayName("보너스 번호가 당첨 번호와 겹치면 IllegalArgumentException 을 발생시킨다.") - @Test - void checkDuplicate1() { - PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); - assertThatThrownBy(() -> new BonusNumber("6", prizeNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("보너스 번호는 이미 당첨 번호에 있는 번호입니다."); - } - - @DisplayName("보너스 번호가 당첨 번호와 겹치지 않으면 오류가 나지 않는다.") - @Test - void checkDuplicate2() { - PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); - BonusNumber actual = new BonusNumber("7", prizeNumbers); - assertEquals(7, actual.get()); - - } - - @DisplayName("보너스 번호가 1-45 사이의 숫자가 아니면 IllegalArgumentException 을 발생시킨다.") - @Test - void checkRange() { - PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); - assertThatThrownBy(() -> new BonusNumber("50", prizeNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("보너스 번호는 1부터 45까지만 있을 수 있습니다."); - } - - @DisplayName("로또 번호중 보너스 번호를 갖고 있고 현재 일치하는 갯수가 5개면 true," + - " 번호를 갖고 있지 않거나 현재 일치하는 갯수가 5가 아니면 false를 반환한다.") - @ParameterizedTest - @CsvSource({"4,5,true", "7,5,false", "4,4,false", "7,4,false"}) - void isValid(String bonusNumber, int matchedCount, boolean expected) { - Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); - PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("10", "20", "30", "40", "12", "13")); - BonusNumber bonus = new BonusNumber(bonusNumber, prizeNumbers); - assertEquals(expected, bonus.isValid(lotto, matchedCount)); - } -} diff --git a/src/test/java/com/javabom/lotto/domain/LottoTest.java b/src/test/java/com/javabom/lotto/domain/LottoTest.java deleted file mode 100644 index 437f746..0000000 --- a/src/test/java/com/javabom/lotto/domain/LottoTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.javabom.lotto.domain; - -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.junit.jupiter.api.Assertions.*; - -class LottoTest { - - @DisplayName("로또번호를 갖고 있으면 true, 갖고 있지 않으면 false를 반환한다.") - @ParameterizedTest - @CsvSource({"1,true", "9,false"}) - void has(int lottoNumber, boolean expected) { - Lotto lotto = new Lotto( - Arrays.asList(1, 2, 3, 4, 5, 6)); - assertEquals(expected, lotto.has(lottoNumber)); - assertEquals(expected, lotto.has(lottoNumber)); - } - - @DisplayName("생성한 로또번호와 값이잘 들어갔는지 확인한다.") - @Test - void get() { - Lotto lotto = new Lotto( - Arrays.asList(1, 2, 3, 4, 5, 6)); - List actual = lotto.getLotto(); - assertEquals(1, actual.get(0)); - assertEquals(2, actual.get(1)); - assertEquals(3, actual.get(2)); - assertEquals(4, actual.get(3)); - assertEquals(5, actual.get(4)); - assertEquals(6, actual.get(5)); - } -} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/MatchedCountsTest.java b/src/test/java/com/javabom/lotto/domain/MatchedCountsTest.java deleted file mode 100644 index 5fb6316..0000000 --- a/src/test/java/com/javabom/lotto/domain/MatchedCountsTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.javabom.lotto.domain; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class MatchedCountsTest { - - @DisplayName("일치하는 갯수만큼 값을 찾아 반환하는지 확인한다.") - @Test - void getMatchedCount() { - MatchedCounts matchedCounts = new MatchedCounts( - Arrays.asList(3, 3, 5, 5, 3)); - assertEquals(3, matchedCounts.getMatchedCount(3)); - assertEquals(2, matchedCounts.getMatchedCount(5)); - } -} diff --git a/src/test/java/com/javabom/lotto/domain/MoneyTest.java b/src/test/java/com/javabom/lotto/domain/MoneyTest.java deleted file mode 100644 index 0238826..0000000 --- a/src/test/java/com/javabom/lotto/domain/MoneyTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.javabom.lotto.domain; - -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.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; - -class MoneyTest { - - @DisplayName("숫자가 아닌 값이 들어 왔을 시 NumberFormatException 을 발생시킨다.") - @Test - void parseInt() { - assertThatThrownBy(() -> new Money("I'm String")) - .isInstanceOf(NumberFormatException.class) - .hasMessage("금액은 숫자만 입력이 가능합니다."); - } - - @DisplayName("금액이 1000원 이상 들어오지 않았을 시 IllegalArgumentException 을 발생시킨다.") - @Test - void checkCanBuyLotto() { - assertThatThrownBy(() -> new Money("900")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("돈이 부족합니다. 1000원 이상 금액을 입력해 주세요."); - } - - @DisplayName("금액이 1000원 이상 들어왔을 때 살 수 있는 로또 갯수를 반환한다.") - @ParameterizedTest - @CsvSource({"1000,1", "14000, 14"}) - void getLottoCount(String inputValue, int expected) { - Money money = new Money(inputValue); - assertEquals(expected, money.getLottoCount()); - } - - @DisplayName("수익률을 계산한다.") - @ParameterizedTest - @CsvSource({"5000,10000,0", "20000,10000,100", "100000,10000,900"}) - void getRateOfReturn(int amountOfPrize, String strMoney, int expected) { - Money money = new Money(strMoney); - assertEquals(expected, money.getRateOfProfit(amountOfPrize)); - } -} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/MyLottoBundleTest.java b/src/test/java/com/javabom/lotto/domain/MyLottoBundleTest.java deleted file mode 100644 index e0f6e04..0000000 --- a/src/test/java/com/javabom/lotto/domain/MyLottoBundleTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.javabom.lotto.domain; - -import com.javabom.lotto.util.FixedLottoNumber; -import com.javabom.lotto.util.LottoFactory; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class MyLottoBundleTest { - - @DisplayName("나의 로또 번호와 당첨번호의 일치 갯수를 잘 반환하는지 확인한다.") - @Test - void getMatchedCounts() { - MyLottoBundle myLottoBundle = new MyLottoBundle( - LottoFactory.createLotto(2, new FixedLottoNumber())); - - PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "5", "6")); - BonusNumber bonusNumber = new BonusNumber("7", prizeNumbers); - - List actual = myLottoBundle.getMatchedCounts(prizeNumbers, bonusNumber); - - assertEquals(6, actual.get(0)); - assertEquals(6, actual.get(1)); - } - - @DisplayName("입력한 로또 값들이 잘 들어왔는지 확인한다.") - @Test - public void getMyLottoBundle() { - MyLottoBundle myLottoBundle = new MyLottoBundle( - LottoFactory.createLotto(1, new FixedLottoNumber())); - - List lottoBundle = myLottoBundle.getMyLottoBundle(); - Lotto lotto = lottoBundle.get(0); - - assertEquals(1, lotto.get(0)); - assertEquals(2, lotto.get(1)); - assertEquals(3, lotto.get(2)); - assertEquals(4, lotto.get(3)); - assertEquals(5, lotto.get(4)); - assertEquals(6, lotto.get(5)); - } -} diff --git a/src/test/java/com/javabom/lotto/domain/PrizeMoneysTest.java b/src/test/java/com/javabom/lotto/domain/PrizeMoneysTest.java deleted file mode 100644 index cb77c27..0000000 --- a/src/test/java/com/javabom/lotto/domain/PrizeMoneysTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.javabom.lotto.domain; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; - -import static org.junit.jupiter.api.Assertions.*; - -class PrizeMoneysTest { - - @DisplayName("각 로또 당첨금과 매치되는 당첨 횟수에 따라 가격이 잘 나오는지 확인한다.") - @Test - void getAmountOfPrize() { - PrizeCounts prizeCounts = new PrizeCounts(); - - MatchedCounts matchedCounts = new MatchedCounts( - Arrays.asList(3, 3, 4, 4, 1, 2)); - prizeCounts.compileStatisticsOfPrize(matchedCounts); - - PrizeMoneys prizeMoneys = new PrizeMoneys(prizeCounts.getPrizeMoneys()); - assertEquals(110000, prizeMoneys.getAmountOfPrize()); - } -} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/info/BonusNumberTest.java b/src/test/java/com/javabom/lotto/domain/info/BonusNumberTest.java new file mode 100644 index 0000000..ee29d88 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/info/BonusNumberTest.java @@ -0,0 +1,22 @@ +package com.javabom.lotto.domain.info; + +import org.junit.jupiter.api.DisplayName; +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 BonusNumberTest { + + @DisplayName("로또 번호중 보너스 번호를 갖고 있고 현재 일치하는 갯수가 5개면 true," + + " 번호를 갖고 있지 않거나 현재 일치하는 갯수가 5가 아니면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"4,5,true", "7,5,false", "4,4,false", "7,4,false"}) + void isValid(String bonusNumber, int matchedCount, boolean expected) { + Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); + BonusNumber bonus = new BonusNumber(bonusNumber); + assertThat(bonus.isValid(lotto, matchedCount)).isEqualTo(expected); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/info/LottoBundleTest.java b/src/test/java/com/javabom/lotto/domain/info/LottoBundleTest.java new file mode 100644 index 0000000..e105d54 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/info/LottoBundleTest.java @@ -0,0 +1,36 @@ +package com.javabom.lotto.domain.info; + +import com.javabom.lotto.domain.info.Lotto; +import com.javabom.lotto.domain.info.LottoBundle; +import com.javabom.lotto.domain.info.PrizeNumberInfo; +import com.javabom.lotto.domain.result.LottoResult; +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; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class LottoBundleTest { + + @DisplayName("알맞은 로또 결과를 반환하는지 확인한다.") + @Test + public void confirmLottoResult() { + Lotto lotto1 = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); + Lotto lotto2 = new Lotto(Arrays.asList(1, 3, 5, 7, 9, 11)); + + List lottoList = Arrays.asList(lotto1, lotto2); + + LottoBundle lottoBundle = new LottoBundle(lottoList); + + List prizeNumbers = Arrays.asList("1", "2", "4", "7", "9", "11"); + PrizeNumberInfo prizeNumberInfo = new PrizeNumberInfo(prizeNumbers, "30"); + + List lottoResultBundle = lottoBundle.confirmLottoResult(prizeNumberInfo).get(); + assertThat(lottoResultBundle.size()).isEqualTo(2); + assertTrue(lottoResultBundle.get(0).isEquals(3)); + assertTrue(lottoResultBundle.get(1).isEquals(4)); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/info/LottoTest.java b/src/test/java/com/javabom/lotto/domain/info/LottoTest.java new file mode 100644 index 0000000..09a6fb5 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/info/LottoTest.java @@ -0,0 +1,24 @@ +package com.javabom.lotto.domain.info; + +import com.javabom.lotto.domain.valid.GameNumber; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoTest { + + @DisplayName("로또번호를 갖고 있으면 true, 갖고 있지 않으면 false를 반환한다.") + @ParameterizedTest + @CsvSource({"1,true", "9,false"}) + void has(String lottoNumber, boolean expected) { + Lotto lotto = new Lotto( + Arrays.asList(1, 2, 3, 4, 5, 6)); + GameNumber gameNumber = new GameNumber(lottoNumber); + assertEquals(expected, lotto.has(gameNumber)); + assertEquals(expected, lotto.has(gameNumber)); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/info/PrizeNumberInfoTest.java b/src/test/java/com/javabom/lotto/domain/info/PrizeNumberInfoTest.java new file mode 100644 index 0000000..67842be --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/info/PrizeNumberInfoTest.java @@ -0,0 +1,41 @@ +package com.javabom.lotto.domain.info; + +import com.javabom.lotto.domain.info.Lotto; +import com.javabom.lotto.domain.info.PrizeNumberInfo; +import com.javabom.lotto.domain.result.LottoResult; +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.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class PrizeNumberInfoTest { + + @DisplayName("당첨 번호와 보너스 번호가 겹치면 IllegalArgumentException 을 발생시킨다") + @Test + void checkDuplicate() { + List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + String bonusNumber = "6"; + assertThatThrownBy(() -> new PrizeNumberInfo(prizeNumbers, bonusNumber)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("입력하신 보너스 번호는 당첨 번호와 겹칩니다."); + } + + @DisplayName("당첨 번호와 보너스 번호의 일치 갯수의 값을 확인한다.") + @ParameterizedTest + @CsvSource({"10,50", "20,5"}) + void matchLotto(String bonusNumber, int expected) { + List prizeNumbers = Arrays.asList("1", "3", "5", "7", "9", "11"); + PrizeNumberInfo prizeNumberInfo = new PrizeNumberInfo(prizeNumbers, bonusNumber); + + Lotto lotto = new Lotto(Arrays.asList(1, 3, 5, 7, 9, 10)); + + LottoResult lottoResult = prizeNumberInfo.matchLotto(lotto); + assertTrue(lottoResult.isEquals(expected)); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/PrizeNumbersTest.java b/src/test/java/com/javabom/lotto/domain/info/PrizeNumbersTest.java similarity index 52% rename from src/test/java/com/javabom/lotto/domain/PrizeNumbersTest.java rename to src/test/java/com/javabom/lotto/domain/info/PrizeNumbersTest.java index d71323e..4e561a7 100644 --- a/src/test/java/com/javabom/lotto/domain/PrizeNumbersTest.java +++ b/src/test/java/com/javabom/lotto/domain/info/PrizeNumbersTest.java @@ -1,4 +1,4 @@ -package com.javabom.lotto.domain; +package com.javabom.lotto.domain.info; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -8,12 +8,12 @@ import java.util.Arrays; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertEquals; class PrizeNumbersTest { - @DisplayName("당첨 번호가 6개가 아닐 시 IllegarArgumentException 을 발생시킨다.") + @DisplayName("당첨 번호가 6개가 아닐 시 IllegalArgumentException 을 발생시킨다.") @Test void checkCount() { List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5"); @@ -22,30 +22,29 @@ void checkCount() { .hasMessage("당첨 번호는 총 6개여야 합니다."); } - @DisplayName("당첨 번호가 숫자가 아닐 시 NumberFormatException 을 발생시킨다.") + @DisplayName("당첨 번호중 중복된 숫자가 있으면 IllegalArgumentException 을 발생시킨다.") @Test - void parseInt() { - List prizeNumbers = Arrays.asList("1", "2", "String", "4", "5", "6"); - assertThatThrownBy(() -> new PrizeNumbers(prizeNumbers)) - .isInstanceOf(NumberFormatException.class) - .hasMessage("당첨 번호는 숫자만 들어올 수 있습니다."); + void checkDuplicate() { + assertThatThrownBy(() -> new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "4", "5"))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("당첨 번호는 모두 달라야 합니다."); } - @DisplayName("당첨 번호가 1-45 사이의 숫자가 아닐 시 IllegalArgumentException 을 발생시킨다.") + @DisplayName("당첨 번호와 로또 번호의 일치 갯수의 값을 반환한다.") @Test void getMatchedCount() { - List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "46"); - assertThatThrownBy(() -> new PrizeNumbers(prizeNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("당첨번호는 1부터 45까지만 있을 수 있습니다."); + PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "3", "5", "7", "9", "11")); + Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); + assertThat(prizeNumbers.getMatchedCount(lotto)).isEqualTo(3); } @DisplayName("당첨 번호에 들어있는 번호면 true, 들어있지 않는 번호면 false를 반환한다.") @ParameterizedTest @CsvSource({"4,true", "7,false"}) - void has(int number, boolean expected) { + void has(String number, boolean expected) { List strPrizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); PrizeNumbers prizeNumbers = new PrizeNumbers(strPrizeNumbers); - assertEquals(expected, prizeNumbers.has(number)); + BonusNumber bonusNumber = new BonusNumber(number); + assertThat(prizeNumbers.has(bonusNumber)).isEqualTo(expected); } } \ No newline at end of file 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..c66d009 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java @@ -0,0 +1,46 @@ +package com.javabom.lotto.domain.result; + +import com.javabom.lotto.domain.result.LottoResult; +import com.javabom.lotto.domain.result.LottoResultBundle; +import com.javabom.lotto.domain.vo.Money; +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( + new LottoResult(4), new LottoResult(3), new LottoResult(3), new LottoResult(1), new LottoResult(1), new LottoResult(1))); + + assertThat(lottoResultBundle.calculatePrize()).isEqualTo(60000); + } + + @DisplayName("수익률을 계산한다.") + @ParameterizedTest + @CsvSource({"100000,0", "10000,500"}) + void getRateOfReturn(String strMoney, int expected) { + LottoResultBundle lottoResultBundle = new LottoResultBundle(Arrays.asList( + new LottoResult(4), new LottoResult(3), new LottoResult(3), new LottoResult(1), new LottoResult(1), new LottoResult(1))); + Money money = new Money(strMoney); + + assertThat(lottoResultBundle.getRateOfProfit(money)).isEqualTo(expected); + } + + @DisplayName("로또 결과에 대한 일치 갯수를 확인한다.") + @Test + void getCountOfPrize() { + LottoResultBundle lottoResultBundle = new LottoResultBundle(Arrays.asList( + new LottoResult(4), new LottoResult(3), new LottoResult(3), new LottoResult(1), new LottoResult(1), new LottoResult(1))); + + assertThat(lottoResultBundle.getCountOfPrize(3)).isEqualTo(2); + assertThat(lottoResultBundle.getCountOfPrize(4)).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..214ac58 --- /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({"1,0", "3,5000", "4,50000", "5,1500000", "50,30000000", "6, 2000000000"}) + void getPrize(int actual, long expected) { + LottoResult lottoResult = new LottoResult(actual); + assertThat(lottoResult.getPrize()).isEqualTo(expected); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/util/FixedLottoNumber.java b/src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java similarity index 58% rename from src/test/java/com/javabom/lotto/util/FixedLottoNumber.java rename to src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java index 655e1b6..d684090 100644 --- a/src/test/java/com/javabom/lotto/util/FixedLottoNumber.java +++ b/src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java @@ -1,9 +1,9 @@ -package com.javabom.lotto.util; +package com.javabom.lotto.domain.shop; import java.util.Arrays; import java.util.List; -public class FixedLottoNumber implements PickedLottoNumbers { +public class FixedGenerateLottoNumber implements GenerateLottoNumbers { @Override public List picked() { 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..9a76785 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/LottoShopTest.java @@ -0,0 +1,43 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.info.LottoBundle; +import com.javabom.lotto.domain.vo.Money; +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.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LottoShopTest { + + @DisplayName("로또를 구입했을 때 구입 금액에 맞는 로또 크기를 반환하는지 확인한다.") + @ParameterizedTest + @CsvSource({"2000,2", "10000,10"}) + void buyLotto(String strMoney, int expected) { + LottoShop lottoShop = new LottoShop(new RandomMachine(new FixedGenerateLottoNumber())); + Money money = new Money(strMoney); + LottoBundle lottoBundle = lottoShop.buyLotto(money); + assertThat(lottoBundle.getMyLottoBundle().size()).isEqualTo(expected); + } + + @DisplayName("금액이 1000원 이상 들어오지 않았을 시 IllegalArgumentException 을 발생시킨다.") + @Test + void checkCanBuyLotto() { + LottoShop lottoShop = new LottoShop(new RandomMachine(new FixedGenerateLottoNumber())); + Money money = new Money("900"); + assertThatThrownBy(() -> lottoShop.buyLotto(money)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("돈이 부족합니다. 1000원 이상 금액을 입력해 주세요."); + } + + @DisplayName("금액이 1000원 이상 들어왔을 때 살 수 있는 로또 갯수를 반환한다.") + @ParameterizedTest + @CsvSource({"1000,1", "14000, 14"}) + void getLottoCount(String strMoney, int expected) { + LottoShop lottoShop = new LottoShop(new RandomMachine(new FixedGenerateLottoNumber())); + Money money = new Money(strMoney); + assertThat(lottoShop.getLottoCount(money.get())).isEqualTo(expected); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java b/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java new file mode 100644 index 0000000..146129d --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java @@ -0,0 +1,24 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.info.Lotto; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class RandomMachineTest { + + @DisplayName("랜덤한 값으로 로또 번호가 당첨되는지 확인한다.") + @Test + void createLotto() { + RandomMachine randomMachine = new RandomMachine(new FixedGenerateLottoNumber()); + Lotto actual = randomMachine.createLotto(); + + assertThat(actual.get(0)).isEqualTo(1); + assertThat(actual.get(1)).isEqualTo(2); + assertThat(actual.get(2)).isEqualTo(3); + assertThat(actual.get(3)).isEqualTo(4); + assertThat(actual.get(4)).isEqualTo(5); + assertThat(actual.get(5)).isEqualTo(6); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/shop/ShuffleLottoNumberTest.java b/src/test/java/com/javabom/lotto/domain/shop/ShuffleLottoNumberTest.java new file mode 100644 index 0000000..0cc1471 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/ShuffleLottoNumberTest.java @@ -0,0 +1,24 @@ +package com.javabom.lotto.domain.shop; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class ShuffleLottoNumberTest { + + @DisplayName("랜덤으로 값을 뽑았을 때 6개의 값이 잘 나오는지 확인한다.") + @Test + public void picked() { + FixedGenerateLottoNumber fixedLottoNumber = new FixedGenerateLottoNumber(); + List actual = fixedLottoNumber.picked(); + assertThat(actual.get(0)).isEqualTo(1); + assertThat(actual.get(1)).isEqualTo(2); + assertThat(actual.get(2)).isEqualTo(3); + assertThat(actual.get(3)).isEqualTo(4); + assertThat(actual.get(4)).isEqualTo(5); + assertThat(actual.get(5)).isEqualTo(6); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/valid/GameNumberTest.java b/src/test/java/com/javabom/lotto/domain/valid/GameNumberTest.java new file mode 100644 index 0000000..9a5348c --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/valid/GameNumberTest.java @@ -0,0 +1,17 @@ +package com.javabom.lotto.domain.valid; + +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() { + assertThatThrownBy(() -> new GameNumber("50")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("당첨 번호는 1-45 숫자만 가능합니다."); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/valid/NumberTest.java b/src/test/java/com/javabom/lotto/domain/valid/NumberTest.java new file mode 100644 index 0000000..5af8f07 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/valid/NumberTest.java @@ -0,0 +1,25 @@ +package com.javabom.lotto.domain.valid; + +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; + +class NumberTest { + + @DisplayName("들어온 번호가 숫자가 아닐시 NumberFormatException 을 발생시킨다.") + @Test + void parseInt1() { + assertThatThrownBy(() -> new Number("String")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("숫자가 아닌 값이 들어왔습니다."); + } + + @DisplayName("들어온 번호가 숫자면 오류가 나지 않는다.") + @Test + void parseInt2() { + Number number = new Number("10"); + assertThat(number.get()).isEqualTo(10); + } +} \ No newline at end of file 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 diff --git a/src/test/java/com/javabom/lotto/util/LottoFactoryTest.java b/src/test/java/com/javabom/lotto/util/LottoFactoryTest.java deleted file mode 100644 index 8f6378c..0000000 --- a/src/test/java/com/javabom/lotto/util/LottoFactoryTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.javabom.lotto.util; - -import com.javabom.lotto.domain.Lotto; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class LottoFactoryTest { - - @DisplayName("로또가 입력 갯수만큼 생성되는지 확인한다.") - @Test - void createLotto() { - int expected = 3; - List actual = LottoFactory.createLotto(expected, new FixedLottoNumber()); - assertEquals(expected, actual.size()); - } -} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/util/ShuffleLottoNumbersTest.java b/src/test/java/com/javabom/lotto/util/ShuffleLottoNumbersTest.java deleted file mode 100644 index 8c15153..0000000 --- a/src/test/java/com/javabom/lotto/util/ShuffleLottoNumbersTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.javabom.lotto.util; - -import com.javabom.lotto.domain.Lotto; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class ShuffleLottoNumbersTest { - - @DisplayName("랜덤으로 값을 뽑았을 때 6개의 값이 잘 나오는지 확인한다.") - @Test - public void picked() { - List expected = Arrays.asList(1, 2, 3, 4, 5, 6); - List lottoBundle = LottoFactory.createLotto(1, new FixedLottoNumber()); - Lotto actual = lottoBundle.get(0); - - assertEquals(expected.get(0), actual.get(0)); - assertEquals(expected.get(1), actual.get(1)); - assertEquals(expected.get(2), actual.get(2)); - assertEquals(expected.get(3), actual.get(3)); - assertEquals(expected.get(4), actual.get(4)); - assertEquals(expected.get(5), actual.get(5)); - } -} \ No newline at end of file From 5e8c6cd92467ed1f15a3f60e1adbfca8bde05a92 Mon Sep 17 00:00:00 2001 From: BangKiHyun Date: Wed, 27 May 2020 17:23:17 +0900 Subject: [PATCH 3/7] =?UTF-8?q?RandomMachine=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=A1=9C=EB=98=90=20=EB=B2=88=ED=98=B8?= =?UTF-8?q?=EB=A5=BC=20=EB=BD=91=EA=B2=8C=20=EC=88=98=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20RandomMachineTest=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/shop/GenerateLottoNumbers.java | 2 +- .../lotto/domain/shop/RandomMachine.java | 12 +++++++++- .../lotto/domain/shop/ShuffleLottoNumber.java | 7 ++---- .../domain/shop/FixedGenerateLottoNumber.java | 2 +- .../lotto/domain/shop/RandomMachineTest.java | 20 ++++++++++++++-- .../domain/shop/ShuffleLottoNumberTest.java | 24 ------------------- 6 files changed, 33 insertions(+), 34 deletions(-) delete mode 100644 src/test/java/com/javabom/lotto/domain/shop/ShuffleLottoNumberTest.java diff --git a/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java b/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java index 72e236a..a97dc79 100644 --- a/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java +++ b/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java @@ -3,5 +3,5 @@ import java.util.List; public interface GenerateLottoNumbers { - List picked(); + List generate(); } diff --git a/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java b/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java index af6fea6..bdb9303 100644 --- a/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java +++ b/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java @@ -2,6 +2,9 @@ import com.javabom.lotto.domain.info.Lotto; +import java.util.List; +import java.util.stream.Collectors; + public class RandomMachine { private final GenerateLottoNumbers generateLottoNumbers; @@ -10,6 +13,13 @@ public RandomMachine(GenerateLottoNumbers generateLottoNumbers) { } public Lotto createLotto() { - return new Lotto(generateLottoNumbers.picked()); + List lottoNumbers = generateLottoNumbers.generate(); + return new Lotto(picked(lottoNumbers)); + } + + private List picked(List lottoNumbers) { + return lottoNumbers.stream() + .limit(6) + .collect(Collectors.toList()); } } diff --git a/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java b/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java index c137569..3de3efc 100644 --- a/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java +++ b/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; public class ShuffleLottoNumber implements GenerateLottoNumbers { private static final List LOTTO_NUMBER = new ArrayList<>(); @@ -19,10 +18,8 @@ private static void init() { } @Override - public List picked() { + public List generate() { Collections.shuffle(LOTTO_NUMBER); - return LOTTO_NUMBER.stream() - .limit(6) - .collect(Collectors.toList()); + return Collections.unmodifiableList(LOTTO_NUMBER); } } diff --git a/src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java b/src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java index d684090..6fdbd43 100644 --- a/src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java +++ b/src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java @@ -6,7 +6,7 @@ public class FixedGenerateLottoNumber implements GenerateLottoNumbers { @Override - public List picked() { + public List generate() { return Arrays.asList(1, 2, 3, 4, 5, 6); } } diff --git a/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java b/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java index 146129d..87dcea8 100644 --- a/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java +++ b/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java @@ -5,10 +5,13 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; class RandomMachineTest { + private final int MIN = 1; + private final int MAX = 45; - @DisplayName("랜덤한 값으로 로또 번호가 당첨되는지 확인한다.") + @DisplayName("생성된 번호에 대한 값을 반환하는지 확인한다.") @Test void createLotto() { RandomMachine randomMachine = new RandomMachine(new FixedGenerateLottoNumber()); @@ -21,4 +24,17 @@ void createLotto() { assertThat(actual.get(4)).isEqualTo(5); assertThat(actual.get(5)).isEqualTo(6); } -} \ No newline at end of file + + @DisplayName("랜덤한 값으로 들어온 로또 번호가 1-45 사이인지 확인한다.") + @Test + void picked() { + RandomMachine randomMachine = new RandomMachine(new ShuffleLottoNumber()); + Lotto actual = randomMachine.createLotto(); + assertTrue(actual.get(0) >= MIN && actual.get(0) <= MAX); + assertTrue(actual.get(1) >= MIN && actual.get(1) <= MAX); + assertTrue(actual.get(2) >= MIN && actual.get(2) <= MAX); + assertTrue(actual.get(3) >= MIN && actual.get(3) <= MAX); + assertTrue(actual.get(4) >= MIN && actual.get(4) <= MAX); + assertTrue(actual.get(5) >= MIN && actual.get(5) <= MAX); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/shop/ShuffleLottoNumberTest.java b/src/test/java/com/javabom/lotto/domain/shop/ShuffleLottoNumberTest.java deleted file mode 100644 index 0cc1471..0000000 --- a/src/test/java/com/javabom/lotto/domain/shop/ShuffleLottoNumberTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.javabom.lotto.domain.shop; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -class ShuffleLottoNumberTest { - - @DisplayName("랜덤으로 값을 뽑았을 때 6개의 값이 잘 나오는지 확인한다.") - @Test - public void picked() { - FixedGenerateLottoNumber fixedLottoNumber = new FixedGenerateLottoNumber(); - List actual = fixedLottoNumber.picked(); - assertThat(actual.get(0)).isEqualTo(1); - assertThat(actual.get(1)).isEqualTo(2); - assertThat(actual.get(2)).isEqualTo(3); - assertThat(actual.get(3)).isEqualTo(4); - assertThat(actual.get(4)).isEqualTo(5); - assertThat(actual.get(5)).isEqualTo(6); - } -} \ No newline at end of file From a13166539b5dd7d0138bb3d95cbd17a8ee435350 Mon Sep 17 00:00:00 2001 From: BangKiHyun Date: Thu, 11 Jun 2020 18:42:26 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20=EB=B0=8F=20=EB=A1=9C=EB=98=90=20=ED=8B=B0=EC=BC=93?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=EC=99=80=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EC=9D=98=20=EC=88=9C=EC=84=9C=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EC=9D=BC=EC=B9=98=ED=95=B4=EC=95=BC=20=EA=B0=AF=EC=88=98=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 30 +++--- .../com/javabom/lotto/domain/Customer.java | 74 +++++++++++++ .../javabom/lotto/domain/enums/PrizeType.java | 57 ---------- .../lotto/domain/info/BonusNumber.java | 21 ---- .../com/javabom/lotto/domain/info/Lotto.java | 26 ----- .../lotto/domain/info/LottoBundle.java | 30 ------ .../lotto/domain/info/PrizeNumberInfo.java | 33 ------ .../lotto/domain/info/PrizeNumbers.java | 48 --------- .../lotto/domain/number/GameNumber.java | 61 +++++++++++ .../lotto/domain/number/PrizeNumbers.java | 25 +++++ .../domain/number/PrizeNumbersBundle.java | 30 ++++++ .../lotto/domain/result/LottoResult.java | 50 ++++++--- .../domain/result/LottoResultBundle.java | 20 ++-- .../domain/shop/AutoLottoNumberGenerator.java | 22 ++++ .../domain/shop/GenerateLottoNumbers.java | 7 -- .../lotto/domain/shop/LottoMachine.java | 34 ++++++ .../domain/shop/LottoNumbersGenerator.java | 9 ++ .../javabom/lotto/domain/shop/LottoShop.java | 38 +++---- .../lotto/domain/shop/RandomMachine.java | 25 ----- .../lotto/domain/shop/ShuffleLottoNumber.java | 25 ----- .../lotto/domain/ticket/LottoTicket.java | 53 +++++++++ .../domain/ticket/LottoTicketBundle.java | 35 ++++++ .../domain/utils/GameNumberConverter.java | 32 ++++++ .../lotto/domain/valid/GameNumber.java | 39 ------- .../javabom/lotto/domain/valid/Number.java | 21 ---- .../com/javabom/lotto/domain/vo/Money.java | 16 --- .../com/javabom/lotto/view/InputView.java | 33 ++++-- .../com/javabom/lotto/view/OutputView.java | 48 ++++----- .../javabom/lotto/domain/CustomerTest.java | 101 ++++++++++++++++++ .../lotto/domain/info/BonusNumberTest.java | 22 ---- .../lotto/domain/info/LottoBundleTest.java | 36 ------- .../javabom/lotto/domain/info/LottoTest.java | 24 ----- .../lotto/domain/info/PrizeNumbersTest.java | 50 --------- .../{valid => number}/GameNumberTest.java | 7 +- .../PrizeNumbersBundleTest.java} | 25 ++--- .../lotto/domain/number/PrizeNumbersTest.java | 23 ++++ .../domain/result/LottoResultBundleTest.java | 19 ++-- .../lotto/domain/result/LottoResultTest.java | 8 +- .../domain/shop/FIxedNumberGenerator.java | 17 +++ .../domain/shop/FixedGenerateLottoNumber.java | 12 --- .../lotto/domain/shop/LottoMachineTest.java | 52 +++++++++ .../lotto/domain/shop/LottoShopTest.java | 43 -------- .../lotto/domain/shop/RandomMachineTest.java | 40 ------- .../domain/ticket/LottoTicketBundleTest.java | 36 +++++++ .../lotto/domain/ticket/LottoTicketTest.java | 56 ++++++++++ .../lotto/domain/valid/NumberTest.java | 25 ----- 46 files changed, 808 insertions(+), 730 deletions(-) create mode 100644 src/main/java/com/javabom/lotto/domain/Customer.java delete mode 100644 src/main/java/com/javabom/lotto/domain/enums/PrizeType.java delete mode 100644 src/main/java/com/javabom/lotto/domain/info/BonusNumber.java delete mode 100644 src/main/java/com/javabom/lotto/domain/info/Lotto.java delete mode 100644 src/main/java/com/javabom/lotto/domain/info/LottoBundle.java delete mode 100644 src/main/java/com/javabom/lotto/domain/info/PrizeNumberInfo.java delete mode 100644 src/main/java/com/javabom/lotto/domain/info/PrizeNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/number/GameNumber.java create mode 100644 src/main/java/com/javabom/lotto/domain/number/PrizeNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/number/PrizeNumbersBundle.java create mode 100644 src/main/java/com/javabom/lotto/domain/shop/AutoLottoNumberGenerator.java delete mode 100644 src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/shop/LottoMachine.java create mode 100644 src/main/java/com/javabom/lotto/domain/shop/LottoNumbersGenerator.java delete mode 100644 src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java delete mode 100644 src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoTicketBundle.java create mode 100644 src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java delete mode 100644 src/main/java/com/javabom/lotto/domain/valid/GameNumber.java delete mode 100644 src/main/java/com/javabom/lotto/domain/valid/Number.java delete mode 100644 src/main/java/com/javabom/lotto/domain/vo/Money.java create mode 100644 src/test/java/com/javabom/lotto/domain/CustomerTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/info/BonusNumberTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/info/LottoBundleTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/info/LottoTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/info/PrizeNumbersTest.java rename src/test/java/com/javabom/lotto/domain/{valid => number}/GameNumberTest.java (62%) rename src/test/java/com/javabom/lotto/domain/{info/PrizeNumberInfoTest.java => number/PrizeNumbersBundleTest.java} (54%) create mode 100644 src/test/java/com/javabom/lotto/domain/number/PrizeNumbersTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/shop/FIxedNumberGenerator.java delete mode 100644 src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java create mode 100644 src/test/java/com/javabom/lotto/domain/shop/LottoMachineTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/shop/LottoShopTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/LottoTicketBundleTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/valid/NumberTest.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 20a37bd..b72b24a 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,34 +1,38 @@ 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.RandomMachine; -import com.javabom.lotto.domain.shop.ShuffleLottoNumber; -import com.javabom.lotto.domain.info.LottoBundle; -import com.javabom.lotto.domain.info.PrizeNumberInfo; +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.vo.Money; 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) { - Money money = new Money(inputView.inputMoney()); - LottoShop lottoShop = new LottoShop(new RandomMachine(new ShuffleLottoNumber())); - LottoBundle lottoBundle = lottoShop.buyLotto(money); + int amount = inputView.inputMoney(); + int manualLottoTicketCount = inputView.inputManualLottoTicketCount(); + List> manualLottoNumbers = inputView.inputManualLottoNumbers(manualLottoTicketCount); + Customer customer = new Customer(amount, manualLottoNumbers); - OutputView.printLottoCount(lottoShop.getLottoCount(money.get())); - OutputView.printMyLottoBundle(lottoBundle); + LottoShop lottoShop = new LottoShop(new LottoMachine(new AutoLottoNumberGenerator())); + lottoShop.enter(customer); - PrizeNumberInfo prizeNumberInfo = new PrizeNumberInfo( + OutputView.printLottoCount(manualLottoNumbers.size(), customer.getAutoLottoTicketCount()); + OutputView.printLottoBundle(customer.getLottoTicketBundle()); + + PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle( inputView.inputPrizeNumbers(), inputView.inputBonusNumber()); - LottoResultBundle lottoResultBundle = lottoBundle.confirmLottoResult(prizeNumberInfo); + LottoResultBundle lottoResultBundle = customer.confirmLottoResult(prizeNumberBundle); - OutputView.printResults(lottoResultBundle, money); + 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..ecba4a9 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/Customer.java @@ -0,0 +1,74 @@ +package com.javabom.lotto.domain; + +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.ticket.LottoTicketBundle; +import com.javabom.lotto.domain.number.PrizeNumbersBundle; +import com.javabom.lotto.domain.result.LottoResultBundle; +import com.javabom.lotto.domain.number.GameNumber; +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; + private LottoTicketBundle lottoTicketBundle; + + public Customer(int amount, List> strManualLottoNumbers) { + checkPositive(amount); + checkBuyManualLottoTicket(amount, strManualLottoNumbers.size()); + this.amount = amount; + this.manualLottoNumbers = collet(strManualLottoNumbers); + this.lottoTicketBundle = null; + } + + 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) { + manualLottoNumbers.add(GameNumberConverter.convert(eachManualLottoNumbers)); + } + return manualLottoNumbers; + } + + public List> getManualLottoNumbers() { + return Collections.unmodifiableList(manualLottoNumbers); + } + + public int getAutoLottoTicketCount() { + int curAmount = amount - (manualLottoNumbers.size() * LottoTicket.PRICE); + if (curAmount < LottoTicket.PRICE) { + return 0; + } + return curAmount / LottoTicket.PRICE; + } + + public void buy(List lottoTickets) { + if (lottoTicketBundle != null) { + lottoTicketBundle.addLottoTickets(lottoTickets); + } + lottoTicketBundle = new LottoTicketBundle(lottoTickets); + } + + public LottoTicketBundle getLottoTicketBundle() { + return new LottoTicketBundle(lottoTicketBundle.get()); + } + + public LottoResultBundle confirmLottoResult(PrizeNumbersBundle prizeNumberBundle) { + return lottoTicketBundle.match(prizeNumberBundle); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/enums/PrizeType.java b/src/main/java/com/javabom/lotto/domain/enums/PrizeType.java deleted file mode 100644 index 84ebcfe..0000000 --- a/src/main/java/com/javabom/lotto/domain/enums/PrizeType.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.javabom.lotto.domain.enums; - -import java.util.HashMap; -import java.util.Map; - -public enum PrizeType { - FIRST(6) { - @Override - public long getPrize() { - return 2_000_000_000; - } - }, - SECOND(50) { - @Override - public long getPrize() { - return 30_000_000; - } - }, - THIRD(5) { - @Override - public long getPrize() { - return 1_500_000; - } - }, - FOURTH(4) { - @Override - public long getPrize() { - return 50_000; - } - }, - FIFTH(3) { - @Override - public long getPrize() { - return 5_000; - } - }; - - PrizeType(int prizeCount) { - this.prizeCount = prizeCount; - } - - public final int prizeCount; - - private static final Map BY_PRIZE = new HashMap<>(); - - static { - for (PrizeType type : values()) { - BY_PRIZE.put(type.prizeCount, type); - } - } - - public static PrizeType valueOfPrize(int prizeCount) { - return BY_PRIZE.get(prizeCount); - } - - public abstract long getPrize(); -} diff --git a/src/main/java/com/javabom/lotto/domain/info/BonusNumber.java b/src/main/java/com/javabom/lotto/domain/info/BonusNumber.java deleted file mode 100644 index 687dc96..0000000 --- a/src/main/java/com/javabom/lotto/domain/info/BonusNumber.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.javabom.lotto.domain.info; - -import com.javabom.lotto.domain.valid.GameNumber; - -public class BonusNumber { - private final int VALID_COUNT = 5; - - private GameNumber bonusNumber; - - public BonusNumber(String strBonusNumber) { - this.bonusNumber = new GameNumber(strBonusNumber); - } - - public GameNumber get() { - return bonusNumber; - } - - public boolean isValid(Lotto lotto, int matchedCount) { - return lotto.has(bonusNumber) && matchedCount == VALID_COUNT; - } -} diff --git a/src/main/java/com/javabom/lotto/domain/info/Lotto.java b/src/main/java/com/javabom/lotto/domain/info/Lotto.java deleted file mode 100644 index 4f9a7dd..0000000 --- a/src/main/java/com/javabom/lotto/domain/info/Lotto.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.javabom.lotto.domain.info; - -import com.javabom.lotto.domain.valid.GameNumber; - -import java.util.Collections; -import java.util.List; - -public class Lotto { - private List lotto; - - public Lotto(List lotto) { - this.lotto = lotto; - } - - public boolean has(GameNumber gameNumber) { - return lotto.contains(gameNumber.get()); - } - - public int get(int idx) { - return lotto.get(idx); - } - - public List getLotto() { - return Collections.unmodifiableList(lotto); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/info/LottoBundle.java b/src/main/java/com/javabom/lotto/domain/info/LottoBundle.java deleted file mode 100644 index b3887fb..0000000 --- a/src/main/java/com/javabom/lotto/domain/info/LottoBundle.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.javabom.lotto.domain.info; - -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; - -public class LottoBundle { - - private final List lottoBundle; - - public LottoBundle(List myLottoBundle) { - this.lottoBundle = myLottoBundle; - } - - public LottoResultBundle confirmLottoResult(PrizeNumberInfo prizeNumberInfo) { - List lottoResults = new ArrayList<>(); - for (Lotto lotto : lottoBundle) { - LottoResult result = prizeNumberInfo.matchLotto(lotto); - lottoResults.add(result); - } - return new LottoResultBundle(lottoResults); - } - - public List getMyLottoBundle() { - return Collections.unmodifiableList(lottoBundle); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/info/PrizeNumberInfo.java b/src/main/java/com/javabom/lotto/domain/info/PrizeNumberInfo.java deleted file mode 100644 index 7b7a400..0000000 --- a/src/main/java/com/javabom/lotto/domain/info/PrizeNumberInfo.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.javabom.lotto.domain.info; - -import com.javabom.lotto.domain.result.LottoResult; - -import java.util.List; - -public class PrizeNumberInfo { - - private final int BONUS_COUNT = 45; - - private PrizeNumbers prizeNumbers; - private BonusNumber bonusNumber; - - public PrizeNumberInfo(List prizeNumbers, String bonusNumber) { - this.prizeNumbers = new PrizeNumbers(prizeNumbers); - this.bonusNumber = new BonusNumber(bonusNumber); - checkDuplicate(); - } - - private void checkDuplicate() { - if (prizeNumbers.has(bonusNumber)) { - throw new IllegalArgumentException("입력하신 보너스 번호는 당첨 번호와 겹칩니다."); - } - } - - public LottoResult matchLotto(Lotto lotto) { - int matchedCount = prizeNumbers.getMatchedCount(lotto); - if (bonusNumber.isValid(lotto, matchedCount)) { - return new LottoResult(matchedCount + BONUS_COUNT); - } - return new LottoResult(matchedCount); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/info/PrizeNumbers.java b/src/main/java/com/javabom/lotto/domain/info/PrizeNumbers.java deleted file mode 100644 index ba41b59..0000000 --- a/src/main/java/com/javabom/lotto/domain/info/PrizeNumbers.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.javabom.lotto.domain.info; - -import com.javabom.lotto.domain.valid.GameNumber; - -import java.util.List; -import java.util.stream.Collectors; - -public class PrizeNumbers { - - private final int PRIZE_COUNT = 6; - - private final List prizeNumbers; - - public PrizeNumbers(List strPrizeNumbers) { - checkCount(strPrizeNumbers.size()); - this.prizeNumbers = collectPrizeNumbers(strPrizeNumbers); - checkDuplicate(); - } - - private void checkCount(int numberCount) { - if (numberCount != PRIZE_COUNT) { - throw new IllegalArgumentException("당첨 번호는 총 6개여야 합니다."); - } - } - - private List collectPrizeNumbers(List strPrizeNumbers) { - return strPrizeNumbers.stream() - .distinct() - .map(GameNumber::new) - .collect(Collectors.toList()); - } - - private void checkDuplicate() { - if (prizeNumbers.size() != PRIZE_COUNT) { - throw new IllegalArgumentException("당첨 번호는 모두 달라야 합니다."); - } - } - - public int getMatchedCount(Lotto lotto) { - return (int) prizeNumbers.stream() - .filter(lotto::has) - .count(); - } - - public boolean has(BonusNumber bonusNumber) { - return prizeNumbers.contains(bonusNumber.get()); - } -} 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..1919623 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/number/GameNumber.java @@ -0,0 +1,61 @@ +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; + public static final int COUNT = 6; + + 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/PrizeNumbers.java b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbers.java new file mode 100644 index 0000000..c33f62c --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbers.java @@ -0,0 +1,25 @@ +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 = GameNumberConverter.convert(strPrizeNumbers); + } + + public boolean contains(GameNumber bonusNumber) { + return prizeNumbers.contains(bonusNumber); + } + + public void compareTo(LottoTicket lottoTicket) { + for (int idx = 0; idx < GameNumber.COUNT; idx++) { + lottoTicket.match(prizeNumbers.get(idx), idx); + } + } +} 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..f7eff70 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbersBundle.java @@ -0,0 +1,30 @@ +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 final PrizeNumbers prizeNumbers; + private final GameNumber bonusNumber; + + public PrizeNumbersBundle(List prizeNumbers, String bonusNumber) { + this.prizeNumbers = new PrizeNumbers(prizeNumbers); + this.bonusNumber = GameNumber.valueOf(bonusNumber); + checkDuplicate(); + } + + private void checkDuplicate() { + if (prizeNumbers.contains(bonusNumber)) { + throw new IllegalArgumentException("입력하신 보너스 번호는 당첨 번호와 겹칩니다."); + } + } + + public LottoResult searchResult(LottoTicket lottoTicket) { + prizeNumbers.compareTo(lottoTicket); + boolean bonusStatus = lottoTicket.contains(bonusNumber); + return LottoResult.findLottoResult(lottoTicket.getMatchedCount(), 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 index a523640..68f17ec 100644 --- a/src/main/java/com/javabom/lotto/domain/result/LottoResult.java +++ b/src/main/java/com/javabom/lotto/domain/result/LottoResult.java @@ -1,26 +1,50 @@ package com.javabom.lotto.domain.result; -import com.javabom.lotto.domain.enums.PrizeType; +import java.util.Arrays; -public class LottoResult { +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); - private final int FAIL = 0; + LottoResult(int matchedCount, int prize) { + this.matchedCount = matchedCount; + this.prize = prize; + } - private int lottoResult; + public final int matchedCount; + public final int prize; - public LottoResult(int lottoResult) { - this.lottoResult = lottoResult; + public static LottoResult findLottoResult(int matchedCount, boolean bonusStatus) { + if (matchedCount == 5) { + return findBonus(bonusStatus); + } + return valueOf(matchedCount); } - public long getPrize() { - PrizeType prizeType = PrizeType.valueOfPrize(lottoResult); - if (prizeType != null) { - return prizeType.getPrize(); + private static LottoResult findBonus(boolean bonusStatus) { + if (bonusStatus) { + return SECOND; } - return FAIL; + 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 boolean isEquals(int matchedCount) { - return this.lottoResult == 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 index 9bc2e78..b0c46e1 100644 --- a/src/main/java/com/javabom/lotto/domain/result/LottoResultBundle.java +++ b/src/main/java/com/javabom/lotto/domain/result/LottoResultBundle.java @@ -1,13 +1,10 @@ package com.javabom.lotto.domain.result; -import com.javabom.lotto.domain.vo.Money; - -import java.util.Collections; import java.util.List; public class LottoResultBundle { - private final int FAIL = 0; private final int PERCENT = 100; + private final List lottoResultBundle; public LottoResultBundle(List lottoResultBundle) { @@ -22,22 +19,21 @@ public long calculatePrize() { return prize; } - public long getRateOfProfit(Money money) { - int amount = money.get(); + public long getRateOfProfit(int amount) { long profit = calculatePrize() - amount; - if (profit < FAIL) { - return FAIL; + if (profit < 0) { + return 0; } return (profit / amount) * PERCENT; } - public int getCountOfPrize(int matchedCount) { + public int getCountOfPrize(LottoResult lottoResult) { return (int) lottoResultBundle.stream() - .filter(lottoResult -> lottoResult.isEquals(matchedCount)) + .filter(result -> result.equals(lottoResult)) .count(); } - public List get() { - return Collections.unmodifiableList(lottoResultBundle); + 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..54dff9d --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/shop/AutoLottoNumberGenerator.java @@ -0,0 +1,22 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.number.GameNumber; + +import java.util.Collections; +import java.util.List; +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() { + Collections.shuffle(GAME_NUMBERS); + return GAME_NUMBERS.stream() + .limit(6) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java b/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java deleted file mode 100644 index a97dc79..0000000 --- a/src/main/java/com/javabom/lotto/domain/shop/GenerateLottoNumbers.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.javabom.lotto.domain.shop; - -import java.util.List; - -public interface GenerateLottoNumbers { - List generate(); -} 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..bf69fe8 --- /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.GameNumber; + +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..c641fd3 --- /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.GameNumber; + +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 index d9b0475..b75bdbd 100644 --- a/src/main/java/com/javabom/lotto/domain/shop/LottoShop.java +++ b/src/main/java/com/javabom/lotto/domain/shop/LottoShop.java @@ -1,38 +1,24 @@ package com.javabom.lotto.domain.shop; -import com.javabom.lotto.domain.info.Lotto; -import com.javabom.lotto.domain.info.LottoBundle; -import com.javabom.lotto.domain.vo.Money; +import com.javabom.lotto.domain.Customer; +import com.javabom.lotto.domain.ticket.LottoTicket; -import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class LottoShop { - private final int LOTTO_PRICE = 1000; + private final LottoMachine lottoMachine; - private final RandomMachine randomMachine; - - public LottoShop(RandomMachine randomMachine) { - this.randomMachine = randomMachine; - } - - public LottoBundle buyLotto(Money money) { - checkCanBuyLotto(money.get()); - List lottoBundle = new ArrayList<>(); - for (int i = 1; i <= getLottoCount(money.get()); i++) { - lottoBundle.add(randomMachine.createLotto()); - } - return new LottoBundle(lottoBundle); - } - - private void checkCanBuyLotto(int money) { - if (money < LOTTO_PRICE) { - throw new IllegalArgumentException("돈이 부족합니다. 1000원 이상 금액을 입력해 주세요."); - } + public LottoShop(LottoMachine lottoMachine) { + this.lottoMachine = lottoMachine; } - public int getLottoCount(int money) { - return money / LOTTO_PRICE; + public void enter(Customer customer) { + List manualLottoTickets = lottoMachine.createManualLottoTicket(customer.getManualLottoNumbers()); + List autoLottoTickets = lottoMachine.createAutoLottoTicket(customer.getAutoLottoTicketCount()); + customer.buy(Stream.concat(manualLottoTickets.stream(), autoLottoTickets.stream()) + .collect(Collectors.toList())); } } diff --git a/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java b/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java deleted file mode 100644 index bdb9303..0000000 --- a/src/main/java/com/javabom/lotto/domain/shop/RandomMachine.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.javabom.lotto.domain.shop; - -import com.javabom.lotto.domain.info.Lotto; - -import java.util.List; -import java.util.stream.Collectors; - -public class RandomMachine { - private final GenerateLottoNumbers generateLottoNumbers; - - public RandomMachine(GenerateLottoNumbers generateLottoNumbers) { - this.generateLottoNumbers = generateLottoNumbers; - } - - public Lotto createLotto() { - List lottoNumbers = generateLottoNumbers.generate(); - return new Lotto(picked(lottoNumbers)); - } - - private List picked(List lottoNumbers) { - return lottoNumbers.stream() - .limit(6) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java b/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java deleted file mode 100644 index 3de3efc..0000000 --- a/src/main/java/com/javabom/lotto/domain/shop/ShuffleLottoNumber.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.javabom.lotto.domain.shop; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class ShuffleLottoNumber implements GenerateLottoNumbers { - private static final List LOTTO_NUMBER = new ArrayList<>(); - - static { - init(); - } - - private static void init() { - for (int number = 1; number <= 45; number++) { - LOTTO_NUMBER.add(number); - } - } - - @Override - public List generate() { - Collections.shuffle(LOTTO_NUMBER); - return Collections.unmodifiableList(LOTTO_NUMBER); - } -} 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..9e6e954 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -0,0 +1,53 @@ +package com.javabom.lotto.domain.ticket; + +import com.javabom.lotto.domain.number.GameNumber; + +import java.util.List; + +public class LottoTicket { + public static final int PRICE = 1000; + + private final List lottoTicket; + private int matchedCount; + + private LottoTicket(List lottoTicket, int matchedCount) { + checkDuplicate(lottoTicket); + this.lottoTicket = lottoTicket; + this.matchedCount = matchedCount; + } + + public LottoTicket(List lottoTicket) { + this(lottoTicket, 0); + } + + private void checkDuplicate(List maybeLottoTicket) { + int size = getDeduplicationSize(maybeLottoTicket); + if (size != GameNumber.COUNT) { + throw new IllegalArgumentException(String.format("현재 개수: %d, 로또 번호의 갯수는 6개여야 합니다.", size)); + } + } + + private int getDeduplicationSize(List maybeLottoTicket) { + return (int) maybeLottoTicket.stream() + .distinct() + .count(); + } + + public boolean contains(GameNumber gameNumber) { + return lottoTicket.contains(gameNumber); + } + + public GameNumber get(int idx) { + return lottoTicket.get(idx); + } + + public void match(GameNumber prizeNumber, int idx) { + if (prizeNumber.equals(lottoTicket.get(idx))) { + matchedCount++; + } + } + + public int getMatchedCount() { + return matchedCount; + } +} 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..72fe1fe --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketBundle.java @@ -0,0 +1,35 @@ +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; + +public class LottoTicketBundle { + + private final List lottoTicketBundle; + + public LottoTicketBundle(List LottoTicketBundle) { + this.lottoTicketBundle = LottoTicketBundle; + } + + public LottoResultBundle match(PrizeNumbersBundle prizeNumberBundle) { + List lottoResults = new ArrayList<>(); + for (LottoTicket lottoTicket : lottoTicketBundle) { + LottoResult result = prizeNumberBundle.searchResult(lottoTicket); + lottoResults.add(result); + } + return new LottoResultBundle(lottoResults); + } + + public void addLottoTickets(List lottoTickets) { + lottoTicketBundle.addAll(lottoTickets); + } + + 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..37b37e4 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java @@ -0,0 +1,32 @@ +package com.javabom.lotto.domain.utils; + +import com.javabom.lotto.domain.number.GameNumber; + +import java.util.List; +import java.util.stream.Collectors; + +public class GameNumberConverter { + + public static List convert(List strGameNumbers) { + checkCount(strGameNumbers.size()); + List maybeGameNumbers = strGameNumbers.stream() + .distinct() + .map(GameNumber::valueOf) + .collect(Collectors.toList()); + checkDuplicate(maybeGameNumbers.size()); + return maybeGameNumbers; + } + + private static void checkCount(int numberCount) { + if (numberCount != GameNumber.COUNT) { + throw new IllegalArgumentException(String.format("%d개의 당첨 번호를 입력하셨습니다. 당첨 번호는 총 6개여야 합니다.", numberCount)); + } + } + + private static void checkDuplicate(int gameNumbersSize) { + if (gameNumbersSize != GameNumber.COUNT) { + throw new IllegalArgumentException("당첨 번호는 모두 달라야 합니다."); + } + } + +} diff --git a/src/main/java/com/javabom/lotto/domain/valid/GameNumber.java b/src/main/java/com/javabom/lotto/domain/valid/GameNumber.java deleted file mode 100644 index b0dd80f..0000000 --- a/src/main/java/com/javabom/lotto/domain/valid/GameNumber.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.javabom.lotto.domain.valid; - -import java.util.Objects; - -public class GameNumber { - private final int MIN_NUMBER = 1; - private final int MAX_NUMBER = 45; - - private int gameNumber; - - public GameNumber(String strGameNumber) { - Number number = new Number(strGameNumber); - checkRange(number.get()); - this.gameNumber = number.get(); - } - - private void checkRange(int number) { - if (number < MIN_NUMBER || number > MAX_NUMBER) { - throw new IllegalArgumentException("당첨 번호는 1-45 숫자만 가능합니다."); - } - } - - public int get() { - return gameNumber; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof GameNumber)) return false; - GameNumber that = (GameNumber) o; - return get() == that.get(); - } - - @Override - public int hashCode() { - return Objects.hash(get()); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/valid/Number.java b/src/main/java/com/javabom/lotto/domain/valid/Number.java deleted file mode 100644 index c16b29b..0000000 --- a/src/main/java/com/javabom/lotto/domain/valid/Number.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.javabom.lotto.domain.valid; - -public class Number { - private int number; - - public Number(String number) { - this.number = parseInt(number); - } - - private int parseInt(String number) { - try { - return Integer.parseInt(number); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("숫자가 아닌 값이 들어왔습니다."); - } - } - - public int get() { - return number; - } -} diff --git a/src/main/java/com/javabom/lotto/domain/vo/Money.java b/src/main/java/com/javabom/lotto/domain/vo/Money.java deleted file mode 100644 index 65f48fa..0000000 --- a/src/main/java/com/javabom/lotto/domain/vo/Money.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.javabom.lotto.domain.vo; - -import com.javabom.lotto.domain.valid.Number; - -public class Money { - private int money; - - public Money(String strMoney) { - Number number = new Number(strMoney); - this.money = number.get(); - } - - public int get() { - return money; - } -} diff --git a/src/main/java/com/javabom/lotto/view/InputView.java b/src/main/java/com/javabom/lotto/view/InputView.java index 9dec223..f2b5aeb 100644 --- a/src/main/java/com/javabom/lotto/view/InputView.java +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -1,29 +1,47 @@ 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 final String FIRST_QUESTION = "구입 금앱을 입력해 주세요."; - private final String SECOUND_QUESTION = "당첨 번호를 입력해주세요."; - private final String THIRD_QUESTION = "보너스 번호를 입력해주세요."; - private final String DELIMITER = ", "; + private static final String DELIMITER = ", "; private final Scanner sc; public InputView(Scanner sc) { this.sc = sc; } - public String inputMoney() { + 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 money; + return Integer.parseInt(money); } public List inputPrizeNumbers() { + String SECOUND_QUESTION = "당첨 번호를 입력해주세요."; System.out.println(SECOUND_QUESTION); String prizeNumbers = sc.nextLine(); checkEmpty(prizeNumbers); @@ -31,6 +49,7 @@ public List inputPrizeNumbers() { } public String inputBonusNumber() { + String THIRD_QUESTION = "보너스 번호를 입력해주세요."; System.out.println(THIRD_QUESTION); String bonusNumber = sc.nextLine(); checkEmpty(bonusNumber); @@ -38,7 +57,7 @@ public String inputBonusNumber() { } private void checkEmpty(String inputValue) { - if(inputValue.isEmpty()){ + 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 index d12f766..1e875d8 100644 --- a/src/main/java/com/javabom/lotto/view/OutputView.java +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -1,56 +1,48 @@ package com.javabom.lotto.view; -import com.javabom.lotto.domain.enums.PrizeType; -import com.javabom.lotto.domain.info.Lotto; -import com.javabom.lotto.domain.info.LottoBundle; +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 com.javabom.lotto.domain.vo.Money; import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; public class OutputView { private static final int BONUS_COUNT = 5; - private static final int BONUS_NUMBER = 50; - public static void printLottoCount(int lottoCount) { - System.out.println(lottoCount + "개를 구매했습니다."); + public static void printLottoCount(int manualLottoCount, int autoLottoCount) { + System.out.println("수동으로 " + manualLottoCount + "장 자동으로" + autoLottoCount + "개를 구매했습니다."); } - public static void printMyLottoBundle(LottoBundle lottoShop) { - List lottoBundle = lottoShop.getMyLottoBundle(); - for (Lotto lotto : lottoBundle) { - List strLotto = getStrLotto(lotto.getLotto()); - System.out.println("[" + strLotto.stream(). - collect(Collectors.joining(",")) + "]"); + 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() + "]"); } } - private static List getStrLotto(List lotto) { - return lotto.stream() - .map(Objects::toString) - .collect(Collectors.toList()); - } - - public static void printResults(LottoResultBundle lottoResultBundle, Money money) { + 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, money); + printRateOfProfit(lottoResultBundle, amount); } - private static void printResult(LottoResultBundle lottoResultBundle, int mathcedCount){ + 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 + "개 일치(" + PrizeType.valueOfPrize(BONUS_NUMBER).getPrize() + ")- " + lottoResultBundle.getCountOfPrize(BONUS_NUMBER)); + System.out.println(mathcedCount + "개 일치(" + LottoResult.SECOND.getPrize() + ")- " + lottoResultBundle.getCountOfPrize(LottoResult.SECOND)); } - System.out.println(mathcedCount + "개 일치(" + PrizeType.valueOfPrize(mathcedCount).getPrize() + ")- " + lottoResultBundle.getCountOfPrize(mathcedCount)); } - private static void printRateOfProfit(LottoResultBundle lottoResultBundle, Money money) { - System.out.println("총 수익률은 " + lottoResultBundle.getRateOfProfit(money)+"%입니다."); + 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..7d2953f --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/CustomerTest.java @@ -0,0 +1,101 @@ +package com.javabom.lotto.domain; + +import com.javabom.lotto.domain.number.GameNumber; +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.shop.FIxedNumberGenerator; +import com.javabom.lotto.domain.shop.LottoMachine; +import com.javabom.lotto.domain.shop.LottoShop; +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 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("구입할 수 있는 자동 로또 티켓 갯수를 반환한다.") + @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); + } + + @DisplayName("구입한 로또 티켓이 잘 들어왔는지 확인한다.") + @Test + void buy() { + List> manualLottoNumbers = new ArrayList<>(); + + Customer customer = new Customer(1000, manualLottoNumbers); + + LottoShop lottoShop = new LottoShop(new LottoMachine(new FIxedNumberGenerator())); + + lottoShop.enter(customer); + LottoTicketBundle lottoTicketBundle = customer.getLottoTicketBundle(); + + 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)); + } + + @DisplayName("로또 결과를 잘 반환하는지 확인한다.") + @Test + void confirmLottoResult(){ + List> manualLottoNumbers = new ArrayList<>(); + + List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "8"); + PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle(prizeNumbers, "6"); + + Customer customer = new Customer(1000, manualLottoNumbers); + LottoMachine lottoMachine = new LottoMachine(new FIxedNumberGenerator()); + customer.buy(lottoMachine.createAutoLottoTicket(1)); + + LottoResultBundle lottoResultBundle = customer.confirmLottoResult(prizeNumberBundle); + + assertThat(lottoResultBundle.valueOf(0)).isEqualTo(LottoResult.SECOND); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/info/BonusNumberTest.java b/src/test/java/com/javabom/lotto/domain/info/BonusNumberTest.java deleted file mode 100644 index ee29d88..0000000 --- a/src/test/java/com/javabom/lotto/domain/info/BonusNumberTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.javabom.lotto.domain.info; - -import org.junit.jupiter.api.DisplayName; -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 BonusNumberTest { - - @DisplayName("로또 번호중 보너스 번호를 갖고 있고 현재 일치하는 갯수가 5개면 true," + - " 번호를 갖고 있지 않거나 현재 일치하는 갯수가 5가 아니면 false를 반환한다.") - @ParameterizedTest - @CsvSource({"4,5,true", "7,5,false", "4,4,false", "7,4,false"}) - void isValid(String bonusNumber, int matchedCount, boolean expected) { - Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); - BonusNumber bonus = new BonusNumber(bonusNumber); - assertThat(bonus.isValid(lotto, matchedCount)).isEqualTo(expected); - } -} diff --git a/src/test/java/com/javabom/lotto/domain/info/LottoBundleTest.java b/src/test/java/com/javabom/lotto/domain/info/LottoBundleTest.java deleted file mode 100644 index e105d54..0000000 --- a/src/test/java/com/javabom/lotto/domain/info/LottoBundleTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.javabom.lotto.domain.info; - -import com.javabom.lotto.domain.info.Lotto; -import com.javabom.lotto.domain.info.LottoBundle; -import com.javabom.lotto.domain.info.PrizeNumberInfo; -import com.javabom.lotto.domain.result.LottoResult; -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; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class LottoBundleTest { - - @DisplayName("알맞은 로또 결과를 반환하는지 확인한다.") - @Test - public void confirmLottoResult() { - Lotto lotto1 = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); - Lotto lotto2 = new Lotto(Arrays.asList(1, 3, 5, 7, 9, 11)); - - List lottoList = Arrays.asList(lotto1, lotto2); - - LottoBundle lottoBundle = new LottoBundle(lottoList); - - List prizeNumbers = Arrays.asList("1", "2", "4", "7", "9", "11"); - PrizeNumberInfo prizeNumberInfo = new PrizeNumberInfo(prizeNumbers, "30"); - - List lottoResultBundle = lottoBundle.confirmLottoResult(prizeNumberInfo).get(); - assertThat(lottoResultBundle.size()).isEqualTo(2); - assertTrue(lottoResultBundle.get(0).isEquals(3)); - assertTrue(lottoResultBundle.get(1).isEquals(4)); - } -} diff --git a/src/test/java/com/javabom/lotto/domain/info/LottoTest.java b/src/test/java/com/javabom/lotto/domain/info/LottoTest.java deleted file mode 100644 index 09a6fb5..0000000 --- a/src/test/java/com/javabom/lotto/domain/info/LottoTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.javabom.lotto.domain.info; - -import com.javabom.lotto.domain.valid.GameNumber; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; - -import java.util.Arrays; - -import static org.junit.jupiter.api.Assertions.*; - -class LottoTest { - - @DisplayName("로또번호를 갖고 있으면 true, 갖고 있지 않으면 false를 반환한다.") - @ParameterizedTest - @CsvSource({"1,true", "9,false"}) - void has(String lottoNumber, boolean expected) { - Lotto lotto = new Lotto( - Arrays.asList(1, 2, 3, 4, 5, 6)); - GameNumber gameNumber = new GameNumber(lottoNumber); - assertEquals(expected, lotto.has(gameNumber)); - assertEquals(expected, lotto.has(gameNumber)); - } -} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/info/PrizeNumbersTest.java b/src/test/java/com/javabom/lotto/domain/info/PrizeNumbersTest.java deleted file mode 100644 index 4e561a7..0000000 --- a/src/test/java/com/javabom/lotto/domain/info/PrizeNumbersTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.javabom.lotto.domain.info; - -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 PrizeNumbersTest { - - @DisplayName("당첨 번호가 6개가 아닐 시 IllegalArgumentException 을 발생시킨다.") - @Test - void checkCount() { - List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5"); - assertThatThrownBy(() -> new PrizeNumbers(prizeNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("당첨 번호는 총 6개여야 합니다."); - } - - @DisplayName("당첨 번호중 중복된 숫자가 있으면 IllegalArgumentException 을 발생시킨다.") - @Test - void checkDuplicate() { - assertThatThrownBy(() -> new PrizeNumbers(Arrays.asList("1", "2", "3", "4", "4", "5"))) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("당첨 번호는 모두 달라야 합니다."); - } - - @DisplayName("당첨 번호와 로또 번호의 일치 갯수의 값을 반환한다.") - @Test - void getMatchedCount() { - PrizeNumbers prizeNumbers = new PrizeNumbers(Arrays.asList("1", "3", "5", "7", "9", "11")); - Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); - assertThat(prizeNumbers.getMatchedCount(lotto)).isEqualTo(3); - } - - @DisplayName("당첨 번호에 들어있는 번호면 true, 들어있지 않는 번호면 false를 반환한다.") - @ParameterizedTest - @CsvSource({"4,true", "7,false"}) - void has(String number, boolean expected) { - List strPrizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); - PrizeNumbers prizeNumbers = new PrizeNumbers(strPrizeNumbers); - BonusNumber bonusNumber = new BonusNumber(number); - assertThat(prizeNumbers.has(bonusNumber)).isEqualTo(expected); - } -} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/valid/GameNumberTest.java b/src/test/java/com/javabom/lotto/domain/number/GameNumberTest.java similarity index 62% rename from src/test/java/com/javabom/lotto/domain/valid/GameNumberTest.java rename to src/test/java/com/javabom/lotto/domain/number/GameNumberTest.java index 9a5348c..f3a1e40 100644 --- a/src/test/java/com/javabom/lotto/domain/valid/GameNumberTest.java +++ b/src/test/java/com/javabom/lotto/domain/number/GameNumberTest.java @@ -1,4 +1,4 @@ -package com.javabom.lotto.domain.valid; +package com.javabom.lotto.domain.number; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,8 +10,9 @@ class GameNumberTest { @DisplayName("로또 당첨 번호에 사용될 숫자가 1-45 사이의 숫자가 아닐 시 IllegalArgumentException 을 발생시킨다.") @Test void checkRange() { - assertThatThrownBy(() -> new GameNumber("50")) + String number = "50"; + assertThatThrownBy(() -> GameNumber.valueOf(number)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("당첨 번호는 1-45 숫자만 가능합니다."); + .hasMessage(String.format("입력값: %s, 당첨 번호는 1-45 숫자만 가능합니다.", number)); } } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/info/PrizeNumberInfoTest.java b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersBundleTest.java similarity index 54% rename from src/test/java/com/javabom/lotto/domain/info/PrizeNumberInfoTest.java rename to src/test/java/com/javabom/lotto/domain/number/PrizeNumbersBundleTest.java index 67842be..1b57722 100644 --- a/src/test/java/com/javabom/lotto/domain/info/PrizeNumberInfoTest.java +++ b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersBundleTest.java @@ -1,8 +1,8 @@ -package com.javabom.lotto.domain.info; +package com.javabom.lotto.domain.number; -import com.javabom.lotto.domain.info.Lotto; -import com.javabom.lotto.domain.info.PrizeNumberInfo; 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; @@ -11,31 +11,32 @@ import java.util.Arrays; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; -class PrizeNumberInfoTest { +class PrizeNumbersBundleTest { @DisplayName("당첨 번호와 보너스 번호가 겹치면 IllegalArgumentException 을 발생시킨다") @Test void checkDuplicate() { List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); String bonusNumber = "6"; - assertThatThrownBy(() -> new PrizeNumberInfo(prizeNumbers, bonusNumber)) + assertThatThrownBy(() -> new PrizeNumbersBundle(prizeNumbers, bonusNumber)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("입력하신 보너스 번호는 당첨 번호와 겹칩니다."); } @DisplayName("당첨 번호와 보너스 번호의 일치 갯수의 값을 확인한다.") @ParameterizedTest - @CsvSource({"10,50", "20,5"}) - void matchLotto(String bonusNumber, int expected) { + @CsvSource({"10,SECOND", "20,THIRD"}) + void searchResult(String bonusNumber, String expected) { List prizeNumbers = Arrays.asList("1", "3", "5", "7", "9", "11"); - PrizeNumberInfo prizeNumberInfo = new PrizeNumberInfo(prizeNumbers, bonusNumber); + PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle(prizeNumbers, bonusNumber); - Lotto lotto = new Lotto(Arrays.asList(1, 3, 5, 7, 9, 10)); + LottoTicket lottoTicket = new LottoTicket( + GameNumberConverter.convert(Arrays.asList("1", "3", "5", "7", "9", "10"))); - LottoResult lottoResult = prizeNumberInfo.matchLotto(lotto); - assertTrue(lottoResult.isEquals(expected)); + LottoResult lottoResult = prizeNumberBundle.searchResult(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..3773611 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersTest.java @@ -0,0 +1,23 @@ +package com.javabom.lotto.domain.number; + +import org.junit.jupiter.api.DisplayName; +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); + GameNumber bonusNumber = GameNumber.valueOf(number); + assertThat(prizeNumbers.contains(bonusNumber)).isEqualTo(expected); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java b/src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java index c66d009..7c6ee18 100644 --- a/src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java +++ b/src/test/java/com/javabom/lotto/domain/result/LottoResultBundleTest.java @@ -1,8 +1,5 @@ package com.javabom.lotto.domain.result; -import com.javabom.lotto.domain.result.LottoResult; -import com.javabom.lotto.domain.result.LottoResultBundle; -import com.javabom.lotto.domain.vo.Money; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -18,29 +15,27 @@ class LottoResultBundleTest { @Test void calculatePrize() { LottoResultBundle lottoResultBundle = new LottoResultBundle(Arrays.asList( - new LottoResult(4), new LottoResult(3), new LottoResult(3), new LottoResult(1), new LottoResult(1), new LottoResult(1))); - + LottoResult.FIFTH, LottoResult.FIFTH, LottoResult.FAIL, LottoResult.FOURTH)); assertThat(lottoResultBundle.calculatePrize()).isEqualTo(60000); } @DisplayName("수익률을 계산한다.") @ParameterizedTest @CsvSource({"100000,0", "10000,500"}) - void getRateOfReturn(String strMoney, int expected) { + void getRateOfProfit(int amount, int expected) { LottoResultBundle lottoResultBundle = new LottoResultBundle(Arrays.asList( - new LottoResult(4), new LottoResult(3), new LottoResult(3), new LottoResult(1), new LottoResult(1), new LottoResult(1))); - Money money = new Money(strMoney); + LottoResult.FAIL, LottoResult.FIFTH, LottoResult.FOURTH, LottoResult.FIFTH)); - assertThat(lottoResultBundle.getRateOfProfit(money)).isEqualTo(expected); + assertThat(lottoResultBundle.getRateOfProfit(amount)).isEqualTo(expected); } @DisplayName("로또 결과에 대한 일치 갯수를 확인한다.") @Test void getCountOfPrize() { LottoResultBundle lottoResultBundle = new LottoResultBundle(Arrays.asList( - new LottoResult(4), new LottoResult(3), new LottoResult(3), new LottoResult(1), new LottoResult(1), new LottoResult(1))); + LottoResult.FOURTH, LottoResult.FIFTH, LottoResult.FIFTH, LottoResult.FIFTH)); - assertThat(lottoResultBundle.getCountOfPrize(3)).isEqualTo(2); - assertThat(lottoResultBundle.getCountOfPrize(4)).isEqualTo(1); + 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 index 214ac58..26f3cb5 100644 --- a/src/test/java/com/javabom/lotto/domain/result/LottoResultTest.java +++ b/src/test/java/com/javabom/lotto/domain/result/LottoResultTest.java @@ -10,9 +10,9 @@ class LottoResultTest { @DisplayName("로또 결과에 대한 알맞은 상금을 반환하는지 확인한다.") @ParameterizedTest - @CsvSource({"1,0", "3,5000", "4,50000", "5,1500000", "50,30000000", "6, 2000000000"}) - void getPrize(int actual, long expected) { - LottoResult lottoResult = new LottoResult(actual); - assertThat(lottoResult.getPrize()).isEqualTo(expected); + @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/FIxedNumberGenerator.java b/src/test/java/com/javabom/lotto/domain/shop/FIxedNumberGenerator.java new file mode 100644 index 0000000..77b535c --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/FIxedNumberGenerator.java @@ -0,0 +1,17 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.number.GameNumber; +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/FixedGenerateLottoNumber.java b/src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java deleted file mode 100644 index 6fdbd43..0000000 --- a/src/test/java/com/javabom/lotto/domain/shop/FixedGenerateLottoNumber.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.javabom.lotto.domain.shop; - -import java.util.Arrays; -import java.util.List; - -public class FixedGenerateLottoNumber implements GenerateLottoNumbers { - - @Override - public List generate() { - return Arrays.asList(1, 2, 3, 4, 5, 6); - } -} 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..2ab521d --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/LottoMachineTest.java @@ -0,0 +1,52 @@ +package com.javabom.lotto.domain.shop; + +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 deleted file mode 100644 index 9a76785..0000000 --- a/src/test/java/com/javabom/lotto/domain/shop/LottoShopTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.javabom.lotto.domain.shop; - -import com.javabom.lotto.domain.info.LottoBundle; -import com.javabom.lotto.domain.vo.Money; -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.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -class LottoShopTest { - - @DisplayName("로또를 구입했을 때 구입 금액에 맞는 로또 크기를 반환하는지 확인한다.") - @ParameterizedTest - @CsvSource({"2000,2", "10000,10"}) - void buyLotto(String strMoney, int expected) { - LottoShop lottoShop = new LottoShop(new RandomMachine(new FixedGenerateLottoNumber())); - Money money = new Money(strMoney); - LottoBundle lottoBundle = lottoShop.buyLotto(money); - assertThat(lottoBundle.getMyLottoBundle().size()).isEqualTo(expected); - } - - @DisplayName("금액이 1000원 이상 들어오지 않았을 시 IllegalArgumentException 을 발생시킨다.") - @Test - void checkCanBuyLotto() { - LottoShop lottoShop = new LottoShop(new RandomMachine(new FixedGenerateLottoNumber())); - Money money = new Money("900"); - assertThatThrownBy(() -> lottoShop.buyLotto(money)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("돈이 부족합니다. 1000원 이상 금액을 입력해 주세요."); - } - - @DisplayName("금액이 1000원 이상 들어왔을 때 살 수 있는 로또 갯수를 반환한다.") - @ParameterizedTest - @CsvSource({"1000,1", "14000, 14"}) - void getLottoCount(String strMoney, int expected) { - LottoShop lottoShop = new LottoShop(new RandomMachine(new FixedGenerateLottoNumber())); - Money money = new Money(strMoney); - assertThat(lottoShop.getLottoCount(money.get())).isEqualTo(expected); - } -} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java b/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java deleted file mode 100644 index 87dcea8..0000000 --- a/src/test/java/com/javabom/lotto/domain/shop/RandomMachineTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.javabom.lotto.domain.shop; - -import com.javabom.lotto.domain.info.Lotto; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class RandomMachineTest { - private final int MIN = 1; - private final int MAX = 45; - - @DisplayName("생성된 번호에 대한 값을 반환하는지 확인한다.") - @Test - void createLotto() { - RandomMachine randomMachine = new RandomMachine(new FixedGenerateLottoNumber()); - Lotto actual = randomMachine.createLotto(); - - assertThat(actual.get(0)).isEqualTo(1); - assertThat(actual.get(1)).isEqualTo(2); - assertThat(actual.get(2)).isEqualTo(3); - assertThat(actual.get(3)).isEqualTo(4); - assertThat(actual.get(4)).isEqualTo(5); - assertThat(actual.get(5)).isEqualTo(6); - } - - @DisplayName("랜덤한 값으로 들어온 로또 번호가 1-45 사이인지 확인한다.") - @Test - void picked() { - RandomMachine randomMachine = new RandomMachine(new ShuffleLottoNumber()); - Lotto actual = randomMachine.createLotto(); - assertTrue(actual.get(0) >= MIN && actual.get(0) <= MAX); - assertTrue(actual.get(1) >= MIN && actual.get(1) <= MAX); - assertTrue(actual.get(2) >= MIN && actual.get(2) <= MAX); - assertTrue(actual.get(3) >= MIN && actual.get(3) <= MAX); - assertTrue(actual.get(4) >= MIN && actual.get(4) <= MAX); - assertTrue(actual.get(5) >= MIN && actual.get(5) <= MAX); - } -} 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..58a2273 --- /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 match() { + 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.match(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..74f7b2d --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java @@ -0,0 +1,56 @@ +package com.javabom.lotto.domain.ticket; + +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 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 gameNumbers = Arrays.asList( + GameNumber.valueOf(1),GameNumber.valueOf(1),GameNumber.valueOf(2), + GameNumber.valueOf(3),GameNumber.valueOf(4),GameNumber.valueOf(5)); + 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(gameNumber)).isEqualTo(expected); + } + + @DisplayName("로또 티켓의 번호와 당첨 번호의 번호가 일치하면 당첨 갯수를 증가시킨다.") + @ParameterizedTest + @CsvSource({"3,1", "7,0"}) + void match(int number, int expected){ + List strGameNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); + LottoTicket lottoTicket = new LottoTicket(gameNumbers); + + GameNumber prizeNumber = GameNumber.valueOf(number); + lottoTicket.match(prizeNumber, 2); + assertThat(lottoTicket.getMatchedCount()).isEqualTo(expected); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/valid/NumberTest.java b/src/test/java/com/javabom/lotto/domain/valid/NumberTest.java deleted file mode 100644 index 5af8f07..0000000 --- a/src/test/java/com/javabom/lotto/domain/valid/NumberTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.javabom.lotto.domain.valid; - -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; - -class NumberTest { - - @DisplayName("들어온 번호가 숫자가 아닐시 NumberFormatException 을 발생시킨다.") - @Test - void parseInt1() { - assertThatThrownBy(() -> new Number("String")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("숫자가 아닌 값이 들어왔습니다."); - } - - @DisplayName("들어온 번호가 숫자면 오류가 나지 않는다.") - @Test - void parseInt2() { - Number number = new Number("10"); - assertThat(number.get()).isEqualTo(10); - } -} \ No newline at end of file From cfe2066270b3ea012987d0a10aa2e811e88b5c33 Mon Sep 17 00:00:00 2001 From: BangKiHyun Date: Thu, 11 Jun 2020 19:38:05 +0900 Subject: [PATCH 5/7] =?UTF-8?q?AutoLottoNumberGenerator=20=EB=B0=8F=20Game?= =?UTF-8?q?NumberConverter=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/AutoLottoNumberGeneratorTest.java | 26 +++++++++++++++++ .../domain/utils/GameNumberConverterTest.java | 29 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/test/java/com/javabom/lotto/domain/shop/AutoLottoNumberGeneratorTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/utils/GameNumberConverterTest.java 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..3601d65 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/shop/AutoLottoNumberGeneratorTest.java @@ -0,0 +1,26 @@ +package com.javabom.lotto.domain.shop; + +import com.javabom.lotto.domain.number.GameNumber; +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).value() >= GameNumber.MIN_NUMBER && actual.get(0).value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(1).value() >= GameNumber.MIN_NUMBER && actual.get(1).value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(2).value() >= GameNumber.MIN_NUMBER && actual.get(2).value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(3).value() >= GameNumber.MIN_NUMBER && actual.get(3).value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(4).value() >= GameNumber.MIN_NUMBER && actual.get(4).value() <= GameNumber.MAX_NUMBER); + assertTrue(actual.get(5).value() >= GameNumber.MIN_NUMBER && actual.get(5).value() <= GameNumber.MAX_NUMBER); + } +} 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..5606878 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/utils/GameNumberConverterTest.java @@ -0,0 +1,29 @@ +package com.javabom.lotto.domain.utils; + +import com.javabom.lotto.domain.number.GameNumber; +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)).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)); + } +} From c4364e1cb516c5b1a718c558ed4a64e3f7b6d9c9 Mon Sep 17 00:00:00 2001 From: BangKiHyun Date: Mon, 15 Jun 2020 16:59:08 +0900 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GameNumberConverter에 있는 오류 검증 로직을 변환 받은 값을 받은 객체가 검증 일치 여부를 확인할 때 index에 의존하지 말고 OrderGameNumber를 통해 일치 여부 확인 Customer클래스가 갖고있던 LottoTicketBundle 분리 --- .../com/javabom/lotto/LottoApplication.java | 7 +- .../com/javabom/lotto/domain/Customer.java | 46 ++++++------ .../lotto/domain/number/GameNumber.java | 1 - .../lotto/domain/number/OrderGameNumber.java | 53 ++++++++++++++ .../lotto/domain/number/PrizeNumbers.java | 34 +++++++-- .../domain/number/PrizeNumbersBundle.java | 13 ++-- .../domain/shop/AutoLottoNumberGenerator.java | 10 ++- .../lotto/domain/shop/LottoMachine.java | 6 +- .../domain/shop/LottoNumbersGenerator.java | 4 +- .../javabom/lotto/domain/shop/LottoShop.java | 5 +- .../lotto/domain/ticket/LottoTicket.java | 35 ++++------ .../domain/ticket/LottoTicketBundle.java | 17 ++--- .../domain/utils/GameNumberConverter.java | 27 ++----- .../com/javabom/lotto/view/InputView.java | 2 +- .../javabom/lotto/domain/CustomerTest.java | 70 ++++++------------- .../lotto/domain/number/GameNumberTest.java | 2 +- .../domain/number/OrderGameNumberTest.java | 32 +++++++++ .../domain/number/PrizeNumbersBundleTest.java | 4 +- .../lotto/domain/number/PrizeNumbersTest.java | 18 ++++- .../shop/AutoLottoNumberGeneratorTest.java | 15 ++-- ...nerator.java => FixedNumberGenerator.java} | 5 +- .../lotto/domain/shop/LottoMachineTest.java | 7 +- .../domain/ticket/LottoTicketBundleTest.java | 4 +- .../lotto/domain/ticket/LottoTicketTest.java | 25 +++---- .../domain/utils/GameNumberConverterTest.java | 19 ++--- 25 files changed, 272 insertions(+), 189 deletions(-) create mode 100644 src/main/java/com/javabom/lotto/domain/number/OrderGameNumber.java create mode 100644 src/test/java/com/javabom/lotto/domain/number/OrderGameNumberTest.java rename src/test/java/com/javabom/lotto/domain/shop/{FIxedNumberGenerator.java => FixedNumberGenerator.java} (68%) diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index b72b24a..64964a9 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -6,6 +6,7 @@ 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; @@ -23,15 +24,15 @@ public static void main(String[] args) { Customer customer = new Customer(amount, manualLottoNumbers); LottoShop lottoShop = new LottoShop(new LottoMachine(new AutoLottoNumberGenerator())); - lottoShop.enter(customer); + LottoTicketBundle lottoTicketBundle = lottoShop.buy(customer); OutputView.printLottoCount(manualLottoNumbers.size(), customer.getAutoLottoTicketCount()); - OutputView.printLottoBundle(customer.getLottoTicketBundle()); + OutputView.printLottoBundle(lottoTicketBundle); PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle( inputView.inputPrizeNumbers(), inputView.inputBonusNumber()); - LottoResultBundle lottoResultBundle = customer.confirmLottoResult(prizeNumberBundle); + 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 index ecba4a9..7b664fc 100644 --- a/src/main/java/com/javabom/lotto/domain/Customer.java +++ b/src/main/java/com/javabom/lotto/domain/Customer.java @@ -1,10 +1,7 @@ package com.javabom.lotto.domain; import com.javabom.lotto.domain.ticket.LottoTicket; -import com.javabom.lotto.domain.ticket.LottoTicketBundle; -import com.javabom.lotto.domain.number.PrizeNumbersBundle; -import com.javabom.lotto.domain.result.LottoResultBundle; -import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; import com.javabom.lotto.domain.utils.GameNumberConverter; import java.util.ArrayList; @@ -13,15 +10,13 @@ public class Customer { private final int amount; - private final List> manualLottoNumbers; - private LottoTicketBundle lottoTicketBundle; + private final List> manualLottoNumbers; public Customer(int amount, List> strManualLottoNumbers) { checkPositive(amount); checkBuyManualLottoTicket(amount, strManualLottoNumbers.size()); this.amount = amount; this.manualLottoNumbers = collet(strManualLottoNumbers); - this.lottoTicketBundle = null; } private void checkPositive(int amount) { @@ -37,16 +32,30 @@ private void checkBuyManualLottoTicket(int amount, int ticketCount) { } } - private List> collet(List> strManualLottoNumbers) { - List> manualLottoNumbers = new ArrayList<>(); + 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; } - public List> getManualLottoNumbers() { - return Collections.unmodifiableList(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() { @@ -57,18 +66,7 @@ public int getAutoLottoTicketCount() { return curAmount / LottoTicket.PRICE; } - public void buy(List lottoTickets) { - if (lottoTicketBundle != null) { - lottoTicketBundle.addLottoTickets(lottoTickets); - } - lottoTicketBundle = new LottoTicketBundle(lottoTickets); - } - - public LottoTicketBundle getLottoTicketBundle() { - return new LottoTicketBundle(lottoTicketBundle.get()); - } - - public LottoResultBundle confirmLottoResult(PrizeNumbersBundle prizeNumberBundle) { - return lottoTicketBundle.match(prizeNumberBundle); + 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 index 1919623..33b8386 100644 --- a/src/main/java/com/javabom/lotto/domain/number/GameNumber.java +++ b/src/main/java/com/javabom/lotto/domain/number/GameNumber.java @@ -7,7 +7,6 @@ public class GameNumber { public static final int MIN_NUMBER = 1; public static final int MAX_NUMBER = 45; - public static final int COUNT = 6; private final int 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 index c33f62c..374c9b6 100644 --- a/src/main/java/com/javabom/lotto/domain/number/PrizeNumbers.java +++ b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbers.java @@ -7,19 +7,39 @@ public class PrizeNumbers { - private final List prizeNumbers; + private final List prizeNumbers; public PrizeNumbers(List strPrizeNumbers) { - this.prizeNumbers = GameNumberConverter.convert(strPrizeNumbers); + this.prizeNumbers = collect(strPrizeNumbers); } - public boolean contains(GameNumber bonusNumber) { - return prizeNumbers.contains(bonusNumber); + private List collect(final List strPrizeNumbers) { + checkCount(strPrizeNumbers.size()); + List prizeNumbers = GameNumberConverter.convert(strPrizeNumbers); + checkDuplicate(prizeNumbers.size()); + return prizeNumbers; } - public void compareTo(LottoTicket lottoTicket) { - for (int idx = 0; idx < GameNumber.COUNT; idx++) { - lottoTicket.match(prizeNumbers.get(idx), idx); + 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 index f7eff70..783057d 100644 --- a/src/main/java/com/javabom/lotto/domain/number/PrizeNumbersBundle.java +++ b/src/main/java/com/javabom/lotto/domain/number/PrizeNumbersBundle.java @@ -6,13 +6,14 @@ import java.util.List; public class PrizeNumbersBundle { + private static final int BONUS_ORDER = 7; private final PrizeNumbers prizeNumbers; - private final GameNumber bonusNumber; + private final OrderGameNumber bonusNumber; public PrizeNumbersBundle(List prizeNumbers, String bonusNumber) { this.prizeNumbers = new PrizeNumbers(prizeNumbers); - this.bonusNumber = GameNumber.valueOf(bonusNumber); + this.bonusNumber = OrderGameNumber.of(BONUS_ORDER, bonusNumber); checkDuplicate(); } @@ -22,9 +23,9 @@ private void checkDuplicate() { } } - public LottoResult searchResult(LottoTicket lottoTicket) { - prizeNumbers.compareTo(lottoTicket); - boolean bonusStatus = lottoTicket.contains(bonusNumber); - return LottoResult.findLottoResult(lottoTicket.getMatchedCount(), bonusStatus); + 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/shop/AutoLottoNumberGenerator.java b/src/main/java/com/javabom/lotto/domain/shop/AutoLottoNumberGenerator.java index 54dff9d..f528253 100644 --- a/src/main/java/com/javabom/lotto/domain/shop/AutoLottoNumberGenerator.java +++ b/src/main/java/com/javabom/lotto/domain/shop/AutoLottoNumberGenerator.java @@ -1,9 +1,12 @@ 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; @@ -13,10 +16,13 @@ public class AutoLottoNumberGenerator implements LottoNumbersGenerator { .collect(Collectors.toList()); @Override - public List generate() { + public List generate() { + final AtomicInteger idx = new AtomicInteger(1); + Collections.shuffle(GAME_NUMBERS); return GAME_NUMBERS.stream() - .limit(6) + .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 index bf69fe8..2d86e2c 100644 --- a/src/main/java/com/javabom/lotto/domain/shop/LottoMachine.java +++ b/src/main/java/com/javabom/lotto/domain/shop/LottoMachine.java @@ -1,7 +1,7 @@ package com.javabom.lotto.domain.shop; import com.javabom.lotto.domain.ticket.LottoTicket; -import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; import java.util.ArrayList; import java.util.List; @@ -14,9 +14,9 @@ public LottoMachine(LottoNumbersGenerator lottoNumbersGenerator) { this.lottoNumbersGenerator = lottoNumbersGenerator; } - public List createManualLottoTicket(List> manualLottoNumbers) { + public List createManualLottoTicket(List> manualLottoNumbers) { List manualLottoTickets = new ArrayList<>(); - for (List manualLottoNumber : manualLottoNumbers) { + for (List manualLottoNumber : manualLottoNumbers) { LottoTicket manualLottoTicket = new LottoTicket(manualLottoNumber); manualLottoTickets.add(manualLottoTicket); } diff --git a/src/main/java/com/javabom/lotto/domain/shop/LottoNumbersGenerator.java b/src/main/java/com/javabom/lotto/domain/shop/LottoNumbersGenerator.java index c641fd3..7a5a0cf 100644 --- a/src/main/java/com/javabom/lotto/domain/shop/LottoNumbersGenerator.java +++ b/src/main/java/com/javabom/lotto/domain/shop/LottoNumbersGenerator.java @@ -1,9 +1,9 @@ package com.javabom.lotto.domain.shop; -import com.javabom.lotto.domain.number.GameNumber; +import com.javabom.lotto.domain.number.OrderGameNumber; import java.util.List; public interface LottoNumbersGenerator { - List generate(); + 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 index b75bdbd..79ae93f 100644 --- a/src/main/java/com/javabom/lotto/domain/shop/LottoShop.java +++ b/src/main/java/com/javabom/lotto/domain/shop/LottoShop.java @@ -2,6 +2,7 @@ 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; @@ -15,10 +16,10 @@ public LottoShop(LottoMachine lottoMachine) { this.lottoMachine = lottoMachine; } - public void enter(Customer customer) { + public LottoTicketBundle buy(Customer customer) { List manualLottoTickets = lottoMachine.createManualLottoTicket(customer.getManualLottoNumbers()); List autoLottoTickets = lottoMachine.createAutoLottoTicket(customer.getAutoLottoTicketCount()); - customer.buy(Stream.concat(manualLottoTickets.stream(), autoLottoTickets.stream()) + 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 index 9e6e954..aafc8d2 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -1,53 +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; - private int matchedCount; + private final List lottoTicket; - private LottoTicket(List lottoTicket, int matchedCount) { + public LottoTicket(List lottoTicket) { checkDuplicate(lottoTicket); this.lottoTicket = lottoTicket; - this.matchedCount = matchedCount; } - public LottoTicket(List lottoTicket) { - this(lottoTicket, 0); - } - - private void checkDuplicate(List maybeLottoTicket) { + private void checkDuplicate(List maybeLottoTicket) { int size = getDeduplicationSize(maybeLottoTicket); - if (size != GameNumber.COUNT) { + if (size != COUNT) { throw new IllegalArgumentException(String.format("현재 개수: %d, 로또 번호의 갯수는 6개여야 합니다.", size)); } } - private int getDeduplicationSize(List maybeLottoTicket) { + private int getDeduplicationSize(List maybeLottoTicket) { return (int) maybeLottoTicket.stream() .distinct() .count(); } - public boolean contains(GameNumber gameNumber) { + public boolean contains(OrderGameNumber gameNumber) { return lottoTicket.contains(gameNumber); } - public GameNumber get(int idx) { - return lottoTicket.get(idx); - } - - public void match(GameNumber prizeNumber, int idx) { - if (prizeNumber.equals(lottoTicket.get(idx))) { - matchedCount++; - } + public boolean containsBonus(final OrderGameNumber bonusNumber) { + return lottoTicket.stream() + .anyMatch(number -> number.equalsOfNumber(bonusNumber)); } - public int getMatchedCount() { - return matchedCount; + 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 index 72fe1fe..7370f36 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketBundle.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketBundle.java @@ -7,6 +7,8 @@ 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 { @@ -16,17 +18,12 @@ public LottoTicketBundle(List LottoTicketBundle) { this.lottoTicketBundle = LottoTicketBundle; } - public LottoResultBundle match(PrizeNumbersBundle prizeNumberBundle) { - List lottoResults = new ArrayList<>(); - for (LottoTicket lottoTicket : lottoTicketBundle) { - LottoResult result = prizeNumberBundle.searchResult(lottoTicket); - lottoResults.add(result); - } - return new LottoResultBundle(lottoResults); - } + public LottoResultBundle getLottoResults(PrizeNumbersBundle prizeNumberBundle) { + List lottoResults = lottoTicketBundle.stream() + .map(prizeNumberBundle::getLottoResult) + .collect(Collectors.toList()); - public void addLottoTickets(List lottoTickets) { - lottoTicketBundle.addAll(lottoTickets); + return new LottoResultBundle(lottoResults); } public List get() { diff --git a/src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java b/src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java index 37b37e4..4d70603 100644 --- a/src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java +++ b/src/main/java/com/javabom/lotto/domain/utils/GameNumberConverter.java @@ -1,32 +1,19 @@ package com.javabom.lotto.domain.utils; -import com.javabom.lotto.domain.number.GameNumber; +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) { - checkCount(strGameNumbers.size()); - List maybeGameNumbers = strGameNumbers.stream() + public static List convert(List strGameNumbers) { + final AtomicInteger idx = new AtomicInteger(1); + + return strGameNumbers.stream() .distinct() - .map(GameNumber::valueOf) + .map(number -> OrderGameNumber.of(idx.getAndIncrement(), number.trim())) .collect(Collectors.toList()); - checkDuplicate(maybeGameNumbers.size()); - return maybeGameNumbers; - } - - private static void checkCount(int numberCount) { - if (numberCount != GameNumber.COUNT) { - throw new IllegalArgumentException(String.format("%d개의 당첨 번호를 입력하셨습니다. 당첨 번호는 총 6개여야 합니다.", numberCount)); - } } - - private static void checkDuplicate(int gameNumbersSize) { - if (gameNumbersSize != GameNumber.COUNT) { - throw new IllegalArgumentException("당첨 번호는 모두 달라야 합니다."); - } - } - } diff --git a/src/main/java/com/javabom/lotto/view/InputView.java b/src/main/java/com/javabom/lotto/view/InputView.java index f2b5aeb..a26b912 100644 --- a/src/main/java/com/javabom/lotto/view/InputView.java +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -7,7 +7,7 @@ public class InputView { - private static final String DELIMITER = ", "; + private static final String DELIMITER = ","; private final Scanner sc; public InputView(Scanner sc) { diff --git a/src/test/java/com/javabom/lotto/domain/CustomerTest.java b/src/test/java/com/javabom/lotto/domain/CustomerTest.java index 7d2953f..db1b7f1 100644 --- a/src/test/java/com/javabom/lotto/domain/CustomerTest.java +++ b/src/test/java/com/javabom/lotto/domain/CustomerTest.java @@ -1,14 +1,6 @@ package com.javabom.lotto.domain; -import com.javabom.lotto.domain.number.GameNumber; -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.shop.FIxedNumberGenerator; -import com.javabom.lotto.domain.shop.LottoMachine; -import com.javabom.lotto.domain.shop.LottoShop; 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 org.junit.jupiter.params.ParameterizedTest; @@ -47,55 +39,39 @@ void checkBuyManualLottoTicket() { .hasMessage(String.format("현재 보유 금액:%d, 필요한 금액:%d, 금액이 부족합니다.", amount, requiredAmount)); } - @DisplayName("구입할 수 있는 자동 로또 티켓 갯수를 반환한다.") - @ParameterizedTest - @CsvSource({"10000,8", "4500,2"}) - void getAutoLottoTicketCount(int amount, int expected) { + @DisplayName("입력한 수동 로또 번호가 6개가 아니면 IllegalArgumentException을 발생시킨다.") + @Test + void checkCount() { List> manualLottoNumbers = new ArrayList<>(); - manualLottoNumbers.add(Arrays.asList("1", "2", "3", "4", "5", "6")); - manualLottoNumbers.add(Arrays.asList("1", "2", "3", "4", "5", "6")); + List manualLottoNumber = Arrays.asList("1", "2", "3", "4", "5"); + manualLottoNumbers.add(manualLottoNumber); - Customer customer = new Customer(amount, manualLottoNumbers); - assertThat(customer.getAutoLottoTicketCount()).isEqualTo(expected); + assertThatThrownBy(() -> new Customer(1000, manualLottoNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(String.format("%d개의 수동 로또 번호를 입력하셨습니다. 수동 로또 번호는 총 6개여야 합니다.", manualLottoNumber.size())); } - @DisplayName("구입한 로또 티켓이 잘 들어왔는지 확인한다.") + @DisplayName("수동으로 구입한 로또 번호가 중복될 시 IllegalArgumentException을 발생시킨다.") @Test - void buy() { + void checkDuplicate() { List> manualLottoNumbers = new ArrayList<>(); + List manualLottoNumber = Arrays.asList("1", "2", "3", "4", "5", "5"); + manualLottoNumbers.add(manualLottoNumber); - Customer customer = new Customer(1000, manualLottoNumbers); - - LottoShop lottoShop = new LottoShop(new LottoMachine(new FIxedNumberGenerator())); - - lottoShop.enter(customer); - LottoTicketBundle lottoTicketBundle = customer.getLottoTicketBundle(); - - 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)); + assertThatThrownBy(() -> new Customer(1000, manualLottoNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("수동 로또 번호는 모두 달라야 합니다."); } - @DisplayName("로또 결과를 잘 반환하는지 확인한다.") - @Test - void confirmLottoResult(){ + @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")); - List prizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "8"); - PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle(prizeNumbers, "6"); - - Customer customer = new Customer(1000, manualLottoNumbers); - LottoMachine lottoMachine = new LottoMachine(new FIxedNumberGenerator()); - customer.buy(lottoMachine.createAutoLottoTicket(1)); - - LottoResultBundle lottoResultBundle = customer.confirmLottoResult(prizeNumberBundle); - - assertThat(lottoResultBundle.valueOf(0)).isEqualTo(LottoResult.SECOND); + 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 index f3a1e40..da2b6d8 100644 --- a/src/test/java/com/javabom/lotto/domain/number/GameNumberTest.java +++ b/src/test/java/com/javabom/lotto/domain/number/GameNumberTest.java @@ -15,4 +15,4 @@ void checkRange() { .isInstanceOf(IllegalArgumentException.class) .hasMessage(String.format("입력값: %s, 당첨 번호는 1-45 숫자만 가능합니다.", number)); } -} \ No newline at end of file +} 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 index 1b57722..2ca2209 100644 --- a/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersBundleTest.java +++ b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersBundleTest.java @@ -29,14 +29,14 @@ void checkDuplicate() { @DisplayName("당첨 번호와 보너스 번호의 일치 갯수의 값을 확인한다.") @ParameterizedTest @CsvSource({"10,SECOND", "20,THIRD"}) - void searchResult(String bonusNumber, String expected) { + 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.searchResult(lottoTicket); + 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 index 3773611..7689814 100644 --- a/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersTest.java +++ b/src/test/java/com/javabom/lotto/domain/number/PrizeNumbersTest.java @@ -1,6 +1,9 @@ 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; @@ -17,7 +20,20 @@ class PrizeNumbersTest { void contains(int number, boolean expected) { List strPrizeNumbers = Arrays.asList("1", "2", "3", "4", "5", "6"); PrizeNumbers prizeNumbers = new PrizeNumbers(strPrizeNumbers); - GameNumber bonusNumber = GameNumber.valueOf(number); + 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/shop/AutoLottoNumberGeneratorTest.java b/src/test/java/com/javabom/lotto/domain/shop/AutoLottoNumberGeneratorTest.java index 3601d65..44cc075 100644 --- a/src/test/java/com/javabom/lotto/domain/shop/AutoLottoNumberGeneratorTest.java +++ b/src/test/java/com/javabom/lotto/domain/shop/AutoLottoNumberGeneratorTest.java @@ -1,6 +1,7 @@ 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; @@ -14,13 +15,13 @@ public class AutoLottoNumberGeneratorTest { @Test void generate(){ AutoLottoNumberGenerator autoLottoNumberGenerator = new AutoLottoNumberGenerator(); - List actual = autoLottoNumberGenerator.generate(); + List actual = autoLottoNumberGenerator.generate(); - assertTrue(actual.get(0).value() >= GameNumber.MIN_NUMBER && actual.get(0).value() <= GameNumber.MAX_NUMBER); - assertTrue(actual.get(1).value() >= GameNumber.MIN_NUMBER && actual.get(1).value() <= GameNumber.MAX_NUMBER); - assertTrue(actual.get(2).value() >= GameNumber.MIN_NUMBER && actual.get(2).value() <= GameNumber.MAX_NUMBER); - assertTrue(actual.get(3).value() >= GameNumber.MIN_NUMBER && actual.get(3).value() <= GameNumber.MAX_NUMBER); - assertTrue(actual.get(4).value() >= GameNumber.MIN_NUMBER && actual.get(4).value() <= GameNumber.MAX_NUMBER); - assertTrue(actual.get(5).value() >= GameNumber.MIN_NUMBER && actual.get(5).value() <= GameNumber.MAX_NUMBER); + 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 similarity index 68% rename from src/test/java/com/javabom/lotto/domain/shop/FIxedNumberGenerator.java rename to src/test/java/com/javabom/lotto/domain/shop/FixedNumberGenerator.java index 77b535c..2805785 100644 --- a/src/test/java/com/javabom/lotto/domain/shop/FIxedNumberGenerator.java +++ b/src/test/java/com/javabom/lotto/domain/shop/FixedNumberGenerator.java @@ -1,17 +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{ +public class FixedNumberGenerator implements LottoNumbersGenerator{ List strGameNumbers = Arrays.asList("1","2","3","4","5","6"); @Override - public List generate() { + 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 index 2ab521d..0c38e45 100644 --- a/src/test/java/com/javabom/lotto/domain/shop/LottoMachineTest.java +++ b/src/test/java/com/javabom/lotto/domain/shop/LottoMachineTest.java @@ -1,5 +1,6 @@ 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; @@ -18,9 +19,9 @@ class LottoMachineTest { @Test void createManualLottoTicket() { List strGameNumbers = (Arrays.asList("1", "2", "3", "4", "5", "6")); - List gameNumbers = GameNumberConverter.convert(strGameNumbers); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); - List> manualLottoNumbers = new ArrayList<>(); + List> manualLottoNumbers = new ArrayList<>(); manualLottoNumbers.add(gameNumbers); LottoMachine lottoMachine = new LottoMachine(new AutoLottoNumberGenerator()); @@ -38,7 +39,7 @@ void createManualLottoTicket() { @DisplayName("랜덤 로또 번호 값이 잘 들어왔는지 확인한다.") @Test void createAutoLottoTicket() { - LottoMachine lottoMachine = new LottoMachine(new FIxedNumberGenerator()); + LottoMachine lottoMachine = new LottoMachine(new FixedNumberGenerator()); ListlottoTickets = lottoMachine.createAutoLottoTicket(1); LottoTicket actual = lottoTickets.get(0); diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketBundleTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketBundleTest.java index 58a2273..56b36f7 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketBundleTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketBundleTest.java @@ -16,7 +16,7 @@ class LottoTicketBundleTest { @DisplayName("알맞은 로또 결과를 반환하는지 확인한다.") @Test - public void match() { + public void getLottoResults() { LottoTicket lottoTicket1 = new LottoTicket( GameNumberConverter.convert(Arrays.asList("1", "2", "3", "4", "5", "6"))); LottoTicket lottoTicket2 = new LottoTicket( @@ -29,7 +29,7 @@ public void match() { List prizeNumbers = Arrays.asList("1", "2", "4", "7", "9", "11"); PrizeNumbersBundle prizeNumberBundle = new PrizeNumbersBundle(prizeNumbers, "30"); - LottoResultBundle lottoResultBundle = lottoTicketBundle.match(prizeNumberBundle); + LottoResultBundle lottoResultBundle = lottoTicketBundle.getLottoResults(prizeNumberBundle); assertThat(lottoResultBundle.valueOf(0)).isEqualTo(LottoResult.FAIL); assertThat(lottoResultBundle.valueOf(1)).isEqualTo(LottoResult.FOURTH); } diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java index 74f7b2d..9bee8bd 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java @@ -1,6 +1,8 @@ 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; @@ -18,9 +20,8 @@ class LottoTicketTest { @DisplayName("티켓이 갖고있는 로또 번호가 중복되면 IllegalArgumentException을 발생시킨다.") @Test void checkDuplicate() { - List gameNumbers = Arrays.asList( - GameNumber.valueOf(1),GameNumber.valueOf(1),GameNumber.valueOf(2), - GameNumber.valueOf(3),GameNumber.valueOf(4),GameNumber.valueOf(5)); + List strGameNumbers = Arrays.asList("1","2","3","4","5"); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); int expected = 5; assertThatThrownBy(() -> new LottoTicket(gameNumbers)) @@ -33,24 +34,24 @@ void checkDuplicate() { @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); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); LottoTicket lottoTicket = new LottoTicket(gameNumbers); GameNumber gameNumber = GameNumber.valueOf(number); - assertThat(lottoTicket.contains(gameNumber)).isEqualTo(expected); + assertThat(lottoTicket.contains(OrderGameNumber.of(number, gameNumber))).isEqualTo(expected); } - @DisplayName("로또 티켓의 번호와 당첨 번호의 번호가 일치하면 당첨 갯수를 증가시킨다.") + @DisplayName("티켓이 보너스 번호를 갖고있으면 true, 아니면 false를 반환한다.") @ParameterizedTest - @CsvSource({"3,1", "7,0"}) - void match(int number, int expected){ + @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); + List gameNumbers = GameNumberConverter.convert(strGameNumbers); LottoTicket lottoTicket = new LottoTicket(gameNumbers); - GameNumber prizeNumber = GameNumber.valueOf(number); - lottoTicket.match(prizeNumber, 2); - assertThat(lottoTicket.getMatchedCount()).isEqualTo(expected); + 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 index 5606878..5e6ab33 100644 --- a/src/test/java/com/javabom/lotto/domain/utils/GameNumberConverterTest.java +++ b/src/test/java/com/javabom/lotto/domain/utils/GameNumberConverterTest.java @@ -1,6 +1,7 @@ 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; @@ -13,17 +14,17 @@ public class GameNumberConverterTest { @DisplayName("로또 번호 숫자들을 잘 반환하는지 확인한다.") @Test - void convert(){ + void convert() { GameNumberConverter gameNumberConverter = new GameNumberConverter(); - List strGameNumber = Arrays.asList("1","2","3","4","5","6"); - List actual = gameNumberConverter.convert(strGameNumber); + List strGameNumber = Arrays.asList("1", "2", "3", "4", "5", "6"); + List actual = gameNumberConverter.convert(strGameNumber); - 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)); + 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)); } } From 90fb157431befccdfda0c81e7076dd3c6028f889 Mon Sep 17 00:00:00 2001 From: BangKiHyun Date: Mon, 15 Jun 2020 17:13:17 +0900 Subject: [PATCH 7/7] =?UTF-8?q?test:=20LottoShop=20Test=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LottoShop에 대한 테스트코드가 없었네요! 하하! 추가합니다!! --- .../lotto/domain/shop/LottoShopTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/test/java/com/javabom/lotto/domain/shop/LottoShopTest.java 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)); + } +}