Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
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
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,10 @@
# java-racingcar-precourse
# java-racingcar-precourse

# 기능 목록 정리

1. n대의 자동차 이름 입력 기능
2. 이름 글자 제한
3. 전진 기능
4. 시행 횟수 입력 기능
5. 우승자 표시 기능
6. 예외 처리 기능
10 changes: 10 additions & 0 deletions src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package racingcar;

import racingcar.controller.RaceController;

public class Application {
public static void main(String[] args) {
RaceController controller = new RaceController();
controller.run();
}
}
26 changes: 26 additions & 0 deletions src/main/java/racingcar/controller/RaceController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package racingcar.controller;

import racingcar.model.Car;
import racingcar.model.Race;
import racingcar.view.InputView;
import racingcar.view.OutputView;

import java.util.List;

public class RaceController {
public void run(){
String[] carNames = InputView.getCarNames();
int numberOfAttempts = InputView.getNumberOfAttempts();

Race race = new Race(carNames);
OutputView.printOutput();
for (int i = 0; i < numberOfAttempts; i++) {
race.race();
OutputView.printRace(race.getCars());
}

List<String> winners = race.getWinners();
OutputView.printWinners(winners);

}
}
35 changes: 35 additions & 0 deletions src/main/java/racingcar/model/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package racingcar.model;

import java.util.Random;

public class Car {
private static final int MINIMUM_NUM = 4;
private String name;
private int position = 0;

public Car(String name){
if (name == null || name.isEmpty() || name.length() > 5) {
throw new IllegalArgumentException("자동차 이름은 1자 이상, 5자 이하로 입력하세요.");
}
this.name = name;
}

public void move(){
if(canMove()){
position++;
}
}

private boolean canMove() {
Random random = new Random();
return random.nextInt(10) >= MINIMUM_NUM;
}

public int getPosition(){
return position;
}

public String getName(){
return name;
}
}
37 changes: 37 additions & 0 deletions src/main/java/racingcar/model/Race.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package racingcar.model;

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

public class Race {
private final List<Car> cars;

public Race(String[] carNames) {
cars = new ArrayList<>();
for (String name : carNames) {
cars.add(new Car(name));
}
}

public List<Car> getCars(){
return cars;
}

public void race() {
for (Car car : cars) {
car.move();
}
}

public List<String> getWinners(){
int maxPosition = cars.stream()
.mapToInt(Car::getPosition)
.max()
.orElse(0);
return cars.stream()
.filter(car -> car.getPosition() == maxPosition)
.map(Car::getName)
.collect(Collectors.toList());
}
}
17 changes: 17 additions & 0 deletions src/main/java/racingcar/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package racingcar.view;

import java.util.Scanner;

public class InputView {
private static final Scanner scanner = new Scanner(System.in);

public static String[] getCarNames(){
System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분");
return scanner.nextLine().split(",");
}

public static int getNumberOfAttempts(){
System.out.println("시도할 회수는 몇회인가요?");
return scanner.nextInt();
}
}
21 changes: 21 additions & 0 deletions src/main/java/racingcar/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package racingcar.view;

import racingcar.model.Car;

import java.util.List;

public class OutputView {

public static void printOutput(){
System.out.println("\n실행 결과");
}
public static void printRace(List<Car> cars) {
for (Car car : cars) {
System.out.println(car.getName() + " : " + "-".repeat(car.getPosition()));
}
}

public static void printWinners(List<String> winners) {
System.out.println("최종 우승자 : " + String.join(", ", winners));
}
}
39 changes: 39 additions & 0 deletions src/test/java/racingcar/model/CarTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package racingcar.model;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;

class CarTest {

@Test
void move() {
Car car = new Car("pobi");
int initialPosition = car.getPosition();
car.move();
assertThat(car.getPosition()).isGreaterThanOrEqualTo(initialPosition);
}

@Test
void getPosition() {
Car car = new Car("pobi");
assertThat(car.getPosition()).isEqualTo(0);
car.move();
assertThat(car.getPosition()).isGreaterThanOrEqualTo(0);
}

@Test
void getName() {
Car car = new Car("pobi");
assertThat(car.getName()).isEqualTo("pobi");
}

@Test
void createCar() {
Car car = new Car("pobi");
assertThat(car.getName()).isEqualTo("pobi");
assertThat(car.getPosition()).isEqualTo(0);
}

}
44 changes: 44 additions & 0 deletions src/test/java/racingcar/model/RaceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package racingcar.model;

import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;

class RaceTest {

@Test
void getCars() {
String[] carNames = {"pobi", "woni", "jun"};
Race race = new Race(carNames);
List<Car> cars = race.getCars();

assertThat(cars).hasSize(3);
assertThat(cars.get(0).getName()).isEqualTo("pobi");
assertThat(cars.get(1).getName()).isEqualTo("woni");
assertThat(cars.get(2).getName()).isEqualTo("jun");
}

@Test
void race() {
String[] carNames = {"pobi", "woni", "jun"};
Race race = new Race(carNames);
race.race();

List<Car> cars = race.getCars();
for (Car car : cars) {
assertThat(car.getPosition()).isGreaterThanOrEqualTo(0);
}
}

@Test
void getWinners() {
String[] carNames = {"pobi", "woni", "jun"};
Race race = new Race(carNames);
race.race();

List<String> winners = race.getWinners();
assertThat(winners).isNotEmpty();
}
}