From 8fd2e1b355aeba068c0943352ff4269602771b36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=B0=EC=A2=85=EC=A7=84?= Date: Sun, 8 Mar 2020 23:08:50 +0900 Subject: [PATCH 1/4] Creates Production Codes --- src/main/java/Application.java | 24 ++++++ .../java/controller/RacingApplication.java | 24 ------ src/main/java/controller/RacingGame.java | 66 --------------- .../StringOutOfBoundsException.java | 7 -- src/main/java/lotto/AutoLottoGenerator.java | 37 +++++++++ src/main/java/lotto/Lotto.java | 45 ++++++++++ src/main/java/lotto/LottoConverter.java | 11 +++ src/main/java/lotto/LottoGame.java | 82 +++++++++++++++++++ src/main/java/lotto/LottoNumber.java | 33 ++++++++ src/main/java/lotto/LottoRankResult.java | 30 +++++++ src/main/java/lotto/LottoStatistical.java | 11 +++ src/main/java/lotto/PurchaseMoney.java | 27 ++++++ src/main/java/lotto/Rank.java | 43 ++++++++++ src/main/java/lotto/WinningLotto.java | 27 ++++++ src/main/java/model/Car.java | 23 ------ src/main/java/util/RandomGenerator.java | 9 -- src/main/java/util/StringConverter.java | 28 +++++++ src/main/java/view/InputView.java | 38 +++++++-- src/main/java/view/ResultView.java | 48 ++++++++--- src/test/java/controller/RacingGameTest.java | 43 ---------- src/test/java/lotto/LottoNumberTest.java | 26 ++++++ src/test/java/lotto/LottoTest.java | 43 ++++++++++ src/test/java/lotto/PurchaseMoneyTest.java | 36 ++++++++ src/test/java/lotto/test.java | 17 ++++ src/test/java/model/CarTest.java | 39 --------- src/test/java/util/StringConverterTest.java | 34 ++++++++ 26 files changed, 623 insertions(+), 228 deletions(-) create mode 100644 src/main/java/Application.java delete mode 100644 src/main/java/controller/RacingApplication.java delete mode 100644 src/main/java/controller/RacingGame.java delete mode 100644 src/main/java/controller/StringOutOfBoundsException.java create mode 100644 src/main/java/lotto/AutoLottoGenerator.java create mode 100644 src/main/java/lotto/Lotto.java create mode 100644 src/main/java/lotto/LottoConverter.java create mode 100644 src/main/java/lotto/LottoGame.java create mode 100644 src/main/java/lotto/LottoNumber.java create mode 100644 src/main/java/lotto/LottoRankResult.java create mode 100644 src/main/java/lotto/LottoStatistical.java create mode 100644 src/main/java/lotto/PurchaseMoney.java create mode 100644 src/main/java/lotto/Rank.java create mode 100644 src/main/java/lotto/WinningLotto.java delete mode 100644 src/main/java/model/Car.java delete mode 100644 src/main/java/util/RandomGenerator.java create mode 100644 src/main/java/util/StringConverter.java delete mode 100644 src/test/java/controller/RacingGameTest.java create mode 100644 src/test/java/lotto/LottoNumberTest.java create mode 100644 src/test/java/lotto/LottoTest.java create mode 100644 src/test/java/lotto/PurchaseMoneyTest.java create mode 100644 src/test/java/lotto/test.java delete mode 100644 src/test/java/model/CarTest.java create mode 100644 src/test/java/util/StringConverterTest.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 0000000..5d24558 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,24 @@ +import lotto.*; +import view.ResultView; + +import java.util.List; + +import static util.StringConverter.*; +import static view.InputView.*; + +public class Application { + + public static void main(String[] args) { + PurchaseMoney purchaseMoney = new PurchaseMoney(inputPurchaseMoney()); + LottoGame lottoGame = new LottoGame(purchaseMoney, inputManualLottoCount()); + List manualLottos = convertStringsToLottos(inputLottos(lottoGame.getManualLottoCount())); + + lottoGame.setLottos(manualLottos); + lottoGame.setLottos(new AutoLottoGenerator().createLottos(lottoGame.getAutoLottoCount())); + + ResultView.showAllLottos(lottoGame); + lottoGame.setWinningLotto(new WinningLotto(convertStringToLotto(inputWinningLotto()),inputBonusNumber())); + ResultView.showRankResult(lottoGame.createRankResults()); + ResultView.showRateOfProfit(LottoStatistical.createRateOfProfit(lottoGame)); + } +} diff --git a/src/main/java/controller/RacingApplication.java b/src/main/java/controller/RacingApplication.java deleted file mode 100644 index 486c0c3..0000000 --- a/src/main/java/controller/RacingApplication.java +++ /dev/null @@ -1,24 +0,0 @@ -package controller; - -import model.Car; -import view.InputView; -import view.ResultView; - -import java.util.List; -import java.util.Scanner; - -public class RacingApplication { - public static void main(String[] args) throws StringOutOfBoundsException { - - Scanner scanner = new Scanner(System.in); - RacingGame racingGame = new RacingGame(); - - List cars = RacingGame.generateCars(InputView.inputCarName(scanner)); - int trialCount = InputView.inputNumberOfTrials(scanner); - for (int i = 0; i < trialCount; i++) { - racingGame.oneTrial(cars); - ResultView.printTrialResult(cars); - } - ResultView.printFinalWinner(racingGame, cars); - } -} diff --git a/src/main/java/controller/RacingGame.java b/src/main/java/controller/RacingGame.java deleted file mode 100644 index 65bc281..0000000 --- a/src/main/java/controller/RacingGame.java +++ /dev/null @@ -1,66 +0,0 @@ -package controller; - -import model.Car; -import util.RandomGenerator; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class RacingGame { - - public static final int CRITICAL_POINT = 5; - public static final int MAX_NAME_LENGTH = 5; - - public void oneTrial(List cars){ - for (Car car : cars){ - check(car); - } - } - - public void check(Car car){ - if (RandomGenerator.randInt(10) > CRITICAL_POINT){ - car.move(); - } - } - - public List searchWinners(List cars){ - List winnerNames = new ArrayList<>(); - int maxPosition = searchMaxPosition(cars); - - for (Car car : cars){ - checkWinner(car, winnerNames, maxPosition); - } - return winnerNames; - } - - public int searchMaxPosition(List cars){ - List carPosition = new ArrayList<>(); - - for (Car car : cars){ - carPosition.add(car.getPosition()); - } - return Collections.max(carPosition); - } - - public void checkWinner(Car car, List winnerNames, int maxPosition){ - if (car.getPosition() == maxPosition){ - winnerNames.add(car.getName()); - } - } - - public static List generateCars(String[] carNames) throws StringOutOfBoundsException{ - List cars = new ArrayList<>(); - for (String carName : carNames){ - checkNameLength(carName, cars); - } - return cars; - } - - public static void checkNameLength(String carName, List cars) throws StringOutOfBoundsException { - if(carName.length() > MAX_NAME_LENGTH){ - throw new StringOutOfBoundsException(); - } - cars.add(new Car(carName)); - } -} diff --git a/src/main/java/controller/StringOutOfBoundsException.java b/src/main/java/controller/StringOutOfBoundsException.java deleted file mode 100644 index e3b7d84..0000000 --- a/src/main/java/controller/StringOutOfBoundsException.java +++ /dev/null @@ -1,7 +0,0 @@ -package controller; - -public class StringOutOfBoundsException extends RuntimeException { - public StringOutOfBoundsException(){ - super("입력가능범위를 초과하였습니다. (Max Length = 5)"); - } -} diff --git a/src/main/java/lotto/AutoLottoGenerator.java b/src/main/java/lotto/AutoLottoGenerator.java new file mode 100644 index 0000000..2682a8a --- /dev/null +++ b/src/main/java/lotto/AutoLottoGenerator.java @@ -0,0 +1,37 @@ +package lotto; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class AutoLottoGenerator { + + private static final int LOTTO_SIZE = 6; + private static final int MIN_LOTTO_NUMBER = 1; + private static final int MAX_LOTTO_NUMBER = 45; + + private List integers; + + public AutoLottoGenerator() { + integers = new ArrayList<>(); + for (int number = MIN_LOTTO_NUMBER; number <= MAX_LOTTO_NUMBER; number++) { + integers.add(number); + } + } + + public List createLottos(int count) { + List lottos = new ArrayList<>(); + for (int iteration = 0; iteration < count; iteration++) { + lottos.add(new Lotto(createLottoNumbers())); + } + return lottos; + } + + private List createLottoNumbers() { + Collections.shuffle(integers); + return integers.subList(0, LOTTO_SIZE).stream() + .map(LottoNumber::new) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java new file mode 100644 index 0000000..5c7207b --- /dev/null +++ b/src/main/java/lotto/Lotto.java @@ -0,0 +1,45 @@ +package lotto; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class Lotto { + + private static final int LOTTO_NUMBER_COUNT = 6; + + private List lottoNumbers; + + public Lotto(List lottoNumbers) { + validateSize(lottoNumbers); + validateDuplication(lottoNumbers); + this.lottoNumbers = lottoNumbers; + sortLottoNumbers(this.lottoNumbers); + } + + private void validateSize(List lottoNumbers) { + if (lottoNumbers.size() != LOTTO_NUMBER_COUNT) { + throw new IllegalArgumentException("로또 번호는 6개로 이루어져야 합니다."); + } + } + + private void validateDuplication(List lottoNumbers) { + Set integers = new HashSet<>(lottoNumbers.stream() + .map(LottoNumber::getNumber) + .collect(Collectors.toList())); + if (integers.size() != LOTTO_NUMBER_COUNT) { + throw new IllegalArgumentException("로또 번호는 중복될 수 없습니다."); + } + } + + private void sortLottoNumbers(List lottoNumbers) { + Collections.sort(lottoNumbers); + } + + public List getLottoNumbers() { + return lottoNumbers; + } + +} diff --git a/src/main/java/lotto/LottoConverter.java b/src/main/java/lotto/LottoConverter.java new file mode 100644 index 0000000..13702cb --- /dev/null +++ b/src/main/java/lotto/LottoConverter.java @@ -0,0 +1,11 @@ +package lotto; + +import java.util.List; +import java.util.stream.Collectors; + +public class LottoConverter { + + public static List convertLottoToIntegers(Lotto lotto) { + return lotto.getLottoNumbers().stream().map(LottoNumber::getNumber).collect(Collectors.toList()); + } +} diff --git a/src/main/java/lotto/LottoGame.java b/src/main/java/lotto/LottoGame.java new file mode 100644 index 0000000..bf86635 --- /dev/null +++ b/src/main/java/lotto/LottoGame.java @@ -0,0 +1,82 @@ +package lotto; + +import java.util.*; +import java.util.stream.Collectors; + +public class LottoGame { + + private static final int LOTTO_PRICE = 1000; + + private PurchaseMoney purchaseMoney; + private int manualLottoCount; + private List lottos; + private WinningLotto winningLotto; + + public LottoGame(PurchaseMoney purchaseMoney, int manualLottoCount) { + this.purchaseMoney = purchaseMoney; + this.manualLottoCount = manualLottoCount; + this.lottos = new ArrayList<>(); + } + + public PurchaseMoney getPurchaseMoney() { + return purchaseMoney; + } + + public List getLottos() { + return lottos; + } + + public int getManualLottoCount() { + return manualLottoCount; + } + + public int getAutoLottoCount() { + return purchaseMoney.getMoney() / LOTTO_PRICE - manualLottoCount; + } + + public void setLottos(List lottos) { + this.lottos.addAll(lottos); + } + + public void setWinningLotto(WinningLotto winningLotto) { + this.winningLotto = winningLotto; + } + + public List createRankResults() { + List lottoRankResults = new ArrayList<>(); + for (int index = 0; index < Rank.values().length; index++) { + lottoRankResults.add(new LottoRankResult(Rank.values()[index])); + } + for (Lotto lotto : lottos) { + checkLotto(lotto, lottoRankResults); + } + return lottoRankResults; + } + + private void checkLotto(Lotto lotto, List lottoRankResults) { + List integers = LottoConverter.convertLottoToIntegers(lotto); + int countOfMatch = 0; + for (LottoNumber lottoNumber : winningLotto.getLotto().getLottoNumbers()) { + countOfMatch += checkNumberMatch(integers, lottoNumber.getNumber()); + } + boolean matchBonus = isMatchBonus(integers); + for (LottoRankResult lottoRankResult : lottoRankResults) { + lottoRankResult.win(Rank.valueOf(countOfMatch, matchBonus)); + } + + } + + private int checkNumberMatch(List integers, int number) { + if (integers.contains(number)) { + return 1; + } + return 0; + } + + private boolean isMatchBonus(List integers) { + if (integers.contains(winningLotto.getBonusNumber())) { + return true; + } + return false; + } +} diff --git a/src/main/java/lotto/LottoNumber.java b/src/main/java/lotto/LottoNumber.java new file mode 100644 index 0000000..df81738 --- /dev/null +++ b/src/main/java/lotto/LottoNumber.java @@ -0,0 +1,33 @@ +package lotto; + +public class LottoNumber implements Comparable{ + + + private static final int MAX_LOTTO_NUMBER = 45; + private static final int MIN_LOTTO_NUMBER = 1; + + private int number; + + public LottoNumber(int number) { + validateRange(number); + this.number = number; + } + + private void validateRange(int number) { + if (number > MAX_LOTTO_NUMBER || number < MIN_LOTTO_NUMBER) { + throw new IllegalArgumentException("로또 번호는 1이상 45이하의 자연수만 가능합니다."); + } + } + + public int getNumber() { + return number; + } + + @Override + public int compareTo(LottoNumber lottoNumber) { + if(this.number > lottoNumber.getNumber()){ + return 1; + } + return -1; + } +} diff --git a/src/main/java/lotto/LottoRankResult.java b/src/main/java/lotto/LottoRankResult.java new file mode 100644 index 0000000..71c2500 --- /dev/null +++ b/src/main/java/lotto/LottoRankResult.java @@ -0,0 +1,30 @@ +package lotto; + +public class LottoRankResult { + + Rank rank; + int count; + + public LottoRankResult(Rank rank) { + this.rank = rank; + this.count = 0; + } + + public Rank getRank() { + return rank; + } + + public int getCount() { + return count; + } + + public void win(Rank rank){ + if (this.rank == rank){ + count++; + } + } + + public int getWinningMoney() { + return rank.getWinningMoney() * count; + } +} diff --git a/src/main/java/lotto/LottoStatistical.java b/src/main/java/lotto/LottoStatistical.java new file mode 100644 index 0000000..0dfc22e --- /dev/null +++ b/src/main/java/lotto/LottoStatistical.java @@ -0,0 +1,11 @@ +package lotto; + +public class LottoStatistical { + public static double createRateOfProfit(LottoGame lottoGame) { + long profit = 0; + for (LottoRankResult rankResult : lottoGame.createRankResults()) { + profit += rankResult.getWinningMoney(); + } + return profit/(double)lottoGame.getPurchaseMoney().getMoney(); + } +} diff --git a/src/main/java/lotto/PurchaseMoney.java b/src/main/java/lotto/PurchaseMoney.java new file mode 100644 index 0000000..38edca6 --- /dev/null +++ b/src/main/java/lotto/PurchaseMoney.java @@ -0,0 +1,27 @@ +package lotto; + +public class PurchaseMoney { + + private static final int LOTTO_PRICE = 1000; + + private int money; + + public PurchaseMoney(int money) { + validateMoney(money); + this.money = money; + } + + private void validateMoney(int money) { + if (money < LOTTO_PRICE) { + throw new IllegalArgumentException("로또를 구입하기위한 최소금액은 천원입니다."); + } + + if (money % LOTTO_PRICE != 0) { + throw new IllegalArgumentException("로또 금액은 천원 단위여야만 합니다."); + } + } + + public int getMoney() { + return money; + } +} diff --git a/src/main/java/lotto/Rank.java b/src/main/java/lotto/Rank.java new file mode 100644 index 0000000..4fc4e04 --- /dev/null +++ b/src/main/java/lotto/Rank.java @@ -0,0 +1,43 @@ +package lotto; + +public enum Rank { + FIFTH(3, 5000), + FOURTH(4, 50000), + THIRD(4, 1500000), + SECOND(5, 30000000), + FIRST(6, 2000000000); + private int countOfMatch; + private int winningMoney; + + private Rank(int countOfMatch, int winningMoney) { + this.countOfMatch = countOfMatch; + this.winningMoney = winningMoney; + } + + public int getCountOfMatch() { + return countOfMatch; + } + + public int getWinningMoney() { + return winningMoney; + } + + public static Rank valueOf(int countOfMatch, boolean matchBonus) { + if (countOfMatch == 6) { + return Rank.FIRST; + } + if (countOfMatch == 5 && matchBonus) { + return Rank.SECOND; + } + if (countOfMatch == 5 && !matchBonus) { + return Rank.THIRD; + } + if (countOfMatch == 4) { + return Rank.FOURTH; + } + if (countOfMatch == 3) { + return Rank.FIFTH; + } + return null; + } +} diff --git a/src/main/java/lotto/WinningLotto.java b/src/main/java/lotto/WinningLotto.java new file mode 100644 index 0000000..c44bd07 --- /dev/null +++ b/src/main/java/lotto/WinningLotto.java @@ -0,0 +1,27 @@ +package lotto; + +public class WinningLotto { + + private Lotto lotto; + private int BonusNumber; + + public WinningLotto(Lotto lotto, int bonusNumber) { + this.lotto = lotto; + BonusNumber = bonusNumber; + validateBonusNumber(lotto, bonusNumber); + } + + private void validateBonusNumber(Lotto lotto, int BonusNumber) { + if(LottoConverter.convertLottoToIntegers(lotto).contains(BonusNumber)){ + throw new IllegalArgumentException("보너스 번호와 로또 번호는 중복되면 안됩니다."); + } + } + + public Lotto getLotto() { + return lotto; + } + + public int getBonusNumber() { + return BonusNumber; + } +} diff --git a/src/main/java/model/Car.java b/src/main/java/model/Car.java deleted file mode 100644 index 9770949..0000000 --- a/src/main/java/model/Car.java +++ /dev/null @@ -1,23 +0,0 @@ -package model; - -public class Car{ - - private String name; - private int position = 0; - - public Car(String name){ - this.name = name; - } - - public String getName() { - return name; - } - - public int getPosition(){ - return position; - } - - public void move(){ - position++; - } -} \ No newline at end of file diff --git a/src/main/java/util/RandomGenerator.java b/src/main/java/util/RandomGenerator.java deleted file mode 100644 index 414475f..0000000 --- a/src/main/java/util/RandomGenerator.java +++ /dev/null @@ -1,9 +0,0 @@ -package util; - -import java.util.Random; - -public class RandomGenerator { - public static int randInt(int range){ - return new Random().nextInt(range); - } -} diff --git a/src/main/java/util/StringConverter.java b/src/main/java/util/StringConverter.java new file mode 100644 index 0000000..1f600b4 --- /dev/null +++ b/src/main/java/util/StringConverter.java @@ -0,0 +1,28 @@ +package util; + +import lotto.Lotto; +import lotto.LottoNumber; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class StringConverter { + + public static List convertStringsToLottos(List strings) { + List lottos = new ArrayList<>(); + for (String string : strings) { + lottos.add(convertStringToLotto(string)); + } + return lottos; + } + + public static Lotto convertStringToLotto(String string) { + return new Lotto(Arrays.stream(string.split(",")) + .map(String::trim) + .map(Integer::new) + .map(LottoNumber::new) + .collect(Collectors.toList())); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index b8b3233..579103e 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,16 +1,40 @@ package view; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; -public class InputView{ +public class InputView { - public static String[] inputCarName(Scanner scanner){ - System.out.println("경주할 차의 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); - return scanner.nextLine().split(","); + private static final Scanner scanner = new Scanner(System.in); + + public static int inputPurchaseMoney() { + System.out.println("구입 금액을 입력해 주세요."); + return Integer.parseInt(scanner.nextLine()); + } + + public static int inputManualLottoCount() { + System.out.println("\n수동으로 구매할 로또 수를 입력해 주세요."); + return Integer.parseInt(scanner.nextLine()); + } + + public static List inputLottos(int manualLottoCount) { + List strings = new ArrayList<>(); + System.out.println("\n수동으로 구매할 번호를 입력해 주세요."); + for (int count = 0; count < manualLottoCount; count++) { + String string = scanner.nextLine(); + strings.add(string); + } + return strings; + } + + public static String inputWinningLotto() { + System.out.println("\n지난 주 당첨 번호를 입력해 주세요."); + return scanner.nextLine(); } - public static int inputNumberOfTrials(Scanner scanner){ - System.out.println("시도할 횟수는 몇회인가요?"); + public static int inputBonusNumber() { + System.out.println("보너스 볼을 입력해 주세요."); return scanner.nextInt(); } -} \ No newline at end of file +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 5cef077..5c8d8d5 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -1,21 +1,49 @@ package view; -import controller.RacingGame; -import model.Car; +import lotto.Lotto; +import lotto.LottoGame; +import lotto.LottoRankResult; +import lotto.Rank; -import java.util.Collections; import java.util.List; public class ResultView { - public static void printTrialResult(List cars){ - for (Car car : cars){ - System.out.print(car.getName() + " : " + String.join("", Collections.nCopies(car.getPosition(), "*")) + "\n"); + public static void showAllLottos(LottoGame lottoGame) { + System.out.println("\n수동으로 " + lottoGame.getManualLottoCount() + "장, 자동으로 " + lottoGame.getAutoLottoCount() + "개를 구매했습니다."); + for (Lotto lotto : lottoGame.getLottos()) { + showLotto(lotto); } - System.out.println(); } - public static void printFinalWinner(RacingGame racingGame, List cars){ - System.out.print(String.join(",", racingGame.searchWinners(cars)) + "가 최종 우승했습니다."); + private static void showLotto(Lotto lotto) { + System.out.print("["); + for (int index = 0; index < lotto.getLottoNumbers().size() - 1; index++) { + System.out.print(lotto.getLottoNumbers().get(index).getNumber() + ", "); + } + System.out.println(lotto.getLottoNumbers().get(lotto.getLottoNumbers().size() - 1).getNumber() + "]"); + } + + public static void showRankResult(List lottoRankResults) { + System.out.println("\n당첨 통계"); + System.out.println("----------"); + for (LottoRankResult lottoRankResult : lottoRankResults) { + showlottoRankResult(lottoRankResult); + } + } + + private static void showlottoRankResult(LottoRankResult lottoRankResult) { + if (lottoRankResult.getRank() == Rank.SECOND) { + System.out.println(lottoRankResult.getRank().getCountOfMatch() + "개 일치, 보너스 볼 일치(" + + lottoRankResult.getRank().getWinningMoney() + "원) - " + lottoRankResult.getCount() + "개"); + return; + } + System.out.println(lottoRankResult.getRank().getCountOfMatch()+"개 일치," + + " (" + lottoRankResult.getRank().getWinningMoney() + "원) - " + lottoRankResult.getCount() + "개"); } -} \ No newline at end of file + + public static void showRateOfProfit(Double rateOfProfit) { + System.out.println("총 수익률은 " + String.format("%.1f", rateOfProfit) + "%입니다."); + } + +} diff --git a/src/test/java/controller/RacingGameTest.java b/src/test/java/controller/RacingGameTest.java deleted file mode 100644 index 1d5540e..0000000 --- a/src/test/java/controller/RacingGameTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package controller; - -import model.Car; -import org.junit.Before; -import org.junit.Test; - -import java.util.List; - -import static org.junit.Assert.*; - -public class RacingGameTest { - - private RacingGame race; - private List cars; - private Car one; - private Car two; - private Car tre; - - @Before - public void setup(){ - one = new Car("one"); - two = new Car("two"); - tre = new Car("three"); - - cars.add(one); cars.add(two); cars.add(tre); - } - - @Test - public void searchMaxPositionTest(){ - assertEquals(0, race.searchMaxPosition(cars)); - - one.move(); one.move(); - assertEquals(2, race.searchMaxPosition(cars)); - - two.move(); two.move(); two.move(); - assertEquals(3, race.searchMaxPosition(cars)); - - one.move(); one.move(); - two.move(); two.move(); two.move(); - tre.move(); - assertEquals(6, race.searchMaxPosition(cars)); - } -} \ No newline at end of file diff --git a/src/test/java/lotto/LottoNumberTest.java b/src/test/java/lotto/LottoNumberTest.java new file mode 100644 index 0000000..16d633f --- /dev/null +++ b/src/test/java/lotto/LottoNumberTest.java @@ -0,0 +1,26 @@ +package lotto; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + + +public class LottoNumberTest { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Test + public void 범위에_맞지않는_로또번호_객체생성_예외테스트() { + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("로또 번호는 1이상 45이하의 자연수만 가능합니다."); + new LottoNumber(46); + new LottoNumber(-1); + } + + @Test + public void 범위에_맞는_로또번호_객체생성_테스트() { + new LottoNumber(1); + new LottoNumber(45); + } +} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java new file mode 100644 index 0000000..bf166df --- /dev/null +++ b/src/test/java/lotto/LottoTest.java @@ -0,0 +1,43 @@ +package lotto; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.util.Arrays; + +public class LottoTest { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Test + public void 일곱개이상의_로또번호를가진_객체생성시_예외테스트() { + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("로또 번호는 6개로 이루어져야 합니다."); + + new Lotto(Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6), new LottoNumber(7)) + ); + } + + @Test + public void 중복된_로또번호를가진_객체생성시_예외테스트() { + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("로또 번호는 중복될 수 없습니다."); + + new Lotto(Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(5)) + ); + } + + @Test + public void 정상적인_로또객체생성_테스트() { + new Lotto(Arrays.asList( + new LottoNumber(45), new LottoNumber(1), new LottoNumber(34), + new LottoNumber(22), new LottoNumber(17), new LottoNumber(44) + )); + } +} diff --git a/src/test/java/lotto/PurchaseMoneyTest.java b/src/test/java/lotto/PurchaseMoneyTest.java new file mode 100644 index 0000000..fd9bc86 --- /dev/null +++ b/src/test/java/lotto/PurchaseMoneyTest.java @@ -0,0 +1,36 @@ +package lotto; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class PurchaseMoneyTest { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + + @Test + public void 천원미만의_로또구입금액_객채생성_예외테스트() { + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("로또를 구입하기위한 최소금액은 천원입니다."); + + new PurchaseMoney(999); + } + + @Test + public void 천원단위가아닌_로또구입금액_객체생성_예외테스트() { + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("로또 금액은 천원 단위여야만 합니다."); + + new PurchaseMoney(1111); + } + + @Test + public void 정상적인_로또구입금액_객체생성_테스트() { + new PurchaseMoney(1000); + new PurchaseMoney(14000); + new PurchaseMoney(5000); + } + +} diff --git a/src/test/java/lotto/test.java b/src/test/java/lotto/test.java new file mode 100644 index 0000000..79caf4f --- /dev/null +++ b/src/test/java/lotto/test.java @@ -0,0 +1,17 @@ +package lotto; + +import org.junit.Test; + +import java.util.Arrays; + +public class test { + + @Test + public void test() { + Lotto lotto = new Lotto(Arrays.asList( + new LottoNumber(45), new LottoNumber(1), new LottoNumber(34), + new LottoNumber(22), new LottoNumber(17), new LottoNumber(44) + )); + System.out.println(lotto.getLottoNumbers().contains(45)); + } +} diff --git a/src/test/java/model/CarTest.java b/src/test/java/model/CarTest.java deleted file mode 100644 index 3f2d383..0000000 --- a/src/test/java/model/CarTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package model; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -public class CarTest { - - private Car tesla; - private Car kia; - private Car hyundai; - - @Before - public void setup(){ - tesla = new Car("tesla"); - kia = new Car("kia"); - hyundai = new Car("hyundai"); - } - - @Test - public void getNameTest() { - assertEquals("tesla", tesla.getName()); - assertEquals("kia", kia.getName()); - assertEquals("hyundai", hyundai.getName()); - } - - @Test - public void getPositionAndMoveTest(){ - tesla.move(); tesla.move(); tesla.move(); - assertEquals(3, tesla.getPosition()); - - kia.move(); kia.move(); - assertEquals(2, kia.getPosition()); - - hyundai.move(); - assertEquals(1, hyundai.getPosition()); - } -} \ No newline at end of file diff --git a/src/test/java/util/StringConverterTest.java b/src/test/java/util/StringConverterTest.java new file mode 100644 index 0000000..6d5e8e5 --- /dev/null +++ b/src/test/java/util/StringConverterTest.java @@ -0,0 +1,34 @@ +package util; + +import lotto.Lotto; +import lotto.LottoNumber; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class StringConverterTest { + + private static final int LOTTO_NUMBER_SIZE = 6; + + @Test + public void convertStringToLottosTest() { + List> lists = Arrays.asList( + Arrays.asList(8, 21, 23, 41, 42, 43), + Arrays.asList(3, 5, 11, 16, 32, 38)); + + List strings = Arrays.asList("8, 21, 23, 41, 42, 43", "3, 5, 11, 16, 32, 38"); + List lottos = StringConverter.convertStringsToLottos(strings); + + for (int i = 0; i < lottos.size(); i++) { + for (int j = 0; j < LOTTO_NUMBER_SIZE; j++) { + Lotto lotto = lottos.get(i); + LottoNumber lottoNumbers = lotto.getLottoNumbers().get(j); + + assertThat(lottoNumbers.getNumber()).isEqualTo(lists.get(i).get(j)); + } + } + } +} From 02bdf8d2b03d179fa2d045471987a6fd3d315fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=B0=EC=A2=85=EC=A7=84?= Date: Mon, 9 Mar 2020 10:50:59 +0900 Subject: [PATCH 2/4] Complete Production Codes --- build.gradle | 1 + src/main/java/Application.java | 5 +- src/main/java/lotto/LottoGame.java | 19 ++-- src/main/java/lotto/LottoRankResult.java | 2 +- src/main/java/lotto/LottoResult.java | 31 +++++++ src/main/java/lotto/LottoStatistical.java | 11 --- src/main/java/view/InputView.java | 5 +- src/main/java/view/ResultView.java | 20 ++-- .../java/lotto/AutoLottoGeneratorTest.java | 24 +++++ src/test/java/lotto/LottoConverterTest.java | 25 +++++ src/test/java/lotto/LottoGameTest.java | 93 +++++++++++++++++++ src/test/java/lotto/LottoRankResultTest.java | 32 +++++++ src/test/java/lotto/LottoResultTest.java | 27 ++++++ src/test/java/lotto/RankTest.java | 16 ++++ src/test/java/lotto/WinningLottoTest.java | 32 +++++++ src/test/java/lotto/test.java | 17 ---- src/test/java/util/StringConverterTest.java | 17 ++-- 17 files changed, 313 insertions(+), 64 deletions(-) create mode 100644 src/main/java/lotto/LottoResult.java delete mode 100644 src/main/java/lotto/LottoStatistical.java create mode 100644 src/test/java/lotto/AutoLottoGeneratorTest.java create mode 100644 src/test/java/lotto/LottoConverterTest.java create mode 100644 src/test/java/lotto/LottoGameTest.java create mode 100644 src/test/java/lotto/LottoRankResultTest.java create mode 100644 src/test/java/lotto/LottoResultTest.java create mode 100644 src/test/java/lotto/RankTest.java create mode 100644 src/test/java/lotto/WinningLottoTest.java delete mode 100644 src/test/java/lotto/test.java diff --git a/build.gradle b/build.gradle index 3a5654a..0ad823c 100644 --- a/build.gradle +++ b/build.gradle @@ -12,4 +12,5 @@ dependencies { compile('ch.qos.logback:logback-classic:1.2.3') testCompile('junit:junit:4.12') testCompile('org.assertj:assertj-core:3.9.0') + testCompile group: 'org.mockito', name: 'mockito-core', version: '3.3.0' } \ No newline at end of file diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 5d24558..2ac09ad 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -11,14 +11,13 @@ public class Application { public static void main(String[] args) { PurchaseMoney purchaseMoney = new PurchaseMoney(inputPurchaseMoney()); LottoGame lottoGame = new LottoGame(purchaseMoney, inputManualLottoCount()); - List manualLottos = convertStringsToLottos(inputLottos(lottoGame.getManualLottoCount())); + List manualLottos = convertStringsToLottos(inputLottoStrings(lottoGame.getManualLottoCount())); lottoGame.setLottos(manualLottos); lottoGame.setLottos(new AutoLottoGenerator().createLottos(lottoGame.getAutoLottoCount())); ResultView.showAllLottos(lottoGame); lottoGame.setWinningLotto(new WinningLotto(convertStringToLotto(inputWinningLotto()),inputBonusNumber())); - ResultView.showRankResult(lottoGame.createRankResults()); - ResultView.showRateOfProfit(LottoStatistical.createRateOfProfit(lottoGame)); + ResultView.showGameResult(lottoGame.createResult()); } } diff --git a/src/main/java/lotto/LottoGame.java b/src/main/java/lotto/LottoGame.java index bf86635..15085c5 100644 --- a/src/main/java/lotto/LottoGame.java +++ b/src/main/java/lotto/LottoGame.java @@ -1,7 +1,6 @@ package lotto; import java.util.*; -import java.util.stream.Collectors; public class LottoGame { @@ -42,15 +41,12 @@ public void setWinningLotto(WinningLotto winningLotto) { this.winningLotto = winningLotto; } - public List createRankResults() { - List lottoRankResults = new ArrayList<>(); - for (int index = 0; index < Rank.values().length; index++) { - lottoRankResults.add(new LottoRankResult(Rank.values()[index])); - } + public LottoResult createResult() { + LottoResult lottoResult = new LottoResult(purchaseMoney); for (Lotto lotto : lottos) { - checkLotto(lotto, lottoRankResults); + checkLotto(lotto, lottoResult.getLottoRankResults()); } - return lottoRankResults; + return lottoResult; } private void checkLotto(Lotto lotto, List lottoRankResults) { @@ -59,11 +55,10 @@ private void checkLotto(Lotto lotto, List lottoRankResults) { for (LottoNumber lottoNumber : winningLotto.getLotto().getLottoNumbers()) { countOfMatch += checkNumberMatch(integers, lottoNumber.getNumber()); } - boolean matchBonus = isMatchBonus(integers); + boolean matchBonus = isBonusMatch(integers); for (LottoRankResult lottoRankResult : lottoRankResults) { - lottoRankResult.win(Rank.valueOf(countOfMatch, matchBonus)); + lottoRankResult.increaseCount(Rank.valueOf(countOfMatch, matchBonus)); } - } private int checkNumberMatch(List integers, int number) { @@ -73,7 +68,7 @@ private int checkNumberMatch(List integers, int number) { return 0; } - private boolean isMatchBonus(List integers) { + private boolean isBonusMatch(List integers) { if (integers.contains(winningLotto.getBonusNumber())) { return true; } diff --git a/src/main/java/lotto/LottoRankResult.java b/src/main/java/lotto/LottoRankResult.java index 71c2500..3387f2d 100644 --- a/src/main/java/lotto/LottoRankResult.java +++ b/src/main/java/lotto/LottoRankResult.java @@ -18,7 +18,7 @@ public int getCount() { return count; } - public void win(Rank rank){ + public void increaseCount(Rank rank){ if (this.rank == rank){ count++; } diff --git a/src/main/java/lotto/LottoResult.java b/src/main/java/lotto/LottoResult.java new file mode 100644 index 0000000..4e1104f --- /dev/null +++ b/src/main/java/lotto/LottoResult.java @@ -0,0 +1,31 @@ +package lotto; + +import java.util.ArrayList; +import java.util.List; + +public class LottoResult { + + private List lottoRankResults; + private PurchaseMoney purchaseMoney; + + public LottoResult(PurchaseMoney purchaseMoney) { + this.purchaseMoney = purchaseMoney; + lottoRankResults = new ArrayList<>(); + for (int index = 0; index < Rank.values().length; index++) { + lottoRankResults.add(new LottoRankResult(Rank.values()[index])); + } + } + + public List getLottoRankResults() { + return lottoRankResults; + } + + public double createRateOfProfit() { + int profit = 0; + for (LottoRankResult lottoRankResult : lottoRankResults) { + profit += lottoRankResult.getWinningMoney(); + } + return (double) profit / purchaseMoney.getMoney(); + } + +} diff --git a/src/main/java/lotto/LottoStatistical.java b/src/main/java/lotto/LottoStatistical.java deleted file mode 100644 index 0dfc22e..0000000 --- a/src/main/java/lotto/LottoStatistical.java +++ /dev/null @@ -1,11 +0,0 @@ -package lotto; - -public class LottoStatistical { - public static double createRateOfProfit(LottoGame lottoGame) { - long profit = 0; - for (LottoRankResult rankResult : lottoGame.createRankResults()) { - profit += rankResult.getWinningMoney(); - } - return profit/(double)lottoGame.getPurchaseMoney().getMoney(); - } -} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 579103e..62eaefd 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -18,12 +18,11 @@ public static int inputManualLottoCount() { return Integer.parseInt(scanner.nextLine()); } - public static List inputLottos(int manualLottoCount) { + public static List inputLottoStrings(int manualLottoCount) { List strings = new ArrayList<>(); System.out.println("\n수동으로 구매할 번호를 입력해 주세요."); for (int count = 0; count < manualLottoCount; count++) { - String string = scanner.nextLine(); - strings.add(string); + strings.add(scanner.nextLine()); } return strings; } diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 5c8d8d5..1f5da6e 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -1,9 +1,6 @@ package view; -import lotto.Lotto; -import lotto.LottoGame; -import lotto.LottoRankResult; -import lotto.Rank; +import lotto.*; import java.util.List; @@ -24,25 +21,30 @@ private static void showLotto(Lotto lotto) { System.out.println(lotto.getLottoNumbers().get(lotto.getLottoNumbers().size() - 1).getNumber() + "]"); } - public static void showRankResult(List lottoRankResults) { + public static void showGameResult(LottoResult lottoResult) { System.out.println("\n당첨 통계"); System.out.println("----------"); + showRankResults(lottoResult.getLottoRankResults()); + showRateOfProfit(lottoResult.createRateOfProfit()); + } + + private static void showRankResults(List lottoRankResults) { for (LottoRankResult lottoRankResult : lottoRankResults) { - showlottoRankResult(lottoRankResult); + showRankResult(lottoRankResult); } } - private static void showlottoRankResult(LottoRankResult lottoRankResult) { + private static void showRankResult(LottoRankResult lottoRankResult) { if (lottoRankResult.getRank() == Rank.SECOND) { System.out.println(lottoRankResult.getRank().getCountOfMatch() + "개 일치, 보너스 볼 일치(" + lottoRankResult.getRank().getWinningMoney() + "원) - " + lottoRankResult.getCount() + "개"); return; } - System.out.println(lottoRankResult.getRank().getCountOfMatch()+"개 일치," + + System.out.println(lottoRankResult.getRank().getCountOfMatch() + "개 일치," + " (" + lottoRankResult.getRank().getWinningMoney() + "원) - " + lottoRankResult.getCount() + "개"); } - public static void showRateOfProfit(Double rateOfProfit) { + private static void showRateOfProfit(Double rateOfProfit) { System.out.println("총 수익률은 " + String.format("%.1f", rateOfProfit) + "%입니다."); } diff --git a/src/test/java/lotto/AutoLottoGeneratorTest.java b/src/test/java/lotto/AutoLottoGeneratorTest.java new file mode 100644 index 0000000..d7ede8c --- /dev/null +++ b/src/test/java/lotto/AutoLottoGeneratorTest.java @@ -0,0 +1,24 @@ +package lotto; + +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class AutoLottoGeneratorTest { + + AutoLottoGenerator autoLottoGenerator; + + @Before + public void setUp() { + autoLottoGenerator = new AutoLottoGenerator(); + } + + @Test + public void AutoLottoGenerator클래스_로또객체생성_테스트() { + List lottos = autoLottoGenerator.createLottos(3); + assertThat(lottos.size()).isEqualTo(3); + } +} diff --git a/src/test/java/lotto/LottoConverterTest.java b/src/test/java/lotto/LottoConverterTest.java new file mode 100644 index 0000000..ea908d3 --- /dev/null +++ b/src/test/java/lotto/LottoConverterTest.java @@ -0,0 +1,25 @@ +package lotto; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoConverterTest { + + @Test + public void convertLottoToIntegersTest() { + + List integers = Arrays.asList(45,1,34,22,17,44); + + Lotto lotto = new Lotto(Arrays.asList( + new LottoNumber(45), new LottoNumber(1), new LottoNumber(34), + new LottoNumber(22), new LottoNumber(17), new LottoNumber(44) + )); + assertThat(LottoConverter.convertLottoToIntegers(lotto).containsAll(integers)).isEqualTo(true); + } + + +} diff --git a/src/test/java/lotto/LottoGameTest.java b/src/test/java/lotto/LottoGameTest.java new file mode 100644 index 0000000..b8b7766 --- /dev/null +++ b/src/test/java/lotto/LottoGameTest.java @@ -0,0 +1,93 @@ +package lotto; + +import lotto.*; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class LottoGameTest { + + LottoGame lottoGame; + + @Before + public void setUp() { + lottoGame = new LottoGame(new PurchaseMoney(3000), 1); + List manualLottos = Arrays.asList(new Lotto(Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + ))); + lottoGame.setLottos(manualLottos); + AutoLottoGenerator autoLottoGenerator = mock(AutoLottoGenerator.class); + when(autoLottoGenerator.createLottos(eq(lottoGame.getAutoLottoCount()))) + .thenReturn(Arrays.asList( + new Lotto(Arrays.asList( + new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), + new LottoNumber(5), new LottoNumber(6), new LottoNumber(7))), + new Lotto(Arrays.asList( + new LottoNumber(3), new LottoNumber(4), new LottoNumber(5), + new LottoNumber(6), new LottoNumber(7), new LottoNumber(8))) + )); + lottoGame.setLottos(autoLottoGenerator.createLottos(lottoGame.getAutoLottoCount())); + lottoGame.setWinningLotto( + new WinningLotto(new Lotto(Arrays.asList( + new LottoNumber(1), new LottoNumber(3), new LottoNumber(5), + new LottoNumber(7), new LottoNumber(9), new LottoNumber(11) + )), 42)); + } + + @Test + public void getAutoLottoCountTest() { + assertThat(lottoGame.getAutoLottoCount()).isEqualTo(2); + } + + @Test + public void getManualLottoCountTest() { + assertThat(lottoGame.getManualLottoCount()).isEqualTo(1); + } + + @Test + public void getLottosTest() { + List> numberLists = Arrays.asList( + Arrays.asList(1, 2, 3, 4, 5, 6), + Arrays.asList(2, 3, 4, 5, 6, 7), + Arrays.asList(3, 4, 5, 6, 7, 8) + ); + for (int index = 0; index < lottoGame.getLottos().size(); index++) { + Lotto lotto = lottoGame.getLottos().get(index); + List integers = numberLists.get(index); + + assertThat(LottoConverter.convertLottoToIntegers(lotto)).isEqualTo(integers); + } + } + + @Test + public void createResultTest() { + LottoResult lottoResultTest = new LottoResult(lottoGame.getPurchaseMoney()); + for (int count = 0; count < 3; count++) { + lottoResultTest.getLottoRankResults().get(0).increaseCount(Rank.FIFTH); + } + LottoResult lottoResult = lottoGame.createResult(); + + assertThat(lottoResult.createRateOfProfit()).isEqualTo(lottoResultTest.createRateOfProfit()); + + List lottoRankResults = lottoResult.getLottoRankResults(); + List lottoRankResultsTest = lottoResultTest.getLottoRankResults(); + + for (int index = 0; index < lottoRankResults.size(); index++) { + Rank rank = lottoRankResults.get(index).getRank(); + int count = lottoRankResults.get(index).getCount(); + Rank rankTest = lottoRankResultsTest.get(index).getRank(); + int countTest = lottoRankResultsTest.get(index).getCount(); + + assertThat(rank).isEqualTo(rankTest); + assertThat(count).isEqualTo(countTest); + } + } +} diff --git a/src/test/java/lotto/LottoRankResultTest.java b/src/test/java/lotto/LottoRankResultTest.java new file mode 100644 index 0000000..d5c410f --- /dev/null +++ b/src/test/java/lotto/LottoRankResultTest.java @@ -0,0 +1,32 @@ +package lotto; + +import org.junit.Before; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoRankResultTest { + LottoRankResult lottoRankResult; + + @Before + public void setUp() { + lottoRankResult = new LottoRankResult(Rank.SECOND); + } + + @Test + public void increaseCountTest() { + lottoRankResult.increaseCount(Rank.SECOND); + lottoRankResult.increaseCount(Rank.THIRD); + assertThat(lottoRankResult.getCount()).isEqualTo(1); + lottoRankResult.increaseCount(Rank.FOURTH); + lottoRankResult.increaseCount(Rank.SECOND); + assertThat(lottoRankResult.getCount()).isEqualTo(2); + } + + @Test + public void getWinningMoneyTest() { + lottoRankResult.increaseCount(Rank.SECOND); + lottoRankResult.increaseCount(Rank.SECOND); + assertThat(lottoRankResult.getWinningMoney()).isEqualTo(60000000); + } +} diff --git a/src/test/java/lotto/LottoResultTest.java b/src/test/java/lotto/LottoResultTest.java new file mode 100644 index 0000000..4644cfb --- /dev/null +++ b/src/test/java/lotto/LottoResultTest.java @@ -0,0 +1,27 @@ +package lotto; + +import lotto.*; +import org.junit.Before; +import org.junit.Test; + + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoResultTest { + + LottoResult lottoResult; + + @Before + public void setUp() { + lottoResult = new LottoResult(new PurchaseMoney(3000)); + lottoResult.getLottoRankResults().get(2).increaseCount(Rank.THIRD); + lottoResult.getLottoRankResults().get(2).increaseCount(Rank.FOURTH); + lottoResult.getLottoRankResults().get(2).increaseCount(Rank.FIRST); + } + + @Test + public void createRateOfProfit() { + assertThat(lottoResult.createRateOfProfit()).isEqualTo((double)1500000/3000); + } + +} diff --git a/src/test/java/lotto/RankTest.java b/src/test/java/lotto/RankTest.java new file mode 100644 index 0000000..c72f2e9 --- /dev/null +++ b/src/test/java/lotto/RankTest.java @@ -0,0 +1,16 @@ +package lotto; + + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RankTest { + + @Test + public void valueOfTest() { + assertThat(Rank.valueOf(3,true)).isEqualTo(Rank.FIFTH); + assertThat(Rank.valueOf(2,true)).isEqualTo(null); + assertThat(Rank.valueOf(6,false)).isEqualTo(Rank.FIRST); + } +} diff --git a/src/test/java/lotto/WinningLottoTest.java b/src/test/java/lotto/WinningLottoTest.java new file mode 100644 index 0000000..8039277 --- /dev/null +++ b/src/test/java/lotto/WinningLottoTest.java @@ -0,0 +1,32 @@ +package lotto; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.util.Arrays; + +public class WinningLottoTest { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Test + public void 로또번호와_보너스번호중복시_당첨로또객체생성_예외테스트() { + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("보너스 번호와 로또 번호는 중복되면 안됩니다."); + + new WinningLotto(new Lotto(Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + )),4); + } + + @Test + public void 정상적인_당첨로또객체생성_테스트() { + new WinningLotto(new Lotto(Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + )),42); + } +} diff --git a/src/test/java/lotto/test.java b/src/test/java/lotto/test.java deleted file mode 100644 index 79caf4f..0000000 --- a/src/test/java/lotto/test.java +++ /dev/null @@ -1,17 +0,0 @@ -package lotto; - -import org.junit.Test; - -import java.util.Arrays; - -public class test { - - @Test - public void test() { - Lotto lotto = new Lotto(Arrays.asList( - new LottoNumber(45), new LottoNumber(1), new LottoNumber(34), - new LottoNumber(22), new LottoNumber(17), new LottoNumber(44) - )); - System.out.println(lotto.getLottoNumbers().contains(45)); - } -} diff --git a/src/test/java/util/StringConverterTest.java b/src/test/java/util/StringConverterTest.java index 6d5e8e5..f19719c 100644 --- a/src/test/java/util/StringConverterTest.java +++ b/src/test/java/util/StringConverterTest.java @@ -11,8 +11,6 @@ public class StringConverterTest { - private static final int LOTTO_NUMBER_SIZE = 6; - @Test public void convertStringToLottosTest() { List> lists = Arrays.asList( @@ -22,13 +20,16 @@ public void convertStringToLottosTest() { List strings = Arrays.asList("8, 21, 23, 41, 42, 43", "3, 5, 11, 16, 32, 38"); List lottos = StringConverter.convertStringsToLottos(strings); - for (int i = 0; i < lottos.size(); i++) { - for (int j = 0; j < LOTTO_NUMBER_SIZE; j++) { - Lotto lotto = lottos.get(i); - LottoNumber lottoNumbers = lotto.getLottoNumbers().get(j); + for (int index = 0; index < lottos.size(); index++) { + Lotto lotto = lottos.get(index); + lottoNumbersTest(lotto.getLottoNumbers(), lists.get(index)); + } + } - assertThat(lottoNumbers.getNumber()).isEqualTo(lists.get(i).get(j)); - } + private void lottoNumbersTest(List lottoNumbers, List integers) { + for (int index = 0; index < lottoNumbers.size(); index++) { + LottoNumber lottoNumber = lottoNumbers.get(index); + assertThat(lottoNumber.getNumber()).isEqualTo(integers.get(index)); } } } From 6773c6660a8a23b7b8be09757f9a2992f8938c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=B0=EC=A2=85=EC=A7=84?= Date: Tue, 17 Mar 2020 09:14:05 +0900 Subject: [PATCH 3/4] Refactor Lotto Game --- src/main/java/Application.java | 22 ++++--- src/main/java/lotto/Lotto.java | 6 -- src/main/java/lotto/LottoConverter.java | 11 ---- src/main/java/lotto/LottoGame.java | 59 ++++++++---------- ...oLottoGenerator.java => LottoMachine.java} | 25 ++++++-- src/main/java/lotto/LottoNumber.java | 9 +-- src/main/java/lotto/LottoRankResult.java | 4 +- src/main/java/lotto/LottoResult.java | 8 +-- src/main/java/lotto/Rank.java | 26 ++++---- src/main/java/lotto/TargetLottos.java | 19 ++++++ src/main/java/lotto/WinningLotto.java | 16 +++-- src/main/java/util/StringConverter.java | 28 --------- src/main/java/view/ResultView.java | 18 ++++-- .../java/lotto/AutoLottoGeneratorTest.java | 24 -------- src/test/java/lotto/LottoConverterTest.java | 25 -------- src/test/java/lotto/LottoGameTest.java | 61 +++++++++++-------- src/test/java/lotto/LottoMachineTest.java | 55 +++++++++++++++++ src/test/java/lotto/LottoNumberTest.java | 14 ++--- src/test/java/lotto/LottoResultTest.java | 5 +- src/test/java/lotto/LottoTest.java | 25 +++----- src/test/java/lotto/PurchaseMoneyTest.java | 21 +++---- src/test/java/lotto/RankTest.java | 2 + src/test/java/lotto/TargetLottosTest.java | 26 ++++++++ src/test/java/lotto/WinningLottoTest.java | 18 +++--- src/test/java/util/StringConverterTest.java | 35 ----------- 25 files changed, 270 insertions(+), 292 deletions(-) delete mode 100644 src/main/java/lotto/LottoConverter.java rename src/main/java/lotto/{AutoLottoGenerator.java => LottoMachine.java} (59%) create mode 100644 src/main/java/lotto/TargetLottos.java delete mode 100644 src/main/java/util/StringConverter.java delete mode 100644 src/test/java/lotto/AutoLottoGeneratorTest.java delete mode 100644 src/test/java/lotto/LottoConverterTest.java create mode 100644 src/test/java/lotto/LottoMachineTest.java create mode 100644 src/test/java/lotto/TargetLottosTest.java delete mode 100644 src/test/java/util/StringConverterTest.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 2ac09ad..479f32f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,23 +1,25 @@ import lotto.*; +import view.InputView; import view.ResultView; +import java.util.Arrays; import java.util.List; -import static util.StringConverter.*; -import static view.InputView.*; - public class Application { public static void main(String[] args) { - PurchaseMoney purchaseMoney = new PurchaseMoney(inputPurchaseMoney()); - LottoGame lottoGame = new LottoGame(purchaseMoney, inputManualLottoCount()); - List manualLottos = convertStringsToLottos(inputLottoStrings(lottoGame.getManualLottoCount())); + PurchaseMoney purchaseMoney = new PurchaseMoney(InputView.inputPurchaseMoney()); + LottoGame lottoGame = new LottoGame(purchaseMoney.getMoney(), InputView.inputManualLottoCount()); + List strings = InputView.inputLottoStrings(lottoGame.getManualLottoCount()); + - lottoGame.setLottos(manualLottos); - lottoGame.setLottos(new AutoLottoGenerator().createLottos(lottoGame.getAutoLottoCount())); + LottoMachine lottoMachine = new LottoMachine(); + TargetLottos targetLottos = new TargetLottos(lottoMachine.createManualLottos(strings), lottoMachine.createAutoLottos(lottoGame.getAutoLottoCount())); + lottoGame.registerTargetLottos(targetLottos); ResultView.showAllLottos(lottoGame); - lottoGame.setWinningLotto(new WinningLotto(convertStringToLotto(inputWinningLotto()),inputBonusNumber())); - ResultView.showGameResult(lottoGame.createResult()); + WinningLotto winningLotto = new WinningLotto(lottoMachine.createManualLotto(InputView.inputWinningLotto()), InputView.inputBonusNumber()); + ResultView.showGameResult(lottoGame.createResult(winningLotto)); + } } diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index 5c7207b..3be4d59 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -1,6 +1,5 @@ package lotto; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -16,7 +15,6 @@ public Lotto(List lottoNumbers) { validateSize(lottoNumbers); validateDuplication(lottoNumbers); this.lottoNumbers = lottoNumbers; - sortLottoNumbers(this.lottoNumbers); } private void validateSize(List lottoNumbers) { @@ -34,10 +32,6 @@ private void validateDuplication(List lottoNumbers) { } } - private void sortLottoNumbers(List lottoNumbers) { - Collections.sort(lottoNumbers); - } - public List getLottoNumbers() { return lottoNumbers; } diff --git a/src/main/java/lotto/LottoConverter.java b/src/main/java/lotto/LottoConverter.java deleted file mode 100644 index 13702cb..0000000 --- a/src/main/java/lotto/LottoConverter.java +++ /dev/null @@ -1,11 +0,0 @@ -package lotto; - -import java.util.List; -import java.util.stream.Collectors; - -public class LottoConverter { - - public static List convertLottoToIntegers(Lotto lotto) { - return lotto.getLottoNumbers().stream().map(LottoNumber::getNumber).collect(Collectors.toList()); - } -} diff --git a/src/main/java/lotto/LottoGame.java b/src/main/java/lotto/LottoGame.java index 15085c5..e8b2e10 100644 --- a/src/main/java/lotto/LottoGame.java +++ b/src/main/java/lotto/LottoGame.java @@ -6,23 +6,17 @@ public class LottoGame { private static final int LOTTO_PRICE = 1000; - private PurchaseMoney purchaseMoney; + private int autoLottoCount; private int manualLottoCount; - private List lottos; - private WinningLotto winningLotto; + private TargetLottos targetLottos; - public LottoGame(PurchaseMoney purchaseMoney, int manualLottoCount) { - this.purchaseMoney = purchaseMoney; + public LottoGame(int money, int manualLottoCount) { this.manualLottoCount = manualLottoCount; - this.lottos = new ArrayList<>(); + this.autoLottoCount = money / LOTTO_PRICE - manualLottoCount; } - public PurchaseMoney getPurchaseMoney() { - return purchaseMoney; - } - - public List getLottos() { - return lottos; + public TargetLottos getTargetLottos() { + return targetLottos; } public int getManualLottoCount() { @@ -30,47 +24,46 @@ public int getManualLottoCount() { } public int getAutoLottoCount() { - return purchaseMoney.getMoney() / LOTTO_PRICE - manualLottoCount; - } - - public void setLottos(List lottos) { - this.lottos.addAll(lottos); + return autoLottoCount; } - public void setWinningLotto(WinningLotto winningLotto) { - this.winningLotto = winningLotto; + public void registerTargetLottos(TargetLottos targetLottos) { + this.targetLottos = targetLottos; } - public LottoResult createResult() { - LottoResult lottoResult = new LottoResult(purchaseMoney); - for (Lotto lotto : lottos) { - checkLotto(lotto, lottoResult.getLottoRankResults()); + public LottoResult createResult(WinningLotto winningLotto) { + LottoResult lottoResult = new LottoResult((autoLottoCount + manualLottoCount) * LOTTO_PRICE); + for (Lotto lotto : targetLottos.getLottos()) { + checkLotto(lotto, lottoResult.getLottoRankResults(), winningLotto); } return lottoResult; } - private void checkLotto(Lotto lotto, List lottoRankResults) { - List integers = LottoConverter.convertLottoToIntegers(lotto); + private void checkLotto(Lotto lotto, List lottoRankResults, WinningLotto winningLotto) { int countOfMatch = 0; for (LottoNumber lottoNumber : winningLotto.getLotto().getLottoNumbers()) { - countOfMatch += checkNumberMatch(integers, lottoNumber.getNumber()); + countOfMatch += checkNumberMatch(lotto, lottoNumber.getNumber()); } - boolean matchBonus = isBonusMatch(integers); + boolean matchBonus = isBonusMatch(lotto, winningLotto.getBonusNumber()); for (LottoRankResult lottoRankResult : lottoRankResults) { lottoRankResult.increaseCount(Rank.valueOf(countOfMatch, matchBonus)); } } - private int checkNumberMatch(List integers, int number) { - if (integers.contains(number)) { - return 1; + private int checkNumberMatch(Lotto lotto, int number) { + for (int index = 0; index < lotto.getLottoNumbers().size(); index++) { + if (lotto.getLottoNumbers().get(index).getNumber() == number) { + return 1; + } } return 0; } - private boolean isBonusMatch(List integers) { - if (integers.contains(winningLotto.getBonusNumber())) { - return true; + private boolean isBonusMatch(Lotto lotto, int bonusNumber) { + for (int index = 0; index < lotto.getLottoNumbers().size(); index++) { + if (lotto.getLottoNumbers().get(index).getNumber() == bonusNumber) { + return true; + } } return false; } diff --git a/src/main/java/lotto/AutoLottoGenerator.java b/src/main/java/lotto/LottoMachine.java similarity index 59% rename from src/main/java/lotto/AutoLottoGenerator.java rename to src/main/java/lotto/LottoMachine.java index 2682a8a..0ed83ce 100644 --- a/src/main/java/lotto/AutoLottoGenerator.java +++ b/src/main/java/lotto/LottoMachine.java @@ -1,11 +1,12 @@ package lotto; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -public class AutoLottoGenerator { +public class LottoMachine { private static final int LOTTO_SIZE = 6; private static final int MIN_LOTTO_NUMBER = 1; @@ -13,14 +14,14 @@ public class AutoLottoGenerator { private List integers; - public AutoLottoGenerator() { + public LottoMachine() { integers = new ArrayList<>(); for (int number = MIN_LOTTO_NUMBER; number <= MAX_LOTTO_NUMBER; number++) { integers.add(number); } } - public List createLottos(int count) { + public List createAutoLottos(int count) { List lottos = new ArrayList<>(); for (int iteration = 0; iteration < count; iteration++) { lottos.add(new Lotto(createLottoNumbers())); @@ -28,10 +29,26 @@ public List createLottos(int count) { return lottos; } + public List createManualLottos(List strings) { + List lottos = new ArrayList<>(); + for (String string : strings) { + lottos.add(createManualLotto(string)); + } + return lottos; + } + + public Lotto createManualLotto(String string) { + return new Lotto(Arrays.stream(string.split(",")) + .map(String::trim) + .map(Integer::new) + .map(LottoNumber::new) + .collect(Collectors.toList())); + } + private List createLottoNumbers() { Collections.shuffle(integers); return integers.subList(0, LOTTO_SIZE).stream() .map(LottoNumber::new) .collect(Collectors.toList()); } -} +} \ No newline at end of file diff --git a/src/main/java/lotto/LottoNumber.java b/src/main/java/lotto/LottoNumber.java index df81738..56dced9 100644 --- a/src/main/java/lotto/LottoNumber.java +++ b/src/main/java/lotto/LottoNumber.java @@ -1,6 +1,6 @@ package lotto; -public class LottoNumber implements Comparable{ +public class LottoNumber { private static final int MAX_LOTTO_NUMBER = 45; @@ -23,11 +23,4 @@ public int getNumber() { return number; } - @Override - public int compareTo(LottoNumber lottoNumber) { - if(this.number > lottoNumber.getNumber()){ - return 1; - } - return -1; - } } diff --git a/src/main/java/lotto/LottoRankResult.java b/src/main/java/lotto/LottoRankResult.java index 3387f2d..7661019 100644 --- a/src/main/java/lotto/LottoRankResult.java +++ b/src/main/java/lotto/LottoRankResult.java @@ -18,8 +18,8 @@ public int getCount() { return count; } - public void increaseCount(Rank rank){ - if (this.rank == rank){ + public void increaseCount(Rank rank) { + if (this.rank == rank) { count++; } } diff --git a/src/main/java/lotto/LottoResult.java b/src/main/java/lotto/LottoResult.java index 4e1104f..1af0367 100644 --- a/src/main/java/lotto/LottoResult.java +++ b/src/main/java/lotto/LottoResult.java @@ -6,10 +6,10 @@ public class LottoResult { private List lottoRankResults; - private PurchaseMoney purchaseMoney; + private int money; - public LottoResult(PurchaseMoney purchaseMoney) { - this.purchaseMoney = purchaseMoney; + public LottoResult(int money) { + this.money = money; lottoRankResults = new ArrayList<>(); for (int index = 0; index < Rank.values().length; index++) { lottoRankResults.add(new LottoRankResult(Rank.values()[index])); @@ -25,7 +25,7 @@ public double createRateOfProfit() { for (LottoRankResult lottoRankResult : lottoRankResults) { profit += lottoRankResult.getWinningMoney(); } - return (double) profit / purchaseMoney.getMoney(); + return (double) profit / money; } } diff --git a/src/main/java/lotto/Rank.java b/src/main/java/lotto/Rank.java index 4fc4e04..a0f4323 100644 --- a/src/main/java/lotto/Rank.java +++ b/src/main/java/lotto/Rank.java @@ -1,9 +1,13 @@ package lotto; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + public enum Rank { FIFTH(3, 5000), FOURTH(4, 50000), - THIRD(4, 1500000), + THIRD(5, 1500000), SECOND(5, 30000000), FIRST(6, 2000000000); private int countOfMatch; @@ -23,20 +27,16 @@ public int getWinningMoney() { } public static Rank valueOf(int countOfMatch, boolean matchBonus) { - if (countOfMatch == 6) { - return Rank.FIRST; - } + List ranks = Arrays.stream(values()) + .filter(rank -> rank != SECOND) + .collect(Collectors.toList()); + if (countOfMatch == 5 && matchBonus) { - return Rank.SECOND; + return SECOND; } - if (countOfMatch == 5 && !matchBonus) { - return Rank.THIRD; - } - if (countOfMatch == 4) { - return Rank.FOURTH; - } - if (countOfMatch == 3) { - return Rank.FIFTH; + + if (countOfMatch >= 3) { + return ranks.get(countOfMatch - 3); } return null; } diff --git a/src/main/java/lotto/TargetLottos.java b/src/main/java/lotto/TargetLottos.java new file mode 100644 index 0000000..eb3f359 --- /dev/null +++ b/src/main/java/lotto/TargetLottos.java @@ -0,0 +1,19 @@ +package lotto; + +import java.util.ArrayList; +import java.util.List; + +public class TargetLottos { + + List lottos; + + public TargetLottos(List manualLottos, List autoLottos) { + this.lottos = new ArrayList<>(); + lottos.addAll(manualLottos); + lottos.addAll(autoLottos); + } + + public List getLottos() { + return lottos; + } +} diff --git a/src/main/java/lotto/WinningLotto.java b/src/main/java/lotto/WinningLotto.java index c44bd07..fba3ea8 100644 --- a/src/main/java/lotto/WinningLotto.java +++ b/src/main/java/lotto/WinningLotto.java @@ -1,19 +1,23 @@ package lotto; +import java.util.stream.Collectors; + public class WinningLotto { private Lotto lotto; - private int BonusNumber; + private int bonusNumber; public WinningLotto(Lotto lotto, int bonusNumber) { this.lotto = lotto; - BonusNumber = bonusNumber; + this.bonusNumber = bonusNumber; validateBonusNumber(lotto, bonusNumber); } - private void validateBonusNumber(Lotto lotto, int BonusNumber) { - if(LottoConverter.convertLottoToIntegers(lotto).contains(BonusNumber)){ - throw new IllegalArgumentException("보너스 번호와 로또 번호는 중복되면 안됩니다."); + private void validateBonusNumber(Lotto lotto, int bonusNumber) { + for (int index = 0; index < lotto.getLottoNumbers().size(); index++) { + if (lotto.getLottoNumbers().get(index).getNumber() == bonusNumber) { + throw new IllegalArgumentException("보너스 번호와 로또 번호는 중복되면 안됩니다."); + } } } @@ -22,6 +26,6 @@ public Lotto getLotto() { } public int getBonusNumber() { - return BonusNumber; + return bonusNumber; } } diff --git a/src/main/java/util/StringConverter.java b/src/main/java/util/StringConverter.java deleted file mode 100644 index 1f600b4..0000000 --- a/src/main/java/util/StringConverter.java +++ /dev/null @@ -1,28 +0,0 @@ -package util; - -import lotto.Lotto; -import lotto.LottoNumber; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class StringConverter { - - public static List convertStringsToLottos(List strings) { - List lottos = new ArrayList<>(); - for (String string : strings) { - lottos.add(convertStringToLotto(string)); - } - return lottos; - } - - public static Lotto convertStringToLotto(String string) { - return new Lotto(Arrays.stream(string.split(",")) - .map(String::trim) - .map(Integer::new) - .map(LottoNumber::new) - .collect(Collectors.toList())); - } -} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 1f5da6e..3e036a0 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -2,23 +2,32 @@ import lotto.*; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class ResultView { + private final static int PERCENTAGE = 100; + public static void showAllLottos(LottoGame lottoGame) { System.out.println("\n수동으로 " + lottoGame.getManualLottoCount() + "장, 자동으로 " + lottoGame.getAutoLottoCount() + "개를 구매했습니다."); - for (Lotto lotto : lottoGame.getLottos()) { + for (Lotto lotto : lottoGame.getTargetLottos().getLottos()) { showLotto(lotto); } } private static void showLotto(Lotto lotto) { + List integers = lotto.getLottoNumbers().stream() + .map(LottoNumber::getNumber) + .collect(Collectors.toList()); + Collections.sort(integers); + System.out.print("["); for (int index = 0; index < lotto.getLottoNumbers().size() - 1; index++) { - System.out.print(lotto.getLottoNumbers().get(index).getNumber() + ", "); + System.out.print(integers.get(index) + ", "); } - System.out.println(lotto.getLottoNumbers().get(lotto.getLottoNumbers().size() - 1).getNumber() + "]"); + System.out.println(integers.get(integers.size() - 1) + "]"); } public static void showGameResult(LottoResult lottoResult) { @@ -45,7 +54,6 @@ private static void showRankResult(LottoRankResult lottoRankResult) { } private static void showRateOfProfit(Double rateOfProfit) { - System.out.println("총 수익률은 " + String.format("%.1f", rateOfProfit) + "%입니다."); + System.out.println("총 수익률은 " + String.format("%.1f", rateOfProfit * PERCENTAGE) + "%입니다."); } - } diff --git a/src/test/java/lotto/AutoLottoGeneratorTest.java b/src/test/java/lotto/AutoLottoGeneratorTest.java deleted file mode 100644 index d7ede8c..0000000 --- a/src/test/java/lotto/AutoLottoGeneratorTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package lotto; - -import org.junit.Before; -import org.junit.Test; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class AutoLottoGeneratorTest { - - AutoLottoGenerator autoLottoGenerator; - - @Before - public void setUp() { - autoLottoGenerator = new AutoLottoGenerator(); - } - - @Test - public void AutoLottoGenerator클래스_로또객체생성_테스트() { - List lottos = autoLottoGenerator.createLottos(3); - assertThat(lottos.size()).isEqualTo(3); - } -} diff --git a/src/test/java/lotto/LottoConverterTest.java b/src/test/java/lotto/LottoConverterTest.java deleted file mode 100644 index ea908d3..0000000 --- a/src/test/java/lotto/LottoConverterTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package lotto; - -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class LottoConverterTest { - - @Test - public void convertLottoToIntegersTest() { - - List integers = Arrays.asList(45,1,34,22,17,44); - - Lotto lotto = new Lotto(Arrays.asList( - new LottoNumber(45), new LottoNumber(1), new LottoNumber(34), - new LottoNumber(22), new LottoNumber(17), new LottoNumber(44) - )); - assertThat(LottoConverter.convertLottoToIntegers(lotto).containsAll(integers)).isEqualTo(true); - } - - -} diff --git a/src/test/java/lotto/LottoGameTest.java b/src/test/java/lotto/LottoGameTest.java index b8b7766..351a32e 100644 --- a/src/test/java/lotto/LottoGameTest.java +++ b/src/test/java/lotto/LottoGameTest.java @@ -1,6 +1,5 @@ package lotto; -import lotto.*; import org.junit.Before; import org.junit.Test; @@ -15,17 +14,24 @@ public class LottoGameTest { LottoGame lottoGame; + WinningLotto winningLotto; @Before public void setUp() { - lottoGame = new LottoGame(new PurchaseMoney(3000), 1); - List manualLottos = Arrays.asList(new Lotto(Arrays.asList( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - ))); - lottoGame.setLottos(manualLottos); - AutoLottoGenerator autoLottoGenerator = mock(AutoLottoGenerator.class); - when(autoLottoGenerator.createLottos(eq(lottoGame.getAutoLottoCount()))) + + lottoGame = new LottoGame(3000, 1); + winningLotto = new WinningLotto(new Lotto(Arrays.asList( + new LottoNumber(1), new LottoNumber(3), new LottoNumber(5), + new LottoNumber(7), new LottoNumber(9), new LottoNumber(11) + )), 42); + + LottoMachine lottoMachine = mock(LottoMachine.class); + when(lottoMachine.createManualLottos(eq(Arrays.asList("1,2,3,4,5,6")))) + .thenReturn(Arrays.asList( + new Lotto(Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6))))); + when(lottoMachine.createAutoLottos(eq(lottoGame.getAutoLottoCount()))) .thenReturn(Arrays.asList( new Lotto(Arrays.asList( new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), @@ -34,12 +40,11 @@ public void setUp() { new LottoNumber(3), new LottoNumber(4), new LottoNumber(5), new LottoNumber(6), new LottoNumber(7), new LottoNumber(8))) )); - lottoGame.setLottos(autoLottoGenerator.createLottos(lottoGame.getAutoLottoCount())); - lottoGame.setWinningLotto( - new WinningLotto(new Lotto(Arrays.asList( - new LottoNumber(1), new LottoNumber(3), new LottoNumber(5), - new LottoNumber(7), new LottoNumber(9), new LottoNumber(11) - )), 42)); + + List manualLottos = lottoMachine.createManualLottos(Arrays.asList("1,2,3,4,5,6")); + TargetLottos targetLottos = new TargetLottos(manualLottos, lottoMachine.createAutoLottos(lottoGame.getAutoLottoCount())); + lottoGame.registerTargetLottos(targetLottos); + } @Test @@ -59,27 +64,30 @@ public void getLottosTest() { Arrays.asList(2, 3, 4, 5, 6, 7), Arrays.asList(3, 4, 5, 6, 7, 8) ); - for (int index = 0; index < lottoGame.getLottos().size(); index++) { - Lotto lotto = lottoGame.getLottos().get(index); + for (int index = 0; index < lottoGame.getTargetLottos().getLottos().size(); index++) { + Lotto lotto = lottoGame.getTargetLottos().getLottos().get(index); + List lottoNumbers = lotto.getLottoNumbers(); List integers = numberLists.get(index); - assertThat(LottoConverter.convertLottoToIntegers(lotto)).isEqualTo(integers); + for (int i = 0; i < lottoNumbers.size(); i++) { + assertThat(lottoNumbers.get(i).getNumber()).isEqualTo(integers.get(i)); + } } } @Test public void createResultTest() { - LottoResult lottoResultTest = new LottoResult(lottoGame.getPurchaseMoney()); - for (int count = 0; count < 3; count++) { - lottoResultTest.getLottoRankResults().get(0).increaseCount(Rank.FIFTH); - } - LottoResult lottoResult = lottoGame.createResult(); - - assertThat(lottoResult.createRateOfProfit()).isEqualTo(lottoResultTest.createRateOfProfit()); - + LottoResult lottoResult = lottoGame.createResult(winningLotto); List lottoRankResults = lottoResult.getLottoRankResults(); + + LottoResult lottoResultTest = new LottoResult(3000); List lottoRankResultsTest = lottoResultTest.getLottoRankResults(); + lottoRankResultsTest.get(0).increaseCount(Rank.FIFTH); + lottoRankResultsTest.get(0).increaseCount(Rank.FIFTH); + lottoRankResultsTest.get(0).increaseCount(Rank.FIFTH); + + assertThat(lottoResult.createRateOfProfit()).isEqualTo(lottoResultTest.createRateOfProfit()); for (int index = 0; index < lottoRankResults.size(); index++) { Rank rank = lottoRankResults.get(index).getRank(); int count = lottoRankResults.get(index).getCount(); @@ -91,3 +99,4 @@ public void createResultTest() { } } } + diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java new file mode 100644 index 0000000..1bf15d4 --- /dev/null +++ b/src/test/java/lotto/LottoMachineTest.java @@ -0,0 +1,55 @@ +package lotto; + +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 LottoMachineTest { + + LottoMachine lottoMachine; + + @Before + public void setUp() { + lottoMachine = new LottoMachine(); + } + + @Test + public void 자동생성로또_숫자범위테스트() { + List lottos = lottoMachine.createAutoLottos(100); + + for (Lotto lotto : lottos) { + for (int index = 0; index < lotto.getLottoNumbers().size(); index++) { + assertThat(lotto.getLottoNumbers().get(index).getNumber()) + .isLessThanOrEqualTo(45) + .isGreaterThanOrEqualTo(1); + } + } + } + + @Test + public void 자동생성로또_개수테스트() { + List lottos = lottoMachine.createAutoLottos(3); + + assertThat(lottos.size()).isEqualTo(3); + } + + @Test + public void 수동생성로또_테스트() { + List lottos = lottoMachine.createManualLottos(Arrays.asList("1,2,3,4,5,6", "7,8,9,10,11,12")); + List> lists = new ArrayList<>(Arrays.asList(Arrays.asList(1, 2, 3, 4, 5, 6), Arrays.asList(7, 8, 9, 10, 11, 12))); + + for (int i = 0; i < lottos.size(); i++) { + List lottoNumbers = lottos.get(i).getLottoNumbers(); + List integers = lists.get(i); + + for (int j = 0; j < lottoNumbers.size(); j++) { + assertThat(lottoNumbers.get(j).getNumber()).isEqualTo(integers.get(j)); + } + } + } +} diff --git a/src/test/java/lotto/LottoNumberTest.java b/src/test/java/lotto/LottoNumberTest.java index 16d633f..0e084cd 100644 --- a/src/test/java/lotto/LottoNumberTest.java +++ b/src/test/java/lotto/LottoNumberTest.java @@ -1,21 +1,17 @@ package lotto; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LottoNumberTest { - @Rule - public ExpectedException expectedException = ExpectedException.none(); - @Test public void 범위에_맞지않는_로또번호_객체생성_예외테스트() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("로또 번호는 1이상 45이하의 자연수만 가능합니다."); - new LottoNumber(46); - new LottoNumber(-1); + assertThatThrownBy(() -> { + new LottoNumber(46); + new LottoNumber(-1); + }).isInstanceOf(IllegalArgumentException.class).hasMessage("로또 번호는 1이상 45이하의 자연수만 가능합니다."); } @Test diff --git a/src/test/java/lotto/LottoResultTest.java b/src/test/java/lotto/LottoResultTest.java index 4644cfb..29da014 100644 --- a/src/test/java/lotto/LottoResultTest.java +++ b/src/test/java/lotto/LottoResultTest.java @@ -13,7 +13,7 @@ public class LottoResultTest { @Before public void setUp() { - lottoResult = new LottoResult(new PurchaseMoney(3000)); + lottoResult = new LottoResult(3000); lottoResult.getLottoRankResults().get(2).increaseCount(Rank.THIRD); lottoResult.getLottoRankResults().get(2).increaseCount(Rank.FOURTH); lottoResult.getLottoRankResults().get(2).increaseCount(Rank.FIRST); @@ -21,7 +21,6 @@ public void setUp() { @Test public void createRateOfProfit() { - assertThat(lottoResult.createRateOfProfit()).isEqualTo((double)1500000/3000); + assertThat(lottoResult.createRateOfProfit()).isEqualTo((double) 1500000 / 3000); } - } diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index bf166df..d21154e 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,36 +1,27 @@ package lotto; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import java.util.Arrays; -public class LottoTest { +import static org.assertj.core.api.Assertions.assertThatThrownBy; - @Rule - public ExpectedException expectedException = ExpectedException.none(); +public class LottoTest { @Test public void 일곱개이상의_로또번호를가진_객체생성시_예외테스트() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("로또 번호는 6개로 이루어져야 합니다."); - - new Lotto(Arrays.asList( + assertThatThrownBy(() -> new Lotto(Arrays.asList( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6), new LottoNumber(7)) - ); + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6), new LottoNumber(7))) + ).isInstanceOf(IllegalArgumentException.class).hasMessage("로또 번호는 6개로 이루어져야 합니다."); } @Test public void 중복된_로또번호를가진_객체생성시_예외테스트() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("로또 번호는 중복될 수 없습니다."); - - new Lotto(Arrays.asList( + assertThatThrownBy(() -> new Lotto(Arrays.asList( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(5)) - ); + new LottoNumber(4), new LottoNumber(5), new LottoNumber(5))) + ).isInstanceOf(IllegalArgumentException.class).hasMessage("로또 번호는 중복될 수 없습니다."); } @Test diff --git a/src/test/java/lotto/PurchaseMoneyTest.java b/src/test/java/lotto/PurchaseMoneyTest.java index fd9bc86..7cbbe29 100644 --- a/src/test/java/lotto/PurchaseMoneyTest.java +++ b/src/test/java/lotto/PurchaseMoneyTest.java @@ -1,29 +1,24 @@ package lotto; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; -public class PurchaseMoneyTest { - - @Rule - public ExpectedException expectedException = ExpectedException.none(); +import static org.assertj.core.api.Assertions.assertThatThrownBy; +public class PurchaseMoneyTest { @Test public void 천원미만의_로또구입금액_객채생성_예외테스트() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("로또를 구입하기위한 최소금액은 천원입니다."); - - new PurchaseMoney(999); + assertThatThrownBy(() -> new PurchaseMoney(999)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("로또를 구입하기위한 최소금액은 천원입니다."); } @Test public void 천원단위가아닌_로또구입금액_객체생성_예외테스트() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("로또 금액은 천원 단위여야만 합니다."); + assertThatThrownBy(() -> new PurchaseMoney(1111)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("로또 금액은 천원 단위여야만 합니다."); - new PurchaseMoney(1111); } @Test diff --git a/src/test/java/lotto/RankTest.java b/src/test/java/lotto/RankTest.java index c72f2e9..d9103b2 100644 --- a/src/test/java/lotto/RankTest.java +++ b/src/test/java/lotto/RankTest.java @@ -12,5 +12,7 @@ public void valueOfTest() { assertThat(Rank.valueOf(3,true)).isEqualTo(Rank.FIFTH); assertThat(Rank.valueOf(2,true)).isEqualTo(null); assertThat(Rank.valueOf(6,false)).isEqualTo(Rank.FIRST); + assertThat(Rank.valueOf(5,true)).isEqualTo(Rank.SECOND); + assertThat(Rank.valueOf(5,false)).isEqualTo(Rank.THIRD); } } diff --git a/src/test/java/lotto/TargetLottosTest.java b/src/test/java/lotto/TargetLottosTest.java new file mode 100644 index 0000000..7e97609 --- /dev/null +++ b/src/test/java/lotto/TargetLottosTest.java @@ -0,0 +1,26 @@ +package lotto; + +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +public class TargetLottosTest { + + LottoMachine lottoMachine; + List manualLottos; + List autoLottos; + + @Before + public void setUp() { + lottoMachine = new LottoMachine(); + manualLottos = lottoMachine.createManualLottos(Arrays.asList("1,2,3,4,5,6", "1,2,3,4,5,6")); + autoLottos = lottoMachine.createAutoLottos(4); + } + + @Test + public void 정상객체_생성테스트() { + new TargetLottos(manualLottos, autoLottos); + } +} diff --git a/src/test/java/lotto/WinningLottoTest.java b/src/test/java/lotto/WinningLottoTest.java index 8039277..a213cef 100644 --- a/src/test/java/lotto/WinningLottoTest.java +++ b/src/test/java/lotto/WinningLottoTest.java @@ -1,25 +1,23 @@ package lotto; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import java.util.Arrays; -public class WinningLottoTest { +import static org.assertj.core.api.Assertions.assertThatThrownBy; - @Rule - public ExpectedException expectedException = ExpectedException.none(); +public class WinningLottoTest { @Test public void 로또번호와_보너스번호중복시_당첨로또객체생성_예외테스트() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("보너스 번호와 로또 번호는 중복되면 안됩니다."); - new WinningLotto(new Lotto(Arrays.asList( + + assertThatThrownBy(() -> new WinningLotto(new Lotto(Arrays.asList( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - )),4); + )), 4) + ).isInstanceOf(IllegalArgumentException.class).hasMessage("보너스 번호와 로또 번호는 중복되면 안됩니다."); + } @Test @@ -27,6 +25,6 @@ public class WinningLottoTest { new WinningLotto(new Lotto(Arrays.asList( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - )),42); + )), 42); } } diff --git a/src/test/java/util/StringConverterTest.java b/src/test/java/util/StringConverterTest.java deleted file mode 100644 index f19719c..0000000 --- a/src/test/java/util/StringConverterTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package util; - -import lotto.Lotto; -import lotto.LottoNumber; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StringConverterTest { - - @Test - public void convertStringToLottosTest() { - List> lists = Arrays.asList( - Arrays.asList(8, 21, 23, 41, 42, 43), - Arrays.asList(3, 5, 11, 16, 32, 38)); - - List strings = Arrays.asList("8, 21, 23, 41, 42, 43", "3, 5, 11, 16, 32, 38"); - List lottos = StringConverter.convertStringsToLottos(strings); - - for (int index = 0; index < lottos.size(); index++) { - Lotto lotto = lottos.get(index); - lottoNumbersTest(lotto.getLottoNumbers(), lists.get(index)); - } - } - - private void lottoNumbersTest(List lottoNumbers, List integers) { - for (int index = 0; index < lottoNumbers.size(); index++) { - LottoNumber lottoNumber = lottoNumbers.get(index); - assertThat(lottoNumber.getNumber()).isEqualTo(integers.get(index)); - } - } -} From 823e2c3a03a0a4460119c1824a77528be45ad1ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=B0=EC=A2=85=EC=A7=84?= Date: Tue, 17 Mar 2020 09:19:24 +0900 Subject: [PATCH 4/4] Refactor Lotto Game --- src/main/java/Application.java | 2 -- src/main/java/lotto/WinningLotto.java | 2 -- src/test/java/lotto/LottoResultTest.java | 1 - src/test/java/lotto/RankTest.java | 1 - 4 files changed, 6 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 479f32f..b2e7fa7 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -2,7 +2,6 @@ import view.InputView; import view.ResultView; -import java.util.Arrays; import java.util.List; public class Application { @@ -20,6 +19,5 @@ public static void main(String[] args) { ResultView.showAllLottos(lottoGame); WinningLotto winningLotto = new WinningLotto(lottoMachine.createManualLotto(InputView.inputWinningLotto()), InputView.inputBonusNumber()); ResultView.showGameResult(lottoGame.createResult(winningLotto)); - } } diff --git a/src/main/java/lotto/WinningLotto.java b/src/main/java/lotto/WinningLotto.java index fba3ea8..a1c9cbd 100644 --- a/src/main/java/lotto/WinningLotto.java +++ b/src/main/java/lotto/WinningLotto.java @@ -1,7 +1,5 @@ package lotto; -import java.util.stream.Collectors; - public class WinningLotto { private Lotto lotto; diff --git a/src/test/java/lotto/LottoResultTest.java b/src/test/java/lotto/LottoResultTest.java index 29da014..2f65ffa 100644 --- a/src/test/java/lotto/LottoResultTest.java +++ b/src/test/java/lotto/LottoResultTest.java @@ -1,6 +1,5 @@ package lotto; -import lotto.*; import org.junit.Before; import org.junit.Test; diff --git a/src/test/java/lotto/RankTest.java b/src/test/java/lotto/RankTest.java index d9103b2..a0df408 100644 --- a/src/test/java/lotto/RankTest.java +++ b/src/test/java/lotto/RankTest.java @@ -1,6 +1,5 @@ package lotto; - import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat;