From 102238e1e033a8f2a86cce647c2cf2fa264c2de2 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sat, 8 Jun 2024 23:49:12 +0900 Subject: [PATCH 01/31] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=98=88=EC=A0=95=20=EB=AA=A9=EB=A1=9D=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 --- README.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 491aece1..e103ed8c 100644 --- a/README.md +++ b/README.md @@ -1 +1,24 @@ -# java-racingcar-precourse \ No newline at end of file +# java-racingcar-precourse + +- [ ] 차량 클래스 + - [ ] 차량 이동 + - [ ] 유닛 테스팅 +- [ ] 레이싱 트랙 + - [ ] 경기 참여 차량 저장 + - [ ] 유닛 테스팅 + - [ ] 우승자 업데이트 + - [ ] 유닛 테스팅 + - [ ] 경기 단계 진행 및 단계 결과 반환 + - [ ] 유닛 테스팅 +- [ ] GameController + - [ ] Input 처리 + - [ ] 이름 파싱 + - [ ] 유닛 테스팅 + - [ ] 시행 횟수 형변환 + - [ ] 유닛 테스팅 + - [ ] Output 처리 +- [ ] 예외 처리 + - [ ] 차량 이름이 5자 이상 일때 ( ExcessiveParticipantsNameException ) + - [ ] 유닛 테스팅 + - [ ] 게임 시행 횟수 타입 (WrongCountTypeException) + - [ ] 유닛 테스팅 From c5bae0853ee838b9a590f78c024aebae6c6260f8 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 13:12:29 +0900 Subject: [PATCH 02/31] =?UTF-8?q?feat:=20Car=ED=81=B4=EB=9E=98=EC=8A=A4=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/.gitkeep | 0 src/main/java/domain/Car.java | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) delete mode 100644 src/main/java/.gitkeep create mode 100644 src/main/java/domain/Car.java diff --git a/src/main/java/.gitkeep b/src/main/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java new file mode 100644 index 00000000..ce50e511 --- /dev/null +++ b/src/main/java/domain/Car.java @@ -0,0 +1,35 @@ +package domain; + +public class Car { + private String name; + private Integer position; + + public Car(String name, Integer position) { + setName(name); + this.position = position; + } + + private void setName(String name){ + // ToDo: 다른 이름형식 제한 예정 + if(name.length() > 5){ + // TODO: ExcessiveParticipantsNameException + throw new IllegalArgumentException("[Error]: 자동차의 이름이 6자 이상입니다."); + } + this.name = name; + } + + public String getName() { + return name; + } + + public Integer getPosition() { + return position; + } + + public Integer move(Integer seed){ + if(seed > 3){ + this.position ++; + } + return this.getPosition(); + } +} From 83f885396bc5ddfa0dda68e3932d7295026af683 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 13:15:00 +0900 Subject: [PATCH 03/31] =?UTF-8?q?feat:=20Track=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=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/Track.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/domain/Track.java diff --git a/src/main/java/domain/Track.java b/src/main/java/domain/Track.java new file mode 100644 index 00000000..d21519db --- /dev/null +++ b/src/main/java/domain/Track.java @@ -0,0 +1,12 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class Track { + private final List cars; + + public Track() { + this.cars = new ArrayList<>(); + } +} From 3d510c3fd0822e2c02564c8cdd4368fdf43d1671 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 13:18:50 +0900 Subject: [PATCH 04/31] =?UTF-8?q?fix:=20Car=ED=81=B4=EB=9E=98=EC=8A=A4=20P?= =?UTF-8?q?osition=20=EA=B8=B0=EB=B3=B8=EA=B0=92=200=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=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/Car.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index ce50e511..d4f551ec 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -4,9 +4,9 @@ public class Car { private String name; private Integer position; - public Car(String name, Integer position) { + public Car(String name) { setName(name); - this.position = position; + this.position = 0; } private void setName(String name){ From 4893d64772b3e76aa4888db4c1ae3a1b7d4fcbdd Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 13:21:23 +0900 Subject: [PATCH 05/31] =?UTF-8?q?feat:=20=EC=B0=A8=EB=9F=89=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EA=B8=B0=EB=8A=A5=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/Track.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/domain/Track.java b/src/main/java/domain/Track.java index d21519db..577ca6d0 100644 --- a/src/main/java/domain/Track.java +++ b/src/main/java/domain/Track.java @@ -9,4 +9,8 @@ public class Track { public Track() { this.cars = new ArrayList<>(); } + + public void addCar(String carName){ + cars.add(new Car(carName)); + } } From 934d24897fe5f37ad35a4a7e9aa549708e1fad5c Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 15:23:27 +0900 Subject: [PATCH 06/31] =?UTF-8?q?feat:=20count(=EA=B0=9C=EC=88=98)?= =?UTF-8?q?=EB=A7=8C=ED=81=BC=20=ED=8A=B9=EC=A0=95=EB=B2=94=EC=9C=84(start?= =?UTF-8?q?=20-=20end)=EC=9D=98=20=EB=9E=9C=EB=8D=A4=20=EA=B0=92=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=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/utils/Randoms.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/utils/Randoms.java diff --git a/src/main/java/utils/Randoms.java b/src/main/java/utils/Randoms.java new file mode 100644 index 00000000..5fe7f425 --- /dev/null +++ b/src/main/java/utils/Randoms.java @@ -0,0 +1,28 @@ +package utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class Randoms { + private static final Random random = ThreadLocalRandom.current(); + private Randoms() { + } + + public static List pickNumbersInRange(final int count, final int start, final int end){ + validateRange(start, end); + List randomNumbers = new ArrayList<>(); + for(int i = 0; i < count; i++){ + randomNumbers.add(start + random.nextInt(end - start + 1)); + } + + return randomNumbers; + } + + private static void validateRange(final int start, final int end){ + if (start > end) { + throw new IllegalArgumentException(String.format("[Error]: 시작 번호[%d]가 끝 번호[%s] 보다 큽니다.", start, end)); + } + } +} From 703871aa4ed6945c0c54a78e70091494eacc2068 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 16:09:41 +0900 Subject: [PATCH 07/31] =?UTF-8?q?test:=20=EB=9E=9C=EB=8D=A4=EA=B0=92=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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/.gitkeep | 0 src/test/java/utils/RandomsTest.java | 45 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) delete mode 100644 src/test/java/.gitkeep create mode 100644 src/test/java/utils/RandomsTest.java diff --git a/src/test/java/.gitkeep b/src/test/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/test/java/utils/RandomsTest.java b/src/test/java/utils/RandomsTest.java new file mode 100644 index 00000000..8ae46429 --- /dev/null +++ b/src/test/java/utils/RandomsTest.java @@ -0,0 +1,45 @@ +package utils; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.RepeatedTest; +import org.junit.jupiter.api.Test; + +class RandomsTest { + + @RepeatedTest(100) + @DisplayName("랜덤값 생성 테스트") + void generateRandomValueTest(){ + //given + final int count = 3; + final int start = 0; + final int end = 9; + + //when + var randomValues = Randoms.pickNumbersInRange(count, start, end); + + //then + assertEquals(randomValues.size(), count); + + randomValues + .forEach(randomValue -> { + assertTrue(randomValue <= 9 && randomValue >= 0); + }); + } + + @Test + @DisplayName("랜덤값 : start, end Excpetion Test") + void wrongInputWithRangeTest() { + //given + final int count = 3; + final int wrongStart = 10; + final int wrongEnd = 1; + //when + + + //then + assertThrows(IllegalArgumentException.class, () -> Randoms.pickNumbersInRange(count, wrongStart, wrongEnd)); + + } +} \ No newline at end of file From a228930d00f87453bdebad097b38a3f24e569ce5 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 16:24:46 +0900 Subject: [PATCH 08/31] =?UTF-8?q?feat:=20=EC=B0=A8=EB=9F=89=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=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/domain/Track.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/domain/Track.java b/src/main/java/domain/Track.java index 577ca6d0..b0ab025b 100644 --- a/src/main/java/domain/Track.java +++ b/src/main/java/domain/Track.java @@ -13,4 +13,16 @@ public Track() { public void addCar(String carName){ cars.add(new Car(carName)); } + public void step(List seeds){ + validateSeedSize(seeds); + for(int i = 0; i < seeds.size(); i++){ + cars.get(i).move(seeds.get(i)); + } + } + + private void validateSeedSize(List seeds){ + if(seeds.size() != cars.size()){ + throw new IllegalArgumentException("[ERROR]: Seed 개수가 차량 개수와 일치하지 않습니다"); + } + } } From 76f2c062a72b3ce0c0320779a689116ae6caa73d Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 16:28:03 +0900 Subject: [PATCH 09/31] =?UTF-8?q?feat:=20CarState=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 | 8 +++++--- src/main/java/domain/state/CarState.java | 6 ++++++ 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 src/main/java/domain/state/CarState.java diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index d4f551ec..bcacb7b2 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -1,8 +1,10 @@ package domain; -public class Car { +import domain.state.CarState; + +public class Car implements CarState { private String name; - private Integer position; + private int position; public Car(String name) { setName(name); @@ -22,7 +24,7 @@ public String getName() { return name; } - public Integer getPosition() { + public int getPosition() { return position; } diff --git a/src/main/java/domain/state/CarState.java b/src/main/java/domain/state/CarState.java new file mode 100644 index 00000000..b953aa3e --- /dev/null +++ b/src/main/java/domain/state/CarState.java @@ -0,0 +1,6 @@ +package domain.state; + +public interface CarState { + String getName(); + int getPosition(); +} From 2db708246af2509d670974fb7b7aa24dfa1cb6e2 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 16:29:15 +0900 Subject: [PATCH 10/31] =?UTF-8?q?refactor:=20=EC=B0=A8=EB=9F=89=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=A7=A4=EC=84=9C=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=84=B4=EA=B0=92=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/domain/Car.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index bcacb7b2..3e5afb12 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -28,10 +28,9 @@ public int getPosition() { return position; } - public Integer move(Integer seed){ + public void move(Integer seed){ if(seed > 3){ this.position ++; } - return this.getPosition(); } } From dfa2341444e3757c84f44825b1d255613e17926d Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 16:57:24 +0900 Subject: [PATCH 11/31] =?UTF-8?q?feat:=20winner=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Track.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/domain/Track.java b/src/main/java/domain/Track.java index b0ab025b..d6ad3cd5 100644 --- a/src/main/java/domain/Track.java +++ b/src/main/java/domain/Track.java @@ -20,6 +20,23 @@ public void step(List seeds){ } } + public List getWinners(){ + int maxPosition = 0; + + List winner = new ArrayList<>(); + for(Car car : cars){ + if(car.getPosition() == maxPosition){ + winner.add(car); + continue; + } + if(car.getPosition() > maxPosition){ + winner.clear(); + maxPosition = car.getPosition(); + winner.add(car); + } + } + return winner; + } private void validateSeedSize(List seeds){ if(seeds.size() != cars.size()){ throw new IllegalArgumentException("[ERROR]: Seed 개수가 차량 개수와 일치하지 않습니다"); From 66031a09d31efe6d52b0edd3c549e5ff2553c513 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 16:57:49 +0900 Subject: [PATCH 12/31] =?UTF-8?q?feat:=20Track=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/service/RacingGameService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/service/RacingGameService.java diff --git a/src/main/java/service/RacingGameService.java b/src/main/java/service/RacingGameService.java new file mode 100644 index 00000000..4a5e8c12 --- /dev/null +++ b/src/main/java/service/RacingGameService.java @@ -0,0 +1,15 @@ +package service; + +import domain.Track; +import java.util.List; + +public class RacingGameService { + private Track track; + + public void trackInit(List carNames){ + track = new Track(); + for(String name : carNames){ + track.addCar(name); + } + } +} From 1a32a54adfc8f1217d83948066826e3b2e7fc138 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 17:48:56 +0900 Subject: [PATCH 13/31] =?UTF-8?q?feat:=20=EB=8B=A8=EA=B3=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EA=B8=B0=EB=8A=A5=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/Track.java | 4 ++++ src/main/java/service/RacingGameService.java | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/domain/Track.java b/src/main/java/domain/Track.java index d6ad3cd5..8ffcfb16 100644 --- a/src/main/java/domain/Track.java +++ b/src/main/java/domain/Track.java @@ -20,6 +20,10 @@ public void step(List seeds){ } } + public List getCars(){ + return this.cars; + } + public List getWinners(){ int maxPosition = 0; diff --git a/src/main/java/service/RacingGameService.java b/src/main/java/service/RacingGameService.java index 4a5e8c12..537ede40 100644 --- a/src/main/java/service/RacingGameService.java +++ b/src/main/java/service/RacingGameService.java @@ -1,7 +1,10 @@ package service; import domain.Track; +import domain.state.CarState; +import java.util.ArrayList; import java.util.List; +import utils.Randoms; public class RacingGameService { private Track track; @@ -12,4 +15,10 @@ public void trackInit(List carNames){ track.addCar(name); } } + + public void step(){ + track.step( + Randoms.pickNumbersInRange(track.getCars().size(), 0, 9) + ); + } } From da7636c9d72d20e32b6acfd102245d6b7469fcb7 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 17:56:54 +0900 Subject: [PATCH 14/31] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20winner=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=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/service/RacingGameService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/service/RacingGameService.java b/src/main/java/service/RacingGameService.java index 537ede40..3a0afd46 100644 --- a/src/main/java/service/RacingGameService.java +++ b/src/main/java/service/RacingGameService.java @@ -21,4 +21,8 @@ public void step(){ Randoms.pickNumbersInRange(track.getCars().size(), 0, 9) ); } + public List getWinners(){ + var winners = track.getWinners(); + return new ArrayList<>(winners); + } } From 09219ace57330e2683dd94944caeea3d8694f95d Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 18:04:15 +0900 Subject: [PATCH 15/31] =?UTF-8?q?test:=20Car=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/CarTest.java | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/test/java/domain/CarTest.java diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java new file mode 100644 index 00000000..6d6d03e5 --- /dev/null +++ b/src/test/java/domain/CarTest.java @@ -0,0 +1,34 @@ +package domain; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class CarTest { + + @Test + @DisplayName("차량 이동 테스트") + void moveCarTest (){ + //given + var movedCar = new Car("Move"); + var stoppedCar = new Car("Stop"); + //when + movedCar.move(4); + stoppedCar.move(2); + //then + assertEquals(movedCar.getPosition(), 1); + assertEquals(stoppedCar.getPosition(), 0); + + } + @Test + @DisplayName("잘못된 길이의 차량 이름 길이 테스트") + void wrongCarNameTest (){ + //given + final String carName = "666666"; + //when + + //then + assertThrows(IllegalArgumentException.class, () -> new Car(carName)); + } +} \ No newline at end of file From b3af1228e9ee54f92a0fed20e2164271e0aa8a9f Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 18:08:16 +0900 Subject: [PATCH 16/31] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index e103ed8c..2b4c2dc0 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,18 @@ # java-racingcar-precourse -- [ ] 차량 클래스 - - [ ] 차량 이동 - - [ ] 유닛 테스팅 +- [x] 차량 클래스 + - [x] 차량 이동 + - [x] 유닛 테스팅 - [ ] 레이싱 트랙 - - [ ] 경기 참여 차량 저장 - - [ ] 유닛 테스팅 - - [ ] 우승자 업데이트 + - [x] 경기 참여 차량 저장 - [ ] 유닛 테스팅 - - [ ] 경기 단계 진행 및 단계 결과 반환 + - [x] 경기 단계 진행 및 단계 결과 반환 - [ ] 유닛 테스팅 -- [ ] GameController - - [ ] Input 처리 - - [ ] 이름 파싱 - - [ ] 유닛 테스팅 - - [ ] 시행 횟수 형변환 - - [ ] 유닛 테스팅 - - [ ] Output 처리 +- [x] 랜덤값 생성 Util + - [x] 특정 범위의 특정 개수의 Random값 생성 + - [x] 유닛 테스팅 + + - [ ] 예외 처리 - [ ] 차량 이름이 5자 이상 일때 ( ExcessiveParticipantsNameException ) - [ ] 유닛 테스팅 From 7da4ecc33c1fc1e58c7ed5221579d82372a6af1d Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 21:53:14 +0900 Subject: [PATCH 17/31] =?UTF-8?q?test:=20Track=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/TrackTest.java | 76 +++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/test/java/domain/TrackTest.java diff --git a/src/test/java/domain/TrackTest.java b/src/test/java/domain/TrackTest.java new file mode 100644 index 00000000..a49ec675 --- /dev/null +++ b/src/test/java/domain/TrackTest.java @@ -0,0 +1,76 @@ +package domain; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class TrackTest { + + @Test + @DisplayName("generateCarTest") + void generateCarTest (){ + //given + var track = new Track(); + var carNames = List.of("Car1", "Car2", "Car3"); + //when + for (String carName : carNames) { + track.addCar(carName); + } + var savedCar = track.getCars(); + //then + assertEquals(carNames, savedCar.stream().map(Car::getName).toList()); + } + + @Test + @DisplayName("step 진행 테스트") + void stepTest (){ + //given + var track = new Track(); + var carNames = List.of("Car1", "Car2", "Car3"); + var seeds = List.of(2,3,4); + for (String carName : carNames) { + track.addCar(carName); + } + //when + track.step(seeds); + //then + var position = List.of(0,0,1); + assertEquals(position, track.getCars().stream().map(Car::getPosition).toList()); + } + + @Test + @DisplayName("우승자 반환 테스트") + void winnerTest (){ + //given + var track = new Track(); + var carNames = List.of("Car1", "Car2", "Car3"); + var seeds = List.of(2,3,4); + for (String carName : carNames) { + track.addCar(carName); + } + //when + track.step(seeds); + //then + var answer = List.of("Car3"); + assertEquals(answer, track.getWinners().stream().map(Car::getName).toList()); + } + + @Test + @DisplayName("다중우승자 반환 테스트") + void multipleWinnerTest (){ + //given + var track = new Track(); + var carNames = List.of("Car1", "Car2", "Car3"); + var seeds = List.of(2,5,4); + for (String carName : carNames) { + track.addCar(carName); + } + //when + track.step(seeds); + //then + var answer = List.of("Car2", "Car3"); + assertEquals(answer, track.getWinners().stream().map(Car::getName).toList()); + } +} \ No newline at end of file From 88135a2adfb3b7896c3a35ad7bccf3e51110fa9a Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 21:55:49 +0900 Subject: [PATCH 18/31] =?UTF-8?q?refactor:=20step=20->=20runStep=20?= =?UTF-8?q?=EB=A7=A4=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Track.java | 2 +- src/main/java/service/RacingGameService.java | 2 +- src/test/java/domain/TrackTest.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/domain/Track.java b/src/main/java/domain/Track.java index 8ffcfb16..c987e632 100644 --- a/src/main/java/domain/Track.java +++ b/src/main/java/domain/Track.java @@ -13,7 +13,7 @@ public Track() { public void addCar(String carName){ cars.add(new Car(carName)); } - public void step(List seeds){ + public void runStep(List seeds){ validateSeedSize(seeds); for(int i = 0; i < seeds.size(); i++){ cars.get(i).move(seeds.get(i)); diff --git a/src/main/java/service/RacingGameService.java b/src/main/java/service/RacingGameService.java index 3a0afd46..03ab91df 100644 --- a/src/main/java/service/RacingGameService.java +++ b/src/main/java/service/RacingGameService.java @@ -17,7 +17,7 @@ public void trackInit(List carNames){ } public void step(){ - track.step( + track.runStep( Randoms.pickNumbersInRange(track.getCars().size(), 0, 9) ); } diff --git a/src/test/java/domain/TrackTest.java b/src/test/java/domain/TrackTest.java index a49ec675..7d052010 100644 --- a/src/test/java/domain/TrackTest.java +++ b/src/test/java/domain/TrackTest.java @@ -34,7 +34,7 @@ void stepTest (){ track.addCar(carName); } //when - track.step(seeds); + track.runStep(seeds); //then var position = List.of(0,0,1); assertEquals(position, track.getCars().stream().map(Car::getPosition).toList()); @@ -51,7 +51,7 @@ void winnerTest (){ track.addCar(carName); } //when - track.step(seeds); + track.runStep(seeds); //then var answer = List.of("Car3"); assertEquals(answer, track.getWinners().stream().map(Car::getName).toList()); @@ -68,7 +68,7 @@ void multipleWinnerTest (){ track.addCar(carName); } //when - track.step(seeds); + track.runStep(seeds); //then var answer = List.of("Car2", "Car3"); assertEquals(answer, track.getWinners().stream().map(Car::getName).toList()); From 3165a34971b2239a3e1a29d6c43039775b37ec36 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 21:56:15 +0900 Subject: [PATCH 19/31] =?UTF-8?q?refactor:=20step=20->=20runStep=20?= =?UTF-8?q?=EB=A7=A4=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/service/RacingGameService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/RacingGameService.java b/src/main/java/service/RacingGameService.java index 03ab91df..4dade6f0 100644 --- a/src/main/java/service/RacingGameService.java +++ b/src/main/java/service/RacingGameService.java @@ -16,7 +16,7 @@ public void trackInit(List carNames){ } } - public void step(){ + public void runStep(){ track.runStep( Randoms.pickNumbersInRange(track.getCars().size(), 0, 9) ); From 01c418d4b9d13578de2e772b17c5419a09d2f17b Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 22:27:28 +0900 Subject: [PATCH 20/31] =?UTF-8?q?feat:=20=EC=B0=A8=EB=9F=89=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=98=ED=99=98=20=EB=A1=9C=EC=A7=81=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/service/RacingGameService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/service/RacingGameService.java b/src/main/java/service/RacingGameService.java index 4dade6f0..70abd729 100644 --- a/src/main/java/service/RacingGameService.java +++ b/src/main/java/service/RacingGameService.java @@ -21,6 +21,11 @@ public void runStep(){ Randoms.pickNumbersInRange(track.getCars().size(), 0, 9) ); } + + public List getCars(){ + var cars = track.getCars(); + return new ArrayList<>(cars); + } public List getWinners(){ var winners = track.getWinners(); return new ArrayList<>(winners); From 876c5ddbf1164a29e755102b3111dca74f42816d Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Sun, 9 Jun 2024 22:27:38 +0900 Subject: [PATCH 21/31] =?UTF-8?q?feat:=20Controller=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/Application.java | 10 +++++ .../java/controller/RacingGameController.java | 37 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/controller/RacingGameController.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..3c30abbe --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,10 @@ +import controller.RacingGameController; + +public class Application { + + public static void main(String[] args) { + RacingGameController racingGameController = new RacingGameController(); + + racingGameController.runGame(); + } +} diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java new file mode 100644 index 00000000..dfba3244 --- /dev/null +++ b/src/main/java/controller/RacingGameController.java @@ -0,0 +1,37 @@ +package controller; + +import domain.state.CarState; +import java.util.List; +import java.util.stream.Collectors; +import service.RacingGameService; + +public class RacingGameController { + private final RacingGameService racingGameService; + + + public RacingGameController() { + this.racingGameService = new RacingGameService(); + } + + public void runGame(){ + //Todo Input값 받기 + var carName = List.of("Car1", "Car2", "Car3"); + var gameCount = 3; + racingGameService.trackInit(carName); + + for(int i = 0; i < gameCount; i++){ + racingGameService.runStep(); + var cars = racingGameService.getCars(); + //Todo DTO변환 후 View에 값 반환하기 + for(CarState car : cars){ + System.out.printf("%s : %s\n", car.getName(), "-".repeat(car.getPosition())); + } + System.out.println(); + } + //Todo DTO변환 후 View에 값 반환하기 + System.out.printf("최종 우승자 : %s\n", racingGameService.getWinners() + .stream() + .map(CarState::getName). + collect(Collectors.joining(", "))); + } +} From ce572c1796f9cca31f8440b2edb0083b015d11b2 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:06:03 +0900 Subject: [PATCH 22/31] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EA=B0=92=20?= =?UTF-8?q?=EB=B0=9B=EA=B8=B0=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/utils/Console.java | 11 +++++++ src/main/java/view/InputView.java | 41 ++++++++++++++++++++++++ src/main/java/view/Parser.java | 53 +++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 src/main/java/utils/Console.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/Parser.java diff --git a/src/main/java/utils/Console.java b/src/main/java/utils/Console.java new file mode 100644 index 00000000..4488dd62 --- /dev/null +++ b/src/main/java/utils/Console.java @@ -0,0 +1,11 @@ +package utils; + +import java.util.Scanner; + +public class Console { + private static final Scanner sc = new Scanner(System.in); + + public static String readLine(){ + return sc.nextLine(); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..cbcdf229 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,41 @@ +package view; + +import java.sql.SQLOutput; +import java.util.Arrays; +import java.util.List; +import utils.Console; + +public class InputView { + private static final String GET_CAR_NAME_REQUEST = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; + private static final String GET_GAME_COUNT_REQUEST = "시도할 회수는 몇회인가요?"; + + public static List readCarName(){ + List validCarName = null; + do { + System.out.println(GET_CAR_NAME_REQUEST); + try{ + validCarName = Parser.validateCarNameInput(Console.readLine()); + }catch(Exception e) { + System.out.println(e.getMessage()); + } + }while (validCarName == null); + + return validCarName; + } + + + public static int readGameCount(){ + Integer validGameCount = null; + do { + System.out.println(GET_GAME_COUNT_REQUEST); + try { + validGameCount = Parser.validateGameCountInput(Console.readLine()); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } while (validGameCount == null); + + return validGameCount; + } + +} diff --git a/src/main/java/view/Parser.java b/src/main/java/view/Parser.java new file mode 100644 index 00000000..6ac0bb05 --- /dev/null +++ b/src/main/java/view/Parser.java @@ -0,0 +1,53 @@ +package view; + +import java.util.Arrays; +import java.util.List; + +public class Parser { + private static final String INVALID_INPUT_ERROR = "[ERROR]: 이름을 확인할 수 없습니다. 다시 입력해주세요."; + private static final String INVALID_COUNT_ERROR = "[ERROR]: 유효한 숫자를 입력해주세요."; + public static List validateCarNameInput(String input){ + try { + validateNameContainsBlank(input); + + return Arrays.stream(input.split(", ")) + .map(String::trim) + .toList(); + } catch (Exception e) { + throw new IllegalArgumentException(e.getMessage()); + } + } + + private static void validateNameContainsBlank(String input){ + if (input == null || + input.trim().isEmpty() || + Arrays.stream(input.split(",")).anyMatch(String::isBlank)) { + + throw new IllegalArgumentException(INVALID_INPUT_ERROR); + } + } + + public static int validateGameCountInput(String input) { + try { + validateGameCountIsBlank(input); + int count = Integer.parseInt(input.trim()); + validateGameCountIsBlank(count); + + return count; + } catch (NumberFormatException e) { + throw new IllegalArgumentException(INVALID_COUNT_ERROR); + } + } + + private static void validateGameCountIsBlank(String input){ + if (input == null || input.trim().isEmpty()) { + throw new IllegalArgumentException(INVALID_COUNT_ERROR); + } + } + private static void validateGameCountIsBlank(int count){ + if (count <= 0) { + throw new IllegalArgumentException(INVALID_COUNT_ERROR); + } + } + +} From 82d23d585a4e2bc83d786b22857d8c884ece6d21 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:26:56 +0900 Subject: [PATCH 23/31] =?UTF-8?q?feat:=20CarDTO=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/controller/res/CarInfoDto.java | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/controller/res/CarInfoDto.java diff --git a/src/main/java/controller/res/CarInfoDto.java b/src/main/java/controller/res/CarInfoDto.java new file mode 100644 index 00000000..3cde9de6 --- /dev/null +++ b/src/main/java/controller/res/CarInfoDto.java @@ -0,0 +1,25 @@ +package controller.res; + +import domain.state.CarState; + +public class CarInfoDto { + private final String name; + private final int position; + + public CarInfoDto(String name, int position) { + this.name = name; + this.position = position; + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + + public static CarInfoDto toDTO(CarState carState){ + return new CarInfoDto(carState.getName(), carState.getPosition()); + } +} From 3757234e70518ca58b1f873ce47622e51fd55d97 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:33:17 +0900 Subject: [PATCH 24/31] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=EA=B0=92=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EC=97=90=EB=9F=AC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=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/view/OutputView.java | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..0362554a --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,32 @@ +package view; + +import controller.res.CarInfoDto; +import domain.state.CarState; +import java.util.List; +import java.util.stream.Collectors; + +public class OutputView { + private static final String RESULT_OUTPUT = "\n실행결과"; + private static final String WINNER_OUTPUT = "최종우승자 %s\n"; + public static void printError(String error){ + System.out.println(error + "\n"); + } + + public static void printResultOutput(){ + System.out.println(RESULT_OUTPUT); + } + + public static void printStep(List cars){ + for(CarInfoDto car : cars){ + System.out.printf("%s : %s\n", car.getName(), "-".repeat(car.getPosition())); + } + System.out.println(); + } + + public static void printResult(List cars){ + System.out.printf(WINNER_OUTPUT, + cars.stream().map(CarInfoDto::getName) + .collect(Collectors.joining(", ") + )); + } +} From abbff3346ed0ba2e67f8397556441ce4d062dc65 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:34:43 +0900 Subject: [PATCH 25/31] =?UTF-8?q?feat:=20Controller=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=EB=B0=8F=20=EC=B6=9C=EB=A0=A5=20=EB=A1=9C=EC=A7=81=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 --- .../java/controller/RacingGameController.java | 44 ++++++++++++------- src/main/java/view/InputView.java | 28 ++---------- 2 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java index dfba3244..59ef2d0f 100644 --- a/src/main/java/controller/RacingGameController.java +++ b/src/main/java/controller/RacingGameController.java @@ -1,37 +1,51 @@ package controller; +import controller.res.CarInfoDto; import domain.state.CarState; import java.util.List; import java.util.stream.Collectors; import service.RacingGameService; +import view.InputView; +import view.OutputView; public class RacingGameController { private final RacingGameService racingGameService; - public RacingGameController() { this.racingGameService = new RacingGameService(); } + public void carInit(){ + while(true){ + try{ + var carName = InputView.readCarName(); + racingGameService.trackInit(carName); + break; + }catch (IllegalArgumentException e){ + OutputView.printError(e.getMessage()); + } + } + + } + public int gameCountInit(){ + while(true){ + try{ + return InputView.readGameCount(); + }catch (IllegalArgumentException e){ + OutputView.printError(e.getMessage()); + } + } + } public void runGame(){ - //Todo Input값 받기 - var carName = List.of("Car1", "Car2", "Car3"); - var gameCount = 3; - racingGameService.trackInit(carName); + var gameCount = gameCountInit(); + OutputView.printResultOutput(); for(int i = 0; i < gameCount; i++){ racingGameService.runStep(); var cars = racingGameService.getCars(); - //Todo DTO변환 후 View에 값 반환하기 - for(CarState car : cars){ - System.out.printf("%s : %s\n", car.getName(), "-".repeat(car.getPosition())); - } - System.out.println(); + OutputView.printStep(cars.stream().map(CarInfoDto::toDTO).toList()); } - //Todo DTO변환 후 View에 값 반환하기 - System.out.printf("최종 우승자 : %s\n", racingGameService.getWinners() - .stream() - .map(CarState::getName). - collect(Collectors.joining(", "))); + + OutputView.printResult(racingGameService.getWinners().stream().map(CarInfoDto::toDTO).toList()); } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index cbcdf229..bc5bdfc9 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,7 +1,5 @@ package view; -import java.sql.SQLOutput; -import java.util.Arrays; import java.util.List; import utils.Console; @@ -10,32 +8,14 @@ public class InputView { private static final String GET_GAME_COUNT_REQUEST = "시도할 회수는 몇회인가요?"; public static List readCarName(){ - List validCarName = null; - do { - System.out.println(GET_CAR_NAME_REQUEST); - try{ - validCarName = Parser.validateCarNameInput(Console.readLine()); - }catch(Exception e) { - System.out.println(e.getMessage()); - } - }while (validCarName == null); - - return validCarName; + System.out.println(GET_CAR_NAME_REQUEST); + return Parser.validateCarNameInput(Console.readLine()); } public static int readGameCount(){ - Integer validGameCount = null; - do { - System.out.println(GET_GAME_COUNT_REQUEST); - try { - validGameCount = Parser.validateGameCountInput(Console.readLine()); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } while (validGameCount == null); - - return validGameCount; + System.out.println(GET_GAME_COUNT_REQUEST); + return Parser.validateGameCountInput(Console.readLine()); } } From f153323b5a5aa6aa49fa9f695412e254330e0f72 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:36:24 +0900 Subject: [PATCH 26/31] =?UTF-8?q?refactor:=20=EC=B6=9C=EB=A0=A5=EA=B0=92?= =?UTF-8?q?=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/view/OutputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0362554a..051e26d4 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -7,7 +7,7 @@ public class OutputView { private static final String RESULT_OUTPUT = "\n실행결과"; - private static final String WINNER_OUTPUT = "최종우승자 %s\n"; + private static final String WINNER_OUTPUT = "최종우승자 : %s\n"; public static void printError(String error){ System.out.println(error + "\n"); } From 4eb77e563c631a04ca3d9de51f59356eff737a4f Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:37:42 +0900 Subject: [PATCH 27/31] =?UTF-8?q?feat:=20Application.main()=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 3c30abbe..771a942d 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,10 +1,11 @@ import controller.RacingGameController; +import view.InputView; public class Application { public static void main(String[] args) { RacingGameController racingGameController = new RacingGameController(); - + racingGameController.carInit(); racingGameController.runGame(); } } From 9b559fb7044d24418d6c6c3a23216b288ee8d861 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:45:06 +0900 Subject: [PATCH 28/31] =?UTF-8?q?feat:=20Parser=EC=9D=98=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=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/{view => utils}/Parser.java | 10 +++++----- src/main/java/view/InputView.java | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) rename src/main/java/{view => utils}/Parser.java (86%) diff --git a/src/main/java/view/Parser.java b/src/main/java/utils/Parser.java similarity index 86% rename from src/main/java/view/Parser.java rename to src/main/java/utils/Parser.java index 6ac0bb05..01b112cc 100644 --- a/src/main/java/view/Parser.java +++ b/src/main/java/utils/Parser.java @@ -1,4 +1,4 @@ -package view; +package utils; import java.util.Arrays; import java.util.List; @@ -29,9 +29,9 @@ private static void validateNameContainsBlank(String input){ public static int validateGameCountInput(String input) { try { - validateGameCountIsBlank(input); + validateGameCountIsPositive(input); int count = Integer.parseInt(input.trim()); - validateGameCountIsBlank(count); + validateGameCountIsPositive(count); return count; } catch (NumberFormatException e) { @@ -39,12 +39,12 @@ public static int validateGameCountInput(String input) { } } - private static void validateGameCountIsBlank(String input){ + private static void validateGameCountIsPositive(String input){ if (input == null || input.trim().isEmpty()) { throw new IllegalArgumentException(INVALID_COUNT_ERROR); } } - private static void validateGameCountIsBlank(int count){ + private static void validateGameCountIsPositive(int count){ if (count <= 0) { throw new IllegalArgumentException(INVALID_COUNT_ERROR); } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index bc5bdfc9..cd9e7aab 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -2,6 +2,7 @@ import java.util.List; import utils.Console; +import utils.Parser; public class InputView { private static final String GET_CAR_NAME_REQUEST = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; From 3a6be48c4b0169724644a9469595c44145e84d64 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:57:05 +0900 Subject: [PATCH 29/31] =?UTF-8?q?feat:=20Parser=EC=9D=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=BD=94=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/test/java/utils/ParserTest.java | 55 +++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/test/java/utils/ParserTest.java diff --git a/src/test/java/utils/ParserTest.java b/src/test/java/utils/ParserTest.java new file mode 100644 index 00000000..75e1e716 --- /dev/null +++ b/src/test/java/utils/ParserTest.java @@ -0,0 +1,55 @@ +package utils; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ParserTest { + @Test + @DisplayName("유효한 이름 입력 테스트") + void validNameInput (){ + //given + var input = "Car1, Car2, Car3"; + var expected = List.of("Car1", "Car2", "Car3"); + //when + var output = Parser.validateCarNameInput(input); + //then + assertEquals(expected, output); + } + + @Test + @DisplayName("공백을 포함한 이름 입력 테스트") + void invalidNameInputWithBlank (){ + //given + var input = "Car1, , Car3"; + //when + + //then + assertThrows(IllegalArgumentException.class, () -> Parser.validateCarNameInput(input)); + } + + @Test + @DisplayName("유효한 게임 입력 테스트") + void validGameCount (){ + //given + var input = "1"; + var expected = 1; + //when + var output = Parser.validateGameCountInput(input); + //then + assertEquals(output, expected); + } + + @Test + @DisplayName("숫자가 아닌 입력값 테스트") + void invalidGameCountWithType(){ + //given + var input = "a"; + //when + + //then + assertThrows(IllegalArgumentException.class, () -> Parser.validateCarNameInput(input)); + } +} \ No newline at end of file From 6ae01b849633430e866e8b8a9e18b0573e0fdf26 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 11:57:24 +0900 Subject: [PATCH 30/31] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2b4c2dc0..ef024dde 100644 --- a/README.md +++ b/README.md @@ -3,18 +3,24 @@ - [x] 차량 클래스 - [x] 차량 이동 - [x] 유닛 테스팅 -- [ ] 레이싱 트랙 + - [x] 차량 이름이 5자 이상 일때 + - [x] 유닛 테스팅 +- [x] 레이싱 트랙 - [x] 경기 참여 차량 저장 - - [ ] 유닛 테스팅 + - [x] 유닛 테스팅 - [x] 경기 단계 진행 및 단계 결과 반환 - - [ ] 유닛 테스팅 + - [x] 유닛 테스팅 - [x] 랜덤값 생성 Util - [x] 특정 범위의 특정 개수의 Random값 생성 - [x] 유닛 테스팅 -- [ ] 예외 처리 - - [ ] 차량 이름이 5자 이상 일때 ( ExcessiveParticipantsNameException ) - - [ ] 유닛 테스팅 - - [ ] 게임 시행 횟수 타입 (WrongCountTypeException) - - [ ] 유닛 테스팅 +- [x] 예외 처리 + - [x] 게임 시행 횟수 타입 + - [x] 유닛 테스팅 + - [ ] 게임 시행 횟수가 0 이하일 때 + - [x] 유닛 테스팅 + - [ ] 게임 이름 입력이 공백일 때 + - [x] 유닛 테스팅 + - [ ] 게임 입력 시 이름에 공백이 있을 때 + - [x] 유닛 테스팅 From cad6d8ecca066a333a41e85e3f86f946697a0977 Mon Sep 17 00:00:00 2001 From: sanghee0820 Date: Mon, 10 Jun 2024 12:03:32 +0900 Subject: [PATCH 31/31] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=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/utils/ParserTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/utils/ParserTest.java b/src/test/java/utils/ParserTest.java index 75e1e716..14656ce3 100644 --- a/src/test/java/utils/ParserTest.java +++ b/src/test/java/utils/ParserTest.java @@ -50,6 +50,6 @@ void invalidGameCountWithType(){ //when //then - assertThrows(IllegalArgumentException.class, () -> Parser.validateCarNameInput(input)); + assertThrows(IllegalArgumentException.class, () -> Parser.validateGameCountInput(input)); } } \ No newline at end of file