From 5bfc3a3d099b1c28142a9f171074c786018e0cbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:00:30 +0900 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20=EC=88=AB=EC=9E=90=EB=A5=BC=20?= =?UTF-8?q?=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20"=EB=B3=BC"=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=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/baseball/domain/Ball.java | 23 ++++++++++++++++ src/test/java/baseball/domain/BallTest.java | 30 +++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/main/java/baseball/domain/Ball.java create mode 100644 src/test/java/baseball/domain/BallTest.java diff --git a/src/main/java/baseball/domain/Ball.java b/src/main/java/baseball/domain/Ball.java new file mode 100644 index 0000000..9069249 --- /dev/null +++ b/src/main/java/baseball/domain/Ball.java @@ -0,0 +1,23 @@ +package baseball.domain; + +public class Ball { + + public static final int MIN = 1; + public static final int MAX = 9; + private final int number; + + private Ball(int number) { + if (ballInputValidation(number)) { + throw new IllegalArgumentException("1부터 9까지 숫자만 입력이 가능합니다."); + } + this.number = number; + } + + public static Ball from(int number) { + return new Ball(number); + } + + private boolean ballInputValidation(int inputNumber) { + return inputNumber < MIN || inputNumber > MAX; + } +} diff --git a/src/test/java/baseball/domain/BallTest.java b/src/test/java/baseball/domain/BallTest.java new file mode 100644 index 0000000..02b2aeb --- /dev/null +++ b/src/test/java/baseball/domain/BallTest.java @@ -0,0 +1,30 @@ +package baseball.domain; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class BallTest { + + @ParameterizedTest + @DisplayName("BallNumber는 1부터 9까지의 숫자만 입력이 가능하다") + @ValueSource(ints = {0, 10}) + void test_예외_케이스(int fixture) { + assertThatThrownBy(() -> { + Ball ball = Ball.from(fixture); + }) // Then + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("1부터 9까지 숫자만 입력이 가능합니다."); + } + + @ParameterizedTest + @DisplayName("BallNumber는 1부터 9까지의 숫자만 입력이 가능하다") + @ValueSource(ints = {1, 9}) + void test_정상_케이스(int fixture) { + Ball ballNumber = Ball.from(fixture); + + assertThat(ballNumber).isInstanceOf(Ball.class); + } +} From be088c305ec326917c9a4c2c53e0cef2379a23fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Tue, 15 Oct 2024 20:12:29 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20Ball=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EC=9D=98=20List=EB=A5=BC=20=EA=B4=80=EB=A6=AC=20=ED=95=A0=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/BallList.java | 22 +++++++++ .../java/baseball/domain/BallListTest.java | 45 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/baseball/domain/BallList.java create mode 100644 src/test/java/baseball/domain/BallListTest.java diff --git a/src/main/java/baseball/domain/BallList.java b/src/main/java/baseball/domain/BallList.java new file mode 100644 index 0000000..3984b38 --- /dev/null +++ b/src/main/java/baseball/domain/BallList.java @@ -0,0 +1,22 @@ +package baseball.domain; + +import java.util.List; + +public class BallList { + + public static final int MAX_SIZE = 3; + private final List balls; + + private BallList(List balls) { + if (balls.size() != MAX_SIZE) { + throw new IllegalArgumentException("BallNumber는 3개가 최대 입니다."); + } + + this.balls = balls; + } + + public static BallList of(List balls) { + return new BallList(balls); + } + +} diff --git a/src/test/java/baseball/domain/BallListTest.java b/src/test/java/baseball/domain/BallListTest.java new file mode 100644 index 0000000..3dada7d --- /dev/null +++ b/src/test/java/baseball/domain/BallListTest.java @@ -0,0 +1,45 @@ +package baseball.domain; + +import static org.assertj.core.api.Assertions.*; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + +public class BallListTest { + + @Test + @DisplayName("BallList 컬렉션의 요소는 3개를 넘을 수 없다") + void BallList_요소_갯수_초과() { + // Given + List balls = List.of( + Ball.from(1), + Ball.from(2), + Ball.from(3), + Ball.from(4) + ); + + // When + assertThatThrownBy(() -> BallList.of(balls)) + // Then + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("BallNumber는 3개가 최대 입니다."); + } + + @Test + @DisplayName("BallList 컬렉션의 요소는 3개 보다 적을 수 없다") + void BallList_요소_갯수_미만() { + // Given + List balls = List.of( + Ball.from(1), + Ball.from(2) + ); + + // When + assertThatThrownBy(() -> BallList.of(balls)) + // Then + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("BallNumber는 3개가 최대 입니다."); + } +} From 9cb86c40bc91ee50c8b6869386f3fa7cc875b52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:38:16 +0900 Subject: [PATCH 03/16] =?UTF-8?q?refactor:=20Ball=20VO=20=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Ball.java | 54 ++++++++++++++++++--- src/test/java/baseball/domain/BallTest.java | 33 ++++++++----- 2 files changed, 66 insertions(+), 21 deletions(-) diff --git a/src/main/java/baseball/domain/Ball.java b/src/main/java/baseball/domain/Ball.java index 9069249..b6a2351 100644 --- a/src/main/java/baseball/domain/Ball.java +++ b/src/main/java/baseball/domain/Ball.java @@ -1,23 +1,61 @@ package baseball.domain; +import java.util.Objects; + public class Ball { - public static final int MIN = 1; - public static final int MAX = 9; + private static final int MIN = 1; + private static final int MAX = 9; private final int number; + private final int position; - private Ball(int number) { - if (ballInputValidation(number)) { - throw new IllegalArgumentException("1부터 9까지 숫자만 입력이 가능합니다."); + private Ball(int position, int number) { + if (ballPositionValidation(position) || ballNumberValidation(number)) { + throw new IllegalArgumentException("올바르지 않은 입력입니다."); } + + this.position = position; this.number = number; } - public static Ball from(int number) { - return new Ball(number); + public static Ball of(int position, int number) { + return new Ball(position, number); + } + + public boolean isAnotherPositionSameNumber(Ball targetBall) { + return (this.position != targetBall.getPosition()) && (this.number == targetBall.getNumber()); + } + + public int getNumber() { + return number; + } + + public int getPosition() { + return position; } - private boolean ballInputValidation(int inputNumber) { + private boolean ballNumberValidation(int inputNumber) { return inputNumber < MIN || inputNumber > MAX; } + + private boolean ballPositionValidation(int inputPosition) { + return inputPosition < 0; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Ball ball = (Ball) o; + return number == ball.number && position == ball.position; + } + + @Override + public int hashCode() { + return Objects.hash(number, position); + } } diff --git a/src/test/java/baseball/domain/BallTest.java b/src/test/java/baseball/domain/BallTest.java index 02b2aeb..b650274 100644 --- a/src/test/java/baseball/domain/BallTest.java +++ b/src/test/java/baseball/domain/BallTest.java @@ -3,28 +3,35 @@ import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; +import org.junit.jupiter.params.provider.CsvSource; public class BallTest { @ParameterizedTest - @DisplayName("BallNumber는 1부터 9까지의 숫자만 입력이 가능하다") - @ValueSource(ints = {0, 10}) - void test_예외_케이스(int fixture) { + @DisplayName("Ball 객체의 number 인자는 1부터 9까지의 숫자만 입력이 가능하다") + @CsvSource({"0,0", "0, 10"}) + void test_Ball_객체_number_인자_오류(int position, int number) { assertThatThrownBy(() -> { - Ball ball = Ball.from(fixture); - }) // Then + Ball.of(position, number); + }) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("1부터 9까지 숫자만 입력이 가능합니다."); + .hasMessageContaining("올바르지 않은 입력입니다."); } - @ParameterizedTest - @DisplayName("BallNumber는 1부터 9까지의 숫자만 입력이 가능하다") - @ValueSource(ints = {1, 9}) - void test_정상_케이스(int fixture) { - Ball ballNumber = Ball.from(fixture); + @Test + @DisplayName("Ball 객체의 position 인자는 0보다 낮을 수 없다") + void test_Ball_객체_position_인자_오류() { + assertThatThrownBy(() -> Ball.of(-1, 1)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("올바르지 않은 입력입니다."); + } - assertThat(ballNumber).isInstanceOf(Ball.class); + @ParameterizedTest + @DisplayName("Ball 객체는 0보다 큰 position과 1부터 9까지의 number만 입력이 가능하다") + @CsvSource({"0, 1", "0, 9"}) + void test_Ball_객체_생성_성공(int position, int number) { + assertThat(Ball.of(position, number)).isInstanceOf(Ball.class); } } From 897f0f3113cf673cb3e096415eb52c6a491b4349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:39:08 +0900 Subject: [PATCH 04/16] =?UTF-8?q?update:=20BallList=20=EC=9D=BC=EA=B8=89?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=20getter=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/BallList.java | 12 ++++++++ .../java/baseball/domain/BallListTest.java | 30 +++++++------------ 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/java/baseball/domain/BallList.java b/src/main/java/baseball/domain/BallList.java index 3984b38..966227c 100644 --- a/src/main/java/baseball/domain/BallList.java +++ b/src/main/java/baseball/domain/BallList.java @@ -1,12 +1,18 @@ package baseball.domain; +import java.util.ArrayList; import java.util.List; public class BallList { public static final int MAX_SIZE = 3; + private final List balls; + public List getBalls() { + return new ArrayList<>(balls); + } + private BallList(List balls) { if (balls.size() != MAX_SIZE) { throw new IllegalArgumentException("BallNumber는 3개가 최대 입니다."); @@ -19,4 +25,10 @@ public static BallList of(List balls) { return new BallList(balls); } + public boolean containsBall(Ball ball) { + return balls.stream() + .anyMatch(b -> b.isAnotherPositionSameNumber(ball)); + + } + } diff --git a/src/test/java/baseball/domain/BallListTest.java b/src/test/java/baseball/domain/BallListTest.java index 3dada7d..2639b2b 100644 --- a/src/test/java/baseball/domain/BallListTest.java +++ b/src/test/java/baseball/domain/BallListTest.java @@ -12,17 +12,12 @@ public class BallListTest { @Test @DisplayName("BallList 컬렉션의 요소는 3개를 넘을 수 없다") void BallList_요소_갯수_초과() { - // Given - List balls = List.of( - Ball.from(1), - Ball.from(2), - Ball.from(3), - Ball.from(4) - ); - - // When - assertThatThrownBy(() -> BallList.of(balls)) - // Then + assertThatThrownBy(() -> BallList.of(List.of( + Ball.of(0, 1), + Ball.of(1, 2), + Ball.of(2, 3), + Ball.of(3, 4) + ))) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("BallNumber는 3개가 최대 입니다."); } @@ -30,15 +25,10 @@ public class BallListTest { @Test @DisplayName("BallList 컬렉션의 요소는 3개 보다 적을 수 없다") void BallList_요소_갯수_미만() { - // Given - List balls = List.of( - Ball.from(1), - Ball.from(2) - ); - - // When - assertThatThrownBy(() -> BallList.of(balls)) - // Then + assertThatThrownBy(() -> BallList.of(List.of( + Ball.of(0, 1), + Ball.of(1, 2) + ))) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("BallNumber는 3개가 최대 입니다."); } From 98903da5f3188f3d2e8a50ed000a0bdf3f1ee866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:39:42 +0900 Subject: [PATCH 05/16] =?UTF-8?q?feat:=20=EC=88=AB=EC=9E=90=20=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=EA=B3=B5=20=ED=8C=90=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Count.java | 14 +++ src/main/java/baseball/domain/Judgement.java | 30 +++++ .../java/baseball/domain/JudgementTest.java | 107 ++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 src/main/java/baseball/domain/Count.java create mode 100644 src/main/java/baseball/domain/Judgement.java create mode 100644 src/test/java/baseball/domain/JudgementTest.java diff --git a/src/main/java/baseball/domain/Count.java b/src/main/java/baseball/domain/Count.java new file mode 100644 index 0000000..7528632 --- /dev/null +++ b/src/main/java/baseball/domain/Count.java @@ -0,0 +1,14 @@ +package baseball.domain; + +public enum Count { + + BALL("볼 카운트"), + STRIKE("스트라이크 카운트"), + NOTHING("낫띵"); + + private String description; + + Count(String description) { + this.description = description; + } +} diff --git a/src/main/java/baseball/domain/Judgement.java b/src/main/java/baseball/domain/Judgement.java new file mode 100644 index 0000000..9dec2a2 --- /dev/null +++ b/src/main/java/baseball/domain/Judgement.java @@ -0,0 +1,30 @@ +package baseball.domain; + + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Judgement { + + public List judgeAllBalls(BallList userBalls, BallList comBalls) { + return userBalls.getBalls().stream() + .map(userBall -> judgeOneBall(userBall, comBalls)) + .collect(Collectors.toList()); + + } + + public Count judgeOneBall(Ball userBall, BallList comBalls) { + Ball comBall = comBalls.getBalls().get(userBall.getPosition()); + + if (comBall.equals(userBall)) { + return Count.STRIKE; + } + + if (comBalls.containsBall(userBall)) { + return Count.BALL; + } + + return Count.NOTHING; + } +} diff --git a/src/test/java/baseball/domain/JudgementTest.java b/src/test/java/baseball/domain/JudgementTest.java new file mode 100644 index 0000000..d36ac57 --- /dev/null +++ b/src/test/java/baseball/domain/JudgementTest.java @@ -0,0 +1,107 @@ +package baseball.domain; + + +import static org.assertj.core.api.Assertions.*; + +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class JudgementTest { + + private static Judgement judgement; + private static BallList comBalls; + + @BeforeAll + public static void setUp() { + judgement = new Judgement(); + comBalls = BallList.of( + List.of( + Ball.of(0, 4), + Ball.of(1, 5), + Ball.of(2, 6) + ) + ); + } + + @Test + @DisplayName("유저와 컴퓨터의 Ball 속성 값 중 number만 같으면 볼이다") + void test_Ball_비교_1볼() { + assertThat( + judgement.judgeOneBall( + Ball.of(0, 5), + comBalls + ) + ).isEqualTo(Count.BALL); + } + + @Test + @DisplayName("유저와 컴퓨터의 Ball 속성 값이 모두 같으면 스트라이크이다") + void test_Ball_비교_1스트라이크() { + assertThat( + judgement.judgeOneBall( + Ball.of(0, 4), + comBalls + ) + ).isEqualTo(Count.STRIKE); + } + + @Test + @DisplayName("유저와 컴퓨터의 Ball 속성 값이 모두 다르면 낫띵이다") + void test_Ball_비교_낫띵() { + assertThat( + judgement.judgeOneBall( + Ball.of(0, 3), + comBalls + ) + ).isEqualTo(Count.NOTHING); + } + + @Test + @DisplayName("유저와 컴퓨터의 BallList 요소의 속성 값이 모두 다르면 낫띵") + void test_BallList_비교_낫띵() { + BallList userBalls = BallList.of( + List.of( + Ball.of(0, 1), + Ball.of(1, 2), + Ball.of(2, 3) + ) + ); + + assertThat(judgement.judgeAllBalls(userBalls, comBalls)).isEqualTo( + List.of(Count.NOTHING, Count.NOTHING, Count.NOTHING)); + + } + + @Test + @DisplayName("유저와 컴퓨터의 BallList 요소의 속성 값 중 같은 요소가 있다면 스트라이크") + void test_BallList_비교_스트라이크() { + BallList userBalls = BallList.of( + List.of( + Ball.of(0, 4), + Ball.of(1, 2), + Ball.of(2, 3) + ) + ); + + assertThat(judgement.judgeAllBalls(userBalls, comBalls)).isEqualTo( + List.of(Count.STRIKE, Count.NOTHING, Count.NOTHING)); + } + + @Test + @DisplayName("유저와 컴퓨터의 BallList 요소의 속성 값 중 같은 포지션만 같다면 볼") + void test_BallList_비교_볼() { + BallList userBalls = BallList.of( + List.of( + Ball.of(0, 1), + Ball.of(1, 4), + Ball.of(2, 3) + ) + ); + + assertThat(judgement.judgeAllBalls(userBalls, comBalls)).isEqualTo( + List.of(Count.NOTHING, Count.BALL, Count.NOTHING)); + } +} + From 8e8f4f7d86ded3a31a5dd997c9d75ef99807f141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Mon, 21 Oct 2024 21:33:36 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=EC=88=AB=EC=9E=90=20=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=EA=B3=B5=20=ED=8C=90=EC=A0=95=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=8A=A4=EC=BD=94=EC=96=B4=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Count.java | 6 +- src/main/java/baseball/domain/Score.java | 46 +++++++++++ src/test/java/baseball/domain/ScoreTest.java | 80 ++++++++++++++++++++ 3 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 src/main/java/baseball/domain/Score.java create mode 100644 src/test/java/baseball/domain/ScoreTest.java diff --git a/src/main/java/baseball/domain/Count.java b/src/main/java/baseball/domain/Count.java index 7528632..6e3f5e3 100644 --- a/src/main/java/baseball/domain/Count.java +++ b/src/main/java/baseball/domain/Count.java @@ -2,11 +2,11 @@ public enum Count { - BALL("볼 카운트"), - STRIKE("스트라이크 카운트"), + BALL("볼"), + STRIKE("스트라이크"), NOTHING("낫띵"); - private String description; + public String description; Count(String description) { this.description = description; diff --git a/src/main/java/baseball/domain/Score.java b/src/main/java/baseball/domain/Score.java new file mode 100644 index 0000000..da8b5f3 --- /dev/null +++ b/src/main/java/baseball/domain/Score.java @@ -0,0 +1,46 @@ +package baseball.domain; + +import java.util.List; + +public class Score { + + private final long strikeCount; + private final long ballCount; + + private Score(long strikeCount, long ballCount) { + this.strikeCount = strikeCount; + this.ballCount = ballCount; + } + + public static Score from(List counts) { + long ballCount = counts.stream().filter(count -> count == Count.BALL).count(); + long strikeCount = counts.stream().filter(count -> count == Count.STRIKE).count(); + + return new Score(strikeCount, ballCount); + } + + public String getScreenMessage() { + if (isStrikeCountGreaterThanZero() && isBallCountGreaterThanZero()) { + return strikeCount + Count.STRIKE.description + " " + ballCount + Count.BALL.description; + } + + if (isStrikeCountGreaterThanZero()) { + return strikeCount + Count.STRIKE.description; + } + + if (isBallCountGreaterThanZero()) { + return ballCount + Count.BALL.description; + } + + return Count.NOTHING.description; + } + + private boolean isBallCountGreaterThanZero() { + return ballCount > 0; + } + + private boolean isStrikeCountGreaterThanZero() { + return strikeCount > 0; + } + +} diff --git a/src/test/java/baseball/domain/ScoreTest.java b/src/test/java/baseball/domain/ScoreTest.java new file mode 100644 index 0000000..44e621e --- /dev/null +++ b/src/test/java/baseball/domain/ScoreTest.java @@ -0,0 +1,80 @@ +package baseball.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +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; + +public class ScoreTest { + + @Test + @DisplayName("카운트 리스트 스코어 낫띵") + void test_스코어_낫띵() { + Score score = Score.from( + List.of( + Count.NOTHING, + Count.NOTHING, + Count.NOTHING + ) + ); + assertThat(score.getScreenMessage()).isEqualTo("낫띵"); + } + + + @ParameterizedTest + @DisplayName("카운트 리스트 스코어 스트라이크 카운트 검증") + @CsvSource(value = {"1,1스트라이크", "2,2스트라이크", "3,3스트라이크"}) + void test_스코어_스트라이크_메세지(int strikeCount, String scoreMessage) { + List ballList = new ArrayList<>(); + + for (int i = 0; i < strikeCount; i++) { + ballList.add(Count.STRIKE); + } + + while (ballList.size() < 3) { + ballList.add(Count.NOTHING); + } + + Score score = Score.from(ballList); + + assertThat(score.getScreenMessage()).isEqualTo(scoreMessage); + } + + + @ParameterizedTest + @DisplayName("카운트 리스트 스코어 볼 카운트 검증") + @CsvSource(value = {"1,1볼", "2,2볼", "3,3볼"}) + void test_스코어_볼_메세지(int ballCount, String scoreMessage) { + List ballList = new ArrayList<>(); + + for (int i = 0; i < ballCount; i++) { + ballList.add(Count.BALL); + } + + while (ballList.size() < 3) { + ballList.add(Count.NOTHING); + } + + Score score = Score.from(ballList); + + assertThat(score.getScreenMessage()).isEqualTo(scoreMessage); + } + + @Test + @DisplayName("카운트 리스트 스코어 1볼 1스트라이크") + void test_스코어_1볼_1스트라이크() { + Score score = Score.from( + List.of( + Count.BALL, + Count.STRIKE, + Count.NOTHING + ) + ); + + assertThat(score.getScreenMessage()).isEqualTo("1스트라이크 1볼"); + } +} \ No newline at end of file From 75b5d345d3b3ca488d5ef8146e2cf0c728333ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Mon, 21 Oct 2024 21:35:43 +0900 Subject: [PATCH 07/16] =?UTF-8?q?update:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=9E=84=ED=8F=AC=ED=8A=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Judgement.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/baseball/domain/Judgement.java b/src/main/java/baseball/domain/Judgement.java index 9dec2a2..9515b13 100644 --- a/src/main/java/baseball/domain/Judgement.java +++ b/src/main/java/baseball/domain/Judgement.java @@ -1,7 +1,6 @@ package baseball.domain; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; From a2738bde55d92d27689347014a1216e562ce7c16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Wed, 23 Oct 2024 12:51:00 +0900 Subject: [PATCH 08/16] =?UTF-8?q?move:=20=EB=94=94=EB=A0=89=ED=84=B0?= =?UTF-8?q?=EB=A6=AC=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/baseball/domain/{ => ball}/Ball.java | 2 +- src/main/java/baseball/domain/{ => ball}/BallList.java | 2 +- src/test/java/baseball/domain/BallListTest.java | 2 ++ src/test/java/baseball/domain/BallTest.java | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) rename src/main/java/baseball/domain/{ => ball}/Ball.java (98%) rename src/main/java/baseball/domain/{ => ball}/BallList.java (95%) diff --git a/src/main/java/baseball/domain/Ball.java b/src/main/java/baseball/domain/ball/Ball.java similarity index 98% rename from src/main/java/baseball/domain/Ball.java rename to src/main/java/baseball/domain/ball/Ball.java index b6a2351..aa51f03 100644 --- a/src/main/java/baseball/domain/Ball.java +++ b/src/main/java/baseball/domain/ball/Ball.java @@ -1,4 +1,4 @@ -package baseball.domain; +package baseball.domain.ball; import java.util.Objects; diff --git a/src/main/java/baseball/domain/BallList.java b/src/main/java/baseball/domain/ball/BallList.java similarity index 95% rename from src/main/java/baseball/domain/BallList.java rename to src/main/java/baseball/domain/ball/BallList.java index 966227c..9088f77 100644 --- a/src/main/java/baseball/domain/BallList.java +++ b/src/main/java/baseball/domain/ball/BallList.java @@ -1,4 +1,4 @@ -package baseball.domain; +package baseball.domain.ball; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/baseball/domain/BallListTest.java b/src/test/java/baseball/domain/BallListTest.java index 2639b2b..6bc3792 100644 --- a/src/test/java/baseball/domain/BallListTest.java +++ b/src/test/java/baseball/domain/BallListTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.*; +import baseball.domain.ball.Ball; +import baseball.domain.ball.BallList; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/baseball/domain/BallTest.java b/src/test/java/baseball/domain/BallTest.java index b650274..4ab8588 100644 --- a/src/test/java/baseball/domain/BallTest.java +++ b/src/test/java/baseball/domain/BallTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.*; +import baseball.domain.ball.Ball; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; From 8afac0fbfe9b32468fb0065166fd7cf84c41da3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Wed, 23 Oct 2024 12:51:58 +0900 Subject: [PATCH 09/16] =?UTF-8?q?move:=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=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/baseball/domain/Judgement.java | 4 +++- src/main/java/baseball/domain/Score.java | 1 + src/main/java/baseball/domain/{ => count}/Count.java | 2 +- src/test/java/baseball/domain/JudgementTest.java | 3 +++ src/test/java/baseball/domain/ScoreTest.java | 1 + 5 files changed, 9 insertions(+), 2 deletions(-) rename src/main/java/baseball/domain/{ => count}/Count.java (86%) diff --git a/src/main/java/baseball/domain/Judgement.java b/src/main/java/baseball/domain/Judgement.java index 9515b13..f03b4ba 100644 --- a/src/main/java/baseball/domain/Judgement.java +++ b/src/main/java/baseball/domain/Judgement.java @@ -1,6 +1,9 @@ package baseball.domain; +import baseball.domain.ball.Ball; +import baseball.domain.ball.BallList; +import baseball.domain.count.Count; import java.util.List; import java.util.stream.Collectors; @@ -10,7 +13,6 @@ public List judgeAllBalls(BallList userBalls, BallList comBalls) { return userBalls.getBalls().stream() .map(userBall -> judgeOneBall(userBall, comBalls)) .collect(Collectors.toList()); - } public Count judgeOneBall(Ball userBall, BallList comBalls) { diff --git a/src/main/java/baseball/domain/Score.java b/src/main/java/baseball/domain/Score.java index da8b5f3..b7d5aaa 100644 --- a/src/main/java/baseball/domain/Score.java +++ b/src/main/java/baseball/domain/Score.java @@ -1,5 +1,6 @@ package baseball.domain; +import baseball.domain.count.Count; import java.util.List; public class Score { diff --git a/src/main/java/baseball/domain/Count.java b/src/main/java/baseball/domain/count/Count.java similarity index 86% rename from src/main/java/baseball/domain/Count.java rename to src/main/java/baseball/domain/count/Count.java index 6e3f5e3..c4dd35a 100644 --- a/src/main/java/baseball/domain/Count.java +++ b/src/main/java/baseball/domain/count/Count.java @@ -1,4 +1,4 @@ -package baseball.domain; +package baseball.domain.count; public enum Count { diff --git a/src/test/java/baseball/domain/JudgementTest.java b/src/test/java/baseball/domain/JudgementTest.java index d36ac57..0baab1e 100644 --- a/src/test/java/baseball/domain/JudgementTest.java +++ b/src/test/java/baseball/domain/JudgementTest.java @@ -3,6 +3,9 @@ import static org.assertj.core.api.Assertions.*; +import baseball.domain.ball.Ball; +import baseball.domain.ball.BallList; +import baseball.domain.count.Count; import java.util.List; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/baseball/domain/ScoreTest.java b/src/test/java/baseball/domain/ScoreTest.java index 44e621e..2e1eefa 100644 --- a/src/test/java/baseball/domain/ScoreTest.java +++ b/src/test/java/baseball/domain/ScoreTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import baseball.domain.count.Count; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.DisplayName; From 99cec6995bedd4c6f199691a998f821758384185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Wed, 23 Oct 2024 22:28:40 +0900 Subject: [PATCH 10/16] =?UTF-8?q?update:=20=EB=8F=99=EB=93=B1=EC=84=B1=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=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 --- .../java/baseball/domain/ball/BallList.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/baseball/domain/ball/BallList.java b/src/main/java/baseball/domain/ball/BallList.java index 9088f77..51a0077 100644 --- a/src/main/java/baseball/domain/ball/BallList.java +++ b/src/main/java/baseball/domain/ball/BallList.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class BallList { @@ -31,4 +32,20 @@ public boolean containsBall(Ball ball) { } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BallList ballList = (BallList) o; + return Objects.equals(balls, ballList.balls); + } + + @Override + public int hashCode() { + return Objects.hashCode(balls); + } } From 08473522f3578d0161ceeb277b510167ee4cad52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Wed, 23 Oct 2024 22:29:11 +0900 Subject: [PATCH 11/16] =?UTF-8?q?test:=20=EC=98=88=EC=99=B8=20=EC=98=B5?= =?UTF-8?q?=EC=85=98=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=83=81=EC=88=98?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/domain/BallListTest.java | 7 +++++-- src/test/java/baseball/domain/BallTest.java | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/test/java/baseball/domain/BallListTest.java b/src/test/java/baseball/domain/BallListTest.java index 6bc3792..a4131a8 100644 --- a/src/test/java/baseball/domain/BallListTest.java +++ b/src/test/java/baseball/domain/BallListTest.java @@ -4,6 +4,7 @@ import baseball.domain.ball.Ball; import baseball.domain.ball.BallList; +import baseball.shared.MESSAGES; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -21,7 +22,8 @@ public class BallListTest { Ball.of(3, 4) ))) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("BallNumber는 3개가 최대 입니다."); + .hasMessage(MESSAGES.BALL_LIST_INSTANCE_ERROR.getMessage()); + } @Test @@ -32,6 +34,7 @@ public class BallListTest { Ball.of(1, 2) ))) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("BallNumber는 3개가 최대 입니다."); + .hasMessage(MESSAGES.BALL_LIST_INSTANCE_ERROR.getMessage()); + } } diff --git a/src/test/java/baseball/domain/BallTest.java b/src/test/java/baseball/domain/BallTest.java index 4ab8588..86f492e 100644 --- a/src/test/java/baseball/domain/BallTest.java +++ b/src/test/java/baseball/domain/BallTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.*; import baseball.domain.ball.Ball; +import baseball.shared.MESSAGES; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -18,7 +19,8 @@ public class BallTest { Ball.of(position, number); }) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("올바르지 않은 입력입니다."); + .hasMessage(MESSAGES.BALL_INSTANCE_ERROR.getMessage()); + } @Test @@ -26,7 +28,8 @@ public class BallTest { void test_Ball_객체_position_인자_오류() { assertThatThrownBy(() -> Ball.of(-1, 1)) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("올바르지 않은 입력입니다."); + .hasMessage(MESSAGES.BALL_INSTANCE_ERROR.getMessage()); + } @ParameterizedTest From dc6a8ad142459f9386ddfd559c3e64ea353c8eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Wed, 23 Oct 2024 23:18:10 +0900 Subject: [PATCH 12/16] =?UTF-8?q?refactor:=20=EC=8A=A4=EC=BD=94=EC=96=B4?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=EC=97=90=EC=84=9C=20=EC=B9=B4=EC=9A=B4?= =?UTF-8?q?=ED=8A=B8=20=EA=B3=84=EC=82=B0=20=EC=8B=9D=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20=EB=B0=8F=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EC=9D=BC=EA=B8=89?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=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/baseball/domain/Score.java | 27 ++++----- .../java/baseball/domain/count/Counts.java | 44 ++++++++++++++ src/test/java/baseball/domain/ScoreTest.java | 58 +++++++++++++------ 3 files changed, 95 insertions(+), 34 deletions(-) create mode 100644 src/main/java/baseball/domain/count/Counts.java diff --git a/src/main/java/baseball/domain/Score.java b/src/main/java/baseball/domain/Score.java index b7d5aaa..56ae9c9 100644 --- a/src/main/java/baseball/domain/Score.java +++ b/src/main/java/baseball/domain/Score.java @@ -1,47 +1,42 @@ package baseball.domain; import baseball.domain.count.Count; -import java.util.List; +import baseball.domain.count.Counts; public class Score { - private final long strikeCount; - private final long ballCount; + private final Counts counts; - private Score(long strikeCount, long ballCount) { - this.strikeCount = strikeCount; - this.ballCount = ballCount; + private Score(Counts counts) { + this.counts = counts; } - public static Score from(List counts) { - long ballCount = counts.stream().filter(count -> count == Count.BALL).count(); - long strikeCount = counts.stream().filter(count -> count == Count.STRIKE).count(); - - return new Score(strikeCount, ballCount); + public static Score from(Counts counts) { + return new Score(counts); } public String getScreenMessage() { if (isStrikeCountGreaterThanZero() && isBallCountGreaterThanZero()) { - return strikeCount + Count.STRIKE.description + " " + ballCount + Count.BALL.description; + return counts.getStrikeCount() + Count.STRIKE.description + " " + counts.getBallCount() + Count.BALL.description; } if (isStrikeCountGreaterThanZero()) { - return strikeCount + Count.STRIKE.description; + return counts.getStrikeCount() + Count.STRIKE.description; } if (isBallCountGreaterThanZero()) { - return ballCount + Count.BALL.description; + return counts.getBallCount() + Count.BALL.description; } return Count.NOTHING.description; } private boolean isBallCountGreaterThanZero() { - return ballCount > 0; + return counts.getBallCount() > 0; } private boolean isStrikeCountGreaterThanZero() { - return strikeCount > 0; + return counts.getStrikeCount() > 0; } } diff --git a/src/main/java/baseball/domain/count/Counts.java b/src/main/java/baseball/domain/count/Counts.java new file mode 100644 index 0000000..f0fe0dc --- /dev/null +++ b/src/main/java/baseball/domain/count/Counts.java @@ -0,0 +1,44 @@ +package baseball.domain.count; + +import java.util.List; +import java.util.Objects; + +public class Counts { + + private final long strikeCount; + private final long ballCount; + + private Counts(List counts) { + this.strikeCount = counts.stream().filter(count -> count == Count.STRIKE).count(); + this.ballCount = counts.stream().filter(count -> count == Count.BALL).count(); + } + + public static Counts of(Count first, Count second, Count third) { + return new Counts(List.of(first, second, third)); + } + + public long getStrikeCount() { + return strikeCount; + } + + public long getBallCount() { + return ballCount; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Counts counts = (Counts) o; + return strikeCount == counts.strikeCount && ballCount == counts.ballCount; + } + + @Override + public int hashCode() { + return Objects.hash(strikeCount, ballCount); + } +} diff --git a/src/test/java/baseball/domain/ScoreTest.java b/src/test/java/baseball/domain/ScoreTest.java index 2e1eefa..29e4383 100644 --- a/src/test/java/baseball/domain/ScoreTest.java +++ b/src/test/java/baseball/domain/ScoreTest.java @@ -1,10 +1,12 @@ package baseball.domain; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.*; import baseball.domain.count.Count; +import baseball.domain.count.Counts; import java.util.ArrayList; import java.util.List; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -12,11 +14,30 @@ public class ScoreTest { + private List setCounts; + + @BeforeEach + void setUp() { + setCounts = new ArrayList<>(); + setCounts.add(Count.NOTHING); + setCounts.add(Count.NOTHING); + setCounts.add(Count.NOTHING); + } + + @Test + @DisplayName("Counts 객체는 매번 새로운 인스턴스가 생성되어야 한다") + void test_counts_객체_생성_검증() { + Counts counts1 = Counts.of(Count.NOTHING, Count.NOTHING, Count.NOTHING); + Counts counts2 = Counts.of(Count.NOTHING, Count.NOTHING, Count.NOTHING); + + assertThat(counts1).isNotSameAs(counts2); + } + @Test @DisplayName("카운트 리스트 스코어 낫띵") void test_스코어_낫띵() { Score score = Score.from( - List.of( + Counts.of( Count.NOTHING, Count.NOTHING, Count.NOTHING @@ -30,17 +51,17 @@ public class ScoreTest { @DisplayName("카운트 리스트 스코어 스트라이크 카운트 검증") @CsvSource(value = {"1,1스트라이크", "2,2스트라이크", "3,3스트라이크"}) void test_스코어_스트라이크_메세지(int strikeCount, String scoreMessage) { - List ballList = new ArrayList<>(); - for (int i = 0; i < strikeCount; i++) { - ballList.add(Count.STRIKE); - } - - while (ballList.size() < 3) { - ballList.add(Count.NOTHING); + setCounts.set(i, Count.STRIKE); } - Score score = Score.from(ballList); + Score score = Score.from( + Counts.of( + setCounts.get(0), + setCounts.get(1), + setCounts.get(2) + ) + ); assertThat(score.getScreenMessage()).isEqualTo(scoreMessage); } @@ -50,17 +71,18 @@ public class ScoreTest { @DisplayName("카운트 리스트 스코어 볼 카운트 검증") @CsvSource(value = {"1,1볼", "2,2볼", "3,3볼"}) void test_스코어_볼_메세지(int ballCount, String scoreMessage) { - List ballList = new ArrayList<>(); for (int i = 0; i < ballCount; i++) { - ballList.add(Count.BALL); + setCounts.set(i, Count.BALL); } - while (ballList.size() < 3) { - ballList.add(Count.NOTHING); - } - - Score score = Score.from(ballList); + Score score = Score.from( + Counts.of( + setCounts.get(0), + setCounts.get(1), + setCounts.get(2) + ) + ); assertThat(score.getScreenMessage()).isEqualTo(scoreMessage); } @@ -69,7 +91,7 @@ public class ScoreTest { @DisplayName("카운트 리스트 스코어 1볼 1스트라이크") void test_스코어_1볼_1스트라이크() { Score score = Score.from( - List.of( + Counts.of( Count.BALL, Count.STRIKE, Count.NOTHING From 92d33c2a553a5ade65f888226b4522fe9a74ec99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Wed, 23 Oct 2024 23:18:47 +0900 Subject: [PATCH 13/16] =?UTF-8?q?feat:=20=EC=88=AB=EC=9E=90=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=EA=B2=8C=EC=9E=84=20=EC=96=B4=ED=94=8C=EB=A6=AC?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=85=98=20=EC=9C=A0=ED=8B=B8=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/util/BaseballUtils.java | 19 ++++++++++++++++ .../java/baseball/util/BaseballUtilTest.java | 22 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/main/java/baseball/util/BaseballUtils.java create mode 100644 src/test/java/baseball/util/BaseballUtilTest.java diff --git a/src/main/java/baseball/util/BaseballUtils.java b/src/main/java/baseball/util/BaseballUtils.java new file mode 100644 index 0000000..b0aa9d1 --- /dev/null +++ b/src/main/java/baseball/util/BaseballUtils.java @@ -0,0 +1,19 @@ +package baseball.util; + +import java.util.List; +import java.util.stream.Collectors; + +public class BaseballUtils { + + public static List splitByBlank(String number) { + + return List.of(number.split("")); + } + + + public static List convertDataTypesIntoListData(List strings) { + return strings.stream() + .map(Integer::parseInt) + .collect(Collectors.toList()); + } +} diff --git a/src/test/java/baseball/util/BaseballUtilTest.java b/src/test/java/baseball/util/BaseballUtilTest.java new file mode 100644 index 0000000..8f1de43 --- /dev/null +++ b/src/test/java/baseball/util/BaseballUtilTest.java @@ -0,0 +1,22 @@ +package baseball.util; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class BaseballUtilTest { + + @Test + @DisplayName("3개의 숫자를 입력 하면 문자열 리스트를 반환한다") + void test_문자열을_리스트로_변환() { + assertThat(BaseballUtils.splitByBlank("123")).isEqualTo(List.of("1", "2", "3")); + } + + @Test + @DisplayName("리스트 객체의 요소 타입을 문자열에서 숫자형으로 변환한다") + void test_리스트_요소_타입변경() { + assertThat(BaseballUtils.convertDataTypesIntoListData(List.of("1", "2", "3"))).isEqualTo(List.of(1, 2, 3)); + } +} From 6b7949684f8aca4ce2411d5dd35328a933f437c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Wed, 23 Oct 2024 23:19:02 +0900 Subject: [PATCH 14/16] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=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/baseball/domain/User.java | 41 ++++++++++++++++++ src/test/java/baseball/domain/UserTest.java | 47 +++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/baseball/domain/User.java create mode 100644 src/test/java/baseball/domain/UserTest.java diff --git a/src/main/java/baseball/domain/User.java b/src/main/java/baseball/domain/User.java new file mode 100644 index 0000000..d93f097 --- /dev/null +++ b/src/main/java/baseball/domain/User.java @@ -0,0 +1,41 @@ +package baseball.domain; + +import baseball.domain.ball.Ball; +import baseball.domain.ball.BallList; +import baseball.shared.MESSAGES; +import baseball.util.BaseballUtils; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class User { + + private final BallList balls; + + private User(List balls) { + this.balls = convertStringsToBallList(balls); + } + + public static User of(String ballNumbers) { + if (ballNumbers.length() != 3) { + throw new IllegalArgumentException(MESSAGES.USER_INSTANCE_ERROR_MESSAGE.getMessage()); + } + + List ballStringNumbers = BaseballUtils.splitByBlank(ballNumbers); + List ballIntegerNumbers = BaseballUtils.convertDataTypesIntoListData(ballStringNumbers); + + return new User(ballIntegerNumbers); + } + + public BallList toBallList() { + return balls; + } + + private BallList convertStringsToBallList(List ballNumbers) { + List ballList = IntStream.range(0, ballNumbers.size()) + .mapToObj(position -> Ball.of(position, ballNumbers.get(position))) + .collect(Collectors.toList()); + return BallList.of(ballList); + + } +} diff --git a/src/test/java/baseball/domain/UserTest.java b/src/test/java/baseball/domain/UserTest.java new file mode 100644 index 0000000..00dadc3 --- /dev/null +++ b/src/test/java/baseball/domain/UserTest.java @@ -0,0 +1,47 @@ +package baseball.domain; + +import static org.assertj.core.api.Assertions.*; + +import baseball.shared.MESSAGES; +import baseball.domain.ball.Ball; +import baseball.domain.ball.BallList; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class UserTest { + + @ParameterizedTest + @DisplayName("유저는 문자열 타입의 숫자 3개를 입력 받아야한다") + @ValueSource(strings = {"1", "12", "1234"}) + void test_유저_유효성_검증(String ballNumber) { + + assertThatThrownBy(() -> { + User.of(ballNumber); + } + ) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(MESSAGES.USER_INSTANCE_ERROR_MESSAGE.getMessage()); + } + + @Test + @DisplayName("유저는 문자열 타입의 숫자 3개를 입력 받아 BallList 값의 동등성이 보장된다") + void test_유저_볼_동등성_검증() { + assertThat(User.of("123").toBallList()).isEqualTo( + BallList.of(List.of(Ball.of(0, 1), Ball.of(1, 2), Ball.of(2, 3))) + ); + } + + + @Test + @DisplayName("유저는 문자열 타입의 숫자를 입력 받으면 숫자 자료형으로 변환 하여 Ball 객체를 생성한다") + void test_유저_볼_자료형_검증() { + List userBalls = User.of("123").toBallList().getBalls(); + + assertThat(userBalls).extracting(Ball::getNumber).containsExactly(1, 2, 3); + } + +} + From cfe89cb23cd277196e65f1211dc8e2ac2f9c9ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Wed, 23 Oct 2024 23:19:22 +0900 Subject: [PATCH 15/16] =?UTF-8?q?feat:=20=EC=97=90=EB=9F=AC=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=83=81=EC=88=98=20=EA=B0=9D=EC=B2=B4=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/baseball/shared/MESSAGES.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/baseball/shared/MESSAGES.java diff --git a/src/main/java/baseball/shared/MESSAGES.java b/src/main/java/baseball/shared/MESSAGES.java new file mode 100644 index 0000000..3b7bae5 --- /dev/null +++ b/src/main/java/baseball/shared/MESSAGES.java @@ -0,0 +1,17 @@ +package baseball.shared; + +public enum MESSAGES { + USER_INSTANCE_ERROR_MESSAGE("3개의 숫자를 입력하세요"), + BALL_INSTANCE_ERROR("올바르지 않은 입력입니다."), + BALL_LIST_INSTANCE_ERROR("BallNumber는 3개가 최대 입니다."); + + private String message; + + MESSAGES(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} From 0172b63c633c86e051fd3ff40fca21f9af1ba8bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=ED=99=98?= <118493627+LeeJuHwan@users.noreply.github.com> Date: Thu, 24 Oct 2024 21:08:53 +0900 Subject: [PATCH 16/16] =?UTF-8?q?update:=20=EC=97=90=EB=9F=AC=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/ball/Ball.java | 3 ++- src/main/java/baseball/domain/ball/BallList.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/domain/ball/Ball.java b/src/main/java/baseball/domain/ball/Ball.java index aa51f03..f8bfccf 100644 --- a/src/main/java/baseball/domain/ball/Ball.java +++ b/src/main/java/baseball/domain/ball/Ball.java @@ -1,5 +1,6 @@ package baseball.domain.ball; +import baseball.shared.MESSAGES; import java.util.Objects; public class Ball { @@ -11,7 +12,7 @@ public class Ball { private Ball(int position, int number) { if (ballPositionValidation(position) || ballNumberValidation(number)) { - throw new IllegalArgumentException("올바르지 않은 입력입니다."); + throw new IllegalArgumentException(MESSAGES.BALL_INSTANCE_ERROR.getMessage()); } this.position = position; diff --git a/src/main/java/baseball/domain/ball/BallList.java b/src/main/java/baseball/domain/ball/BallList.java index 51a0077..6a95853 100644 --- a/src/main/java/baseball/domain/ball/BallList.java +++ b/src/main/java/baseball/domain/ball/BallList.java @@ -1,5 +1,6 @@ package baseball.domain.ball; +import baseball.shared.MESSAGES; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -16,7 +17,7 @@ public List getBalls() { private BallList(List balls) { if (balls.size() != MAX_SIZE) { - throw new IllegalArgumentException("BallNumber는 3개가 최대 입니다."); + throw new IllegalArgumentException(MESSAGES.BALL_LIST_INSTANCE_ERROR.getMessage()); } this.balls = balls;