From 53bf7fc8faeb1487d84dd604254e9907ead5fbaa Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 2 Sep 2021 17:56:27 +0900 Subject: [PATCH 01/35] =?UTF-8?q?feat=20:=20=EC=9D=B4=EB=A6=84=20VO=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/vo/Name.java | 24 ++++++++++++++++++++ src/test/java/domain/vo/NameTest.java | 32 +++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/domain/vo/Name.java create mode 100644 src/test/java/domain/vo/NameTest.java diff --git a/src/main/java/domain/vo/Name.java b/src/main/java/domain/vo/Name.java new file mode 100644 index 000000000..29e92e3a0 --- /dev/null +++ b/src/main/java/domain/vo/Name.java @@ -0,0 +1,24 @@ +package domain.vo; + +public class Name { + + private static final int MIN_NAME_LENGTH = 1; + private static final int MAX_NAME_LENGTH = 5; + + private final String value; + + public Name(final String value) { + validate(value); + this.value = value; + } + + private void validate(final String value) { + if (value.length() < MIN_NAME_LENGTH || value.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("이름이 길이는 1이상 5이하여야 합니다"); + } + } + + public String value() { + return value; + } +} diff --git a/src/test/java/domain/vo/NameTest.java b/src/test/java/domain/vo/NameTest.java new file mode 100644 index 000000000..789e4b479 --- /dev/null +++ b/src/test/java/domain/vo/NameTest.java @@ -0,0 +1,32 @@ +package domain.vo; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EmptySource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class NameTest { + + @ParameterizedTest + @ValueSource(strings = {"c", "aaaaa"}) + @DisplayName("이름의 길이가 1이상 5이하인 경우 값을 반환한다") + void name(String value) { + Name name = new Name(value); + + String actual = name.value(); + + assertThat(actual).isEqualTo(value); + } + + @ParameterizedTest + @EmptySource + @ValueSource(strings = "aaaaaa") + @DisplayName("이름의 길이가 0이하, 5초과일 경우 예외가 발생한다") + void create_throw_exception_with_invalid_name_length(String value) { + assertThatIllegalArgumentException().isThrownBy(() -> new Name(value)) + .withMessage("이름이 길이는 1이상 5이하여야 합니다"); + } +} From 4ec32f2cfe2ab6876d95531f1ffea102f0697347 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 2 Sep 2021 17:56:45 +0900 Subject: [PATCH 02/35] =?UTF-8?q?feat=20:=20=EC=9C=84=EC=B9=98=20VO=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/vo/Position.java | 18 ++++++++++++++ src/test/java/domain/vo/PositionTest.java | 30 +++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/main/java/domain/vo/Position.java create mode 100644 src/test/java/domain/vo/PositionTest.java diff --git a/src/main/java/domain/vo/Position.java b/src/main/java/domain/vo/Position.java new file mode 100644 index 000000000..eeb32c367 --- /dev/null +++ b/src/main/java/domain/vo/Position.java @@ -0,0 +1,18 @@ +package domain.vo; + +public class Position { + + private final int value; + + public Position(final int value) { + this.value = value; + } + + public int value() { + return value; + } + + public Position increaseBy(final int increasedValue) { + return new Position(value + increasedValue); + } +} diff --git a/src/test/java/domain/vo/PositionTest.java b/src/test/java/domain/vo/PositionTest.java new file mode 100644 index 000000000..b864c1970 --- /dev/null +++ b/src/test/java/domain/vo/PositionTest.java @@ -0,0 +1,30 @@ +package domain.vo; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class PositionTest { + + @Test + @DisplayName("위치를 초기화 하면 위치값을 반환한다") + void create() { + Position position = new Position(1); + + int actual = position.value(); + + assertThat(actual).isEqualTo(1); + } + + @Test + @DisplayName("증가할 위치 값을 인자로 받아 위치 값을 증가시킨다") + void increaseByOne() { + Position position = new Position(0); + + Position increasedPosition = position.increaseBy(1); + int actual = increasedPosition.value(); + + assertThat(actual).isEqualTo(1); + } +} From 84505b7ce61829be80c40d3ba3b8b86f69b55af2 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 2 Sep 2021 21:24:32 +0900 Subject: [PATCH 03/35] =?UTF-8?q?feat=20:=20Car=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 32 +++++++++++++++++++++ src/main/java/domain/vo/Position.java | 4 +-- src/test/java/domain/CarTest.java | 41 +++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/main/java/domain/Car.java create mode 100644 src/test/java/domain/CarTest.java diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java new file mode 100644 index 000000000..336ac1fc2 --- /dev/null +++ b/src/main/java/domain/Car.java @@ -0,0 +1,32 @@ +package domain; + +import domain.vo.Name; +import domain.vo.Position; + +public class Car { + + private static final int INITIAL_LOCATION = 0; + private static final int DISTANCE_MOVED_AT_ONCE = 1; + + private final Name name; + private Position position; + + public Car(final String name) { + this.name = new Name(name); + this.position = new Position(INITIAL_LOCATION); + } + + public String name() { + return name.value(); + } + + public int position() { + return position.value(); + } + + public void move(boolean canMove) { + if (canMove) { + position = position.increaseBy(DISTANCE_MOVED_AT_ONCE); + } + } +} diff --git a/src/main/java/domain/vo/Position.java b/src/main/java/domain/vo/Position.java index eeb32c367..440c9ef6f 100644 --- a/src/main/java/domain/vo/Position.java +++ b/src/main/java/domain/vo/Position.java @@ -12,7 +12,7 @@ public int value() { return value; } - public Position increaseBy(final int increasedValue) { - return new Position(value + increasedValue); + public Position increaseBy(final int distanceMovedAtOnce) { + return new Position(value + distanceMovedAtOnce); } } diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java new file mode 100644 index 000000000..30ad93a65 --- /dev/null +++ b/src/test/java/domain/CarTest.java @@ -0,0 +1,41 @@ +package domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +class CarTest { + private Car car; + + @BeforeEach + void setUp() { + car = new Car("name"); + } + + @Test + @DisplayName("이름를 입력받아 자동차 생성해서 이름과 초기 위치를 반환한다") + void create() { + String name = car.name(); + int position = car.position(); + + assertAll( + () -> assertThat(name).isEqualTo("name"), + () -> assertThat(position).isZero() + ); + } + + @ParameterizedTest + @CsvSource(value = {"true,1", "false,0"}) + @DisplayName("차의 위치를 증가시킨다") + void move(boolean canMove, int expected) { + car.move(canMove); + int actual = car.position(); + + assertThat(actual).isEqualTo(expected); + } +} From 86865497695d99365539a9a4c457c6d40bb919eb Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 16 Sep 2021 15:56:27 +0900 Subject: [PATCH 04/35] =?UTF-8?q?feat=20:=20Movement=20=EC=A0=84=EB=9E=B5?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/strategy/MovementStrategy.java | 5 ++++ .../RandomMovementStrategyStrategy.java | 17 +++++++++++++ .../strategy/RandomMovementStrategyTest.java | 24 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 src/main/java/strategy/MovementStrategy.java create mode 100644 src/main/java/strategy/RandomMovementStrategyStrategy.java create mode 100644 src/test/java/strategy/RandomMovementStrategyTest.java diff --git a/src/main/java/strategy/MovementStrategy.java b/src/main/java/strategy/MovementStrategy.java new file mode 100644 index 000000000..a2ecf6fd5 --- /dev/null +++ b/src/main/java/strategy/MovementStrategy.java @@ -0,0 +1,5 @@ +package strategy; + +public interface MovementStrategy { + boolean canMove(); +} diff --git a/src/main/java/strategy/RandomMovementStrategyStrategy.java b/src/main/java/strategy/RandomMovementStrategyStrategy.java new file mode 100644 index 000000000..6b36c901b --- /dev/null +++ b/src/main/java/strategy/RandomMovementStrategyStrategy.java @@ -0,0 +1,17 @@ +package strategy; + +import java.util.Random; + +public class RandomMovementStrategyStrategy implements MovementStrategy { + + private final Random random = new Random(); + + @Override + public boolean canMove() { + return generateRandom(); + } + + protected boolean generateRandom() { + return random.nextBoolean(); + } +} diff --git a/src/test/java/strategy/RandomMovementStrategyTest.java b/src/test/java/strategy/RandomMovementStrategyTest.java new file mode 100644 index 000000000..5373fa74f --- /dev/null +++ b/src/test/java/strategy/RandomMovementStrategyTest.java @@ -0,0 +1,24 @@ +package strategy; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class RandomMovementStrategyTest { + + @ParameterizedTest + @CsvSource(value = {"true,true", "false,false"}) + void canMove(boolean randomValue, boolean expected) { + MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { + @Override + protected boolean generateRandom() { + return randomValue; + } + }; + + boolean actual = movementStrategy.canMove(); + + assertThat(actual).isEqualTo(expected); + } +} From 259d5c4c308ed1d16fe48f36253a8790f3ae40bd Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 16 Sep 2021 15:57:01 +0900 Subject: [PATCH 05/35] =?UTF-8?q?feat=20:=20Car=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=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 | 23 +++++++++++++++++------ src/test/java/domain/CarTest.java | 15 ++++++++++++--- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index 336ac1fc2..3477d8c27 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -2,6 +2,7 @@ import domain.vo.Name; import domain.vo.Position; +import strategy.MovementStrategy; public class Car { @@ -9,11 +10,19 @@ public class Car { private static final int DISTANCE_MOVED_AT_ONCE = 1; private final Name name; - private Position position; + private final Position position; + + public Car(final Name name, final Position position) { + this.name = name; + this.position = position; + } + + public Car(final String name, final int position) { + this(new Name(name), new Position(position)); + } public Car(final String name) { - this.name = new Name(name); - this.position = new Position(INITIAL_LOCATION); + this(name, INITIAL_LOCATION); } public String name() { @@ -24,9 +33,11 @@ public int position() { return position.value(); } - public void move(boolean canMove) { - if (canMove) { - position = position.increaseBy(DISTANCE_MOVED_AT_ONCE); + public Car move(MovementStrategy movementStrategy) { + if (movementStrategy.canMove()) { + return new Car(name, position.increaseBy(DISTANCE_MOVED_AT_ONCE)); } + + return this; } } diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java index 30ad93a65..f20037be1 100644 --- a/src/test/java/domain/CarTest.java +++ b/src/test/java/domain/CarTest.java @@ -5,6 +5,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import strategy.MovementStrategy; +import strategy.RandomMovementStrategyStrategy; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; @@ -32,9 +34,16 @@ void create() { @ParameterizedTest @CsvSource(value = {"true,1", "false,0"}) @DisplayName("차의 위치를 증가시킨다") - void move(boolean canMove, int expected) { - car.move(canMove); - int actual = car.position(); + void move(boolean randomValue, int expected) { + MovementStrategy movementStrategy = new RandomMovementStrategyStrategy(){ + @Override + protected boolean generateRandom() { + return randomValue; + } + }; + + Car actualCar = car.move(movementStrategy); + int actual = actualCar.position(); assertThat(actual).isEqualTo(expected); } From 2cdce39db6c9b48468d67cc71b25f21a7be9a0c4 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Fri, 17 Sep 2021 18:26:14 +0900 Subject: [PATCH 06/35] =?UTF-8?q?feat=20:=20Name=20equals,=20hashCode=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/vo/Name.java | 15 +++++++++++++++ src/test/java/domain/vo/NameTest.java | 23 ++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/vo/Name.java b/src/main/java/domain/vo/Name.java index 29e92e3a0..2e8f9c7b5 100644 --- a/src/main/java/domain/vo/Name.java +++ b/src/main/java/domain/vo/Name.java @@ -1,5 +1,7 @@ package domain.vo; +import java.util.Objects; + public class Name { private static final int MIN_NAME_LENGTH = 1; @@ -21,4 +23,17 @@ private void validate(final String value) { public String value() { return value; } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof Name)) return false; + final Name name = (Name) other; + return value.equals(name.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } } diff --git a/src/test/java/domain/vo/NameTest.java b/src/test/java/domain/vo/NameTest.java index 789e4b479..1e00aa7b8 100644 --- a/src/test/java/domain/vo/NameTest.java +++ b/src/test/java/domain/vo/NameTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.EmptySource; import org.junit.jupiter.params.provider.ValueSource; @@ -17,7 +18,7 @@ void name(String value) { Name name = new Name(value); String actual = name.value(); - + assertThat(actual).isEqualTo(value); } @@ -29,4 +30,24 @@ void create_throw_exception_with_invalid_name_length(String value) { assertThatIllegalArgumentException().isThrownBy(() -> new Name(value)) .withMessage("이름이 길이는 1이상 5이하여야 합니다"); } + + @ParameterizedTest + @CsvSource(value = {"name,name,true", "name,other,false"}) + @DisplayName("이름이 같으면 참을 다르면 거짓을 반환한다") + void equals(String value, String otherValue, boolean expected) { + Name name = new Name(value); + Name other = new Name(otherValue); + boolean actual = name.equals(other); + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource(value = {"name,name,true", "name,other,false"}) + @DisplayName("이름이 같으면 같은 해시값을 반환하고, 다르면 다른 해시값을 반환한다") + void hashCode(String value, String otherValue, boolean expected) { + Name name = new Name(value); + Name other = new Name(otherValue); + boolean actual = name.hashCode() == other.hashCode(); + assertThat(actual).isEqualTo(expected); + } } From 417ad451ba0bae5dd1cfc446b41d3d725276d47d Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Fri, 17 Sep 2021 20:19:18 +0900 Subject: [PATCH 07/35] =?UTF-8?q?feat=20:=20equals,=20hashCode,=20isLarger?= =?UTF-8?q?Than=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/vo/Position.java | 19 ++++++++++++ src/test/java/domain/vo/PositionTest.java | 38 +++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/main/java/domain/vo/Position.java b/src/main/java/domain/vo/Position.java index 440c9ef6f..1d5369766 100644 --- a/src/main/java/domain/vo/Position.java +++ b/src/main/java/domain/vo/Position.java @@ -1,5 +1,7 @@ package domain.vo; +import java.util.Objects; + public class Position { private final int value; @@ -15,4 +17,21 @@ public int value() { public Position increaseBy(final int distanceMovedAtOnce) { return new Position(value + distanceMovedAtOnce); } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Position)) return false; + final Position position = (Position) o; + return value == position.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + public boolean isLargerThan(final Position other) { + return value() > other.value(); + } } diff --git a/src/test/java/domain/vo/PositionTest.java b/src/test/java/domain/vo/PositionTest.java index b864c1970..77e53c491 100644 --- a/src/test/java/domain/vo/PositionTest.java +++ b/src/test/java/domain/vo/PositionTest.java @@ -2,6 +2,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; @@ -27,4 +29,40 @@ void increaseByOne() { assertThat(actual).isEqualTo(1); } + + @ParameterizedTest + @CsvSource(value = {"1,1,true", "1,2,false"}) + @DisplayName("위치값이 같으면 참, 다르면 거짓을 반환한다") + void equals(int value, int otherValue, boolean expected) { + Position position = new Position(value); + Position other = new Position(otherValue); + + boolean actual = position.equals(other); + + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource(value = {"1,1,true", "1,2,false"}) + @DisplayName("위치값이 같으면 참, 다르면 거짓을 반환한다") + void hashCode(int value, int otherValue, boolean expected) { + Position position = new Position(value); + Position other = new Position(otherValue); + + boolean actual = position.hashCode() == other.hashCode(); + + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource(value = {"2,1,true", "1,2,false"}) + @DisplayName("위치값이 같으면 참, 다르면 거짓을 반환한다") + void isLargerThan(int value, int otherValue, boolean expected) { + Position position = new Position(value); + Position other = new Position(otherValue); + + boolean actual = position.isLargerThan(other); + + assertThat(actual).isEqualTo(expected); + } } From 1a2eccfc9b95aa9d959305743b552841d2bbb1af Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 4 Oct 2021 12:47:46 +0900 Subject: [PATCH 08/35] =?UTF-8?q?feat=20:=20Car=20equals(),=20hashCode()?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/domain/Car.java | 15 +++++++++++++++ src/test/java/domain/CarTest.java | 16 ++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index 3477d8c27..4b2cc0fe9 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -4,6 +4,8 @@ import domain.vo.Position; import strategy.MovementStrategy; +import java.util.Objects; + public class Car { private static final int INITIAL_LOCATION = 0; @@ -40,4 +42,17 @@ public Car move(MovementStrategy movementStrategy) { return this; } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof Car)) return false; + final Car car = (Car) other; + return name.equals(car.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java index f20037be1..9d9fca839 100644 --- a/src/test/java/domain/CarTest.java +++ b/src/test/java/domain/CarTest.java @@ -30,12 +30,12 @@ void create() { () -> assertThat(position).isZero() ); } - + @ParameterizedTest @CsvSource(value = {"true,1", "false,0"}) @DisplayName("차의 위치를 증가시킨다") void move(boolean randomValue, int expected) { - MovementStrategy movementStrategy = new RandomMovementStrategyStrategy(){ + MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { @Override protected boolean generateRandom() { return randomValue; @@ -47,4 +47,16 @@ protected boolean generateRandom() { assertThat(actual).isEqualTo(expected); } + + @ParameterizedTest + @CsvSource(value = {"name,name,true", "name,other,false"}) + @DisplayName("차의 이름이 같으면 참, 다른 이름일 경우 거짓을 반환한다") + void equalsAndHashCode(String name, String otherName, boolean expected) { + Car car = new Car(name); + Car other = new Car(otherName); + + boolean actual = car.equals(other); + + assertThat(actual).isEqualTo(expected); + } } From 484aea8caf0e6499a9008eb2125e875a67fac6ea Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 4 Oct 2021 15:01:32 +0900 Subject: [PATCH 09/35] =?UTF-8?q?chore=20:=20java,=20Junit,=20assertj=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 8172fb73f..12e06e7ea 100644 --- a/build.gradle +++ b/build.gradle @@ -3,15 +3,15 @@ apply plugin: 'eclipse' group = 'camp.nextstep' version = '1.0.0' -sourceCompatibility = '1.8' +sourceCompatibility = '11' repositories { mavenCentral() } dependencies { - testImplementation "org.junit.jupiter:junit-jupiter:5.7.2" - testImplementation "org.assertj:assertj-core:3.19.0" + testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1' + testImplementation 'org.assertj:assertj-core:3.21.0' } test { From 63ed9d3416b7b3cd1997af498ce50d83a3906847 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 4 Oct 2021 15:01:54 +0900 Subject: [PATCH 10/35] =?UTF-8?q?refactor=20:=20Position=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/vo/Position.java | 4 ---- src/test/java/domain/vo/PositionTest.java | 12 ------------ 2 files changed, 16 deletions(-) diff --git a/src/main/java/domain/vo/Position.java b/src/main/java/domain/vo/Position.java index 1d5369766..e308ba4d7 100644 --- a/src/main/java/domain/vo/Position.java +++ b/src/main/java/domain/vo/Position.java @@ -30,8 +30,4 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(value); } - - public boolean isLargerThan(final Position other) { - return value() > other.value(); - } } diff --git a/src/test/java/domain/vo/PositionTest.java b/src/test/java/domain/vo/PositionTest.java index 77e53c491..9826b87c8 100644 --- a/src/test/java/domain/vo/PositionTest.java +++ b/src/test/java/domain/vo/PositionTest.java @@ -53,16 +53,4 @@ void hashCode(int value, int otherValue, boolean expected) { assertThat(actual).isEqualTo(expected); } - - @ParameterizedTest - @CsvSource(value = {"2,1,true", "1,2,false"}) - @DisplayName("위치값이 같으면 참, 다르면 거짓을 반환한다") - void isLargerThan(int value, int otherValue, boolean expected) { - Position position = new Position(value); - Position other = new Position(otherValue); - - boolean actual = position.isLargerThan(other); - - assertThat(actual).isEqualTo(expected); - } } From 79d6bd9f14d79415e6b36ae54f2d9991230690e7 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 4 Oct 2021 15:02:15 +0900 Subject: [PATCH 11/35] =?UTF-8?q?feat=20:=20Cars=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=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/Cars.java | 48 +++++++++++++++++++ src/test/java/domain/CarsTest.java | 76 ++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/main/java/domain/Cars.java create mode 100644 src/test/java/domain/CarsTest.java diff --git a/src/main/java/domain/Cars.java b/src/main/java/domain/Cars.java new file mode 100644 index 000000000..87ddda394 --- /dev/null +++ b/src/main/java/domain/Cars.java @@ -0,0 +1,48 @@ +package domain; + +import strategy.MovementStrategy; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Cars { + + private final List elements; + + public Cars(final List elements) { + this.elements = elements; + } + + public Cars(final String[] carNames) { + this(convertFrom(carNames)); + } + + private static List convertFrom(final String[] carNames) { + return Arrays.stream(carNames) + .map(Car::new) + .collect(Collectors.toList()); + } + + public List elements() { + return elements; + } + + public void driveAll(final MovementStrategy movementStrategy) { + elements.forEach(car -> car.move(movementStrategy)); + } + + public List findMaxPositionCars() { + int max = findMaxPosition(); + return elements.stream() + .filter(car -> car.position() == max) + .collect(Collectors.toUnmodifiableList()); + } + + private int findMaxPosition() { + return elements.stream() + .map(Car::position) + .max(Integer::compareTo) + .orElseThrow(() -> new IllegalArgumentException("최대값을 찾을 수 없습니다")); + } +} diff --git a/src/test/java/domain/CarsTest.java b/src/test/java/domain/CarsTest.java new file mode 100644 index 000000000..8c8e98971 --- /dev/null +++ b/src/test/java/domain/CarsTest.java @@ -0,0 +1,76 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import strategy.MovementStrategy; +import strategy.RandomMovementStrategyStrategy; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +class CarsTest { + + private Cars cars; + + @Test + @DisplayName("차 이름들을 인자로 받아 초기화한다") + void create_with_car_names() { + String[] carNames = new String[]{"name1", "name2", "name3"}; + cars = new Cars(carNames); + List actual = cars.elements(); + assertThat(actual).containsExactly(new Car("name1"), new Car("name2"), new Car("name3")); + } + + @Test + @DisplayName("차 요소들로 초기화 한다") + void create_with_cars() { + List elements = Arrays.asList(new Car("name1"), new Car("name2"), new Car("name3")); + cars = new Cars(elements); + List actual = cars.elements(); + + assertThat(actual).containsExactly(new Car("name1"), new Car("name2"), new Car("name3")); + } + + @ParameterizedTest + @MethodSource(value = "driveAllTestCase") + @DisplayName("모든 차를 운행시킨다") + void driveAll(final boolean randomValue, List expected) { + List elements = Arrays.asList(new Car("name1", 1), new Car("name2", 2)); + cars = new Cars(elements); + MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { + @Override + protected boolean generateRandom() { + return randomValue; + } + }; + + cars.driveAll(movementStrategy); + + assertThat(cars.elements()).isEqualTo(expected); + } + + static Stream driveAllTestCase() { + return Stream.of( + arguments(true, Arrays.asList(new Car("name1", 2), new Car("name2", 3))), + arguments(false, Arrays.asList(new Car("name1", 1), new Car("name2", 2))) + ); + } + + @Test + @DisplayName("위치가 가장 높은 차를 반환한다") + void findMaxPositionCars() { + List elements = Arrays.asList(new Car("name1", 2), new Car("name2", 2), + new Car("name3", 1)); + cars = new Cars(elements); + List maxPositionCars = cars.findMaxPositionCars(); + + assertThat(maxPositionCars).containsExactly(new Car("name1", 2), new Car("name2", 2)); + } +} From a93edc327c626a2ff4ecb249aec905b572c75e52 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 4 Oct 2021 15:32:19 +0900 Subject: [PATCH 12/35] =?UTF-8?q?feat=20:=20=EC=8B=9C=EB=8F=84=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20VO=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20?= =?UTF-8?q?=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/vo/NumberOfAttempt.java | 20 +++++++++++++++ .../java/domain/vo/NumberOfAttemptTest.java | 25 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/main/java/domain/vo/NumberOfAttempt.java create mode 100644 src/test/java/domain/vo/NumberOfAttemptTest.java diff --git a/src/main/java/domain/vo/NumberOfAttempt.java b/src/main/java/domain/vo/NumberOfAttempt.java new file mode 100644 index 000000000..255c8173b --- /dev/null +++ b/src/main/java/domain/vo/NumberOfAttempt.java @@ -0,0 +1,20 @@ +package domain.vo; + +public class NumberOfAttempt { + + private static final int ZERO = 0; + + private int value; + + public NumberOfAttempt(final int value) { + if (value <= ZERO) { + throw new IllegalArgumentException("시도 횟수는 1 이상의 수 입니다"); + } + + this.value = value; + } + + public int value() { + return value; + } +} diff --git a/src/test/java/domain/vo/NumberOfAttemptTest.java b/src/test/java/domain/vo/NumberOfAttemptTest.java new file mode 100644 index 000000000..d747e9735 --- /dev/null +++ b/src/test/java/domain/vo/NumberOfAttemptTest.java @@ -0,0 +1,25 @@ +package domain.vo; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class NumberOfAttemptTest { + + @Test + @DisplayName("시도 횟수를 반환한다") + void value() { + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(1); + + assertThat(numberOfAttempt.value()).isEqualTo(1); + } + + @Test + @DisplayName("시도 횟수가 0이하의 수라면 예외를 발생시킨다") + void create_throw_exception_with_zero_or_less_number() { + assertThatIllegalArgumentException().isThrownBy(() -> new NumberOfAttempt(0)) + .withMessageContaining("시도 횟수는 1 이상의 수 입니다"); + } +} From d03d3ae3b30c4457dd9ddb0be7bc2267c9fd51c0 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 4 Oct 2021 15:54:35 +0900 Subject: [PATCH 13/35] =?UTF-8?q?feat=20:=20InputView,=20InputConsoleView?= =?UTF-8?q?=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/view/InputConsoleView.java | 25 ++++++++++++++++++++++++ src/main/java/view/InputView.java | 8 ++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/main/java/view/InputConsoleView.java create mode 100644 src/main/java/view/InputView.java diff --git a/src/main/java/view/InputConsoleView.java b/src/main/java/view/InputConsoleView.java new file mode 100644 index 000000000..19c10d157 --- /dev/null +++ b/src/main/java/view/InputConsoleView.java @@ -0,0 +1,25 @@ +package view; + +import java.util.Scanner; + +public class InputConsoleView implements InputView { + + private final Scanner scanner; + + public InputConsoleView(final Scanner scanner) { + this.scanner = scanner; + } + + @Override + public String[] inputCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String nameToken = scanner.nextLine(); + return nameToken.split(","); + } + + @Override + public int inputNumberOfAttempt() { + System.out.println("시도할 회수는 몇회인가요?"); + return Integer.parseInt(scanner.nextLine()); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 000000000..3eabbfbff --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,8 @@ +package view; + +public interface InputView { + + String[] inputCarNames(); + + int inputNumberOfAttempt(); +} From 218ce766b6ce020efbecd5dfc23b358b672cca1e Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 4 Oct 2021 16:33:21 +0900 Subject: [PATCH 14/35] =?UTF-8?q?refactor=20:=20Cars=20=EB=B6=88=EB=B3=80?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=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/domain/Cars.java | 9 ++++++--- src/test/java/domain/CarsTest.java | 30 +++++++++++++++++++----------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/domain/Cars.java b/src/main/java/domain/Cars.java index 87ddda394..3d4a41bae 100644 --- a/src/main/java/domain/Cars.java +++ b/src/main/java/domain/Cars.java @@ -21,15 +21,18 @@ public Cars(final String[] carNames) { private static List convertFrom(final String[] carNames) { return Arrays.stream(carNames) .map(Car::new) - .collect(Collectors.toList()); + .collect(Collectors.toUnmodifiableList()); } public List elements() { return elements; } - public void driveAll(final MovementStrategy movementStrategy) { - elements.forEach(car -> car.move(movementStrategy)); + public Cars driveAll(final MovementStrategy movementStrategy) { + List droveCar = elements.stream() + .map(car -> car.move(movementStrategy)) + .collect(Collectors.toUnmodifiableList()); + return new Cars(droveCar); } public List findMaxPositionCars() { diff --git a/src/test/java/domain/CarsTest.java b/src/test/java/domain/CarsTest.java index 8c8e98971..140734078 100644 --- a/src/test/java/domain/CarsTest.java +++ b/src/test/java/domain/CarsTest.java @@ -1,5 +1,8 @@ package domain; +import domain.vo.Name; +import domain.vo.Position; +import org.assertj.core.groups.Tuple; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -13,17 +16,16 @@ import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; import static org.junit.jupiter.params.provider.Arguments.arguments; class CarsTest { - private Cars cars; - @Test @DisplayName("차 이름들을 인자로 받아 초기화한다") void create_with_car_names() { String[] carNames = new String[]{"name1", "name2", "name3"}; - cars = new Cars(carNames); + Cars cars = new Cars(carNames); List actual = cars.elements(); assertThat(actual).containsExactly(new Car("name1"), new Car("name2"), new Car("name3")); } @@ -32,7 +34,7 @@ void create_with_car_names() { @DisplayName("차 요소들로 초기화 한다") void create_with_cars() { List elements = Arrays.asList(new Car("name1"), new Car("name2"), new Car("name3")); - cars = new Cars(elements); + Cars cars = new Cars(elements); List actual = cars.elements(); assertThat(actual).containsExactly(new Car("name1"), new Car("name2"), new Car("name3")); @@ -41,9 +43,9 @@ void create_with_cars() { @ParameterizedTest @MethodSource(value = "driveAllTestCase") @DisplayName("모든 차를 운행시킨다") - void driveAll(final boolean randomValue, List expected) { + void driveAll(final boolean randomValue, Tuple firstExpected, Tuple secondExpected) { List elements = Arrays.asList(new Car("name1", 1), new Car("name2", 2)); - cars = new Cars(elements); + Cars cars = new Cars(elements); MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { @Override protected boolean generateRandom() { @@ -51,15 +53,21 @@ protected boolean generateRandom() { } }; - cars.driveAll(movementStrategy); + Cars droveCars = cars.driveAll(movementStrategy); + - assertThat(cars.elements()).isEqualTo(expected); + assertThat(droveCars.elements()).extracting("name", "position") + .containsExactly(firstExpected, secondExpected); } static Stream driveAllTestCase() { return Stream.of( - arguments(true, Arrays.asList(new Car("name1", 2), new Car("name2", 3))), - arguments(false, Arrays.asList(new Car("name1", 1), new Car("name2", 2))) + arguments(true, + tuple(new Name("name1"), new Position(2)), + tuple(new Name("name2"), new Position(3))), + arguments(false, + tuple(new Name("name1"), new Position(1)), + tuple(new Name("name2"), new Position(2))) ); } @@ -68,7 +76,7 @@ static Stream driveAllTestCase() { void findMaxPositionCars() { List elements = Arrays.asList(new Car("name1", 2), new Car("name2", 2), new Car("name3", 1)); - cars = new Cars(elements); + Cars cars = new Cars(elements); List maxPositionCars = cars.findMaxPositionCars(); assertThat(maxPositionCars).containsExactly(new Car("name1", 2), new Car("name2", 2)); From 6435528c94be259e07663e5142fb9759bbc4dc1e Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 12 Oct 2021 17:00:29 +0900 Subject: [PATCH 15/35] =?UTF-8?q?refactor=20:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20given,=20when,=20then=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/CarTest.java | 10 +++++++++- src/test/java/domain/CarsTest.java | 17 ++++++++++++++++- src/test/java/domain/vo/NameTest.java | 9 +++++++++ .../java/domain/vo/NumberOfAttemptTest.java | 10 ++++++++-- src/test/java/domain/vo/PositionTest.java | 8 +++++++- 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java index 9d9fca839..635984a6f 100644 --- a/src/test/java/domain/CarTest.java +++ b/src/test/java/domain/CarTest.java @@ -22,9 +22,11 @@ void setUp() { @Test @DisplayName("이름를 입력받아 자동차 생성해서 이름과 초기 위치를 반환한다") void create() { + //given String name = car.name(); int position = car.position(); + //then assertAll( () -> assertThat(name).isEqualTo("name"), () -> assertThat(position).isZero() @@ -35,16 +37,19 @@ void create() { @CsvSource(value = {"true,1", "false,0"}) @DisplayName("차의 위치를 증가시킨다") void move(boolean randomValue, int expected) { + //given MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { @Override protected boolean generateRandom() { return randomValue; } }; - Car actualCar = car.move(movementStrategy); + + //when int actual = actualCar.position(); + //then assertThat(actual).isEqualTo(expected); } @@ -52,11 +57,14 @@ protected boolean generateRandom() { @CsvSource(value = {"name,name,true", "name,other,false"}) @DisplayName("차의 이름이 같으면 참, 다른 이름일 경우 거짓을 반환한다") void equalsAndHashCode(String name, String otherName, boolean expected) { + //given Car car = new Car(name); Car other = new Car(otherName); + //when boolean actual = car.equals(other); + //then assertThat(actual).isEqualTo(expected); } } diff --git a/src/test/java/domain/CarsTest.java b/src/test/java/domain/CarsTest.java index 140734078..6cb35d2a8 100644 --- a/src/test/java/domain/CarsTest.java +++ b/src/test/java/domain/CarsTest.java @@ -24,19 +24,28 @@ class CarsTest { @Test @DisplayName("차 이름들을 인자로 받아 초기화한다") void create_with_car_names() { + //given String[] carNames = new String[]{"name1", "name2", "name3"}; Cars cars = new Cars(carNames); + + //when List actual = cars.elements(); + + //then assertThat(actual).containsExactly(new Car("name1"), new Car("name2"), new Car("name3")); } @Test @DisplayName("차 요소들로 초기화 한다") void create_with_cars() { + //given List elements = Arrays.asList(new Car("name1"), new Car("name2"), new Car("name3")); Cars cars = new Cars(elements); + + //when List actual = cars.elements(); + //then assertThat(actual).containsExactly(new Car("name1"), new Car("name2"), new Car("name3")); } @@ -44,6 +53,7 @@ void create_with_cars() { @MethodSource(value = "driveAllTestCase") @DisplayName("모든 차를 운행시킨다") void driveAll(final boolean randomValue, Tuple firstExpected, Tuple secondExpected) { + //given List elements = Arrays.asList(new Car("name1", 1), new Car("name2", 2)); Cars cars = new Cars(elements); MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { @@ -53,9 +63,10 @@ protected boolean generateRandom() { } }; + //when Cars droveCars = cars.driveAll(movementStrategy); - + //then assertThat(droveCars.elements()).extracting("name", "position") .containsExactly(firstExpected, secondExpected); } @@ -74,11 +85,15 @@ static Stream driveAllTestCase() { @Test @DisplayName("위치가 가장 높은 차를 반환한다") void findMaxPositionCars() { + //given List elements = Arrays.asList(new Car("name1", 2), new Car("name2", 2), new Car("name3", 1)); Cars cars = new Cars(elements); + + //when List maxPositionCars = cars.findMaxPositionCars(); + //then assertThat(maxPositionCars).containsExactly(new Car("name1", 2), new Car("name2", 2)); } } diff --git a/src/test/java/domain/vo/NameTest.java b/src/test/java/domain/vo/NameTest.java index 1e00aa7b8..93d4dccae 100644 --- a/src/test/java/domain/vo/NameTest.java +++ b/src/test/java/domain/vo/NameTest.java @@ -15,10 +15,13 @@ class NameTest { @ValueSource(strings = {"c", "aaaaa"}) @DisplayName("이름의 길이가 1이상 5이하인 경우 값을 반환한다") void name(String value) { + //given Name name = new Name(value); + //when String actual = name.value(); + //then assertThat(actual).isEqualTo(value); } @@ -27,6 +30,7 @@ void name(String value) { @ValueSource(strings = "aaaaaa") @DisplayName("이름의 길이가 0이하, 5초과일 경우 예외가 발생한다") void create_throw_exception_with_invalid_name_length(String value) { + //then assertThatIllegalArgumentException().isThrownBy(() -> new Name(value)) .withMessage("이름이 길이는 1이상 5이하여야 합니다"); } @@ -35,9 +39,14 @@ void create_throw_exception_with_invalid_name_length(String value) { @CsvSource(value = {"name,name,true", "name,other,false"}) @DisplayName("이름이 같으면 참을 다르면 거짓을 반환한다") void equals(String value, String otherValue, boolean expected) { + //given Name name = new Name(value); Name other = new Name(otherValue); + + //when boolean actual = name.equals(other); + + //then assertThat(actual).isEqualTo(expected); } diff --git a/src/test/java/domain/vo/NumberOfAttemptTest.java b/src/test/java/domain/vo/NumberOfAttemptTest.java index d747e9735..1fc3c435f 100644 --- a/src/test/java/domain/vo/NumberOfAttemptTest.java +++ b/src/test/java/domain/vo/NumberOfAttemptTest.java @@ -11,14 +11,20 @@ class NumberOfAttemptTest { @Test @DisplayName("시도 횟수를 반환한다") void value() { + //given NumberOfAttempt numberOfAttempt = new NumberOfAttempt(1); - - assertThat(numberOfAttempt.value()).isEqualTo(1); + + //when + int actual = numberOfAttempt.value(); + + //then + assertThat(actual).isEqualTo(1); } @Test @DisplayName("시도 횟수가 0이하의 수라면 예외를 발생시킨다") void create_throw_exception_with_zero_or_less_number() { + //then assertThatIllegalArgumentException().isThrownBy(() -> new NumberOfAttempt(0)) .withMessageContaining("시도 횟수는 1 이상의 수 입니다"); } diff --git a/src/test/java/domain/vo/PositionTest.java b/src/test/java/domain/vo/PositionTest.java index 9826b87c8..882643f8b 100644 --- a/src/test/java/domain/vo/PositionTest.java +++ b/src/test/java/domain/vo/PositionTest.java @@ -12,21 +12,27 @@ class PositionTest { @Test @DisplayName("위치를 초기화 하면 위치값을 반환한다") void create() { + //given Position position = new Position(1); + //when int actual = position.value(); + //then assertThat(actual).isEqualTo(1); } @Test @DisplayName("증가할 위치 값을 인자로 받아 위치 값을 증가시킨다") void increaseByOne() { + //given Position position = new Position(0); - Position increasedPosition = position.increaseBy(1); + + //when int actual = increasedPosition.value(); + //then assertThat(actual).isEqualTo(1); } From f51293e160b794879eab851e5d7aec7b1b84aaed Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 12 Oct 2021 17:01:53 +0900 Subject: [PATCH 16/35] =?UTF-8?q?refactor=20:=20Dto=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/dto/InputCarNameDto.java | 32 +++++++++++++++++ .../java/dto/InputNumberOfAttemptDto.java | 27 ++++++++++++++ src/main/java/view/InputConsoleView.java | 13 ++++--- src/main/java/view/InputView.java | 7 ++-- src/test/java/dto/InputCarNameDtoTest.java | 24 +++++++++++++ .../java/dto/InputNumberOfAttemptDtoTest.java | 35 +++++++++++++++++++ 6 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 src/main/java/dto/InputCarNameDto.java create mode 100644 src/main/java/dto/InputNumberOfAttemptDto.java create mode 100644 src/test/java/dto/InputCarNameDtoTest.java create mode 100644 src/test/java/dto/InputNumberOfAttemptDtoTest.java diff --git a/src/main/java/dto/InputCarNameDto.java b/src/main/java/dto/InputCarNameDto.java new file mode 100644 index 000000000..94d1a0751 --- /dev/null +++ b/src/main/java/dto/InputCarNameDto.java @@ -0,0 +1,32 @@ +package dto; + +import domain.Names; +import domain.vo.Name; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class InputCarNameDto { + private final List names; + + public InputCarNameDto(final List names) { + this.names = names; + } + + public InputCarNameDto(final String[] names) { + this(parseFrom(names)); + } + + private static List parseFrom(final String[] names) { + return Arrays.stream(names) + .collect(Collectors.toList()); + } + + public Names toNames() { + List elements = this.names.stream() + .map(Name::new) + .collect(Collectors.toList()); + return new Names(elements); + } +} diff --git a/src/main/java/dto/InputNumberOfAttemptDto.java b/src/main/java/dto/InputNumberOfAttemptDto.java new file mode 100644 index 000000000..c95f9a5a7 --- /dev/null +++ b/src/main/java/dto/InputNumberOfAttemptDto.java @@ -0,0 +1,27 @@ +package dto; + +public class InputNumberOfAttemptDto { + private final int numberOfAttempt; + + public InputNumberOfAttemptDto(final int numberOfAttempt) { + this.numberOfAttempt = numberOfAttempt; + } + + public InputNumberOfAttemptDto(final String numberOfAttempt) { + this(parseFrom(numberOfAttempt)); + } + + private static int parseFrom(final String numberOfAttempt) { + boolean isNotDigit = numberOfAttempt.chars() + .anyMatch(num -> !Character.isDigit(num)); + if (isNotDigit) { + throw new IllegalArgumentException("올바른 시도 횟수가 아닙니다"); + } + + return Integer.parseInt(numberOfAttempt); + } + + public int getNumberOfAttempt() { + return numberOfAttempt; + } +} diff --git a/src/main/java/view/InputConsoleView.java b/src/main/java/view/InputConsoleView.java index 19c10d157..eb8db1b9e 100644 --- a/src/main/java/view/InputConsoleView.java +++ b/src/main/java/view/InputConsoleView.java @@ -1,5 +1,8 @@ package view; +import dto.InputCarNameDto; +import dto.InputNumberOfAttemptDto; + import java.util.Scanner; public class InputConsoleView implements InputView { @@ -11,15 +14,17 @@ public InputConsoleView(final Scanner scanner) { } @Override - public String[] inputCarNames() { + public InputCarNameDto inputCarNames() { System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); String nameToken = scanner.nextLine(); - return nameToken.split(","); + String[] names = nameToken.split(","); + return new InputCarNameDto(names); } @Override - public int inputNumberOfAttempt() { + public InputNumberOfAttemptDto inputNumberOfAttempt() { System.out.println("시도할 회수는 몇회인가요?"); - return Integer.parseInt(scanner.nextLine()); + String numberValue = scanner.nextLine(); + return new InputNumberOfAttemptDto(numberValue); } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 3eabbfbff..c0eb085a5 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,8 +1,11 @@ package view; +import dto.InputCarNameDto; +import dto.InputNumberOfAttemptDto; + public interface InputView { - String[] inputCarNames(); + InputCarNameDto inputCarNames(); - int inputNumberOfAttempt(); + InputNumberOfAttemptDto inputNumberOfAttempt(); } diff --git a/src/test/java/dto/InputCarNameDtoTest.java b/src/test/java/dto/InputCarNameDtoTest.java new file mode 100644 index 000000000..91034aebc --- /dev/null +++ b/src/test/java/dto/InputCarNameDtoTest.java @@ -0,0 +1,24 @@ +package dto; + +import domain.Names; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class InputCarNameDtoTest { + + @Test + @DisplayName("차 이름들로 입력을 받아 차 이름 값 객체들을 반환한다") + void toNames() { + //given + String[] nameElements = new String[]{"name1", "name2", "name3"}; + InputCarNameDto inputCarNameDto = new InputCarNameDto(nameElements); + + //when + Names names = inputCarNameDto.toNames(); + + //then + assertThat(names).isNotNull(); + } +} diff --git a/src/test/java/dto/InputNumberOfAttemptDtoTest.java b/src/test/java/dto/InputNumberOfAttemptDtoTest.java new file mode 100644 index 000000000..d65517911 --- /dev/null +++ b/src/test/java/dto/InputNumberOfAttemptDtoTest.java @@ -0,0 +1,35 @@ +package dto; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class InputNumberOfAttemptDtoTest { + + @Test + @DisplayName("시도 횟수를 인자로 받아 값을 반환한다") + void getNumberOfAttempt() { + //given + int expected = 3; + InputNumberOfAttemptDto inputNumberOfAttemptDto = new InputNumberOfAttemptDto(expected); + + //when + int actual = inputNumberOfAttemptDto.getNumberOfAttempt(); + + //then + assertThat(actual).isEqualTo(expected); + } + + @Test + @DisplayName("시도 횟수가 숫자가 아닐 경우 예외를 발생시킨다") + void create_throw_exception_with_not_digit() { + //given + String invalidNumberOfAttempt = "String"; + + //then + assertThatIllegalArgumentException().isThrownBy(() -> new InputNumberOfAttemptDto(invalidNumberOfAttempt)) + .withMessageContaining("올바른 시도 횟수가 아닙니다"); + } +} From e8432acb8fb36a368b4be8e3bfd808d2076993ad Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 12 Oct 2021 17:02:54 +0900 Subject: [PATCH 17/35] =?UTF-8?q?feat=20:=20Names=20=EC=9D=BC=EA=B8=89=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=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/Names.java | 18 ++++++++++++++++++ src/test/java/domain/NamesTest.java | 27 +++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/main/java/domain/Names.java create mode 100644 src/test/java/domain/NamesTest.java diff --git a/src/main/java/domain/Names.java b/src/main/java/domain/Names.java new file mode 100644 index 000000000..82261c6a6 --- /dev/null +++ b/src/main/java/domain/Names.java @@ -0,0 +1,18 @@ +package domain; + +import domain.vo.Name; + +import java.util.List; + +public class Names { + + private List elements; + + public Names(final List elements) { + this.elements = elements; + } + + public List getElements() { + return elements; + } +} diff --git a/src/test/java/domain/NamesTest.java b/src/test/java/domain/NamesTest.java new file mode 100644 index 000000000..713536a35 --- /dev/null +++ b/src/test/java/domain/NamesTest.java @@ -0,0 +1,27 @@ +package domain; + +import domain.vo.Name; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class NamesTest { + + @Test + @DisplayName("이름들을 입력받아 값을 반환한다") + void getElements() { + //given + List expected = Arrays.asList(new Name("name1"), new Name("name2")); + Names names = new Names(expected); + + //when + List actual = names.getElements(); + + //then + assertThat(actual).isEqualTo(expected); + } +} From 4af857cef04d0a74a76eb662a6f73528f79d9142 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 12 Oct 2021 17:30:51 +0900 Subject: [PATCH 18/35] =?UTF-8?q?test=20:=20given,=20when,=20then=20?= =?UTF-8?q?=EB=AA=85=EC=8B=9C=EC=A0=81=EC=9C=BC=EB=A1=9C=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/test/java/domain/vo/NameTest.java | 5 +++++ src/test/java/domain/vo/PositionTest.java | 6 ++++++ src/test/java/strategy/RandomMovementStrategyTest.java | 3 +++ 3 files changed, 14 insertions(+) diff --git a/src/test/java/domain/vo/NameTest.java b/src/test/java/domain/vo/NameTest.java index 93d4dccae..b837d52b4 100644 --- a/src/test/java/domain/vo/NameTest.java +++ b/src/test/java/domain/vo/NameTest.java @@ -54,9 +54,14 @@ void equals(String value, String otherValue, boolean expected) { @CsvSource(value = {"name,name,true", "name,other,false"}) @DisplayName("이름이 같으면 같은 해시값을 반환하고, 다르면 다른 해시값을 반환한다") void hashCode(String value, String otherValue, boolean expected) { + //given Name name = new Name(value); Name other = new Name(otherValue); + + //when boolean actual = name.hashCode() == other.hashCode(); + + //then assertThat(actual).isEqualTo(expected); } } diff --git a/src/test/java/domain/vo/PositionTest.java b/src/test/java/domain/vo/PositionTest.java index 882643f8b..91550c5d5 100644 --- a/src/test/java/domain/vo/PositionTest.java +++ b/src/test/java/domain/vo/PositionTest.java @@ -40,11 +40,14 @@ void increaseByOne() { @CsvSource(value = {"1,1,true", "1,2,false"}) @DisplayName("위치값이 같으면 참, 다르면 거짓을 반환한다") void equals(int value, int otherValue, boolean expected) { + //given Position position = new Position(value); Position other = new Position(otherValue); + //when boolean actual = position.equals(other); + //then assertThat(actual).isEqualTo(expected); } @@ -52,11 +55,14 @@ void equals(int value, int otherValue, boolean expected) { @CsvSource(value = {"1,1,true", "1,2,false"}) @DisplayName("위치값이 같으면 참, 다르면 거짓을 반환한다") void hashCode(int value, int otherValue, boolean expected) { + //given Position position = new Position(value); Position other = new Position(otherValue); + //when boolean actual = position.hashCode() == other.hashCode(); + //then assertThat(actual).isEqualTo(expected); } } diff --git a/src/test/java/strategy/RandomMovementStrategyTest.java b/src/test/java/strategy/RandomMovementStrategyTest.java index 5373fa74f..ee99fdc63 100644 --- a/src/test/java/strategy/RandomMovementStrategyTest.java +++ b/src/test/java/strategy/RandomMovementStrategyTest.java @@ -10,6 +10,7 @@ class RandomMovementStrategyTest { @ParameterizedTest @CsvSource(value = {"true,true", "false,false"}) void canMove(boolean randomValue, boolean expected) { + //given MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { @Override protected boolean generateRandom() { @@ -17,8 +18,10 @@ protected boolean generateRandom() { } }; + //when boolean actual = movementStrategy.canMove(); + //then assertThat(actual).isEqualTo(expected); } } From bb66fbaf6270871b9352fbaa63416d5d337ad98b Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 15:32:39 +0900 Subject: [PATCH 19/35] =?UTF-8?q?feat=20:=20=EC=8B=9C=EB=8F=84=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20=EC=B0=A8=EA=B0=90=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/vo/NumberOfAttempt.java | 27 +++++- .../java/domain/vo/NumberOfAttemptTest.java | 82 +++++++++++++++++-- 2 files changed, 99 insertions(+), 10 deletions(-) diff --git a/src/main/java/domain/vo/NumberOfAttempt.java b/src/main/java/domain/vo/NumberOfAttempt.java index 255c8173b..abcbbdb4c 100644 --- a/src/main/java/domain/vo/NumberOfAttempt.java +++ b/src/main/java/domain/vo/NumberOfAttempt.java @@ -1,5 +1,7 @@ package domain.vo; +import java.util.Objects; + public class NumberOfAttempt { private static final int ZERO = 0; @@ -7,8 +9,8 @@ public class NumberOfAttempt { private int value; public NumberOfAttempt(final int value) { - if (value <= ZERO) { - throw new IllegalArgumentException("시도 횟수는 1 이상의 수 입니다"); + if (value < ZERO) { + throw new IllegalArgumentException("시도 횟수는 0 이상의 수 입니다"); } this.value = value; @@ -17,4 +19,25 @@ public NumberOfAttempt(final int value) { public int value() { return value; } + + public NumberOfAttempt attempt() { + return new NumberOfAttempt(value - 1); + } + + public boolean isOver() { + return value == ZERO; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof NumberOfAttempt)) return false; + final NumberOfAttempt that = (NumberOfAttempt) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } } diff --git a/src/test/java/domain/vo/NumberOfAttemptTest.java b/src/test/java/domain/vo/NumberOfAttemptTest.java index 1fc3c435f..7d17aa571 100644 --- a/src/test/java/domain/vo/NumberOfAttemptTest.java +++ b/src/test/java/domain/vo/NumberOfAttemptTest.java @@ -2,30 +2,96 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; class NumberOfAttemptTest { - - @Test + + @ParameterizedTest + @ValueSource(ints = {1}) @DisplayName("시도 횟수를 반환한다") - void value() { + void value(final int value) { //given - NumberOfAttempt numberOfAttempt = new NumberOfAttempt(1); + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(value); //when int actual = numberOfAttempt.value(); //then - assertThat(actual).isEqualTo(1); + assertThat(actual).isEqualTo(value); } - + @Test @DisplayName("시도 횟수가 0이하의 수라면 예외를 발생시킨다") void create_throw_exception_with_zero_or_less_number() { + //given + int invalidValue = -1; + + //then + assertThatIllegalArgumentException().isThrownBy(() -> new NumberOfAttempt(invalidValue)) + .withMessageContaining("시도 횟수는 0 이상의 수 입니다"); + } + + @ParameterizedTest + @CsvSource(value = "2, 1") + @DisplayName("한 번 시도하면 시도 횟수가 1 차감된다") + void attempt(final int value, final int expectedValue) { + //given + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(value); + + //when + NumberOfAttempt actual = numberOfAttempt.attempt(); + int actualValue = actual.value(); + + //then + assertThat(actualValue).isEqualTo(expectedValue); + } + + @ParameterizedTest + @CsvSource(value = {"0, true", "1, false"}) + @DisplayName("시도 횟수가 0이면 참 0이상이면 거짓을 반환한다") + void isOver(final int value, final boolean expected) { + //given + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(value); + + //when + boolean actual = numberOfAttempt.isOver(); + + //then + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource(value = {"1,1,true", "1,0,false"}) + @DisplayName("") + void equals(final int value, final int otherValue, final boolean expected) { + //given + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(value); + NumberOfAttempt other = new NumberOfAttempt(otherValue); + + //when + boolean actual = numberOfAttempt.equals(other); + + //then + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource(value = {"1,1,true", "1,0,false"}) + @DisplayName("") + void hash(final int value, final int otherValue, final boolean expected) { + //given + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(value); + NumberOfAttempt other = new NumberOfAttempt(otherValue); + + //when + boolean actual = numberOfAttempt.hashCode() == other.hashCode(); + //then - assertThatIllegalArgumentException().isThrownBy(() -> new NumberOfAttempt(0)) - .withMessageContaining("시도 횟수는 1 이상의 수 입니다"); + assertThat(actual).isEqualTo(expected); } } From 42d812664a9948f72a3cc3b6109815c2526b5ce3 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 16:58:18 +0900 Subject: [PATCH 20/35] =?UTF-8?q?refactor=20:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=9D=B4=EB=A6=84=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/domain/vo/NumberOfAttempt.java | 5 +++-- src/test/java/domain/vo/NumberOfAttemptTest.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/vo/NumberOfAttempt.java b/src/main/java/domain/vo/NumberOfAttempt.java index abcbbdb4c..ed056d8b4 100644 --- a/src/main/java/domain/vo/NumberOfAttempt.java +++ b/src/main/java/domain/vo/NumberOfAttempt.java @@ -5,6 +5,7 @@ public class NumberOfAttempt { private static final int ZERO = 0; + private static final int SUBTRACTED_VALUE = 1; private int value; @@ -20,8 +21,8 @@ public int value() { return value; } - public NumberOfAttempt attempt() { - return new NumberOfAttempt(value - 1); + public NumberOfAttempt decrease() { + return new NumberOfAttempt(value - SUBTRACTED_VALUE); } public boolean isOver() { diff --git a/src/test/java/domain/vo/NumberOfAttemptTest.java b/src/test/java/domain/vo/NumberOfAttemptTest.java index 7d17aa571..82ed5e2d7 100644 --- a/src/test/java/domain/vo/NumberOfAttemptTest.java +++ b/src/test/java/domain/vo/NumberOfAttemptTest.java @@ -39,12 +39,12 @@ void create_throw_exception_with_zero_or_less_number() { @ParameterizedTest @CsvSource(value = "2, 1") @DisplayName("한 번 시도하면 시도 횟수가 1 차감된다") - void attempt(final int value, final int expectedValue) { + void decrease(final int value, final int expectedValue) { //given NumberOfAttempt numberOfAttempt = new NumberOfAttempt(value); //when - NumberOfAttempt actual = numberOfAttempt.attempt(); + NumberOfAttempt actual = numberOfAttempt.decrease(); int actualValue = actual.value(); //then From e7be73ddf90f5e5aa40084ddc772dfb711c5d80c Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 18:27:37 +0900 Subject: [PATCH 21/35] =?UTF-8?q?feat=20:=20=EB=9D=BC=EC=9A=B4=EB=93=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9E=91=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=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/Round.java | 39 +++++++++ src/test/java/domain/RoundTest.java | 129 ++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 src/main/java/domain/Round.java create mode 100644 src/test/java/domain/RoundTest.java diff --git a/src/main/java/domain/Round.java b/src/main/java/domain/Round.java new file mode 100644 index 000000000..27d610760 --- /dev/null +++ b/src/main/java/domain/Round.java @@ -0,0 +1,39 @@ +package domain; + +import domain.vo.NumberOfAttempt; +import strategy.MovementStrategy; + +import java.util.List; + +public class Round { + + private final Cars cars; + private final NumberOfAttempt numberOfAttempt; + + public Round(final Cars cars, final NumberOfAttempt numberOfAttempt) { + this.cars = cars; + this.numberOfAttempt = numberOfAttempt; + } + + public Round(final Names names, final NumberOfAttempt numberOfAttempt) { + this(new Cars(names), numberOfAttempt); + } + + public Round play(final MovementStrategy movementStrategy) { + NumberOfAttempt numberOfAttemptAfterTrying = numberOfAttempt.decrease(); + Cars carsAfterDriveAll = this.cars.driveAll(movementStrategy); + return new Round(carsAfterDriveAll, numberOfAttemptAfterTrying); + } + + public Cars cars() { + return cars; + } + + public List winners() { + return cars.findMaxPositionCars(); + } + + public boolean isOver() { + return numberOfAttempt.isOver(); + } +} diff --git a/src/test/java/domain/RoundTest.java b/src/test/java/domain/RoundTest.java new file mode 100644 index 000000000..ec7b43bb2 --- /dev/null +++ b/src/test/java/domain/RoundTest.java @@ -0,0 +1,129 @@ +package domain; + +import domain.vo.NumberOfAttempt; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import strategy.MovementStrategy; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; +import static org.junit.jupiter.api.Assertions.assertAll; + +class RoundTest { + + @Test + @DisplayName("시도 횟수와 차들을 인자로 받아 한 라운드를 생성한다") + void create() { + //given + int value = 1; + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(value); + List elements = Arrays.asList(new Car("name1"), new Car("name2")); + Cars cars = new Cars(elements); + + //when + Round round = new Round(cars, numberOfAttempt); + + //then + assertAll( + () -> assertThat(round).extracting("cars.elements").isEqualTo(elements), + () -> assertThat(round).extracting("numberOfAttempt.value").isEqualTo(value) + ); + + } + + @Test + @DisplayName("움직이는 전략을 인자로 받아 한 라운드를 수행하고 움직인 차들과 시도 횟수가 차감된 새로운 라운드를 반환한다.") + void play() { + //given + int numberOfAttemptValue = 2; + int expectedNumberOfAttemptValue = numberOfAttemptValue - 1; + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(numberOfAttemptValue); + + List carsElements = Arrays.asList(new Car("name1"), new Car("name2")); + Cars cars = new Cars(carsElements); + + Round round = new Round(cars, numberOfAttempt); + + MovementStrategy movementStrategy = () -> true; + + //when + Round actual = round.play(movementStrategy); + Cars actualCars = actual.cars(); + List actualCarsElements = actualCars.elements(); + + //then + assertAll( + () -> assertThat(actualCarsElements).extracting("name.value", "position.value") + .containsExactly( + tuple("name1", 1), + tuple("name2", 1)), + () -> assertThat(actual).extracting("numberOfAttempt.value") + .isEqualTo(expectedNumberOfAttemptValue) + ); + } + + @ParameterizedTest + @CsvSource(value = {"0, true", "1, false"}) + @DisplayName("시도 횟수가 없으면 참 아니면 거짓을 반환한다") + void isOver(final int numberOfAttemptValue, final boolean expected) { + //given + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(numberOfAttemptValue); + + List elements = Arrays.asList(new Car("name1"), new Car("name2")); + Cars cars = new Cars(elements); + + Round round = new Round(cars, numberOfAttempt); + + //when + boolean actual = round.isOver(); + + //then + assertThat(actual).isEqualTo(expected); + } + + @Test + @DisplayName("차들을 반환한다") + void cars() { + //given + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(1); + List elements = Arrays.asList(new Car("name1"), new Car("name2")); + Cars cars = new Cars(elements); + + Round round = new Round(cars, numberOfAttempt); + + //when + Cars actual = round.cars(); + + //then + assertThat(actual).isEqualTo(cars); + } + + @Test + @DisplayName("우승자를 반환한다") + void winners() { + //given + NumberOfAttempt numberOfAttempt = new NumberOfAttempt(1); + Car winner1 = new Car("winner1", 3); + Car winner2 = new Car("winner2", 3); + Car loser = new Car("loser", 2); + List elements = Arrays.asList(winner1, winner2, loser); + Cars cars = new Cars(elements); + + Round round = new Round(cars, numberOfAttempt); + + //when + List winners = round.winners(); + + //then + assertThat(winners).extracting("name", "position") + .containsExactly( + tuple("winner1", 3), + tuple("winner2", 3) + ); + } +} From 9f1a30561fc400921ca105e43beb8c60c85f4123 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 18:35:24 +0900 Subject: [PATCH 22/35] =?UTF-8?q?feat=20:=20=EC=9D=B4=EB=A6=84=20=EC=9D=BC?= =?UTF-8?q?=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=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/Names.java | 4 ++-- src/test/java/domain/NamesTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/Names.java b/src/main/java/domain/Names.java index 82261c6a6..26cf947dd 100644 --- a/src/main/java/domain/Names.java +++ b/src/main/java/domain/Names.java @@ -6,13 +6,13 @@ public class Names { - private List elements; + private final List elements; public Names(final List elements) { this.elements = elements; } - public List getElements() { + public List elements() { return elements; } } diff --git a/src/test/java/domain/NamesTest.java b/src/test/java/domain/NamesTest.java index 713536a35..be2b39e3c 100644 --- a/src/test/java/domain/NamesTest.java +++ b/src/test/java/domain/NamesTest.java @@ -12,14 +12,14 @@ class NamesTest { @Test - @DisplayName("이름들을 입력받아 값을 반환한다") + @DisplayName("이름 객체 리스트를 입력받아 이름 일급 컬렉션을 생성한다") void getElements() { //given List expected = Arrays.asList(new Name("name1"), new Name("name2")); Names names = new Names(expected); //when - List actual = names.getElements(); + List actual = names.elements(); //then assertThat(actual).isEqualTo(expected); From aa7a36d39abd269f537805b64c0ceb9f68f8af7d Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:11:50 +0900 Subject: [PATCH 23/35] =?UTF-8?q?refactor=20:=20=EB=B6=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=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/domain/Car.java | 4 ++++ src/test/java/domain/CarTest.java | 25 +++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index 4b2cc0fe9..8b6eb03ba 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -27,6 +27,10 @@ public Car(final String name) { this(name, INITIAL_LOCATION); } + public Car(final Name name) { + this(name, new Position(INITIAL_LOCATION)); + } + public String name() { return name.value(); } diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java index 635984a6f..2233dba6a 100644 --- a/src/test/java/domain/CarTest.java +++ b/src/test/java/domain/CarTest.java @@ -6,7 +6,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import strategy.MovementStrategy; -import strategy.RandomMovementStrategyStrategy; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; @@ -38,12 +37,7 @@ void create() { @DisplayName("차의 위치를 증가시킨다") void move(boolean randomValue, int expected) { //given - MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { - @Override - protected boolean generateRandom() { - return randomValue; - } - }; + MovementStrategy movementStrategy = () -> randomValue; Car actualCar = car.move(movementStrategy); //when @@ -56,7 +50,7 @@ protected boolean generateRandom() { @ParameterizedTest @CsvSource(value = {"name,name,true", "name,other,false"}) @DisplayName("차의 이름이 같으면 참, 다른 이름일 경우 거짓을 반환한다") - void equalsAndHashCode(String name, String otherName, boolean expected) { + void equals(String name, String otherName, boolean expected) { //given Car car = new Car(name); Car other = new Car(otherName); @@ -67,4 +61,19 @@ void equalsAndHashCode(String name, String otherName, boolean expected) { //then assertThat(actual).isEqualTo(expected); } + + @ParameterizedTest + @CsvSource(value = {"name,name,true", "name,other,false"}) + @DisplayName("차의 이름이 같으면 참, 다른 이름일 경우 거짓을 반환한다") + void hash(String name, String otherName, boolean expected) { + //given + Car car = new Car(name); + Car other = new Car(otherName); + + //when + boolean actual = car.hashCode() == other.hashCode(); + + //then + assertThat(actual).isEqualTo(expected); + } } From 4d348c6f7c661b942b0d3e7fc4f63b831a711a5a Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:12:57 +0900 Subject: [PATCH 24/35] =?UTF-8?q?refactor=20:=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=89=EC=BB=AC=EB=A0=89=EC=85=98=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=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/domain/Cars.java | 9 +++-- src/test/java/domain/CarsTest.java | 60 +++++++++++++----------------- 2 files changed, 31 insertions(+), 38 deletions(-) diff --git a/src/main/java/domain/Cars.java b/src/main/java/domain/Cars.java index 3d4a41bae..7e72c6548 100644 --- a/src/main/java/domain/Cars.java +++ b/src/main/java/domain/Cars.java @@ -2,7 +2,6 @@ import strategy.MovementStrategy; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -14,14 +13,16 @@ public Cars(final List elements) { this.elements = elements; } - public Cars(final String[] carNames) { + public Cars(final Names carNames) { this(convertFrom(carNames)); } - private static List convertFrom(final String[] carNames) { - return Arrays.stream(carNames) + private static List convertFrom(final Names carNames) { + return carNames.elements() + .stream() .map(Car::new) .collect(Collectors.toUnmodifiableList()); + } public List elements() { diff --git a/src/test/java/domain/CarsTest.java b/src/test/java/domain/CarsTest.java index 6cb35d2a8..d319947e2 100644 --- a/src/test/java/domain/CarsTest.java +++ b/src/test/java/domain/CarsTest.java @@ -1,23 +1,17 @@ package domain; import domain.vo.Name; -import domain.vo.Position; -import org.assertj.core.groups.Tuple; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.CsvSource; import strategy.MovementStrategy; -import strategy.RandomMovementStrategyStrategy; import java.util.Arrays; import java.util.List; -import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; -import static org.junit.jupiter.params.provider.Arguments.arguments; class CarsTest { @@ -25,61 +19,56 @@ class CarsTest { @DisplayName("차 이름들을 인자로 받아 초기화한다") void create_with_car_names() { //given - String[] carNames = new String[]{"name1", "name2", "name3"}; + List names = + Arrays.asList(new Name("name1"), new Name("name2"), new Name("name3")); + Names carNames = new Names(names); Cars cars = new Cars(carNames); //when List actual = cars.elements(); //then - assertThat(actual).containsExactly(new Car("name1"), new Car("name2"), new Car("name3")); + assertThat(actual).extracting("name.value", "position.value") + .containsExactly( + tuple("name1", 0), + tuple("name2", 0), + tuple("name3", 0)); } @Test @DisplayName("차 요소들로 초기화 한다") void create_with_cars() { //given - List elements = Arrays.asList(new Car("name1"), new Car("name2"), new Car("name3")); + List elements = Arrays.asList(new Car("name1", 1), + new Car("name2", 2), new Car("name3", 3)); Cars cars = new Cars(elements); //when List actual = cars.elements(); //then - assertThat(actual).containsExactly(new Car("name1"), new Car("name2"), new Car("name3")); + assertThat(actual).extracting("name.value", "position.value") + .containsExactly( + tuple("name1", 1), + tuple("name2", 2), + tuple("name3", 3)); } @ParameterizedTest - @MethodSource(value = "driveAllTestCase") + @CsvSource(value = {"true, 2", "false, 1"}) @DisplayName("모든 차를 운행시킨다") - void driveAll(final boolean randomValue, Tuple firstExpected, Tuple secondExpected) { + void driveAll(final boolean randomValue, final int expectedPosition) { //given - List elements = Arrays.asList(new Car("name1", 1), new Car("name2", 2)); + List elements = List.of(new Car("name1", 1)); Cars cars = new Cars(elements); - MovementStrategy movementStrategy = new RandomMovementStrategyStrategy() { - @Override - protected boolean generateRandom() { - return randomValue; - } - }; + MovementStrategy movementStrategy = () -> randomValue; //when Cars droveCars = cars.driveAll(movementStrategy); //then - assertThat(droveCars.elements()).extracting("name", "position") - .containsExactly(firstExpected, secondExpected); - } - - static Stream driveAllTestCase() { - return Stream.of( - arguments(true, - tuple(new Name("name1"), new Position(2)), - tuple(new Name("name2"), new Position(3))), - arguments(false, - tuple(new Name("name1"), new Position(1)), - tuple(new Name("name2"), new Position(2))) - ); + assertThat(droveCars.elements()).extracting("position.value") + .containsExactly(expectedPosition); } @Test @@ -94,6 +83,9 @@ void findMaxPositionCars() { List maxPositionCars = cars.findMaxPositionCars(); //then - assertThat(maxPositionCars).containsExactly(new Car("name1", 2), new Car("name2", 2)); + assertThat(maxPositionCars).extracting("name.value", "position.value") + .containsExactly( + tuple("name1", 2), + tuple("name2", 2)); } } From b4bfd50062c78831bdc228bb94ef7b4ef96a8400 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:14:31 +0900 Subject: [PATCH 25/35] =?UTF-8?q?refactor=20:=20Dto=20=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=97=94=ED=8B=B0=ED=8B=B0=EB=A5=BC=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=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/dto/InputCarNameDto.java | 2 +- src/main/java/dto/InputNumberOfAttemptDto.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/dto/InputCarNameDto.java b/src/main/java/dto/InputCarNameDto.java index 94d1a0751..111fac94d 100644 --- a/src/main/java/dto/InputCarNameDto.java +++ b/src/main/java/dto/InputCarNameDto.java @@ -24,7 +24,7 @@ private static List parseFrom(final String[] names) { } public Names toNames() { - List elements = this.names.stream() + List elements = names.stream() .map(Name::new) .collect(Collectors.toList()); return new Names(elements); diff --git a/src/main/java/dto/InputNumberOfAttemptDto.java b/src/main/java/dto/InputNumberOfAttemptDto.java index c95f9a5a7..0d4af33bb 100644 --- a/src/main/java/dto/InputNumberOfAttemptDto.java +++ b/src/main/java/dto/InputNumberOfAttemptDto.java @@ -1,5 +1,7 @@ package dto; +import domain.vo.NumberOfAttempt; + public class InputNumberOfAttemptDto { private final int numberOfAttempt; @@ -21,7 +23,7 @@ private static int parseFrom(final String numberOfAttempt) { return Integer.parseInt(numberOfAttempt); } - public int getNumberOfAttempt() { - return numberOfAttempt; + public NumberOfAttempt toNumberOfAttempt() { + return new NumberOfAttempt(numberOfAttempt); } } From a1e0b40085144d8197e82f82f70a481507edd1d2 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:16:21 +0900 Subject: [PATCH 26/35] =?UTF-8?q?feat=20:=20Dto=20=EB=B0=8F=20Output=20Vie?= =?UTF-8?q?w=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/dto/OutputRoundResultDto.java | 18 +++++++ src/main/java/dto/OutputWinnerDto.java | 24 +++++++++ src/main/java/view/OutputConsoleView.java | 50 +++++++++++++++++++ src/main/java/view/OutputView.java | 12 +++++ .../java/dto/InputNumberOfAttemptDtoTest.java | 6 ++- .../java/dto/OutputRoundResultDtoTest.java | 38 ++++++++++++++ src/test/java/dto/OutputWinnerDtoTest.java | 27 ++++++++++ 7 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 src/main/java/dto/OutputRoundResultDto.java create mode 100644 src/main/java/dto/OutputWinnerDto.java create mode 100644 src/main/java/view/OutputConsoleView.java create mode 100644 src/main/java/view/OutputView.java create mode 100644 src/test/java/dto/OutputRoundResultDtoTest.java create mode 100644 src/test/java/dto/OutputWinnerDtoTest.java diff --git a/src/main/java/dto/OutputRoundResultDto.java b/src/main/java/dto/OutputRoundResultDto.java new file mode 100644 index 000000000..6952128a7 --- /dev/null +++ b/src/main/java/dto/OutputRoundResultDto.java @@ -0,0 +1,18 @@ +package dto; + +import domain.Car; +import domain.Cars; + +import java.util.List; + +public class OutputRoundResultDto { + private final List cars; + + public OutputRoundResultDto(final Cars cars) { + this.cars = cars.elements(); + } + + public List cars() { + return cars; + } +} diff --git a/src/main/java/dto/OutputWinnerDto.java b/src/main/java/dto/OutputWinnerDto.java new file mode 100644 index 000000000..ccdebb981 --- /dev/null +++ b/src/main/java/dto/OutputWinnerDto.java @@ -0,0 +1,24 @@ +package dto; + +import domain.Car; + +import java.util.List; +import java.util.stream.Collectors; + +public class OutputWinnerDto { + private final List winners; + + public OutputWinnerDto(final List winners) { + this.winners = convertFrom(winners); + } + + private List convertFrom(final List winners) { + return winners.stream() + .map(Car::name) + .collect(Collectors.toUnmodifiableList()); + } + + public List winners() { + return winners; + } +} diff --git a/src/main/java/view/OutputConsoleView.java b/src/main/java/view/OutputConsoleView.java new file mode 100644 index 000000000..96fc626e7 --- /dev/null +++ b/src/main/java/view/OutputConsoleView.java @@ -0,0 +1,50 @@ +package view; + +import domain.Car; +import dto.OutputRoundResultDto; +import dto.OutputWinnerDto; + +import java.util.List; +import java.util.StringJoiner; +import java.util.stream.IntStream; + +import static java.lang.System.out; + +public class OutputConsoleView implements OutputView { + + private static final String DISTANCE_SYMBOL = "-"; + private static final String WINNER_NAME_DELIMITER = ", "; + + @Override + public void printRoundResultMessage() { + out.println(); + out.println("실행결과"); + } + + @Override + public void printRoundResult(final OutputRoundResultDto outputRoundResultDto) { + List cars = outputRoundResultDto.cars(); + cars.forEach(car -> out.println(car.name() + getDistanceSymbols(car.position()))); + out.println(); + } + + private String getDistanceSymbols(final int position) { + StringBuilder distanceSymbols = new StringBuilder(); + IntStream.range(0, position) + .forEach(index -> distanceSymbols.append(DISTANCE_SYMBOL)); + return distanceSymbols.toString(); + } + + @Override + public void printWinner(final OutputWinnerDto outputWinnerDto) { + List winners = outputWinnerDto.winners(); + String winnerName = convertWinnerNameFrom(winners); + out.println(winnerName + "가 최종 우승했습니다."); + } + + private String convertWinnerNameFrom(final List winners) { + StringJoiner winnerName = new StringJoiner(WINNER_NAME_DELIMITER); + winners.forEach(winnerName::add); + return winnerName.toString(); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 000000000..d69490bcf --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,12 @@ +package view; + +import dto.OutputRoundResultDto; +import dto.OutputWinnerDto; + +public interface OutputView { + void printRoundResultMessage(); + + void printRoundResult(final OutputRoundResultDto outputRoundResultDto); + + void printWinner(final OutputWinnerDto outputWinnerDto); +} diff --git a/src/test/java/dto/InputNumberOfAttemptDtoTest.java b/src/test/java/dto/InputNumberOfAttemptDtoTest.java index d65517911..675062982 100644 --- a/src/test/java/dto/InputNumberOfAttemptDtoTest.java +++ b/src/test/java/dto/InputNumberOfAttemptDtoTest.java @@ -1,5 +1,6 @@ package dto; +import domain.vo.NumberOfAttempt; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -16,10 +17,11 @@ void getNumberOfAttempt() { InputNumberOfAttemptDto inputNumberOfAttemptDto = new InputNumberOfAttemptDto(expected); //when - int actual = inputNumberOfAttemptDto.getNumberOfAttempt(); + NumberOfAttempt actual = inputNumberOfAttemptDto.toNumberOfAttempt(); //then - assertThat(actual).isEqualTo(expected); + assertThat(actual).extracting("value") + .isEqualTo(expected); } @Test diff --git a/src/test/java/dto/OutputRoundResultDtoTest.java b/src/test/java/dto/OutputRoundResultDtoTest.java new file mode 100644 index 000000000..35024dad5 --- /dev/null +++ b/src/test/java/dto/OutputRoundResultDtoTest.java @@ -0,0 +1,38 @@ +package dto; + +import domain.Car; +import domain.Cars; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; + +class OutputRoundResultDtoTest { + + @Test + @DisplayName("차 일급컬렉션을 입력받아 차 리스트를 반환한다") + void cars() { + //given + Car car1 = new Car("name1", 1); + Car car2 = new Car("name2", 2); + List elements = Arrays.asList(car1, car2); + + Cars cars = new Cars(elements); + + OutputRoundResultDto outputRoundResultDto = new OutputRoundResultDto(cars); + + //when + List actual = outputRoundResultDto.cars(); + + //then + assertThat(actual).extracting("name.value", "position.value") + .containsExactly( + tuple("name1", 1), + tuple("name2", 2) + ); + } +} diff --git a/src/test/java/dto/OutputWinnerDtoTest.java b/src/test/java/dto/OutputWinnerDtoTest.java new file mode 100644 index 000000000..343fa27fc --- /dev/null +++ b/src/test/java/dto/OutputWinnerDtoTest.java @@ -0,0 +1,27 @@ +package dto; + +import domain.Car; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class OutputWinnerDtoTest { + + @Test + @DisplayName("우승자들을 이름으로 받아 우승자들의 이름을 반환한다") + void winners() { + //given + List winners = Arrays.asList(new Car("name1"), new Car("name2")); + OutputWinnerDto outputWinnerDto = new OutputWinnerDto(winners); + + //when + List actual = outputWinnerDto.winners(); + + //then + assertThat(actual).containsExactly("name1", "name2"); + } +} From 60bc1a6021c91198fa39fb640735aa3cd8015c8a Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:19:09 +0900 Subject: [PATCH 27/35] =?UTF-8?q?feat=20:=20Round=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RoundTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/domain/RoundTest.java b/src/test/java/domain/RoundTest.java index ec7b43bb2..d86d983ea 100644 --- a/src/test/java/domain/RoundTest.java +++ b/src/test/java/domain/RoundTest.java @@ -108,9 +108,9 @@ void cars() { void winners() { //given NumberOfAttempt numberOfAttempt = new NumberOfAttempt(1); - Car winner1 = new Car("winner1", 3); - Car winner2 = new Car("winner2", 3); - Car loser = new Car("loser", 2); + Car winner1 = new Car("win1", 3); + Car winner2 = new Car("win2", 3); + Car loser = new Car("lose", 2); List elements = Arrays.asList(winner1, winner2, loser); Cars cars = new Cars(elements); @@ -120,10 +120,10 @@ void winners() { List winners = round.winners(); //then - assertThat(winners).extracting("name", "position") + assertThat(winners).extracting("name.value", "position.value") .containsExactly( - tuple("winner1", 3), - tuple("winner2", 3) + tuple("win1", 3), + tuple("win2", 3) ); } } From caf496a5a06401f1a0904a342bec1c7de48293e3 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:21:01 +0900 Subject: [PATCH 28/35] =?UTF-8?q?feat=20:=20GameController=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/controller/GameController.java | 62 ++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/main/java/controller/GameController.java diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 000000000..384877706 --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,62 @@ +package controller; + +import domain.Car; +import domain.Cars; +import domain.Names; +import domain.Round; +import domain.vo.NumberOfAttempt; +import dto.InputCarNameDto; +import dto.InputNumberOfAttemptDto; +import dto.OutputRoundResultDto; +import dto.OutputWinnerDto; +import strategy.MovementStrategy; +import view.InputView; +import view.OutputView; + +import java.util.List; + +public class GameController { + private final InputView inputView; + private final OutputView outputView; + private final MovementStrategy movementStrategy; + + public GameController(final InputView inputView, final OutputView outputView, final MovementStrategy movementStrategy) { + this.inputView = inputView; + this.outputView = outputView; + this.movementStrategy = movementStrategy; + } + + public void run() { + Round round = initRound(); + outputView.printRoundResultMessage(); + round = race(round); + printWinner(round); + } + + private Round race(final Round initialRound) { + Round round = initialRound; + + while (round.isOver()) { + round = round.play(movementStrategy); + Cars nextRoundCars = round.cars(); + OutputRoundResultDto outputRoundResultDto = new OutputRoundResultDto(nextRoundCars); + outputView.printRoundResult(outputRoundResultDto); + } + + return round; + } + + private Round initRound() { + InputCarNameDto inputCarNameDto = inputView.inputCarNames(); + InputNumberOfAttemptDto inputNumberOfAttemptDto = inputView.inputNumberOfAttempt(); + Names names = inputCarNameDto.toNames(); + NumberOfAttempt numberOfAttempt = inputNumberOfAttemptDto.toNumberOfAttempt(); + return new Round(names, numberOfAttempt); + } + + private void printWinner(final Round round) { + List winners = round.winners(); + OutputWinnerDto outputWinnerDto = new OutputWinnerDto(winners); + outputView.printWinner(outputWinnerDto); + } +} From 3a149bec432f4fb1e0c9ba29f40ca3180ec93014 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:22:39 +0900 Subject: [PATCH 29/35] =?UTF-8?q?refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=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 --- .../controller/GameController.java | 28 +++++++++---------- src/main/java/{ => racing}/domain/Car.java | 8 +++--- src/main/java/{ => racing}/domain/Cars.java | 4 +-- src/main/java/{ => racing}/domain/Names.java | 4 +-- src/main/java/{ => racing}/domain/Round.java | 6 ++-- .../java/{ => racing}/domain/vo/Name.java | 2 +- .../domain/vo/NumberOfAttempt.java | 2 +- .../java/{ => racing}/domain/vo/Position.java | 2 +- .../{ => racing}/dto/InputCarNameDto.java | 6 ++-- .../dto/InputNumberOfAttemptDto.java | 4 +-- .../dto/OutputRoundResultDto.java | 6 ++-- .../{ => racing}/dto/OutputWinnerDto.java | 4 +-- .../strategy/MovementStrategy.java | 2 +- .../RandomMovementStrategyStrategy.java | 2 +- .../{ => racing}/view/InputConsoleView.java | 6 ++-- .../java/{ => racing}/view/InputView.java | 6 ++-- .../{ => racing}/view/OutputConsoleView.java | 8 +++--- .../java/{ => racing}/view/OutputView.java | 6 ++-- .../java/{ => racing}/domain/CarTest.java | 4 +-- .../java/{ => racing}/domain/CarsTest.java | 6 ++-- .../java/{ => racing}/domain/NamesTest.java | 4 +-- .../java/{ => racing}/domain/RoundTest.java | 6 ++-- .../java/{ => racing}/domain/vo/NameTest.java | 2 +- .../domain/vo/NumberOfAttemptTest.java | 2 +- .../{ => racing}/domain/vo/PositionTest.java | 2 +- .../{ => racing}/dto/InputCarNameDtoTest.java | 4 +-- .../dto/InputNumberOfAttemptDtoTest.java | 4 +-- .../dto/OutputRoundResultDtoTest.java | 6 ++-- .../{ => racing}/dto/OutputWinnerDtoTest.java | 4 +-- .../strategy/RandomMovementStrategyTest.java | 2 +- 30 files changed, 76 insertions(+), 76 deletions(-) rename src/main/java/{ => racing}/controller/GameController.java (79%) rename src/main/java/{ => racing}/domain/Car.java (91%) rename src/main/java/{ => racing}/domain/Cars.java (95%) rename src/main/java/{ => racing}/domain/Names.java (82%) rename src/main/java/{ => racing}/domain/Round.java (89%) rename src/main/java/{ => racing}/domain/vo/Name.java (97%) rename src/main/java/{ => racing}/domain/vo/NumberOfAttempt.java (97%) rename src/main/java/{ => racing}/domain/vo/Position.java (96%) rename src/main/java/{ => racing}/dto/InputCarNameDto.java (89%) rename src/main/java/{ => racing}/dto/InputNumberOfAttemptDto.java (92%) rename src/main/java/{ => racing}/dto/OutputRoundResultDto.java (77%) rename src/main/java/{ => racing}/dto/OutputWinnerDto.java (91%) rename src/main/java/{ => racing}/strategy/MovementStrategy.java (71%) rename src/main/java/{ => racing}/strategy/RandomMovementStrategyStrategy.java (92%) rename src/main/java/{ => racing}/view/InputConsoleView.java (88%) rename src/main/java/{ => racing}/view/InputView.java (55%) rename src/main/java/{ => racing}/view/OutputConsoleView.java (92%) rename src/main/java/{ => racing}/view/OutputView.java (68%) rename src/test/java/{ => racing}/domain/CarTest.java (97%) rename src/test/java/{ => racing}/domain/CarsTest.java (96%) rename src/test/java/{ => racing}/domain/NamesTest.java (92%) rename src/test/java/{ => racing}/domain/RoundTest.java (97%) rename src/test/java/{ => racing}/domain/vo/NameTest.java (98%) rename src/test/java/{ => racing}/domain/vo/NumberOfAttemptTest.java (99%) rename src/test/java/{ => racing}/domain/vo/PositionTest.java (98%) rename src/test/java/{ => racing}/dto/InputCarNameDtoTest.java (92%) rename src/test/java/{ => racing}/dto/InputNumberOfAttemptDtoTest.java (94%) rename src/test/java/{ => racing}/dto/OutputRoundResultDtoTest.java (93%) rename src/test/java/{ => racing}/dto/OutputWinnerDtoTest.java (93%) rename src/test/java/{ => racing}/strategy/RandomMovementStrategyTest.java (96%) diff --git a/src/main/java/controller/GameController.java b/src/main/java/racing/controller/GameController.java similarity index 79% rename from src/main/java/controller/GameController.java rename to src/main/java/racing/controller/GameController.java index 384877706..0c5600103 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/racing/controller/GameController.java @@ -1,17 +1,17 @@ -package controller; - -import domain.Car; -import domain.Cars; -import domain.Names; -import domain.Round; -import domain.vo.NumberOfAttempt; -import dto.InputCarNameDto; -import dto.InputNumberOfAttemptDto; -import dto.OutputRoundResultDto; -import dto.OutputWinnerDto; -import strategy.MovementStrategy; -import view.InputView; -import view.OutputView; +package racing.controller; + +import racing.domain.Car; +import racing.domain.Cars; +import racing.domain.Names; +import racing.domain.Round; +import racing.domain.vo.NumberOfAttempt; +import racing.dto.InputCarNameDto; +import racing.dto.InputNumberOfAttemptDto; +import racing.dto.OutputRoundResultDto; +import racing.dto.OutputWinnerDto; +import racing.strategy.MovementStrategy; +import racing.view.InputView; +import racing.view.OutputView; import java.util.List; diff --git a/src/main/java/domain/Car.java b/src/main/java/racing/domain/Car.java similarity index 91% rename from src/main/java/domain/Car.java rename to src/main/java/racing/domain/Car.java index 8b6eb03ba..c4512a089 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/racing/domain/Car.java @@ -1,8 +1,8 @@ -package domain; +package racing.domain; -import domain.vo.Name; -import domain.vo.Position; -import strategy.MovementStrategy; +import racing.domain.vo.Name; +import racing.domain.vo.Position; +import racing.strategy.MovementStrategy; import java.util.Objects; diff --git a/src/main/java/domain/Cars.java b/src/main/java/racing/domain/Cars.java similarity index 95% rename from src/main/java/domain/Cars.java rename to src/main/java/racing/domain/Cars.java index 7e72c6548..c0ed29533 100644 --- a/src/main/java/domain/Cars.java +++ b/src/main/java/racing/domain/Cars.java @@ -1,6 +1,6 @@ -package domain; +package racing.domain; -import strategy.MovementStrategy; +import racing.strategy.MovementStrategy; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/domain/Names.java b/src/main/java/racing/domain/Names.java similarity index 82% rename from src/main/java/domain/Names.java rename to src/main/java/racing/domain/Names.java index 26cf947dd..54b658c5d 100644 --- a/src/main/java/domain/Names.java +++ b/src/main/java/racing/domain/Names.java @@ -1,6 +1,6 @@ -package domain; +package racing.domain; -import domain.vo.Name; +import racing.domain.vo.Name; import java.util.List; diff --git a/src/main/java/domain/Round.java b/src/main/java/racing/domain/Round.java similarity index 89% rename from src/main/java/domain/Round.java rename to src/main/java/racing/domain/Round.java index 27d610760..29ba054a5 100644 --- a/src/main/java/domain/Round.java +++ b/src/main/java/racing/domain/Round.java @@ -1,7 +1,7 @@ -package domain; +package racing.domain; -import domain.vo.NumberOfAttempt; -import strategy.MovementStrategy; +import racing.domain.vo.NumberOfAttempt; +import racing.strategy.MovementStrategy; import java.util.List; diff --git a/src/main/java/domain/vo/Name.java b/src/main/java/racing/domain/vo/Name.java similarity index 97% rename from src/main/java/domain/vo/Name.java rename to src/main/java/racing/domain/vo/Name.java index 2e8f9c7b5..d9bf95661 100644 --- a/src/main/java/domain/vo/Name.java +++ b/src/main/java/racing/domain/vo/Name.java @@ -1,4 +1,4 @@ -package domain.vo; +package racing.domain.vo; import java.util.Objects; diff --git a/src/main/java/domain/vo/NumberOfAttempt.java b/src/main/java/racing/domain/vo/NumberOfAttempt.java similarity index 97% rename from src/main/java/domain/vo/NumberOfAttempt.java rename to src/main/java/racing/domain/vo/NumberOfAttempt.java index ed056d8b4..89fdf9f5d 100644 --- a/src/main/java/domain/vo/NumberOfAttempt.java +++ b/src/main/java/racing/domain/vo/NumberOfAttempt.java @@ -1,4 +1,4 @@ -package domain.vo; +package racing.domain.vo; import java.util.Objects; diff --git a/src/main/java/domain/vo/Position.java b/src/main/java/racing/domain/vo/Position.java similarity index 96% rename from src/main/java/domain/vo/Position.java rename to src/main/java/racing/domain/vo/Position.java index e308ba4d7..f5a9b8582 100644 --- a/src/main/java/domain/vo/Position.java +++ b/src/main/java/racing/domain/vo/Position.java @@ -1,4 +1,4 @@ -package domain.vo; +package racing.domain.vo; import java.util.Objects; diff --git a/src/main/java/dto/InputCarNameDto.java b/src/main/java/racing/dto/InputCarNameDto.java similarity index 89% rename from src/main/java/dto/InputCarNameDto.java rename to src/main/java/racing/dto/InputCarNameDto.java index 111fac94d..cf958997f 100644 --- a/src/main/java/dto/InputCarNameDto.java +++ b/src/main/java/racing/dto/InputCarNameDto.java @@ -1,7 +1,7 @@ -package dto; +package racing.dto; -import domain.Names; -import domain.vo.Name; +import racing.domain.Names; +import racing.domain.vo.Name; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/dto/InputNumberOfAttemptDto.java b/src/main/java/racing/dto/InputNumberOfAttemptDto.java similarity index 92% rename from src/main/java/dto/InputNumberOfAttemptDto.java rename to src/main/java/racing/dto/InputNumberOfAttemptDto.java index 0d4af33bb..7b9989b57 100644 --- a/src/main/java/dto/InputNumberOfAttemptDto.java +++ b/src/main/java/racing/dto/InputNumberOfAttemptDto.java @@ -1,6 +1,6 @@ -package dto; +package racing.dto; -import domain.vo.NumberOfAttempt; +import racing.domain.vo.NumberOfAttempt; public class InputNumberOfAttemptDto { private final int numberOfAttempt; diff --git a/src/main/java/dto/OutputRoundResultDto.java b/src/main/java/racing/dto/OutputRoundResultDto.java similarity index 77% rename from src/main/java/dto/OutputRoundResultDto.java rename to src/main/java/racing/dto/OutputRoundResultDto.java index 6952128a7..27e21695b 100644 --- a/src/main/java/dto/OutputRoundResultDto.java +++ b/src/main/java/racing/dto/OutputRoundResultDto.java @@ -1,7 +1,7 @@ -package dto; +package racing.dto; -import domain.Car; -import domain.Cars; +import racing.domain.Car; +import racing.domain.Cars; import java.util.List; diff --git a/src/main/java/dto/OutputWinnerDto.java b/src/main/java/racing/dto/OutputWinnerDto.java similarity index 91% rename from src/main/java/dto/OutputWinnerDto.java rename to src/main/java/racing/dto/OutputWinnerDto.java index ccdebb981..4f7fc298f 100644 --- a/src/main/java/dto/OutputWinnerDto.java +++ b/src/main/java/racing/dto/OutputWinnerDto.java @@ -1,6 +1,6 @@ -package dto; +package racing.dto; -import domain.Car; +import racing.domain.Car; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/strategy/MovementStrategy.java b/src/main/java/racing/strategy/MovementStrategy.java similarity index 71% rename from src/main/java/strategy/MovementStrategy.java rename to src/main/java/racing/strategy/MovementStrategy.java index a2ecf6fd5..a4ce5684e 100644 --- a/src/main/java/strategy/MovementStrategy.java +++ b/src/main/java/racing/strategy/MovementStrategy.java @@ -1,4 +1,4 @@ -package strategy; +package racing.strategy; public interface MovementStrategy { boolean canMove(); diff --git a/src/main/java/strategy/RandomMovementStrategyStrategy.java b/src/main/java/racing/strategy/RandomMovementStrategyStrategy.java similarity index 92% rename from src/main/java/strategy/RandomMovementStrategyStrategy.java rename to src/main/java/racing/strategy/RandomMovementStrategyStrategy.java index 6b36c901b..2c9839385 100644 --- a/src/main/java/strategy/RandomMovementStrategyStrategy.java +++ b/src/main/java/racing/strategy/RandomMovementStrategyStrategy.java @@ -1,4 +1,4 @@ -package strategy; +package racing.strategy; import java.util.Random; diff --git a/src/main/java/view/InputConsoleView.java b/src/main/java/racing/view/InputConsoleView.java similarity index 88% rename from src/main/java/view/InputConsoleView.java rename to src/main/java/racing/view/InputConsoleView.java index eb8db1b9e..0bf0f02aa 100644 --- a/src/main/java/view/InputConsoleView.java +++ b/src/main/java/racing/view/InputConsoleView.java @@ -1,7 +1,7 @@ -package view; +package racing.view; -import dto.InputCarNameDto; -import dto.InputNumberOfAttemptDto; +import racing.dto.InputCarNameDto; +import racing.dto.InputNumberOfAttemptDto; import java.util.Scanner; diff --git a/src/main/java/view/InputView.java b/src/main/java/racing/view/InputView.java similarity index 55% rename from src/main/java/view/InputView.java rename to src/main/java/racing/view/InputView.java index c0eb085a5..7952dd6ef 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/racing/view/InputView.java @@ -1,7 +1,7 @@ -package view; +package racing.view; -import dto.InputCarNameDto; -import dto.InputNumberOfAttemptDto; +import racing.dto.InputCarNameDto; +import racing.dto.InputNumberOfAttemptDto; public interface InputView { diff --git a/src/main/java/view/OutputConsoleView.java b/src/main/java/racing/view/OutputConsoleView.java similarity index 92% rename from src/main/java/view/OutputConsoleView.java rename to src/main/java/racing/view/OutputConsoleView.java index 96fc626e7..d2cb68ec5 100644 --- a/src/main/java/view/OutputConsoleView.java +++ b/src/main/java/racing/view/OutputConsoleView.java @@ -1,8 +1,8 @@ -package view; +package racing.view; -import domain.Car; -import dto.OutputRoundResultDto; -import dto.OutputWinnerDto; +import racing.domain.Car; +import racing.dto.OutputRoundResultDto; +import racing.dto.OutputWinnerDto; import java.util.List; import java.util.StringJoiner; diff --git a/src/main/java/view/OutputView.java b/src/main/java/racing/view/OutputView.java similarity index 68% rename from src/main/java/view/OutputView.java rename to src/main/java/racing/view/OutputView.java index d69490bcf..6c53543e4 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/racing/view/OutputView.java @@ -1,7 +1,7 @@ -package view; +package racing.view; -import dto.OutputRoundResultDto; -import dto.OutputWinnerDto; +import racing.dto.OutputRoundResultDto; +import racing.dto.OutputWinnerDto; public interface OutputView { void printRoundResultMessage(); diff --git a/src/test/java/domain/CarTest.java b/src/test/java/racing/domain/CarTest.java similarity index 97% rename from src/test/java/domain/CarTest.java rename to src/test/java/racing/domain/CarTest.java index 2233dba6a..de782e667 100644 --- a/src/test/java/domain/CarTest.java +++ b/src/test/java/racing/domain/CarTest.java @@ -1,11 +1,11 @@ -package domain; +package racing.domain; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import strategy.MovementStrategy; +import racing.strategy.MovementStrategy; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; diff --git a/src/test/java/domain/CarsTest.java b/src/test/java/racing/domain/CarsTest.java similarity index 96% rename from src/test/java/domain/CarsTest.java rename to src/test/java/racing/domain/CarsTest.java index d319947e2..7def80759 100644 --- a/src/test/java/domain/CarsTest.java +++ b/src/test/java/racing/domain/CarsTest.java @@ -1,11 +1,11 @@ -package domain; +package racing.domain; -import domain.vo.Name; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import strategy.MovementStrategy; +import racing.domain.vo.Name; +import racing.strategy.MovementStrategy; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/domain/NamesTest.java b/src/test/java/racing/domain/NamesTest.java similarity index 92% rename from src/test/java/domain/NamesTest.java rename to src/test/java/racing/domain/NamesTest.java index be2b39e3c..4a8b3cbb9 100644 --- a/src/test/java/domain/NamesTest.java +++ b/src/test/java/racing/domain/NamesTest.java @@ -1,8 +1,8 @@ -package domain; +package racing.domain; -import domain.vo.Name; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import racing.domain.vo.Name; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/domain/RoundTest.java b/src/test/java/racing/domain/RoundTest.java similarity index 97% rename from src/test/java/domain/RoundTest.java rename to src/test/java/racing/domain/RoundTest.java index d86d983ea..ea2b80856 100644 --- a/src/test/java/domain/RoundTest.java +++ b/src/test/java/racing/domain/RoundTest.java @@ -1,11 +1,11 @@ -package domain; +package racing.domain; -import domain.vo.NumberOfAttempt; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import strategy.MovementStrategy; +import racing.domain.vo.NumberOfAttempt; +import racing.strategy.MovementStrategy; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/domain/vo/NameTest.java b/src/test/java/racing/domain/vo/NameTest.java similarity index 98% rename from src/test/java/domain/vo/NameTest.java rename to src/test/java/racing/domain/vo/NameTest.java index b837d52b4..03927e957 100644 --- a/src/test/java/domain/vo/NameTest.java +++ b/src/test/java/racing/domain/vo/NameTest.java @@ -1,4 +1,4 @@ -package domain.vo; +package racing.domain.vo; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/domain/vo/NumberOfAttemptTest.java b/src/test/java/racing/domain/vo/NumberOfAttemptTest.java similarity index 99% rename from src/test/java/domain/vo/NumberOfAttemptTest.java rename to src/test/java/racing/domain/vo/NumberOfAttemptTest.java index 82ed5e2d7..2fa4521bf 100644 --- a/src/test/java/domain/vo/NumberOfAttemptTest.java +++ b/src/test/java/racing/domain/vo/NumberOfAttemptTest.java @@ -1,4 +1,4 @@ -package domain.vo; +package racing.domain.vo; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/vo/PositionTest.java b/src/test/java/racing/domain/vo/PositionTest.java similarity index 98% rename from src/test/java/domain/vo/PositionTest.java rename to src/test/java/racing/domain/vo/PositionTest.java index 91550c5d5..9641b2054 100644 --- a/src/test/java/domain/vo/PositionTest.java +++ b/src/test/java/racing/domain/vo/PositionTest.java @@ -1,4 +1,4 @@ -package domain.vo; +package racing.domain.vo; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/dto/InputCarNameDtoTest.java b/src/test/java/racing/dto/InputCarNameDtoTest.java similarity index 92% rename from src/test/java/dto/InputCarNameDtoTest.java rename to src/test/java/racing/dto/InputCarNameDtoTest.java index 91034aebc..cc264a6ad 100644 --- a/src/test/java/dto/InputCarNameDtoTest.java +++ b/src/test/java/racing/dto/InputCarNameDtoTest.java @@ -1,8 +1,8 @@ -package dto; +package racing.dto; -import domain.Names; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import racing.domain.Names; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/dto/InputNumberOfAttemptDtoTest.java b/src/test/java/racing/dto/InputNumberOfAttemptDtoTest.java similarity index 94% rename from src/test/java/dto/InputNumberOfAttemptDtoTest.java rename to src/test/java/racing/dto/InputNumberOfAttemptDtoTest.java index 675062982..732b23de3 100644 --- a/src/test/java/dto/InputNumberOfAttemptDtoTest.java +++ b/src/test/java/racing/dto/InputNumberOfAttemptDtoTest.java @@ -1,8 +1,8 @@ -package dto; +package racing.dto; -import domain.vo.NumberOfAttempt; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import racing.domain.vo.NumberOfAttempt; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; diff --git a/src/test/java/dto/OutputRoundResultDtoTest.java b/src/test/java/racing/dto/OutputRoundResultDtoTest.java similarity index 93% rename from src/test/java/dto/OutputRoundResultDtoTest.java rename to src/test/java/racing/dto/OutputRoundResultDtoTest.java index 35024dad5..c41476691 100644 --- a/src/test/java/dto/OutputRoundResultDtoTest.java +++ b/src/test/java/racing/dto/OutputRoundResultDtoTest.java @@ -1,9 +1,9 @@ -package dto; +package racing.dto; -import domain.Car; -import domain.Cars; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import racing.domain.Car; +import racing.domain.Cars; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/dto/OutputWinnerDtoTest.java b/src/test/java/racing/dto/OutputWinnerDtoTest.java similarity index 93% rename from src/test/java/dto/OutputWinnerDtoTest.java rename to src/test/java/racing/dto/OutputWinnerDtoTest.java index 343fa27fc..943480c49 100644 --- a/src/test/java/dto/OutputWinnerDtoTest.java +++ b/src/test/java/racing/dto/OutputWinnerDtoTest.java @@ -1,8 +1,8 @@ -package dto; +package racing.dto; -import domain.Car; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import racing.domain.Car; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/strategy/RandomMovementStrategyTest.java b/src/test/java/racing/strategy/RandomMovementStrategyTest.java similarity index 96% rename from src/test/java/strategy/RandomMovementStrategyTest.java rename to src/test/java/racing/strategy/RandomMovementStrategyTest.java index ee99fdc63..35b9efb71 100644 --- a/src/test/java/strategy/RandomMovementStrategyTest.java +++ b/src/test/java/racing/strategy/RandomMovementStrategyTest.java @@ -1,4 +1,4 @@ -package strategy; +package racing.strategy; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; From 6a19f775befacbb339648bf18116133e92e63bc7 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:30:25 +0900 Subject: [PATCH 30/35] =?UTF-8?q?refactor=20:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=9D=B4=EB=A6=84=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/racing/controller/GameController.java | 2 +- src/main/java/racing/domain/Round.java | 4 ++-- src/test/java/racing/domain/RoundTest.java | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/racing/controller/GameController.java b/src/main/java/racing/controller/GameController.java index 0c5600103..8cf7559e9 100644 --- a/src/main/java/racing/controller/GameController.java +++ b/src/main/java/racing/controller/GameController.java @@ -36,7 +36,7 @@ public void run() { private Round race(final Round initialRound) { Round round = initialRound; - while (round.isOver()) { + while (round.isPlaying()) { round = round.play(movementStrategy); Cars nextRoundCars = round.cars(); OutputRoundResultDto outputRoundResultDto = new OutputRoundResultDto(nextRoundCars); diff --git a/src/main/java/racing/domain/Round.java b/src/main/java/racing/domain/Round.java index 29ba054a5..04f3dd7c9 100644 --- a/src/main/java/racing/domain/Round.java +++ b/src/main/java/racing/domain/Round.java @@ -33,7 +33,7 @@ public List winners() { return cars.findMaxPositionCars(); } - public boolean isOver() { - return numberOfAttempt.isOver(); + public boolean isPlaying() { + return !numberOfAttempt.isOver(); } } diff --git a/src/test/java/racing/domain/RoundTest.java b/src/test/java/racing/domain/RoundTest.java index ea2b80856..a27f80790 100644 --- a/src/test/java/racing/domain/RoundTest.java +++ b/src/test/java/racing/domain/RoundTest.java @@ -68,9 +68,9 @@ void play() { } @ParameterizedTest - @CsvSource(value = {"0, true", "1, false"}) + @CsvSource(value = {"0, false", "1, true"}) @DisplayName("시도 횟수가 없으면 참 아니면 거짓을 반환한다") - void isOver(final int numberOfAttemptValue, final boolean expected) { + void isPlaying(final int numberOfAttemptValue, final boolean expected) { //given NumberOfAttempt numberOfAttempt = new NumberOfAttempt(numberOfAttemptValue); @@ -80,7 +80,7 @@ void isOver(final int numberOfAttemptValue, final boolean expected) { Round round = new Round(cars, numberOfAttempt); //when - boolean actual = round.isOver(); + boolean actual = round.isPlaying(); //then assertThat(actual).isEqualTo(expected); From cdf7a2389932acc41793a68f1cb9c33d9c74d683 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 19:30:45 +0900 Subject: [PATCH 31/35] =?UTF-8?q?refactor=20:=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=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 --- .../java/racing/RacingCarApplication.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/racing/RacingCarApplication.java diff --git a/src/main/java/racing/RacingCarApplication.java b/src/main/java/racing/RacingCarApplication.java new file mode 100644 index 000000000..aef77b26b --- /dev/null +++ b/src/main/java/racing/RacingCarApplication.java @@ -0,0 +1,23 @@ +package racing; + +import racing.controller.GameController; +import racing.strategy.MovementStrategy; +import racing.strategy.RandomMovementStrategyStrategy; +import racing.view.InputConsoleView; +import racing.view.InputView; +import racing.view.OutputConsoleView; +import racing.view.OutputView; + +import java.util.Scanner; + +public class RacingCarApplication { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + InputView inputView = new InputConsoleView(scanner); + OutputView outputView = new OutputConsoleView(); + MovementStrategy movementStrategy = new RandomMovementStrategyStrategy(); + GameController gameController = new GameController(inputView, outputView, movementStrategy); + gameController.run(); + scanner.close(); + } +} From fcb9e4fc84553ae23fd2528f6beec8e31cb38748 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 20:25:57 +0900 Subject: [PATCH 32/35] =?UTF-8?q?refactor=20:=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EB=A1=9C=EC=A7=81=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/racing/dto/InputCarNameDto.java | 15 ++++++++++++--- src/test/java/racing/dto/InputCarNameDtoTest.java | 14 +++++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/racing/dto/InputCarNameDto.java b/src/main/java/racing/dto/InputCarNameDto.java index cf958997f..bfb9a25e3 100644 --- a/src/main/java/racing/dto/InputCarNameDto.java +++ b/src/main/java/racing/dto/InputCarNameDto.java @@ -18,9 +18,18 @@ public InputCarNameDto(final String[] names) { this(parseFrom(names)); } - private static List parseFrom(final String[] names) { - return Arrays.stream(names) - .collect(Collectors.toList()); + private static List parseFrom(final String[] carNames) { + List names = Arrays.stream(carNames) + .distinct() + .collect(Collectors.toUnmodifiableList()); + validateDuplicatedName(carNames, names); + return names; + } + + private static void validateDuplicatedName(final String[] carNames, final List names) { + if (names.size() < carNames.length) { + throw new IllegalArgumentException("중복된 이름이 존재합니다"); + } } public Names toNames() { diff --git a/src/test/java/racing/dto/InputCarNameDtoTest.java b/src/test/java/racing/dto/InputCarNameDtoTest.java index cc264a6ad..64f772b45 100644 --- a/src/test/java/racing/dto/InputCarNameDtoTest.java +++ b/src/test/java/racing/dto/InputCarNameDtoTest.java @@ -5,11 +5,12 @@ import racing.domain.Names; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; class InputCarNameDtoTest { @Test - @DisplayName("차 이름들로 입력을 받아 차 이름 값 객체들을 반환한다") + @DisplayName("차 이름들을 입력을 받아 차 이름 값 객체들을 반환한다") void toNames() { //given String[] nameElements = new String[]{"name1", "name2", "name3"}; @@ -21,4 +22,15 @@ void toNames() { //then assertThat(names).isNotNull(); } + + @Test + @DisplayName("이름에 중복이 존재하면 예외를 발생시킨다") + void create_throw_exception_with_duplicated_name() { + //given + String[] nameElements = {"name", "name"}; + + //then + assertThatIllegalArgumentException().isThrownBy(() -> new InputCarNameDto(nameElements)) + .withMessage("중복된 이름이 존재합니다"); + } } From 1b9f35bc8c81690f53ced4df3e90fdb7a07ef176 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 20:34:22 +0900 Subject: [PATCH 33/35] =?UTF-8?q?refactor=20:=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EA=B3=B5=EB=B0=B1=20=EC=A0=9C=EA=B1=B0=20=EA=B8=B0=EB=8A=A5=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 --- src/main/java/racing/view/InputConsoleView.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/racing/view/InputConsoleView.java b/src/main/java/racing/view/InputConsoleView.java index 0bf0f02aa..0b0d24e33 100644 --- a/src/main/java/racing/view/InputConsoleView.java +++ b/src/main/java/racing/view/InputConsoleView.java @@ -5,8 +5,11 @@ import java.util.Scanner; +import static java.lang.System.out; + public class InputConsoleView implements InputView { + private static final String NAME_TOKEN_DELIMITER = "\\s*,\\s*"; private final Scanner scanner; public InputConsoleView(final Scanner scanner) { @@ -17,7 +20,7 @@ public InputConsoleView(final Scanner scanner) { public InputCarNameDto inputCarNames() { System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); String nameToken = scanner.nextLine(); - String[] names = nameToken.split(","); + String[] names = nameToken.split(NAME_TOKEN_DELIMITER); return new InputCarNameDto(names); } From 30e257da0feb5b61595c2bb2e28e632cde916232 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 4 Nov 2021 20:34:38 +0900 Subject: [PATCH 34/35] =?UTF-8?q?style=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=EC=84=B1=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/racing/view/InputConsoleView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/racing/view/InputConsoleView.java b/src/main/java/racing/view/InputConsoleView.java index 0b0d24e33..470565257 100644 --- a/src/main/java/racing/view/InputConsoleView.java +++ b/src/main/java/racing/view/InputConsoleView.java @@ -18,7 +18,7 @@ public InputConsoleView(final Scanner scanner) { @Override public InputCarNameDto inputCarNames() { - System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); String nameToken = scanner.nextLine(); String[] names = nameToken.split(NAME_TOKEN_DELIMITER); return new InputCarNameDto(names); @@ -26,7 +26,7 @@ public InputCarNameDto inputCarNames() { @Override public InputNumberOfAttemptDto inputNumberOfAttempt() { - System.out.println("시도할 회수는 몇회인가요?"); + out.println("시도할 회수는 몇회인가요?"); String numberValue = scanner.nextLine(); return new InputNumberOfAttemptDto(numberValue); } From 135c27b94f7169afbd249496d1036fde832ec2c1 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 9 Nov 2021 11:24:34 +0900 Subject: [PATCH 35/35] =?UTF-8?q?style=20:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=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/racing/domain/vo/NumberOfAttempt.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/racing/domain/vo/NumberOfAttempt.java b/src/main/java/racing/domain/vo/NumberOfAttempt.java index 89fdf9f5d..5de214627 100644 --- a/src/main/java/racing/domain/vo/NumberOfAttempt.java +++ b/src/main/java/racing/domain/vo/NumberOfAttempt.java @@ -7,7 +7,7 @@ public class NumberOfAttempt { private static final int ZERO = 0; private static final int SUBTRACTED_VALUE = 1; - private int value; + private final int value; public NumberOfAttempt(final int value) { if (value < ZERO) {