diff --git a/src/main/java/MainApplication.java b/src/main/java/MainApplication.java index b242d25d0c9..fbaafe478bc 100644 --- a/src/main/java/MainApplication.java +++ b/src/main/java/MainApplication.java @@ -1,6 +1,7 @@ import domain.LottoGame; import domain.LottoResult; -import domain.Price; +import domain.Money; +import domain.WinningLotto; import view.InputView; import view.ResultView; @@ -9,13 +10,14 @@ public class MainApplication { public static void main(String[] args) { int moneyAmount = InputView.getAmount(); - Price price = new Price(moneyAmount); + Money money = new Money(moneyAmount); - LottoGame lottoGame = new LottoGame(price.ticketCount()); + LottoGame lottoGame = new LottoGame(money.ticketCount()); ResultView.printLottos(lottoGame); - String winningNumbers = InputView.getWinningNumbers(); - LottoResult result = lottoGame.playingLotto(winningNumbers, price); - ResultView.printLottoResult(result); + WinningLotto winningLotto = new WinningLotto(InputView.getWinningNumbers(), InputView.getBonusNumber()); + LottoResult result = lottoGame.playingLotto(winningLotto); + + ResultView.printLottoResult(result, money); } } diff --git a/src/main/java/domain/Lotto.java b/src/main/java/domain/Lotto.java index 152712d9d01..36f535bed22 100644 --- a/src/main/java/domain/Lotto.java +++ b/src/main/java/domain/Lotto.java @@ -1,28 +1,13 @@ package domain; -import java.util.List; - public class Lotto { - private Numbers numbers; + private LottoNumbers lottoNumbers; - public static Lotto generateLotto(List integers) { - Lotto lotto = new Lotto(); - lotto.numbers = new Numbers(integers); - return lotto; + public Lotto (LottoNumbers numbers) { + this.lottoNumbers = numbers; } - public LottoResultStatus getLottoResultStatus(int[] winningNumbers) { - int containsWinningNumberCount = 0; - for (int number : winningNumbers) { - if(numbers.contains(number)) - containsWinningNumberCount ++; - } - - return LottoResultStatus.findByMatchCount(containsWinningNumberCount); + public LottoNumbers getLottoNumbers() { + return this.lottoNumbers; } - - public Numbers getNumbers() { - return this.numbers; - } - } diff --git a/src/main/java/domain/LottoGame.java b/src/main/java/domain/LottoGame.java index cbc79650813..8f255394e87 100644 --- a/src/main/java/domain/LottoGame.java +++ b/src/main/java/domain/LottoGame.java @@ -1,7 +1,6 @@ package domain; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class LottoGame { @@ -9,29 +8,22 @@ public class LottoGame { private List lottos; public LottoGame(int lottoCount) { - LottoGenerator generator = new LottoGenerator(); + LottoNumberGenerator generator = new LottoNumberGenerator(); this.lottos = new ArrayList<>(); int i=0; while (i < lottoCount) { - Lotto lotto = Lotto.generateLotto(generator.generateRandomNumber()); + Lotto lotto = new Lotto(generator.generateRandomNumber()); lottos.add(lotto); i ++; } } - public LottoResult playingLotto(String inputWinningNumbers, Price price) { - int[] intWinningNumbers = convertingWinningNumbers(inputWinningNumbers); - LottoResult lottoGameResult = new LottoResult(lottos, intWinningNumbers); - lottoGameResult.calculateBenefit(price); + public LottoResult playingLotto(WinningLotto winningLotto) { + LottoResult lottoGameResult = new LottoResult(lottos, winningLotto); return lottoGameResult; } - public int[] convertingWinningNumbers(String winningNumbers) { - String[] stringWinningNumbers = winningNumbers.replace(" ","").split(","); - return Arrays.stream(stringWinningNumbers).mapToInt(str-> Integer.parseInt(str)).toArray(); - } - public List lottos() { return lottos; } diff --git a/src/main/java/domain/LottoGenerator.java b/src/main/java/domain/LottoNumberGenerator.java similarity index 67% rename from src/main/java/domain/LottoGenerator.java rename to src/main/java/domain/LottoNumberGenerator.java index 94a1f312f9c..524489071cc 100644 --- a/src/main/java/domain/LottoGenerator.java +++ b/src/main/java/domain/LottoNumberGenerator.java @@ -4,34 +4,35 @@ import java.util.Collections; import java.util.List; -public class LottoGenerator { - private static final int LOTTO_NUMBER_LENTH = 6; +public class LottoNumberGenerator { + private static final int LOTTO_RANGE_MIN_NUM = 1; private static final int LOTTO_MAX_NUMBER = 46; private List lottoRangeNumbers; - public LottoGenerator() { + public LottoNumberGenerator() { lottoRangeNumbers = makeLottoNumberRange(); } - public List generateRandomNumber() { + public LottoNumbers generateRandomNumber() { Collections.shuffle(this.lottoRangeNumbers); List lottoNum = new ArrayList(); - for (int i=0; i < LOTTO_NUMBER_LENTH; i++) { + for (int i = 0; i < LottoNumbers.LOTTO_NUMBER_SIZE; i++) { lottoNum.add(this.lottoRangeNumbers.get(i)); } - return lottoNum; + return LottoNumbers.createInstance(lottoNum); } private static List makeLottoNumberRange() { List lottoNumberRange = new ArrayList<>(); - int i = 1; + int i = LOTTO_RANGE_MIN_NUM; while(i <= LOTTO_MAX_NUMBER) { lottoNumberRange.add(i); i ++; } + return lottoNumberRange; } } diff --git a/src/main/java/domain/LottoNumbers.java b/src/main/java/domain/LottoNumbers.java new file mode 100644 index 00000000000..8145c9a432a --- /dev/null +++ b/src/main/java/domain/LottoNumbers.java @@ -0,0 +1,38 @@ +package domain; + +import java.util.List; +import java.util.stream.Collectors; + +public class LottoNumbers { + public static final int LOTTO_NUMBER_SIZE = 6; + private List numbers; + + private LottoNumbers(List inputNumbers) { + List list = inputNumbers.stream().map(Number::createInstance).collect(Collectors.toList()); + this.numbers = list; + } + + public static LottoNumbers createInstance(List inputNumbers) { + if (inputNumbers.size() != LOTTO_NUMBER_SIZE) { + throw new IllegalArgumentException(); + } + + return new LottoNumbers(inputNumbers); + } + + public boolean contains(Number number) { + return numbers.stream().map(num -> num.equals(number)).anyMatch(num -> num.equals(true)); + } + + public String toString() { + StringBuffer resultString = new StringBuffer(); + resultString.append("["); + numbers.forEach(number -> resultString.append(number.toString()+" ")); + resultString.append("]"); + return resultString.toString(); + } + + public List getNumbers() { + return numbers; + } +} diff --git a/src/main/java/domain/LottoResult.java b/src/main/java/domain/LottoResult.java index dca63b15af9..d1b28551356 100644 --- a/src/main/java/domain/LottoResult.java +++ b/src/main/java/domain/LottoResult.java @@ -1,26 +1,22 @@ package domain; - import java.math.BigDecimal; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class LottoResult { - private List lottos; private Map lottoResults; - private BigDecimal benefitRate; - public LottoResult(List lottos, int[] winningNumbers) { + public LottoResult(List lottos, WinningLotto winningNumbers) { this.lottos = lottos; - this.benefitRate = BigDecimal.valueOf(0); this.lottoResults = new HashMap<>(); initMap(); - lottos.stream() - .map(lotto -> lotto.getLottoResultStatus(winningNumbers)) - .forEach(this::updateLottoResult); + + for (Lotto lotto : lottos) { + updateLottoResult(winningNumbers.result(lotto)); + } } public List getLottos(){ @@ -37,20 +33,20 @@ private void updateLottoResult(LottoResultStatus status) { lottoResults.put(status, lottoResults.get(status) + 1); } - public Map getLottoResults() { - return lottoResults; + public Integer getLottoResult(LottoResultStatus resultStatus) { + if (lottoResults.get(resultStatus) == null) { + return 0; + } + + return lottoResults.get(resultStatus); } - public void calculateBenefit(Price price) { + public BigDecimal calculateBenefit(Money money) { BigDecimal totalAmountByWinning = new BigDecimal(0); for(LottoResultStatus status : LottoResultStatus.values()){ totalAmountByWinning = totalAmountByWinning.add(LottoResultStatus.getWinnersPriceByStatus(lottoResults.get(status), status)); } - benefitRate = price.totalRateByWinning(totalAmountByWinning); - } - - public BigDecimal getBenefitRate() { - return benefitRate; + return money.totalRateByWinning(totalAmountByWinning); } } diff --git a/src/main/java/domain/LottoResultStatus.java b/src/main/java/domain/LottoResultStatus.java index 5f42f03edd6..c4e6df4f5f6 100644 --- a/src/main/java/domain/LottoResultStatus.java +++ b/src/main/java/domain/LottoResultStatus.java @@ -5,34 +5,43 @@ import java.util.List; public enum LottoResultStatus { - NONE(Arrays.asList(0,1,2), 0L), - WINNING_NUM_3(Arrays.asList(3), 5_000L), - WINNING_NUM_4(Arrays.asList(4), 50_000L), - WINNING_NUM_5(Arrays.asList(5), 150_000L), - WINNING_NUM_6(Arrays.asList(6), 2_000_000_000L); + NONE(Arrays.asList(0,1,2), false, 0L, ""), + WINNING_NUM_3(Arrays.asList(3), false, 5_000L, "3개 일치"), + WINNING_NUM_4(Arrays.asList(4), false, 50_000L, "4개 일치"), + WINNING_NUM_5(Arrays.asList(5), false, 1_500_000L, "5개 일치"), + WINNING_NUM_5_BONUS(Arrays.asList(5), true, 1_500_000L, "5개 일치, 보너스 볼 일치"), + WINNING_NUM_6(Arrays.asList(6), false, 2_000_000_000L, "6개 일치"); private List matchCounts; + private boolean bonusMatchYn; private Long winnersPrice; + private String description; - LottoResultStatus(List matchCount, Long winnersPrice) { + LottoResultStatus(List matchCount, boolean bonusMatchYn, Long winnersPrice, String description) { this.matchCounts = matchCount; + this.bonusMatchYn = bonusMatchYn; this.winnersPrice = winnersPrice; + this.description = description; } - public static LottoResultStatus findByMatchCount(int matchCount) { + public static LottoResultStatus findByMatchCount(int matchCount, boolean bonusYn) { return Arrays.stream(LottoResultStatus.values()) - .filter(matchCountGroup -> matchCountGroup.hasMatchCount(matchCount)) + .filter(matchCountGroup -> matchCountGroup.hasMatchCount(matchCount, bonusYn)) .findAny() .orElse(NONE); } - public boolean hasMatchCount(Integer integer) { - return matchCounts.contains(integer); + public boolean hasMatchCount(Integer matchCount, boolean bonusYn) { + return this.matchCounts.contains(matchCount) && this.bonusMatchYn == bonusYn; } - public static BigDecimal getWinnersPriceByStatus(int matchCount, LottoResultStatus status) { - return BigDecimal.valueOf(matchCount * status.winnersPrice); + public static BigDecimal getWinnersPriceByStatus(int lottoCount, LottoResultStatus status) { + return BigDecimal.valueOf(lottoCount * status.winnersPrice); + } + + public String findDescription() { + return this.description; } } diff --git a/src/main/java/domain/Price.java b/src/main/java/domain/Money.java similarity index 75% rename from src/main/java/domain/Price.java rename to src/main/java/domain/Money.java index f45b3f933e7..f3aa2e8de7f 100644 --- a/src/main/java/domain/Price.java +++ b/src/main/java/domain/Money.java @@ -3,12 +3,16 @@ import java.math.BigDecimal; import java.math.RoundingMode; -public class Price { +public class Money { private static final int ONE_TICKET_PRICE = 1_000; private int totalAmount; - public Price(int amount) { + public Money(int amount) { + if (amount < ONE_TICKET_PRICE) { + throw new IllegalArgumentException(); + } + totalAmount = amount; } diff --git a/src/main/java/domain/Number.java b/src/main/java/domain/Number.java new file mode 100644 index 00000000000..8e18f470ad4 --- /dev/null +++ b/src/main/java/domain/Number.java @@ -0,0 +1,33 @@ +package domain; + +import java.util.Objects; + +public class Number { + private static final int MININUM_NUMBER = 1; + private static final int MAXIMUM_NUMBER = 46; + private Integer number; + + private Number(Integer number) { + if (number < MININUM_NUMBER || number > MAXIMUM_NUMBER) { + throw new IllegalArgumentException(); + } + this.number = number; + } + + public static Number createInstance(Integer integerNumber) { + return new Number(integerNumber); + } + + @Override + public String toString() { + return Integer.toString(number); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Number)) return false; + Number number1 = (Number) o; + return Objects.equals(number, number1.number); + } +} diff --git a/src/main/java/domain/Numbers.java b/src/main/java/domain/Numbers.java deleted file mode 100644 index 09335264b9a..00000000000 --- a/src/main/java/domain/Numbers.java +++ /dev/null @@ -1,20 +0,0 @@ -package domain; - -import java.util.List; - -public class Numbers { - private List numbers; - - public Numbers(List numbers) { - this.numbers = numbers; - } - - public boolean contains(int number) { - return numbers.contains(number); - } - - @Override - public String toString() { - return numbers.toString(); - } -} diff --git a/src/main/java/domain/WinningLotto.java b/src/main/java/domain/WinningLotto.java new file mode 100644 index 00000000000..ea48a903add --- /dev/null +++ b/src/main/java/domain/WinningLotto.java @@ -0,0 +1,41 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class WinningLotto { + private static final int BONUS_AVAILABLE_MATCH_COUNT = 5; + + private LottoNumbers winningNumber; + private Number bonusNumber; + + public WinningLotto(String[] inputWinnigNumber, int bonusNumber) { + this.winningNumber = convertToLottoNumbers(inputWinnigNumber); + this.bonusNumber = Number.createInstance(bonusNumber); + } + + private LottoNumbers convertToLottoNumbers(String[] inputWinningNumber) { + List numbers = new ArrayList<>(); + for (String str: inputWinningNumber) { + numbers.add(Integer.parseInt(str)); + } + + return LottoNumbers.createInstance(numbers); + } + + public LottoResultStatus result(Lotto lotto) { //1,2,3,4,5 + int countainsWinningNumberCount = 0; + + for( Number number : winningNumber.getNumbers()) { + if(lotto.getLottoNumbers().contains(number)) { + countainsWinningNumberCount++; + } + } + + if (countainsWinningNumberCount == BONUS_AVAILABLE_MATCH_COUNT && lotto.getLottoNumbers().contains(bonusNumber)) { + return LottoResultStatus.findByMatchCount(countainsWinningNumberCount, true); + } + + return LottoResultStatus.findByMatchCount(countainsWinningNumberCount, false); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index a9a39cbf78d..da82dc9d488 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -11,10 +11,17 @@ public static int getAmount() { return inputAmount; } - public static String getWinningNumbers() { + public static String[] getWinningNumbers() { System.out.println("지난 주 당첨 번호를 입력해 주세요."); Scanner scanner = new Scanner(System.in); String winningNumbers = scanner.nextLine(); - return winningNumbers; + return winningNumbers.replace(" ","").split(","); + } + + public static int getBonusNumber() { + System.out.println("보너스 볼을 입력해 주세요."); + Scanner scanner = new Scanner(System.in); + int bonusNumber = scanner.nextInt(); + return bonusNumber; } } diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 0532becf9b0..b1b7fee6a96 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -1,23 +1,25 @@ package view; -import domain.LottoGame; -import domain.LottoResult; -import domain.LottoResultStatus; +import domain.*; + +import java.util.Arrays; public class ResultView { public static void printLottos(LottoGame result) { result.lottos().forEach(lotto -> { - System.out.println(lotto.getNumbers().toString()); + System.out.println(lotto.getLottoNumbers().toString()); }); } - public static void printLottoResult(LottoResult lottoResult) { + public static void printLottoResult(LottoResult lottoResult, Money money) { System.out.println("당첨 통계"); System.out.println("---------"); - System.out.println("3개 일치 (5000원)- " +lottoResult.getLottoResults().get(LottoResultStatus.WINNING_NUM_3)+ "개"); - System.out.println("4개 일치 (50000)- " +lottoResult.getLottoResults().get(LottoResultStatus.WINNING_NUM_4)+ "개"); - System.out.println("5개 일치 (1500000원)- " +lottoResult.getLottoResults().get(LottoResultStatus.WINNING_NUM_5)+ "개"); - System.out.println("6개 일치 (2000000원)- " +lottoResult.getLottoResults().get(LottoResultStatus.WINNING_NUM_6)+ "개\n"); - System.out.println("총 수익률은 "+lottoResult.getBenefitRate()+ "입니다. "); + + Arrays.stream(LottoResultStatus.values()).filter(status-> !status.equals(LottoResultStatus.NONE)).forEach(resultStatus -> { + System.out.println(resultStatus.findDescription() + " - " + lottoResult.getLottoResult(resultStatus)+" 개"); + }); + + System.out.println(); + System.out.println("총 수익률은 "+lottoResult.calculateBenefit(money)+ "입니다. "); } } diff --git a/src/test/java/domain/LottoGameTest.java b/src/test/java/domain/LottoGameTest.java index 40331b01d1f..0dd805afa7b 100644 --- a/src/test/java/domain/LottoGameTest.java +++ b/src/test/java/domain/LottoGameTest.java @@ -9,25 +9,19 @@ public class LottoGameTest { private static final int AMOUNT = 14_000; private static final int PRICE = 1_000; private static final int LOTTO_COUNT = AMOUNT / PRICE; + private static final String[] WINNING_NUMBERS = new String[]{"1","2","3","4","5","6"}; + private static final int BONUS_NUMBER = 7; private LottoGame lottoGame; - private Price price; + private Money money; @Before public void setUp() { - price = new Price(AMOUNT); + money = new Money(AMOUNT); lottoGame = new LottoGame(LOTTO_COUNT); } - @Test - public void 입력된_STRING_ARRAY_INT_ARRAY로_CONVERTING() { - String winningNumbers = "1, 2, 3, 4, 5, 6"; - int[] intWinningNumbers = {1,2,3,4,5,6}; - assertThat(lottoGame.convertingWinningNumbers(winningNumbers)).isEqualTo(intWinningNumbers); - } - @Test public void 금액에_맞는_LOTTO_갯수가_생성_되었는가() { - String winningNumbers = "1, 2, 3, 4, 5, 6"; - assertThat(lottoGame.playingLotto(winningNumbers, price).getLottos().size()).isEqualTo(LOTTO_COUNT); + assertThat(lottoGame.playingLotto(new WinningLotto(LottoGameTest.WINNING_NUMBERS, BONUS_NUMBER)).getLottos().size()).isEqualTo(LOTTO_COUNT); } } diff --git a/src/test/java/domain/LottoGeneratorTest.java b/src/test/java/domain/LottoGeneratorTest.java deleted file mode 100644 index 74e7661c3c8..00000000000 --- a/src/test/java/domain/LottoGeneratorTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package domain; - -import org.junit.Before; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -public class LottoGeneratorTest { - private final static int LOTTO_MAX_NUMBER = 46; - private LottoGenerator lottoGenerator; - - @Before - public void setUp() { - lottoGenerator = new LottoGenerator(); - } - - @Test - public void 생성된_랜덤숫자중_46을_초과하는_값이_있는지() { - List randomNumbers = lottoGenerator.generateRandomNumber(); - Collections.sort(randomNumbers); - int maximumNumber = randomNumbers.get(randomNumbers.size()-1); - assertThat(maximumNumber).isLessThanOrEqualTo(LOTTO_MAX_NUMBER); - } -} diff --git a/src/test/java/domain/LottoNumberGeneratorTest.java b/src/test/java/domain/LottoNumberGeneratorTest.java new file mode 100644 index 00000000000..d9bcdeaf27f --- /dev/null +++ b/src/test/java/domain/LottoNumberGeneratorTest.java @@ -0,0 +1,21 @@ +package domain; + +import org.junit.Before; +import org.junit.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class LottoNumberGeneratorTest { + private static final int LOTTO_NUMBER_SIZE = 6; + private LottoNumberGenerator lottoNumberGenerator; + + @Before + public void setUp() { + lottoNumberGenerator = new LottoNumberGenerator(); + } + + @Test + public void LOTTO_숫자_갯수_확인() { + assertThat(lottoNumberGenerator.generateRandomNumber().getNumbers().size()).isEqualTo(LOTTO_NUMBER_SIZE); + } +} diff --git a/src/test/java/domain/LottoNumbersTest.java b/src/test/java/domain/LottoNumbersTest.java new file mode 100644 index 00000000000..1e3dae3cb7f --- /dev/null +++ b/src/test/java/domain/LottoNumbersTest.java @@ -0,0 +1,29 @@ +package domain; + +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class LottoNumbersTest { + private LottoNumbers lottoNumbers; + + @Before + public void setUp() { + List numbers = Arrays.asList(1,2,3,4,5,6); + lottoNumbers = LottoNumbers.createInstance(numbers); + } + + @Test + public void 로또번호에_winning번호_포함되어있음() { + assertThat(lottoNumbers.contains(Number.createInstance(1))).isEqualTo(true); + } + + @Test + public void 로또번호에_winning번호_미포함되어있음() { + assertThat(lottoNumbers.contains(Number.createInstance(10))).isEqualTo(false); + } +} diff --git a/src/test/java/domain/LottoResultStatusTest.java b/src/test/java/domain/LottoResultStatusTest.java index 43594bf2357..6118351354f 100644 --- a/src/test/java/domain/LottoResultStatusTest.java +++ b/src/test/java/domain/LottoResultStatusTest.java @@ -7,37 +7,35 @@ public class LottoResultStatusTest { @Test - public void 당첨번호에_따른_상태_확인_당첨X_0개() { - assertThat(LottoResultStatus.findByMatchCount(0)).isEqualTo(LottoResultStatus.NONE); + public void 당첨번호에_따른_상태_확인_당첨X() { + assertThat(LottoResultStatus.findByMatchCount(0, false)).isEqualTo(LottoResultStatus.NONE); + assertThat(LottoResultStatus.findByMatchCount(1, false)).isEqualTo(LottoResultStatus.NONE); + assertThat(LottoResultStatus.findByMatchCount(2, false)).isEqualTo(LottoResultStatus.NONE); } @Test - public void 당첨번호에_따른_상태_확인_당첨X_1개() { - assertThat(LottoResultStatus.findByMatchCount(1)).isEqualTo(LottoResultStatus.NONE); + public void 당첨번호에_따른_상태_확인_당첨3() { + assertThat(LottoResultStatus.findByMatchCount(3, false)).isEqualTo(LottoResultStatus.WINNING_NUM_3); } @Test - public void 당첨번호에_따른_상태_확인_당첨X_2개() { - assertThat(LottoResultStatus.findByMatchCount(2)).isEqualTo(LottoResultStatus.NONE); + public void 당첨번호에_따른_상태_확인_당첨4() { + assertThat(LottoResultStatus.findByMatchCount(4, false)).isEqualTo(LottoResultStatus.WINNING_NUM_4); } @Test - public void 당첨번호에_따른_상태_확인_당첨3() { - assertThat(LottoResultStatus.findByMatchCount(3)).isEqualTo(LottoResultStatus.WINNING_NUM_3); + public void 당첨번호에_따른_상태_확인_당첨5() { + assertThat(LottoResultStatus.findByMatchCount(5, false)).isEqualTo(LottoResultStatus.WINNING_NUM_5); } @Test - public void 당첨번호에_따른_상태_확인_당첨4() { - assertThat(LottoResultStatus.findByMatchCount(4)).isEqualTo(LottoResultStatus.WINNING_NUM_4); + public void 당첨번호에_따른_상태_확인_당첨5_보너스번호_당첨() { + assertThat(LottoResultStatus.findByMatchCount(5, true)).isEqualTo(LottoResultStatus.WINNING_NUM_5_BONUS); } - @Test - public void 당첨번호에_따른_상태_확인_당첨5() { - assertThat(LottoResultStatus.findByMatchCount(5)).isEqualTo(LottoResultStatus.WINNING_NUM_5); - } @Test public void 당첨번호에_따른_상태_확인_당첨6() { - assertThat(LottoResultStatus.findByMatchCount(6)).isEqualTo(LottoResultStatus.WINNING_NUM_6); + assertThat(LottoResultStatus.findByMatchCount(6, false)).isEqualTo(LottoResultStatus.WINNING_NUM_6); } } diff --git a/src/test/java/domain/LottoResultTest.java b/src/test/java/domain/LottoResultTest.java index f8a1c13af5a..e4e9d4c5833 100644 --- a/src/test/java/domain/LottoResultTest.java +++ b/src/test/java/domain/LottoResultTest.java @@ -11,31 +11,32 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class LottoResultTest { - private static final int totalAmount = 1_000; - private static final int[] inputWinningNumbers = {1,3,5,6,7,8}; + private static final int TOTAL_AMOUNT = 1_000; + private static final String[] INPUT_WINNING_NUMBERS = new String[]{"1","3","5","6","7","8"}; + private static final int INPUT_BONUs_NUMBER = 9; private LottoResult lottoResult; - private Price price; + private Money money; @Before public void setUp() { - price = new Price(totalAmount); + money = new Money(TOTAL_AMOUNT); //3장 중 1장만 1등으로 되도록 확인. List lottoNumbers= Arrays.asList(1,3,5,6,7,8); List lottoNumbers2= Arrays.asList(9,10,11,12,13,14); List lottoNumbers3= Arrays.asList(9,10,11,12,13,14); - List lottos = Arrays.asList(Lotto.generateLotto(lottoNumbers) - , Lotto.generateLotto(lottoNumbers2) - , Lotto.generateLotto(lottoNumbers3)); + LottoNumbers numbers1 = LottoNumbers.createInstance(lottoNumbers); + LottoNumbers numbers2 = LottoNumbers.createInstance(lottoNumbers2); + LottoNumbers numbers3 = LottoNumbers.createInstance(lottoNumbers3); + List lottos = Arrays.asList(new Lotto(numbers1), new Lotto(numbers2), new Lotto(numbers3)); - lottoResult = new LottoResult(lottos, inputWinningNumbers); + lottoResult = new LottoResult(lottos, new WinningLotto(INPUT_WINNING_NUMBERS, INPUT_BONUs_NUMBER)); } @Test - public void LOTTO_RESULT_() { - lottoResult.calculateBenefit(price); - assertThat(lottoResult.getBenefitRate()) - .isEqualTo(LottoResultStatus.getWinnersPriceByStatus(1, LottoResultStatus.WINNING_NUM_6).divide(BigDecimal.valueOf(totalAmount), 2, RoundingMode.HALF_UP)); + public void 로또_수익률_계산() { + assertThat(lottoResult.calculateBenefit(money)) + .isEqualTo(LottoResultStatus.getWinnersPriceByStatus(1, LottoResultStatus.WINNING_NUM_6).divide(BigDecimal.valueOf(TOTAL_AMOUNT), 2, RoundingMode.HALF_UP)); } } diff --git a/src/test/java/domain/LottoTest.java b/src/test/java/domain/LottoTest.java index dbe7d58421e..67daf8cc41d 100644 --- a/src/test/java/domain/LottoTest.java +++ b/src/test/java/domain/LottoTest.java @@ -1,13 +1,10 @@ package domain; import org.junit.Before; -import org.junit.Test; import java.util.ArrayList; import java.util.List; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - public class LottoTest { private Lotto lotto; @@ -18,36 +15,8 @@ public void setUp() { for (int i=1 ; i<=6; i++) { nums.add(i); } - lotto = Lotto.generateLotto(nums); - } - - @Test - public void 당첨번호에_따른_상태_확인_당첨X() { - int[] winningNums = {1,2,7,8,9,10}; - assertThat(lotto.getLottoResultStatus(winningNums)).isEqualTo(LottoResultStatus.NONE); - } - - @Test - public void 당첨번호에_따른_상태_확인_3개_일치() { - int[] winningNums = {1,2,3,8,9,10}; - assertThat(lotto.getLottoResultStatus(winningNums)).isEqualTo(LottoResultStatus.WINNING_NUM_3); + LottoNumbers numbers = LottoNumbers.createInstance(nums); + lotto = new Lotto(numbers); } - @Test - public void 당첨번호에_따른_상태_확인_4개_일치() { - int[] winningNums = {1,2,3,4,9,10}; - assertThat(lotto.getLottoResultStatus(winningNums)).isEqualTo(LottoResultStatus.WINNING_NUM_4); - } - - @Test - public void 당첨번호에_따른_상태_확인_5개_일치() { - int[] winningNums = {1,2,3,4,5,10}; - assertThat(lotto.getLottoResultStatus(winningNums)).isEqualTo(LottoResultStatus.WINNING_NUM_5); - } - - @Test - public void 당첨번호에_따른_상태_확인_6개_일치() { - int[] winningNums = {1,2,3,4,5,6}; - assertThat(lotto.getLottoResultStatus(winningNums)).isEqualTo(LottoResultStatus.WINNING_NUM_6); - } } diff --git a/src/test/java/domain/PriceTest.java b/src/test/java/domain/MoneyTest.java similarity index 66% rename from src/test/java/domain/PriceTest.java rename to src/test/java/domain/MoneyTest.java index c79cbc3711c..83cab455e35 100644 --- a/src/test/java/domain/PriceTest.java +++ b/src/test/java/domain/MoneyTest.java @@ -8,25 +8,30 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -public class PriceTest { +public class MoneyTest { private static final int ONE_TICKET_PRICE = 1_000; private static final int TOTAL_AMOUNT = 14_000; private static final BigDecimal TOTAL_WINNING_PRICE = BigDecimal.valueOf(9_000_000); - private Price price; + private Money money; @Before public void setUp() { - price = new Price(TOTAL_AMOUNT); + money = new Money(TOTAL_AMOUNT); + } + + @Test(expected = IllegalArgumentException.class) + public void 티켓값_미만의_금액_입력() { + money = new Money(500); } @Test public void 구매_가능한_ticket_count_구하기() { - assertThat(price.ticketCount()).isEqualTo(TOTAL_AMOUNT/ONE_TICKET_PRICE); + assertThat(money.ticketCount()).isEqualTo(TOTAL_AMOUNT/ONE_TICKET_PRICE); } @Test public void 총_수익률_구하기() { - assertThat(price.totalRateByWinning(TOTAL_WINNING_PRICE)) + assertThat(money.totalRateByWinning(TOTAL_WINNING_PRICE)) .isEqualTo( TOTAL_WINNING_PRICE.divide(BigDecimal.valueOf(TOTAL_AMOUNT), 2, RoundingMode.HALF_UP)); } } diff --git a/src/test/java/domain/NumberTest.java b/src/test/java/domain/NumberTest.java new file mode 100644 index 00000000000..b27414b2948 --- /dev/null +++ b/src/test/java/domain/NumberTest.java @@ -0,0 +1,26 @@ +package domain; + +import org.junit.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class NumberTest { + + @Test(expected = IllegalArgumentException.class) + public void 로또번호_범위에_포함되지_않는_숫자_입력() { + Number.createInstance(0); + Number.createInstance(47); + } + + @Test + public void 숫자_일치여부_확인_일치할_때() { + Number number = Number.createInstance(6); + assertThat(number.equals(Number.createInstance(6))).isEqualTo(true); + } + + @Test + public void 숫자_일치여부_확인_불일치할_때() { + Number number = Number.createInstance(7); + assertThat(number.equals(Number.createInstance(6))).isEqualTo(false); + } +} diff --git a/src/test/java/domain/WinningLottoTest.java b/src/test/java/domain/WinningLottoTest.java new file mode 100644 index 00000000000..d6fee14c1de --- /dev/null +++ b/src/test/java/domain/WinningLottoTest.java @@ -0,0 +1,65 @@ +package domain; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class WinningLottoTest { + private static final String[] WINNING_NUMBERS = new String[]{"1","2","3","4","5","6"}; + private static final int BONUS_NUMBER = 7; + private WinningLotto winningLotto; + + @Before + public void SET_UP() { + winningLotto = new WinningLotto(WINNING_NUMBERS, BONUS_NUMBER); + } + + public Lotto makeLottoInstance(List inputNumbers) { + List numbers = new ArrayList<>(); + for( int number : inputNumbers) { + numbers.add(Number.createInstance(number)); + } + + return new Lotto(LottoNumbers.createInstance(inputNumbers)); + } + @Test + public void 당첨번호에_따른_상태_확인_당첨X() { + List inputNumbers = Arrays.asList(1,7,8,9,10,11); + assertThat(winningLotto.result(makeLottoInstance(inputNumbers))).isEqualTo(LottoResultStatus.NONE); + } + + @Test + public void 당첨번호에_따른_상태_확인_3개_일치() { + List inputNumbers = Arrays.asList(1,2,3,9,10,11); + assertThat(winningLotto.result(makeLottoInstance(inputNumbers))).isEqualTo(LottoResultStatus.WINNING_NUM_3); + } + + @Test + public void 당첨번호에_따른_상태_확인_4개_일치() { + List inputNumbers = Arrays.asList(1,2,3,4,10,11); + assertThat(winningLotto.result(makeLottoInstance(inputNumbers))).isEqualTo(LottoResultStatus.WINNING_NUM_4); + } + + @Test + public void 당첨번호에_따른_상태_확인_5개_일치() { + List inputNumbers = Arrays.asList(1,2,3,4,5,11); + assertThat(winningLotto.result(makeLottoInstance(inputNumbers))).isEqualTo(LottoResultStatus.WINNING_NUM_5); + } + + @Test + public void 당첨번호에_따른_상태_확인_5개_일치_보너스번호_일치() { + List inputNumbers = Arrays.asList(1,2,3,4,5,7); + assertThat(winningLotto.result(makeLottoInstance(inputNumbers))).isEqualTo(LottoResultStatus.WINNING_NUM_5_BONUS); + } + + @Test + public void 당첨번호에_따른_상태_확인_6개_일치() { + List inputNumbers = Arrays.asList(1,2,3,4,5,6); + assertThat(winningLotto.result(makeLottoInstance(inputNumbers))).isEqualTo(LottoResultStatus.WINNING_NUM_6); + } +}