diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..0fe840e8 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,34 @@ +import domain.Race; +import view.InputView; +import view.ResultView; + +public class Application { + + private static Race race; + private static int round; + public static void main(String[] args) { + while(true){ + if (getValiedNames()){ + break; //5글자를 넘는 이름을 입력받는 경우 재시도 + } + } + round = InputView.getTryCount(); + runRace(); + ResultView.printWinners(race.getWinner()); + } + + private static boolean getValiedNames() { + try{ + race = new Race(InputView.getCarNames()); + return true; + }catch (IllegalArgumentException e){ + System.out.println(e.getMessage()); + } + return false; + } + + private static void runRace(){ + System.out.println("domain.Race result"); + race.runRace(round); + } +} diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java new file mode 100644 index 00000000..1fdf5b7e --- /dev/null +++ b/src/main/java/domain/Car.java @@ -0,0 +1,47 @@ +package domain; + +public class Car { + private String name; + private int location; + + public Car(String name) throws IllegalArgumentException { + this.setName(name); + this.location = 0; + } + + //private 속성들에 대한 getter 및 setter + public String getName() { + return name; + } + public void setName(String name) throws IllegalArgumentException { + if(name.length()>5){ + throw new IllegalArgumentException("name is must be less than 5 characters"); + } + this.name = name; + } + public int getLocation() { + return location; + } + + //랜덤으로 speed 값을 생성하는 대신, speed를 파라미터로 입력받아 자동차를 이동 + public void move(int speed) throws IllegalArgumentException { + if(speed > 9 || speed < 0){ + throw new IllegalArgumentException("speed is must be between 0 and 9"); + } + this.location = calculateNextLocation(speed); + + } + + //speed값을 기준으로 다음 위치 계산 + private int calculateNextLocation(int speed){ + if(speed >= 4){ + return this.location+1; + } + return this.location; + } + + + + + +} diff --git a/src/main/java/domain/Race.java b/src/main/java/domain/Race.java new file mode 100644 index 00000000..39d26007 --- /dev/null +++ b/src/main/java/domain/Race.java @@ -0,0 +1,80 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Race { + final private List cars; + private List winners; + + //domain.Race 생성자 : ","를 이용해 구분하여 레이스에 참가하는 차량의 이름을 입력 + public Race(String nameOfCars) throws IllegalArgumentException { + String[] carNames = nameOfCars.split(","); + + cars = new ArrayList<>(); + for (String carName : carNames) { + cars.add(new Car(carName)); + } + } + + //getter + public List getWinner() { + return winners; + } + + //레이스 실행 + public void runRace(int round){ + //주어진 횟수동안 이동 + for(int i=0; i(); + + for(Car car: cars){ + addWinners(car, maxLocation); + } + } + + //승자 추가하기 + private void addWinners(Car car, int maxLocation){ + if(car.getLocation() == maxLocation){ + winners.add(car); + } + } + +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..431a3ecb --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,18 @@ +package view; + +import java.util.Scanner; + +public class InputView { + private final static Scanner scanner = new Scanner(System.in); + + public static String getCarNames(){ + System.out.println("Enter names of cars which join the race (Names are separated by commas)"); + return scanner.nextLine(); + } + + public static int getTryCount(){ + System.out.println("Enter rounds of race"); + return scanner.nextInt(); + } + +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java new file mode 100644 index 00000000..245e3ce5 --- /dev/null +++ b/src/main/java/view/ResultView.java @@ -0,0 +1,17 @@ +package view; + +import domain.Car; + +import java.util.ArrayList; +import java.util.List; + +public class ResultView { + public static void printWinners(List winners) { + List winnerNames = new ArrayList<>(); + for (Car winner : winners) { + winnerNames.add(winner.getName()); + } + String result = String.join(", ", winnerNames) + " is(are) winners"; + System.out.println(result); + } +} diff --git a/src/test/java/TestCar.java b/src/test/java/TestCar.java new file mode 100644 index 00000000..60544405 --- /dev/null +++ b/src/test/java/TestCar.java @@ -0,0 +1,58 @@ +import domain.Car; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Nested; + +import java.util.Random; + +import static org.assertj.core.api.Assertions.*; + +@DisplayName("움직이는 자동차 테스트") +public class TestCar { + + @Nested + @DisplayName("움직이는 자동차 기능테스트") + class TestCarFeatures{ + + @Test + @DisplayName("이동 테스트") + void testMove(){ + //given + final Car testCar = new Car("test"); + + //when + //자동차 이동시키기 + int testSpeed = new Random().nextInt(10); + testCar.move(testSpeed); + + //then + if(testSpeed >= 4){ + assertThat(1).isEqualTo(testCar.getLocation()); + return; + } + assertThat(0).isEqualTo(testCar.getLocation()); + } + } + + @Nested + @DisplayName("움직이는 자동차 예외테스트") + class TestCarExceptions{ + + @Test + @DisplayName("이동 예외 테스트") + void testMoveException(){ + //given + final Car testCar = new Car("test"); + + //when + assertThatThrownBy(()-> testCar.move(-1)).hasMessage("speed is must be between 0 and 9"); + assertThatThrownBy(()-> testCar.move(10)).hasMessage("speed is must be between 0 and 9"); + } + + @Test + @DisplayName("차량 생성 예외 테스트") + void testCarCreationException(){ + assertThatThrownBy(()-> new Car("123456")).hasMessage("name is must be less than 5 characters"); + } + } +} diff --git a/src/test/java/TestRace.java b/src/test/java/TestRace.java new file mode 100644 index 00000000..bd4ddc41 --- /dev/null +++ b/src/test/java/TestRace.java @@ -0,0 +1,40 @@ +import domain.Race; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Nested; + +import static org.assertj.core.api.Assertions.*; + +@DisplayName("자동차 경주 테스트") +public class TestRace { + + @Nested + @DisplayName("자동차 경주 기능 테스트") + class TestRaceFeatures{ + + @Test + @DisplayName("우승 자동차 구하기 테스트") + void testRace(){ + //given + final Race testRace = new Race("test1,test2,test3"); + + //when + //5회 동안 경주 + testRace.runRace(5); + + //then + assertThat(testRace.getWinner().get(0)).isNotNull(); + } + } + + @Nested + @DisplayName("자동차 경주 예외 테스트") + class TestRaceExceptions{ + + @Test + @DisplayName("경주 생성 예외 테스트") + void testRaceCreationException(){ + assertThatThrownBy(() -> new Race("1234,12345,123456")).hasMessage("name is must be less than 5 characters"); + } + } +}