From e059699687cb96232664d1d0f053f9ad84528b1d Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sun, 14 Apr 2024 13:30:46 +0900 Subject: [PATCH 1/8] init --- src/main/java/RacingMain.java | 16 ++++++++++++---- src/main/java/domain/RacingGame.java | 12 ++++++++++++ src/main/java/view/InputView.java | 9 +++++++++ src/main/java/view/ResultView.java | 6 ++++++ 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 src/main/java/domain/RacingGame.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/ResultView.java diff --git a/src/main/java/RacingMain.java b/src/main/java/RacingMain.java index 4394287..3b02261 100644 --- a/src/main/java/RacingMain.java +++ b/src/main/java/RacingMain.java @@ -1,7 +1,15 @@ +import view.InputView; +import view.ResultView; +import domain.RacingGame; + public class RacingMain { + public static void main(final String... args) { + final var carNames = InputView.getCarNames(); + final var tryCount = InputView.getTryCount(); + + final var racingGame = new RacingGame(carNames, tryCount); + racingGame.race(); - public static void main(String[] args) { - // TODO: MVC 패턴을 기반으로 자동차 경주 미션 구현해보기 - System.out.println("Hello, World!"); + ResultView.printWinners(racingGame.getWinners()); } -} +} \ No newline at end of file diff --git a/src/main/java/domain/RacingGame.java b/src/main/java/domain/RacingGame.java new file mode 100644 index 0000000..f1d6561 --- /dev/null +++ b/src/main/java/domain/RacingGame.java @@ -0,0 +1,12 @@ +package domain; + +public class RacingGame { + public RacingGame(Object carNames, Object tryCount) { + } + + public void race() { + } + + public Object getWinners() { + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000..f690b28 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,9 @@ +package view; + +public class InputView { + public static Object getCarNames() { + } + + public static Object getTryCount() { + } +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java new file mode 100644 index 0000000..95ecf25 --- /dev/null +++ b/src/main/java/view/ResultView.java @@ -0,0 +1,6 @@ +package view; + +public class ResultView { + public static void printWinners(Object winners) { + } +} From 5e541bffb044f7f83d5f1f3bd9a77938757a2bd2 Mon Sep 17 00:00:00 2001 From: Deld Date: Tue, 16 Apr 2024 20:41:21 +0900 Subject: [PATCH 2/8] dependencies, domain diagram --- README.md | 49 +++++++++++++++++++ build.gradle | 13 +++-- src/main/java/RacingMain.java | 15 ------ src/main/java/racingcar/RacingMain.java | 15 ++++++ .../controller/RacingCarController.java | 17 +++++++ .../{ => racingcar}/domain/RacingGame.java | 4 +- .../racingcar/domain/players/Distance.java | 9 ++++ .../java/racingcar/domain/players/Name.java | 34 +++++++++++++ .../java/racingcar/domain/players/Player.java | 14 ++++++ .../racingcar/domain/players/Players.java | 14 ++++++ .../java/racingcar/domain/random/Random.java | 4 ++ .../racingcar/domain/trycount/TryCount.java | 30 ++++++++++++ src/main/java/racingcar/view/InputView.java | 24 +++++++++ .../view/OutputView.java} | 4 +- src/main/java/racingcar/view/Parser.java | 17 +++++++ src/main/java/view/InputView.java | 9 ---- .../java/racingcar/domain/RacingGameTest.java | 4 ++ .../domain/players/DistanceTest.java | 4 ++ .../racingcar/domain/players/NameTest.java | 4 ++ .../racingcar/domain/players/PlayersTest.java | 4 ++ .../racingcar/domain/random/RandomTest.java | 4 ++ .../domain/trycount/TryCountTest.java | 19 +++++++ src/test/java/racingcar/view/ParserTest.java | 37 ++++++++++++++ 23 files changed, 315 insertions(+), 33 deletions(-) delete mode 100644 src/main/java/RacingMain.java create mode 100644 src/main/java/racingcar/RacingMain.java create mode 100644 src/main/java/racingcar/controller/RacingCarController.java rename src/main/java/{ => racingcar}/domain/RacingGame.java (69%) create mode 100644 src/main/java/racingcar/domain/players/Distance.java create mode 100644 src/main/java/racingcar/domain/players/Name.java create mode 100644 src/main/java/racingcar/domain/players/Player.java create mode 100644 src/main/java/racingcar/domain/players/Players.java create mode 100644 src/main/java/racingcar/domain/random/Random.java create mode 100644 src/main/java/racingcar/domain/trycount/TryCount.java create mode 100644 src/main/java/racingcar/view/InputView.java rename src/main/java/{view/ResultView.java => racingcar/view/OutputView.java} (55%) create mode 100644 src/main/java/racingcar/view/Parser.java delete mode 100644 src/main/java/view/InputView.java create mode 100644 src/test/java/racingcar/domain/RacingGameTest.java create mode 100644 src/test/java/racingcar/domain/players/DistanceTest.java create mode 100644 src/test/java/racingcar/domain/players/NameTest.java create mode 100644 src/test/java/racingcar/domain/players/PlayersTest.java create mode 100644 src/test/java/racingcar/domain/random/RandomTest.java create mode 100644 src/test/java/racingcar/domain/trycount/TryCountTest.java create mode 100644 src/test/java/racingcar/view/ParserTest.java diff --git a/README.md b/README.md index 1969313..07cbdec 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,52 @@ 자동차 경주 미션 저장소 +## 도메인 다이어그램 + +```mermaid +graph TD + RacingCarController --> InputView + RacingCarController --> OutputView + RacingCarController --> RacingGame + + RacingGame --> Players + RacingGame --> TryCount + + Players --> Player + + Player --> Name + Player --> Distance + + Distance --> Random + +``` + +## 기능 구현 목록 + +### RacingGame + +- [x] Player와 Trycount 관리한다. + +### Players + +- [x] 여러 명일 수 있다. + +### Player + +- [x] 이름을 가진다. + - [x] 최소 1자, 최대 5자까지 가능하다. + - [x] 중간 공백은 허용하고 쉼표로 구분한다. +- [x] 거리를 가진다. + +### 입력 + +- [x] 플레이어의 이름을 입력한다. + - [x] 앞, 뒤 공백은 제거한다. +- [x] 이동 횟수를 입력한다. + +### 출력 + +- [x] 최종 결과를 출력한다. +- [x] 최종 우승자를 출력한다. + - [x] 여러명일 수 있다. + diff --git a/build.gradle b/build.gradle index 3697236..05690aa 100644 --- a/build.gradle +++ b/build.gradle @@ -6,13 +6,18 @@ version '1.0-SNAPSHOT' repositories { mavenCentral() + maven { url 'https://jitpack.io' } + } dependencies { - testImplementation platform('org.junit:junit-bom:5.9.1') - testImplementation platform('org.assertj:assertj-bom:3.25.1') - testImplementation('org.junit.jupiter:junit-jupiter') - testImplementation('org.assertj:assertj-core') + implementation 'com.github.kokodak:mission-utils:1.0.0' + + implementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + implementation 'org.junit.jupiter:junit-jupiter-engine:5.8.1' + implementation 'org.mockito:mockito-inline:3.12.4' + implementation 'org.assertj:assertj-core:3.21.0' + implementation 'org.junit.jupiter:junit-jupiter:5.8.1' } java { diff --git a/src/main/java/RacingMain.java b/src/main/java/RacingMain.java deleted file mode 100644 index 3b02261..0000000 --- a/src/main/java/RacingMain.java +++ /dev/null @@ -1,15 +0,0 @@ -import view.InputView; -import view.ResultView; -import domain.RacingGame; - -public class RacingMain { - public static void main(final String... args) { - final var carNames = InputView.getCarNames(); - final var tryCount = InputView.getTryCount(); - - final var racingGame = new RacingGame(carNames, tryCount); - racingGame.race(); - - ResultView.printWinners(racingGame.getWinners()); - } -} \ No newline at end of file diff --git a/src/main/java/racingcar/RacingMain.java b/src/main/java/racingcar/RacingMain.java new file mode 100644 index 0000000..d707f4a --- /dev/null +++ b/src/main/java/racingcar/RacingMain.java @@ -0,0 +1,15 @@ +package racingcar; + +import racingcar.controller.RacingCarController; +import racingcar.view.InputView; +import racingcar.view.OutputView; + +public class RacingMain { + public static void main(final String... args) { + final InputView inputView = new InputView(); + final OutputView outputView = new OutputView(); + + final RacingCarController racingCarController = new RacingCarController(inputView, outputView); + racingCarController.run(); + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/controller/RacingCarController.java b/src/main/java/racingcar/controller/RacingCarController.java new file mode 100644 index 0000000..38704aa --- /dev/null +++ b/src/main/java/racingcar/controller/RacingCarController.java @@ -0,0 +1,17 @@ +package racingcar.controller; + +import racingcar.view.InputView; +import racingcar.view.OutputView; + +public class RacingCarController { + private final InputView inputView; + private final OutputView outputView; + + public RacingCarController(final InputView inputView, final OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + public void run() { + } + +} diff --git a/src/main/java/domain/RacingGame.java b/src/main/java/racingcar/domain/RacingGame.java similarity index 69% rename from src/main/java/domain/RacingGame.java rename to src/main/java/racingcar/domain/RacingGame.java index f1d6561..7da7dd3 100644 --- a/src/main/java/domain/RacingGame.java +++ b/src/main/java/racingcar/domain/RacingGame.java @@ -1,4 +1,4 @@ -package domain; +package racingcar.domain; public class RacingGame { public RacingGame(Object carNames, Object tryCount) { @@ -7,6 +7,4 @@ public RacingGame(Object carNames, Object tryCount) { public void race() { } - public Object getWinners() { - } } diff --git a/src/main/java/racingcar/domain/players/Distance.java b/src/main/java/racingcar/domain/players/Distance.java new file mode 100644 index 0000000..7985541 --- /dev/null +++ b/src/main/java/racingcar/domain/players/Distance.java @@ -0,0 +1,9 @@ +package racingcar.domain.players; + +public class Distance { + private final String distance=""; + + public void moveForward(){ + } + +} diff --git a/src/main/java/racingcar/domain/players/Name.java b/src/main/java/racingcar/domain/players/Name.java new file mode 100644 index 0000000..d6cd0d9 --- /dev/null +++ b/src/main/java/racingcar/domain/players/Name.java @@ -0,0 +1,34 @@ +package racingcar.domain.players; + +public class Name { + + private static final int UPPER_BOUND = 5; + private final String name; + + public Name(final String input) { + validate(input); + this.name = input; + } + + private void validate(final String input) { + validateNullAndBlank(input); + validateLength(input); + } + + private void validateNullAndBlank(final String input) { + if (input == null || input.isBlank()) { + throw new IllegalArgumentException("[ERROR] 이름은 존재해야 합니다. 현재 이름: " + input); + } + } + + private void validateLength(final String input) { + if (input.length() > UPPER_BOUND) { + throw new IllegalArgumentException("이름은 " + UPPER_BOUND + "글자 이하여야 합니다. 현재 이름: " + input); + } + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/racingcar/domain/players/Player.java b/src/main/java/racingcar/domain/players/Player.java new file mode 100644 index 0000000..07a86e2 --- /dev/null +++ b/src/main/java/racingcar/domain/players/Player.java @@ -0,0 +1,14 @@ +package racingcar.domain.players; + +public class Player { + private final Name name; + + private final Distance distance; + + + public Player(Name name, Distance distance) { + this.name = name; + this.distance = distance; + } + +} diff --git a/src/main/java/racingcar/domain/players/Players.java b/src/main/java/racingcar/domain/players/Players.java new file mode 100644 index 0000000..9c1f723 --- /dev/null +++ b/src/main/java/racingcar/domain/players/Players.java @@ -0,0 +1,14 @@ +package racingcar.domain.players; + +import java.util.List; + +public class Players { + private final List players; + + public Players(final List players) { + validate(players); + this.players = List.copyOf(players); + } + private void validate(final List players) { + } +} diff --git a/src/main/java/racingcar/domain/random/Random.java b/src/main/java/racingcar/domain/random/Random.java new file mode 100644 index 0000000..88e3778 --- /dev/null +++ b/src/main/java/racingcar/domain/random/Random.java @@ -0,0 +1,4 @@ +package racingcar.domain.random; + +public class Random { +} diff --git a/src/main/java/racingcar/domain/trycount/TryCount.java b/src/main/java/racingcar/domain/trycount/TryCount.java new file mode 100644 index 0000000..0d26248 --- /dev/null +++ b/src/main/java/racingcar/domain/trycount/TryCount.java @@ -0,0 +1,30 @@ +package racingcar.domain.trycount; + +public class TryCount { + + private static final String NOT_AN_INTEGER = "[ERROR] 정수가 아닙니다."; + private static final String LESS_THAN_ZERO = "[ERROR] 정수가 0보다 작습니다."; + + private static final String INTEGER_REGEX = "[+-]?\\d*(\\.\\d+)?"; + private final int cnt; + + + public TryCount(String input) { + validate(input); + this.cnt = Integer.parseInt(input); + } + private void validate(final String input) { + validateInteger(input); + validateBiggerThanZero(Integer.parseInt(input)); + } + private void validateInteger(final String input) { + if (!(input.matches(INTEGER_REGEX))) { + throw new IllegalArgumentException(NOT_AN_INTEGER); + } + } + private void validateBiggerThanZero(final int input) { + if (input<=0) { + throw new IllegalArgumentException(LESS_THAN_ZERO); + } + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 0000000..5e5c33a --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,24 @@ +package racingcar.view; + +import org.kokodak.Console; +import java.util.List; + +public class InputView { + + public List readNames() { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + final String input = Console.readLine(); + + final List names = Parser.parseByDelimiter(input, ","); + + System.out.println(names); + + return Parser.trim(names); + } + public String readTryCount() { + System.out.println(); + System.out.println("시도할 회수는 몇회인가요?"); + + return Console.readLine(); + } +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/racingcar/view/OutputView.java similarity index 55% rename from src/main/java/view/ResultView.java rename to src/main/java/racingcar/view/OutputView.java index 95ecf25..c2b40e2 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -1,6 +1,6 @@ -package view; +package racingcar.view; -public class ResultView { +public class OutputView { public static void printWinners(Object winners) { } } diff --git a/src/main/java/racingcar/view/Parser.java b/src/main/java/racingcar/view/Parser.java new file mode 100644 index 0000000..32206ce --- /dev/null +++ b/src/main/java/racingcar/view/Parser.java @@ -0,0 +1,17 @@ +package racingcar.view; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Parser { + + public static List parseByDelimiter(final String value, final String delimiter) { + return Arrays.asList(value.split(delimiter, -1)); + } + public static List trim(final List values) { + return values.stream() + .map(String::trim) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java deleted file mode 100644 index f690b28..0000000 --- a/src/main/java/view/InputView.java +++ /dev/null @@ -1,9 +0,0 @@ -package view; - -public class InputView { - public static Object getCarNames() { - } - - public static Object getTryCount() { - } -} diff --git a/src/test/java/racingcar/domain/RacingGameTest.java b/src/test/java/racingcar/domain/RacingGameTest.java new file mode 100644 index 0000000..375635c --- /dev/null +++ b/src/test/java/racingcar/domain/RacingGameTest.java @@ -0,0 +1,4 @@ +package racingcar.domain; + +public class RacingGameTest { +} diff --git a/src/test/java/racingcar/domain/players/DistanceTest.java b/src/test/java/racingcar/domain/players/DistanceTest.java new file mode 100644 index 0000000..145f911 --- /dev/null +++ b/src/test/java/racingcar/domain/players/DistanceTest.java @@ -0,0 +1,4 @@ +package racingcar.domain.players; + +public class DistanceTest { +} diff --git a/src/test/java/racingcar/domain/players/NameTest.java b/src/test/java/racingcar/domain/players/NameTest.java new file mode 100644 index 0000000..08ab6e3 --- /dev/null +++ b/src/test/java/racingcar/domain/players/NameTest.java @@ -0,0 +1,4 @@ +package racingcar.domain.players; + +public class NameTest { +} diff --git a/src/test/java/racingcar/domain/players/PlayersTest.java b/src/test/java/racingcar/domain/players/PlayersTest.java new file mode 100644 index 0000000..a0d2906 --- /dev/null +++ b/src/test/java/racingcar/domain/players/PlayersTest.java @@ -0,0 +1,4 @@ +package racingcar.domain.players; + +public class PlayersTest { +} diff --git a/src/test/java/racingcar/domain/random/RandomTest.java b/src/test/java/racingcar/domain/random/RandomTest.java new file mode 100644 index 0000000..eb251bc --- /dev/null +++ b/src/test/java/racingcar/domain/random/RandomTest.java @@ -0,0 +1,4 @@ +package racingcar.domain.random; + +public class RandomTest { +} diff --git a/src/test/java/racingcar/domain/trycount/TryCountTest.java b/src/test/java/racingcar/domain/trycount/TryCountTest.java new file mode 100644 index 0000000..45966ee --- /dev/null +++ b/src/test/java/racingcar/domain/trycount/TryCountTest.java @@ -0,0 +1,19 @@ +package racingcar.domain.trycount; + +import domain.trycount.TryCount; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class TryCountTest { + @DisplayName("횟수가 0 이하면 예외가 발생한다.") + @ParameterizedTest + @ValueSource(strings = {"0", "-1", "-1000", "-123123"}) + void AmountIsLessThan0(String amount) { + assertThatThrownBy(() -> new TryCount(amount)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("[ERROR]"); + } +} diff --git a/src/test/java/racingcar/view/ParserTest.java b/src/test/java/racingcar/view/ParserTest.java new file mode 100644 index 0000000..42083bc --- /dev/null +++ b/src/test/java/racingcar/view/ParserTest.java @@ -0,0 +1,37 @@ +package racingcar.view; + +import org.junit.jupiter.api.Test; +import view.Parser; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ParserTest { + @Test + void 구분자를_기준으로_문자열을_파싱한다() { + final String value = "pobi,jason"; + + final List result = Parser.parseByDelimiter(value, ","); + + assertThat(result).containsExactly("pobi", "jason"); + } + + @Test + void 구분자를_기준으로_빈문자열을_파싱한다() { + final String value = ",,"; + + final List result = Parser.parseByDelimiter(value, ","); + + assertThat(result).containsExactly("", "", ""); + } + + @Test + void 문자열의_앞뒤_공백은_제거한다() { + final List value = List.of(" pobi", "jason ", " crong "); + + final List result = Parser.trim(value); + + assertThat(result).containsExactly("pobi", "jason", "crong"); + } +} From b7697b9634c21135ff6af8ee376c03f5b27b6e57 Mon Sep 17 00:00:00 2001 From: Deld Date: Tue, 16 Apr 2024 21:20:01 +0900 Subject: [PATCH 3/8] input --- .../controller/RacingCarController.java | 21 +++++++++++++++++++ .../java/racingcar/domain/players/Player.java | 13 ++++++++---- .../racingcar/domain/players/Players.java | 10 +++++++++ src/main/java/racingcar/view/InputView.java | 2 -- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingCarController.java b/src/main/java/racingcar/controller/RacingCarController.java index 38704aa..794ecc3 100644 --- a/src/main/java/racingcar/controller/RacingCarController.java +++ b/src/main/java/racingcar/controller/RacingCarController.java @@ -1,8 +1,14 @@ package racingcar.controller; +import racingcar.domain.players.Player; +import racingcar.domain.players.Players; import racingcar.view.InputView; import racingcar.view.OutputView; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + public class RacingCarController { private final InputView inputView; private final OutputView outputView; @@ -12,6 +18,21 @@ public RacingCarController(final InputView inputView, final OutputView outputVie this.outputView = outputView; } public void run() { + final Players players = getPlayers(); + players.getPlayers(); } + private Players getPlayers() { + final List players = new ArrayList<>(); + + players.addAll(createPlayers()); + + return new Players(players); + } + private List createPlayers() { + final List playerNames = inputView.readNames(); + return playerNames.stream() + .map(Player::new) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/racingcar/domain/players/Player.java b/src/main/java/racingcar/domain/players/Player.java index 07a86e2..34f2eac 100644 --- a/src/main/java/racingcar/domain/players/Player.java +++ b/src/main/java/racingcar/domain/players/Player.java @@ -3,12 +3,17 @@ public class Player { private final Name name; - private final Distance distance; + private Distance distance; + public Player(String name) { + this.name = new Name(name); + } - public Player(Name name, Distance distance) { - this.name = name; - this.distance = distance; + public String getName() { + return name.getName(); } + public Distance getDistance() { + return distance; + } } diff --git a/src/main/java/racingcar/domain/players/Players.java b/src/main/java/racingcar/domain/players/Players.java index 9c1f723..d60321d 100644 --- a/src/main/java/racingcar/domain/players/Players.java +++ b/src/main/java/racingcar/domain/players/Players.java @@ -11,4 +11,14 @@ public Players(final List players) { } private void validate(final List players) { } + + public void getPlayers() { + for(Player p:this.players){ + System.out.println(p.getName()); + System.out.println(p.getDistance()); + System.out.println(); + System.out.println(); + } + + } } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 5e5c33a..eaa0e74 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -11,8 +11,6 @@ public List readNames() { final List names = Parser.parseByDelimiter(input, ","); - System.out.println(names); - return Parser.trim(names); } public String readTryCount() { From 57feebfc9825524956d61b411d57b6bd6235bbbd Mon Sep 17 00:00:00 2001 From: Deld Date: Wed, 17 Apr 2024 02:53:17 +0900 Subject: [PATCH 4/8] domain, input --- .../racingcar/controller/RacingCarController.java | 12 +++++++++++- .../java/racingcar/domain/players/Distance.java | 14 +++++++++++++- .../java/racingcar/domain/players/Player.java | 6 +++--- .../java/racingcar/domain/players/Players.java | 2 +- src/main/java/racingcar/domain/random/Random.java | 15 +++++++++++++++ .../java/racingcar/domain/trycount/TryCount.java | 10 ++++++---- src/main/java/racingcar/view/InputView.java | 7 ++++--- .../racingcar/domain/trycount/TryCountTest.java | 2 +- src/test/java/racingcar/view/ParserTest.java | 2 +- 9 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingCarController.java b/src/main/java/racingcar/controller/RacingCarController.java index 794ecc3..1e46087 100644 --- a/src/main/java/racingcar/controller/RacingCarController.java +++ b/src/main/java/racingcar/controller/RacingCarController.java @@ -2,6 +2,7 @@ import racingcar.domain.players.Player; import racingcar.domain.players.Players; +import racingcar.domain.trycount.TryCount; import racingcar.view.InputView; import racingcar.view.OutputView; @@ -20,17 +21,26 @@ public RacingCarController(final InputView inputView, final OutputView outputVie public void run() { final Players players = getPlayers(); players.getPlayers(); + + final TryCount tryCount = getTryCount(); + System.out.println(tryCount.getTryCount()); + + + } + + private TryCount getTryCount() { + return inputView.readTryCount(); } private Players getPlayers() { final List players = new ArrayList<>(); - players.addAll(createPlayers()); return new Players(players); } private List createPlayers() { final List playerNames = inputView.readNames(); + return playerNames.stream() .map(Player::new) .collect(Collectors.toList()); diff --git a/src/main/java/racingcar/domain/players/Distance.java b/src/main/java/racingcar/domain/players/Distance.java index 7985541..827de50 100644 --- a/src/main/java/racingcar/domain/players/Distance.java +++ b/src/main/java/racingcar/domain/players/Distance.java @@ -1,9 +1,21 @@ package racingcar.domain.players; +import racingcar.domain.random.Random; + public class Distance { - private final String distance=""; + private String distance=""; + + private void move(){ + final Random random = new Random(); + if(random.getRandom()>=4) + moveForward(); + } public void moveForward(){ + this.distance+="-"; } + public String getDistance() { + return distance; + } } diff --git a/src/main/java/racingcar/domain/players/Player.java b/src/main/java/racingcar/domain/players/Player.java index 34f2eac..c22bf1b 100644 --- a/src/main/java/racingcar/domain/players/Player.java +++ b/src/main/java/racingcar/domain/players/Player.java @@ -2,18 +2,18 @@ public class Player { private final Name name; - private Distance distance; public Player(String name) { this.name = new Name(name); + this.distance = new Distance(); } public String getName() { return name.getName(); } - public Distance getDistance() { - return distance; + public String getDistance() { + return distance.getDistance(); } } diff --git a/src/main/java/racingcar/domain/players/Players.java b/src/main/java/racingcar/domain/players/Players.java index d60321d..0e50081 100644 --- a/src/main/java/racingcar/domain/players/Players.java +++ b/src/main/java/racingcar/domain/players/Players.java @@ -19,6 +19,6 @@ public void getPlayers() { System.out.println(); System.out.println(); } - } + } diff --git a/src/main/java/racingcar/domain/random/Random.java b/src/main/java/racingcar/domain/random/Random.java index 88e3778..4704dfb 100644 --- a/src/main/java/racingcar/domain/random/Random.java +++ b/src/main/java/racingcar/domain/random/Random.java @@ -1,4 +1,19 @@ package racingcar.domain.random; +import org.kokodak.Randoms; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + public class Random { + private final int random; + + public Random() { + this.random =Randoms.pickNumberInRange(1, 9); + } + + public int getRandom() { + return random; + } } diff --git a/src/main/java/racingcar/domain/trycount/TryCount.java b/src/main/java/racingcar/domain/trycount/TryCount.java index 0d26248..720946d 100644 --- a/src/main/java/racingcar/domain/trycount/TryCount.java +++ b/src/main/java/racingcar/domain/trycount/TryCount.java @@ -4,14 +4,12 @@ public class TryCount { private static final String NOT_AN_INTEGER = "[ERROR] 정수가 아닙니다."; private static final String LESS_THAN_ZERO = "[ERROR] 정수가 0보다 작습니다."; - private static final String INTEGER_REGEX = "[+-]?\\d*(\\.\\d+)?"; - private final int cnt; - + private final int tryCount; public TryCount(String input) { validate(input); - this.cnt = Integer.parseInt(input); + this.tryCount = Integer.parseInt(input); } private void validate(final String input) { validateInteger(input); @@ -27,4 +25,8 @@ private void validateBiggerThanZero(final int input) { throw new IllegalArgumentException(LESS_THAN_ZERO); } } + + public int getTryCount() { + return tryCount; + } } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index eaa0e74..b61eed0 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -1,6 +1,8 @@ package racingcar.view; import org.kokodak.Console; +import racingcar.domain.trycount.TryCount; + import java.util.List; public class InputView { @@ -8,15 +10,14 @@ public class InputView { public List readNames() { System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); final String input = Console.readLine(); - final List names = Parser.parseByDelimiter(input, ","); return Parser.trim(names); } - public String readTryCount() { + public TryCount readTryCount() { System.out.println(); System.out.println("시도할 회수는 몇회인가요?"); - return Console.readLine(); + return new TryCount(Console.readLine()); } } diff --git a/src/test/java/racingcar/domain/trycount/TryCountTest.java b/src/test/java/racingcar/domain/trycount/TryCountTest.java index 45966ee..75750b1 100644 --- a/src/test/java/racingcar/domain/trycount/TryCountTest.java +++ b/src/test/java/racingcar/domain/trycount/TryCountTest.java @@ -1,6 +1,6 @@ package racingcar.domain.trycount; -import domain.trycount.TryCount; +import racingcar.domain.trycount.TryCount; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/src/test/java/racingcar/view/ParserTest.java b/src/test/java/racingcar/view/ParserTest.java index 42083bc..2a99bed 100644 --- a/src/test/java/racingcar/view/ParserTest.java +++ b/src/test/java/racingcar/view/ParserTest.java @@ -1,7 +1,7 @@ package racingcar.view; import org.junit.jupiter.api.Test; -import view.Parser; +import racingcar.view.Parser; import java.util.List; From 4ab6045f54187321a681bd91d831b934ceecd6ed Mon Sep 17 00:00:00 2001 From: Deld Date: Wed, 17 Apr 2024 18:06:28 +0900 Subject: [PATCH 5/8] game --- .../controller/RacingCarController.java | 36 +++++++++++++++++-- .../java/racingcar/domain/RacingGame.java | 14 ++++++-- .../racingcar/domain/players/Distance.java | 4 +-- .../java/racingcar/domain/players/Player.java | 4 +++ .../racingcar/domain/players/Players.java | 12 +++---- .../java/racingcar/domain/random/Random.java | 6 +--- src/main/java/racingcar/view/InputView.java | 6 ++-- src/main/java/racingcar/view/OutputView.java | 16 ++++++++- .../racingcar/view/dto/PlayerResponse.java | 27 ++++++++++++++ 9 files changed, 101 insertions(+), 24 deletions(-) create mode 100644 src/main/java/racingcar/view/dto/PlayerResponse.java diff --git a/src/main/java/racingcar/controller/RacingCarController.java b/src/main/java/racingcar/controller/RacingCarController.java index 1e46087..d5cc3d3 100644 --- a/src/main/java/racingcar/controller/RacingCarController.java +++ b/src/main/java/racingcar/controller/RacingCarController.java @@ -1,10 +1,12 @@ package racingcar.controller; +import racingcar.domain.RacingGame; import racingcar.domain.players.Player; import racingcar.domain.players.Players; import racingcar.domain.trycount.TryCount; import racingcar.view.InputView; import racingcar.view.OutputView; +import racingcar.view.dto.PlayerResponse; import java.util.ArrayList; import java.util.List; @@ -20,16 +22,44 @@ public RacingCarController(final InputView inputView, final OutputView outputVie } public void run() { final Players players = getPlayers(); - players.getPlayers(); final TryCount tryCount = getTryCount(); - System.out.println(tryCount.getTryCount()); + final RacingGame racingGame = initRacingGame(players, tryCount); + + for(int i=0; i=4) moveForward(); } - public void moveForward(){ + private void moveForward(){ this.distance+="-"; } diff --git a/src/main/java/racingcar/domain/players/Player.java b/src/main/java/racingcar/domain/players/Player.java index c22bf1b..073b69d 100644 --- a/src/main/java/racingcar/domain/players/Player.java +++ b/src/main/java/racingcar/domain/players/Player.java @@ -16,4 +16,8 @@ public String getName() { public String getDistance() { return distance.getDistance(); } + + public void race() { + distance.move(); + } } diff --git a/src/main/java/racingcar/domain/players/Players.java b/src/main/java/racingcar/domain/players/Players.java index 0e50081..6b84345 100644 --- a/src/main/java/racingcar/domain/players/Players.java +++ b/src/main/java/racingcar/domain/players/Players.java @@ -12,13 +12,11 @@ public Players(final List players) { private void validate(final List players) { } - public void getPlayers() { - for(Player p:this.players){ - System.out.println(p.getName()); - System.out.println(p.getDistance()); - System.out.println(); - System.out.println(); - } + public void race() { + players.forEach(player -> player.race()); } + public List getPlayers() { + return players; + } } diff --git a/src/main/java/racingcar/domain/random/Random.java b/src/main/java/racingcar/domain/random/Random.java index 4704dfb..79bf552 100644 --- a/src/main/java/racingcar/domain/random/Random.java +++ b/src/main/java/racingcar/domain/random/Random.java @@ -2,15 +2,11 @@ import org.kokodak.Randoms; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - public class Random { private final int random; public Random() { - this.random =Randoms.pickNumberInRange(1, 9); + this.random = Randoms.pickNumberInRange(0, 9); } public int getRandom() { diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index b61eed0..b1b0578 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -1,7 +1,6 @@ package racingcar.view; import org.kokodak.Console; -import racingcar.domain.trycount.TryCount; import java.util.List; @@ -14,10 +13,9 @@ public List readNames() { return Parser.trim(names); } - public TryCount readTryCount() { - System.out.println(); + public String readTryCount() { System.out.println("시도할 회수는 몇회인가요?"); - return new TryCount(Console.readLine()); + return Console.readLine(); } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index c2b40e2..b83be4f 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -1,6 +1,20 @@ package racingcar.view; +import racingcar.view.dto.PlayerResponse; + +import static java.text.MessageFormat.format; + public class OutputView { - public static void printWinners(Object winners) { + + public void printa(final PlayerResponse player) { + System.out.println(getPlayersData(player)); } + + private String getPlayersData(final PlayerResponse player) { + final String name = player.getName(); + final String distance = player.getDistance(); + + return format("{0} : {1}\n", name, distance); + } + } diff --git a/src/main/java/racingcar/view/dto/PlayerResponse.java b/src/main/java/racingcar/view/dto/PlayerResponse.java new file mode 100644 index 0000000..c1f7fd6 --- /dev/null +++ b/src/main/java/racingcar/view/dto/PlayerResponse.java @@ -0,0 +1,27 @@ +package racingcar.view.dto; + +import racingcar.domain.players.Player; + +public class PlayerResponse { + private final String name; + private final String distance; + + private PlayerResponse(final String name, final String distance) { + this.name = name; + this.distance = distance; + } + + public static PlayerResponse from(final Player player) { + final String name = player.getName(); + final String distance = player.getDistance(); + return new PlayerResponse(name, distance); + } + + public String getName() { + return name; + } + public String getDistance() { + return distance; + } + +} From 7f8e4038f4d4e963975c72bdb27639f5aca1f120 Mon Sep 17 00:00:00 2001 From: Deld Date: Wed, 17 Apr 2024 21:53:36 +0900 Subject: [PATCH 6/8] main done --- .../controller/RacingCarController.java | 39 +++++++++++++------ .../java/racingcar/domain/RacingGame.java | 25 ++++++++++++ .../players/{Distance.java => Movement.java} | 10 ++--- .../java/racingcar/domain/players/Player.java | 14 ++++--- .../racingcar/domain/players/Players.java | 2 + src/main/java/racingcar/view/OutputView.java | 30 +++++++++++--- .../racingcar/view/dto/PlayerResponse.java | 14 +++---- 7 files changed, 101 insertions(+), 33 deletions(-) rename src/main/java/racingcar/domain/players/{Distance.java => Movement.java} (64%) diff --git a/src/main/java/racingcar/controller/RacingCarController.java b/src/main/java/racingcar/controller/RacingCarController.java index d5cc3d3..67e1817 100644 --- a/src/main/java/racingcar/controller/RacingCarController.java +++ b/src/main/java/racingcar/controller/RacingCarController.java @@ -22,27 +22,35 @@ public RacingCarController(final InputView inputView, final OutputView outputVie } public void run() { final Players players = getPlayers(); - final TryCount tryCount = getTryCount(); - final RacingGame racingGame = initRacingGame(players, tryCount); + PlayGame(racingGame); - for(int i=0; i playerResponses = getPlayerResponses(racingGame.findWinners()); + + outputView.printResult(playerResponses); + } + + private List getPlayerResponses(final List players) { + return players.stream() + .map(PlayerResponse::from) + .collect(Collectors.toList()); } private RacingGame initRacingGame(Players players, TryCount tryCount) { diff --git a/src/main/java/racingcar/domain/RacingGame.java b/src/main/java/racingcar/domain/RacingGame.java index 991b623..8a1de53 100644 --- a/src/main/java/racingcar/domain/RacingGame.java +++ b/src/main/java/racingcar/domain/RacingGame.java @@ -1,8 +1,12 @@ package racingcar.domain; +import racingcar.domain.players.Player; import racingcar.domain.players.Players; import racingcar.domain.trycount.TryCount; +import java.util.List; +import java.util.stream.Collectors; + public class RacingGame { private final Players players; @@ -17,4 +21,25 @@ public void startRace() { players.race(); } + public int getTryCount() { + return tryCount.getTryCount(); + } + + public List getPlayers() { + return players.getPlayers(); + } + + public List findWinners() { + int maxDistance = getMaxDistance(); + return players.getPlayers().stream() + .filter(p -> p.getDistance() == maxDistance) + .collect(Collectors.toList()); + } + private int getMaxDistance() { + return players.getPlayers().stream() + .mapToInt(Player::getDistance) + .max() + .orElse(0); + } } + diff --git a/src/main/java/racingcar/domain/players/Distance.java b/src/main/java/racingcar/domain/players/Movement.java similarity index 64% rename from src/main/java/racingcar/domain/players/Distance.java rename to src/main/java/racingcar/domain/players/Movement.java index 5d68052..d80f509 100644 --- a/src/main/java/racingcar/domain/players/Distance.java +++ b/src/main/java/racingcar/domain/players/Movement.java @@ -2,8 +2,8 @@ import racingcar.domain.random.Random; -public class Distance { - private String distance=""; +public class Movement { + private String movement =""; public void move(){ final Random random = new Random(); @@ -12,10 +12,10 @@ public void move(){ } private void moveForward(){ - this.distance+="-"; + this.movement +="-"; } - public String getDistance() { - return distance; + public String getMovement() { + return movement; } } diff --git a/src/main/java/racingcar/domain/players/Player.java b/src/main/java/racingcar/domain/players/Player.java index 073b69d..42940ab 100644 --- a/src/main/java/racingcar/domain/players/Player.java +++ b/src/main/java/racingcar/domain/players/Player.java @@ -2,22 +2,26 @@ public class Player { private final Name name; - private Distance distance; + private Movement movement; public Player(String name) { this.name = new Name(name); - this.distance = new Distance(); + this.movement = new Movement(); } public String getName() { return name.getName(); } - public String getDistance() { - return distance.getDistance(); + public String getMovement() { + return movement.getMovement(); + } + + public int getDistance() { + return movement.getMovement().length(); } public void race() { - distance.move(); + movement.move(); } } diff --git a/src/main/java/racingcar/domain/players/Players.java b/src/main/java/racingcar/domain/players/Players.java index 6b84345..5f89725 100644 --- a/src/main/java/racingcar/domain/players/Players.java +++ b/src/main/java/racingcar/domain/players/Players.java @@ -19,4 +19,6 @@ public void race() { public List getPlayers() { return players; } + + } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index b83be4f..50601fe 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -2,19 +2,39 @@ import racingcar.view.dto.PlayerResponse; +import java.util.List; +import java.util.stream.Collectors; + import static java.text.MessageFormat.format; public class OutputView { - public void printa(final PlayerResponse player) { - System.out.println(getPlayersData(player)); + private static final String PRINT_PATTERN = "{0} : {1}"; + + public void printPlayerData(final PlayerResponse player) { + System.out.println(getPlayerData(player)); } - private String getPlayersData(final PlayerResponse player) { + private String getPlayerData(final PlayerResponse player) { final String name = player.getName(); - final String distance = player.getDistance(); + final String movement = player.getMovement(); + + return format(PRINT_PATTERN, name, movement); + } - return format("{0} : {1}\n", name, distance); + public void printResultMessage() { + System.out.println(); + System.out.println("실행 결과"); + } + + public void printResult(final List players) { + System.out.println(); + System.out.println(format("{0}가 최종 우승했습니다.", getNamesFormat(players))); + } + private String getNamesFormat(final List players) { + return players.stream() + .map(PlayerResponse::getName) + .collect(Collectors.joining(", ")); } } diff --git a/src/main/java/racingcar/view/dto/PlayerResponse.java b/src/main/java/racingcar/view/dto/PlayerResponse.java index c1f7fd6..f98df59 100644 --- a/src/main/java/racingcar/view/dto/PlayerResponse.java +++ b/src/main/java/racingcar/view/dto/PlayerResponse.java @@ -4,24 +4,24 @@ public class PlayerResponse { private final String name; - private final String distance; + private final String movement; - private PlayerResponse(final String name, final String distance) { + private PlayerResponse(final String name, final String movement) { this.name = name; - this.distance = distance; + this.movement = movement; } public static PlayerResponse from(final Player player) { final String name = player.getName(); - final String distance = player.getDistance(); - return new PlayerResponse(name, distance); + final String movement = player.getMovement(); + return new PlayerResponse(name, movement); } public String getName() { return name; } - public String getDistance() { - return distance; + public String getMovement() { + return movement; } } From a2be170832401cb43a541dc63d7b6367228cd6cf Mon Sep 17 00:00:00 2001 From: Deld Date: Thu, 18 Apr 2024 16:50:32 +0900 Subject: [PATCH 7/8] tests --- src/main/java/racingcar/RacingMain.java | 2 +- .../controller/RacingCarController.java | 9 ++- .../java/racingcar/domain/RacingGame.java | 1 - .../racingcar/domain/players/Movement.java | 5 ++ .../java/racingcar/domain/players/Name.java | 21 ++++++- .../java/racingcar/domain/players/Player.java | 19 ++++++- .../racingcar/domain/players/Players.java | 15 +++-- src/main/java/racingcar/view/OutputView.java | 4 +- .../java/racingcar/domain/RacingGameTest.java | 56 +++++++++++++++++++ .../racingcar/domain/players/NameTest.java | 24 ++++++++ .../racingcar/domain/players/PlayersTest.java | 17 ++++++ .../racingcar/domain/random/RandomTest.java | 1 + .../domain/trycount/TryCountTest.java | 17 +++++- src/test/java/racingcar/view/ParserTest.java | 1 - 14 files changed, 172 insertions(+), 20 deletions(-) diff --git a/src/main/java/racingcar/RacingMain.java b/src/main/java/racingcar/RacingMain.java index d707f4a..c9842d0 100644 --- a/src/main/java/racingcar/RacingMain.java +++ b/src/main/java/racingcar/RacingMain.java @@ -5,7 +5,7 @@ import racingcar.view.OutputView; public class RacingMain { - public static void main(final String... args) { + public static void main(String[] args) { final InputView inputView = new InputView(); final OutputView outputView = new OutputView(); diff --git a/src/main/java/racingcar/controller/RacingCarController.java b/src/main/java/racingcar/controller/RacingCarController.java index 67e1817..7915317 100644 --- a/src/main/java/racingcar/controller/RacingCarController.java +++ b/src/main/java/racingcar/controller/RacingCarController.java @@ -30,7 +30,7 @@ public void run() { printResult(racingGame); } - private void PlayGame(RacingGame racingGame) { + private void PlayGame(final RacingGame racingGame) { printResultMessage(); final int tryCount = racingGame.getTryCount(); for(int i=0; i getPlayerResponses(final List players) { } private RacingGame initRacingGame(Players players, TryCount tryCount) { - final RacingGame racingGame = new RacingGame(players, tryCount); - - return racingGame; + return new RacingGame(players, tryCount); } private TryCount getTryCount() { diff --git a/src/main/java/racingcar/domain/RacingGame.java b/src/main/java/racingcar/domain/RacingGame.java index 8a1de53..06abfb8 100644 --- a/src/main/java/racingcar/domain/RacingGame.java +++ b/src/main/java/racingcar/domain/RacingGame.java @@ -9,7 +9,6 @@ public class RacingGame { private final Players players; - private final TryCount tryCount; public RacingGame(Players players, TryCount tryCount) { diff --git a/src/main/java/racingcar/domain/players/Movement.java b/src/main/java/racingcar/domain/players/Movement.java index d80f509..637b0c7 100644 --- a/src/main/java/racingcar/domain/players/Movement.java +++ b/src/main/java/racingcar/domain/players/Movement.java @@ -18,4 +18,9 @@ private void moveForward(){ public String getMovement() { return movement; } + + public int getDistance() { + return movement.length(); + } + } diff --git a/src/main/java/racingcar/domain/players/Name.java b/src/main/java/racingcar/domain/players/Name.java index d6cd0d9..1358c9a 100644 --- a/src/main/java/racingcar/domain/players/Name.java +++ b/src/main/java/racingcar/domain/players/Name.java @@ -1,5 +1,7 @@ package racingcar.domain.players; +import java.util.Objects; + public class Name { private static final int UPPER_BOUND = 5; @@ -23,7 +25,7 @@ private void validateNullAndBlank(final String input) { private void validateLength(final String input) { if (input.length() > UPPER_BOUND) { - throw new IllegalArgumentException("이름은 " + UPPER_BOUND + "글자 이하여야 합니다. 현재 이름: " + input); + throw new IllegalArgumentException("[ERROR] 이름은 " + UPPER_BOUND + "글자 이하여야 합니다. 현재 이름: " + input); } } @@ -31,4 +33,21 @@ public String getName() { return name; } + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Name n = (Name) o; + return Objects.equals(name, n.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + } diff --git a/src/main/java/racingcar/domain/players/Player.java b/src/main/java/racingcar/domain/players/Player.java index 42940ab..068df27 100644 --- a/src/main/java/racingcar/domain/players/Player.java +++ b/src/main/java/racingcar/domain/players/Player.java @@ -1,8 +1,10 @@ package racingcar.domain.players; +import java.util.Objects; + public class Player { private final Name name; - private Movement movement; + private final Movement movement; public Player(String name) { this.name = new Name(name); @@ -18,10 +20,23 @@ public String getMovement() { } public int getDistance() { - return movement.getMovement().length(); + return movement.getDistance(); } public void race() { movement.move(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Player player = (Player) o; + return Objects.equals(name, player.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } diff --git a/src/main/java/racingcar/domain/players/Players.java b/src/main/java/racingcar/domain/players/Players.java index 5f89725..acd69a2 100644 --- a/src/main/java/racingcar/domain/players/Players.java +++ b/src/main/java/racingcar/domain/players/Players.java @@ -1,24 +1,29 @@ package racingcar.domain.players; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class Players { private final List players; public Players(final List players) { - validate(players); + validateDuplicate(players); this.players = List.copyOf(players); } - private void validate(final List players) { - } + private void validateDuplicate(final List players) { + final Set uniquePlayers = new HashSet<>(players); + if (uniquePlayers.size() != players.size()) { + throw new IllegalArgumentException("[ERROR] 참가자 이름은 중복될 수 없습니다."); + } + } public void race() { - players.forEach(player -> player.race()); + players.forEach(Player::race); } public List getPlayers() { return players; } - } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 50601fe..50baf1f 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -28,7 +28,6 @@ public void printResultMessage() { } public void printResult(final List players) { - System.out.println(); System.out.println(format("{0}가 최종 우승했습니다.", getNamesFormat(players))); } private String getNamesFormat(final List players) { @@ -37,4 +36,7 @@ private String getNamesFormat(final List players) { .collect(Collectors.joining(", ")); } + public void println() { + System.out.println(); + } } diff --git a/src/test/java/racingcar/domain/RacingGameTest.java b/src/test/java/racingcar/domain/RacingGameTest.java index 375635c..5a90729 100644 --- a/src/test/java/racingcar/domain/RacingGameTest.java +++ b/src/test/java/racingcar/domain/RacingGameTest.java @@ -1,4 +1,60 @@ package racingcar.domain; +import org.junit.jupiter.api.BeforeEach; +import racingcar.domain.players.Player; +import racingcar.domain.players.Players; +import racingcar.domain.trycount.TryCount; + +import java.util.List; + public class RacingGameTest { + private Players players; + private TryCount tryCount; + + @BeforeEach + void init() { + players = new Players(List.of( + new Player("kokodak"), + new Player("kuku"), + new Player("cucu") + )); + tryCount = new TryCount("1"); + + } + +// @Test +// void 승자를_찾는다() { +// List L = new ArrayList<>() {{ +// add(new Player("aa")); +// add(new Player("bb")); +// }}; +// +// final RacingGame racingGame = new RacingGame(players, tryCount); +// +// final List winners = racingGame.findWinners(); +// +// assertThat(winners).isEqualTo(L); +// } +// +// @Test +// void 카드를_더_받을_수_있는_플레이어가_없다면_예외를_던진다() { +// final Player kokodak = new Player("kokodak"); +// final Player dani = new Player("dani"); +// participants = new Participants(List.of(new Dealer(), kokodak, dani)); +// final BlackJackGame blackJackGame = new BlackJackGame(participants, deck, bettingManager, 0); +// +// blackJackGame.drawOrNot(false, kokodak); +// blackJackGame.drawOrNot(false, dani); +// +// assertThatThrownBy(blackJackGame::findDrawablePlayer) +// .isInstanceOf(NoSuchElementException.class) +// .hasMessage("카드를 받을 수 있는 플레이어가 존재하지 않습니다."); +// } +// +// @Test +// void 카드를_더_받을_수_있는_플레이어가_있는지_확인한다() { +// final BlackJackGame blackJackGame = new BlackJackGame(participants, deck, bettingManager, 0); +// +// assertThat(blackJackGame.existDrawablePlayer()).isTrue(); +// } } diff --git a/src/test/java/racingcar/domain/players/NameTest.java b/src/test/java/racingcar/domain/players/NameTest.java index 08ab6e3..d84ed7b 100644 --- a/src/test/java/racingcar/domain/players/NameTest.java +++ b/src/test/java/racingcar/domain/players/NameTest.java @@ -1,4 +1,28 @@ package racingcar.domain.players; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + public class NameTest { + + @DisplayName("이름이 존재하지 않으면 예외가 발생한다.") + @ParameterizedTest + @ValueSource(strings = {"", " "}) + void ValueIsNotExist(String value) { + assertThatThrownBy(() -> new Name(value)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("[ERROR]"); + } + + @DisplayName("이름이 글자수를 초과하면 예외가 발생한다.") + @ParameterizedTest + @ValueSource(strings = {"123456", "aaaaaaaaaaaa", "-100770"}) + void ValueExceedsLength(String value) { + assertThatThrownBy(() -> new Name(value)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("[ERROR]"); + } } diff --git a/src/test/java/racingcar/domain/players/PlayersTest.java b/src/test/java/racingcar/domain/players/PlayersTest.java index a0d2906..599a217 100644 --- a/src/test/java/racingcar/domain/players/PlayersTest.java +++ b/src/test/java/racingcar/domain/players/PlayersTest.java @@ -1,4 +1,21 @@ package racingcar.domain.players; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + public class PlayersTest { + @Test + void 중복되는_이름이_존재하면_예외를_던진다() { + final List players = List.of( + new Player("dazzl"), + new Player("dazzl"), + new Player("koko")); + + assertThatThrownBy(() -> new Players(players)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("[ERROR]"); + } } diff --git a/src/test/java/racingcar/domain/random/RandomTest.java b/src/test/java/racingcar/domain/random/RandomTest.java index eb251bc..1cfae6e 100644 --- a/src/test/java/racingcar/domain/random/RandomTest.java +++ b/src/test/java/racingcar/domain/random/RandomTest.java @@ -1,4 +1,5 @@ package racingcar.domain.random; public class RandomTest { + } diff --git a/src/test/java/racingcar/domain/trycount/TryCountTest.java b/src/test/java/racingcar/domain/trycount/TryCountTest.java index 75750b1..e4fcaf6 100644 --- a/src/test/java/racingcar/domain/trycount/TryCountTest.java +++ b/src/test/java/racingcar/domain/trycount/TryCountTest.java @@ -1,6 +1,5 @@ package racingcar.domain.trycount; -import racingcar.domain.trycount.TryCount; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -8,12 +7,24 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TryCountTest { + + @DisplayName("횟수가 정수가 아니면 예외가 발생한다.") + @ParameterizedTest + @ValueSource(strings = {"100j", "aaaa", "@@", "-50@800"}) + void ValueIsNotAnInteger(String value) { + assertThatThrownBy(() -> new TryCount(value)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("[ERROR]"); + } + @DisplayName("횟수가 0 이하면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"0", "-1", "-1000", "-123123"}) - void AmountIsLessThan0(String amount) { - assertThatThrownBy(() -> new TryCount(amount)) + void ValueIsLessThanZero(String value) { + assertThatThrownBy(() -> new TryCount(value)) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("[ERROR]"); } + + } diff --git a/src/test/java/racingcar/view/ParserTest.java b/src/test/java/racingcar/view/ParserTest.java index 2a99bed..e166ac8 100644 --- a/src/test/java/racingcar/view/ParserTest.java +++ b/src/test/java/racingcar/view/ParserTest.java @@ -1,7 +1,6 @@ package racingcar.view; import org.junit.jupiter.api.Test; -import racingcar.view.Parser; import java.util.List; From 00750dd9b288cfbfda4abcc3836edaeb7505303b Mon Sep 17 00:00:00 2001 From: Deld Date: Thu, 18 Apr 2024 17:06:59 +0900 Subject: [PATCH 8/8] Done --- README.md | 2 +- .../java/racingcar/domain/players/Name.java | 2 +- .../java/racingcar/domain/RacingGameTest.java | 60 ------------------- .../domain/players/DistanceTest.java | 4 -- .../racingcar/domain/random/RandomTest.java | 5 -- .../domain/trycount/TryCountTest.java | 2 +- 6 files changed, 3 insertions(+), 72 deletions(-) delete mode 100644 src/test/java/racingcar/domain/RacingGameTest.java delete mode 100644 src/test/java/racingcar/domain/players/DistanceTest.java delete mode 100644 src/test/java/racingcar/domain/random/RandomTest.java diff --git a/README.md b/README.md index 07cbdec..ebec1a3 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ graph TD ### RacingGame -- [x] Player와 Trycount 관리한다. +- [x] Players와 Trycount 관리한다. ### Players diff --git a/src/main/java/racingcar/domain/players/Name.java b/src/main/java/racingcar/domain/players/Name.java index 1358c9a..1bb9026 100644 --- a/src/main/java/racingcar/domain/players/Name.java +++ b/src/main/java/racingcar/domain/players/Name.java @@ -19,7 +19,7 @@ private void validate(final String input) { private void validateNullAndBlank(final String input) { if (input == null || input.isBlank()) { - throw new IllegalArgumentException("[ERROR] 이름은 존재해야 합니다. 현재 이름: " + input); + throw new IllegalArgumentException("[ERROR] 이름이 존재하지 않습니다."); } } diff --git a/src/test/java/racingcar/domain/RacingGameTest.java b/src/test/java/racingcar/domain/RacingGameTest.java deleted file mode 100644 index 5a90729..0000000 --- a/src/test/java/racingcar/domain/RacingGameTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package racingcar.domain; - -import org.junit.jupiter.api.BeforeEach; -import racingcar.domain.players.Player; -import racingcar.domain.players.Players; -import racingcar.domain.trycount.TryCount; - -import java.util.List; - -public class RacingGameTest { - private Players players; - private TryCount tryCount; - - @BeforeEach - void init() { - players = new Players(List.of( - new Player("kokodak"), - new Player("kuku"), - new Player("cucu") - )); - tryCount = new TryCount("1"); - - } - -// @Test -// void 승자를_찾는다() { -// List L = new ArrayList<>() {{ -// add(new Player("aa")); -// add(new Player("bb")); -// }}; -// -// final RacingGame racingGame = new RacingGame(players, tryCount); -// -// final List winners = racingGame.findWinners(); -// -// assertThat(winners).isEqualTo(L); -// } -// -// @Test -// void 카드를_더_받을_수_있는_플레이어가_없다면_예외를_던진다() { -// final Player kokodak = new Player("kokodak"); -// final Player dani = new Player("dani"); -// participants = new Participants(List.of(new Dealer(), kokodak, dani)); -// final BlackJackGame blackJackGame = new BlackJackGame(participants, deck, bettingManager, 0); -// -// blackJackGame.drawOrNot(false, kokodak); -// blackJackGame.drawOrNot(false, dani); -// -// assertThatThrownBy(blackJackGame::findDrawablePlayer) -// .isInstanceOf(NoSuchElementException.class) -// .hasMessage("카드를 받을 수 있는 플레이어가 존재하지 않습니다."); -// } -// -// @Test -// void 카드를_더_받을_수_있는_플레이어가_있는지_확인한다() { -// final BlackJackGame blackJackGame = new BlackJackGame(participants, deck, bettingManager, 0); -// -// assertThat(blackJackGame.existDrawablePlayer()).isTrue(); -// } -} diff --git a/src/test/java/racingcar/domain/players/DistanceTest.java b/src/test/java/racingcar/domain/players/DistanceTest.java deleted file mode 100644 index 145f911..0000000 --- a/src/test/java/racingcar/domain/players/DistanceTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package racingcar.domain.players; - -public class DistanceTest { -} diff --git a/src/test/java/racingcar/domain/random/RandomTest.java b/src/test/java/racingcar/domain/random/RandomTest.java deleted file mode 100644 index 1cfae6e..0000000 --- a/src/test/java/racingcar/domain/random/RandomTest.java +++ /dev/null @@ -1,5 +0,0 @@ -package racingcar.domain.random; - -public class RandomTest { - -} diff --git a/src/test/java/racingcar/domain/trycount/TryCountTest.java b/src/test/java/racingcar/domain/trycount/TryCountTest.java index e4fcaf6..03cd79a 100644 --- a/src/test/java/racingcar/domain/trycount/TryCountTest.java +++ b/src/test/java/racingcar/domain/trycount/TryCountTest.java @@ -10,7 +10,7 @@ public class TryCountTest { @DisplayName("횟수가 정수가 아니면 예외가 발생한다.") @ParameterizedTest - @ValueSource(strings = {"100j", "aaaa", "@@", "-50@800"}) + @ValueSource(strings = {"100j", "aaaa10","bbbb"}) void ValueIsNotAnInteger(String value) { assertThatThrownBy(() -> new TryCount(value)) .isInstanceOf(IllegalArgumentException.class)