From 10f15f16d617c886fe071c9d9e17f1c7fe2e8a24 Mon Sep 17 00:00:00 2001 From: smileeeey Date: Sun, 16 Mar 2025 21:36:41 +0900 Subject: [PATCH 1/2] =?UTF-8?q?step3)=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EA=B2=BD=EC=A3=BC=20=EA=B2=8C=EC=9E=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++ build.gradle | 1 + .../exception/NegativeNumberException.java | 5 ++ src/main/java/racingCar/CarRacingGame.java | 62 +++++++++++++++++++ src/main/java/racingCar/InputView.java | 16 +++++ src/main/java/racingCar/NumberVerifier.java | 11 ++++ src/main/java/racingCar/RacingCar.java | 38 ++++++++++++ src/main/java/racingCar/ResultView.java | 14 +++++ .../java/racingCar/CarRacingGameTest.java | 40 ++++++++++++ src/test/java/racingCar/RacingCarTest.java | 37 +++++++++++ 10 files changed, 230 insertions(+) create mode 100644 src/main/java/exception/NegativeNumberException.java create mode 100644 src/main/java/racingCar/CarRacingGame.java create mode 100644 src/main/java/racingCar/InputView.java create mode 100644 src/main/java/racingCar/NumberVerifier.java create mode 100644 src/main/java/racingCar/RacingCar.java create mode 100644 src/main/java/racingCar/ResultView.java create mode 100644 src/test/java/racingCar/CarRacingGameTest.java create mode 100644 src/test/java/racingCar/RacingCarTest.java diff --git a/README.md b/README.md index c550c4c2a09..b6b76113d65 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,10 @@ # 자동차 경주 게임 + +## 기능 목록 +* 게임 참가자의 이름을 입력받는다. 이름의 구분자는 쉼표(,)이고, 이름이 5자가 넘어가면 NameLengthExceededException을 발생시키고 이름을 다시 입력받도록 한다. +* 자동차별로 random값을 만들고, 그 숫자가 4 이상이면 전진한다. +* 전진칸수가 최대값인 자동차가 우승자이다. 공동우승이 가능하다. + ## 진행 방법 * 자동차 경주 게임 요구사항을 파악한다. * 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다. diff --git a/build.gradle b/build.gradle index 6282254c4ce..57f1315cfd8 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.22.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' + testImplementation 'org.mockito:mockito-core:4.8.1' } java { diff --git a/src/main/java/exception/NegativeNumberException.java b/src/main/java/exception/NegativeNumberException.java new file mode 100644 index 00000000000..89af88664f4 --- /dev/null +++ b/src/main/java/exception/NegativeNumberException.java @@ -0,0 +1,5 @@ +package exception; + +public class NegativeNumberException extends RuntimeException { + public NegativeNumberException() { super("negative number is not allowed."); } +} diff --git a/src/main/java/racingCar/CarRacingGame.java b/src/main/java/racingCar/CarRacingGame.java new file mode 100644 index 00000000000..31c92424436 --- /dev/null +++ b/src/main/java/racingCar/CarRacingGame.java @@ -0,0 +1,62 @@ +package racingCar; + +public class CarRacingGame { + private final InputView inputView; + private final ResultView resultView; + private final NumberVerifier numberVerifier; + + public CarRacingGame(InputView inputView, ResultView resultView, NumberVerifier numberVerifier) { + this.inputView = inputView; + this.resultView = resultView; + this.numberVerifier = numberVerifier; + } + + public static void main(String[] args) { + InputView inputView = new InputView(); + ResultView resultView = new ResultView(); + NumberVerifier numberVerifier = new NumberVerifier(); + CarRacingGame game = new CarRacingGame(inputView, resultView, numberVerifier); + game.startGame(); + } + + private void startGame() { + RacingCar[] cars = getParticipant(); + + play(cars, inputView.requestPlayCount()); + } + + private RacingCar[] getParticipant() { + while (true) { + int participantCount = inputView.requestParticipant(); + try { + validateNum(participantCount); + return createRacingCars(participantCount); + } catch (NumberFormatException e) { + System.out.println(e.getMessage()); + throw e; + } + } + } + + void validateNum(int num) { + numberVerifier.verify(num); + } + + RacingCar[] createRacingCars(int count) { + return new RacingCar[count]; + } + + private void play(RacingCar[] cars, int count) { + resultView.printResultTitle(); + for (int i=0 ; i carRacingGame.validateNum(TEST_COUNT)); + } + + @Test + void testValidateNames_invalidNames() { + int TEST_COUNT = 3; + assertThrows(NumberFormatException.class, () -> carRacingGame.validateNum(TEST_COUNT)); + } + + @Test + void testCreateRacingCars() { + int TEST_COUNT = 3; + RacingCar[] createdCars = carRacingGame.createRacingCars(TEST_COUNT); + assertEquals(3, createdCars.length); + } +} diff --git a/src/test/java/racingCar/RacingCarTest.java b/src/test/java/racingCar/RacingCarTest.java new file mode 100644 index 00000000000..b6100707e60 --- /dev/null +++ b/src/test/java/racingCar/RacingCarTest.java @@ -0,0 +1,37 @@ +package racingCar; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.*; + +class RacingCarTest { + + private RacingCar car; + + @BeforeEach + void setUp() { + car = spy(new RacingCar(0)); + } + + @Test + void makeRandomNum() { + int random = car.makeRandomNum(); + assertTrue(random >= 0 && random <= 9); + } + + @Test + void progress() { + // given + doReturn(4).when(car).makeRandomNum(); + int expected = car.getPos()+1; + + // when + car.progress(); + + // then + assertEquals(expected, car.getPos()); + } +} From d5b4466bced4de8b1e26f107a6acf2521e66a2e0 Mon Sep 17 00:00:00 2001 From: smileeeey Date: Thu, 20 Mar 2025 21:31:31 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingCar/CarRacingGame.java | 18 +++++------ src/main/java/racingCar/RacingCar.java | 32 +++++++------------ .../java/racingCar/RandomNumberGenerator.java | 10 ++++++ src/main/java/racingCar/ResultView.java | 2 +- .../java/racingCar/CarRacingGameTest.java | 25 +++------------ .../java/racingCar/NumberVerifierTest.java | 28 ++++++++++++++++ src/test/java/racingCar/RacingCarTest.java | 19 +++-------- .../racingCar/RandomNumberGeneratorTest.java | 17 ++++++++++ 8 files changed, 86 insertions(+), 65 deletions(-) create mode 100644 src/main/java/racingCar/RandomNumberGenerator.java create mode 100644 src/test/java/racingCar/NumberVerifierTest.java create mode 100644 src/test/java/racingCar/RandomNumberGeneratorTest.java diff --git a/src/main/java/racingCar/CarRacingGame.java b/src/main/java/racingCar/CarRacingGame.java index 31c92424436..e253b77de35 100644 --- a/src/main/java/racingCar/CarRacingGame.java +++ b/src/main/java/racingCar/CarRacingGame.java @@ -26,15 +26,13 @@ private void startGame() { } private RacingCar[] getParticipant() { - while (true) { - int participantCount = inputView.requestParticipant(); - try { - validateNum(participantCount); - return createRacingCars(participantCount); - } catch (NumberFormatException e) { - System.out.println(e.getMessage()); - throw e; - } + int participantCount = inputView.requestParticipant(); + try { + validateNum(participantCount); + return createRacingCars(participantCount); + } catch (NumberFormatException e) { + System.out.println(e.getMessage()); + throw e; } } @@ -48,7 +46,7 @@ RacingCar[] createRacingCars(int count) { private void play(RacingCar[] cars, int count) { resultView.printResultTitle(); - for (int i=0 ; i carRacingGame.validateNum(TEST_COUNT)); - } - - @Test - void testValidateNames_invalidNames() { - int TEST_COUNT = 3; - assertThrows(NumberFormatException.class, () -> carRacingGame.validateNum(TEST_COUNT)); + InputView inputView = new InputView(); + ResultView resultView = new ResultView(); + NumberVerifier numberVerifier = new NumberVerifier(); + carRacingGame = new CarRacingGame(inputView, resultView, numberVerifier); } @Test diff --git a/src/test/java/racingCar/NumberVerifierTest.java b/src/test/java/racingCar/NumberVerifierTest.java new file mode 100644 index 00000000000..90797ba7972 --- /dev/null +++ b/src/test/java/racingCar/NumberVerifierTest.java @@ -0,0 +1,28 @@ +package racingCar; + +import exception.NegativeNumberException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class NumberVerifierTest { + + @Test + public void testVerify_WithPositiveNumber() { + NumberVerifier verifier = new NumberVerifier(); + verifier.verify(5); + } + + @Test + public void testVerify_WithZero_ShouldThrowException() { + NumberVerifier verifier = new NumberVerifier(); + assertThrows(NegativeNumberException.class, () -> verifier.verify(0)); + } + + @Test + public void testVerify_WithNegativeNumber_ShouldThrowException() { + NumberVerifier verifier = new NumberVerifier(); + assertThrows(NegativeNumberException.class, () -> verifier.verify(-1)); + } +} + diff --git a/src/test/java/racingCar/RacingCarTest.java b/src/test/java/racingCar/RacingCarTest.java index b6100707e60..4000d782120 100644 --- a/src/test/java/racingCar/RacingCarTest.java +++ b/src/test/java/racingCar/RacingCarTest.java @@ -4,34 +4,25 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.*; class RacingCarTest { private RacingCar car; + RandomNumberGenerator mockGenerator = mock(RandomNumberGenerator.class); @BeforeEach void setUp() { - car = spy(new RacingCar(0)); - } - - @Test - void makeRandomNum() { - int random = car.makeRandomNum(); - assertTrue(random >= 0 && random <= 9); + car = spy(new RacingCar(0, mockGenerator)); } @Test void progress() { - // given - doReturn(4).when(car).makeRandomNum(); - int expected = car.getPos()+1; + when(mockGenerator.makeRandomNumber()).thenReturn(4); + int expected = car.getPosition() + 1; - // when car.progress(); - // then - assertEquals(expected, car.getPos()); + assertEquals(expected, car.getPosition()); } } diff --git a/src/test/java/racingCar/RandomNumberGeneratorTest.java b/src/test/java/racingCar/RandomNumberGeneratorTest.java new file mode 100644 index 00000000000..c2911f928ca --- /dev/null +++ b/src/test/java/racingCar/RandomNumberGeneratorTest.java @@ -0,0 +1,17 @@ +package racingCar; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class RandomNumberGeneratorTest { + @Test + public void testMakeRandomNumber_WithMock() { + RandomNumberGenerator mockGenerator = mock(RandomNumberGenerator.class); + when(mockGenerator.makeRandomNumber()).thenReturn(4); + + assertEquals(4, mockGenerator.makeRandomNumber()); + verify(mockGenerator).makeRandomNumber(); + } +}