From 794c52522ca04efc2b140f47b8cc86cb8f25847d Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:10:38 +0900 Subject: [PATCH 001/106] =?UTF-8?q?docs:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EB=AA=A9?= =?UTF-8?q?=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 --- README.md | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 03ba7ed3..edfd7561 100644 --- a/README.md +++ b/README.md @@ -1 +1,43 @@ -# java-blackjack \ No newline at end of file +# java-blackjack + +# java-blackjack + +## 기능 요구 사항 +우리 회사는 렌터카를 운영하고 있다. +현재 보유하고 있는 차량은 Sonata 2대, Avante 1대, K5 2대로 총 5대의 차량을 보유하고 있다. +고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. +이 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성해야 한다. + +각 차량별 연비는 다음과 같다. + +* Sonata : 10km/리터 +* Avante : 15km/리터 +* K5 : 13km/리터 + + +## 구현 사항 +- [ ] 입력 (e.g. carName1:distance, carName2:distance) + - [ ] 문자 사이에 불필요한 공백을 제거한다. + +- [ ] 파서 + - [ ] 자동차는 `,` 로 구분한다 + - [ ] 자동차의 이름과 속력은 `:` 로 구분한다. + - [ ] 검증 + - [ ] 빈 값이 들어올 수 없다. + - [ ] 이름이나 거리에 빈 값이 들어올 수 없다. + +- [ ] 렌터카 회사 + - [ ] 자동차 객체를 받아 렌터카 리스트에 추가한다. - addCar(Car car) + - [ ] 보유한 렌터카의 수를 넘지 않는다. + - [ ] 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성한다. + +- [ ] 자동차 - abstract + - [ ] 주입해야 할 연료량을 구한다. + - [ ] 검증 + - [ ] 거리는 1 이상이어야 한다. + +- [ ] 자동차 팩토리 + - [ ] 자동차 이름 검증(대소문자 구분 X) + +- [ ] 출력 + - [ ] 생성한 보고서 출력 \ No newline at end of file From d75a5f434bf3359d03126e9d14fbfb5919b42e50 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:10:59 +0900 Subject: [PATCH 002/106] =?UTF-8?q?feat:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/empty.txt | 0 src/test/java/empty.txt | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/empty.txt delete mode 100644 src/test/java/empty.txt diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29b..00000000 From 4fea65ae78658329bf953e6abd433b8115dd3099 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:12:50 +0900 Subject: [PATCH 003/106] =?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=84=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20InputView=20=ED=81=B4=EB=9E=98=EC=8A=A4=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 --- .../java/oilinjection/view/InputView.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/oilinjection/view/InputView.java diff --git a/src/main/java/oilinjection/view/InputView.java b/src/main/java/oilinjection/view/InputView.java new file mode 100644 index 00000000..61d97043 --- /dev/null +++ b/src/main/java/oilinjection/view/InputView.java @@ -0,0 +1,25 @@ +package oilinjection.view; + +import java.util.Scanner; + +public class InputView { + + private static final Scanner SCANNER = new Scanner(System.in); + private static final String RESERVATION_INFO_INPUT_MESSAGE = "대여할 자동차와 예상 거리를 입력해 주세요. (eg. carName1:distance, carName2:distance)"; + private static final String ALL_SPACE = "\\s+"; + private static final String EMPTY_STRING = ""; + private static final String EMPTY_STRING_EXCEPTION_MESSAGE = "[ERROR] 공백일 수 없습니다."; + + public static String inputReservationInfo() { + System.out.println(RESERVATION_INFO_INPUT_MESSAGE); + return input(); + } + + private static String input() { + return removeSpace(SCANNER.nextLine()); + } + + private static String removeSpace(final String input) { + return input.replaceAll(ALL_SPACE, EMPTY_STRING); + } +} From ff68c0faa9763a86529d25c1ea8af04882d72878 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:14:21 +0900 Subject: [PATCH 004/106] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=B6=94=EC=83=81=ED=99=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20Car?= =?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/oilinjection/domain/car/Car.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/oilinjection/domain/car/Car.java diff --git a/src/main/java/oilinjection/domain/car/Car.java b/src/main/java/oilinjection/domain/car/Car.java new file mode 100644 index 00000000..c91e7e95 --- /dev/null +++ b/src/main/java/oilinjection/domain/car/Car.java @@ -0,0 +1,14 @@ +package oilinjection.domain.car; + +public abstract class Car { + + abstract double getDistancePerLiter(); + + abstract double getTripDistance(); + + abstract String getName(); + + double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} \ No newline at end of file From 977b285644e81f6786d79c62a95defda693d479e Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:17:40 +0900 Subject: [PATCH 005/106] =?UTF-8?q?feat:=20=EC=86=8C=EB=82=98=ED=83=80?= =?UTF-8?q?=EC=97=90=20=EA=B4=80=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?SonataTest=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/oilinjection/domain/car/SonataTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/oilinjection/domain/car/SonataTest.java diff --git a/src/test/java/oilinjection/domain/car/SonataTest.java b/src/test/java/oilinjection/domain/car/SonataTest.java new file mode 100644 index 00000000..dffcd4a7 --- /dev/null +++ b/src/test/java/oilinjection/domain/car/SonataTest.java @@ -0,0 +1,16 @@ +package oilinjection.domain.car; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class SonataTest { + + @DisplayName("소나타의 주입해야할 연료량을 구한다.") + @Test + void 소나타_필요_연료량() { + final Car sonata = new Sonata(200D); + assertThat(sonata.getChargeQuantity()).isEqualTo(20D); + } +} \ No newline at end of file From ab5a54e2c83e44408b415b2eeca30c1a49b5360c Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:18:41 +0900 Subject: [PATCH 006/106] =?UTF-8?q?feat:=20Sonata=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 - 추상클래스 Car에 존재하는 메서드 오버라이딩 --- .../java/oilinjection/domain/car/Sonata.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/oilinjection/domain/car/Sonata.java diff --git a/src/main/java/oilinjection/domain/car/Sonata.java b/src/main/java/oilinjection/domain/car/Sonata.java new file mode 100644 index 00000000..fbf9faa1 --- /dev/null +++ b/src/main/java/oilinjection/domain/car/Sonata.java @@ -0,0 +1,28 @@ +package oilinjection.domain.car; + +public class Sonata extends Car { + + private static final String CAR_NAME = "Sonata"; + private static final double SONATA_DISTANCE_PER_LITER = 10D; + + private final double tripDistance; + + public Sonata(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + double getDistancePerLiter() { + return SONATA_DISTANCE_PER_LITER; + } + + @Override + String getName() { + return CAR_NAME; + } + + @Override + double getTripDistance() { + return this.tripDistance; + } +} From b83e167cf20596b7fdbbda72519fd9d81a35f5e4 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:19:31 +0900 Subject: [PATCH 007/106] =?UTF-8?q?feat:=20=EC=95=84=EB=B0=98=EB=96=BC?= =?UTF-8?q?=EC=97=90=20=EA=B4=80=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?AvanteTest=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/oilinjection/domain/car/AvanteTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/oilinjection/domain/car/AvanteTest.java diff --git a/src/test/java/oilinjection/domain/car/AvanteTest.java b/src/test/java/oilinjection/domain/car/AvanteTest.java new file mode 100644 index 00000000..f5af99df --- /dev/null +++ b/src/test/java/oilinjection/domain/car/AvanteTest.java @@ -0,0 +1,16 @@ +package oilinjection.domain.car; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class AvanteTest { + + @DisplayName("아반떼의 주입 해야할 연료량을 구한다.") + @Test + void 아반떼_필요한_연료량() { + final Car avante = new Avante(300D); + assertThat(avante.getChargeQuantity()).isEqualTo(20D); + } +} From 6b90041f0ad0004faa339067fe75de2e74fb82ef Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:20:01 +0900 Subject: [PATCH 008/106] =?UTF-8?q?feat:=20Avante=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 - 추상클래스 Car에 존재하는 메서드 오버라이딩 --- .../java/oilinjection/domain/car/Avante.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/oilinjection/domain/car/Avante.java diff --git a/src/main/java/oilinjection/domain/car/Avante.java b/src/main/java/oilinjection/domain/car/Avante.java new file mode 100644 index 00000000..882b452a --- /dev/null +++ b/src/main/java/oilinjection/domain/car/Avante.java @@ -0,0 +1,28 @@ +package oilinjection.domain.car; + +public class Avante extends Car { + + private static final String CAR_NAME = "Avante"; + private static final double AVANTE_DISTANCE_PER_LITER = 15D; + + private final double tripDistance; + + public Avante(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + double getDistancePerLiter() { + return AVANTE_DISTANCE_PER_LITER; + } + + @Override + String getName() { + return CAR_NAME; + } + + @Override + double getTripDistance() { + return this.tripDistance; + } +} From 619bc0b01caeb1b66ef71f99cb7f1b0b3b6f8871 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:20:36 +0900 Subject: [PATCH 009/106] =?UTF-8?q?feat:=20K5=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20K5Test=20=ED=81=B4?= =?UTF-8?q?=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/oilinjection/domain/car/K5Test.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/oilinjection/domain/car/K5Test.java diff --git a/src/test/java/oilinjection/domain/car/K5Test.java b/src/test/java/oilinjection/domain/car/K5Test.java new file mode 100644 index 00000000..427a01f6 --- /dev/null +++ b/src/test/java/oilinjection/domain/car/K5Test.java @@ -0,0 +1,16 @@ +package oilinjection.domain.car; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class K5Test { + + @DisplayName("K5의 주입해야할 연료량을 구한다.") + @Test + void K5_필요한_연료량() { + final Car k5 = new K5(260D); + assertThat(k5.getChargeQuantity()).isEqualTo(20D); + } +} From 42bc89780a6d171997a6c62089ee1c5edbfaa520 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Sun, 13 Feb 2022 16:21:11 +0900 Subject: [PATCH 010/106] =?UTF-8?q?feat:=20K5=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 - 추상클래스 Car에 존재하는 메서드 오버라이딩 --- src/main/java/oilinjection/domain/car/K5.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/oilinjection/domain/car/K5.java diff --git a/src/main/java/oilinjection/domain/car/K5.java b/src/main/java/oilinjection/domain/car/K5.java new file mode 100644 index 00000000..4645deb1 --- /dev/null +++ b/src/main/java/oilinjection/domain/car/K5.java @@ -0,0 +1,28 @@ +package oilinjection.domain.car; + +public class K5 extends Car { + + private static final String CAR_NAME = "K5"; + private static final double K5_DISTANCE_PER_LITER = 13D; + + private final double tripDistance; + + public K5(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + double getDistancePerLiter() { + return K5_DISTANCE_PER_LITER; + } + + @Override + String getName() { + return CAR_NAME; + } + + @Override + double getTripDistance() { + return this.tripDistance; + } +} From 2ea68bc71ae63f9ae5449c68af40b1904d84ab77 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 16:43:51 +0900 Subject: [PATCH 011/106] feat: add ignore --- .gitignore | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/.gitignore b/.gitignore index 6c018781..687f03d8 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,147 @@ out/ ### VS Code ### .vscode/ + + +# Created by https://www.toptal.com/developers/gitignore/api/macos,intellij +# Edit at https://www.toptal.com/developers/gitignore?templates=macos,intellij + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# End of https://www.toptal.com/developers/gitignore/api/macos,intellij \ No newline at end of file From a52796e5c81928c6580c295c456a853df2c8e100 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 16:44:24 +0900 Subject: [PATCH 012/106] =?UTF-8?q?refactor:=20tripDistance=20=EB=B6=80?= =?UTF-8?q?=EB=AA=A8=20=ED=95=84=EB=93=9C=EC=97=90=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=86=8D=20=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/oilinjection/domain/car/Avante.java | 9 +-------- src/main/java/oilinjection/domain/car/Car.java | 12 ++++++++++-- src/main/java/oilinjection/domain/car/K5.java | 9 +-------- src/main/java/oilinjection/domain/car/Sonata.java | 9 +-------- 4 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/main/java/oilinjection/domain/car/Avante.java b/src/main/java/oilinjection/domain/car/Avante.java index 882b452a..db75e51a 100644 --- a/src/main/java/oilinjection/domain/car/Avante.java +++ b/src/main/java/oilinjection/domain/car/Avante.java @@ -5,10 +5,8 @@ public class Avante extends Car { private static final String CAR_NAME = "Avante"; private static final double AVANTE_DISTANCE_PER_LITER = 15D; - private final double tripDistance; - public Avante(double tripDistance) { - this.tripDistance = tripDistance; + super(tripDistance); } @Override @@ -20,9 +18,4 @@ public Avante(double tripDistance) { String getName() { return CAR_NAME; } - - @Override - double getTripDistance() { - return this.tripDistance; - } } diff --git a/src/main/java/oilinjection/domain/car/Car.java b/src/main/java/oilinjection/domain/car/Car.java index c91e7e95..d58d6870 100644 --- a/src/main/java/oilinjection/domain/car/Car.java +++ b/src/main/java/oilinjection/domain/car/Car.java @@ -2,12 +2,20 @@ public abstract class Car { - abstract double getDistancePerLiter(); + final double tripDistance; + + public Car(double tripDistance) { + this.tripDistance = tripDistance; + } - abstract double getTripDistance(); + abstract double getDistancePerLiter(); abstract String getName(); + double getTripDistance() { + return this.tripDistance; + } + double getChargeQuantity() { return getTripDistance() / getDistancePerLiter(); } diff --git a/src/main/java/oilinjection/domain/car/K5.java b/src/main/java/oilinjection/domain/car/K5.java index 4645deb1..715b25be 100644 --- a/src/main/java/oilinjection/domain/car/K5.java +++ b/src/main/java/oilinjection/domain/car/K5.java @@ -5,10 +5,8 @@ public class K5 extends Car { private static final String CAR_NAME = "K5"; private static final double K5_DISTANCE_PER_LITER = 13D; - private final double tripDistance; - public K5(double tripDistance) { - this.tripDistance = tripDistance; + super(tripDistance); } @Override @@ -20,9 +18,4 @@ public K5(double tripDistance) { String getName() { return CAR_NAME; } - - @Override - double getTripDistance() { - return this.tripDistance; - } } diff --git a/src/main/java/oilinjection/domain/car/Sonata.java b/src/main/java/oilinjection/domain/car/Sonata.java index fbf9faa1..e81b2d65 100644 --- a/src/main/java/oilinjection/domain/car/Sonata.java +++ b/src/main/java/oilinjection/domain/car/Sonata.java @@ -5,10 +5,8 @@ public class Sonata extends Car { private static final String CAR_NAME = "Sonata"; private static final double SONATA_DISTANCE_PER_LITER = 10D; - private final double tripDistance; - public Sonata(double tripDistance) { - this.tripDistance = tripDistance; + super(tripDistance); } @Override @@ -20,9 +18,4 @@ public Sonata(double tripDistance) { String getName() { return CAR_NAME; } - - @Override - double getTripDistance() { - return this.tripDistance; - } } From 5fb53cf9726572430b6cdc4dd30b622bd59afe43 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 16:52:55 +0900 Subject: [PATCH 013/106] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EC=9D=84=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=ED=95=98=EB=8A=94=20Rent=20VO=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/oilinjection/domain/vo/Rent.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/oilinjection/domain/vo/Rent.java diff --git a/src/main/java/oilinjection/domain/vo/Rent.java b/src/main/java/oilinjection/domain/vo/Rent.java new file mode 100644 index 00000000..3531de97 --- /dev/null +++ b/src/main/java/oilinjection/domain/vo/Rent.java @@ -0,0 +1,20 @@ +package oilinjection.domain.vo; + +public class Rent { + + private final String name; + private final double tripDistance; + + public Rent(String name, double tripDistance) { + this.name = name; + this.tripDistance = tripDistance; + } + + public String getName() { + return name; + } + + public double getTripDistance() { + return tripDistance; + } +} From 37c0b7898055152cbe74b691765a208bf542d369 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 17:55:49 +0900 Subject: [PATCH 014/106] =?UTF-8?q?feat:=20Rent=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20equals=20&=20hashCode=20=EC=9E=AC=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/oilinjection/domain/vo/Rent.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/oilinjection/domain/vo/Rent.java b/src/main/java/oilinjection/domain/vo/Rent.java index 3531de97..4021b30c 100644 --- a/src/main/java/oilinjection/domain/vo/Rent.java +++ b/src/main/java/oilinjection/domain/vo/Rent.java @@ -1,5 +1,7 @@ package oilinjection.domain.vo; +import java.util.Objects; + public class Rent { private final String name; @@ -17,4 +19,22 @@ public String getName() { public double getTripDistance() { return tripDistance; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Rent rent = (Rent) o; + return Double.compare(rent.tripDistance, tripDistance) == 0 + && Objects.equals(name, rent.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, tripDistance); + } } From 04409005bc8c3e7ca608e1110171e6221614588d Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 17:57:38 +0900 Subject: [PATCH 015/106] =?UTF-8?q?feat:=20InputView=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=A0=9C=ED=95=9C?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/oilinjection/view/InputView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/oilinjection/view/InputView.java b/src/main/java/oilinjection/view/InputView.java index 61d97043..535ba453 100644 --- a/src/main/java/oilinjection/view/InputView.java +++ b/src/main/java/oilinjection/view/InputView.java @@ -8,7 +8,8 @@ public class InputView { private static final String RESERVATION_INFO_INPUT_MESSAGE = "대여할 자동차와 예상 거리를 입력해 주세요. (eg. carName1:distance, carName2:distance)"; private static final String ALL_SPACE = "\\s+"; private static final String EMPTY_STRING = ""; - private static final String EMPTY_STRING_EXCEPTION_MESSAGE = "[ERROR] 공백일 수 없습니다."; + + private InputView() {} public static String inputReservationInfo() { System.out.println(RESERVATION_INFO_INPUT_MESSAGE); From 7603b88cf09d07739b2b4591ca7cd8ded34612ba Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 18:01:50 +0900 Subject: [PATCH 016/106] =?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=84=20=ED=8C=8C=EC=8B=B1=ED=95=98?= =?UTF-8?q?=EC=97=AC=20Rent=20=EA=B0=9D=EC=B2=B4=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A5=BC=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/oilinjection/util/Parser.java | 37 +++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/oilinjection/util/Parser.java diff --git a/src/main/java/oilinjection/util/Parser.java b/src/main/java/oilinjection/util/Parser.java new file mode 100644 index 00000000..9d15aae4 --- /dev/null +++ b/src/main/java/oilinjection/util/Parser.java @@ -0,0 +1,37 @@ +package oilinjection.util; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import oilinjection.domain.vo.Rent; + +public class Parser { + + private static final String RESERVATION_DELIMITER = ","; + private static final String INFO_DELIMITER = ":"; + private static final int NAME = 0; + private static final int TRIP_DISTANCE = 1; + private static final String INPUT_FORMAT_REGEX = "[a-zA-z0-9]+:[0-9]+"; + private static final String INVALID_FORMAT_EXCEPTION_MESSAGE = "[ERROR] 입력 형식이 맞지 않습니다(eg.${carName}:${tripDistance})"; + + public static List parse(final String input) { + + final String[] rentInfo = input.split(RESERVATION_DELIMITER); + + return Collections.unmodifiableList( + Arrays.stream(rentInfo) + .map(rent -> { + validateInfoFormat(rent); + final String[] split = rent.split(INFO_DELIMITER); + return new Rent(split[NAME], Double.parseDouble(split[TRIP_DISTANCE])); + }) + .collect(Collectors.toList())); + } + + private static void validateInfoFormat(final String rent) { + if (!rent.matches(INPUT_FORMAT_REGEX)) { + throw new IllegalArgumentException(INVALID_FORMAT_EXCEPTION_MESSAGE); + } + } +} From f822ac07c63214ff0faef65cd7bd0b13f9013bf1 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 18:12:02 +0900 Subject: [PATCH 017/106] =?UTF-8?q?test:=20Parser=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 정상적인 입력이 들어오는 경우 2. 빈 값이 들어오는 경우, 예외 발생 3. 입력 형식에 유효하지 않은 경우, 예외 발생 --- .../java/oilinjection/util/ParserTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/test/java/oilinjection/util/ParserTest.java diff --git a/src/test/java/oilinjection/util/ParserTest.java b/src/test/java/oilinjection/util/ParserTest.java new file mode 100644 index 00000000..a92cd9bc --- /dev/null +++ b/src/test/java/oilinjection/util/ParserTest.java @@ -0,0 +1,63 @@ +package oilinjection.util; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; +import oilinjection.domain.vo.Rent; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EmptySource; +import org.junit.jupiter.params.provider.ValueSource; + +class ParserTest { + + @DisplayName("올바른 입력이 들어오면, 정상적으로 실행된다.") + @Test + void 정상_입력1() { + final String input = "carName1:200"; + final Rent rent = new Rent("carName1", 200); + assertThat(Parser.parse(input)).isEqualTo(Arrays.asList(rent)); + } + + @DisplayName("두 개 이상의 rent 정보가 올바른 입력 형식으로 들어와도 정상적으로 실행된다.") + @Test + void 정상_입력2() { + final String input = "carName1:200,carName2:300"; + final List rents = Arrays.asList(new Rent("carName1", 200), new Rent("carName2", 300)); + assertThat(Parser.parse(input)).isEqualTo(rents); + } + + @DisplayName("입력이 빈 값이면 예외가 발생한다.") + @EmptySource + @ParameterizedTest + void 빈_입력_예외_발생(final String input) { + Assertions.assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> Parser.parse(input)); + } + + @DisplayName("랜트 정보 값이 하나로도 빈 값이면 예외가 발생한다.") + @ValueSource(strings = {"car1:", ":200"}) + @ParameterizedTest + void 렌트_정보_중_하나의_빈_입력_예외_발생(final String input) { + Assertions.assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> Parser.parse(input)); + } + + @DisplayName("랜트 정보 중 거리 값이 숫자가 아니면 예외가 발생한다.") + @Test + void 거리_값이_숫자가_아닌_경우_예외_발생() { + Assertions.assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> Parser.parse("car:aaa")); + } + + @DisplayName("입력 형식에 맞지 않는 경우 예외가 발생한다.") + @ValueSource(strings = {"car1 200", "car1,200", "card1200", "car::123"}) + @ParameterizedTest + void 입력_형식에_맞지_않는_경우_예외_발생(final String input) { + Assertions.assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> Parser.parse(input)); + } +} From e9205eed60126cc094b5a8fe3dc8e3fe2f5a4c31 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 18:12:33 +0900 Subject: [PATCH 018/106] =?UTF-8?q?docs:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index edfd7561..ff841926 100644 --- a/README.md +++ b/README.md @@ -16,15 +16,16 @@ ## 구현 사항 -- [ ] 입력 (e.g. carName1:distance, carName2:distance) - - [ ] 문자 사이에 불필요한 공백을 제거한다. +- [x] 입력 (e.g. carName1:distance, carName2:distance) + - [x] 문자 사이에 불필요한 공백을 제거한다. -- [ ] 파서 - - [ ] 자동차는 `,` 로 구분한다 - - [ ] 자동차의 이름과 속력은 `:` 로 구분한다. - - [ ] 검증 - - [ ] 빈 값이 들어올 수 없다. - - [ ] 이름이나 거리에 빈 값이 들어올 수 없다. +- [x] 파서 + - [x] 자동차는 `,` 로 구분한다 + - [x] 자동차의 이름과 속력은 `:` 로 구분한다. + - [x] 검증 + - [x] 빈 값이 들어올 수 없다. + - [x] 이름이나 거리에 빈 값이 들어올 수 없다. + - [x] 입력 형식에 맞는지 확인한다. - [ ] 렌터카 회사 - [ ] 자동차 객체를 받아 렌터카 리스트에 추가한다. - addCar(Car car) @@ -32,7 +33,7 @@ - [ ] 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성한다. - [ ] 자동차 - abstract - - [ ] 주입해야 할 연료량을 구한다. + - [x] 주입해야 할 연료량을 구한다. - [ ] 검증 - [ ] 거리는 1 이상이어야 한다. From 8b2cd26035ceaf8a45a8fba5d8ee399016fc16a1 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 21:33:25 +0900 Subject: [PATCH 019/106] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A6=84=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20Car=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20CarFactory=20enum=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=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 --- .../java/oilinjection/domain/CarFactory.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/oilinjection/domain/CarFactory.java diff --git a/src/main/java/oilinjection/domain/CarFactory.java b/src/main/java/oilinjection/domain/CarFactory.java new file mode 100644 index 00000000..fe120874 --- /dev/null +++ b/src/main/java/oilinjection/domain/CarFactory.java @@ -0,0 +1,35 @@ +package oilinjection.domain; + +import java.util.Arrays; +import java.util.function.Function; +import oilinjection.domain.car.Avante; +import oilinjection.domain.car.Car; +import oilinjection.domain.car.K5; +import oilinjection.domain.car.Sonata; + +public enum CarFactory { + AVANTE("AVANTE", Avante::new), + SONATA("SONATA", Sonata::new), + K5("K5", K5::new); + + private static final String NOT_FOUND_NAME_EXCEPTION_MESSAGE = "[ERROR] 해당하는 차종이 없습니다."; + private final String name; + private final Function createCar; + + CarFactory(final String name, final Function createCar) { + this.name = name; + this.createCar = createCar; + } + + public static Car create(final String name, final double tripDistance) { + return Arrays.stream(values()) + .filter(car -> car.name.equals(name.toUpperCase())) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(NOT_FOUND_NAME_EXCEPTION_MESSAGE)) + .createCar(tripDistance); + } + + private Car createCar(final double tripDistance) { + return this.createCar.apply(tripDistance); + } +} From 98acb61ccf34b694655e38773d763cbdccfdeecc Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 21:34:56 +0900 Subject: [PATCH 020/106] =?UTF-8?q?test:=20CarFactory=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Avante 반환 확인 2. K5 반환 확인 3. Sonata 반환 확인 4. 해당되는 이름이 없는 경우, exception 발생 --- .../oilinjection/domain/CarFactoryTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/test/java/oilinjection/domain/CarFactoryTest.java diff --git a/src/test/java/oilinjection/domain/CarFactoryTest.java b/src/test/java/oilinjection/domain/CarFactoryTest.java new file mode 100644 index 00000000..8ca49b8a --- /dev/null +++ b/src/test/java/oilinjection/domain/CarFactoryTest.java @@ -0,0 +1,42 @@ +package oilinjection.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import oilinjection.domain.car.Avante; +import oilinjection.domain.car.Car; +import oilinjection.domain.car.K5; +import oilinjection.domain.car.Sonata; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class CarFactoryTest { + + @DisplayName("Avante를 반환한다.") + @Test + void 아반떼_생성() { + final Car avante = CarFactory.create("avante", 200D); + assertThat(avante).isEqualTo(new Avante(200D)); + } + + @DisplayName("K5 반환한다.") + @Test + void K5_생성() { + final Car k5 = CarFactory.create("K5", 200D); + assertThat(k5).isEqualTo(new K5(200D)); + } + + @DisplayName("Sonata를 반환한다.") + @Test + void 소나타_생성() { + final Car sonata = CarFactory.create("sonata", 200D); + assertThat(sonata).isEqualTo(new Sonata(200D)); + } + + @DisplayName("해당하는 이름이 없으면 예외를 발생시킨다.") + @Test + void 이름_없음() { + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> CarFactory.create("none", 00D)); + } +} From f408a4c3c9665e86577d2a1c283c913e76cfdbe3 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 21:37:30 +0900 Subject: [PATCH 021/106] =?UTF-8?q?feat:=20Car=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EB=82=B4=20equals=20&=20hashcode=20=EC=98=A4=EB=B2=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/oilinjection/domain/car/Car.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/oilinjection/domain/car/Car.java b/src/main/java/oilinjection/domain/car/Car.java index d58d6870..2f9366e6 100644 --- a/src/main/java/oilinjection/domain/car/Car.java +++ b/src/main/java/oilinjection/domain/car/Car.java @@ -1,5 +1,7 @@ package oilinjection.domain.car; +import java.util.Objects; + public abstract class Car { final double tripDistance; @@ -19,4 +21,21 @@ public Car(double tripDistance) { double getChargeQuantity() { return getTripDistance() / getDistancePerLiter(); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Car car = (Car) o; + return Double.compare(car.tripDistance, tripDistance) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(tripDistance); + } } \ No newline at end of file From 88fb5d387cd91c9605e61471e0a2427a71261333 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 21:38:11 +0900 Subject: [PATCH 022/106] =?UTF-8?q?docs:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ff841926..8886dbed 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ - [ ] 검증 - [ ] 거리는 1 이상이어야 한다. -- [ ] 자동차 팩토리 - - [ ] 자동차 이름 검증(대소문자 구분 X) +- [x] 자동차 팩토리 + - [x] 자동차 이름 검증(대소문자 구분 X) - [ ] 출력 - [ ] 생성한 보고서 출력 \ No newline at end of file From ccff25c853653273920b1e214b2aeb5cdcf8a8cb Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 21:54:10 +0900 Subject: [PATCH 023/106] =?UTF-8?q?feat:=20=EC=97=AC=ED=96=89=EA=B1=B0?= =?UTF-8?q?=EB=A6=AC=EA=B0=80=201=EB=B3=B4=EB=8B=A4=20=EC=9E=91=EC=9D=80?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/oilinjection/domain/CarFactory.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/oilinjection/domain/CarFactory.java b/src/main/java/oilinjection/domain/CarFactory.java index fe120874..0571e2b8 100644 --- a/src/main/java/oilinjection/domain/CarFactory.java +++ b/src/main/java/oilinjection/domain/CarFactory.java @@ -12,6 +12,8 @@ public enum CarFactory { SONATA("SONATA", Sonata::new), K5("K5", K5::new); + private static final double MIN_TRIP_DISTANCE = 1D; + private static final String UNDER_MIN_TRIP_DISTANCE_EXCEPTION_MESSAGE = "[ERROR] 해당하는 차종이 없습니다."; private static final String NOT_FOUND_NAME_EXCEPTION_MESSAGE = "[ERROR] 해당하는 차종이 없습니다."; private final String name; private final Function createCar; @@ -22,6 +24,8 @@ public enum CarFactory { } public static Car create(final String name, final double tripDistance) { + validateOverMinTripDistance(tripDistance); + return Arrays.stream(values()) .filter(car -> car.name.equals(name.toUpperCase())) .findAny() @@ -29,6 +33,12 @@ public static Car create(final String name, final double tripDistance) { .createCar(tripDistance); } + private static void validateOverMinTripDistance(double tripDistance) { + if (tripDistance < MIN_TRIP_DISTANCE) { + throw new IllegalArgumentException(UNDER_MIN_TRIP_DISTANCE_EXCEPTION_MESSAGE); + } + } + private Car createCar(final double tripDistance) { return this.createCar.apply(tripDistance); } From 3daf1494eb88ca1cc215562f11931a6e5a80c422 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 21:55:38 +0900 Subject: [PATCH 024/106] =?UTF-8?q?feat:=201=EB=B3=B4=EB=8B=A4=20=EC=9E=91?= =?UTF-8?q?=EC=9D=80=20=EC=97=AC=ED=96=89=EA=B1=B0=EB=A6=AC=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=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/oilinjection/domain/CarFactoryTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/test/java/oilinjection/domain/CarFactoryTest.java b/src/test/java/oilinjection/domain/CarFactoryTest.java index 8ca49b8a..fa5c5486 100644 --- a/src/test/java/oilinjection/domain/CarFactoryTest.java +++ b/src/test/java/oilinjection/domain/CarFactoryTest.java @@ -37,6 +37,13 @@ public class CarFactoryTest { @Test void 이름_없음() { assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> CarFactory.create("none", 00D)); + .isThrownBy(() -> CarFactory.create("none", 10D)); + } + + @DisplayName("예약 하는 여행 거리가 최소 거리(1) 보다 작으면 예외가 발생한다.") + @Test + void 최소_거리보다_작음() { + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> CarFactory.create("avante", 0D)); } } From fa50f213d3c74dade88be59c2c80a8f419594536 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 21:56:33 +0900 Subject: [PATCH 025/106] =?UTF-8?q?docs:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8886dbed..b8e2054b 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ - [ ] 자동차 - abstract - [x] 주입해야 할 연료량을 구한다. - - [ ] 검증 - - [ ] 거리는 1 이상이어야 한다. + - [x] 검증 + - [x] 거리는 1 이상이어야 한다. - [x] 자동차 팩토리 - [x] 자동차 이름 검증(대소문자 구분 X) From b803fc17aa7867875fd3e04197b5bde4fe3d7f64 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 22:08:05 +0900 Subject: [PATCH 026/106] =?UTF-8?q?feat:=20=EB=8C=80=EC=86=8C=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=20=EA=B5=AC=EB=B6=84=EC=97=86=EC=9D=B4=20Car=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/oilinjection/domain/CarFactoryTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/oilinjection/domain/CarFactoryTest.java b/src/test/java/oilinjection/domain/CarFactoryTest.java index fa5c5486..6f37c99c 100644 --- a/src/test/java/oilinjection/domain/CarFactoryTest.java +++ b/src/test/java/oilinjection/domain/CarFactoryTest.java @@ -9,6 +9,8 @@ import oilinjection.domain.car.Sonata; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; public class CarFactoryTest { @@ -46,4 +48,12 @@ public class CarFactoryTest { assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> CarFactory.create("avante", 0D)); } + + @DisplayName("자동차의 이름은 대소문자를 구분하지 않는다.") + @ValueSource(strings = {"Sonata", "sOnAtA", "SONATA"}) + @ParameterizedTest + void 소나타_대소문자_구분없이_생성(final String name) { + final Car sonata = CarFactory.create(name, 200D); + assertThat(sonata).isEqualTo(new Sonata(200D)); + } } From 4a56d05b6fff3b20c9929b8e341be0560df0e07a Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 23:35:19 +0900 Subject: [PATCH 027/106] =?UTF-8?q?refactor:=20=EC=B6=94=EC=83=81=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=91=EA=B7=BC=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=9E=90=20default=EC=97=90=EC=84=9C=20public?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/oilinjection/domain/car/Avante.java | 4 ++-- src/main/java/oilinjection/domain/car/Car.java | 6 +++--- src/main/java/oilinjection/domain/car/K5.java | 4 ++-- src/main/java/oilinjection/domain/car/Sonata.java | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/oilinjection/domain/car/Avante.java b/src/main/java/oilinjection/domain/car/Avante.java index db75e51a..f9d7d96d 100644 --- a/src/main/java/oilinjection/domain/car/Avante.java +++ b/src/main/java/oilinjection/domain/car/Avante.java @@ -10,12 +10,12 @@ public Avante(double tripDistance) { } @Override - double getDistancePerLiter() { + public double getDistancePerLiter() { return AVANTE_DISTANCE_PER_LITER; } @Override - String getName() { + public String getName() { return CAR_NAME; } } diff --git a/src/main/java/oilinjection/domain/car/Car.java b/src/main/java/oilinjection/domain/car/Car.java index 2f9366e6..cab320e6 100644 --- a/src/main/java/oilinjection/domain/car/Car.java +++ b/src/main/java/oilinjection/domain/car/Car.java @@ -6,19 +6,19 @@ public abstract class Car { final double tripDistance; - public Car(double tripDistance) { + Car(double tripDistance) { this.tripDistance = tripDistance; } abstract double getDistancePerLiter(); - abstract String getName(); + public abstract String getName(); double getTripDistance() { return this.tripDistance; } - double getChargeQuantity() { + public double getChargeQuantity() { return getTripDistance() / getDistancePerLiter(); } diff --git a/src/main/java/oilinjection/domain/car/K5.java b/src/main/java/oilinjection/domain/car/K5.java index 715b25be..aaf22969 100644 --- a/src/main/java/oilinjection/domain/car/K5.java +++ b/src/main/java/oilinjection/domain/car/K5.java @@ -10,12 +10,12 @@ public K5(double tripDistance) { } @Override - double getDistancePerLiter() { + public double getDistancePerLiter() { return K5_DISTANCE_PER_LITER; } @Override - String getName() { + public String getName() { return CAR_NAME; } } diff --git a/src/main/java/oilinjection/domain/car/Sonata.java b/src/main/java/oilinjection/domain/car/Sonata.java index e81b2d65..7a424f01 100644 --- a/src/main/java/oilinjection/domain/car/Sonata.java +++ b/src/main/java/oilinjection/domain/car/Sonata.java @@ -10,12 +10,12 @@ public Sonata(double tripDistance) { } @Override - double getDistancePerLiter() { + public double getDistancePerLiter() { return SONATA_DISTANCE_PER_LITER; } @Override - String getName() { + public String getName() { return CAR_NAME; } } From 738c9a70e41844d54b065cb30d4bad3730157db2 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 23:45:32 +0900 Subject: [PATCH 028/106] =?UTF-8?q?refactor:=20CarFactory=20->=20RentCar?= =?UTF-8?q?=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 클래스 이름 변경 2. 메서드 변경 적절한 이름으로 변경 --- .../domain/{CarFactory.java => RentCar.java} | 14 ++++++++------ .../{CarFactoryTest.java => RentCarTest.java} | 14 +++++++------- 2 files changed, 15 insertions(+), 13 deletions(-) rename src/main/java/oilinjection/domain/{CarFactory.java => RentCar.java} (79%) rename src/test/java/oilinjection/domain/{CarFactoryTest.java => RentCarTest.java} (80%) diff --git a/src/main/java/oilinjection/domain/CarFactory.java b/src/main/java/oilinjection/domain/RentCar.java similarity index 79% rename from src/main/java/oilinjection/domain/CarFactory.java rename to src/main/java/oilinjection/domain/RentCar.java index 0571e2b8..56a705fa 100644 --- a/src/main/java/oilinjection/domain/CarFactory.java +++ b/src/main/java/oilinjection/domain/RentCar.java @@ -7,23 +7,25 @@ import oilinjection.domain.car.K5; import oilinjection.domain.car.Sonata; -public enum CarFactory { - AVANTE("AVANTE", Avante::new), - SONATA("SONATA", Sonata::new), - K5("K5", K5::new); +public enum RentCar { + AVANTE("AVANTE", 1, Avante::new), + SONATA("SONATA", 2, Sonata::new), + K5("K5", 2, K5::new); private static final double MIN_TRIP_DISTANCE = 1D; private static final String UNDER_MIN_TRIP_DISTANCE_EXCEPTION_MESSAGE = "[ERROR] 해당하는 차종이 없습니다."; private static final String NOT_FOUND_NAME_EXCEPTION_MESSAGE = "[ERROR] 해당하는 차종이 없습니다."; private final String name; + private final int quantity; private final Function createCar; - CarFactory(final String name, final Function createCar) { + RentCar(final String name, int quantity, final Function createCar) { this.name = name; + this.quantity = quantity; this.createCar = createCar; } - public static Car create(final String name, final double tripDistance) { + public static Car rent(final String name, final double tripDistance) { validateOverMinTripDistance(tripDistance); return Arrays.stream(values()) diff --git a/src/test/java/oilinjection/domain/CarFactoryTest.java b/src/test/java/oilinjection/domain/RentCarTest.java similarity index 80% rename from src/test/java/oilinjection/domain/CarFactoryTest.java rename to src/test/java/oilinjection/domain/RentCarTest.java index 6f37c99c..1df9add8 100644 --- a/src/test/java/oilinjection/domain/CarFactoryTest.java +++ b/src/test/java/oilinjection/domain/RentCarTest.java @@ -12,26 +12,26 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -public class CarFactoryTest { +public class RentCarTest { @DisplayName("Avante를 반환한다.") @Test void 아반떼_생성() { - final Car avante = CarFactory.create("avante", 200D); + final Car avante = RentCar.rent("avante", 200D); assertThat(avante).isEqualTo(new Avante(200D)); } @DisplayName("K5 반환한다.") @Test void K5_생성() { - final Car k5 = CarFactory.create("K5", 200D); + final Car k5 = RentCar.rent("K5", 200D); assertThat(k5).isEqualTo(new K5(200D)); } @DisplayName("Sonata를 반환한다.") @Test void 소나타_생성() { - final Car sonata = CarFactory.create("sonata", 200D); + final Car sonata = RentCar.rent("sonata", 200D); assertThat(sonata).isEqualTo(new Sonata(200D)); } @@ -39,21 +39,21 @@ public class CarFactoryTest { @Test void 이름_없음() { assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> CarFactory.create("none", 10D)); + .isThrownBy(() -> RentCar.rent("none", 10D)); } @DisplayName("예약 하는 여행 거리가 최소 거리(1) 보다 작으면 예외가 발생한다.") @Test void 최소_거리보다_작음() { assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> CarFactory.create("avante", 0D)); + .isThrownBy(() -> RentCar.rent("avante", 0D)); } @DisplayName("자동차의 이름은 대소문자를 구분하지 않는다.") @ValueSource(strings = {"Sonata", "sOnAtA", "SONATA"}) @ParameterizedTest void 소나타_대소문자_구분없이_생성(final String name) { - final Car sonata = CarFactory.create(name, 200D); + final Car sonata = RentCar.rent(name, 200D); assertThat(sonata).isEqualTo(new Sonata(200D)); } } From 933475e396d875f29baf909300eb8afbf99eb713 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 23:48:50 +0900 Subject: [PATCH 029/106] =?UTF-8?q?rename:=20Rent=20->=20RentInfo=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oilinjection/domain/vo/{Rent.java => RentInfo.java} | 6 +++--- src/main/java/oilinjection/util/Parser.java | 6 +++--- src/test/java/oilinjection/util/ParserTest.java | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) rename src/main/java/oilinjection/domain/vo/{Rent.java => RentInfo.java} (86%) diff --git a/src/main/java/oilinjection/domain/vo/Rent.java b/src/main/java/oilinjection/domain/vo/RentInfo.java similarity index 86% rename from src/main/java/oilinjection/domain/vo/Rent.java rename to src/main/java/oilinjection/domain/vo/RentInfo.java index 4021b30c..084ba944 100644 --- a/src/main/java/oilinjection/domain/vo/Rent.java +++ b/src/main/java/oilinjection/domain/vo/RentInfo.java @@ -2,12 +2,12 @@ import java.util.Objects; -public class Rent { +public class RentInfo { private final String name; private final double tripDistance; - public Rent(String name, double tripDistance) { + public RentInfo(String name, double tripDistance) { this.name = name; this.tripDistance = tripDistance; } @@ -28,7 +28,7 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } - Rent rent = (Rent) o; + RentInfo rent = (RentInfo) o; return Double.compare(rent.tripDistance, tripDistance) == 0 && Objects.equals(name, rent.name); } diff --git a/src/main/java/oilinjection/util/Parser.java b/src/main/java/oilinjection/util/Parser.java index 9d15aae4..3762c409 100644 --- a/src/main/java/oilinjection/util/Parser.java +++ b/src/main/java/oilinjection/util/Parser.java @@ -4,7 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import oilinjection.domain.vo.Rent; +import oilinjection.domain.vo.RentInfo; public class Parser { @@ -15,7 +15,7 @@ public class Parser { private static final String INPUT_FORMAT_REGEX = "[a-zA-z0-9]+:[0-9]+"; private static final String INVALID_FORMAT_EXCEPTION_MESSAGE = "[ERROR] 입력 형식이 맞지 않습니다(eg.${carName}:${tripDistance})"; - public static List parse(final String input) { + public static List parse(final String input) { final String[] rentInfo = input.split(RESERVATION_DELIMITER); @@ -24,7 +24,7 @@ public static List parse(final String input) { .map(rent -> { validateInfoFormat(rent); final String[] split = rent.split(INFO_DELIMITER); - return new Rent(split[NAME], Double.parseDouble(split[TRIP_DISTANCE])); + return new RentInfo(split[NAME], Double.parseDouble(split[TRIP_DISTANCE])); }) .collect(Collectors.toList())); } diff --git a/src/test/java/oilinjection/util/ParserTest.java b/src/test/java/oilinjection/util/ParserTest.java index a92cd9bc..700438c1 100644 --- a/src/test/java/oilinjection/util/ParserTest.java +++ b/src/test/java/oilinjection/util/ParserTest.java @@ -4,7 +4,7 @@ import java.util.Arrays; import java.util.List; -import oilinjection.domain.vo.Rent; +import oilinjection.domain.vo.RentInfo; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -18,7 +18,7 @@ class ParserTest { @Test void 정상_입력1() { final String input = "carName1:200"; - final Rent rent = new Rent("carName1", 200); + final RentInfo rent = new RentInfo("carName1", 200); assertThat(Parser.parse(input)).isEqualTo(Arrays.asList(rent)); } @@ -26,7 +26,7 @@ class ParserTest { @Test void 정상_입력2() { final String input = "carName1:200,carName2:300"; - final List rents = Arrays.asList(new Rent("carName1", 200), new Rent("carName2", 300)); + final List rents = Arrays.asList(new RentInfo("carName1", 200), new RentInfo("carName2", 300)); assertThat(Parser.parse(input)).isEqualTo(rents); } From d73ed2bf26acd9669f6f8d7e65e0d270f9bfb577 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 23:52:10 +0900 Subject: [PATCH 030/106] =?UTF-8?q?test:=20=EB=A0=8C=ED=8A=B8=20=EC=98=88?= =?UTF-8?q?=EC=95=BD=20=EA=B8=B0=EB=8A=A5=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oilinjection/domain/RentCompanyTest.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/test/java/oilinjection/domain/RentCompanyTest.java diff --git a/src/test/java/oilinjection/domain/RentCompanyTest.java b/src/test/java/oilinjection/domain/RentCompanyTest.java new file mode 100644 index 00000000..0c720c33 --- /dev/null +++ b/src/test/java/oilinjection/domain/RentCompanyTest.java @@ -0,0 +1,38 @@ +package oilinjection.domain; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import java.util.Arrays; +import java.util.List; +import oilinjection.domain.vo.RentInfo; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class RentCompanyTest { + + @DisplayName("정상적인 렌트카 예약을 받는다.") + @Test + void 정상적인_렌트카_예약() { + final List reservation = Arrays.asList( + new RentInfo("avante", 200D), + new RentInfo("K5", 100D)); + + final RentCompany rentCompany = new RentCompany(); + + assertDoesNotThrow(() -> rentCompany.acceptReservation(reservation)); + } + + @DisplayName("소유하고 있는 렌트카보다 많은 수를 예약하면 예외를 발생시킨다.") + @Test + void 소유한_렌트카_수보다_많은_예약() { + final List reservation = Arrays.asList( + new RentInfo("avante", 200D), + new RentInfo("avante", 100D)); + + final RentCompany rentCompany = new RentCompany(); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> rentCompany.acceptReservation(reservation)); + } +} \ No newline at end of file From 5d665a6789fcc76f16ea0491f78ea1001481be9a Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Mon, 14 Feb 2022 23:52:52 +0900 Subject: [PATCH 031/106] =?UTF-8?q?feat:=20=EB=A0=8C=ED=8A=B8=20=EC=98=88?= =?UTF-8?q?=EC=95=BD=20=EB=B0=8F=20=EC=98=88=EC=95=BD=20=EC=97=AC=EB=B6=80?= =?UTF-8?q?=20=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 --- .../java/oilinjection/domain/RentCar.java | 4 ++ .../java/oilinjection/domain/RentCompany.java | 47 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/main/java/oilinjection/domain/RentCompany.java diff --git a/src/main/java/oilinjection/domain/RentCar.java b/src/main/java/oilinjection/domain/RentCar.java index 56a705fa..2ec827c7 100644 --- a/src/main/java/oilinjection/domain/RentCar.java +++ b/src/main/java/oilinjection/domain/RentCar.java @@ -44,4 +44,8 @@ private static void validateOverMinTripDistance(double tripDistance) { private Car createCar(final double tripDistance) { return this.createCar.apply(tripDistance); } + + public boolean isImpossibleReservation(Integer count) { + return count > this.quantity; + } } diff --git a/src/main/java/oilinjection/domain/RentCompany.java b/src/main/java/oilinjection/domain/RentCompany.java new file mode 100644 index 00000000..e3e998c6 --- /dev/null +++ b/src/main/java/oilinjection/domain/RentCompany.java @@ -0,0 +1,47 @@ +package oilinjection.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import oilinjection.domain.car.Car; +import oilinjection.domain.vo.RentInfo; + +public class RentCompany { + + private static final String QUANTITY_OVER_EXCEPTION_MESSAGE_FORMAT = "[ERROR] %s의 예약 가능한 차량이 없습니다."; + + private final List rents; + + public RentCompany() { + this.rents = new ArrayList<>(); + } + + public void acceptReservation(final List rentInfos) { + validateIsPossibleReservation(rentInfos); + + final List rentCars = rentInfos.stream() + .map(rentInfo -> RentCar.rent(rentInfo.getName(), rentInfo.getTripDistance())) + .collect(Collectors.toList()); + + rents.addAll(Collections.unmodifiableList(rentCars)); + } + + private void validateIsPossibleReservation(final List rentInfos) { + rentInfos.stream() + .collect(Collectors.groupingBy(RentInfo::getName, Collectors.summingInt(x -> 1))) + .forEach(this::validatePerCarType); + } + + private void validatePerCarType(final String name, final Integer count) { + if (findRentCar(name).isImpossibleReservation(count)) { + throw new IllegalArgumentException( + String.format(QUANTITY_OVER_EXCEPTION_MESSAGE_FORMAT, name)); + } + } + + private RentCar findRentCar(final String name) { + return RentCar.valueOf(name.toUpperCase()); + } +} From f8ebd3491c0529b109153f86fb43af559d6776c8 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 00:08:34 +0900 Subject: [PATCH 032/106] =?UTF-8?q?test:=20=EB=B3=B4=EA=B3=A0=EC=84=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oilinjection/domain/RentCompanyTest.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/test/java/oilinjection/domain/RentCompanyTest.java b/src/test/java/oilinjection/domain/RentCompanyTest.java index 0c720c33..7a102708 100644 --- a/src/test/java/oilinjection/domain/RentCompanyTest.java +++ b/src/test/java/oilinjection/domain/RentCompanyTest.java @@ -1,5 +1,6 @@ package oilinjection.domain; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -11,6 +12,8 @@ class RentCompanyTest { + private static final String NEWLINE = System.getProperty("line.separator"); + @DisplayName("정상적인 렌트카 예약을 받는다.") @Test void 정상적인_렌트카_예약() { @@ -35,4 +38,27 @@ class RentCompanyTest { assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> rentCompany.acceptReservation(reservation)); } -} \ No newline at end of file + + @DisplayName("차량별로 주입해야할 연료량을 확인할 수 있는 보고서를 생성한다.") + @Test + void 보고서_생성() { + final List reservation = Arrays.asList( + new RentInfo("Avante", 20D), + new RentInfo("Sonata", 300D), + new RentInfo("Sonata", 150D), + new RentInfo("K5", 130D), + new RentInfo("K5", 390D)); + + final RentCompany rentCompany = new RentCompany(); + rentCompany.acceptReservation(reservation); + String report = rentCompany.createReport(); + + assertThat(report).isEqualTo( + "Avante : 2리터" + NEWLINE + + "Sonata : 30리터" + NEWLINE + + "Sonata : 15리터" + NEWLINE + + "K5 : 10리터" + NEWLINE + + "K5 : 30리터" + NEWLINE + ); + } +} From 662a9433bc749fc2cba68914774898ba62dec41c Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 00:09:24 +0900 Subject: [PATCH 033/106] =?UTF-8?q?feat:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=EB=9F=89=20=EB=B3=B4=EA=B3=A0=EC=84=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=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 1. 보고서 생성 2. 주입할 연료량 올림 --- src/main/java/oilinjection/domain/RentCompany.java | 9 ++++++++- src/main/java/oilinjection/domain/car/Car.java | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/oilinjection/domain/RentCompany.java b/src/main/java/oilinjection/domain/RentCompany.java index e3e998c6..42ba4397 100644 --- a/src/main/java/oilinjection/domain/RentCompany.java +++ b/src/main/java/oilinjection/domain/RentCompany.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.function.Function; import java.util.stream.Collectors; import oilinjection.domain.car.Car; import oilinjection.domain.vo.RentInfo; @@ -11,6 +10,7 @@ public class RentCompany { private static final String QUANTITY_OVER_EXCEPTION_MESSAGE_FORMAT = "[ERROR] %s의 예약 가능한 차량이 없습니다."; + private static final String REPORT_FORMAT = "%s : %.0f리터%n"; private final List rents; @@ -44,4 +44,11 @@ private void validatePerCarType(final String name, final Integer count) { private RentCar findRentCar(final String name) { return RentCar.valueOf(name.toUpperCase()); } + + public String createReport() { + StringBuilder report = new StringBuilder(); + rents.forEach(car -> report.append(String.format(REPORT_FORMAT, car.getName(), car.getChargeQuantity()))); + return report.toString(); + + } } diff --git a/src/main/java/oilinjection/domain/car/Car.java b/src/main/java/oilinjection/domain/car/Car.java index cab320e6..83f68561 100644 --- a/src/main/java/oilinjection/domain/car/Car.java +++ b/src/main/java/oilinjection/domain/car/Car.java @@ -19,7 +19,7 @@ public abstract class Car { } public double getChargeQuantity() { - return getTripDistance() / getDistancePerLiter(); + return Math.ceil(getTripDistance() / getDistancePerLiter()); } @Override From f6c99060e08a7575bbddb4089ea27e2a55440c12 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 00:12:47 +0900 Subject: [PATCH 034/106] =?UTF-8?q?feat:=20=EC=B6=9C=EB=A0=A5=20=EB=8B=B4?= =?UTF-8?q?=EB=8B=B9=ED=95=98=EB=8A=94=20ResultView=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/oilinjection/view/ResultView.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/oilinjection/view/ResultView.java diff --git a/src/main/java/oilinjection/view/ResultView.java b/src/main/java/oilinjection/view/ResultView.java new file mode 100644 index 00000000..6b387c4b --- /dev/null +++ b/src/main/java/oilinjection/view/ResultView.java @@ -0,0 +1,8 @@ +package oilinjection.view; + +public class ResultView { + + public static void print(String report) { + System.out.print(report); + } +} From 9dc45d6ac934a6133145dfffda81b3b26f1da288 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 00:17:52 +0900 Subject: [PATCH 035/106] =?UTF-8?q?feat:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20Application=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oilinjection/OilInjectionApplication.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/oilinjection/OilInjectionApplication.java diff --git a/src/main/java/oilinjection/OilInjectionApplication.java b/src/main/java/oilinjection/OilInjectionApplication.java new file mode 100644 index 00000000..ed5d9989 --- /dev/null +++ b/src/main/java/oilinjection/OilInjectionApplication.java @@ -0,0 +1,19 @@ +package oilinjection; + +import java.util.List; +import oilinjection.domain.RentCompany; +import oilinjection.domain.vo.RentInfo; +import oilinjection.util.Parser; +import oilinjection.view.InputView; +import oilinjection.view.ResultView; + +public class OilInjectionApplication { + + public static void main(String[] args) { + final List rentInfos = Parser.parse(InputView.inputReservationInfo()); + + final RentCompany rentCompany = new RentCompany(); + rentCompany.acceptReservation(rentInfos); + ResultView.print(rentCompany.createReport()); + } +} From e751fa125f20c37425cf61e8e02bf8563048a489 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 00:19:13 +0900 Subject: [PATCH 036/106] =?UTF-8?q?refactor:=20=EB=B6=88=EB=B3=80=20final?= =?UTF-8?q?=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 앞으로는 final을 습관화하겠습니다. ㅎ_ㅜ --- src/main/java/oilinjection/domain/RentCar.java | 6 +++--- src/main/java/oilinjection/domain/car/Avante.java | 2 +- src/main/java/oilinjection/domain/car/Car.java | 2 +- src/main/java/oilinjection/domain/car/K5.java | 2 +- src/main/java/oilinjection/domain/car/Sonata.java | 2 +- src/main/java/oilinjection/domain/vo/RentInfo.java | 2 +- src/main/java/oilinjection/view/ResultView.java | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/oilinjection/domain/RentCar.java b/src/main/java/oilinjection/domain/RentCar.java index 2ec827c7..1d507c24 100644 --- a/src/main/java/oilinjection/domain/RentCar.java +++ b/src/main/java/oilinjection/domain/RentCar.java @@ -19,7 +19,7 @@ public enum RentCar { private final int quantity; private final Function createCar; - RentCar(final String name, int quantity, final Function createCar) { + RentCar(final String name, final int quantity, final Function createCar) { this.name = name; this.quantity = quantity; this.createCar = createCar; @@ -35,7 +35,7 @@ public static Car rent(final String name, final double tripDistance) { .createCar(tripDistance); } - private static void validateOverMinTripDistance(double tripDistance) { + private static void validateOverMinTripDistance(final double tripDistance) { if (tripDistance < MIN_TRIP_DISTANCE) { throw new IllegalArgumentException(UNDER_MIN_TRIP_DISTANCE_EXCEPTION_MESSAGE); } @@ -45,7 +45,7 @@ private Car createCar(final double tripDistance) { return this.createCar.apply(tripDistance); } - public boolean isImpossibleReservation(Integer count) { + public boolean isImpossibleReservation(final Integer count) { return count > this.quantity; } } diff --git a/src/main/java/oilinjection/domain/car/Avante.java b/src/main/java/oilinjection/domain/car/Avante.java index f9d7d96d..e30c43c0 100644 --- a/src/main/java/oilinjection/domain/car/Avante.java +++ b/src/main/java/oilinjection/domain/car/Avante.java @@ -5,7 +5,7 @@ public class Avante extends Car { private static final String CAR_NAME = "Avante"; private static final double AVANTE_DISTANCE_PER_LITER = 15D; - public Avante(double tripDistance) { + public Avante(final double tripDistance) { super(tripDistance); } diff --git a/src/main/java/oilinjection/domain/car/Car.java b/src/main/java/oilinjection/domain/car/Car.java index 83f68561..b95dfb4a 100644 --- a/src/main/java/oilinjection/domain/car/Car.java +++ b/src/main/java/oilinjection/domain/car/Car.java @@ -6,7 +6,7 @@ public abstract class Car { final double tripDistance; - Car(double tripDistance) { + Car(final double tripDistance) { this.tripDistance = tripDistance; } diff --git a/src/main/java/oilinjection/domain/car/K5.java b/src/main/java/oilinjection/domain/car/K5.java index aaf22969..b13e8edb 100644 --- a/src/main/java/oilinjection/domain/car/K5.java +++ b/src/main/java/oilinjection/domain/car/K5.java @@ -5,7 +5,7 @@ public class K5 extends Car { private static final String CAR_NAME = "K5"; private static final double K5_DISTANCE_PER_LITER = 13D; - public K5(double tripDistance) { + public K5(final double tripDistance) { super(tripDistance); } diff --git a/src/main/java/oilinjection/domain/car/Sonata.java b/src/main/java/oilinjection/domain/car/Sonata.java index 7a424f01..db1f148b 100644 --- a/src/main/java/oilinjection/domain/car/Sonata.java +++ b/src/main/java/oilinjection/domain/car/Sonata.java @@ -5,7 +5,7 @@ public class Sonata extends Car { private static final String CAR_NAME = "Sonata"; private static final double SONATA_DISTANCE_PER_LITER = 10D; - public Sonata(double tripDistance) { + public Sonata(final double tripDistance) { super(tripDistance); } diff --git a/src/main/java/oilinjection/domain/vo/RentInfo.java b/src/main/java/oilinjection/domain/vo/RentInfo.java index 084ba944..19694f5b 100644 --- a/src/main/java/oilinjection/domain/vo/RentInfo.java +++ b/src/main/java/oilinjection/domain/vo/RentInfo.java @@ -7,7 +7,7 @@ public class RentInfo { private final String name; private final double tripDistance; - public RentInfo(String name, double tripDistance) { + public RentInfo(final String name, final double tripDistance) { this.name = name; this.tripDistance = tripDistance; } diff --git a/src/main/java/oilinjection/view/ResultView.java b/src/main/java/oilinjection/view/ResultView.java index 6b387c4b..b83268be 100644 --- a/src/main/java/oilinjection/view/ResultView.java +++ b/src/main/java/oilinjection/view/ResultView.java @@ -2,7 +2,7 @@ public class ResultView { - public static void print(String report) { + public static void print(final String report) { System.out.print(report); } } From 3b5ed7fa17307b4c5335872b163f420df4b624e7 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 00:19:52 +0900 Subject: [PATCH 037/106] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=A0=91=EA=B7=BC=EC=A0=9C=ED=95=9C=EC=9E=90=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - public -> default --- src/main/java/oilinjection/domain/car/Avante.java | 2 +- src/main/java/oilinjection/domain/car/K5.java | 2 +- src/main/java/oilinjection/domain/car/Sonata.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/oilinjection/domain/car/Avante.java b/src/main/java/oilinjection/domain/car/Avante.java index e30c43c0..e1f1bf24 100644 --- a/src/main/java/oilinjection/domain/car/Avante.java +++ b/src/main/java/oilinjection/domain/car/Avante.java @@ -10,7 +10,7 @@ public Avante(final double tripDistance) { } @Override - public double getDistancePerLiter() { + double getDistancePerLiter() { return AVANTE_DISTANCE_PER_LITER; } diff --git a/src/main/java/oilinjection/domain/car/K5.java b/src/main/java/oilinjection/domain/car/K5.java index b13e8edb..92bb4124 100644 --- a/src/main/java/oilinjection/domain/car/K5.java +++ b/src/main/java/oilinjection/domain/car/K5.java @@ -10,7 +10,7 @@ public K5(final double tripDistance) { } @Override - public double getDistancePerLiter() { + double getDistancePerLiter() { return K5_DISTANCE_PER_LITER; } diff --git a/src/main/java/oilinjection/domain/car/Sonata.java b/src/main/java/oilinjection/domain/car/Sonata.java index db1f148b..82d60e5b 100644 --- a/src/main/java/oilinjection/domain/car/Sonata.java +++ b/src/main/java/oilinjection/domain/car/Sonata.java @@ -10,7 +10,7 @@ public Sonata(final double tripDistance) { } @Override - public double getDistancePerLiter() { + double getDistancePerLiter() { return SONATA_DISTANCE_PER_LITER; } From 75db369ba6ba72d5ea315b63f29a3215f722c897 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 00:25:42 +0900 Subject: [PATCH 038/106] =?UTF-8?q?refactor:=20name=20->=20type=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/oilinjection/domain/RentCar.java | 11 ++++++----- .../java/oilinjection/domain/RentCompany.java | 16 ++++++++-------- .../java/oilinjection/domain/car/Avante.java | 6 +++--- src/main/java/oilinjection/domain/car/Car.java | 2 +- src/main/java/oilinjection/domain/car/K5.java | 6 +++--- .../java/oilinjection/domain/car/Sonata.java | 6 +++--- .../java/oilinjection/domain/vo/RentInfo.java | 14 +++++++------- src/main/java/oilinjection/util/Parser.java | 6 +++--- src/main/java/oilinjection/view/InputView.java | 2 +- .../java/oilinjection/domain/RentCarTest.java | 6 +++--- src/test/java/oilinjection/util/ParserTest.java | 8 ++++---- 11 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/main/java/oilinjection/domain/RentCar.java b/src/main/java/oilinjection/domain/RentCar.java index 1d507c24..2a58880c 100644 --- a/src/main/java/oilinjection/domain/RentCar.java +++ b/src/main/java/oilinjection/domain/RentCar.java @@ -15,21 +15,22 @@ public enum RentCar { private static final double MIN_TRIP_DISTANCE = 1D; private static final String UNDER_MIN_TRIP_DISTANCE_EXCEPTION_MESSAGE = "[ERROR] 해당하는 차종이 없습니다."; private static final String NOT_FOUND_NAME_EXCEPTION_MESSAGE = "[ERROR] 해당하는 차종이 없습니다."; - private final String name; + + private final String type; private final int quantity; private final Function createCar; - RentCar(final String name, final int quantity, final Function createCar) { - this.name = name; + RentCar(final String type, final int quantity, final Function createCar) { + this.type = type; this.quantity = quantity; this.createCar = createCar; } - public static Car rent(final String name, final double tripDistance) { + public static Car rent(final String type, final double tripDistance) { validateOverMinTripDistance(tripDistance); return Arrays.stream(values()) - .filter(car -> car.name.equals(name.toUpperCase())) + .filter(car -> car.type.equals(type.toUpperCase())) .findAny() .orElseThrow(() -> new IllegalArgumentException(NOT_FOUND_NAME_EXCEPTION_MESSAGE)) .createCar(tripDistance); diff --git a/src/main/java/oilinjection/domain/RentCompany.java b/src/main/java/oilinjection/domain/RentCompany.java index 42ba4397..45e46d2b 100644 --- a/src/main/java/oilinjection/domain/RentCompany.java +++ b/src/main/java/oilinjection/domain/RentCompany.java @@ -22,7 +22,7 @@ public void acceptReservation(final List rentInfos) { validateIsPossibleReservation(rentInfos); final List rentCars = rentInfos.stream() - .map(rentInfo -> RentCar.rent(rentInfo.getName(), rentInfo.getTripDistance())) + .map(rentInfo -> RentCar.rent(rentInfo.getType(), rentInfo.getTripDistance())) .collect(Collectors.toList()); rents.addAll(Collections.unmodifiableList(rentCars)); @@ -30,24 +30,24 @@ public void acceptReservation(final List rentInfos) { private void validateIsPossibleReservation(final List rentInfos) { rentInfos.stream() - .collect(Collectors.groupingBy(RentInfo::getName, Collectors.summingInt(x -> 1))) + .collect(Collectors.groupingBy(RentInfo::getType, Collectors.summingInt(x -> 1))) .forEach(this::validatePerCarType); } - private void validatePerCarType(final String name, final Integer count) { - if (findRentCar(name).isImpossibleReservation(count)) { + private void validatePerCarType(final String type, final Integer count) { + if (findRentCar(type).isImpossibleReservation(count)) { throw new IllegalArgumentException( - String.format(QUANTITY_OVER_EXCEPTION_MESSAGE_FORMAT, name)); + String.format(QUANTITY_OVER_EXCEPTION_MESSAGE_FORMAT, type)); } } - private RentCar findRentCar(final String name) { - return RentCar.valueOf(name.toUpperCase()); + private RentCar findRentCar(final String type) { + return RentCar.valueOf(type.toUpperCase()); } public String createReport() { StringBuilder report = new StringBuilder(); - rents.forEach(car -> report.append(String.format(REPORT_FORMAT, car.getName(), car.getChargeQuantity()))); + rents.forEach(car -> report.append(String.format(REPORT_FORMAT, car.getType(), car.getChargeQuantity()))); return report.toString(); } diff --git a/src/main/java/oilinjection/domain/car/Avante.java b/src/main/java/oilinjection/domain/car/Avante.java index e1f1bf24..c812ef46 100644 --- a/src/main/java/oilinjection/domain/car/Avante.java +++ b/src/main/java/oilinjection/domain/car/Avante.java @@ -2,7 +2,7 @@ public class Avante extends Car { - private static final String CAR_NAME = "Avante"; + private static final String CAR_TYPE = "Avante"; private static final double AVANTE_DISTANCE_PER_LITER = 15D; public Avante(final double tripDistance) { @@ -15,7 +15,7 @@ public Avante(final double tripDistance) { } @Override - public String getName() { - return CAR_NAME; + public String getType() { + return CAR_TYPE; } } diff --git a/src/main/java/oilinjection/domain/car/Car.java b/src/main/java/oilinjection/domain/car/Car.java index b95dfb4a..a23e5baa 100644 --- a/src/main/java/oilinjection/domain/car/Car.java +++ b/src/main/java/oilinjection/domain/car/Car.java @@ -12,7 +12,7 @@ public abstract class Car { abstract double getDistancePerLiter(); - public abstract String getName(); + public abstract String getType(); double getTripDistance() { return this.tripDistance; diff --git a/src/main/java/oilinjection/domain/car/K5.java b/src/main/java/oilinjection/domain/car/K5.java index 92bb4124..1e0ab90f 100644 --- a/src/main/java/oilinjection/domain/car/K5.java +++ b/src/main/java/oilinjection/domain/car/K5.java @@ -2,7 +2,7 @@ public class K5 extends Car { - private static final String CAR_NAME = "K5"; + private static final String CAR_TYPE = "K5"; private static final double K5_DISTANCE_PER_LITER = 13D; public K5(final double tripDistance) { @@ -15,7 +15,7 @@ public K5(final double tripDistance) { } @Override - public String getName() { - return CAR_NAME; + public String getType() { + return CAR_TYPE; } } diff --git a/src/main/java/oilinjection/domain/car/Sonata.java b/src/main/java/oilinjection/domain/car/Sonata.java index 82d60e5b..e08a411e 100644 --- a/src/main/java/oilinjection/domain/car/Sonata.java +++ b/src/main/java/oilinjection/domain/car/Sonata.java @@ -2,7 +2,7 @@ public class Sonata extends Car { - private static final String CAR_NAME = "Sonata"; + private static final String CAR_TYPE = "Sonata"; private static final double SONATA_DISTANCE_PER_LITER = 10D; public Sonata(final double tripDistance) { @@ -15,7 +15,7 @@ public Sonata(final double tripDistance) { } @Override - public String getName() { - return CAR_NAME; + public String getType() { + return CAR_TYPE; } } diff --git a/src/main/java/oilinjection/domain/vo/RentInfo.java b/src/main/java/oilinjection/domain/vo/RentInfo.java index 19694f5b..6aa69431 100644 --- a/src/main/java/oilinjection/domain/vo/RentInfo.java +++ b/src/main/java/oilinjection/domain/vo/RentInfo.java @@ -4,16 +4,16 @@ public class RentInfo { - private final String name; + private final String type; private final double tripDistance; - public RentInfo(final String name, final double tripDistance) { - this.name = name; + public RentInfo(final String type, final double tripDistance) { + this.type = type; this.tripDistance = tripDistance; } - public String getName() { - return name; + public String getType() { + return type; } public double getTripDistance() { @@ -30,11 +30,11 @@ public boolean equals(Object o) { } RentInfo rent = (RentInfo) o; return Double.compare(rent.tripDistance, tripDistance) == 0 - && Objects.equals(name, rent.name); + && Objects.equals(type, rent.type); } @Override public int hashCode() { - return Objects.hash(name, tripDistance); + return Objects.hash(type, tripDistance); } } diff --git a/src/main/java/oilinjection/util/Parser.java b/src/main/java/oilinjection/util/Parser.java index 3762c409..7f94f08b 100644 --- a/src/main/java/oilinjection/util/Parser.java +++ b/src/main/java/oilinjection/util/Parser.java @@ -10,10 +10,10 @@ public class Parser { private static final String RESERVATION_DELIMITER = ","; private static final String INFO_DELIMITER = ":"; - private static final int NAME = 0; + private static final int TYPE = 0; private static final int TRIP_DISTANCE = 1; private static final String INPUT_FORMAT_REGEX = "[a-zA-z0-9]+:[0-9]+"; - private static final String INVALID_FORMAT_EXCEPTION_MESSAGE = "[ERROR] 입력 형식이 맞지 않습니다(eg.${carName}:${tripDistance})"; + private static final String INVALID_FORMAT_EXCEPTION_MESSAGE = "[ERROR] 입력 형식이 맞지 않습니다(eg.${carType}:${tripDistance})"; public static List parse(final String input) { @@ -24,7 +24,7 @@ public static List parse(final String input) { .map(rent -> { validateInfoFormat(rent); final String[] split = rent.split(INFO_DELIMITER); - return new RentInfo(split[NAME], Double.parseDouble(split[TRIP_DISTANCE])); + return new RentInfo(split[TYPE], Double.parseDouble(split[TRIP_DISTANCE])); }) .collect(Collectors.toList())); } diff --git a/src/main/java/oilinjection/view/InputView.java b/src/main/java/oilinjection/view/InputView.java index 535ba453..7108845f 100644 --- a/src/main/java/oilinjection/view/InputView.java +++ b/src/main/java/oilinjection/view/InputView.java @@ -5,7 +5,7 @@ public class InputView { private static final Scanner SCANNER = new Scanner(System.in); - private static final String RESERVATION_INFO_INPUT_MESSAGE = "대여할 자동차와 예상 거리를 입력해 주세요. (eg. carName1:distance, carName2:distance)"; + private static final String RESERVATION_INFO_INPUT_MESSAGE = "대여할 자동차와 예상 거리를 입력해 주세요. (eg. carType1:distance, carType2:distance)"; private static final String ALL_SPACE = "\\s+"; private static final String EMPTY_STRING = ""; diff --git a/src/test/java/oilinjection/domain/RentCarTest.java b/src/test/java/oilinjection/domain/RentCarTest.java index 1df9add8..9a3a7efa 100644 --- a/src/test/java/oilinjection/domain/RentCarTest.java +++ b/src/test/java/oilinjection/domain/RentCarTest.java @@ -35,9 +35,9 @@ public class RentCarTest { assertThat(sonata).isEqualTo(new Sonata(200D)); } - @DisplayName("해당하는 이름이 없으면 예외를 발생시킨다.") + @DisplayName("해당하는 차종이 없으면 예외를 발생시킨다.") @Test - void 이름_없음() { + void 차종_없음() { assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> RentCar.rent("none", 10D)); } @@ -49,7 +49,7 @@ public class RentCarTest { .isThrownBy(() -> RentCar.rent("avante", 0D)); } - @DisplayName("자동차의 이름은 대소문자를 구분하지 않는다.") + @DisplayName("자동차의 차종은 대소문자를 구분하지 않는다.") @ValueSource(strings = {"Sonata", "sOnAtA", "SONATA"}) @ParameterizedTest void 소나타_대소문자_구분없이_생성(final String name) { diff --git a/src/test/java/oilinjection/util/ParserTest.java b/src/test/java/oilinjection/util/ParserTest.java index 700438c1..b1826534 100644 --- a/src/test/java/oilinjection/util/ParserTest.java +++ b/src/test/java/oilinjection/util/ParserTest.java @@ -17,16 +17,16 @@ class ParserTest { @DisplayName("올바른 입력이 들어오면, 정상적으로 실행된다.") @Test void 정상_입력1() { - final String input = "carName1:200"; - final RentInfo rent = new RentInfo("carName1", 200); + final String input = "car1:200"; + final RentInfo rent = new RentInfo("car1", 200); assertThat(Parser.parse(input)).isEqualTo(Arrays.asList(rent)); } @DisplayName("두 개 이상의 rent 정보가 올바른 입력 형식으로 들어와도 정상적으로 실행된다.") @Test void 정상_입력2() { - final String input = "carName1:200,carName2:300"; - final List rents = Arrays.asList(new RentInfo("carName1", 200), new RentInfo("carName2", 300)); + final String input = "car1:200,car2:300"; + final List rents = Arrays.asList(new RentInfo("car1", 200), new RentInfo("car2", 300)); assertThat(Parser.parse(input)).isEqualTo(rents); } From 4d32352fc4ded28333cb877940dbf347c7667253 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 17:28:27 +0900 Subject: [PATCH 039/106] =?UTF-8?q?refactor:=20Integer=20->=20int=EB=A1=9C?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/oilinjection/domain/RentCar.java | 2 +- src/main/java/oilinjection/domain/RentCompany.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/oilinjection/domain/RentCar.java b/src/main/java/oilinjection/domain/RentCar.java index 2a58880c..7d491c11 100644 --- a/src/main/java/oilinjection/domain/RentCar.java +++ b/src/main/java/oilinjection/domain/RentCar.java @@ -46,7 +46,7 @@ private Car createCar(final double tripDistance) { return this.createCar.apply(tripDistance); } - public boolean isImpossibleReservation(final Integer count) { + public boolean isImpossibleReservation(final int count) { return count > this.quantity; } } diff --git a/src/main/java/oilinjection/domain/RentCompany.java b/src/main/java/oilinjection/domain/RentCompany.java index 45e46d2b..e21c939b 100644 --- a/src/main/java/oilinjection/domain/RentCompany.java +++ b/src/main/java/oilinjection/domain/RentCompany.java @@ -34,7 +34,7 @@ private void validateIsPossibleReservation(final List rentInfos) { .forEach(this::validatePerCarType); } - private void validatePerCarType(final String type, final Integer count) { + private void validatePerCarType(final String type, final int count) { if (findRentCar(type).isImpossibleReservation(count)) { throw new IllegalArgumentException( String.format(QUANTITY_OVER_EXCEPTION_MESSAGE_FORMAT, type)); From 0d0c16c43942c4c804dc47457dcc15a6d490eea1 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 17:29:24 +0900 Subject: [PATCH 040/106] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. rent로 추출 --- src/main/java/oilinjection/domain/RentCompany.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/oilinjection/domain/RentCompany.java b/src/main/java/oilinjection/domain/RentCompany.java index e21c939b..2b5b34b0 100644 --- a/src/main/java/oilinjection/domain/RentCompany.java +++ b/src/main/java/oilinjection/domain/RentCompany.java @@ -22,12 +22,16 @@ public void acceptReservation(final List rentInfos) { validateIsPossibleReservation(rentInfos); final List rentCars = rentInfos.stream() - .map(rentInfo -> RentCar.rent(rentInfo.getType(), rentInfo.getTripDistance())) + .map(this::rent) .collect(Collectors.toList()); rents.addAll(Collections.unmodifiableList(rentCars)); } + private Car rent(RentInfo rentInfo) { + return RentCar.rent(rentInfo.getType(), rentInfo.getTripDistance()); + } + private void validateIsPossibleReservation(final List rentInfos) { rentInfos.stream() .collect(Collectors.groupingBy(RentInfo::getType, Collectors.summingInt(x -> 1))) @@ -47,8 +51,9 @@ private RentCar findRentCar(final String type) { public String createReport() { StringBuilder report = new StringBuilder(); - rents.forEach(car -> report.append(String.format(REPORT_FORMAT, car.getType(), car.getChargeQuantity()))); - return report.toString(); + rents.forEach(car -> report.append( + String.format(REPORT_FORMAT, car.getType(), car.getChargeQuantity()))); + return report.toString(); } } From 06ea5cd35a86ef1d57b03bdc4681265ea4b65b72 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 17:29:56 +0900 Subject: [PATCH 041/106] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - createRentInfo 로 추출 --- src/main/java/oilinjection/util/Parser.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/oilinjection/util/Parser.java b/src/main/java/oilinjection/util/Parser.java index 7f94f08b..5829ea8a 100644 --- a/src/main/java/oilinjection/util/Parser.java +++ b/src/main/java/oilinjection/util/Parser.java @@ -17,14 +17,13 @@ public class Parser { public static List parse(final String input) { - final String[] rentInfo = input.split(RESERVATION_DELIMITER); + final String[] rentInfos = input.split(RESERVATION_DELIMITER); return Collections.unmodifiableList( - Arrays.stream(rentInfo) - .map(rent -> { - validateInfoFormat(rent); - final String[] split = rent.split(INFO_DELIMITER); - return new RentInfo(split[TYPE], Double.parseDouble(split[TRIP_DISTANCE])); + Arrays.stream(rentInfos) + .map(rentInfo -> { + validateInfoFormat(rentInfo); + return createRentInfo(rentInfo); }) .collect(Collectors.toList())); } @@ -34,4 +33,9 @@ private static void validateInfoFormat(final String rent) { throw new IllegalArgumentException(INVALID_FORMAT_EXCEPTION_MESSAGE); } } + + private static RentInfo createRentInfo(final String rentInfo) { + final String[] split = rentInfo.split(INFO_DELIMITER); + return new RentInfo(split[TYPE], Double.parseDouble(split[TRIP_DISTANCE])); + } } From e1c079b944a3ca15a372beb91165acd6a0e18b4c Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 21:03:37 +0900 Subject: [PATCH 042/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EC=9D=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputView - Deck - Game - Result - Participant - Player - Dealer - OutputView --- README.md | 89 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index b8e2054b..dc330c37 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# java-blackjack - -# java-blackjack +# 📌 연료 주입 ## 기능 요구 사항 우리 회사는 렌터카를 운영하고 있다. @@ -19,26 +17,83 @@ - [x] 입력 (e.g. carName1:distance, carName2:distance) - [x] 문자 사이에 불필요한 공백을 제거한다. -- [x] 파서 - - [x] 자동차는 `,` 로 구분한다 +- [x] 파서 - Parser + - [x] 자동차는 `,` 로 구분한다. - [x] 자동차의 이름과 속력은 `:` 로 구분한다. - [x] 검증 - [x] 빈 값이 들어올 수 없다. - [x] 이름이나 거리에 빈 값이 들어올 수 없다. - [x] 입력 형식에 맞는지 확인한다. -- [ ] 렌터카 회사 - - [ ] 자동차 객체를 받아 렌터카 리스트에 추가한다. - addCar(Car car) - - [ ] 보유한 렌터카의 수를 넘지 않는다. - - [ ] 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성한다. +- [x] 렌터카 회사 - RentCompany + - [x] 자동차 객체를 받아 예약을 승인한다. - acceptReservation(List rentInfos) + - [x] 보유한 렌터카의 수를 넘지 않는다. - validateOverMinTripDistance + - [x] 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성한다. - createReport -- [ ] 자동차 - abstract - - [x] 주입해야 할 연료량을 구한다. - - [x] 검증 - - [x] 거리는 1 이상이어야 한다. +- [x] 자동차 - abstract + - [x] 주입해야 할 연료량을 구한다. - getChargeQuantity + +- [x] 렌트카 -RentCar + - [x] 여행 거리와 타입을 받아 Car 객체 생성. + - [x] 검증 + - [x] 자동차 이름 확인(대소문자 구분 X) + - [x] 거리는 1 이상이어야 한다. + +- [x] 출력 + - [x] 생성한 보고서 출력. + + +# 📌 블랙잭 + +## 기능 요구 사항 +블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 `딜러`와 `플레이어` 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + +카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 `Ace는 1 또는 11`로 계산한다. +- King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받는다. +- 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. +- 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +- 게임을 완료한 후 각 플레이어별로 승패를 출력한다. + +- 카드 : 스페이드, 클로버, 하트, 다이아 1~10, JQK + +## 구현 사항. + +- [ ] InputView + - [ ] 플레이어의 이름을 받는다. (`,`로 구분) + - [ ] 입력 형식에 맞는지 확인한다. + - [ ] 카드를 받을 지에 대한 여부 입력 (`y`, `n`으로 구분) + - [ ] 'y' 와 'n'이 아닐 경우 exception이 발생한다. + +- [ ] Deck + - Cards(set: pattern, number) + - [ ] 카드 뽑기 - draw + - 카드 제거 - Cards without(Card card) + +- [ ] Game + - [ ] 카드 분배 + +- [ ] Result + - [ ] 결과 구하기 + - [ ] 승패 구하기 + +- [ ] abstract Participant (딜러, 플레이어) + - [ ] 자신의 패를 가진다. + - [ ] 카드패의 합산을 구한다. (구현) + - [ ] 카드를 더 받을 수 있는지. + +- [ ] Player extends Participant + - [ ] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 21을 초과하면 턴을 종료한다. -- [x] 자동차 팩토리 - - [x] 자동차 이름 검증(대소문자 구분 X) +- [ ] Players + - [ ] 플레이어들 -- [ ] 출력 - - [ ] 생성한 보고서 출력 \ No newline at end of file +- [ ] Dealer extends Participant + - [ ] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 16을 초과하면 턴을 종료한다. + +- [ ] OutputView + - 참가자 패 + - 참가자 최종 결과 + - 참가자 최종 승패 + - 참가자 카드 분배 + - 딜러는 16이하라 한장의 카드를 더 받았습니다. From 50dfc6669a181a843cdbcf65de4a20d371c3c0b6 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 21:17:11 +0900 Subject: [PATCH 043/106] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EC=97=90=20?= =?UTF-8?q?=EA=B4=80=ED=95=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=20InputView=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 1. 플레이어 이름 입력 2. 추가로 카드를 받을 지에 대한 여부 입력 --- src/main/java/blackjack/view/InputView.java | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/blackjack/view/InputView.java diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..b0862911 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,24 @@ +package blackjack.view; + +import java.util.Scanner; + +public class InputView { + + private static final String PLAYERS_INPUT_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; + private static final String DRAW_FLAG_INPUT_MESSAGE_FORMAT = "%s. 한장의 카드를 더 받으실건가요?(예는 y, 아니오는 n)%n"; + + public String inputPlayers() { + System.out.println(PLAYERS_INPUT_MESSAGE); + return input(); + } + + public String inputDrawFlag(String name) { + System.out.printf(DRAW_FLAG_INPUT_MESSAGE_FORMAT, name); + return input(); + } + + private String input() { + Scanner scanner = new Scanner(System.in); + return scanner.nextLine().trim(); + } +} From f49f4700f25816f9ab0cbd4679db4f3bede3d0cc Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 21:18:07 +0900 Subject: [PATCH 044/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. InputView 완료 --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dc330c37..18b63c6a 100644 --- a/README.md +++ b/README.md @@ -60,11 +60,13 @@ ## 구현 사항. - [ ] InputView - - [ ] 플레이어의 이름을 받는다. (`,`로 구분) - - [ ] 입력 형식에 맞는지 확인한다. - - [ ] 카드를 받을 지에 대한 여부 입력 (`y`, `n`으로 구분) + - [x] 플레이어의 이름을 받는다. (`,`로 구분) + - [x] 카드를 받을 지에 대한 여부 입력 (`y`, `n`으로 구분) - [ ] 'y' 와 'n'이 아닐 경우 exception이 발생한다. +- [ ] Parser + - [ ] 플레이어 이름 입력 형식에 맞는지 확인한다. + - [ ] Deck - Cards(set: pattern, number) - [ ] 카드 뽑기 - draw From 410e1531041b7e08f8f53ef1473bca29308d55d7 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 22:33:02 +0900 Subject: [PATCH 045/106] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20=ED=8C=8C=EC=8B=B1=ED=95=B4=EC=A3=BC=EB=8A=94=20Par?= =?UTF-8?q?ser=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 --- src/main/java/blackjack/util/Parser.java | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/blackjack/util/Parser.java diff --git a/src/main/java/blackjack/util/Parser.java b/src/main/java/blackjack/util/Parser.java new file mode 100644 index 00000000..ee9af0d5 --- /dev/null +++ b/src/main/java/blackjack/util/Parser.java @@ -0,0 +1,30 @@ +package blackjack.util; + +import java.util.Arrays; +import java.util.List; +import java.util.function.BooleanSupplier; +import java.util.stream.Collectors; + +public class Parser { + + private static final String NAME_SPLIT_REGEX = ","; + private static final String EMPTY_NAME_EXCEPTION_MESSAGE = "[ERROR] 플레이어의 이름을 빈 값으로 지정할 수 없습니다."; + + public static List parse(final String input) { + checkNameIsEmpty(() -> input.endsWith(NAME_SPLIT_REGEX)); + + return Arrays.stream(input.split(NAME_SPLIT_REGEX)) + .map(name -> { + final String trimName = name.trim(); + checkNameIsEmpty(trimName::isEmpty); + return trimName; + }) + .collect(Collectors.toList()); + } + + private static void checkNameIsEmpty(final BooleanSupplier condition) { + if (condition.getAsBoolean()) { + throw new IllegalArgumentException(EMPTY_NAME_EXCEPTION_MESSAGE); + } + } +} From 619bcb23877418e409ec88a78d7c878e20459731 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 22:34:31 +0900 Subject: [PATCH 046/106] =?UTF-8?q?test:=20Parser=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=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 1. 정상적인 입력의 경우 플레이어 이름들 반환 2. 플레이어의 이름이 하나라도 빈 값일 경우 예외 발생 --- src/test/java/blackjack/util/ParserTest.java | 29 ++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/test/java/blackjack/util/ParserTest.java diff --git a/src/test/java/blackjack/util/ParserTest.java b/src/test/java/blackjack/util/ParserTest.java new file mode 100644 index 00000000..52a68393 --- /dev/null +++ b/src/test/java/blackjack/util/ParserTest.java @@ -0,0 +1,29 @@ +package blackjack.util; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class ParserTest { + + @DisplayName("플레이어의 이름을 정상적으로 반환한다.") + @Test + void Given유효한값_When파싱_Then이름_반환() { + List names = Parser.parse(" json, pobi "); + assertThat(names).isEqualTo(Arrays.asList("json","pobi")); + } + + @DisplayName("플레이어의 이름이 하나라도 빈 값이면 예외를 발생시칸다.") + @ValueSource(strings = {"kim, ,jun", "", ",", " , ", "kim,", ",kim", ",,kim", "kim,,", "kim, ,"}) + @ParameterizedTest + void Given빈_값_When파싱_Then예외_발생(String input) { + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> Parser.parse(input)); + } +} \ No newline at end of file From 4ca64b4cbedcb89af1ee8e1753d59d308f5d8139 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 22:35:30 +0900 Subject: [PATCH 047/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 18b63c6a..5fa602b8 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,8 @@ - [x] 카드를 받을 지에 대한 여부 입력 (`y`, `n`으로 구분) - [ ] 'y' 와 'n'이 아닐 경우 exception이 발생한다. -- [ ] Parser - - [ ] 플레이어 이름 입력 형식에 맞는지 확인한다. +- [x] Parser + - [x] 플레이어 이름이 비어있는지 확인한다. - [ ] Deck - Cards(set: pattern, number) From 4e3d897363a188d62de0164751cfbb269ef284de Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 23:21:57 +0900 Subject: [PATCH 048/106] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=AC=B8?= =?UTF-8?q?=EC=96=91=20=ED=81=B4=EB=9E=98=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 --- .../java/blackjack/domain/card/Pattern.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Pattern.java diff --git a/src/main/java/blackjack/domain/card/Pattern.java b/src/main/java/blackjack/domain/card/Pattern.java new file mode 100644 index 00000000..e3f4c4f8 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Pattern.java @@ -0,0 +1,18 @@ +package blackjack.domain.card; + +enum Pattern { + SPADE("스페이드"), + CLUB("클로버"), + HEART("하트"), + DIAMOND("다이아몬드"); + + private final String name; + + Pattern(final String name) { + this.name = name; + } + + public String getName() { + return name; + } +} From 7591931b4bc845631123de11fb85d860448a6771 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 23:22:59 +0900 Subject: [PATCH 049/106] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=AA=85?= =?UTF-8?q?=EC=B9=AD=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 --- .../blackjack/domain/card/Denomination.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Denomination.java diff --git a/src/main/java/blackjack/domain/card/Denomination.java b/src/main/java/blackjack/domain/card/Denomination.java new file mode 100644 index 00000000..bb49cf09 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Denomination.java @@ -0,0 +1,20 @@ +package blackjack.domain.card; + +public enum Denomination { + + ACE("A", 11), TWO("2", 2), THREE("3", 3), FOUR("4", 4), FIVE("5", 5), + SIX("6", 6), SEVEN("7", 7), EIGHT("7", 8), NINE("9", 9), TEN("10", 10), + JACK("J", 10), QUEEN("Q", 10), KING("K", 10); + + private final String name; + private final int value; + + Denomination(String name, int value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } +} From 64005c1305a139878877dc564f1e9ca519a993c6 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 23:25:28 +0900 Subject: [PATCH 050/106] =?UTF-8?q?feat:=20Card=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=20=EC=A2=85=EB=A5=98=EC=9D=B4=EB=A6=84=20=EB=B0=98=ED=99=98=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 - eg. 7스페이드 --- src/main/java/blackjack/domain/card/Card.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Card.java diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java new file mode 100644 index 00000000..46e86352 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Card.java @@ -0,0 +1,15 @@ +package blackjack.domain.card; + +public class Card { + private final Pattern pattern; + private final Denomination denomination; + + public Card(final Pattern pattern, final Denomination denomination) { + this.pattern = pattern; + this.denomination = denomination; + } + + public String getName() { + return denomination.getName() + pattern.getName(); + } +} From 2ec0076e922ea8d4113d467ea9036d743caa591b Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 23:27:37 +0900 Subject: [PATCH 051/106] =?UTF-8?q?test:=20Card=20=EC=A2=85=EB=A5=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=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/java/blackjack/domain/card/CardTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/java/blackjack/domain/card/CardTest.java diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java new file mode 100644 index 00000000..b3953a61 --- /dev/null +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -0,0 +1,15 @@ +package blackjack.domain.card; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class CardTest { + + @DisplayName("카드 이름을 반환한다.") + @Test + void When카드이름_얻기_Then이름_반환() { + assertThat(new Card(Pattern.SPADE, Denomination.SEVEN).getName()).isEqualTo("7스페이드"); + } +} From b04ea08eb38cfc88b8d825834407382ae14c7f55 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 23:34:27 +0900 Subject: [PATCH 052/106] =?UTF-8?q?test:=20=EC=9E=90=EC=8B=A0=EC=9D=B4=20A?= =?UTF-8?q?CE=EC=9D=B8=EC=A7=80=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=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/java/blackjack/domain/card/CardTest.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index b3953a61..7b7120d4 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -12,4 +12,16 @@ class CardTest { void When카드이름_얻기_Then이름_반환() { assertThat(new Card(Pattern.SPADE, Denomination.SEVEN).getName()).isEqualTo("7스페이드"); } -} + + @DisplayName("ACE이면 true 반환한다.") + @Test + void Given에이스_When판단_Then참 () { + assertThat(new Card(Pattern.SPADE, Denomination.ACE).isAce()).isTrue(); + } + + @DisplayName("ACE가 아니면 false를 반환한다.") + @Test + void Given에이스_이외의_카드_When판단_Then거짓 () { + assertThat(new Card(Pattern.SPADE, Denomination.KING).isAce()).isFalse(); + } +} \ No newline at end of file From b7dd06d659f06148bdfa11eb63c7e9c5dfe2160c Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 23:36:32 +0900 Subject: [PATCH 053/106] =?UTF-8?q?feat:=20=EC=9E=90=EC=8B=A0=EC=9D=B4=20A?= =?UTF-8?q?CE=EC=9D=B8=EC=A7=80=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 46e86352..3d61c3c5 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -12,4 +12,8 @@ public Card(final Pattern pattern, final Denomination denomination) { public String getName() { return denomination.getName() + pattern.getName(); } + + public boolean isAce() { + return this.denomination == Denomination.ACE; + } } From 10cb842096db61407283f8534b356fa61a20b674 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 23:44:58 +0900 Subject: [PATCH 054/106] =?UTF-8?q?rename:=20Denomination=20->=20Rank?= =?UTF-8?q?=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 10 +++++----- .../domain/card/{Denomination.java => Rank.java} | 4 ++-- src/test/java/blackjack/domain/card/CardTest.java | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/blackjack/domain/card/{Denomination.java => Rank.java} (85%) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 3d61c3c5..4167a84f 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -2,18 +2,18 @@ public class Card { private final Pattern pattern; - private final Denomination denomination; + private final Rank rank; - public Card(final Pattern pattern, final Denomination denomination) { + public Card(final Pattern pattern, final Rank rank) { this.pattern = pattern; - this.denomination = denomination; + this.rank = rank; } public String getName() { - return denomination.getName() + pattern.getName(); + return rank.getName() + pattern.getName(); } public boolean isAce() { - return this.denomination == Denomination.ACE; + return this.rank == Rank.ACE; } } diff --git a/src/main/java/blackjack/domain/card/Denomination.java b/src/main/java/blackjack/domain/card/Rank.java similarity index 85% rename from src/main/java/blackjack/domain/card/Denomination.java rename to src/main/java/blackjack/domain/card/Rank.java index bb49cf09..4d84f43e 100644 --- a/src/main/java/blackjack/domain/card/Denomination.java +++ b/src/main/java/blackjack/domain/card/Rank.java @@ -1,6 +1,6 @@ package blackjack.domain.card; -public enum Denomination { +public enum Rank { ACE("A", 11), TWO("2", 2), THREE("3", 3), FOUR("4", 4), FIVE("5", 5), SIX("6", 6), SEVEN("7", 7), EIGHT("7", 8), NINE("9", 9), TEN("10", 10), @@ -9,7 +9,7 @@ public enum Denomination { private final String name; private final int value; - Denomination(String name, int value) { + Rank(String name, int value) { this.name = name; this.value = value; } diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index 7b7120d4..33e5fe06 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -10,18 +10,18 @@ class CardTest { @DisplayName("카드 이름을 반환한다.") @Test void When카드이름_얻기_Then이름_반환() { - assertThat(new Card(Pattern.SPADE, Denomination.SEVEN).getName()).isEqualTo("7스페이드"); + assertThat(new Card(Pattern.SPADE, Rank.SEVEN).getName()).isEqualTo("7스페이드"); } @DisplayName("ACE이면 true 반환한다.") @Test void Given에이스_When판단_Then참 () { - assertThat(new Card(Pattern.SPADE, Denomination.ACE).isAce()).isTrue(); + assertThat(new Card(Pattern.SPADE, Rank.ACE).isAce()).isTrue(); } @DisplayName("ACE가 아니면 false를 반환한다.") @Test void Given에이스_이외의_카드_When판단_Then거짓 () { - assertThat(new Card(Pattern.SPADE, Denomination.KING).isAce()).isFalse(); + assertThat(new Card(Pattern.SPADE, Rank.KING).isAce()).isFalse(); } } \ No newline at end of file From 3a2e8b1f0bc748b0df951701e920d24dff09d01e Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Tue, 15 Feb 2022 23:45:15 +0900 Subject: [PATCH 055/106] docs: update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Card 구현 사항 추가. - number - > rank로 변경. --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5fa602b8..735ab4fc 100644 --- a/README.md +++ b/README.md @@ -67,11 +67,16 @@ - [x] Parser - [x] 플레이어 이름이 비어있는지 확인한다. + - [ ] Deck - - Cards(set: pattern, number) + - Cards(set: pattern, rank) - [ ] 카드 뽑기 - draw - 카드 제거 - Cards without(Card card) +- [x] Card + - [x] ACE 인지 확인. + - [x] 이름(patter + rank) + - [ ] Game - [ ] 카드 분배 From 12a2fffbf995e6e0b71c7a115fd9757f3a677902 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 01:56:04 +0900 Subject: [PATCH 056/106] =?UTF-8?q?refactor:=20final=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Rank.java | 2 +- src/test/java/blackjack/util/ParserTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Rank.java b/src/main/java/blackjack/domain/card/Rank.java index 4d84f43e..5c514698 100644 --- a/src/main/java/blackjack/domain/card/Rank.java +++ b/src/main/java/blackjack/domain/card/Rank.java @@ -9,7 +9,7 @@ public enum Rank { private final String name; private final int value; - Rank(String name, int value) { + Rank(final String name, final int value) { this.name = name; this.value = value; } diff --git a/src/test/java/blackjack/util/ParserTest.java b/src/test/java/blackjack/util/ParserTest.java index 52a68393..4c1366c4 100644 --- a/src/test/java/blackjack/util/ParserTest.java +++ b/src/test/java/blackjack/util/ParserTest.java @@ -15,7 +15,7 @@ class ParserTest { @DisplayName("플레이어의 이름을 정상적으로 반환한다.") @Test void Given유효한값_When파싱_Then이름_반환() { - List names = Parser.parse(" json, pobi "); + final List names = Parser.parse(" json, pobi "); assertThat(names).isEqualTo(Arrays.asList("json","pobi")); } From 9cc57ae227da647ca61a41b10275927ed00d286b Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 01:58:22 +0900 Subject: [PATCH 057/106] =?UTF-8?q?refactor:=20public=20->=20protected=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=A0=9C=ED=95=9C=EC=9E=90=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 4167a84f..a8c53d7d 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -4,7 +4,7 @@ public class Card { private final Pattern pattern; private final Rank rank; - public Card(final Pattern pattern, final Rank rank) { + protected Card(final Pattern pattern, final Rank rank) { this.pattern = pattern; this.rank = rank; } From 700860017309cd5a1daa296a1835292db962c681 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 01:58:43 +0900 Subject: [PATCH 058/106] =?UTF-8?q?feat:=20equals=20&=20hashcode=20?= =?UTF-8?q?=EC=9E=AC=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index a8c53d7d..3e457430 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -1,5 +1,7 @@ package blackjack.domain.card; +import java.util.Objects; + public class Card { private final Pattern pattern; private final Rank rank; @@ -16,4 +18,21 @@ public String getName() { public boolean isAce() { return this.rank == Rank.ACE; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Card card = (Card) o; + return pattern == card.pattern && rank == card.rank; + } + + @Override + public int hashCode() { + return Objects.hash(pattern, rank); + } } From de8b29894cc47514df975a027a9c0955bb4851ca Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 02:01:05 +0900 Subject: [PATCH 059/106] =?UTF-8?q?feat:=20Cards=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 전체 트럼프 카드 초기화하는 로직 구현 2. 카드 한 장을 뽑아 반환하는 로직 구현 3. 덱이 비었는지 검증 로직 구현 4. 카드 한 장 제거된 Cards 반환하는 로직 구현 --- .../java/blackjack/domain/card/Cards.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Cards.java diff --git a/src/main/java/blackjack/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java new file mode 100644 index 00000000..2d18903b --- /dev/null +++ b/src/main/java/blackjack/domain/card/Cards.java @@ -0,0 +1,49 @@ +package blackjack.domain.card; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class Cards { + + private static final String EMPTY_DECK_EXCEPTION_MESSAGE = "[ERROR] 덱에 남은 카드가 없습니다."; + private static final int SELECTED_CARD = 0; + + private final List cards; + + protected Cards(final List cards) { + this.cards = new ArrayList<>(cards); + } + + private Cards() { + this.cards = Arrays.stream(Pattern.values()) + .flatMap(pattern -> + Arrays.stream(Rank.values()) + .map(rank -> new Card(pattern, rank)) + .collect(Collectors.toList()).stream()) + .collect(Collectors.toList()); + } + + protected static Cards create() { + return new Cards(); + } + + protected Card drawOne() { + validateIsEmpty(); + Collections.shuffle(cards); + return cards.get(SELECTED_CARD); + } + + private void validateIsEmpty() { + if (cards.isEmpty()) { + throw new IllegalArgumentException(EMPTY_DECK_EXCEPTION_MESSAGE); + } + } + + protected Cards without(final Card card) { + cards.remove(card); + return new Cards(cards); + } +} From dd8c4ccd832100c751c67f5d5e56c866dc28b36b Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 02:02:44 +0900 Subject: [PATCH 060/106] =?UTF-8?q?test:=20Deck=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=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 1. 카드 한 장 뽑아서 확인 2. 남은 카드가 없을 때 예외 발생 3. 모든 트럼프 카드 중복 없이 생성하는지 확인 --- .../java/blackjack/domain/card/DeckTest.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/test/java/blackjack/domain/card/DeckTest.java diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java new file mode 100644 index 00000000..9ef67429 --- /dev/null +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -0,0 +1,68 @@ +package blackjack.domain.card; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DeckTest { + + private Deck sut; + + @BeforeEach + void before() { + sut = new Deck(); + } + + @DisplayName("카드 한장을 뽑는다.") + @Test + void GivenNothing_When카드_뽑기_Then카드() { + // When + final Card card = sut.draw(); + + // Then + assertThat(card).isNotNull(); + } + + @DisplayName("카드를 뽑을때 남은 카드가 없으면 예외를 발생시킨다.") + @Test + void Given빈_덱_When카드_뽑기_Then예외_발생() { + // Given + final List cards = Arrays.stream(Pattern.values()) + .flatMap(pattern -> + Arrays.stream(Rank.values()) + .map(rank -> new Card(pattern, rank)) + .collect(Collectors.toList()).stream()) + .collect(Collectors.toList()); + + for (Card card : cards) { + sut = sut.deduction(card); + } + + // When & Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> sut.draw()); + } + + @DisplayName("카드를 전부 뽑아 덱이 제대로 생성되었는지 확인한다.") + @Test + void GivenNothing_When카드_전부_뽑기_Then중복되지_않은_모든_카드() { + // When + final Set cards = IntStream.range(0, 52).mapToObj(i -> { + Card card = sut.draw(); + sut.deduction(card); + return card; + }) + .collect(Collectors.toSet()); + + // Then + assertThat(cards.size()).isEqualTo(52); + } +} From cfe7011c25f1eb0bce54c14f21bfaa815df3b17b Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 02:03:55 +0900 Subject: [PATCH 061/106] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EA=B0=96=EA=B3=A0=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?Deck=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 전체 카드 초기화 2. 카드 하나 뽑아서 반환 3. 뽑힌 카드 제거 --- src/main/java/blackjack/domain/card/Deck.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Deck.java diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java new file mode 100644 index 00000000..6c5790ed --- /dev/null +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -0,0 +1,22 @@ +package blackjack.domain.card; + +public class Deck { + + private final Cards cards; + + public Deck(final Cards cards) { + this.cards = cards; + } + + public Deck() { + this(Cards.create()); + } + + public Deck deduction(final Card card) { + return new Deck(cards.without(card)); + } + + public Card draw() { + return cards.drawOne(); + } +} From bcc2005f1babdc47d2007d0fdff35fa3954f417a Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 02:07:44 +0900 Subject: [PATCH 062/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Deck 완료 - Cards 완료 --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 735ab4fc..fba5074d 100644 --- a/README.md +++ b/README.md @@ -68,11 +68,17 @@ - [x] 플레이어 이름이 비어있는지 확인한다. -- [ ] Deck +- [x] Deck - Cards(set: pattern, rank) - - [ ] 카드 뽑기 - draw + - [x] 카드 뽑기 - draw - 카드 제거 - Cards without(Card card) - + +- [x] Cards + - [x] Card 생성 + - [x] Card 하나 뽑기 + - [x] 빈 덱이라면 예외 발생 + - [x] 전체 Card에서 한 개의 Card 제거 + - [x] Card - [x] ACE 인지 확인. - [x] 이름(patter + rank) From 91aa5cd05bc2947c2db65885562917c24c2a6b9f Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 02:14:39 +0900 Subject: [PATCH 063/106] =?UTF-8?q?refactor:=20protected=20->=20private=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=A0=91=EA=B7=BC=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Cards.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java index 2d18903b..6506f5dd 100644 --- a/src/main/java/blackjack/domain/card/Cards.java +++ b/src/main/java/blackjack/domain/card/Cards.java @@ -13,7 +13,7 @@ public class Cards { private final List cards; - protected Cards(final List cards) { + private Cards(final List cards) { this.cards = new ArrayList<>(cards); } From 485735fec48b1ab6758ba887bdd7c64766cc30d6 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 02:26:44 +0900 Subject: [PATCH 064/106] =?UTF-8?q?test:=20Cards=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=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/blackjack/domain/card/CardsTest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/test/java/blackjack/domain/card/CardsTest.java diff --git a/src/test/java/blackjack/domain/card/CardsTest.java b/src/test/java/blackjack/domain/card/CardsTest.java new file mode 100644 index 00000000..9ba9597e --- /dev/null +++ b/src/test/java/blackjack/domain/card/CardsTest.java @@ -0,0 +1,69 @@ +package blackjack.domain.card; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class CardsTest { + + private Cards cards; + + @BeforeEach + void before() { + cards = Cards.create(); + } + + // 카드 하나 뽑는 + @DisplayName("카드 한장을 뽑는다.") + @Test + void GivenNothing_When카드_뽑기_Then카드() { + // When + final Card card = cards.drawOne(); + + // Then + assertThat(card).isNotNull(); + } + + // 빈 거 뽑는거 + @DisplayName("빈 카드 목록에서 예외가 발생한다.") + @Test + void GivenNothing_When카드_뽑기_Then예외_발생() { + final List allCards = Arrays.stream(Pattern.values()) + .flatMap(pattern -> + Arrays.stream(Rank.values()) + .map(rank -> new Card(pattern, rank)) + .collect(Collectors.toList()).stream()) + .collect(Collectors.toList()); + + for (Card card : allCards) { + cards.without(card); + } + + // When & Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> cards.drawOne()); + } + + @DisplayName("카드를 전부 뽑아 덱이 제대로 생성되었는지 확인한다.") + @Test + void GivenNothing_When카드_전부_뽑기_Then중복되지_않은_모든_카드() { + // When + final Set allCards = IntStream.range(0, 52).mapToObj(i -> { + Card card = cards.drawOne(); + cards = cards.without(card); + return card; + }) + .collect(Collectors.toSet()); + + // Then + assertThat(allCards.size()).isEqualTo(52); + } +} From 437ca514788cb1d7e6371b4b9565f920753215b0 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 17:38:48 +0900 Subject: [PATCH 065/106] =?UTF-8?q?test:=20Score=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=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 1. 초기 Score 생성 2. 파라미터로 값을 갖는 Score 생성 3. 기존의 값에 파라미터로 넘어온 값을 더한 새로운 Score 생성 --- .../java/blackjack/domain/card/ScoreTest.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/test/java/blackjack/domain/card/ScoreTest.java diff --git a/src/test/java/blackjack/domain/card/ScoreTest.java b/src/test/java/blackjack/domain/card/ScoreTest.java new file mode 100644 index 00000000..9d83989f --- /dev/null +++ b/src/test/java/blackjack/domain/card/ScoreTest.java @@ -0,0 +1,31 @@ +package blackjack.domain.card; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ScoreTest { + + @DisplayName("파라미터로 값이 없으면 초기 Score로 설정한다.") + @Test + void GivenNothing_When객체_생성_Then_초기_값을_가진_객체() { + assertThat(new Score().getValue()).isEqualTo(0); + } + + @DisplayName("값을 받아 객체를 생성한다.") + @Test + void Given값_When객체_생성_Then넘겨받은_값을_가진_객체() { + assertThat(new Score(7).getValue()).isEqualTo(7); + } + + @DisplayName("값을 받아 기존의 값과 더한 객체를 반환한다.") + @Test + void Given값_When객체_생성_Then기존_값과_들어온_값을_가진_객체() { + // Given + final Score score = new Score(1); + + final Score newScore = score.sum(7); + assertThat(newScore.getValue()).isEqualTo(8); + } +} From 76d4db69c4c30ba8094da28e4232786edc11666d Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 17:39:24 +0900 Subject: [PATCH 066/106] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=EB=93=A4?= =?UTF-8?q?=EC=9D=98=20=ED=95=A9=20Score=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 초기 Score 생성 2. 파라미터로 값을 갖는 Score 생성 3. 기존의 값에 파라미터로 넘어온 값을 더한 새로운 Score 생성 --- .../java/blackjack/domain/card/Score.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Score.java diff --git a/src/main/java/blackjack/domain/card/Score.java b/src/main/java/blackjack/domain/card/Score.java new file mode 100644 index 00000000..f757f28b --- /dev/null +++ b/src/main/java/blackjack/domain/card/Score.java @@ -0,0 +1,24 @@ +package blackjack.domain.card; + +public class Score { + + private static final int INIT_VALUE = 0; + + private final int value; + + public Score() { + this(INIT_VALUE); + } + + public Score(int value) { + this.value = value; + } + + public Score sum(int value) { + return new Score(this.value + value); + } + + public int getValue() { + return value; + } +} From dddd01680ea6fae81870a2ea201a1b8522d2334e Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 20:58:37 +0900 Subject: [PATCH 067/106] =?UTF-8?q?test:=20Hands=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=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 1. 참가자의 카드 총합 확인 2. ACE의 값 확인 --- .../java/blackjack/domain/card/HandsTest.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/test/java/blackjack/domain/card/HandsTest.java diff --git a/src/test/java/blackjack/domain/card/HandsTest.java b/src/test/java/blackjack/domain/card/HandsTest.java new file mode 100644 index 00000000..d99fcb02 --- /dev/null +++ b/src/test/java/blackjack/domain/card/HandsTest.java @@ -0,0 +1,76 @@ +package blackjack.domain.card; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class HandsTest { + + @DisplayName("참가자 패의 카드 값을 더해 반환한다.") + @Test + void Given카드_2장_When합_구하기_Then합_반환() { + // Given + final Hands hands = new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.TEN), + new Card(Pattern.SPADE, Rank.TEN))); + + // Then + assertThat(hands.getScore()).isEqualTo(20); + } + + @DisplayName("초기에 ACE를 한장 가지고 있는 경우 ACE를 11로 계산한다.") + @Test + void GivenAce_한_장_포함된_카드_2장_When합_구하기_Then합_반환() { + // Given + final Hands hands = new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.ACE), + new Card(Pattern.SPADE, Rank.TEN))); + + // Then + assertThat(hands.getScore()).isEqualTo(21); + } + + @DisplayName("초기에 ACE를 2장 갖고 있는 경우, 합을 12로 계산한다.") + @Test + void GivenAce_2장_When합_구하기_Then합_반환() { + // Given + final Hands hands = new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.ACE), + new Card(Pattern.SPADE, Rank.ACE))); + + // Then + assertThat(hands.getScore()).isEqualTo(12); + } + + @DisplayName("참가자의 카드 패에 ACE를 추가할 때 11로 더해도 21을 넘지 않으면 ACE를 11로 계산한다.") + @Test + void GivenAce_When합_구하기_Then11을_더한_스코어() { + // Given + final Hands hands = new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.TWO), + new Card(Pattern.SPADE, Rank.TWO))); + + // When + hands.add(new Card(Pattern.CLUB, Rank.ACE)); + + // Then + assertThat(hands.getScore()).isEqualTo(15); + } + + @DisplayName("참가자의 카드 패에 ACE를 추가할 때 11을 더헀을 때, 21을 넘으면 ACE를 1로 계산한다.") + @Test + void GivenAce_When합_구하기_Then1을_더한_스코어() { + // Given + final Hands hands = new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.TEN), + new Card(Pattern.SPADE, Rank.TEN))); + + // When + hands.add(new Card(Pattern.CLUB, Rank.ACE)); + + // Then + assertThat(hands.getScore()).isEqualTo(21); + } +} From 237353706ad7925140b0167e68a85c3aa06c23aa Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 20:58:49 +0900 Subject: [PATCH 068/106] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=B9=B4=EB=93=9C=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20Hands=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 카드 관리 2. ACE 의 값 결정 3. 총합에 대한 상태값 --- src/main/java/blackjack/domain/card/Card.java | 8 +++- .../java/blackjack/domain/card/Hands.java | 48 +++++++++++++++++++ src/main/java/blackjack/domain/card/Rank.java | 4 ++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/domain/card/Hands.java diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 3e457430..acefac4e 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -11,12 +11,16 @@ protected Card(final Pattern pattern, final Rank rank) { this.rank = rank; } + public boolean isAce() { + return this.rank == Rank.ACE; + } + public String getName() { return rank.getName() + pattern.getName(); } - public boolean isAce() { - return this.rank == Rank.ACE; + public int getRank() { + return rank.getValue(); } @Override diff --git a/src/main/java/blackjack/domain/card/Hands.java b/src/main/java/blackjack/domain/card/Hands.java new file mode 100644 index 00000000..ace9e5dd --- /dev/null +++ b/src/main/java/blackjack/domain/card/Hands.java @@ -0,0 +1,48 @@ +package blackjack.domain.card; + +import java.util.ArrayList; +import java.util.List; + +public class Hands { + + private static final int DECISION_VALUE = 10; + private static final int ONE_ACE_VALUE = 1; + private static final int ELEVEN_ACE_VALUE = 11; + + private final List cards; + private Score score; + + public Hands(final List cards) { + this.cards = new ArrayList<>(); + this.score = new Score(); + + init(cards); + } + + private void init(final List cards) { + cards.forEach(this::add); + } + + public void add(final Card card) { + this.cards.add(card); + this.score = this.score.sum(getRank(card)); + } + + private int getRank(final Card card) { + if (card.isAce()) { + return getAceValue(); + } + return card.getRank(); + } + + private int getAceValue() { + if (this.score.getValue() > DECISION_VALUE) { + return ONE_ACE_VALUE; + } + return ELEVEN_ACE_VALUE; + } + + public int getScore() { + return score.getValue(); + } +} diff --git a/src/main/java/blackjack/domain/card/Rank.java b/src/main/java/blackjack/domain/card/Rank.java index 5c514698..a8ba66b6 100644 --- a/src/main/java/blackjack/domain/card/Rank.java +++ b/src/main/java/blackjack/domain/card/Rank.java @@ -17,4 +17,8 @@ public enum Rank { public String getName() { return name; } + + public int getValue() { + return value; + } } From 6e329cf52c1d7a1e6cb576a8e0325d1d24e39506 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 20:59:17 +0900 Subject: [PATCH 069/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Hands 2. Score --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fba5074d..5ebf97e8 100644 --- a/README.md +++ b/README.md @@ -65,8 +65,7 @@ - [ ] 'y' 와 'n'이 아닐 경우 exception이 발생한다. - [x] Parser - - [x] 플레이어 이름이 비어있는지 확인한다. - + - [x] 플레이어 이름이 비어있는지 확인한다. - [x] Deck - Cards(set: pattern, rank) @@ -83,6 +82,16 @@ - [x] ACE 인지 확인. - [x] 이름(patter + rank) +- [x] Hands + - [x] 두 장의 카드로 초기화 + - [x] 카드 관리 + - [ ] 현재 점수 관리 + - [x] ACE의 값을 결정한다. + +- [x] Score + - [x] Card의 합 + - [x] 기존 합에 한장의 Card의 값을 더한 값을 반환한다. + - [ ] Game - [ ] 카드 분배 From c2556e9d1b96ac0a7168253eb84453a1d18590ff Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 21:23:28 +0900 Subject: [PATCH 070/106] =?UTF-8?q?refactor:=20public=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=A0=9C=ED=95=9C=EC=9E=90=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Pattern enum 클래스 2. Card 클래스 --- src/main/java/blackjack/domain/card/Card.java | 2 +- src/main/java/blackjack/domain/card/Pattern.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index acefac4e..bafbe59e 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -6,7 +6,7 @@ public class Card { private final Pattern pattern; private final Rank rank; - protected Card(final Pattern pattern, final Rank rank) { + public Card(final Pattern pattern, final Rank rank) { this.pattern = pattern; this.rank = rank; } diff --git a/src/main/java/blackjack/domain/card/Pattern.java b/src/main/java/blackjack/domain/card/Pattern.java index e3f4c4f8..e49e8e8f 100644 --- a/src/main/java/blackjack/domain/card/Pattern.java +++ b/src/main/java/blackjack/domain/card/Pattern.java @@ -1,6 +1,6 @@ package blackjack.domain.card; -enum Pattern { +public enum Pattern { SPADE("스페이드"), CLUB("클로버"), HEART("하트"), From 21b6368a659f93b6f8d10136a96b2f20758e00ce Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 21:50:28 +0900 Subject: [PATCH 071/106] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EC=B6=94=EC=83=81=20=ED=81=B4=EB=9E=98=EC=8A=A4=20Participant?= =?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 1. 카드들 2. 뽑을 수 있는지 없는지 확인 --- .../domain/participant/Participant.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/blackjack/domain/participant/Participant.java diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java new file mode 100644 index 00000000..32849654 --- /dev/null +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -0,0 +1,18 @@ +package blackjack.domain.participant; + +import blackjack.domain.card.Hands; + +public abstract class Participant { + + protected final Hands hands; + + public Participant(Hands hands) { + this.hands = hands; + } + + abstract boolean canDraw(); + + public int getScore() { + return hands.getScore(); + } +} From 00334358cf1685154975e8f0aeddf7d867f6665e Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 21:53:39 +0900 Subject: [PATCH 072/106] =?UTF-8?q?test:=20Player=EC=97=90=20=EA=B4=80?= =?UTF-8?q?=ED=95=9C=20=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 1. 참가자의 현재 카드 총합 2. 카드를 더 받을 수 있는지에 대한 여부 확인 --- .../domain/participant/PlayerTest.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/test/java/blackjack/domain/participant/PlayerTest.java diff --git a/src/test/java/blackjack/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java new file mode 100644 index 00000000..a20a2d6b --- /dev/null +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -0,0 +1,47 @@ +package blackjack.domain.participant; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Hands; +import blackjack.domain.card.Pattern; +import blackjack.domain.card.Rank; +import java.util.Arrays; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayerTest { + + @DisplayName("플레이어의 현재 점수를 가져온다.") + @Test + void Given카드들_When점수_얻기_Then점수_합_반환() { + final Player player = new Player( + new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.EIGHT), + new Card(Pattern.SPADE, Rank.EIGHT)))); + + assertThat(player.getScore()).isEqualTo(16); + } + + @DisplayName("카드를 한장 더 받을 수 있다.") + @Test + void Given카드들_When점수가_21미만_Then참_반환() { + final Player player = new Player( + new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.EIGHT), + new Card(Pattern.HEART, Rank.FIVE)))); + + assertThat(player.canDraw()).isTrue(); + } + + @DisplayName("카드를 한장 더 받을 수 없다.") + @Test + void Given카드들_When점수가_21이상_Then거짓_반환() { + final Player player = new Player( + new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.TEN), + new Card(Pattern.HEART, Rank.ACE)))); + + assertThat(player.canDraw()).isFalse(); + } +} \ No newline at end of file From 7949bcd44b7d377086dc9e89ec06800915ea2d3e Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 21:53:52 +0900 Subject: [PATCH 073/106] =?UTF-8?q?test:=20Dealer=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=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 1. 참가자의 현재 카드 총합 2. 카드를 더 받을 수 있는지에 대한 여부 확인 --- .../domain/participant/DealerTest.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/test/java/blackjack/domain/participant/DealerTest.java diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java new file mode 100644 index 00000000..b928b234 --- /dev/null +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -0,0 +1,47 @@ +package blackjack.domain.participant; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Hands; +import blackjack.domain.card.Pattern; +import blackjack.domain.card.Rank; +import java.util.Arrays; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DealerTest { + + @DisplayName("플레이어의 현재 점수를 가져온다.") + @Test + void Given카드들_When점수_얻기_Then점수_합_반환() { + final Dealer dealer = new Dealer( + new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.EIGHT), + new Card(Pattern.SPADE, Rank.EIGHT)))); + + assertThat(dealer.getScore()).isEqualTo(16); + } + + @DisplayName("카드를 한장 더 받을 수 있다.") + @Test + void Given카드들_When점수가_17미만_Then참_반환() { + final Dealer dealer = new Dealer( + new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.EIGHT), + new Card(Pattern.HEART, Rank.FIVE)))); + + assertThat(dealer.canDraw()).isTrue(); + } + + @DisplayName("카드를 한장 더 받을 수 없다.") + @Test + void Given카드들_When점수가_17이상_Then거짓_반환() { + final Dealer dealer = new Dealer( + new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.TEN), + new Card(Pattern.HEART, Rank.ACE)))); + + assertThat(dealer.canDraw()).isFalse(); + } +} \ No newline at end of file From 829037ee6e8f7f4eb2100341cb30d7d85835c06b Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 21:55:17 +0900 Subject: [PATCH 074/106] =?UTF-8?q?feat:=20=EC=9D=BC=EB=B0=98=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20Player=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 카드들의 집합 2. 카드의 총 합이 한계치보다 미만인지 확인 --- src/main/java/blackjack/domain/card/Hands.java | 4 ++++ src/main/java/blackjack/domain/card/Score.java | 4 ++++ .../blackjack/domain/participant/Player.java | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 src/main/java/blackjack/domain/participant/Player.java diff --git a/src/main/java/blackjack/domain/card/Hands.java b/src/main/java/blackjack/domain/card/Hands.java index ace9e5dd..f274563f 100644 --- a/src/main/java/blackjack/domain/card/Hands.java +++ b/src/main/java/blackjack/domain/card/Hands.java @@ -45,4 +45,8 @@ private int getAceValue() { public int getScore() { return score.getValue(); } + + public boolean isUnderScore(int value) { + return score.isUnder(value); + } } diff --git a/src/main/java/blackjack/domain/card/Score.java b/src/main/java/blackjack/domain/card/Score.java index f757f28b..4fb5a366 100644 --- a/src/main/java/blackjack/domain/card/Score.java +++ b/src/main/java/blackjack/domain/card/Score.java @@ -21,4 +21,8 @@ public Score sum(int value) { public int getValue() { return value; } + + public boolean isUnder(int value) { + return this.value < value; + } } diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java new file mode 100644 index 00000000..b1043f81 --- /dev/null +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -0,0 +1,17 @@ +package blackjack.domain.participant; + +import blackjack.domain.card.Hands; + +public class Player extends Participant { + + private static final int DRAWABLE_SCORE_LIMIT = 21; + + public Player(Hands hands) { + super(hands); + } + + @Override + boolean canDraw() { + return hands.isUnderScore(DRAWABLE_SCORE_LIMIT); + } +} From 125501ee09004f5f5027df23da12434bc153b3bc Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 21:55:35 +0900 Subject: [PATCH 075/106] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=20Dealer=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 1. 카드들의 집합 2. 카드의 총 합이 한계치보다 미만인지 확인 --- .../blackjack/domain/participant/Dealer.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/blackjack/domain/participant/Dealer.java diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java new file mode 100644 index 00000000..9cd2c713 --- /dev/null +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -0,0 +1,17 @@ +package blackjack.domain.participant; + +import blackjack.domain.card.Hands; + +public class Dealer extends Participant { + + private static final int DRAWABLE_SCORE_LIMIT = 17; + + public Dealer(Hands hands) { + super(hands); + } + + @Override + boolean canDraw() { + return hands.isUnderScore(DRAWABLE_SCORE_LIMIT); + } +} \ No newline at end of file From 385903f09392f2c54c40387665455013938ebce4 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 21:56:37 +0900 Subject: [PATCH 076/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Participants 2. Player 3. Dealer --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5ebf97e8..e5864c78 100644 --- a/README.md +++ b/README.md @@ -99,19 +99,19 @@ - [ ] 결과 구하기 - [ ] 승패 구하기 -- [ ] abstract Participant (딜러, 플레이어) - - [ ] 자신의 패를 가진다. - - [ ] 카드패의 합산을 구한다. (구현) - - [ ] 카드를 더 받을 수 있는지. +- [x] abstract Participant (딜러, 플레이어) + - [x] 자신의 패를 가진다. + - [x] 카드패의 합산을 구한다. (구현) + - [x] 카드를 더 받을 수 있는지. -- [ ] Player extends Participant - - [ ] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 21을 초과하면 턴을 종료한다. +- [x] Player extends Participant + - [x] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 21을 초과하면 턴을 종료한다. - [ ] Players - [ ] 플레이어들 -- [ ] Dealer extends Participant - - [ ] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 16을 초과하면 턴을 종료한다. +- [x] Dealer extends Participant + - [x] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 16을 초과하면 턴을 종료한다. - [ ] OutputView - 참가자 패 From 3d0162d0a8f029d310da567d18905157ff5a79c0 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 21:57:13 +0900 Subject: [PATCH 077/106] =?UTF-8?q?style:=20=EC=A3=BC=EC=84=9D=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/card/CardsTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/blackjack/domain/card/CardsTest.java b/src/test/java/blackjack/domain/card/CardsTest.java index 9ba9597e..a4ebc7ff 100644 --- a/src/test/java/blackjack/domain/card/CardsTest.java +++ b/src/test/java/blackjack/domain/card/CardsTest.java @@ -21,7 +21,6 @@ void before() { cards = Cards.create(); } - // 카드 하나 뽑는 @DisplayName("카드 한장을 뽑는다.") @Test void GivenNothing_When카드_뽑기_Then카드() { @@ -32,10 +31,10 @@ void before() { assertThat(card).isNotNull(); } - // 빈 거 뽑는거 @DisplayName("빈 카드 목록에서 예외가 발생한다.") @Test void GivenNothing_When카드_뽑기_Then예외_발생() { + // Given final List allCards = Arrays.stream(Pattern.values()) .flatMap(pattern -> Arrays.stream(Rank.values()) From f75bac57f674de14de2658da2b93e05694a0285e Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 22:00:41 +0900 Subject: [PATCH 078/106] =?UTF-8?q?refactor:=20InputView=20=EC=9C=A0?= =?UTF-8?q?=ED=8B=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/view/InputView.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index b0862911..5bfe0ec5 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -7,17 +7,20 @@ public class InputView { private static final String PLAYERS_INPUT_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; private static final String DRAW_FLAG_INPUT_MESSAGE_FORMAT = "%s. 한장의 카드를 더 받으실건가요?(예는 y, 아니오는 n)%n"; - public String inputPlayers() { + private InputView() { + } + + public static String inputPlayers() { System.out.println(PLAYERS_INPUT_MESSAGE); return input(); } - public String inputDrawFlag(String name) { + public static String inputDrawFlag(String name) { System.out.printf(DRAW_FLAG_INPUT_MESSAGE_FORMAT, name); return input(); } - private String input() { + private static String input() { Scanner scanner = new Scanner(System.in); return scanner.nextLine().trim(); } From d938a77a6838ce4bd51f4efd2f0ae5f8a844c39c Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 22:08:19 +0900 Subject: [PATCH 079/106] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Participant 2. Player 3. Dealer --- src/main/java/blackjack/domain/participant/Dealer.java | 8 +++++++- .../java/blackjack/domain/participant/Participant.java | 4 +++- src/main/java/blackjack/domain/participant/Player.java | 10 +++++++++- .../java/blackjack/domain/participant/PlayerTest.java | 6 +++--- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index 9cd2c713..867a1e1a 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -4,9 +4,10 @@ public class Dealer extends Participant { + private static final String DEALER = "딜러"; private static final int DRAWABLE_SCORE_LIMIT = 17; - public Dealer(Hands hands) { + public Dealer(final Hands hands) { super(hands); } @@ -14,4 +15,9 @@ public Dealer(Hands hands) { boolean canDraw() { return hands.isUnderScore(DRAWABLE_SCORE_LIMIT); } + + @Override + public String getName() { + return DEALER; + } } \ No newline at end of file diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index 32849654..7effce4a 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -6,12 +6,14 @@ public abstract class Participant { protected final Hands hands; - public Participant(Hands hands) { + public Participant(final Hands hands) { this.hands = hands; } abstract boolean canDraw(); + abstract public String getName(); + public int getScore() { return hands.getScore(); } diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index b1043f81..2d13f3f5 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -6,12 +6,20 @@ public class Player extends Participant { private static final int DRAWABLE_SCORE_LIMIT = 21; - public Player(Hands hands) { + private final String name; + + public Player(final String name ,final Hands hands) { super(hands); + this.name = name; } @Override boolean canDraw() { return hands.isUnderScore(DRAWABLE_SCORE_LIMIT); } + + @Override + public String getName() { + return name; + } } diff --git a/src/test/java/blackjack/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java index a20a2d6b..c0cb313e 100644 --- a/src/test/java/blackjack/domain/participant/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -15,7 +15,7 @@ class PlayerTest { @DisplayName("플레이어의 현재 점수를 가져온다.") @Test void Given카드들_When점수_얻기_Then점수_합_반환() { - final Player player = new Player( + final Player player = new Player("jason", new Hands(Arrays.asList( new Card(Pattern.CLUB, Rank.EIGHT), new Card(Pattern.SPADE, Rank.EIGHT)))); @@ -26,7 +26,7 @@ class PlayerTest { @DisplayName("카드를 한장 더 받을 수 있다.") @Test void Given카드들_When점수가_21미만_Then참_반환() { - final Player player = new Player( + final Player player = new Player("jason", new Hands(Arrays.asList( new Card(Pattern.CLUB, Rank.EIGHT), new Card(Pattern.HEART, Rank.FIVE)))); @@ -37,7 +37,7 @@ class PlayerTest { @DisplayName("카드를 한장 더 받을 수 없다.") @Test void Given카드들_When점수가_21이상_Then거짓_반환() { - final Player player = new Player( + final Player player = new Player("jason", new Hands(Arrays.asList( new Card(Pattern.CLUB, Rank.TEN), new Card(Pattern.HEART, Rank.ACE)))); From df47d5ce028fb3a0a5f3033f7d831b5b23f682e4 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 22:08:38 +0900 Subject: [PATCH 080/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EC=B0=B8=EA=B0=80=EC=9E=90=20=EC=9D=B4=EB=A6=84=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e5864c78..020c246f 100644 --- a/README.md +++ b/README.md @@ -100,17 +100,20 @@ - [ ] 승패 구하기 - [x] abstract Participant (딜러, 플레이어) + - [x] 이름을 가진다. - [x] 자신의 패를 가진다. - [x] 카드패의 합산을 구한다. (구현) - [x] 카드를 더 받을 수 있는지. - [x] Player extends Participant + - [x] 플레이어 이름을 반환한다. (Override) - [x] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 21을 초과하면 턴을 종료한다. - [ ] Players - [ ] 플레이어들 - [x] Dealer extends Participant + - '딜러' 를 반환한다. (Override) - [x] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 16을 초과하면 턴을 종료한다. - [ ] OutputView From 2df412f078d5d3313d31a6ddefe6040b2f6c5f7d Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 22:11:31 +0900 Subject: [PATCH 081/106] =?UTF-8?q?style:=20=EA=B5=AC=EA=B8=80=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/participant/Player.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index 2d13f3f5..fe19067f 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -8,14 +8,14 @@ public class Player extends Participant { private final String name; - public Player(final String name ,final Hands hands) { + public Player(final String name, final Hands hands) { super(hands); this.name = name; } @Override boolean canDraw() { - return hands.isUnderScore(DRAWABLE_SCORE_LIMIT); + return hands.isUnderScore(DRAWABLE_SCORE_LIMIT); } @Override From a40bd3d58d5998721f6cb2b117bbc7e9201b2c99 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 22:47:25 +0900 Subject: [PATCH 082/106] =?UTF-8?q?test:=20Game=20=EA=B4=80=EB=A0=A8=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 1. 카드 한 장 분배 2. 참가자의 초기 카드 분배 --- .../java/blackjack/domain/game/GameTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/java/blackjack/domain/game/GameTest.java diff --git a/src/test/java/blackjack/domain/game/GameTest.java b/src/test/java/blackjack/domain/game/GameTest.java new file mode 100644 index 00000000..b4672a15 --- /dev/null +++ b/src/test/java/blackjack/domain/game/GameTest.java @@ -0,0 +1,22 @@ +package blackjack.domain.game; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class GameTest { + + @DisplayName("카드를 한장 뽑는다.") + @Test + void GivenNothing_When_Then() { + assertThat(new Game().draw()).isNotNull(); + + } + + @DisplayName("참가자들의 초기 패를 뽑는다.") + @Test + void Given_When_Then() { + assertThat(new Game().dealCards().size()).isEqualTo(2); + } +} \ No newline at end of file From b0b47a412575a2b25d2425cb2348e57ebb4c9673 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 22:48:26 +0900 Subject: [PATCH 083/106] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?=EB=B6=84=EB=B0=B0=ED=95=98=EB=8A=94=20Game=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 1. 전체 카드를 관리하는 덱 생성 2. 카드 분배 3. 참가자들에게 초기 카드 분배 --- .../java/blackjack/BlackJackApplication.java | 25 +++++++++++++++++ src/main/java/blackjack/domain/game/Game.java | 28 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/main/java/blackjack/BlackJackApplication.java create mode 100644 src/main/java/blackjack/domain/game/Game.java diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java new file mode 100644 index 00000000..b3fe9346 --- /dev/null +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -0,0 +1,25 @@ +package blackjack; + +import blackjack.domain.card.Hands; +import blackjack.domain.game.Game; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Participant; +import blackjack.domain.participant.Player; +import blackjack.util.Parser; +import blackjack.view.InputView; +import java.util.List; +import java.util.stream.Collectors; + +public class BlackJackApplication { + + public static void main(String[] args) { + Game game = new Game(); + + List players = Parser.parse(InputView.inputPlayers()); + List participants = players.stream() + .map(name -> new Player(name, new Hands(game.dealCards()))) + .collect(Collectors.toList()); + + participants.add(new Dealer(new Hands(game.dealCards()))); + } +} diff --git a/src/main/java/blackjack/domain/game/Game.java b/src/main/java/blackjack/domain/game/Game.java new file mode 100644 index 00000000..fd2aeec0 --- /dev/null +++ b/src/main/java/blackjack/domain/game/Game.java @@ -0,0 +1,28 @@ +package blackjack.domain.game; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Deck; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Game { + + private static final int NUMBER_OF_INIT_HANDS = 2; + + private final Deck deck; + + public Game() { + this.deck = new Deck(); + } + + public Card draw() { + return deck.draw(); + } + + public List dealCards() { + return IntStream.range(0, NUMBER_OF_INIT_HANDS) + .mapToObj(i -> deck.draw()) + .collect(Collectors.toList()); + } +} From 330913e67bd5a56939f776f1120b841bdac8b4e6 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 23:33:15 +0900 Subject: [PATCH 084/106] =?UTF-8?q?refactor:=20Cards=20->=20Deck=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20=EA=B8=B0=EC=A1=B4=20Deck=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 불필요한 Wrapping 제거 --- .../java/blackjack/domain/card/Cards.java | 49 ------------- src/main/java/blackjack/domain/card/Deck.java | 39 ++++++++--- .../java/blackjack/domain/card/CardsTest.java | 68 ------------------- 3 files changed, 31 insertions(+), 125 deletions(-) delete mode 100644 src/main/java/blackjack/domain/card/Cards.java delete mode 100644 src/test/java/blackjack/domain/card/CardsTest.java diff --git a/src/main/java/blackjack/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java deleted file mode 100644 index 6506f5dd..00000000 --- a/src/main/java/blackjack/domain/card/Cards.java +++ /dev/null @@ -1,49 +0,0 @@ -package blackjack.domain.card; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -public class Cards { - - private static final String EMPTY_DECK_EXCEPTION_MESSAGE = "[ERROR] 덱에 남은 카드가 없습니다."; - private static final int SELECTED_CARD = 0; - - private final List cards; - - private Cards(final List cards) { - this.cards = new ArrayList<>(cards); - } - - private Cards() { - this.cards = Arrays.stream(Pattern.values()) - .flatMap(pattern -> - Arrays.stream(Rank.values()) - .map(rank -> new Card(pattern, rank)) - .collect(Collectors.toList()).stream()) - .collect(Collectors.toList()); - } - - protected static Cards create() { - return new Cards(); - } - - protected Card drawOne() { - validateIsEmpty(); - Collections.shuffle(cards); - return cards.get(SELECTED_CARD); - } - - private void validateIsEmpty() { - if (cards.isEmpty()) { - throw new IllegalArgumentException(EMPTY_DECK_EXCEPTION_MESSAGE); - } - } - - protected Cards without(final Card card) { - cards.remove(card); - return new Cards(cards); - } -} diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 6c5790ed..23078a19 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,22 +1,45 @@ package blackjack.domain.card; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + public class Deck { - private final Cards cards; + private static final String EMPTY_DECK_EXCEPTION_MESSAGE = "[ERROR] 덱에 남은 카드가 없습니다."; + private static final int SELECTED_CARD = 0; - public Deck(final Cards cards) { - this.cards = cards; - } + private final List cards; public Deck() { - this(Cards.create()); + this(Arrays.stream(Pattern.values()) + .flatMap(pattern -> + Arrays.stream(Rank.values()) + .map(rank -> new Card(pattern, rank)) + .collect(Collectors.toList()).stream()) + .collect(Collectors.toList())); } - public Deck deduction(final Card card) { - return new Deck(cards.without(card)); + private Deck(final List cards) { + this.cards = new ArrayList<>(cards); } public Card draw() { - return cards.drawOne(); + validateIsEmpty(); + Collections.shuffle(cards); + return cards.get(SELECTED_CARD); + } + + private void validateIsEmpty() { + if (this.cards.isEmpty()) { + throw new IllegalArgumentException(EMPTY_DECK_EXCEPTION_MESSAGE); + } + } + + public Deck deduction(final Card card) { + this.cards.remove(card); + return new Deck(this.cards); } } diff --git a/src/test/java/blackjack/domain/card/CardsTest.java b/src/test/java/blackjack/domain/card/CardsTest.java deleted file mode 100644 index a4ebc7ff..00000000 --- a/src/test/java/blackjack/domain/card/CardsTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package blackjack.domain.card; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; - -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class CardsTest { - - private Cards cards; - - @BeforeEach - void before() { - cards = Cards.create(); - } - - @DisplayName("카드 한장을 뽑는다.") - @Test - void GivenNothing_When카드_뽑기_Then카드() { - // When - final Card card = cards.drawOne(); - - // Then - assertThat(card).isNotNull(); - } - - @DisplayName("빈 카드 목록에서 예외가 발생한다.") - @Test - void GivenNothing_When카드_뽑기_Then예외_발생() { - // Given - final List allCards = Arrays.stream(Pattern.values()) - .flatMap(pattern -> - Arrays.stream(Rank.values()) - .map(rank -> new Card(pattern, rank)) - .collect(Collectors.toList()).stream()) - .collect(Collectors.toList()); - - for (Card card : allCards) { - cards.without(card); - } - - // When & Then - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> cards.drawOne()); - } - - @DisplayName("카드를 전부 뽑아 덱이 제대로 생성되었는지 확인한다.") - @Test - void GivenNothing_When카드_전부_뽑기_Then중복되지_않은_모든_카드() { - // When - final Set allCards = IntStream.range(0, 52).mapToObj(i -> { - Card card = cards.drawOne(); - cards = cards.without(card); - return card; - }) - .collect(Collectors.toSet()); - - // Then - assertThat(allCards.size()).isEqualTo(52); - } -} From df0be65eaecb6d926985401e206ce9dee4b836b9 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 23:33:41 +0900 Subject: [PATCH 085/106] =?UTF-8?q?refactor:=20default=20->=20public=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=A0=9C=ED=95=9C=EC=9E=90=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/participant/Dealer.java | 2 +- src/main/java/blackjack/domain/participant/Participant.java | 2 +- src/main/java/blackjack/domain/participant/Player.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index 867a1e1a..d2bae248 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -12,7 +12,7 @@ public Dealer(final Hands hands) { } @Override - boolean canDraw() { + public boolean canDraw() { return hands.isUnderScore(DRAWABLE_SCORE_LIMIT); } diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index 7effce4a..f1a3d01a 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -10,7 +10,7 @@ public Participant(final Hands hands) { this.hands = hands; } - abstract boolean canDraw(); + abstract public boolean canDraw(); abstract public String getName(); diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index fe19067f..709613f3 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -14,7 +14,7 @@ public Player(final String name, final Hands hands) { } @Override - boolean canDraw() { + public boolean canDraw() { return hands.isUnderScore(DRAWABLE_SCORE_LIMIT); } From 348507e39611ab63e32a355636260753cb92b6b1 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 23:58:57 +0900 Subject: [PATCH 086/106] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EA=B0=80=EC=A7=80=EA=B3=A0=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=9D=B4=EB=A6=84=EB=93=A4=EC=9D=84=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?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 1. Participant#getCardNames() 2. Hands#getCardNames() --- src/main/java/blackjack/domain/card/Hands.java | 9 +++++++-- .../java/blackjack/domain/participant/Participant.java | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Hands.java b/src/main/java/blackjack/domain/card/Hands.java index f274563f..bbbd1c42 100644 --- a/src/main/java/blackjack/domain/card/Hands.java +++ b/src/main/java/blackjack/domain/card/Hands.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class Hands { @@ -42,11 +43,15 @@ private int getAceValue() { return ELEVEN_ACE_VALUE; } + public boolean isUnderScore(int value) { + return score.isUnder(value); + } + public int getScore() { return score.getValue(); } - public boolean isUnderScore(int value) { - return score.isUnder(value); + public List getCardNames() { + return cards.stream().map(Card::getName).collect(Collectors.toList()); } } diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index f1a3d01a..b9a2dd47 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -1,6 +1,8 @@ package blackjack.domain.participant; import blackjack.domain.card.Hands; +import java.util.Arrays; +import java.util.List; public abstract class Participant { @@ -17,4 +19,8 @@ public Participant(final Hands hands) { public int getScore() { return hands.getScore(); } + + public List getCardNames() { + return hands.getCardNames(); + } } From 300e059b4afded6a0f80d7fdb5b31f2987b646c3 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Wed, 16 Feb 2022 23:59:41 +0900 Subject: [PATCH 087/106] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20=EB=B6=84?= =?UTF-8?q?=EB=B0=B0=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=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 --- .../java/blackjack/BlackJackApplication.java | 9 ++-- src/main/java/blackjack/view/OutputView.java | 45 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 src/main/java/blackjack/view/OutputView.java diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java index b3fe9346..b11ef81b 100644 --- a/src/main/java/blackjack/BlackJackApplication.java +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -7,19 +7,22 @@ import blackjack.domain.participant.Player; import blackjack.util.Parser; import blackjack.view.InputView; +import blackjack.view.OutputView; import java.util.List; import java.util.stream.Collectors; public class BlackJackApplication { public static void main(String[] args) { - Game game = new Game(); + final Game game = new Game(); - List players = Parser.parse(InputView.inputPlayers()); - List participants = players.stream() + final List players = Parser.parse(InputView.inputPlayers()); + final List participants = players.stream() .map(name -> new Player(name, new Hands(game.dealCards()))) .collect(Collectors.toList()); participants.add(new Dealer(new Hands(game.dealCards()))); + + OutputView.printInitProgress(participants); } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 00000000..e8b7b67b --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,45 @@ +package blackjack.view; + +import blackjack.domain.participant.Participant; +import java.util.List; +import java.util.stream.Collectors; + +public class OutputView { + + private static final String DELIMITER = ", "; + private static final int NUMBER_OF_INIT_HANDS = 2; + private static final String DISTRIBUTE_MESSAGE_FORMAT = "%s에게 카드를 %d장씩 분배하였습니다.%n"; + private static final String PARTICIPANT_STATUS_FORMAT = "%s카드: %s%n"; + + private OutputView() { + } + + public static void printInitProgress(final List participants) { + printDistributeInfo(participants); + printParticipantsStatus(participants); + } + + private static void printDistributeInfo(final List participants) { + System.out.printf(DISTRIBUTE_MESSAGE_FORMAT, getNames(participants), NUMBER_OF_INIT_HANDS); + } + + private static String getNames(final List participants) { + return participants.stream() + .map(Participant::getName) + .collect(Collectors.joining(DELIMITER)); + } + + private static void printParticipantsStatus(final List participants) { + StringBuilder status = new StringBuilder(); + participants.forEach(participant -> + status.append(String.format( + PARTICIPANT_STATUS_FORMAT, participant.getName(), getCardNames(participant)))); + + System.out.println(status); + } + + private static String getCardNames(final Participant participant) { + return participant.getCardNames().stream() + .collect(Collectors.joining(DELIMITER)); + } +} From 318d55373df5bba4d74d7f97f853cb1801c43923 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 00:00:16 +0900 Subject: [PATCH 088/106] =?UTF-8?q?test:=20=EC=A4=91=EB=B3=B5=20=EC=97=86?= =?UTF-8?q?=EC=9D=B4=20=EB=AA=A8=EB=93=A0=20=EC=B9=B4=EB=93=9C=EA=B0=80=20?= =?UTF-8?q?=EB=BD=91=ED=9E=8C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/game/GameTest.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/test/java/blackjack/domain/game/GameTest.java b/src/test/java/blackjack/domain/game/GameTest.java index b4672a15..a889996a 100644 --- a/src/test/java/blackjack/domain/game/GameTest.java +++ b/src/test/java/blackjack/domain/game/GameTest.java @@ -2,21 +2,49 @@ import static org.assertj.core.api.Assertions.assertThat; +import blackjack.domain.card.Card; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class GameTest { + private Game sut; + + @BeforeEach + void before() { + sut = new Game(); + } + @DisplayName("카드를 한장 뽑는다.") @Test void GivenNothing_When_Then() { - assertThat(new Game().draw()).isNotNull(); + assertThat(sut.draw()).isNotNull(); } @DisplayName("참가자들의 초기 패를 뽑는다.") @Test void Given_When_Then() { - assertThat(new Game().dealCards().size()).isEqualTo(2); + assertThat(sut.dealCards().size()).isEqualTo(2); + } + + @DisplayName("중복없이 모든 카드가 뽑힌다.") + @Test + void GivenNothing_When카드_전부_뽑기_Then중복되지_않은_모든_카드() { + + // When + final Set cards = IntStream.range(0, 52) + .mapToObj(i -> { + Card card = sut.draw(); + return card; + }) + .collect(Collectors.toSet()); + + // Then + assertThat(cards.size()).isEqualTo(52); } } \ No newline at end of file From 696cd0b1bd7326bfa9d976582bf86b8f08940556 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 00:01:09 +0900 Subject: [PATCH 089/106] =?UTF-8?q?feat:=20=EB=BD=91=ED=9E=8C=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EC=A0=9C=EA=B1=B0=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=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/blackjack/domain/game/Game.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/game/Game.java b/src/main/java/blackjack/domain/game/Game.java index fd2aeec0..b60d9650 100644 --- a/src/main/java/blackjack/domain/game/Game.java +++ b/src/main/java/blackjack/domain/game/Game.java @@ -17,12 +17,14 @@ public Game() { } public Card draw() { - return deck.draw(); + Card card = deck.draw(); + deck.deduction(card); + return card; } public List dealCards() { return IntStream.range(0, NUMBER_OF_INIT_HANDS) - .mapToObj(i -> deck.draw()) + .mapToObj(i -> draw()) .collect(Collectors.toList()); } } From c77f874100305bfce53847e2c53c112f88ec7cac Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 00:02:25 +0900 Subject: [PATCH 090/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20O?= =?UTF-8?q?utputView=20=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=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 1. 참가자 카드 출력 --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 020c246f..0ce2f89a 100644 --- a/README.md +++ b/README.md @@ -92,8 +92,8 @@ - [x] Card의 합 - [x] 기존 합에 한장의 Card의 값을 더한 값을 반환한다. -- [ ] Game - - [ ] 카드 분배 +- [x] Game + - [x] 카드 분배 - [ ] Result - [ ] 결과 구하기 @@ -117,8 +117,8 @@ - [x] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 16을 초과하면 턴을 종료한다. - [ ] OutputView - - 참가자 패 - - 참가자 최종 결과 - - 참가자 최종 승패 - - 참가자 카드 분배 - - 딜러는 16이하라 한장의 카드를 더 받았습니다. + - [x] 참가자 패 + - [x] 참가자 카드 분배 + - [ ] 참가자 최종 결과 + - [ ] 참가자 최종 승패 + - [ ] 딜러는 16이하라 한장의 카드를 더 받았습니다. From ce71f1350df4e72afd6a9d5780dd7b273f47e34a Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 20:54:24 +0900 Subject: [PATCH 091/106] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=A1=B4=20Deck,?= =?UTF-8?q?=20Game=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Deck > Cards 2. Game > Deck --- .../java/blackjack/BlackJackApplication.java | 11 +-- .../java/blackjack/domain/card/Cards.java | 45 ++++++++++++ src/main/java/blackjack/domain/card/Deck.java | 41 ++++------- src/main/java/blackjack/domain/game/Game.java | 30 -------- .../java/blackjack/domain/card/CardsTest.java | 68 +++++++++++++++++++ .../java/blackjack/domain/card/DeckTest.java | 44 ++++-------- .../java/blackjack/domain/game/GameTest.java | 50 -------------- 7 files changed, 145 insertions(+), 144 deletions(-) create mode 100644 src/main/java/blackjack/domain/card/Cards.java delete mode 100644 src/main/java/blackjack/domain/game/Game.java create mode 100644 src/test/java/blackjack/domain/card/CardsTest.java delete mode 100644 src/test/java/blackjack/domain/game/GameTest.java diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java index b11ef81b..1f3720e9 100644 --- a/src/main/java/blackjack/BlackJackApplication.java +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -1,7 +1,7 @@ package blackjack; +import blackjack.domain.card.Deck; import blackjack.domain.card.Hands; -import blackjack.domain.game.Game; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Participant; import blackjack.domain.participant.Player; @@ -14,11 +14,12 @@ public class BlackJackApplication { public static void main(String[] args) { - final Game game = new Game(); + final Deck deck = new Deck(); - final List players = Parser.parse(InputView.inputPlayers()); - final List participants = players.stream() - .map(name -> new Player(name, new Hands(game.dealCards()))) + final List playerNames = Parser.parse(InputView.inputPlayers()); + final Participant dealer = new Dealer(new Hands(deck.dealInitCards())); + final List players = playerNames.stream() + .map(name -> new Player(name, new Hands(deck.dealInitCards()))) .collect(Collectors.toList()); participants.add(new Dealer(new Hands(game.dealCards()))); diff --git a/src/main/java/blackjack/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java new file mode 100644 index 00000000..c5097997 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Cards.java @@ -0,0 +1,45 @@ +package blackjack.domain.card; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class Cards { + + private static final String EMPTY_DECK_EXCEPTION_MESSAGE = "[ERROR] 덱에 남은 카드가 없습니다."; + private static final int SELECTED_CARD = 0; + + private final List cards; + + public Cards() { + this(Arrays.stream(Pattern.values()) + .flatMap(pattern -> + Arrays.stream(Rank.values()) + .map(rank -> new Card(pattern, rank)) + .collect(Collectors.toList()).stream()) + .collect(Collectors.toList())); + } + + private Cards(final List cards) { + this.cards = new ArrayList<>(cards); + } + + public Card draw() { + checkDeckIsEmpty(); + Collections.shuffle(cards); + return cards.get(SELECTED_CARD); + } + + private void checkDeckIsEmpty() { + if (cards.isEmpty()) { + throw new IllegalArgumentException(EMPTY_DECK_EXCEPTION_MESSAGE); + } + } + + public Cards remove(final Card card) { + cards.remove(card); + return new Cards(cards); + } +} diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 23078a19..90e69aa2 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,45 +1,30 @@ package blackjack.domain.card; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; +import blackjack.domain.card.Card; +import blackjack.domain.card.Cards; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.IntStream; public class Deck { - private static final String EMPTY_DECK_EXCEPTION_MESSAGE = "[ERROR] 덱에 남은 카드가 없습니다."; - private static final int SELECTED_CARD = 0; + private static final int NUMBER_OF_INIT_HANDS = 2; - private final List cards; + private final Cards cards; public Deck() { - this(Arrays.stream(Pattern.values()) - .flatMap(pattern -> - Arrays.stream(Rank.values()) - .map(rank -> new Card(pattern, rank)) - .collect(Collectors.toList()).stream()) - .collect(Collectors.toList())); - } - - private Deck(final List cards) { - this.cards = new ArrayList<>(cards); + this.cards = new Cards(); } public Card draw() { - validateIsEmpty(); - Collections.shuffle(cards); - return cards.get(SELECTED_CARD); - } - - private void validateIsEmpty() { - if (this.cards.isEmpty()) { - throw new IllegalArgumentException(EMPTY_DECK_EXCEPTION_MESSAGE); - } + final Card card = cards.draw(); + cards.remove(card); + return card; } - public Deck deduction(final Card card) { - this.cards.remove(card); - return new Deck(this.cards); + public List dealInitCards() { + return IntStream.range(0, NUMBER_OF_INIT_HANDS) + .mapToObj(i -> draw()) + .collect(Collectors.toList()); } } diff --git a/src/main/java/blackjack/domain/game/Game.java b/src/main/java/blackjack/domain/game/Game.java deleted file mode 100644 index b60d9650..00000000 --- a/src/main/java/blackjack/domain/game/Game.java +++ /dev/null @@ -1,30 +0,0 @@ -package blackjack.domain.game; - -import blackjack.domain.card.Card; -import blackjack.domain.card.Deck; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class Game { - - private static final int NUMBER_OF_INIT_HANDS = 2; - - private final Deck deck; - - public Game() { - this.deck = new Deck(); - } - - public Card draw() { - Card card = deck.draw(); - deck.deduction(card); - return card; - } - - public List dealCards() { - return IntStream.range(0, NUMBER_OF_INIT_HANDS) - .mapToObj(i -> draw()) - .collect(Collectors.toList()); - } -} diff --git a/src/test/java/blackjack/domain/card/CardsTest.java b/src/test/java/blackjack/domain/card/CardsTest.java new file mode 100644 index 00000000..ae1eba7a --- /dev/null +++ b/src/test/java/blackjack/domain/card/CardsTest.java @@ -0,0 +1,68 @@ +package blackjack.domain.card; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class CardsTest { + + private Cards sut; + + @BeforeEach + void before() { + sut = new Cards(); + } + + @DisplayName("카드 한장을 뽑는다.") + @Test + void GivenNothing_When카드_뽑기_Then카드() { + // When + final Card card = sut.draw(); + + // Then + assertThat(card).isNotNull(); + } + + @DisplayName("카드를 뽑을때 남은 카드가 없으면 예외를 발생시킨다.") + @Test + void Given빈_덱_When카드_뽑기_Then예외_발생() { + // Given + final List cards = Arrays.stream(Pattern.values()) + .flatMap(pattern -> + Arrays.stream(Rank.values()) + .map(rank -> new Card(pattern, rank)) + .collect(Collectors.toList()).stream()) + .collect(Collectors.toList()); + + for (Card card : cards) { + sut = sut.remove(card); + } + + // When & Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> sut.draw()); + } + + @DisplayName("카드를 전부 뽑아 덱이 제대로 생성되었는지 확인한다.") + @Test + void GivenNothing_When카드_전부_뽑기_Then중복되지_않은_모든_카드() { + // When + final Set cards = IntStream.range(0, 52).mapToObj(i -> { + Card card = sut.draw(); + sut.remove(card); + return card; + }) + .collect(Collectors.toSet()); + + // Then + assertThat(cards.size()).isEqualTo(52); + } +} diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index 9ef67429..38088d98 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -1,10 +1,9 @@ package blackjack.domain.card; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import java.util.Arrays; -import java.util.List; +import blackjack.domain.card.Card; +import blackjack.domain.card.Deck; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -21,43 +20,26 @@ void before() { sut = new Deck(); } - @DisplayName("카드 한장을 뽑는다.") + @DisplayName("카드를 한장 뽑는다.") @Test - void GivenNothing_When카드_뽑기_Then카드() { - // When - final Card card = sut.draw(); - - // Then - assertThat(card).isNotNull(); + void GivenNothing_When_Then() { + assertThat(sut.draw()).isNotNull(); } - @DisplayName("카드를 뽑을때 남은 카드가 없으면 예외를 발생시킨다.") + @DisplayName("참가자들의 초기 패를 뽑는다.") @Test - void Given빈_덱_When카드_뽑기_Then예외_발생() { - // Given - final List cards = Arrays.stream(Pattern.values()) - .flatMap(pattern -> - Arrays.stream(Rank.values()) - .map(rank -> new Card(pattern, rank)) - .collect(Collectors.toList()).stream()) - .collect(Collectors.toList()); - - for (Card card : cards) { - sut = sut.deduction(card); - } - - // When & Then - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> sut.draw()); + void Given_When_Then() { + assertThat(sut.dealInitCards().size()).isEqualTo(2); } - @DisplayName("카드를 전부 뽑아 덱이 제대로 생성되었는지 확인한다.") + @DisplayName("중복없이 모든 카드가 뽑힌다.") @Test void GivenNothing_When카드_전부_뽑기_Then중복되지_않은_모든_카드() { + // When - final Set cards = IntStream.range(0, 52).mapToObj(i -> { + final Set cards = IntStream.range(0, 52) + .mapToObj(i -> { Card card = sut.draw(); - sut.deduction(card); return card; }) .collect(Collectors.toSet()); @@ -65,4 +47,4 @@ void before() { // Then assertThat(cards.size()).isEqualTo(52); } -} +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/game/GameTest.java b/src/test/java/blackjack/domain/game/GameTest.java deleted file mode 100644 index a889996a..00000000 --- a/src/test/java/blackjack/domain/game/GameTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package blackjack.domain.game; - -import static org.assertj.core.api.Assertions.assertThat; - -import blackjack.domain.card.Card; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class GameTest { - - private Game sut; - - @BeforeEach - void before() { - sut = new Game(); - } - - @DisplayName("카드를 한장 뽑는다.") - @Test - void GivenNothing_When_Then() { - assertThat(sut.draw()).isNotNull(); - - } - - @DisplayName("참가자들의 초기 패를 뽑는다.") - @Test - void Given_When_Then() { - assertThat(sut.dealCards().size()).isEqualTo(2); - } - - @DisplayName("중복없이 모든 카드가 뽑힌다.") - @Test - void GivenNothing_When카드_전부_뽑기_Then중복되지_않은_모든_카드() { - - // When - final Set cards = IntStream.range(0, 52) - .mapToObj(i -> { - Card card = sut.draw(); - return card; - }) - .collect(Collectors.toSet()); - - // Then - assertThat(cards.size()).isEqualTo(52); - } -} \ No newline at end of file From 22150b78e62705fa0e25c16b61c0badd435d42b9 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 20:58:48 +0900 Subject: [PATCH 092/106] =?UTF-8?q?refactor:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Hands.java | 3 +-- src/main/java/blackjack/domain/card/Score.java | 6 +++--- src/main/java/blackjack/view/InputView.java | 5 ++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Hands.java b/src/main/java/blackjack/domain/card/Hands.java index bbbd1c42..54a11ae8 100644 --- a/src/main/java/blackjack/domain/card/Hands.java +++ b/src/main/java/blackjack/domain/card/Hands.java @@ -43,10 +43,9 @@ private int getAceValue() { return ELEVEN_ACE_VALUE; } - public boolean isUnderScore(int value) { + public boolean isUnderScore(final int value) { return score.isUnder(value); } - public int getScore() { return score.getValue(); } diff --git a/src/main/java/blackjack/domain/card/Score.java b/src/main/java/blackjack/domain/card/Score.java index 4fb5a366..b8a7c100 100644 --- a/src/main/java/blackjack/domain/card/Score.java +++ b/src/main/java/blackjack/domain/card/Score.java @@ -10,11 +10,11 @@ public Score() { this(INIT_VALUE); } - public Score(int value) { + public Score(final int value) { this.value = value; } - public Score sum(int value) { + public Score sum(final int value) { return new Score(this.value + value); } @@ -22,7 +22,7 @@ public int getValue() { return value; } - public boolean isUnder(int value) { + public boolean isUnder(final int value) { return this.value < value; } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 5bfe0ec5..319cb641 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -7,15 +7,14 @@ public class InputView { private static final String PLAYERS_INPUT_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; private static final String DRAW_FLAG_INPUT_MESSAGE_FORMAT = "%s. 한장의 카드를 더 받으실건가요?(예는 y, 아니오는 n)%n"; - private InputView() { - } + private InputView() {} public static String inputPlayers() { System.out.println(PLAYERS_INPUT_MESSAGE); return input(); } - public static String inputDrawFlag(String name) { + public static String inputDrawFlag(final String name) { System.out.printf(DRAW_FLAG_INPUT_MESSAGE_FORMAT, name); return input(); } From 7a5aed7540aa7ae7bf7b2f33704c809568b972a7 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 21:00:50 +0900 Subject: [PATCH 093/106] =?UTF-8?q?refactor:=20=ED=8C=80=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 3 ++- src/main/java/blackjack/domain/card/Pattern.java | 1 + src/main/java/blackjack/domain/participant/Dealer.java | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index bafbe59e..bd547642 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -3,6 +3,7 @@ import java.util.Objects; public class Card { + private final Pattern pattern; private final Rank rank; @@ -12,7 +13,7 @@ public Card(final Pattern pattern, final Rank rank) { } public boolean isAce() { - return this.rank == Rank.ACE; + return rank == Rank.ACE; } public String getName() { diff --git a/src/main/java/blackjack/domain/card/Pattern.java b/src/main/java/blackjack/domain/card/Pattern.java index e49e8e8f..563719f0 100644 --- a/src/main/java/blackjack/domain/card/Pattern.java +++ b/src/main/java/blackjack/domain/card/Pattern.java @@ -1,6 +1,7 @@ package blackjack.domain.card; public enum Pattern { + SPADE("스페이드"), CLUB("클로버"), HEART("하트"), diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index d2bae248..c4062c34 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -20,4 +20,4 @@ public boolean canDraw() { public String getName() { return DEALER; } -} \ No newline at end of file +} From fc6043b0fd6970e0b1ac99844c26557a355b5631 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 21:01:30 +0900 Subject: [PATCH 094/106] =?UTF-8?q?fix:=20EIGHT=EC=9D=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=B4=207=EC=9D=B4=EB=8D=98=20=EA=B1=B8=208?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Rank.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/card/Rank.java b/src/main/java/blackjack/domain/card/Rank.java index a8ba66b6..f11a8355 100644 --- a/src/main/java/blackjack/domain/card/Rank.java +++ b/src/main/java/blackjack/domain/card/Rank.java @@ -3,7 +3,7 @@ public enum Rank { ACE("A", 11), TWO("2", 2), THREE("3", 3), FOUR("4", 4), FIVE("5", 5), - SIX("6", 6), SEVEN("7", 7), EIGHT("7", 8), NINE("9", 9), TEN("10", 10), + SIX("6", 6), SEVEN("7", 7), EIGHT("8", 8), NINE("9", 9), TEN("10", 10), JACK("J", 10), QUEEN("Q", 10), KING("K", 10); private final String name; From 2f94a6e8d6ab3e1f24d3ec4759f472ede890eadb Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 22:22:02 +0900 Subject: [PATCH 095/106] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=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/java/blackjack/domain/card/Deck.java | 4 +--- src/test/java/blackjack/domain/card/DeckTest.java | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 90e69aa2..705e83f1 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,7 +1,5 @@ package blackjack.domain.card; -import blackjack.domain.card.Card; -import blackjack.domain.card.Cards; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -17,7 +15,7 @@ public Deck() { } public Card draw() { - final Card card = cards.draw(); + final Card card = cards.draw(); cards.remove(card); return card; } diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index 38088d98..603f4ce0 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -2,8 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import blackjack.domain.card.Card; -import blackjack.domain.card.Deck; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; From 330c4c96c70f4dfe36aeb0dd0f8464208668d9c2 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 22:28:15 +0900 Subject: [PATCH 096/106] =?UTF-8?q?feat:=20=EC=B6=94=EA=B0=80=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20Draw=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 플레이어 : 21을 넘지 않는 경우, 의사를 물어봄 2. 딜러 : 16을 넘지 않는다면, 무조건 받음 --- .../java/blackjack/BlackJackApplication.java | 36 +++++++++++++++++-- .../domain/participant/Participant.java | 8 +++-- src/main/java/blackjack/view/InputView.java | 12 ++++++- src/main/java/blackjack/view/OutputView.java | 3 ++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java index 1f3720e9..f5c4f6a6 100644 --- a/src/main/java/blackjack/BlackJackApplication.java +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -8,8 +8,10 @@ import blackjack.util.Parser; import blackjack.view.InputView; import blackjack.view.OutputView; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; public class BlackJackApplication { @@ -22,8 +24,38 @@ public static void main(String[] args) { .map(name -> new Player(name, new Hands(deck.dealInitCards()))) .collect(Collectors.toList()); - participants.add(new Dealer(new Hands(game.dealCards()))); + OutputView.printInitProgress(combine(dealer, players)); - OutputView.printInitProgress(participants); + drawCardsIfWant(deck, players); + drawCardIfCan(deck, dealer); + + } + + private static void drawCardsIfWant(final Deck deck, final List players) { + players.forEach(player -> additionalDraw(deck, player)); + } + + private static void additionalDraw(final Deck deck, final Participant player) { + while (player.canDraw() && isAgree(player)) { + player.addCard(deck.draw()); + OutputView.printParticipantsStatus(Collections.singletonList(player)); + } + } + + private static boolean isAgree(final Participant player) { + return InputView.inputDrawFlag(player.getName()).equalsIgnoreCase("y"); + } + + private static void drawCardIfCan(final Deck deck, final Participant dealer) { + if (dealer.canDraw()) { + dealer.addCard(deck.draw()); + OutputView.printDealerDraw(); + } + } + + private static List combine(final Participant dealer, final List participants) { + return Collections.unmodifiableList( + Stream.concat(Stream.of(dealer), participants.stream()) + .collect(Collectors.toList())); } } diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index b9a2dd47..7d6e1d65 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -1,14 +1,14 @@ package blackjack.domain.participant; +import blackjack.domain.card.Card; import blackjack.domain.card.Hands; -import java.util.Arrays; import java.util.List; public abstract class Participant { protected final Hands hands; - public Participant(final Hands hands) { + Participant(final Hands hands) { this.hands = hands; } @@ -23,4 +23,8 @@ public int getScore() { public List getCardNames() { return hands.getCardNames(); } + + public void addCard(final Card card) { + hands.add(card); + } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 319cb641..b07da363 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -6,6 +6,8 @@ public class InputView { private static final String PLAYERS_INPUT_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; private static final String DRAW_FLAG_INPUT_MESSAGE_FORMAT = "%s. 한장의 카드를 더 받으실건가요?(예는 y, 아니오는 n)%n"; + private static final String DRAW_FLAG_REGEX = "[ynYN]"; + private static final String INVALID_DRAW_FLAG_EXCEPTION_MESSAGE = "[ERROR] y 또는 n만 입력 가능합니다"; private InputView() {} @@ -16,7 +18,15 @@ public static String inputPlayers() { public static String inputDrawFlag(final String name) { System.out.printf(DRAW_FLAG_INPUT_MESSAGE_FORMAT, name); - return input(); + final String input = input(); + validateDrawFlag(input); + return input; + } + + private static void validateDrawFlag(final String input) { + if (!input.matches(DRAW_FLAG_REGEX)) { + throw new IllegalArgumentException(INVALID_DRAW_FLAG_EXCEPTION_MESSAGE); + } } private static String input() { diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index e8b7b67b..43d83e8a 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -42,4 +42,7 @@ private static String getCardNames(final Participant participant) { return participant.getCardNames().stream() .collect(Collectors.joining(DELIMITER)); } + public static void printDealerDraw() { + System.out.println(DEALER_DRAW_MESSAGE); + } } From 460f2c42b7fc9efa27b744666e1b8156a08fe7d3 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 22:33:20 +0900 Subject: [PATCH 097/106] =?UTF-8?q?style:=20=EA=B3=B5=EB=B0=B1=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A4=84=EB=B0=94=EA=BF=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/card/CardTest.java | 6 +++--- src/test/java/blackjack/domain/card/DeckTest.java | 2 +- src/test/java/blackjack/domain/participant/DealerTest.java | 2 +- src/test/java/blackjack/domain/participant/PlayerTest.java | 2 +- src/test/java/blackjack/util/ParserTest.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index 33e5fe06..d4062440 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -15,13 +15,13 @@ class CardTest { @DisplayName("ACE이면 true 반환한다.") @Test - void Given에이스_When판단_Then참 () { + void Given에이스_When판단_Then참() { assertThat(new Card(Pattern.SPADE, Rank.ACE).isAce()).isTrue(); } @DisplayName("ACE가 아니면 false를 반환한다.") @Test - void Given에이스_이외의_카드_When판단_Then거짓 () { + void Given에이스_이외의_카드_When판단_Then거짓() { assertThat(new Card(Pattern.SPADE, Rank.KING).isAce()).isFalse(); } -} \ No newline at end of file +} diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index 603f4ce0..d681f8d1 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -45,4 +45,4 @@ void Given_When_Then() { // Then assertThat(cards.size()).isEqualTo(52); } -} \ No newline at end of file +} diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index b928b234..61ea5d9d 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -44,4 +44,4 @@ class DealerTest { assertThat(dealer.canDraw()).isFalse(); } -} \ No newline at end of file +} diff --git a/src/test/java/blackjack/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java index c0cb313e..0d36ef06 100644 --- a/src/test/java/blackjack/domain/participant/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -44,4 +44,4 @@ class PlayerTest { assertThat(player.canDraw()).isFalse(); } -} \ No newline at end of file +} diff --git a/src/test/java/blackjack/util/ParserTest.java b/src/test/java/blackjack/util/ParserTest.java index 4c1366c4..4f580b40 100644 --- a/src/test/java/blackjack/util/ParserTest.java +++ b/src/test/java/blackjack/util/ParserTest.java @@ -26,4 +26,4 @@ class ParserTest { assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> Parser.parse(input)); } -} \ No newline at end of file +} From 930eb9aff684ff8f2114b21cee2e8f8470e81f04 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 22:37:10 +0900 Subject: [PATCH 098/106] =?UTF-8?q?test:=20Judge=20=EA=B4=80=EB=A0=A8=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 승패의 경우의 수 테스트 --- .../blackjack/domain/judge/JudgeTest.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/test/java/blackjack/domain/judge/JudgeTest.java diff --git a/src/test/java/blackjack/domain/judge/JudgeTest.java b/src/test/java/blackjack/domain/judge/JudgeTest.java new file mode 100644 index 00000000..14d09f6f --- /dev/null +++ b/src/test/java/blackjack/domain/judge/JudgeTest.java @@ -0,0 +1,101 @@ +package blackjack.domain.judge; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Hands; +import blackjack.domain.card.Pattern; +import blackjack.domain.card.Rank; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Player; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class JudgeTest { + + private final Hands score16 = new Hands(Arrays.asList( + new Card(Pattern.CLUB, Rank.TEN), + new Card(Pattern.HEART, Rank.SIX))); + + private final Hands score21 = new Hands(Arrays.asList( + new Card(Pattern.DIAMOND, Rank.ACE), + new Card(Pattern.HEART, Rank.TEN))); + + private final Hands score26 = new Hands(Arrays.asList( + new Card(Pattern.DIAMOND, Rank.TEN), + new Card(Pattern.HEART, Rank.SIX), + new Card(Pattern.HEART, Rank.TEN))); + + private final Judge judge = new Judge(); + + private final Map playerWin = new HashMap() { + { + put("딜러", "0승 1패"); + put("jason", "승"); + } + }; + + private final Map dealerWin = new HashMap() { + { + put("딜러", "1승 0패"); + put("jason", "패"); + } + }; + + @DisplayName("플레이어가 딜러보다 점수가 높으면 플레이어가 승리한다.") + @Test + void Given플레이어_딜러_점수_When플레이어가_높은_Then플레이어_승리() { + final Dealer dealer = new Dealer(score16); + final Player player = new Player("jason", score21); + + assertThat(judge.getWinOrLose(dealer, Arrays.asList(player))).isEqualTo(playerWin); + } + + @DisplayName("플레이어가 딜러보다 점수가 낮으면 딜러가 승리한다.") + @Test + void Given플레이어_딜러_점수_When딜러가_높은_The딜러_승리() { + final Dealer dealer = new Dealer(score21); + final Player player = new Player("jason", score16); + + assertThat(judge.getWinOrLose(dealer, Arrays.asList(player))).isEqualTo(dealerWin); + } + + @DisplayName("딜러와 플레이어가 모두 21을 넘었을 때, 딜러가 승리한다.") + @Test + void Given플레이어_딜러_점수_When둘다_21_초과_The딜러_승리() { + final Dealer dealer = new Dealer(score26); + final Player player = new Player("jason", score26); + + assertThat(judge.getWinOrLose(dealer, Arrays.asList(player))).isEqualTo(dealerWin); + } + + @DisplayName("딜러는 21을 넘고, 플레이어는 넘지 않았으면 플레이어가 승리한다.") + @Test + void Given플레이어_딜러_점수When딜러_21_초과_The플레이어_승리() { + final Dealer dealer = new Dealer(score26); + final Player player = new Player("jason", score16); + + assertThat(judge.getWinOrLose(dealer, Arrays.asList(player))).isEqualTo(playerWin); + } + + @DisplayName("플레이어는 21을 넘고, 딜러는 넘지 않았으면 딜러가 승리한다.") + @Test + void Given플레이어_딜러_점수When플레이어_21_초과_The딜러_승리() { + final Dealer dealer = new Dealer(score21); + final Player player = new Player("jason", score26); + + assertThat(judge.getWinOrLose(dealer, Arrays.asList(player))).isEqualTo(dealerWin); + } + + @DisplayName("플레이어와 딜러의 점수가 같으면 딜러가 승리한다.") + @Test + void Given플레이어_딜러_점수When같다_The딜러_승리() { + final Dealer dealer = new Dealer(score21); + final Player player = new Player("jason", score21); + + assertThat(judge.getWinOrLose(dealer, Arrays.asList(player))).isEqualTo(dealerWin); + } +} From c982483a2bb876c8da65df3214bcd6ffdcb23dc8 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 22:37:59 +0900 Subject: [PATCH 099/106] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20=EC=8A=B9=ED=8C=A8=EB=A5=BC=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=ED=95=98=EB=8A=94=20Judge=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/BlackJackApplication.java | 3 ++ .../java/blackjack/domain/judge/Judge.java | 43 +++++++++++++++++++ src/main/java/blackjack/view/OutputView.java | 32 +++++++++++++- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/domain/judge/Judge.java diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java index f5c4f6a6..fd0dec10 100644 --- a/src/main/java/blackjack/BlackJackApplication.java +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -1,5 +1,6 @@ package blackjack; +import blackjack.domain.judge.Judge; import blackjack.domain.card.Deck; import blackjack.domain.card.Hands; import blackjack.domain.participant.Dealer; @@ -29,6 +30,8 @@ public static void main(String[] args) { drawCardsIfWant(deck, players); drawCardIfCan(deck, dealer); + final Judge judge = new Judge(); + OutputView.printResult(combine(dealer, players), judge.getWinOrLose(dealer, players)); } private static void drawCardsIfWant(final Deck deck, final List players) { diff --git a/src/main/java/blackjack/domain/judge/Judge.java b/src/main/java/blackjack/domain/judge/Judge.java new file mode 100644 index 00000000..f80f2295 --- /dev/null +++ b/src/main/java/blackjack/domain/judge/Judge.java @@ -0,0 +1,43 @@ +package blackjack.domain.judge; + +import blackjack.domain.participant.Participant; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class Judge { + + private static final int LIMIT_SCORE = 21; + private static final String WIN = "승"; + private static final String LOSE = "패"; + private static final String DEALER_WIN_OR_LOSE_FORMAT = "%d승 %d패"; + + public Map getWinOrLose(final Participant dealer, final List players) { + final Map result = new LinkedHashMap<>(); + + players.forEach(player -> result.put( + player.getName(), + getWinOrLosePerPlayer(player.getScore(), dealer.getScore()))); + + final int winCount = (int) result.values().stream() + .filter(v -> v.equals(LOSE)) + .count(); + + result.put(dealer.getName(), + String.format(DEALER_WIN_OR_LOSE_FORMAT, winCount, result.size() - winCount)); + + return result; + } + + private String getWinOrLosePerPlayer(final int playerScore, final int dealerScore) { + if (playerScore < LIMIT_SCORE && dealerScore > LIMIT_SCORE) { + return WIN; + } + + if (playerScore > LIMIT_SCORE || playerScore <= dealerScore) { + return LOSE; + } + + return WIN; + } +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 43d83e8a..808bcab0 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -2,6 +2,7 @@ import blackjack.domain.participant.Participant; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class OutputView { @@ -10,6 +11,10 @@ public class OutputView { private static final int NUMBER_OF_INIT_HANDS = 2; private static final String DISTRIBUTE_MESSAGE_FORMAT = "%s에게 카드를 %d장씩 분배하였습니다.%n"; private static final String PARTICIPANT_STATUS_FORMAT = "%s카드: %s%n"; + private static final String PARTICIPANT_FINAL_STATUS_FORMAT = "%s카드: %s - 결과: %d%n"; + private static final String WINNING_OR_LOSE_HEADER_MESSAGE = "## 최종 승패\n"; + private static final String WINNING_OR_LOSE_FORMAT = "%s: %s%n"; + private static final String DEALER_DRAW_MESSAGE = "딜러는 16이하라 한장의 카드를 더 받았습니다.\n"; private OutputView() { } @@ -29,7 +34,7 @@ private static String getNames(final List participants) { .collect(Collectors.joining(DELIMITER)); } - private static void printParticipantsStatus(final List participants) { + public static void printParticipantsStatus(final List participants) { StringBuilder status = new StringBuilder(); participants.forEach(participant -> status.append(String.format( @@ -42,6 +47,31 @@ private static String getCardNames(final Participant participant) { return participant.getCardNames().stream() .collect(Collectors.joining(DELIMITER)); } + + public static void printResult(List participants, Map result) { + printFinalStatus(participants); + printWinning(result); + } + + private static void printFinalStatus(List participants) { + StringBuilder status = new StringBuilder(); + participants.forEach(participant -> + status.append(String.format( + PARTICIPANT_FINAL_STATUS_FORMAT, participant.getName(), getCardNames(participant), participant.getScore()))); + + System.out.println(status); + } + + private static void printWinning(Map results) { + StringBuilder winningOrLose = new StringBuilder(WINNING_OR_LOSE_HEADER_MESSAGE); + + results.forEach((name, result)-> + winningOrLose.append(String.format( + WINNING_OR_LOSE_FORMAT, name, result))); + + System.out.println(winningOrLose); + } + public static void printDealerDraw() { System.out.println(DEALER_DRAW_MESSAGE); } From 3835cb6ebdab84714492af0c971aa8cc968e3201 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 22:38:29 +0900 Subject: [PATCH 100/106] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 0ce2f89a..f45b8b57 100644 --- a/README.md +++ b/README.md @@ -54,30 +54,30 @@ - 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. - 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. - 게임을 완료한 후 각 플레이어별로 승패를 출력한다. + - 딜러와 플레이어의 카드 합이 같을 경우, 딜러가 승리한다. + - 딜러와 플레이어가 모두 21을 넘었을 때, 딜러가 승리한다. - 카드 : 스페이드, 클로버, 하트, 다이아 1~10, JQK ## 구현 사항. -- [ ] InputView +- [x] InputView - [x] 플레이어의 이름을 받는다. (`,`로 구분) - [x] 카드를 받을 지에 대한 여부 입력 (`y`, `n`으로 구분) - - [ ] 'y' 와 'n'이 아닐 경우 exception이 발생한다. + - [x] 'y' 와 'n'이 아닐 경우 exception이 발생한다. - [x] Parser - [x] 플레이어 이름이 비어있는지 확인한다. - [x] Deck - - Cards(set: pattern, rank) - - [x] 카드 뽑기 - draw - - 카드 제거 - Cards without(Card card) - + - [x] 카드 분배 + - [x] Cards - - [x] Card 생성 - - [x] Card 하나 뽑기 + - [x] Cards(list: pattern, rank) + - [x] 카드 뽑기 - draw - [x] 빈 덱이라면 예외 발생 - - [x] 전체 Card에서 한 개의 Card 제거 - + - [x] 카드 제거 - Cards remove(Card card) + - [x] Card - [x] ACE 인지 확인. - [x] 이름(patter + rank) @@ -85,20 +85,18 @@ - [x] Hands - [x] 두 장의 카드로 초기화 - [x] 카드 관리 - - [ ] 현재 점수 관리 + - [x] 현재 점수 관리 - [x] ACE의 값을 결정한다. - [x] Score - [x] Card의 합 - [x] 기존 합에 한장의 Card의 값을 더한 값을 반환한다. -- [x] Game - - [x] 카드 분배 +- [x] Judge + - [x] 승패 구하기 + - [x] 딜러와 플레이어의 카드 합이 같을 경우, 딜러가 승리한다. + - [x] 딜러와 플레이어가 모두 21을 넘었을 때, 딜러가 승리한다. -- [ ] Result - - [ ] 결과 구하기 - - [ ] 승패 구하기 - - [x] abstract Participant (딜러, 플레이어) - [x] 이름을 가진다. - [x] 자신의 패를 가진다. @@ -109,16 +107,13 @@ - [x] 플레이어 이름을 반환한다. (Override) - [x] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 21을 초과하면 턴을 종료한다. -- [ ] Players - - [ ] 플레이어들 - - [x] Dealer extends Participant - - '딜러' 를 반환한다. (Override) + - [x] '딜러' 를 반환한다. (Override) - [x] 카드를 더 받을 수 있는지. (Override) -> 카드의 합이 16을 초과하면 턴을 종료한다. -- [ ] OutputView +- [x] OutputView - [x] 참가자 패 - [x] 참가자 카드 분배 - - [ ] 참가자 최종 결과 - - [ ] 참가자 최종 승패 - - [ ] 딜러는 16이하라 한장의 카드를 더 받았습니다. + - [x] 참가자 최종 결과 + - [x] 참가자 최종 승패 + - [x] 딜러는 16이하라 한장의 카드를 더 받았습니다. From 9f64fad4200b469e73eb01823d37b53a3ff25111 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 22:44:44 +0900 Subject: [PATCH 101/106] =?UTF-8?q?refactor:=20=EB=84=A4=EC=9D=B4=EB=B0=8D?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Hands.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Hands.java b/src/main/java/blackjack/domain/card/Hands.java index 54a11ae8..8dec7f04 100644 --- a/src/main/java/blackjack/domain/card/Hands.java +++ b/src/main/java/blackjack/domain/card/Hands.java @@ -7,8 +7,8 @@ public class Hands { private static final int DECISION_VALUE = 10; - private static final int ONE_ACE_VALUE = 1; - private static final int ELEVEN_ACE_VALUE = 11; + private static final int ACE_VALUE_1 = 1; + private static final int ACE_VALUE_11 = 11; private final List cards; private Score score; @@ -17,10 +17,10 @@ public Hands(final List cards) { this.cards = new ArrayList<>(); this.score = new Score(); - init(cards); + initAllField(cards); } - private void init(final List cards) { + private void initAllField(final List cards) { cards.forEach(this::add); } @@ -38,14 +38,15 @@ private int getRank(final Card card) { private int getAceValue() { if (this.score.getValue() > DECISION_VALUE) { - return ONE_ACE_VALUE; + return ACE_VALUE_1; } - return ELEVEN_ACE_VALUE; + return ACE_VALUE_11; } public boolean isUnderScore(final int value) { return score.isUnder(value); } + public int getScore() { return score.getValue(); } From 2b18ffafa27874ad20d8b03c7928682fa325f8d8 Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 23:22:48 +0900 Subject: [PATCH 102/106] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98,=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/BlackJackApplication.java | 12 +++++------ src/main/java/blackjack/domain/card/Deck.java | 2 +- src/main/java/blackjack/view/InputView.java | 2 +- src/main/java/blackjack/view/OutputView.java | 20 +++++++++---------- .../java/blackjack/domain/card/DeckTest.java | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java index fd0dec10..fb42281d 100644 --- a/src/main/java/blackjack/BlackJackApplication.java +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -19,19 +19,19 @@ public class BlackJackApplication { public static void main(String[] args) { final Deck deck = new Deck(); - final List playerNames = Parser.parse(InputView.inputPlayers()); - final Participant dealer = new Dealer(new Hands(deck.dealInitCards())); + final List playerNames = Parser.parse(InputView.inputPlayerNames()); + final Participant dealer = new Dealer(new Hands(deck.dealCards())); final List players = playerNames.stream() - .map(name -> new Player(name, new Hands(deck.dealInitCards()))) + .map(name -> new Player(name, new Hands(deck.dealCards()))) .collect(Collectors.toList()); - OutputView.printInitProgress(combine(dealer, players)); + OutputView.printStartStatus(combine(dealer, players)); drawCardsIfWant(deck, players); drawCardIfCan(deck, dealer); final Judge judge = new Judge(); - OutputView.printResult(combine(dealer, players), judge.getWinOrLose(dealer, players)); + OutputView.printGameResult(combine(dealer, players), judge.getWinOrLose(dealer, players)); } private static void drawCardsIfWant(final Deck deck, final List players) { @@ -52,7 +52,7 @@ private static boolean isAgree(final Participant player) { private static void drawCardIfCan(final Deck deck, final Participant dealer) { if (dealer.canDraw()) { dealer.addCard(deck.draw()); - OutputView.printDealerDraw(); + OutputView.printDealerDrawMessage(); } } diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 705e83f1..fe96b7f5 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -20,7 +20,7 @@ public Card draw() { return card; } - public List dealInitCards() { + public List dealCards() { return IntStream.range(0, NUMBER_OF_INIT_HANDS) .mapToObj(i -> draw()) .collect(Collectors.toList()); diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index b07da363..ad8c06f9 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -11,7 +11,7 @@ public class InputView { private InputView() {} - public static String inputPlayers() { + public static String inputPlayerNames() { System.out.println(PLAYERS_INPUT_MESSAGE); return input(); } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 808bcab0..b5968c78 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -19,12 +19,12 @@ public class OutputView { private OutputView() { } - public static void printInitProgress(final List participants) { - printDistributeInfo(participants); + public static void printStartStatus(final List participants) { + printDealResult(participants); printParticipantsStatus(participants); } - private static void printDistributeInfo(final List participants) { + private static void printDealResult(final List participants) { System.out.printf(DISTRIBUTE_MESSAGE_FORMAT, getNames(participants), NUMBER_OF_INIT_HANDS); } @@ -48,9 +48,9 @@ private static String getCardNames(final Participant participant) { .collect(Collectors.joining(DELIMITER)); } - public static void printResult(List participants, Map result) { + public static void printGameResult(List participants, Map result) { printFinalStatus(participants); - printWinning(result); + printWinOrLose(result); } private static void printFinalStatus(List participants) { @@ -62,17 +62,17 @@ private static void printFinalStatus(List participants) { System.out.println(status); } - private static void printWinning(Map results) { - StringBuilder winningOrLose = new StringBuilder(WINNING_OR_LOSE_HEADER_MESSAGE); + private static void printWinOrLose(Map results) { + StringBuilder winOrLose = new StringBuilder(WINNING_OR_LOSE_HEADER_MESSAGE); results.forEach((name, result)-> - winningOrLose.append(String.format( + winOrLose.append(String.format( WINNING_OR_LOSE_FORMAT, name, result))); - System.out.println(winningOrLose); + System.out.println(winOrLose); } - public static void printDealerDraw() { + public static void printDealerDrawMessage() { System.out.println(DEALER_DRAW_MESSAGE); } } diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index d681f8d1..41d54a86 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -27,7 +27,7 @@ void GivenNothing_When_Then() { @DisplayName("참가자들의 초기 패를 뽑는다.") @Test void Given_When_Then() { - assertThat(sut.dealInitCards().size()).isEqualTo(2); + assertThat(sut.dealCards().size()).isEqualTo(2); } @DisplayName("중복없이 모든 카드가 뽑힌다.") From 525c26164585861d98f1f0b1734d073a8321c41c Mon Sep 17 00:00:00 2001 From: 0JUUU Date: Thu, 17 Feb 2022 23:26:58 +0900 Subject: [PATCH 103/106] =?UTF-8?q?refactor:=20Dealer,=20Player=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hands -> List로 변경 --- src/main/java/blackjack/BlackJackApplication.java | 5 ++--- .../java/blackjack/domain/participant/Dealer.java | 6 ++++-- .../java/blackjack/domain/participant/Player.java | 6 ++++-- .../java/blackjack/domain/judge/JudgeTest.java | 14 +++++++------- .../blackjack/domain/participant/DealerTest.java | 12 ++++++------ .../blackjack/domain/participant/PlayerTest.java | 13 ++++++------- 6 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java index fb42281d..5a313309 100644 --- a/src/main/java/blackjack/BlackJackApplication.java +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -2,7 +2,6 @@ import blackjack.domain.judge.Judge; import blackjack.domain.card.Deck; -import blackjack.domain.card.Hands; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Participant; import blackjack.domain.participant.Player; @@ -20,9 +19,9 @@ public static void main(String[] args) { final Deck deck = new Deck(); final List playerNames = Parser.parse(InputView.inputPlayerNames()); - final Participant dealer = new Dealer(new Hands(deck.dealCards())); + final Participant dealer = new Dealer(deck.dealCards()); final List players = playerNames.stream() - .map(name -> new Player(name, new Hands(deck.dealCards()))) + .map(name -> new Player(name, deck.dealCards())) .collect(Collectors.toList()); OutputView.printStartStatus(combine(dealer, players)); diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index c4062c34..73df0eca 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -1,14 +1,16 @@ package blackjack.domain.participant; +import blackjack.domain.card.Card; import blackjack.domain.card.Hands; +import java.util.List; public class Dealer extends Participant { private static final String DEALER = "딜러"; private static final int DRAWABLE_SCORE_LIMIT = 17; - public Dealer(final Hands hands) { - super(hands); + public Dealer(final List cards) { + super(new Hands(cards)); } @Override diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index 709613f3..64416a4f 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,6 +1,8 @@ package blackjack.domain.participant; +import blackjack.domain.card.Card; import blackjack.domain.card.Hands; +import java.util.List; public class Player extends Participant { @@ -8,8 +10,8 @@ public class Player extends Participant { private final String name; - public Player(final String name, final Hands hands) { - super(hands); + public Player(final String name, List cards) { + super(new Hands(cards)); this.name = name; } diff --git a/src/test/java/blackjack/domain/judge/JudgeTest.java b/src/test/java/blackjack/domain/judge/JudgeTest.java index 14d09f6f..dcbf565c 100644 --- a/src/test/java/blackjack/domain/judge/JudgeTest.java +++ b/src/test/java/blackjack/domain/judge/JudgeTest.java @@ -3,31 +3,31 @@ import static org.assertj.core.api.Assertions.assertThat; import blackjack.domain.card.Card; -import blackjack.domain.card.Hands; import blackjack.domain.card.Pattern; import blackjack.domain.card.Rank; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Player; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class JudgeTest { - private final Hands score16 = new Hands(Arrays.asList( + private final List score16 = Arrays.asList( new Card(Pattern.CLUB, Rank.TEN), - new Card(Pattern.HEART, Rank.SIX))); + new Card(Pattern.HEART, Rank.SIX)); - private final Hands score21 = new Hands(Arrays.asList( + private final List score21 = Arrays.asList( new Card(Pattern.DIAMOND, Rank.ACE), - new Card(Pattern.HEART, Rank.TEN))); + new Card(Pattern.HEART, Rank.TEN)); - private final Hands score26 = new Hands(Arrays.asList( + private final List score26 = Arrays.asList( new Card(Pattern.DIAMOND, Rank.TEN), new Card(Pattern.HEART, Rank.SIX), - new Card(Pattern.HEART, Rank.TEN))); + new Card(Pattern.HEART, Rank.TEN)); private final Judge judge = new Judge(); diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index 61ea5d9d..8dbb33b6 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -16,9 +16,9 @@ class DealerTest { @Test void Given카드들_When점수_얻기_Then점수_합_반환() { final Dealer dealer = new Dealer( - new Hands(Arrays.asList( + Arrays.asList( new Card(Pattern.CLUB, Rank.EIGHT), - new Card(Pattern.SPADE, Rank.EIGHT)))); + new Card(Pattern.SPADE, Rank.EIGHT))); assertThat(dealer.getScore()).isEqualTo(16); } @@ -27,9 +27,9 @@ class DealerTest { @Test void Given카드들_When점수가_17미만_Then참_반환() { final Dealer dealer = new Dealer( - new Hands(Arrays.asList( + Arrays.asList( new Card(Pattern.CLUB, Rank.EIGHT), - new Card(Pattern.HEART, Rank.FIVE)))); + new Card(Pattern.HEART, Rank.FIVE))); assertThat(dealer.canDraw()).isTrue(); } @@ -38,9 +38,9 @@ class DealerTest { @Test void Given카드들_When점수가_17이상_Then거짓_반환() { final Dealer dealer = new Dealer( - new Hands(Arrays.asList( + Arrays.asList( new Card(Pattern.CLUB, Rank.TEN), - new Card(Pattern.HEART, Rank.ACE)))); + new Card(Pattern.HEART, Rank.ACE))); assertThat(dealer.canDraw()).isFalse(); } diff --git a/src/test/java/blackjack/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java index 0d36ef06..38db73be 100644 --- a/src/test/java/blackjack/domain/participant/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -3,7 +3,6 @@ import static org.assertj.core.api.Assertions.assertThat; import blackjack.domain.card.Card; -import blackjack.domain.card.Hands; import blackjack.domain.card.Pattern; import blackjack.domain.card.Rank; import java.util.Arrays; @@ -16,9 +15,9 @@ class PlayerTest { @Test void Given카드들_When점수_얻기_Then점수_합_반환() { final Player player = new Player("jason", - new Hands(Arrays.asList( + Arrays.asList( new Card(Pattern.CLUB, Rank.EIGHT), - new Card(Pattern.SPADE, Rank.EIGHT)))); + new Card(Pattern.SPADE, Rank.EIGHT))); assertThat(player.getScore()).isEqualTo(16); } @@ -27,9 +26,9 @@ class PlayerTest { @Test void Given카드들_When점수가_21미만_Then참_반환() { final Player player = new Player("jason", - new Hands(Arrays.asList( + Arrays.asList( new Card(Pattern.CLUB, Rank.EIGHT), - new Card(Pattern.HEART, Rank.FIVE)))); + new Card(Pattern.HEART, Rank.FIVE))); assertThat(player.canDraw()).isTrue(); } @@ -38,9 +37,9 @@ class PlayerTest { @Test void Given카드들_When점수가_21이상_Then거짓_반환() { final Player player = new Player("jason", - new Hands(Arrays.asList( + Arrays.asList( new Card(Pattern.CLUB, Rank.TEN), - new Card(Pattern.HEART, Rank.ACE)))); + new Card(Pattern.HEART, Rank.ACE))); assertThat(player.canDraw()).isFalse(); } From 9ee25c206a4662978d08b895f240e11d20f0bb67 Mon Sep 17 00:00:00 2001 From: kimtaejun97 Date: Fri, 18 Feb 2022 00:14:08 +0900 Subject: [PATCH 104/106] =?UTF-8?q?refactor:=20getWinOrLose=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EC=B6=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/judge/Judge.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/blackjack/domain/judge/Judge.java b/src/main/java/blackjack/domain/judge/Judge.java index f80f2295..a3cd0f0a 100644 --- a/src/main/java/blackjack/domain/judge/Judge.java +++ b/src/main/java/blackjack/domain/judge/Judge.java @@ -8,36 +8,43 @@ public class Judge { private static final int LIMIT_SCORE = 21; - private static final String WIN = "승"; - private static final String LOSE = "패"; + private static final String PLAYER_WIN = "승"; + private static final String PLAYER_LOSE = "패"; private static final String DEALER_WIN_OR_LOSE_FORMAT = "%d승 %d패"; public Map getWinOrLose(final Participant dealer, final List players) { - final Map result = new LinkedHashMap<>(); + final Map winOrLose = new LinkedHashMap<>(); - players.forEach(player -> result.put( + players.forEach(player -> winOrLose.put( player.getName(), getWinOrLosePerPlayer(player.getScore(), dealer.getScore()))); - final int winCount = (int) result.values().stream() - .filter(v -> v.equals(LOSE)) - .count(); + final int dealerWinCount = getDealerWinCount(winOrLose); + winOrLose.put(dealer.getName(), + String.format(DEALER_WIN_OR_LOSE_FORMAT, + dealerWinCount, getDealerLoseCount(winOrLose, dealerWinCount))); - result.put(dealer.getName(), - String.format(DEALER_WIN_OR_LOSE_FORMAT, winCount, result.size() - winCount)); - - return result; + return winOrLose; } private String getWinOrLosePerPlayer(final int playerScore, final int dealerScore) { if (playerScore < LIMIT_SCORE && dealerScore > LIMIT_SCORE) { - return WIN; + return PLAYER_WIN; } - if (playerScore > LIMIT_SCORE || playerScore <= dealerScore) { - return LOSE; + return PLAYER_LOSE; } - return WIN; + return PLAYER_WIN; + } + + private int getDealerWinCount(Map result) { + return (int) result.values().stream() + .filter(v -> v.equals(PLAYER_LOSE)) + .count(); + } + + private int getDealerLoseCount(Map winOrLose, int dealerWinCount) { + return winOrLose.size() - dealerWinCount; } } From 3bd09b55a57f9ec38fc71406e3a694d2b4c86588 Mon Sep 17 00:00:00 2001 From: kimtaejun97 Date: Fri, 18 Feb 2022 16:50:09 +0900 Subject: [PATCH 105/106] =?UTF-8?q?feat:=20getStartCardNames=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 요구 사항 변경. - 딜러는 처음에 한장의 카드만을 보여준다. --- src/main/java/blackjack/view/OutputView.java | 43 +++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index b5968c78..18ec7990 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,5 +1,6 @@ package blackjack.view; +import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Participant; import java.util.List; import java.util.Map; @@ -7,17 +8,17 @@ public class OutputView { - private static final String DELIMITER = ", "; + private static final String DEAL_MESSAGE_FORMAT = "%s에게 카드를 %d장씩 분배하였습니다.%n"; private static final int NUMBER_OF_INIT_HANDS = 2; - private static final String DISTRIBUTE_MESSAGE_FORMAT = "%s에게 카드를 %d장씩 분배하였습니다.%n"; + private static final String DELIMITER = ", "; private static final String PARTICIPANT_STATUS_FORMAT = "%s카드: %s%n"; + private static final int FIRST_CARD = 0; private static final String PARTICIPANT_FINAL_STATUS_FORMAT = "%s카드: %s - 결과: %d%n"; private static final String WINNING_OR_LOSE_HEADER_MESSAGE = "## 최종 승패\n"; private static final String WINNING_OR_LOSE_FORMAT = "%s: %s%n"; private static final String DEALER_DRAW_MESSAGE = "딜러는 16이하라 한장의 카드를 더 받았습니다.\n"; - private OutputView() { - } + private OutputView() {} public static void printStartStatus(final List participants) { printDealResult(participants); @@ -25,27 +26,38 @@ public static void printStartStatus(final List participants) { } private static void printDealResult(final List participants) { - System.out.printf(DISTRIBUTE_MESSAGE_FORMAT, getNames(participants), NUMBER_OF_INIT_HANDS); + System.out.printf(DEAL_MESSAGE_FORMAT, getNames(participants), NUMBER_OF_INIT_HANDS); } private static String getNames(final List participants) { return participants.stream() - .map(Participant::getName) - .collect(Collectors.joining(DELIMITER)); + .map(Participant::getName) + .collect(Collectors.joining(DELIMITER)); } public static void printParticipantsStatus(final List participants) { StringBuilder status = new StringBuilder(); participants.forEach(participant -> - status.append(String.format( - PARTICIPANT_STATUS_FORMAT, participant.getName(), getCardNames(participant)))); + status.append(String.format( + PARTICIPANT_STATUS_FORMAT, participant.getName(), getStartCardNames(participant)))); System.out.println(status); } + private static String getStartCardNames(final Participant participant) { + if (participant instanceof Dealer) { + return getOneCard(participant); + } + return getCardNames(participant); + } + + private static String getOneCard(Participant participant) { + return participant.getCardNames().get(FIRST_CARD); + } + private static String getCardNames(final Participant participant) { return participant.getCardNames().stream() - .collect(Collectors.joining(DELIMITER)); + .collect(Collectors.joining(DELIMITER)); } public static void printGameResult(List participants, Map result) { @@ -56,8 +68,9 @@ public static void printGameResult(List participants, Map participants) { StringBuilder status = new StringBuilder(); participants.forEach(participant -> - status.append(String.format( - PARTICIPANT_FINAL_STATUS_FORMAT, participant.getName(), getCardNames(participant), participant.getScore()))); + status.append(String.format( + PARTICIPANT_FINAL_STATUS_FORMAT, participant.getName(), getCardNames(participant), + participant.getScore()))); System.out.println(status); } @@ -65,9 +78,9 @@ private static void printFinalStatus(List participants) { private static void printWinOrLose(Map results) { StringBuilder winOrLose = new StringBuilder(WINNING_OR_LOSE_HEADER_MESSAGE); - results.forEach((name, result)-> - winOrLose.append(String.format( - WINNING_OR_LOSE_FORMAT, name, result))); + results.forEach((name, result) -> + winOrLose.append(String.format( + WINNING_OR_LOSE_FORMAT, name, result))); System.out.println(winOrLose); } From 36f6d1decb59a3e319d77d941f34789556d5b792 Mon Sep 17 00:00:00 2001 From: kimtaejun97 Date: Fri, 18 Feb 2022 16:53:57 +0900 Subject: [PATCH 106/106] =?UTF-8?q?fix:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20Score=20limit=20=EC=84=A4=EC=A0=95=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 플레이어가 21점이면 패배한 것으로 간주되는 버그, 21이 최대 점수가 되도록 수정. --- src/main/java/blackjack/domain/judge/Judge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/judge/Judge.java b/src/main/java/blackjack/domain/judge/Judge.java index a3cd0f0a..858823a5 100644 --- a/src/main/java/blackjack/domain/judge/Judge.java +++ b/src/main/java/blackjack/domain/judge/Judge.java @@ -28,7 +28,7 @@ public Map getWinOrLose(final Participant dealer, final List LIMIT_SCORE) { + if (playerScore <= LIMIT_SCORE && dealerScore > LIMIT_SCORE) { return PLAYER_WIN; } if (playerScore > LIMIT_SCORE || playerScore <= dealerScore) {