From 3591f1f6d65d03ef211ed31886bd307ad839e308 Mon Sep 17 00:00:00 2001 From: jhshin Date: Tue, 13 May 2025 17:28:11 +0900 Subject: [PATCH] =?UTF-8?q?feat/racingcar-feedback=20:=20feedback=20?= =?UTF-8?q?=ED=9B=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +- src/main/java/Main.java | 30 ++++++++++++ src/main/java/racingCar/Car.java | 43 +++++++++++++++++ src/main/java/racingCar/Cars.java | 47 +++++++++++++++++++ src/main/java/racingCar/ResultView.java | 22 +++++++++ src/main/java/racingCar/ValidationUtils.java | 19 ++++++++ .../DefaultRandomNumberGenerator.java | 14 ++++++ .../racingCar/randomNumber/RandomNumber.java | 7 +++ src/test/java/racingCar/CarTest.java | 28 +++++++++++ src/test/java/racingCar/CarsTest.java | 47 +++++++++++++++++++ .../java/racingCar/ValidationUtilsTest.java | 26 ++++++++++ 11 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/racingCar/Car.java create mode 100644 src/main/java/racingCar/Cars.java create mode 100644 src/main/java/racingCar/ResultView.java create mode 100644 src/main/java/racingCar/ValidationUtils.java create mode 100644 src/main/java/racingCar/randomNumber/DefaultRandomNumberGenerator.java create mode 100644 src/main/java/racingCar/randomNumber/RandomNumber.java create mode 100644 src/test/java/racingCar/CarTest.java create mode 100644 src/test/java/racingCar/CarsTest.java create mode 100644 src/test/java/racingCar/ValidationUtilsTest.java diff --git a/build.gradle b/build.gradle index 8172fb73f..74bcc0b02 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'eclipse' group = 'camp.nextstep' version = '1.0.0' -sourceCompatibility = '1.8' +sourceCompatibility = "11" repositories { mavenCentral() @@ -17,3 +17,5 @@ dependencies { test { useJUnitPlatform() } + +targetCompatibility = JavaVersion.VERSION_11 \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 000000000..dff1fc5d7 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,30 @@ +import racingCar.Cars; +import racingCar.ResultView; + +import java.util.Scanner; + +public class Main { + + public static void main(String[] args) { + + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,) 기준으로 구분)."); + + Scanner sc = new Scanner(System.in); + String input = sc.nextLine(); + System.out.println(input); + + System.out.println("시도할 횟수는 몇회인가요?"); + int trial = sc.nextInt(); + System.out.println(trial); + System.out.println(); + + System.out.println("실행 결과"); + + Cars cars = new Cars(input); + for (int i = 0; i < trial; i++) { + cars.play(); + } + + ResultView.printWinner(cars.whoIsWinner(cars.getAllCarList())); + } +} diff --git a/src/main/java/racingCar/Car.java b/src/main/java/racingCar/Car.java new file mode 100644 index 000000000..f115f91fe --- /dev/null +++ b/src/main/java/racingCar/Car.java @@ -0,0 +1,43 @@ +package racingCar; + +import racingCar.randomNumber.DefaultRandomNumberGenerator; +import racingCar.randomNumber.RandomNumber; + +public class Car { + + private final String name; + private int distance; + + private final RandomNumber rdn = new DefaultRandomNumberGenerator(); + + public Car(String carName) { + + if (!ValidationUtils.isLengthOver(carName)) { + throw new IllegalArgumentException("자동차 이름은 5자를 초과할 수 없습니다."); + } + + this.name = carName; + this.distance = 0; + } + + public boolean canMove() { + return rdn.generate() >= 4; + } + + public void move() { + distance++; + } + + public String getCarName() { + return name; + } + + public int getMovedDistance() { + return distance; + } + + public String getPositionVisual() { + return "-".repeat(distance); + } + +} diff --git a/src/main/java/racingCar/Cars.java b/src/main/java/racingCar/Cars.java new file mode 100644 index 000000000..67af239c4 --- /dev/null +++ b/src/main/java/racingCar/Cars.java @@ -0,0 +1,47 @@ +package racingCar; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Cars { + + private final List cars; + + public Cars(String input) { + + if (!ValidationUtils.hasComma(input)) { + throw new IllegalArgumentException("입력 값에 쉼표(,) 기준으로 구분합니다."); + } + + this.cars = Arrays.stream(input.split(",")) + .map(Car::new) + .collect(Collectors.toList()); + } + + public void play() { + for (Car car : cars) { + if (car.canMove()) { + car.move(); + } + } + + ResultView.printRoundResult(cars); + } + + public List whoIsWinner(List cars) { + int maxDistance = cars.stream() + .mapToInt(Car::getMovedDistance) + .max() + .orElseThrow(); + + return cars.stream() + .filter(e -> e.getMovedDistance() == maxDistance) + .collect(Collectors.toList()); + } + + public List getAllCarList() { + return this.cars; + } + +} diff --git a/src/main/java/racingCar/ResultView.java b/src/main/java/racingCar/ResultView.java new file mode 100644 index 000000000..198ae6766 --- /dev/null +++ b/src/main/java/racingCar/ResultView.java @@ -0,0 +1,22 @@ +package racingCar; + +import java.util.List; +import java.util.stream.Collectors; + +public class ResultView { + + public static void printRoundResult(List cars) { + for (Car car : cars) { + System.out.println(car.getCarName() + " : " + car.getPositionVisual()); + } + System.out.println(); + } + + public static void printWinner(List winners) { + String winner = winners.stream() + .map(Car::getCarName) + .collect(Collectors.joining(", ")); + + System.out.println(winner + "가 최종 우승했습니다."); + } +} diff --git a/src/main/java/racingCar/ValidationUtils.java b/src/main/java/racingCar/ValidationUtils.java new file mode 100644 index 000000000..f789bb756 --- /dev/null +++ b/src/main/java/racingCar/ValidationUtils.java @@ -0,0 +1,19 @@ +package racingCar; + +import racingCar.randomNumber.RandomNumber; + +public class ValidationUtils { + + public static boolean hasComma(String input) { + return input.contains(","); + } + + public static boolean isLengthOver(String input) { + return input.length() < 6; + } + + public static boolean isPositiveNumber(int number) { + return number > 0; + } + +} diff --git a/src/main/java/racingCar/randomNumber/DefaultRandomNumberGenerator.java b/src/main/java/racingCar/randomNumber/DefaultRandomNumberGenerator.java new file mode 100644 index 000000000..10f8d9a78 --- /dev/null +++ b/src/main/java/racingCar/randomNumber/DefaultRandomNumberGenerator.java @@ -0,0 +1,14 @@ +package racingCar.randomNumber; + +import java.util.Random; + +public class DefaultRandomNumberGenerator implements RandomNumber { + + private final Random random = new Random(); + + @Override + public int generate() { + return random.nextInt(10); + } +} + diff --git a/src/main/java/racingCar/randomNumber/RandomNumber.java b/src/main/java/racingCar/randomNumber/RandomNumber.java new file mode 100644 index 000000000..1cc34b0e2 --- /dev/null +++ b/src/main/java/racingCar/randomNumber/RandomNumber.java @@ -0,0 +1,7 @@ +package racingCar.randomNumber; + +public interface RandomNumber { + + int generate(); +} + diff --git a/src/test/java/racingCar/CarTest.java b/src/test/java/racingCar/CarTest.java new file mode 100644 index 000000000..311d8b42f --- /dev/null +++ b/src/test/java/racingCar/CarTest.java @@ -0,0 +1,28 @@ +package racingCar; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class CarTest { + + Car car = null; + + @Test + void 차_셋팅_실패() { + + String carName = "pobixxx"; + + Assertions.assertThatThrownBy(() -> car = new Car(carName)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("자동차 이름은 5자를 초과할 수 없습니다."); + } + + @Test + void 차_셋팅() { + String carName = "pobi"; + + car = new Car(carName); + Assertions.assertThat(car.getCarName()).isEqualTo(carName); + } +} \ No newline at end of file diff --git a/src/test/java/racingCar/CarsTest.java b/src/test/java/racingCar/CarsTest.java new file mode 100644 index 000000000..d5c2abe46 --- /dev/null +++ b/src/test/java/racingCar/CarsTest.java @@ -0,0 +1,47 @@ +package racingCar; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +class CarsTest { + + private final String input = "pobi,crong,honux"; + + private Cars cars = null; + + @BeforeEach + void setUp() { + cars = new Cars(input); + } + + @Test + void 차_셋팅_실패() { + + String str = "pobicronghonux"; + Assertions.assertThatThrownBy(() -> new Cars(str)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("입력 값에 쉼표(,) 기준으로 구분합니다."); + } + + @Test + void 차_셋팅() { + cars.getAllCarList().forEach(e -> { + System.out.println("e.getCarName() = " + e.getCarName()); + }); + } + + @Test + void playing() { + + int count = 5; + + for (int i = 0; i < count; i++) { + cars.play(); + } + + ResultView.printWinner(cars.whoIsWinner(cars.getAllCarList())); + } +} \ No newline at end of file diff --git a/src/test/java/racingCar/ValidationUtilsTest.java b/src/test/java/racingCar/ValidationUtilsTest.java new file mode 100644 index 000000000..fc7b3bc8b --- /dev/null +++ b/src/test/java/racingCar/ValidationUtilsTest.java @@ -0,0 +1,26 @@ +package racingCar; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class ValidationUtilsTest { + + @Test + void 문자열_쉼표_포함_확인() { + Assertions.assertFalse(ValidationUtils.hasComma("pobicronghonux")); + Assertions.assertTrue(ValidationUtils.hasComma("pobi,crong,honux")); + } + + @Test + void 이름_5자_초과_확인() { + Assertions.assertTrue(ValidationUtils.isLengthOver("honux")); + Assertions.assertFalse(ValidationUtils.isLengthOver("pobixx")); + } + + @Test + void 시도_횟수_양수_확인() { + Assertions.assertFalse(ValidationUtils.isPositiveNumber(-1)); + Assertions.assertFalse(ValidationUtils.isPositiveNumber(0)); + Assertions.assertTrue(ValidationUtils.isPositiveNumber(1)); + } +} \ No newline at end of file