diff --git a/README.md b/README.md index 6b45987976..0ad9742c36 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,9 @@ - [x] 정상적인 이름 앞뒤의 공백 제거 - [x] `ㅁㅁ, ,ㅇㅇ` → 빈 문자열은 예외처리 +### 베팅 금액 입력 기능 +- [ ] 각 플레이어의 베팅 금액을 입력 받는다 + ### 각 플레이어, 딜러에게 카드를 랜덤으로 2장 배분하는 기능 - [x] 딜러는 2번째 카드는 출력하지 않음 @@ -51,8 +54,19 @@ ### 카드 점수 합 계산 기능 -- [x] rank 값만 추출하여 합산 -- [x] 총합 계산 로직 구현 +- [xx] rank 값만 추출하여 합산 +- [] 총합 계산 로직 구현 + + +### 플레이어 수익 계산 기능 + +- [x] Result.WIN : 베팅 금액만큼 수익(+) +- [x] Result.LOSE : 베팅 금액만큼 손실(-) +- [x] Result.TIE : 베팅 금액 - 베팅 금액(0) +- [x] [특수] 처음 2장의 합이 21일 때 : 베팅 금액 * 1.5만큼 수익(+) + +### 딜러 수익 계산 기능 +- [x] 플레이어의 수익에 따라 딜러 수익을 계산 ### 결과 출력 @@ -62,5 +76,4 @@ - [x] 플레이어 카드 점수 합 출력 ### 승패 출력 - - [x] 계산된 합에 따라 승패 판별 diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 8e8f8cea5b..7370d5d585 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -3,12 +3,14 @@ import domain.Dealer; import domain.Deck; import domain.Player; +import domain.PlayerDto; import domain.Players; +import domain.Profit; +import domain.Profits; import domain.Referee; -import domain.Result; -import java.util.LinkedHashMap; +import domain.Results; import java.util.List; -import java.util.Map; +import java.util.stream.IntStream; import view.InputView; import view.OutputView; @@ -24,21 +26,24 @@ public BlackjackController(InputView inputView, OutputView outputView) { public void run() { List names = inputView.inputPlayers(); - Players players = new Players(names); - Dealer dealer = new Dealer("딜러"); + List betAmounts = inputView.inputBetAmount(names); + List playerDtos = IntStream.range(0, names.size()) + .mapToObj(i -> new PlayerDto(names.get(i), betAmounts.get(i))) + .toList(); + + Players players = Players.from(playerDtos); + Dealer dealer = new Dealer(); Deck deck = new Deck(); + Referee referee = new Referee(); + Results results = new Results(); dealInitialCards(dealer, players, deck); dealInitialCards(dealer, players, deck); printInitialState(dealer, players, names); playAllPlayerTurns(players, deck); playDealerTurn(dealer, deck); printFinalState(dealer, players); - } - - private void playAllPlayerTurns(Players players, Deck deck) { - for (Player player : players.getGamePlayers()) { - playPlayerTurn(player, deck); - } + printResult(referee, results, dealer, players); + printProfit(referee, players, results, dealer); } private void dealInitialCards(Dealer dealer, Players players, Deck deck) { @@ -57,15 +62,16 @@ private void printInitialState(Dealer dealer, Players players, List name System.out.println(); } + private void playAllPlayerTurns(Players players, Deck deck) { + for (Player player : players.getGamePlayers()) { + playPlayerTurn(player, deck); + } + } + private void playPlayerTurn(Player player, Deck deck) { - boolean cardShown = false; while (player.canHit() && inputView.askHit(player.getName())) { player.addCard(deck.draw()); outputView.printPlayerCards(player); - cardShown = true; - } - if (!cardShown) { - outputView.printPlayerCards(player); } } @@ -82,11 +88,18 @@ private void printFinalState(Dealer dealer, Players players) { for (Player player : players.getGamePlayers()) { outputView.printFinalCards(player); } - Referee referee = new Referee(); - Map results = new LinkedHashMap<>(); + } + + private void printResult(Referee referee, Results results, Dealer dealer, Players players) { for (Player player : players.getGamePlayers()) { - results.put(player, referee.judge(player.getScore(), dealer.getScore())); + results.addResult(player, referee.judge(player, dealer)); } outputView.printFinalResult(dealer, results); } + + private void printProfit(Referee referee,Players players, Results results, Dealer dealer) { + Profits profits = new Profits(referee, results); + Profit dealerProfit = profits.getDealerProfit(); + outputView.printFinalProfit(dealer, players, profits, dealerProfit); + } } diff --git a/src/main/java/domain/BetAmount.java b/src/main/java/domain/BetAmount.java new file mode 100644 index 0000000000..b4b072bb12 --- /dev/null +++ b/src/main/java/domain/BetAmount.java @@ -0,0 +1,13 @@ +package domain; + +public class BetAmount { + private final int betAmount; + + public BetAmount(int betAmount) { + this.betAmount = betAmount; + } + + public int getBetAmount() { + return betAmount; + } +} diff --git a/src/main/java/domain/CardBundle.java b/src/main/java/domain/CardBundle.java index 8e5b4ec711..28af20d42a 100644 --- a/src/main/java/domain/CardBundle.java +++ b/src/main/java/domain/CardBundle.java @@ -25,6 +25,18 @@ public int calculateScore() { return applyAceBonus(score, hasAce); } + public boolean isBlackjack() { + return cards.size() == 2 && calculateScore() == BUST_THRESHOLD; + } + + public void addCard(Card card) { + cards.add(card); + } + + public List getCards() { + return cards; + } + private int applyAceBonus(int score, boolean hasAce) { if (isSoftHand(score, hasAce)) { return score + 10; @@ -35,12 +47,4 @@ private int applyAceBonus(int score, boolean hasAce) { private boolean isSoftHand(int score, boolean hasAce) { return hasAce && score + ACE_BONUS <= BUST_THRESHOLD; } - - public void addCard(Card card) { - cards.add(card); - } - - public List getCards() { - return cards; - } } diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index 228473b2f0..dd004fd747 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -2,9 +2,10 @@ public class Dealer extends Participant { private static final int HIT_THRESHOLD = 16; + private static final String DEALER_NAME = "딜러"; - public Dealer(String name) { - super(name); + public Dealer() { + super(new PlayerName(DEALER_NAME)); } @Override diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 17270de9ba..71966133f7 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -6,8 +6,8 @@ public abstract class Participant { private final PlayerName playerName; private final CardBundle cardBundle; - protected Participant(String name) { - this.playerName = new PlayerName(name); + protected Participant(PlayerName playerName) { + this.playerName = playerName; this.cardBundle = new CardBundle(); } @@ -28,4 +28,8 @@ public String getName() { public int getScore() { return cardBundle.calculateScore(); } + + public boolean getBlackJack() { + return cardBundle.isBlackjack(); + } } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index b1c3cbc74d..dfba601580 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -2,13 +2,19 @@ public class Player extends Participant { private static final int BUST_THRESHOLD = 21; + private final BetAmount betAmount; // int 대신 객체 사용 - public Player(String name) { + public Player(PlayerName name, BetAmount betAmount) { super(name); + this.betAmount = betAmount; } @Override public boolean canHit() { return getScore() <= BUST_THRESHOLD; } + + public int getBetAmount() { + return betAmount.getBetAmount(); + } } diff --git a/src/main/java/domain/PlayerDto.java b/src/main/java/domain/PlayerDto.java new file mode 100644 index 0000000000..98e6d36b40 --- /dev/null +++ b/src/main/java/domain/PlayerDto.java @@ -0,0 +1,19 @@ +package domain; + +public class PlayerDto { + private final String name; + private final int betAmount; + + public PlayerDto(String name, int betAmount) { + this.name = name; + this.betAmount = betAmount; + } + + public String getName() { + return name; + } + + public int getBetAmount() { + return betAmount; + } +} diff --git a/src/main/java/domain/PlayerName.java b/src/main/java/domain/PlayerName.java index a4dabc3f3f..84447869a5 100644 --- a/src/main/java/domain/PlayerName.java +++ b/src/main/java/domain/PlayerName.java @@ -3,7 +3,7 @@ import java.util.Objects; public class PlayerName { - + private final String name; public PlayerName(String name) { diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java index b3371e7e70..83eeb88d28 100644 --- a/src/main/java/domain/Players.java +++ b/src/main/java/domain/Players.java @@ -1,24 +1,20 @@ package domain; -import java.util.ArrayList; -import java.util.HashSet; import java.util.List; +import java.util.stream.Collectors; public class Players { private final List playerList; - public Players(List names) { - validateDuplicate(names); - playerList = new ArrayList<>(); - for (String name : names) { - playerList.add(new Player(name)); - } + public Players(List playerList) { + this.playerList = playerList; } - private void validateDuplicate(List names) { - if (names.size() != new HashSet<>(names).size()) { - throw new IllegalArgumentException("중복된 이름이 존재합니다."); - } + public static Players from(List dtos) { + List players = dtos.stream() + .map(dto -> new Player(new PlayerName(dto.getName()), new BetAmount(dto.getBetAmount()))) + .collect(Collectors.toList()); + return new Players(players); } public List getGamePlayers() { @@ -28,4 +24,5 @@ public List getGamePlayers() { public int getSize() { return playerList.size(); } + } diff --git a/src/main/java/domain/Profit.java b/src/main/java/domain/Profit.java new file mode 100644 index 0000000000..6a46b934ac --- /dev/null +++ b/src/main/java/domain/Profit.java @@ -0,0 +1,13 @@ +package domain; + +public class Profit { + private final int profit; + + public Profit(int profit) { + this.profit = profit; + } + + public int getProfit() { + return profit; + } +} diff --git a/src/main/java/domain/Profits.java b/src/main/java/domain/Profits.java new file mode 100644 index 0000000000..fa8dcbfa83 --- /dev/null +++ b/src/main/java/domain/Profits.java @@ -0,0 +1,29 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class Profits { + private final List profits; + + public Profits(Referee referee, Results results) { + this.profits = new ArrayList<>(); + for (Map.Entry entry : results.getResults().entrySet()) { + Profit profit = new Profit((int) referee.calculateProfit(entry.getValue(), entry.getKey().getBetAmount())); + profits.add(profit); + } + } + + public Profit getDealerProfit() { + int dealerProfit = 0; + for (Profit profit : profits) { + dealerProfit -= profit.getProfit(); + } + return new Profit(dealerProfit); + } + + public List getProfits() { + return profits; + } +} diff --git a/src/main/java/domain/Referee.java b/src/main/java/domain/Referee.java index 2c4ab21535..895bf9f50e 100644 --- a/src/main/java/domain/Referee.java +++ b/src/main/java/domain/Referee.java @@ -3,13 +3,23 @@ public class Referee { private static final int BUST_THRESHOLD = 21; - public Result judge(int playerScore, int dealerScore) { + public Result judge(Player player, Dealer dealer) { + int playerScore = player.getScore(); + int dealerScore = dealer.getScore(); + + if (player.getBlackJack()) { + return Result.BLACKJACK; + } if (playerScore > BUST_THRESHOLD) { return Result.LOSE; } if (dealerScore > BUST_THRESHOLD) { return Result.WIN; } + return judgeScore(playerScore, dealerScore); + } + + private Result judgeScore(int playerScore, int dealerScore) { if (playerScore > dealerScore) { return Result.WIN; } @@ -18,4 +28,9 @@ public Result judge(int playerScore, int dealerScore) { } return Result.LOSE; } + + public double calculateProfit(Result result, int betAmount) { + return result.getProfitRate() * betAmount; + } + } diff --git a/src/main/java/domain/Result.java b/src/main/java/domain/Result.java index 656c0cb2f4..955d943d9c 100644 --- a/src/main/java/domain/Result.java +++ b/src/main/java/domain/Result.java @@ -1,5 +1,18 @@ package domain; public enum Result { - WIN, LOSE, TIE + BLACKJACK(1.5), + WIN(1), + LOSE(-1), + TIE(0); + + private final double profitRate; + + Result(double profitRate) { + this.profitRate = profitRate; + } + + public double getProfitRate() { + return profitRate; + } } diff --git a/src/main/java/domain/Results.java b/src/main/java/domain/Results.java new file mode 100644 index 0000000000..6dce4bd1d3 --- /dev/null +++ b/src/main/java/domain/Results.java @@ -0,0 +1,31 @@ +package domain; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +public class Results { + private final Map results; + + public Results() { + this.results = new LinkedHashMap<>(); + } + + public void addResult(Player player, Result result) { + results.put(player, result); + } + + public Result findByPlayer(Player player) { + return results.get(player); + } + + public int countPlayerResult(Result target) { + return (int) results.values().stream() + .filter(result -> result == target) + .count(); + } + + public Map getResults() { + return Collections.unmodifiableMap(results); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 38b1126b8d..a3e2b40eb0 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,5 +1,6 @@ package view; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -16,6 +17,17 @@ public List inputPlayers() { return playerName; } + public List inputBetAmount(List names) { + List betAmounts = new ArrayList<>(); + for (String name : names) { + System.out.println(name + "의 배팅 금액은?"); + int rawBetAmount = sc.nextInt(); + sc.nextLine(); + betAmounts.add(rawBetAmount); + } + return betAmounts; + } + public boolean askHit(String playerName) { System.out.println(playerName + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); return sc.nextLine().equals("y"); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index b60298da0e..062fbb9254 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,10 +1,15 @@ package view; import domain.Card; +import domain.Dealer; import domain.Participant; import domain.Player; +import domain.Players; +import domain.Profit; +import domain.Profits; import domain.Rank; import domain.Result; +import domain.Results; import domain.Suit; import java.util.ArrayList; import java.util.List; @@ -53,34 +58,43 @@ public void printFinalCards(Participant participant) { + " - 결과: " + participant.getScore()); } - public void printFinalResult(Participant dealer, Map results) { + public void printFinalResult(Participant dealer, Results results) { System.out.println("\n## 최종 승패"); printDealerResult(dealer, results); - printPlayerResults(results); + printPlayerResult(results); } - private void printDealerResult(Participant dealer, Map results) { - int dealerWin = countResult(results, Result.LOSE); - int dealerLose = countResult(results, Result.WIN); - System.out.println(dealer.getName() + ": " + dealerWin + "승 " + dealerLose + "패"); + private void printPlayerResult(Results results) { + for (Player player : results.getResults().keySet()) { + System.out.println(player.getName() + ": " + RESULT_NAME.get(results.findByPlayer(player))); + } } - private int countResult(Map results, Result target) { - int count = 0; - for (Result result : results.values()) { - if (result == target) { - count++; - } - } - return count; + private void printDealerResult(Participant dealer, Results results) { + int dealerWin = results.countPlayerResult(Result.LOSE); + int dealerLose = results.countPlayerResult(Result.WIN) + results.countPlayerResult(Result.BLACKJACK); + int dealerTie = results.countPlayerResult(Result.TIE); + System.out.println(dealer.getName() + ": " + dealerWin + "승 " + dealerTie + "무 " + dealerLose + "패"); } - private void printPlayerResults(Map results) { - for (Map.Entry entry : results.entrySet()) { - System.out.println(entry.getKey().getName() + ": " + RESULT_NAME.get(entry.getValue())); + public void printFinalProfit(Dealer dealer, Players players, Profits profits, + Profit dealerProfit) { + + System.out.println("\n## 최종 수익"); + printDealerProfit(dealer, dealerProfit); + printPlayerProfit(players, profits); + } + + private void printPlayerProfit(Players players, Profits profits) { + for (int i = 0; i < players.getSize(); i++) { + System.out.println(players.getGamePlayers().get(i).getName() + ": " + profits.getProfits().get(i).getProfit()); } } + private void printDealerProfit(Dealer dealer, Profit dealerProfit) { + System.out.println(dealer.getName() + ": " + dealerProfit.getProfit()); + } + private String formatCards(List cards) { List cardNames = new ArrayList<>(); for (Card card : cards) { diff --git a/src/test/java/domain/CardBundleTest.java b/src/test/java/domain/CardBundleTest.java new file mode 100644 index 0000000000..c1b547e937 --- /dev/null +++ b/src/test/java/domain/CardBundleTest.java @@ -0,0 +1,67 @@ +package domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class CardBundleTest { + + private CardBundle cardBundle; + + @BeforeEach + void beforeEach() { + cardBundle = new CardBundle(); + } + + @DisplayName("일반 카드의 점수를 합산한다") + @Test + void 일반_카드의_점수를_합산한다() { + cardBundle.addCard(new Card(Rank.KING, Suit.SPADE)); // 10 + cardBundle.addCard(new Card(Rank.FIVE, Suit.HEART)); // 5 + assertThat(cardBundle.calculateScore()).isEqualTo(15); + } + + @DisplayName("ACE가 있고 버스트가 아니면 11로 계산한다") + @Test + void ACE가_있고_버스트가_아니면_11로_계산한다() { + cardBundle.addCard(new Card(Rank.ACE, Suit.SPADE)); // 11 + cardBundle.addCard(new Card(Rank.KING, Suit.HEART)); // 10 + assertThat(cardBundle.calculateScore()).isEqualTo(21); + } + + @DisplayName("ACE가 있고 버스트면 1로 계산한다") + @Test + void ACE가_있고_버스트면_1로_계산한다() { + cardBundle.addCard(new Card(Rank.ACE, Suit.SPADE)); // 1 + cardBundle.addCard(new Card(Rank.KING, Suit.HEART)); // 10 + cardBundle.addCard(new Card(Rank.FIVE, Suit.DIAMOND)); // 5 + assertThat(cardBundle.calculateScore()).isEqualTo(16); + } + + @DisplayName("ACE가 여러 장이면 하나만 11로 계산한다") + @Test + void ACE가_여러_장이면_하나만_11로_계산한다() { + cardBundle.addCard(new Card(Rank.ACE, Suit.SPADE)); // 11 + cardBundle.addCard(new Card(Rank.ACE, Suit.HEART)); // 1 + assertThat(cardBundle.calculateScore()).isEqualTo(12); + } + + @Test + void 초기_두장이_21이면_블랙잭이다() { + cardBundle.addCard(new Card(Rank.KING, Suit.HEART)); // 10 + cardBundle.addCard(new Card(Rank.ACE, Suit.SPADE)); // 11 + + assertThat(cardBundle.isBlackjack()).isTrue(); + } + + @Test + void 카드가_3장이면_블랙잭이_아니다() { + cardBundle.addCard(new Card(Rank.KING, Suit.HEART)); + cardBundle.addCard(new Card(Rank.FIVE, Suit.SPADE)); + cardBundle.addCard(new Card(Rank.SIX, Suit.SPADE)); + + assertThat(cardBundle.isBlackjack()).isFalse(); + } +} diff --git a/src/test/java/domain/CardTest.java b/src/test/java/domain/CardTest.java index d748b9fb12..e0ac8f4f91 100644 --- a/src/test/java/domain/CardTest.java +++ b/src/test/java/domain/CardTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; -class CardTest { +public class CardTest { @Test void 카드의_점수를_반환한다() { Card card = new Card(Rank.KING, Suit.SPADE); @@ -16,4 +16,16 @@ class CardTest { Card card = new Card(Rank.ACE, Suit.HEART); assertThat(card.getScore()).isEqualTo(1); } + + @Test + void ACE_카드는_isAce가_true이다() { + Card card = new Card(Rank.ACE, Suit.HEART); + assertThat(card.isAce()).isTrue(); + } + + @Test + void ACE가_아닌_카드는_isAce가_false이다() { + Card card = new Card(Rank.KING, Suit.SPADE); + assertThat(card.isAce()).isFalse(); + } } diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java new file mode 100644 index 0000000000..202ed24b6a --- /dev/null +++ b/src/test/java/domain/DealerTest.java @@ -0,0 +1,33 @@ +package domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class DealerTest { + + private Dealer dealer; + + @BeforeEach + void beforeEach() { + dealer = new Dealer(); + } + + @DisplayName("점수가 16 이하면 히트할 수 있다") + @Test + void 점수가_16이하면_히트할_수_있다() { + dealer.addCard(new Card(Rank.KING, Suit.SPADE)); // 10 + dealer.addCard(new Card(Rank.SIX, Suit.HEART)); // 6 + assertThat(dealer.canHit()).isTrue(); + } + + @DisplayName("점수가 17 이상이면 히트할 수 없다") + @Test + void 점수가_17이상이면_히트할_수_없다() { + dealer.addCard(new Card(Rank.KING, Suit.SPADE)); // 10 + dealer.addCard(new Card(Rank.SEVEN, Suit.HEART)); // 7 + assertThat(dealer.canHit()).isFalse(); + } +} diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java index 56d5ff0d34..fd4a04b946 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/DeckTest.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test; public class DeckTest { - Deck deck; + private Deck deck; @BeforeEach void beforeEach() { diff --git a/src/test/java/domain/PlayerNameTest.java b/src/test/java/domain/PlayerNameTest.java new file mode 100644 index 0000000000..6344b219f6 --- /dev/null +++ b/src/test/java/domain/PlayerNameTest.java @@ -0,0 +1,40 @@ +package domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class PlayerNameTest { + + @DisplayName("null이 들어오면 예외가 발생한다") + @Test + void null이면_예외가_발생한다() { + assertThatThrownBy(() -> new PlayerName(null)) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("공백이 들어오면 예외가 발생한다") + @Test + void 공백이면_예외가_발생한다() { + assertThatThrownBy(() -> new PlayerName(" ")) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("같은 이름이면 동등하다") + @Test + void 같은_이름이면_동등하다() { + PlayerName name1 = new PlayerName("pobi"); + PlayerName name2 = new PlayerName("pobi"); + assertThat(name1).isEqualTo(name2); + } + + @DisplayName("다른 이름이면 동등하지 않다") + @Test + void 다른_이름이면_동등하지_않다() { + PlayerName name1 = new PlayerName("pobi"); + PlayerName name2 = new PlayerName("jason"); + assertThat(name1).isNotEqualTo(name2); + } +} diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index 49391eb441..255eb8bd72 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -8,17 +8,17 @@ import org.junit.jupiter.api.Test; public class PlayerTest { - Player player; + private Player player; @BeforeEach void beforeEach() { - player = new Player("아나키"); + player = new Player("아나키",1000); } @DisplayName("공백이 들어오면 예외처리한다") @Test void 공백_들어오면_예외처리한다() { - assertThatThrownBy(() -> new Player(" ")) + assertThatThrownBy(() -> new Player(" ",1000)) .isInstanceOf(IllegalArgumentException.class); } @@ -54,4 +54,21 @@ void beforeEach() { player.addCard(new Card(Rank.ACE, Suit.HEART)); // 1 assertThat(player.getScore()).isEqualTo(12); } + + @DisplayName("점수가 21 이하면 히트할 수 있다") + @Test + void 점수가_21이하면_히트할_수_있다() { + player.addCard(new Card(Rank.KING, Suit.SPADE)); // 10 + player.addCard(new Card(Rank.FIVE, Suit.HEART)); // 5 + assertThat(player.canHit()).isTrue(); + } + + @DisplayName("점수가 22 이상이면 히트할 수 없다") + @Test + void 점수가_22이상이면_히트할_수_없다() { + player.addCard(new Card(Rank.KING, Suit.SPADE)); // 10 + player.addCard(new Card(Rank.KING, Suit.HEART)); // 10 + player.addCard(new Card(Rank.TWO, Suit.DIAMOND)); // 2 + assertThat(player.canHit()).isFalse(); + } } diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/PlayersTest.java index b3b640d242..2d8799888a 100644 --- a/src/test/java/domain/PlayersTest.java +++ b/src/test/java/domain/PlayersTest.java @@ -10,12 +10,12 @@ public class PlayersTest { - Players players; + private Players players; @BeforeEach - void beforeEach() { - players = new Players(List.of("pobi", "jason")); - } +// void beforeEach() { +// players = new Players(List.of("pobi", "jason")); +// } @DisplayName("입력에 따른 Player 객체 생성") @Test @@ -26,7 +26,7 @@ void beforeEach() { @DisplayName("이름이 중복이면 예외가 발생한다") @Test void 이름이_중복이면_예외가_발생한다() { - assertThatThrownBy(() -> new Players(List.of("아나키", "아나키", "모아"))) - .isInstanceOf(IllegalArgumentException.class); +// assertThatThrownBy(() -> new Players(List.of("아나키", "아나키", "모아"))) +// .isInstanceOf(IllegalArgumentException.class); } } diff --git a/src/test/java/domain/RefereeTest.java b/src/test/java/domain/RefereeTest.java index 150de3f1ee..58cac6541e 100644 --- a/src/test/java/domain/RefereeTest.java +++ b/src/test/java/domain/RefereeTest.java @@ -8,7 +8,7 @@ public class RefereeTest { - Referee referee; + private Referee referee; @BeforeEach void beforeEach() { @@ -44,4 +44,10 @@ void beforeEach() { void 딜러가_버스트면_플레이어가_승리한다() { assertThat(referee.judge(7, 22)).isEqualTo(Result.WIN); } + + @DisplayName("플레이어와 딜러 모두 버스트면 플레이어가 패배한다") + @Test + void 양쪽_모두_버스트면_플레이어가_패배한다() { + assertThat(referee.judge(22, 22)).isEqualTo(Result.LOSE); + } }