Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apply plugin: 'eclipse'

group = 'camp.nextstep'
version = '1.0.0'
sourceCompatibility = '1.8'
sourceCompatibility = "11"

repositories {
mavenCentral()
Expand All @@ -17,3 +17,5 @@ dependencies {
test {
useJUnitPlatform()
}

targetCompatibility = JavaVersion.VERSION_11
30 changes: 30 additions & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -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()));
}
}
43 changes: 43 additions & 0 deletions src/main/java/racingCar/Car.java
Original file line number Diff line number Diff line change
@@ -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);
}

}
47 changes: 47 additions & 0 deletions src/main/java/racingCar/Cars.java
Original file line number Diff line number Diff line change
@@ -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<Car> 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<Car> whoIsWinner(List<Car> cars) {
int maxDistance = cars.stream()
.mapToInt(Car::getMovedDistance)
.max()
.orElseThrow();

return cars.stream()
.filter(e -> e.getMovedDistance() == maxDistance)
.collect(Collectors.toList());
}

public List<Car> getAllCarList() {
return this.cars;
}

}
22 changes: 22 additions & 0 deletions src/main/java/racingCar/ResultView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package racingCar;

import java.util.List;
import java.util.stream.Collectors;

public class ResultView {

public static void printRoundResult(List<Car> cars) {
for (Car car : cars) {
System.out.println(car.getCarName() + " : " + car.getPositionVisual());
}
System.out.println();
}

public static void printWinner(List<Car> winners) {
String winner = winners.stream()
.map(Car::getCarName)
.collect(Collectors.joining(", "));

System.out.println(winner + "가 최종 우승했습니다.");
}
}
19 changes: 19 additions & 0 deletions src/main/java/racingCar/ValidationUtils.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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);
}
}

7 changes: 7 additions & 0 deletions src/main/java/racingCar/randomNumber/RandomNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package racingCar.randomNumber;

public interface RandomNumber {

int generate();
}

28 changes: 28 additions & 0 deletions src/test/java/racingCar/CarTest.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
47 changes: 47 additions & 0 deletions src/test/java/racingCar/CarsTest.java
Original file line number Diff line number Diff line change
@@ -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()));
}
}
26 changes: 26 additions & 0 deletions src/test/java/racingCar/ValidationUtilsTest.java
Original file line number Diff line number Diff line change
@@ -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));
}
}