diff --git a/README.md b/README.md index 03ba7ed3..f9c4c67c 100644 --- a/README.md +++ b/README.md @@ -1 +1,70 @@ -# java-blackjack \ No newline at end of file +# 연료 주입 + +## 기능 요구사항 +우리 회사는 렌터카를 운영하고 있다. 현재 보유하고 있는 차량은 Sonata 2대, Avante 1대, K5 2대로 총 5대의 차량을 보유하고 있다. 고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. 이 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성해야 한다. +각 차량별 연비는 다음과 같다. +* Sonata : 10km/리터 +* Avante : 15km/리터 +* K5 : 13km/리터 + +## 기능 목록 + +- [x] 회사를 생성한다. - RentCompany + - [x] 자동차를 생성한다. - RentCompany.addCar + - 종류 : Sonata, Avante, k5 + - 개수 : Sonata 2대, Avante 1대, K5 2대 + - [x] 주입해야할 연료량을 계산한다. - Car.getChargeQuantity() + - [x] 차량 별로 주입해야할 보고서를 생성한다. - RentCompany.generateReport() + +# 블랙잭 + +## 기능 요구사항 +블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + +카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. +딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +게임을 완료한 후 각 플레이어별로 승패를 출력한다. + +- [X] 딜러, 플레이어 (공통) - Participant + - 이름 + - 보유 카드 + - 승, 패 기록 + - 첫번째 2장의 카드를 뽑음 + - 이후 1장씩 카드를 뽑음 + - 점수를 계산 + - 보유하고 있는 카드 정보 반환 +- [X] 딜러 - Dealer + - 딜러는 카드 점수가 16 이하이면 카드를 1장 더 받음 +- [X] 플레이어 - Player + - 플레이어는 카드를 1장 더 받을지 안받을지 입력을 받아서 카드를 받음 + +- [X] 카드 - Card + - 종류 : ♦︎다이아, ♥하트, ♠스페이드, ♣클로버 + - 숫자 : 1 ~ 9, A (= 1, 11), K (= 10), Q (= 10), J (= 10) + - 에이스 카드일 경우, 점수가 15 미만이면 에이스카드점수는 11점이 되고, 16이상이면 점수가 1점이 됨 + - 카드 정보를 반환 + +- [X] 덱 - Deck + - 카드 52장을 생성하고 관리 + - 생성시 미리 덱을 섞어서 반환 + - 카드를 여러장 뽑음 + - 카드를 한장 뽑음 + +- [X] 사용자가 가지고 있는 카드 묶음 - ParticipantsCards + - 가지고 있는 카드를 추가 + - 카드의 점수를 계산 + - 가지고 있는 카드의 정보를 반환 + +- [X] 게임 - GameController + - 게임 진행 + +- [X] 입력 - InputView + - 게임 참여자 입력 (쉼표로 구분) + - 카드를 더 받을지 입력 (y/n) + - 빈 입력을 허용하지 않음 + +- [X] 출력 - PrintView + - 뽑은 카드 결과 출력 + - 게임 결과 출력 + - 최종 승패 출력 diff --git a/src/main/java/blackjack/BlackjackApplication.java b/src/main/java/blackjack/BlackjackApplication.java new file mode 100644 index 00000000..8980a8b4 --- /dev/null +++ b/src/main/java/blackjack/BlackjackApplication.java @@ -0,0 +1,10 @@ +package blackjack; + +import blackjack.controller.GameController; + +public class BlackjackApplication { + + public static void main(String[] args) { + GameController.start(); + } +} diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java new file mode 100644 index 00000000..ac7aac2a --- /dev/null +++ b/src/main/java/blackjack/controller/GameController.java @@ -0,0 +1,28 @@ +package blackjack.controller; + +import blackjack.domain.Dealer; +import blackjack.domain.Participants; +import blackjack.domain.Players; +import blackjack.view.InputView; +import blackjack.view.PrintView; +import java.util.List; + +public class GameController { + + public static void start() { + List name = InputView.inputNames(); + + Players players = Players.from(name); + Dealer dealer = new Dealer("딜러"); + Participants participants = Participants.from(players, dealer); + + participants.drawCardMultiple(2); + PrintView.printFirstDrawCards(participants); + + participants.drawCardContinue(1); + PrintView.printGameResult(participants); + + participants.judgeScore(); + PrintView.printWinLose(participants); + } +} diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java new file mode 100644 index 00000000..d8edb292 --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,70 @@ +package blackjack.domain; + +import java.util.function.IntUnaryOperator; + +public class Card { + + private final CardType cardType; + private final CardValue cardValue; + + Card(CardType cardType, CardValue cardValue) { + this.cardType = cardType; + this.cardValue = cardValue; + } + + public int getScore(int currentScore) { + return this.cardValue.intUnaryOperator.applyAsInt(currentScore); + } + + public CardValue getCardValue() { + return cardValue; + } + + public String toString() { + return cardValue.number + cardType.name; + } + + public enum CardType { + SPADE("스페이드"), + CLOVER("클로버"), + HEART("하트"), + DIAMOND("다이아몬드"); + + private final String name; + + CardType(String name) { + this.name = name; + } + } + + public enum CardValue { + ACE("A", currentScore -> currentScore < 15 ? 11 : 1), + TWO("2", currentScore -> 2), + THREE("3", currentScore -> 3), + FOUR("4", currentScore -> 4), + FIVE("5", currentScore -> 5), + SIX("6", currentScore -> 6), + SEVEN("7", currentScore -> 7), + EIGHT("8", currentScore -> 8), + NINE("9", currentScore -> 9), + TEN("10", currentScore -> 10), + QUEEN("Q", currentScore -> 10), + JACK("J", currentScore -> 10), + KING("K", currentScore -> 10); + + private final String number; + private final IntUnaryOperator intUnaryOperator; + + CardValue(String number, IntUnaryOperator intUnaryOperator) { + this.number = number; + this.intUnaryOperator = intUnaryOperator; + } + + public boolean isEqualCardValue(Card card) { + return this.equals(card.getCardValue()); + } + } +} + + + diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java new file mode 100644 index 00000000..8e5aa70c --- /dev/null +++ b/src/main/java/blackjack/domain/Dealer.java @@ -0,0 +1,27 @@ +package blackjack.domain; + +public class Dealer extends Participant { + + public Dealer(String name) { + super(name); + } + + @Override + public void drawCardMultiple(Deck deck, int number) { + cards.addCards(deck.drawMultiple(number)); + } + + @Override + public void drawCardContinue(Deck deck) { + if (cards.sumCardScore() > 17) { + return; + } + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + cards.addCards(deck.drawMultiple(1)); + } + + @Override + public String scoreResult() { + return name + " : " + winScore + "승" + loseScore + "패"; + } +} diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java new file mode 100644 index 00000000..def4c8e1 --- /dev/null +++ b/src/main/java/blackjack/domain/Deck.java @@ -0,0 +1,48 @@ +package blackjack.domain; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Deque; +import java.util.List; + +public class Deck { + + private final Deque deck = new ArrayDeque<>(); + + public Deck(List cardTypes, List cardValues) { + for (CardType cardType : cardTypes) { + for (CardValue cardValue : cardValues) { + deck.add(new Card(cardType, cardValue)); + } + } + } + + public static Deck create() { + List types = Arrays.asList(CardType.values()); + Collections.shuffle(types); + + List values = Arrays.asList(CardValue.values()); + Collections.shuffle(values); + + return new Deck(types, values); + } + + public List drawMultiple(int num) { + List cards = new ArrayList<>(); + for (int i = 0; i < num; i++) { + cards.add(draw()); + } + return cards; + } + + public Card draw() { + if (deck.size() == 0) { + throw new IllegalStateException("패가 더이상 존재하지 않습니다."); + } + return deck.pop(); + } +} diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java new file mode 100644 index 00000000..8d6efe00 --- /dev/null +++ b/src/main/java/blackjack/domain/Participant.java @@ -0,0 +1,49 @@ +package blackjack.domain; + +import java.util.ArrayList; + +abstract public class Participant { + + private static final String COLON = " : "; + + protected final String name; + protected final ParticipantCards cards; + protected int winScore, loseScore; + + public Participant(String name, ParticipantCards cards, int winCount, int loseCount) { + this.name = name; + this.cards = cards; + this.winScore = winCount; + this.loseScore = loseCount; + } + + public Participant(String name) { + this(name, new ParticipantCards(new ArrayList<>()), 0, 0); + } + + public final void judgeScore(int maxScore) { + if (sumCardScore() == maxScore) { + winScore++; + return; + } + loseScore++; + } + + public final String getName() { + return name; + } + + public final String holdingInfo() { + return name + COLON + cards.toString(); + } + + public final int sumCardScore() { + return cards.sumCardScore(); + } + + public abstract void drawCardMultiple(Deck deck, int number); + + public abstract void drawCardContinue(Deck deck); + + public abstract String scoreResult(); +} diff --git a/src/main/java/blackjack/domain/ParticipantCards.java b/src/main/java/blackjack/domain/ParticipantCards.java new file mode 100644 index 00000000..7b9b984c --- /dev/null +++ b/src/main/java/blackjack/domain/ParticipantCards.java @@ -0,0 +1,42 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ParticipantCards { + + private static final String COMMA = ", "; + + private final List cards; + + public ParticipantCards(List cards) { + this.cards = new ArrayList<>(cards); + } + + public void addCards(List drawCards) { + cards.addAll(drawCards); + } + + public int sumCardScore() { + return cards.stream() + .reduce(0, (x, y) -> x + y.getScore(x), Integer::sum); + } + + public List getCards() { + return Collections.unmodifiableList(cards); + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < cards.size(); i++) { + sb.append(cards.get(i).toString()); + if (i != cards.size() - 1) { + sb.append(COMMA); + } + } + + return sb.toString(); + } +} diff --git a/src/main/java/blackjack/domain/Participants.java b/src/main/java/blackjack/domain/Participants.java new file mode 100644 index 00000000..9c743383 --- /dev/null +++ b/src/main/java/blackjack/domain/Participants.java @@ -0,0 +1,70 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Participants { + + private static final String COMMA = ", "; + + private final List participants; + private final Deck deck; + + private Participants(List participants) { + this.deck = Deck.create(); + this.participants = new ArrayList<>(participants); + } + + public static Participants from(Players players, Dealer dealer) { + List participants = new ArrayList<>(); + participants.add(dealer); + participants.addAll(players.getPlayers()); + return new Participants(participants); + } + + public void drawCardMultiple(int number) { + for (Participant participant : participants) { + participant.drawCardMultiple(deck, number); + } + } + + public void drawCardContinue(int number) { + for (Participant participant : participants) { + participant.drawCardContinue(deck); + } + } + + public void judgeScore() { + int maxScore = calculateMaxScore(); + for (Participant participant : participants) { + participant.judgeScore(maxScore); + } + } + + private int calculateMaxScore() { + return participants.stream() + .mapToInt(participant -> participant.sumCardScore()) + .max() + .orElseThrow(() -> { + throw new IllegalStateException("최대값을 구할 수 없습니다."); + }); + } + + public List getParticipants() { + return Collections.unmodifiableList(participants); + } + + public String participantsNames() { + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < participants.size(); i++) { + sb.append(participants.get(i).getName()); + if (i != participants.size() - 1) { + sb.append(COMMA); + } + } + + return sb.toString(); + } +} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 00000000..1aa78f66 --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,33 @@ +package blackjack.domain; + +import blackjack.view.InputView; + +public class Player extends Participant { + + public Player(String name) { + super(name); + } + + @Override + public void drawCardMultiple(Deck deck, int number) { + cards.addCards(deck.drawMultiple(number)); + } + + @Override + public void drawCardContinue(Deck deck) { + System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + if (InputView.isContinue()) { + cards.addCards(deck.drawMultiple(1)); + System.out.println(holdingInfo()); + drawCardContinue(deck); + } + } + + @Override + public String scoreResult() { + if (winScore > 0) { + return name + " : " + "승"; + } + return name + " : " + "패"; + } +} diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java new file mode 100644 index 00000000..0dc94018 --- /dev/null +++ b/src/main/java/blackjack/domain/Players.java @@ -0,0 +1,25 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class Players { + + private final List players; + + private Players(List players) { + this.players = new ArrayList<>(players); + } + + public static Players from(final List names) { + return new Players(names.stream() + .map(Player::new) + .collect(Collectors.toList())); + } + + public List getPlayers() { + return Collections.unmodifiableList(players); + } +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..d3475278 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,42 @@ +package blackjack.view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + + private static final String YES = "y"; + private static final String DELIMITER_COMMA = ","; + + public static List inputNames() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + return splitNames(input()); + } + + public static boolean isContinue() { + return input().equals(YES); + } + + private static String input() { + final Scanner sc = new Scanner(System.in); + final String input = sc.nextLine().trim(); + validateBlank(input); + + return input; + } + + private static List splitNames(String input) { + String[] split = input.split(DELIMITER_COMMA); + + return Arrays.stream(split) + .collect(Collectors.toList()); + } + + private static void validateBlank(final String input) { + if (input.isEmpty()) { + throw new IllegalArgumentException("입력은 공백일 수 없습니다."); + } + } +} diff --git a/src/main/java/blackjack/view/PrintView.java b/src/main/java/blackjack/view/PrintView.java new file mode 100644 index 00000000..c8ff5401 --- /dev/null +++ b/src/main/java/blackjack/view/PrintView.java @@ -0,0 +1,29 @@ +package blackjack.view; + +import blackjack.domain.Participant; +import blackjack.domain.Participants; +import java.util.List; + +public class PrintView { + + public static void printFirstDrawCards(Participants participants) { + System.out.println(participants.participantsNames() + "에게 2장의 카드를 나누었습니다."); + + List participantList = participants.getParticipants(); + participantList.stream() + .forEach(participant -> System.out.println(participant.holdingInfo())); + } + + public static void printGameResult(Participants participants) { + List participantList = participants.getParticipants(); + participantList.stream() + .forEach(participant -> System.out.println( + participant.holdingInfo() + "- 결과 : " + participant.sumCardScore())); + } + + public static void printWinLose(Participants participants) { + List participantList = participants.getParticipants(); + participantList.stream() + .forEach(participant -> System.out.println(participant.scoreResult())); + } +} 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/fuel/domain/Avante.java b/src/main/java/fuel/domain/Avante.java new file mode 100644 index 00000000..6782d472 --- /dev/null +++ b/src/main/java/fuel/domain/Avante.java @@ -0,0 +1,26 @@ +package fuel.domain; + +public class Avante extends Car { + + private static final String NAME = "Avante"; + private static final int DISTANCE_PER_LITER = 15; + + public Avante(double tripDistance) { + super(tripDistance); + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/fuel/domain/Car.java b/src/main/java/fuel/domain/Car.java new file mode 100644 index 00000000..bec9ffc5 --- /dev/null +++ b/src/main/java/fuel/domain/Car.java @@ -0,0 +1,20 @@ +package fuel.domain; + +abstract public class Car { + + protected final double tripDistance; + + protected Car(double tripDistance) { + this.tripDistance = tripDistance; + } + + final double calculateChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } + + abstract double getDistancePerLiter(); + + abstract double getTripDistance(); + + abstract String getName(); +} diff --git a/src/main/java/fuel/domain/K5.java b/src/main/java/fuel/domain/K5.java new file mode 100644 index 00000000..c5d90ca6 --- /dev/null +++ b/src/main/java/fuel/domain/K5.java @@ -0,0 +1,26 @@ +package fuel.domain; + +public class K5 extends Car { + + private static final String NAME = "K5"; + private static final int DISTANCE_PER_LITER = 13; + + public K5(double tripDistance) { + super(tripDistance); + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/fuel/domain/RentCompany.java b/src/main/java/fuel/domain/RentCompany.java new file mode 100644 index 00000000..4db7fa75 --- /dev/null +++ b/src/main/java/fuel/domain/RentCompany.java @@ -0,0 +1,35 @@ +package fuel.domain; + +import java.util.ArrayList; +import java.util.List; + +public class RentCompany { + + private static final String NEWLINE = "\n"; + private static final String REPORT_VIEW = "%s : %d리터" + NEWLINE; + + private final List cars; + + private RentCompany() { + cars = new ArrayList<>(); + } + + public static RentCompany create() { + return new RentCompany(); + } + + public void addCar(Car car) { + cars.add(car); + } + + public String generateReport() { + StringBuilder stringBuilder = new StringBuilder(); + + for (Car car : cars) { + stringBuilder.append( + String.format(REPORT_VIEW, car.getName(), (int) car.calculateChargeQuantity())); + } + + return stringBuilder.toString(); + } +} diff --git a/src/main/java/fuel/domain/Sonata.java b/src/main/java/fuel/domain/Sonata.java new file mode 100644 index 00000000..43c90320 --- /dev/null +++ b/src/main/java/fuel/domain/Sonata.java @@ -0,0 +1,26 @@ +package fuel.domain; + +public class Sonata extends Car { + + private static final String NAME = "Sonata"; + private static final int DISTANCE_PER_LITER = 10; + + public Sonata(double tripDistance) { + super(tripDistance); + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java new file mode 100644 index 00000000..9eacd9bf --- /dev/null +++ b/src/test/java/blackjack/domain/CardTest.java @@ -0,0 +1,81 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class CardTest { + + @DisplayName("cardValue 가 같은지 확인") + @Test + void cardValueEqual() { + // given + Card card1 = new Card(CardType.SPADE, CardValue.KING); + Card card2 = new Card(CardType.CLOVER, CardValue.KING); + + // when + boolean result = card1.getCardValue().isEqualCardValue(card2); + + // then + assertThat(result).isEqualTo(true); + } + + @DisplayName("일반카드 점수 확인") + @Test + void normalCardScore() { + // given + Card card = new Card(CardType.SPADE, CardValue.KING); + + // when + int result = card.getScore(0); + + // then + assertThat(result).isEqualTo(10); + } + + @DisplayName("에이스 점수가 1이 되는 경우") + @ValueSource(ints = {15, 18, 20}) + @ParameterizedTest + void aceCardScoreIsOne(final int currentScore) { + // given + Card card = new Card(CardType.SPADE, CardValue.ACE); + + // when + int result = card.getScore(currentScore); + + // then + assertThat(result).isEqualTo(1); + } + + @DisplayName("에이스 점수가 1이 되는 경우") + @ValueSource(ints = {0, 5, 14}) + @ParameterizedTest + void aceCardScoreIsEleven(final int currentScore) { + // given + Card card = new Card(CardType.SPADE, CardValue.ACE); + + // when + int result = card.getScore(currentScore); + + // then + assertThat(result).isEqualTo(11); + } + + @DisplayName("카드 정보 확인") + @Test + void cardInfo() { + // given + Card card = new Card(CardType.SPADE, CardValue.KING); + + // when + String result = card.toString(); + + // then + assertThat(result).isEqualTo("K스페이드"); + } +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java new file mode 100644 index 00000000..838b7c56 --- /dev/null +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -0,0 +1,53 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DealerTest { + + @DisplayName("현재 딜러의 카드 점수가 17 을 넘을 때 카드 뽑기") + @Test + void dealerDrawCardWhenSumCardScoreOver17() { + // given + List types = Arrays.asList(CardType.CLOVER); + List values = Arrays.asList(CardValue.KING, CardValue.KING, CardValue.KING); + Deck deck = new Deck(types, values); + + Participant dealer = new Dealer("dealer"); + dealer.drawCardContinue(deck); + dealer.drawCardContinue(deck); + dealer.drawCardContinue(deck); + + // when + int result = dealer.sumCardScore(); + + // then + assertThat(result).isEqualTo(20); + } + + @DisplayName("현재 딜러의 카드 점수가 17 이하 일 때 카드 뽑기") + @Test + void dealerDrawCardWhenSumCardScoreUnder17() { + // given + List types = Arrays.asList(CardType.CLOVER); + List values = Arrays.asList(CardValue.THREE, CardValue.FOUR, CardValue.KING); + Deck deck = new Deck(types, values); + + Participant dealer = new Dealer("dealer"); + dealer.drawCardContinue(deck); + dealer.drawCardContinue(deck); + dealer.drawCardContinue(deck); + + // when + int result = dealer.sumCardScore(); + + // then + assertThat(result).isEqualTo(17); + } +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java new file mode 100644 index 00000000..bfad91a7 --- /dev/null +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -0,0 +1,60 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayDeque; +import java.util.Deque; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +class DeckTest { + @DisplayName("덱이 생성 됐는지 확인") + @Test + void deckCreated() { + // given + List types = Arrays.asList(CardType.values()); + List values = Arrays.asList(CardValue.values()); + Deck deck = new Deck(types, values); + + // when + Deque deckTmp = new ArrayDeque<>(); + deckTmp.addAll(deck.drawMultiple(52)); + + // then + for(int i = 0; i < deckTmp.size() ; i++) { + CardValue deckCardValue = values.get(i % values.size()); + Card deckTmpCard = deckTmp.pop(); + assertThat(deckCardValue.isEqualCardValue(deckTmpCard)); + } + } + + @DisplayName("덱이 섞였는지 확인") + @Test + void shuffledDeckCreated() { + // given + List types = Arrays.asList(CardType.values()); + Collections.shuffle(types); + + List values = Arrays.asList(CardValue.values()); + Collections.shuffle(values); + + Deck deck = new Deck(types, values); + + // when + Deque deckTmp = new ArrayDeque<>(); + deckTmp.addAll(deck.drawMultiple(52)); + + // then + for(int i = 0; i < deckTmp.size() ; i++) { + CardValue deckCardValue = values.get(i % values.size()); + Card deckTmpCard = deckTmp.pop(); + assertThat(deckCardValue.isEqualCardValue(deckTmpCard)); + } + } +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/ParticipantCardsTest.java b/src/test/java/blackjack/domain/ParticipantCardsTest.java new file mode 100644 index 00000000..d3f0d195 --- /dev/null +++ b/src/test/java/blackjack/domain/ParticipantCardsTest.java @@ -0,0 +1,55 @@ +package blackjack.domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +class ParticipantCardsTest { + + @Test + void 카드총합_구하기() { + // given + List cards = new ArrayList<>(); + cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); + cards.add(new Card(CardType.CLOVER, CardValue.ACE)); + cards.add(new Card(CardType.CLOVER, CardValue.TWO)); + ParticipantCards participantCards = new ParticipantCards(cards); + + int score = participantCards.sumCardScore(); + + assertThat(score).isEqualTo(18); + } + + @Test + void 카드총합_구하기2() { + // given + List cards = new ArrayList<>(); + cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); + cards.add(new Card(CardType.CLOVER, CardValue.TWO)); + ParticipantCards participantCards = new ParticipantCards(cards); + + int score = participantCards.sumCardScore(); + + assertThat(score).isEqualTo(7); + } + + @Test + void 카드총합_구하기3() { + // given + List cards = new ArrayList<>(); + cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); + cards.add(new Card(CardType.CLOVER, CardValue.NINE)); + cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); + cards.add(new Card(CardType.CLOVER, CardValue.ACE)); + cards.add(new Card(CardType.CLOVER, CardValue.TWO)); + ParticipantCards participantCards = new ParticipantCards(cards); + + int score = participantCards.sumCardScore(); + + assertThat(score).isEqualTo(22); + } +} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 00000000..96ab1330 --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,53 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayerTest { + @DisplayName("현재 플레이어 카드 뽑고 점수 더하기 (에이스 없음)") + @Test + void playerDrawCardWithoutAce() { + // given + List types = Arrays.asList(CardType.CLOVER); + List values = Arrays.asList(CardValue.TWO, CardValue.THREE, CardValue.KING); + Deck deck = new Deck(types, values); + + Participant player = new Player("player"); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + + // when + int result = player.sumCardScore(); + + // then + assertThat(result).isEqualTo(15); + } + + @DisplayName("현재 플레이어 카드 뽑고 점수 더하기 (에이스 있음)") + @Test + void playerDrawCardWithAce() { + // given + List types = Arrays.asList(CardType.CLOVER); + List values = Arrays.asList(CardValue.TWO, CardValue.THREE, CardValue.ACE, CardValue.ACE); + Deck deck = new Deck(types, values); + + Participant player = new Player("player"); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + + // when + int result = player.sumCardScore(); + + // then + assertThat(result).isEqualTo(17); + } +} \ No newline at end of file diff --git a/src/test/java/fuel/RentCompanyTest.java b/src/test/java/fuel/RentCompanyTest.java new file mode 100644 index 00000000..a15ce874 --- /dev/null +++ b/src/test/java/fuel/RentCompanyTest.java @@ -0,0 +1,33 @@ +package fuel; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import fuel.domain.Avante; +import fuel.domain.K5; +import fuel.domain.RentCompany; +import fuel.domain.Sonata; +import org.junit.jupiter.api.Test; + +class RentCompanyTest { + + private static final String NEWLINE = "\n"; + + @Test + public void report() throws Exception { + 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 + ); + } +} \ No newline at end of file