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
12 changes: 10 additions & 2 deletions src/main/java/RacingMain.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import controller.RacingController;

import java.io.IOException;

public class RacingMain {

public static void main(String[] args) {
public static void main(String[] args) throws IOException {
// TODO: MVC 패턴을 기반으로 자동차 경주 미션 구현해보기
System.out.println("Hello, World!");

RacingController rcController = new RacingController();

rcController.run();

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

import domain.Car;
import domain.Cars;
import domain.TryCount;
import view.InputView;
import view.OutputView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

public class RacingController {

public void run() throws IOException {
// 차량 이름 입력
Cars cars = new Cars(InputView.setCarName());

// 시도 횟수 입력
TryCount tryCount = new TryCount(InputView.setTryCount());

printResult(cars, tryCount);

findWinner(cars);
}

// 결과 출력
public void printResult(Cars cars, TryCount tryCount){
for (int i = 0; i < tryCount.getTryCount(); i++){
for (Car car : cars.getCars()){
car.moveCar();
}

OutputView.printRacing(cars.getCars());
}
}

public void findWinner(Cars cars){
OutputView.printWinner(cars.getCars());
}
}
34 changes: 34 additions & 0 deletions src/main/java/domain/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package domain;

// 자동차
public class Car {
private static final int RANDOM_MINIMUM = 4;
private final CarName name;
private final CarPosition position;

// 차량 초기 설정
public Car(String name){
this.name = new CarName(name);
this.position = new CarPosition();
}

// 차량 이름 반환
public String getCarName(){
return name.getCarName();
}

// 차량 위치 반환
public int getCarPosition(){
return position.getCarPosition();
}

// 차량 한칸 이동 (전진)
public void moveCar(){
int random_number = (int)(Math.random() * 9);

if (random_number >= RANDOM_MINIMUM){
position.movePosition();
}

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

public class CarName {
private final String carName;

public CarName(String name){
if (name.length() > 5 || name.length() < 1)
throw new IllegalArgumentException("[ERROR]");

this.carName = name;
}

public String getCarName(){
return carName;
}
}
21 changes: 21 additions & 0 deletions src/main/java/domain/CarPosition.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package domain;

public class CarPosition {
private static final int START_POSITION = 0;
private int myPosition;

public CarPosition(){
// 자동차 초기 위치 설정
myPosition = START_POSITION;
}

// 차량 위치 반환
public int getCarPosition(){
return myPosition;
}

// 차량 전진
public void movePosition(){
myPosition++;
}
}
36 changes: 36 additions & 0 deletions src/main/java/domain/Cars.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package domain;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

// 자동차 모음
public class Cars {
private final List<Car> cars;

public Cars(List<String> carNames){
cars = new ArrayList<>();

createCarList(carNames);
}

// 차량 리스트 생성
public void createCarList(List<String> carNames){
for (String carName : carNames){
Car car = new Car(carName);
cars.add(car);
}
}

// 차량 목록 반환
public List<Car> getCars(){
return cars;
}

// 차량 목록 이동
public void moveCars(){
for (Car car : cars){
car.moveCar();
}
}
}
19 changes: 19 additions & 0 deletions src/main/java/domain/TryCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package domain;

public class TryCount {
private static final int MINIMUM = 1;
private int tryCount;

// 시도 횟수
public TryCount(int count){
if (count < MINIMUM)
throw new IllegalArgumentException("[ERROR]");

this.tryCount = count;
}

// 시도 횟수 반환
public int getTryCount(){
return tryCount;
}
}
30 changes: 30 additions & 0 deletions src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package view;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

public class InputView {
private static final BufferedReader br
= new BufferedReader(new InputStreamReader(System.in));

// 차량 이름 입력
public static List<String> setCarName() throws IOException {
System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).");

String str = br.readLine();

return Arrays.asList(str.split(","));
}

// 시도 횟수 입력
public static int setTryCount() throws IOException {
System.out.println("시도할 회수는 몇회인가요?");

String str = br.readLine();

return Integer.parseInt(str);
}
}
41 changes: 41 additions & 0 deletions src/main/java/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package view;

import domain.Car;
import domain.Cars;

import java.util.ArrayList;
import java.util.List;

public class OutputView {

// 결과 출력
public static void printRacing(List<Car> cars){
for (Car car : cars){
System.out.print(car.getCarName() + " : ");
for (int i = 0; i < car.getCarPosition(); i++)
System.out.print("-");
System.out.println();
}
System.out.println();
}

// 우승자 출력
public static void printWinner(List<Car> cars){
int max = 0;
List<String> winners = new ArrayList<>();

for (Car car : cars){
if (car.getCarPosition() > max)
max = car.getCarPosition();
}

for (Car car : cars){
if (car.getCarPosition() == max)
winners.add(car.getCarName());
}

String winnerResult = String.join(", ", winners);

System.out.println(winnerResult + "가 최종 우승했습니다.");
}
}
30 changes: 30 additions & 0 deletions src/test/java/domain/CarNameTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package domain;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

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

public class CarNameTest {
@DisplayName("차량 이름은 1~5자 사이여야 한다")
@ParameterizedTest
@CsvSource(value = {"'', 차량 이름이 존재해야 합니다.",
"123456, 차량 이름은 5글자 이하여야 합니다.",
"123456789, 이름은 5글자 이하여야 합니다."})

void 이름_예외_발생(String carName, String errorMessage) {
assertThatThrownBy(() -> new CarName(carName))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage(errorMessage);
}

@DisplayName("1~5글자 이름은 유효")
@ParameterizedTest
@CsvSource(value = {"1", "123", "123", "1234"})
void 유효한_이름(String carName) {
assertThatCode(() -> new CarName(carName))
.doesNotThrowAnyException();
}
}
23 changes: 23 additions & 0 deletions src/test/java/domain/CarTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package domain;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

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

public class CarTest {
@DisplayName("랜덤 숫자가 0~3일 때는 움직이지 않음")
@ParameterizedTest
@CsvSource(value = {"0,0", "1,0", "2,0", "3,0"})
void 움직이지_않음(int number, int position) {

}

@DisplayName("랜덤 숫자가 4~9일 때는 움직임")
@ParameterizedTest
@CsvSource(value = {"4,1", "5,1", "6,1", "7,1", "8,1", "9,1"})
void 움직임(int number, int distance) {

}
}
19 changes: 19 additions & 0 deletions src/test/java/domain/CarsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package domain;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import java.util.ArrayList;
import java.util.List;

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

public class CarsTest {
@DisplayName("자동차 이름이 중복되면 예외 처리")
@ParameterizedTest
@CsvSource(value = {"1", "1", "2"})
void 차량_이름_중복(int size) {

}
}
24 changes: 24 additions & 0 deletions src/test/java/domain/TryCountTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package domain;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

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

public class TryCountTest {
@DisplayName("시도 횟수가 양의 정수면 유효")
@ParameterizedTest
@CsvSource(value = {"1", "10", "100", "1000"})
void 시도_횟수_양수(int number) {

}

@DisplayName("시도 횟수가 0 이하 혹은 음수면 예외를 던진다")
@ParameterizedTest
@CsvSource(value = {"0", "-1", "-100", "-1000"})
void 시도_횟수_음수(int number) {

}
}