From e74d2e9985cc2cbc390c42a08334666f4501e55e Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 26 Nov 2023 22:57:15 +0900 Subject: [PATCH 01/10] =?UTF-8?q?Docs:=20=EA=B5=AC=ED=98=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2d..7c32e9b3290 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,57 @@ +# 구현 기능 목록 + +- [ ] 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. + + +- [ ] 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. + - [ ] 자동차 이름은 쉼표(,)를 기준으로 구분하며, + - [ ] 이름은 5자 이하만 가능하다. + + +- [ ] 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. + - [ ] 1 이상의 정수 여야 함 + + +- [ ] 전진하는 조건 : 0에서 9 사이에서 무작위 값을 구한 후, 무작위 값이 4 이상일 경우 + - [ ] `Randoms.pickNumberInRange(0,9);` 사용 + + +- [ ] 자동차 경주 게임을 완료한 후 우승자를 알려준다. 우승자는 한 명 이상일 수 있다. + - [ ] 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. + + +- [ ] 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다. + + + +--- +전체 흐름 예시 +``` +경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분) +pobi,woni,jun +시도할 회수는 몇회인가요? +5 + +실행 결과 +pobi : - +woni : +jun : - + +pobi : -- +woni : - +jun : -- + +pobi : --- +woni : -- +jun : --- + +pobi : ---- +woni : --- +jun : ---- + +pobi : ----- +woni : ---- +jun : ----- + +최종 우승자 : pobi, jun +``` \ No newline at end of file From 32e6a428c281cc46ed4be43908a25bd87a901edb Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 26 Nov 2023 23:27:57 +0900 Subject: [PATCH 02/10] =?UTF-8?q?Feat:=20=EC=9D=B4=EB=A6=84=EC=9D=84=20?= =?UTF-8?q?=EA=B0=80=EC=A7=84=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 ++- src/main/java/racingcar/Application.java | 7 +- .../racingcar/controller/MainController.java | 64 +++++++++++++++++++ src/main/java/racingcar/domain/Car.java | 19 ++++++ src/main/java/racingcar/domain/Cars.java | 15 +++++ .../racingcar/exception/ErrorMessage.java | 19 ++++++ .../racingcar/utils/CarNamesValidator.java | 54 ++++++++++++++++ src/main/java/racingcar/view/InputView.java | 28 ++++++++ src/main/java/racingcar/view/OutputView.java | 18 ++++++ 9 files changed, 228 insertions(+), 4 deletions(-) create mode 100644 src/main/java/racingcar/controller/MainController.java create mode 100644 src/main/java/racingcar/domain/Car.java create mode 100644 src/main/java/racingcar/domain/Cars.java create mode 100644 src/main/java/racingcar/exception/ErrorMessage.java create mode 100644 src/main/java/racingcar/utils/CarNamesValidator.java create mode 100644 src/main/java/racingcar/view/InputView.java create mode 100644 src/main/java/racingcar/view/OutputView.java diff --git a/docs/README.md b/docs/README.md index 7c32e9b3290..b4d8d25ce24 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,9 +3,11 @@ - [ ] 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. -- [ ] 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. - - [ ] 자동차 이름은 쉼표(,)를 기준으로 구분하며, - - [ ] 이름은 5자 이하만 가능하다. +- [X] 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. + - [X] 자동차 이름은 쉼표(,)를 기준으로 구분 + - [X] 이름은 5자 이하만 가능 + - [X] null 이거나 공백 X + - [X] 자동차 이름이 같은 것이 있으면 안됨 - [ ] 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7242..c1216493693 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,12 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; +import racingcar.controller.MainController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + MainController mainController = MainController.create(); + mainController.run(); + Console.close(); } } diff --git a/src/main/java/racingcar/controller/MainController.java b/src/main/java/racingcar/controller/MainController.java new file mode 100644 index 00000000000..edf4beacd1b --- /dev/null +++ b/src/main/java/racingcar/controller/MainController.java @@ -0,0 +1,64 @@ +package racingcar.controller; + +import racingcar.domain.Car; +import racingcar.domain.Cars; +import racingcar.utils.CarNamesValidator; +import racingcar.view.InputView; +import racingcar.view.OutputView; + +import java.util.List; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public class MainController { + private final InputView inputView; + private final OutputView outputView; + //private OrderController orderController; //컨트롤러 추가하는 경우 + + private MainController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public static MainController create() { + return new MainController(InputView.getInstance(), OutputView.getInstance()); + } + + public void run() { + Cars cars = createCars(); + + } + +// private void initializeControllers() { +// orderController = OrderController.of(inputView, outputView); +// } + + private Cars createCars() { + return readUserInput(() -> { + List carNames = inputView.readCarNames(); + List validCars = carNames.stream() + .map(Car::from) + .toList(); + return Cars.from(validCars); + }); + } + + private Orders createOrders() { + return readUserInput(() -> { + List items = inputView.readOrders().stream() + .map(OrderItemDto::toOrderItem) + .toList(); + return Orders.from(items); + }); + } + + private T readUserInput(Supplier supplier) { + while (true) { + try { + return supplier.get(); + } catch (IllegalArgumentException e) { + outputView.printError(e.getMessage()); + } + } + } +} diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java new file mode 100644 index 00000000000..21f24f94b21 --- /dev/null +++ b/src/main/java/racingcar/domain/Car.java @@ -0,0 +1,19 @@ +package racingcar.domain; + +import racingcar.utils.CarNamesValidator; + +public class Car { + private final String name; + private long position; + + private Car(String name) { + this.name = name; + } + + public static Car from(String name) { + CarNamesValidator.validateName(name); + return new Car(name); + } + + +} diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java new file mode 100644 index 00000000000..ad9b4d30da4 --- /dev/null +++ b/src/main/java/racingcar/domain/Cars.java @@ -0,0 +1,15 @@ +package racingcar.domain; + +import java.util.List; + +public class Cars { + private final List cars; + + private Cars(List cars) { + this.cars = cars; + } + + public static Cars from(List cars) { + return new Cars(cars); + } +} diff --git a/src/main/java/racingcar/exception/ErrorMessage.java b/src/main/java/racingcar/exception/ErrorMessage.java new file mode 100644 index 00000000000..ed8f6d4854c --- /dev/null +++ b/src/main/java/racingcar/exception/ErrorMessage.java @@ -0,0 +1,19 @@ +package racingcar.exception; + +public enum ErrorMessage { + ERROR_CAPTION("[ERROR] "), + INVALID_CAR_NAMES("유효하지 않은 이름 형식 입니다."), + DUPLICATE_CAR_NAMES("서로 다른 이름을 입력해 주세요."), + INVALID_BLANK_CAR_NAME("유효하지 않은 이름 입니다."), + INVALID_CAR_NAME_LENGTH("이름은 5자 이하여야 합니다."); + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return ERROR_CAPTION.message + message; + } +} diff --git a/src/main/java/racingcar/utils/CarNamesValidator.java b/src/main/java/racingcar/utils/CarNamesValidator.java new file mode 100644 index 00000000000..23b114e7746 --- /dev/null +++ b/src/main/java/racingcar/utils/CarNamesValidator.java @@ -0,0 +1,54 @@ +package racingcar.utils; + +import org.junit.platform.commons.util.StringUtils; + +import java.util.HashSet; +import java.util.List; + +import static racingcar.exception.ErrorMessage.*; + +public class CarNamesValidator { + private static final String CAR_NAME_DELIMITER = ","; + private static final int CAR_NAME_MAXIMUM_SIZE = 5; + + public static List safeSplit(String input) { + validateEmpty(input); + validateStartsOrEndsWithDelimiter(input, CAR_NAME_DELIMITER); + return List.of(input.split(CAR_NAME_DELIMITER)); + } + + private static void validateEmpty(String input) { + if (StringUtils.isBlank(input)) { + throw new IllegalArgumentException(INVALID_CAR_NAMES.getMessage()); + } + } + + private static void validateStartsOrEndsWithDelimiter(String input, String delimiter) { + if (input.startsWith(delimiter) || input.endsWith(delimiter)) { + throw new IllegalArgumentException(INVALID_CAR_NAMES.getMessage()); + } + } + + public static void validateDuplicate(List input) { + if (input.size() != new HashSet<>(input).size()) { + throw new IllegalArgumentException(DUPLICATE_CAR_NAMES.getMessage()); + } + } + + public static void validateName(String name) { + validateNotNull(name); + validateLength(name); + } + + private static void validateNotNull(String name) { + if (StringUtils.isBlank(name)) { + throw new IllegalArgumentException(INVALID_BLANK_CAR_NAME.getMessage()); + } + } + + private static void validateLength(String name) { + if (name.length() > CAR_NAME_MAXIMUM_SIZE) { + throw new IllegalArgumentException(INVALID_CAR_NAME_LENGTH.getMessage()); + } + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 00000000000..f11c8511de4 --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,28 @@ +package racingcar.view; + +import camp.nextstep.edu.missionutils.Console; +import racingcar.utils.CarNamesValidator; + +import java.util.List; + +public class InputView { + private static final InputView instance = new InputView(); + + private static final String START_MESSAGE = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; + + private InputView() { + } + + public static InputView getInstance() { + return instance; + } + + public List readCarNames() { + System.out.println(START_MESSAGE); + String input = Console.readLine(); + List carNamesInput = CarNamesValidator.safeSplit(input); + CarNamesValidator.validateDuplicate(carNamesInput); + return carNamesInput; + } + +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java new file mode 100644 index 00000000000..a83422199da --- /dev/null +++ b/src/main/java/racingcar/view/OutputView.java @@ -0,0 +1,18 @@ +package racingcar.view; + +public class OutputView { + private static final OutputView instance = new OutputView(); + + private static final String START_MESSAGE = ""; + + private OutputView() { + } + + public static OutputView getInstance() { + return instance; + } + + public void printError(String errorMessage) { + System.out.println(errorMessage); + } +} From 69312ab1430d2acba44682f045e19f66e5149508 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Sun, 26 Nov 2023 23:38:36 +0900 Subject: [PATCH 03/10] =?UTF-8?q?Feat:=20=EC=B4=9D=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=ED=9A=9F=EC=88=98=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B3=A0=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++--- .../racingcar/controller/MainController.java | 10 +++++----- .../java/racingcar/domain/TotalRound.java | 16 +++++++++++++++ .../racingcar/exception/ErrorMessage.java | 4 +++- .../racingcar/utils/TotalRoundValidator.java | 20 +++++++++++++++++++ src/main/java/racingcar/view/InputView.java | 10 +++++++++- 6 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 src/main/java/racingcar/domain/TotalRound.java create mode 100644 src/main/java/racingcar/utils/TotalRoundValidator.java diff --git a/docs/README.md b/docs/README.md index b4d8d25ce24..99459dcf7af 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,8 +10,8 @@ - [X] 자동차 이름이 같은 것이 있으면 안됨 -- [ ] 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. - - [ ] 1 이상의 정수 여야 함 +- [X] 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. + - [X] 1 이상의 정수 여야 함 - [ ] 전진하는 조건 : 0에서 9 사이에서 무작위 값을 구한 후, 무작위 값이 4 이상일 경우 @@ -27,7 +27,7 @@ --- -전체 흐름 예시 +- 전체 흐름 예시 ``` 경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분) pobi,woni,jun diff --git a/src/main/java/racingcar/controller/MainController.java b/src/main/java/racingcar/controller/MainController.java index edf4beacd1b..c3f75508954 100644 --- a/src/main/java/racingcar/controller/MainController.java +++ b/src/main/java/racingcar/controller/MainController.java @@ -2,7 +2,9 @@ import racingcar.domain.Car; import racingcar.domain.Cars; +import racingcar.domain.TotalRound; import racingcar.utils.CarNamesValidator; +import racingcar.utils.TotalRoundValidator; import racingcar.view.InputView; import racingcar.view.OutputView; @@ -43,12 +45,10 @@ private Cars createCars() { }); } - private Orders createOrders() { + private TotalRound createTotalRound() { return readUserInput(() -> { - List items = inputView.readOrders().stream() - .map(OrderItemDto::toOrderItem) - .toList(); - return Orders.from(items); + long totalRound = inputView.readTotalRound(); + return TotalRound.from(totalRound); }); } diff --git a/src/main/java/racingcar/domain/TotalRound.java b/src/main/java/racingcar/domain/TotalRound.java new file mode 100644 index 00000000000..303d38ebafc --- /dev/null +++ b/src/main/java/racingcar/domain/TotalRound.java @@ -0,0 +1,16 @@ +package racingcar.domain; + +import racingcar.utils.TotalRoundValidator; + +public class TotalRound { + private final long totalRound; + + private TotalRound(long totalRound) { + this.totalRound = totalRound; + } + + public static TotalRound from(long totalRound) { + TotalRoundValidator.validatePositive(totalRound); + return new TotalRound(totalRound); + } +} diff --git a/src/main/java/racingcar/exception/ErrorMessage.java b/src/main/java/racingcar/exception/ErrorMessage.java index ed8f6d4854c..50ab72bae9b 100644 --- a/src/main/java/racingcar/exception/ErrorMessage.java +++ b/src/main/java/racingcar/exception/ErrorMessage.java @@ -5,7 +5,9 @@ public enum ErrorMessage { INVALID_CAR_NAMES("유효하지 않은 이름 형식 입니다."), DUPLICATE_CAR_NAMES("서로 다른 이름을 입력해 주세요."), INVALID_BLANK_CAR_NAME("유효하지 않은 이름 입니다."), - INVALID_CAR_NAME_LENGTH("이름은 5자 이하여야 합니다."); + INVALID_CAR_NAME_LENGTH("이름은 5자 이하여야 합니다."), + NOT_NUMERIC_INPUT("숫자를 입력해 주세요."), + NOT_POSITIVE_INPUT("양수를 입력해 주세요."); private final String message; diff --git a/src/main/java/racingcar/utils/TotalRoundValidator.java b/src/main/java/racingcar/utils/TotalRoundValidator.java new file mode 100644 index 00000000000..84ef7d19b72 --- /dev/null +++ b/src/main/java/racingcar/utils/TotalRoundValidator.java @@ -0,0 +1,20 @@ +package racingcar.utils; + +import static racingcar.exception.ErrorMessage.NOT_NUMERIC_INPUT; +import static racingcar.exception.ErrorMessage.NOT_POSITIVE_INPUT; + +public class TotalRoundValidator { + public static long safeParseLong(String input) { + try { + return Long.parseLong(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(NOT_NUMERIC_INPUT.getMessage()); + } + } + + public static void validatePositive(long value) { + if (value < 0) { + throw new IllegalArgumentException(NOT_POSITIVE_INPUT.getMessage()); + } + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index f11c8511de4..344cd94ebf0 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -2,13 +2,15 @@ import camp.nextstep.edu.missionutils.Console; import racingcar.utils.CarNamesValidator; +import racingcar.utils.TotalRoundValidator; import java.util.List; public class InputView { private static final InputView instance = new InputView(); - private static final String START_MESSAGE = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; + private static final String TOTAL_ROUND_MESSAGE = "시도할 회수는 몇회인가요?"; + private InputView() { } @@ -25,4 +27,10 @@ public List readCarNames() { return carNamesInput; } + public long readTotalRound() { + System.out.println(TOTAL_ROUND_MESSAGE); + String input = Console.readLine(); + return TotalRoundValidator.safeParseLong(input); + } + } From 91bec613837b072515941f2e51d471afc7742c08 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 27 Nov 2023 00:03:29 +0900 Subject: [PATCH 04/10] =?UTF-8?q?Feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=A0=84=EC=A7=84=20=ED=98=B9=EC=9D=80=20=EB=A9=88=EC=B6=94?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +-- .../java/racingcar/constants/Constants.java | 7 ++++ .../racingcar/controller/MainController.java | 19 +++++----- .../racingcar/controller/PlayController.java | 35 +++++++++++++++++++ src/main/java/racingcar/domain/Car.java | 19 ++++++++++ src/main/java/racingcar/domain/Cars.java | 4 +++ .../domain/RandomNumberGenerator.java | 12 +++++++ .../java/racingcar/domain/TotalRound.java | 4 +++ src/main/java/racingcar/view/InputView.java | 1 - src/main/java/racingcar/view/OutputView.java | 7 +++- 10 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 src/main/java/racingcar/constants/Constants.java create mode 100644 src/main/java/racingcar/controller/PlayController.java create mode 100644 src/main/java/racingcar/domain/RandomNumberGenerator.java diff --git a/docs/README.md b/docs/README.md index 99459dcf7af..fd28e56ceb1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,8 +14,8 @@ - [X] 1 이상의 정수 여야 함 -- [ ] 전진하는 조건 : 0에서 9 사이에서 무작위 값을 구한 후, 무작위 값이 4 이상일 경우 - - [ ] `Randoms.pickNumberInRange(0,9);` 사용 +- [X] 전진하는 조건 : 0에서 9 사이에서 무작위 값을 구한 후, 무작위 값이 4 이상일 경우 + - [X] `Randoms.pickNumberInRange(0,9);` 사용 - [ ] 자동차 경주 게임을 완료한 후 우승자를 알려준다. 우승자는 한 명 이상일 수 있다. diff --git a/src/main/java/racingcar/constants/Constants.java b/src/main/java/racingcar/constants/Constants.java new file mode 100644 index 00000000000..2eb5eec561e --- /dev/null +++ b/src/main/java/racingcar/constants/Constants.java @@ -0,0 +1,7 @@ +package racingcar.constants; + +public class Constants { + public static final int MINIMUM_RANDOM_NUMBER = 0; + public static final int MAXIMUM_RANDOM_NUMBER = 9; + public static final int MOVE_THRESHOLD = 4; +} diff --git a/src/main/java/racingcar/controller/MainController.java b/src/main/java/racingcar/controller/MainController.java index c3f75508954..1255bc17a35 100644 --- a/src/main/java/racingcar/controller/MainController.java +++ b/src/main/java/racingcar/controller/MainController.java @@ -3,19 +3,16 @@ import racingcar.domain.Car; import racingcar.domain.Cars; import racingcar.domain.TotalRound; -import racingcar.utils.CarNamesValidator; -import racingcar.utils.TotalRoundValidator; import racingcar.view.InputView; import racingcar.view.OutputView; import java.util.List; import java.util.function.Supplier; -import java.util.stream.Collectors; public class MainController { private final InputView inputView; private final OutputView outputView; - //private OrderController orderController; //컨트롤러 추가하는 경우 + private PlayController playController; private MainController(InputView inputView, OutputView outputView) { this.inputView = inputView; @@ -27,13 +24,15 @@ public static MainController create() { } public void run() { - Cars cars = createCars(); - + setup(); + playController.play(); } -// private void initializeControllers() { -// orderController = OrderController.of(inputView, outputView); -// } + private void setup() { + Cars cars = createCars(); + TotalRound totalRound = createTotalRound(); + playController = PlayController.of(outputView, cars, totalRound); + } private Cars createCars() { return readUserInput(() -> { @@ -61,4 +60,4 @@ private T readUserInput(Supplier supplier) { } } } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/controller/PlayController.java b/src/main/java/racingcar/controller/PlayController.java new file mode 100644 index 00000000000..b98eb57133d --- /dev/null +++ b/src/main/java/racingcar/controller/PlayController.java @@ -0,0 +1,35 @@ +package racingcar.controller; + +import racingcar.domain.Cars; +import racingcar.domain.TotalRound; +import racingcar.view.OutputView; + +public class PlayController { + private final OutputView outputView; + private final Cars cars; + private final TotalRound totalRound; + + public PlayController(OutputView outputView, Cars cars, TotalRound totalRound) { + this.outputView = outputView; + this.cars = cars; + this.totalRound = totalRound; + } + + public static PlayController of(OutputView outputView, Cars cars, TotalRound totalRound) { + return new PlayController(outputView, cars, totalRound); + } + + public void play() { + long currentRound = 0; + while (currentRound < totalRound.getTotalRound()) { + playRound(); + currentRound++; + } + } + + private void playRound() { + //TODO round 실행 -> 실행결과 dto로 생성 () -> outputView 에 전달하여 라운드 결과 출력 + cars.play(); + + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index 21f24f94b21..05ec76b7ba8 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -2,6 +2,8 @@ import racingcar.utils.CarNamesValidator; +import static racingcar.constants.Constants.MOVE_THRESHOLD; + public class Car { private final String name; private long position; @@ -15,5 +17,22 @@ public static Car from(String name) { return new Car(name); } + public void play() { + int randomNumber = RandomNumberGenerator.generate(); + moveOrStop(randomNumber); + } + + private void moveOrStop(int randomNumber) { + if (randomNumber >= MOVE_THRESHOLD) { + position++; + } + } + public String provideName() { + return name; + } + + public long providePosition() { + return position; + } } diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index ad9b4d30da4..eee3fd3ba72 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -12,4 +12,8 @@ private Cars(List cars) { public static Cars from(List cars) { return new Cars(cars); } + + public void play() { + cars.forEach(Car::play); + } } diff --git a/src/main/java/racingcar/domain/RandomNumberGenerator.java b/src/main/java/racingcar/domain/RandomNumberGenerator.java new file mode 100644 index 00000000000..08b7a9c286b --- /dev/null +++ b/src/main/java/racingcar/domain/RandomNumberGenerator.java @@ -0,0 +1,12 @@ +package racingcar.domain; + +import camp.nextstep.edu.missionutils.Randoms; + +import static racingcar.constants.Constants.MAXIMUM_RANDOM_NUMBER; +import static racingcar.constants.Constants.MINIMUM_RANDOM_NUMBER; + +public class RandomNumberGenerator { + public static int generate() { + return Randoms.pickNumberInRange(MINIMUM_RANDOM_NUMBER, MAXIMUM_RANDOM_NUMBER); + } +} diff --git a/src/main/java/racingcar/domain/TotalRound.java b/src/main/java/racingcar/domain/TotalRound.java index 303d38ebafc..587da8d201e 100644 --- a/src/main/java/racingcar/domain/TotalRound.java +++ b/src/main/java/racingcar/domain/TotalRound.java @@ -13,4 +13,8 @@ public static TotalRound from(long totalRound) { TotalRoundValidator.validatePositive(totalRound); return new TotalRound(totalRound); } + + public long getTotalRound() { + return totalRound; + } } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 344cd94ebf0..1756512d32b 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -32,5 +32,4 @@ public long readTotalRound() { String input = Console.readLine(); return TotalRoundValidator.safeParseLong(input); } - } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index a83422199da..54e2205c0cf 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -2,8 +2,11 @@ public class OutputView { private static final OutputView instance = new OutputView(); + private static final String START_RESULT_MESSAGE = "실행 결과"; + private static final String RESULT_FORMAT = "%s : %s"; + private static final String MOVE_SYMBOL = "-"; + private static final String WINNER_MESSAGE_FORMAT = "최종 우승자 : %s"; - private static final String START_MESSAGE = ""; private OutputView() { } @@ -15,4 +18,6 @@ public static OutputView getInstance() { public void printError(String errorMessage) { System.out.println(errorMessage); } + + } From fdb3c31cdf619e0f6f9066839dba6f8c01bfb35b Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 27 Nov 2023 00:19:40 +0900 Subject: [PATCH 05/10] =?UTF-8?q?Feat:=20=EB=9D=BC=EC=9A=B4=EB=93=9C=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/controller/MainController.java | 2 +- .../racingcar/controller/PlayController.java | 13 +++++++-- src/main/java/racingcar/domain/Car.java | 4 +-- src/main/java/racingcar/domain/Cars.java | 4 +++ .../java/racingcar/domain/TotalRound.java | 8 +++--- src/main/java/racingcar/dto/CarDto.java | 23 +++++++++++++++ src/main/java/racingcar/dto/CarsDto.java | 19 +++++++++++++ .../racingcar/utils/TotalRoundValidator.java | 6 ++-- src/main/java/racingcar/view/InputView.java | 4 +-- src/main/java/racingcar/view/OutputView.java | 28 +++++++++++++++++++ 10 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 src/main/java/racingcar/dto/CarDto.java create mode 100644 src/main/java/racingcar/dto/CarsDto.java diff --git a/src/main/java/racingcar/controller/MainController.java b/src/main/java/racingcar/controller/MainController.java index 1255bc17a35..f68619ebd49 100644 --- a/src/main/java/racingcar/controller/MainController.java +++ b/src/main/java/racingcar/controller/MainController.java @@ -46,7 +46,7 @@ private Cars createCars() { private TotalRound createTotalRound() { return readUserInput(() -> { - long totalRound = inputView.readTotalRound(); + int totalRound = inputView.readTotalRound(); return TotalRound.from(totalRound); }); } diff --git a/src/main/java/racingcar/controller/PlayController.java b/src/main/java/racingcar/controller/PlayController.java index b98eb57133d..22aed02f9d0 100644 --- a/src/main/java/racingcar/controller/PlayController.java +++ b/src/main/java/racingcar/controller/PlayController.java @@ -2,8 +2,13 @@ import racingcar.domain.Cars; import racingcar.domain.TotalRound; +import racingcar.dto.CarDto; +import racingcar.dto.CarsDto; import racingcar.view.OutputView; +import java.util.List; +import java.util.stream.Collectors; + public class PlayController { private final OutputView outputView; private final Cars cars; @@ -20,6 +25,7 @@ public static PlayController of(OutputView outputView, Cars cars, TotalRound tot } public void play() { + outputView.printStartResult(); long currentRound = 0; while (currentRound < totalRound.getTotalRound()) { playRound(); @@ -28,8 +34,11 @@ public void play() { } private void playRound() { - //TODO round 실행 -> 실행결과 dto로 생성 () -> outputView 에 전달하여 라운드 결과 출력 cars.play(); - + List carDtos = cars.provideCars().stream() + .map(car -> CarDto.of(car.provideName(), car.providePosition())) + .toList(); + CarsDto carsDto = CarsDto.from(carDtos); + outputView.printResult(carsDto); } } \ No newline at end of file diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index 05ec76b7ba8..5a101ee14c2 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -6,7 +6,7 @@ public class Car { private final String name; - private long position; + private int position; private Car(String name) { this.name = name; @@ -32,7 +32,7 @@ public String provideName() { return name; } - public long providePosition() { + public int providePosition() { return position; } } diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index eee3fd3ba72..b90f3805c7a 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -16,4 +16,8 @@ public static Cars from(List cars) { public void play() { cars.forEach(Car::play); } + + public List provideCars() { + return cars; + } } diff --git a/src/main/java/racingcar/domain/TotalRound.java b/src/main/java/racingcar/domain/TotalRound.java index 587da8d201e..2c1f928851c 100644 --- a/src/main/java/racingcar/domain/TotalRound.java +++ b/src/main/java/racingcar/domain/TotalRound.java @@ -3,18 +3,18 @@ import racingcar.utils.TotalRoundValidator; public class TotalRound { - private final long totalRound; + private final int totalRound; - private TotalRound(long totalRound) { + private TotalRound(int totalRound) { this.totalRound = totalRound; } - public static TotalRound from(long totalRound) { + public static TotalRound from(int totalRound) { TotalRoundValidator.validatePositive(totalRound); return new TotalRound(totalRound); } - public long getTotalRound() { + public int getTotalRound() { return totalRound; } } diff --git a/src/main/java/racingcar/dto/CarDto.java b/src/main/java/racingcar/dto/CarDto.java new file mode 100644 index 00000000000..cae750ec510 --- /dev/null +++ b/src/main/java/racingcar/dto/CarDto.java @@ -0,0 +1,23 @@ +package racingcar.dto; + +public class CarDto { + private final String name; + private final int position; + + private CarDto(String name, int position) { + this.name = name; + this.position = position; + } + + public static CarDto of(String name, int position) { + return new CarDto(name, position); + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } +} diff --git a/src/main/java/racingcar/dto/CarsDto.java b/src/main/java/racingcar/dto/CarsDto.java new file mode 100644 index 00000000000..ee5a8726050 --- /dev/null +++ b/src/main/java/racingcar/dto/CarsDto.java @@ -0,0 +1,19 @@ +package racingcar.dto; + +import java.util.List; + +public class CarsDto { + private final List carDtos; + + private CarsDto(List carDtos) { + this.carDtos = carDtos; + } + + public static CarsDto from(List carDtos) { + return new CarsDto(carDtos); + } + + public List getCarDtos() { + return carDtos; + } +} diff --git a/src/main/java/racingcar/utils/TotalRoundValidator.java b/src/main/java/racingcar/utils/TotalRoundValidator.java index 84ef7d19b72..e8a82f873a4 100644 --- a/src/main/java/racingcar/utils/TotalRoundValidator.java +++ b/src/main/java/racingcar/utils/TotalRoundValidator.java @@ -4,15 +4,15 @@ import static racingcar.exception.ErrorMessage.NOT_POSITIVE_INPUT; public class TotalRoundValidator { - public static long safeParseLong(String input) { + public static int safeParseInt(String input) { try { - return Long.parseLong(input); + return Integer.parseInt(input); } catch (NumberFormatException e) { throw new IllegalArgumentException(NOT_NUMERIC_INPUT.getMessage()); } } - public static void validatePositive(long value) { + public static void validatePositive(int value) { if (value < 0) { throw new IllegalArgumentException(NOT_POSITIVE_INPUT.getMessage()); } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 1756512d32b..5bfa361ff0c 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -27,9 +27,9 @@ public List readCarNames() { return carNamesInput; } - public long readTotalRound() { + public int readTotalRound() { System.out.println(TOTAL_ROUND_MESSAGE); String input = Console.readLine(); - return TotalRoundValidator.safeParseLong(input); + return TotalRoundValidator.safeParseInt(input); } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 54e2205c0cf..9d20c75b95d 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -1,5 +1,10 @@ package racingcar.view; +import racingcar.dto.CarDto; +import racingcar.dto.CarsDto; + +import java.util.List; + public class OutputView { private static final OutputView instance = new OutputView(); private static final String START_RESULT_MESSAGE = "실행 결과"; @@ -19,5 +24,28 @@ public void printError(String errorMessage) { System.out.println(errorMessage); } + public void printStartResult() { + printLine(); + System.out.println(START_RESULT_MESSAGE); + } + + private void printLine() { + System.out.println(); + } + + public void printResult(CarsDto carsDto) { + List carDtos = carsDto.getCarDtos(); + carDtos.forEach(this::printCarResult); + printLine(); + } + private void printCarResult(CarDto car) { + String positionImage = MOVE_SYMBOL.repeat(car.getPosition()); + String resultMessage = String.format(RESULT_FORMAT, car.getName(), positionImage); + System.out.println(resultMessage); + } + + public void printWinners() { + String.format(WINNER_MESSAGE_FORMAT, ); + } } From ac28340f26885736e21a5feec8f4f4dd3f4764aa Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 27 Nov 2023 00:47:03 +0900 Subject: [PATCH 06/10] =?UTF-8?q?Feat:=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EB=B0=8F=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/controller/PlayController.java | 10 +++++- src/main/java/racingcar/domain/Car.java | 4 +++ src/main/java/racingcar/domain/Cars.java | 15 ++++++++- .../java/racingcar/dto/WinnerNamesDto.java | 32 +++++++++++++++++++ src/main/java/racingcar/view/OutputView.java | 9 ++++-- 5 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 src/main/java/racingcar/dto/WinnerNamesDto.java diff --git a/src/main/java/racingcar/controller/PlayController.java b/src/main/java/racingcar/controller/PlayController.java index 22aed02f9d0..31f1ac5273a 100644 --- a/src/main/java/racingcar/controller/PlayController.java +++ b/src/main/java/racingcar/controller/PlayController.java @@ -1,13 +1,14 @@ package racingcar.controller; +import racingcar.domain.Car; import racingcar.domain.Cars; import racingcar.domain.TotalRound; import racingcar.dto.CarDto; import racingcar.dto.CarsDto; +import racingcar.dto.WinnerNamesDto; import racingcar.view.OutputView; import java.util.List; -import java.util.stream.Collectors; public class PlayController { private final OutputView outputView; @@ -31,6 +32,7 @@ public void play() { playRound(); currentRound++; } + printWinners(); } private void playRound() { @@ -41,4 +43,10 @@ private void playRound() { CarsDto carsDto = CarsDto.from(carDtos); outputView.printResult(carsDto); } + + private void printWinners() { + List winners = cars.decideWinner(); + WinnerNamesDto winnerNamesDto = WinnerNamesDto.from(winners); + outputView.printWinners(winnerNamesDto); + } } \ No newline at end of file diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index 5a101ee14c2..c0f89915cf5 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -28,6 +28,10 @@ private void moveOrStop(int randomNumber) { } } + public boolean isEqualPosition(int value) { + return position == value; + } + public String provideName() { return name; } diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index b90f3805c7a..d42077f5592 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -1,6 +1,8 @@ package racingcar.domain; import java.util.List; +import java.util.OptionalInt; +import java.util.stream.Collectors; public class Cars { private final List cars; @@ -17,7 +19,18 @@ public void play() { cars.forEach(Car::play); } + public List decideWinner() { + int maxPosition = cars.stream() + .mapToInt(Car::providePosition) + .max() + .getAsInt(); + + return cars.stream() + .filter(car -> car.isEqualPosition(maxPosition)) + .toList(); + } + public List provideCars() { - return cars; + return List.copyOf(cars); } } diff --git a/src/main/java/racingcar/dto/WinnerNamesDto.java b/src/main/java/racingcar/dto/WinnerNamesDto.java new file mode 100644 index 00000000000..33df1e41402 --- /dev/null +++ b/src/main/java/racingcar/dto/WinnerNamesDto.java @@ -0,0 +1,32 @@ +package racingcar.dto; + +import racingcar.domain.Car; + +import java.util.List; + +public class WinnerNamesDto { + private final List names; + + private WinnerNamesDto(List names) { + this.names = names; + } + + public static WinnerNamesDto from(List cars) { + List names = cars.stream() + .map(Car::provideName) + .toList(); + return new WinnerNamesDto(names); + } + + public List getNames() { + return names; + } + + public String getNameByIndex(int index) { + return names.get(index); + } + + public int getSize() { + return names.size(); + } +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 9d20c75b95d..afdb5322ed6 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -2,6 +2,7 @@ import racingcar.dto.CarDto; import racingcar.dto.CarsDto; +import racingcar.dto.WinnerNamesDto; import java.util.List; @@ -11,6 +12,8 @@ public class OutputView { private static final String RESULT_FORMAT = "%s : %s"; private static final String MOVE_SYMBOL = "-"; private static final String WINNER_MESSAGE_FORMAT = "최종 우승자 : %s"; + private static final String WINNER_DELIMITER = ", "; + private static final int SINGLE_WINNER = 1; private OutputView() { @@ -45,7 +48,9 @@ private void printCarResult(CarDto car) { System.out.println(resultMessage); } - public void printWinners() { - String.format(WINNER_MESSAGE_FORMAT, ); + public void printWinners(WinnerNamesDto dto) { + String winnerNames = String.join(WINNER_DELIMITER, dto.getNames()); + String message = String.format(WINNER_MESSAGE_FORMAT, winnerNames); + System.out.println(message); } } From ef5df01b76e633bee73d507780b2862bc595a51a Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 27 Nov 2023 00:50:35 +0900 Subject: [PATCH 07/10] =?UTF-8?q?Rename:=20=EC=98=88=EC=99=B8=EA=B0=80=20?= =?UTF-8?q?=ED=84=B0=EC=A7=80=EB=A9=B4=20=EC=A2=85=EB=A3=8C=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=8C=20=EC=95=84=EB=8B=88=EB=9D=BC=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Car.java | 1 + .../java/racingcar/{domain => utils}/RandomNumberGenerator.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) rename src/main/java/racingcar/{domain => utils}/RandomNumberGenerator.java (93%) diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index c0f89915cf5..c85c6073429 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -1,6 +1,7 @@ package racingcar.domain; import racingcar.utils.CarNamesValidator; +import racingcar.utils.RandomNumberGenerator; import static racingcar.constants.Constants.MOVE_THRESHOLD; diff --git a/src/main/java/racingcar/domain/RandomNumberGenerator.java b/src/main/java/racingcar/utils/RandomNumberGenerator.java similarity index 93% rename from src/main/java/racingcar/domain/RandomNumberGenerator.java rename to src/main/java/racingcar/utils/RandomNumberGenerator.java index 08b7a9c286b..4d380d7e053 100644 --- a/src/main/java/racingcar/domain/RandomNumberGenerator.java +++ b/src/main/java/racingcar/utils/RandomNumberGenerator.java @@ -1,4 +1,4 @@ -package racingcar.domain; +package racingcar.utils; import camp.nextstep.edu.missionutils.Randoms; From 50bd39978eb206a0656bb01339a6f40fa9c4f042 Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 27 Nov 2023 00:55:45 +0900 Subject: [PATCH 08/10] =?UTF-8?q?Refactor(playController):=20intStream=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/controller/PlayController.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/racingcar/controller/PlayController.java b/src/main/java/racingcar/controller/PlayController.java index 31f1ac5273a..6aa647f93c5 100644 --- a/src/main/java/racingcar/controller/PlayController.java +++ b/src/main/java/racingcar/controller/PlayController.java @@ -9,6 +9,7 @@ import racingcar.view.OutputView; import java.util.List; +import java.util.stream.IntStream; public class PlayController { private final OutputView outputView; @@ -27,11 +28,8 @@ public static PlayController of(OutputView outputView, Cars cars, TotalRound tot public void play() { outputView.printStartResult(); - long currentRound = 0; - while (currentRound < totalRound.getTotalRound()) { - playRound(); - currentRound++; - } + IntStream.range(0, totalRound.getTotalRound()) + .forEach(i -> playRound()); printWinners(); } From 2dc73f548fca134ce247eeda7ecadcdedc746b5a Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 27 Nov 2023 00:58:09 +0900 Subject: [PATCH 09/10] =?UTF-8?q?Style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Cars.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index d42077f5592..1c9f6c8f2f8 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -1,8 +1,6 @@ package racingcar.domain; import java.util.List; -import java.util.OptionalInt; -import java.util.stream.Collectors; public class Cars { private final List cars; From 8dc7c6dbaa35542503456d52a1f180614c90428f Mon Sep 17 00:00:00 2001 From: jisu-om Date: Mon, 27 Nov 2023 01:11:12 +0900 Subject: [PATCH 10/10] =?UTF-8?q?Test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/domain/TotalRound.java | 2 +- .../racingcar/utils/TotalRoundValidator.java | 2 +- src/test/java/racingcar/domain/CarTest.java | 27 +++++++++++++++++++ .../java/racingcar/domain/TotalRoundTest.java | 25 +++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/test/java/racingcar/domain/CarTest.java create mode 100644 src/test/java/racingcar/domain/TotalRoundTest.java diff --git a/src/main/java/racingcar/domain/TotalRound.java b/src/main/java/racingcar/domain/TotalRound.java index 2c1f928851c..9a8d96666c7 100644 --- a/src/main/java/racingcar/domain/TotalRound.java +++ b/src/main/java/racingcar/domain/TotalRound.java @@ -17,4 +17,4 @@ public static TotalRound from(int totalRound) { public int getTotalRound() { return totalRound; } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/utils/TotalRoundValidator.java b/src/main/java/racingcar/utils/TotalRoundValidator.java index e8a82f873a4..58614081ae0 100644 --- a/src/main/java/racingcar/utils/TotalRoundValidator.java +++ b/src/main/java/racingcar/utils/TotalRoundValidator.java @@ -13,7 +13,7 @@ public static int safeParseInt(String input) { } public static void validatePositive(int value) { - if (value < 0) { + if (value <= 0) { throw new IllegalArgumentException(NOT_POSITIVE_INPUT.getMessage()); } } diff --git a/src/test/java/racingcar/domain/CarTest.java b/src/test/java/racingcar/domain/CarTest.java new file mode 100644 index 00000000000..d05cfb0f542 --- /dev/null +++ b/src/test/java/racingcar/domain/CarTest.java @@ -0,0 +1,27 @@ +package racingcar.domain; + + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class CarTest { + @Test + void create() { + //given, when + Car car = Car.from("name"); + + //then + assertThat(car).isNotNull(); + } + + @ParameterizedTest(name = "[{index}] Car 의 이름이 ''{0}'' 이면 예외 발생한다.") + @ValueSource(strings = {"abcdefg", "", " "}) + void cannotCreateBonusNumber(String element) { + assertThatThrownBy(() -> Car.from(element)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file diff --git a/src/test/java/racingcar/domain/TotalRoundTest.java b/src/test/java/racingcar/domain/TotalRoundTest.java new file mode 100644 index 00000000000..3305a896d61 --- /dev/null +++ b/src/test/java/racingcar/domain/TotalRoundTest.java @@ -0,0 +1,25 @@ +package racingcar.domain; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.*; + +class TotalRoundTest { + @Test + void create() { + //given, when + TotalRound totalRound = TotalRound.from(1); + + //then + assertThat(totalRound).isNotNull(); + } + + @ParameterizedTest(name = "[{index}] {0} 이면 TotalRound 생성 시 예외 발생한다.") + @ValueSource(ints = {-100, 0}) + void exception(int element) { + assertThatThrownBy(() -> TotalRound.from(element)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file