From 21c5320721a33add077219cb7de89a055a76d5c5 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 18:47:07 +0900
Subject: [PATCH 01/21] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?=
 =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 docs/README.md | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100644 docs/README.md

diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..c68316293
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,36 @@
+# 구현할 기능 목록
+
+## 0. 전체 예외 처리
+- [] 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
+- [] 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.
+
+
+## 1. 경주할 자동차
+- [] 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
+### 입력
+- [] 자동차 이름들 입력
+### 예외처리
+- [] 자동차 이름은 쉼표(,)를 기준으로 구분
+- [] 이름은 5자 이하만 가능
+
+
+## 2. 경주 방법
+### 입력
+- [] 시도할 횟수 입력
+### 예외처리
+- [] 숫자여야 함
+
+
+## 3. 실행 과정
+- [] 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있음
+  - [] 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우
+### 출력
+- [] 각 차수별 실행 결과
+
+
+## 4. 실행 결과
+- [] 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
+- [] 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
+### 출력
+- [] 단독 우승자 안내 문구
+- [] 공동 우승자 안내 문구
\ No newline at end of file

From b641c7a5da08314fb58c4e6fc17a4fd8a2188796 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 19:00:13 +0900
Subject: [PATCH 02/21] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=ED=81=B4?=
 =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B5=AC=EC=A1=B0=20=EB=B0=91=EA=B7=B8?=
 =?UTF-8?q?=EB=A6=BC=20=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84?=
 =?UTF-8?q?=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/Car.java               | 12 ------------
 .../racingcar/controller/GameController.java   |  4 ++++
 src/main/java/racingcar/domain/Car.java        | 18 ++++++++++++++++++
 src/main/java/racingcar/domain/GameResult.java |  4 ++++
 src/main/java/racingcar/domain/RacingGame.java |  4 ++++
 .../java/racingcar/utils/InputValidator.java   |  4 ++++
 src/main/java/racingcar/view/InputView.java    |  4 ++++
 src/main/java/racingcar/view/OutputView.java   |  4 ++++
 8 files changed, 42 insertions(+), 12 deletions(-)
 delete mode 100644 src/main/java/racingcar/Car.java
 create mode 100644 src/main/java/racingcar/controller/GameController.java
 create mode 100644 src/main/java/racingcar/domain/Car.java
 create mode 100644 src/main/java/racingcar/domain/GameResult.java
 create mode 100644 src/main/java/racingcar/domain/RacingGame.java
 create mode 100644 src/main/java/racingcar/utils/InputValidator.java
 create mode 100644 src/main/java/racingcar/view/InputView.java
 create mode 100644 src/main/java/racingcar/view/OutputView.java

diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java
deleted file mode 100644
index ab3df9492..000000000
--- a/src/main/java/racingcar/Car.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package racingcar;
-
-public class Car {
-    private final String name;
-    private int position = 0;
-
-    public Car(String name) {
-        this.name = name;
-    }
-
-    // 추가 기능 구현
-}
diff --git a/src/main/java/racingcar/controller/GameController.java b/src/main/java/racingcar/controller/GameController.java
new file mode 100644
index 000000000..1cef7b03f
--- /dev/null
+++ b/src/main/java/racingcar/controller/GameController.java
@@ -0,0 +1,4 @@
+package racingcar.controller;
+
+public class GameController {
+}
diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java
new file mode 100644
index 000000000..f48093335
--- /dev/null
+++ b/src/main/java/racingcar/domain/Car.java
@@ -0,0 +1,18 @@
+package racingcar.domain;
+
+/*
+Car 기본 생성자를 추가할 수 없다.
+name, position 변수의 접근 제어자인 private을 변경할 수 없다.
+가능하면 setPosition(int position) 메소드를 추가하지 않고 구현한다.
+ */
+
+public class Car {
+    private final String name;
+    private int position = 0;
+
+    public Car(String name) {
+        this.name = name;
+    }
+
+    // 추가 기능 구현
+}
diff --git a/src/main/java/racingcar/domain/GameResult.java b/src/main/java/racingcar/domain/GameResult.java
new file mode 100644
index 000000000..b20dab3c1
--- /dev/null
+++ b/src/main/java/racingcar/domain/GameResult.java
@@ -0,0 +1,4 @@
+package racingcar.domain;
+
+public class GameResult {
+}
diff --git a/src/main/java/racingcar/domain/RacingGame.java b/src/main/java/racingcar/domain/RacingGame.java
new file mode 100644
index 000000000..112212e1d
--- /dev/null
+++ b/src/main/java/racingcar/domain/RacingGame.java
@@ -0,0 +1,4 @@
+package racingcar.domain;
+
+public class RacingGame {
+}
diff --git a/src/main/java/racingcar/utils/InputValidator.java b/src/main/java/racingcar/utils/InputValidator.java
new file mode 100644
index 000000000..cb695419c
--- /dev/null
+++ b/src/main/java/racingcar/utils/InputValidator.java
@@ -0,0 +1,4 @@
+package racingcar.utils;
+
+public class InputValidator {
+}
diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java
new file mode 100644
index 000000000..2361ba2f5
--- /dev/null
+++ b/src/main/java/racingcar/view/InputView.java
@@ -0,0 +1,4 @@
+package racingcar.view;
+
+public class InputView {
+}
diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java
new file mode 100644
index 000000000..abf938a66
--- /dev/null
+++ b/src/main/java/racingcar/view/OutputView.java
@@ -0,0 +1,4 @@
+package racingcar.view;
+
+public class OutputView {
+}

From bb6e7220cda63343892c56b83111b0aa00f584b3 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 19:12:54 +0900
Subject: [PATCH 03/21] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=ED=94=84?=
 =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EB=9E=A8=20skeleton=20code=20=EA=B5=AC?=
 =?UTF-8?q?=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 docs/README.md                                 |  6 ++++--
 src/main/java/racingcar/domain/Car.java        |  8 +++++++-
 src/main/java/racingcar/domain/GameResult.java | 10 ++++++++++
 src/main/java/racingcar/domain/RacingGame.java |  9 +++++++++
 src/main/java/racingcar/view/InputView.java    | 11 +++++++++++
 src/main/java/racingcar/view/OutputView.java   | 12 ++++++++++++
 6 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/docs/README.md b/docs/README.md
index c68316293..21c9ec126 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -12,14 +12,16 @@
 ### 예외처리
 - [] 자동차 이름은 쉼표(,)를 기준으로 구분
 - [] 이름은 5자 이하만 가능
-
+### 단위테스트
+- []
 
 ## 2. 경주 방법
 ### 입력
 - [] 시도할 횟수 입력
 ### 예외처리
 - [] 숫자여야 함
-
+### 단위테스트
+- []
 
 ## 3. 실행 과정
 - [] 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있음
diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java
index f48093335..a9c0a38c8 100644
--- a/src/main/java/racingcar/domain/Car.java
+++ b/src/main/java/racingcar/domain/Car.java
@@ -14,5 +14,11 @@ public Car(String name) {
         this.name = name;
     }
 
-    // 추가 기능 구현
+    public void moveOrStop() {
+
+    }
+
+    public int getPosition() {
+        return 0;
+    }
 }
diff --git a/src/main/java/racingcar/domain/GameResult.java b/src/main/java/racingcar/domain/GameResult.java
index b20dab3c1..502f08baf 100644
--- a/src/main/java/racingcar/domain/GameResult.java
+++ b/src/main/java/racingcar/domain/GameResult.java
@@ -1,4 +1,14 @@
 package racingcar.domain;
 
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
 public class GameResult {
+
+    private HashMap<String, Integer> playerPosition;
+
+    public List<Object> getFinalWinner() {
+        return Arrays.asList(0);
+    }
 }
diff --git a/src/main/java/racingcar/domain/RacingGame.java b/src/main/java/racingcar/domain/RacingGame.java
index 112212e1d..fe4258742 100644
--- a/src/main/java/racingcar/domain/RacingGame.java
+++ b/src/main/java/racingcar/domain/RacingGame.java
@@ -1,4 +1,13 @@
 package racingcar.domain;
 
+import java.util.List;
+
 public class RacingGame {
+
+    private List<Car> players;
+    private int gameRound;
+
+    public void startRound() {
+
+    }
 }
diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java
index 2361ba2f5..fa71cd5af 100644
--- a/src/main/java/racingcar/view/InputView.java
+++ b/src/main/java/racingcar/view/InputView.java
@@ -1,4 +1,15 @@
 package racingcar.view;
 
+import java.util.Arrays;
+import java.util.List;
+
 public class InputView {
+
+    public List<String> readPlayerName() {
+        return Arrays.asList("pobi");
+    }
+
+    public int readGameRound() {
+        return 0;
+    }
 }
diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java
index abf938a66..34f625e60 100644
--- a/src/main/java/racingcar/view/OutputView.java
+++ b/src/main/java/racingcar/view/OutputView.java
@@ -1,4 +1,16 @@
 package racingcar.view;
 
 public class OutputView {
+
+    public void printRoundResult() {
+
+    }
+
+    public void printFinalWinner() {
+
+    }
+
+    public void printErrorMessage() {
+
+    }
 }

From 493ccd07ce1b60521618cbcda3205e65f3e2d0bb Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 19:20:42 +0900
Subject: [PATCH 04/21] =?UTF-8?q?feat(NumberGenerator):=20=EB=9E=9C?=
 =?UTF-8?q?=EB=8D=A4=20=EC=88=AB=EC=9E=90=20=EC=83=9D=EC=84=B1=20=EC=9D=B8?=
 =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EB=B0=8F=20=EA=B5=AC?=
 =?UTF-8?q?=ED=98=84=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/racingcar/domain/NumberGenerator.java     |  7 +++++++
 .../racingcar/domain/RandomNumberGenerator.java    | 14 ++++++++++++++
 2 files changed, 21 insertions(+)
 create mode 100644 src/main/java/racingcar/domain/NumberGenerator.java
 create mode 100644 src/main/java/racingcar/domain/RandomNumberGenerator.java

diff --git a/src/main/java/racingcar/domain/NumberGenerator.java b/src/main/java/racingcar/domain/NumberGenerator.java
new file mode 100644
index 000000000..a616b38bc
--- /dev/null
+++ b/src/main/java/racingcar/domain/NumberGenerator.java
@@ -0,0 +1,7 @@
+package racingcar.domain;
+
+@FunctionalInterface
+public interface NumberGenerator {
+
+    int generate();
+}
diff --git a/src/main/java/racingcar/domain/RandomNumberGenerator.java b/src/main/java/racingcar/domain/RandomNumberGenerator.java
new file mode 100644
index 000000000..c6fec4f6d
--- /dev/null
+++ b/src/main/java/racingcar/domain/RandomNumberGenerator.java
@@ -0,0 +1,14 @@
+package racingcar.domain;
+
+import camp.nextstep.edu.missionutils.Randoms;
+
+public class RandomNumberGenerator implements NumberGenerator {
+
+    private static final int LOWER_BOUND = 0;
+    private static final int UPPER_BOUND = 9;
+
+    @Override
+    public int generate() {
+        return Randoms.pickNumberInRange(LOWER_BOUND, UPPER_BOUND);
+    }
+}

From c4ca5c0fd7d9befc9bf78541bd8adeb30802accf Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 19:24:32 +0900
Subject: [PATCH 05/21] =?UTF-8?q?feat(Car):=20=EB=9E=9C=EB=8D=A4=20?=
 =?UTF-8?q?=EC=88=AB=EC=9E=90=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=9D=B4?=
 =?UTF-8?q?=EB=8F=99,=20=EC=A0=95=EC=A7=80=20=EB=A9=94=EC=86=8C=EB=93=9C?=
 =?UTF-8?q?=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/domain/Car.java | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java
index a9c0a38c8..b30078109 100644
--- a/src/main/java/racingcar/domain/Car.java
+++ b/src/main/java/racingcar/domain/Car.java
@@ -7,6 +7,8 @@
  */
 
 public class Car {
+
+    private static final int MOVING_CRITERIA = 4;
     private final String name;
     private int position = 0;
 
@@ -14,11 +16,13 @@ public Car(String name) {
         this.name = name;
     }
 
-    public void moveOrStop() {
-
+    public void moveOrStop(NumberGenerator numberGenerator) {
+        if (numberGenerator.generate() >= MOVING_CRITERIA) {
+            position++;
+        }
     }
 
     public int getPosition() {
-        return 0;
+        return position;
     }
 }

From cf186f5492b35026657069f1fcafe49661aa9f91 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 19:25:45 +0900
Subject: [PATCH 06/21] =?UTF-8?q?feat(Car):=20getter=20=EB=A9=94=EC=86=8C?=
 =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/domain/Car.java | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java
index b30078109..16e6025b7 100644
--- a/src/main/java/racingcar/domain/Car.java
+++ b/src/main/java/racingcar/domain/Car.java
@@ -22,6 +22,10 @@ public void moveOrStop(NumberGenerator numberGenerator) {
         }
     }
 
+    public String getName() {
+        return name;
+    }
+
     public int getPosition() {
         return position;
     }

From 5a4a078974ac2ca1d85e47f737f760ee207f9501 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 19:32:16 +0900
Subject: [PATCH 07/21] =?UTF-8?q?test(CarTest):=20=EB=9E=9C=EB=8D=A4=20?=
 =?UTF-8?q?=EC=88=AB=EC=9E=90=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=9D=B4?=
 =?UTF-8?q?=EB=8F=99=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=8B=A8=EC=9C=84=20?=
 =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/test/java/racingcar/domain/CarTest.java | 37 +++++++++++++++++++++
 1 file changed, 37 insertions(+)
 create mode 100644 src/test/java/racingcar/domain/CarTest.java

diff --git a/src/test/java/racingcar/domain/CarTest.java b/src/test/java/racingcar/domain/CarTest.java
new file mode 100644
index 000000000..1c0cbca80
--- /dev/null
+++ b/src/test/java/racingcar/domain/CarTest.java
@@ -0,0 +1,37 @@
+package racingcar.domain;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+class CarTest {
+
+    @Test
+    void 기준보다_작은_수_이동하지_않음_확인() {
+        NumberGenerator numberGenerator = new TestNumberGenerator(3);
+        Car car = new Car("June");
+        car.moveOrStop(numberGenerator);
+        assertThat(car.getPosition()).isEqualTo(0);
+    }
+
+    @Test
+    void 기준보다_큰수_이동_확인() {
+        NumberGenerator numberGenerator = new TestNumberGenerator(7);
+        Car car = new Car("June");
+        car.moveOrStop(numberGenerator);
+        assertThat(car.getPosition()).isEqualTo(1);
+    }
+    class TestNumberGenerator implements NumberGenerator {
+
+        private final int number;
+
+        public TestNumberGenerator(int number) {
+            this.number = number;
+        }
+
+        @Override
+        public int generate() {
+            return number;
+        }
+    }
+}
\ No newline at end of file

From 7aace4bef5878200914b6b143a956c75d0348f0f Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 20:46:49 +0900
Subject: [PATCH 08/21] =?UTF-8?q?refactor:=20domain=20=EB=82=B4=EC=97=90?=
 =?UTF-8?q?=20car=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=B6=94=EA=B0=80=20?=
 =?UTF-8?q?=EC=83=9D=EC=84=B1,=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B6=84?=
 =?UTF-8?q?=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/domain/{ => car}/Car.java               | 2 +-
 src/main/java/racingcar/domain/{ => car}/NumberGenerator.java   | 2 +-
 .../java/racingcar/domain/{ => car}/RandomNumberGenerator.java  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
 rename src/main/java/racingcar/domain/{ => car}/Car.java (95%)
 rename src/main/java/racingcar/domain/{ => car}/NumberGenerator.java (72%)
 rename src/main/java/racingcar/domain/{ => car}/RandomNumberGenerator.java (91%)

diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/car/Car.java
similarity index 95%
rename from src/main/java/racingcar/domain/Car.java
rename to src/main/java/racingcar/domain/car/Car.java
index 16e6025b7..a401ecc05 100644
--- a/src/main/java/racingcar/domain/Car.java
+++ b/src/main/java/racingcar/domain/car/Car.java
@@ -1,4 +1,4 @@
-package racingcar.domain;
+package racingcar.domain.car;
 
 /*
 Car 기본 생성자를 추가할 수 없다.
diff --git a/src/main/java/racingcar/domain/NumberGenerator.java b/src/main/java/racingcar/domain/car/NumberGenerator.java
similarity index 72%
rename from src/main/java/racingcar/domain/NumberGenerator.java
rename to src/main/java/racingcar/domain/car/NumberGenerator.java
index a616b38bc..37f8cb117 100644
--- a/src/main/java/racingcar/domain/NumberGenerator.java
+++ b/src/main/java/racingcar/domain/car/NumberGenerator.java
@@ -1,4 +1,4 @@
-package racingcar.domain;
+package racingcar.domain.car;
 
 @FunctionalInterface
 public interface NumberGenerator {
diff --git a/src/main/java/racingcar/domain/RandomNumberGenerator.java b/src/main/java/racingcar/domain/car/RandomNumberGenerator.java
similarity index 91%
rename from src/main/java/racingcar/domain/RandomNumberGenerator.java
rename to src/main/java/racingcar/domain/car/RandomNumberGenerator.java
index c6fec4f6d..fd6363363 100644
--- a/src/main/java/racingcar/domain/RandomNumberGenerator.java
+++ b/src/main/java/racingcar/domain/car/RandomNumberGenerator.java
@@ -1,4 +1,4 @@
-package racingcar.domain;
+package racingcar.domain.car;
 
 import camp.nextstep.edu.missionutils.Randoms;
 

From c1407e90b675c8690c999269908f70fee56deca4 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 20:47:28 +0900
Subject: [PATCH 09/21] =?UTF-8?q?feat(Player):=20Car=20=EA=B0=9D=EC=B2=B4?=
 =?UTF-8?q?=EB=A5=BC=20=EB=8B=B4=EC=95=84=20=EC=A0=84=EC=B2=B4=20=EC=B0=B8?=
 =?UTF-8?q?=EA=B0=80=EC=9E=90=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98?=
 =?UTF-8?q?=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Input에서 사용자 이름을 받아 Player 객체 생성하도록
한 라운드 진행할 때 playOneRound 메세지 받아 수행
ParameterizedTest 사용해 단위 테스트 구현
---
 src/main/java/racingcar/domain/Player.java    | 34 ++++++++++++++
 .../java/racingcar/domain/PlayerTest.java     | 47 +++++++++++++++++++
 2 files changed, 81 insertions(+)
 create mode 100644 src/main/java/racingcar/domain/Player.java
 create mode 100644 src/test/java/racingcar/domain/PlayerTest.java

diff --git a/src/main/java/racingcar/domain/Player.java b/src/main/java/racingcar/domain/Player.java
new file mode 100644
index 000000000..1842d1a6b
--- /dev/null
+++ b/src/main/java/racingcar/domain/Player.java
@@ -0,0 +1,34 @@
+package racingcar.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+import racingcar.domain.car.Car;
+import racingcar.domain.car.NumberGenerator;
+
+public class Player {
+
+    private final List<Car> racingCars;
+
+    public Player(List<String> playerNames) {
+        this.racingCars = setRacingCars(playerNames);
+    }
+
+    private List<Car> setRacingCars(List<String> playerNames) {
+        List<Car> racingCars = new ArrayList<>();
+        for (String name : playerNames) {
+            Car car = new Car(name);
+            racingCars.add(car);
+        }
+        return racingCars;
+    }
+
+    public void playOneRound(NumberGenerator numberGenerator) {
+        for (Car car : racingCars) {
+            car.moveOrStop(numberGenerator);
+        }
+    }
+
+    public List<Car> getRacingCars() {
+        return racingCars;
+    }
+}
diff --git a/src/test/java/racingcar/domain/PlayerTest.java b/src/test/java/racingcar/domain/PlayerTest.java
new file mode 100644
index 000000000..85effea1f
--- /dev/null
+++ b/src/test/java/racingcar/domain/PlayerTest.java
@@ -0,0 +1,47 @@
+package racingcar.domain;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.Arrays;
+import java.util.List;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import racingcar.domain.car.Car;
+import racingcar.domain.car.NumberGenerator;
+
+class PlayerTest {
+
+    static Player player;
+
+    @BeforeAll
+    static void init() {
+        List<String> playerNames = Arrays.asList("pobi", "conan", "crong");
+        player = new Player(playerNames);
+    }
+
+    @ParameterizedTest
+    @CsvSource(value = {"3,0", "4,1", "8,2", "2,2", "7,3"})
+    void 올바르게_전진_확인(int number, int position) {
+        NumberGenerator numberGenerator = new TestNumberGenerator(number);
+        player.playOneRound(numberGenerator);
+        List<Car> racingCars = player.getRacingCars();
+        for (Car car : racingCars) {
+            assertThat(car.getPosition()).isEqualTo(position);
+        }
+    }
+
+    class TestNumberGenerator implements NumberGenerator {
+
+        private final int number;
+
+        public TestNumberGenerator(int number) {
+            this.number = number;
+        }
+
+        @Override
+        public int generate() {
+            return number;
+        }
+    }
+}
\ No newline at end of file

From f2c07813676852b7fc23ee054fcb603e675081bb Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 21:04:48 +0900
Subject: [PATCH 10/21] =?UTF-8?q?feat(RacingGame):=20RacingGame=20?=
 =?UTF-8?q?=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20=EA=B0=9D=EC=B2=B4=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

게임 라운드 계속 진행 여부 관리 메서드, 게임 진행 메서드 구현
게임 진행에 따른 메서드 반환값 변환 단위 테스트 구현
---
 .../java/racingcar/domain/RacingGame.java     | 18 +++++++--
 .../java/racingcar/domain/RacingGameTest.java | 37 +++++++++++++++++++
 2 files changed, 52 insertions(+), 3 deletions(-)
 create mode 100644 src/test/java/racingcar/domain/RacingGameTest.java

diff --git a/src/main/java/racingcar/domain/RacingGame.java b/src/main/java/racingcar/domain/RacingGame.java
index fe4258742..b1aed8d5f 100644
--- a/src/main/java/racingcar/domain/RacingGame.java
+++ b/src/main/java/racingcar/domain/RacingGame.java
@@ -1,13 +1,25 @@
 package racingcar.domain;
 
-import java.util.List;
+import racingcar.domain.car.NumberGenerator;
 
 public class RacingGame {
 
-    private List<Car> players;
+    private static final int GAME_OVER_COUNT = 0;
+
+    private final Player player;
     private int gameRound;
 
-    public void startRound() {
+    public RacingGame(Player player, int gameRound) {
+        this.player = player;
+        this.gameRound = gameRound;
+    }
+
+    public void play(NumberGenerator numberGenerator) {
+        player.playOneRound(numberGenerator);
+        gameRound--;
+    }
 
+    public boolean isGameContinue() {
+        return (gameRound != GAME_OVER_COUNT);
     }
 }
diff --git a/src/test/java/racingcar/domain/RacingGameTest.java b/src/test/java/racingcar/domain/RacingGameTest.java
new file mode 100644
index 000000000..2ea3338fb
--- /dev/null
+++ b/src/test/java/racingcar/domain/RacingGameTest.java
@@ -0,0 +1,37 @@
+package racingcar.domain;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.Arrays;
+import java.util.List;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import racingcar.domain.car.NumberGenerator;
+import racingcar.domain.car.RandomNumberGenerator;
+
+class RacingGameTest {
+
+    static RacingGame racingGame;
+
+    @BeforeAll
+    static void init() {
+        List<String> playerNames = Arrays.asList("pobi", "conan", "crong");
+        Player player = new Player(playerNames);
+        racingGame = new RacingGame(player, 4);
+    }
+
+    @Test
+    void play_메소드에_따라_isGameContinue_변화_확인() {
+        // given
+        assertThat(racingGame.isGameContinue()).isEqualTo(true);
+
+        // when
+        NumberGenerator numberGenerator = new RandomNumberGenerator();
+        for (int i = 0; i < 4; i ++) {
+            racingGame.play(numberGenerator);
+        }
+
+        // then
+        assertThat(racingGame.isGameContinue()).isEqualTo(false);
+    }
+}
\ No newline at end of file

From 688647f2d9c80a1104315d02ad16f4ecb2016fa2 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 21:06:39 +0900
Subject: [PATCH 11/21] =?UTF-8?q?test(CarTest):=20=ED=8C=A8=ED=82=A4?=
 =?UTF-8?q?=EC=A7=80=20=EB=B3=80=ED=99=94=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F?=
 =?UTF-8?q?=20TODO=20=EC=9E=91=EC=84=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/test/java/racingcar/domain/CarTest.java | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/test/java/racingcar/domain/CarTest.java b/src/test/java/racingcar/domain/CarTest.java
index 1c0cbca80..8317dbf1a 100644
--- a/src/test/java/racingcar/domain/CarTest.java
+++ b/src/test/java/racingcar/domain/CarTest.java
@@ -3,9 +3,12 @@
 import static org.assertj.core.api.Assertions.*;
 
 import org.junit.jupiter.api.Test;
+import racingcar.domain.car.Car;
+import racingcar.domain.car.NumberGenerator;
 
 class CarTest {
 
+    // TODO parameterized test 적용!
     @Test
     void 기준보다_작은_수_이동하지_않음_확인() {
         NumberGenerator numberGenerator = new TestNumberGenerator(3);

From ff0fafafbfec2e84604c06f57b52d3e01596efcd Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 21:45:59 +0900
Subject: [PATCH 12/21] =?UTF-8?q?feat(InputValidator):=20=EC=9E=85?=
 =?UTF-8?q?=EB=A0=A5=EA=B0=92=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?=
 =?UTF-8?q?=EC=A6=9D=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

콤마 포함 여부, 이름 길이 검사, 숫자 여부 검사 메소드 구현
---
 .../java/racingcar/utils/InputValidator.java  | 36 ++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/src/main/java/racingcar/utils/InputValidator.java b/src/main/java/racingcar/utils/InputValidator.java
index cb695419c..f25a61591 100644
--- a/src/main/java/racingcar/utils/InputValidator.java
+++ b/src/main/java/racingcar/utils/InputValidator.java
@@ -1,4 +1,38 @@
 package racingcar.utils;
 
-public class InputValidator {
+public final class InputValidator {
+    private static final int MAX_NAME_LENGTH = 5;
+    private static final String COMMA = ",";
+
+    private static final String NOT_IN_COMMA = "자동차 이름을 쉼표(,)로 구분해 적어주세요.";
+    private static final String INVALID_NAME_LENGTH = "자동차 5글자 이내로 입력해주세요.";
+    private static final String NOT_NUMBER = "시도할 횟수를 숫자로 입력해주세요.";
+
+    private InputValidator() {
+
+    }
+
+    public static void notContainsComma(String input) {
+        if (input.length() > MAX_NAME_LENGTH && !input.contains(COMMA)) {
+            throw new IllegalArgumentException(NOT_IN_COMMA);
+        }
+    }
+
+    public static String[] moreThanLenFive(String input) {
+        String[] inputList = input.split(COMMA);
+        for (String str : inputList) {
+            if (str.trim().length() > MAX_NAME_LENGTH) {
+                throw new IllegalArgumentException(INVALID_NAME_LENGTH);
+            }
+        }
+        return inputList;
+    }
+
+    public static int notNumber(String input) {
+        try {
+            return Integer.parseInt(input);
+        } catch (NumberFormatException e) {
+            throw new IllegalArgumentException(NOT_NUMBER);
+        }
+    }
 }

From 0c00aad39a6d023e5d9aadfc377ab7ac91f2cdec Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 21:46:58 +0900
Subject: [PATCH 13/21] =?UTF-8?q?feat(InputView):=20=EC=82=AC=EC=9A=A9?=
 =?UTF-8?q?=EC=9E=90=20=EC=9E=85=EB=A0=A5=EA=B0=92=20=EC=9A=94=EC=B2=AD=20?=
 =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/view/InputView.java | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java
index fa71cd5af..37f6b3256 100644
--- a/src/main/java/racingcar/view/InputView.java
+++ b/src/main/java/racingcar/view/InputView.java
@@ -2,14 +2,23 @@
 
 import java.util.Arrays;
 import java.util.List;
+import racingcar.utils.InputValidator;
+import camp.nextstep.edu.missionutils.Console;
+
 
 public class InputView {
 
-    public List<String> readPlayerName() {
-        return Arrays.asList("pobi");
+    public List<String> readPlayerName() throws IllegalArgumentException {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+        String input = Console.readLine();
+        InputValidator.notContainsComma(input);
+        String[] inputList = InputValidator.moreThanLenFive(input);
+        return Arrays.asList(inputList);
     }
 
-    public int readGameRound() {
-        return 0;
+    public int readGameRound() throws IllegalArgumentException {
+        System.out.println("시도할 회수는 몇회인가요?");
+        String input = Console.readLine();
+        return InputValidator.notNumber(input);
     }
 }

From 91b60633224a68ee62a03eec4f7987e843d879f6 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 22:39:39 +0900
Subject: [PATCH 14/21] =?UTF-8?q?feat(OutputView):=20=EC=BD=98=EC=86=94=20?=
 =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EB=A1=9C=EC=A7=81=20=ED=81=B4=EB=9E=98?=
 =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/view/OutputView.java | 32 +++++++++++++++++---
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java
index 34f625e60..2c8d4a12b 100644
--- a/src/main/java/racingcar/view/OutputView.java
+++ b/src/main/java/racingcar/view/OutputView.java
@@ -1,16 +1,40 @@
 package racingcar.view;
 
+import java.util.List;
+import java.util.Map;
+import racingcar.domain.GameResult;
+
 public class OutputView {
 
-    public void printRoundResult() {
+    private static final String RESULT_OF_PLAY = "실행 결과";
+    private static final String FINAL_WINNER = "최종 우승자";
+    private static final String COLON = ":";
+    private static final String BLANK = " ";
+    private static final String MOVING = "-";
 
+    public void printResultMessage() {
+        System.out.println();
+        System.out.println(RESULT_OF_PLAY);
     }
 
-    public void printFinalWinner() {
-
+    public void printRoundResult(GameResult gameResult) {
+        Map<String, Integer> playerPosition = gameResult.getPlayerPosition();
+        for (String name : playerPosition.keySet()) {
+            System.out.print(name + BLANK + COLON + BLANK);
+            for (int i = 0; i < playerPosition.get(name); i++) {
+                System.out.print(MOVING);
+            }
+            System.out.println();
+        }
+        System.out.println();
     }
 
-    public void printErrorMessage() {
+    public void printFinalWinner(GameResult gameResult) {
+        List<String> finalWinner = gameResult.getFinalWinner();
+        System.out.println(FINAL_WINNER + BLANK + COLON + BLANK + String.join(", ", finalWinner));
+    }
 
+    public void printErrorMessage(String message) {
+        System.out.println("[ERROR]" + message);
     }
 }

From 3ef0908dd45a4225a6f9ef1670117ddb385d6582 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 22:40:06 +0900
Subject: [PATCH 15/21] =?UTF-8?q?feat(GameResult):=20=EA=B2=8C=EC=9E=84=20?=
 =?UTF-8?q?=EC=83=81=ED=99=A9=20=EB=B0=8F=20=EC=B5=9C=EC=A2=85=20=EA=B2=B0?=
 =?UTF-8?q?=EA=B3=BC=20=EB=B0=98=ED=99=98=20=ED=81=B4=EB=9E=98=EC=8A=A4=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

---
 .../java/racingcar/domain/GameResult.java     | 36 ++++++++++++++++---
 1 file changed, 31 insertions(+), 5 deletions(-)

diff --git a/src/main/java/racingcar/domain/GameResult.java b/src/main/java/racingcar/domain/GameResult.java
index 502f08baf..09c001d6e 100644
--- a/src/main/java/racingcar/domain/GameResult.java
+++ b/src/main/java/racingcar/domain/GameResult.java
@@ -1,14 +1,40 @@
 package racingcar.domain;
 
-import java.util.Arrays;
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import racingcar.domain.car.Car;
 
 public class GameResult {
 
-    private HashMap<String, Integer> playerPosition;
+    private final Player player;
+    private Map<String, Integer> playerPosition = new LinkedHashMap<>();
 
-    public List<Object> getFinalWinner() {
-        return Arrays.asList(0);
+    public GameResult(Player player) {
+        this.player = player;
+    }
+
+    public void update() {
+        List<Car> racingCars = player.getRacingCars();
+        for (Car car : racingCars) {
+            playerPosition.put(car.getName(), car.getPosition());
+        }
+    }
+
+    public Map<String, Integer> getPlayerPosition() {
+        return playerPosition;
+    }
+
+    public List<String> getFinalWinner() {
+        List<String> finalWinner = new ArrayList<>();
+        int maxValue = Collections.max(playerPosition.values());
+        for (Map.Entry<String, Integer> m : playerPosition.entrySet()) {
+            if (m.getValue() == maxValue) {
+                finalWinner.add(m.getKey());
+            }
+        }
+        return finalWinner;
     }
 }

From 2a30bbc583b7ad953a0f0fa3cf6fa86614ebf35a Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 22:43:27 +0900
Subject: [PATCH 16/21] =?UTF-8?q?fix(InputView):=20player=20=EC=9D=B4?=
 =?UTF-8?q?=EB=A6=84=EC=97=90=20=EB=B9=88=EC=B9=B8=20=EC=B6=9C=EB=A0=A5?=
 =?UTF-8?q?=EB=90=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/domain/GameResult.java | 11 ++++++-----
 src/main/java/racingcar/view/InputView.java    |  5 ++++-
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/main/java/racingcar/domain/GameResult.java b/src/main/java/racingcar/domain/GameResult.java
index 09c001d6e..ce332e845 100644
--- a/src/main/java/racingcar/domain/GameResult.java
+++ b/src/main/java/racingcar/domain/GameResult.java
@@ -16,17 +16,18 @@ public GameResult(Player player) {
         this.player = player;
     }
 
-    public void update() {
+    public Map<String, Integer> getPlayerPosition() {
+        updatePosition();
+        return playerPosition;
+    }
+
+    private void updatePosition() {
         List<Car> racingCars = player.getRacingCars();
         for (Car car : racingCars) {
             playerPosition.put(car.getName(), car.getPosition());
         }
     }
 
-    public Map<String, Integer> getPlayerPosition() {
-        return playerPosition;
-    }
-
     public List<String> getFinalWinner() {
         List<String> finalWinner = new ArrayList<>();
         int maxValue = Collections.max(playerPosition.values());
diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java
index 37f6b3256..da0cca70c 100644
--- a/src/main/java/racingcar/view/InputView.java
+++ b/src/main/java/racingcar/view/InputView.java
@@ -2,6 +2,7 @@
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 import racingcar.utils.InputValidator;
 import camp.nextstep.edu.missionutils.Console;
 
@@ -13,7 +14,9 @@ public List<String> readPlayerName() throws IllegalArgumentException {
         String input = Console.readLine();
         InputValidator.notContainsComma(input);
         String[] inputList = InputValidator.moreThanLenFive(input);
-        return Arrays.asList(inputList);
+        return Arrays.stream(inputList)
+                .map(String::trim)
+                .collect(Collectors.toList());
     }
 
     public int readGameRound() throws IllegalArgumentException {

From aee29523f4b472238c2cf1a238b52e4436162391 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 22:57:58 +0900
Subject: [PATCH 17/21] =?UTF-8?q?chore:=20exception=20=EB=A9=94=EC=84=B8?=
 =?UTF-8?q?=EC=A7=80=20=EB=82=B4=EC=9A=A9=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/utils/InputValidator.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/racingcar/utils/InputValidator.java b/src/main/java/racingcar/utils/InputValidator.java
index f25a61591..2f0d6b4b1 100644
--- a/src/main/java/racingcar/utils/InputValidator.java
+++ b/src/main/java/racingcar/utils/InputValidator.java
@@ -5,7 +5,7 @@ public final class InputValidator {
     private static final String COMMA = ",";
 
     private static final String NOT_IN_COMMA = "자동차 이름을 쉼표(,)로 구분해 적어주세요.";
-    private static final String INVALID_NAME_LENGTH = "자동차 5글자 이내로 입력해주세요.";
+    private static final String INVALID_NAME_LENGTH = "자동차 이름을 5글자 이내로 입력해주세요.";
     private static final String NOT_NUMBER = "시도할 횟수를 숫자로 입력해주세요.";
 
     private InputValidator() {

From a4af3a477bd8ce62b4ff09f394ceb8503d8e9c06 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 22:58:39 +0900
Subject: [PATCH 18/21] =?UTF-8?q?chore:=20exception=20=EB=A9=94=EC=84=B8?=
 =?UTF-8?q?=EC=A7=80=20=EB=82=B4=EC=9A=A9=20=EC=88=98=EC=A0=95,=20?=
 =?UTF-8?q?=EB=B9=88=EC=B9=B8=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/view/OutputView.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java
index 2c8d4a12b..1ce992204 100644
--- a/src/main/java/racingcar/view/OutputView.java
+++ b/src/main/java/racingcar/view/OutputView.java
@@ -35,6 +35,6 @@ public void printFinalWinner(GameResult gameResult) {
     }
 
     public void printErrorMessage(String message) {
-        System.out.println("[ERROR]" + message);
+        System.out.println("[ERROR]" + BLANK + message);
     }
 }

From 3bbd941932da2cbb8416bdf11c3b52d1cc63d38f Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 23:00:07 +0900
Subject: [PATCH 19/21] =?UTF-8?q?feat(GameController):=20controller=20?=
 =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

view에서 입력값 받아 옴, 잘못된 입력값에 error 메세지 출력 후 재요청
domain 객체들 생성 및 연결
view에서 게임 상황 및 결과 출력 메소드 호출
---
 .../racingcar/controller/GameController.java  | 47 +++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/src/main/java/racingcar/controller/GameController.java b/src/main/java/racingcar/controller/GameController.java
index 1cef7b03f..f7bbf0750 100644
--- a/src/main/java/racingcar/controller/GameController.java
+++ b/src/main/java/racingcar/controller/GameController.java
@@ -1,4 +1,51 @@
 package racingcar.controller;
 
+import java.util.List;
+import java.util.function.Supplier;
+import racingcar.domain.GameResult;
+import racingcar.domain.Player;
+import racingcar.domain.RacingGame;
+import racingcar.domain.car.NumberGenerator;
+import racingcar.domain.car.RandomNumberGenerator;
+import racingcar.view.InputView;
+import racingcar.view.OutputView;
+
 public class GameController {
+
+    private RacingGame racingGame;
+    private GameResult gameResult;
+
+    public GameController() {
+        setUp();
+    }
+
+    private void setUp() {
+        InputView inputView = new InputView();
+        List<String> playerNames = repeat(inputView::readPlayerName);
+        Player player = new Player(playerNames);
+        this.gameResult = new GameResult(player);
+        int gameRound = repeat(inputView::readGameRound);
+        this.racingGame = new RacingGame(player, gameRound);
+    }
+
+    public void start() {
+        OutputView outputView = new OutputView();
+        outputView.printResultMessage();
+        do {
+            NumberGenerator numberGenerator = new RandomNumberGenerator();
+            racingGame.play(numberGenerator);
+            outputView.printRoundResult(gameResult);
+        } while (racingGame.isGameContinue());
+        outputView.printFinalWinner(gameResult);
+    }
+
+    private <T> T repeat(Supplier<T> inputReader) {
+        try {
+            return inputReader.get();
+        } catch (IllegalArgumentException e) {
+            OutputView outputView = new OutputView();
+            outputView.printErrorMessage(e.getMessage());
+            return repeat(inputReader);
+        }
+    }
 }

From 95808b3019f2d33383c2adf67b042a161316b3a1 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 23:02:05 +0900
Subject: [PATCH 20/21] =?UTF-8?q?feat(Application):=20=EC=A0=84=EC=B2=B4?=
 =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/racingcar/Application.java | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java
index b9ed0456a..3b3c08e01 100644
--- a/src/main/java/racingcar/Application.java
+++ b/src/main/java/racingcar/Application.java
@@ -1,7 +1,10 @@
 package racingcar;
 
+import racingcar.controller.GameController;
+
 public class Application {
     public static void main(String[] args) {
-        // TODO 구현 진행
+        GameController gameController = new GameController();
+        gameController.start();
     }
 }

From 68e5ee5dd377d8bc2fd6c7dc094220a0384f1c03 Mon Sep 17 00:00:00 2001
From: Ridealist <cjsn92@gmail.com>
Date: Wed, 30 Nov 2022 23:02:31 +0900
Subject: [PATCH 21/21] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?=
 =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=84=EC=B2=B4=20?=
 =?UTF-8?q?=EC=B2=B4=ED=81=AC=20=EC=99=84=EB=A3=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 docs/README.md | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/docs/README.md b/docs/README.md
index 21c9ec126..84f914de1 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,38 +1,38 @@
 # 구현할 기능 목록
 
 ## 0. 전체 예외 처리
-- [] 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
-- [] 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.
+- [x] 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
+- [x] 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.
 
 
 ## 1. 경주할 자동차
-- [] 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
+- [x] 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
 ### 입력
-- [] 자동차 이름들 입력
+- [x] 자동차 이름들 입력
 ### 예외처리
-- [] 자동차 이름은 쉼표(,)를 기준으로 구분
-- [] 이름은 5자 이하만 가능
+- [x] 자동차 이름은 쉼표(,)를 기준으로 구분
+- [x] 이름은 5자 이하만 가능
 ### 단위테스트
-- []
+- [x]
 
 ## 2. 경주 방법
 ### 입력
-- [] 시도할 횟수 입력
+- [x] 시도할 횟수 입력
 ### 예외처리
-- [] 숫자여야 함
+- [x] 숫자여야 함
 ### 단위테스트
-- []
+- [x]
 
 ## 3. 실행 과정
-- [] 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있음
-  - [] 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우
+- [x] 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있음
+  - [x] 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우
 ### 출력
-- [] 각 차수별 실행 결과
+- [x] 각 차수별 실행 결과
 
 
 ## 4. 실행 결과
-- [] 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
-- [] 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
+- [x] 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
+- [x] 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
 ### 출력
-- [] 단독 우승자 안내 문구
-- [] 공동 우승자 안내 문구
\ No newline at end of file
+- [x] 단독 우승자 안내 문구
+- [x] 공동 우승자 안내 문구
\ No newline at end of file