From d31d9989e9c8753c2dcdd50da657d3c402c866ee Mon Sep 17 00:00:00 2001 From: Heesoo Date: Thu, 7 Nov 2024 15:12:07 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[doc]=20README.md=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-HS.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 README-HS.md diff --git a/README-HS.md b/README-HS.md new file mode 100644 index 0000000..b5be4fc --- /dev/null +++ b/README-HS.md @@ -0,0 +1,25 @@ +## 프로그래밍 요구사항 +1. depth 2까지 가능 +2. else, switch, 3항 연산자 사용 불가 +3. 함수 또는 메소드는 한 가지 일만 하도록 구현 +4. 모든 기능 단위 테스트 존재 필수 (System.out, System.in 로직 제외) +5. 모든 원시 값과 문자열 포장 +6. 일급 컬렉션 사용 + + +--- + +## 구현 기능 +1. 게임 설명 출력 +2. 자동차 이름 입력 + 1. 이름이 5자 미만인지 검증 + 2. 자동차 이름이 쉼표로 구분되어 있는지 검증 +3. 시도 횟수 질문 출력 +4. 시도 횟수 입력 + 1. 숫자 입력 했는지 검증 +5. 게임 시작 (시도 횟수 만큼 반복) + 1. random 값 생성 + 2. random 값이 4 이상일 경우 전진 + 3. 실행 결과 출력 +5. 게임 결과, 최종 우승자 출력 + \ No newline at end of file From a0f529c71a0b39cc4aa73e6b71683de094fad8aa Mon Sep 17 00:00:00 2001 From: Heesoo Date: Thu, 14 Nov 2024 18:29:50 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[feat]=20=EC=9E=90=EB=8F=99=EC=9E=90=20?= =?UTF-8?q?=EA=B2=BD=EC=A3=BC=20=EA=B2=8C=EC=9E=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-HS.md | 7 +- src/main/java/RacingCarApplication.java | 18 +++ src/main/java/racingcar/RacingCarGame.java | 37 +++++ src/main/java/racingcar/RacingCarRandom.java | 12 ++ src/main/java/racingcar/RacingResult.java | 13 ++ .../java/racingcar/message/ErrorMessages.java | 7 + src/main/java/racingcar/model/RacingCar.java | 40 +++++ src/main/java/racingcar/model/RacingCars.java | 52 +++++++ .../racingcar/scanner/RacingCarScanner.java | 62 ++++++++ .../racingcar/validation/InputValidator.java | 47 ++++++ .../java/racingcar/RacingCarGameTest.java | 50 ++++++ .../java/racingcar/RacingCarRandomTest.java | 21 +++ src/test/java/racingcar/RacingResultTest.java | 21 +++ .../java/racingcar/model/RacingCarTest.java | 42 ++++++ .../java/racingcar/model/RacingCarsTest.java | 73 +++++++++ .../scanner/RacingCarScannerTest.java | 55 +++++++ .../validation/InputValidatorTest.java | 142 ++++++++++++++++++ 17 files changed, 695 insertions(+), 4 deletions(-) create mode 100644 src/main/java/RacingCarApplication.java create mode 100644 src/main/java/racingcar/RacingCarGame.java create mode 100644 src/main/java/racingcar/RacingCarRandom.java create mode 100644 src/main/java/racingcar/RacingResult.java create mode 100644 src/main/java/racingcar/message/ErrorMessages.java create mode 100644 src/main/java/racingcar/model/RacingCar.java create mode 100644 src/main/java/racingcar/model/RacingCars.java create mode 100644 src/main/java/racingcar/scanner/RacingCarScanner.java create mode 100644 src/main/java/racingcar/validation/InputValidator.java create mode 100644 src/test/java/racingcar/RacingCarGameTest.java create mode 100644 src/test/java/racingcar/RacingCarRandomTest.java create mode 100644 src/test/java/racingcar/RacingResultTest.java create mode 100644 src/test/java/racingcar/model/RacingCarTest.java create mode 100644 src/test/java/racingcar/model/RacingCarsTest.java create mode 100644 src/test/java/racingcar/scanner/RacingCarScannerTest.java create mode 100644 src/test/java/racingcar/validation/InputValidatorTest.java diff --git a/README-HS.md b/README-HS.md index b5be4fc..d67a7df 100644 --- a/README-HS.md +++ b/README-HS.md @@ -1,4 +1,4 @@ -## 프로그래밍 요구사항 +# 프로그래밍 요구사항 1. depth 2까지 가능 2. else, switch, 3항 연산자 사용 불가 3. 함수 또는 메소드는 한 가지 일만 하도록 구현 @@ -6,10 +6,9 @@ 5. 모든 원시 값과 문자열 포장 6. 일급 컬렉션 사용 - --- -## 구현 기능 +# 구현 기능 1. 게임 설명 출력 2. 자동차 이름 입력 1. 이름이 5자 미만인지 검증 @@ -18,7 +17,7 @@ 4. 시도 횟수 입력 1. 숫자 입력 했는지 검증 5. 게임 시작 (시도 횟수 만큼 반복) - 1. random 값 생성 + 1. random 값 생성 (0부터 9사이) 2. random 값이 4 이상일 경우 전진 3. 실행 결과 출력 5. 게임 결과, 최종 우승자 출력 diff --git a/src/main/java/RacingCarApplication.java b/src/main/java/RacingCarApplication.java new file mode 100644 index 0000000..108e559 --- /dev/null +++ b/src/main/java/RacingCarApplication.java @@ -0,0 +1,18 @@ +import racingcar.RacingCarGame; +import racingcar.scanner.RacingCarScanner; +import racingcar.model.RacingCars; + +public class RacingCarApplication { + public static void main(String[] args) { + RacingCarScanner scanner = new RacingCarScanner(); + String[] result = scanner.inputCarNames(); + int repeatNum = scanner.inputRepeat(); + + RacingCars cars = new RacingCars(result); + RacingCarGame game = new RacingCarGame(cars); + game.play(repeatNum); + game.winner(); + + + } +} diff --git a/src/main/java/racingcar/RacingCarGame.java b/src/main/java/racingcar/RacingCarGame.java new file mode 100644 index 0000000..a7d728d --- /dev/null +++ b/src/main/java/racingcar/RacingCarGame.java @@ -0,0 +1,37 @@ +package racingcar; + +import racingcar.model.RacingCar; +import racingcar.model.RacingCars; + +public class RacingCarGame { + private static final int FORWARD_STANDARD = 4; + private final RacingCars cars; + private final RacingCarRandom random; + + public RacingCarGame(RacingCars cars) { + this.cars = cars; + this.random = new RacingCarRandom(); + } + + public void play(int repeatNum) { + for(int i=0; i= FORWARD_STANDARD){ + car.forward(); + } + } + + public void winner() { + cars.printCars(); + System.out.println(cars.getWinnerName() + "가 최종 우승했습니다."); + } +} + diff --git a/src/main/java/racingcar/RacingCarRandom.java b/src/main/java/racingcar/RacingCarRandom.java new file mode 100644 index 0000000..7b3d6f4 --- /dev/null +++ b/src/main/java/racingcar/RacingCarRandom.java @@ -0,0 +1,12 @@ +package racingcar; + +import java.util.Random; + +public class RacingCarRandom { + private static final int MAX_NUM = 9; + private final Random random = new Random(); + + public int createRandomNum() { + return random.nextInt(MAX_NUM) + 1; + } +} diff --git a/src/main/java/racingcar/RacingResult.java b/src/main/java/racingcar/RacingResult.java new file mode 100644 index 0000000..23a831e --- /dev/null +++ b/src/main/java/racingcar/RacingResult.java @@ -0,0 +1,13 @@ +//package racingcar; +// +//public class RacingResult { +// private final RacingCars cars; +// +// public RacingResult(RacingCars cars) { +// this.cars = cars; +// } +// +// public String winner(){ +// +// } +//} diff --git a/src/main/java/racingcar/message/ErrorMessages.java b/src/main/java/racingcar/message/ErrorMessages.java new file mode 100644 index 0000000..5cfa827 --- /dev/null +++ b/src/main/java/racingcar/message/ErrorMessages.java @@ -0,0 +1,7 @@ +package racingcar.message; + +public class ErrorMessages { + public static String INVALID_INPUT_REPEAT = "시도 횟수는 숫자만 입력 가능합니다."; + public static String INVALID_INPUT_EMPTY = "공백은 입력할 수 없습니다. 다시 입력해주세요."; + public static String INVALID_INPUT_CAR_NAME = "이름은 5자 이하로 입력 가능합니다. 다시 입력해주세요."; +} diff --git a/src/main/java/racingcar/model/RacingCar.java b/src/main/java/racingcar/model/RacingCar.java new file mode 100644 index 0000000..d79b85f --- /dev/null +++ b/src/main/java/racingcar/model/RacingCar.java @@ -0,0 +1,40 @@ +package racingcar.model; + +public class RacingCar { + private String name; + private int location; + + public RacingCar(String name) { + this.name = name; + this.location = 0; + } + + public void forward() { + location++; + } + + public String getName(){ + return name; + } + + public int getLocation() { + return location; + } + + @Override + public String toString() { + return name + " : " + drawLocation(location); + } + + public String drawLocation(int location) { + StringBuilder sb = new StringBuilder(); + + for (int i=0; i cars; + + public RacingCars(String[] carNames){ + this.cars = createCar(carNames); + } + + + public List createCar(String[] carNames){ + cars = new ArrayList<>(); + + for (String carName : carNames) { + RacingCar car = new RacingCar(carName); + cars.add(car); + } + + return cars; + } + + + public List getCars() { + return cars; + } + + public void printCars(){ + for (RacingCar car : cars){ + System.out.println(car.toString()); + } + System.out.println(); + } + + + public String getWinnerName() { + int winnerLocation = cars.stream() + .mapToInt(RacingCar::getLocation) + .max() + .orElse(0); + + + return cars.stream() + .filter(car -> car.getLocation() == winnerLocation) + .map(RacingCar::getName) + .collect(Collectors.joining(", ")); + } +} diff --git a/src/main/java/racingcar/scanner/RacingCarScanner.java b/src/main/java/racingcar/scanner/RacingCarScanner.java new file mode 100644 index 0000000..cd94081 --- /dev/null +++ b/src/main/java/racingcar/scanner/RacingCarScanner.java @@ -0,0 +1,62 @@ +package racingcar.scanner; + +import racingcar.validation.InputValidator; +import racingcar.message.ErrorMessages; + +import java.util.Scanner; + +public class RacingCarScanner { + private final Scanner scanner; + private final InputValidator validator; + private String[] inputArr; + + public RacingCarScanner(){ + this.scanner = new Scanner(System.in); + this.validator = new InputValidator(); + } + + public String[] inputCarNames(){ + boolean isCollect = false; + + while(!isCollect){ + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String input = scanner.nextLine(); + + if (validator.isEmptyInput(input)) { + System.out.println(ErrorMessages.INVALID_INPUT_EMPTY); + continue; + } + + inputArr = splitComma(input); + isCollect = validator.checkValidInput(inputArr); + } + + return inputArr; + } + + + public int inputRepeat() { + boolean isCollect = false; + String repeatString = ""; + + while(!isCollect){ + System.out.println("시도할 회수는 몇회인가요?"); + repeatString = scanner.nextLine(); + + if (validator.isEmptyInput(repeatString)){ + System.out.println(ErrorMessages.INVALID_INPUT_EMPTY); + continue; + } + + isCollect = validator.isNumberInput(repeatString); + } + + return Integer.parseInt(repeatString); + + } + + + public String[] splitComma(String input) { + return input.replaceAll(" ", "").split(","); + } +} diff --git a/src/main/java/racingcar/validation/InputValidator.java b/src/main/java/racingcar/validation/InputValidator.java new file mode 100644 index 0000000..5914be2 --- /dev/null +++ b/src/main/java/racingcar/validation/InputValidator.java @@ -0,0 +1,47 @@ +package racingcar.validation; + +import racingcar.message.ErrorMessages; + +public class InputValidator { + public static final int LIMIT_NAME_LENGTH = 5; + + public boolean checkValidInput(String[] inputArr) { + if (isEmptyArray(inputArr)){ + System.out.println(ErrorMessages.INVALID_INPUT_CAR_NAME); + return false; + } + + for (String input : inputArr) { + if (!isLessThanFiveCharacters(input)){ + System.out.println(ErrorMessages.INVALID_INPUT_CAR_NAME); + return false; + } + } + + return true; + } + + public boolean isEmptyArray(String[] inputArr) { + return inputArr.length == 0; + } + + public boolean isLessThanFiveCharacters(String input){ + return input.length() < LIMIT_NAME_LENGTH; + } + + public boolean isEmptyInput(String input) { + return input.isEmpty(); + } + + + public boolean isNumberInput(String input){ + try { + Integer.parseInt(input); + } catch (Exception e){ + System.out.println(ErrorMessages.INVALID_INPUT_REPEAT); + return false; + } + + return true; + } +} diff --git a/src/test/java/racingcar/RacingCarGameTest.java b/src/test/java/racingcar/RacingCarGameTest.java new file mode 100644 index 0000000..65ecc2f --- /dev/null +++ b/src/test/java/racingcar/RacingCarGameTest.java @@ -0,0 +1,50 @@ +package racingcar; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import racingcar.model.RacingCar; +import racingcar.model.RacingCars; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RacingCarGameTest { + + private RacingCars cars; + + + @BeforeEach + void setUp(){ + cars = new RacingCars(new String[]{"red", "blue"}); + } + + + @Test + @DisplayName("랜덤 값이 4 이상이여서 전진") + void raceMore4(){ + // given + RacingCarGame game = new RacingCarGame(cars); + RacingCar car1 = cars.getCars().get(0); + + // when + game.race(car1, 4); + + // then + assertEquals(car1.toString(), "red : -"); + } + + @Test + @DisplayName("랜덤 값이 4 이하여서 전진 안함") + void raceLessThan4(){ + // given, when + RacingCarGame game = new RacingCarGame(cars); + RacingCar car1 = cars.getCars().get(0); + + // when + game.race(car1, 3); + + // then + assertEquals(car1.toString(), "red : "); + } + +} diff --git a/src/test/java/racingcar/RacingCarRandomTest.java b/src/test/java/racingcar/RacingCarRandomTest.java new file mode 100644 index 0000000..ffa5d36 --- /dev/null +++ b/src/test/java/racingcar/RacingCarRandomTest.java @@ -0,0 +1,21 @@ +package racingcar; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.RepeatedTest; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class RacingCarRandomTest { + + @RepeatedTest(10) + @DisplayName("0부터 9까지 랜덤 값 생성") + void random(){ + + RacingCarRandom random = new RacingCarRandom(); + int result = random.createRandomNum(); + + assertTrue(result > -1); + assertTrue(result < 10); + } + +} diff --git a/src/test/java/racingcar/RacingResultTest.java b/src/test/java/racingcar/RacingResultTest.java new file mode 100644 index 0000000..a56740d --- /dev/null +++ b/src/test/java/racingcar/RacingResultTest.java @@ -0,0 +1,21 @@ +//package racingcar; +// +//import org.junit.jupiter.api.BeforeEach; +// +//import static org.junit.jupiter.api.Assertions.assertEquals; +// +//public class RacingResultTest { +// private RacingCars cars; +// +// @BeforeEach +// void setUp(){ +// cars = new RacingCars(); +// cars.addCar(new RacingCar("red")); +// } +// +// +// +// +// +// +//} diff --git a/src/test/java/racingcar/model/RacingCarTest.java b/src/test/java/racingcar/model/RacingCarTest.java new file mode 100644 index 0000000..20d6147 --- /dev/null +++ b/src/test/java/racingcar/model/RacingCarTest.java @@ -0,0 +1,42 @@ +package racingcar.model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RacingCarTest { + + private RacingCar car; + + @BeforeEach + void setUp(){ + car = new RacingCar("red"); + } + + @Test + @DisplayName("레이싱 카 위치 출력") + void printToString(){ + // given + car.forward(); + + // when + String response = car.toString(); + + // then + assertEquals(response, "red : -"); + + } + + @Test + @DisplayName("레이싱 카 위치값 문자 그림으로 변경") + void drawLocation(){ + // when + String response = car.drawLocation(5); + + // then + assertEquals(response, "-----"); + } + +} diff --git a/src/test/java/racingcar/model/RacingCarsTest.java b/src/test/java/racingcar/model/RacingCarsTest.java new file mode 100644 index 0000000..49ccda6 --- /dev/null +++ b/src/test/java/racingcar/model/RacingCarsTest.java @@ -0,0 +1,73 @@ +package racingcar.model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RacingCarsTest { + + private RacingCars cars; + + @BeforeEach + void setUp(){ + cars = new RacingCars(new String[]{"red", "blue"}); + } + + + @Test + @DisplayName("레이싱카 리스트 객체 생성") + void RacingCars(){ + // then + List response = cars.getCars(); + + assertEquals(response.size(), 2); + } + + + @Test + @DisplayName("우승자 이름 반환") + void getWinnerName(){ + // given + RacingCar car1 = cars.getCars().get(0); + car1.forward(); + + // when + String response = cars.getWinnerName(); + + // then + assertEquals(response, car1.getName()); + } + + @Test + @DisplayName("레이싱카 이름으로 리스트 객체 생성") + void createCar(){ + // given + + // when + List response = cars.createCar(new String[]{"red", "blue"}); + + // then + assertEquals(response.size(), 2); + assertEquals(response.get(0).getName(), "red"); + assertEquals(response.get(1).getName(), "blue"); + } + + @Test + @DisplayName("우승자 이름 반환 시 우승자 다수일 경우") + void getMultipleWinnerName(){ + RacingCar car1 = cars.getCars().get(0); + RacingCar car2 = cars.getCars().get(1); + car1.forward(); + car2.forward(); + + // when + String response = cars.getWinnerName(); + + // then + assertEquals(response, car1.getName() + ", " + car2.getName()); + + } +} diff --git a/src/test/java/racingcar/scanner/RacingCarScannerTest.java b/src/test/java/racingcar/scanner/RacingCarScannerTest.java new file mode 100644 index 0000000..b74176b --- /dev/null +++ b/src/test/java/racingcar/scanner/RacingCarScannerTest.java @@ -0,0 +1,55 @@ +package racingcar.scanner; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class RacingCarScannerTest { + + private RacingCarScanner scanner; + + @BeforeEach + void setUp(){ + scanner = new RacingCarScanner(); + } + + @Test + @DisplayName("자동차 이름 쉼표로 구분") + void splitComma(){ + // given, when + String[] response = scanner.splitComma("red,blue,green"); + + // then + assertArrayEquals(response, new String[]{"red", "blue", "green"}); + } + + @Test + @DisplayName("자동차 이름 쉼표로 구분 시 공백 포함되어 있을 경우") + void splitCommaContainsSpace(){ + // given, when + String[] response = scanner.splitComma("red, blue, green"); + + // then + assertArrayEquals(response, new String[]{"red", "blue", "green"}); + } + + + @Test + @DisplayName("자동차 이름 쉼표로 구분 시 쉼표가 없는 경우") + void splitCommaNotContainsComma(){ + // given, when + String[] response = scanner.splitComma("red@b"); + + // then + assertArrayEquals(response, new String[]{"red@b"}); + } + + + + + + + +} diff --git a/src/test/java/racingcar/validation/InputValidatorTest.java b/src/test/java/racingcar/validation/InputValidatorTest.java new file mode 100644 index 0000000..f04ea35 --- /dev/null +++ b/src/test/java/racingcar/validation/InputValidatorTest.java @@ -0,0 +1,142 @@ +package racingcar.validation; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class InputValidatorTest { + + private InputValidator validator; + + @BeforeEach + void setUp(){ + validator = new InputValidator(); + } + + @Test + @DisplayName("자동차 이름을 담은 배열이 빈값으로 false 리턴") + void checkValidInput_EmptyArray(){ + // given, when + boolean response = validator.checkValidInput(new String[]{}); + + // then + assertFalse(response); + } + + @Test + @DisplayName("자동차 이름을 담은 배열이 빈값이 아니여서 false 리턴") + void checkValidInput_NotEmptyArray(){ + // given, when + boolean response = validator.isEmptyArray(new String[]{"red"}); + + // then + assertFalse(response); + } + + + @Test + @DisplayName("자동차 이름들 중 5자 미만으로만 구성되어 있어 true 리턴") + void checkValidInput_lessThanFiveCharacters(){ + // given, when + boolean response = validator.checkValidInput(new String[]{"red", "blue", "pink"}); + + // then + assertTrue(response); + } + + @Test + @DisplayName("자동차 이름들 중 5자 이상이 포함되어 있어서 false 리턴") + void checkValidInput_MoreFiveCharacters(){ + // given, when + boolean response = validator.checkValidInput(new String[]{"red", "purple", "green"}); + + // then + assertFalse(response); + } + + @Test + @DisplayName("자동차 이름을 담은 배열이 빈값으로 true 리턴") + void isEmptyArray(){ + // given, when + boolean response = validator.isEmptyArray(new String[]{}); + + // then + assertTrue(response); + } + + @Test + @DisplayName("자동차 이름을 담은 배열이 빈값이 아니여서 false 리턴") + void isNotEmptyArray(){ + // given, when + boolean response = validator.isEmptyArray(new String[]{"red"}); + + // then + assertFalse(response); + } + + + @Test + @DisplayName("자동차 이름이 5자 이상인지 확인 후 true 리턴") + void isLessThanFiveCharactersTrue(){ + // given, when + boolean response = validator.isLessThanFiveCharacters("red"); + + // then + assertTrue(response); + } + + @Test + @DisplayName("자동차 이름이 5자 이상이여서 false 리턴") + void isLessThanFiveCharactersFalse(){ + // given, when + boolean response = validator.isLessThanFiveCharacters("purple"); + + // then + assertFalse(response); + } + + + @Test + @DisplayName("입력값이 빈값으로 true 반환") + void isEmptyInputTrue(){ + // given, when + boolean response = validator.isEmptyInput(""); + + // then + assertTrue(response); + } + + + @Test + @DisplayName("입력값이 빈값이 아니여서 false 반환") + void isEmptyInputFalse(){ + // given, when + boolean response = validator.isEmptyInput("red"); + + // then + assertFalse(response); + } + + @Test + @DisplayName("반복횟수 입력 시 숫자 문자열 입력으로 true 반환") + void isNumberInput(){ + // given, when + boolean response = validator.isNumberInput("3"); + + // then + assertTrue(response); + } + + @Test + @DisplayName("반복횟수 입력 시 숫자 아닌 문자열 입력으로 false 반환") + void isNotNumberInput(){ + // given, when + boolean response = validator.isNumberInput("테스트"); + + // then + assertFalse(response); + } + +} \ No newline at end of file From b385a0ad0b0ff2e366bf5d84c9d84002fd19550b Mon Sep 17 00:00:00 2001 From: Heesoo Date: Thu, 14 Nov 2024 23:27:03 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[refactor]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EA=B0=9D=EC=B2=B4=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F?= =?UTF-8?q?=20scanner=20=EB=AC=B8=20=EA=B0=84=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/java/RacingCarApplication.java | 4 +- src/main/java/racingcar/RacingCarGame.java | 26 +++++++----- src/main/java/racingcar/RacingCarRandom.java | 12 ------ src/main/java/racingcar/RacingResult.java | 13 ------ ...orMessages.java => RacingCarMessages.java} | 4 +- src/main/java/racingcar/model/RacingCar.java | 17 +------- src/main/java/racingcar/model/RacingCars.java | 20 ++------- .../racingcar/scanner/RacingCarScanner.java | 42 +++++++++---------- .../racingcar/validation/InputValidator.java | 34 ++++++--------- src/main/java/racingcar/view/ResultView.java | 21 ++++++++++ .../java/racingcar/RacingCarGameTest.java | 5 +-- .../java/racingcar/RacingCarRandomTest.java | 21 ---------- src/test/java/racingcar/RacingResultTest.java | 21 ---------- .../java/racingcar/model/RacingCarTest.java | 42 ------------------- .../java/racingcar/model/RacingCarsTest.java | 24 +++-------- .../validation/InputValidatorTest.java | 14 +++---- .../java/racingcar/view/ResultViewTest.java | 27 ++++++++++++ 18 files changed, 125 insertions(+), 224 deletions(-) delete mode 100644 src/main/java/racingcar/RacingCarRandom.java delete mode 100644 src/main/java/racingcar/RacingResult.java rename src/main/java/racingcar/message/{ErrorMessages.java => RacingCarMessages.java} (58%) create mode 100644 src/main/java/racingcar/view/ResultView.java delete mode 100644 src/test/java/racingcar/RacingCarRandomTest.java delete mode 100644 src/test/java/racingcar/RacingResultTest.java delete mode 100644 src/test/java/racingcar/model/RacingCarTest.java create mode 100644 src/test/java/racingcar/view/ResultViewTest.java diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0f80bbf..d2880ba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/RacingCarApplication.java b/src/main/java/RacingCarApplication.java index 108e559..734dfd3 100644 --- a/src/main/java/RacingCarApplication.java +++ b/src/main/java/RacingCarApplication.java @@ -1,6 +1,7 @@ import racingcar.RacingCarGame; import racingcar.scanner.RacingCarScanner; import racingcar.model.RacingCars; +import racingcar.view.ResultView; public class RacingCarApplication { public static void main(String[] args) { @@ -11,8 +12,9 @@ public static void main(String[] args) { RacingCars cars = new RacingCars(result); RacingCarGame game = new RacingCarGame(cars); game.play(repeatNum); - game.winner(); + ResultView resultView = new ResultView(cars); + resultView.printWinner(); } } diff --git a/src/main/java/racingcar/RacingCarGame.java b/src/main/java/racingcar/RacingCarGame.java index a7d728d..4da8ef2 100644 --- a/src/main/java/racingcar/RacingCarGame.java +++ b/src/main/java/racingcar/RacingCarGame.java @@ -2,24 +2,34 @@ import racingcar.model.RacingCar; import racingcar.model.RacingCars; +import racingcar.view.ResultView; + +import java.util.Map; +import java.util.Random; public class RacingCarGame { private static final int FORWARD_STANDARD = 4; + private static final int MAX_NUM = 9; + private final RacingCars cars; - private final RacingCarRandom random; + private final Random random = new Random(); public RacingCarGame(RacingCars cars) { this.cars = cars; - this.random = new RacingCarRandom(); } public void play(int repeatNum) { for(int i=0; i cars; public RacingCars(String[] carNames){ - this.cars = createCar(carNames); - } - - - public List createCar(String[] carNames){ cars = new ArrayList<>(); for (String carName : carNames) { RacingCar car = new RacingCar(carName); cars.add(car); } - - return cars; } - public List getCars() { return cars; } - public void printCars(){ - for (RacingCar car : cars){ - System.out.println(car.toString()); - } - System.out.println(); - } - - public String getWinnerName() { int winnerLocation = cars.stream() .mapToInt(RacingCar::getLocation) @@ -49,4 +32,7 @@ public String getWinnerName() { .map(RacingCar::getName) .collect(Collectors.joining(", ")); } + + + } diff --git a/src/main/java/racingcar/scanner/RacingCarScanner.java b/src/main/java/racingcar/scanner/RacingCarScanner.java index cd94081..c070921 100644 --- a/src/main/java/racingcar/scanner/RacingCarScanner.java +++ b/src/main/java/racingcar/scanner/RacingCarScanner.java @@ -1,14 +1,13 @@ package racingcar.scanner; import racingcar.validation.InputValidator; -import racingcar.message.ErrorMessages; +import racingcar.message.RacingCarMessages; import java.util.Scanner; public class RacingCarScanner { private final Scanner scanner; private final InputValidator validator; - private String[] inputArr; public RacingCarScanner(){ this.scanner = new Scanner(System.in); @@ -16,43 +15,44 @@ public RacingCarScanner(){ } public String[] inputCarNames(){ - boolean isCollect = false; - - while(!isCollect){ - System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); - String input = scanner.nextLine(); + while (true) { + String input = getInputWithMessage(RacingCarMessages.INPUT_CAR_NAMES); if (validator.isEmptyInput(input)) { - System.out.println(ErrorMessages.INVALID_INPUT_EMPTY); continue; } - inputArr = splitComma(input); - isCollect = validator.checkValidInput(inputArr); - } + String[] inputArr = splitComma(input); + + if (validator.isValidCarName(inputArr)){ + return inputArr; + } + + System.out.println(RacingCarMessages.INVALID_INPUT_CAR_NAME); - return inputArr; + } } public int inputRepeat() { - boolean isCollect = false; - String repeatString = ""; + String repeatString; - while(!isCollect){ - System.out.println("시도할 회수는 몇회인가요?"); - repeatString = scanner.nextLine(); + while(true){ + repeatString = getInputWithMessage(RacingCarMessages.INPUT_REPEAT_NUM); if (validator.isEmptyInput(repeatString)){ - System.out.println(ErrorMessages.INVALID_INPUT_EMPTY); continue; } - isCollect = validator.isNumberInput(repeatString); + if (validator.isNumberInput(repeatString)){ + return Integer.parseInt(repeatString); + } } + } - return Integer.parseInt(repeatString); - + public String getInputWithMessage(String message){ + System.out.println(message); + return scanner.nextLine(); } diff --git a/src/main/java/racingcar/validation/InputValidator.java b/src/main/java/racingcar/validation/InputValidator.java index 5914be2..420d072 100644 --- a/src/main/java/racingcar/validation/InputValidator.java +++ b/src/main/java/racingcar/validation/InputValidator.java @@ -1,26 +1,16 @@ package racingcar.validation; -import racingcar.message.ErrorMessages; +import racingcar.message.RacingCarMessages; + +import java.util.Arrays; public class InputValidator { public static final int LIMIT_NAME_LENGTH = 5; - public boolean checkValidInput(String[] inputArr) { - if (isEmptyArray(inputArr)){ - System.out.println(ErrorMessages.INVALID_INPUT_CAR_NAME); - return false; - } - - for (String input : inputArr) { - if (!isLessThanFiveCharacters(input)){ - System.out.println(ErrorMessages.INVALID_INPUT_CAR_NAME); - return false; - } + public boolean isValidCarName(String[] inputArr) { + return !isEmptyArray(inputArr) && Arrays.stream(inputArr).allMatch(this::isLessThanFiveCharacters); } - return true; - } - public boolean isEmptyArray(String[] inputArr) { return inputArr.length == 0; } @@ -30,15 +20,17 @@ public boolean isLessThanFiveCharacters(String input){ } public boolean isEmptyInput(String input) { - return input.isEmpty(); + if (input.isEmpty()){ + System.out.println(RacingCarMessages.INVALID_INPUT_EMPTY); + return true; + } + return false; } - public boolean isNumberInput(String input){ - try { - Integer.parseInt(input); - } catch (Exception e){ - System.out.println(ErrorMessages.INVALID_INPUT_REPEAT); + public boolean isNumberInput(String input) { + if (!input.matches("\\d+")) { + System.out.println(RacingCarMessages.INVALID_INPUT_REPEAT); return false; } diff --git a/src/main/java/racingcar/view/ResultView.java b/src/main/java/racingcar/view/ResultView.java new file mode 100644 index 0000000..b83392e --- /dev/null +++ b/src/main/java/racingcar/view/ResultView.java @@ -0,0 +1,21 @@ +package racingcar.view; + +import racingcar.model.RacingCar; +import racingcar.model.RacingCars; + +public class ResultView { + private final RacingCars cars; + + public ResultView(RacingCars cars) { + this.cars = cars; + } + + public void printWinner() { + for (RacingCar car : cars.getCars()){ + car.printLocation(); + } + System.out.println("\n" + cars.getWinnerName() + "가 최종 우승했습니다."); + } + + +} diff --git a/src/test/java/racingcar/RacingCarGameTest.java b/src/test/java/racingcar/RacingCarGameTest.java index 65ecc2f..b11c522 100644 --- a/src/test/java/racingcar/RacingCarGameTest.java +++ b/src/test/java/racingcar/RacingCarGameTest.java @@ -12,7 +12,6 @@ public class RacingCarGameTest { private RacingCars cars; - @BeforeEach void setUp(){ cars = new RacingCars(new String[]{"red", "blue"}); @@ -30,7 +29,7 @@ void raceMore4(){ game.race(car1, 4); // then - assertEquals(car1.toString(), "red : -"); + assertEquals(car1.getLocation(), 1); } @Test @@ -44,7 +43,7 @@ void raceLessThan4(){ game.race(car1, 3); // then - assertEquals(car1.toString(), "red : "); + assertEquals(car1.getLocation(), 0); } } diff --git a/src/test/java/racingcar/RacingCarRandomTest.java b/src/test/java/racingcar/RacingCarRandomTest.java deleted file mode 100644 index ffa5d36..0000000 --- a/src/test/java/racingcar/RacingCarRandomTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package racingcar; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.RepeatedTest; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class RacingCarRandomTest { - - @RepeatedTest(10) - @DisplayName("0부터 9까지 랜덤 값 생성") - void random(){ - - RacingCarRandom random = new RacingCarRandom(); - int result = random.createRandomNum(); - - assertTrue(result > -1); - assertTrue(result < 10); - } - -} diff --git a/src/test/java/racingcar/RacingResultTest.java b/src/test/java/racingcar/RacingResultTest.java deleted file mode 100644 index a56740d..0000000 --- a/src/test/java/racingcar/RacingResultTest.java +++ /dev/null @@ -1,21 +0,0 @@ -//package racingcar; -// -//import org.junit.jupiter.api.BeforeEach; -// -//import static org.junit.jupiter.api.Assertions.assertEquals; -// -//public class RacingResultTest { -// private RacingCars cars; -// -// @BeforeEach -// void setUp(){ -// cars = new RacingCars(); -// cars.addCar(new RacingCar("red")); -// } -// -// -// -// -// -// -//} diff --git a/src/test/java/racingcar/model/RacingCarTest.java b/src/test/java/racingcar/model/RacingCarTest.java deleted file mode 100644 index 20d6147..0000000 --- a/src/test/java/racingcar/model/RacingCarTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package racingcar.model; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class RacingCarTest { - - private RacingCar car; - - @BeforeEach - void setUp(){ - car = new RacingCar("red"); - } - - @Test - @DisplayName("레이싱 카 위치 출력") - void printToString(){ - // given - car.forward(); - - // when - String response = car.toString(); - - // then - assertEquals(response, "red : -"); - - } - - @Test - @DisplayName("레이싱 카 위치값 문자 그림으로 변경") - void drawLocation(){ - // when - String response = car.drawLocation(5); - - // then - assertEquals(response, "-----"); - } - -} diff --git a/src/test/java/racingcar/model/RacingCarsTest.java b/src/test/java/racingcar/model/RacingCarsTest.java index 49ccda6..a86d31a 100644 --- a/src/test/java/racingcar/model/RacingCarsTest.java +++ b/src/test/java/racingcar/model/RacingCarsTest.java @@ -8,7 +8,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class RacingCarsTest { - private RacingCars cars; @BeforeEach @@ -18,12 +17,15 @@ void setUp(){ @Test - @DisplayName("레이싱카 리스트 객체 생성") - void RacingCars(){ - // then + @DisplayName("레이싱카 이름으로 생성자에서 리스트 객체 생성") + void racingCars(){ + // given, when List response = cars.getCars(); + // then assertEquals(response.size(), 2); + assertEquals(response.get(0).getName(), "red"); + assertEquals(response.get(1).getName(), "blue"); } @@ -41,20 +43,6 @@ void getWinnerName(){ assertEquals(response, car1.getName()); } - @Test - @DisplayName("레이싱카 이름으로 리스트 객체 생성") - void createCar(){ - // given - - // when - List response = cars.createCar(new String[]{"red", "blue"}); - - // then - assertEquals(response.size(), 2); - assertEquals(response.get(0).getName(), "red"); - assertEquals(response.get(1).getName(), "blue"); - } - @Test @DisplayName("우승자 이름 반환 시 우승자 다수일 경우") void getMultipleWinnerName(){ diff --git a/src/test/java/racingcar/validation/InputValidatorTest.java b/src/test/java/racingcar/validation/InputValidatorTest.java index f04ea35..50f9bbd 100644 --- a/src/test/java/racingcar/validation/InputValidatorTest.java +++ b/src/test/java/racingcar/validation/InputValidatorTest.java @@ -17,9 +17,9 @@ void setUp(){ @Test @DisplayName("자동차 이름을 담은 배열이 빈값으로 false 리턴") - void checkValidInput_EmptyArray(){ + void isValidCarName_EmptyArray(){ // given, when - boolean response = validator.checkValidInput(new String[]{}); + boolean response = validator.isValidCarName(new String[]{}); // then assertFalse(response); @@ -27,7 +27,7 @@ void checkValidInput_EmptyArray(){ @Test @DisplayName("자동차 이름을 담은 배열이 빈값이 아니여서 false 리턴") - void checkValidInput_NotEmptyArray(){ + void isValidCarName_NotEmptyArray(){ // given, when boolean response = validator.isEmptyArray(new String[]{"red"}); @@ -38,9 +38,9 @@ void checkValidInput_NotEmptyArray(){ @Test @DisplayName("자동차 이름들 중 5자 미만으로만 구성되어 있어 true 리턴") - void checkValidInput_lessThanFiveCharacters(){ + void isValidCarName_lessThanFiveCharacters(){ // given, when - boolean response = validator.checkValidInput(new String[]{"red", "blue", "pink"}); + boolean response = validator.isValidCarName(new String[]{"red", "blue", "pink"}); // then assertTrue(response); @@ -48,9 +48,9 @@ void checkValidInput_lessThanFiveCharacters(){ @Test @DisplayName("자동차 이름들 중 5자 이상이 포함되어 있어서 false 리턴") - void checkValidInput_MoreFiveCharacters(){ + void isValidCarName_MoreFiveCharacters(){ // given, when - boolean response = validator.checkValidInput(new String[]{"red", "purple", "green"}); + boolean response = validator.isValidCarName(new String[]{"red", "purple", "green"}); // then assertFalse(response); diff --git a/src/test/java/racingcar/view/ResultViewTest.java b/src/test/java/racingcar/view/ResultViewTest.java new file mode 100644 index 0000000..6102389 --- /dev/null +++ b/src/test/java/racingcar/view/ResultViewTest.java @@ -0,0 +1,27 @@ +package racingcar; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import racingcar.model.RacingCar; +import racingcar.model.RacingCars; +import racingcar.view.ResultView; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ResultViewTest { + private RacingCars cars; + + @BeforeEach + void setUp(){ + cars = new RacingCars(new String[]{"red", "blue"}); + } + + + + + + + + +} From 0cdb9cf8ee46b37a9cb822680b0ca92ed7e9ecb4 Mon Sep 17 00:00:00 2001 From: Heesoo Date: Fri, 15 Nov 2024 00:02:28 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[refactor]=20ResultView=20=EC=9D=98=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EB=AC=B8=20RacingCarGame=20=EA=B3=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/RacingCarApplication.java | 13 ++++----- src/main/java/racingcar/RacingCarGame.java | 8 ++++-- src/main/java/racingcar/view/ResultView.java | 21 --------------- .../java/racingcar/view/ResultViewTest.java | 27 ------------------- 4 files changed, 11 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/racingcar/view/ResultView.java delete mode 100644 src/test/java/racingcar/view/ResultViewTest.java diff --git a/src/main/java/RacingCarApplication.java b/src/main/java/RacingCarApplication.java index 734dfd3..53ce650 100644 --- a/src/main/java/RacingCarApplication.java +++ b/src/main/java/RacingCarApplication.java @@ -1,20 +1,17 @@ import racingcar.RacingCarGame; -import racingcar.scanner.RacingCarScanner; import racingcar.model.RacingCars; -import racingcar.view.ResultView; +import racingcar.scanner.RacingCarScanner; public class RacingCarApplication { public static void main(String[] args) { RacingCarScanner scanner = new RacingCarScanner(); - String[] result = scanner.inputCarNames(); - int repeatNum = scanner.inputRepeat(); - RacingCars cars = new RacingCars(result); + RacingCars cars = new RacingCars(scanner.inputCarNames()); + RacingCarGame game = new RacingCarGame(cars); - game.play(repeatNum); + game.play(scanner.inputRepeat()); + game.printWinner(); - ResultView resultView = new ResultView(cars); - resultView.printWinner(); } } diff --git a/src/main/java/racingcar/RacingCarGame.java b/src/main/java/racingcar/RacingCarGame.java index 4da8ef2..9e8567e 100644 --- a/src/main/java/racingcar/RacingCarGame.java +++ b/src/main/java/racingcar/RacingCarGame.java @@ -2,9 +2,7 @@ import racingcar.model.RacingCar; import racingcar.model.RacingCars; -import racingcar.view.ResultView; -import java.util.Map; import java.util.Random; public class RacingCarGame { @@ -39,5 +37,11 @@ public void race(RacingCar car, int randomNum){ } } + public void printWinner() { + for (RacingCar car : cars.getCars()){ + car.printLocation(); + } + System.out.println("\n" + cars.getWinnerName() + "가 최종 우승했습니다."); + } } diff --git a/src/main/java/racingcar/view/ResultView.java b/src/main/java/racingcar/view/ResultView.java deleted file mode 100644 index b83392e..0000000 --- a/src/main/java/racingcar/view/ResultView.java +++ /dev/null @@ -1,21 +0,0 @@ -package racingcar.view; - -import racingcar.model.RacingCar; -import racingcar.model.RacingCars; - -public class ResultView { - private final RacingCars cars; - - public ResultView(RacingCars cars) { - this.cars = cars; - } - - public void printWinner() { - for (RacingCar car : cars.getCars()){ - car.printLocation(); - } - System.out.println("\n" + cars.getWinnerName() + "가 최종 우승했습니다."); - } - - -} diff --git a/src/test/java/racingcar/view/ResultViewTest.java b/src/test/java/racingcar/view/ResultViewTest.java deleted file mode 100644 index 6102389..0000000 --- a/src/test/java/racingcar/view/ResultViewTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package racingcar; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import racingcar.model.RacingCar; -import racingcar.model.RacingCars; -import racingcar.view.ResultView; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ResultViewTest { - private RacingCars cars; - - @BeforeEach - void setUp(){ - cars = new RacingCars(new String[]{"red", "blue"}); - } - - - - - - - - -} From 5d45cd9a6fc379ea13db476ae70e85e6053a54b7 Mon Sep 17 00:00:00 2001 From: Heesoo Date: Fri, 15 Nov 2024 23:36:42 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[refactor]=20view=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/RacingCarApplication.java | 2 +- src/main/java/racingcar/RacingCarGame.java | 13 +++++----- .../racingcar/message/RacingCarMessages.java | 9 ------- src/main/java/racingcar/model/RacingCar.java | 4 +-- .../racingcar/scanner/RacingCarScanner.java | 20 ++++++--------- .../racingcar/validation/InputValidator.java | 8 +++--- src/main/java/racingcar/view/ErrorView.java | 19 ++++++++++++++ src/main/java/racingcar/view/InputView.java | 14 +++++++++++ src/main/java/racingcar/view/ResultView.java | 25 +++++++++++++++++++ .../java/racingcar/model/RacingCarTest.java | 24 ++++++++++++++++++ .../validation/InputValidatorTest.java | 25 ++++++++++--------- 11 files changed, 115 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/racingcar/message/RacingCarMessages.java create mode 100644 src/main/java/racingcar/view/ErrorView.java create mode 100644 src/main/java/racingcar/view/InputView.java create mode 100644 src/main/java/racingcar/view/ResultView.java create mode 100644 src/test/java/racingcar/model/RacingCarTest.java diff --git a/src/main/java/RacingCarApplication.java b/src/main/java/RacingCarApplication.java index 53ce650..04ea943 100644 --- a/src/main/java/RacingCarApplication.java +++ b/src/main/java/RacingCarApplication.java @@ -10,7 +10,7 @@ public static void main(String[] args) { RacingCarGame game = new RacingCarGame(cars); game.play(scanner.inputRepeat()); - game.printWinner(); + game.winner(); } diff --git a/src/main/java/racingcar/RacingCarGame.java b/src/main/java/racingcar/RacingCarGame.java index 9e8567e..075f848 100644 --- a/src/main/java/racingcar/RacingCarGame.java +++ b/src/main/java/racingcar/RacingCarGame.java @@ -2,6 +2,7 @@ import racingcar.model.RacingCar; import racingcar.model.RacingCars; +import racingcar.view.ResultView; import java.util.Random; @@ -25,9 +26,9 @@ public void play(int repeatNum) { public void playRound(){ for (RacingCar car : cars.getCars()) { race(car, random.nextInt(MAX_NUM) + 1); - car.printLocation(); + ResultView.displayRacingCar(car); } - System.out.println(); + ResultView.printNewLine(); } @@ -37,11 +38,9 @@ public void race(RacingCar car, int randomNum){ } } - public void printWinner() { - for (RacingCar car : cars.getCars()){ - car.printLocation(); - } - System.out.println("\n" + cars.getWinnerName() + "가 최종 우승했습니다."); + public void winner() { + ResultView.displayRacingCars(cars); + ResultView.printWinner(cars.getWinnerName()); } } diff --git a/src/main/java/racingcar/message/RacingCarMessages.java b/src/main/java/racingcar/message/RacingCarMessages.java deleted file mode 100644 index 43567e9..0000000 --- a/src/main/java/racingcar/message/RacingCarMessages.java +++ /dev/null @@ -1,9 +0,0 @@ -package racingcar.message; - -public class RacingCarMessages { - public static String INVALID_INPUT_REPEAT = "시도 횟수는 숫자만 입력 가능합니다."; - public static String INVALID_INPUT_EMPTY = "공백은 입력할 수 없습니다. 다시 입력해주세요."; - public static String INVALID_INPUT_CAR_NAME = "이름은 5자 이하로 입력 가능합니다. 다시 입력해주세요."; - public static final String INPUT_CAR_NAMES = "경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."; - public static final String INPUT_REPEAT_NUM = "시도할 회수는 몇회인가요?"; -} diff --git a/src/main/java/racingcar/model/RacingCar.java b/src/main/java/racingcar/model/RacingCar.java index c536ea5..621f5a5 100644 --- a/src/main/java/racingcar/model/RacingCar.java +++ b/src/main/java/racingcar/model/RacingCar.java @@ -21,7 +21,7 @@ public int getLocation() { return location; } - public void printLocation() { - System.out.println(name + " : " + "-".repeat(location)); + public String formatRacingCar() { + return name + " : " + "-".repeat(location); } } diff --git a/src/main/java/racingcar/scanner/RacingCarScanner.java b/src/main/java/racingcar/scanner/RacingCarScanner.java index c070921..f370fb7 100644 --- a/src/main/java/racingcar/scanner/RacingCarScanner.java +++ b/src/main/java/racingcar/scanner/RacingCarScanner.java @@ -1,7 +1,8 @@ package racingcar.scanner; import racingcar.validation.InputValidator; -import racingcar.message.RacingCarMessages; +import racingcar.view.ErrorView; +import racingcar.view.InputView; import java.util.Scanner; @@ -16,29 +17,27 @@ public RacingCarScanner(){ public String[] inputCarNames(){ while (true) { - String input = getInputWithMessage(RacingCarMessages.INPUT_CAR_NAMES); + InputView.inputCarName(); + String input = scanner.nextLine(); if (validator.isEmptyInput(input)) { continue; } String[] inputArr = splitComma(input); - if (validator.isValidCarName(inputArr)){ return inputArr; } - System.out.println(RacingCarMessages.INVALID_INPUT_CAR_NAME); - + ErrorView.invalidInputCarName(); } } public int inputRepeat() { - String repeatString; - while(true){ - repeatString = getInputWithMessage(RacingCarMessages.INPUT_REPEAT_NUM); + InputView.inputRepeatNum(); + String repeatString = scanner.nextLine(); if (validator.isEmptyInput(repeatString)){ continue; @@ -50,11 +49,6 @@ public int inputRepeat() { } } - public String getInputWithMessage(String message){ - System.out.println(message); - return scanner.nextLine(); - } - public String[] splitComma(String input) { return input.replaceAll(" ", "").split(","); diff --git a/src/main/java/racingcar/validation/InputValidator.java b/src/main/java/racingcar/validation/InputValidator.java index 420d072..3e49a7a 100644 --- a/src/main/java/racingcar/validation/InputValidator.java +++ b/src/main/java/racingcar/validation/InputValidator.java @@ -1,6 +1,6 @@ package racingcar.validation; -import racingcar.message.RacingCarMessages; +import racingcar.view.ErrorView; import java.util.Arrays; @@ -9,7 +9,7 @@ public class InputValidator { public boolean isValidCarName(String[] inputArr) { return !isEmptyArray(inputArr) && Arrays.stream(inputArr).allMatch(this::isLessThanFiveCharacters); - } + } public boolean isEmptyArray(String[] inputArr) { return inputArr.length == 0; @@ -21,7 +21,7 @@ public boolean isLessThanFiveCharacters(String input){ public boolean isEmptyInput(String input) { if (input.isEmpty()){ - System.out.println(RacingCarMessages.INVALID_INPUT_EMPTY); + ErrorView.invalidInputEmpty(); return true; } return false; @@ -30,7 +30,7 @@ public boolean isEmptyInput(String input) { public boolean isNumberInput(String input) { if (!input.matches("\\d+")) { - System.out.println(RacingCarMessages.INVALID_INPUT_REPEAT); + ErrorView.invalidInputRepeat(); return false; } diff --git a/src/main/java/racingcar/view/ErrorView.java b/src/main/java/racingcar/view/ErrorView.java new file mode 100644 index 0000000..eea5c40 --- /dev/null +++ b/src/main/java/racingcar/view/ErrorView.java @@ -0,0 +1,19 @@ +package racingcar.view; + +public class ErrorView { + public static final String INVALID_INPUT_CAR_NAME_MESSAGE = "이름은 5자 이하로 입력 가능합니다. 다시 입력해주세요."; + public static final String INVALID_INPUT_EMPTY_MESSAGE = "공백은 입력할 수 없습니다. 다시 입력해주세요."; + public static final String INVALID_INPUT_REPEAT_MESSAGE = "시도 횟수는 숫자만 입력 가능합니다."; + + public static void invalidInputCarName(){ + System.out.println(INVALID_INPUT_CAR_NAME_MESSAGE); + } + + public static void invalidInputEmpty(){ + System.out.println(INVALID_INPUT_EMPTY_MESSAGE); + } + + public static void invalidInputRepeat(){ + System.out.println(INVALID_INPUT_REPEAT_MESSAGE); + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 0000000..6702243 --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,14 @@ +package racingcar.view; + +public class InputView { + public static final String INPUT_CAR_NAME_MESSAGE = "경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."; + public static final String INPUT_REPEAT_NUM_MESSAGE = "시도할 회수는 몇회인가요?"; + + public static void inputCarName() { + System.out.println(INPUT_CAR_NAME_MESSAGE); + } + + public static void inputRepeatNum() { + System.out.println(INPUT_REPEAT_NUM_MESSAGE); + } +} diff --git a/src/main/java/racingcar/view/ResultView.java b/src/main/java/racingcar/view/ResultView.java new file mode 100644 index 0000000..7fe653b --- /dev/null +++ b/src/main/java/racingcar/view/ResultView.java @@ -0,0 +1,25 @@ +package racingcar.view; + +import racingcar.model.RacingCar; +import racingcar.model.RacingCars; + +public class ResultView { + public static void displayRacingCars(RacingCars cars){ + for (RacingCar car : cars.getCars()){ + displayRacingCar(car); + } + printNewLine(); + } + + public static void displayRacingCar(RacingCar car){ + System.out.println(car.formatRacingCar()); + } + + public static void printWinner(String winnerName){ + System.out.println(winnerName + "가 최종 우승했습니다."); + } + + public static void printNewLine(){ + System.out.println(); + } +} diff --git a/src/test/java/racingcar/model/RacingCarTest.java b/src/test/java/racingcar/model/RacingCarTest.java new file mode 100644 index 0000000..d2d16bc --- /dev/null +++ b/src/test/java/racingcar/model/RacingCarTest.java @@ -0,0 +1,24 @@ +package racingcar.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class RacingCarTest { + + @Test + @DisplayName("자동차 이름과 위치 문자열로 반환") + void formatRacingCar(){ + // given + RacingCar car = new RacingCar("red"); + car.forward(); + + // when + String response = car.formatRacingCar(); + + // then + assertEquals(response, "red : -"); + } + +} \ No newline at end of file diff --git a/src/test/java/racingcar/validation/InputValidatorTest.java b/src/test/java/racingcar/validation/InputValidatorTest.java index 50f9bbd..2071dbf 100644 --- a/src/test/java/racingcar/validation/InputValidatorTest.java +++ b/src/test/java/racingcar/validation/InputValidatorTest.java @@ -26,10 +26,20 @@ void isValidCarName_EmptyArray(){ } @Test - @DisplayName("자동차 이름을 담은 배열이 빈값이 아니여서 false 리턴") + @DisplayName("자동차 이름을 담은 배열이 빈값이 아니고 5자 미만으로 true 리턴") void isValidCarName_NotEmptyArray(){ // given, when - boolean response = validator.isEmptyArray(new String[]{"red"}); + boolean response = validator.isValidCarName(new String[]{"red"}); + + // then + assertTrue(response); + } + + @Test + @DisplayName("자동차 이름들 중 5자 이상이 포함되어 있어서 false 리턴") + void isValidCarName_MoreFiveCharacters(){ + // given, when + boolean response = validator.isValidCarName(new String[]{"red", "purple", "green"}); // then assertFalse(response); @@ -46,15 +56,6 @@ void isValidCarName_lessThanFiveCharacters(){ assertTrue(response); } - @Test - @DisplayName("자동차 이름들 중 5자 이상이 포함되어 있어서 false 리턴") - void isValidCarName_MoreFiveCharacters(){ - // given, when - boolean response = validator.isValidCarName(new String[]{"red", "purple", "green"}); - - // then - assertFalse(response); - } @Test @DisplayName("자동차 이름을 담은 배열이 빈값으로 true 리턴") @@ -123,7 +124,7 @@ void isEmptyInputFalse(){ @DisplayName("반복횟수 입력 시 숫자 문자열 입력으로 true 반환") void isNumberInput(){ // given, when - boolean response = validator.isNumberInput("3"); + boolean response = validator.isNumberInput("3456"); // then assertTrue(response);