diff --git a/README.md b/README.md index 03ba7ed3..773c8bbd 100644 --- a/README.md +++ b/README.md @@ -1 +1,78 @@ -# java-blackjack \ No newline at end of file +# java-blackjack + +## 연료 주입 기능 목록 + +MotorVehicle (Interface) + +- 리터당 이동 거리를 반환 getDistancePerLiter +- 여행할 거리를 반환 getTripDistance +- 차종 이름을 반환 getName + +Car (abstract class) (implements MotorVehicle) + +- 거리에 따른 연료량을 계산 후 반환 getChargeQuantity +- 멤버변수 distance + +Sonata, Avante, K5 (extends Car) + +- 생성자로 distance 받기 +- private static final 로 연비를 가짐. (10km/리터, 15, 13) + +RentCompany + +- 차 List를 가짐. +- private 생성자 +- static create()을 통해 객체 생성 +- addCar(Car) 를 통해 차 List에 저장 +- generateReport 를 통해 report String 반환 + +## 블랙잭 + +[Card : Denomination, Shape] + +- [x] enum으로 1~10,J,Q,K를 구현한다. +- [x] enum으로 하트,스페이드,다이아몬드,클로버를 구현한다. +- [x] value와 shape를 합쳐 한 장의 카드를 생성한다. + +[Person] + +- [x] 모든 사람들은 카드 목록을 갖고 있다. +- [x] 카드 1장을 인자로 전달 받아 카드 목록에 추가한다. + +[Player extends Person] + +- [x] 플레이어는 추가적으로 이름을 갖고 있다. +- [x] 생성 시에 플레이어 이름만 인자로 전달 받아서 자기의 이름을 초기화한다. +- [x] 전달 받은 1장의 카드를 자신의 카드 목록에 추가한다. (Person 기능) + +[Dealer extends Person] +딜러가 카드를 섞어서 뽑는 역할. CardDeck으로 분리. + +- [x] 생성 시에 CardDeck을 초기화한다. +- [x] 인자로 전달 받은 1장의 카드를 자신의 카드 목록에 추가한다. (Person 기능) +- [x] 전달 인자로 받은 장수만큼 카드를 반환한다. + +[CardDeck] + +- [x] 전체 카드를 만들어서 리스트로 반환한다. (static) +- [x] 인스턴스 생성 시, 만들어진 52장의 카드로 멤버변수를 초기화한다. +- [x] shuffle한 뒤 전달인자로 받은 수만큼 카드를 뽑아서 반환한다. (제거하면서 반환한다.) + +[GameApplication] + +- [x] GameSetup의 Dealer와 List를 입력받고, 생성된 setup 내용을 ResultView에게 넘긴다. + +- [ ] 카드의 합이 21 이하인지 카드를 추가로 뽑을 것인지 질문한다. +- [ ] 딜러에게 필요한 장수만큼 카드를 요구한다. +- [ ] 반환 받은 카드를 통해 딜러와 플레이어들을 초기화한다. + +[InputView] + +-[x] 플레이어 이름을 입력받아서 쉼표 기준으로 분리한 List을 반환한다. +-[x] 플레이어에게 카드를 추가로 받을 것인지 입력받는다. + +[ResultView] + +-[x] 딜러와 플레이어 List<>를 전달 받아 이름과 카드 목록을 출력한다. + -[x] 처음 시작 때 딜러는 1장의 카드만 출력한다. +-[ ] 딜러와 플레이어의 최종 승패를 출력한다. diff --git a/src/main/java/blackjack/BlackjackApplication.java b/src/main/java/blackjack/BlackjackApplication.java new file mode 100644 index 00000000..8c1936cd --- /dev/null +++ b/src/main/java/blackjack/BlackjackApplication.java @@ -0,0 +1,11 @@ +package blackjack; + +import blackjack.controller.BlackJackGame; + +public class BlackjackApplication { + + public static void main(String[] args) { + BlackJackGame blackJackGame = new BlackJackGame(); + blackJackGame.play(); + } +} diff --git a/src/main/java/blackjack/controller/BlackJackGame.java b/src/main/java/blackjack/controller/BlackJackGame.java new file mode 100644 index 00000000..5a0ece5d --- /dev/null +++ b/src/main/java/blackjack/controller/BlackJackGame.java @@ -0,0 +1,54 @@ +package blackjack.controller; + +import blackjack.domain.cards.DealerCards; +import blackjack.domain.cards.PlayerCards; +import blackjack.domain.game.GameResult; +import blackjack.domain.person.Dealer; +import blackjack.domain.person.Player; +import blackjack.view.InputView; +import blackjack.view.ResultView; +import java.util.List; + +public class BlackJackGame { + + private final Dealer dealer; + private final List players; + + public BlackJackGame() { + dealer = new Dealer(); + players = Player.createPlayers(InputView.getPlayerNames(), dealer); + ResultView.printSetUpResult(dealer.getOpenedCard(), players); + } + + public void play() { + askPlayers(); + giveDealerCard(); + printGameResult(); + } + + private void giveDealerCard() { + final DealerCards dealerCards = dealer.getDealerCards(); + if (dealerCards.canReceiveMoreCard()) { + dealerCards.addCard(dealer.getPickedCard()); + ResultView.printDealerReceiveCard(); + } + } + + private void askPlayers() { + for (Player player : players) { + askPlayer(player); + } + } + + private void askPlayer(Player player) { + final PlayerCards playerCards = player.getPlayerCards(); + while (playerCards.canReceiveMoreCard() && InputView.isHit(player)) { + playerCards.addCard(dealer.getPickedCard()); + } + } + + private void printGameResult() { + ResultView.printDealerAndPlayerCardResult(dealer.getDealerCards(), players); + ResultView.printGameResult(new GameResult(dealer.getDealerCards().getSumOfCards(), players)); + } +} diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java new file mode 100644 index 00000000..1fc18c00 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Card.java @@ -0,0 +1,20 @@ +package blackjack.domain.card; + +public class Card { + + private final Shape shape; + private final Denomination denomination; + + public Card(Shape shape, Denomination denomination) { + this.shape = shape; + this.denomination = denomination; + } + + public Shape getShape() { + return shape; + } + + public Denomination getDenomination() { + return denomination; + } +} diff --git a/src/main/java/blackjack/domain/card/Denomination.java b/src/main/java/blackjack/domain/card/Denomination.java new file mode 100644 index 00000000..aa619afa --- /dev/null +++ b/src/main/java/blackjack/domain/card/Denomination.java @@ -0,0 +1,30 @@ +package blackjack.domain.card; + +public enum Denomination { + + ACE("A", 1), + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + TEN("10", 10), + JACK("J", 10), + QUEEN("Q", 10), + KING("K", 10); + + private final String sign; + private final int value; + + Denomination(String sign, int value) { + this.sign = sign; + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/blackjack/domain/card/Shape.java b/src/main/java/blackjack/domain/card/Shape.java new file mode 100644 index 00000000..fab3c9da --- /dev/null +++ b/src/main/java/blackjack/domain/card/Shape.java @@ -0,0 +1,19 @@ +package blackjack.domain.card; + +public enum Shape { + + HEART("하트"), + DIAMOND("다이아몬드"), + SPADE("스페이드"), + CLUB("클로버"); + + private final String name; + + Shape(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/blackjack/domain/cards/CardDeck.java b/src/main/java/blackjack/domain/cards/CardDeck.java new file mode 100644 index 00000000..57dc0045 --- /dev/null +++ b/src/main/java/blackjack/domain/cards/CardDeck.java @@ -0,0 +1,53 @@ +package blackjack.domain.cards; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Shape; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class CardDeck { + + public static final int FIRST_INDEX = 0; + + private final List cards; + + public CardDeck() { + cards = createCardDeck(); + } + + public Card pickOneCard() { + validateEmptyCardDeck(); + Collections.shuffle(cards); + Card pickedCard = cards.get(FIRST_INDEX); + cards.remove(FIRST_INDEX); + return pickedCard; + } + + public List createCardDeck() { + List cards = new ArrayList<>(); + for (Shape shape : Shape.values()) { + cards.addAll(DenominationByShape(shape)); + } + return cards; + } + + private List DenominationByShape(Shape shape) { + return Arrays.stream(Denomination.values()) + .map(denomination -> new Card(shape, denomination)) + .collect(Collectors.toList()); + } + + private void validateEmptyCardDeck() { + if (cards.isEmpty()) { + throw new IllegalArgumentException("[ERROR] 카드덱이 비어 카드를 뽑을 수 없습니다."); + } + } + + public List getCards() { + return new ArrayList<>(cards); + } +} diff --git a/src/main/java/blackjack/domain/cards/Cards.java b/src/main/java/blackjack/domain/cards/Cards.java new file mode 100644 index 00000000..02a0e7d9 --- /dev/null +++ b/src/main/java/blackjack/domain/cards/Cards.java @@ -0,0 +1,22 @@ +package blackjack.domain.cards; + +import blackjack.domain.card.Card; + +public interface Cards { + + /** + * 카드를 카드 목록에 추가한다. + * + * @return void + * @Param Card + */ + void addCard(Card card); + + /** + * 카드 denomination 의 합을 반환 + * + * @return int + */ + int getSumOfCards(); + +} diff --git a/src/main/java/blackjack/domain/cards/DealerCards.java b/src/main/java/blackjack/domain/cards/DealerCards.java new file mode 100644 index 00000000..d81a93ca --- /dev/null +++ b/src/main/java/blackjack/domain/cards/DealerCards.java @@ -0,0 +1,22 @@ +package blackjack.domain.cards; + +import blackjack.domain.card.Card; +import java.util.List; + +public class DealerCards extends PersonCards { + + private static final int DEALER_MAXIMUM_SUM = 16; + + public DealerCards(List cards) { + super(cards); + } + + @Override + public boolean canReceiveMoreCard() { + return sum <= DEALER_MAXIMUM_SUM; + } + + public Card getCardByIndex(int index) { + return cards.get(index); + } +} diff --git a/src/main/java/blackjack/domain/cards/PersonCards.java b/src/main/java/blackjack/domain/cards/PersonCards.java new file mode 100644 index 00000000..1c673134 --- /dev/null +++ b/src/main/java/blackjack/domain/cards/PersonCards.java @@ -0,0 +1,55 @@ +package blackjack.domain.cards; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; +import java.util.ArrayList; +import java.util.List; + +public abstract class PersonCards implements Cards { + + protected List cards; + protected int sum; + + public PersonCards(List cards) { + initCard(cards); + initSum(); + } + + @Override + public void addCard(Card card) { + cards.add(card); + updateSumByDenomination(card.getDenomination()); + } + + @Override + public int getSumOfCards() { + return sum; + } + + abstract boolean canReceiveMoreCard(); + + private void updateSumByDenomination(Denomination denomination) { + if (canAddBiggerValueByAce(denomination)) { + sum += 11; + return; + } + sum += denomination.getValue(); + } + + private boolean canAddBiggerValueByAce(Denomination denomination) { + return denomination.equals(Denomination.ACE) && sum <= 10; + } + + private void initCard(List cards) { + this.cards = new ArrayList<>(); + this.cards.addAll(cards); + } + + private void initSum() { + this.cards.forEach(card -> updateSumByDenomination(card.getDenomination())); + } + + public List getCards() { + return new ArrayList<>(cards); + } +} diff --git a/src/main/java/blackjack/domain/cards/PlayerCards.java b/src/main/java/blackjack/domain/cards/PlayerCards.java new file mode 100644 index 00000000..f4030daf --- /dev/null +++ b/src/main/java/blackjack/domain/cards/PlayerCards.java @@ -0,0 +1,18 @@ +package blackjack.domain.cards; + +import blackjack.domain.card.Card; +import java.util.List; + +public class PlayerCards extends PersonCards { + + private static final int PLAYER_MAXIMUM_SUM = 21; + + public PlayerCards(List cards) { + super(cards); + } + + @Override + public boolean canReceiveMoreCard() { + return sum <= PLAYER_MAXIMUM_SUM; + } +} diff --git a/src/main/java/blackjack/domain/game/GameResult.java b/src/main/java/blackjack/domain/game/GameResult.java new file mode 100644 index 00000000..1fa5cfcd --- /dev/null +++ b/src/main/java/blackjack/domain/game/GameResult.java @@ -0,0 +1,37 @@ +package blackjack.domain.game; + +import blackjack.domain.person.Player; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GameResult { + + private final Map playerResult; + private int dealerWin; + + public GameResult(int dealerSum, List players) { + this.playerResult = new HashMap<>(); + this.dealerWin = 0; + initResult(dealerSum, players); + } + + private void initResult(int dealerSum, List players) { + for (Player player : players) { + if (player.getPlayerCards().getSumOfCards() < dealerSum) { + dealerWin++; + playerResult.put(player.getName(), "패"); + continue; + } + playerResult.put(player.getName(), "승"); + } + } + + public Map getPlayerResult() { + return playerResult; + } + + public int getDealerWin() { + return dealerWin; + } +} diff --git a/src/main/java/blackjack/domain/person/Dealer.java b/src/main/java/blackjack/domain/person/Dealer.java new file mode 100644 index 00000000..f95179af --- /dev/null +++ b/src/main/java/blackjack/domain/person/Dealer.java @@ -0,0 +1,40 @@ +package blackjack.domain.person; + +import blackjack.domain.card.Card; +import blackjack.domain.cards.CardDeck; +import blackjack.domain.cards.DealerCards; +import java.util.ArrayList; +import java.util.List; + +public class Dealer { + + private static final int INITIAL_PICK_NUMBER = 2; + private static final int FIRST_INDEX = 0; + + private final CardDeck cardDeck = new CardDeck(); + private final DealerCards dealerCards; + + public Dealer() { + this.dealerCards = new DealerCards(getInitialPickedCards()); + } + + public List getInitialPickedCards() { + List cards = new ArrayList<>(); + for (int i = 0; i < INITIAL_PICK_NUMBER; i++) { + cards.add(cardDeck.pickOneCard()); + } + return cards; + } + + public Card getPickedCard() { + return cardDeck.pickOneCard(); + } + + public Card getOpenedCard() { + return dealerCards.getCardByIndex(FIRST_INDEX); + } + + public DealerCards getDealerCards() { + return dealerCards; + } +} diff --git a/src/main/java/blackjack/domain/person/Player.java b/src/main/java/blackjack/domain/person/Player.java new file mode 100644 index 00000000..a9273932 --- /dev/null +++ b/src/main/java/blackjack/domain/person/Player.java @@ -0,0 +1,31 @@ +package blackjack.domain.person; + +import blackjack.domain.card.Card; +import blackjack.domain.cards.PlayerCards; +import java.util.List; +import java.util.stream.Collectors; + +public class Player { + + private final PlayerCards playerCards; + private final String name; + + public Player(String name, List cards) { + this.playerCards = new PlayerCards(cards); + this.name = name; + } + + public static List createPlayers(List playerNames, Dealer dealer) { + return playerNames.stream() + .map(name -> new Player(name, dealer.getInitialPickedCards())) + .collect(Collectors.toList()); + } + + public PlayerCards getPlayerCards() { + return playerCards; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..6ff82ebf --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,23 @@ +package blackjack.view; + +import blackjack.domain.person.Player; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + + private static final Scanner sc = new Scanner(System.in); + + public static List getPlayerNames() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요. (쉼표 기준으로 분리)"); + String[] playerNames = sc.nextLine().split(","); + return Arrays.stream(playerNames).collect(Collectors.toList()); + } + + public static boolean isHit(Player player) { + System.out.println(player.getName() + "는 한 장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)"); + return sc.nextLine().equals("y"); + } +} diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java new file mode 100644 index 00000000..2d37370f --- /dev/null +++ b/src/main/java/blackjack/view/ResultView.java @@ -0,0 +1,58 @@ +package blackjack.view; + +import blackjack.domain.card.Card; +import blackjack.domain.cards.DealerCards; +import blackjack.domain.game.GameResult; +import blackjack.domain.person.Player; +import java.util.List; +import java.util.stream.Collectors; + +public class ResultView { + + public static void printSetUpResult(Card openedCard, List players) { + List playerNames = players.stream().map(Player::getName).collect(Collectors.toList()); + System.out.println("딜러와 " + String.join(", ", playerNames) + "에게 2장씩 나눠줬습니다."); + System.out.println("딜러: " + openedCard.getDenomination().getValue() + openedCard.getShape().getName()); + players.forEach(ResultView::printCardsOf); + } + + public static void printCardsOf(Player player) { + System.out.print(player.getName() + "카드: "); + List cardNames = player.getPlayerCards().getCards().stream() + .map(card -> card.getDenomination().getValue() + card.getShape().getName()) + .collect(Collectors.toList()); + System.out.println(String.join(", ", cardNames)); + } + + public static void printDealerReceiveCard() { + System.out.println("딜러는 16 이하라 한 장의 카드를 더 받았습니다."); + } + + + public static void printDealerAndPlayerCardResult(DealerCards dealerCards, List players) { + System.out.print("딜러 카드: "); + List dealerCardNames = dealerCards.getCards().stream() + .map(card -> card.getDenomination().getValue() + card.getShape().getName()) + .collect(Collectors.toList()); + System.out.println(String.join(", ", dealerCardNames) + " - 결과 : " + dealerCards.getSumOfCards()); + + for (Player player : players) { + System.out.print(player.getName() + "카드: "); + List playerCardNames = player.getPlayerCards().getCards().stream() + .map(card -> card.getDenomination().getValue() + card.getShape().getName()) + .collect(Collectors.toList()); + System.out.println( + String.join(", ", playerCardNames) + "- 결과 : " + player.getPlayerCards().getSumOfCards()); + } + } + + public static void printGameResult(GameResult gameResult) { + System.out.println("## 최종승패"); + System.out.println("딜러: " + gameResult.getDealerWin() + "승 " + (gameResult.getPlayerResult().size() + - gameResult.getDealerWin()) + "패"); + gameResult.getPlayerResult().keySet() + .forEach(playerName -> { + System.out.println(playerName + ": " + gameResult.getPlayerResult().get(playerName)); + }); + } +} diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/rentcar/Avante.java b/src/main/java/rentcar/Avante.java new file mode 100644 index 00000000..794afa11 --- /dev/null +++ b/src/main/java/rentcar/Avante.java @@ -0,0 +1,20 @@ +package rentcar; + +public class Avante extends Car { + + private static final int DISTANCE_PER_LITER = 15; + + public Avante(double distance) { + super(distance); + } + + @Override + public String getName() { + return "Avante"; + } + + @Override + public double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } +} diff --git a/src/main/java/rentcar/Car.java b/src/main/java/rentcar/Car.java new file mode 100644 index 00000000..b899fbf9 --- /dev/null +++ b/src/main/java/rentcar/Car.java @@ -0,0 +1,21 @@ +package rentcar; + +public abstract class Car implements MotorVehicle { + + protected final double distance; + + public Car(double distance) { + this.distance = distance; + } + + @Override + public double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } + + public double getTripDistance() { + return distance; + } + + public abstract String getName(); +} diff --git a/src/main/java/rentcar/K5.java b/src/main/java/rentcar/K5.java new file mode 100644 index 00000000..909db19a --- /dev/null +++ b/src/main/java/rentcar/K5.java @@ -0,0 +1,20 @@ +package rentcar; + +public class K5 extends Car { + + private static final int DISTANCE_PER_LITER = 13; + + public K5(double distance) { + super(distance); + } + + @Override + public String getName() { + return "K5"; + } + + @Override + public double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } +} diff --git a/src/main/java/rentcar/MotorVehicle.java b/src/main/java/rentcar/MotorVehicle.java new file mode 100644 index 00000000..6936b83d --- /dev/null +++ b/src/main/java/rentcar/MotorVehicle.java @@ -0,0 +1,18 @@ +package rentcar; + +public interface MotorVehicle { + + /** + * 리터당 이동 거리 반환 + * + * @return double + */ + double getDistancePerLiter(); + + /** + * 주입해야 할 연료량 반환 + * + * @return double + */ + double getChargeQuantity(); +} diff --git a/src/main/java/rentcar/RentCompany.java b/src/main/java/rentcar/RentCompany.java new file mode 100644 index 00000000..f3a65ddb --- /dev/null +++ b/src/main/java/rentcar/RentCompany.java @@ -0,0 +1,30 @@ +package rentcar; + +import java.util.ArrayList; +import java.util.List; + +public class RentCompany { + + private static final List cars = new ArrayList<>(); + private static final String NEWLINE = System.getProperty("line.separator"); + private static final String COLON = " : "; + + private RentCompany() { + } + + public static RentCompany create() { + return new RentCompany(); + } + + public void addCar(Car car) { + cars.add(car); + } + + public String generateReport() { + final StringBuilder builder = new StringBuilder(); + cars.forEach( + car -> builder.append(car.getName()).append(COLON).append((int) car.getChargeQuantity()) + .append("리터").append(NEWLINE)); + return builder.toString(); + } +} diff --git a/src/main/java/rentcar/Sonata.java b/src/main/java/rentcar/Sonata.java new file mode 100644 index 00000000..a956f20b --- /dev/null +++ b/src/main/java/rentcar/Sonata.java @@ -0,0 +1,20 @@ +package rentcar; + +public class Sonata extends Car { + + private static final int DISTANCE_PER_LITER = 10; + + public Sonata(double distance) { + super(distance); + } + + @Override + public String getName() { + return "Sonata"; + } + + @Override + public double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } +} diff --git a/src/test/java/blackjack/domain/cards/CardDeckTest.java b/src/test/java/blackjack/domain/cards/CardDeckTest.java new file mode 100644 index 00000000..5bc31a2b --- /dev/null +++ b/src/test/java/blackjack/domain/cards/CardDeckTest.java @@ -0,0 +1,43 @@ +package blackjack.domain.cards; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import blackjack.domain.card.Card; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +class CardDeckTest { + + @Test + void 인스턴스를_생성하면_52가지_카드를_가진다() { + CardDeck cardDeck = new CardDeck(); + assertThat(cardDeck.getCards()).hasSize(52); + } + + @Test + void 카드를_뽑으면_카드_목록에서_제거된다() { + //given + CardDeck cardDeck = new CardDeck(); + //when + Card pickedCard = cardDeck.pickOneCard(); + //then + assertThat(cardDeck.getCards().contains(pickedCard)).isFalse(); + } + + @Test + void 카드덱이_비면_카드를_뽑을_수_없다() { + //given + CardDeck cardDeck = new CardDeck() { + @Override + public List createCardDeck() { + return new ArrayList<>(); + } + }; + //when, then + assertThatThrownBy(cardDeck::pickOneCard) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("[ERROR] 카드덱이 비어 카드를 뽑을 수 없습니다."); + } +} diff --git a/src/test/java/blackjack/domain/cards/DealerCardsTest.java b/src/test/java/blackjack/domain/cards/DealerCardsTest.java new file mode 100644 index 00000000..d7891d41 --- /dev/null +++ b/src/test/java/blackjack/domain/cards/DealerCardsTest.java @@ -0,0 +1,58 @@ +package blackjack.domain.cards; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Shape; +import java.util.Arrays; +import org.junit.jupiter.api.Test; + +class DealerCardsTest { + + @Test + void 카드를_추가하면_sum이_업데이트된다() { + DealerCards dealerCards = new DealerCards(Arrays.asList( + new Card(Shape.HEART, Denomination.THREE), + new Card(Shape.HEART, Denomination.TWO) + )); + + dealerCards.addCard(new Card(Shape.HEART, Denomination.NINE)); + + assertThat(dealerCards.getSumOfCards()).isEqualTo(14); + } + + @Test + void 카드들의_숫자합이_10_초과일_때_ACE는_1점으로_sum에_업데이트된다() { + DealerCards dealerCards = new DealerCards(Arrays.asList( + new Card(Shape.HEART, Denomination.KING), + new Card(Shape.HEART, Denomination.KING) + )); + + dealerCards.addCard(new Card(Shape.HEART, Denomination.ACE)); + + assertThat(dealerCards.getSumOfCards()).isEqualTo(21); + } + + @Test + void 카드들의_숫자합이_10_이하일_때_ACE는_11점으로_sum에_업데이트된다() { + DealerCards dealerCards = new DealerCards(Arrays.asList( + new Card(Shape.HEART, Denomination.TWO), + new Card(Shape.HEART, Denomination.THREE) + )); + + dealerCards.addCard(new Card(Shape.HEART, Denomination.ACE)); + + assertThat(dealerCards.getSumOfCards()).isEqualTo(16); + } + + @Test + void 카드들의_숫자합이_16을_초과하면_카드를_더_받을_수_없다() { + DealerCards dealerCards = new DealerCards(Arrays.asList( + new Card(Shape.HEART, Denomination.KING), + new Card(Shape.HEART, Denomination.ACE) + )); + + assertThat(dealerCards.canReceiveMoreCard()).isFalse(); + } +} diff --git a/src/test/java/blackjack/domain/cards/PlayerCardsTest.java b/src/test/java/blackjack/domain/cards/PlayerCardsTest.java new file mode 100644 index 00000000..f0ef2dc2 --- /dev/null +++ b/src/test/java/blackjack/domain/cards/PlayerCardsTest.java @@ -0,0 +1,59 @@ +package blackjack.domain.cards; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Shape; +import java.util.Arrays; +import org.junit.jupiter.api.Test; + +class PlayerCardsTest { + + @Test + void 카드를_추가하면_sum이_업데이트된다() { + PlayerCards playerCards = new PlayerCards(Arrays.asList( + new Card(Shape.HEART, Denomination.THREE), + new Card(Shape.HEART, Denomination.TWO) + )); + + playerCards.addCard(new Card(Shape.HEART, Denomination.NINE)); + + assertThat(playerCards.getSumOfCards()).isEqualTo(14); + } + + @Test + void 카드들의_숫자합이_10_초과일_때_ACE는_1점으로_sum에_업데이트된다() { + PlayerCards playerCards = new PlayerCards(Arrays.asList( + new Card(Shape.HEART, Denomination.KING), + new Card(Shape.HEART, Denomination.KING) + )); + + playerCards.addCard(new Card(Shape.HEART, Denomination.ACE)); + + assertThat(playerCards.getSumOfCards()).isEqualTo(21); + } + + @Test + void 카드들의_숫자합이_10_이하일_때_ACE는_11점으로_sum에_업데이트된다() { + PlayerCards playerCards = new PlayerCards(Arrays.asList( + new Card(Shape.HEART, Denomination.THREE), + new Card(Shape.HEART, Denomination.TWO) + )); + + playerCards.addCard(new Card(Shape.HEART, Denomination.ACE)); + + assertThat(playerCards.getSumOfCards()).isEqualTo(16); + } + + @Test + void 카드들의_숫자합이_21을_초과하면_카드를_더_받을_수_없다() { + PlayerCards playerCards = new PlayerCards(Arrays.asList( + new Card(Shape.HEART, Denomination.KING), + new Card(Shape.HEART, Denomination.ACE) + )); + playerCards.addCard(new Card(Shape.CLUB,Denomination.KING)); + + assertThat(playerCards.canReceiveMoreCard()).isFalse(); + } +} diff --git a/src/test/java/blackjack/domain/game/GameResultTest.java b/src/test/java/blackjack/domain/game/GameResultTest.java new file mode 100644 index 00000000..81a3d665 --- /dev/null +++ b/src/test/java/blackjack/domain/game/GameResultTest.java @@ -0,0 +1,35 @@ +package blackjack.domain.game; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Shape; +import blackjack.domain.person.Player; +import java.util.Arrays; +import java.util.Map; +import org.junit.jupiter.api.Test; + +class GameResultTest { + + @Test + void 게임_결과를_구한다() { + Player a = new Player("a", Arrays.asList( + new Card(Shape.HEART, Denomination.NINE), + new Card(Shape.HEART, Denomination.TWO) + )); + Player b = new Player("b", Arrays.asList( + new Card(Shape.HEART, Denomination.ACE), + new Card(Shape.HEART, Denomination.KING) + )); + GameResult gameResult = new GameResult(12, Arrays.asList(a, b)); + Map playerResult = gameResult.getPlayerResult(); + + assertAll( + () -> assertThat(playerResult.get("a")).isEqualTo("패"), + () -> assertThat(playerResult.get("b")).isEqualTo("승"), + () -> assertThat(gameResult.getDealerWin()).isEqualTo(1) + ); + } +} diff --git a/src/test/java/blackjack/domain/person/DealerTest.java b/src/test/java/blackjack/domain/person/DealerTest.java new file mode 100644 index 00000000..a6f86a7d --- /dev/null +++ b/src/test/java/blackjack/domain/person/DealerTest.java @@ -0,0 +1,32 @@ +package blackjack.domain.person; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class DealerTest { + + private Dealer dealer; + + @BeforeEach + void setUp() { + dealer = new Dealer(); + } + + @Test + void 딜러는_초기화를_위해_두장의_카드를_반환한다() { + //when then + assertThat(dealer.getInitialPickedCards()).hasSize(2); + } + + @Test + void 딜러는_오픈용_카드를_반환한다() { + //given + Card actual = dealer.getDealerCards().getCards().get(0); + + //when then + assertThat(dealer.getOpenedCard()).isEqualTo(actual); + } +} diff --git a/src/test/java/blackjack/domain/person/PlayerTest.java b/src/test/java/blackjack/domain/person/PlayerTest.java new file mode 100644 index 00000000..7cb45594 --- /dev/null +++ b/src/test/java/blackjack/domain/person/PlayerTest.java @@ -0,0 +1,39 @@ +package blackjack.domain.person; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Shape; +import java.util.Arrays; +import org.junit.jupiter.api.Test; + +class PlayerTest { + + @Test + void 플레이어를_생성하면_카드를_두장_가져야_한다() { + //given, when + Player player = new Player("kim", Arrays.asList( + new Card(Shape.SPADE, Denomination.KING), + new Card(Shape.SPADE, Denomination.KING) + )); + + //then + assertThat(player.getPlayerCards().getCards()).hasSize(2); + } + + @Test + void ACE는_1과_11점_두가지_모두_가능하다() { + //given + Player player = new Player("kim", Arrays.asList( + new Card(Shape.SPADE, Denomination.KING), + new Card(Shape.SPADE, Denomination.ACE) + )); + + //when + int actual = player.getPlayerCards().getSumOfCards(); + + //then + assertThat(actual).isEqualTo(21); + } +} diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/test/java/rentcar/RentCompanyTest.java b/src/test/java/rentcar/RentCompanyTest.java new file mode 100644 index 00000000..2e3845c3 --- /dev/null +++ b/src/test/java/rentcar/RentCompanyTest.java @@ -0,0 +1,30 @@ +package rentcar; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class RentCompanyTest { + private static final String NEWLINE = System.getProperty("line.separator"); + + @Test + public void report() { + + RentCompany company = RentCompany.create(); // factory method를 사용해 생성 + company.addCar(new Sonata(150)); + company.addCar(new K5(260)); + company.addCar(new Sonata(120)); + company.addCar(new Avante(300)); + company.addCar(new K5(390)); + + String report = company.generateReport(); + assertThat(report).isEqualTo( + "Sonata : 15리터" + NEWLINE + + "K5 : 20리터" + NEWLINE + + "Sonata : 12리터" + NEWLINE + + "Avante : 20리터" + NEWLINE + + "K5 : 30리터" + NEWLINE + ); + } +}