From e53857678d7f2968dc8b8722708884b04cf5cb94 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Tue, 28 Feb 2023 14:42:10 +0900 Subject: [PATCH 01/60] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 docs/READMD.md diff --git a/docs/READMD.md b/docs/READMD.md new file mode 100644 index 0000000000..7c41e7708a --- /dev/null +++ b/docs/READMD.md @@ -0,0 +1,21 @@ +## 도메인 + +### 카드 값 +- [ ] `2~10`, `A`, `K`, `Q`, `J` 가 있다. +- [ ] `A` 는 1 또는 11로 계산될 수 있다. +- [ ] `K`, `Q`, `J` 는 10으로 계산된다. + +### 카드 +- [ ] `다이아`, `클로버`, `하트`, `스페이드` 카드가 있다. +- [ ] `카드 값`을 가진다. + + +### 카드 영역 +- [ ] 카드들을 가진다. +- [ ] 카드를 더 받을 수 있는 상태인지 확인한다. +- [ ] 카드 숫자를 계산한다. +- [ ] 카드를 더 받을 것인지 결정한다. + +### 카드 덱 +- [ ] 전체 카드를 가진다. +- [ ] 카드를 한장씩 준다. \ No newline at end of file From 76aaecaf283bfbf0712d94c18793a9f2efe20bfc Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Tue, 28 Feb 2023 15:02:14 +0900 Subject: [PATCH 02/60] =?UTF-8?q?feat=20:=20cardValue=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 6 ++--- src/main/java/card/CardValue.java | 31 ++++++++++++++++++++++++ src/test/java/card/CardValueTest.java | 34 +++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 src/main/java/card/CardValue.java create mode 100644 src/test/java/card/CardValueTest.java diff --git a/docs/READMD.md b/docs/READMD.md index 7c41e7708a..0e96a3598f 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -1,9 +1,8 @@ ## 도메인 ### 카드 값 -- [ ] `2~10`, `A`, `K`, `Q`, `J` 가 있다. -- [ ] `A` 는 1 또는 11로 계산될 수 있다. -- [ ] `K`, `Q`, `J` 는 10으로 계산된다. +- [x] `2~10`, `A`, `K`, `Q`, `J` 가 있다. +- [x] `K`, `Q`, `J` 는 10으로 계산된다. ### 카드 - [ ] `다이아`, `클로버`, `하트`, `스페이드` 카드가 있다. @@ -15,6 +14,7 @@ - [ ] 카드를 더 받을 수 있는 상태인지 확인한다. - [ ] 카드 숫자를 계산한다. - [ ] 카드를 더 받을 것인지 결정한다. +- [ ] `A` 는 1 또는 11로 계산될 수 있다. ### 카드 덱 - [ ] 전체 카드를 가진다. diff --git a/src/main/java/card/CardValue.java b/src/main/java/card/CardValue.java new file mode 100644 index 0000000000..b19f5b9352 --- /dev/null +++ b/src/main/java/card/CardValue.java @@ -0,0 +1,31 @@ +package card; + +public enum CardValue { + + ACE(1), + + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + + KING(10), + QUEEN(10), + JACK(10) + ; + + private final int value; + + CardValue(final int value) { + this.value = value; + } + + public int value() { + return value; + } +} diff --git a/src/test/java/card/CardValueTest.java b/src/test/java/card/CardValueTest.java new file mode 100644 index 0000000000..2f2e7fd978 --- /dev/null +++ b/src/test/java/card/CardValueTest.java @@ -0,0 +1,34 @@ +package card; + +import org.junit.jupiter.api.*; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.*; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("CardValue 은") +class CardValueTest { + + @ParameterizedTest + @CsvSource(value = { + "TWO -> 2", + "THREE -> 3", + "FOUR -> 4", + "FIVE -> 5", + "SIX -> 6", + "SEVEN -> 7", + "EIGHT -> 8", + "NINE -> 9", + "TEN -> 10", + "KING -> 10", + "QUEEN -> 10", + "JACK -> 10", + "ACE -> 1", + }, delimiterString = " -> ") + void 값을_가진다(final CardValue cardValue, final int value) { + // when & then + assertEquals(cardValue.value(), value); + } +} \ No newline at end of file From 97742fcdbef609fd1e55f98145768940eaeb99de Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Tue, 28 Feb 2023 15:21:06 +0900 Subject: [PATCH 03/60] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EC=84=9C?= =?UTF-8?q?=EB=B8=8C=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 7 ++++-- src/main/java/card/Card.java | 14 +++++++++++ src/main/java/card/CloverCard.java | 8 ++++++ src/main/java/card/DiamondCard.java | 8 ++++++ src/main/java/card/HeartCard.java | 8 ++++++ src/main/java/card/SpadeCard.java | 8 ++++++ src/test/java/card/CardTest.java | 38 +++++++++++++++++++++++++++++ 7 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 src/main/java/card/Card.java create mode 100644 src/main/java/card/CloverCard.java create mode 100644 src/main/java/card/DiamondCard.java create mode 100644 src/main/java/card/HeartCard.java create mode 100644 src/main/java/card/SpadeCard.java create mode 100644 src/test/java/card/CardTest.java diff --git a/docs/READMD.md b/docs/READMD.md index 0e96a3598f..085c6f44ad 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -1,15 +1,17 @@ ## 도메인 ### 카드 값 + - [x] `2~10`, `A`, `K`, `Q`, `J` 가 있다. - [x] `K`, `Q`, `J` 는 10으로 계산된다. ### 카드 -- [ ] `다이아`, `클로버`, `하트`, `스페이드` 카드가 있다. -- [ ] `카드 값`을 가진다. +- [x] `다이아`, `클로버`, `하트`, `스페이드` 카드가 있다. +- [x] `카드 값`을 가진다. ### 카드 영역 + - [ ] 카드들을 가진다. - [ ] 카드를 더 받을 수 있는 상태인지 확인한다. - [ ] 카드 숫자를 계산한다. @@ -17,5 +19,6 @@ - [ ] `A` 는 1 또는 11로 계산될 수 있다. ### 카드 덱 + - [ ] 전체 카드를 가진다. - [ ] 카드를 한장씩 준다. \ No newline at end of file diff --git a/src/main/java/card/Card.java b/src/main/java/card/Card.java new file mode 100644 index 0000000000..9a5ce88bf9 --- /dev/null +++ b/src/main/java/card/Card.java @@ -0,0 +1,14 @@ +package card; + +public class Card { + + private final CardValue cardValue; + + public Card(final CardValue cardValue) { + this.cardValue = cardValue; + } + + public CardValue cardValue() { + return this.cardValue; + } +} diff --git a/src/main/java/card/CloverCard.java b/src/main/java/card/CloverCard.java new file mode 100644 index 0000000000..31eb830bb5 --- /dev/null +++ b/src/main/java/card/CloverCard.java @@ -0,0 +1,8 @@ +package card; + +public class CloverCard extends Card { + + public CloverCard(final CardValue cardValue) { + super(cardValue); + } +} diff --git a/src/main/java/card/DiamondCard.java b/src/main/java/card/DiamondCard.java new file mode 100644 index 0000000000..1e230d7d72 --- /dev/null +++ b/src/main/java/card/DiamondCard.java @@ -0,0 +1,8 @@ +package card; + +public class DiamondCard extends Card { + + public DiamondCard(final CardValue cardValue) { + super(cardValue); + } +} diff --git a/src/main/java/card/HeartCard.java b/src/main/java/card/HeartCard.java new file mode 100644 index 0000000000..45428f99e5 --- /dev/null +++ b/src/main/java/card/HeartCard.java @@ -0,0 +1,8 @@ +package card; + +public class HeartCard extends Card { + + public HeartCard(final CardValue cardValue) { + super(cardValue); + } +} diff --git a/src/main/java/card/SpadeCard.java b/src/main/java/card/SpadeCard.java new file mode 100644 index 0000000000..386f7a13e2 --- /dev/null +++ b/src/main/java/card/SpadeCard.java @@ -0,0 +1,8 @@ +package card; + +public class SpadeCard extends Card { + + public SpadeCard(final CardValue cardValue) { + super(cardValue); + } +} diff --git a/src/test/java/card/CardTest.java b/src/test/java/card/CardTest.java new file mode 100644 index 0000000000..0624de5a29 --- /dev/null +++ b/src/test/java/card/CardTest.java @@ -0,0 +1,38 @@ +package card; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("Card 은") +class CardTest { + + @Test + void 카드_값을_갖는다() { + // given + final Card card = new Card(CardValue.TWO); + + // when + CardValue cardValue = card.cardValue(); + + // then + assertThat(cardValue.value()).isEqualTo(2); + } + + @ParameterizedTest(name = "{arguments} 카드를 가질 수 있다.") + @ValueSource(classes = {DiamondCard.class, HeartCard.class, CloverCard.class, SpadeCard.class}) + void 여러_카드_종류가_있다(final Class type) throws Exception { + // given + final Card card = type.cast(type.getDeclaredConstructor(CardValue.class).newInstance(CardValue.TWO)); + + // when & then + assertThat(card).isInstanceOf(type); + } +} \ No newline at end of file From ba8e69850f66a5d62d08c56980dbcfe97541f640 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Tue, 28 Feb 2023 15:23:46 +0900 Subject: [PATCH 04/60] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/READMD.md b/docs/READMD.md index 085c6f44ad..8343e6ad7e 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -11,12 +11,13 @@ - [x] `카드 값`을 가진다. ### 카드 영역 - +- [ ] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. - [ ] 카드들을 가진다. - [ ] 카드를 더 받을 수 있는 상태인지 확인한다. - [ ] 카드 숫자를 계산한다. - [ ] 카드를 더 받을 것인지 결정한다. - [ ] `A` 는 1 또는 11로 계산될 수 있다. +- [ ] 처음에 카드 2장을 받아 생성된다. ### 카드 덱 From ad1c3c9fc3bc9716c870412796af33a8d3906921 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Tue, 28 Feb 2023 15:33:12 +0900 Subject: [PATCH 05/60] =?UTF-8?q?feat=20:=20CardArea=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 2 +- src/main/java/area/CardArea.java | 10 +++++++++ src/test/java/area/CardAreaTest.java | 33 ++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/main/java/area/CardArea.java create mode 100644 src/test/java/area/CardAreaTest.java diff --git a/docs/READMD.md b/docs/READMD.md index 8343e6ad7e..d447035e23 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -17,7 +17,7 @@ - [ ] 카드 숫자를 계산한다. - [ ] 카드를 더 받을 것인지 결정한다. - [ ] `A` 는 1 또는 11로 계산될 수 있다. -- [ ] 처음에 카드 2장을 받아 생성된다. +- [x] 처음에 카드 2장을 받아 생성된다. ### 카드 덱 diff --git a/src/main/java/area/CardArea.java b/src/main/java/area/CardArea.java new file mode 100644 index 0000000000..577b8b2c0e --- /dev/null +++ b/src/main/java/area/CardArea.java @@ -0,0 +1,10 @@ +package area; + +import card.Card; + +public class CardArea { + + public CardArea(final Card firstCard, final Card secondCard) { + + } +} diff --git a/src/test/java/area/CardAreaTest.java b/src/test/java/area/CardAreaTest.java new file mode 100644 index 0000000000..71e7d14c65 --- /dev/null +++ b/src/test/java/area/CardAreaTest.java @@ -0,0 +1,33 @@ +package area; + +import card.Card; +import card.CardValue; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("CardArea 은") +class CardAreaTest { + + @Test + void 카드를_두장만_받아서_생성된다() { + // when & then + assertDoesNotThrow(() -> new CardArea(new Card(CardValue.ACE), new Card(CardValue.TWO))); + } + + @Test + void () { + // given + + // when + + // then + } +} \ No newline at end of file From cd2f4e904e531f59265b3dd8a9b9448d9e100b1e Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Tue, 28 Feb 2023 15:43:07 +0900 Subject: [PATCH 06/60] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/READMD.md b/docs/READMD.md index d447035e23..2a78ed9203 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -17,6 +17,7 @@ - [ ] 카드 숫자를 계산한다. - [ ] 카드를 더 받을 것인지 결정한다. - [ ] `A` 는 1 또는 11로 계산될 수 있다. +- [ ] 카드를 추가할 수 있다. - [x] 처음에 카드 2장을 받아 생성된다. ### 카드 덱 From 1311e76b70d1454beabace98df42db35650003bb Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Tue, 28 Feb 2023 15:43:37 +0900 Subject: [PATCH 07/60] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 6 +++--- src/main/java/area/CardArea.java | 13 +++++++++++++ src/test/java/area/CardAreaTest.java | 11 +++++++---- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/READMD.md b/docs/READMD.md index 2a78ed9203..c0bc274215 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -12,12 +12,12 @@ ### 카드 영역 - [ ] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. -- [ ] 카드들을 가진다. +- [x] 카드들을 가진다. - [ ] 카드를 더 받을 수 있는 상태인지 확인한다. -- [ ] 카드 숫자를 계산한다. +- [ ] 카드 현숫자를 계산한다. - [ ] 카드를 더 받을 것인지 결정한다. - [ ] `A` 는 1 또는 11로 계산될 수 있다. -- [ ] 카드를 추가할 수 있다. +- [x] 카드를 추가할 수 있다. - [x] 처음에 카드 2장을 받아 생성된다. ### 카드 덱 diff --git a/src/main/java/area/CardArea.java b/src/main/java/area/CardArea.java index 577b8b2c0e..0635f359ed 100644 --- a/src/main/java/area/CardArea.java +++ b/src/main/java/area/CardArea.java @@ -2,9 +2,22 @@ import card.Card; +import java.util.ArrayList; +import java.util.List; + public class CardArea { + private final List cards = new ArrayList<>(); + public CardArea(final Card firstCard, final Card secondCard) { + cards.addAll(List.of(firstCard, secondCard)); + } + + public List cards() { + return new ArrayList<>(cards); + } + public void addCard(final Card card) { + cards.add(card); } } diff --git a/src/test/java/area/CardAreaTest.java b/src/test/java/area/CardAreaTest.java index 71e7d14c65..e5aa215225 100644 --- a/src/test/java/area/CardAreaTest.java +++ b/src/test/java/area/CardAreaTest.java @@ -7,9 +7,8 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -23,11 +22,15 @@ class CardAreaTest { } @Test - void () { + void 카드를_추가할_수_있다() { // given + final CardArea cardArea = new CardArea(new Card(CardValue.THREE), new Card(CardValue.TWO)); // when + final int beforeSize = cardArea.cards().size(); + cardArea.addCard(new Card(CardValue.FOUR)); // then + assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); } } \ No newline at end of file From 34f3580fb16725d4f95abc65157ecc59d1a2eeca Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Tue, 28 Feb 2023 15:55:05 +0900 Subject: [PATCH 08/60] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EC=98=81?= =?UTF-8?q?=EC=97=AD=EC=9D=84=20=EB=94=9C=EB=9F=AC=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=98=81=EC=97=AD=EA=B3=BC=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=98=81=EC=97=AD=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=82=98=EB=88=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 2 +- src/main/java/area/CardArea.java | 2 +- src/main/java/area/DealerCardArea.java | 10 +++++++++ src/main/java/area/ParticipantCardArea.java | 10 +++++++++ src/test/java/area/CardAreaTest.java | 25 +++++++++++++++++++-- 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/main/java/area/DealerCardArea.java create mode 100644 src/main/java/area/ParticipantCardArea.java diff --git a/docs/READMD.md b/docs/READMD.md index c0bc274215..fc958e9b90 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -11,7 +11,7 @@ - [x] `카드 값`을 가진다. ### 카드 영역 -- [ ] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. +- [x] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. - [x] 카드들을 가진다. - [ ] 카드를 더 받을 수 있는 상태인지 확인한다. - [ ] 카드 현숫자를 계산한다. diff --git a/src/main/java/area/CardArea.java b/src/main/java/area/CardArea.java index 0635f359ed..b3e7acc95d 100644 --- a/src/main/java/area/CardArea.java +++ b/src/main/java/area/CardArea.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import java.util.List; -public class CardArea { +public abstract class CardArea { private final List cards = new ArrayList<>(); diff --git a/src/main/java/area/DealerCardArea.java b/src/main/java/area/DealerCardArea.java new file mode 100644 index 0000000000..d68a2f62e8 --- /dev/null +++ b/src/main/java/area/DealerCardArea.java @@ -0,0 +1,10 @@ +package area; + +import card.Card; + +public class DealerCardArea extends CardArea { + + public DealerCardArea(final Card firstCard, final Card secondCard) { + super(firstCard, secondCard); + } +} diff --git a/src/main/java/area/ParticipantCardArea.java b/src/main/java/area/ParticipantCardArea.java new file mode 100644 index 0000000000..b0aa86406a --- /dev/null +++ b/src/main/java/area/ParticipantCardArea.java @@ -0,0 +1,10 @@ +package area; + +import card.Card; + +public class ParticipantCardArea extends CardArea { + + public ParticipantCardArea(final Card firstCard, final Card secondCard) { + super(firstCard, secondCard); + } +} diff --git a/src/test/java/area/CardAreaTest.java b/src/test/java/area/CardAreaTest.java index e5aa215225..78581de51b 100644 --- a/src/test/java/area/CardAreaTest.java +++ b/src/test/java/area/CardAreaTest.java @@ -6,6 +6,8 @@ import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -18,13 +20,15 @@ class CardAreaTest { @Test void 카드를_두장만_받아서_생성된다() { // when & then - assertDoesNotThrow(() -> new CardArea(new Card(CardValue.ACE), new Card(CardValue.TWO))); + assertDoesNotThrow(() -> new CardArea(new Card(CardValue.ACE), new Card(CardValue.TWO)) { + }); } @Test void 카드를_추가할_수_있다() { // given - final CardArea cardArea = new CardArea(new Card(CardValue.THREE), new Card(CardValue.TWO)); + final CardArea cardArea = new CardArea(new Card(CardValue.THREE), new Card(CardValue.TWO)) { + }; // when final int beforeSize = cardArea.cards().size(); @@ -33,4 +37,21 @@ class CardAreaTest { // then assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); } + + @Test + void CardArea_는_추상_클래스이다() { + // when & then + assertThat(CardArea.class).isAbstract(); + } + + @ParameterizedTest(name = "{arguments} 카드 영역이 있다.") + @ValueSource(classes = {DealerCardArea.class, ParticipantCardArea.class}) + void 카드_영역은_두_종류가_있다(final Class type) throws Exception { + // given + final CardArea cardArea = type.cast(type.getDeclaredConstructor(Card.class, Card.class) + .newInstance(new Card(CardValue.THREE), new Card(CardValue.TWO))); + + // when & then + assertThat(cardArea).isInstanceOf(type); + } } \ No newline at end of file From d4a4c3134a138d73014e762e214200bb50438ae9 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 15:16:47 +0900 Subject: [PATCH 09/60] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=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 --- docs/READMD.md | 4 +- src/main/java/area/CardArea.java | 24 ++++++++ src/main/java/card/CardValue.java | 4 ++ src/test/java/area/CardAreaTest.java | 87 ++++++++++++++++++++++++++-- 4 files changed, 113 insertions(+), 6 deletions(-) diff --git a/docs/READMD.md b/docs/READMD.md index fc958e9b90..cff0772339 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -14,9 +14,9 @@ - [x] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. - [x] 카드들을 가진다. - [ ] 카드를 더 받을 수 있는 상태인지 확인한다. -- [ ] 카드 현숫자를 계산한다. - [ ] 카드를 더 받을 것인지 결정한다. -- [ ] `A` 는 1 또는 11로 계산될 수 있다. +- [x] 카드 현숫자를 계산한다. +- [X] `A` 는 1 또는 11로 계산될 수 있다. - [x] 카드를 추가할 수 있다. - [x] 처음에 카드 2장을 받아 생성된다. diff --git a/src/main/java/area/CardArea.java b/src/main/java/area/CardArea.java index b3e7acc95d..901f12b0ee 100644 --- a/src/main/java/area/CardArea.java +++ b/src/main/java/area/CardArea.java @@ -1,6 +1,7 @@ package area; import card.Card; +import card.CardValue; import java.util.ArrayList; import java.util.List; @@ -20,4 +21,27 @@ public List cards() { public void addCard(final Card card) { cards.add(card); } + + public int calculate() { + int total = 0; + for (final Card card : cards) { + total += judgeCardValue(total, card.cardValue()); + } + return total; + } + + private int judgeCardValue(final Integer totalScore, final CardValue cardValue) { + int addValue = cardValue.value(); + if (cardValue.isAce()) { + addValue = judgeAceValue(totalScore); + } + return addValue; + } + + private Integer judgeAceValue(final Integer totalScore) { + if (totalScore + 11 < 21) { + return 11; + } + return 1; + } } diff --git a/src/main/java/card/CardValue.java b/src/main/java/card/CardValue.java index b19f5b9352..9a03fb88b2 100644 --- a/src/main/java/card/CardValue.java +++ b/src/main/java/card/CardValue.java @@ -28,4 +28,8 @@ public enum CardValue { public int value() { return value; } + + public boolean isAce() { + return this == ACE; + } } diff --git a/src/test/java/area/CardAreaTest.java b/src/test/java/area/CardAreaTest.java index 78581de51b..af1635a29a 100644 --- a/src/test/java/area/CardAreaTest.java +++ b/src/test/java/area/CardAreaTest.java @@ -7,8 +7,14 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; +import java.util.stream.Stream; + +import static card.CardValue.*; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -20,19 +26,19 @@ class CardAreaTest { @Test void 카드를_두장만_받아서_생성된다() { // when & then - assertDoesNotThrow(() -> new CardArea(new Card(CardValue.ACE), new Card(CardValue.TWO)) { + assertDoesNotThrow(() -> new CardArea(new Card(ACE), new Card(TWO)) { }); } @Test void 카드를_추가할_수_있다() { // given - final CardArea cardArea = new CardArea(new Card(CardValue.THREE), new Card(CardValue.TWO)) { + final CardArea cardArea = new CardArea(new Card(THREE), new Card(TWO)) { }; // when final int beforeSize = cardArea.cards().size(); - cardArea.addCard(new Card(CardValue.FOUR)); + cardArea.addCard(new Card(FOUR)); // then assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); @@ -49,9 +55,82 @@ class CardAreaTest { void 카드_영역은_두_종류가_있다(final Class type) throws Exception { // given final CardArea cardArea = type.cast(type.getDeclaredConstructor(Card.class, Card.class) - .newInstance(new Card(CardValue.THREE), new Card(CardValue.TWO))); + .newInstance(new Card(THREE), new Card(TWO))); // when & then assertThat(cardArea).isInstanceOf(type); } + + @ParameterizedTest(name = "카드 목록이 {0} 일 때, 총합은 {1}다.") + @CsvSource(value = { + "TWO+THREE = 5", + "FIVE+SIX = 11", + "TWO+TWO = 4", + "TEN+TEN = 20", + }, delimiterString = " = ") + void 자신이_가진_카드의_합을_구할_수_있다(final String values, final int totalScore) { + // given + final String[] split = values.split("\\+"); + final CardArea cardArea = new CardArea(new Card(valueOf(split[0])), new Card(valueOf(split[1]))) { + }; + + // when & then + assertThat(cardArea.calculate()).isEqualTo(totalScore); + } + + @ParameterizedTest(name = "킹, 퀸, 잭은 10으로 계산한다") + @CsvSource(value = { + "KING+QUEEN = 20", + "KING+JACK = 20", + "QUEEN+JACK = 20", + "KING+THREE = 13", + "QUEEN+THREE = 13", + "JACK+SIX = 16", + }, delimiterString = " = ") + void 킹_퀸_잭은_10으로_계산한다(final String values, final int totalScore) { + // given + final String[] split = values.split("\\+"); + final CardArea cardArea = new CardArea(new Card(valueOf(split[0])), new Card(valueOf(split[1]))) { + }; + + // when & then + assertThat(cardArea.calculate()).isEqualTo(totalScore); + } + + @ParameterizedTest(name = "[{index}] ACE 는 이전까지의 총합이 10 이하면 11로 계산한다") + @MethodSource("containsAceCardArea") + void ACE_는_이전까지의_총합이_10_이하면_11로_계산한다(final CardArea cardArea, final int totalScore) { + // then + assertThat(cardArea.calculate()).isEqualTo(totalScore); + } + + static Stream containsAceCardArea() { + + // [11] + 10 = 21 + final CardArea cardArea1 = new CardArea(new Card(ACE), new Card(TEN)) {}; + + // 10 + 10 + [1] = 21 + final CardArea cardArea2 = new CardArea(new Card(JACK), new Card(TEN)) {}; + cardArea2.addCard(new Card(ACE)); + + // [11] + 9 + [1] = 21 + final CardArea cardArea3 = new CardArea(new Card(ACE), new Card(NINE)) {}; + cardArea3.addCard(new Card(ACE)); + + // [11] + 6 + 3 = 20 + final CardArea cardArea4 = new CardArea(new Card(SIX), new Card(THREE)) {}; + cardArea4.addCard(new Card(ACE)); + + // 10 + [1] + [1] = 12 + final CardArea cardArea5 = new CardArea(new Card(TEN), new Card(ACE)) {}; + cardArea5.addCard(new Card(ACE)); + + return Stream.of( + Arguments.of(cardArea1, 21), + Arguments.of(cardArea2, 21), + Arguments.of(cardArea3, 21), + Arguments.of(cardArea4, 20), + Arguments.of(cardArea5, 12) + ); + } } \ No newline at end of file From 99bc87f158da32889705bd013dfb1651f09e72df Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 15:25:50 +0900 Subject: [PATCH 10/60] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?=EB=8D=94=20=EB=B0=9B=EC=9D=84=20=EC=88=98=20=EC=9E=88=EB=8A=94?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=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 --- docs/READMD.md | 2 +- src/main/java/area/CardArea.java | 6 +++++- src/test/java/area/CardAreaTest.java | 31 +++++++++++++++++++++------- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/docs/READMD.md b/docs/READMD.md index cff0772339..ed979e124a 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -13,7 +13,7 @@ ### 카드 영역 - [x] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. - [x] 카드들을 가진다. -- [ ] 카드를 더 받을 수 있는 상태인지 확인한다. +- [x] 카드를 더 받을 수 있는 상태인지 확인한다. - [ ] 카드를 더 받을 것인지 결정한다. - [x] 카드 현숫자를 계산한다. - [X] `A` 는 1 또는 11로 계산될 수 있다. diff --git a/src/main/java/area/CardArea.java b/src/main/java/area/CardArea.java index 901f12b0ee..0b198082e6 100644 --- a/src/main/java/area/CardArea.java +++ b/src/main/java/area/CardArea.java @@ -39,9 +39,13 @@ private int judgeCardValue(final Integer totalScore, final CardValue cardValue) } private Integer judgeAceValue(final Integer totalScore) { - if (totalScore + 11 < 21) { + if (totalScore + 11 <= 21) { return 11; } return 1; } + + public boolean canMoreCard() { + return calculate() < 21; + } } diff --git a/src/test/java/area/CardAreaTest.java b/src/test/java/area/CardAreaTest.java index af1635a29a..502e664e3f 100644 --- a/src/test/java/area/CardAreaTest.java +++ b/src/test/java/area/CardAreaTest.java @@ -16,7 +16,7 @@ import static card.CardValue.*; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.*; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -106,8 +106,8 @@ class CardAreaTest { static Stream containsAceCardArea() { - // [11] + 10 = 21 - final CardArea cardArea1 = new CardArea(new Card(ACE), new Card(TEN)) {}; + // 10 + [11] = 21 + final CardArea cardArea1 = new CardArea(new Card(TEN), new Card(ACE)) {}; // 10 + 10 + [1] = 21 final CardArea cardArea2 = new CardArea(new Card(JACK), new Card(TEN)) {}; @@ -121,16 +121,33 @@ static Stream containsAceCardArea() { final CardArea cardArea4 = new CardArea(new Card(SIX), new Card(THREE)) {}; cardArea4.addCard(new Card(ACE)); - // 10 + [1] + [1] = 12 - final CardArea cardArea5 = new CardArea(new Card(TEN), new Card(ACE)) {}; - cardArea5.addCard(new Card(ACE)); + // [11] + 10 = 21 + final CardArea cardArea5 = new CardArea(new Card(ACE), new Card(TEN)) {}; return Stream.of( Arguments.of(cardArea1, 21), Arguments.of(cardArea2, 21), Arguments.of(cardArea3, 21), Arguments.of(cardArea4, 20), - Arguments.of(cardArea5, 12) + Arguments.of(cardArea5, 21) ); } + + @Test + void 총합이_20_이하면_카드를_더_받을_수_있는_상태이다() { + // given + final CardArea cardArea = new CardArea(new Card(TEN), new Card(TEN)) {}; + + // when & then + assertTrue(cardArea.canMoreCard()); + } + + @Test + void 총합이_21_이상이면_카드를_더_받을_수_없는_상태이다() { + // given + final CardArea cardArea = new CardArea(new Card(TEN), new Card(ACE)) {}; + + // when & then + assertFalse(cardArea.canMoreCard()); + } } \ No newline at end of file From 9f5b973034212ff5669fb9d936f245c8a1693cd3 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 15:51:23 +0900 Subject: [PATCH 11/60] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?=EB=8D=94=20=EB=B0=9B=EC=9D=84=20=EA=B2=83=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B2=B0=EC=A0=95=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/READMD.md | 2 +- src/main/java/area/CardArea.java | 2 + src/main/java/area/DealerCardArea.java | 5 +++ src/main/java/area/ParticipantCardArea.java | 5 +++ src/main/java/participant/Participant.java | 14 +++++++ src/main/java/participant/State.java | 7 ++++ src/test/java/area/CardAreaTest.java | 39 ++++++++++-------- src/test/java/area/DealerCardAreaTest.java | 35 ++++++++++++++++ .../java/participant/ParticipantTest.java | 40 +++++++++++++++++++ 9 files changed, 132 insertions(+), 17 deletions(-) create mode 100644 src/main/java/participant/Participant.java create mode 100644 src/main/java/participant/State.java create mode 100644 src/test/java/area/DealerCardAreaTest.java create mode 100644 src/test/java/participant/ParticipantTest.java diff --git a/docs/READMD.md b/docs/READMD.md index ed979e124a..b5192a8f9c 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -14,7 +14,7 @@ - [x] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. - [x] 카드들을 가진다. - [x] 카드를 더 받을 수 있는 상태인지 확인한다. -- [ ] 카드를 더 받을 것인지 결정한다. +- [x] 카드를 더 받을 것인지 결정한다. - [x] 카드 현숫자를 계산한다. - [X] `A` 는 1 또는 11로 계산될 수 있다. - [x] 카드를 추가할 수 있다. diff --git a/src/main/java/area/CardArea.java b/src/main/java/area/CardArea.java index 0b198082e6..f16542598b 100644 --- a/src/main/java/area/CardArea.java +++ b/src/main/java/area/CardArea.java @@ -14,6 +14,8 @@ public CardArea(final Card firstCard, final Card secondCard) { cards.addAll(List.of(firstCard, secondCard)); } + public abstract boolean wantHit(); + public List cards() { return new ArrayList<>(cards); } diff --git a/src/main/java/area/DealerCardArea.java b/src/main/java/area/DealerCardArea.java index d68a2f62e8..32c6dd32b6 100644 --- a/src/main/java/area/DealerCardArea.java +++ b/src/main/java/area/DealerCardArea.java @@ -7,4 +7,9 @@ public class DealerCardArea extends CardArea { public DealerCardArea(final Card firstCard, final Card secondCard) { super(firstCard, secondCard); } + + @Override + public boolean wantHit() { + return calculate() <= 17; + } } diff --git a/src/main/java/area/ParticipantCardArea.java b/src/main/java/area/ParticipantCardArea.java index b0aa86406a..1a4e530416 100644 --- a/src/main/java/area/ParticipantCardArea.java +++ b/src/main/java/area/ParticipantCardArea.java @@ -7,4 +7,9 @@ public class ParticipantCardArea extends CardArea { public ParticipantCardArea(final Card firstCard, final Card secondCard) { super(firstCard, secondCard); } + + @Override + public boolean wantHit() { + return false; + } } diff --git a/src/main/java/participant/Participant.java b/src/main/java/participant/Participant.java new file mode 100644 index 0000000000..0f329ef519 --- /dev/null +++ b/src/main/java/participant/Participant.java @@ -0,0 +1,14 @@ +package participant; + +public class Participant { + + private State state; + + public boolean wantHit() { + return state == State.HIT; + } + + public void changeState(final State state) { + this.state = state; + } +} diff --git a/src/main/java/participant/State.java b/src/main/java/participant/State.java new file mode 100644 index 0000000000..e293cf75ce --- /dev/null +++ b/src/main/java/participant/State.java @@ -0,0 +1,7 @@ +package participant; + +public enum State { + HIT, + STAY, + ; +} diff --git a/src/test/java/area/CardAreaTest.java b/src/test/java/area/CardAreaTest.java index 502e664e3f..ada4e61bb1 100644 --- a/src/test/java/area/CardAreaTest.java +++ b/src/test/java/area/CardAreaTest.java @@ -1,7 +1,6 @@ package area; import card.Card; -import card.CardValue; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -26,15 +25,13 @@ class CardAreaTest { @Test void 카드를_두장만_받아서_생성된다() { // when & then - assertDoesNotThrow(() -> new CardArea(new Card(ACE), new Card(TWO)) { - }); + assertDoesNotThrow(() -> new SimpleCardArea(new Card(ACE), new Card(TWO))); } @Test void 카드를_추가할_수_있다() { // given - final CardArea cardArea = new CardArea(new Card(THREE), new Card(TWO)) { - }; + final CardArea cardArea = new SimpleCardArea(new Card(THREE), new Card(TWO)); // when final int beforeSize = cardArea.cards().size(); @@ -71,8 +68,7 @@ class CardAreaTest { void 자신이_가진_카드의_합을_구할_수_있다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new CardArea(new Card(valueOf(split[0])), new Card(valueOf(split[1]))) { - }; + final CardArea cardArea = new SimpleCardArea(new Card(valueOf(split[0])), new Card(valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -90,8 +86,7 @@ class CardAreaTest { void 킹_퀸_잭은_10으로_계산한다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new CardArea(new Card(valueOf(split[0])), new Card(valueOf(split[1]))) { - }; + final CardArea cardArea = new SimpleCardArea(new Card(valueOf(split[0])), new Card(valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -107,22 +102,22 @@ class CardAreaTest { static Stream containsAceCardArea() { // 10 + [11] = 21 - final CardArea cardArea1 = new CardArea(new Card(TEN), new Card(ACE)) {}; + final CardArea cardArea1 = new SimpleCardArea(new Card(TEN), new Card(ACE)); // 10 + 10 + [1] = 21 - final CardArea cardArea2 = new CardArea(new Card(JACK), new Card(TEN)) {}; + final CardArea cardArea2 = new SimpleCardArea(new Card(JACK), new Card(TEN)); cardArea2.addCard(new Card(ACE)); // [11] + 9 + [1] = 21 - final CardArea cardArea3 = new CardArea(new Card(ACE), new Card(NINE)) {}; + final CardArea cardArea3 = new SimpleCardArea(new Card(ACE), new Card(NINE)); cardArea3.addCard(new Card(ACE)); // [11] + 6 + 3 = 20 - final CardArea cardArea4 = new CardArea(new Card(SIX), new Card(THREE)) {}; + final CardArea cardArea4 = new SimpleCardArea(new Card(SIX), new Card(THREE)); cardArea4.addCard(new Card(ACE)); // [11] + 10 = 21 - final CardArea cardArea5 = new CardArea(new Card(ACE), new Card(TEN)) {}; + final CardArea cardArea5 = new SimpleCardArea(new Card(ACE), new Card(TEN)); return Stream.of( Arguments.of(cardArea1, 21), @@ -136,7 +131,7 @@ static Stream containsAceCardArea() { @Test void 총합이_20_이하면_카드를_더_받을_수_있는_상태이다() { // given - final CardArea cardArea = new CardArea(new Card(TEN), new Card(TEN)) {}; + final CardArea cardArea = new SimpleCardArea(new Card(TEN), new Card(TEN)); // when & then assertTrue(cardArea.canMoreCard()); @@ -145,9 +140,21 @@ static Stream containsAceCardArea() { @Test void 총합이_21_이상이면_카드를_더_받을_수_없는_상태이다() { // given - final CardArea cardArea = new CardArea(new Card(TEN), new Card(ACE)) {}; + final CardArea cardArea = new SimpleCardArea(new Card(TEN), new Card(ACE)); // when & then assertFalse(cardArea.canMoreCard()); } + + static class SimpleCardArea extends CardArea { + + public SimpleCardArea(final Card firstCard, final Card secondCard) { + super(firstCard, secondCard); + } + + @Override + public boolean wantHit() { + return false; + } + } } \ No newline at end of file diff --git a/src/test/java/area/DealerCardAreaTest.java b/src/test/java/area/DealerCardAreaTest.java new file mode 100644 index 0000000000..a25cd0b592 --- /dev/null +++ b/src/test/java/area/DealerCardAreaTest.java @@ -0,0 +1,35 @@ +package area; + +import card.Card; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static card.CardValue.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("DealerCardArea 은") +class DealerCardAreaTest { + + @Test + void 딜러_카드_영억은_현재_점수가_17점_이하일_경우에는_카드를_무조건_받아야_한다() { + // given + final CardArea cardArea = new DealerCardArea(new Card(TEN), new Card(SEVEN)); + + // when & then + assertTrue(cardArea.wantHit()); + } + + @Test + void 딜러_카드_영억은_현재_점수가_17점_초과일_경우에는_카드를_무조건_받지_않는다() { + // given + final CardArea cardArea = new DealerCardArea(new Card(TEN), new Card(EIGHT)); + + // when & then + assertFalse(cardArea.wantHit()); + } +} \ No newline at end of file diff --git a/src/test/java/participant/ParticipantTest.java b/src/test/java/participant/ParticipantTest.java new file mode 100644 index 0000000000..030e4ca499 --- /dev/null +++ b/src/test/java/participant/ParticipantTest.java @@ -0,0 +1,40 @@ +package participant; + +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.*; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("Participant 은") +class ParticipantTest { + + @Test + void 참가자는_상태를_바꿀_수_있다() { + // given + final Participant participant = new Participant(); + + // when + assertDoesNotThrow(() -> participant.changeState(State.HIT)); + } + + @Test + void 참가자는_카드_받을_상태를_결정할_수_있다() { + // given + final Participant participant = new Participant(); + participant.changeState(State.HIT); + + // when & then + assertTrue(participant.wantHit()); + } + + @Test + void 참가자는_카드_받지_않을_상태를_결정할_수_있다() { + // given + final Participant participant = new Participant(); + participant.changeState(State.STAY); + + // when & then + assertFalse(participant.wantHit()); + } +} \ No newline at end of file From 1c9277d47699f1727dd89f804e8085c7e509ecd1 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 16:29:36 +0900 Subject: [PATCH 12/60] =?UTF-8?q?refactor=20:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=AA=A8=EC=96=91=EC=9D=84=20enum=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/card/Card.java | 23 ++++++++++++- src/main/java/card/CardShape.java | 9 +++++ src/main/java/card/CloverCard.java | 8 ----- src/main/java/card/DiamondCard.java | 8 ----- src/main/java/card/HeartCard.java | 8 ----- src/main/java/card/SpadeCard.java | 8 ----- src/test/java/area/CardAreaTest.java | 40 +++++++++++++--------- src/test/java/area/DealerCardAreaTest.java | 11 ++++-- src/test/java/card/CardTest.java | 23 ++++++++----- 9 files changed, 79 insertions(+), 59 deletions(-) create mode 100644 src/main/java/card/CardShape.java delete mode 100644 src/main/java/card/CloverCard.java delete mode 100644 src/main/java/card/DiamondCard.java delete mode 100644 src/main/java/card/HeartCard.java delete mode 100644 src/main/java/card/SpadeCard.java diff --git a/src/main/java/card/Card.java b/src/main/java/card/Card.java index 9a5ce88bf9..a8f0a28681 100644 --- a/src/main/java/card/Card.java +++ b/src/main/java/card/Card.java @@ -1,14 +1,35 @@ package card; +import java.util.Objects; + public class Card { + private final CardShape cardShape; private final CardValue cardValue; - public Card(final CardValue cardValue) { + public Card(final CardShape cardShape, final CardValue cardValue) { + this.cardShape = cardShape; this.cardValue = cardValue; } + public CardShape cardShape() { + return cardShape; + } + public CardValue cardValue() { return this.cardValue; } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Card)) return false; + final Card card = (Card) o; + return cardShape == card.cardShape && cardValue == card.cardValue; + } + + @Override + public int hashCode() { + return Objects.hash(cardShape, cardValue); + } } diff --git a/src/main/java/card/CardShape.java b/src/main/java/card/CardShape.java new file mode 100644 index 0000000000..b655804ca6 --- /dev/null +++ b/src/main/java/card/CardShape.java @@ -0,0 +1,9 @@ +package card; + +public enum CardShape { + DIAMOND, + CLOVER, + HEART, + SPADE, + ; +} diff --git a/src/main/java/card/CloverCard.java b/src/main/java/card/CloverCard.java deleted file mode 100644 index 31eb830bb5..0000000000 --- a/src/main/java/card/CloverCard.java +++ /dev/null @@ -1,8 +0,0 @@ -package card; - -public class CloverCard extends Card { - - public CloverCard(final CardValue cardValue) { - super(cardValue); - } -} diff --git a/src/main/java/card/DiamondCard.java b/src/main/java/card/DiamondCard.java deleted file mode 100644 index 1e230d7d72..0000000000 --- a/src/main/java/card/DiamondCard.java +++ /dev/null @@ -1,8 +0,0 @@ -package card; - -public class DiamondCard extends Card { - - public DiamondCard(final CardValue cardValue) { - super(cardValue); - } -} diff --git a/src/main/java/card/HeartCard.java b/src/main/java/card/HeartCard.java deleted file mode 100644 index 45428f99e5..0000000000 --- a/src/main/java/card/HeartCard.java +++ /dev/null @@ -1,8 +0,0 @@ -package card; - -public class HeartCard extends Card { - - public HeartCard(final CardValue cardValue) { - super(cardValue); - } -} diff --git a/src/main/java/card/SpadeCard.java b/src/main/java/card/SpadeCard.java deleted file mode 100644 index 386f7a13e2..0000000000 --- a/src/main/java/card/SpadeCard.java +++ /dev/null @@ -1,8 +0,0 @@ -package card; - -public class SpadeCard extends Card { - - public SpadeCard(final CardValue cardValue) { - super(cardValue); - } -} diff --git a/src/test/java/area/CardAreaTest.java b/src/test/java/area/CardAreaTest.java index ada4e61bb1..367b868089 100644 --- a/src/test/java/area/CardAreaTest.java +++ b/src/test/java/area/CardAreaTest.java @@ -1,6 +1,7 @@ package area; import card.Card; +import card.CardShape; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -25,17 +26,23 @@ class CardAreaTest { @Test void 카드를_두장만_받아서_생성된다() { // when & then - assertDoesNotThrow(() -> new SimpleCardArea(new Card(ACE), new Card(TWO))); + assertDoesNotThrow(() -> new SimpleCardArea( + new Card(CardShape.CLOVER,ACE), + new Card(CardShape.CLOVER,TWO)) + ); } @Test void 카드를_추가할_수_있다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(THREE), new Card(TWO)); + final CardArea cardArea = new SimpleCardArea( + new Card(CardShape.CLOVER,THREE), + new Card(CardShape.CLOVER,TWO) + ); // when final int beforeSize = cardArea.cards().size(); - cardArea.addCard(new Card(FOUR)); + cardArea.addCard(new Card(CardShape.CLOVER,FOUR)); // then assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); @@ -52,7 +59,7 @@ class CardAreaTest { void 카드_영역은_두_종류가_있다(final Class type) throws Exception { // given final CardArea cardArea = type.cast(type.getDeclaredConstructor(Card.class, Card.class) - .newInstance(new Card(THREE), new Card(TWO))); + .newInstance(new Card(CardShape.CLOVER,THREE), new Card(CardShape.CLOVER,TWO))); // when & then assertThat(cardArea).isInstanceOf(type); @@ -68,7 +75,7 @@ class CardAreaTest { void 자신이_가진_카드의_합을_구할_수_있다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new SimpleCardArea(new Card(valueOf(split[0])), new Card(valueOf(split[1]))); + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER,valueOf(split[0])), new Card(CardShape.CLOVER,valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -86,7 +93,7 @@ class CardAreaTest { void 킹_퀸_잭은_10으로_계산한다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new SimpleCardArea(new Card(valueOf(split[0])), new Card(valueOf(split[1]))); + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER,valueOf(split[0])), new Card(CardShape.CLOVER,valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -102,22 +109,23 @@ class CardAreaTest { static Stream containsAceCardArea() { // 10 + [11] = 21 - final CardArea cardArea1 = new SimpleCardArea(new Card(TEN), new Card(ACE)); + final CardArea cardArea1 = new SimpleCardArea(new Card(CardShape.CLOVER,TEN), new Card(CardShape.CLOVER,ACE)); // 10 + 10 + [1] = 21 - final CardArea cardArea2 = new SimpleCardArea(new Card(JACK), new Card(TEN)); - cardArea2.addCard(new Card(ACE)); + final CardArea cardArea2 = new SimpleCardArea(new Card(CardShape.CLOVER,JACK), new Card(CardShape.CLOVER,TEN)); + cardArea2.addCard(new Card(CardShape.CLOVER,ACE)); + // [11] + 9 + [1] = 21 - final CardArea cardArea3 = new SimpleCardArea(new Card(ACE), new Card(NINE)); - cardArea3.addCard(new Card(ACE)); + final CardArea cardArea3 = new SimpleCardArea(new Card(CardShape.CLOVER,ACE), new Card(CardShape.CLOVER,NINE)); + cardArea3.addCard(new Card(CardShape.CLOVER,ACE)); // [11] + 6 + 3 = 20 - final CardArea cardArea4 = new SimpleCardArea(new Card(SIX), new Card(THREE)); - cardArea4.addCard(new Card(ACE)); + final CardArea cardArea4 = new SimpleCardArea(new Card(CardShape.CLOVER,SIX), new Card(CardShape.CLOVER,THREE)); + cardArea4.addCard(new Card(CardShape.CLOVER,ACE)); // [11] + 10 = 21 - final CardArea cardArea5 = new SimpleCardArea(new Card(ACE), new Card(TEN)); + final CardArea cardArea5 = new SimpleCardArea(new Card(CardShape.CLOVER,ACE), new Card(CardShape.CLOVER,TEN)); return Stream.of( Arguments.of(cardArea1, 21), @@ -131,7 +139,7 @@ static Stream containsAceCardArea() { @Test void 총합이_20_이하면_카드를_더_받을_수_있는_상태이다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(TEN), new Card(TEN)); + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER,TEN), new Card(CardShape.CLOVER,TEN)); // when & then assertTrue(cardArea.canMoreCard()); @@ -140,7 +148,7 @@ static Stream containsAceCardArea() { @Test void 총합이_21_이상이면_카드를_더_받을_수_없는_상태이다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(TEN), new Card(ACE)); + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER,TEN), new Card(CardShape.CLOVER,ACE)); // when & then assertFalse(cardArea.canMoreCard()); diff --git a/src/test/java/area/DealerCardAreaTest.java b/src/test/java/area/DealerCardAreaTest.java index a25cd0b592..98334104b0 100644 --- a/src/test/java/area/DealerCardAreaTest.java +++ b/src/test/java/area/DealerCardAreaTest.java @@ -1,6 +1,7 @@ package area; import card.Card; +import card.CardShape; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -18,7 +19,10 @@ class DealerCardAreaTest { @Test void 딜러_카드_영억은_현재_점수가_17점_이하일_경우에는_카드를_무조건_받아야_한다() { // given - final CardArea cardArea = new DealerCardArea(new Card(TEN), new Card(SEVEN)); + final CardArea cardArea = new DealerCardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SEVEN) + ); // when & then assertTrue(cardArea.wantHit()); @@ -27,7 +31,10 @@ class DealerCardAreaTest { @Test void 딜러_카드_영억은_현재_점수가_17점_초과일_경우에는_카드를_무조건_받지_않는다() { // given - final CardArea cardArea = new DealerCardArea(new Card(TEN), new Card(EIGHT)); + final CardArea cardArea = new DealerCardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, EIGHT) + ); // when & then assertFalse(cardArea.wantHit()); diff --git a/src/test/java/card/CardTest.java b/src/test/java/card/CardTest.java index 0624de5a29..a80aa3ac5d 100644 --- a/src/test/java/card/CardTest.java +++ b/src/test/java/card/CardTest.java @@ -4,8 +4,6 @@ import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; @@ -17,7 +15,7 @@ class CardTest { @Test void 카드_값을_갖는다() { // given - final Card card = new Card(CardValue.TWO); + final Card card = new Card(CardShape.CLOVER, CardValue.TWO); // when CardValue cardValue = card.cardValue(); @@ -26,13 +24,22 @@ class CardTest { assertThat(cardValue.value()).isEqualTo(2); } - @ParameterizedTest(name = "{arguments} 카드를 가질 수 있다.") - @ValueSource(classes = {DiamondCard.class, HeartCard.class, CloverCard.class, SpadeCard.class}) - void 여러_카드_종류가_있다(final Class type) throws Exception { + @Test + void 카드_종류를_가진다() throws Exception { + // given + final Card card = new Card(CardShape.CLOVER, CardValue.TEN); + + // when & then + assertThat(card.cardShape()).isEqualTo(CardShape.CLOVER); + } + + @Test + void 모양과_값이_같으면_같은_카드이다() { // given - final Card card = type.cast(type.getDeclaredConstructor(CardValue.class).newInstance(CardValue.TWO)); + final Card card1 = new Card(CardShape.CLOVER, CardValue.TWO); + final Card card2 = new Card(CardShape.CLOVER, CardValue.TWO); // when & then - assertThat(card).isInstanceOf(type); + assertThat(card1).isEqualTo(card2); } } \ No newline at end of file From e49a507eb58cfe3358975c5935f743b76b36af33 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 16:38:57 +0900 Subject: [PATCH 13/60] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=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 --- docs/READMD.md | 2 +- src/main/java/card/CardValue.java | 3 +- src/main/java/deck/CardDeck.java | 35 +++++++++++++++++++++++ src/test/java/deck/CardDeckTest.java | 42 ++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 src/main/java/deck/CardDeck.java create mode 100644 src/test/java/deck/CardDeckTest.java diff --git a/docs/READMD.md b/docs/READMD.md index b5192a8f9c..a6b4323dce 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -22,5 +22,5 @@ ### 카드 덱 -- [ ] 전체 카드를 가진다. +- [x] 전체 카드를 가진다. - [ ] 카드를 한장씩 준다. \ No newline at end of file diff --git a/src/main/java/card/CardValue.java b/src/main/java/card/CardValue.java index 9a03fb88b2..85ce3d0622 100644 --- a/src/main/java/card/CardValue.java +++ b/src/main/java/card/CardValue.java @@ -16,8 +16,7 @@ public enum CardValue { KING(10), QUEEN(10), - JACK(10) - ; + JACK(10); private final int value; diff --git a/src/main/java/deck/CardDeck.java b/src/main/java/deck/CardDeck.java new file mode 100644 index 0000000000..f3cff0c30a --- /dev/null +++ b/src/main/java/deck/CardDeck.java @@ -0,0 +1,35 @@ +package deck; + +import card.Card; +import card.CardShape; +import card.CardValue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class CardDeck { + + private final List cards; + + private CardDeck(final List cards) { + this.cards = cards; + } + + public static CardDeck shuffledFullCardDeck() { + List cards = new ArrayList<>(); + for (final CardShape cardShape : CardShape.values()) { + cards.addAll(Arrays.stream(CardValue.values()) + .map(it -> new Card(cardShape, it)) + .collect(Collectors.toList())); + } + Collections.shuffle(cards); + return new CardDeck(cards); + } + + public List cards() { + return List.copyOf(cards); + } +} diff --git a/src/test/java/deck/CardDeckTest.java b/src/test/java/deck/CardDeckTest.java new file mode 100644 index 0000000000..e86c041523 --- /dev/null +++ b/src/test/java/deck/CardDeckTest.java @@ -0,0 +1,42 @@ +package deck; + +import card.Card; +import card.CardShape; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static java.util.stream.Collectors.groupingBy; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("CardDeck 은") +class CardDeckTest { + + @Test + void 카드를_종류별로_값_별로_한장씩_모두_가진_채로_생성한다() { + // given + CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + + // when + final Map> result = cardDeck.cards() + .stream() + .collect(groupingBy(Card::cardShape)); + + // then + for (final CardShape cardShape : result.keySet()) { + final Set cards = new HashSet<>(result.get(cardShape)); + + assertEquals(cards.size(), 13); + } + + assertEquals(result.size(), 4); + } +} \ No newline at end of file From 542fb1468f252b797e76f7a2afb17c3f8177ba5e Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 16:57:18 +0900 Subject: [PATCH 14/60] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EB=BD=91?= =?UTF-8?q?=EA=B8=B0=20=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 --- docs/READMD.md | 2 +- src/main/java/deck/CardDeck.java | 4 ++++ src/test/java/deck/CardDeckTest.java | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/READMD.md b/docs/READMD.md index a6b4323dce..b15011c6ac 100644 --- a/docs/READMD.md +++ b/docs/READMD.md @@ -23,4 +23,4 @@ ### 카드 덱 - [x] 전체 카드를 가진다. -- [ ] 카드를 한장씩 준다. \ No newline at end of file +- [x] 카드를 한장씩 준다. \ No newline at end of file diff --git a/src/main/java/deck/CardDeck.java b/src/main/java/deck/CardDeck.java index f3cff0c30a..0054ff32a0 100644 --- a/src/main/java/deck/CardDeck.java +++ b/src/main/java/deck/CardDeck.java @@ -32,4 +32,8 @@ public static CardDeck shuffledFullCardDeck() { public List cards() { return List.copyOf(cards); } + + public Card draw() { + return this.cards.remove(0); + } } diff --git a/src/test/java/deck/CardDeckTest.java b/src/test/java/deck/CardDeckTest.java index e86c041523..53428bcdc2 100644 --- a/src/test/java/deck/CardDeckTest.java +++ b/src/test/java/deck/CardDeckTest.java @@ -13,6 +13,7 @@ import java.util.Set; import static java.util.stream.Collectors.groupingBy; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @SuppressWarnings("NonAsciiCharacters") @@ -39,4 +40,18 @@ class CardDeckTest { assertEquals(result.size(), 4); } + + @Test + void 카드를_한_장씩_꺼낼_수_있다() { + // given + final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + final int before = cardDeck.cards().size(); + + // when + final Card draw = cardDeck.draw(); + + // then + assertThat(draw).isNotNull(); + assertThat(cardDeck.cards().size()).isEqualTo(before - 1); + } } \ No newline at end of file From 0f44385d94cce50bf667e3a3ec66336bb2f55719 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 17:05:10 +0900 Subject: [PATCH 15/60] =?UTF-8?q?feat=20:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=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/participant/Name.java | 21 ++++++++++ src/main/java/participant/Participant.java | 9 +++++ src/test/java/participant/NameTest.java | 38 +++++++++++++++++++ .../java/participant/ParticipantTest.java | 16 ++++++-- 4 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 src/main/java/participant/Name.java create mode 100644 src/test/java/participant/NameTest.java diff --git a/src/main/java/participant/Name.java b/src/main/java/participant/Name.java new file mode 100644 index 0000000000..71fb81ec9d --- /dev/null +++ b/src/main/java/participant/Name.java @@ -0,0 +1,21 @@ +package participant; + +public class Name { + + private final String value; + + public Name(final String name) { + validateEmpty(name); + this.value = name; + } + + private void validateEmpty(final String name) { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("이름은 빈칸일 수 없습니다."); + } + } + + public String value() { + return value; + } +} diff --git a/src/main/java/participant/Participant.java b/src/main/java/participant/Participant.java index 0f329ef519..0b55432d28 100644 --- a/src/main/java/participant/Participant.java +++ b/src/main/java/participant/Participant.java @@ -2,8 +2,13 @@ public class Participant { + private final Name name; private State state; + public Participant(final Name name) { + this.name = name; + } + public boolean wantHit() { return state == State.HIT; } @@ -11,4 +16,8 @@ public boolean wantHit() { public void changeState(final State state) { this.state = state; } + + public Name name() { + return name; + } } diff --git a/src/test/java/participant/NameTest.java b/src/test/java/participant/NameTest.java new file mode 100644 index 0000000000..0920d44c32 --- /dev/null +++ b/src/test/java/participant/NameTest.java @@ -0,0 +1,38 @@ +package participant; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("Name 은") +class NameTest { + + @Test + void 문자열을_받아_생성된다() { + // given + final String input = "문자열"; + final Name name = new Name(input); + + // when + final String value = name.value(); + + // then + assertThat(value).isEqualTo(input); + } + + @ParameterizedTest(name = "빈 문자열인 경우 예외가 발생한다") + @NullAndEmptySource + void 빈_문자열인_경우_예외가_발생한다(final String input) { + // when & then + assertThatThrownBy(() -> new Name(input)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file diff --git a/src/test/java/participant/ParticipantTest.java b/src/test/java/participant/ParticipantTest.java index 030e4ca499..beaeb71b67 100644 --- a/src/test/java/participant/ParticipantTest.java +++ b/src/test/java/participant/ParticipantTest.java @@ -12,7 +12,7 @@ class ParticipantTest { @Test void 참가자는_상태를_바꿀_수_있다() { // given - final Participant participant = new Participant(); + final Participant participant = new Participant(new Name("이름")); // when assertDoesNotThrow(() -> participant.changeState(State.HIT)); @@ -21,7 +21,7 @@ class ParticipantTest { @Test void 참가자는_카드_받을_상태를_결정할_수_있다() { // given - final Participant participant = new Participant(); + final Participant participant = new Participant(new Name("이름")); participant.changeState(State.HIT); // when & then @@ -31,10 +31,20 @@ class ParticipantTest { @Test void 참가자는_카드_받지_않을_상태를_결정할_수_있다() { // given - final Participant participant = new Participant(); + final Participant participant = new Participant(new Name("이름")); participant.changeState(State.STAY); // when & then assertFalse(participant.wantHit()); } + + @Test + void 참가자는_이름을_가질_수_있다() { + // given + final String name = "이름"; + final Participant participant = new Participant(new Name(name)); + + // when & then + Assertions.assertEquals(participant.name().value(), name); + } } \ No newline at end of file From fb25c590d3519eadbf7f7429b3a171b68c9d1871 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 17:42:53 +0900 Subject: [PATCH 16/60] =?UTF-8?q?feat=20:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=98=81=EC=97=AD=20Hit=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=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/area/ParticipantCardArea.java | 15 ----- .../java/domain/area/ParticipantCardArea.java | 19 +++++++ .../java/area/ParticipantCardAreaTest.java | 57 +++++++++++++++++++ 3 files changed, 76 insertions(+), 15 deletions(-) delete mode 100644 src/main/java/area/ParticipantCardArea.java create mode 100644 src/main/java/domain/area/ParticipantCardArea.java create mode 100644 src/test/java/area/ParticipantCardAreaTest.java diff --git a/src/main/java/area/ParticipantCardArea.java b/src/main/java/area/ParticipantCardArea.java deleted file mode 100644 index 1a4e530416..0000000000 --- a/src/main/java/area/ParticipantCardArea.java +++ /dev/null @@ -1,15 +0,0 @@ -package area; - -import card.Card; - -public class ParticipantCardArea extends CardArea { - - public ParticipantCardArea(final Card firstCard, final Card secondCard) { - super(firstCard, secondCard); - } - - @Override - public boolean wantHit() { - return false; - } -} diff --git a/src/main/java/domain/area/ParticipantCardArea.java b/src/main/java/domain/area/ParticipantCardArea.java new file mode 100644 index 0000000000..b78710c67a --- /dev/null +++ b/src/main/java/domain/area/ParticipantCardArea.java @@ -0,0 +1,19 @@ +package domain.area; + +import domain.card.Card; +import domain.participant.Participant; + +public class ParticipantCardArea extends CardArea { + + private final Participant participant; + + public ParticipantCardArea(final Card firstCard, final Card secondCard, final Participant participant) { + super(firstCard, secondCard); + this.participant = participant; + } + + @Override + public boolean wantHit() { + return participant.wantHit(); + } +} diff --git a/src/test/java/area/ParticipantCardAreaTest.java b/src/test/java/area/ParticipantCardAreaTest.java new file mode 100644 index 0000000000..0231ca98d3 --- /dev/null +++ b/src/test/java/area/ParticipantCardAreaTest.java @@ -0,0 +1,57 @@ +package area; + +import domain.area.CardArea; +import domain.area.ParticipantCardArea; +import domain.card.Card; +import domain.card.CardShape; +import domain.participant.Name; +import domain.participant.Participant; +import domain.participant.State; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static domain.card.CardValue.SEVEN; +import static domain.card.CardValue.TEN; +import static org.junit.jupiter.api.Assertions.*; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("ParticipantCardArea 은") +class ParticipantCardAreaTest { + + @Test + void 참가자가_카드를_더_받기_원할_때만_카드를_받는다() { + // given + final Participant participant = new Participant(new Name("player1")); + + final CardArea cardArea = new ParticipantCardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SEVEN), + participant + ); + + participant.changeState(State.HIT); + + // when & then + assertTrue(cardArea.wantHit()); + } + + @Test + void 참가자가_카드를_더_받기_원하지_않을_때_카드를_받지_않는다() { + // given + final Participant participant = new Participant(new Name("player1")); + + final CardArea cardArea = new ParticipantCardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SEVEN), + participant + ); + + participant.changeState(State.STAY); + + // when & then + assertFalse(cardArea.wantHit()); + } +} \ No newline at end of file From 328b7734a133f5f21d07a24dea2bee772248f147 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 20:45:23 +0900 Subject: [PATCH 17/60] =?UTF-8?q?refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/{ => domain}/area/CardArea.java | 5 +-- .../{ => domain}/area/DealerCardArea.java | 4 +- src/main/java/{ => domain}/card/Card.java | 2 +- .../java/{ => domain}/card/CardShape.java | 2 +- .../java/{ => domain}/card/CardValue.java | 2 +- src/main/java/{ => domain}/deck/CardDeck.java | 8 ++-- .../java/{ => domain}/participant/Name.java | 2 +- .../{ => domain}/participant/Participant.java | 2 +- .../java/{ => domain}/participant/State.java | 2 +- .../java/{ => domain}/area/CardAreaTest.java | 45 +++++++++---------- .../{ => domain}/area/DealerCardAreaTest.java | 8 ++-- .../area/ParticipantCardAreaTest.java | 7 ++- src/test/java/{ => domain}/card/CardTest.java | 2 +- .../java/{ => domain}/card/CardValueTest.java | 8 ++-- .../java/{ => domain}/deck/CardDeckTest.java | 6 +-- .../{ => domain}/participant/NameTest.java | 2 +- .../participant/ParticipantTest.java | 2 +- 17 files changed, 54 insertions(+), 55 deletions(-) rename src/main/java/{ => domain}/area/CardArea.java (95%) rename src/main/java/{ => domain}/area/DealerCardArea.java (84%) rename src/main/java/{ => domain}/card/Card.java (97%) rename src/main/java/{ => domain}/card/CardShape.java (79%) rename src/main/java/{ => domain}/card/CardValue.java (95%) rename src/main/java/{ => domain}/deck/CardDeck.java (88%) rename src/main/java/{ => domain}/participant/Name.java (93%) rename src/main/java/{ => domain}/participant/Participant.java (92%) rename src/main/java/{ => domain}/participant/State.java (63%) rename src/test/java/{ => domain}/area/CardAreaTest.java (80%) rename src/test/java/{ => domain}/area/DealerCardAreaTest.java (91%) rename src/test/java/{ => domain}/area/ParticipantCardAreaTest.java (92%) rename src/test/java/{ => domain}/card/CardTest.java (98%) rename src/test/java/{ => domain}/card/CardValueTest.java (78%) rename src/test/java/{ => domain}/deck/CardDeckTest.java (95%) rename src/test/java/{ => domain}/participant/NameTest.java (97%) rename src/test/java/{ => domain}/participant/ParticipantTest.java (98%) diff --git a/src/main/java/area/CardArea.java b/src/main/java/domain/area/CardArea.java similarity index 95% rename from src/main/java/area/CardArea.java rename to src/main/java/domain/area/CardArea.java index f16542598b..5ed1d4f6f0 100644 --- a/src/main/java/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -1,7 +1,6 @@ -package area; +package domain.area; -import card.Card; -import card.CardValue; +import domain.card.Card; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/area/DealerCardArea.java b/src/main/java/domain/area/DealerCardArea.java similarity index 84% rename from src/main/java/area/DealerCardArea.java rename to src/main/java/domain/area/DealerCardArea.java index 32c6dd32b6..9e1d0a0597 100644 --- a/src/main/java/area/DealerCardArea.java +++ b/src/main/java/domain/area/DealerCardArea.java @@ -1,6 +1,6 @@ -package area; +package domain.area; -import card.Card; +import domain.card.Card; public class DealerCardArea extends CardArea { diff --git a/src/main/java/card/Card.java b/src/main/java/domain/card/Card.java similarity index 97% rename from src/main/java/card/Card.java rename to src/main/java/domain/card/Card.java index a8f0a28681..7aa46e7c82 100644 --- a/src/main/java/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -1,4 +1,4 @@ -package card; +package domain.card; import java.util.Objects; diff --git a/src/main/java/card/CardShape.java b/src/main/java/domain/card/CardShape.java similarity index 79% rename from src/main/java/card/CardShape.java rename to src/main/java/domain/card/CardShape.java index b655804ca6..ace715052a 100644 --- a/src/main/java/card/CardShape.java +++ b/src/main/java/domain/card/CardShape.java @@ -1,4 +1,4 @@ -package card; +package domain.card; public enum CardShape { DIAMOND, diff --git a/src/main/java/card/CardValue.java b/src/main/java/domain/card/CardValue.java similarity index 95% rename from src/main/java/card/CardValue.java rename to src/main/java/domain/card/CardValue.java index 85ce3d0622..12dd5222fb 100644 --- a/src/main/java/card/CardValue.java +++ b/src/main/java/domain/card/CardValue.java @@ -1,4 +1,4 @@ -package card; +package domain.card; public enum CardValue { diff --git a/src/main/java/deck/CardDeck.java b/src/main/java/domain/deck/CardDeck.java similarity index 88% rename from src/main/java/deck/CardDeck.java rename to src/main/java/domain/deck/CardDeck.java index 0054ff32a0..169fd4d210 100644 --- a/src/main/java/deck/CardDeck.java +++ b/src/main/java/domain/deck/CardDeck.java @@ -1,8 +1,8 @@ -package deck; +package domain.deck; -import card.Card; -import card.CardShape; -import card.CardValue; +import domain.card.Card; +import domain.card.CardShape; +import domain.card.CardValue; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/participant/Name.java b/src/main/java/domain/participant/Name.java similarity index 93% rename from src/main/java/participant/Name.java rename to src/main/java/domain/participant/Name.java index 71fb81ec9d..0f8802a67c 100644 --- a/src/main/java/participant/Name.java +++ b/src/main/java/domain/participant/Name.java @@ -1,4 +1,4 @@ -package participant; +package domain.participant; public class Name { diff --git a/src/main/java/participant/Participant.java b/src/main/java/domain/participant/Participant.java similarity index 92% rename from src/main/java/participant/Participant.java rename to src/main/java/domain/participant/Participant.java index 0b55432d28..151b34bace 100644 --- a/src/main/java/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -1,4 +1,4 @@ -package participant; +package domain.participant; public class Participant { diff --git a/src/main/java/participant/State.java b/src/main/java/domain/participant/State.java similarity index 63% rename from src/main/java/participant/State.java rename to src/main/java/domain/participant/State.java index e293cf75ce..30310bbd6a 100644 --- a/src/main/java/participant/State.java +++ b/src/main/java/domain/participant/State.java @@ -1,4 +1,4 @@ -package participant; +package domain.participant; public enum State { HIT, diff --git a/src/test/java/area/CardAreaTest.java b/src/test/java/domain/area/CardAreaTest.java similarity index 80% rename from src/test/java/area/CardAreaTest.java rename to src/test/java/domain/area/CardAreaTest.java index 367b868089..44506d2ef5 100644 --- a/src/test/java/area/CardAreaTest.java +++ b/src/test/java/domain/area/CardAreaTest.java @@ -1,7 +1,7 @@ -package area; +package domain.area; -import card.Card; -import card.CardShape; +import domain.card.Card; +import domain.card.CardShape; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -14,7 +14,7 @@ import java.util.stream.Stream; -import static card.CardValue.*; +import static domain.card.CardValue.*; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @@ -27,8 +27,8 @@ class CardAreaTest { void 카드를_두장만_받아서_생성된다() { // when & then assertDoesNotThrow(() -> new SimpleCardArea( - new Card(CardShape.CLOVER,ACE), - new Card(CardShape.CLOVER,TWO)) + new Card(CardShape.CLOVER, ACE), + new Card(CardShape.CLOVER, TWO)) ); } @@ -36,13 +36,13 @@ class CardAreaTest { void 카드를_추가할_수_있다() { // given final CardArea cardArea = new SimpleCardArea( - new Card(CardShape.CLOVER,THREE), - new Card(CardShape.CLOVER,TWO) + new Card(CardShape.CLOVER, THREE), + new Card(CardShape.CLOVER, TWO) ); // when final int beforeSize = cardArea.cards().size(); - cardArea.addCard(new Card(CardShape.CLOVER,FOUR)); + cardArea.addCard(new Card(CardShape.CLOVER, FOUR)); // then assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); @@ -59,7 +59,7 @@ class CardAreaTest { void 카드_영역은_두_종류가_있다(final Class type) throws Exception { // given final CardArea cardArea = type.cast(type.getDeclaredConstructor(Card.class, Card.class) - .newInstance(new Card(CardShape.CLOVER,THREE), new Card(CardShape.CLOVER,TWO))); + .newInstance(new Card(CardShape.CLOVER, THREE), new Card(CardShape.CLOVER, TWO))); // when & then assertThat(cardArea).isInstanceOf(type); @@ -75,7 +75,7 @@ class CardAreaTest { void 자신이_가진_카드의_합을_구할_수_있다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER,valueOf(split[0])), new Card(CardShape.CLOVER,valueOf(split[1]))); + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, valueOf(split[0])), new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -93,7 +93,7 @@ class CardAreaTest { void 킹_퀸_잭은_10으로_계산한다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER,valueOf(split[0])), new Card(CardShape.CLOVER,valueOf(split[1]))); + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, valueOf(split[0])), new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -109,23 +109,22 @@ class CardAreaTest { static Stream containsAceCardArea() { // 10 + [11] = 21 - final CardArea cardArea1 = new SimpleCardArea(new Card(CardShape.CLOVER,TEN), new Card(CardShape.CLOVER,ACE)); + final CardArea cardArea1 = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); // 10 + 10 + [1] = 21 - final CardArea cardArea2 = new SimpleCardArea(new Card(CardShape.CLOVER,JACK), new Card(CardShape.CLOVER,TEN)); - cardArea2.addCard(new Card(CardShape.CLOVER,ACE)); - + final CardArea cardArea2 = new SimpleCardArea(new Card(CardShape.CLOVER, JACK), new Card(CardShape.CLOVER, TEN)); + cardArea2.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 9 + [1] = 21 - final CardArea cardArea3 = new SimpleCardArea(new Card(CardShape.CLOVER,ACE), new Card(CardShape.CLOVER,NINE)); - cardArea3.addCard(new Card(CardShape.CLOVER,ACE)); + final CardArea cardArea3 = new SimpleCardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, NINE)); + cardArea3.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 6 + 3 = 20 - final CardArea cardArea4 = new SimpleCardArea(new Card(CardShape.CLOVER,SIX), new Card(CardShape.CLOVER,THREE)); - cardArea4.addCard(new Card(CardShape.CLOVER,ACE)); + final CardArea cardArea4 = new SimpleCardArea(new Card(CardShape.CLOVER, SIX), new Card(CardShape.CLOVER, THREE)); + cardArea4.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 10 = 21 - final CardArea cardArea5 = new SimpleCardArea(new Card(CardShape.CLOVER,ACE), new Card(CardShape.CLOVER,TEN)); + final CardArea cardArea5 = new SimpleCardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, TEN)); return Stream.of( Arguments.of(cardArea1, 21), @@ -139,7 +138,7 @@ static Stream containsAceCardArea() { @Test void 총합이_20_이하면_카드를_더_받을_수_있는_상태이다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER,TEN), new Card(CardShape.CLOVER,TEN)); + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, TEN)); // when & then assertTrue(cardArea.canMoreCard()); @@ -148,7 +147,7 @@ static Stream containsAceCardArea() { @Test void 총합이_21_이상이면_카드를_더_받을_수_없는_상태이다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER,TEN), new Card(CardShape.CLOVER,ACE)); + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); // when & then assertFalse(cardArea.canMoreCard()); diff --git a/src/test/java/area/DealerCardAreaTest.java b/src/test/java/domain/area/DealerCardAreaTest.java similarity index 91% rename from src/test/java/area/DealerCardAreaTest.java rename to src/test/java/domain/area/DealerCardAreaTest.java index 98334104b0..4e5ea0d3b5 100644 --- a/src/test/java/area/DealerCardAreaTest.java +++ b/src/test/java/domain/area/DealerCardAreaTest.java @@ -1,13 +1,13 @@ -package area; +package domain.area; -import card.Card; -import card.CardShape; +import domain.card.Card; +import domain.card.CardShape; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import static card.CardValue.*; +import static domain.card.CardValue.*; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/area/ParticipantCardAreaTest.java b/src/test/java/domain/area/ParticipantCardAreaTest.java similarity index 92% rename from src/test/java/area/ParticipantCardAreaTest.java rename to src/test/java/domain/area/ParticipantCardAreaTest.java index 0231ca98d3..36705c905a 100644 --- a/src/test/java/area/ParticipantCardAreaTest.java +++ b/src/test/java/domain/area/ParticipantCardAreaTest.java @@ -1,7 +1,5 @@ -package area; +package domain.area; -import domain.area.CardArea; -import domain.area.ParticipantCardArea; import domain.card.Card; import domain.card.CardShape; import domain.participant.Name; @@ -14,7 +12,8 @@ import static domain.card.CardValue.SEVEN; import static domain.card.CardValue.TEN; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) diff --git a/src/test/java/card/CardTest.java b/src/test/java/domain/card/CardTest.java similarity index 98% rename from src/test/java/card/CardTest.java rename to src/test/java/domain/card/CardTest.java index a80aa3ac5d..335980bfc1 100644 --- a/src/test/java/card/CardTest.java +++ b/src/test/java/domain/card/CardTest.java @@ -1,4 +1,4 @@ -package card; +package domain.card; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; diff --git a/src/test/java/card/CardValueTest.java b/src/test/java/domain/card/CardValueTest.java similarity index 78% rename from src/test/java/card/CardValueTest.java rename to src/test/java/domain/card/CardValueTest.java index 2f2e7fd978..1bc0c9e0d9 100644 --- a/src/test/java/card/CardValueTest.java +++ b/src/test/java/domain/card/CardValueTest.java @@ -1,10 +1,12 @@ -package card; +package domain.card; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) diff --git a/src/test/java/deck/CardDeckTest.java b/src/test/java/domain/deck/CardDeckTest.java similarity index 95% rename from src/test/java/deck/CardDeckTest.java rename to src/test/java/domain/deck/CardDeckTest.java index 53428bcdc2..851c4c9310 100644 --- a/src/test/java/deck/CardDeckTest.java +++ b/src/test/java/domain/deck/CardDeckTest.java @@ -1,7 +1,7 @@ -package deck; +package domain.deck; -import card.Card; -import card.CardShape; +import domain.card.Card; +import domain.card.CardShape; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; diff --git a/src/test/java/participant/NameTest.java b/src/test/java/domain/participant/NameTest.java similarity index 97% rename from src/test/java/participant/NameTest.java rename to src/test/java/domain/participant/NameTest.java index 0920d44c32..2413c8e718 100644 --- a/src/test/java/participant/NameTest.java +++ b/src/test/java/domain/participant/NameTest.java @@ -1,4 +1,4 @@ -package participant; +package domain.participant; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; diff --git a/src/test/java/participant/ParticipantTest.java b/src/test/java/domain/participant/ParticipantTest.java similarity index 98% rename from src/test/java/participant/ParticipantTest.java rename to src/test/java/domain/participant/ParticipantTest.java index beaeb71b67..6f72142286 100644 --- a/src/test/java/participant/ParticipantTest.java +++ b/src/test/java/domain/participant/ParticipantTest.java @@ -1,4 +1,4 @@ -package participant; +package domain.participant; import org.junit.jupiter.api.*; From 68ca019f17296a37a2f863e205f3e6034c3c11ed Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 20:52:14 +0900 Subject: [PATCH 18/60] =?UTF-8?q?fix=20:=20=EC=B9=B4=EB=93=9C=EA=B0=92=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/area/CardArea.java | 25 ++++++--------------- src/test/java/domain/area/CardAreaTest.java | 19 +++++----------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index 5ed1d4f6f0..a431cc749d 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -24,28 +24,17 @@ public void addCard(final Card card) { } public int calculate() { - int total = 0; - for (final Card card : cards) { - total += judgeCardValue(total, card.cardValue()); + int aceCount = (int) cards.stream().filter(it -> it.cardValue().isAce()).count(); + int total = cards.stream().mapToInt(it -> it.cardValue().value()).sum(); + while (aceCount > 0) { + if (total <= 11) { + total += 10; + } + aceCount--; } return total; } - private int judgeCardValue(final Integer totalScore, final CardValue cardValue) { - int addValue = cardValue.value(); - if (cardValue.isAce()) { - addValue = judgeAceValue(totalScore); - } - return addValue; - } - - private Integer judgeAceValue(final Integer totalScore) { - if (totalScore + 11 <= 21) { - return 11; - } - return 1; - } - public boolean canMoreCard() { return calculate() < 21; } diff --git a/src/test/java/domain/area/CardAreaTest.java b/src/test/java/domain/area/CardAreaTest.java index 44506d2ef5..91c044b32a 100644 --- a/src/test/java/domain/area/CardAreaTest.java +++ b/src/test/java/domain/area/CardAreaTest.java @@ -10,7 +10,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.ValueSource; import java.util.stream.Stream; @@ -54,17 +53,6 @@ class CardAreaTest { assertThat(CardArea.class).isAbstract(); } - @ParameterizedTest(name = "{arguments} 카드 영역이 있다.") - @ValueSource(classes = {DealerCardArea.class, ParticipantCardArea.class}) - void 카드_영역은_두_종류가_있다(final Class type) throws Exception { - // given - final CardArea cardArea = type.cast(type.getDeclaredConstructor(Card.class, Card.class) - .newInstance(new Card(CardShape.CLOVER, THREE), new Card(CardShape.CLOVER, TWO))); - - // when & then - assertThat(cardArea).isInstanceOf(type); - } - @ParameterizedTest(name = "카드 목록이 {0} 일 때, 총합은 {1}다.") @CsvSource(value = { "TWO+THREE = 5", @@ -126,12 +114,17 @@ static Stream containsAceCardArea() { // [11] + 10 = 21 final CardArea cardArea5 = new SimpleCardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, TEN)); + // 10 + [1] + 7 = 18 + final CardArea cardArea6 = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + cardArea6.addCard(new Card(CardShape.SPADE, SEVEN)); + return Stream.of( Arguments.of(cardArea1, 21), Arguments.of(cardArea2, 21), Arguments.of(cardArea3, 21), Arguments.of(cardArea4, 20), - Arguments.of(cardArea5, 21) + Arguments.of(cardArea5, 21), + Arguments.of(cardArea6, 18) ); } From 9311987d833b00e03c65eb385f561d239d4fbe8b Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Wed, 1 Mar 2023 20:57:08 +0900 Subject: [PATCH 19/60] =?UTF-8?q?feat=20:=20=EB=B2=84=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/area/CardArea.java | 4 ++++ src/test/java/domain/area/CardAreaTest.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index a431cc749d..b96b65cf6d 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -38,4 +38,8 @@ public int calculate() { public boolean canMoreCard() { return calculate() < 21; } + + public boolean isBurst() { + return calculate() > 21; + } } diff --git a/src/test/java/domain/area/CardAreaTest.java b/src/test/java/domain/area/CardAreaTest.java index 91c044b32a..cac7c937d9 100644 --- a/src/test/java/domain/area/CardAreaTest.java +++ b/src/test/java/domain/area/CardAreaTest.java @@ -157,4 +157,23 @@ public boolean wantHit() { return false; } } + + @Test + void 총합이_21_초과이면_버스트_된다() { + // given + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, TEN)); + cardArea.addCard(new Card(CardShape.DIAMOND, TEN)); + + // when & then + assertTrue(cardArea.isBurst()); + } + + @Test + void 총합이_21_이하이면_버스트_아니다() { + // given + final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + + // when & then + assertFalse(cardArea.isBurst()); + } } \ No newline at end of file From f662ffeb0d0dbc4cb08580d9d55b28adbe24c074 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Thu, 2 Mar 2023 14:12:35 +0900 Subject: [PATCH 20/60] =?UTF-8?q?refactor=20:=20Player=EB=A5=BC=20?= =?UTF-8?q?=EB=B6=80=EB=AA=A8=EB=A1=9C=20=EB=91=90=EA=B3=A0=20Dealer?= =?UTF-8?q?=EC=99=80=20Participant=EB=A5=BC=20=EA=B0=80=EC=A7=80=EA=B2=8C?= =?UTF-8?q?=EB=81=94=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/area/ParticipantCardArea.java | 9 ++ src/main/java/domain/participant/Dealer.java | 15 ++++ .../java/domain/participant/Participant.java | 14 +++- src/main/java/domain/participant/Player.java | 21 +++++ .../domain/area/ParticipantCardAreaTest.java | 18 ++-- .../java/domain/participant/DealerTest.java | 48 +++++++++++ .../domain/participant/ParticipantTest.java | 84 ++++++++++++++----- .../java/domain/participant/PlayerTest.java | 65 ++++++++++++++ 8 files changed, 242 insertions(+), 32 deletions(-) create mode 100644 src/main/java/domain/participant/Dealer.java create mode 100644 src/main/java/domain/participant/Player.java create mode 100644 src/test/java/domain/participant/DealerTest.java create mode 100644 src/test/java/domain/participant/PlayerTest.java diff --git a/src/main/java/domain/area/ParticipantCardArea.java b/src/main/java/domain/area/ParticipantCardArea.java index b78710c67a..1091d978de 100644 --- a/src/main/java/domain/area/ParticipantCardArea.java +++ b/src/main/java/domain/area/ParticipantCardArea.java @@ -12,8 +12,17 @@ public ParticipantCardArea(final Card firstCard, final Card secondCard, final Pa this.participant = participant; } + public ParticipantCardArea(final Card firstCard, final Card secondCard) { + super(firstCard, secondCard); + this.participant = null; + } + @Override public boolean wantHit() { return participant.wantHit(); } + + public Participant participant() { + return participant; + } } diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java new file mode 100644 index 0000000000..af19c7d9f8 --- /dev/null +++ b/src/main/java/domain/participant/Dealer.java @@ -0,0 +1,15 @@ +package domain.participant; + +import domain.area.CardArea; + +public class Dealer extends Player { + + public Dealer(final Name name, final CardArea cardArea) { + super(name, cardArea); + } + + @Override + public boolean canHit() { + return cardArea.calculate() <= 16; + } +} diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index 151b34bace..558a344b17 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -1,12 +1,18 @@ package domain.participant; -public class Participant { +import domain.area.CardArea; + +public class Participant extends Player { - private final Name name; private State state; - public Participant(final Name name) { - this.name = name; + public Participant(final Name name, final CardArea cardArea) { + super(name, cardArea); + } + + @Override + public boolean canHit() { + return cardArea.canMoreCard() && state != State.STAY; } public boolean wantHit() { diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/participant/Player.java new file mode 100644 index 0000000000..54eee81059 --- /dev/null +++ b/src/main/java/domain/participant/Player.java @@ -0,0 +1,21 @@ +package domain.participant; + +import domain.area.CardArea; +import domain.card.Card; + +public abstract class Player { + + protected final Name name; + protected final CardArea cardArea; + + protected Player(final Name name, final CardArea cardArea) { + this.name = name; + this.cardArea = cardArea; + } + + public void hit(final Card card) { + cardArea.addCard(card); + } + + public abstract boolean canHit(); +} diff --git a/src/test/java/domain/area/ParticipantCardAreaTest.java b/src/test/java/domain/area/ParticipantCardAreaTest.java index 36705c905a..3bd353c65c 100644 --- a/src/test/java/domain/area/ParticipantCardAreaTest.java +++ b/src/test/java/domain/area/ParticipantCardAreaTest.java @@ -23,14 +23,14 @@ class ParticipantCardAreaTest { @Test void 참가자가_카드를_더_받기_원할_때만_카드를_받는다() { // given - final Participant participant = new Participant(new Name("player1")); - final CardArea cardArea = new ParticipantCardArea( new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN), - participant + new Card(CardShape.CLOVER, SEVEN) ); + final Participant participant = new Participant(new Name("player1"), cardArea); + + participant.changeState(State.HIT); // when & then @@ -40,13 +40,13 @@ class ParticipantCardAreaTest { @Test void 참가자가_카드를_더_받기_원하지_않을_때_카드를_받지_않는다() { // given - final Participant participant = new Participant(new Name("player1")); - final CardArea cardArea = new ParticipantCardArea( new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN), - participant - ); + new Card(CardShape.CLOVER, SEVEN) + ); + + final Participant participant = new Participant(new Name("player1"), cardArea); + participant.changeState(State.STAY); diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java new file mode 100644 index 0000000000..8960eacabf --- /dev/null +++ b/src/test/java/domain/participant/DealerTest.java @@ -0,0 +1,48 @@ +package domain.participant; + +import domain.area.CardArea; +import domain.area.ParticipantCardArea; +import domain.card.Card; +import domain.card.CardShape; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static domain.card.CardValue.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("Dealer 은") +class DealerTest { + + @Test + void 딜러는_16이하면_카드를_더_받을_수_있다() { + // given + final CardArea cardArea = new ParticipantCardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SIX) + ); + + final Player dealer = new Dealer(new Name("player1"), cardArea); + + // when & then + assertTrue(dealer.canHit()); + } + + @Test + void 딜러는_16초과면_카드를_더_받을_수_없다() { + // given + final CardArea cardArea = new ParticipantCardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SEVEN) + ); + + final Player dealer = new Dealer(new Name("player1"), cardArea); + + // when & then + assertFalse(dealer.canHit()); + } +} \ No newline at end of file diff --git a/src/test/java/domain/participant/ParticipantTest.java b/src/test/java/domain/participant/ParticipantTest.java index 6f72142286..eec8330a49 100644 --- a/src/test/java/domain/participant/ParticipantTest.java +++ b/src/test/java/domain/participant/ParticipantTest.java @@ -1,7 +1,22 @@ package domain.participant; -import org.junit.jupiter.api.*; +import domain.area.CardArea; +import domain.area.ParticipantCardArea; +import domain.card.Card; +import domain.card.CardShape; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; +import java.util.stream.Stream; + +import static domain.card.CardValue.*; import static org.junit.jupiter.api.Assertions.*; @SuppressWarnings("NonAsciiCharacters") @@ -9,42 +24,73 @@ @DisplayName("Participant 은") class ParticipantTest { + final CardArea cardArea = new ParticipantCardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SEVEN) + ); + @Test void 참가자는_상태를_바꿀_수_있다() { // given - final Participant participant = new Participant(new Name("이름")); + final Participant participant = new Participant(new Name("player1"), cardArea); // when assertDoesNotThrow(() -> participant.changeState(State.HIT)); } - @Test - void 참가자는_카드_받을_상태를_결정할_수_있다() { + @ParameterizedTest + @ValueSource(strings = "HIT") + @NullSource + void 참가자는_버스트되지_않았으면서_STAY_를_원하지_않을_때_카드를_더_받을_수_있다(final State state) { // given - final Participant participant = new Participant(new Name("이름")); - participant.changeState(State.HIT); + final Participant participant = new Participant(new Name("player1"), cardArea); + + participant.changeState(state); // when & then - assertTrue(participant.wantHit()); + assertTrue(participant.canHit()); } - @Test - void 참가자는_카드_받지_않을_상태를_결정할_수_있다() { + @ParameterizedTest + @MethodSource("canNotMoreCard") + void 참가자는_버스트되었거나_STAY_를_원한다면_카드를_더_받을_수_없다(final CardArea cardArea, final State state) { // given - final Participant participant = new Participant(new Name("이름")); - participant.changeState(State.STAY); + final Participant participant = new Participant(new Name("player1"), cardArea); + participant.changeState(state); // when & then - assertFalse(participant.wantHit()); + assertFalse(participant.canHit()); } - @Test - void 참가자는_이름을_가질_수_있다() { - // given - final String name = "이름"; - final Participant participant = new Participant(new Name(name)); + static Stream canNotMoreCard() { - // when & then - Assertions.assertEquals(participant.name().value(), name); + final CardArea under21CardArea = new CardArea( + new Card(CardShape.SPADE, TEN), + new Card(CardShape.DIAMOND, TEN) + ) { + @Override + public boolean wantHit() { + return false; + } + }; + + final CardArea over21CardArea = new CardArea( + new Card(CardShape.SPADE, TEN), + new Card(CardShape.DIAMOND, TEN) + ) { + @Override + public boolean wantHit() { + return false; + } + }; + + over21CardArea.addCard(new Card(CardShape.SPADE, TWO)); + + return Stream.of( + Arguments.of(under21CardArea, State.STAY), + Arguments.of(over21CardArea, null), + Arguments.of(over21CardArea, State.STAY), + Arguments.of(over21CardArea, State.HIT) + ); } } \ No newline at end of file diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java new file mode 100644 index 0000000000..3495a12099 --- /dev/null +++ b/src/test/java/domain/participant/PlayerTest.java @@ -0,0 +1,65 @@ +package domain.participant; + +import domain.area.CardArea; +import domain.card.Card; +import domain.card.CardShape; +import domain.card.CardValue; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static domain.card.CardValue.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@SuppressWarnings("NonAsciiCharacters") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@DisplayName("Player 은") +class PlayerTest { + + final Name name = new Name("name"); + + final CardArea cardArea = new CardArea( + new Card(CardShape.SPADE, CardValue.TEN), + new Card(CardShape.SPADE, CardValue.TEN)) { + @Override + public boolean wantHit() { + return false; + } + }; + + final Player player = new Player(name, cardArea){ + @Override + public boolean canHit() { + return false; + } + }; + + @Test + void 추상클래스다() { + //when & then + assertThat(Player.class).isAbstract(); + } + + @Test + void 이름과_area_가진다() { + // when & then + assertDoesNotThrow(() -> new Player(name, cardArea){ + @Override + public boolean canHit() { + return false; + } + }); + } + + @Test + void 카드를_추가할_수_있다() { + // when + final int beforeSize = cardArea.cards().size(); + player.hit(new Card(CardShape.SPADE, TEN)); + + // then + assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); + } +} \ No newline at end of file From 3e41832a6fd31005915f30eb1757d4041720bcc4 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Thu, 2 Mar 2023 14:17:16 +0900 Subject: [PATCH 21/60] =?UTF-8?q?refactor=20:=20CardArea=20=EB=A5=BC=20?= =?UTF-8?q?=EA=B5=AC=EC=B2=B4=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=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 - DealerCardArea, ParticipantCardArea 제거 --- src/main/java/domain/area/CardArea.java | 4 +- src/main/java/domain/area/DealerCardArea.java | 15 ----- .../java/domain/area/ParticipantCardArea.java | 28 ---------- src/test/java/domain/area/CardAreaTest.java | 46 +++++---------- .../java/domain/area/DealerCardAreaTest.java | 42 -------------- .../domain/area/ParticipantCardAreaTest.java | 56 ------------------- .../java/domain/participant/DealerTest.java | 5 +- .../domain/participant/ParticipantTest.java | 17 +----- .../java/domain/participant/PlayerTest.java | 15 ++--- 9 files changed, 25 insertions(+), 203 deletions(-) delete mode 100644 src/main/java/domain/area/DealerCardArea.java delete mode 100644 src/main/java/domain/area/ParticipantCardArea.java delete mode 100644 src/test/java/domain/area/DealerCardAreaTest.java delete mode 100644 src/test/java/domain/area/ParticipantCardAreaTest.java diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index b96b65cf6d..d577a597ee 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import java.util.List; -public abstract class CardArea { +public class CardArea { private final List cards = new ArrayList<>(); @@ -13,8 +13,6 @@ public CardArea(final Card firstCard, final Card secondCard) { cards.addAll(List.of(firstCard, secondCard)); } - public abstract boolean wantHit(); - public List cards() { return new ArrayList<>(cards); } diff --git a/src/main/java/domain/area/DealerCardArea.java b/src/main/java/domain/area/DealerCardArea.java deleted file mode 100644 index 9e1d0a0597..0000000000 --- a/src/main/java/domain/area/DealerCardArea.java +++ /dev/null @@ -1,15 +0,0 @@ -package domain.area; - -import domain.card.Card; - -public class DealerCardArea extends CardArea { - - public DealerCardArea(final Card firstCard, final Card secondCard) { - super(firstCard, secondCard); - } - - @Override - public boolean wantHit() { - return calculate() <= 17; - } -} diff --git a/src/main/java/domain/area/ParticipantCardArea.java b/src/main/java/domain/area/ParticipantCardArea.java deleted file mode 100644 index 1091d978de..0000000000 --- a/src/main/java/domain/area/ParticipantCardArea.java +++ /dev/null @@ -1,28 +0,0 @@ -package domain.area; - -import domain.card.Card; -import domain.participant.Participant; - -public class ParticipantCardArea extends CardArea { - - private final Participant participant; - - public ParticipantCardArea(final Card firstCard, final Card secondCard, final Participant participant) { - super(firstCard, secondCard); - this.participant = participant; - } - - public ParticipantCardArea(final Card firstCard, final Card secondCard) { - super(firstCard, secondCard); - this.participant = null; - } - - @Override - public boolean wantHit() { - return participant.wantHit(); - } - - public Participant participant() { - return participant; - } -} diff --git a/src/test/java/domain/area/CardAreaTest.java b/src/test/java/domain/area/CardAreaTest.java index cac7c937d9..819231538f 100644 --- a/src/test/java/domain/area/CardAreaTest.java +++ b/src/test/java/domain/area/CardAreaTest.java @@ -25,7 +25,7 @@ class CardAreaTest { @Test void 카드를_두장만_받아서_생성된다() { // when & then - assertDoesNotThrow(() -> new SimpleCardArea( + assertDoesNotThrow(() -> new CardArea( new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, TWO)) ); @@ -34,7 +34,7 @@ class CardAreaTest { @Test void 카드를_추가할_수_있다() { // given - final CardArea cardArea = new SimpleCardArea( + final CardArea cardArea = new CardArea( new Card(CardShape.CLOVER, THREE), new Card(CardShape.CLOVER, TWO) ); @@ -47,12 +47,6 @@ class CardAreaTest { assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); } - @Test - void CardArea_는_추상_클래스이다() { - // when & then - assertThat(CardArea.class).isAbstract(); - } - @ParameterizedTest(name = "카드 목록이 {0} 일 때, 총합은 {1}다.") @CsvSource(value = { "TWO+THREE = 5", @@ -63,7 +57,7 @@ class CardAreaTest { void 자신이_가진_카드의_합을_구할_수_있다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, valueOf(split[0])), new Card(CardShape.CLOVER, valueOf(split[1]))); + final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, valueOf(split[0])), new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -81,7 +75,7 @@ class CardAreaTest { void 킹_퀸_잭은_10으로_계산한다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, valueOf(split[0])), new Card(CardShape.CLOVER, valueOf(split[1]))); + final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, valueOf(split[0])), new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -97,25 +91,25 @@ class CardAreaTest { static Stream containsAceCardArea() { // 10 + [11] = 21 - final CardArea cardArea1 = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + final CardArea cardArea1 = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); // 10 + 10 + [1] = 21 - final CardArea cardArea2 = new SimpleCardArea(new Card(CardShape.CLOVER, JACK), new Card(CardShape.CLOVER, TEN)); + final CardArea cardArea2 = new CardArea(new Card(CardShape.CLOVER, JACK), new Card(CardShape.CLOVER, TEN)); cardArea2.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 9 + [1] = 21 - final CardArea cardArea3 = new SimpleCardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, NINE)); + final CardArea cardArea3 = new CardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, NINE)); cardArea3.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 6 + 3 = 20 - final CardArea cardArea4 = new SimpleCardArea(new Card(CardShape.CLOVER, SIX), new Card(CardShape.CLOVER, THREE)); + final CardArea cardArea4 = new CardArea(new Card(CardShape.CLOVER, SIX), new Card(CardShape.CLOVER, THREE)); cardArea4.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 10 = 21 - final CardArea cardArea5 = new SimpleCardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, TEN)); + final CardArea cardArea5 = new CardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, TEN)); // 10 + [1] + 7 = 18 - final CardArea cardArea6 = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + final CardArea cardArea6 = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); cardArea6.addCard(new Card(CardShape.SPADE, SEVEN)); return Stream.of( @@ -131,7 +125,7 @@ static Stream containsAceCardArea() { @Test void 총합이_20_이하면_카드를_더_받을_수_있는_상태이다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, TEN)); + final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, TEN)); // when & then assertTrue(cardArea.canMoreCard()); @@ -140,28 +134,16 @@ static Stream containsAceCardArea() { @Test void 총합이_21_이상이면_카드를_더_받을_수_없는_상태이다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); // when & then assertFalse(cardArea.canMoreCard()); } - static class SimpleCardArea extends CardArea { - - public SimpleCardArea(final Card firstCard, final Card secondCard) { - super(firstCard, secondCard); - } - - @Override - public boolean wantHit() { - return false; - } - } - @Test void 총합이_21_초과이면_버스트_된다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, TEN)); + final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, TEN)); cardArea.addCard(new Card(CardShape.DIAMOND, TEN)); // when & then @@ -171,7 +153,7 @@ public boolean wantHit() { @Test void 총합이_21_이하이면_버스트_아니다() { // given - final CardArea cardArea = new SimpleCardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); // when & then assertFalse(cardArea.isBurst()); diff --git a/src/test/java/domain/area/DealerCardAreaTest.java b/src/test/java/domain/area/DealerCardAreaTest.java deleted file mode 100644 index 4e5ea0d3b5..0000000000 --- a/src/test/java/domain/area/DealerCardAreaTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package domain.area; - -import domain.card.Card; -import domain.card.CardShape; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.DisplayNameGeneration; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.Test; - -import static domain.card.CardValue.*; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -@SuppressWarnings("NonAsciiCharacters") -@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -@DisplayName("DealerCardArea 은") -class DealerCardAreaTest { - - @Test - void 딜러_카드_영억은_현재_점수가_17점_이하일_경우에는_카드를_무조건_받아야_한다() { - // given - final CardArea cardArea = new DealerCardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN) - ); - - // when & then - assertTrue(cardArea.wantHit()); - } - - @Test - void 딜러_카드_영억은_현재_점수가_17점_초과일_경우에는_카드를_무조건_받지_않는다() { - // given - final CardArea cardArea = new DealerCardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, EIGHT) - ); - - // when & then - assertFalse(cardArea.wantHit()); - } -} \ No newline at end of file diff --git a/src/test/java/domain/area/ParticipantCardAreaTest.java b/src/test/java/domain/area/ParticipantCardAreaTest.java deleted file mode 100644 index 3bd353c65c..0000000000 --- a/src/test/java/domain/area/ParticipantCardAreaTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package domain.area; - -import domain.card.Card; -import domain.card.CardShape; -import domain.participant.Name; -import domain.participant.Participant; -import domain.participant.State; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.DisplayNameGeneration; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.Test; - -import static domain.card.CardValue.SEVEN; -import static domain.card.CardValue.TEN; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -@SuppressWarnings("NonAsciiCharacters") -@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -@DisplayName("ParticipantCardArea 은") -class ParticipantCardAreaTest { - - @Test - void 참가자가_카드를_더_받기_원할_때만_카드를_받는다() { - // given - final CardArea cardArea = new ParticipantCardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN) - ); - - final Participant participant = new Participant(new Name("player1"), cardArea); - - - participant.changeState(State.HIT); - - // when & then - assertTrue(cardArea.wantHit()); - } - - @Test - void 참가자가_카드를_더_받기_원하지_않을_때_카드를_받지_않는다() { - // given - final CardArea cardArea = new ParticipantCardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN) - ); - - final Participant participant = new Participant(new Name("player1"), cardArea); - - - participant.changeState(State.STAY); - - // when & then - assertFalse(cardArea.wantHit()); - } -} \ No newline at end of file diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index 8960eacabf..8418281ba6 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -1,7 +1,6 @@ package domain.participant; import domain.area.CardArea; -import domain.area.ParticipantCardArea; import domain.card.Card; import domain.card.CardShape; import org.junit.jupiter.api.DisplayName; @@ -21,7 +20,7 @@ class DealerTest { @Test void 딜러는_16이하면_카드를_더_받을_수_있다() { // given - final CardArea cardArea = new ParticipantCardArea( + final CardArea cardArea = new CardArea( new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, SIX) ); @@ -35,7 +34,7 @@ class DealerTest { @Test void 딜러는_16초과면_카드를_더_받을_수_없다() { // given - final CardArea cardArea = new ParticipantCardArea( + final CardArea cardArea = new CardArea( new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, SEVEN) ); diff --git a/src/test/java/domain/participant/ParticipantTest.java b/src/test/java/domain/participant/ParticipantTest.java index eec8330a49..8472f6a973 100644 --- a/src/test/java/domain/participant/ParticipantTest.java +++ b/src/test/java/domain/participant/ParticipantTest.java @@ -1,7 +1,6 @@ package domain.participant; import domain.area.CardArea; -import domain.area.ParticipantCardArea; import domain.card.Card; import domain.card.CardShape; import org.junit.jupiter.api.DisplayName; @@ -24,7 +23,7 @@ @DisplayName("Participant 은") class ParticipantTest { - final CardArea cardArea = new ParticipantCardArea( + final CardArea cardArea = new CardArea( new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, SEVEN) ); @@ -67,22 +66,12 @@ static Stream canNotMoreCard() { final CardArea under21CardArea = new CardArea( new Card(CardShape.SPADE, TEN), new Card(CardShape.DIAMOND, TEN) - ) { - @Override - public boolean wantHit() { - return false; - } - }; + ); final CardArea over21CardArea = new CardArea( new Card(CardShape.SPADE, TEN), new Card(CardShape.DIAMOND, TEN) - ) { - @Override - public boolean wantHit() { - return false; - } - }; + ); over21CardArea.addCard(new Card(CardShape.SPADE, TWO)); diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java index 3495a12099..08ab2f1c42 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -9,9 +9,9 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import static domain.card.CardValue.*; +import static domain.card.CardValue.TEN; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -22,14 +22,9 @@ class PlayerTest { final CardArea cardArea = new CardArea( new Card(CardShape.SPADE, CardValue.TEN), - new Card(CardShape.SPADE, CardValue.TEN)) { - @Override - public boolean wantHit() { - return false; - } - }; + new Card(CardShape.SPADE, CardValue.TEN)); - final Player player = new Player(name, cardArea){ + final Player player = new Player(name, cardArea) { @Override public boolean canHit() { return false; @@ -45,7 +40,7 @@ public boolean canHit() { @Test void 이름과_area_가진다() { // when & then - assertDoesNotThrow(() -> new Player(name, cardArea){ + assertDoesNotThrow(() -> new Player(name, cardArea) { @Override public boolean canHit() { return false; From 5f29f3cad4dcaabe9fc7ddb8d3c872fb26b59dad Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Thu, 2 Mar 2023 14:36:44 +0900 Subject: [PATCH 22/60] =?UTF-8?q?feat=20:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BlackJackApplication.java | 7 ++ .../java/controller/BlackJackController.java | 110 ++++++++++++++++++ .../java/domain/participant/Participant.java | 4 - src/main/java/domain/participant/Player.java | 16 +++ src/main/java/view/InputView.java | 26 +++++ src/main/java/view/OutputView.java | 42 +++++++ 6 files changed, 201 insertions(+), 4 deletions(-) create mode 100644 src/main/java/BlackJackApplication.java create mode 100644 src/main/java/controller/BlackJackController.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/BlackJackApplication.java b/src/main/java/BlackJackApplication.java new file mode 100644 index 0000000000..57ece02019 --- /dev/null +++ b/src/main/java/BlackJackApplication.java @@ -0,0 +1,7 @@ +import controller.BlackJackController; + +public class BlackJackApplication { + public static void main(String[] args) { + new BlackJackController().run(); + } +} diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java new file mode 100644 index 0000000000..14d01baf62 --- /dev/null +++ b/src/main/java/controller/BlackJackController.java @@ -0,0 +1,110 @@ +package controller; + +import domain.area.CardArea; +import domain.deck.CardDeck; +import domain.participant.Dealer; +import domain.participant.Name; +import domain.participant.Participant; +import domain.participant.State; +import view.InputView; +import view.OutputView; + +import java.util.List; +import java.util.stream.Collectors; + +public class BlackJackController { + + public void run() { + + final List participantNames = createParticipantNames(); + + final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + + final List participants = dealParticipantsCards(cardDeck, participantNames); + final Dealer dealer = dealDealerCars(cardDeck); + + OutputView.printAfterDeal(participants); + OutputView.showPlayerState(dealer); + OutputView.showPlayersState(participants); + + for (final Participant participant : participants) { + addParticipant(cardDeck, participant); + } + + //딜러 반복해서 주고 + while (dealer.canHit()) { + OutputView.dealerOneMoreCard(); + dealer.hit(cardDeck.draw()); + } + + //전체 상태 다 출력 - 결과 + OutputView.showParticipantsStateResult(participants); + OutputView.showPlayerStateResult(dealer); + + //최종 승패 + int dealerWin = 0; + int dealerDraw = 0; + int dealerLose = 0; + final int dealerScore = dealer.score(); + + for (final Participant participant : participants) { + + if (participant.isBurst()) { + System.out.println(participant.name().value() + ": " + "패"); + dealerWin++; + } else { + if (dealer.isBurst()) { + System.out.println(participant.name().value() + ": " + "승"); + dealerLose++; + } else { + if (participant.score() > dealerScore) { + System.out.println(participant.name().value() + ": " + "승"); + dealerLose++; + } else if (participant.score() == dealerScore) { + System.out.println(participant.name().value() + ": " + "무승부"); + dealerDraw++; + } else { + System.out.println(participant.name().value() + ": " + "패"); + dealerWin++; + } + } + } + } + + System.out.println("딜러: " + dealerWin + "승" + dealerDraw + "무" + dealerLose + "패"); + } + + private static void addParticipant(final CardDeck cardDeck, final Participant participant) { + // canMoreCard -> 21 이하이면서, 참여자가 STAY 를 원하지 않는 경우 + while (participant.canHit()) { + if (InputView.readMoreCard(participant).equals("y")) { + participant.changeState(State.HIT); + } else { + participant.changeState(State.STAY); + } + + if (participant.wantHit()) { + participant.hit(cardDeck.draw()); + } + OutputView.showPlayerState(participant); + } + } + + private Dealer dealDealerCars(final CardDeck cardDeck) { + // TODO 수정 + return new Dealer(new Name("딜러"), new CardArea(cardDeck.draw(), cardDeck.draw())); + } + + private List dealParticipantsCards(final CardDeck cardDeck, final List participantNames) { + return participantNames.stream() + .map(it -> new Participant(it, new CardArea(cardDeck.draw(), cardDeck.draw()))) + .collect(Collectors.toList()); + } + + private List createParticipantNames() { + return InputView.readParticipantsName() + .stream() + .map(Name::new) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index 558a344b17..fa07a699d4 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -22,8 +22,4 @@ public boolean wantHit() { public void changeState(final State state) { this.state = state; } - - public Name name() { - return name; - } } diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/participant/Player.java index 54eee81059..5cca50a160 100644 --- a/src/main/java/domain/participant/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -13,9 +13,25 @@ protected Player(final Name name, final CardArea cardArea) { this.cardArea = cardArea; } + public Name name() { + return name; + } + + public CardArea cardArea() { + return cardArea; + } + + public boolean isBurst() { + return cardArea.isBurst(); + } + public void hit(final Card card) { cardArea.addCard(card); } public abstract boolean canHit(); + + public int score() { + return cardArea.calculate(); + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000000..b1aaf55317 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,26 @@ +package view; + +import domain.participant.Participant; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + + private static final Scanner scanner = new Scanner(System.in); + + public static List readParticipantsName() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + final String input = scanner.nextLine(); + + return Arrays.stream(input.split(",")) + .collect(Collectors.toList()); + } + + public static String readMoreCard(final Participant participant) { + System.out.println(participant.name().value() + "는 한장의 카드를 더 받으시겠습니다?(예는 y, 아니오는 n)"); + return scanner.nextLine(); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 0000000000..8829e7148a --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,42 @@ +package view; + +import domain.participant.Player; + +import java.util.List; +import java.util.stream.Collectors; + +public class OutputView { + + public static void printAfterDeal(final List participants) { + System.out.println("딜러와" + participants.stream().map(it -> it.name().value()).collect(Collectors.joining(", ")) + "에게 2장을 나누었습니다"); + } + + public static void showPlayersState(final List participants) { + participants.forEach((participant) -> System.out.println(makeStateMessage(participant))); + } + + public static void showPlayerState(final Player player) { + System.out.println(makeStateMessage(player)); + } + + private static String makeStateMessage(final Player player) { + return player.cardArea().cards().stream() + .map(card -> String.format("%s %s", card.cardValue().name(), card.cardShape().name())) + .collect(Collectors.joining(", ", player.name().value() + "카드: ", "")); + } + + public static void showParticipantsStateResult(final List participants) { + participants.forEach(OutputView::showPlayerStateResult); + } + + public static void showPlayerStateResult(final Player player) { + final String message = player.cardArea().cards().stream() + .map(card -> String.format("%s %s", card.cardValue().name(), card.cardShape().name())) + .collect(Collectors.joining(", ", player.name().value() + "카드: ", String.format(" - 결과: %d", player.cardArea().calculate()))); + System.out.println(message); + } + + public static void dealerOneMoreCard() { + System.out.println("딜러는 16 이하라 한장의 카드를 더 받았습니다."); + } +} From a9b11a29c933635c7e0da2baf6f8f9d7449b4059 Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Thu, 2 Mar 2023 14:43:49 +0900 Subject: [PATCH 23/60] =?UTF-8?q?feat=20:=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=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/view/OutputView.java | 39 ++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 8829e7148a..131a558a2d 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,12 +1,47 @@ package view; +import domain.card.CardShape; +import domain.card.CardValue; import domain.participant.Player; +import java.util.EnumMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class OutputView { + private static final Map SHAPE_MESSAGE_MAP = new EnumMap<>(CardShape.class); + private static final Map VALUE_MESSAGE_MAP = new EnumMap<>(CardValue.class); + + static { + makeShapeMessage(); + makeValueMessage(); + } + + private static void makeShapeMessage() { + SHAPE_MESSAGE_MAP.put(CardShape.DIAMOND, "다이아몬드"); + SHAPE_MESSAGE_MAP.put(CardShape.CLOVER, "클로버"); + SHAPE_MESSAGE_MAP.put(CardShape.HEART, "하트"); + SHAPE_MESSAGE_MAP.put(CardShape.SPADE, "스페이드"); + } + + private static void makeValueMessage() { + VALUE_MESSAGE_MAP.put(CardValue.TWO, "2"); + VALUE_MESSAGE_MAP.put(CardValue.THREE, "3"); + VALUE_MESSAGE_MAP.put(CardValue.FOUR, "4"); + VALUE_MESSAGE_MAP.put(CardValue.FIVE, "5"); + VALUE_MESSAGE_MAP.put(CardValue.SIX, "6"); + VALUE_MESSAGE_MAP.put(CardValue.SEVEN, "7"); + VALUE_MESSAGE_MAP.put(CardValue.EIGHT, "8"); + VALUE_MESSAGE_MAP.put(CardValue.NINE, "9"); + VALUE_MESSAGE_MAP.put(CardValue.TEN, "10"); + VALUE_MESSAGE_MAP.put(CardValue.KING, "킹"); + VALUE_MESSAGE_MAP.put(CardValue.QUEEN, "퀸"); + VALUE_MESSAGE_MAP.put(CardValue.JACK, "잭"); + VALUE_MESSAGE_MAP.put(CardValue.ACE, "A"); + } + public static void printAfterDeal(final List participants) { System.out.println("딜러와" + participants.stream().map(it -> it.name().value()).collect(Collectors.joining(", ")) + "에게 2장을 나누었습니다"); } @@ -21,7 +56,7 @@ public static void showPlayerState(final Player player) { private static String makeStateMessage(final Player player) { return player.cardArea().cards().stream() - .map(card -> String.format("%s %s", card.cardValue().name(), card.cardShape().name())) + .map(card -> String.format("%s %s", VALUE_MESSAGE_MAP.get(card.cardValue()), SHAPE_MESSAGE_MAP.get(card.cardShape()))) .collect(Collectors.joining(", ", player.name().value() + "카드: ", "")); } @@ -31,7 +66,7 @@ public static void showParticipantsStateResult(final List part public static void showPlayerStateResult(final Player player) { final String message = player.cardArea().cards().stream() - .map(card -> String.format("%s %s", card.cardValue().name(), card.cardShape().name())) + .map(card -> String.format("%s %s", VALUE_MESSAGE_MAP.get(card.cardValue()), SHAPE_MESSAGE_MAP.get(card.cardShape()))) .collect(Collectors.joining(", ", player.name().value() + "카드: ", String.format(" - 결과: %d", player.cardArea().calculate()))); System.out.println(message); } From 0c81d51334e17138ff9cd4fb06d835a0c0c893cb Mon Sep 17 00:00:00 2001 From: shin-mallang Date: Thu, 2 Mar 2023 15:48:20 +0900 Subject: [PATCH 24/60] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=ED=86=B5=EA=B3=84=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackJackController.java | 139 ++++++++++++------ src/main/java/domain/participant/Dealer.java | 5 + src/main/java/view/OutputView.java | 41 +++++- .../java/domain/participant/DealerTest.java | 17 ++- 4 files changed, 150 insertions(+), 52 deletions(-) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 14d01baf62..ec8562833e 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -10,6 +10,8 @@ import view.OutputView; import java.util.List; +import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; public class BlackJackController { @@ -24,70 +26,48 @@ public void run() { final Dealer dealer = dealDealerCars(cardDeck); OutputView.printAfterDeal(participants); - OutputView.showPlayerState(dealer); + OutputView.showDealerState(dealer); OutputView.showPlayersState(participants); - for (final Participant participant : participants) { - addParticipant(cardDeck, participant); - } + hitForParticipants(cardDeck, participants); + hitForDealer(cardDeck, dealer); + + //최종 승패 + gameStatistic(participants, dealer); + } - //딜러 반복해서 주고 + private void hitForDealer(final CardDeck cardDeck, final Dealer dealer) { while (dealer.canHit()) { OutputView.dealerOneMoreCard(); dealer.hit(cardDeck.draw()); } + } - //전체 상태 다 출력 - 결과 - OutputView.showParticipantsStateResult(participants); - OutputView.showPlayerStateResult(dealer); - - //최종 승패 - int dealerWin = 0; - int dealerDraw = 0; - int dealerLose = 0; - final int dealerScore = dealer.score(); - + private void hitForParticipants(final CardDeck cardDeck, final List participants) { for (final Participant participant : participants) { - - if (participant.isBurst()) { - System.out.println(participant.name().value() + ": " + "패"); - dealerWin++; - } else { - if (dealer.isBurst()) { - System.out.println(participant.name().value() + ": " + "승"); - dealerLose++; - } else { - if (participant.score() > dealerScore) { - System.out.println(participant.name().value() + ": " + "승"); - dealerLose++; - } else if (participant.score() == dealerScore) { - System.out.println(participant.name().value() + ": " + "무승부"); - dealerDraw++; - } else { - System.out.println(participant.name().value() + ": " + "패"); - dealerWin++; - } - } - } + hitForParticipant(cardDeck, participant); } - - System.out.println("딜러: " + dealerWin + "승" + dealerDraw + "무" + dealerLose + "패"); } - private static void addParticipant(final CardDeck cardDeck, final Participant participant) { - // canMoreCard -> 21 이하이면서, 참여자가 STAY 를 원하지 않는 경우 + private void hitForParticipant(final CardDeck cardDeck, final Participant participant) { while (participant.canHit()) { - if (InputView.readMoreCard(participant).equals("y")) { - participant.changeState(State.HIT); - } else { - participant.changeState(State.STAY); - } + participant.changeState(inputHitOrStay(participant)); + hitOrStayForParticipant(cardDeck, participant); + } + } - if (participant.wantHit()) { - participant.hit(cardDeck.draw()); - } - OutputView.showPlayerState(participant); + private void hitOrStayForParticipant(final CardDeck cardDeck, final Participant participant) { + if (participant.wantHit()) { + participant.hit(cardDeck.draw()); } + OutputView.showPlayerState(participant); + } + + private State inputHitOrStay(final Participant participant) { + if (InputView.readMoreCard(participant).equals("y")) { + return State.HIT; + } + return State.STAY; } private Dealer dealDealerCars(final CardDeck cardDeck) { @@ -107,4 +87,65 @@ private List createParticipantNames() { .map(Name::new) .collect(Collectors.toList()); } + + private void gameStatistic(final List participants, final Dealer dealer) { + final Map collect1 = participants.stream().collect(Collectors.toMap(Function.identity(), it -> PlayerResult.judge(it, dealer))); + OutputView.showGameStatistic(new ResultDto(collect1, participants, dealer)); + } + + public enum PlayerResult { + WINNER, + LOSER, + DRAWER; + + public static PlayerResult judge(final Participant it, final Dealer dealer) { + if (it.isBurst()) { + return PlayerResult.LOSER; + } + if (dealer.isBurst()) { + return PlayerResult.WINNER; + } + if (it.score() > dealer.score()) { + return PlayerResult.WINNER; + } + if (it.score() == dealer.score()) { + return PlayerResult.DRAWER; + } + return PlayerResult.LOSER; + } + + public PlayerResult reverse() { + if (this == WINNER) { + return LOSER; + } + if (this == LOSER) { + return WINNER; + } + return this; + } + } + + public class ResultDto { + private final Map participantsResult; + private final List participants; + private final Dealer dealer; + + public ResultDto(final Map participantsResult, final List participants, final Dealer dealer) { + this.participantsResult = participantsResult; + this.participants = participants; + this.dealer = dealer; + } + + public Map participantsResult() { + return participantsResult; + } + + public List participants() { + return participants; + } + + public Dealer dealer() { + return dealer; + } + } } diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java index af19c7d9f8..a05e8c3c1c 100644 --- a/src/main/java/domain/participant/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -1,6 +1,7 @@ package domain.participant; import domain.area.CardArea; +import domain.card.Card; public class Dealer extends Player { @@ -12,4 +13,8 @@ public Dealer(final Name name, final CardArea cardArea) { public boolean canHit() { return cardArea.calculate() <= 16; } + + public Card firstCard() { + return cardArea.cards().get(0); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 131a558a2d..21166092cf 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,7 +1,11 @@ package view; +import controller.BlackJackController; +import controller.BlackJackController.PlayerResult; import domain.card.CardShape; import domain.card.CardValue; +import domain.participant.Dealer; +import domain.participant.Participant; import domain.participant.Player; import java.util.EnumMap; @@ -9,14 +13,18 @@ import java.util.Map; import java.util.stream.Collectors; +import static java.util.stream.Collectors.counting; + public class OutputView { private static final Map SHAPE_MESSAGE_MAP = new EnumMap<>(CardShape.class); private static final Map VALUE_MESSAGE_MAP = new EnumMap<>(CardValue.class); + private static final Map PLAYER_RESULT_MAP = new EnumMap<>(PlayerResult.class); static { makeShapeMessage(); makeValueMessage(); + makePlayerResultMessage(); } private static void makeShapeMessage() { @@ -42,8 +50,14 @@ private static void makeValueMessage() { VALUE_MESSAGE_MAP.put(CardValue.ACE, "A"); } + private static void makePlayerResultMessage() { + PLAYER_RESULT_MAP.put(PlayerResult.WINNER, "승"); + PLAYER_RESULT_MAP.put(PlayerResult.LOSER, "패"); + PLAYER_RESULT_MAP.put(PlayerResult.DRAWER, "무"); + } + public static void printAfterDeal(final List participants) { - System.out.println("딜러와" + participants.stream().map(it -> it.name().value()).collect(Collectors.joining(", ")) + "에게 2장을 나누었습니다"); + System.out.println("딜러와 " + participants.stream().map(it -> it.name().value()).collect(Collectors.joining(", ")) + "에게 2장을 나누었습니다"); } public static void showPlayersState(final List participants) { @@ -74,4 +88,29 @@ public static void showPlayerStateResult(final Player player) { public static void dealerOneMoreCard() { System.out.println("딜러는 16 이하라 한장의 카드를 더 받았습니다."); } + + public static void showGameStatistic(BlackJackController.ResultDto resultDto) { + showPlayerStateResult(resultDto.dealer()); + showParticipantsStateResult(resultDto.participants()); + final Map result = resultDto.participantsResult(); + + final Map winOrLose = result.keySet().stream().collect(Collectors.groupingBy(result::get, counting())); + + final String collect = winOrLose.keySet() + .stream() + .map(PlayerResult::reverse) + .map(it -> winOrLose.get(it) + PLAYER_RESULT_MAP.get(it)) + .collect(Collectors.joining(" ", "딜러: ", "")); + + System.out.println(collect); + + resultDto.participants() + .stream() + .map(it -> it.name().value() + ": " + PLAYER_RESULT_MAP.get(result.get(it))) + .forEach(System.out::println); + } + + public static void showDealerState(final Dealer dealer) { + System.out.println(dealer.name().value() + ": " + VALUE_MESSAGE_MAP.get(dealer.firstCard().cardValue()) + SHAPE_MESSAGE_MAP.get(dealer.firstCard().cardShape())); + } } diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index 8418281ba6..0f76bde41b 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -9,8 +9,7 @@ import org.junit.jupiter.api.Test; import static domain.card.CardValue.*; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -44,4 +43,18 @@ class DealerTest { // when & then assertFalse(dealer.canHit()); } + + @Test + void 딜러는_첫_장만_보여줄_수_있다() { + // given + final CardArea cardArea = new CardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SEVEN) + ); + + final Dealer dealer = new Dealer(new Name("player1"), cardArea); + + // then + assertEquals(dealer.firstCard(), new Card(CardShape.CLOVER, TEN)); + } } \ No newline at end of file From 390d577decbcefa78af5e1221224330a174bec39 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 16:53:47 +0900 Subject: [PATCH 25/60] =?UTF-8?q?refactor=20:=20=EC=B2=AB=20=EB=B2=88?= =?UTF-8?q?=EC=A7=B8=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A3=BC=EB=8A=94=20=ED=96=89=EC=9C=84=EB=8A=94=20CardArea=20?= =?UTF-8?q?=EA=B0=80=20=EC=A0=81=ED=95=A9=ED=95=98=EB=8B=A4=EA=B3=A0=20?= =?UTF-8?q?=EC=83=9D=EA=B0=81=ED=95=98=EC=97=AC=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/area/CardArea.java | 27 +++++++++++--- src/main/java/domain/participant/Dealer.java | 5 --- src/main/java/view/OutputView.java | 36 +++++++++++-------- src/test/java/domain/area/CardAreaTest.java | 36 ++++++++++++++++--- .../java/domain/participant/DealerTest.java | 23 ++++-------- 5 files changed, 81 insertions(+), 46 deletions(-) diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index d577a597ee..669f3c70f9 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -22,15 +22,28 @@ public void addCard(final Card card) { } public int calculate() { - int aceCount = (int) cards.stream().filter(it -> it.cardValue().isAce()).count(); - int total = cards.stream().mapToInt(it -> it.cardValue().value()).sum(); + int aceCount = countAceCard(); + int totalValue = sumTotalCardValue(); + while (aceCount > 0) { - if (total <= 11) { - total += 10; + if (totalValue <= 11) { + totalValue += 10; } aceCount--; } - return total; + return totalValue; + } + + private int sumTotalCardValue() { + return cards.stream() + .mapToInt(card -> card.cardValue().value()) + .sum(); + } + + private int countAceCard() { + return (int) cards.stream() + .filter(card -> card.cardValue().isAce()) + .count(); } public boolean canMoreCard() { @@ -40,4 +53,8 @@ public boolean canMoreCard() { public boolean isBurst() { return calculate() > 21; } + + public Card firstCard() { + return cards.get(0); + } } diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java index a05e8c3c1c..af19c7d9f8 100644 --- a/src/main/java/domain/participant/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -1,7 +1,6 @@ package domain.participant; import domain.area.CardArea; -import domain.card.Card; public class Dealer extends Player { @@ -13,8 +12,4 @@ public Dealer(final Name name, final CardArea cardArea) { public boolean canHit() { return cardArea.calculate() <= 16; } - - public Card firstCard() { - return cardArea.cards().get(0); - } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 21166092cf..814dbcc2c6 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -57,7 +57,8 @@ private static void makePlayerResultMessage() { } public static void printAfterDeal(final List participants) { - System.out.println("딜러와 " + participants.stream().map(it -> it.name().value()).collect(Collectors.joining(", ")) + "에게 2장을 나누었습니다"); + System.out.println("딜러와 " + participants.stream().map(it -> it.name().value()) + .collect(Collectors.joining(", ")) + "에게 2장을 나누었습니다"); } public static void showPlayersState(final List participants) { @@ -70,8 +71,9 @@ public static void showPlayerState(final Player player) { private static String makeStateMessage(final Player player) { return player.cardArea().cards().stream() - .map(card -> String.format("%s %s", VALUE_MESSAGE_MAP.get(card.cardValue()), SHAPE_MESSAGE_MAP.get(card.cardShape()))) - .collect(Collectors.joining(", ", player.name().value() + "카드: ", "")); + .map(card -> String.format("%s %s", VALUE_MESSAGE_MAP.get(card.cardValue()), + SHAPE_MESSAGE_MAP.get(card.cardShape()))) + .collect(Collectors.joining(", ", player.name().value() + "카드: ", "")); } public static void showParticipantsStateResult(final List participants) { @@ -80,8 +82,11 @@ public static void showParticipantsStateResult(final List part public static void showPlayerStateResult(final Player player) { final String message = player.cardArea().cards().stream() - .map(card -> String.format("%s %s", VALUE_MESSAGE_MAP.get(card.cardValue()), SHAPE_MESSAGE_MAP.get(card.cardShape()))) - .collect(Collectors.joining(", ", player.name().value() + "카드: ", String.format(" - 결과: %d", player.cardArea().calculate()))); + .map(card -> String.format("%s %s", VALUE_MESSAGE_MAP.get(card.cardValue()), + SHAPE_MESSAGE_MAP.get(card.cardShape()))) + .collect(Collectors.joining(", ", player.name().value() + "카드: ", + String.format(" - 결과: %d", + player.cardArea().calculate()))); System.out.println(message); } @@ -94,23 +99,26 @@ public static void showGameStatistic(BlackJackController.ResultDto resultDto) { showParticipantsStateResult(resultDto.participants()); final Map result = resultDto.participantsResult(); - final Map winOrLose = result.keySet().stream().collect(Collectors.groupingBy(result::get, counting())); + final Map winOrLose = result.keySet().stream() + .collect(Collectors.groupingBy(result::get, counting())); final String collect = winOrLose.keySet() - .stream() - .map(PlayerResult::reverse) - .map(it -> winOrLose.get(it) + PLAYER_RESULT_MAP.get(it)) - .collect(Collectors.joining(" ", "딜러: ", "")); + .stream() + .map(PlayerResult::reverse) + .map(it -> winOrLose.get(it) + PLAYER_RESULT_MAP.get(it)) + .collect(Collectors.joining(" ", "딜러: ", "")); System.out.println(collect); resultDto.participants() - .stream() - .map(it -> it.name().value() + ": " + PLAYER_RESULT_MAP.get(result.get(it))) - .forEach(System.out::println); + .stream() + .map(it -> it.name().value() + ": " + PLAYER_RESULT_MAP.get(result.get(it))) + .forEach(System.out::println); } public static void showDealerState(final Dealer dealer) { - System.out.println(dealer.name().value() + ": " + VALUE_MESSAGE_MAP.get(dealer.firstCard().cardValue()) + SHAPE_MESSAGE_MAP.get(dealer.firstCard().cardShape())); + System.out.println(dealer.name().value() + ": " + VALUE_MESSAGE_MAP.get( + dealer.cardArea().firstCard().cardValue()) + SHAPE_MESSAGE_MAP.get( + dealer.cardArea().firstCard().cardShape())); } } diff --git a/src/test/java/domain/area/CardAreaTest.java b/src/test/java/domain/area/CardAreaTest.java index 819231538f..10b62aa38a 100644 --- a/src/test/java/domain/area/CardAreaTest.java +++ b/src/test/java/domain/area/CardAreaTest.java @@ -13,9 +13,21 @@ import java.util.stream.Stream; -import static domain.card.CardValue.*; +import static domain.card.CardValue.ACE; +import static domain.card.CardValue.FOUR; +import static domain.card.CardValue.JACK; +import static domain.card.CardValue.NINE; +import static domain.card.CardValue.SEVEN; +import static domain.card.CardValue.SIX; +import static domain.card.CardValue.TEN; +import static domain.card.CardValue.THREE; +import static domain.card.CardValue.TWO; +import static domain.card.CardValue.valueOf; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -57,7 +69,8 @@ class CardAreaTest { void 자신이_가진_카드의_합을_구할_수_있다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, valueOf(split[0])), new Card(CardShape.CLOVER, valueOf(split[1]))); + final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, valueOf(split[0])), + new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -75,7 +88,8 @@ class CardAreaTest { void 킹_퀸_잭은_10으로_계산한다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, valueOf(split[0])), new Card(CardShape.CLOVER, valueOf(split[1]))); + final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, valueOf(split[0])), + new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(totalScore); @@ -158,4 +172,16 @@ static Stream containsAceCardArea() { // when & then assertFalse(cardArea.isBurst()); } -} \ No newline at end of file + + @Test + void 딜러는_첫_장만_보여줄_수_있다() { + // given + final CardArea cardArea = new CardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SEVEN) + ); + + // when & then + assertEquals(cardArea.firstCard(), new Card(CardShape.CLOVER, TEN)); + } +} diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index 0f76bde41b..0009f34d6a 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -8,8 +8,11 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import static domain.card.CardValue.*; -import static org.junit.jupiter.api.Assertions.*; +import static domain.card.CardValue.SEVEN; +import static domain.card.CardValue.SIX; +import static domain.card.CardValue.TEN; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -43,18 +46,4 @@ class DealerTest { // when & then assertFalse(dealer.canHit()); } - - @Test - void 딜러는_첫_장만_보여줄_수_있다() { - // given - final CardArea cardArea = new CardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN) - ); - - final Dealer dealer = new Dealer(new Name("player1"), cardArea); - - // then - assertEquals(dealer.firstCard(), new Card(CardShape.CLOVER, TEN)); - } -} \ No newline at end of file +} From 48de821fed253ee8b074981ba7e05e97f3f0dace Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 17:01:32 +0900 Subject: [PATCH 26/60] =?UTF-8?q?refactor=20:=20Dealer=20=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=20=EC=A0=90=EC=88=98=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/participant/Dealer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java index af19c7d9f8..f8b18f4214 100644 --- a/src/main/java/domain/participant/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -4,12 +4,14 @@ public class Dealer extends Player { + private static final int DEALER_LIMIT_SCORE = 16; + public Dealer(final Name name, final CardArea cardArea) { super(name, cardArea); } @Override public boolean canHit() { - return cardArea.calculate() <= 16; + return cardArea.calculate() <= DEALER_LIMIT_SCORE; } } From 79fd9e71c5675fdbe13b51b9477cfd61438172a5 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 17:20:09 +0900 Subject: [PATCH 27/60] =?UTF-8?q?refactor=20:=20enhanced-for=20=EB=AC=B8?= =?UTF-8?q?=20flatMap=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/deck/CardDeck.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/domain/deck/CardDeck.java b/src/main/java/domain/deck/CardDeck.java index 169fd4d210..e11334f3b1 100644 --- a/src/main/java/domain/deck/CardDeck.java +++ b/src/main/java/domain/deck/CardDeck.java @@ -4,7 +4,6 @@ import domain.card.CardShape; import domain.card.CardValue; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -19,13 +18,14 @@ private CardDeck(final List cards) { } public static CardDeck shuffledFullCardDeck() { - List cards = new ArrayList<>(); - for (final CardShape cardShape : CardShape.values()) { - cards.addAll(Arrays.stream(CardValue.values()) - .map(it -> new Card(cardShape, it)) - .collect(Collectors.toList())); - } + + List cards = Arrays.stream(CardShape.values()) + .flatMap(cardShape -> Arrays.stream(CardValue.values()) + .map(cardValue -> new Card(cardShape, cardValue))) + .collect(Collectors.toList()); + Collections.shuffle(cards); + return new CardDeck(cards); } @@ -34,6 +34,6 @@ public List cards() { } public Card draw() { - return this.cards.remove(0); + return cards.remove(0); } } From 97492f7bcd054db3b712b99f5ee1a1488b7c0aab Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 17:41:34 +0900 Subject: [PATCH 28/60] =?UTF-8?q?refactor=20:=20state=20!=3D=20STAY=20?= =?UTF-8?q?=EB=A5=BC=20=ED=92=80=EC=96=B4=EC=84=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - null 이거나 hit 상태일 경우 hit를 할 수 있음 - 그래서 null 과 hit 상태를 모두 나타내기 위해 연산을 풀어서 작성 - hit 상태를 State에게 직접 물어봄 --- .../java/domain/participant/Participant.java | 7 ++++-- src/main/java/domain/participant/State.java | 4 ++++ .../java/domain/participant/StateTest.java | 24 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/test/java/domain/participant/StateTest.java diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index fa07a699d4..8e5cccfc2d 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -2,6 +2,8 @@ import domain.area.CardArea; +import java.util.Objects; + public class Participant extends Player { private State state; @@ -12,11 +14,12 @@ public Participant(final Name name, final CardArea cardArea) { @Override public boolean canHit() { - return cardArea.canMoreCard() && state != State.STAY; + return cardArea.canMoreCard() && + (Objects.isNull(state) || wantHit()); } public boolean wantHit() { - return state == State.HIT; + return state.isHit(); } public void changeState(final State state) { diff --git a/src/main/java/domain/participant/State.java b/src/main/java/domain/participant/State.java index 30310bbd6a..5ed6c02f01 100644 --- a/src/main/java/domain/participant/State.java +++ b/src/main/java/domain/participant/State.java @@ -4,4 +4,8 @@ public enum State { HIT, STAY, ; + + public boolean isHit() { + return this == HIT; + } } diff --git a/src/test/java/domain/participant/StateTest.java b/src/test/java/domain/participant/StateTest.java new file mode 100644 index 0000000000..21aaf01564 --- /dev/null +++ b/src/test/java/domain/participant/StateTest.java @@ -0,0 +1,24 @@ +package domain.participant; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("State는") +class StateTest { + + @ParameterizedTest + @CsvSource(value = { + "HIT -> true", + "STAY -> false" + }, delimiterString = " -> ") + @DisplayName("isHit() : Hit 일 경우에는 true, STAY 일 경우에는 false를 반환한다.") + void test(State state, boolean result) throws Exception { + + //when & then + assertEquals(state.isHit(), result); + } +} From 5aefc5bfe85d01435d801142de38756e133b0867 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 17:43:27 +0900 Subject: [PATCH 29/60] =?UTF-8?q?refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=EB=AA=85=20participant=20->=20player=20=EB=A1=9C=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 --- src/main/java/controller/BlackJackController.java | 8 ++++---- src/main/java/domain/{participant => player}/Dealer.java | 2 +- src/main/java/domain/{participant => player}/Name.java | 2 +- .../java/domain/{participant => player}/Participant.java | 2 +- src/main/java/domain/{participant => player}/Player.java | 2 +- src/main/java/domain/{participant => player}/State.java | 2 +- src/main/java/view/InputView.java | 2 +- src/main/java/view/OutputView.java | 6 +++--- .../java/domain/{participant => player}/DealerTest.java | 2 +- .../java/domain/{participant => player}/NameTest.java | 4 ++-- .../domain/{participant => player}/ParticipantTest.java | 4 ++-- .../java/domain/{participant => player}/PlayerTest.java | 4 ++-- .../java/domain/{participant => player}/StateTest.java | 3 +-- 13 files changed, 21 insertions(+), 22 deletions(-) rename src/main/java/domain/{participant => player}/Dealer.java (92%) rename src/main/java/domain/{participant => player}/Name.java (93%) rename src/main/java/domain/{participant => player}/Participant.java (94%) rename src/main/java/domain/{participant => player}/Player.java (95%) rename src/main/java/domain/{participant => player}/State.java (80%) rename src/test/java/domain/{participant => player}/DealerTest.java (98%) rename src/test/java/domain/{participant => player}/NameTest.java (97%) rename src/test/java/domain/{participant => player}/ParticipantTest.java (98%) rename src/test/java/domain/{participant => player}/PlayerTest.java (98%) rename src/test/java/domain/{participant => player}/StateTest.java (90%) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index ec8562833e..2946281ab7 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -2,10 +2,10 @@ import domain.area.CardArea; import domain.deck.CardDeck; -import domain.participant.Dealer; -import domain.participant.Name; -import domain.participant.Participant; -import domain.participant.State; +import domain.player.Dealer; +import domain.player.Name; +import domain.player.Participant; +import domain.player.State; import view.InputView; import view.OutputView; diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/player/Dealer.java similarity index 92% rename from src/main/java/domain/participant/Dealer.java rename to src/main/java/domain/player/Dealer.java index f8b18f4214..d164d07098 100644 --- a/src/main/java/domain/participant/Dealer.java +++ b/src/main/java/domain/player/Dealer.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; import domain.area.CardArea; diff --git a/src/main/java/domain/participant/Name.java b/src/main/java/domain/player/Name.java similarity index 93% rename from src/main/java/domain/participant/Name.java rename to src/main/java/domain/player/Name.java index 0f8802a67c..458ff45c79 100644 --- a/src/main/java/domain/participant/Name.java +++ b/src/main/java/domain/player/Name.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; public class Name { diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/player/Participant.java similarity index 94% rename from src/main/java/domain/participant/Participant.java rename to src/main/java/domain/player/Participant.java index 8e5cccfc2d..a93652eaf6 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/player/Participant.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; import domain.area.CardArea; diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/player/Player.java similarity index 95% rename from src/main/java/domain/participant/Player.java rename to src/main/java/domain/player/Player.java index 5cca50a160..9c19e3366c 100644 --- a/src/main/java/domain/participant/Player.java +++ b/src/main/java/domain/player/Player.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; import domain.area.CardArea; import domain.card.Card; diff --git a/src/main/java/domain/participant/State.java b/src/main/java/domain/player/State.java similarity index 80% rename from src/main/java/domain/participant/State.java rename to src/main/java/domain/player/State.java index 5ed6c02f01..5c9b38cd13 100644 --- a/src/main/java/domain/participant/State.java +++ b/src/main/java/domain/player/State.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; public enum State { HIT, diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index b1aaf55317..e786447b0d 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,6 +1,6 @@ package view; -import domain.participant.Participant; +import domain.player.Participant; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 814dbcc2c6..663d675ac9 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -4,9 +4,9 @@ import controller.BlackJackController.PlayerResult; import domain.card.CardShape; import domain.card.CardValue; -import domain.participant.Dealer; -import domain.participant.Participant; -import domain.participant.Player; +import domain.player.Dealer; +import domain.player.Participant; +import domain.player.Player; import java.util.EnumMap; import java.util.List; diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/player/DealerTest.java similarity index 98% rename from src/test/java/domain/participant/DealerTest.java rename to src/test/java/domain/player/DealerTest.java index 0009f34d6a..74ddd54a57 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/player/DealerTest.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; import domain.area.CardArea; import domain.card.Card; diff --git a/src/test/java/domain/participant/NameTest.java b/src/test/java/domain/player/NameTest.java similarity index 97% rename from src/test/java/domain/participant/NameTest.java rename to src/test/java/domain/player/NameTest.java index 2413c8e718..d942228df6 100644 --- a/src/test/java/domain/participant/NameTest.java +++ b/src/test/java/domain/player/NameTest.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; @@ -35,4 +35,4 @@ class NameTest { assertThatThrownBy(() -> new Name(input)) .isInstanceOf(IllegalArgumentException.class); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/participant/ParticipantTest.java b/src/test/java/domain/player/ParticipantTest.java similarity index 98% rename from src/test/java/domain/participant/ParticipantTest.java rename to src/test/java/domain/player/ParticipantTest.java index 8472f6a973..1017c7f997 100644 --- a/src/test/java/domain/participant/ParticipantTest.java +++ b/src/test/java/domain/player/ParticipantTest.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; import domain.area.CardArea; import domain.card.Card; @@ -82,4 +82,4 @@ static Stream canNotMoreCard() { Arguments.of(over21CardArea, State.HIT) ); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/player/PlayerTest.java similarity index 98% rename from src/test/java/domain/participant/PlayerTest.java rename to src/test/java/domain/player/PlayerTest.java index 08ab2f1c42..ccf0d6765f 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/domain/player/PlayerTest.java @@ -1,4 +1,4 @@ -package domain.participant; +package domain.player; import domain.area.CardArea; import domain.card.Card; @@ -57,4 +57,4 @@ public boolean canHit() { // then assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/participant/StateTest.java b/src/test/java/domain/player/StateTest.java similarity index 90% rename from src/test/java/domain/participant/StateTest.java rename to src/test/java/domain/player/StateTest.java index 21aaf01564..fff1665cf8 100644 --- a/src/test/java/domain/participant/StateTest.java +++ b/src/test/java/domain/player/StateTest.java @@ -1,7 +1,6 @@ -package domain.participant; +package domain.player; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; From 12fe147945dbdf27196a1479f7f7dc72f2170e8b Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 17:48:55 +0900 Subject: [PATCH 30/60] =?UTF-8?q?refactor=20:=20dealer=20name=20=EC=9D=80?= =?UTF-8?q?=20=EA=B3=A0=EC=A0=95=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=94=9C?= =?UTF-8?q?=EB=9F=AC=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/player/Dealer.java | 5 +++-- src/test/java/domain/player/DealerTest.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java index d164d07098..9cc12a90b6 100644 --- a/src/main/java/domain/player/Dealer.java +++ b/src/main/java/domain/player/Dealer.java @@ -5,9 +5,10 @@ public class Dealer extends Player { private static final int DEALER_LIMIT_SCORE = 16; + private static final String DEALER_NAME = "딜러"; - public Dealer(final Name name, final CardArea cardArea) { - super(name, cardArea); + public Dealer(final CardArea cardArea) { + super(new Name(DEALER_NAME), cardArea); } @Override diff --git a/src/test/java/domain/player/DealerTest.java b/src/test/java/domain/player/DealerTest.java index 74ddd54a57..39372fb888 100644 --- a/src/test/java/domain/player/DealerTest.java +++ b/src/test/java/domain/player/DealerTest.java @@ -27,7 +27,7 @@ class DealerTest { new Card(CardShape.CLOVER, SIX) ); - final Player dealer = new Dealer(new Name("player1"), cardArea); + final Player dealer = new Dealer(cardArea); // when & then assertTrue(dealer.canHit()); @@ -41,7 +41,7 @@ class DealerTest { new Card(CardShape.CLOVER, SEVEN) ); - final Player dealer = new Dealer(new Name("player1"), cardArea); + final Player dealer = new Dealer(cardArea); // when & then assertFalse(dealer.canHit()); From 8f69d8f83ac3c7f9d185a1c373793b40e328ea52 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 21:35:59 +0900 Subject: [PATCH 31/60] =?UTF-8?q?feat=20:=20DealerResult=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 - DealerResult는 ParticipantResult 반대 --- src/main/java/domain/player/DealerResult.java | 8 ++ .../java/domain/player/ParticipantResult.java | 33 +++++ .../domain/player/ParticipantResultTest.java | 135 ++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 src/main/java/domain/player/DealerResult.java create mode 100644 src/main/java/domain/player/ParticipantResult.java create mode 100644 src/test/java/domain/player/ParticipantResultTest.java diff --git a/src/main/java/domain/player/DealerResult.java b/src/main/java/domain/player/DealerResult.java new file mode 100644 index 0000000000..093eb9d191 --- /dev/null +++ b/src/main/java/domain/player/DealerResult.java @@ -0,0 +1,8 @@ +package domain.player; + +public enum DealerResult { + + WINNER, + LOSER, + DRAWER; +} diff --git a/src/main/java/domain/player/ParticipantResult.java b/src/main/java/domain/player/ParticipantResult.java new file mode 100644 index 0000000000..94f8859fb8 --- /dev/null +++ b/src/main/java/domain/player/ParticipantResult.java @@ -0,0 +1,33 @@ +package domain.player; + +public enum ParticipantResult { + WINNER, + LOSER, + DRAWER; + + public static ParticipantResult matchBetween(final Participant participant, final Dealer dealer) { + if (participant.isBurst()) { + return ParticipantResult.LOSER; + } + if (dealer.isBurst()) { + return ParticipantResult.WINNER; + } + if (participant.score() > dealer.score()) { + return ParticipantResult.WINNER; + } + if (participant.score() == dealer.score()) { + return ParticipantResult.DRAWER; + } + return ParticipantResult.LOSER; + } + + public DealerResult convertToDealerResult() { + if (this == WINNER) { + return DealerResult.LOSER; + } + if (this == LOSER) { + return DealerResult.WINNER; + } + return DealerResult.DRAWER; + } +} diff --git a/src/test/java/domain/player/ParticipantResultTest.java b/src/test/java/domain/player/ParticipantResultTest.java new file mode 100644 index 0000000000..24f5a10d3c --- /dev/null +++ b/src/test/java/domain/player/ParticipantResultTest.java @@ -0,0 +1,135 @@ +package domain.player; + +import domain.area.CardArea; +import domain.card.Card; +import domain.card.CardShape; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static domain.card.CardShape.*; +import static domain.card.CardValue.NINE; +import static domain.card.CardValue.TEN; +import static domain.player.ParticipantResult.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@DisplayName("ParticipantResult 의") +class ParticipantResultTest { + + CardArea participantCardArea; + + CardArea dealerCardArea; + + @BeforeEach + void initCardArea() { + participantCardArea = new CardArea(new Card(CLOVER, TEN), new Card(CLOVER, NINE)); + dealerCardArea = new CardArea(new Card(DIAMOND, TEN), new Card(DIAMOND, NINE)); + } + + @Test + @DisplayName("matchBetween() : 참여자가 burst 일 경우에는 참여자가 무조건 게임에서 진다.") + void test_matchBetween_burst_participant_must_lose_participant() throws Exception { + //given + participantCardArea.addCard(new Card(SPADE, TEN)); + final Participant participant = new Participant(new Name("name"), participantCardArea); + final Dealer dealer = new Dealer(dealerCardArea); + + //when + final ParticipantResult participantResult = matchBetween(participant, dealer); + + //then + assertEquals(LOSER, participantResult); + } + + @Test + @DisplayName("matchBetween() : 딜러는 burst 이면서 참여자가 burst 가 아니면 참여자가 무조건 게임에서 이긴다.") + void test_matchBetween_burst_dealer_must_lose_dealer() throws Exception { + //given + final Participant participant = new Participant(new Name("name"), participantCardArea); + final Dealer dealer = new Dealer(dealerCardArea); + dealerCardArea.addCard(new Card(SPADE, TEN)); + + //when + final ParticipantResult participantResult = matchBetween(participant, dealer); + + //then + assertEquals(WINNER, participantResult); + } + + @ParameterizedTest + @MethodSource("makeBothNotBurst") + @DisplayName("matchBetween() : 딜러, 참여자 모두 버스트가 아닐 때 점수가 높은 쪽이 이기고, 같으면 무승부이다.") + void test_matchBetween_not_burst_win_higher_score_or_draw_same_score( + final CardArea participantCardArea, final CardArea dealerCardArea, + final ParticipantResult participantResult) throws Exception { + + //given + final Participant participant = new Participant(new Name("name"), participantCardArea); + final Dealer dealer = new Dealer(dealerCardArea); + + //when & then + assertEquals(ParticipantResult.matchBetween(participant, dealer), participantResult); + } + + static Stream makeBothNotBurst() { + + //무승부 + final CardArea participantDrawCardArea = new CardArea( + new Card(CardShape.SPADE, TEN), + new Card(CardShape.DIAMOND, TEN) + ); + + final CardArea dealerDrawCardArea = new CardArea( + new Card(HEART, TEN), + new Card(CLOVER, TEN) + ); + + //참여자가 이길 경우 + final CardArea participantWinCardArea = new CardArea( + new Card(CardShape.SPADE, TEN), + new Card(CardShape.DIAMOND, TEN) + ); + + final CardArea dealerLoseCardArea = new CardArea( + new Card(HEART, TEN), + new Card(CLOVER, NINE) + ); + + //딜러가 이길 경우 + final CardArea participantLoseCardArea = new CardArea( + new Card(CardShape.SPADE, TEN), + new Card(CardShape.DIAMOND, NINE) + ); + + final CardArea dealerWinCardArea = new CardArea( + new Card(HEART, TEN), + new Card(CLOVER, TEN) + ); + + return Stream.of( + Arguments.of(participantDrawCardArea, dealerDrawCardArea, DRAWER), + Arguments.of(participantWinCardArea, dealerLoseCardArea, WINNER), + Arguments.of(participantLoseCardArea, dealerWinCardArea, LOSER) + ); + } + + @ParameterizedTest + @CsvSource(value = { + "WINNER -> LOSER", + "DRAWER -> DRAWER", + "LOSER -> WINNER" + }, delimiterString = " -> ") + @DisplayName("convertToDealerResult() : 무승부를 제외하고 딜러의 결과는 참여자의 결과에 대해 반대이다.") + void test_convertToDealerResult_opposite_DealerResult_And_ParticipantResult( + final ParticipantResult participantResult, final DealerResult dealerResult) throws Exception { + + //when & then + assertEquals(participantResult.convertToDealerResult(), dealerResult); + } +} From 90940f4aaa21720dab7293d9c612c55ff9325cd1 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 21:38:38 +0900 Subject: [PATCH 32/60] =?UTF-8?q?refactor=20:=20OutputView=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 --- .../java/controller/BlackJackController.java | 150 +++++++----------- src/main/java/view/OutputView.java | 119 +++++++++----- 2 files changed, 136 insertions(+), 133 deletions(-) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 2946281ab7..b724abf16d 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -3,8 +3,10 @@ import domain.area.CardArea; import domain.deck.CardDeck; import domain.player.Dealer; +import domain.player.DealerResult; import domain.player.Name; import domain.player.Participant; +import domain.player.ParticipantResult; import domain.player.State; import view.InputView; import view.OutputView; @@ -14,26 +16,65 @@ import java.util.function.Function; import java.util.stream.Collectors; +import static java.util.stream.Collectors.counting; + public class BlackJackController { public void run() { - final List participantNames = createParticipantNames(); - final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + final List participants = dealParticipantsCards(cardDeck); + final Dealer dealer = dealDealerCards(cardDeck); - final List participants = dealParticipantsCards(cardDeck, participantNames); - final Dealer dealer = dealDealerCars(cardDeck); + printStateAfterDealtCard(participants, dealer); + hittingPlayer(cardDeck, participants, dealer); + printStateAfterHittedCard(participants, dealer); - OutputView.printAfterDeal(participants); - OutputView.showDealerState(dealer); - OutputView.showPlayersState(participants); + final Map playersResult = determineWinner(participants, dealer); + final Map scoreBoard = countDealerResult(playersResult); + printPlayerScoreBoard(participants, playersResult, scoreBoard); + } + + private static void printPlayerScoreBoard(final List participants, + final Map playersResult, + final Map scoreBoard) { + OutputView.showDealerScoreBoard(scoreBoard); + OutputView.showParticipantsScoreBoard(playersResult, participants); + } + + private static void printStateAfterHittedCard(final List participants, final Dealer dealer) { + OutputView.showPlayerStateResult(dealer); + OutputView.showParticipantsStateResult(participants); + } + + private void hittingPlayer(final CardDeck cardDeck, final List participants, final Dealer dealer) { hitForParticipants(cardDeck, participants); hitForDealer(cardDeck, dealer); + } - //최종 승패 - gameStatistic(participants, dealer); + private static void printStateAfterDealtCard(final List participants, final Dealer dealer) { + OutputView.showDealtCardTo(participants); + OutputView.showStateOf(dealer); + OutputView.showStateOf(participants); + } + + private static Map countDealerResult( + final Map playersResult) { + return playersResult.keySet() + .stream() + .collect(Collectors.groupingBy(participant -> playersResult.get(participant) + .convertToDealerResult(), + counting())); + } + + private static Map determineWinner(final List participants, + final Dealer dealer) { + return participants.stream() + .collect(Collectors.toMap( + Function.identity(), + participant -> ParticipantResult.matchBetween(participant, dealer)) + ); } private void hitForDealer(final CardDeck cardDeck, final Dealer dealer) { @@ -44,23 +85,21 @@ private void hitForDealer(final CardDeck cardDeck, final Dealer dealer) { } private void hitForParticipants(final CardDeck cardDeck, final List participants) { - for (final Participant participant : participants) { - hitForParticipant(cardDeck, participant); - } + participants.forEach(participant -> hitForParticipant(cardDeck, participant)); } private void hitForParticipant(final CardDeck cardDeck, final Participant participant) { while (participant.canHit()) { participant.changeState(inputHitOrStay(participant)); - hitOrStayForParticipant(cardDeck, participant); + determineHitForParticipant(cardDeck, participant); } } - private void hitOrStayForParticipant(final CardDeck cardDeck, final Participant participant) { + private void determineHitForParticipant(final CardDeck cardDeck, final Participant participant) { if (participant.wantHit()) { participant.hit(cardDeck.draw()); } - OutputView.showPlayerState(participant); + OutputView.showStateOf(participant); } private State inputHitOrStay(final Participant participant) { @@ -70,82 +109,15 @@ private State inputHitOrStay(final Participant participant) { return State.STAY; } - private Dealer dealDealerCars(final CardDeck cardDeck) { - // TODO 수정 - return new Dealer(new Name("딜러"), new CardArea(cardDeck.draw(), cardDeck.draw())); - } - - private List dealParticipantsCards(final CardDeck cardDeck, final List participantNames) { - return participantNames.stream() - .map(it -> new Participant(it, new CardArea(cardDeck.draw(), cardDeck.draw()))) - .collect(Collectors.toList()); + private Dealer dealDealerCards(final CardDeck cardDeck) { + return new Dealer(new CardArea(cardDeck.draw(), cardDeck.draw())); } - private List createParticipantNames() { + private List dealParticipantsCards(final CardDeck cardDeck) { return InputView.readParticipantsName() - .stream() - .map(Name::new) - .collect(Collectors.toList()); - } - - private void gameStatistic(final List participants, final Dealer dealer) { - final Map collect1 = participants.stream().collect(Collectors.toMap(Function.identity(), it -> PlayerResult.judge(it, dealer))); - OutputView.showGameStatistic(new ResultDto(collect1, participants, dealer)); - } - - public enum PlayerResult { - WINNER, - LOSER, - DRAWER; - - public static PlayerResult judge(final Participant it, final Dealer dealer) { - if (it.isBurst()) { - return PlayerResult.LOSER; - } - if (dealer.isBurst()) { - return PlayerResult.WINNER; - } - if (it.score() > dealer.score()) { - return PlayerResult.WINNER; - } - if (it.score() == dealer.score()) { - return PlayerResult.DRAWER; - } - return PlayerResult.LOSER; - } - - public PlayerResult reverse() { - if (this == WINNER) { - return LOSER; - } - if (this == LOSER) { - return WINNER; - } - return this; - } - } - - public class ResultDto { - private final Map participantsResult; - private final List participants; - private final Dealer dealer; - - public ResultDto(final Map participantsResult, final List participants, final Dealer dealer) { - this.participantsResult = participantsResult; - this.participants = participants; - this.dealer = dealer; - } - - public Map participantsResult() { - return participantsResult; - } - - public List participants() { - return participants; - } - - public Dealer dealer() { - return dealer; - } + .stream() + .map(Name::new) + .map(name -> new Participant(name, new CardArea(cardDeck.draw(), cardDeck.draw()))) + .collect(Collectors.toList()); } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 663d675ac9..c90625a1c2 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,11 +1,12 @@ package view; -import controller.BlackJackController; -import controller.BlackJackController.PlayerResult; +import domain.card.Card; import domain.card.CardShape; import domain.card.CardValue; import domain.player.Dealer; +import domain.player.DealerResult; import domain.player.Participant; +import domain.player.ParticipantResult; import domain.player.Player; import java.util.EnumMap; @@ -13,18 +14,24 @@ import java.util.Map; import java.util.stream.Collectors; -import static java.util.stream.Collectors.counting; - public class OutputView { private static final Map SHAPE_MESSAGE_MAP = new EnumMap<>(CardShape.class); private static final Map VALUE_MESSAGE_MAP = new EnumMap<>(CardValue.class); - private static final Map PLAYER_RESULT_MAP = new EnumMap<>(PlayerResult.class); + private static final Map PARTICIPANT_RESULT_MAP = new EnumMap<>(ParticipantResult.class); + private static final Map DEALER_RESULT_MAP = new EnumMap<>(DealerResult.class); + + private static final String DELIM = ", "; + private static final String CARD_INFORMATION_FORMAT = "카드: "; + private static final String DEALER_INFORMATION_FORMAT = "딜러: "; + private static final String EMPTY_DELIM = " "; + private static final String COLON = ": "; static { makeShapeMessage(); makeValueMessage(); - makePlayerResultMessage(); + makeParticipantResultMessage(); + makeDealerResultMessage(); } private static void makeShapeMessage() { @@ -50,30 +57,55 @@ private static void makeValueMessage() { VALUE_MESSAGE_MAP.put(CardValue.ACE, "A"); } - private static void makePlayerResultMessage() { - PLAYER_RESULT_MAP.put(PlayerResult.WINNER, "승"); - PLAYER_RESULT_MAP.put(PlayerResult.LOSER, "패"); - PLAYER_RESULT_MAP.put(PlayerResult.DRAWER, "무"); + private static void makeParticipantResultMessage() { + PARTICIPANT_RESULT_MAP.put(ParticipantResult.WINNER, "승"); + PARTICIPANT_RESULT_MAP.put(ParticipantResult.LOSER, "패"); + PARTICIPANT_RESULT_MAP.put(ParticipantResult.DRAWER, "무"); + } + + private static void makeDealerResultMessage() { + DEALER_RESULT_MAP.put(DealerResult.WINNER, "승"); + DEALER_RESULT_MAP.put(DealerResult.LOSER, "패"); + DEALER_RESULT_MAP.put(DealerResult.DRAWER, "무"); + } + + public static void showDealtCardTo(final List participants) { + System.out.println("딜러와 " + printDrawing(participants) + "에게 2장을 나누었습니다"); + } + + private static String printDrawing(final List participants) { + return participants.stream() + .map(OutputView::getPlayerName) + .collect(Collectors.joining(DELIM)); } - public static void printAfterDeal(final List participants) { - System.out.println("딜러와 " + participants.stream().map(it -> it.name().value()) - .collect(Collectors.joining(", ")) + "에게 2장을 나누었습니다"); + public static void showStateOf(final Dealer dealer) { + final Card dealerFistCard = dealer.cardArea().firstCard(); + + System.out.println(getPlayerName(dealer) + + COLON + + VALUE_MESSAGE_MAP.get(dealerFistCard.cardValue()) + + SHAPE_MESSAGE_MAP.get(dealerFistCard.cardShape()) + ); } - public static void showPlayersState(final List participants) { - participants.forEach((participant) -> System.out.println(makeStateMessage(participant))); + public static void showStateOf(final List participants) { + participants.forEach(participant -> System.out.println(makeStateMessage(participant))); } - public static void showPlayerState(final Player player) { + public static void showStateOf(final Player player) { System.out.println(makeStateMessage(player)); } private static String makeStateMessage(final Player player) { - return player.cardArea().cards().stream() - .map(card -> String.format("%s %s", VALUE_MESSAGE_MAP.get(card.cardValue()), + return player.cardArea() + .cards() + .stream() + .map(card -> String.format("%s %s", + VALUE_MESSAGE_MAP.get(card.cardValue()), SHAPE_MESSAGE_MAP.get(card.cardShape()))) - .collect(Collectors.joining(", ", player.name().value() + "카드: ", "")); + .collect(Collectors.joining(DELIM, getPlayerName(player) + + CARD_INFORMATION_FORMAT, "")); } public static void showParticipantsStateResult(final List participants) { @@ -82,43 +114,42 @@ public static void showParticipantsStateResult(final List part public static void showPlayerStateResult(final Player player) { final String message = player.cardArea().cards().stream() - .map(card -> String.format("%s %s", VALUE_MESSAGE_MAP.get(card.cardValue()), + .map(card -> String.format("%s %s", + VALUE_MESSAGE_MAP.get(card.cardValue()), SHAPE_MESSAGE_MAP.get(card.cardShape()))) - .collect(Collectors.joining(", ", player.name().value() + "카드: ", + .collect(Collectors.joining(DELIM, getPlayerName(player) + + CARD_INFORMATION_FORMAT, String.format(" - 결과: %d", player.cardArea().calculate()))); + System.out.println(message); } + private static String getPlayerName(final Player player) { + return player.name().value(); + } + public static void dealerOneMoreCard() { System.out.println("딜러는 16 이하라 한장의 카드를 더 받았습니다."); } - public static void showGameStatistic(BlackJackController.ResultDto resultDto) { - showPlayerStateResult(resultDto.dealer()); - showParticipantsStateResult(resultDto.participants()); - final Map result = resultDto.participantsResult(); + public static void showDealerScoreBoard(final Map scoreBoard) { - final Map winOrLose = result.keySet().stream() - .collect(Collectors.groupingBy(result::get, counting())); - - final String collect = winOrLose.keySet() - .stream() - .map(PlayerResult::reverse) - .map(it -> winOrLose.get(it) + PLAYER_RESULT_MAP.get(it)) - .collect(Collectors.joining(" ", "딜러: ", "")); - - System.out.println(collect); - - resultDto.participants() - .stream() - .map(it -> it.name().value() + ": " + PLAYER_RESULT_MAP.get(result.get(it))) - .forEach(System.out::println); + System.out.println(scoreBoard.keySet() + .stream() + .map(dealerResult -> scoreBoard.get(dealerResult) + + DEALER_RESULT_MAP.get(dealerResult)) + .collect(Collectors.joining(EMPTY_DELIM, DEALER_INFORMATION_FORMAT, ""))); } - public static void showDealerState(final Dealer dealer) { - System.out.println(dealer.name().value() + ": " + VALUE_MESSAGE_MAP.get( - dealer.cardArea().firstCard().cardValue()) + SHAPE_MESSAGE_MAP.get( - dealer.cardArea().firstCard().cardShape())); + public static void showParticipantsScoreBoard(final Map scoreBoard, + final List participants) { + + participants.stream() + .map(participant -> getPlayerName(participant) + + COLON + + PARTICIPANT_RESULT_MAP.get(scoreBoard.get(participant)) + ) + .forEach(System.out::println); } } From d33ac4a95a58b85a6055c3caf00bcd7be2a5ef67 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 21:44:48 +0900 Subject: [PATCH 33/60] =?UTF-8?q?refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dealer 관련은 domain.player.dealer - Participant 관련은 domain.player.participant --- src/main/java/controller/BlackJackController.java | 11 ++++++----- src/main/java/domain/player/{ => dealer}/Dealer.java | 4 +++- .../java/domain/player/{ => dealer}/DealerResult.java | 2 +- .../domain/player/{ => participant}/Participant.java | 4 +++- .../player/{ => participant}/ParticipantResult.java | 5 ++++- .../java/domain/player/{ => participant}/State.java | 2 +- src/main/java/view/InputView.java | 2 +- src/main/java/view/OutputView.java | 8 ++++---- .../java/domain/player/{ => dealer}/DealerTest.java | 4 +++- .../{ => participant}/ParticipantResultTest.java | 9 +++++++-- .../player/{ => participant}/ParticipantTest.java | 5 ++++- .../domain/player/{ => participant}/StateTest.java | 3 ++- 12 files changed, 39 insertions(+), 20 deletions(-) rename src/main/java/domain/player/{ => dealer}/Dealer.java (81%) rename src/main/java/domain/player/{ => dealer}/DealerResult.java (68%) rename src/main/java/domain/player/{ => participant}/Participant.java (85%) rename src/main/java/domain/player/{ => participant}/ParticipantResult.java (88%) rename src/main/java/domain/player/{ => participant}/State.java (76%) rename src/test/java/domain/player/{ => dealer}/DealerTest.java (93%) rename src/test/java/domain/player/{ => participant}/ParticipantResultTest.java (94%) rename src/test/java/domain/player/{ => participant}/ParticipantTest.java (94%) rename src/test/java/domain/player/{ => participant}/StateTest.java (89%) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index b724abf16d..4f3c02b5ad 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -2,12 +2,12 @@ import domain.area.CardArea; import domain.deck.CardDeck; -import domain.player.Dealer; -import domain.player.DealerResult; +import domain.player.dealer.Dealer; +import domain.player.dealer.DealerResult; import domain.player.Name; -import domain.player.Participant; -import domain.player.ParticipantResult; -import domain.player.State; +import domain.player.participant.Participant; +import domain.player.participant.ParticipantResult; +import domain.player.participant.State; import view.InputView; import view.OutputView; @@ -23,6 +23,7 @@ public class BlackJackController { public void run() { final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + final List participants = dealParticipantsCards(cardDeck); final Dealer dealer = dealDealerCards(cardDeck); diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/dealer/Dealer.java similarity index 81% rename from src/main/java/domain/player/Dealer.java rename to src/main/java/domain/player/dealer/Dealer.java index 9cc12a90b6..382125470f 100644 --- a/src/main/java/domain/player/Dealer.java +++ b/src/main/java/domain/player/dealer/Dealer.java @@ -1,6 +1,8 @@ -package domain.player; +package domain.player.dealer; import domain.area.CardArea; +import domain.player.Name; +import domain.player.Player; public class Dealer extends Player { diff --git a/src/main/java/domain/player/DealerResult.java b/src/main/java/domain/player/dealer/DealerResult.java similarity index 68% rename from src/main/java/domain/player/DealerResult.java rename to src/main/java/domain/player/dealer/DealerResult.java index 093eb9d191..8ce8fb1604 100644 --- a/src/main/java/domain/player/DealerResult.java +++ b/src/main/java/domain/player/dealer/DealerResult.java @@ -1,4 +1,4 @@ -package domain.player; +package domain.player.dealer; public enum DealerResult { diff --git a/src/main/java/domain/player/Participant.java b/src/main/java/domain/player/participant/Participant.java similarity index 85% rename from src/main/java/domain/player/Participant.java rename to src/main/java/domain/player/participant/Participant.java index a93652eaf6..581cc49beb 100644 --- a/src/main/java/domain/player/Participant.java +++ b/src/main/java/domain/player/participant/Participant.java @@ -1,6 +1,8 @@ -package domain.player; +package domain.player.participant; import domain.area.CardArea; +import domain.player.Name; +import domain.player.Player; import java.util.Objects; diff --git a/src/main/java/domain/player/ParticipantResult.java b/src/main/java/domain/player/participant/ParticipantResult.java similarity index 88% rename from src/main/java/domain/player/ParticipantResult.java rename to src/main/java/domain/player/participant/ParticipantResult.java index 94f8859fb8..71a8d8b800 100644 --- a/src/main/java/domain/player/ParticipantResult.java +++ b/src/main/java/domain/player/participant/ParticipantResult.java @@ -1,4 +1,7 @@ -package domain.player; +package domain.player.participant; + +import domain.player.dealer.Dealer; +import domain.player.dealer.DealerResult; public enum ParticipantResult { WINNER, diff --git a/src/main/java/domain/player/State.java b/src/main/java/domain/player/participant/State.java similarity index 76% rename from src/main/java/domain/player/State.java rename to src/main/java/domain/player/participant/State.java index 5c9b38cd13..79316e3d1d 100644 --- a/src/main/java/domain/player/State.java +++ b/src/main/java/domain/player/participant/State.java @@ -1,4 +1,4 @@ -package domain.player; +package domain.player.participant; public enum State { HIT, diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index e786447b0d..ec2c2c894b 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,6 +1,6 @@ package view; -import domain.player.Participant; +import domain.player.participant.Participant; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index c90625a1c2..6f4d908750 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -3,10 +3,10 @@ import domain.card.Card; import domain.card.CardShape; import domain.card.CardValue; -import domain.player.Dealer; -import domain.player.DealerResult; -import domain.player.Participant; -import domain.player.ParticipantResult; +import domain.player.dealer.Dealer; +import domain.player.dealer.DealerResult; +import domain.player.participant.Participant; +import domain.player.participant.ParticipantResult; import domain.player.Player; import java.util.EnumMap; diff --git a/src/test/java/domain/player/DealerTest.java b/src/test/java/domain/player/dealer/DealerTest.java similarity index 93% rename from src/test/java/domain/player/DealerTest.java rename to src/test/java/domain/player/dealer/DealerTest.java index 39372fb888..f8e0cd55d5 100644 --- a/src/test/java/domain/player/DealerTest.java +++ b/src/test/java/domain/player/dealer/DealerTest.java @@ -1,8 +1,10 @@ -package domain.player; +package domain.player.dealer; import domain.area.CardArea; import domain.card.Card; import domain.card.CardShape; +import domain.player.Player; +import domain.player.dealer.Dealer; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; diff --git a/src/test/java/domain/player/ParticipantResultTest.java b/src/test/java/domain/player/participant/ParticipantResultTest.java similarity index 94% rename from src/test/java/domain/player/ParticipantResultTest.java rename to src/test/java/domain/player/participant/ParticipantResultTest.java index 24f5a10d3c..2c134da099 100644 --- a/src/test/java/domain/player/ParticipantResultTest.java +++ b/src/test/java/domain/player/participant/ParticipantResultTest.java @@ -1,8 +1,13 @@ -package domain.player; +package domain.player.participant; import domain.area.CardArea; import domain.card.Card; import domain.card.CardShape; +import domain.player.Name; +import domain.player.dealer.Dealer; +import domain.player.dealer.DealerResult; +import domain.player.participant.Participant; +import domain.player.participant.ParticipantResult; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -16,7 +21,7 @@ import static domain.card.CardShape.*; import static domain.card.CardValue.NINE; import static domain.card.CardValue.TEN; -import static domain.player.ParticipantResult.*; +import static domain.player.participant.ParticipantResult.*; import static org.junit.jupiter.api.Assertions.assertEquals; @DisplayName("ParticipantResult 의") diff --git a/src/test/java/domain/player/ParticipantTest.java b/src/test/java/domain/player/participant/ParticipantTest.java similarity index 94% rename from src/test/java/domain/player/ParticipantTest.java rename to src/test/java/domain/player/participant/ParticipantTest.java index 1017c7f997..6d7ec3ce62 100644 --- a/src/test/java/domain/player/ParticipantTest.java +++ b/src/test/java/domain/player/participant/ParticipantTest.java @@ -1,8 +1,11 @@ -package domain.player; +package domain.player.participant; import domain.area.CardArea; import domain.card.Card; import domain.card.CardShape; +import domain.player.Name; +import domain.player.participant.Participant; +import domain.player.participant.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; diff --git a/src/test/java/domain/player/StateTest.java b/src/test/java/domain/player/participant/StateTest.java similarity index 89% rename from src/test/java/domain/player/StateTest.java rename to src/test/java/domain/player/participant/StateTest.java index fff1665cf8..edb2226373 100644 --- a/src/test/java/domain/player/StateTest.java +++ b/src/test/java/domain/player/participant/StateTest.java @@ -1,5 +1,6 @@ -package domain.player; +package domain.player.participant; +import domain.player.participant.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; From cb399f4ea0eef382e57491e52d454467d5cf7e61 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Thu, 2 Mar 2023 22:42:58 +0900 Subject: [PATCH 34/60] =?UTF-8?q?refactor=20:=20CardDeck=EC=9D=98=20?= =?UTF-8?q?=EC=9E=90=EB=A3=8C=EA=B5=AC=EC=A1=B0=20List=20->=20Stack=20?= =?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/domain/deck/CardDeck.java | 20 ++++----- src/test/java/domain/deck/CardDeckTest.java | 50 +++++++++++++-------- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/main/java/domain/deck/CardDeck.java b/src/main/java/domain/deck/CardDeck.java index e11334f3b1..ebaaccf5cf 100644 --- a/src/main/java/domain/deck/CardDeck.java +++ b/src/main/java/domain/deck/CardDeck.java @@ -6,34 +6,30 @@ import java.util.Arrays; import java.util.Collections; -import java.util.List; +import java.util.Stack; import java.util.stream.Collectors; public class CardDeck { - private final List cards; + private final Stack cards; - private CardDeck(final List cards) { + private CardDeck(final Stack cards) { this.cards = cards; } public static CardDeck shuffledFullCardDeck() { - List cards = Arrays.stream(CardShape.values()) - .flatMap(cardShape -> Arrays.stream(CardValue.values()) - .map(cardValue -> new Card(cardShape, cardValue))) - .collect(Collectors.toList()); + Stack cards = Arrays.stream(CardShape.values()) + .flatMap(cardShape -> Arrays.stream(CardValue.values()) + .map(cardValue -> new Card(cardShape, cardValue))) + .collect(Collectors.toCollection(Stack::new)); Collections.shuffle(cards); return new CardDeck(cards); } - public List cards() { - return List.copyOf(cards); - } - public Card draw() { - return cards.remove(0); + return cards.pop(); } } diff --git a/src/test/java/domain/deck/CardDeckTest.java b/src/test/java/domain/deck/CardDeckTest.java index 851c4c9310..b37b68f84f 100644 --- a/src/test/java/domain/deck/CardDeckTest.java +++ b/src/test/java/domain/deck/CardDeckTest.java @@ -7,13 +7,18 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import java.util.HashSet; +import java.util.ArrayList; +import java.util.EmptyStackException; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; -import static java.util.stream.Collectors.groupingBy; -import static org.assertj.core.api.Assertions.assertThat; +import static domain.card.CardShape.CLOVER; +import static domain.card.CardShape.DIAMOND; +import static domain.card.CardShape.HEART; +import static domain.card.CardShape.SPADE; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; @SuppressWarnings("NonAsciiCharacters") @@ -24,34 +29,43 @@ class CardDeckTest { @Test void 카드를_종류별로_값_별로_한장씩_모두_가진_채로_생성한다() { // given - CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + + final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + final Map> numberOfEachCardShape = new HashMap<>(); // when - final Map> result = cardDeck.cards() - .stream() - .collect(groupingBy(Card::cardShape)); - // then - for (final CardShape cardShape : result.keySet()) { - final Set cards = new HashSet<>(result.get(cardShape)); + for (int count = 0; count < 52; count++) { + final Card card = cardDeck.draw(); + final CardShape cardShape = card.cardShape(); - assertEquals(cards.size(), 13); + numberOfEachCardShape.computeIfAbsent(cardShape, key -> new ArrayList<>()); + + numberOfEachCardShape.get(cardShape).add(card); } - assertEquals(result.size(), 4); + // then + assertAll( + () -> assertEquals(4, numberOfEachCardShape.size()), + () -> assertEquals(13, numberOfEachCardShape.get(HEART).size()), + () -> assertEquals(13, numberOfEachCardShape.get(CLOVER).size()), + () -> assertEquals(13, numberOfEachCardShape.get(DIAMOND).size()), + () -> assertEquals(13, numberOfEachCardShape.get(SPADE).size()) + ); } @Test void 카드를_한_장씩_꺼낼_수_있다() { // given final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); - final int before = cardDeck.cards().size(); + int maxDrawCount = 52; // when - final Card draw = cardDeck.draw(); + while (maxDrawCount-- > 0) { + cardDeck.draw(); + } // then - assertThat(draw).isNotNull(); - assertThat(cardDeck.cards().size()).isEqualTo(before - 1); + assertThatThrownBy(cardDeck::draw).isInstanceOf(EmptyStackException.class); } -} \ No newline at end of file +} From 95b300e05bc22cc77fd997fa445db0cdc46c4614 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Fri, 3 Mar 2023 09:44:58 +0900 Subject: [PATCH 35/60] =?UTF-8?q?style=20:=20pr=20=EC=A0=9C=EC=B6=9C=20?= =?UTF-8?q?=EC=A0=84=20reformatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 4 +++- src/main/java/view/OutputView.java | 5 ++++- src/test/java/domain/deck/CardDeckTest.java | 2 -- src/test/java/domain/player/dealer/DealerTest.java | 1 - .../player/participant/ParticipantResultTest.java | 12 ++++++++---- .../domain/player/participant/ParticipantTest.java | 10 ++++++---- .../java/domain/player/participant/StateTest.java | 3 +-- 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index ec2c2c894b..0f81fde8bd 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -11,12 +11,14 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); + private InputView() {} + public static List readParticipantsName() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); final String input = scanner.nextLine(); return Arrays.stream(input.split(",")) - .collect(Collectors.toList()); + .collect(Collectors.toList()); } public static String readMoreCard(final Participant participant) { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 6f4d908750..03b33249c6 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -3,11 +3,11 @@ import domain.card.Card; import domain.card.CardShape; import domain.card.CardValue; +import domain.player.Player; import domain.player.dealer.Dealer; import domain.player.dealer.DealerResult; import domain.player.participant.Participant; import domain.player.participant.ParticipantResult; -import domain.player.Player; import java.util.EnumMap; import java.util.List; @@ -34,6 +34,9 @@ public class OutputView { makeDealerResultMessage(); } + private OutputView() { + } + private static void makeShapeMessage() { SHAPE_MESSAGE_MAP.put(CardShape.DIAMOND, "다이아몬드"); SHAPE_MESSAGE_MAP.put(CardShape.CLOVER, "클로버"); diff --git a/src/test/java/domain/deck/CardDeckTest.java b/src/test/java/domain/deck/CardDeckTest.java index b37b68f84f..3e2a044c08 100644 --- a/src/test/java/domain/deck/CardDeckTest.java +++ b/src/test/java/domain/deck/CardDeckTest.java @@ -29,12 +29,10 @@ class CardDeckTest { @Test void 카드를_종류별로_값_별로_한장씩_모두_가진_채로_생성한다() { // given - final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); final Map> numberOfEachCardShape = new HashMap<>(); // when - for (int count = 0; count < 52; count++) { final Card card = cardDeck.draw(); final CardShape cardShape = card.cardShape(); diff --git a/src/test/java/domain/player/dealer/DealerTest.java b/src/test/java/domain/player/dealer/DealerTest.java index f8e0cd55d5..a001d459a0 100644 --- a/src/test/java/domain/player/dealer/DealerTest.java +++ b/src/test/java/domain/player/dealer/DealerTest.java @@ -4,7 +4,6 @@ import domain.card.Card; import domain.card.CardShape; import domain.player.Player; -import domain.player.dealer.Dealer; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; diff --git a/src/test/java/domain/player/participant/ParticipantResultTest.java b/src/test/java/domain/player/participant/ParticipantResultTest.java index 2c134da099..31adfb8432 100644 --- a/src/test/java/domain/player/participant/ParticipantResultTest.java +++ b/src/test/java/domain/player/participant/ParticipantResultTest.java @@ -6,8 +6,6 @@ import domain.player.Name; import domain.player.dealer.Dealer; import domain.player.dealer.DealerResult; -import domain.player.participant.Participant; -import domain.player.participant.ParticipantResult; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -18,10 +16,16 @@ import java.util.stream.Stream; -import static domain.card.CardShape.*; +import static domain.card.CardShape.CLOVER; +import static domain.card.CardShape.DIAMOND; +import static domain.card.CardShape.HEART; +import static domain.card.CardShape.SPADE; import static domain.card.CardValue.NINE; import static domain.card.CardValue.TEN; -import static domain.player.participant.ParticipantResult.*; +import static domain.player.participant.ParticipantResult.DRAWER; +import static domain.player.participant.ParticipantResult.LOSER; +import static domain.player.participant.ParticipantResult.WINNER; +import static domain.player.participant.ParticipantResult.matchBetween; import static org.junit.jupiter.api.Assertions.assertEquals; @DisplayName("ParticipantResult 의") diff --git a/src/test/java/domain/player/participant/ParticipantTest.java b/src/test/java/domain/player/participant/ParticipantTest.java index 6d7ec3ce62..ec5541e78e 100644 --- a/src/test/java/domain/player/participant/ParticipantTest.java +++ b/src/test/java/domain/player/participant/ParticipantTest.java @@ -4,8 +4,6 @@ import domain.card.Card; import domain.card.CardShape; import domain.player.Name; -import domain.player.participant.Participant; -import domain.player.participant.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -18,8 +16,12 @@ import java.util.stream.Stream; -import static domain.card.CardValue.*; -import static org.junit.jupiter.api.Assertions.*; +import static domain.card.CardValue.SEVEN; +import static domain.card.CardValue.TEN; +import static domain.card.CardValue.TWO; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) diff --git a/src/test/java/domain/player/participant/StateTest.java b/src/test/java/domain/player/participant/StateTest.java index edb2226373..0bb31ce61a 100644 --- a/src/test/java/domain/player/participant/StateTest.java +++ b/src/test/java/domain/player/participant/StateTest.java @@ -1,11 +1,10 @@ package domain.player.participant; -import domain.player.participant.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; @DisplayName("State는") class StateTest { From 4d88beaea672099c752686ba75d2d30ac2e709b0 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Fri, 3 Mar 2023 13:33:36 +0900 Subject: [PATCH 36/60] =?UTF-8?q?fix=20:=20y=20=EB=98=90=EB=8A=94=20n=20?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EC=9D=84=20=EA=B2=BD=EC=9A=B0=20=EC=9E=AC=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=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/view/InputView.java | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 0f81fde8bd..1fbfda6985 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -9,6 +9,8 @@ public class InputView { + private static final String YES_COMMAND = "y"; + private static final String NO_COMMAND = "n"; private static final Scanner scanner = new Scanner(System.in); private InputView() {} @@ -23,6 +25,28 @@ public static List readParticipantsName() { public static String readMoreCard(final Participant participant) { System.out.println(participant.name().value() + "는 한장의 카드를 더 받으시겠습니다?(예는 y, 아니오는 n)"); - return scanner.nextLine(); + + final String input = scanner.nextLine(); + + if (validateIneligibleCommand(input)) { + return readMoreCard(participant); + } + + return input; + } + + private static boolean validateIneligibleCommand(final String input) { + try { + if (ineligibleCommand(input)) { + throw new IllegalArgumentException(input + " 은 명령어가 아닙니다."); + } + } catch (IllegalArgumentException exception) { + return true; + } + return false; + } + + private static boolean ineligibleCommand(final String input) { + return !input.equals(YES_COMMAND) && !input.equals(NO_COMMAND); } } From 94d8d7d73a29542fa9c7484c2058116a5498d5b6 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Fri, 3 Mar 2023 15:39:24 +0900 Subject: [PATCH 37/60] =?UTF-8?q?mission=20:=20mini=20mission=20ArrayList?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/minimission/SimpleArrayList.java | 132 ++++++++++ .../java/minimission/SimpleArrayListTest.java | 236 ++++++++++++++++++ src/test/java/minimission/SimpleList.java | 26 ++ 3 files changed, 394 insertions(+) create mode 100644 src/test/java/minimission/SimpleArrayList.java create mode 100644 src/test/java/minimission/SimpleArrayListTest.java create mode 100644 src/test/java/minimission/SimpleList.java diff --git a/src/test/java/minimission/SimpleArrayList.java b/src/test/java/minimission/SimpleArrayList.java new file mode 100644 index 0000000000..97f7721a71 --- /dev/null +++ b/src/test/java/minimission/SimpleArrayList.java @@ -0,0 +1,132 @@ +package minimission; + +import java.util.Arrays; +import java.util.Objects; + +public class SimpleArrayList implements SimpleList { + + private static final int DEFAULT_CAPACITY = 10; + + private String[] array; + private int currentSize; + + public SimpleArrayList() { + this.array = new String[DEFAULT_CAPACITY]; + currentSize = 0; + } + + @Override + public boolean add(final String value) { + if (currentSize == array.length) { + grow(); + } + + array[currentSize] = value; + currentSize++; + return true; + } + + @Override + public void add(final int index, final String value) { + if (index < 0 || index > currentSize) { + throw new IndexOutOfBoundsException("여기에는 값을 넣을 수 없습니다."); + } + + if (currentSize == array.length) { + grow(); + } + + System.arraycopy(array, index, array, index + 1, currentSize - index); + + array[index] = value; + currentSize += 1; + } + + private void grow() { + int limitCapacity = currentSize + currentSize / 2; + array = Arrays.copyOf(array, limitCapacity); + } + + @Override + public String set(final int index, final String value) { + if (index < 0 || index > currentSize) { + throw new IndexOutOfBoundsException("여기에는 값을 넣을 수 없습니다."); + } + + array[index] = value; + + return value; + } + + @Override + public String get(final int index) { + if (index < 0 || index > currentSize) { + throw new IndexOutOfBoundsException("여기에는 값을 넣을 수 없습니다."); + } + + return array[index]; + } + + @Override + public boolean contains(final String value) { + return indexOf(value) != -1; + } + + @Override + public int indexOf(final String value) { + for (int index = 0; index < array.length; index++) { + if (value.equals(array[index])) { + return index; + } + } + + return -1; + } + + @Override + public int size() { + return currentSize; + } + + @Override + public boolean isEmpty() { + return currentSize == 0; + } + + @Override + public boolean remove(final String value) { + final int index = indexOf(value); + + if (index == -1) { + return false; + } + + remove(index); + currentSize -= 1; + + return true; + } + + @Override + public String remove(final int index) { + if (index < 0 || index > currentSize) { + throw new IndexOutOfBoundsException("여기에는 값을 넣을 수 없습니다."); + } + + final String oldValue = array[index]; + + if (currentSize - 1 > index) { + System.arraycopy(array, index + 1, array, index, currentSize - index); + } + + array[currentSize] = null; + currentSize -= 1; + + return oldValue; + } + + @Override + public void clear() { + Arrays.fill(array, null); + } +} diff --git a/src/test/java/minimission/SimpleArrayListTest.java b/src/test/java/minimission/SimpleArrayListTest.java new file mode 100644 index 0000000000..1fea8773b6 --- /dev/null +++ b/src/test/java/minimission/SimpleArrayListTest.java @@ -0,0 +1,236 @@ +package minimission; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SimpleArrayListTest { + + SimpleList simpleArrayList; + + @BeforeEach + void init() { + simpleArrayList = new SimpleArrayList(); + } + + @Test + @DisplayName("add() : arrayList의 사이즈가 충분할 때, 값을 추가할 수 있다.") + void test_add_enough_size() throws Exception { + //given + SimpleArrayList simpleArrayList = new SimpleArrayList(); + + //when & then + simpleArrayList.add("a"); + assertEquals(1, simpleArrayList.size()); + + simpleArrayList.add("b"); + assertEquals(2, simpleArrayList.size()); + } + + @Test + @DisplayName("add(value) : arrayList가 가득 찼을 때, 자동으로 현재 크기의 절반을 늘린다음에 값을 넣을 수 있다.") + void test_add_full() throws Exception { + //given + SimpleArrayList simpleArrayList = new SimpleArrayList(); + + //when & then + for (int i = 0; i < 10; i++) { + simpleArrayList.add("a"); + } + + simpleArrayList.add("b"); + assertEquals(11, simpleArrayList.size()); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 11}) + @DisplayName("add(index, value) : index의 크기가 0보다 작거나, 현재 크기보다 클 경우에는 IndexOutOfBoundsException 발생한다.") + void test_add_specific_index_indexOutOfBoundsException(int index) throws Exception { + //given + SimpleList simpleArrayList = new SimpleArrayList(); + + //when & then + assertThatThrownBy(() -> simpleArrayList.add(index, "a")) + .isInstanceOf(IndexOutOfBoundsException.class); + } + + @Test + @DisplayName("add(index, value) : 원하는 index 에 값을 넣을 수 있다. 뒷 값들은 한 칸씩 밀려나간다.") + void test_add_specific_index() throws Exception { + // given + for (int i = 0; i < 10; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + // when + simpleArrayList.add(5, "k"); + + + // then + assertEquals("k", simpleArrayList.get(5)); + } + + @Test + @DisplayName("set() : 원하는 index에 값을 변경할 수 있다.") + void test_set() throws Exception { + //given + for (int i = 0; i < 10; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //when + simpleArrayList.set(4, "k"); + + //then + assertEquals("k", simpleArrayList.get(4)); + } + + @Test + @DisplayName("get() : 원하는 index 의 값을 가져올 수 있다.") + void get_element_using_index() throws Exception { + //when + for (int i = 0; i < 10; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //then + assertAll( + () -> assertEquals("a", simpleArrayList.get(0)), + () -> assertEquals("b", simpleArrayList.get(1)), + () -> assertEquals("c", simpleArrayList.get(2)), + () -> assertEquals("d", simpleArrayList.get(3)), + () -> assertEquals("e", simpleArrayList.get(4)), + () -> assertEquals("f", simpleArrayList.get(5)), + () -> assertEquals("g", simpleArrayList.get(6)), + () -> assertEquals("h", simpleArrayList.get(7)), + () -> assertEquals("i", simpleArrayList.get(8)), + () -> assertEquals("j", simpleArrayList.get(9)) + ); + } + + @ParameterizedTest + @CsvSource(value = { + "z -> false", + "a -> true", + "b -> true", + "c -> true", + "d -> true", + "m -> false" + }, delimiterString = " -> ") + @DisplayName("contains() : 배열에 해당 값이 있다면 true를 반환한다") + void test_contains(final String value, final boolean isContains) throws Exception { + //given + for (int i = 0; i < 10; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //when & then + assertEquals(isContains, simpleArrayList.contains(value)); + } + + @ParameterizedTest + @CsvSource(value = { + "z -> -1", + "a -> 0", + "b -> 1", + "c -> 2", + "d -> 3" + }, delimiterString = " -> ") + @DisplayName("indexOf() : 배열에 해당 값이 없다면 -1 을 반환하고, 있으면 해당 index 를 반환한다") + void test_indexOf_notIn(final String value, final int index) throws Exception { + //given + for (int i = 0; i < 10; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //when & then + assertEquals(index, simpleArrayList.indexOf(value)); + } + + @Test + @DisplayName("size() : 현재 배열에 있는 값들의 개수를 구할 수 있다.") + void test_size() throws Exception { + //given + assertEquals(0, simpleArrayList.size()); + + for (int i = 0; i < 10; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //when & then + assertEquals(10, simpleArrayList.size()); + } + + @Test + @DisplayName("empty() : 배열에 element 가 하나도 없으면 true를 반환한다.") + void test_empty() throws Exception { + //given + assertTrue(simpleArrayList.isEmpty()); + + for (int i = 0; i < 10; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //when & then + assertFalse(simpleArrayList.isEmpty()); + } + + @Test + @DisplayName("remove(index) : 특정 index의 값을 삭제하고 뒤에 있는 값들을 당겨온다.") + void test_remove_specific_index() throws Exception { + //given + for (int i = 0; i < 13; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //when + final String oldValue = simpleArrayList.remove(11); + + //then + assertEquals("l", oldValue); + assertEquals("m", simpleArrayList.get(11)); + } + + @Test + @DisplayName("remove(value) : 특정 값을 삭제하고 뒤에 있는 값들을 당겨온다.") + void test_remove_specific_value() throws Exception { + //given + for (int i = 0; i < 13; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //when + final boolean removeFlag = simpleArrayList.remove("l"); + + //then + assertTrue(removeFlag); + assertEquals("m", simpleArrayList.get(11)); + } + + @Test + @DisplayName("clear() : array의 값을 모두 비운다.") + void test_clear() throws Exception { + //given + for (int i = 0; i < 13; i++) { + simpleArrayList.add(String.valueOf((char) (i + 'a'))); + } + + //when + simpleArrayList.clear(); + + //then + for (int i = 0; i < simpleArrayList.size(); i++) { + assertNull(simpleArrayList.get(i)); + } + } +} diff --git a/src/test/java/minimission/SimpleList.java b/src/test/java/minimission/SimpleList.java new file mode 100644 index 0000000000..a736a09920 --- /dev/null +++ b/src/test/java/minimission/SimpleList.java @@ -0,0 +1,26 @@ +package minimission; + +public interface SimpleList { + + boolean add(String value); + + void add(int index, String value); + + String set(int index, String value); + + String get(int index); + + boolean contains(String value); + + int indexOf(String value); + + int size(); + + boolean isEmpty(); + + boolean remove(String value); + + String remove(int index); + + void clear(); +} From fca34dac563560ff60534cda977045de91d436de Mon Sep 17 00:00:00 2001 From: java-saeng Date: Sat, 4 Mar 2023 18:43:48 +0900 Subject: [PATCH 38/60] =?UTF-8?q?docs=20:=20readme=20=EC=9C=84=EC=B9=98=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 --- README.md | 27 +++++++++++++++++++++++++++ docs/READMD.md | 26 -------------------------- 2 files changed, 27 insertions(+), 26 deletions(-) delete mode 100644 docs/READMD.md diff --git a/README.md b/README.md index 556099c4de..5f70fbb5b1 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,30 @@ ## 우아한테크코스 코드리뷰 - [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) + +## 도메인 + +### 카드 값 + +- [x] `2~10`, `A`, `K`, `Q`, `J` 가 있다. +- [x] `K`, `Q`, `J` 는 10으로 계산된다. + +### 카드 + +- [x] `다이아`, `클로버`, `하트`, `스페이드` 카드가 있다. +- [x] `카드 값`을 가진다. + +### 카드 영역 +- [x] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. +- [x] 카드들을 가진다. +- [x] 카드를 더 받을 수 있는 상태인지 확인한다. +- [x] 카드를 더 받을 것인지 결정한다. +- [x] 카드 현숫자를 계산한다. +- [X] `A` 는 1 또는 11로 계산될 수 있다. +- [x] 카드를 추가할 수 있다. +- [x] 처음에 카드 2장을 받아 생성된다. + +### 카드 덱 + +- [x] 전체 카드를 가진다. +- [x] 카드를 한장씩 준다. diff --git a/docs/READMD.md b/docs/READMD.md deleted file mode 100644 index b15011c6ac..0000000000 --- a/docs/READMD.md +++ /dev/null @@ -1,26 +0,0 @@ -## 도메인 - -### 카드 값 - -- [x] `2~10`, `A`, `K`, `Q`, `J` 가 있다. -- [x] `K`, `Q`, `J` 는 10으로 계산된다. - -### 카드 - -- [x] `다이아`, `클로버`, `하트`, `스페이드` 카드가 있다. -- [x] `카드 값`을 가진다. - -### 카드 영역 -- [x] 딜러 카드 영역과 참가자 카드 영역으로 나뉜다. -- [x] 카드들을 가진다. -- [x] 카드를 더 받을 수 있는 상태인지 확인한다. -- [x] 카드를 더 받을 것인지 결정한다. -- [x] 카드 현숫자를 계산한다. -- [X] `A` 는 1 또는 11로 계산될 수 있다. -- [x] 카드를 추가할 수 있다. -- [x] 처음에 카드 2장을 받아 생성된다. - -### 카드 덱 - -- [x] 전체 카드를 가진다. -- [x] 카드를 한장씩 준다. \ No newline at end of file From 61e8974d9bda56675155a271a6e1880360e6e87f Mon Sep 17 00:00:00 2001 From: java-saeng Date: Sat, 4 Mar 2023 19:00:43 +0900 Subject: [PATCH 39/60] =?UTF-8?q?refactor=20:=20=EB=B8=94=EB=9E=99?= =?UTF-8?q?=EC=9E=AD=20=EA=B7=9C=EC=B9=99=20=EC=A4=91=20burst=20->=20bust?= =?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/domain/area/CardArea.java | 2 +- src/main/java/domain/player/Player.java | 4 ++-- .../player/participant/ParticipantResult.java | 4 ++-- src/test/java/domain/area/CardAreaTest.java | 4 ++-- .../player/participant/ParticipantResultTest.java | 14 +++++++------- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index 669f3c70f9..f3ed84ca84 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -50,7 +50,7 @@ public boolean canMoreCard() { return calculate() < 21; } - public boolean isBurst() { + public boolean isBust() { return calculate() > 21; } diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index 9c19e3366c..b339fac757 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -21,8 +21,8 @@ public CardArea cardArea() { return cardArea; } - public boolean isBurst() { - return cardArea.isBurst(); + public boolean isBust() { + return cardArea.isBust(); } public void hit(final Card card) { diff --git a/src/main/java/domain/player/participant/ParticipantResult.java b/src/main/java/domain/player/participant/ParticipantResult.java index 71a8d8b800..5c5213121a 100644 --- a/src/main/java/domain/player/participant/ParticipantResult.java +++ b/src/main/java/domain/player/participant/ParticipantResult.java @@ -9,10 +9,10 @@ public enum ParticipantResult { DRAWER; public static ParticipantResult matchBetween(final Participant participant, final Dealer dealer) { - if (participant.isBurst()) { + if (participant.isBust()) { return ParticipantResult.LOSER; } - if (dealer.isBurst()) { + if (dealer.isBust()) { return ParticipantResult.WINNER; } if (participant.score() > dealer.score()) { diff --git a/src/test/java/domain/area/CardAreaTest.java b/src/test/java/domain/area/CardAreaTest.java index 10b62aa38a..a15e4ea0af 100644 --- a/src/test/java/domain/area/CardAreaTest.java +++ b/src/test/java/domain/area/CardAreaTest.java @@ -161,7 +161,7 @@ static Stream containsAceCardArea() { cardArea.addCard(new Card(CardShape.DIAMOND, TEN)); // when & then - assertTrue(cardArea.isBurst()); + assertTrue(cardArea.isBust()); } @Test @@ -170,7 +170,7 @@ static Stream containsAceCardArea() { final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); // when & then - assertFalse(cardArea.isBurst()); + assertFalse(cardArea.isBust()); } @Test diff --git a/src/test/java/domain/player/participant/ParticipantResultTest.java b/src/test/java/domain/player/participant/ParticipantResultTest.java index 31adfb8432..c6616afa7d 100644 --- a/src/test/java/domain/player/participant/ParticipantResultTest.java +++ b/src/test/java/domain/player/participant/ParticipantResultTest.java @@ -42,8 +42,8 @@ void initCardArea() { } @Test - @DisplayName("matchBetween() : 참여자가 burst 일 경우에는 참여자가 무조건 게임에서 진다.") - void test_matchBetween_burst_participant_must_lose_participant() throws Exception { + @DisplayName("matchBetween() : 참여자가 bust 일 경우에는 참여자가 무조건 게임에서 진다.") + void test_matchBetween_bust_participant_must_lose_participant() throws Exception { //given participantCardArea.addCard(new Card(SPADE, TEN)); final Participant participant = new Participant(new Name("name"), participantCardArea); @@ -57,8 +57,8 @@ void test_matchBetween_burst_participant_must_lose_participant() throws Exceptio } @Test - @DisplayName("matchBetween() : 딜러는 burst 이면서 참여자가 burst 가 아니면 참여자가 무조건 게임에서 이긴다.") - void test_matchBetween_burst_dealer_must_lose_dealer() throws Exception { + @DisplayName("matchBetween() : 딜러는 bust 이면서 참여자가 bust 가 아니면 참여자가 무조건 게임에서 이긴다.") + void test_matchBetween_bust_dealer_must_lose_dealer() throws Exception { //given final Participant participant = new Participant(new Name("name"), participantCardArea); final Dealer dealer = new Dealer(dealerCardArea); @@ -72,9 +72,9 @@ void test_matchBetween_burst_dealer_must_lose_dealer() throws Exception { } @ParameterizedTest - @MethodSource("makeBothNotBurst") + @MethodSource("makeBothNotbust") @DisplayName("matchBetween() : 딜러, 참여자 모두 버스트가 아닐 때 점수가 높은 쪽이 이기고, 같으면 무승부이다.") - void test_matchBetween_not_burst_win_higher_score_or_draw_same_score( + void test_matchBetween_not_bust_win_higher_score_or_draw_same_score( final CardArea participantCardArea, final CardArea dealerCardArea, final ParticipantResult participantResult) throws Exception { @@ -86,7 +86,7 @@ void test_matchBetween_not_burst_win_higher_score_or_draw_same_score( assertEquals(ParticipantResult.matchBetween(participant, dealer), participantResult); } - static Stream makeBothNotBurst() { + static Stream makeBothNotbust() { //무승부 final CardArea participantDrawCardArea = new CardArea( From d236d9f182aacebdd199bc2788646e3046e421f9 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Sat, 4 Mar 2023 19:19:08 +0900 Subject: [PATCH 40/60] =?UTF-8?q?refactor=20:=20Player=EC=97=90=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=20=EC=A0=90=EC=88=98=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=EA=B0=80=20?= =?UTF-8?q?=EC=9E=88=EC=96=B4=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Name은 하위 클래스에서 사용하지 않기 때문에 접근제어자 protected -> private 변경 --- src/main/java/domain/player/Player.java | 2 +- src/main/java/domain/player/dealer/Dealer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index b339fac757..073c103eb1 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -5,7 +5,7 @@ public abstract class Player { - protected final Name name; + private final Name name; protected final CardArea cardArea; protected Player(final Name name, final CardArea cardArea) { diff --git a/src/main/java/domain/player/dealer/Dealer.java b/src/main/java/domain/player/dealer/Dealer.java index 382125470f..8777c8f2ca 100644 --- a/src/main/java/domain/player/dealer/Dealer.java +++ b/src/main/java/domain/player/dealer/Dealer.java @@ -15,6 +15,6 @@ public Dealer(final CardArea cardArea) { @Override public boolean canHit() { - return cardArea.calculate() <= DEALER_LIMIT_SCORE; + return score() <= DEALER_LIMIT_SCORE; } } From b09e72c55198ef829c443a44272e4c01ccf6d4c5 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Sat, 4 Mar 2023 19:27:23 +0900 Subject: [PATCH 41/60] =?UTF-8?q?style=20:=20=EA=B0=9C=ED=96=89=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/card/CardValueTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/domain/card/CardValueTest.java b/src/test/java/domain/card/CardValueTest.java index 1bc0c9e0d9..0ee145259f 100644 --- a/src/test/java/domain/card/CardValueTest.java +++ b/src/test/java/domain/card/CardValueTest.java @@ -33,4 +33,4 @@ class CardValueTest { // when & then assertEquals(cardValue.value(), value); } -} \ No newline at end of file +} From a05dfe283568f1023eaf37fa79517b5e6a32f57d Mon Sep 17 00:00:00 2001 From: java-saeng Date: Sat, 4 Mar 2023 19:52:00 +0900 Subject: [PATCH 42/60] =?UTF-8?q?refactor=20:=20=EB=94=9C=EB=9F=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B2=AB=20=EB=B2=88=EC=A7=B8=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=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 - OutputView에서 "딜러의 cardArea에서 첫 번재 카드를 뽑는다"보다는 "딜러는 첫번째 카드를 보여준다" 가 자연스러워 보임 --- src/main/java/domain/player/dealer/Dealer.java | 5 +++++ src/main/java/view/OutputView.java | 6 +++--- .../java/domain/player/dealer/DealerTest.java | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/player/dealer/Dealer.java b/src/main/java/domain/player/dealer/Dealer.java index 8777c8f2ca..822ad2fdda 100644 --- a/src/main/java/domain/player/dealer/Dealer.java +++ b/src/main/java/domain/player/dealer/Dealer.java @@ -1,6 +1,7 @@ package domain.player.dealer; import domain.area.CardArea; +import domain.card.Card; import domain.player.Name; import domain.player.Player; @@ -17,4 +18,8 @@ public Dealer(final CardArea cardArea) { public boolean canHit() { return score() <= DEALER_LIMIT_SCORE; } + + public Card faceUpFirstCard() { + return cardArea.firstCard(); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 03b33249c6..15b3e43228 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -83,12 +83,12 @@ private static String printDrawing(final List participants) { } public static void showStateOf(final Dealer dealer) { - final Card dealerFistCard = dealer.cardArea().firstCard(); + final Card card = dealer.faceUpFirstCard(); System.out.println(getPlayerName(dealer) + COLON - + VALUE_MESSAGE_MAP.get(dealerFistCard.cardValue()) - + SHAPE_MESSAGE_MAP.get(dealerFistCard.cardShape()) + + VALUE_MESSAGE_MAP.get(card.cardValue()) + + SHAPE_MESSAGE_MAP.get(card.cardShape()) ); } diff --git a/src/test/java/domain/player/dealer/DealerTest.java b/src/test/java/domain/player/dealer/DealerTest.java index a001d459a0..dbe7d7344f 100644 --- a/src/test/java/domain/player/dealer/DealerTest.java +++ b/src/test/java/domain/player/dealer/DealerTest.java @@ -12,6 +12,7 @@ import static domain.card.CardValue.SEVEN; import static domain.card.CardValue.SIX; import static domain.card.CardValue.TEN; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -47,4 +48,20 @@ class DealerTest { // when & then assertFalse(dealer.canHit()); } + + @Test + @DisplayName("faceUpFirstCard() : 딜러는 첫 번째 카드만을 보여줍니다.") + void test_faceUpFirstCard() throws Exception { + //given + final CardArea cardArea = new CardArea( + new Card(CardShape.CLOVER, TEN), + new Card(CardShape.CLOVER, SEVEN) + ); + + //when + final Dealer dealer = new Dealer(cardArea); + + //then + assertEquals(dealer.faceUpFirstCard(), new Card(CardShape.CLOVER, TEN)); + } } From 30782d3448464503d0ae10d9896f62557d11ddd9 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Sat, 4 Mar 2023 20:40:49 +0900 Subject: [PATCH 43/60] =?UTF-8?q?refactor=20:=20State=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackJackController.java | 21 ++---- .../player/participant/Participant.java | 15 +--- .../java/domain/player/participant/State.java | 11 --- .../player/participant/ParticipantTest.java | 68 +++---------------- .../domain/player/participant/StateTest.java | 23 ------- 5 files changed, 17 insertions(+), 121 deletions(-) delete mode 100644 src/main/java/domain/player/participant/State.java delete mode 100644 src/test/java/domain/player/participant/StateTest.java diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 4f3c02b5ad..13513d2639 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -2,12 +2,11 @@ import domain.area.CardArea; import domain.deck.CardDeck; +import domain.player.Name; import domain.player.dealer.Dealer; import domain.player.dealer.DealerResult; -import domain.player.Name; import domain.player.participant.Participant; import domain.player.participant.ParticipantResult; -import domain.player.participant.State; import view.InputView; import view.OutputView; @@ -90,24 +89,14 @@ private void hitForParticipants(final CardDeck cardDeck, final List } private void hitForParticipant(final CardDeck cardDeck, final Participant participant) { - while (participant.canHit()) { - participant.changeState(inputHitOrStay(participant)); - determineHitForParticipant(cardDeck, participant); - } - } - - private void determineHitForParticipant(final CardDeck cardDeck, final Participant participant) { - if (participant.wantHit()) { + while (participant.canHit() && inputHitOrStay(participant)) { participant.hit(cardDeck.draw()); + OutputView.showStateOf(participant); } - OutputView.showStateOf(participant); } - private State inputHitOrStay(final Participant participant) { - if (InputView.readMoreCard(participant).equals("y")) { - return State.HIT; - } - return State.STAY; + private boolean inputHitOrStay(final Participant participant) { + return InputView.readMoreCard(participant).equals("y"); } private Dealer dealDealerCards(final CardDeck cardDeck) { diff --git a/src/main/java/domain/player/participant/Participant.java b/src/main/java/domain/player/participant/Participant.java index 581cc49beb..ff371082fa 100644 --- a/src/main/java/domain/player/participant/Participant.java +++ b/src/main/java/domain/player/participant/Participant.java @@ -4,27 +4,14 @@ import domain.player.Name; import domain.player.Player; -import java.util.Objects; - public class Participant extends Player { - private State state; - public Participant(final Name name, final CardArea cardArea) { super(name, cardArea); } @Override public boolean canHit() { - return cardArea.canMoreCard() && - (Objects.isNull(state) || wantHit()); - } - - public boolean wantHit() { - return state.isHit(); - } - - public void changeState(final State state) { - this.state = state; + return cardArea.canMoreCard(); } } diff --git a/src/main/java/domain/player/participant/State.java b/src/main/java/domain/player/participant/State.java deleted file mode 100644 index 79316e3d1d..0000000000 --- a/src/main/java/domain/player/participant/State.java +++ /dev/null @@ -1,11 +0,0 @@ -package domain.player.participant; - -public enum State { - HIT, - STAY, - ; - - public boolean isHit() { - return this == HIT; - } -} diff --git a/src/test/java/domain/player/participant/ParticipantTest.java b/src/test/java/domain/player/participant/ParticipantTest.java index ec5541e78e..1615567764 100644 --- a/src/test/java/domain/player/participant/ParticipantTest.java +++ b/src/test/java/domain/player/participant/ParticipantTest.java @@ -2,89 +2,43 @@ import domain.area.CardArea; import domain.card.Card; -import domain.card.CardShape; import domain.player.Name; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.DisplayNameGeneration; -import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; -import java.util.stream.Stream; - -import static domain.card.CardValue.SEVEN; +import static domain.card.CardShape.CLOVER; +import static domain.card.CardShape.SPADE; +import static domain.card.CardValue.ACE; import static domain.card.CardValue.TEN; -import static domain.card.CardValue.TWO; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -@SuppressWarnings("NonAsciiCharacters") -@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @DisplayName("Participant 은") class ParticipantTest { final CardArea cardArea = new CardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN) + new Card(CLOVER, TEN), + new Card(SPADE, TEN) ); @Test - void 참가자는_상태를_바꿀_수_있다() { + @DisplayName("canHit() : 참여자는 21점 미만일 경우 카드를 더 받을 수 있다.") + void test_canHit_underScore21() { // given final Participant participant = new Participant(new Name("player1"), cardArea); - // when - assertDoesNotThrow(() -> participant.changeState(State.HIT)); - } - - @ParameterizedTest - @ValueSource(strings = "HIT") - @NullSource - void 참가자는_버스트되지_않았으면서_STAY_를_원하지_않을_때_카드를_더_받을_수_있다(final State state) { - // given - final Participant participant = new Participant(new Name("player1"), cardArea); - - participant.changeState(state); - // when & then assertTrue(participant.canHit()); } - @ParameterizedTest - @MethodSource("canNotMoreCard") - void 참가자는_버스트되었거나_STAY_를_원한다면_카드를_더_받을_수_없다(final CardArea cardArea, final State state) { + @Test + @DisplayName("canHit() : 참여자는 21점 이상일 경우 카드를 더 받을 수 없다.") + void test_canHit_overScore21() { // given final Participant participant = new Participant(new Name("player1"), cardArea); - participant.changeState(state); + cardArea.addCard(new Card(CLOVER, ACE)); // when & then assertFalse(participant.canHit()); } - - static Stream canNotMoreCard() { - - final CardArea under21CardArea = new CardArea( - new Card(CardShape.SPADE, TEN), - new Card(CardShape.DIAMOND, TEN) - ); - - final CardArea over21CardArea = new CardArea( - new Card(CardShape.SPADE, TEN), - new Card(CardShape.DIAMOND, TEN) - ); - - over21CardArea.addCard(new Card(CardShape.SPADE, TWO)); - - return Stream.of( - Arguments.of(under21CardArea, State.STAY), - Arguments.of(over21CardArea, null), - Arguments.of(over21CardArea, State.STAY), - Arguments.of(over21CardArea, State.HIT) - ); - } } diff --git a/src/test/java/domain/player/participant/StateTest.java b/src/test/java/domain/player/participant/StateTest.java deleted file mode 100644 index 0bb31ce61a..0000000000 --- a/src/test/java/domain/player/participant/StateTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package domain.player.participant; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@DisplayName("State는") -class StateTest { - - @ParameterizedTest - @CsvSource(value = { - "HIT -> true", - "STAY -> false" - }, delimiterString = " -> ") - @DisplayName("isHit() : Hit 일 경우에는 true, STAY 일 경우에는 false를 반환한다.") - void test(State state, boolean result) throws Exception { - - //when & then - assertEquals(state.isHit(), result); - } -} From eddb77b6f35e72fe3d03aa340e176740041eb991 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 00:50:29 +0900 Subject: [PATCH 44/60] =?UTF-8?q?feat=20:=20cardArea=EB=A5=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EB=8A=94=20CardTable=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++ .../java/controller/BlackJackController.java | 16 ++++++------ src/main/java/domain/cardtable/CardTable.java | 21 ++++++++++++++++ .../java/domain/cardtable/CardTableTest.java | 25 +++++++++++++++++++ 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 src/main/java/domain/cardtable/CardTable.java create mode 100644 src/test/java/domain/cardtable/CardTableTest.java diff --git a/README.md b/README.md index 5f70fbb5b1..fa044e7783 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,9 @@ - [x] 전체 카드를 가진다. - [x] 카드를 한장씩 준다. + +## refactoring + +### 카드 테이블 +- [x] `카드 영역`을 생성해준다. + diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 13513d2639..70d046f53c 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -1,6 +1,6 @@ package controller; -import domain.area.CardArea; +import domain.cardtable.CardTable; import domain.deck.CardDeck; import domain.player.Name; import domain.player.dealer.Dealer; @@ -22,9 +22,10 @@ public class BlackJackController { public void run() { final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); - final List participants = dealParticipantsCards(cardDeck); - final Dealer dealer = dealDealerCards(cardDeck); + final List participants = dealParticipantsCards(cardTable); + final Dealer dealer = dealDealerCards(cardTable); printStateAfterDealtCard(participants, dealer); hittingPlayer(cardDeck, participants, dealer); @@ -99,15 +100,16 @@ private boolean inputHitOrStay(final Participant participant) { return InputView.readMoreCard(participant).equals("y"); } - private Dealer dealDealerCards(final CardDeck cardDeck) { - return new Dealer(new CardArea(cardDeck.draw(), cardDeck.draw())); + private Dealer dealDealerCards(final CardTable cardTable) { + return new Dealer(cardTable.createCardArea()); } - private List dealParticipantsCards(final CardDeck cardDeck) { + private List dealParticipantsCards(final CardTable cardTable) { return InputView.readParticipantsName() .stream() .map(Name::new) - .map(name -> new Participant(name, new CardArea(cardDeck.draw(), cardDeck.draw()))) + .map(name -> new Participant(name, cardTable.createCardArea())) .collect(Collectors.toList()); + } } diff --git a/src/main/java/domain/cardtable/CardTable.java b/src/main/java/domain/cardtable/CardTable.java new file mode 100644 index 0000000000..5808322fc3 --- /dev/null +++ b/src/main/java/domain/cardtable/CardTable.java @@ -0,0 +1,21 @@ +package domain.cardtable; + +import domain.area.CardArea; +import domain.deck.CardDeck; + +public class CardTable { + + private final CardDeck cardDeck; + + private CardTable(final CardDeck cardDeck) { + this.cardDeck = cardDeck; + } + + public static CardTable readyToPlayBlackjack(final CardDeck cardDeck) { + return new CardTable(cardDeck); + } + + public CardArea createCardArea() { + return new CardArea(cardDeck.draw(), cardDeck.draw()); + } +} diff --git a/src/test/java/domain/cardtable/CardTableTest.java b/src/test/java/domain/cardtable/CardTableTest.java new file mode 100644 index 0000000000..857c9f163d --- /dev/null +++ b/src/test/java/domain/cardtable/CardTableTest.java @@ -0,0 +1,25 @@ +package domain.cardtable; + +import domain.area.CardArea; +import domain.deck.CardDeck; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class CardTableTest { + + @Test + @DisplayName("createCardArea() : 각 player의 카드 영역을 생성해준다.") + void test_dealCard() throws Exception { + //given + final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); + final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); + + //when + final CardArea cardArea = cardTable.createCardArea(); + + //then + assertThat(cardArea.cards()).hasSize(2); + } +} From fef12797903c1e3f2ed3afcad46365d2f3286d3c Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 14:14:06 +0900 Subject: [PATCH 45/60] =?UTF-8?q?feat=20:=20=EC=A0=90=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20Score=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 --- src/main/java/domain/Score.java | 39 +++++++++++++++ src/test/java/domain/ScoreTest.java | 74 +++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 src/main/java/domain/Score.java create mode 100644 src/test/java/domain/ScoreTest.java diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java new file mode 100644 index 0000000000..f822e74daf --- /dev/null +++ b/src/main/java/domain/Score.java @@ -0,0 +1,39 @@ +package domain; + +import java.util.Objects; + +public class Score { + + private static final int UPPER_LIMIT_SCORE = 21; + + private final int score; + + public Score(final int score) { + this.score = score; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final Score score1 = (Score) o; + return score == score1.score; + } + + @Override + public int hashCode() { + return Objects.hash(score); + } + + public boolean isLessThan(final Score other) { + return score - other.score < 0; + } + + public boolean isBust() { + return score > UPPER_LIMIT_SCORE; + } + + public boolean canMoreCard() { + return score < UPPER_LIMIT_SCORE; + } +} diff --git a/src/test/java/domain/ScoreTest.java b/src/test/java/domain/ScoreTest.java new file mode 100644 index 0000000000..cb9e02c0a9 --- /dev/null +++ b/src/test/java/domain/ScoreTest.java @@ -0,0 +1,74 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +class ScoreTest { + + @ParameterizedTest + @MethodSource("compareScore") + @DisplayName("isLessThan() : 파라미터로 들어온 점수보다 낮으면 true를 반환한다.") + void test_isLessThan(final Score origin, final Score other, final boolean isLess) throws Exception { + //when & then + assertEquals(isLess, origin.isLessThan(other)); + } + + @ParameterizedTest + @CsvSource(value = { + "22 -> true", + "21 -> false", + "20 -> false", + "1 -> false" + }, delimiterString = " -> ") + @DisplayName("isBust() : 점수가 21 점 초과이면 bust가 된다.") + void test_isBust(final int sum, final boolean isBust) throws Exception { + //when + final Score score = new Score(sum); + + //then + assertEquals(isBust, score.isBust()); + } + + @Test + @DisplayName("canMoreCard() : 점수가 21점 미만아면 카드를 더 받을 수 있다.") + void test_canMoreCard() throws Exception { + // given + final Score score = new Score(20); + + // when & then + assertTrue(score.canMoreCard()); + } + + static Stream compareScore() { + //true + final Score origin1 = new Score(51); + final Score other1 = new Score(100); + + //false + final Score origin2 = new Score(100); + final Score other2 = new Score(51); + + //true + final Score origin3 = new Score(1); + final Score other3 = new Score(2); + + //false + final Score origin4 = new Score(1000); + final Score other4 = new Score(1000); + + return Stream.of( + Arguments.of(origin1, other1, true), + Arguments.of(origin2, other2, false), + Arguments.of(origin3, other3, true), + Arguments.of(origin4, other4, false) + ); + } +} From 648f7530b0ddc58a3b7e4d6d6e9dd76d58c51d32 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 14:31:27 +0900 Subject: [PATCH 46/60] =?UTF-8?q?feat=20:=20=EC=A0=90=EC=88=98=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A1=9C=EC=A7=81=EC=97=90=EC=84=9C=20int=20?= =?UTF-8?q?=EA=B0=80=20=EC=95=84=EB=8B=8C=20Score=20=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 --- README.md | 8 +++ src/main/java/domain/Score.java | 10 ++- src/main/java/domain/area/CardArea.java | 9 +-- src/main/java/domain/player/Player.java | 3 +- .../java/domain/player/dealer/Dealer.java | 3 +- .../player/participant/ParticipantResult.java | 4 +- src/test/java/domain/ScoreTest.java | 72 +++++++++++++++---- src/test/java/domain/area/CardAreaTest.java | 7 +- 8 files changed, 92 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index fa044e7783..5a11231f1b 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,12 @@ ### 카드 테이블 - [x] `카드 영역`을 생성해준다. + +### 점수 +- [x] 21점을 초과하는지 확인한다. +- [x] 21점 미만인지 확인한다. +- [x] 점수끼리 대소비교를 할 수 있다. + - [x] 작거나 같다. + - [x] 크다. + - [x] 작다. diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index f822e74daf..0f51ca1c0c 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -26,7 +26,7 @@ public int hashCode() { } public boolean isLessThan(final Score other) { - return score - other.score < 0; + return score < other.score; } public boolean isBust() { @@ -36,4 +36,12 @@ public boolean isBust() { public boolean canMoreCard() { return score < UPPER_LIMIT_SCORE; } + + public boolean isLessEqualThan(final Score other) { + return score <= other.score; + } + + public boolean isGreaterThan(final Score other) { + return score > other.score; + } } diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index f3ed84ca84..9dac9e745d 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -1,5 +1,6 @@ package domain.area; +import domain.Score; import domain.card.Card; import java.util.ArrayList; @@ -21,7 +22,7 @@ public void addCard(final Card card) { cards.add(card); } - public int calculate() { + public Score calculate() { int aceCount = countAceCard(); int totalValue = sumTotalCardValue(); @@ -31,7 +32,7 @@ public int calculate() { } aceCount--; } - return totalValue; + return new Score(totalValue); } private int sumTotalCardValue() { @@ -47,11 +48,11 @@ private int countAceCard() { } public boolean canMoreCard() { - return calculate() < 21; + return calculate().canMoreCard(); } public boolean isBust() { - return calculate() > 21; + return calculate().isBust(); } public Card firstCard() { diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index 073c103eb1..75bcf60415 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -1,5 +1,6 @@ package domain.player; +import domain.Score; import domain.area.CardArea; import domain.card.Card; @@ -31,7 +32,7 @@ public void hit(final Card card) { public abstract boolean canHit(); - public int score() { + public Score score() { return cardArea.calculate(); } } diff --git a/src/main/java/domain/player/dealer/Dealer.java b/src/main/java/domain/player/dealer/Dealer.java index 822ad2fdda..0bc17fbd27 100644 --- a/src/main/java/domain/player/dealer/Dealer.java +++ b/src/main/java/domain/player/dealer/Dealer.java @@ -1,5 +1,6 @@ package domain.player.dealer; +import domain.Score; import domain.area.CardArea; import domain.card.Card; import domain.player.Name; @@ -16,7 +17,7 @@ public Dealer(final CardArea cardArea) { @Override public boolean canHit() { - return score() <= DEALER_LIMIT_SCORE; + return score().isLessEqualThan(new Score(DEALER_LIMIT_SCORE)); } public Card faceUpFirstCard() { diff --git a/src/main/java/domain/player/participant/ParticipantResult.java b/src/main/java/domain/player/participant/ParticipantResult.java index 5c5213121a..2a40093ac5 100644 --- a/src/main/java/domain/player/participant/ParticipantResult.java +++ b/src/main/java/domain/player/participant/ParticipantResult.java @@ -15,10 +15,10 @@ public static ParticipantResult matchBetween(final Participant participant, fina if (dealer.isBust()) { return ParticipantResult.WINNER; } - if (participant.score() > dealer.score()) { + if (participant.score().isGreaterThan(dealer.score())) { return ParticipantResult.WINNER; } - if (participant.score() == dealer.score()) { + if (participant.score().equals(dealer.score())) { return ParticipantResult.DRAWER; } return ParticipantResult.LOSER; diff --git a/src/test/java/domain/ScoreTest.java b/src/test/java/domain/ScoreTest.java index cb9e02c0a9..5d863b3c7e 100644 --- a/src/test/java/domain/ScoreTest.java +++ b/src/test/java/domain/ScoreTest.java @@ -21,6 +21,31 @@ void test_isLessThan(final Score origin, final Score other, final boolean isLess assertEquals(isLess, origin.isLessThan(other)); } + static Stream compareScore() { + //true + final Score origin1 = new Score(51); + final Score other1 = new Score(100); + + //false + final Score origin2 = new Score(100); + final Score other2 = new Score(51); + + //true + final Score origin3 = new Score(1); + final Score other3 = new Score(2); + + //false + final Score origin4 = new Score(1000); + final Score other4 = new Score(1000); + + return Stream.of( + Arguments.of(origin1, other1, true), + Arguments.of(origin2, other2, false), + Arguments.of(origin3, other3, true), + Arguments.of(origin4, other4, false) + ); + } + @ParameterizedTest @CsvSource(value = { "22 -> true", @@ -47,28 +72,51 @@ void test_canMoreCard() throws Exception { assertTrue(score.canMoreCard()); } - static Stream compareScore() { + @ParameterizedTest + @MethodSource("compareEqualScore") + @DisplayName("isLessEqualThan() : 파라미터로 들어온 점수보다 작거나 같으면 true를 반환한다.") + void test_isLessEqualThen(final Score origin, final Score other, final boolean isLess) throws Exception { + //when & then + assertEquals(isLess, origin.isLessEqualThan(other)); + } + + static Stream compareEqualScore() { //true - final Score origin1 = new Score(51); - final Score other1 = new Score(100); + final Score origin1 = new Score(1); + final Score other1 = new Score(2); //false - final Score origin2 = new Score(100); - final Score other2 = new Score(51); + final Score origin2 = new Score(21); + final Score other2 = new Score(21); //true - final Score origin3 = new Score(1); - final Score other3 = new Score(2); + final Score origin3 = new Score(16); + final Score other3 = new Score(15); //false - final Score origin4 = new Score(1000); - final Score other4 = new Score(1000); + final Score origin4 = new Score(16); + final Score other4 = new Score(17); return Stream.of( Arguments.of(origin1, other1, true), - Arguments.of(origin2, other2, false), - Arguments.of(origin3, other3, true), - Arguments.of(origin4, other4, false) + Arguments.of(origin2, other2, true), + Arguments.of(origin3, other3, false), + Arguments.of(origin4, other4, true) ); } + + @Test + @DisplayName("isGreaterThan() : 파라미터로 들어온 점수보다 높으면 true를 반환한다.") + void test_isGreaterThan() throws Exception { + //given + final Score origin1 = new Score(21); + final Score other1 = new Score(21); + + final Score origin2 = new Score(21); + final Score other2 = new Score(20); + + //when & then + assertFalse(origin1.isGreaterThan(other1)); + assertTrue(origin2.isGreaterThan(other2)); + } } diff --git a/src/test/java/domain/area/CardAreaTest.java b/src/test/java/domain/area/CardAreaTest.java index a15e4ea0af..ab78bbd5f0 100644 --- a/src/test/java/domain/area/CardAreaTest.java +++ b/src/test/java/domain/area/CardAreaTest.java @@ -1,5 +1,6 @@ package domain.area; +import domain.Score; import domain.card.Card; import domain.card.CardShape; import org.junit.jupiter.api.DisplayName; @@ -73,7 +74,7 @@ class CardAreaTest { new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then - assertThat(cardArea.calculate()).isEqualTo(totalScore); + assertThat(cardArea.calculate()).isEqualTo(new Score(totalScore)); } @ParameterizedTest(name = "킹, 퀸, 잭은 10으로 계산한다") @@ -92,14 +93,14 @@ class CardAreaTest { new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then - assertThat(cardArea.calculate()).isEqualTo(totalScore); + assertThat(cardArea.calculate()).isEqualTo(new Score(totalScore)); } @ParameterizedTest(name = "[{index}] ACE 는 이전까지의 총합이 10 이하면 11로 계산한다") @MethodSource("containsAceCardArea") void ACE_는_이전까지의_총합이_10_이하면_11로_계산한다(final CardArea cardArea, final int totalScore) { // then - assertThat(cardArea.calculate()).isEqualTo(totalScore); + assertThat(cardArea.calculate()).isEqualTo(new Score(totalScore)); } static Stream containsAceCardArea() { From 4606281989408914fe07f726850c219ed19a4df6 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 15:08:17 +0900 Subject: [PATCH 47/60] =?UTF-8?q?feat=20:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20CardTable?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=95=8C=EB=A0=A4=EC=A4=80=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/java/domain/cardtable/CardTable.java | 33 ++++ .../java/domain/cardtable/CardTableTest.java | 146 +++++++++++++++++- 3 files changed, 179 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a11231f1b..51f4e7c2ef 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ ### 카드 테이블 - [x] `카드 영역`을 생성해준다. +- [x] `딜러`와 `참여자`의 승부 결과를 알려줄 수 있다. ### 점수 - [x] 21점을 초과하는지 확인한다. diff --git a/src/main/java/domain/cardtable/CardTable.java b/src/main/java/domain/cardtable/CardTable.java index 5808322fc3..8ba520e788 100644 --- a/src/main/java/domain/cardtable/CardTable.java +++ b/src/main/java/domain/cardtable/CardTable.java @@ -2,6 +2,14 @@ import domain.area.CardArea; import domain.deck.CardDeck; +import domain.player.dealer.Dealer; +import domain.player.participant.Participant; +import domain.player.participant.ParticipantResult; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; public class CardTable { @@ -18,4 +26,29 @@ public static CardTable readyToPlayBlackjack(final CardDeck cardDeck) { public CardArea createCardArea() { return new CardArea(cardDeck.draw(), cardDeck.draw()); } + + public Map determineWinner(final List participants, + final Dealer dealer) { + return participants.stream() + .collect(Collectors.toMap( + Function.identity(), + participant -> matchBetween(participant, dealer)) + ); + } + + private ParticipantResult matchBetween(final Participant participant, final Dealer dealer) { + if (participant.isBust()) { + return ParticipantResult.LOSER; + } + if (dealer.isBust()) { + return ParticipantResult.WINNER; + } + if (participant.score().isGreaterThan(dealer.score())) { + return ParticipantResult.WINNER; + } + if (participant.score().equals(dealer.score())) { + return ParticipantResult.DRAWER; + } + return ParticipantResult.LOSER; + } } diff --git a/src/test/java/domain/cardtable/CardTableTest.java b/src/test/java/domain/cardtable/CardTableTest.java index 857c9f163d..9bd9ee31c4 100644 --- a/src/test/java/domain/cardtable/CardTableTest.java +++ b/src/test/java/domain/cardtable/CardTableTest.java @@ -1,19 +1,55 @@ package domain.cardtable; import domain.area.CardArea; +import domain.card.Card; +import domain.card.CardShape; import domain.deck.CardDeck; +import domain.player.Name; +import domain.player.dealer.Dealer; +import domain.player.participant.Participant; +import domain.player.participant.ParticipantResult; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import static domain.card.CardShape.CLOVER; +import static domain.card.CardShape.DIAMOND; +import static domain.card.CardShape.HEART; +import static domain.card.CardShape.SPADE; +import static domain.card.CardValue.NINE; +import static domain.card.CardValue.TEN; +import static domain.player.participant.ParticipantResult.DRAWER; +import static domain.player.participant.ParticipantResult.LOSER; +import static domain.player.participant.ParticipantResult.WINNER; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; class CardTableTest { + CardArea participantCardArea; + + CardArea dealerCardArea; + + CardDeck cardDeck; + + @BeforeEach + void initCardArea() { + cardDeck = CardDeck.shuffledFullCardDeck(); + participantCardArea = new CardArea(new Card(CLOVER, TEN), new Card(CLOVER, NINE)); + dealerCardArea = new CardArea(new Card(DIAMOND, TEN), new Card(DIAMOND, NINE)); + } + @Test @DisplayName("createCardArea() : 각 player의 카드 영역을 생성해준다.") void test_dealCard() throws Exception { //given - final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); //when @@ -22,4 +58,112 @@ void test_dealCard() throws Exception { //then assertThat(cardArea.cards()).hasSize(2); } + + @Test + @DisplayName("matchBetween() : 참여자가 bust 일 경우에는 참여자가 무조건 게임에서 진다.") + void test_matchBetween_bust_participant_must_lose_participant() throws Exception { + //given + participantCardArea.addCard(new Card(SPADE, TEN)); + final Participant participant = new Participant(new Name("name"), participantCardArea); + final Dealer dealer = new Dealer(dealerCardArea); + + final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); + + //when + final Map gameResult = + cardTable.determineWinner(List.of(participant), dealer); + + //then + assertAll( + () -> assertThat(gameResult).hasSize(1), + () -> assertThat(gameResult).containsValue(LOSER) + ); + } + + @Test + @DisplayName("matchBetween() : 딜러는 bust 이면서 참여자가 bust 가 아니면 참여자가 무조건 게임에서 이긴다.") + void test_matchBetween_bust_dealer_must_lose_dealer() throws Exception { + //given + final Participant participant = new Participant(new Name("name"), participantCardArea); + final Dealer dealer = new Dealer(dealerCardArea); + dealerCardArea.addCard(new Card(SPADE, TEN)); + + final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); + + //when + final Map gameResult = + cardTable.determineWinner(List.of(participant), dealer); + + //then + assertAll( + () -> assertThat(gameResult).hasSize(1), + () -> assertThat(gameResult).containsValue(WINNER) + ); + } + + @ParameterizedTest + @MethodSource("makeBothNotBust") + @DisplayName("matchBetween() : 딜러, 참여자 모두 버스트가 아닐 때 점수가 높은 쪽이 이기고, 같으면 무승부이다.") + void test_matchBetween_not_bust_win_higher_score_or_draw_same_score( + final CardArea participantCardArea, final CardArea dealerCardArea, + final ParticipantResult participantResult) throws Exception { + + //given + final Participant participant = new Participant(new Name("name"), participantCardArea); + final Dealer dealer = new Dealer(dealerCardArea); + + final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); + + //when & then + final Map gameResult = cardTable.determineWinner( + List.of(participant), dealer); + + //then + assertAll( + () -> assertThat(gameResult).hasSize(1), + () -> assertThat(gameResult).containsValue(participantResult) + ); + } + + static Stream makeBothNotBust() { + + //무승부 + final CardArea participantDrawCardArea = new CardArea( + new Card(CardShape.SPADE, TEN), + new Card(CardShape.DIAMOND, TEN) + ); + + final CardArea dealerDrawCardArea = new CardArea( + new Card(HEART, TEN), + new Card(CLOVER, TEN) + ); + + //참여자가 이길 경우 + final CardArea participantWinCardArea = new CardArea( + new Card(CardShape.SPADE, TEN), + new Card(CardShape.DIAMOND, TEN) + ); + + final CardArea dealerLoseCardArea = new CardArea( + new Card(HEART, TEN), + new Card(CLOVER, NINE) + ); + + //딜러가 이길 경우 + final CardArea participantLoseCardArea = new CardArea( + new Card(CardShape.SPADE, TEN), + new Card(CardShape.DIAMOND, NINE) + ); + + final CardArea dealerWinCardArea = new CardArea( + new Card(HEART, TEN), + new Card(CLOVER, TEN) + ); + + return Stream.of( + Arguments.of(participantDrawCardArea, dealerDrawCardArea, DRAWER), + Arguments.of(participantWinCardArea, dealerLoseCardArea, WINNER), + Arguments.of(participantLoseCardArea, dealerWinCardArea, LOSER) + ); + } } From 76947c8f9b1a4145cfb70e2dfeac975ee647274a Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 15:10:21 +0900 Subject: [PATCH 48/60] =?UTF-8?q?refactor=20:=20=EB=B8=94=EB=9E=99?= =?UTF-8?q?=EC=9E=AD=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20?= =?UTF-8?q?CardTable=20=EB=A1=9C=20=EC=B1=85=EC=9E=84=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=EC=9E=84=ED=95=98=EB=A9=B4=EC=84=9C=20=EC=BD=94=EB=93=9C=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/controller/BlackJackController.java | 12 +-- .../player/participant/ParticipantResult.java | 17 --- .../participant/ParticipantResultTest.java | 101 ------------------ 3 files changed, 1 insertion(+), 129 deletions(-) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 70d046f53c..bcb0823a70 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.Map; -import java.util.function.Function; import java.util.stream.Collectors; import static java.util.stream.Collectors.counting; @@ -31,7 +30,7 @@ public void run() { hittingPlayer(cardDeck, participants, dealer); printStateAfterHittedCard(participants, dealer); - final Map playersResult = determineWinner(participants, dealer); + final Map playersResult = cardTable.determineWinner(participants, dealer); final Map scoreBoard = countDealerResult(playersResult); printPlayerScoreBoard(participants, playersResult, scoreBoard); @@ -69,15 +68,6 @@ private static Map countDealerResult( counting())); } - private static Map determineWinner(final List participants, - final Dealer dealer) { - return participants.stream() - .collect(Collectors.toMap( - Function.identity(), - participant -> ParticipantResult.matchBetween(participant, dealer)) - ); - } - private void hitForDealer(final CardDeck cardDeck, final Dealer dealer) { while (dealer.canHit()) { OutputView.dealerOneMoreCard(); diff --git a/src/main/java/domain/player/participant/ParticipantResult.java b/src/main/java/domain/player/participant/ParticipantResult.java index 2a40093ac5..5030bc07b3 100644 --- a/src/main/java/domain/player/participant/ParticipantResult.java +++ b/src/main/java/domain/player/participant/ParticipantResult.java @@ -1,6 +1,5 @@ package domain.player.participant; -import domain.player.dealer.Dealer; import domain.player.dealer.DealerResult; public enum ParticipantResult { @@ -8,22 +7,6 @@ public enum ParticipantResult { LOSER, DRAWER; - public static ParticipantResult matchBetween(final Participant participant, final Dealer dealer) { - if (participant.isBust()) { - return ParticipantResult.LOSER; - } - if (dealer.isBust()) { - return ParticipantResult.WINNER; - } - if (participant.score().isGreaterThan(dealer.score())) { - return ParticipantResult.WINNER; - } - if (participant.score().equals(dealer.score())) { - return ParticipantResult.DRAWER; - } - return ParticipantResult.LOSER; - } - public DealerResult convertToDealerResult() { if (this == WINNER) { return DealerResult.LOSER; diff --git a/src/test/java/domain/player/participant/ParticipantResultTest.java b/src/test/java/domain/player/participant/ParticipantResultTest.java index c6616afa7d..51d907ae18 100644 --- a/src/test/java/domain/player/participant/ParticipantResultTest.java +++ b/src/test/java/domain/player/participant/ParticipantResultTest.java @@ -2,30 +2,16 @@ import domain.area.CardArea; import domain.card.Card; -import domain.card.CardShape; -import domain.player.Name; -import domain.player.dealer.Dealer; import domain.player.dealer.DealerResult; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.stream.Stream; import static domain.card.CardShape.CLOVER; import static domain.card.CardShape.DIAMOND; -import static domain.card.CardShape.HEART; -import static domain.card.CardShape.SPADE; import static domain.card.CardValue.NINE; import static domain.card.CardValue.TEN; -import static domain.player.participant.ParticipantResult.DRAWER; -import static domain.player.participant.ParticipantResult.LOSER; -import static domain.player.participant.ParticipantResult.WINNER; -import static domain.player.participant.ParticipantResult.matchBetween; import static org.junit.jupiter.api.Assertions.assertEquals; @DisplayName("ParticipantResult 의") @@ -41,93 +27,6 @@ void initCardArea() { dealerCardArea = new CardArea(new Card(DIAMOND, TEN), new Card(DIAMOND, NINE)); } - @Test - @DisplayName("matchBetween() : 참여자가 bust 일 경우에는 참여자가 무조건 게임에서 진다.") - void test_matchBetween_bust_participant_must_lose_participant() throws Exception { - //given - participantCardArea.addCard(new Card(SPADE, TEN)); - final Participant participant = new Participant(new Name("name"), participantCardArea); - final Dealer dealer = new Dealer(dealerCardArea); - - //when - final ParticipantResult participantResult = matchBetween(participant, dealer); - - //then - assertEquals(LOSER, participantResult); - } - - @Test - @DisplayName("matchBetween() : 딜러는 bust 이면서 참여자가 bust 가 아니면 참여자가 무조건 게임에서 이긴다.") - void test_matchBetween_bust_dealer_must_lose_dealer() throws Exception { - //given - final Participant participant = new Participant(new Name("name"), participantCardArea); - final Dealer dealer = new Dealer(dealerCardArea); - dealerCardArea.addCard(new Card(SPADE, TEN)); - - //when - final ParticipantResult participantResult = matchBetween(participant, dealer); - - //then - assertEquals(WINNER, participantResult); - } - - @ParameterizedTest - @MethodSource("makeBothNotbust") - @DisplayName("matchBetween() : 딜러, 참여자 모두 버스트가 아닐 때 점수가 높은 쪽이 이기고, 같으면 무승부이다.") - void test_matchBetween_not_bust_win_higher_score_or_draw_same_score( - final CardArea participantCardArea, final CardArea dealerCardArea, - final ParticipantResult participantResult) throws Exception { - - //given - final Participant participant = new Participant(new Name("name"), participantCardArea); - final Dealer dealer = new Dealer(dealerCardArea); - - //when & then - assertEquals(ParticipantResult.matchBetween(participant, dealer), participantResult); - } - - static Stream makeBothNotbust() { - - //무승부 - final CardArea participantDrawCardArea = new CardArea( - new Card(CardShape.SPADE, TEN), - new Card(CardShape.DIAMOND, TEN) - ); - - final CardArea dealerDrawCardArea = new CardArea( - new Card(HEART, TEN), - new Card(CLOVER, TEN) - ); - - //참여자가 이길 경우 - final CardArea participantWinCardArea = new CardArea( - new Card(CardShape.SPADE, TEN), - new Card(CardShape.DIAMOND, TEN) - ); - - final CardArea dealerLoseCardArea = new CardArea( - new Card(HEART, TEN), - new Card(CLOVER, NINE) - ); - - //딜러가 이길 경우 - final CardArea participantLoseCardArea = new CardArea( - new Card(CardShape.SPADE, TEN), - new Card(CardShape.DIAMOND, NINE) - ); - - final CardArea dealerWinCardArea = new CardArea( - new Card(HEART, TEN), - new Card(CLOVER, TEN) - ); - - return Stream.of( - Arguments.of(participantDrawCardArea, dealerDrawCardArea, DRAWER), - Arguments.of(participantWinCardArea, dealerLoseCardArea, WINNER), - Arguments.of(participantLoseCardArea, dealerWinCardArea, LOSER) - ); - } - @ParameterizedTest @CsvSource(value = { "WINNER -> LOSER", From 8d60d6da1f802c05c923b6d525a52d0741b9c5e0 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 15:19:21 +0900 Subject: [PATCH 49/60] =?UTF-8?q?fix=20:=20=EC=A0=90=EC=88=98=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20getter=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=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/controller/BlackJackController.java | 1 - src/main/java/domain/Score.java | 4 ++++ src/main/java/view/OutputView.java | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index bcb0823a70..dd4d27bd65 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -100,6 +100,5 @@ private List dealParticipantsCards(final CardTable cardTable) { .map(Name::new) .map(name -> new Participant(name, cardTable.createCardArea())) .collect(Collectors.toList()); - } } diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index 0f51ca1c0c..2c32d4acb6 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -44,4 +44,8 @@ public boolean isLessEqualThan(final Score other) { public boolean isGreaterThan(final Score other) { return score > other.score; } + + public int value() { + return score; + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 15b3e43228..602bcf5bae 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -123,7 +123,7 @@ public static void showPlayerStateResult(final Player player) { .collect(Collectors.joining(DELIM, getPlayerName(player) + CARD_INFORMATION_FORMAT, String.format(" - 결과: %d", - player.cardArea().calculate()))); + player.cardArea().calculate().value()))); System.out.println(message); } From 254687ca131eb4999740d5008dff4052766452be Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 15:31:55 +0900 Subject: [PATCH 50/60] =?UTF-8?q?refactor=20:=20=EB=A7=A4=EC=A7=81?= =?UTF-8?q?=EB=84=98=EB=B2=84=20=EC=83=81=EC=88=98=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/domain/area/CardArea.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index 9dac9e745d..291095fb41 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -8,6 +8,9 @@ public class CardArea { + private static final int REMAIN_SCORE_ACE = 10; + private static final int ADD_ACE_BUST_OR_NOT = 11; + private final List cards = new ArrayList<>(); public CardArea(final Card firstCard, final Card secondCard) { @@ -27,8 +30,8 @@ public Score calculate() { int totalValue = sumTotalCardValue(); while (aceCount > 0) { - if (totalValue <= 11) { - totalValue += 10; + if (totalValue <= ADD_ACE_BUST_OR_NOT) { + totalValue += REMAIN_SCORE_ACE; } aceCount--; } From 4b3dbd1579f707b938a6f43cab1202f12a7d7113 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 15:57:56 +0900 Subject: [PATCH 51/60] =?UTF-8?q?refactor=20:=20=EA=B0=92=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EC=9D=98=20=EB=B3=80=EC=88=98=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20value=20=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/domain/Score.java | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index 2c32d4acb6..cd74277ec6 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -6,10 +6,10 @@ public class Score { private static final int UPPER_LIMIT_SCORE = 21; - private final int score; + private final int value; - public Score(final int score) { - this.score = score; + public Score(final int value) { + this.value = value; } @Override @@ -17,35 +17,35 @@ public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final Score score1 = (Score) o; - return score == score1.score; + return value == score1.value; } @Override public int hashCode() { - return Objects.hash(score); + return Objects.hash(value); } public boolean isLessThan(final Score other) { - return score < other.score; + return value < other.value; } public boolean isBust() { - return score > UPPER_LIMIT_SCORE; + return value > UPPER_LIMIT_SCORE; } public boolean canMoreCard() { - return score < UPPER_LIMIT_SCORE; + return value < UPPER_LIMIT_SCORE; } public boolean isLessEqualThan(final Score other) { - return score <= other.score; + return value <= other.value; } public boolean isGreaterThan(final Score other) { - return score > other.score; + return value > other.value; } public int value() { - return score; + return value; } } From d0e0387660202a03740623a12072632e9222aa8c Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 16:35:04 +0900 Subject: [PATCH 52/60] =?UTF-8?q?refactor=20:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=82=98=EB=88=A0=EC=A3=BC=EB=8A=94=20=ED=96=89=EC=9C=84?= =?UTF-8?q?=EB=A5=BC=20Controller=EC=97=90=EC=84=9C=20=ED=95=98=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EA=B3=A0=20CardTable=EB=A1=9C=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 도메인 룰은 Participant 1장 -> Dealer 1장 -> Participant 1 -> Dealer 1장 임 - 현재 코드는 Participant 2장 한번에 주고 -> Dealer 2장 한번에 주기 때문에 도메인 룰 위반 - 카드 나눠주는 행위도 도메인 룰이기 때문에 CardTable에 위임 - CardArea 생성자를 삭제하고 나서의 코드 수정 --- src/main/java/domain/area/CardArea.java | 4 - src/main/java/domain/cardtable/CardTable.java | 9 +- src/main/java/domain/player/Player.java | 4 +- .../java/domain/player/dealer/Dealer.java | 4 +- .../player/participant/Participant.java | 5 +- src/test/java/domain/area/CardAreaTest.java | 85 ++++++++------ .../java/domain/cardtable/CardTableTest.java | 107 ++++++++---------- src/test/java/domain/player/PlayerTest.java | 14 +-- .../java/domain/player/dealer/DealerTest.java | 29 ++--- .../participant/ParticipantResultTest.java | 17 --- .../player/participant/ParticipantTest.java | 23 ++-- 11 files changed, 134 insertions(+), 167 deletions(-) diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index 291095fb41..740d5e1448 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -13,10 +13,6 @@ public class CardArea { private final List cards = new ArrayList<>(); - public CardArea(final Card firstCard, final Card secondCard) { - cards.addAll(List.of(firstCard, secondCard)); - } - public List cards() { return new ArrayList<>(cards); } diff --git a/src/main/java/domain/cardtable/CardTable.java b/src/main/java/domain/cardtable/CardTable.java index 8ba520e788..a85d6edfb7 100644 --- a/src/main/java/domain/cardtable/CardTable.java +++ b/src/main/java/domain/cardtable/CardTable.java @@ -2,6 +2,7 @@ import domain.area.CardArea; import domain.deck.CardDeck; +import domain.player.Player; import domain.player.dealer.Dealer; import domain.player.participant.Participant; import domain.player.participant.ParticipantResult; @@ -23,10 +24,6 @@ public static CardTable readyToPlayBlackjack(final CardDeck cardDeck) { return new CardTable(cardDeck); } - public CardArea createCardArea() { - return new CardArea(cardDeck.draw(), cardDeck.draw()); - } - public Map determineWinner(final List participants, final Dealer dealer) { return participants.stream() @@ -51,4 +48,8 @@ private ParticipantResult matchBetween(final Participant participant, final Deal } return ParticipantResult.LOSER; } + + public void dealCardTo(Player player) { + player.hit(cardDeck.draw()); + } } diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index 75bcf60415..d9c6677733 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -9,9 +9,9 @@ public abstract class Player { private final Name name; protected final CardArea cardArea; - protected Player(final Name name, final CardArea cardArea) { + protected Player(final Name name) { this.name = name; - this.cardArea = cardArea; + cardArea = new CardArea(); } public Name name() { diff --git a/src/main/java/domain/player/dealer/Dealer.java b/src/main/java/domain/player/dealer/Dealer.java index 0bc17fbd27..a76e8e9ad3 100644 --- a/src/main/java/domain/player/dealer/Dealer.java +++ b/src/main/java/domain/player/dealer/Dealer.java @@ -11,8 +11,8 @@ public class Dealer extends Player { private static final int DEALER_LIMIT_SCORE = 16; private static final String DEALER_NAME = "딜러"; - public Dealer(final CardArea cardArea) { - super(new Name(DEALER_NAME), cardArea); + public Dealer() { + super(new Name(DEALER_NAME)); } @Override diff --git a/src/main/java/domain/player/participant/Participant.java b/src/main/java/domain/player/participant/Participant.java index ff371082fa..1af8f1dcd1 100644 --- a/src/main/java/domain/player/participant/Participant.java +++ b/src/main/java/domain/player/participant/Participant.java @@ -1,13 +1,12 @@ package domain.player.participant; -import domain.area.CardArea; import domain.player.Name; import domain.player.Player; public class Participant extends Player { - public Participant(final Name name, final CardArea cardArea) { - super(name, cardArea); + public Participant(final Name name) { + super(name); } @Override diff --git a/src/test/java/domain/area/CardAreaTest.java b/src/test/java/domain/area/CardAreaTest.java index ab78bbd5f0..87aa325cb1 100644 --- a/src/test/java/domain/area/CardAreaTest.java +++ b/src/test/java/domain/area/CardAreaTest.java @@ -22,10 +22,8 @@ import static domain.card.CardValue.SIX; import static domain.card.CardValue.TEN; import static domain.card.CardValue.THREE; -import static domain.card.CardValue.TWO; import static domain.card.CardValue.valueOf; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -35,22 +33,10 @@ @DisplayName("CardArea 은") class CardAreaTest { - @Test - void 카드를_두장만_받아서_생성된다() { - // when & then - assertDoesNotThrow(() -> new CardArea( - new Card(CardShape.CLOVER, ACE), - new Card(CardShape.CLOVER, TWO)) - ); - } - @Test void 카드를_추가할_수_있다() { // given - final CardArea cardArea = new CardArea( - new Card(CardShape.CLOVER, THREE), - new Card(CardShape.CLOVER, TWO) - ); + final CardArea cardArea = new CardArea(); // when final int beforeSize = cardArea.cards().size(); @@ -70,10 +56,14 @@ class CardAreaTest { void 자신이_가진_카드의_합을_구할_수_있다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, valueOf(split[0])), - new Card(CardShape.CLOVER, valueOf(split[1]))); - // when & then + final CardArea cardArea = new CardArea(); + + // when + cardArea.addCard(new Card(CardShape.CLOVER, valueOf(split[0]))); + cardArea.addCard(new Card(CardShape.CLOVER, valueOf(split[1]))); + + // then assertThat(cardArea.calculate()).isEqualTo(new Score(totalScore)); } @@ -89,8 +79,10 @@ class CardAreaTest { void 킹_퀸_잭은_10으로_계산한다(final String values, final int totalScore) { // given final String[] split = values.split("\\+"); - final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, valueOf(split[0])), - new Card(CardShape.CLOVER, valueOf(split[1]))); + final CardArea cardArea = new CardArea(); + + cardArea.addCard(new Card(CardShape.CLOVER, valueOf(split[0]))); + cardArea.addCard(new Card(CardShape.CLOVER, valueOf(split[1]))); // when & then assertThat(cardArea.calculate()).isEqualTo(new Score(totalScore)); @@ -106,25 +98,41 @@ class CardAreaTest { static Stream containsAceCardArea() { // 10 + [11] = 21 - final CardArea cardArea1 = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + final CardArea cardArea1 = new CardArea(); + cardArea1.addCard(new Card(CardShape.CLOVER, TEN)); + cardArea1.addCard(new Card(CardShape.CLOVER, ACE)); // 10 + 10 + [1] = 21 - final CardArea cardArea2 = new CardArea(new Card(CardShape.CLOVER, JACK), new Card(CardShape.CLOVER, TEN)); + final CardArea cardArea2 = new CardArea(); + cardArea2.addCard(new Card(CardShape.CLOVER, JACK)); + cardArea2.addCard(new Card(CardShape.CLOVER, TEN)); + cardArea2.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 9 + [1] = 21 - final CardArea cardArea3 = new CardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, NINE)); + final CardArea cardArea3 = new CardArea(); + cardArea3.addCard(new Card(CardShape.CLOVER, ACE)); + cardArea3.addCard(new Card(CardShape.CLOVER, NINE)); + cardArea3.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 6 + 3 = 20 - final CardArea cardArea4 = new CardArea(new Card(CardShape.CLOVER, SIX), new Card(CardShape.CLOVER, THREE)); + final CardArea cardArea4 = new CardArea(); + cardArea4.addCard(new Card(CardShape.CLOVER, SIX)); + cardArea4.addCard(new Card(CardShape.CLOVER, THREE)); + cardArea4.addCard(new Card(CardShape.CLOVER, ACE)); // [11] + 10 = 21 - final CardArea cardArea5 = new CardArea(new Card(CardShape.CLOVER, ACE), new Card(CardShape.CLOVER, TEN)); + final CardArea cardArea5 = new CardArea(); + cardArea5.addCard(new Card(CardShape.CLOVER, ACE)); + cardArea5.addCard(new Card(CardShape.CLOVER, TEN)); // 10 + [1] + 7 = 18 - final CardArea cardArea6 = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + final CardArea cardArea6 = new CardArea(); + cardArea6.addCard(new Card(CardShape.CLOVER, TEN)); + cardArea6.addCard(new Card(CardShape.CLOVER, ACE)); + cardArea6.addCard(new Card(CardShape.SPADE, SEVEN)); return Stream.of( @@ -140,7 +148,9 @@ static Stream containsAceCardArea() { @Test void 총합이_20_이하면_카드를_더_받을_수_있는_상태이다() { // given - final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, TEN)); + final CardArea cardArea = new CardArea(); + cardArea.addCard(new Card(CardShape.CLOVER, TEN)); + cardArea.addCard(new Card(CardShape.CLOVER, TEN)); // when & then assertTrue(cardArea.canMoreCard()); @@ -149,7 +159,9 @@ static Stream containsAceCardArea() { @Test void 총합이_21_이상이면_카드를_더_받을_수_없는_상태이다() { // given - final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + final CardArea cardArea = new CardArea(); + cardArea.addCard(new Card(CardShape.CLOVER, ACE)); + cardArea.addCard(new Card(CardShape.SPADE, TEN)); // when & then assertFalse(cardArea.canMoreCard()); @@ -158,7 +170,10 @@ static Stream containsAceCardArea() { @Test void 총합이_21_초과이면_버스트_된다() { // given - final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, TEN)); + final CardArea cardArea = new CardArea(); + cardArea.addCard(new Card(CardShape.CLOVER, TEN)); + cardArea.addCard(new Card(CardShape.SPADE, TEN)); + cardArea.addCard(new Card(CardShape.DIAMOND, TEN)); // when & then @@ -168,7 +183,9 @@ static Stream containsAceCardArea() { @Test void 총합이_21_이하이면_버스트_아니다() { // given - final CardArea cardArea = new CardArea(new Card(CardShape.CLOVER, TEN), new Card(CardShape.CLOVER, ACE)); + final CardArea cardArea = new CardArea(); + cardArea.addCard(new Card(CardShape.CLOVER, TEN)); + cardArea.addCard(new Card(CardShape.CLOVER, ACE)); // when & then assertFalse(cardArea.isBust()); @@ -177,10 +194,10 @@ static Stream containsAceCardArea() { @Test void 딜러는_첫_장만_보여줄_수_있다() { // given - final CardArea cardArea = new CardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN) - ); + final CardArea cardArea = new CardArea(); + + cardArea.addCard(new Card(CardShape.CLOVER, TEN)); + cardArea.addCard(new Card(CardShape.CLOVER, SEVEN)); // when & then assertEquals(cardArea.firstCard(), new Card(CardShape.CLOVER, TEN)); diff --git a/src/test/java/domain/cardtable/CardTableTest.java b/src/test/java/domain/cardtable/CardTableTest.java index 9bd9ee31c4..9606e04839 100644 --- a/src/test/java/domain/cardtable/CardTableTest.java +++ b/src/test/java/domain/cardtable/CardTableTest.java @@ -1,6 +1,5 @@ package domain.cardtable; -import domain.area.CardArea; import domain.card.Card; import domain.card.CardShape; import domain.deck.CardDeck; @@ -33,41 +32,33 @@ class CardTableTest { - CardArea participantCardArea; + Participant participant; - CardArea dealerCardArea; + Dealer dealer; CardDeck cardDeck; + CardTable cardTable; + @BeforeEach void initCardArea() { cardDeck = CardDeck.shuffledFullCardDeck(); - participantCardArea = new CardArea(new Card(CLOVER, TEN), new Card(CLOVER, NINE)); - dealerCardArea = new CardArea(new Card(DIAMOND, TEN), new Card(DIAMOND, NINE)); - } - - @Test - @DisplayName("createCardArea() : 각 player의 카드 영역을 생성해준다.") - void test_dealCard() throws Exception { - //given - final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); + cardTable = CardTable.readyToPlayBlackjack(cardDeck); - //when - final CardArea cardArea = cardTable.createCardArea(); + participant = new Participant(new Name("name")); + participant.hit(new Card(CLOVER, TEN)); + participant.hit(new Card(CLOVER, NINE)); - //then - assertThat(cardArea.cards()).hasSize(2); + dealer = new Dealer(); + dealer.hit(new Card(DIAMOND, TEN)); + dealer.hit(new Card(DIAMOND, NINE)); } @Test @DisplayName("matchBetween() : 참여자가 bust 일 경우에는 참여자가 무조건 게임에서 진다.") void test_matchBetween_bust_participant_must_lose_participant() throws Exception { //given - participantCardArea.addCard(new Card(SPADE, TEN)); - final Participant participant = new Participant(new Name("name"), participantCardArea); - final Dealer dealer = new Dealer(dealerCardArea); - - final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); + participant.hit(new Card(SPADE, TEN)); //when final Map gameResult = @@ -84,11 +75,7 @@ void test_matchBetween_bust_participant_must_lose_participant() throws Exception @DisplayName("matchBetween() : 딜러는 bust 이면서 참여자가 bust 가 아니면 참여자가 무조건 게임에서 이긴다.") void test_matchBetween_bust_dealer_must_lose_dealer() throws Exception { //given - final Participant participant = new Participant(new Name("name"), participantCardArea); - final Dealer dealer = new Dealer(dealerCardArea); - dealerCardArea.addCard(new Card(SPADE, TEN)); - - final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); + dealer.hit(new Card(SPADE, TEN)); //when final Map gameResult = @@ -105,15 +92,9 @@ void test_matchBetween_bust_dealer_must_lose_dealer() throws Exception { @MethodSource("makeBothNotBust") @DisplayName("matchBetween() : 딜러, 참여자 모두 버스트가 아닐 때 점수가 높은 쪽이 이기고, 같으면 무승부이다.") void test_matchBetween_not_bust_win_higher_score_or_draw_same_score( - final CardArea participantCardArea, final CardArea dealerCardArea, + final Participant participant, final Dealer dealer, final ParticipantResult participantResult) throws Exception { - //given - final Participant participant = new Participant(new Name("name"), participantCardArea); - final Dealer dealer = new Dealer(dealerCardArea); - - final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); - //when & then final Map gameResult = cardTable.determineWinner( List.of(participant), dealer); @@ -128,42 +109,48 @@ void test_matchBetween_not_bust_win_higher_score_or_draw_same_score( static Stream makeBothNotBust() { //무승부 - final CardArea participantDrawCardArea = new CardArea( - new Card(CardShape.SPADE, TEN), - new Card(CardShape.DIAMOND, TEN) - ); + final Participant participant1 = new Participant(new Name("name1")); + participant1.hit(new Card(CardShape.DIAMOND, TEN)); + participant1.hit(new Card(CardShape.SPADE, TEN)); - final CardArea dealerDrawCardArea = new CardArea( - new Card(HEART, TEN), - new Card(CLOVER, TEN) - ); + final Dealer dealer1 = new Dealer(); + dealer1.hit(new Card(HEART, TEN)); + dealer1.hit(new Card(CLOVER, TEN)); //참여자가 이길 경우 - final CardArea participantWinCardArea = new CardArea( - new Card(CardShape.SPADE, TEN), - new Card(CardShape.DIAMOND, TEN) - ); + final Participant participant2 = new Participant(new Name("name2")); + participant2.hit(new Card(CardShape.SPADE, TEN)); + participant2.hit(new Card(CardShape.DIAMOND, TEN)); - final CardArea dealerLoseCardArea = new CardArea( - new Card(HEART, TEN), - new Card(CLOVER, NINE) - ); + final Dealer dealer2 = new Dealer(); + dealer2.hit(new Card(HEART, TEN)); + dealer2.hit(new Card(CLOVER, NINE)); //딜러가 이길 경우 - final CardArea participantLoseCardArea = new CardArea( - new Card(CardShape.SPADE, TEN), - new Card(CardShape.DIAMOND, NINE) - ); + final Participant participant3 = new Participant(new Name("name3")); + participant3.hit(new Card(CardShape.SPADE, TEN)); + participant3.hit(new Card(CardShape.DIAMOND, NINE)); - final CardArea dealerWinCardArea = new CardArea( - new Card(HEART, TEN), - new Card(CLOVER, TEN) - ); + final Dealer dealer3 = new Dealer(); + dealer3.hit(new Card(HEART, TEN)); + dealer3.hit(new Card(CLOVER, TEN)); return Stream.of( - Arguments.of(participantDrawCardArea, dealerDrawCardArea, DRAWER), - Arguments.of(participantWinCardArea, dealerLoseCardArea, WINNER), - Arguments.of(participantLoseCardArea, dealerWinCardArea, LOSER) + Arguments.of(participant1, dealer1, DRAWER), + Arguments.of(participant2, dealer2, WINNER), + Arguments.of(participant3, dealer3, LOSER) ); } + + @Test + @DisplayName("dealCardTo() : Player에게 카드를 나눠줄 수 있다.") + void test_dealCardTo() throws Exception { + //when + cardTable.dealCardTo(participant); + cardTable.dealCardTo(dealer); + + //then + assertThat(participant.cardArea().cards()).hasSize(3); + assertThat(dealer.cardArea().cards()).hasSize(3); + } } diff --git a/src/test/java/domain/player/PlayerTest.java b/src/test/java/domain/player/PlayerTest.java index ccf0d6765f..87e861044b 100644 --- a/src/test/java/domain/player/PlayerTest.java +++ b/src/test/java/domain/player/PlayerTest.java @@ -1,9 +1,7 @@ package domain.player; -import domain.area.CardArea; import domain.card.Card; import domain.card.CardShape; -import domain.card.CardValue; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -20,11 +18,7 @@ class PlayerTest { final Name name = new Name("name"); - final CardArea cardArea = new CardArea( - new Card(CardShape.SPADE, CardValue.TEN), - new Card(CardShape.SPADE, CardValue.TEN)); - - final Player player = new Player(name, cardArea) { + final Player player = new Player(name) { @Override public boolean canHit() { return false; @@ -40,7 +34,7 @@ public boolean canHit() { @Test void 이름과_area_가진다() { // when & then - assertDoesNotThrow(() -> new Player(name, cardArea) { + assertDoesNotThrow(() -> new Player(name) { @Override public boolean canHit() { return false; @@ -51,10 +45,10 @@ public boolean canHit() { @Test void 카드를_추가할_수_있다() { // when - final int beforeSize = cardArea.cards().size(); + final int beforeSize = player.cardArea().cards().size(); player.hit(new Card(CardShape.SPADE, TEN)); // then - assertThat(cardArea.cards().size()).isEqualTo(beforeSize + 1); + assertThat(player.cardArea.cards()).hasSize(beforeSize + 1); } } diff --git a/src/test/java/domain/player/dealer/DealerTest.java b/src/test/java/domain/player/dealer/DealerTest.java index dbe7d7344f..c59bfe5ffd 100644 --- a/src/test/java/domain/player/dealer/DealerTest.java +++ b/src/test/java/domain/player/dealer/DealerTest.java @@ -1,9 +1,7 @@ package domain.player.dealer; -import domain.area.CardArea; import domain.card.Card; import domain.card.CardShape; -import domain.player.Player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -24,12 +22,10 @@ class DealerTest { @Test void 딜러는_16이하면_카드를_더_받을_수_있다() { // given - final CardArea cardArea = new CardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SIX) - ); + final Dealer dealer = new Dealer(); - final Player dealer = new Dealer(cardArea); + dealer.hit(new Card(CardShape.CLOVER, SIX)); + dealer.hit(new Card(CardShape.SPADE, TEN)); // when & then assertTrue(dealer.canHit()); @@ -38,12 +34,10 @@ class DealerTest { @Test void 딜러는_16초과면_카드를_더_받을_수_없다() { // given - final CardArea cardArea = new CardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN) - ); + final Dealer dealer = new Dealer(); - final Player dealer = new Dealer(cardArea); + dealer.hit(new Card(CardShape.CLOVER, SEVEN)); + dealer.hit(new Card(CardShape.SPADE, TEN)); // when & then assertFalse(dealer.canHit()); @@ -53,15 +47,12 @@ class DealerTest { @DisplayName("faceUpFirstCard() : 딜러는 첫 번째 카드만을 보여줍니다.") void test_faceUpFirstCard() throws Exception { //given - final CardArea cardArea = new CardArea( - new Card(CardShape.CLOVER, TEN), - new Card(CardShape.CLOVER, SEVEN) - ); + final Dealer dealer = new Dealer(); - //when - final Dealer dealer = new Dealer(cardArea); + dealer.hit(new Card(CardShape.CLOVER, TEN)); + dealer.hit(new Card(CardShape.CLOVER, SEVEN)); - //then + // when & then assertEquals(dealer.faceUpFirstCard(), new Card(CardShape.CLOVER, TEN)); } } diff --git a/src/test/java/domain/player/participant/ParticipantResultTest.java b/src/test/java/domain/player/participant/ParticipantResultTest.java index 51d907ae18..70dd85bae7 100644 --- a/src/test/java/domain/player/participant/ParticipantResultTest.java +++ b/src/test/java/domain/player/participant/ParticipantResultTest.java @@ -1,32 +1,15 @@ package domain.player.participant; -import domain.area.CardArea; -import domain.card.Card; import domain.player.dealer.DealerResult; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import static domain.card.CardShape.CLOVER; -import static domain.card.CardShape.DIAMOND; -import static domain.card.CardValue.NINE; -import static domain.card.CardValue.TEN; import static org.junit.jupiter.api.Assertions.assertEquals; @DisplayName("ParticipantResult 의") class ParticipantResultTest { - CardArea participantCardArea; - - CardArea dealerCardArea; - - @BeforeEach - void initCardArea() { - participantCardArea = new CardArea(new Card(CLOVER, TEN), new Card(CLOVER, NINE)); - dealerCardArea = new CardArea(new Card(DIAMOND, TEN), new Card(DIAMOND, NINE)); - } - @ParameterizedTest @CsvSource(value = { "WINNER -> LOSER", diff --git a/src/test/java/domain/player/participant/ParticipantTest.java b/src/test/java/domain/player/participant/ParticipantTest.java index 1615567764..6bee5e68f3 100644 --- a/src/test/java/domain/player/participant/ParticipantTest.java +++ b/src/test/java/domain/player/participant/ParticipantTest.java @@ -1,8 +1,8 @@ package domain.player.participant; -import domain.area.CardArea; import domain.card.Card; import domain.player.Name; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -16,17 +16,17 @@ @DisplayName("Participant 은") class ParticipantTest { - final CardArea cardArea = new CardArea( - new Card(CLOVER, TEN), - new Card(SPADE, TEN) - ); + final Participant participant = new Participant(new Name("name")); + + @BeforeEach + void makeCardScoreTwenty() { + participant.hit(new Card(CLOVER, TEN)); + participant.hit(new Card(SPADE, TEN)); + } @Test @DisplayName("canHit() : 참여자는 21점 미만일 경우 카드를 더 받을 수 있다.") void test_canHit_underScore21() { - // given - final Participant participant = new Participant(new Name("player1"), cardArea); - // when & then assertTrue(participant.canHit()); } @@ -34,11 +34,10 @@ void test_canHit_underScore21() { @Test @DisplayName("canHit() : 참여자는 21점 이상일 경우 카드를 더 받을 수 없다.") void test_canHit_overScore21() { - // given - final Participant participant = new Participant(new Name("player1"), cardArea); - cardArea.addCard(new Card(CLOVER, ACE)); + // when + participant.hit(new Card(CLOVER, ACE)); - // when & then + // then assertFalse(participant.canHit()); } } From be60c82cb158b3a96f2a626cf177f0e7b04ee1d7 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 18:00:38 +0900 Subject: [PATCH 53/60] =?UTF-8?q?refactor=20:=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EB=82=98=EB=88=A0=EC=A4=84=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EC=9C=BC=EB=A9=B4=20true=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/domain/cardtable/CardTable.java | 8 ++++++-- .../java/domain/cardtable/CardTableTest.java | 16 +++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/domain/cardtable/CardTable.java b/src/main/java/domain/cardtable/CardTable.java index a85d6edfb7..cfa4a677ef 100644 --- a/src/main/java/domain/cardtable/CardTable.java +++ b/src/main/java/domain/cardtable/CardTable.java @@ -49,7 +49,11 @@ private ParticipantResult matchBetween(final Participant participant, final Deal return ParticipantResult.LOSER; } - public void dealCardTo(Player player) { - player.hit(cardDeck.draw()); + public boolean dealCardTo(Player player) { + if (player.canHit()) { + player.hit(cardDeck.draw()); + return true; + } + return false; } } diff --git a/src/test/java/domain/cardtable/CardTableTest.java b/src/test/java/domain/cardtable/CardTableTest.java index 9606e04839..c1861c1824 100644 --- a/src/test/java/domain/cardtable/CardTableTest.java +++ b/src/test/java/domain/cardtable/CardTableTest.java @@ -29,6 +29,8 @@ import static domain.player.participant.ParticipantResult.WINNER; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; class CardTableTest { @@ -145,12 +147,12 @@ static Stream makeBothNotBust() { @Test @DisplayName("dealCardTo() : Player에게 카드를 나눠줄 수 있다.") void test_dealCardTo() throws Exception { - //when - cardTable.dealCardTo(participant); - cardTable.dealCardTo(dealer); - - //then - assertThat(participant.cardArea().cards()).hasSize(3); - assertThat(dealer.cardArea().cards()).hasSize(3); + //when & then + assertAll( + () -> assertTrue(cardTable.dealCardTo(participant)), + () -> assertFalse(cardTable.dealCardTo(dealer)), + () -> assertThat(participant.cardArea().cards()).hasSize(3), + () -> assertThat(dealer.cardArea().cards()).hasSize(2) + ); } } From f53acf336434f1d681be49eaeefa3642a5e890ce Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 18:09:45 +0900 Subject: [PATCH 54/60] =?UTF-8?q?refactor=20:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=82=98=EB=88=A0=EC=A3=BC=EB=8A=94=20=ED=96=89=EC=9C=84?= =?UTF-8?q?=EB=A5=BC=20CardTable=20=EC=97=90=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackJackController.java | 88 ++++++++++++------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index dd4d27bd65..6e60a1a437 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -3,6 +3,7 @@ import domain.cardtable.CardTable; import domain.deck.CardDeck; import domain.player.Name; +import domain.player.Player; import domain.player.dealer.Dealer; import domain.player.dealer.DealerResult; import domain.player.participant.Participant; @@ -10,6 +11,7 @@ import view.InputView; import view.OutputView; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -23,17 +25,48 @@ public void run() { final CardDeck cardDeck = CardDeck.shuffledFullCardDeck(); final CardTable cardTable = CardTable.readyToPlayBlackjack(cardDeck); - final List participants = dealParticipantsCards(cardTable); - final Dealer dealer = dealDealerCards(cardTable); + final List participants = createParticipants(); + final Dealer dealer = createDealer(); + final List players = createPlayers(participants, dealer); - printStateAfterDealtCard(participants, dealer); - hittingPlayer(cardDeck, participants, dealer); - printStateAfterHittedCard(participants, dealer); + deal(cardTable, players); - final Map playersResult = cardTable.determineWinner(participants, dealer); - final Map scoreBoard = countDealerResult(playersResult); + printStateAfterDeal(participants, dealer); + hittingPlayer(cardTable, participants, dealer); + printStateAfterHit(participants, dealer); - printPlayerScoreBoard(participants, playersResult, scoreBoard); + final Map participantsResult = cardTable.determineWinner(participants, dealer); + final Map scoreBoard = countDealerResult(participantsResult); + + printPlayerScoreBoard(participants, participantsResult, scoreBoard); + } + + private static List createPlayers(final List participants, final Dealer dealer) { + List players = new ArrayList<>(participants); + players.add(dealer); + + return players; + } + + private static void deal(final CardTable cardTable, final List players) { + dealCard(cardTable, players); + dealCard(cardTable, players); + } + + private static void dealCard(final CardTable cardTable, final List players) { + players.forEach(cardTable::dealCardTo); + } + + private static Dealer createDealer() { + return new Dealer(); + } + + private static List createParticipants() { + return InputView.readParticipantsName() + .stream() + .map(Name::new) + .map(Participant::new) + .collect(Collectors.toList()); } private static void printPlayerScoreBoard(final List participants, @@ -43,17 +76,17 @@ private static void printPlayerScoreBoard(final List participants, OutputView.showParticipantsScoreBoard(playersResult, participants); } - private static void printStateAfterHittedCard(final List participants, final Dealer dealer) { + private static void printStateAfterHit(final List participants, final Dealer dealer) { OutputView.showPlayerStateResult(dealer); OutputView.showParticipantsStateResult(participants); } - private void hittingPlayer(final CardDeck cardDeck, final List participants, final Dealer dealer) { - hitForParticipants(cardDeck, participants); - hitForDealer(cardDeck, dealer); + private void hittingPlayer(final CardTable cardTable, final List participants, final Dealer dealer) { + hitForParticipants(cardTable, participants); + hitForDealer(cardTable, dealer); } - private static void printStateAfterDealtCard(final List participants, final Dealer dealer) { + private static void printStateAfterDeal(final List participants, final Dealer dealer) { OutputView.showDealtCardTo(participants); OutputView.showStateOf(dealer); OutputView.showStateOf(participants); @@ -68,20 +101,19 @@ private static Map countDealerResult( counting())); } - private void hitForDealer(final CardDeck cardDeck, final Dealer dealer) { - while (dealer.canHit()) { + private void hitForDealer(final CardTable cardTable, final Dealer dealer) { + do { OutputView.dealerOneMoreCard(); - dealer.hit(cardDeck.draw()); - } + } while (cardTable.dealCardTo(dealer)); } - private void hitForParticipants(final CardDeck cardDeck, final List participants) { - participants.forEach(participant -> hitForParticipant(cardDeck, participant)); + private void hitForParticipants(final CardTable cardTable, final List participants) { + participants.forEach(participant -> hitForParticipant(cardTable, participant)); } - private void hitForParticipant(final CardDeck cardDeck, final Participant participant) { - while (participant.canHit() && inputHitOrStay(participant)) { - participant.hit(cardDeck.draw()); + private void hitForParticipant(final CardTable cardTable, final Participant participant) { + while (inputHitOrStay(participant)) { + cardTable.dealCardTo(participant); OutputView.showStateOf(participant); } } @@ -89,16 +121,4 @@ private void hitForParticipant(final CardDeck cardDeck, final Participant partic private boolean inputHitOrStay(final Participant participant) { return InputView.readMoreCard(participant).equals("y"); } - - private Dealer dealDealerCards(final CardTable cardTable) { - return new Dealer(cardTable.createCardArea()); - } - - private List dealParticipantsCards(final CardTable cardTable) { - return InputView.readParticipantsName() - .stream() - .map(Name::new) - .map(name -> new Participant(name, cardTable.createCardArea())) - .collect(Collectors.toList()); - } } From 60bb6ec7d40f4bdf365e8b5f36bbd15debeb398e Mon Sep 17 00:00:00 2001 From: java-saeng Date: Mon, 6 Mar 2023 18:35:52 +0900 Subject: [PATCH 55/60] =?UTF-8?q?style=20:=20=EC=A0=9C=EC=B6=9C=20?= =?UTF-8?q?=EC=A0=84=20reformatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackJackController.java | 10 +++++----- src/main/java/domain/Score.java | 4 ++-- src/main/java/domain/cardtable/CardTable.java | 3 +-- src/main/java/domain/player/Player.java | 2 +- src/main/java/domain/player/dealer/Dealer.java | 1 - src/main/java/view/InputView.java | 5 +++-- src/test/java/domain/card/CardTest.java | 2 +- 7 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 6e60a1a437..077745658a 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -81,11 +81,6 @@ private static void printStateAfterHit(final List participants, fin OutputView.showParticipantsStateResult(participants); } - private void hittingPlayer(final CardTable cardTable, final List participants, final Dealer dealer) { - hitForParticipants(cardTable, participants); - hitForDealer(cardTable, dealer); - } - private static void printStateAfterDeal(final List participants, final Dealer dealer) { OutputView.showDealtCardTo(participants); OutputView.showStateOf(dealer); @@ -101,6 +96,11 @@ private static Map countDealerResult( counting())); } + private void hittingPlayer(final CardTable cardTable, final List participants, final Dealer dealer) { + hitForParticipants(cardTable, participants); + hitForDealer(cardTable, dealer); + } + private void hitForDealer(final CardTable cardTable, final Dealer dealer) { do { OutputView.dealerOneMoreCard(); diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index cd74277ec6..f1c1da64d5 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -16,8 +16,8 @@ public Score(final int value) { public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - final Score score1 = (Score) o; - return value == score1.value; + final Score score = (Score) o; + return value == score.value; } @Override diff --git a/src/main/java/domain/cardtable/CardTable.java b/src/main/java/domain/cardtable/CardTable.java index cfa4a677ef..8f02a9dd76 100644 --- a/src/main/java/domain/cardtable/CardTable.java +++ b/src/main/java/domain/cardtable/CardTable.java @@ -1,6 +1,5 @@ package domain.cardtable; -import domain.area.CardArea; import domain.deck.CardDeck; import domain.player.Player; import domain.player.dealer.Dealer; @@ -25,7 +24,7 @@ public static CardTable readyToPlayBlackjack(final CardDeck cardDeck) { } public Map determineWinner(final List participants, - final Dealer dealer) { + final Dealer dealer) { return participants.stream() .collect(Collectors.toMap( Function.identity(), diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index d9c6677733..89b488952c 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -6,8 +6,8 @@ public abstract class Player { - private final Name name; protected final CardArea cardArea; + private final Name name; protected Player(final Name name) { this.name = name; diff --git a/src/main/java/domain/player/dealer/Dealer.java b/src/main/java/domain/player/dealer/Dealer.java index a76e8e9ad3..b3153718d9 100644 --- a/src/main/java/domain/player/dealer/Dealer.java +++ b/src/main/java/domain/player/dealer/Dealer.java @@ -1,7 +1,6 @@ package domain.player.dealer; import domain.Score; -import domain.area.CardArea; import domain.card.Card; import domain.player.Name; import domain.player.Player; diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 1fbfda6985..86a1f9e26f 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -13,7 +13,8 @@ public class InputView { private static final String NO_COMMAND = "n"; private static final Scanner scanner = new Scanner(System.in); - private InputView() {} + private InputView() { + } public static List readParticipantsName() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); @@ -31,7 +32,7 @@ public static String readMoreCard(final Participant participant) { if (validateIneligibleCommand(input)) { return readMoreCard(participant); } - + return input; } diff --git a/src/test/java/domain/card/CardTest.java b/src/test/java/domain/card/CardTest.java index 335980bfc1..34bfaa2e11 100644 --- a/src/test/java/domain/card/CardTest.java +++ b/src/test/java/domain/card/CardTest.java @@ -42,4 +42,4 @@ class CardTest { // when & then assertThat(card1).isEqualTo(card2); } -} \ No newline at end of file +} From 7f54c2d15d2e9dac2a68e59d74035752f16e9574 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Tue, 7 Mar 2023 14:26:07 +0900 Subject: [PATCH 56/60] =?UTF-8?q?minimission=20:=20ArrayList,=20LinkedList?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/minimission/SimpleArrayList.java | 3 +- .../java/minimission/SimpleLinkedList.java | 183 ++++++++++++++++++ .../minimission/SimpleLinkedListTest.java | 158 +++++++++++++++ 3 files changed, 342 insertions(+), 2 deletions(-) create mode 100644 src/test/java/minimission/SimpleLinkedList.java create mode 100644 src/test/java/minimission/SimpleLinkedListTest.java diff --git a/src/test/java/minimission/SimpleArrayList.java b/src/test/java/minimission/SimpleArrayList.java index 97f7721a71..caf6bc4efe 100644 --- a/src/test/java/minimission/SimpleArrayList.java +++ b/src/test/java/minimission/SimpleArrayList.java @@ -1,7 +1,6 @@ package minimission; import java.util.Arrays; -import java.util.Objects; public class SimpleArrayList implements SimpleList { @@ -116,7 +115,7 @@ public String remove(final int index) { final String oldValue = array[index]; if (currentSize - 1 > index) { - System.arraycopy(array, index + 1, array, index, currentSize - index); + System.arraycopy(array, index + 1, array, index, currentSize - index); } array[currentSize] = null; diff --git a/src/test/java/minimission/SimpleLinkedList.java b/src/test/java/minimission/SimpleLinkedList.java new file mode 100644 index 0000000000..7f1e884073 --- /dev/null +++ b/src/test/java/minimission/SimpleLinkedList.java @@ -0,0 +1,183 @@ +package minimission; + +public class SimpleLinkedList implements SimpleList { + + private Node head; + + private int size; + + public SimpleLinkedList() { + } + + @Override + public boolean add(final String value) { + + final Node newNode = new Node(null, value); + + if (head == null) { + head = newNode; + } else { + Node curNode = head; + + while (curNode.next != null) { + curNode = curNode.next; + } + + curNode.next = newNode; + } + + size++; + return true; + } + + @Override + public void add(final int index, final String value) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("여기에 넣을 수 없습니다."); + } + + final Node newNode = new Node(null, value); + + if (index == 0) { + newNode.next = head; + head = newNode; + } else { + Node current = head; + for (int i = 0; i < index - 1 && current != null; i++) { + current = current.next; + } + if (current != null) { + newNode.next = current.next; + current.next = newNode; + } + } + + size++; + } + + @Override + public String set(final int index, final String value) { + return null; + } + + @Override + public String get(final int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("여기에 넣을 수 없습니다."); + } + + Node node = head; + int start = index; + + while (start-- > 0) { + node = node.next; + } + + return node.value; + } + + @Override + public boolean contains(final String value) { + return indexOf(value) >= 0; + } + + @Override + public int indexOf(final String value) { + int index = 0; + + for (Node start = head; start != null; start = start.next) { + if (start.value.equals(value)) { + return index; + } + + index++; + } + + return -1; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return head == null; + } + + @Override + public boolean remove(final String value) { + + final int index = indexOf(value); + if (index == -1) { + return false; + } + + remove(index); + return true; + } + + @Override + public String remove(final int index) { + + final Node targetNode = node(index); + final Node next = targetNode.next; + final Node prev = node(index - 1); + + final String removedValue = targetNode.value; + + if (next == null) { + prev.next = null; + } else { + prev.next = next; + targetNode.next = null; + targetNode.value = null; + } + + size--; + return removedValue; + } + + void print() { + for (Node current = head; current != null; current = current.next) { + System.out.println(current.value + " "); + } + } + + Node node(int index) { + Node node = head; + + for (int i = 0; i < index; i++) { + node = node.next; + } + + return node; + } + + @Override + public void clear() { + + for (Node current = head; current != null;) { + Node next = current.next; + current.value = null; + current.next = null; + + current = next; + } + + size = 0; + head = null; + } + + static class Node { + + Node next; + String value; + + public Node(final Node next, final String value) { + this.next = next; + this.value = value; + } + } +} diff --git a/src/test/java/minimission/SimpleLinkedListTest.java b/src/test/java/minimission/SimpleLinkedListTest.java new file mode 100644 index 0000000000..c962f9c47c --- /dev/null +++ b/src/test/java/minimission/SimpleLinkedListTest.java @@ -0,0 +1,158 @@ +package minimission; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SimpleLinkedListTest { + + SimpleList simpleLinkedList; + + @BeforeEach + void init() { + simpleLinkedList = new SimpleLinkedList(); + } + + + @Test + @DisplayName("add(value) : 링크드리스트의 끝에 값을 넣을 수 있다.") + void add_last() throws Exception { + //when + simpleLinkedList.add("a"); + simpleLinkedList.add("b"); + simpleLinkedList.add("c"); + + //then + assertAll( + () -> assertEquals(3, simpleLinkedList.size()), + () -> assertEquals("a", simpleLinkedList.get(0)), + () -> assertEquals("b", simpleLinkedList.get(1)), + () -> assertEquals("c", simpleLinkedList.get(2)) + ); + } + + @Test + @DisplayName("add(index, value) : 링크드리스트의 원하는 곳에 값을 넣을 수 있다.") + void add_specific_index() throws Exception { + //given + simpleLinkedList.add("a"); + simpleLinkedList.add("b"); + simpleLinkedList.add("c"); + + //when a d b e c + simpleLinkedList.add(1, "d"); + simpleLinkedList.add(3, "e"); + + //then + assertAll( + () -> assertEquals(5, simpleLinkedList.size()), + () -> assertEquals("a", simpleLinkedList.get(0)), + () -> assertEquals("d", simpleLinkedList.get(1)), + () -> assertEquals("b", simpleLinkedList.get(2)), + () -> assertEquals("e", simpleLinkedList.get(3)), + () -> assertEquals("c", simpleLinkedList.get(4)) + ); + } + + @Test + @DisplayName("contains() : 특정 값이 포함되어있는지 알 수 있다.") + void test_contains() throws Exception { + //given + simpleLinkedList.add("1"); + simpleLinkedList.add("2"); + simpleLinkedList.add("3"); + + //when + final boolean isContains = simpleLinkedList.contains("3"); + final boolean isNotContains = simpleLinkedList.contains("4"); + + //then + assertTrue(isContains); + assertFalse(isNotContains); + } + + @Test + @DisplayName("indexOf() : 특정 값의 index를 알 수 있다.") + void test_indexOf() throws Exception { + //given + simpleLinkedList.add("1"); + simpleLinkedList.add("2"); + simpleLinkedList.add("3"); + + //when + final int index = simpleLinkedList.indexOf("2"); + + //then + assertEquals(index, 1); + } + + @Test + @DisplayName("isEmpty() : 링크드리스트가 비어있는지 확인할 수 있다.") + void test_isEmpty() throws Exception { + //given + final boolean empty = simpleLinkedList.isEmpty(); + + assertTrue(empty); + + //when + simpleLinkedList.add("1"); + simpleLinkedList.add("2"); + simpleLinkedList.add("3"); + + final boolean notEmpty = simpleLinkedList.isEmpty(); + + //then + assertFalse(notEmpty); + } + + @Test + @DisplayName("remove(value) : 특정 값을 삭제할 수 있다.") + void test_remove_value() throws Exception { + //given + simpleLinkedList.add("1"); + simpleLinkedList.add("2"); + simpleLinkedList.add("3"); + + //when + simpleLinkedList.remove("2"); + + //then + assertEquals(simpleLinkedList.size(), 2); + } + + @Test + @DisplayName("remove(index) : 특정 index의 값을 삭제할 수 있다.") + void test_remove_index() throws Exception { + //given + simpleLinkedList.add("1"); + simpleLinkedList.add("2"); + simpleLinkedList.add("3"); + + //when + final String oldValue = simpleLinkedList.remove(2); + + //then + assertEquals(oldValue, "3"); + assertEquals(simpleLinkedList.size(), 2); + } + + @Test + @DisplayName("clear() : LinkedList를 비울 수 있다.") + void test_clear() throws Exception { + //given + simpleLinkedList.add("1"); + simpleLinkedList.add("2"); + simpleLinkedList.add("3"); + + //when + simpleLinkedList.clear(); + + //then + assertEquals(simpleLinkedList.size(), 0); + } +} From 20fed88a2b61fd26972b2042a323eef7048be8cf Mon Sep 17 00:00:00 2001 From: java-saeng Date: Tue, 7 Mar 2023 16:25:27 +0900 Subject: [PATCH 57/60] =?UTF-8?q?feat=20:=20Score=EC=97=90=EC=84=9C=20Ace?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ace 가 하나이상 존재하면서 더할 때 버스트가 아닐 경우에는 11을 더해줌 - 그 외는 1로 더하기 --- src/main/java/domain/Score.java | 16 ++++++++++++++ src/test/java/domain/ScoreTest.java | 33 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index f1c1da64d5..12d3964b3e 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -4,8 +4,12 @@ public class Score { + public static final Score MIN = new Score(0); + private static final int UPPER_LIMIT_SCORE = 21; + private static final int REMAIN_SCORE_ACE = 10; + private final int value; public Score(final int value) { @@ -45,6 +49,18 @@ public boolean isGreaterThan(final Score other) { return value > other.value; } + public Score plusTenIfNotBurst() { + if (value + REMAIN_SCORE_ACE <= UPPER_LIMIT_SCORE) { + return this.plus(new Score(10)); + } + + return this; + } + + public Score plus(Score other) { + return new Score(value + other.value); + } + public int value() { return value; } diff --git a/src/test/java/domain/ScoreTest.java b/src/test/java/domain/ScoreTest.java index 5d863b3c7e..0080371415 100644 --- a/src/test/java/domain/ScoreTest.java +++ b/src/test/java/domain/ScoreTest.java @@ -119,4 +119,37 @@ void test_isGreaterThan() throws Exception { assertFalse(origin1.isGreaterThan(other1)); assertTrue(origin2.isGreaterThan(other2)); } + + @ParameterizedTest + @CsvSource(value = { + "21,21,42", + "21,20,41" + }) + @DisplayName("plus() : 두 점수를 더할 수 있다.") + void test_add(final int value, final int other, final int sum) throws Exception { + //given + final Score origin = new Score(value); + final Score resultScore = new Score(sum); + + //when & then + assertEquals(origin.plus(new Score(other)), resultScore); + } + + @ParameterizedTest + @CsvSource(value = { + "20,2,20", + "21,2,21", + "19,2,21", + "19,3,19", + "18,4,18", + }) + @DisplayName("plusIfNotBurst() : 다른 숫자를 더 할 때 bust 당하지 않으면 그 숫자를 더해줄 수 있다.") + void test_plusIfNotBurst(final int value, final int sum) throws Exception { + //given + final Score origin = new Score(value); + final Score result = new Score(sum); + + //when & then + assertEquals(origin.plusTenIfNotBurst(), result); + } } From 4c9d00bbd038ad59300ed4e7360d7a661ba6a824 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Tue, 7 Mar 2023 16:34:19 +0900 Subject: [PATCH 58/60] =?UTF-8?q?refactor=20:=20CardArea=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B9=B4=EB=93=9C=20=EA=B0=92=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/area/CardArea.java | 32 ++++++++++--------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/main/java/domain/area/CardArea.java b/src/main/java/domain/area/CardArea.java index 740d5e1448..f002e55ec0 100644 --- a/src/main/java/domain/area/CardArea.java +++ b/src/main/java/domain/area/CardArea.java @@ -8,9 +8,6 @@ public class CardArea { - private static final int REMAIN_SCORE_ACE = 10; - private static final int ADD_ACE_BUST_OR_NOT = 11; - private final List cards = new ArrayList<>(); public List cards() { @@ -22,28 +19,25 @@ public void addCard(final Card card) { } public Score calculate() { - int aceCount = countAceCard(); - int totalValue = sumTotalCardValue(); - - while (aceCount > 0) { - if (totalValue <= ADD_ACE_BUST_OR_NOT) { - totalValue += REMAIN_SCORE_ACE; - } - aceCount--; + Score score = score(); + + if (hasAce()) { + score = score.plusTenIfNotBurst(); } - return new Score(totalValue); + + return score; } - private int sumTotalCardValue() { + private Score score() { return cards.stream() - .mapToInt(card -> card.cardValue().value()) - .sum(); + .map(card -> new Score(card.cardValue().value())) + .reduce(Score.MIN, (Score::plus)); + } - private int countAceCard() { - return (int) cards.stream() - .filter(card -> card.cardValue().isAce()) - .count(); + private boolean hasAce() { + return cards.stream() + .anyMatch(card -> card.cardValue().isAce()); } public boolean canMoreCard() { From 3ae18c8687cfeeadfab418dfb071c4783f47e5b6 Mon Sep 17 00:00:00 2001 From: java-saeng Date: Tue, 7 Mar 2023 16:35:27 +0900 Subject: [PATCH 59/60] =?UTF-8?q?refactor=20:=20int=20=EB=A1=9C=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=ED=95=98=EC=A7=80=20=EC=95=8A=EA=B3=A0=20Sco?= =?UTF-8?q?re=20=EC=97=90=20=EC=9E=88=EB=8A=94=20=EC=97=B0=EC=82=B0=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Score.java | 44 +++++++++++++++-------------- src/test/java/domain/ScoreTest.java | 12 ++++---- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index 12d3964b3e..e0c322b8fc 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -6,9 +6,9 @@ public class Score { public static final Score MIN = new Score(0); - private static final int UPPER_LIMIT_SCORE = 21; + private static final Score UPPER_LIMIT_SCORE = new Score(21); - private static final int REMAIN_SCORE_ACE = 10; + private static final Score REMAIN_SCORE_ACE = new Score(10); private final int value; @@ -16,31 +16,18 @@ public Score(final int value) { this.value = value; } - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - final Score score = (Score) o; - return value == score.value; + public boolean isBust() { + return this.isGreaterThan(UPPER_LIMIT_SCORE); } - @Override - public int hashCode() { - return Objects.hash(value); + public boolean canMoreCard() { + return this.isLessThan(UPPER_LIMIT_SCORE); } public boolean isLessThan(final Score other) { return value < other.value; } - public boolean isBust() { - return value > UPPER_LIMIT_SCORE; - } - - public boolean canMoreCard() { - return value < UPPER_LIMIT_SCORE; - } - public boolean isLessEqualThan(final Score other) { return value <= other.value; } @@ -50,8 +37,10 @@ public boolean isGreaterThan(final Score other) { } public Score plusTenIfNotBurst() { - if (value + REMAIN_SCORE_ACE <= UPPER_LIMIT_SCORE) { - return this.plus(new Score(10)); + final Score plusScore = this.plus(REMAIN_SCORE_ACE); + + if (plusScore.isLessEqualThan(UPPER_LIMIT_SCORE)) { + return this.plus(REMAIN_SCORE_ACE); } return this; @@ -61,6 +50,19 @@ public Score plus(Score other) { return new Score(value + other.value); } + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final Score score = (Score) o; + return value == score.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + public int value() { return value; } diff --git a/src/test/java/domain/ScoreTest.java b/src/test/java/domain/ScoreTest.java index 0080371415..cedef7339e 100644 --- a/src/test/java/domain/ScoreTest.java +++ b/src/test/java/domain/ScoreTest.java @@ -137,13 +137,13 @@ void test_add(final int value, final int other, final int sum) throws Exception @ParameterizedTest @CsvSource(value = { - "20,2,20", - "21,2,21", - "19,2,21", - "19,3,19", - "18,4,18", + "10,20", + "12,12", + "11,21", + "13,13", + "14,14", }) - @DisplayName("plusIfNotBurst() : 다른 숫자를 더 할 때 bust 당하지 않으면 그 숫자를 더해줄 수 있다.") + @DisplayName("plusTenIfNotBurst() : 다른 숫자를 더 할 때 bust 당하지 않으면 그 숫자를 더해줄 수 있다.") void test_plusIfNotBurst(final int value, final int sum) throws Exception { //given final Score origin = new Score(value); From 0953389a5a52578215b39849d68928ee814b6aab Mon Sep 17 00:00:00 2001 From: java-saeng Date: Tue, 7 Mar 2023 16:38:52 +0900 Subject: [PATCH 60/60] =?UTF-8?q?style=20:=20=EC=A0=9C=EC=B6=9C=20?= =?UTF-8?q?=EC=A0=84=20code=20reformatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/ScoreTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/domain/ScoreTest.java b/src/test/java/domain/ScoreTest.java index cedef7339e..c20bdcac60 100644 --- a/src/test/java/domain/ScoreTest.java +++ b/src/test/java/domain/ScoreTest.java @@ -9,7 +9,9 @@ import java.util.stream.Stream; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; class ScoreTest {