From 4b14138c0ba78df94814ac8f0b3efb08078aad6f Mon Sep 17 00:00:00 2001 From: oliviarla Date: Mon, 20 Jun 2022 20:52:55 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EA=B2=BD=EC=A3=BC=20=EA=B2=8C=EC=9E=84=20=EB=8B=A4=EC=8B=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Car.java | 28 +++++------- src/main/java/racingcar/domain/Cars.java | 35 +++++++++------ src/main/java/racingcar/domain/Location.java | 43 +++++++++++++++++++ src/main/java/racingcar/domain/Name.java | 34 +++++++++++++++ src/main/java/racingcar/view/InputView.java | 6 +-- src/main/java/racingcar/view/OutputView.java | 9 +--- src/test/java/racingcar/domain/CarTest.java | 35 ++++++++------- src/test/java/racingcar/domain/CarsTest.java | 13 +----- .../java/racingcar/domain/LocationTest.java | 28 ++++++++++++ src/test/java/racingcar/domain/NameTest.java | 24 +++++++++++ 10 files changed, 184 insertions(+), 71 deletions(-) create mode 100644 src/main/java/racingcar/domain/Location.java create mode 100644 src/main/java/racingcar/domain/Name.java create mode 100644 src/test/java/racingcar/domain/LocationTest.java create mode 100644 src/test/java/racingcar/domain/NameTest.java 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..a891cc4ad --- /dev/null +++ b/src/main/java/racingcar/domain/Name.java @@ -0,0 +1,34 @@ +package racingcar.domain; + +import java.util.Objects; + +public class Name { + private final String name; + + public Name(String name) throws IllegalArgumentException { + if (name.length() >= 5) { + throw new IllegalArgumentException("자동차 이름은 5글자 이내여야 합니다."); + } + if (name.trim().isEmpty()) { + throw new IllegalArgumentException("자동차 이름은 공백일 수 없습니다."); + } + 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..4411b3046 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); + } +} From 21490bea09d19c9f0a27351ed65c5959c89ea5cb Mon Sep 17 00:00:00 2001 From: oliviarla Date: Mon, 27 Jun 2022 09:48:26 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20getName=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EC=99=80=20Name=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EC=B2=B4=ED=81=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Name.java | 10 ++++++---- src/main/java/racingcar/view/OutputView.java | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/racingcar/domain/Name.java b/src/main/java/racingcar/domain/Name.java index a891cc4ad..f593d1216 100644 --- a/src/main/java/racingcar/domain/Name.java +++ b/src/main/java/racingcar/domain/Name.java @@ -4,14 +4,16 @@ public class Name { private final String name; + private static final int MAX_LENGTH = 5; public Name(String name) throws IllegalArgumentException { - if (name.length() >= 5) { - throw new IllegalArgumentException("자동차 이름은 5글자 이내여야 합니다."); - } - if (name.trim().isEmpty()) { + if (name==null || name.trim().isEmpty()) { throw new IllegalArgumentException("자동차 이름은 공백일 수 없습니다."); } + + if (name.length() >= MAX_LENGTH) { + throw new IllegalArgumentException("자동차 이름은 5글자 이내여야 합니다."); + } this.name = name; } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 4411b3046..24d4eb75b 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -7,7 +7,7 @@ public class OutputView { public void outputCars(Cars cars){ for(Car c: cars.getCarList()){ - System.out.print(c.getName()+" : "+c.getLocation().makeBar()+"\n"); + System.out.print(c.getName().getName()+" : "+c.getLocation().makeBar()+"\n"); } System.out.println(); }