From a099e678c8ddedbf78a73f3fca2f6a59de20bb58 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 13:43:38 +0900 Subject: [PATCH 01/47] =?UTF-8?q?docs:=20MVC=EC=A0=81=EC=9A=A9=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb..138689ea0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,65 @@ +## 기능 목록(한 눈에 보기) + +``` +• 게임 시작 전 + ◦ 경주할 자동차 이름을 입력받는다. (1) - InputView#getUserInput() + ▫︎ 자동차 이름은 쉼표로 구분한다. - Util#seperatorNameByComma() + ▫︎ 자동차 이름은 5자 이하여야 하며, 넘어갈 시 애러를 발생시킨다. (3) - Validator#validateLength() + ▫︎ 자동자 이름에 중복이 있다면 에러를 발생시킨다. (3) - Validator#validateUnique() + ▫︎ 자동차 이름에 null값이 들어오면 에러를 발생시킨다. (3) - Validator#validateNotNull() + ◦ 게임 횟수를 입력받는다. (2) - InputView#getUserInputCount() + ▫︎ 입력이 숫자가 아닐 시 이러를 발생시킨다. (3) - Validator#validateInteger() + ▫︎ 횟수가 0일 시 에러를 발생시킨다. (3) - Validator#validateRange() + +• 게임 중 + ◦ 0부터 9까지의 숫자를 랜덤하게 구한다. - MainController#getRandomNumber() + ▫︎ 구한 숫자가 4이상의 숫자인지 확인한다. - MainController#checkMovable() + ◦ 4이상의 숫자일 시 자동차를 전진한다. - Car#moveForward() + ▫︎ 자동차 전진은 '-'으로 표기한다. - OutputView#printDistance() + ▫︎ 단 첫번째 출력시에는 자동차 이름도 같이 표기한다. - OutputView#printCarName() + (ex. pobi : -) + ◦ 게임 횟수만큼 반복한다. - MainController#playOneCycle() + +• 게임 종료 + ◦ 최종 우승자 리스트를 가져온다. - Cars#getWinners() + ◦ 최종 우승자를 출력한다. (4) - OutputView#printWinners() + ▫︎ 게임 우승자는 여러명이 나올 수도 있으며, 여러명일 경우에는 쉼표로 구분하여 출력한다. + +(1) 랜덤값 추출은 camp.nextstep.edu.missionutils.Randoms.pickNumberInRange()을 이용한다. +(2) 사용자 입력은 camp.nextstep.edu.missionutils.Console.readLine()을 이용한다. +(3) 예외처리는 IllegalArgumentException을 발생시켜 애플리케이션을 종료시킨다. +(4) 게임 종료 시 System.exit()를 호출하지 않는다. +``` + +

+ +## 기능 목록 체크리스트 + +- 게임 시작 전 +- [ ] 게임 시작 문구를 출력한다. +- [ ] 자동차 경주 이름을 입력받는다. +- [ ] 자동차 이름들을 구분한다. +- [ ] 자동차 이름의 유효성을 검사한다. +- [ ] 게임 횟수를 입력받는다. +- [ ] 게임 횟수의 유효성을 검사한다. + +
+ +- 게임 시작 +- [ ] 0부터 9까지의 숫자를 정한다. +- [ ] 만약 정한 숫자가 4보다 크면 한칸 움직인다. +- [ ] 처음에 입력 받는 횟수만큼 반복한다. + +
+ +- 게임 종료 +- [ ] 최종 우승자를 출력한다. +- [ ] 여러 명일 경우에는 쉼표로 구분하여 출력한다. + +

+ +## 프로그래밍 요구 사항 + +- [ ] indent(인덴트, 들여쓰기)는 depth를 3이 넘지 않도록 구현한다. +- [ ] 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라. +- [ ] JUnit 5와 AssertJ를 이용하여 기능 목록이 정상적으로 작동하는지 테스트 코드를 작성하여 확인한다. \ No newline at end of file From 74afdaf0764c655d87633dcd747fb4fc4247cd4f Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 13:55:28 +0900 Subject: [PATCH 02/47] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EB=AC=B8=EA=B5=AC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/kotlin/racingcar/Application.kt | 5 ++++- src/main/kotlin/racingcar/view/OutputView.kt | 7 +++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/racingcar/view/OutputView.kt diff --git a/docs/README.md b/docs/README.md index 138689ea0..8072d87a5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -36,7 +36,7 @@ ## 기능 목록 체크리스트 - 게임 시작 전 -- [ ] 게임 시작 문구를 출력한다. +- [x] 게임 시작 문구를 출력한다. - [ ] 자동차 경주 이름을 입력받는다. - [ ] 자동차 이름들을 구분한다. - [ ] 자동차 이름의 유효성을 검사한다. diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 0d8f3a79d..219fa2319 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,5 +1,8 @@ package racingcar +import racingcar.view.OutputView + fun main() { - // TODO: 프로그램 구현 + val outputView = OutputView() + outputView.printInputCarNameMessage() } diff --git a/src/main/kotlin/racingcar/view/OutputView.kt b/src/main/kotlin/racingcar/view/OutputView.kt new file mode 100644 index 000000000..4cf6a1285 --- /dev/null +++ b/src/main/kotlin/racingcar/view/OutputView.kt @@ -0,0 +1,7 @@ +package racingcar.view + +class OutputView { + fun printInputCarNameMessage() { + println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)") + } +} \ No newline at end of file From d8174b1e224b04704a270020756b9858bf00cdcf Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 13:56:53 +0900 Subject: [PATCH 03/47] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9E=85=EB=A0=A5=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 3 +++ src/main/kotlin/racingcar/view/InputView.kt | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 src/main/kotlin/racingcar/view/InputView.kt diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 219fa2319..ae738a61e 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,8 +1,11 @@ package racingcar +import racingcar.view.InputView import racingcar.view.OutputView fun main() { val outputView = OutputView() + val inputView = InputView() outputView.printInputCarNameMessage() + val userInput = inputView.getUserInput() } diff --git a/src/main/kotlin/racingcar/view/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt new file mode 100644 index 000000000..0b3cb43b8 --- /dev/null +++ b/src/main/kotlin/racingcar/view/InputView.kt @@ -0,0 +1,7 @@ +package racingcar.view + +import camp.nextstep.edu.missionutils.Console + +class InputView { + fun getUserInput(): String = Console.readLine() +} \ No newline at end of file From af95c62f774e32f94ff129b787aaadc2e246a8ae Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:01:00 +0900 Subject: [PATCH 04/47] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=BB=B4=EB=A7=88=EB=A1=9C=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=ED=95=98=EC=97=AC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- src/main/kotlin/racingcar/Application.kt | 2 ++ src/main/kotlin/racingcar/util/Util.kt | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/racingcar/util/Util.kt diff --git a/docs/README.md b/docs/README.md index 8072d87a5..885ec8c3c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -37,8 +37,8 @@ - 게임 시작 전 - [x] 게임 시작 문구를 출력한다. -- [ ] 자동차 경주 이름을 입력받는다. -- [ ] 자동차 이름들을 구분한다. +- [x] 자동차 경주 이름을 입력받는다. +- [x] 자동차 이름들을 구분한다. - [ ] 자동차 이름의 유효성을 검사한다. - [ ] 게임 횟수를 입력받는다. - [ ] 게임 횟수의 유효성을 검사한다. diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index ae738a61e..51669efe9 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,5 +1,6 @@ package racingcar +import racingcar.util.Util.separateNameByComma import racingcar.view.InputView import racingcar.view.OutputView @@ -8,4 +9,5 @@ fun main() { val inputView = InputView() outputView.printInputCarNameMessage() val userInput = inputView.getUserInput() + val inputList = separateNameByComma(userInput) } diff --git a/src/main/kotlin/racingcar/util/Util.kt b/src/main/kotlin/racingcar/util/Util.kt new file mode 100644 index 000000000..21c904f62 --- /dev/null +++ b/src/main/kotlin/racingcar/util/Util.kt @@ -0,0 +1,5 @@ +package racingcar.util + +object Util { + fun separateNameByComma(carNames: String): List = carNames.split(",") +} \ No newline at end of file From 24d2595ed0efa6988c45609cbc87880d23a524ed Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:01:14 +0900 Subject: [PATCH 05/47] =?UTF-8?q?test:=20=EC=BB=B4=EB=A7=88=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=ED=95=98=EC=97=AC=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 2cb36835c..d32e00509 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -6,6 +6,7 @@ import camp.nextstep.edu.missionutils.test.NsTest import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows +import racingcar.util.Util.separateNameByComma class ApplicationTest : NsTest() { @Test @@ -26,6 +27,14 @@ class ApplicationTest : NsTest() { } } + @Test + fun `컴마로 구분하여 리스트 반환 검증`() { + val input = "lh99j,pobi" + val validation = separateNameByComma(input) + val result = listOf("lh99j", "pobi") + assertThat(validation).isEqualTo(result) + } + public override fun runMain() { main() } From 0255b4a5985ea7ef59538144777ea1d6b9b89343 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:09:29 +0900 Subject: [PATCH 06/47] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EA=B8=B8=EC=9D=B4=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/util/Validator.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/kotlin/racingcar/util/Validator.kt diff --git a/src/main/kotlin/racingcar/util/Validator.kt b/src/main/kotlin/racingcar/util/Validator.kt new file mode 100644 index 000000000..2549d1009 --- /dev/null +++ b/src/main/kotlin/racingcar/util/Validator.kt @@ -0,0 +1,11 @@ +package racingcar.util + +import java.lang.IllegalArgumentException + +object Validator { + fun validateLength(numberList: List) { + numberList.forEach { + if (it.length > 5) throw IllegalArgumentException("자동차의 이름이 5보다 깁니다.") + } + } +} \ No newline at end of file From 35894bab7fb4f2eee41c7180d882a0b84b849a6b Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:09:45 +0900 Subject: [PATCH 07/47] =?UTF-8?q?test:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EA=B8=B8=EC=9D=B4=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index d32e00509..2d36f1fae 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -7,6 +7,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import racingcar.util.Util.separateNameByComma +import racingcar.util.Validator.validateLength class ApplicationTest : NsTest() { @Test @@ -35,6 +36,15 @@ class ApplicationTest : NsTest() { assertThat(validation).isEqualTo(result) } + @Test + fun `자동차 이름 길이 검증`(){ + assertSimpleTest { + assertThrows { validateLength(listOf("pobi", "javaji")) } + assertThrows { validateLength(listOf("abcdef, abcdefg")) } + + } + } + public override fun runMain() { main() } From 8251585f2d0fa57af7eb81cffa826c3ab0c3f779 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:14:23 +0900 Subject: [PATCH 08/47] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=A4=91=EB=B3=B5=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/util/Validator.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/kotlin/racingcar/util/Validator.kt b/src/main/kotlin/racingcar/util/Validator.kt index 2549d1009..7c936b421 100644 --- a/src/main/kotlin/racingcar/util/Validator.kt +++ b/src/main/kotlin/racingcar/util/Validator.kt @@ -8,4 +8,9 @@ object Validator { if (it.length > 5) throw IllegalArgumentException("자동차의 이름이 5보다 깁니다.") } } + + fun validateUnique(numberList: List) { + val validation = numberList.toSet() + if (validation.size != numberList.size) throw IllegalArgumentException("중복된 자동차의 이름이 존재합니다.") + } } \ No newline at end of file From 5a0f00fc2bdf786b8871c73555f9426e4111dab3 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:14:32 +0900 Subject: [PATCH 09/47] =?UTF-8?q?test:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=A4=91=EB=B3=B5=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 2d36f1fae..7789ff4dc 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import racingcar.util.Util.separateNameByComma import racingcar.util.Validator.validateLength +import racingcar.util.Validator.validateUnique class ApplicationTest : NsTest() { @Test @@ -37,7 +38,7 @@ class ApplicationTest : NsTest() { } @Test - fun `자동차 이름 길이 검증`(){ + fun `자동차 이름 길이 검증`() { assertSimpleTest { assertThrows { validateLength(listOf("pobi", "javaji")) } assertThrows { validateLength(listOf("abcdef, abcdefg")) } @@ -45,6 +46,15 @@ class ApplicationTest : NsTest() { } } + @Test + fun `자동차 이름 중복 검증`() { + assertSimpleTest { + assertThrows { validateUnique(listOf("pobi", "javaji", "pobi")) } + assertThrows { validateUnique(listOf("a", "b", "c", "a")) } + + } + } + public override fun runMain() { main() } From db617d1e6649e8fbfa7257922d7ccb3a20686f1a Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:16:27 +0900 Subject: [PATCH 10/47] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=84=90=EA=B0=92=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/util/Validator.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/kotlin/racingcar/util/Validator.kt b/src/main/kotlin/racingcar/util/Validator.kt index 7c936b421..760faf7ae 100644 --- a/src/main/kotlin/racingcar/util/Validator.kt +++ b/src/main/kotlin/racingcar/util/Validator.kt @@ -13,4 +13,10 @@ object Validator { val validation = numberList.toSet() if (validation.size != numberList.size) throw IllegalArgumentException("중복된 자동차의 이름이 존재합니다.") } + + fun validateNotNull(numberList: List) { + numberList.forEach { + if (it.trim().isEmpty()) throw IllegalArgumentException("자동차 이름에 널값이 존재합니다.") + } + } } \ No newline at end of file From 93dec510a85f5e396453f9cef474b7b0809f8ec2 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:16:40 +0900 Subject: [PATCH 11/47] =?UTF-8?q?test:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=84=90=EA=B0=92=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 7789ff4dc..fb8755920 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import racingcar.util.Util.separateNameByComma import racingcar.util.Validator.validateLength +import racingcar.util.Validator.validateNotNull import racingcar.util.Validator.validateUnique class ApplicationTest : NsTest() { @@ -55,6 +56,15 @@ class ApplicationTest : NsTest() { } } + @Test + fun `자동차 이름 널값 검증`() { + assertSimpleTest { + assertThrows { validateNotNull(listOf("pobi", "javaji", " ")) } + assertThrows { validateNotNull(listOf("a", "b", "c", "")) } + assertThrows { validateNotNull(listOf("a", "b", " ")) } + } + } + public override fun runMain() { main() } From 162bc8ea55765f358e8b368a0eb1919bfee381b7 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:26:40 +0900 Subject: [PATCH 12/47] =?UTF-8?q?docs:=20=EC=A7=84=ED=96=89=EC=83=81?= =?UTF-8?q?=ED=99=A9=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 885ec8c3c..c4f68b81b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,7 +39,7 @@ - [x] 게임 시작 문구를 출력한다. - [x] 자동차 경주 이름을 입력받는다. - [x] 자동차 이름들을 구분한다. -- [ ] 자동차 이름의 유효성을 검사한다. +- [x] 자동차 이름의 유효성을 검사한다. - [ ] 게임 횟수를 입력받는다. - [ ] 게임 횟수의 유효성을 검사한다. From 11396a79c4431a2966da454ff6c7c1f123a100c5 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:30:26 +0900 Subject: [PATCH 13/47] =?UTF-8?q?feat:=20=ED=9A=9F=EC=88=98=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/view/OutputView.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/kotlin/racingcar/view/OutputView.kt b/src/main/kotlin/racingcar/view/OutputView.kt index 4cf6a1285..f7a128259 100644 --- a/src/main/kotlin/racingcar/view/OutputView.kt +++ b/src/main/kotlin/racingcar/view/OutputView.kt @@ -4,4 +4,8 @@ class OutputView { fun printInputCarNameMessage() { println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)") } + + fun printInputCountMessage() { + println("시도할 횟수는 몇 회인가요?") + } } \ No newline at end of file From ac5f83fede2ffe68a88c2121e49b33385b22cfe1 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:32:52 +0900 Subject: [PATCH 14/47] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=A0=95=EC=88=98=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/util/Validator.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/kotlin/racingcar/util/Validator.kt b/src/main/kotlin/racingcar/util/Validator.kt index 760faf7ae..addfbdb17 100644 --- a/src/main/kotlin/racingcar/util/Validator.kt +++ b/src/main/kotlin/racingcar/util/Validator.kt @@ -19,4 +19,8 @@ object Validator { if (it.trim().isEmpty()) throw IllegalArgumentException("자동차 이름에 널값이 존재합니다.") } } + + fun validateInteger(number: String) { + number.toIntOrNull() ?: throw IllegalArgumentException("사용자의 입력이 정수가 아닙니다.") + } } \ No newline at end of file From b76936d33002fc7e6b322ee1f064a50415b99e29 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:33:14 +0900 Subject: [PATCH 15/47] =?UTF-8?q?test:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9D=B4=20=EC=A0=95=EC=88=98=EC=9D=B8?= =?UTF-8?q?=EC=A7=80=20=EA=B2=80=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index fb8755920..20d2a824a 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -7,6 +7,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import racingcar.util.Util.separateNameByComma +import racingcar.util.Validator.validateInteger import racingcar.util.Validator.validateLength import racingcar.util.Validator.validateNotNull import racingcar.util.Validator.validateUnique @@ -65,6 +66,15 @@ class ApplicationTest : NsTest() { } } + @Test + fun `사용자 입력 정수 검증`() { + assertSimpleTest { + assertThrows { validateInteger("a") } + assertThrows { validateInteger("1a") } + assertThrows { validateInteger("4_@") } + } + } + public override fun runMain() { main() } From c84fe0dfbcb19e84ee14be215f0e96d4a6e3de0f Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:37:38 +0900 Subject: [PATCH 16/47] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9D=98=20=EB=B2=94=EC=9C=84=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/util/Validator.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/kotlin/racingcar/util/Validator.kt b/src/main/kotlin/racingcar/util/Validator.kt index addfbdb17..3b160968d 100644 --- a/src/main/kotlin/racingcar/util/Validator.kt +++ b/src/main/kotlin/racingcar/util/Validator.kt @@ -23,4 +23,9 @@ object Validator { fun validateInteger(number: String) { number.toIntOrNull() ?: throw IllegalArgumentException("사용자의 입력이 정수가 아닙니다.") } + + fun validateRange(number: String) { + val validation = number.toInt() + if (validation !in 1..Int.MAX_VALUE) throw IllegalArgumentException("사용자의 입력이 유효한 범위가 아닙니다.") + } } \ No newline at end of file From 7f30ea83f1cadf661669cef63ba424a8ac4ceb21 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:38:04 +0900 Subject: [PATCH 17/47] =?UTF-8?q?test:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9D=98=20=EB=B2=94=EC=9C=84=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 20d2a824a..459b9bbb4 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -10,6 +10,7 @@ import racingcar.util.Util.separateNameByComma import racingcar.util.Validator.validateInteger import racingcar.util.Validator.validateLength import racingcar.util.Validator.validateNotNull +import racingcar.util.Validator.validateRange import racingcar.util.Validator.validateUnique class ApplicationTest : NsTest() { @@ -75,6 +76,15 @@ class ApplicationTest : NsTest() { } } + @Test + fun `사용자 입력 유효 범위 검증`() { + assertSimpleTest { + assertThrows { validateRange((Int.MAX_VALUE.toLong() + 1).toString()) } + assertThrows { validateRange("-1") } + assertThrows { validateRange("0") } + } + } + public override fun runMain() { main() } From 456d445fe0d23a354811c1e4f45fb83f9c595b19 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 14:38:45 +0900 Subject: [PATCH 18/47] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EB=B0=8F=20=EC=A7=84=ED=96=89=EC=83=81=ED=99=A9=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index c4f68b81b..9b816fde1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,7 +9,7 @@ ▫︎ 자동차 이름에 null값이 들어오면 에러를 발생시킨다. (3) - Validator#validateNotNull() ◦ 게임 횟수를 입력받는다. (2) - InputView#getUserInputCount() ▫︎ 입력이 숫자가 아닐 시 이러를 발생시킨다. (3) - Validator#validateInteger() - ▫︎ 횟수가 0일 시 에러를 발생시킨다. (3) - Validator#validateRange() + ▫︎ 입력의 범위를 벗어날 시 에러를 발생시킨다. (3) - Validator#validateRange() • 게임 중 ◦ 0부터 9까지의 숫자를 랜덤하게 구한다. - MainController#getRandomNumber() @@ -40,8 +40,8 @@ - [x] 자동차 경주 이름을 입력받는다. - [x] 자동차 이름들을 구분한다. - [x] 자동차 이름의 유효성을 검사한다. -- [ ] 게임 횟수를 입력받는다. -- [ ] 게임 횟수의 유효성을 검사한다. +- [x] 게임 횟수를 입력받는다. +- [x] 게임 횟수의 유효성을 검사한다.
From 530df2bfb56d95dbfa6857e0a65e0d16cb3e9e1f Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:06:15 +0900 Subject: [PATCH 19/47] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=AB=EC=9E=90=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/kotlin/racingcar/controller/MainController.kt | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/racingcar/controller/MainController.kt diff --git a/docs/README.md b/docs/README.md index 9b816fde1..db8b1284c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -46,7 +46,7 @@
- 게임 시작 -- [ ] 0부터 9까지의 숫자를 정한다. +- [x] 0부터 9까지의 숫자를 정한다. - [ ] 만약 정한 숫자가 4보다 크면 한칸 움직인다. - [ ] 처음에 입력 받는 횟수만큼 반복한다. diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt new file mode 100644 index 000000000..370916469 --- /dev/null +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -0,0 +1,9 @@ +package racingcar.controller + +import racingcar.view.InputView +import racingcar.view.OutputView +import camp.nextstep.edu.missionutils.Randoms + +class MainController(private val inputView: InputView, private val outputView: OutputView) { + fun getRandomNumber(): Int = Randoms.pickNumberInRange(0, 9) +} \ No newline at end of file From 2a59198af022657b94c32c7d73647f64c82ec08d Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:09:41 +0900 Subject: [PATCH 20/47] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=A0=84=EC=A7=84=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/model/Car.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/kotlin/model/Car.kt diff --git a/src/main/kotlin/model/Car.kt b/src/main/kotlin/model/Car.kt new file mode 100644 index 000000000..18417ee70 --- /dev/null +++ b/src/main/kotlin/model/Car.kt @@ -0,0 +1,11 @@ +package model + +class Car(private val name: String) { + private var _distance = 0 + val distance: Int + get() = _distance + + fun isMove(movable: Boolean) { + if (movable) _distance++ + } +} \ No newline at end of file From 0daa19f19510ea0f7de4425b757e91d104bfd585 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:09:56 +0900 Subject: [PATCH 21/47] =?UTF-8?q?test:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=A0=84=EC=A7=84=20=EA=B8=B0=EB=8A=A5=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 459b9bbb4..3b04cd94b 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -3,6 +3,7 @@ package racingcar import camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest import camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest import camp.nextstep.edu.missionutils.test.NsTest +import model.Car import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -85,6 +86,15 @@ class ApplicationTest : NsTest() { } } + @Test + fun `자동차가 움직였는지 검증`() { + val car = Car("lh99j") + car.isMove(true) + val validation = car.distance + val result = 1 + assertThat(validation).isEqualTo(result) + } + public override fun runMain() { main() } From f0e4f33aa73697887800251e4b7dc106ae7fee3e Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:15:38 +0900 Subject: [PATCH 22/47] =?UTF-8?q?feat:=20Cars=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/model/Cars.kt | 9 +++++++++ .../kotlin/racingcar/controller/MainController.kt | 8 ++++++++ src/main/kotlin/racingcar/view/InputView.kt | 12 ++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 src/main/kotlin/model/Cars.kt diff --git a/src/main/kotlin/model/Cars.kt b/src/main/kotlin/model/Cars.kt new file mode 100644 index 000000000..02cd4327c --- /dev/null +++ b/src/main/kotlin/model/Cars.kt @@ -0,0 +1,9 @@ +package model + +class Cars { + private var _carNames = mutableListOf() + val carNames: List + get() = _carNames + + fun addAllList(carNames: List) = _carNames.addAll(carNames.map { Car(it) }) +} \ No newline at end of file diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index 370916469..10c317d8e 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -3,7 +3,15 @@ package racingcar.controller import racingcar.view.InputView import racingcar.view.OutputView import camp.nextstep.edu.missionutils.Randoms +import model.Cars class MainController(private val inputView: InputView, private val outputView: OutputView) { + private val cars = Cars() + fun gameStart() { + outputView.printInputCarNameMessage() + val carNames = inputView.getInputCarNames() + cars.addAllList(carNames) + } + fun getRandomNumber(): Int = Randoms.pickNumberInRange(0, 9) } \ No newline at end of file diff --git a/src/main/kotlin/racingcar/view/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt index 0b3cb43b8..dd301f55e 100644 --- a/src/main/kotlin/racingcar/view/InputView.kt +++ b/src/main/kotlin/racingcar/view/InputView.kt @@ -1,7 +1,19 @@ package racingcar.view import camp.nextstep.edu.missionutils.Console +import racingcar.util.Util.separateNameByComma +import racingcar.util.Validator.validateLength +import racingcar.util.Validator.validateNotNull +import racingcar.util.Validator.validateUnique class InputView { fun getUserInput(): String = Console.readLine() + + fun getInputCarNames(): List { + val input = separateNameByComma(getUserInput()) + validateLength(input) + validateUnique(input) + validateNotNull(input) + return input + } } \ No newline at end of file From bc2a4f1a8b7573636c1945f7f1dfc8adaea61a15 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:16:49 +0900 Subject: [PATCH 23/47] =?UTF-8?q?feat:=204=EC=9D=B4=EC=83=81=EC=9D=B4?= =?UTF-8?q?=EB=A9=B4=20true=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/controller/MainController.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index 10c317d8e..6ced7469a 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -14,4 +14,6 @@ class MainController(private val inputView: InputView, private val outputView: O } fun getRandomNumber(): Int = Randoms.pickNumberInRange(0, 9) + + fun isMovable(number: Int): Boolean = number >= 4 } \ No newline at end of file From b842fcf199b0c095f0ed1facb8183461df9c2674 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:19:47 +0900 Subject: [PATCH 24/47] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/controller/MainController.kt | 8 ++++++++ src/main/kotlin/racingcar/view/InputView.kt | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index 6ced7469a..17c43b05d 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -11,6 +11,14 @@ class MainController(private val inputView: InputView, private val outputView: O outputView.printInputCarNameMessage() val carNames = inputView.getInputCarNames() cars.addAllList(carNames) + val gameCnt = inputView.getInputCount() + + repeat(gameCnt) { + cars.carNames.forEach { car -> + val isMovable = isMovable(getRandomNumber()) + car.isMove(isMovable) + } + } } fun getRandomNumber(): Int = Randoms.pickNumberInRange(0, 9) diff --git a/src/main/kotlin/racingcar/view/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt index dd301f55e..1c577f7a2 100644 --- a/src/main/kotlin/racingcar/view/InputView.kt +++ b/src/main/kotlin/racingcar/view/InputView.kt @@ -2,8 +2,10 @@ package racingcar.view import camp.nextstep.edu.missionutils.Console import racingcar.util.Util.separateNameByComma +import racingcar.util.Validator.validateInteger import racingcar.util.Validator.validateLength import racingcar.util.Validator.validateNotNull +import racingcar.util.Validator.validateRange import racingcar.util.Validator.validateUnique class InputView { @@ -16,4 +18,11 @@ class InputView { validateNotNull(input) return input } + + fun getInputCount(): Int { + val input = getUserInput() + validateInteger(input) + validateRange(input) + return input.toInt() + } } \ No newline at end of file From 55cc32ea43ce93e802f4f4d2b1afcb551c3e43a1 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:23:09 +0900 Subject: [PATCH 25/47] =?UTF-8?q?test:=20isMovable=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 3b04cd94b..734dc88b4 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -7,14 +7,21 @@ import model.Car import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows +import racingcar.controller.MainController import racingcar.util.Util.separateNameByComma import racingcar.util.Validator.validateInteger import racingcar.util.Validator.validateLength import racingcar.util.Validator.validateNotNull import racingcar.util.Validator.validateRange import racingcar.util.Validator.validateUnique +import racingcar.view.InputView +import racingcar.view.OutputView class ApplicationTest : NsTest() { + private val inputView = InputView() + private val outputView = OutputView() + private val controller = MainController(inputView, outputView) + @Test fun `전진 정지`() { assertRandomNumberInRangeTest( @@ -95,6 +102,19 @@ class ApplicationTest : NsTest() { assertThat(validation).isEqualTo(result) } + @Test + fun `움직일 수 있는지 반환 기능 검증`() { + val falseInput = 5 + val falseValidation = controller.isMovable(falseInput) + val falseResult = false + assertThat(falseValidation).isEqualTo(falseResult) + + val trueInput = 4 + val trueValidation = controller.isMovable(trueInput) + val trueResult = true + assertThat(trueValidation).isEqualTo(trueResult) + } + public override fun runMain() { main() } From 31e8e73eddbc4f9099971c8d5287058d0755d398 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:23:38 +0900 Subject: [PATCH 26/47] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 734dc88b4..5f8aed916 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -104,7 +104,7 @@ class ApplicationTest : NsTest() { @Test fun `움직일 수 있는지 반환 기능 검증`() { - val falseInput = 5 + val falseInput = 3 val falseValidation = controller.isMovable(falseInput) val falseResult = false assertThat(falseValidation).isEqualTo(falseResult) From e80ab0048388e77e430d50737174f7211721b19d Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:24:36 +0900 Subject: [PATCH 27/47] =?UTF-8?q?docs:=20=EC=B2=B4=ED=81=AC=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index db8b1284c..31f7e7123 100644 --- a/docs/README.md +++ b/docs/README.md @@ -47,8 +47,8 @@ - 게임 시작 - [x] 0부터 9까지의 숫자를 정한다. -- [ ] 만약 정한 숫자가 4보다 크면 한칸 움직인다. -- [ ] 처음에 입력 받는 횟수만큼 반복한다. +- [x] 만약 정한 숫자가 4보다 크면 한칸 움직인다. +- [x] 처음에 입력 받는 횟수만큼 반복한다.
From 5040a919f246e1b434455c722987a5fa35139148 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:28:14 +0900 Subject: [PATCH 28/47] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/model/Car.kt | 6 +++++- src/main/kotlin/racingcar/Application.kt | 6 +++--- src/main/kotlin/racingcar/controller/MainController.kt | 3 +++ src/main/kotlin/racingcar/view/OutputView.kt | 6 ++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/model/Car.kt b/src/main/kotlin/model/Car.kt index 18417ee70..ef10627d9 100644 --- a/src/main/kotlin/model/Car.kt +++ b/src/main/kotlin/model/Car.kt @@ -1,6 +1,10 @@ package model -class Car(private val name: String) { +class Car(private val _name: String) { + + val name: String + get() = _name + private var _distance = 0 val distance: Int get() = _distance diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 51669efe9..dccba129f 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,5 +1,6 @@ package racingcar +import racingcar.controller.MainController import racingcar.util.Util.separateNameByComma import racingcar.view.InputView import racingcar.view.OutputView @@ -7,7 +8,6 @@ import racingcar.view.OutputView fun main() { val outputView = OutputView() val inputView = InputView() - outputView.printInputCarNameMessage() - val userInput = inputView.getUserInput() - val inputList = separateNameByComma(userInput) + val controller = MainController(inputView, outputView) + controller.gameStart() } diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index 17c43b05d..a9b03f0fe 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -11,12 +11,15 @@ class MainController(private val inputView: InputView, private val outputView: O outputView.printInputCarNameMessage() val carNames = inputView.getInputCarNames() cars.addAllList(carNames) + outputView.printInputCountMessage() val gameCnt = inputView.getInputCount() repeat(gameCnt) { cars.carNames.forEach { car -> val isMovable = isMovable(getRandomNumber()) car.isMove(isMovable) + outputView.printCarDistance(car) + println() } } } diff --git a/src/main/kotlin/racingcar/view/OutputView.kt b/src/main/kotlin/racingcar/view/OutputView.kt index f7a128259..bfefc4732 100644 --- a/src/main/kotlin/racingcar/view/OutputView.kt +++ b/src/main/kotlin/racingcar/view/OutputView.kt @@ -1,5 +1,7 @@ package racingcar.view +import model.Car + class OutputView { fun printInputCarNameMessage() { println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)") @@ -8,4 +10,8 @@ class OutputView { fun printInputCountMessage() { println("시도할 횟수는 몇 회인가요?") } + + fun printCarDistance(car: Car) { + println("${car.name} : ${"-".repeat(car.distance)}") + } } \ No newline at end of file From abea5d7cf84661c097a1583c1f5fe8a50cb0e9a3 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:29:00 +0900 Subject: [PATCH 29/47] =?UTF-8?q?fix:=20print()=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/controller/MainController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index a9b03f0fe..e2d84c186 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -19,8 +19,8 @@ class MainController(private val inputView: InputView, private val outputView: O val isMovable = isMovable(getRandomNumber()) car.isMove(isMovable) outputView.printCarDistance(car) - println() } + println() } } From b5c97694bf2b73f8e7d1fc9982782d41bc6d7ed0 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:32:30 +0900 Subject: [PATCH 30/47] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=EA=B1=B0=EB=A6=AC=EC=9D=98=20=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=EA=B0=92=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/model/Cars.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/model/Cars.kt b/src/main/kotlin/model/Cars.kt index 02cd4327c..cbc302d45 100644 --- a/src/main/kotlin/model/Cars.kt +++ b/src/main/kotlin/model/Cars.kt @@ -6,4 +6,6 @@ class Cars { get() = _carNames fun addAllList(carNames: List) = _carNames.addAll(carNames.map { Car(it) }) + + fun getMaxDistance(): Int = _carNames.maxOf { it.distance } } \ No newline at end of file From 914e1988975f935ddcdafcdc63a6df5eabf78712 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:32:42 +0900 Subject: [PATCH 31/47] =?UTF-8?q?test:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=EA=B1=B0=EB=A6=AC=20=EC=B5=9C=EB=8C=80?= =?UTF-8?q?=EA=B0=92=20=EB=B0=98=ED=99=98=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 5f8aed916..c09adc4fa 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -4,6 +4,7 @@ import camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeT import camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest import camp.nextstep.edu.missionutils.test.NsTest import model.Car +import model.Cars import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -115,6 +116,20 @@ class ApplicationTest : NsTest() { assertThat(trueValidation).isEqualTo(trueResult) } + @Test + fun `최대 거리 반환 기능 검증`() { + val input = listOf("pobi", "lh99j", "anjji", "amin") + val cars = Cars() + cars.addAllList(input) + cars.carNames[1].isMove(true) + cars.carNames[1].isMove(true) + cars.carNames[1].isMove(true) + cars.carNames[1].isMove(true) + val validation = cars.getMaxDistance() + val result = 4 + assertThat(validation).isEqualTo(result) + } + public override fun runMain() { main() } From ab3bc60ce4541097aec6d24b37613a3d72a43728 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:33:36 +0900 Subject: [PATCH 32/47] =?UTF-8?q?feat:=20=EC=9A=B0=EC=8A=B9=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/model/Car.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/model/Car.kt b/src/main/kotlin/model/Car.kt index ef10627d9..7ec52584f 100644 --- a/src/main/kotlin/model/Car.kt +++ b/src/main/kotlin/model/Car.kt @@ -12,4 +12,6 @@ class Car(private val _name: String) { fun isMove(movable: Boolean) { if (movable) _distance++ } + + fun isWinner(maxValue: Int): Boolean = _distance == maxValue } \ No newline at end of file From 31d9c82f265c47a8bdc013b4d49583355b1acf42 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:36:16 +0900 Subject: [PATCH 33/47] =?UTF-8?q?test:=20=EC=9A=B0=EC=8A=B9=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index c09adc4fa..d3e66de99 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -130,6 +130,21 @@ class ApplicationTest : NsTest() { assertThat(validation).isEqualTo(result) } + @Test + fun `우승자 확인 기능 검증`() { + val input = listOf(Car("pobi"), Car("lh99j"), Car("abc")) + input[1].isMove(true) + input[1].isMove(true) + + val falseValidation = input[0].isWinner(2) + val falseResult = false + assertThat(falseValidation).isEqualTo(falseResult) + + val trueValidation = input[1].isWinner(2) + val trueResult = true + assertThat(trueValidation).isEqualTo(trueResult) + } + public override fun runMain() { main() } From acf4a7af99c8bc7a6c6067e70da981d0595cdd7d Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:41:18 +0900 Subject: [PATCH 34/47] =?UTF-8?q?feat:=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/model/Cars.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/kotlin/model/Cars.kt b/src/main/kotlin/model/Cars.kt index cbc302d45..f45652b38 100644 --- a/src/main/kotlin/model/Cars.kt +++ b/src/main/kotlin/model/Cars.kt @@ -8,4 +8,9 @@ class Cars { fun addAllList(carNames: List) = _carNames.addAll(carNames.map { Car(it) }) fun getMaxDistance(): Int = _carNames.maxOf { it.distance } + + fun getWinners(): List { + val maxDistance = getMaxDistance() + return _carNames.filter { it.isWinner(maxDistance) }.map { it.name } + } } \ No newline at end of file From dca30bd5d413d6a5ead1b5669211d88eb297fce6 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:41:28 +0900 Subject: [PATCH 35/47] =?UTF-8?q?test:=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index d3e66de99..13d46d8d1 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -145,6 +145,19 @@ class ApplicationTest : NsTest() { assertThat(trueValidation).isEqualTo(trueResult) } + @Test + fun `우승자 반환 기능 검증`() { + val input = listOf("pobi", "lh99j", "abcd") + val cars = Cars() + cars.addAllList(input) + cars.carNames[0].isMove(true) + cars.carNames[1].isMove(true) + + val validation = cars.getWinners() + val result = listOf("pobi", "lh99j") + assertThat(validation).isEqualTo(result) + } + public override fun runMain() { main() } From 76d82bf8875d69d866f9cabb271cd301f51d6173 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:43:11 +0900 Subject: [PATCH 36/47] =?UTF-8?q?feat:=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/controller/MainController.kt | 3 +++ src/main/kotlin/racingcar/view/OutputView.kt | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index e2d84c186..a567a6ae6 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -22,6 +22,9 @@ class MainController(private val inputView: InputView, private val outputView: O } println() } + + val winners = cars.getWinners() + outputView.printWinners(winners) } fun getRandomNumber(): Int = Randoms.pickNumberInRange(0, 9) diff --git a/src/main/kotlin/racingcar/view/OutputView.kt b/src/main/kotlin/racingcar/view/OutputView.kt index bfefc4732..86ad0fe8c 100644 --- a/src/main/kotlin/racingcar/view/OutputView.kt +++ b/src/main/kotlin/racingcar/view/OutputView.kt @@ -14,4 +14,9 @@ class OutputView { fun printCarDistance(car: Car) { println("${car.name} : ${"-".repeat(car.distance)}") } + + fun printWinners(winners: List) { + val output = winners.joinToString(", ") + println(output) + } } \ No newline at end of file From b7d47bbe9d6238d8d6d28e285428f74c87f7fea9 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:43:42 +0900 Subject: [PATCH 37/47] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 31f7e7123..1e3336c32 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,8 +53,8 @@
- 게임 종료 -- [ ] 최종 우승자를 출력한다. -- [ ] 여러 명일 경우에는 쉼표로 구분하여 출력한다. +- [x] 최종 우승자를 출력한다. +- [x] 여러 명일 경우에는 쉼표로 구분하여 출력한다.

From d4dba451acd027bdc7a594bfff426850b0a95e83 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:46:32 +0900 Subject: [PATCH 38/47] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/controller/MainController.kt | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index a567a6ae6..f1321c761 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -7,22 +7,38 @@ import model.Cars class MainController(private val inputView: InputView, private val outputView: OutputView) { private val cars = Cars() + private var gameCount = 0 + + fun run() { + gameInit() + gameStart() + gameEnd() + } + fun gameStart() { + repeat(gameCount) { + playOneCycle() + } + } + + fun gameInit() { outputView.printInputCarNameMessage() val carNames = inputView.getInputCarNames() cars.addAllList(carNames) outputView.printInputCountMessage() - val gameCnt = inputView.getInputCount() - - repeat(gameCnt) { - cars.carNames.forEach { car -> - val isMovable = isMovable(getRandomNumber()) - car.isMove(isMovable) - outputView.printCarDistance(car) - } - println() + gameCount = inputView.getInputCount() + } + + fun playOneCycle() { + cars.carNames.forEach { car -> + val isMovable = isMovable(getRandomNumber()) + car.isMove(isMovable) + outputView.printCarDistance(car) } + println() + } + fun gameEnd() { val winners = cars.getWinners() outputView.printWinners(winners) } From 90582467c1214b5031b8190fa173f9dc78fc58c7 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:46:58 +0900 Subject: [PATCH 39/47] =?UTF-8?q?fix:=20=EA=B2=8C=EC=9E=84=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=ED=98=B8=EC=B6=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index dccba129f..38ddd349a 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -9,5 +9,5 @@ fun main() { val outputView = OutputView() val inputView = InputView() val controller = MainController(inputView, outputView) - controller.gameStart() + controller.run() } From a13d7cd8ea9ee2dfc8bd54dd94e2b97afd8a0b59 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:48:56 +0900 Subject: [PATCH 40/47] =?UTF-8?q?fix:=20model=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9C=84=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/controller/MainController.kt | 2 +- src/main/kotlin/{ => racingcar}/model/Car.kt | 2 +- src/main/kotlin/{ => racingcar}/model/Cars.kt | 2 +- src/main/kotlin/racingcar/view/OutputView.kt | 2 +- src/test/kotlin/racingcar/ApplicationTest.kt | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) rename src/main/kotlin/{ => racingcar}/model/Car.kt (92%) rename src/main/kotlin/{ => racingcar}/model/Cars.kt (94%) diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index f1321c761..2f905ab4c 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -3,7 +3,7 @@ package racingcar.controller import racingcar.view.InputView import racingcar.view.OutputView import camp.nextstep.edu.missionutils.Randoms -import model.Cars +import racingcar.model.Cars class MainController(private val inputView: InputView, private val outputView: OutputView) { private val cars = Cars() diff --git a/src/main/kotlin/model/Car.kt b/src/main/kotlin/racingcar/model/Car.kt similarity index 92% rename from src/main/kotlin/model/Car.kt rename to src/main/kotlin/racingcar/model/Car.kt index 7ec52584f..fefc622cd 100644 --- a/src/main/kotlin/model/Car.kt +++ b/src/main/kotlin/racingcar/model/Car.kt @@ -1,4 +1,4 @@ -package model +package racingcar.model class Car(private val _name: String) { diff --git a/src/main/kotlin/model/Cars.kt b/src/main/kotlin/racingcar/model/Cars.kt similarity index 94% rename from src/main/kotlin/model/Cars.kt rename to src/main/kotlin/racingcar/model/Cars.kt index f45652b38..24df1eee7 100644 --- a/src/main/kotlin/model/Cars.kt +++ b/src/main/kotlin/racingcar/model/Cars.kt @@ -1,4 +1,4 @@ -package model +package racingcar.model class Cars { private var _carNames = mutableListOf() diff --git a/src/main/kotlin/racingcar/view/OutputView.kt b/src/main/kotlin/racingcar/view/OutputView.kt index 86ad0fe8c..a4d8bfc6f 100644 --- a/src/main/kotlin/racingcar/view/OutputView.kt +++ b/src/main/kotlin/racingcar/view/OutputView.kt @@ -1,6 +1,6 @@ package racingcar.view -import model.Car +import racingcar.model.Car class OutputView { fun printInputCarNameMessage() { diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 13d46d8d1..f7b49697d 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -3,8 +3,8 @@ package racingcar import camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest import camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest import camp.nextstep.edu.missionutils.test.NsTest -import model.Car -import model.Cars +import racingcar.model.Car +import racingcar.model.Cars import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows From b9f5f74ccb1547e06820fdf18cee1fbd22b8e121 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:49:23 +0900 Subject: [PATCH 41/47] =?UTF-8?q?fix:=20=EC=B5=9C=EC=A2=85=20=EC=9A=B0?= =?UTF-8?q?=EC=8A=B9=EC=9E=90=20=EC=B6=9C=EB=A0=A5=EB=AC=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/view/OutputView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/racingcar/view/OutputView.kt b/src/main/kotlin/racingcar/view/OutputView.kt index a4d8bfc6f..2b7ba7aa7 100644 --- a/src/main/kotlin/racingcar/view/OutputView.kt +++ b/src/main/kotlin/racingcar/view/OutputView.kt @@ -17,6 +17,6 @@ class OutputView { fun printWinners(winners: List) { val output = winners.joinToString(", ") - println(output) + println("최종 우승자 : $output") } } \ No newline at end of file From 361f0b9a58a925da8e0d5e8dbf38a4f4e485bdd6 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:52:43 +0900 Subject: [PATCH 42/47] =?UTF-8?q?refactor:=20ExceptionMessage=20enum=20cla?= =?UTF-8?q?ss=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/util/ExceptionMessage.kt | 11 +++++++++++ src/main/kotlin/racingcar/util/Validator.kt | 10 +++++----- 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 src/main/kotlin/racingcar/util/ExceptionMessage.kt diff --git a/src/main/kotlin/racingcar/util/ExceptionMessage.kt b/src/main/kotlin/racingcar/util/ExceptionMessage.kt new file mode 100644 index 000000000..8f6114f6e --- /dev/null +++ b/src/main/kotlin/racingcar/util/ExceptionMessage.kt @@ -0,0 +1,11 @@ +package racingcar.util + +enum class ExceptionMessage(private val message: String) { + INVALID_LENGTH("자동차의 이름이 5보다 깁니다."), + INVALID_UNIQUE_NAME("중복된 자동차의 이름이 존재합니다."), + INVALID_CAR_NAME("자동차 이름에 널값이 존재합니다."), + INVALID_INTEGER("사용자의 입력이 정수가 아닙니다."), + INVALID_RANGE("사용자의 입력이 유효한 범위가 아닙니다."); + + fun getMessage(): String = message +} \ No newline at end of file diff --git a/src/main/kotlin/racingcar/util/Validator.kt b/src/main/kotlin/racingcar/util/Validator.kt index 3b160968d..9e5fc92fe 100644 --- a/src/main/kotlin/racingcar/util/Validator.kt +++ b/src/main/kotlin/racingcar/util/Validator.kt @@ -5,27 +5,27 @@ import java.lang.IllegalArgumentException object Validator { fun validateLength(numberList: List) { numberList.forEach { - if (it.length > 5) throw IllegalArgumentException("자동차의 이름이 5보다 깁니다.") + if (it.length > 5) throw IllegalArgumentException(ExceptionMessage.INVALID_LENGTH.getMessage()) } } fun validateUnique(numberList: List) { val validation = numberList.toSet() - if (validation.size != numberList.size) throw IllegalArgumentException("중복된 자동차의 이름이 존재합니다.") + if (validation.size != numberList.size) throw IllegalArgumentException(ExceptionMessage.INVALID_UNIQUE_NAME.getMessage()) } fun validateNotNull(numberList: List) { numberList.forEach { - if (it.trim().isEmpty()) throw IllegalArgumentException("자동차 이름에 널값이 존재합니다.") + if (it.trim().isEmpty()) throw IllegalArgumentException(ExceptionMessage.INVALID_CAR_NAME.getMessage()) } } fun validateInteger(number: String) { - number.toIntOrNull() ?: throw IllegalArgumentException("사용자의 입력이 정수가 아닙니다.") + number.toIntOrNull() ?: throw IllegalArgumentException(ExceptionMessage.INVALID_INTEGER.getMessage()) } fun validateRange(number: String) { val validation = number.toInt() - if (validation !in 1..Int.MAX_VALUE) throw IllegalArgumentException("사용자의 입력이 유효한 범위가 아닙니다.") + if (validation !in 1..Int.MAX_VALUE) throw IllegalArgumentException(ExceptionMessage.INVALID_RANGE.getMessage()) } } \ No newline at end of file From d98ef9a7bccfb96e875688714cfc62a420ddd43e Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:55:21 +0900 Subject: [PATCH 43/47] =?UTF-8?q?refactor:=20Constants=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EB=B6=88=EB=B3=80=EA=B0=92=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/controller/MainController.kt | 7 +++++-- src/main/kotlin/racingcar/util/Constants.kt | 9 +++++++++ src/main/kotlin/racingcar/util/Validator.kt | 6 ++++-- 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/racingcar/util/Constants.kt diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index 2f905ab4c..ca0bf1614 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -4,6 +4,9 @@ import racingcar.view.InputView import racingcar.view.OutputView import camp.nextstep.edu.missionutils.Randoms import racingcar.model.Cars +import racingcar.util.Constants.END_NUMBER +import racingcar.util.Constants.MOVABLE_NUMBER +import racingcar.util.Constants.START_NUMBER class MainController(private val inputView: InputView, private val outputView: OutputView) { private val cars = Cars() @@ -43,7 +46,7 @@ class MainController(private val inputView: InputView, private val outputView: O outputView.printWinners(winners) } - fun getRandomNumber(): Int = Randoms.pickNumberInRange(0, 9) + fun getRandomNumber(): Int = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER) - fun isMovable(number: Int): Boolean = number >= 4 + fun isMovable(number: Int): Boolean = number >= MOVABLE_NUMBER } \ No newline at end of file diff --git a/src/main/kotlin/racingcar/util/Constants.kt b/src/main/kotlin/racingcar/util/Constants.kt new file mode 100644 index 000000000..d9914ce6f --- /dev/null +++ b/src/main/kotlin/racingcar/util/Constants.kt @@ -0,0 +1,9 @@ +package racingcar.util + +object Constants { + const val MAX_NAME_LENGTH = 5 + const val START_NUMBER = 0 + const val END_NUMBER = 9 + const val MIN_COUNT_NUMBER = 1 + const val MOVABLE_NUMBER = 4 +} \ No newline at end of file diff --git a/src/main/kotlin/racingcar/util/Validator.kt b/src/main/kotlin/racingcar/util/Validator.kt index 9e5fc92fe..be6cff345 100644 --- a/src/main/kotlin/racingcar/util/Validator.kt +++ b/src/main/kotlin/racingcar/util/Validator.kt @@ -1,11 +1,13 @@ package racingcar.util +import racingcar.util.Constants.MAX_NAME_LENGTH +import racingcar.util.Constants.MIN_COUNT_NUMBER import java.lang.IllegalArgumentException object Validator { fun validateLength(numberList: List) { numberList.forEach { - if (it.length > 5) throw IllegalArgumentException(ExceptionMessage.INVALID_LENGTH.getMessage()) + if (it.length > MAX_NAME_LENGTH) throw IllegalArgumentException(ExceptionMessage.INVALID_LENGTH.getMessage()) } } @@ -26,6 +28,6 @@ object Validator { fun validateRange(number: String) { val validation = number.toInt() - if (validation !in 1..Int.MAX_VALUE) throw IllegalArgumentException(ExceptionMessage.INVALID_RANGE.getMessage()) + if (validation !in MIN_COUNT_NUMBER..Int.MAX_VALUE) throw IllegalArgumentException(ExceptionMessage.INVALID_RANGE.getMessage()) } } \ No newline at end of file From a9845511258052879fbd6bce0ee51be8991639e8 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:57:04 +0900 Subject: [PATCH 44/47] =?UTF-8?q?refactor:=20=EC=9C=A0=ED=8B=B8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20Util=20class=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=20=EB=B0=8F=20=EC=99=B8=EB=B6=80=20=ED=98=B8=EC=B6=9C=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=ED=95=A8=EC=88=98=20private=EB=A1=9C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/racingcar/controller/MainController.kt | 14 ++++++-------- src/main/kotlin/racingcar/util/Util.kt | 6 ++++++ src/test/kotlin/racingcar/ApplicationTest.kt | 5 +++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index ca0bf1614..55ad0c756 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -7,6 +7,8 @@ import racingcar.model.Cars import racingcar.util.Constants.END_NUMBER import racingcar.util.Constants.MOVABLE_NUMBER import racingcar.util.Constants.START_NUMBER +import racingcar.util.Util.getRandomNumber +import racingcar.util.Util.isMovable class MainController(private val inputView: InputView, private val outputView: OutputView) { private val cars = Cars() @@ -18,13 +20,13 @@ class MainController(private val inputView: InputView, private val outputView: O gameEnd() } - fun gameStart() { + private fun gameStart() { repeat(gameCount) { playOneCycle() } } - fun gameInit() { + private fun gameInit() { outputView.printInputCarNameMessage() val carNames = inputView.getInputCarNames() cars.addAllList(carNames) @@ -32,7 +34,7 @@ class MainController(private val inputView: InputView, private val outputView: O gameCount = inputView.getInputCount() } - fun playOneCycle() { + private fun playOneCycle() { cars.carNames.forEach { car -> val isMovable = isMovable(getRandomNumber()) car.isMove(isMovable) @@ -41,12 +43,8 @@ class MainController(private val inputView: InputView, private val outputView: O println() } - fun gameEnd() { + private fun gameEnd() { val winners = cars.getWinners() outputView.printWinners(winners) } - - fun getRandomNumber(): Int = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER) - - fun isMovable(number: Int): Boolean = number >= MOVABLE_NUMBER } \ No newline at end of file diff --git a/src/main/kotlin/racingcar/util/Util.kt b/src/main/kotlin/racingcar/util/Util.kt index 21c904f62..d056893d3 100644 --- a/src/main/kotlin/racingcar/util/Util.kt +++ b/src/main/kotlin/racingcar/util/Util.kt @@ -1,5 +1,11 @@ package racingcar.util +import camp.nextstep.edu.missionutils.Randoms + object Util { fun separateNameByComma(carNames: String): List = carNames.split(",") + + fun getRandomNumber(): Int = Randoms.pickNumberInRange(Constants.START_NUMBER, Constants.END_NUMBER) + + fun isMovable(number: Int): Boolean = number >= Constants.MOVABLE_NUMBER } \ No newline at end of file diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index f7b49697d..bdc896bdf 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -9,6 +9,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import racingcar.controller.MainController +import racingcar.util.Util.isMovable import racingcar.util.Util.separateNameByComma import racingcar.util.Validator.validateInteger import racingcar.util.Validator.validateLength @@ -106,12 +107,12 @@ class ApplicationTest : NsTest() { @Test fun `움직일 수 있는지 반환 기능 검증`() { val falseInput = 3 - val falseValidation = controller.isMovable(falseInput) + val falseValidation = isMovable(falseInput) val falseResult = false assertThat(falseValidation).isEqualTo(falseResult) val trueInput = 4 - val trueValidation = controller.isMovable(trueInput) + val trueValidation = isMovable(trueInput) val trueResult = true assertThat(trueValidation).isEqualTo(trueResult) } From 5ad80d8f07329657bf094694836ab51b8a2629c4 Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:57:40 +0900 Subject: [PATCH 45/47] =?UTF-8?q?refactor:=20=EC=99=B8=EB=B6=80=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EC=97=86=EB=8A=94=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=8A=94=20private=EB=A1=9C=20=EB=A7=8C=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/view/InputView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/racingcar/view/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt index 1c577f7a2..d9b72e3b8 100644 --- a/src/main/kotlin/racingcar/view/InputView.kt +++ b/src/main/kotlin/racingcar/view/InputView.kt @@ -9,7 +9,7 @@ import racingcar.util.Validator.validateRange import racingcar.util.Validator.validateUnique class InputView { - fun getUserInput(): String = Console.readLine() + private fun getUserInput(): String = Console.readLine() fun getInputCarNames(): List { val input = separateNameByComma(getUserInput()) From d4b857f3fe3eb2cf909facaf730275c179bc957a Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:58:28 +0900 Subject: [PATCH 46/47] =?UTF-8?q?style:=20=EC=95=88=EC=93=B0=EB=8A=94=20im?= =?UTF-8?q?port=20=EA=B5=AC=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 1 - src/main/kotlin/racingcar/controller/MainController.kt | 4 ---- 2 files changed, 5 deletions(-) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 38ddd349a..75f9c5607 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,7 +1,6 @@ package racingcar import racingcar.controller.MainController -import racingcar.util.Util.separateNameByComma import racingcar.view.InputView import racingcar.view.OutputView diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index 55ad0c756..c00a2d3b3 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -2,11 +2,7 @@ package racingcar.controller import racingcar.view.InputView import racingcar.view.OutputView -import camp.nextstep.edu.missionutils.Randoms import racingcar.model.Cars -import racingcar.util.Constants.END_NUMBER -import racingcar.util.Constants.MOVABLE_NUMBER -import racingcar.util.Constants.START_NUMBER import racingcar.util.Util.getRandomNumber import racingcar.util.Util.isMovable From 8178e1d44b9c43519a04190055853a6d78a2951c Mon Sep 17 00:00:00 2001 From: lh99j Date: Thu, 2 Nov 2023 15:59:54 +0900 Subject: [PATCH 47/47] =?UTF-8?q?refactor:=20gameInit=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/controller/MainController.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/racingcar/controller/MainController.kt b/src/main/kotlin/racingcar/controller/MainController.kt index c00a2d3b3..803ee9c6f 100644 --- a/src/main/kotlin/racingcar/controller/MainController.kt +++ b/src/main/kotlin/racingcar/controller/MainController.kt @@ -23,11 +23,8 @@ class MainController(private val inputView: InputView, private val outputView: O } private fun gameInit() { - outputView.printInputCarNameMessage() - val carNames = inputView.getInputCarNames() - cars.addAllList(carNames) - outputView.printInputCountMessage() - gameCount = inputView.getInputCount() + inputCarNames() + inputGameCount() } private fun playOneCycle() { @@ -43,4 +40,15 @@ class MainController(private val inputView: InputView, private val outputView: O val winners = cars.getWinners() outputView.printWinners(winners) } + + private fun inputCarNames() { + outputView.printInputCarNameMessage() + val carNames = inputView.getInputCarNames() + cars.addAllList(carNames) + } + + private fun inputGameCount() { + outputView.printInputCountMessage() + gameCount = inputView.getInputCount() + } } \ No newline at end of file