From 10dca154c269db0aa9c0f3e26ebe84522c5eb79e Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 15:36:14 +0900 Subject: [PATCH 01/70] =?UTF-8?q?docs(guide):=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=A0=20=EA=B8=B0=EB=8A=A5=EB=AA=A9=EB=A1=9D=EA=B3=BC=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 90a5236..1c5da1b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,20 @@ # 미션 - 자동차 경주 게임 +## 구현할 기능 목록 +- [ ] 차의 이름과 위치를 관리하는 클래스를 구현한다. +- [ ] 0부터 9사이의 정수값을 랜덤하게 생성 +- [ ] 난수가 4이상이면 전진 +- [ ] 난수가 3이하이면 이동하지 않는다 +- [ ] 턴이 모두 지났을 때 가장 앞에 있는 차의 이름을 출력한다. +- [ ] 턴이 모두 지났을 때 앞에 있는 차가 2개 이상일 경우 전부 출력한다. +- [ ] 차의 이름에 대한 입력값을 쉼표로 구분할 수 있다. +- [ ] 시도할 횟수를 입력 받을 수 있다. +- [ ] 현재 자동차의 위치상황을 이름과 함께 출력할 수 있다. + +## 예외 처리 목록 +- [ ] 빈 문자열 입력은 허용하지 않는다. +- [ ] 중복되는 이름의 차를 입력했을 때 허용하지 않는다. + ## 🚀 기능 요구사항 - 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. From 7759d90e99dca4cf71426edc3d59129a36fc93a5 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 15:44:15 +0900 Subject: [PATCH 02/70] =?UTF-8?q?test:=20Car=EC=9D=98=20move=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=ED=98=B8=EC=B6=9C=EC=8B=9C=20=ED=95=9C?= =?UTF-8?q?=EC=B9=B8=20=EC=A0=84=EC=A7=84=ED=95=98=EB=8A=94=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/CarTest.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/test/java/domain/CarTest.java diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java new file mode 100644 index 0000000..fd978f1 --- /dev/null +++ b/src/test/java/domain/CarTest.java @@ -0,0 +1,24 @@ +package domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class CarTest { + + @Test + void moveTest() { + //given + Car car = new Car("name"); + int prev = car.getPosition(); + + //when + car.move(); + int current = car.getPosition(); + + //then + assertThat(current).isEqualTo(prev + 1); + } +} \ No newline at end of file From 29c34ea643469ab8fdf2f2075cf87ede17a5048b Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 15:47:48 +0900 Subject: [PATCH 03/70] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=EA=B0=80=20=EC=9B=80=EC=A7=81=EC=9D=B4=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Car.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index e5b4a0a..f537dfd 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -8,5 +8,11 @@ public Car(String name) { this.name = name; } - // 추가 기능 구현 + public int getPosition() { + return position; + } + + public void move() { + position += 1; + } } From a14473df2c29fde3f03b0dd885a57cf46a28740a Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 16:42:15 +0900 Subject: [PATCH 04/70] =?UTF-8?q?test:=20=EC=A0=84=EC=A7=84=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=ED=8C=90=EB=8B=A8=20test=20code=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/DiscriminatorTest.java | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/test/java/domain/DiscriminatorTest.java diff --git a/src/test/java/domain/DiscriminatorTest.java b/src/test/java/domain/DiscriminatorTest.java new file mode 100644 index 0000000..f4f939d --- /dev/null +++ b/src/test/java/domain/DiscriminatorTest.java @@ -0,0 +1,33 @@ +package domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class DiscriminatorTest { + + @Test + void _4이상이면_전진한다() { + //given + int generatedNumber = 4; + + //when + boolean expected = Discriminator.isMove(generatedNumber); + + //then + assertThat(expected).isTrue(); + } + + @Test + void _3이하이면_움직이지_않는다() { + //given + int generatedNumber = 3; + + //when + boolean expected = Discriminator.isMove(generatedNumber); + + //then + assertThat(expected).isFalse(); + } +} \ No newline at end of file From a51c4e456ec6c5670692ee0864930cc52418835d Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 16:42:49 +0900 Subject: [PATCH 05/70] =?UTF-8?q?feat:=20=EC=A0=84=EC=A7=84=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=ED=8C=90=EB=8B=A8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Discriminator.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/domain/Discriminator.java diff --git a/src/main/java/domain/Discriminator.java b/src/main/java/domain/Discriminator.java new file mode 100644 index 0000000..ba6b75b --- /dev/null +++ b/src/main/java/domain/Discriminator.java @@ -0,0 +1,9 @@ +package domain; + +public class Discriminator { + private static final int THRESHOLD = 4; + + public static boolean isMove(int randomNumber) { + return (randomNumber >= THRESHOLD); + } +} From d56921b601e143527b6b215859d2861c0a5cc56b Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 16:48:08 +0900 Subject: [PATCH 06/70] =?UTF-8?q?feat:=200~9=20=EB=B2=94=EC=9C=84=EC=9D=98?= =?UTF-8?q?=20=EB=82=9C=EC=88=98=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/util/RandomGenerator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/util/RandomGenerator.java diff --git a/src/main/java/util/RandomGenerator.java b/src/main/java/util/RandomGenerator.java new file mode 100644 index 0000000..f81b259 --- /dev/null +++ b/src/main/java/util/RandomGenerator.java @@ -0,0 +1,16 @@ +package util; + +import java.util.Random; + +public class RandomGenerator { + private static final int UPPER_BOUND = 10; + private static final Random RANDOM = new Random(); + + private RandomGenerator(){ + + } + + public static int generateNumber(){ + return RANDOM.nextInt(UPPER_BOUND); + } +} From 3d28c491fa05d2a531140753f8972dfd6afc4db1 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 17:00:43 +0900 Subject: [PATCH 07/70] =?UTF-8?q?test:=20car=20=EA=B0=9D=EC=B2=B4=EB=A5=BC?= =?UTF-8?q?=20CarManager=EC=97=90=20=EC=B6=94=EA=B0=80=ED=95=98=EB=8A=94?= =?UTF-8?q?=20test=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/repository/CarManagerTest.java | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/test/java/repository/CarManagerTest.java diff --git a/src/test/java/repository/CarManagerTest.java b/src/test/java/repository/CarManagerTest.java new file mode 100644 index 0000000..bec201d --- /dev/null +++ b/src/test/java/repository/CarManagerTest.java @@ -0,0 +1,23 @@ +package repository; + +import domain.Car; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class CarManagerTest { + @Test + void Car_객체를_추가한다() { + //given + CarManager carManager = new CarManager(); + Car car = new Car("oereo"); + + //when + carManager.add(car); + int expected = carManager.size(); + + //then + assertThat(expected).isEqualTo(1); + } +} \ No newline at end of file From 4eebc6d2e835bde29c67cbb26e1d16d8b412c228 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 17:12:32 +0900 Subject: [PATCH 08/70] =?UTF-8?q?feat:=20Car=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=86=B5?= =?UTF-8?q?=EA=B3=BC=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 생성된 Car 객체를 보관하는 구현체로는 인메모리 List로 구현 - add method: 관리하는 car 객체 추가 - size method: 관리하고 있는 car 객체 개수 반환 --- src/main/java/repository/CarManager.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/repository/CarManager.java diff --git a/src/main/java/repository/CarManager.java b/src/main/java/repository/CarManager.java new file mode 100644 index 0000000..05af3f4 --- /dev/null +++ b/src/main/java/repository/CarManager.java @@ -0,0 +1,22 @@ +package repository; + +import domain.Car; + +import java.util.ArrayList; +import java.util.List; + +public class CarManager { + private List cars; + + public CarManager() { + cars = new ArrayList<>(); + } + + public void add(Car car) { + cars.add(car); + } + + public int size() { + return cars.size(); + } +} From 69f37d0c27ad62ebc9f6d6202c411a5f7bd01921 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 17:36:12 +0900 Subject: [PATCH 09/70] =?UTF-8?q?test:=20=EC=A4=91=EB=B3=B5=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=9D=B4=EB=A6=84=EC=9D=98=20Car=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=A0=20=EC=8B=9C=20?= =?UTF-8?q?NotDulicateNameException=EB=A5=BC=20=EB=8D=98=EC=A7=80=EB=8A=94?= =?UTF-8?q?=20test=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/repository/CarManagerTest.java | 23 +++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/test/java/repository/CarManagerTest.java b/src/test/java/repository/CarManagerTest.java index bec201d..6b86c7a 100644 --- a/src/test/java/repository/CarManagerTest.java +++ b/src/test/java/repository/CarManagerTest.java @@ -4,13 +4,16 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.junit.jupiter.api.Assertions.*; class CarManagerTest { + + private CarManager carManager = new CarManager(); + @Test void Car_객체를_추가한다() { //given - CarManager carManager = new CarManager(); Car car = new Car("oereo"); //when @@ -20,4 +23,22 @@ class CarManagerTest { //then assertThat(expected).isEqualTo(1); } + + @Test + void 중복되는_이름의_Car_객체를_추가를_하면_NotDuplicateNameException을_던진다() { + //given + Car oereo = new Car("oereo"); + Car pkalsh = new Car("pkalsh"); + Car kouz95 = new Car("kouz95"); + Car pkalsh2 = new Car("pkalsh"); + + //when + carManager.add(oereo); + carManager.add(pkalsh); + carManager.add(kouz95); + + //then + assertThatExceptionOfType(NotDuplicatedNameException.class) + .isThrownBy(carManager.add(pkalsh2)); + } } \ No newline at end of file From 7d614b4d77ae3edc525130b58db1e65a804fbda9 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 17:47:53 +0900 Subject: [PATCH 10/70] =?UTF-8?q?fix:=20=EB=8F=85=EB=A6=BD=EB=90=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/repository/CarManagerTest.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/test/java/repository/CarManagerTest.java b/src/test/java/repository/CarManagerTest.java index 6b86c7a..3a3d91e 100644 --- a/src/test/java/repository/CarManagerTest.java +++ b/src/test/java/repository/CarManagerTest.java @@ -1,7 +1,9 @@ package repository; import domain.Car; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import repository.exception.NotDuplicateNameException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -9,7 +11,12 @@ class CarManagerTest { - private CarManager carManager = new CarManager(); + private CarManager carManager; + + @BeforeEach + void setup() { + carManager = new CarManager(); + } @Test void Car_객체를_추가한다() { @@ -38,7 +45,7 @@ class CarManagerTest { carManager.add(kouz95); //then - assertThatExceptionOfType(NotDuplicatedNameException.class) - .isThrownBy(carManager.add(pkalsh2)); + assertThatExceptionOfType(NotDuplicateNameException.class) + .isThrownBy(() -> carManager.add(pkalsh2)); } } \ No newline at end of file From 0c6bb59ab8456dd1603002c0172dff839fe2df90 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 17:48:59 +0900 Subject: [PATCH 11/70] =?UTF-8?q?feat:=20=EC=A4=91=EB=B3=B5=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=9D=B4=EB=A6=84=EC=9D=98=20Car=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A5=BC=20=EA=B2=80=EC=82=AC=ED=95=98=EA=B3=A0=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EB=A9=B4=20NotDuplicateNameExceptio?= =?UTF-8?q?n=20=EB=8D=98=EC=A7=80=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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/domain/Car.java | 17 +++++++++++++++++ src/main/java/repository/CarManager.java | 9 +++++++++ .../exception/NotDuplicateNameException.java | 7 +++++++ 3 files changed, 33 insertions(+) create mode 100644 src/main/java/repository/exception/NotDuplicateNameException.java diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index f537dfd..2241e8c 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -1,5 +1,9 @@ package domain; +import domain.exception.NotBlankException; + +import java.util.Objects; + public class Car { private final String name; private int position = 0; @@ -15,4 +19,17 @@ public int getPosition() { public void move() { position += 1; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Car car = (Car) o; + return name.equals(car.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } diff --git a/src/main/java/repository/CarManager.java b/src/main/java/repository/CarManager.java index 05af3f4..623e355 100644 --- a/src/main/java/repository/CarManager.java +++ b/src/main/java/repository/CarManager.java @@ -1,6 +1,7 @@ package repository; import domain.Car; +import repository.exception.NotDuplicateNameException; import java.util.ArrayList; import java.util.List; @@ -13,10 +14,18 @@ public CarManager() { } public void add(Car car) { + checkDuplicateName(car); cars.add(car); } + private void checkDuplicateName(Car car) { + if (cars.contains(car)) { + throw new NotDuplicateNameException("중복되는 이름의 차를 입력하실 수 없습니다."); + } + } + public int size() { return cars.size(); } + } diff --git a/src/main/java/repository/exception/NotDuplicateNameException.java b/src/main/java/repository/exception/NotDuplicateNameException.java new file mode 100644 index 0000000..5ebd2d1 --- /dev/null +++ b/src/main/java/repository/exception/NotDuplicateNameException.java @@ -0,0 +1,7 @@ +package repository.exception; + +public class NotDuplicateNameException extends RuntimeException { + public NotDuplicateNameException(String message) { + super(message); + } +} From 1ff4c7aa7a5cafa45f30f6ef1fb3be7da12eebd3 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 18:00:45 +0900 Subject: [PATCH 12/70] =?UTF-8?q?test:=20Car=20=EA=B0=9D=EC=B2=B4=EC=9D=98?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=EC=97=90=20=EB=A7=9E=EA=B2=8C=20String=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20test=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/CarTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java index fd978f1..4505e96 100644 --- a/src/test/java/domain/CarTest.java +++ b/src/test/java/domain/CarTest.java @@ -9,7 +9,7 @@ class CarTest { @Test - void moveTest() { + void move() { //given Car car = new Car("name"); int prev = car.getPosition(); @@ -21,4 +21,19 @@ void moveTest() { //then assertThat(current).isEqualTo(prev + 1); } + + @Test + void 차의_이름과_위치상황을_출력_포맷에_맞게_String으로_변환한다() { + //given + Car car = new Car("name"); + car.move(); + car.move(); + car.move(); + + //when + String expected = car.toString(); + + //then + assertThat(expected).isEqualTo("name : ---"); + } } \ No newline at end of file From b2daa5da01463fe14149e3dc504034597bf32af3 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 18:01:05 +0900 Subject: [PATCH 13/70] =?UTF-8?q?feat:=20Car=20=EA=B0=9D=EC=B2=B4=EC=9D=98?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=EC=97=90=20=EB=A7=9E=EA=B2=8C=20String=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Car.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index 2241e8c..f3c6d2b 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -20,6 +20,11 @@ public void move() { position += 1; } + @Override + public String toString() { + return name + " : " + "-".repeat(Math.max(0, position)); + } + @Override public boolean equals(Object o) { if (this == o) return true; From 40b18e4eff87e8bb988f778a950b8ebbc859244b Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 18:08:42 +0900 Subject: [PATCH 14/70] =?UTF-8?q?test:=20=EB=B9=88=20String=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20=EA=B0=80=EC=A7=84=20Car=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=A9=B4=20NotBlankException=EC=9D=84=20=EB=8D=98=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20test=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/CarTest.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java index 4505e96..533440f 100644 --- a/src/test/java/domain/CarTest.java +++ b/src/test/java/domain/CarTest.java @@ -1,9 +1,11 @@ package domain; +import domain.exception.NotBlankException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.junit.jupiter.api.Assertions.*; class CarTest { @@ -29,11 +31,18 @@ void move() { car.move(); car.move(); car.move(); - + //when String expected = car.toString(); //then assertThat(expected).isEqualTo("name : ---"); } + + @Test + void 빈문자열의_이름이_주어지면_NotBlankException을_던진다() { + //then + assertThatExceptionOfType(NotBlankException.class) + .isThrownBy(() -> new Car("")); + } } \ No newline at end of file From e16fdb8dbe0bb340cfa56aae4d9e8b2e55c5029a Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 18:09:05 +0900 Subject: [PATCH 15/70] =?UTF-8?q?feat:=20=EB=B9=88=20String=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20=EA=B0=80=EC=A7=84=20Car=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=A9=B4=20NotBlankException=EC=9D=84=20=EB=8D=98=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Car.java | 7 +++++++ src/main/java/domain/exception/NotBlankException.java | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 src/main/java/domain/exception/NotBlankException.java diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index f3c6d2b..693507e 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -9,9 +9,16 @@ public class Car { private int position = 0; public Car(String name) { + checkBlankName(name); this.name = name; } + private void checkBlankName(String name) { + if (name.equals("")) { + throw new NotBlankException("빈 문자열 이름의 차를 생성할 수는 없습니다."); + } + } + public int getPosition() { return position; } diff --git a/src/main/java/domain/exception/NotBlankException.java b/src/main/java/domain/exception/NotBlankException.java new file mode 100644 index 0000000..c218e9b --- /dev/null +++ b/src/main/java/domain/exception/NotBlankException.java @@ -0,0 +1,7 @@ +package domain.exception; + +public class NotBlankException extends RuntimeException { + public NotBlankException(String message) { + super(message); + } +} From 218bed617781e6b9eb9967f83de2d3a3d5790e83 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 4 Mar 2021 18:20:30 +0900 Subject: [PATCH 16/70] =?UTF-8?q?refactor:=20=EB=A3=A8=ED=8A=B8=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20racingcar=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/{ => racingcar}/domain/Car.java | 4 ++-- src/main/java/{ => racingcar}/domain/Discriminator.java | 2 +- .../domain/exception/NotBlankException.java | 2 +- src/main/java/{ => racingcar}/repository/CarManager.java | 6 +++--- .../repository/exception/NotDuplicateNameException.java | 2 +- src/main/java/{ => racingcar}/util/RandomGenerator.java | 2 +- src/test/java/{ => racingcar}/domain/CarTest.java | 6 ++---- .../java/{ => racingcar}/domain/DiscriminatorTest.java | 3 +-- .../java/{ => racingcar}/repository/CarManagerTest.java | 7 +++---- 9 files changed, 15 insertions(+), 19 deletions(-) rename src/main/java/{ => racingcar}/domain/Car.java (92%) rename src/main/java/{ => racingcar}/domain/Discriminator.java (87%) rename src/main/java/{ => racingcar}/domain/exception/NotBlankException.java (79%) rename src/main/java/{ => racingcar}/repository/CarManager.java (81%) rename src/main/java/{ => racingcar}/repository/exception/NotDuplicateNameException.java (79%) rename src/main/java/{ => racingcar}/util/RandomGenerator.java (92%) rename src/test/java/{ => racingcar}/domain/CarTest.java (87%) rename src/test/java/{ => racingcar}/domain/DiscriminatorTest.java (90%) rename src/test/java/{ => racingcar}/repository/CarManagerTest.java (88%) diff --git a/src/main/java/domain/Car.java b/src/main/java/racingcar/domain/Car.java similarity index 92% rename from src/main/java/domain/Car.java rename to src/main/java/racingcar/domain/Car.java index 693507e..cc6d67a 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -1,6 +1,6 @@ -package domain; +package racingcar.domain; -import domain.exception.NotBlankException; +import racingcar.domain.exception.NotBlankException; import java.util.Objects; diff --git a/src/main/java/domain/Discriminator.java b/src/main/java/racingcar/domain/Discriminator.java similarity index 87% rename from src/main/java/domain/Discriminator.java rename to src/main/java/racingcar/domain/Discriminator.java index ba6b75b..cf0fa3b 100644 --- a/src/main/java/domain/Discriminator.java +++ b/src/main/java/racingcar/domain/Discriminator.java @@ -1,4 +1,4 @@ -package domain; +package racingcar.domain; public class Discriminator { private static final int THRESHOLD = 4; diff --git a/src/main/java/domain/exception/NotBlankException.java b/src/main/java/racingcar/domain/exception/NotBlankException.java similarity index 79% rename from src/main/java/domain/exception/NotBlankException.java rename to src/main/java/racingcar/domain/exception/NotBlankException.java index c218e9b..bccdac2 100644 --- a/src/main/java/domain/exception/NotBlankException.java +++ b/src/main/java/racingcar/domain/exception/NotBlankException.java @@ -1,4 +1,4 @@ -package domain.exception; +package racingcar.domain.exception; public class NotBlankException extends RuntimeException { public NotBlankException(String message) { diff --git a/src/main/java/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java similarity index 81% rename from src/main/java/repository/CarManager.java rename to src/main/java/racingcar/repository/CarManager.java index 623e355..7ce8abe 100644 --- a/src/main/java/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -1,7 +1,7 @@ -package repository; +package racingcar.repository; -import domain.Car; -import repository.exception.NotDuplicateNameException; +import racingcar.domain.Car; +import racingcar.repository.exception.NotDuplicateNameException; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/repository/exception/NotDuplicateNameException.java b/src/main/java/racingcar/repository/exception/NotDuplicateNameException.java similarity index 79% rename from src/main/java/repository/exception/NotDuplicateNameException.java rename to src/main/java/racingcar/repository/exception/NotDuplicateNameException.java index 5ebd2d1..35b94d7 100644 --- a/src/main/java/repository/exception/NotDuplicateNameException.java +++ b/src/main/java/racingcar/repository/exception/NotDuplicateNameException.java @@ -1,4 +1,4 @@ -package repository.exception; +package racingcar.repository.exception; public class NotDuplicateNameException extends RuntimeException { public NotDuplicateNameException(String message) { diff --git a/src/main/java/util/RandomGenerator.java b/src/main/java/racingcar/util/RandomGenerator.java similarity index 92% rename from src/main/java/util/RandomGenerator.java rename to src/main/java/racingcar/util/RandomGenerator.java index f81b259..5563bad 100644 --- a/src/main/java/util/RandomGenerator.java +++ b/src/main/java/racingcar/util/RandomGenerator.java @@ -1,4 +1,4 @@ -package util; +package racingcar.util; import java.util.Random; diff --git a/src/test/java/domain/CarTest.java b/src/test/java/racingcar/domain/CarTest.java similarity index 87% rename from src/test/java/domain/CarTest.java rename to src/test/java/racingcar/domain/CarTest.java index 533440f..ade86bf 100644 --- a/src/test/java/domain/CarTest.java +++ b/src/test/java/racingcar/domain/CarTest.java @@ -1,12 +1,10 @@ -package domain; +package racingcar.domain; -import domain.exception.NotBlankException; -import org.junit.jupiter.api.BeforeEach; +import racingcar.domain.exception.NotBlankException; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.junit.jupiter.api.Assertions.*; class CarTest { diff --git a/src/test/java/domain/DiscriminatorTest.java b/src/test/java/racingcar/domain/DiscriminatorTest.java similarity index 90% rename from src/test/java/domain/DiscriminatorTest.java rename to src/test/java/racingcar/domain/DiscriminatorTest.java index f4f939d..d474e1c 100644 --- a/src/test/java/domain/DiscriminatorTest.java +++ b/src/test/java/racingcar/domain/DiscriminatorTest.java @@ -1,9 +1,8 @@ -package domain; +package racingcar.domain; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; class DiscriminatorTest { diff --git a/src/test/java/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java similarity index 88% rename from src/test/java/repository/CarManagerTest.java rename to src/test/java/racingcar/repository/CarManagerTest.java index 3a3d91e..de84383 100644 --- a/src/test/java/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -1,13 +1,12 @@ -package repository; +package racingcar.repository; -import domain.Car; +import racingcar.domain.Car; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import repository.exception.NotDuplicateNameException; +import racingcar.repository.exception.NotDuplicateNameException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.junit.jupiter.api.Assertions.*; class CarManagerTest { From f0d1f09d9be3b15fec95f3331ebc75adf3fcf12a Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 13:26:39 +0900 Subject: [PATCH 17/70] =?UTF-8?q?refactor:=20Discriminator=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/{domain => util}/Discriminator.java | 2 +- .../java/racingcar/{domain => util}/DiscriminatorTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) rename src/main/java/racingcar/{domain => util}/Discriminator.java (87%) rename src/test/java/racingcar/{domain => util}/DiscriminatorTest.java (91%) diff --git a/src/main/java/racingcar/domain/Discriminator.java b/src/main/java/racingcar/util/Discriminator.java similarity index 87% rename from src/main/java/racingcar/domain/Discriminator.java rename to src/main/java/racingcar/util/Discriminator.java index cf0fa3b..c8881f4 100644 --- a/src/main/java/racingcar/domain/Discriminator.java +++ b/src/main/java/racingcar/util/Discriminator.java @@ -1,4 +1,4 @@ -package racingcar.domain; +package racingcar.util; public class Discriminator { private static final int THRESHOLD = 4; diff --git a/src/test/java/racingcar/domain/DiscriminatorTest.java b/src/test/java/racingcar/util/DiscriminatorTest.java similarity index 91% rename from src/test/java/racingcar/domain/DiscriminatorTest.java rename to src/test/java/racingcar/util/DiscriminatorTest.java index d474e1c..29de093 100644 --- a/src/test/java/racingcar/domain/DiscriminatorTest.java +++ b/src/test/java/racingcar/util/DiscriminatorTest.java @@ -1,6 +1,7 @@ -package racingcar.domain; +package racingcar.util; import org.junit.jupiter.api.Test; +import racingcar.util.Discriminator; import static org.assertj.core.api.Assertions.assertThat; From e72ba2f51a7e9137fa29579a8afedc096bea28b1 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 14:42:01 +0900 Subject: [PATCH 18/70] =?UTF-8?q?refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=B6=94=EA=B0=80=EB=A5=BC=20addAllCars=20method?= =?UTF-8?q?=20=EB=A1=9C=20test=20case=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/repository/CarManagerTest.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/test/java/racingcar/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java index de84383..ad69ddf 100644 --- a/src/test/java/racingcar/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -5,6 +5,8 @@ import org.junit.jupiter.api.Test; import racingcar.repository.exception.NotDuplicateNameException; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -21,9 +23,10 @@ void setup() { void Car_객체를_추가한다() { //given Car car = new Car("oereo"); + List carList = List.of(car); //when - carManager.add(car); + carManager.addAllCars(carList); int expected = carManager.size(); //then @@ -38,13 +41,11 @@ void setup() { Car kouz95 = new Car("kouz95"); Car pkalsh2 = new Car("pkalsh"); - //when - carManager.add(oereo); - carManager.add(pkalsh); - carManager.add(kouz95); + List carList = List.of(oereo, pkalsh, kouz95, pkalsh2); + //when //then assertThatExceptionOfType(NotDuplicateNameException.class) - .isThrownBy(() -> carManager.add(pkalsh2)); + .isThrownBy(() -> carManager.addAllCars(carList)); } } \ No newline at end of file From cf8d6d41f3d926167900159938c1dae319c9542f Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 14:42:22 +0900 Subject: [PATCH 19/70] =?UTF-8?q?refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=B6=94=EA=B0=80=EB=A5=BC=20addAllCars=20method?= =?UTF-8?q?=20=EB=A1=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add(Car) 메서드 삭제 - addAllCars(List)로 제한 --- src/main/java/racingcar/repository/CarManager.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index 7ce8abe..cd1c44d 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -13,11 +13,6 @@ public CarManager() { cars = new ArrayList<>(); } - public void add(Car car) { - checkDuplicateName(car); - cars.add(car); - } - private void checkDuplicateName(Car car) { if (cars.contains(car)) { throw new NotDuplicateNameException("중복되는 이름의 차를 입력하실 수 없습니다."); @@ -28,4 +23,10 @@ public int size() { return cars.size(); } + public void addAllCars(List carNames) { + for (Car car : carNames) { + checkDuplicateName(car); + cars.add(car); + } + } } From 4e74812ce3bf90bdf42410e99d1e63ab9b173e36 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 14:52:18 +0900 Subject: [PATCH 20/70] =?UTF-8?q?test:=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EA=B8=B0=EC=A4=80?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=9D=B4=EB=8F=99=ED=95=98=EB=8A=94=20tes?= =?UTF-8?q?t=20case=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/repository/CarManagerTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/racingcar/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java index ad69ddf..995ecff 100644 --- a/src/test/java/racingcar/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -48,4 +48,25 @@ void setup() { assertThatExceptionOfType(NotDuplicateNameException.class) .isThrownBy(() -> carManager.addAllCars(carList)); } + + @Test + void 랜덤_숫자_리스트를_넘기면_기준에_따라_플레이어가_이동한다() { + //given + Car oereo = new Car("oereo"); + Car pkalsh = new Car("pkalsh"); + Car kouz95 = new Car("kouz95"); + + List carList = List.of(oereo, pkalsh, kouz95); + carManager.addAllCars(carList); + + //when + List randomNumberList = List.of(4, 4, 2); + carManager.moveAllCars(randomNumberList); + + //then + assertThat(oereo.getPosition()).isEqualTo(1); + assertThat(pkalsh.getPosition()).isEqualTo(1); + assertThat(kouz95.getPosition()).isEqualTo(0); + } + } \ No newline at end of file From c6f3b688c1658ca4d4b08a0b73b6a65da4d201f8 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 14:52:54 +0900 Subject: [PATCH 21/70] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EA=B8=B0=EC=A4=80?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=9D=B4=EB=8F=99=ED=95=98=EB=8A=94=20met?= =?UTF-8?q?hod=20=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/repository/CarManager.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index cd1c44d..22f5a62 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -2,6 +2,7 @@ import racingcar.domain.Car; import racingcar.repository.exception.NotDuplicateNameException; +import racingcar.util.Discriminator; import java.util.ArrayList; import java.util.List; @@ -29,4 +30,13 @@ public void addAllCars(List carNames) { cars.add(car); } } + + public void moveAllCars(List randomNumberList) { + for (int i = 0; i < randomNumberList.size(); i++) { + Integer randomNumber = randomNumberList.get(i); + if (Discriminator.isMove(randomNumber)) { + cars.get(i).move(); + } + } + } } From 396584f07f7e5feae54462150a8eb93af6093b13 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 15:25:16 +0900 Subject: [PATCH 22/70] =?UTF-8?q?refactor:=20car=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EC=99=80=20=EC=83=9D=EC=84=B1=EB=90=9C=20=EB=82=9C=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20dto=EB=A1=9C=20mapping?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: - List로 생성된 난수를 참조하여 일치하는 인덱스의 car 객체를 움직임 After: - CarNumberDto로 Car 객체와 난수를 묶어 인덱스 참조 제거 --- src/main/java/racingcar/dto/CarNumberDto.java | 21 +++++++++++++++++++ .../java/racingcar/repository/CarManager.java | 17 ++++++++------- 2 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 src/main/java/racingcar/dto/CarNumberDto.java diff --git a/src/main/java/racingcar/dto/CarNumberDto.java b/src/main/java/racingcar/dto/CarNumberDto.java new file mode 100644 index 0000000..e9f3143 --- /dev/null +++ b/src/main/java/racingcar/dto/CarNumberDto.java @@ -0,0 +1,21 @@ +package racingcar.dto; + +import racingcar.domain.Car; + +public class CarNumberDto { + private final Car car; + private final int number; + + public CarNumberDto(Car car, int number) { + this.car = car; + this.number = number; + } + + public Car getCar() { + return car; + } + + public int getNumber() { + return number; + } +} diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index 22f5a62..6369ae6 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -1,8 +1,10 @@ package racingcar.repository; import racingcar.domain.Car; +import racingcar.dto.CarNumberDto; import racingcar.repository.exception.NotDuplicateNameException; import racingcar.util.Discriminator; +import racingcar.util.RandomGenerator; import java.util.ArrayList; import java.util.List; @@ -24,18 +26,17 @@ public int size() { return cars.size(); } - public void addAllCars(List carNames) { - for (Car car : carNames) { + public void addAllCars(List cars) { + for (Car car : cars) { checkDuplicateName(car); - cars.add(car); + this.cars.add(car); } } - public void moveAllCars(List randomNumberList) { - for (int i = 0; i < randomNumberList.size(); i++) { - Integer randomNumber = randomNumberList.get(i); - if (Discriminator.isMove(randomNumber)) { - cars.get(i).move(); + public void moveAllCars(List carNumberList) { + for (CarNumberDto dto : carNumberList) { + if (Discriminator.isMove(dto.getNumber())) { + dto.getCar().move(); } } } From c08b45da619058eb0943da0f61ebb556f5700560 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 15:28:03 +0900 Subject: [PATCH 23/70] =?UTF-8?q?test:=20dto=20=EB=A6=AC=EC=8A=A4=ED=8B=80?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20test=20case?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dto에 존재하는 car 객체가 CarManager의 collection에 존재하는 car 객체가 같은지 여부 파악하는 test case 추가 --- .../racingcar/repository/CarManagerTest.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/test/java/racingcar/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java index 995ecff..0ac3ff5 100644 --- a/src/test/java/racingcar/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -3,6 +3,7 @@ import racingcar.domain.Car; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import racingcar.dto.CarNumberDto; import racingcar.repository.exception.NotDuplicateNameException; import java.util.List; @@ -60,7 +61,11 @@ void setup() { carManager.addAllCars(carList); //when - List randomNumberList = List.of(4, 4, 2); + List randomNumberList = + List.of(new CarNumberDto(oereo, 4), + new CarNumberDto(pkalsh, 4), + new CarNumberDto(kouz95, 2)); + carManager.moveAllCars(randomNumberList); //then @@ -69,4 +74,24 @@ void setup() { assertThat(kouz95.getPosition()).isEqualTo(0); } + @Test + void dto에_존재하는_car_객체가_CarManager의_collection에_존재하는_car_객체와_같다() { + //given + Car oereo = new Car("oereo"); + Car pkalsh = new Car("pkalsh"); + Car kouz95 = new Car("kouz95"); + + List carList = List.of(oereo, pkalsh, kouz95); + carManager.addAllCars(carList); + + //when + List randomNumberList = carManager.generateCarNumberDtos(); + + //then + for (int i = 0; i < carList.size(); i++) { + assertThat(carList.get(i) == randomNumberList.get(i).getCar()) + .isTrue(); + } + } + } \ No newline at end of file From f982c1dda3f1206658e10cb645c0387e64f70195 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 15:29:01 +0900 Subject: [PATCH 24/70] =?UTF-8?q?feat:=20dto=EC=97=90=20car=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EC=99=80=20=EB=82=9C=EC=88=98=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=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/repository/CarManager.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index 6369ae6..bc5be3b 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -33,6 +33,17 @@ public void addAllCars(List cars) { } } + public List generateCarNumberDtos() { + List dtos = new ArrayList<>(); + + for (Car car: cars) { + int randomNumber = RandomGenerator.generateNumber(); + dtos.add(new CarNumberDto(car, randomNumber)); + } + + return dtos; + } + public void moveAllCars(List carNumberList) { for (CarNumberDto dto : carNumberList) { if (Discriminator.isMove(dto.getNumber())) { From bd63d3d3275b259c0c27635ad0a48296e7de8ef5 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 16:31:03 +0900 Subject: [PATCH 25/70] =?UTF-8?q?feat:=20=EC=B6=9C=EB=A0=A5=20=EB=8B=B4?= =?UTF-8?q?=EB=8B=B9=20Printer=20class=20=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/ui/Printer.java | 46 +++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/racingcar/ui/Printer.java diff --git a/src/main/java/racingcar/ui/Printer.java b/src/main/java/racingcar/ui/Printer.java new file mode 100644 index 0000000..44e58ed --- /dev/null +++ b/src/main/java/racingcar/ui/Printer.java @@ -0,0 +1,46 @@ +package racingcar.ui; + +import racingcar.domain.Car; + +import java.util.List; + +public class Printer { + private static final String CAR_NAME_REQUEST_MESSAGE = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분"; + private static final String ROUND_REQUEST_MESSAGE = "시도할 회수는 몇회인가요?"; + private static final String RESULT_HEADER = "실행 결과"; + private static final String WINNER_MESSAGE = "가 최종 우승했습니다."; + private static final String INPUT_MISMATCH_EXCEPTION_MESSAGE = "라운드 횟수로 숫자만 입력하실 수 있습니다."; + + public void requestCarName() { + System.out.println(CAR_NAME_REQUEST_MESSAGE); + } + + public void requestNumberOfRounds() { + System.out.println(ROUND_REQUEST_MESSAGE); + } + + public void printResultHeader() { + System.out.println(RESULT_HEADER); + } + + public void printWinner(String winnerNames) { + System.out.println(winnerNames + WINNER_MESSAGE); + } + + public void printCarState(Car car) { + System.out.println(car); + } + + public void printNewLine() { + System.out.println(); + } + + public void printExceptionMessage(Exception e) { + System.out.println(e.getMessage()); + } + + public void printInputMismatchExceptionMessage(Receiver receiver) { + receiver.clearBuffer(); + System.out.println(INPUT_MISMATCH_EXCEPTION_MESSAGE); + } +} \ No newline at end of file From b9dc073b873f5d48a2ed6e735b53ad0ddfcd371e Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 16:31:54 +0900 Subject: [PATCH 26/70] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20car=20?= =?UTF-8?q?=EC=9D=98=20state=20=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20printCarState=20method=20=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/repository/CarManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index bc5be3b..a43b8fa 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -3,6 +3,7 @@ import racingcar.domain.Car; import racingcar.dto.CarNumberDto; import racingcar.repository.exception.NotDuplicateNameException; +import racingcar.ui.Printer; import racingcar.util.Discriminator; import racingcar.util.RandomGenerator; @@ -51,4 +52,11 @@ public void moveAllCars(List carNumberList) { } } } + + public void printCarState(Printer printer) { + for (Car car : cars) { + printer.printCarState(car); + } + printer.printNewLine(); + } } From ec26f16939e5d921be200d61b77c772992ce8381 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 16:32:23 +0900 Subject: [PATCH 27/70] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9E=85=EB=A0=A5=EC=9D=84=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EC=97=AD=ED=95=A0=EC=9D=84=20=EB=8B=B4=EB=8B=B9=ED=95=98?= =?UTF-8?q?=EB=8A=94=20Receiver=20class=20=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/ui/Receiver.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/racingcar/ui/Receiver.java diff --git a/src/main/java/racingcar/ui/Receiver.java b/src/main/java/racingcar/ui/Receiver.java new file mode 100644 index 0000000..726ae75 --- /dev/null +++ b/src/main/java/racingcar/ui/Receiver.java @@ -0,0 +1,21 @@ +package racingcar.ui; + +import java.util.Scanner; + +public class Receiver { + private static final Scanner scanner = new Scanner(System.in); + + public String receiveCarNames() { + return scanner.nextLine(); + } + + public int receiveNumberOfRounds() { + return scanner.nextInt(); + } + + public void clearBuffer() { + if (scanner.hasNextLine()) { + scanner.nextLine(); + } + } +} From eb40f459393e0f0e9bea3124b621c798508252cd Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 16:38:04 +0900 Subject: [PATCH 28/70] =?UTF-8?q?test:=20=EC=8A=B9=EC=9E=90=EA=B0=80=20?= =?UTF-8?q?=ED=95=9C=EB=AA=85=EC=9D=BC=20=EB=95=8C=20=EA=B7=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20tes?= =?UTF-8?q?t=20case=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/repository/CarManagerTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/racingcar/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java index 0ac3ff5..e69c451 100644 --- a/src/test/java/racingcar/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -94,4 +94,22 @@ void setup() { } } + @Test + void 승자가_한명일_때_그_이름을_출력한다() { + //given + Car oereo = new Car("oereo"); + Car pkalsh = new Car("pkalsh"); + Car kouz95 = new Car("kouz95"); + + List carList = List.of(oereo, pkalsh, kouz95); + carManager.addAllCars(carList); + pkalsh.move(); + + //when + String winnerMessage = carManager.createWinnerMessage(); + + //then + assertThat(winnerMessage).isEqualTo("pkalsh"); + } + } \ No newline at end of file From 89965afc8b8633ddc6f1f0ca1522811d16b7565f Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 16:40:26 +0900 Subject: [PATCH 29/70] =?UTF-8?q?test:=20=EC=8A=B9=EC=9E=90=EA=B0=80=20?= =?UTF-8?q?=EC=97=AC=EB=9F=AC=EB=AA=85=EC=9D=BC=20=EB=95=8C=20=EA=B7=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EB=93=A4=EC=9D=84=20comma=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=ED=95=98=EC=97=AC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20test=20case=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/repository/CarManagerTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/java/racingcar/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java index e69c451..ab2d2d8 100644 --- a/src/test/java/racingcar/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -112,4 +112,24 @@ void setup() { assertThat(winnerMessage).isEqualTo("pkalsh"); } + @Test + void 승자가_두명이상일_때_그_이름들을_comma로_구분하여_출력한다() { + //given + Car oereo = new Car("oereo"); + Car pkalsh = new Car("pkalsh"); + Car kouz95 = new Car("kouz95"); + + List carList = List.of(oereo, pkalsh, kouz95); + oereo.move(); + pkalsh.move(); + kouz95.move(); + carManager.addAllCars(carList); + + //when + String winnerMessage = carManager.createWinnerMessage(); + + //then + assertThat(winnerMessage).isEqualTo("oereo, pkalsh, kouz95"); + } + } \ No newline at end of file From a04b488873e67e652bf23ce863ae684e82e9b9b4 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 16:41:43 +0900 Subject: [PATCH 30/70] =?UTF-8?q?feat:=20=EC=8A=B9=EC=9E=90=EB=A5=BC=20?= =?UTF-8?q?=EA=B5=AC=ED=95=98=EA=B3=A0=20=EA=B7=B8=20=EC=8A=B9=EC=9E=90?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EB=93=A4=EC=9D=84=20comma=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=ED=95=98=EC=97=AC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=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 | 4 +++ .../java/racingcar/repository/CarManager.java | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index cc6d67a..00c4f9b 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -19,6 +19,10 @@ private void checkBlankName(String name) { } } + public String getName() { + return name; + } + public int getPosition() { return position; } diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index a43b8fa..9828f66 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class CarManager { private List cars; @@ -59,4 +60,29 @@ public void printCarState(Printer printer) { } printer.printNewLine(); } + + public String createWinnerMessage() { + StringBuilder winnerNames = new StringBuilder(); + List winners = winnerList(); + winnerNames.append(winners.get(0).getName()); + + for (int i = 1; i < winners.size(); i++) { + Car winner = winners.get(i); + winnerNames.append(", "); + winnerNames.append(winner.getName()); + } + + return winnerNames.toString(); + } + + private List winnerList() { + int winnerPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElseThrow(IllegalArgumentException::new); + + return cars.stream() + .filter(car -> car.getPosition() == winnerPosition) + .collect(Collectors.toList()); + } } From 9db711b28fd72c5f44ef82f4fb812e8c0327273c Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 16:44:19 +0900 Subject: [PATCH 31/70] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=ED=9D=90?= =?UTF-8?q?=EB=A6=84=20=EC=A0=9C=EC=96=B4=ED=95=98=EB=8A=94=20RacingGameAp?= =?UTF-8?q?plication=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/RacingGameApplication.java | 81 +++++++++++++++++++ .../exception/NotZeroRoundException.java | 9 +++ src/main/java/racingcar/ui/Printer.java | 4 +- 3 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 src/main/java/racingcar/RacingGameApplication.java create mode 100644 src/main/java/racingcar/exception/NotZeroRoundException.java diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java new file mode 100644 index 0000000..c81ef2d --- /dev/null +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -0,0 +1,81 @@ +package racingcar; + +import racingcar.domain.Car; +import racingcar.dto.CarNumberDto; +import racingcar.exception.NotZeroRoundException; +import racingcar.repository.CarManager; +import racingcar.ui.Printer; +import racingcar.ui.Receiver; + +import java.util.ArrayList; +import java.util.InputMismatchException; +import java.util.List; + +public class RacingGameApplication { + private static final int INPUT_ZERO = 0; + private static final String DELIMITER = ","; + + private final Printer printer = new Printer(); + private final Receiver receiver = new Receiver(); + private final CarManager carManager = new CarManager(); + + public void run() { + printer.requestCarName(); + String line = receiver.receiveCarNames(); + List carList = createAllCars(splitInputLine(line)); + carManager.addAllCars(carList); + + printer.requestNumberOfRounds(); + int rounds = receiveRounds(); + + printer.printResultHeader(); + for (int i = 0; i < rounds; i++) { + List carNumberDtos = carManager.generateCarNumberDtos(); + carManager.moveAllCars(carNumberDtos); + carManager.printCarState(printer); + } + printer.printWinner(carManager.createWinnerMessage()); + } + + private List createAllCars(List carNames) { + List carList = new ArrayList<>(); + for (String name : carNames) { + carList.add(new Car(name)); + } + return carList; + } + + private int receiveRounds() { + int rounds = 0; + boolean isInvalidInput = true; + while (isInvalidInput) { + try { + rounds = receiver.receiveNumberOfRounds(); + throwExceptionIfInputIsZero(rounds); + isInvalidInput = false; + } catch (InputMismatchException e) { + printer.printInputMismatchExceptionMessage(receiver); + } catch (IllegalArgumentException e) { + printer.printExceptionMessage(e); + } + } + return rounds; + } + + private void throwExceptionIfInputIsZero(int rounds) { + if (rounds == INPUT_ZERO) { + throw new NotZeroRoundException(); + } + } + + private List splitInputLine(String line) { + return List.of(line.split(DELIMITER)); + } + + + public static void main(String[] args) { + RacingGameApplication app = new RacingGameApplication(); + app.run(); + } +} + diff --git a/src/main/java/racingcar/exception/NotZeroRoundException.java b/src/main/java/racingcar/exception/NotZeroRoundException.java new file mode 100644 index 0000000..8d39f3f --- /dev/null +++ b/src/main/java/racingcar/exception/NotZeroRoundException.java @@ -0,0 +1,9 @@ +package racingcar.exception; + +public class NotZeroRoundException extends IllegalArgumentException { + private static final String NOT_ZERO_ROUND_EXCEPTION_MESSAGE = "라운드 회수로 0은 입력하실 수 없습니다."; + + public NotZeroRoundException() { + super(NOT_ZERO_ROUND_EXCEPTION_MESSAGE); + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/ui/Printer.java b/src/main/java/racingcar/ui/Printer.java index 44e58ed..422cbb2 100644 --- a/src/main/java/racingcar/ui/Printer.java +++ b/src/main/java/racingcar/ui/Printer.java @@ -2,10 +2,8 @@ import racingcar.domain.Car; -import java.util.List; - public class Printer { - private static final String CAR_NAME_REQUEST_MESSAGE = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분"; + private static final String CAR_NAME_REQUEST_MESSAGE = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; private static final String ROUND_REQUEST_MESSAGE = "시도할 회수는 몇회인가요?"; private static final String RESULT_HEADER = "실행 결과"; private static final String WINNER_MESSAGE = "가 최종 우승했습니다."; From 267a80a8a29ffd16b139759e497497c73421d5ec Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 17:13:54 +0900 Subject: [PATCH 32/70] =?UTF-8?q?fix:=20=EC=A0=95=EC=83=81=EC=A0=81?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B0=92=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20NotBlankException?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/RacingGameApplication.java | 25 ++++++++++++++----- src/main/java/racingcar/domain/Car.java | 2 +- .../domain/exception/NotBlankException.java | 6 +++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index c81ef2d..6595d8c 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -1,6 +1,7 @@ package racingcar; import racingcar.domain.Car; +import racingcar.domain.exception.NotBlankException; import racingcar.dto.CarNumberDto; import racingcar.exception.NotZeroRoundException; import racingcar.repository.CarManager; @@ -22,23 +23,36 @@ public class RacingGameApplication { public void run() { printer.requestCarName(); String line = receiver.receiveCarNames(); - List carList = createAllCars(splitInputLine(line)); - carManager.addAllCars(carList); + try { + List carList = createAllCars(splitInputLine(line)); + carManager.addAllCars(carList); - printer.requestNumberOfRounds(); - int rounds = receiveRounds(); + printer.requestNumberOfRounds(); + int rounds = receiveRounds(); + proceedRound(rounds); + printer.printWinner(carManager.createWinnerMessage()); + } catch (NotBlankException e) { + printer.printExceptionMessage(e); + run(); + } + } + + private void proceedRound(int rounds) { printer.printResultHeader(); for (int i = 0; i < rounds; i++) { List carNumberDtos = carManager.generateCarNumberDtos(); carManager.moveAllCars(carNumberDtos); carManager.printCarState(printer); } - printer.printWinner(carManager.createWinnerMessage()); } private List createAllCars(List carNames) { List carList = new ArrayList<>(); + if (carNames.size() == 0) { + throw new NotBlankException(); + } + for (String name : carNames) { carList.add(new Car(name)); } @@ -72,7 +86,6 @@ private List splitInputLine(String line) { return List.of(line.split(DELIMITER)); } - public static void main(String[] args) { RacingGameApplication app = new RacingGameApplication(); app.run(); diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index 00c4f9b..7bdc634 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -15,7 +15,7 @@ public Car(String name) { private void checkBlankName(String name) { if (name.equals("")) { - throw new NotBlankException("빈 문자열 이름의 차를 생성할 수는 없습니다."); + throw new NotBlankException(); } } diff --git a/src/main/java/racingcar/domain/exception/NotBlankException.java b/src/main/java/racingcar/domain/exception/NotBlankException.java index bccdac2..01f670a 100644 --- a/src/main/java/racingcar/domain/exception/NotBlankException.java +++ b/src/main/java/racingcar/domain/exception/NotBlankException.java @@ -1,7 +1,9 @@ package racingcar.domain.exception; public class NotBlankException extends RuntimeException { - public NotBlankException(String message) { - super(message); + private static final String MESSAGE = "빈 문자열 이름의 차를 생성할 수는 없습니다."; + + public NotBlankException() { + super(MESSAGE); } } From fc8d01c1d17713a19e383ec8cbc26f184f4d7cb6 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 9 Mar 2021 17:28:35 +0900 Subject: [PATCH 33/70] =?UTF-8?q?docs(guide):=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EC=B2=B4=ED=81=AC=EC=82=AC=ED=95=AD=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 --- README.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 1c5da1b..0852df2 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,20 @@ # 미션 - 자동차 경주 게임 ## 구현할 기능 목록 -- [ ] 차의 이름과 위치를 관리하는 클래스를 구현한다. -- [ ] 0부터 9사이의 정수값을 랜덤하게 생성 -- [ ] 난수가 4이상이면 전진 -- [ ] 난수가 3이하이면 이동하지 않는다 -- [ ] 턴이 모두 지났을 때 가장 앞에 있는 차의 이름을 출력한다. -- [ ] 턴이 모두 지났을 때 앞에 있는 차가 2개 이상일 경우 전부 출력한다. -- [ ] 차의 이름에 대한 입력값을 쉼표로 구분할 수 있다. -- [ ] 시도할 횟수를 입력 받을 수 있다. -- [ ] 현재 자동차의 위치상황을 이름과 함께 출력할 수 있다. +- [x] 차의 이름과 위치를 관리하는 클래스를 구현한다. +- [x] 0부터 9사이의 정수값을 랜덤하게 생성 +- [x] 난수가 4이상이면 전진 +- [x] 난수가 3이하이면 이동하지 않는다 +- [x] 턴이 모두 지났을 때 가장 앞에 있는 차의 이름을 출력한다. +- [x] 턴이 모두 지났을 때 앞에 있는 차가 2개 이상일 경우 전부 출력한다. +- [x] 차의 이름에 대한 입력값을 쉼표로 구분할 수 있다. +- [x] 시도할 횟수를 입력 받을 수 있다. +- [x] 현재 자동차의 위치상황을 이름과 함께 출력할 수 있다. ## 예외 처리 목록 -- [ ] 빈 문자열 입력은 허용하지 않는다. -- [ ] 중복되는 이름의 차를 입력했을 때 허용하지 않는다. +- [x] 빈 문자열 입력은 허용하지 않는다. +- [x] 중복되는 이름의 차를 입력했을 때 허용하지 않는다. +- [x] 시도할 횟수로 숫자가 아닌 값을 입력했을 때 허용하지 않는다. ## 🚀 기능 요구사항 From 9ceca459a9367e1b900695039872c3d72b0259bb Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 16 Mar 2021 13:00:02 +0900 Subject: [PATCH 34/70] =?UTF-8?q?docs(guide):=205=EA=B8=80=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EC=83=81=EC=9D=98=20=EC=B0=A8=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=96=88=EC=9D=84=20=EB=95=8C=20?= =?UTF-8?q?=ED=97=88=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=AA=A9=EB=A1=9D=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0852df2..242e6b3 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ - [x] 빈 문자열 입력은 허용하지 않는다. - [x] 중복되는 이름의 차를 입력했을 때 허용하지 않는다. - [x] 시도할 횟수로 숫자가 아닌 값을 입력했을 때 허용하지 않는다. +- [ ] 5글자 이상의 차 이름을 입력했을 때 허용하지 않는다. ## 🚀 기능 요구사항 From 01c78c6051b39fe1fe4b8397d8e6849827fee569 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 16 Mar 2021 23:58:26 +0900 Subject: [PATCH 35/70] =?UTF-8?q?test:=205=EA=B8=80=EC=9E=90=20=EC=9D=B4?= =?UTF-8?q?=EC=83=81=EC=9D=98=20=EC=9D=B4=EB=A6=84=EC=9D=B4=20=EC=A3=BC?= =?UTF-8?q?=EC=96=B4=EC=A7=80=EB=A9=B4=20NotValidNameLengthException=20?= =?UTF-8?q?=EB=8D=98=EC=A7=80=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/racingcar/domain/CarTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/racingcar/domain/CarTest.java b/src/test/java/racingcar/domain/CarTest.java index ade86bf..5cbc437 100644 --- a/src/test/java/racingcar/domain/CarTest.java +++ b/src/test/java/racingcar/domain/CarTest.java @@ -2,6 +2,7 @@ import racingcar.domain.exception.NotBlankException; import org.junit.jupiter.api.Test; +import racingcar.domain.exception.NotValidNameLengthException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -43,4 +44,11 @@ void move() { assertThatExceptionOfType(NotBlankException.class) .isThrownBy(() -> new Car("")); } + + @Test + void _5글자_이상의_이름이_주어지면_NotValidNameLengthException을_던진다() { + //then + assertThatExceptionOfType(NotValidNameLengthException.class) + .isThrownBy(()-> new Car("oereo")); + } } \ No newline at end of file From eb7a7c5550de9a9b746f4b5beacc672a9a19c4e6 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 18 Mar 2021 22:41:51 +0900 Subject: [PATCH 36/70] =?UTF-8?q?feat:=20NotValidNameLengthException=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20Car=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=8B=9C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Car.java | 8 ++++++++ .../domain/exception/NotValidNameLengthException.java | 9 +++++++++ 2 files changed, 17 insertions(+) create mode 100644 src/main/java/racingcar/domain/exception/NotValidNameLengthException.java diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index 7bdc634..4d5537e 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -1,6 +1,7 @@ package racingcar.domain; import racingcar.domain.exception.NotBlankException; +import racingcar.domain.exception.NotValidNameLengthException; import java.util.Objects; @@ -10,6 +11,7 @@ public class Car { public Car(String name) { checkBlankName(name); + checkNameLength(name); this.name = name; } @@ -19,6 +21,12 @@ private void checkBlankName(String name) { } } + private void checkNameLength(String name) { + if (name.length() >= 5) { + throw new NotValidNameLengthException(); + } + } + public String getName() { return name; } diff --git a/src/main/java/racingcar/domain/exception/NotValidNameLengthException.java b/src/main/java/racingcar/domain/exception/NotValidNameLengthException.java new file mode 100644 index 0000000..4820a8c --- /dev/null +++ b/src/main/java/racingcar/domain/exception/NotValidNameLengthException.java @@ -0,0 +1,9 @@ +package racingcar.domain.exception; + +public class NotValidNameLengthException extends RuntimeException { + private static final String Message = "5자 이상의 이름을 가진 차는 생설할 수 없습니다."; + + public NotValidNameLengthException() { + super(Message); + } +} From 1b7f367ce975af70e0d3d891af3224c855c95e67 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 18 Mar 2021 22:45:20 +0900 Subject: [PATCH 37/70] =?UTF-8?q?fix:=20Car=EA=B0=9D=EC=B2=B4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=8B=9C=205=EA=B8=80=EC=9E=90=20=EC=9D=B4?= =?UTF-8?q?=EC=83=81=EC=9D=98=20name=EC=9D=84=20=EB=84=A3=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=9D=BC=EA=B4=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/repository/CarManagerTest.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/test/java/racingcar/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java index ab2d2d8..a06ec90 100644 --- a/src/test/java/racingcar/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -23,7 +23,7 @@ void setup() { @Test void Car_객체를_추가한다() { //given - Car car = new Car("oereo"); + Car car = new Car("oer"); List carList = List.of(car); //when @@ -37,10 +37,10 @@ void setup() { @Test void 중복되는_이름의_Car_객체를_추가를_하면_NotDuplicateNameException을_던진다() { //given - Car oereo = new Car("oereo"); - Car pkalsh = new Car("pkalsh"); - Car kouz95 = new Car("kouz95"); - Car pkalsh2 = new Car("pkalsh"); + Car oereo = new Car("oer"); + Car pkalsh = new Car("pka"); + Car kouz95 = new Car("kouz"); + Car pkalsh2 = new Car("pka"); List carList = List.of(oereo, pkalsh, kouz95, pkalsh2); @@ -53,9 +53,9 @@ void setup() { @Test void 랜덤_숫자_리스트를_넘기면_기준에_따라_플레이어가_이동한다() { //given - Car oereo = new Car("oereo"); - Car pkalsh = new Car("pkalsh"); - Car kouz95 = new Car("kouz95"); + Car oereo = new Car("oer"); + Car pkalsh = new Car("pka"); + Car kouz95 = new Car("kouz"); List carList = List.of(oereo, pkalsh, kouz95); carManager.addAllCars(carList); @@ -77,9 +77,9 @@ void setup() { @Test void dto에_존재하는_car_객체가_CarManager의_collection에_존재하는_car_객체와_같다() { //given - Car oereo = new Car("oereo"); - Car pkalsh = new Car("pkalsh"); - Car kouz95 = new Car("kouz95"); + Car oereo = new Car("oer"); + Car pkalsh = new Car("pka"); + Car kouz95 = new Car("kouz"); List carList = List.of(oereo, pkalsh, kouz95); carManager.addAllCars(carList); @@ -97,9 +97,9 @@ void setup() { @Test void 승자가_한명일_때_그_이름을_출력한다() { //given - Car oereo = new Car("oereo"); - Car pkalsh = new Car("pkalsh"); - Car kouz95 = new Car("kouz95"); + Car oereo = new Car("oer"); + Car pkalsh = new Car("pka"); + Car kouz95 = new Car("kouz"); List carList = List.of(oereo, pkalsh, kouz95); carManager.addAllCars(carList); @@ -109,15 +109,15 @@ void setup() { String winnerMessage = carManager.createWinnerMessage(); //then - assertThat(winnerMessage).isEqualTo("pkalsh"); + assertThat(winnerMessage).isEqualTo("pka"); } @Test void 승자가_두명이상일_때_그_이름들을_comma로_구분하여_출력한다() { //given - Car oereo = new Car("oereo"); - Car pkalsh = new Car("pkalsh"); - Car kouz95 = new Car("kouz95"); + Car oereo = new Car("oer"); + Car pkalsh = new Car("pka"); + Car kouz95 = new Car("kouz"); List carList = List.of(oereo, pkalsh, kouz95); oereo.move(); @@ -129,7 +129,7 @@ void setup() { String winnerMessage = carManager.createWinnerMessage(); //then - assertThat(winnerMessage).isEqualTo("oereo, pkalsh, kouz95"); + assertThat(winnerMessage).isEqualTo("oer, pka, kouz"); } } \ No newline at end of file From 1e1ce791e41f916d79157d3e93a047b707352e5b Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 18 Mar 2021 23:06:36 +0900 Subject: [PATCH 38/70] =?UTF-8?q?fix:=20Car=20=EA=B0=9D=EC=B2=B4=EC=9D=98?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=EC=9D=B4=20=EB=B9=88=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A7=81=EC=9D=BC=20=EA=B2=BD=EC=9A=B0=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?name.equals("")=EC=97=90=EC=84=9C=20api=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20isBlank()=20method=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Car.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index 4d5537e..dbd4f67 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -16,7 +16,7 @@ public Car(String name) { } private void checkBlankName(String name) { - if (name.equals("")) { + if (name.isBlank()) { throw new NotBlankException(); } } From 48dca326c62af4a8f6fb23cb9f988152b8cbe9c0 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Fri, 19 Mar 2021 13:27:15 +0900 Subject: [PATCH 39/70] =?UTF-8?q?refactor:=20NotBlankException=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=EC=8B=9C=ED=82=A4=EB=8A=94=20createAllCars()?= =?UTF-8?q?=EC=97=90=EB=A7=8C=20try=20catch=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/RacingGameApplication.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index 6595d8c..34ee634 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -26,16 +26,16 @@ public void run() { try { List carList = createAllCars(splitInputLine(line)); carManager.addAllCars(carList); - + }catch (NotBlankException e) { + printer.printExceptionMessage(e); + run(); + } printer.requestNumberOfRounds(); int rounds = receiveRounds(); proceedRound(rounds); printer.printWinner(carManager.createWinnerMessage()); - } catch (NotBlankException e) { - printer.printExceptionMessage(e); - run(); - } + } private void proceedRound(int rounds) { @@ -47,7 +47,7 @@ private void proceedRound(int rounds) { } } - private List createAllCars(List carNames) { + private List createAllCars(List carNames) throws NotBlankException{ List carList = new ArrayList<>(); if (carNames.size() == 0) { throw new NotBlankException(); From d9012d15aece519700f9c9856c3b968e4e827988 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Fri, 19 Mar 2021 13:48:57 +0900 Subject: [PATCH 40/70] =?UTF-8?q?fix:=20Car=20=EC=9D=B4=EB=A6=84=EC=9D=98?= =?UTF-8?q?=20=EA=B8=B8=EC=9D=B4=20=EC=A0=9C=ED=95=9C=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=EA=B3=BC=20=ED=95=9C=EB=B2=88=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=ED=95=A0=20=EB=95=8C=EC=9D=98=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Car.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index dbd4f67..ede1476 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -8,6 +8,8 @@ public class Car { private final String name; private int position = 0; + private static final int CAR_NAME_MAX_LENGTH = 4; + private static final int MOVE_INTERVAL = 1; public Car(String name) { checkBlankName(name); @@ -22,7 +24,7 @@ private void checkBlankName(String name) { } private void checkNameLength(String name) { - if (name.length() >= 5) { + if (name.length() > CAR_NAME_MAX_LENGTH) { throw new NotValidNameLengthException(); } } @@ -36,7 +38,7 @@ public int getPosition() { } public void move() { - position += 1; + position += MOVE_INTERVAL; } @Override From 107e35fedc1b62740f38dad09381f13bdb17fdc1 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 20 Mar 2021 19:49:11 +0900 Subject: [PATCH 41/70] =?UTF-8?q?fix:=20=EC=BB=AC=EB=A0=89=EC=85=98?= =?UTF-8?q?=EC=9D=98=20of=20=EB=A9=94=EC=86=8C=EB=93=9C=EA=B0=80=20java8?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=9E=91=EB=8F=99=EC=9D=B4=20=EC=95=88?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=EC=A0=90=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20Arrays.asLis?= =?UTF-8?q?t=20=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/RacingGameApplication.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index 34ee634..23f4eee 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -9,6 +9,7 @@ import racingcar.ui.Receiver; import java.util.ArrayList; +import java.util.Arrays; import java.util.InputMismatchException; import java.util.List; @@ -83,7 +84,7 @@ private void throwExceptionIfInputIsZero(int rounds) { } private List splitInputLine(String line) { - return List.of(line.split(DELIMITER)); + return Arrays.asList(line.split(DELIMITER)); } public static void main(String[] args) { From df55a8c05fb6134613654543e07c0c4c3231dba5 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sun, 21 Mar 2021 02:11:55 +0900 Subject: [PATCH 42/70] =?UTF-8?q?refactor:=20CarName=20class=20=EC=84=A0?= =?UTF-8?q?=EC=96=B8=20=EB=B0=8F=20Car=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=8B=9C=EC=97=90=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=ED=95=B4=EC=A4=84=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/domain/{ => car}/Car.java | 23 +++------------- .../java/racingcar/domain/car/CarName.java | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+), 19 deletions(-) rename src/main/java/racingcar/domain/{ => car}/Car.java (59%) create mode 100644 src/main/java/racingcar/domain/car/CarName.java diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/car/Car.java similarity index 59% rename from src/main/java/racingcar/domain/Car.java rename to src/main/java/racingcar/domain/car/Car.java index ede1476..f453795 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/car/Car.java @@ -1,34 +1,19 @@ -package racingcar.domain; - -import racingcar.domain.exception.NotBlankException; -import racingcar.domain.exception.NotValidNameLengthException; +package racingcar.domain.car; import java.util.Objects; public class Car { private final String name; private int position = 0; - private static final int CAR_NAME_MAX_LENGTH = 4; private static final int MOVE_INTERVAL = 1; + private CarName carName; + public Car(String name) { - checkBlankName(name); - checkNameLength(name); + this.carName = new CarName(name); this.name = name; } - private void checkBlankName(String name) { - if (name.isBlank()) { - throw new NotBlankException(); - } - } - - private void checkNameLength(String name) { - if (name.length() > CAR_NAME_MAX_LENGTH) { - throw new NotValidNameLengthException(); - } - } - public String getName() { return name; } diff --git a/src/main/java/racingcar/domain/car/CarName.java b/src/main/java/racingcar/domain/car/CarName.java new file mode 100644 index 0000000..eb37ab7 --- /dev/null +++ b/src/main/java/racingcar/domain/car/CarName.java @@ -0,0 +1,27 @@ +package racingcar.domain.car; + +import racingcar.domain.exception.NotBlankException; +import racingcar.domain.exception.NotValidNameLengthException; + +public class CarName { + private static final int CAR_NAME_MAX_LENGTH = 4; + private String name; + + public CarName(String name) { + checkBlankName(name); + checkNameLength(name); + this.name = name; + } + + private void checkBlankName(String name) { + if (name.isBlank()) { + throw new NotBlankException(); + } + } + + private void checkNameLength(String name) { + if (name.length() > CAR_NAME_MAX_LENGTH) { + throw new NotValidNameLengthException(); + } + } +} From 914a0b5f64ae5d2453f3f08fdd5045edb9f5b040 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sun, 21 Mar 2021 02:23:02 +0900 Subject: [PATCH 43/70] =?UTF-8?q?refactor:=20createAllCars=20method=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/RacingGameApplication.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index 23f4eee..a03bcd1 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -1,6 +1,6 @@ package racingcar; -import racingcar.domain.Car; +import racingcar.domain.car.Car; import racingcar.domain.exception.NotBlankException; import racingcar.dto.CarNumberDto; import racingcar.exception.NotZeroRoundException; @@ -48,11 +48,8 @@ private void proceedRound(int rounds) { } } - private List createAllCars(List carNames) throws NotBlankException{ + private List createAllCars(List carNames) { List carList = new ArrayList<>(); - if (carNames.size() == 0) { - throw new NotBlankException(); - } for (String name : carNames) { carList.add(new Car(name)); From 946fadf7947a0fbdceffa306099494d7c3cc07b6 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sun, 21 Mar 2021 02:23:59 +0900 Subject: [PATCH 44/70] =?UTF-8?q?docs(guide):=205=EA=B8=80=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EC=83=81=EC=9D=98=20=EC=B0=A8=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=96=88=EC=9D=84=20=EB=95=8C=20?= =?UTF-8?q?=ED=97=88=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=9F=EB=8A=94=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 242e6b3..2c79c1d 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ - [x] 빈 문자열 입력은 허용하지 않는다. - [x] 중복되는 이름의 차를 입력했을 때 허용하지 않는다. - [x] 시도할 횟수로 숫자가 아닌 값을 입력했을 때 허용하지 않는다. -- [ ] 5글자 이상의 차 이름을 입력했을 때 허용하지 않는다. +- [x] 5글자 이상의 차 이름을 입력했을 때 허용하지 않는다. ## 🚀 기능 요구사항 From 498d3bed53216e5c9e7f1abf558c154a5725a2ed Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sun, 21 Mar 2021 18:32:14 +0900 Subject: [PATCH 45/70] =?UTF-8?q?feat:=20isWinnerPosition=20method?= =?UTF-8?q?=EB=A5=BC=20Car=20class=20=EC=95=88=EC=97=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/car/Car.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/racingcar/domain/car/Car.java b/src/main/java/racingcar/domain/car/Car.java index f453795..5eb6c7d 100644 --- a/src/main/java/racingcar/domain/car/Car.java +++ b/src/main/java/racingcar/domain/car/Car.java @@ -43,4 +43,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(name); } + + public boolean isWinnerPosition(int winnerPosition) { + return winnerPosition == position; + } } From 9857960eca123a015fcd84dcc3d8f3b8f868668a Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sun, 21 Mar 2021 18:33:30 +0900 Subject: [PATCH 46/70] =?UTF-8?q?fix:=20getPosition=EC=9C=BC=EB=A1=9C=20Ca?= =?UTF-8?q?r=20=EA=B0=9D=EC=B2=B4=EC=9D=98=20=EC=9C=84=EC=B9=98=EB=A5=BC?= =?UTF-8?q?=20=EB=B0=94=EB=A1=9C=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=EA=B2=83=EC=9D=B4=20=EC=95=84=EB=8B=8C=20Car=20class=20?= =?UTF-8?q?=EB=82=B4=EC=9D=98=20method=EB=A1=9C=20=ED=8C=90=EB=8B=A8?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/repository/CarManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index 9828f66..e5f4c3a 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -1,6 +1,6 @@ package racingcar.repository; -import racingcar.domain.Car; +import racingcar.domain.car.Car; import racingcar.dto.CarNumberDto; import racingcar.repository.exception.NotDuplicateNameException; import racingcar.ui.Printer; @@ -82,7 +82,7 @@ private List winnerList() { .orElseThrow(IllegalArgumentException::new); return cars.stream() - .filter(car -> car.getPosition() == winnerPosition) + .filter(car -> car.isWinnerPosition(winnerPosition)) .collect(Collectors.toList()); } } From 9430694a1f45d38128295893f987be3e328bfbdb Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 16:07:22 +0900 Subject: [PATCH 47/70] =?UTF-8?q?feat:=20Round=20class=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Round.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/racingcar/domain/Round.java diff --git a/src/main/java/racingcar/domain/Round.java b/src/main/java/racingcar/domain/Round.java new file mode 100644 index 0000000..83da728 --- /dev/null +++ b/src/main/java/racingcar/domain/Round.java @@ -0,0 +1,22 @@ +package racingcar.domain; + +import racingcar.exception.NotZeroRoundException; + +public class Round { + private static final int INPUT_ZERO = 0; + private int rounds; + + public Round(int rounds) { + checkInputZeroRound(rounds); + this.rounds = rounds; + } + + private void checkInputZeroRound(int rounds) { + if (rounds == INPUT_ZERO) { + throw new NotZeroRoundException(); + } + } + public int getRounds() { + return rounds; + } +} From cc8172aca2cb8cd45716c7296b60fa91d7ec6e0a Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 16:08:49 +0900 Subject: [PATCH 48/70] =?UTF-8?q?feat:=20Round=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20RacingGameApplication=20method?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/RacingGameApplication.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index a03bcd1..31cf9d6 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -1,5 +1,6 @@ package racingcar; +import racingcar.domain.Round; import racingcar.domain.car.Car; import racingcar.domain.exception.NotBlankException; import racingcar.dto.CarNumberDto; @@ -32,16 +33,16 @@ public void run() { run(); } printer.requestNumberOfRounds(); - int rounds = receiveRounds(); + Round rounds = new Round(receiveRounds()); proceedRound(rounds); printer.printWinner(carManager.createWinnerMessage()); } - private void proceedRound(int rounds) { + private void proceedRound(Round rounds) { printer.printResultHeader(); - for (int i = 0; i < rounds; i++) { + for (int i = 0; i < rounds.getRounds(); i++) { List carNumberDtos = carManager.generateCarNumberDtos(); carManager.moveAllCars(carNumberDtos); carManager.printCarState(printer); From 16aa313ec661814ef99fdac93bb0b67265f36214 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 16:16:31 +0900 Subject: [PATCH 49/70] =?UTF-8?q?feat:=20RacingGameApplication=20=EC=95=88?= =?UTF-8?q?=EC=97=90=EC=84=9C=20DELIMITER=20=EB=A1=9C=20split=20=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=A0=9C=EC=99=B8=20=EB=B0=8F?= =?UTF-8?q?=20Receiver=20class=20=EC=97=90=20=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/ui/Receiver.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/ui/Receiver.java b/src/main/java/racingcar/ui/Receiver.java index 726ae75..8f8b6ad 100644 --- a/src/main/java/racingcar/ui/Receiver.java +++ b/src/main/java/racingcar/ui/Receiver.java @@ -1,12 +1,16 @@ package racingcar.ui; +import java.util.Arrays; +import java.util.List; import java.util.Scanner; public class Receiver { private static final Scanner scanner = new Scanner(System.in); + private static final String DELIMITER = ","; - public String receiveCarNames() { - return scanner.nextLine(); + public List receiveCarNames() { + String carNames = scanner.nextLine(); + return splitInputLine(carNames); } public int receiveNumberOfRounds() { @@ -18,4 +22,9 @@ public void clearBuffer() { scanner.nextLine(); } } + + private List splitInputLine(String line) { + return Arrays.asList(line.split(DELIMITER)); + } + } From ab0b294e7aaabfaca2dbb2fd9071720d4f23ab53 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 16:56:20 +0900 Subject: [PATCH 50/70] =?UTF-8?q?refactor:=20receiveNumberOfRounds=20metho?= =?UTF-8?q?d=20=EC=97=90=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/ui/Receiver.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/ui/Receiver.java b/src/main/java/racingcar/ui/Receiver.java index 8f8b6ad..2f3254c 100644 --- a/src/main/java/racingcar/ui/Receiver.java +++ b/src/main/java/racingcar/ui/Receiver.java @@ -1,6 +1,7 @@ package racingcar.ui; import java.util.Arrays; +import java.util.InputMismatchException; import java.util.List; import java.util.Scanner; @@ -14,7 +15,16 @@ public List receiveCarNames() { } public int receiveNumberOfRounds() { - return scanner.nextInt(); + Printer printer = new Printer(); + int numberOfRounds = 0; + try{ + numberOfRounds = scanner.nextInt(); + }catch (InputMismatchException e) { + printer.printInputMismatchExceptionMessage(); + } catch (IllegalArgumentException e) { + printer.printExceptionMessage(e); + } + return numberOfRounds; } public void clearBuffer() { From 8f4065810e076b25fdc3def6a8cd61798f6548c4 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 16:57:46 +0900 Subject: [PATCH 51/70] =?UTF-8?q?refactor:=20throwExceptionIfInputIsZero?= =?UTF-8?q?=20method=20=EC=99=80=20SplitInputLine=20method=20=EB=A5=BC=20R?= =?UTF-8?q?acingGameApplication=20=EC=97=90=EC=84=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/RacingGameApplication.java | 48 +++++-------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index 31cf9d6..38c0255 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -6,17 +6,14 @@ import racingcar.dto.CarNumberDto; import racingcar.exception.NotZeroRoundException; import racingcar.repository.CarManager; +import racingcar.repository.exception.NotDuplicateNameException; import racingcar.ui.Printer; import racingcar.ui.Receiver; import java.util.ArrayList; -import java.util.Arrays; -import java.util.InputMismatchException; import java.util.List; public class RacingGameApplication { - private static final int INPUT_ZERO = 0; - private static final String DELIMITER = ","; private final Printer printer = new Printer(); private final Receiver receiver = new Receiver(); @@ -24,19 +21,18 @@ public class RacingGameApplication { public void run() { printer.requestCarName(); - String line = receiver.receiveCarNames(); try { - List carList = createAllCars(splitInputLine(line)); + List carList = createAllCars(receiver.receiveCarNames()); carManager.addAllCars(carList); }catch (NotBlankException e) { printer.printExceptionMessage(e); - run(); + }catch (NotDuplicateNameException e){ + printer.printExceptionMessage(e); } - printer.requestNumberOfRounds(); - Round rounds = new Round(receiveRounds()); - proceedRound(rounds); + printer.requestNumberOfRounds(); + receiveRounds(); - printer.printWinner(carManager.createWinnerMessage()); + printer.printWinner(carManager.createWinnerMessage()); } @@ -58,33 +54,15 @@ private List createAllCars(List carNames) { return carList; } - private int receiveRounds() { - int rounds = 0; - boolean isInvalidInput = true; - while (isInvalidInput) { - try { - rounds = receiver.receiveNumberOfRounds(); - throwExceptionIfInputIsZero(rounds); - isInvalidInput = false; - } catch (InputMismatchException e) { - printer.printInputMismatchExceptionMessage(receiver); - } catch (IllegalArgumentException e) { - printer.printExceptionMessage(e); - } - } - return rounds; - } - - private void throwExceptionIfInputIsZero(int rounds) { - if (rounds == INPUT_ZERO) { - throw new NotZeroRoundException(); + private void receiveRounds() { + try{ + Round rounds = new Round(receiver.receiveNumberOfRounds()); + proceedRound(rounds); + }catch(NotZeroRoundException e) { + printer.printExceptionMessage(e); } } - private List splitInputLine(String line) { - return Arrays.asList(line.split(DELIMITER)); - } - public static void main(String[] args) { RacingGameApplication app = new RacingGameApplication(); app.run(); From 6f573145470698fdc73b6f06018900f0dc3385c8 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 17:21:27 +0900 Subject: [PATCH 52/70] =?UTF-8?q?feat:=20Receiver=20=EC=97=90=EC=84=9C=20v?= =?UTF-8?q?alidate=20=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20input=20?= =?UTF-8?q?=EA=B0=92=EC=9D=B4=20=EB=93=A4=EC=96=B4=EC=98=AC=20=EC=8B=9C=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20Receiver=20class=EB=A1=9C=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=EC=9D=84=20=EB=B3=B4=EB=82=B4=EB=8A=94=20class=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/ui/validator/ReceiverValidator.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/racingcar/ui/validator/ReceiverValidator.java diff --git a/src/main/java/racingcar/ui/validator/ReceiverValidator.java b/src/main/java/racingcar/ui/validator/ReceiverValidator.java new file mode 100644 index 0000000..6d4dbd0 --- /dev/null +++ b/src/main/java/racingcar/ui/validator/ReceiverValidator.java @@ -0,0 +1,4 @@ +package racingcar.ui.validator; + +public class ReceiverValidator { +} From c40921a1fcf2193a9a361b6a2744fb985c7fa0aa Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 17:44:57 +0900 Subject: [PATCH 53/70] =?UTF-8?q?delete:=20random=20util=20class=EC=9D=98?= =?UTF-8?q?=20=ED=95=84=EC=9A=94=EC=84=B1=EC=9D=B4=20=EC=97=86=EA=B8=B0=20?= =?UTF-8?q?=EB=95=8C=EB=AC=B8=EC=97=90=20RandomGenerator=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/util/RandomGenerator.java | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 src/main/java/racingcar/util/RandomGenerator.java diff --git a/src/main/java/racingcar/util/RandomGenerator.java b/src/main/java/racingcar/util/RandomGenerator.java deleted file mode 100644 index 5563bad..0000000 --- a/src/main/java/racingcar/util/RandomGenerator.java +++ /dev/null @@ -1,16 +0,0 @@ -package racingcar.util; - -import java.util.Random; - -public class RandomGenerator { - private static final int UPPER_BOUND = 10; - private static final Random RANDOM = new Random(); - - private RandomGenerator(){ - - } - - public static int generateNumber(){ - return RANDOM.nextInt(UPPER_BOUND); - } -} From 735092e5946764200bdda9df47fdf07c88ad395e Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 17:45:39 +0900 Subject: [PATCH 54/70] =?UTF-8?q?feat:=20MoveStrategy=20class=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20RandomMoveStrategy=20class=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/repository/Strategy/MoveStrategy.java | 5 +++++ .../repository/Strategy/RandomMoveStrategy.java | 11 +++++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/main/java/racingcar/repository/Strategy/MoveStrategy.java create mode 100644 src/main/java/racingcar/repository/Strategy/RandomMoveStrategy.java diff --git a/src/main/java/racingcar/repository/Strategy/MoveStrategy.java b/src/main/java/racingcar/repository/Strategy/MoveStrategy.java new file mode 100644 index 0000000..303b34f --- /dev/null +++ b/src/main/java/racingcar/repository/Strategy/MoveStrategy.java @@ -0,0 +1,5 @@ +package racingcar.repository.Strategy; + +interface MoveStrategy { + public int decideMoving(); +} diff --git a/src/main/java/racingcar/repository/Strategy/RandomMoveStrategy.java b/src/main/java/racingcar/repository/Strategy/RandomMoveStrategy.java new file mode 100644 index 0000000..f0b686b --- /dev/null +++ b/src/main/java/racingcar/repository/Strategy/RandomMoveStrategy.java @@ -0,0 +1,11 @@ +package racingcar.repository.Strategy; + +import java.util.Random; + +public class RandomMoveStrategy implements MoveStrategy{ + private final int UPPER_BOUND = 10; + @Override + public int decideMoving(){ + return new Random().nextInt(UPPER_BOUND); + } +} From 6144be7beb2c4b531368f2560df050d14cb552cd Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 18:10:42 +0900 Subject: [PATCH 55/70] =?UTF-8?q?feat:=20RandomMoveStrategy=20=EC=9D=98=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EC=97=90=20=EC=9D=98=ED=95=B4=EC=84=9C=20car?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=EA=B0=80=20=EC=9B=80=EC=A7=81=EC=9D=BC?= =?UTF-8?q?=EC=A7=80=20=EB=A7=90=EC=A7=80=EC=9D=98=20=EC=97=AC=EB=B6=80?= =?UTF-8?q?=EB=A5=BC=20=ED=8C=90=EB=8B=A8=ED=95=98=EA=B3=A0=20=ED=96=89?= =?UTF-8?q?=EB=8F=99=ED=95=98=EB=8A=94=20ForwardMoveStrategy=20class?= =?UTF-8?q?=EC=99=80=20StopMoveStrategy=20class=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/Strategy/ForwardMoveStrategy.java | 11 +++++++++++ .../repository/Strategy/RandomMoveStrategy.java | 6 ++++++ .../repository/Strategy/StopMoveStrategy.java | 6 ++++++ 3 files changed, 23 insertions(+) create mode 100644 src/main/java/racingcar/repository/Strategy/ForwardMoveStrategy.java create mode 100644 src/main/java/racingcar/repository/Strategy/StopMoveStrategy.java diff --git a/src/main/java/racingcar/repository/Strategy/ForwardMoveStrategy.java b/src/main/java/racingcar/repository/Strategy/ForwardMoveStrategy.java new file mode 100644 index 0000000..6b79e29 --- /dev/null +++ b/src/main/java/racingcar/repository/Strategy/ForwardMoveStrategy.java @@ -0,0 +1,11 @@ +package racingcar.repository.Strategy; + +import racingcar.domain.car.Car; + +public class ForwardMoveStrategy extends RandomMoveStrategy{ + public void forwardDeciding(Car car){ + if(decideMoving() >= getThreshold()){ + car.move(); + } + } +} diff --git a/src/main/java/racingcar/repository/Strategy/RandomMoveStrategy.java b/src/main/java/racingcar/repository/Strategy/RandomMoveStrategy.java index f0b686b..fbaf374 100644 --- a/src/main/java/racingcar/repository/Strategy/RandomMoveStrategy.java +++ b/src/main/java/racingcar/repository/Strategy/RandomMoveStrategy.java @@ -4,8 +4,14 @@ public class RandomMoveStrategy implements MoveStrategy{ private final int UPPER_BOUND = 10; + private static final int THRESHOLD = 4; + @Override public int decideMoving(){ return new Random().nextInt(UPPER_BOUND); } + + public int getThreshold(){ + return THRESHOLD; + } } diff --git a/src/main/java/racingcar/repository/Strategy/StopMoveStrategy.java b/src/main/java/racingcar/repository/Strategy/StopMoveStrategy.java new file mode 100644 index 0000000..d97d679 --- /dev/null +++ b/src/main/java/racingcar/repository/Strategy/StopMoveStrategy.java @@ -0,0 +1,6 @@ +package racingcar.repository.Strategy; +import racingcar.domain.car.Car; + +public class StopMoveStrategy extends RandomMoveStrategy{ + public void stopDeciding(Car car){} +} From d573258e3d010701473b0dc9f2382cb076853021 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 18:13:31 +0900 Subject: [PATCH 56/70] =?UTF-8?q?delete:=20Discriminator=20class=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20test=20case=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/util/Discriminator.java | 9 ----- .../racingcar/util/DiscriminatorTest.java | 33 ------------------- 2 files changed, 42 deletions(-) delete mode 100644 src/main/java/racingcar/util/Discriminator.java delete mode 100644 src/test/java/racingcar/util/DiscriminatorTest.java diff --git a/src/main/java/racingcar/util/Discriminator.java b/src/main/java/racingcar/util/Discriminator.java deleted file mode 100644 index c8881f4..0000000 --- a/src/main/java/racingcar/util/Discriminator.java +++ /dev/null @@ -1,9 +0,0 @@ -package racingcar.util; - -public class Discriminator { - private static final int THRESHOLD = 4; - - public static boolean isMove(int randomNumber) { - return (randomNumber >= THRESHOLD); - } -} diff --git a/src/test/java/racingcar/util/DiscriminatorTest.java b/src/test/java/racingcar/util/DiscriminatorTest.java deleted file mode 100644 index 29de093..0000000 --- a/src/test/java/racingcar/util/DiscriminatorTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package racingcar.util; - -import org.junit.jupiter.api.Test; -import racingcar.util.Discriminator; - -import static org.assertj.core.api.Assertions.assertThat; - -class DiscriminatorTest { - - @Test - void _4이상이면_전진한다() { - //given - int generatedNumber = 4; - - //when - boolean expected = Discriminator.isMove(generatedNumber); - - //then - assertThat(expected).isTrue(); - } - - @Test - void _3이하이면_움직이지_않는다() { - //given - int generatedNumber = 3; - - //when - boolean expected = Discriminator.isMove(generatedNumber); - - //then - assertThat(expected).isFalse(); - } -} \ No newline at end of file From 9169126c7b5f4bf64c9b3deff55b81148fa897dd Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Mar 2021 18:16:29 +0900 Subject: [PATCH 57/70] =?UTF-8?q?refactor:=20Discriminator=20class=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A7=81=EC=A0=91=20Car=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EB=A5=BC=20move()=20=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/repository/CarManager.java | 11 ++++------- .../java/racingcar/repository/CarManagerTest.java | 8 ++++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index e5f4c3a..52bebab 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -2,10 +2,9 @@ import racingcar.domain.car.Car; import racingcar.dto.CarNumberDto; +import racingcar.repository.Strategy.ForwardMoveStrategy; import racingcar.repository.exception.NotDuplicateNameException; import racingcar.ui.Printer; -import racingcar.util.Discriminator; -import racingcar.util.RandomGenerator; import java.util.ArrayList; import java.util.List; @@ -13,6 +12,7 @@ public class CarManager { private List cars; + private final ForwardMoveStrategy forwardMoveStrategy = new ForwardMoveStrategy(); public CarManager() { cars = new ArrayList<>(); @@ -39,8 +39,7 @@ public List generateCarNumberDtos() { List dtos = new ArrayList<>(); for (Car car: cars) { - int randomNumber = RandomGenerator.generateNumber(); - dtos.add(new CarNumberDto(car, randomNumber)); + dtos.add(new CarNumberDto(car)); } return dtos; @@ -48,9 +47,7 @@ public List generateCarNumberDtos() { public void moveAllCars(List carNumberList) { for (CarNumberDto dto : carNumberList) { - if (Discriminator.isMove(dto.getNumber())) { - dto.getCar().move(); - } + forwardMoveStrategy.forwardDeciding(dto.getCar()); } } diff --git a/src/test/java/racingcar/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java index a06ec90..cd5b8f8 100644 --- a/src/test/java/racingcar/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -1,6 +1,6 @@ package racingcar.repository; -import racingcar.domain.Car; +import racingcar.domain.car.Car; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import racingcar.dto.CarNumberDto; @@ -62,9 +62,9 @@ void setup() { //when List randomNumberList = - List.of(new CarNumberDto(oereo, 4), - new CarNumberDto(pkalsh, 4), - new CarNumberDto(kouz95, 2)); + List.of(new CarNumberDto(oereo), + new CarNumberDto(pkalsh), + new CarNumberDto(kouz95)); carManager.moveAllCars(randomNumberList); From 761b3dc23315aa78115358efe4a048c319ecacbc Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Fri, 26 Mar 2021 10:12:58 +0900 Subject: [PATCH 58/70] =?UTF-8?q?refactor:=20receiveNumberOfRounds=20valid?= =?UTF-8?q?ation=20=EC=99=80=20=EA=B4=80=EB=A0=A8=EB=90=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/ui/Receiver.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/racingcar/ui/Receiver.java b/src/main/java/racingcar/ui/Receiver.java index 2f3254c..6188997 100644 --- a/src/main/java/racingcar/ui/Receiver.java +++ b/src/main/java/racingcar/ui/Receiver.java @@ -1,7 +1,6 @@ package racingcar.ui; import java.util.Arrays; -import java.util.InputMismatchException; import java.util.List; import java.util.Scanner; @@ -15,15 +14,7 @@ public List receiveCarNames() { } public int receiveNumberOfRounds() { - Printer printer = new Printer(); - int numberOfRounds = 0; - try{ - numberOfRounds = scanner.nextInt(); - }catch (InputMismatchException e) { - printer.printInputMismatchExceptionMessage(); - } catch (IllegalArgumentException e) { - printer.printExceptionMessage(e); - } + int numberOfRounds = scanner.nextInt(); return numberOfRounds; } From 35ed5d82c1af093fe5d57e8b600a577d3e5fa613 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 00:18:48 +0900 Subject: [PATCH 59/70] =?UTF-8?q?refactor:=20round=20=ED=98=95=ED=83=9C?= =?UTF-8?q?=EB=A5=BC=20variable=EA=B2=BD=20=EC=9D=B4=20=EC=95=84=EB=8B=8C?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EB=B3=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/RacingGameApplication.java | 16 ++++++---------- src/main/java/racingcar/domain/Round.java | 17 ++++++----------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index 38c0255..e28ca4b 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -4,11 +4,11 @@ import racingcar.domain.car.Car; import racingcar.domain.exception.NotBlankException; import racingcar.dto.CarNumberDto; -import racingcar.exception.NotZeroRoundException; import racingcar.repository.CarManager; import racingcar.repository.exception.NotDuplicateNameException; import racingcar.ui.Printer; import racingcar.ui.Receiver; +import racingcar.ui.validator.ReceiverValidator; import java.util.ArrayList; import java.util.List; @@ -30,8 +30,8 @@ public void run() { printer.printExceptionMessage(e); } printer.requestNumberOfRounds(); - receiveRounds(); - + Round rounds = receiveRounds(); + proceedRound(rounds); printer.printWinner(carManager.createWinnerMessage()); } @@ -54,13 +54,9 @@ private List createAllCars(List carNames) { return carList; } - private void receiveRounds() { - try{ - Round rounds = new Round(receiver.receiveNumberOfRounds()); - proceedRound(rounds); - }catch(NotZeroRoundException e) { - printer.printExceptionMessage(e); - } + private Round receiveRounds() { + Round roundObject = new Round(); + return roundObject; } public static void main(String[] args) { diff --git a/src/main/java/racingcar/domain/Round.java b/src/main/java/racingcar/domain/Round.java index 83da728..2b13431 100644 --- a/src/main/java/racingcar/domain/Round.java +++ b/src/main/java/racingcar/domain/Round.java @@ -1,21 +1,16 @@ package racingcar.domain; -import racingcar.exception.NotZeroRoundException; +import racingcar.ui.validator.ReceiverValidator; public class Round { - private static final int INPUT_ZERO = 0; - private int rounds; + private final int rounds; + private final ReceiverValidator receiverValidator = new ReceiverValidator(); - public Round(int rounds) { - checkInputZeroRound(rounds); - this.rounds = rounds; + public Round() { + int round = receiverValidator.getvalidateReceiveNumberOfRounds(); + this.rounds = round; } - private void checkInputZeroRound(int rounds) { - if (rounds == INPUT_ZERO) { - throw new NotZeroRoundException(); - } - } public int getRounds() { return rounds; } From fec98088546599763e42442d25387fa1be84e669 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 00:20:19 +0900 Subject: [PATCH 60/70] =?UTF-8?q?feat:=20round=EC=97=90=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=EB=90=9C=20=EA=B0=92=EC=9D=84=20=EB=B0=9B=EC=9D=84=20?= =?UTF-8?q?=EC=8B=9C=EC=97=90=20validate=ED=95=9C=20=EA=B0=92=EC=9D=B4=20?= =?UTF-8?q?=EB=93=A4=EC=96=B4=EC=98=AC=20=EC=88=98=20=EC=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20ReceiverValidator=20class=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20getValidateReceiveNumberOfRounds=20method=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/Round.java | 2 +- .../ui/validator/ReceiverValidator.java | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/domain/Round.java b/src/main/java/racingcar/domain/Round.java index 2b13431..1cf11f5 100644 --- a/src/main/java/racingcar/domain/Round.java +++ b/src/main/java/racingcar/domain/Round.java @@ -7,7 +7,7 @@ public class Round { private final ReceiverValidator receiverValidator = new ReceiverValidator(); public Round() { - int round = receiverValidator.getvalidateReceiveNumberOfRounds(); + int round = receiverValidator.getValidateReceiveNumberOfRounds(); this.rounds = round; } diff --git a/src/main/java/racingcar/ui/validator/ReceiverValidator.java b/src/main/java/racingcar/ui/validator/ReceiverValidator.java index 6d4dbd0..9db075e 100644 --- a/src/main/java/racingcar/ui/validator/ReceiverValidator.java +++ b/src/main/java/racingcar/ui/validator/ReceiverValidator.java @@ -1,4 +1,39 @@ package racingcar.ui.validator; +import racingcar.exception.NotZeroRoundException; +import racingcar.ui.Printer; +import racingcar.ui.Receiver; + +import java.util.InputMismatchException; + public class ReceiverValidator { + private static final int INPUT_ZERO = 0; + + private Receiver receiver = new Receiver(); + private Printer printer = new Printer(); + + public int getValidateReceiveNumberOfRounds() { + int validateReceiveNumberOfRounds = 0, isValidate; + do{ + isValidate = 1; + try{ + validateReceiveNumberOfRounds = receiver.receiveNumberOfRounds(); + checkInputZeroRound(validateReceiveNumberOfRounds); + }catch (InputMismatchException e) { + isValidate = 0; + printer.printInputMismatchExceptionMessage(); + }catch (IllegalArgumentException e) { + isValidate = 0; + printer.printExceptionMessage(e); + } + }while(isValidate == 0); + return validateReceiveNumberOfRounds; + } + + private void checkInputZeroRound(int rounds) { + if (rounds == INPUT_ZERO) { + throw new NotZeroRoundException(); + } + } + } From ea5a4fd85aedcb3d1eb2e6117bda0799b2b3ba00 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 00:27:59 +0900 Subject: [PATCH 61/70] =?UTF-8?q?refactor:=20random=20number=20=EB=A5=BC?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=ED=95=A0=20=EC=9D=B4=EC=9C=A0=EA=B0=80=20?= =?UTF-8?q?=EC=97=86=EA=B8=B0=20=EB=95=8C=EB=AC=B8=EC=97=90=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20class=20naming=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/dto/CarDto.java | 17 +++++++++++++++ src/main/java/racingcar/dto/CarNumberDto.java | 21 ------------------- 2 files changed, 17 insertions(+), 21 deletions(-) create mode 100644 src/main/java/racingcar/dto/CarDto.java delete mode 100644 src/main/java/racingcar/dto/CarNumberDto.java diff --git a/src/main/java/racingcar/dto/CarDto.java b/src/main/java/racingcar/dto/CarDto.java new file mode 100644 index 0000000..2c91cac --- /dev/null +++ b/src/main/java/racingcar/dto/CarDto.java @@ -0,0 +1,17 @@ +package racingcar.dto; + +import racingcar.domain.car.Car; + +public class CarDto { + private final Car car; + + public CarDto(Car car) { + this.car = car; + + } + + public Car getCar() { + return car; + } + +} diff --git a/src/main/java/racingcar/dto/CarNumberDto.java b/src/main/java/racingcar/dto/CarNumberDto.java deleted file mode 100644 index e9f3143..0000000 --- a/src/main/java/racingcar/dto/CarNumberDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package racingcar.dto; - -import racingcar.domain.Car; - -public class CarNumberDto { - private final Car car; - private final int number; - - public CarNumberDto(Car car, int number) { - this.car = car; - this.number = number; - } - - public Car getCar() { - return car; - } - - public int getNumber() { - return number; - } -} From de3ba250b6ddb23f5939f41bed42ab922e7cce87 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 01:15:33 +0900 Subject: [PATCH 62/70] =?UTF-8?q?feat:=20CarManagerValidator=20class=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../validator/CarManagerValidator.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/racingcar/repository/validator/CarManagerValidator.java diff --git a/src/main/java/racingcar/repository/validator/CarManagerValidator.java b/src/main/java/racingcar/repository/validator/CarManagerValidator.java new file mode 100644 index 0000000..5594c66 --- /dev/null +++ b/src/main/java/racingcar/repository/validator/CarManagerValidator.java @@ -0,0 +1,34 @@ +package racingcar.repository.validator; + +import racingcar.domain.car.Car; +import racingcar.domain.exception.NotBlankException; +import racingcar.domain.exception.NotValidNameLengthException; +import racingcar.repository.CarManager; +import racingcar.ui.Printer; +import racingcar.ui.Receiver; + +import java.util.ArrayList; +import java.util.List; + +public class CarManagerValidator { + private final Receiver receiver = new Receiver(); + private final Printer printer = new Printer(); + private final CarManager carManager = new CarManager(); + + public List getValidateCarNames() { + List carList = new ArrayList<>();; + boolean isValidate; + do{ + isValidate = false; + try{ + carList = carManager.createAllCars(receiver.receiveCarNames()); + }catch (NotBlankException | NotValidNameLengthException e) { + isValidate = true; + printer.printExceptionMessage(e); + } + }while(isValidate); + return carList; + } + + +} From c5eb6482651b802cf8ebb996da6cd5c09c2ca3cd Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 01:16:40 +0900 Subject: [PATCH 63/70] =?UTF-8?q?refactor:=20run()=20method=20=EA=B0=84?= =?UTF-8?q?=EC=86=8C=ED=99=94=20=EB=B0=8F=20createAllCars()=20method=20?= =?UTF-8?q?=EB=A5=BC=20RacingGameApplication=20=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/RacingGameApplication.java | 32 ++++--------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index e28ca4b..2671c89 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -2,15 +2,12 @@ import racingcar.domain.Round; import racingcar.domain.car.Car; -import racingcar.domain.exception.NotBlankException; -import racingcar.dto.CarNumberDto; +import racingcar.repository.validator.CarManagerValidator; +import racingcar.dto.CarDto; import racingcar.repository.CarManager; -import racingcar.repository.exception.NotDuplicateNameException; import racingcar.ui.Printer; import racingcar.ui.Receiver; -import racingcar.ui.validator.ReceiverValidator; -import java.util.ArrayList; import java.util.List; public class RacingGameApplication { @@ -18,17 +15,11 @@ public class RacingGameApplication { private final Printer printer = new Printer(); private final Receiver receiver = new Receiver(); private final CarManager carManager = new CarManager(); - + private final CarManagerValidator carNameValidator = new CarManagerValidator(); public void run() { printer.requestCarName(); - try { - List carList = createAllCars(receiver.receiveCarNames()); - carManager.addAllCars(carList); - }catch (NotBlankException e) { - printer.printExceptionMessage(e); - }catch (NotDuplicateNameException e){ - printer.printExceptionMessage(e); - } + List carList = carNameValidator.getValidateCarNames(); + carManager.addAllCars(carList); printer.requestNumberOfRounds(); Round rounds = receiveRounds(); proceedRound(rounds); @@ -39,21 +30,12 @@ public void run() { private void proceedRound(Round rounds) { printer.printResultHeader(); for (int i = 0; i < rounds.getRounds(); i++) { - List carNumberDtos = carManager.generateCarNumberDtos(); - carManager.moveAllCars(carNumberDtos); + List CarDtos = carManager.generateCarDtos(); + carManager.moveAllCars(CarDtos); carManager.printCarState(printer); } } - private List createAllCars(List carNames) { - List carList = new ArrayList<>(); - - for (String name : carNames) { - carList.add(new Car(name)); - } - return carList; - } - private Round receiveRounds() { Round roundObject = new Round(); return roundObject; From 8afc5d28ef0735f66a5c1ae7cf6f6e451700feb1 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 05:29:32 +0900 Subject: [PATCH 64/70] =?UTF-8?q?refactor:=20NotDuplicateNameException=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=EB=A5=BC=20ValidateAddCars?= =?UTF-8?q?=20method=20=EC=97=90=EC=84=9C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/repository/CarManager.java | 25 +++++++++++++------ .../validator/CarManagerValidator.java | 14 +++++------ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index 52bebab..4bddf6a 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -1,7 +1,7 @@ package racingcar.repository; import racingcar.domain.car.Car; -import racingcar.dto.CarNumberDto; +import racingcar.dto.CarDto; import racingcar.repository.Strategy.ForwardMoveStrategy; import racingcar.repository.exception.NotDuplicateNameException; import racingcar.ui.Printer; @@ -28,25 +28,34 @@ public int size() { return cars.size(); } - public void addAllCars(List cars) { - for (Car car : cars) { + public void addAllCars(List carGroups) { + cars = new ArrayList<>(); + for (Car car : carGroups) { checkDuplicateName(car); this.cars.add(car); } } - public List generateCarNumberDtos() { - List dtos = new ArrayList<>(); + public List createAllCars(List carNames) { + List carGroups = new ArrayList<>(); + + for (String name : carNames) { + carGroups.add(new Car(name)); + } + return carGroups; + } + public List generateCarDtos() { + List dtos = new ArrayList<>(); for (Car car: cars) { - dtos.add(new CarNumberDto(car)); + dtos.add(new CarDto(car)); } return dtos; } - public void moveAllCars(List carNumberList) { - for (CarNumberDto dto : carNumberList) { + public void moveAllCars(List carNumberList) { + for (CarDto dto : carNumberList) { forwardMoveStrategy.forwardDeciding(dto.getCar()); } } diff --git a/src/main/java/racingcar/repository/validator/CarManagerValidator.java b/src/main/java/racingcar/repository/validator/CarManagerValidator.java index 5594c66..4efd2de 100644 --- a/src/main/java/racingcar/repository/validator/CarManagerValidator.java +++ b/src/main/java/racingcar/repository/validator/CarManagerValidator.java @@ -4,6 +4,7 @@ import racingcar.domain.exception.NotBlankException; import racingcar.domain.exception.NotValidNameLengthException; import racingcar.repository.CarManager; +import racingcar.repository.exception.NotDuplicateNameException; import racingcar.ui.Printer; import racingcar.ui.Receiver; @@ -13,22 +14,19 @@ public class CarManagerValidator { private final Receiver receiver = new Receiver(); private final Printer printer = new Printer(); - private final CarManager carManager = new CarManager(); - public List getValidateCarNames() { - List carList = new ArrayList<>();; + public void ValidateAddCars(CarManager carManager) { + List cars;; boolean isValidate; do{ isValidate = false; try{ - carList = carManager.createAllCars(receiver.receiveCarNames()); - }catch (NotBlankException | NotValidNameLengthException e) { + cars = carManager.createAllCars(receiver.receiveCarNames()); + carManager.addAllCars(cars); + }catch (NotBlankException | NotValidNameLengthException | NotDuplicateNameException e ) { isValidate = true; printer.printExceptionMessage(e); } }while(isValidate); - return carList; } - - } From 8501c47f43e68d124190393c0efa244cd10a8410 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 06:15:10 +0900 Subject: [PATCH 65/70] =?UTF-8?q?feat:=20Winner=20class=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/Winner.java | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/racingcar/domain/Winner.java diff --git a/src/main/java/racingcar/domain/Winner.java b/src/main/java/racingcar/domain/Winner.java new file mode 100644 index 0000000..2076b9d --- /dev/null +++ b/src/main/java/racingcar/domain/Winner.java @@ -0,0 +1,26 @@ +package racingcar.domain; + +import racingcar.domain.car.Car; + +import java.util.List; + +public class Winner { + private static final String DELIMITER = ", "; + private final List winnerNames; + + public Winner(List winnerNames) { + this.winnerNames = winnerNames; + } + + public String getWinnerGroups() { + StringBuilder winnerGroups = new StringBuilder(); + winnerGroups.append(winnerNames.get(0).getName()); + + for (int i = 1; i < winnerNames.size(); i++) { + Car winner = winnerNames.get(i); + winnerGroups.append(DELIMITER); + winnerGroups.append(winner.getName()); + } + return winnerGroups.toString(); + } +} From ea61730be70d967ed619fde9c43b86624ee5768f Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 06:16:14 +0900 Subject: [PATCH 66/70] =?UTF-8?q?feat:=20CarManager=20class=20=EC=95=88=20?= =?UTF-8?q?createWinnerMessage=20method=20=EC=97=AD=ED=95=A0=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/repository/CarManager.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/racingcar/repository/CarManager.java b/src/main/java/racingcar/repository/CarManager.java index 4bddf6a..3cac672 100644 --- a/src/main/java/racingcar/repository/CarManager.java +++ b/src/main/java/racingcar/repository/CarManager.java @@ -1,5 +1,6 @@ package racingcar.repository; +import racingcar.domain.Winner; import racingcar.domain.car.Car; import racingcar.dto.CarDto; import racingcar.repository.Strategy.ForwardMoveStrategy; @@ -68,17 +69,10 @@ public void printCarState(Printer printer) { } public String createWinnerMessage() { - StringBuilder winnerNames = new StringBuilder(); List winners = winnerList(); - winnerNames.append(winners.get(0).getName()); + Winner winner = new Winner(winners); - for (int i = 1; i < winners.size(); i++) { - Car winner = winners.get(i); - winnerNames.append(", "); - winnerNames.append(winner.getName()); - } - - return winnerNames.toString(); + return winner.getWinnerGroups(); } private List winnerList() { From 257a825caea33e515ffa910c59d73c23aefc79dd Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 06:16:41 +0900 Subject: [PATCH 67/70] =?UTF-8?q?refactor:=20class=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/RacingGameApplication.java | 9 ++++----- .../java/racingcar/repository/Strategy/MoveStrategy.java | 2 +- src/main/java/racingcar/ui/Printer.java | 5 +++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index 2671c89..fe1b5e3 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -13,18 +13,17 @@ public class RacingGameApplication { private final Printer printer = new Printer(); - private final Receiver receiver = new Receiver(); private final CarManager carManager = new CarManager(); - private final CarManagerValidator carNameValidator = new CarManagerValidator(); + private final CarManagerValidator carManagerValidator = new CarManagerValidator(); public void run() { printer.requestCarName(); - List carList = carNameValidator.getValidateCarNames(); - carManager.addAllCars(carList); + carManagerValidator.ValidateAddCars(carManager); + printer.requestNumberOfRounds(); Round rounds = receiveRounds(); proceedRound(rounds); - printer.printWinner(carManager.createWinnerMessage()); + printer.printWinner(carManager.createWinnerMessage()); } private void proceedRound(Round rounds) { diff --git a/src/main/java/racingcar/repository/Strategy/MoveStrategy.java b/src/main/java/racingcar/repository/Strategy/MoveStrategy.java index 303b34f..4673291 100644 --- a/src/main/java/racingcar/repository/Strategy/MoveStrategy.java +++ b/src/main/java/racingcar/repository/Strategy/MoveStrategy.java @@ -1,5 +1,5 @@ package racingcar.repository.Strategy; interface MoveStrategy { - public int decideMoving(); + int decideMoving(); } diff --git a/src/main/java/racingcar/ui/Printer.java b/src/main/java/racingcar/ui/Printer.java index 422cbb2..8aceada 100644 --- a/src/main/java/racingcar/ui/Printer.java +++ b/src/main/java/racingcar/ui/Printer.java @@ -1,6 +1,6 @@ package racingcar.ui; -import racingcar.domain.Car; +import racingcar.domain.car.Car; public class Printer { private static final String CAR_NAME_REQUEST_MESSAGE = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; @@ -37,7 +37,8 @@ public void printExceptionMessage(Exception e) { System.out.println(e.getMessage()); } - public void printInputMismatchExceptionMessage(Receiver receiver) { + public void printInputMismatchExceptionMessage() { + Receiver receiver = new Receiver(); receiver.clearBuffer(); System.out.println(INPUT_MISMATCH_EXCEPTION_MESSAGE); } From 8c28348b4475396022afdbf28fab419b16d80a67 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 06:59:20 +0900 Subject: [PATCH 68/70] =?UTF-8?q?refactor:=20class=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/Strategy/StopMoveStrategy.java | 6 --- src/test/java/racingcar/domain/CarTest.java | 15 ++++++ .../racingcar/repository/CarManagerTest.java | 50 +++++++++---------- 3 files changed, 40 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/racingcar/repository/Strategy/StopMoveStrategy.java diff --git a/src/main/java/racingcar/repository/Strategy/StopMoveStrategy.java b/src/main/java/racingcar/repository/Strategy/StopMoveStrategy.java deleted file mode 100644 index d97d679..0000000 --- a/src/main/java/racingcar/repository/Strategy/StopMoveStrategy.java +++ /dev/null @@ -1,6 +0,0 @@ -package racingcar.repository.Strategy; -import racingcar.domain.car.Car; - -public class StopMoveStrategy extends RandomMoveStrategy{ - public void stopDeciding(Car car){} -} diff --git a/src/test/java/racingcar/domain/CarTest.java b/src/test/java/racingcar/domain/CarTest.java index 5cbc437..12c0037 100644 --- a/src/test/java/racingcar/domain/CarTest.java +++ b/src/test/java/racingcar/domain/CarTest.java @@ -1,13 +1,28 @@ package racingcar.domain; +import org.junit.jupiter.api.BeforeEach; +import racingcar.domain.car.Car; import racingcar.domain.exception.NotBlankException; import org.junit.jupiter.api.Test; import racingcar.domain.exception.NotValidNameLengthException; +import racingcar.repository.CarManager; +import racingcar.repository.exception.NotDuplicateNameException; +import racingcar.repository.validator.CarManagerValidator; + +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; class CarTest { + private CarManager carManager; + private CarManagerValidator carManagerValidator; + + @BeforeEach + void setup() { + carManager = new CarManager(); + carManagerValidator = new CarManagerValidator(); + } @Test void move() { diff --git a/src/test/java/racingcar/repository/CarManagerTest.java b/src/test/java/racingcar/repository/CarManagerTest.java index cd5b8f8..da6d437 100644 --- a/src/test/java/racingcar/repository/CarManagerTest.java +++ b/src/test/java/racingcar/repository/CarManagerTest.java @@ -3,7 +3,7 @@ import racingcar.domain.car.Car; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import racingcar.dto.CarNumberDto; +import racingcar.dto.CarDto; import racingcar.repository.exception.NotDuplicateNameException; import java.util.List; @@ -50,29 +50,29 @@ void setup() { .isThrownBy(() -> carManager.addAllCars(carList)); } - @Test - void 랜덤_숫자_리스트를_넘기면_기준에_따라_플레이어가_이동한다() { - //given - Car oereo = new Car("oer"); - Car pkalsh = new Car("pka"); - Car kouz95 = new Car("kouz"); - - List carList = List.of(oereo, pkalsh, kouz95); - carManager.addAllCars(carList); - - //when - List randomNumberList = - List.of(new CarNumberDto(oereo), - new CarNumberDto(pkalsh), - new CarNumberDto(kouz95)); - - carManager.moveAllCars(randomNumberList); - - //then - assertThat(oereo.getPosition()).isEqualTo(1); - assertThat(pkalsh.getPosition()).isEqualTo(1); - assertThat(kouz95.getPosition()).isEqualTo(0); - } +// @Test +// void 랜덤_숫자_리스트를_넘기면_기준에_따라_플레이어가_이동한다() { +// //given +// Car oereo = new Car("oer"); +// Car pkalsh = new Car("pka"); +// Car kouz95 = new Car("kouz"); +// +// List carList = List.of(oereo, pkalsh, kouz95); +// carManager.addAllCars(carList); +// +// //when +// List randomNumberList = +// List.of(new CarDto(oereo), +// new CarDto(pkalsh), +// new CarDto(kouz95)); +// +// carManager.moveAllCars(randomNumberList); +// +// //then +// assertThat(oereo.getPosition()).isEqualTo(1); +// assertThat(pkalsh.getPosition()).isEqualTo(0); +// assertThat(kouz95.getPosition()).isEqualTo(1); +// } @Test void dto에_존재하는_car_객체가_CarManager의_collection에_존재하는_car_객체와_같다() { @@ -85,7 +85,7 @@ void setup() { carManager.addAllCars(carList); //when - List randomNumberList = carManager.generateCarNumberDtos(); + List randomNumberList = carManager.generateCarDtos(); //then for (int i = 0; i < carList.size(); i++) { From 50063f26c01665cce7007ea1bd840392f0ad5175 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 07:00:00 +0900 Subject: [PATCH 69/70] =?UTF-8?q?delete:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=AA=A8=EB=93=88=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/racingcar/domain/CarTest.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/test/java/racingcar/domain/CarTest.java b/src/test/java/racingcar/domain/CarTest.java index 12c0037..25ddbd8 100644 --- a/src/test/java/racingcar/domain/CarTest.java +++ b/src/test/java/racingcar/domain/CarTest.java @@ -1,29 +1,14 @@ package racingcar.domain; -import org.junit.jupiter.api.BeforeEach; import racingcar.domain.car.Car; import racingcar.domain.exception.NotBlankException; import org.junit.jupiter.api.Test; import racingcar.domain.exception.NotValidNameLengthException; -import racingcar.repository.CarManager; -import racingcar.repository.exception.NotDuplicateNameException; -import racingcar.repository.validator.CarManagerValidator; - -import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; class CarTest { - private CarManager carManager; - private CarManagerValidator carManagerValidator; - - @BeforeEach - void setup() { - carManager = new CarManager(); - carManagerValidator = new CarManagerValidator(); - } - @Test void move() { //given From bcf9d28e4405ff698e8a60963218e840e2c41134 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Sat, 27 Mar 2021 07:04:33 +0900 Subject: [PATCH 70/70] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=AA=A8=EB=93=88=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B0=8F=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/RacingGameApplication.java | 2 -- src/main/java/racingcar/domain/car/Car.java | 4 +--- src/main/java/racingcar/domain/car/CarName.java | 2 +- .../racingcar/repository/validator/CarManagerValidator.java | 1 - 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/racingcar/RacingGameApplication.java b/src/main/java/racingcar/RacingGameApplication.java index fe1b5e3..221c64a 100644 --- a/src/main/java/racingcar/RacingGameApplication.java +++ b/src/main/java/racingcar/RacingGameApplication.java @@ -1,12 +1,10 @@ package racingcar; import racingcar.domain.Round; -import racingcar.domain.car.Car; import racingcar.repository.validator.CarManagerValidator; import racingcar.dto.CarDto; import racingcar.repository.CarManager; import racingcar.ui.Printer; -import racingcar.ui.Receiver; import java.util.List; diff --git a/src/main/java/racingcar/domain/car/Car.java b/src/main/java/racingcar/domain/car/Car.java index 5eb6c7d..3381a47 100644 --- a/src/main/java/racingcar/domain/car/Car.java +++ b/src/main/java/racingcar/domain/car/Car.java @@ -7,10 +7,8 @@ public class Car { private int position = 0; private static final int MOVE_INTERVAL = 1; - private CarName carName; - public Car(String name) { - this.carName = new CarName(name); + CarName carName = new CarName(name); this.name = name; } diff --git a/src/main/java/racingcar/domain/car/CarName.java b/src/main/java/racingcar/domain/car/CarName.java index eb37ab7..11df1b4 100644 --- a/src/main/java/racingcar/domain/car/CarName.java +++ b/src/main/java/racingcar/domain/car/CarName.java @@ -5,7 +5,7 @@ public class CarName { private static final int CAR_NAME_MAX_LENGTH = 4; - private String name; + private final String name; public CarName(String name) { checkBlankName(name); diff --git a/src/main/java/racingcar/repository/validator/CarManagerValidator.java b/src/main/java/racingcar/repository/validator/CarManagerValidator.java index 4efd2de..00e62ca 100644 --- a/src/main/java/racingcar/repository/validator/CarManagerValidator.java +++ b/src/main/java/racingcar/repository/validator/CarManagerValidator.java @@ -8,7 +8,6 @@ import racingcar.ui.Printer; import racingcar.ui.Receiver; -import java.util.ArrayList; import java.util.List; public class CarManagerValidator {