diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index b60a35d64..8e8932f4e 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -3,38 +3,32 @@ import java.util.Random; public class Car { - private static final int START_LOCATION=0; - private final String name; - private int location; + private static final int MAX_BOUND=10; + private final Name name; + private final Location location; - public Car(String name) throws RuntimeException { - if(name.length()>5){ - throw new RuntimeException("자동차 이름은 5글자 이내여야 합니다."); - } - if(name.trim().isEmpty()){ - throw new RuntimeException("자동차 이름은 공백일 수 없습니다."); - } + public Car(Name name) { this.name = name; - this.location=START_LOCATION; + this.location=new Location(); } - public int randomNumGenerator(){ + protected int randomNumGenerator(){ Random random = new Random(); - return random.nextInt(10); + return random.nextInt(MAX_BOUND); } public void forward(){ int randomNum = randomNumGenerator(); - if(randomNum>4){ - this.location++; + if(randomNum>=4){ + this.location.forward(); } } - public int getLocation() { + public Location getLocation() { return this.location; } - public String getName() { + public Name getName() { return this.name; } } diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index 37a84075c..80136b32b 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -3,37 +3,44 @@ import java.util.*; import java.util.stream.Collectors; -import static java.util.Collections.max; - public class Cars { private final List carList = new ArrayList<>(); - public void addCar(Car car){ - this.carList.add(car); + public Cars(String[] strings) { + for (String s : strings) { + Name name = new Name(s); + carList.add(new Car(name)); + } } - public void forwardAll(){ + public void forwardAll() { carList.forEach(Car::forward); } - public int maxLocation(){ - return max(carList.stream().map(Car::getLocation).collect(Collectors.toList())); + public Location maxLocation() { + Location location = new Location(); + for (Car c : carList) { + if (c.getLocation().isGreaterThan(location)) { + location = c.getLocation(); + } + } + return location; } - public String getMaxNames(){ + public String getMaxNames() { List result = new ArrayList<>(); - for(Car c: carList){ - if(c.getLocation()==maxLocation()){ - result.add(c.getName()); + for (Car c : carList) { + if (c.getLocation().equals(maxLocation())) { + result.add(c.getName().getName()); } } - if(!result.isEmpty()){ + if (!result.isEmpty()) { return String.join(",", result); } - throw new RuntimeException("최대로 이동한 자동차를 찾을 수 없습니다."); + throw new RuntimeException("최댓값을 가진 이름을 반환할 수 없습니다"); } - public List getCarList(){ + public List getCarList() { return carList.stream().collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)); } } diff --git a/src/main/java/racingcar/domain/Location.java b/src/main/java/racingcar/domain/Location.java new file mode 100644 index 000000000..a29e4f600 --- /dev/null +++ b/src/main/java/racingcar/domain/Location.java @@ -0,0 +1,43 @@ +package racingcar.domain; + +import java.util.Objects; + +public class Location{ + private int location; + + public Location() { + this.location=0; + } + public Location(int location) { + this.location = location; + } + + public void forward(){ + this.location++; + } + + public String makeBar(){ + StringBuilder result = new StringBuilder(); + for(int i=0;i o.location; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Location location1 = (Location) o; + return location == location1.location; + } + + @Override + public int hashCode() { + return Objects.hash(location); + } +} diff --git a/src/main/java/racingcar/domain/Name.java b/src/main/java/racingcar/domain/Name.java new file mode 100644 index 000000000..f593d1216 --- /dev/null +++ b/src/main/java/racingcar/domain/Name.java @@ -0,0 +1,36 @@ +package racingcar.domain; + +import java.util.Objects; + +public class Name { + private final String name; + private static final int MAX_LENGTH = 5; + + public Name(String name) throws IllegalArgumentException { + if (name==null || name.trim().isEmpty()) { + throw new IllegalArgumentException("자동차 이름은 공백일 수 없습니다."); + } + + if (name.length() >= MAX_LENGTH) { + throw new IllegalArgumentException("자동차 이름은 5글자 이내여야 합니다."); + } + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Name name1 = (Name) o; + return Objects.equals(name, name1.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 59f0c5616..ecca2c85a 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -14,11 +14,7 @@ public Cars makeCars() { String input = scanner.next(); String[] strings = input.split(","); - Cars cars = new Cars(); - for (String s : strings) { - cars.addCar(new Car(s)); - } - return cars; + return new Cars(strings); } public int getTries(){ diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index e94850a44..24d4eb75b 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -4,17 +4,10 @@ import racingcar.domain.Cars; public class OutputView { - public String locationToLine(int location){ - StringBuilder result = new StringBuilder(); - for(int i=0;i new Car(name)).isInstanceOf(RuntimeException.class); + assertThatThrownBy(()-> new Car(new Name("sonata"))).isInstanceOf(IllegalArgumentException.class); } @Test - @DisplayName("랜덤 숫자가 0~9 사이인지 테스트") - public void randomNumTest(){ - assertThat(car.randomNumGenerator()).matches(integer -> integer>=0 && integer<=9); + @DisplayName("전진이 제대로 수행되는지 테스트") + public void forwardTest(){ + Car car = new Car(new Name("jeep")){ + @Override + protected int randomNumGenerator() { + return 3; + } + }; + car.forward(); + assertThat(car.getLocation()).isEqualTo(new Location(0)); } @Test - @DisplayName("전진이 제대로 수행되는지 테스트") - public void forwardTest(){ + @DisplayName("전진이 제대로 수행되는지 테스트2") + public void forwardTest2(){ + Car car = new Car(new Name("jeep")){ + @Override + protected int randomNumGenerator() { + return 4; + } + }; car.forward(); - assertThat(car.getLocation()).isIn(0,1); + assertThat(car.getLocation()).isEqualTo(new Location(1)); } } diff --git a/src/test/java/racingcar/domain/CarsTest.java b/src/test/java/racingcar/domain/CarsTest.java index 60030e1b0..70faf7ac7 100644 --- a/src/test/java/racingcar/domain/CarsTest.java +++ b/src/test/java/racingcar/domain/CarsTest.java @@ -10,24 +10,13 @@ public class CarsTest { Cars cars; @BeforeEach public void setUp(){ - cars = new Cars(); - cars.addCar(new Car("ray")); - cars.addCar(new Car("audi")); - cars.addCar(new Car("benz")); - cars.addCar(new Car("tico")); + cars = new Cars(new String[]{"ray", "audi", "benz", "tico"}); cars.forwardAll(); } - @Test - @DisplayName("max 값이 정상적으로 도출되는지 확인") - public void maxTest(){ - assertThat(cars.maxLocation()).isEqualTo(1); - } - @Test @DisplayName("우승 자동차의 이름 출력되는지 확인") public void getNameTest(){ assertThat(cars.getMaxNames()).isNotNull(); } - } diff --git a/src/test/java/racingcar/domain/LocationTest.java b/src/test/java/racingcar/domain/LocationTest.java new file mode 100644 index 000000000..9c8d1c2c0 --- /dev/null +++ b/src/test/java/racingcar/domain/LocationTest.java @@ -0,0 +1,28 @@ +package racingcar.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LocationTest { + Location l1 = new Location(); + Location l2 = new Location(); + + @Test + void forwardTest1(){ + l1.forward(); + l1.forward(); + assertThat(l1).isEqualTo(new Location(2)); + } + + @Test + void forwardTest2(){ + assertThat(l2).isEqualTo(new Location(0)); + } + + @Test + void compareTest(){ + assertThat(new Location(2).isGreaterThan(new Location(0))).isTrue(); + assertThat(new Location(1).isGreaterThan(new Location(2))).isFalse(); + } +} diff --git a/src/test/java/racingcar/domain/NameTest.java b/src/test/java/racingcar/domain/NameTest.java new file mode 100644 index 000000000..8b7aa7549 --- /dev/null +++ b/src/test/java/racingcar/domain/NameTest.java @@ -0,0 +1,24 @@ +package racingcar.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class NameTest { + @Test + @DisplayName("Name 5글자 이상일 경우 예외 발생 테스트") + void checkValid1(){ + assertThatThrownBy(() -> new Name("giant")).isInstanceOf(IllegalArgumentException.class); + } + @Test + @DisplayName("Name 비어있을 경우 예외 발생 테스트") + void checkValid2(){ + assertThatThrownBy(() -> new Name("")).isInstanceOf(IllegalArgumentException.class); + } + @Test + @DisplayName("Name 비어있을 경우 예외 발생 테스트2") + void checkValid3(){ + assertThatThrownBy(() -> new Name(" ")).isInstanceOf(IllegalArgumentException.class); + } +}